From b8a8281b1785358bd5632a119c016f21811172c6 Mon Sep 17 00:00:00 2001 From: Adam Israel Date: Wed, 27 Mar 2019 14:50:11 -0400 Subject: [PATCH] Squashed 'modules/libjuju/' changes from c50c361..c127833 c127833 Bump version and changelog for release 6aff679 k8s bundles no longer have application placement (#293) 1de9ad1 Add retry for connection if all endpoints fail (#288) 8cb8d75 Support generation of registration string for model sharing. (#279) a9e2fd6 Add Twine for dist upload on release (#284) 407a6a6 Update and prepare for 0.11.2 release (#282) d102620 call related update credential cloud facade methods based on facade version (#281) 2acbdc4 Add test case for redirect during connect (#275) 35fb43e Implement App.get_resources and pinned resources in bundles (#278) b5ba51a Bump version and changelog for release 7a73a0a Fix bundles with subordinates for Juju <2.5 (#277) a0f950f Bump version and changelog for release 01125e2 Updates for new Juju version (#274) 87d9388 Fix wrong variable name in revoke_model function (#271) 2b43065 Bump version and changelog for release 98ee524 set include_stats to false to reduce request time (#266) 61e1d69 Update version and changelog for 0.10.1 82f9968 Retry ssh in manual provision test (#265) d64bfff Clean up lint and add lint coverage to travis config (#263) c7c5c54 Increase the timeout for charmstore connections (#262) 4a6e398 Fix log level of `Driver connected to juju` message (#258) 514e479 Update version and changelog for 0.10.0 ec2c493 Reorder scp parameters (#259) (#260) 26c86c8 Implement set/get model constraints (#253) c6b4ab4 Update version and changelog for 0.9.1 e863746 Update websockets to 6.0 (#254) 567bc1a Update version and changelog for 0.9.0 b275ced python3.7 compatibility updates (#251) bc7336a Handle juju not installed in is_bootstrapped. (#250) 1ce8e0b Add app.reset_config(list). (#249) c620d4f Implement model.get_action_status (#248) 96ea3c4 Fix `make client` in Python 3.6 (#247) 61969ea Update version and changelog for release ebf6882 Add support for adding a manual (ssh) machine (#240) 18422f4 Backwards compatibility fixes (#213) 40c0211 Implement model.get_action_output (#242) c6b8ac5 Fix JSON serialization error for bundle with lxd to unit placement (#243) 5014fc3 Fix reference in docs to connect_current (#239) ebe0193 Wrap machine agent status workaround in version check (#238) 462989b Convert seconds to nanoseconds for juju.unit.run (#237) 0f413e6 Fix spurious intermittent failure in test_machines.py::test_status (#236) ce36b60 Define an unused juju-zfs lxd storage pool (#235) dfc2e8d Add support for Application get_actions (#234) e7e8c13 Update version and changelog for release 499337b Surface errors from bundle plan (#233) 2d94186 Always send auth-tag even with macaroon auth (#217) 000355c Inline jsonfile credential when sending to controller (#231) 9805123 Bump VERSION and changelog for release 27d723b Always parse tags and spaces constraints to lists (#228) 668945a Doc index improvements (#211) 65e6b5e Add doc req to force newer pymacaroons to fix RTD builds e2abd47 Fix dependency conflict for building docs 2907a6e Bump VERSION and changelog for 0.7.3 release 37a7500 Full macaroon bakery support (#206) a06e313 Fix regression with deploying local charm, add test case (#209) 75e9a2b Expose a machines series (#208) 46c98f5 Revert non-functional switch to Py3.6, just specify Py3 instead (#205) 8a99ad1 Cherry-pick VERSION and changelog bump from 0.7.2 release branch 88121d6 Support deploying bundle YAML file directly (rather than just directory) (#202) 57c0dbf Cherry-pick #197 into master (#198) 0973edc Update VERSION and changelog for 0.7.0 f5a4108 Add deprecated placeholder for Controller.get_models 17dffa4 JujuData abstract base class (#194) 76f22cc Make Model and Controller connect methods backwardly compatible (#196) 19b5658 Fix race condition in adding relations (#192) 978f35c refactor connections prior to bakery authentication (#187) 77c0f04 sort all imports; lint tests (#188) 4740935 juju.client.gocookies: new module (#186) 2c4de22 all: use pyrfc3339 instead of dateutil (#185) 7133ffe juju/client: factor out JujuData class (#182) 476b832 Fix race condition in connection monitor test (#183) e64a5d1 Fix example in README (#178) 97355cc Fix rare hang during Unit.run (#177) ae0b091 #176: Fix licensing quirks c0d001b Refactor model handling (#171) ab807c8 Refactor users handling, add get_users (#170) 5270db5 Upload credential to controller when adding model (#168) 16d8390 Support 'applications' key in bundles (#165) 2de3eed Improve handling of thread error handling for loop.run() (#169) 7807023 Fix encoding when using to_json() (#166) 73effb1 Fix intermittent test failures (#167) 46da148 Update VERSION and changelog for release 3dda1dc Fix test failures (#163) 14392af removing cli command to add ssh keys (#161) ce68170 Make Application.upgrade_charm upgrade resources (#158) git-subtree-dir: modules/libjuju git-subtree-split: c12783304945fdff5c28397b82b535a9cc065ca3 --- .gitignore | 3 + .travis.yml | 59 +- Makefile | 18 +- VERSION | 2 +- docs/_extensions/automembersummary.py | 20 +- docs/api/juju.client.rst | 4 +- docs/api/modules.rst | 4 +- docs/changelog.rst | 163 +- docs/index.rst | 21 +- docs/narrative/controller.rst | 100 +- docs/narrative/index.rst | 3 +- docs/narrative/model.rst | 116 +- docs/readme.rst | 50 +- docs/requirements.txt | 8 +- docs/upstream-updates/index.rst | 52 +- examples/action.py | 5 +- examples/add_machine.py | 2 +- examples/add_model.py | 3 +- examples/allwatcher.py | 2 +- examples/config.py | 7 +- examples/connect_current_model.py | 27 + examples/controller.py | 4 +- examples/credential.py | 47 + examples/deploy.py | 3 +- examples/fullstatus.py | 2 +- examples/future.py | 5 +- examples/leadership.py | 2 +- examples/livemodel.py | 5 +- examples/localcharm.py | 2 +- examples/relate.py | 100 +- examples/unitrun.py | 5 +- juju/application.py | 174 +- juju/client/_client.py | 121 +- juju/client/_client1.py | 12137 +++-- juju/client/_client2.py | 4334 +- juju/client/_client3.py | 2651 +- juju/client/_client4.py | 2445 +- juju/client/_client5.py | 3154 +- juju/client/_client7.py | 1770 + juju/client/_client8.py | 1278 + juju/client/_client9.py | 2385 + juju/client/_definitions.py | 4066 +- juju/client/client.py | 7 +- juju/client/connection.py | 632 +- juju/client/connector.py | 156 + juju/client/facade.py | 124 +- juju/client/gocookies.py | 102 + juju/client/jujudata.py | 219 + juju/client/overrides.py | 112 +- juju/client/runner.py | 19 +- juju/client/schemas-juju-2.5-rc1.json | 37036 ++++++++++++++++ juju/client/schemas-juju-latest.json | 2 +- juju/constraints.py | 19 +- juju/controller.py | 562 +- juju/errors.py | 35 +- juju/juju.py | 2 +- juju/loop.py | 2 +- juju/machine.py | 44 +- juju/model.py | 702 +- juju/provisioner.py | 366 + juju/relation.py | 112 + juju/tag.py | 9 + juju/unit.py | 21 +- juju/user.py | 86 + juju/utils.py | 103 +- setup.py | 13 +- tests/base.py | 147 +- tests/bundle/invalid.yaml | 7 + tests/bundle/mini-bundle.yaml | 9 + .../bundle/bundle-resource-rev.yaml | 7 + tests/integration/cert.pem | 33 + tests/integration/key.pem | 52 + tests/integration/test_application.py | 44 +- tests/integration/test_client.py | 6 +- tests/integration/test_connection.py | 215 +- tests/integration/test_controller.py | 231 +- tests/integration/test_errors.py | 6 +- tests/integration/test_macaroon_auth.py | 108 + tests/integration/test_machine.py | 27 +- tests/integration/test_model.py | 276 +- tests/integration/test_unit.py | 25 +- tests/unit/test_client.py | 13 +- tests/unit/test_connection.py | 27 +- tests/unit/test_constraints.py | 14 +- tests/unit/test_controller.py | 140 + tests/unit/test_gocookies.py | 244 + tests/unit/test_loop.py | 2 + tests/unit/test_model.py | 125 +- tests/unit/test_overrides.py | 4 +- tests/unit/test_placement.py | 2 +- tests/unit/test_registration_string.py | 18 + tox.ini | 56 +- 92 files changed, 70475 insertions(+), 7207 deletions(-) create mode 100644 examples/connect_current_model.py create mode 100644 examples/credential.py create mode 100644 juju/client/_client7.py create mode 100644 juju/client/_client8.py create mode 100644 juju/client/_client9.py create mode 100644 juju/client/connector.py create mode 100644 juju/client/gocookies.py create mode 100644 juju/client/jujudata.py create mode 100644 juju/client/schemas-juju-2.5-rc1.json create mode 100644 juju/provisioner.py create mode 100644 juju/user.py create mode 100644 tests/bundle/invalid.yaml create mode 100644 tests/bundle/mini-bundle.yaml create mode 100644 tests/integration/bundle/bundle-resource-rev.yaml create mode 100644 tests/integration/cert.pem create mode 100644 tests/integration/key.pem create mode 100644 tests/integration/test_macaroon_auth.py create mode 100644 tests/unit/test_controller.py create mode 100644 tests/unit/test_gocookies.py create mode 100644 tests/unit/test_registration_string.py diff --git a/.gitignore b/.gitignore index 866a785..6d00fec 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,6 @@ __pycache__/ .\#* dist/ dev/ +.pytest_cache +pytestdebug.log +.vscode/ diff --git a/.travis.yml b/.travis.yml index 0a57c38..5edfef5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,23 +1,48 @@ -dist: trusty +dist: xenial sudo: required language: python -python: - - "3.5" +cache: pip before_install: - - sudo add-apt-repository ppa:ubuntu-lxc/lxd-stable -y + - if [[ $TRAVIS_PYTHON_VERSION == '3.6' ]]; then sudo add-apt-repository -y ppa:jonathonf/python-3.6; fi + - if [[ $TRAVIS_PYTHON_VERSION == '3.7-dev' ]]; then sudo add-apt-repository -y ppa:deadsnakes/ppa; fi - 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 + - sudo apt-get remove -qy lxd lxd-client + - sudo apt-get install snapd libsodium-dev -y +install: + - sudo snap install lxd || true # ignore failures so that unit tests will still run, at least + - sudo sh -c 'echo PATH=/snap/bin:$PATH >> /etc/environment'; + - sudo snap install jq || true + - sudo snap install juju --classic --$JUJU_CHANNEL || true + - sudo snap install juju-wait --classic || true + - pip install tox-travis env: - - SNAP_CMD="sudo snap install juju --classic --stable" - - SNAP_CMD="sudo snap install juju --classic --edge" + global: > + TEST_AGENTS='{"agents":[{"url":"https://api.staging.jujucharms.com/identity","username":"libjuju-ci@yellow"}],"key":{"private":"88OOCxIHQNguRG7zFg2y2Hx5Ob0SeVKKBRnjyehverc=","public":"fDn20+5FGyN2hYO7z0rFUyoHGUnfrleslUNtoYsjNSs="}}' + PATH="/snap/bin:$PATH" + +matrix: + include: + - python: 3.6 + env: JUJU_CHANNEL=edge + - python: 3.6 + env: JUJU_CHANNEL=stable + - python: 3.7-dev + env: JUJU_CHANNEL=stable + - python: 3.7-dev + env: JUJU_CHANNEL=edge +before_script: + # Run lint before performing more expensive operations (fail fast/early) + - tox -e lint + + # init lxd for tests + - sudo lxd waitready --timeout 30 + - sudo chmod 666 /var/snap/lxd/common/lxd/unix.socket + - lxd init --auto --network-address='[::]' --network-port=8443 --storage-backend=dir + + # Horrible workaround to LP Bug #1738614 + - sudo mkdir /var/snap/lxd/common/lxd/storage-pools/juju-zfs + - lxc storage create juju-zfs dir source=/var/snap/lxd/common/lxd/storage-pools/juju-zfs + 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 + - juju bootstrap localhost test --config 'identity-url=https://api.staging.jujucharms.com/identity' --config 'allow-model-access=true' + - tox -e py3,integration,serial diff --git a/Makefile b/Makefile index 2e59306..5938132 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ -BIN := .tox/py35/bin -PY := $(BIN)/python3.5 +BIN := .tox/py3/bin +PY := $(BIN)/python PIP := $(BIN)/pip SCHEMAGEN := $(shell which schemagen) VERSION=$(shell cat VERSION) @@ -13,7 +13,7 @@ clean: .tox: tox -r --notest -client: +client: .tox ifndef SCHEMAGEN $(error "schemagen is not available, please install from https://github.com/juju/schemagen") endif @@ -22,6 +22,10 @@ endif test: tox +.PHONY: lint +lint: + tox -e lint --notest + docs: .tox $(PIP) install -r docs/requirements.txt rm -rf docs/_build/ @@ -29,10 +33,12 @@ docs: .tox cd docs/_build/ && zip -r docs.zip * release: - git remote | xargs -L1 git fetch --tags - $(PY) setup.py sdist upload + git fetch --tags + rm dist/*.tar.gz + $(PY) setup.py sdist + $(BIN)/twine upload --repository-url https://upload.pypi.org/legacy/ dist/* git tag ${VERSION} - git remote | xargs -L1 git push --tags + git push --tags upload: release diff --git a/VERSION b/VERSION index a918a2a..1a96df1 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.6.0 +0.11.3 diff --git a/docs/_extensions/automembersummary.py b/docs/_extensions/automembersummary.py index 898da62..cfe0b84 100644 --- a/docs/_extensions/automembersummary.py +++ b/docs/_extensions/automembersummary.py @@ -1,18 +1,16 @@ # Copyright 2014-2015 Canonical Limited. # -# This file is part of charm-helpers. +# 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 # -# 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. +# http://www.apache.org/licenses/LICENSE-2.0 # -# 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 . +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. import importlib diff --git a/docs/api/juju.client.rst b/docs/api/juju.client.rst index 6a699c0..dad691f 100644 --- a/docs/api/juju.client.rst +++ b/docs/api/juju.client.rst @@ -1,5 +1,5 @@ -juju\.client package -==================== +Internal APIs +============= These packages are for internal use in communicating with the low-level API. You should use the object oriented API instead. They are documented diff --git a/docs/api/modules.rst b/docs/api/modules.rst index bf06f26..9722a6a 100644 --- a/docs/api/modules.rst +++ b/docs/api/modules.rst @@ -1,5 +1,5 @@ -juju -==== +Public APIs +=========== 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`. diff --git a/docs/changelog.rst b/docs/changelog.rst index 9da0cdc..039b468 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -1,5 +1,164 @@ -Change Log ----------- +Changelog +--------- + +0.11.3 +^^^^^^ +Wednesday March 13 2019 + +* k8s bundles no longer have application placement (#293) +* Add retry for connection if all endpoints fail (#288) +* Support generation of registration string for model sharing. (#279) +* Add Twine for dist upload on release (#284) + + +0.11.2 +^^^^^^ +Wednesday January 16 2019 + +* update facade methods for Juju 2.5-rc2 (#281) +* Add test case for redirect during connect (#275) +* Implement App.get_resources and pinned resources in bundles (#278) + + +0.11.1 +^^^^^^ +Thursday December 13 2018 + +* Fix bundles with subordinates for Juju <2.5 (#277) + + +0.11.0 +^^^^^^ +Tuesday December 11 2018 + +* Updates for new Juju version (#274) +* Fix wrong variable name in revoke_model function (#271) + + +0.10.2 +^^^^^^ +Tuesday September 18 2018 + +* set include_stats to false to reduce request time (#266) + + +0.10.1 +^^^^^^ +Monday September 17 2018 + +* Retry ssh in manual provision test (#265) +* Clean up lint and add lint coverage to travis config (#263) +* Increase the timeout for charmstore connections (#262) +* Fix log level of `Driver connected to juju` message (#258) + + +0.10.0 +^^^^^^ +Thursday August 16 2018 + +* Fix error due to scp extra opts order (#260) +* Implement set/get model constraints (#253) + + +0.9.1 +^^^^^ +Monday July 16 2018 + +* Update websockets to 6.0 to fix OS X support due to Brew update to Py3.7 (#254) + + +0.9.0 +^^^^^ +Friday June 29 2018 + +* python3.7 compatibility updates (#251) +* Handle juju not installed in is_bootstrapped for tests (#250) +* Add app.reset_config(list). (#249) +* Implement model.get_action_status (#248) +* Fix `make client` in Python 3.6 (#247) + + +0.8.0 +^^^^^ +Thursday June 14 2018 + +* Add support for adding a manual (ssh) machine (#240) +* Backwards compatibility fixes (#213) +* Implement model.get_action_output (#242) +* Fix JSON serialization error for bundle with lxd to unit placement (#243) +* Fix reference in docs to connect_current (#239) +* Wrap machine agent status workaround in version check (#238) +* Convert seconds to nanoseconds for juju.unit.run (#237) +* Fix spurious intermittent failure in test_machines.py::test_status (#236) +* Define an unused juju-zfs lxd storage pool for Travis (#235) +* Add support for Application get_actions (#234) + + +0.7.5 +^^^^^ +Friday May 18 2018 + +* Surface errors from bundle plan (#233) +* Always send auth-tag even with macaroon auth (#217) +* Inline jsonfile credential when sending to controller (#231) + +0.7.4 +^^^^^ +Tuesday Apr 24 2018 + +* Always parse tags and spaces constraints to lists (#228) +* Doc index improvements (#211) +* Add doc req to force newer pymacaroons to fix RTD builds +* Fix dependency conflict for building docs + +0.7.3 +^^^^^ +Tuesday Feb 20 2018 + +* Full macaroon bakery support (#206) +* Fix regression with deploying local charm, add test case (#209) +* Expose a machines series (#208) +* Automated test runner fixes (#205) + +0.7.2 +^^^^^ +Friday Feb 9 2018 + +* Support deploying bundle YAML file directly (rather than just directory) (#202) + +0.7.1 +^^^^^ +Monday Dec 18 2017 + +* Fix missed renames of model_uuids (#197) + +0.7.0 +^^^^^ +Fri Dec 15 2017 + +* Fix race condition in adding relations (#192) +* Fix race condition in connection monitor test (#183) +* Fix example in README (#178) +* Fix rare hang during Unit.run (#177) +* Fix licensing quirks (#176) +* Refactor model handling (#171) +* Refactor users handling, add get_users (#170) +* Upload credential to controller when adding model (#168) +* Support 'applications' key in bundles (#165) +* Improve handling of thread error handling for loop.run() (#169) +* Fix encoding when using to_json() (#166) +* Fix intermittent test failures (#167) + +0.6.1 +^^^^^ +Fri Sept 29 2017 + +* Fix failure when controller supports newer facade version (#145) +* Fix test failures (#163) +* Fix SSH key handling when adding a new model (#161) +* Make Application.upgrade_charm upgrade resources (#158) +* Expand integration tests to use stable/edge versions of juju (#155) +* Move docs to ReadTheDocs (https://pythonlibjuju.readthedocs.io/en/latest/) 0.6.0 ^^^^^ diff --git a/docs/index.rst b/docs/index.rst index b4b075f..2dd55cb 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -11,16 +11,29 @@ Table of Contents ----------------- .. toctree:: + :caption: Overview :glob: :maxdepth: 3 narrative/index - API Docs - Internal API Docs - upstream-updates/index -.. include:: changelog.rst +.. toctree:: + :caption: API Documentation + :glob: + :maxdepth: 3 + + api/modules + api/juju.client + +.. toctree:: + :caption: Project + :glob: + :maxdepth: 3 + + upstream-updates/index + changelog + Indices and tables diff --git a/docs/narrative/controller.rst b/docs/narrative/controller.rst index 2da0e7b..1d86321 100644 --- a/docs/narrative/controller.rst +++ b/docs/narrative/controller.rst @@ -6,9 +6,9 @@ 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`). +connect directly to it (see py:doc:`model`). -For api docs, see :class:`juju.controller.Controller`. +For API docs, see py:class:`juju.controller.Controller`. Connecting to the Current Controller @@ -21,7 +21,7 @@ Connect to the currently active Juju controller (the one returned by from juju.controller import Controller controller = Controller() - await controller.connect_current() + await controller.connect() Connecting to a Named Controller @@ -33,68 +33,60 @@ Connect to a controller by name. from juju.controller import Controller controller = Controller() - await controller.connect_controller('mycontroller') + await controller.connect('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. +Connecting with Authentication +------------------------------ +You can control what user you are connecting with by specifying either a +username/password pair, or a macaroon or bakery client that can provide +a macaroon. -.. code:: python - from juju.controller import Controller +.. code:: python controller = Controller() + await controller.connect(username='admin', + password='f53f08cfc32a2e257fe5393271d89d62') + + # or with a macaroon + await controller.connect(macaroons=[ + { + "Name": "macaroon-218d87053ad19626bcd5a0eef0bc9ba8bd4fbd80a968f52a5fd430b2aa8660df", + "Value": "W3siY2F2ZWF0cyI6 ... jBkZiJ9XQ==", + "Domain": "10.130.48.27", + "Path": "/auth", + "Secure": false, + "HostOnly": true, + "Expires": "2018-03-07T22:07:23Z", + }, + ]) + + # or with a bakery client + from macaroonbakery.httpbakery import Client + from http.cookiejar import FileCookieJar + + bakery_client=Client() + bakery_client.cookies = FileCookieJar('cookies.txt') + controller = Controller() + await controller.connect(bakery_client=bakery_client) + - 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. +Connecting with an Explicit Endpoint +------------------------------------ +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.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, + endpoint='10.0.4.171:17070', + username='admin', + password='f53f08cfc32a2e257fe5393271d89d62', + cacert=None, # Left out for brevity, but if you have a cert string you + # should pass it in. You can get the cert from the output + # of The `juju show-controller` command. ) diff --git a/docs/narrative/index.rst b/docs/narrative/index.rst index eb77e4c..b1684a0 100644 --- a/docs/narrative/index.rst +++ b/docs/narrative/index.rst @@ -1,5 +1,4 @@ -Narrative Docs -============== +**Overview** .. toctree:: :glob: diff --git a/docs/narrative/model.rst b/docs/narrative/model.rst index 57dbc81..42633a1 100644 --- a/docs/narrative/model.rst +++ b/docs/narrative/model.rst @@ -4,7 +4,7 @@ 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`. +For api docs, see py:class:`juju.model.Model`. Connecting to the Current Model @@ -14,10 +14,8 @@ Connect to the currently active Juju model (the one returned by .. code:: python - from juju.model import Model - model = Model() - await model.connect_current() + await model.connect() Connecting to a Named Model @@ -28,88 +26,74 @@ 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') + await model.connect('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. +Connecting with Authentication +------------------------------ +You can control what user you are connecting with by specifying either a +username/password pair, or a macaroon or bakery client that can provide +a macaroon. -.. code:: python - from juju.model import Model +.. code:: python model = Model() + await model.connect(username='admin', + password='f53f08cfc32a2e257fe5393271d89d62') + + # or with a macaroon + await model.connect(macaroons=[ + { + "Name": "macaroon-218d87053ad19626bcd5a0eef0bc9ba8bd4fbd80a968f52a5fd430b2aa8660df", + "Value": "W3siY2F2ZWF0cyI6 ... jBkZiJ9XQ==", + "Domain": "10.130.48.27", + "Path": "/auth", + "Secure": false, + "HostOnly": true, + "Expires": "2018-03-07T22:07:23Z", + }, + ]) - 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, - ) - + # or with a bakery client + from macaroonbakery.httpbakery import Client + from http.cookiejar import FileCookieJar -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. + bakery_client=Client() + bakery_client.cookies = FileCookieJar('cookies.txt') + model = Model() + await model.connect(bakery_client=bakery_client) + -.. 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. +Connecting with an Explicit Endpoint +------------------------------------ +The most flexible, but also most verbose, way to connect is using the API +endpoint url, model UUID, and credentials directly. This method does NOT +require the Juju CLI client to be installed. .. 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, + endpoint='10.0.4.171:17070', + uuid='e8399ac7-078c-4817-8e5e-32316d55b083', + username='admin', + password='f53f08cfc32a2e257fe5393271d89d62', + cacert=None, # Left out for brevity, but if you have a cert string you + # should pass it in. You can get the cert from the output + # of The `juju show-controller` command. ) 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. +py:method:`juju.controller.Controller.add_model` and +py:method:`juju.controller.Controller.destroy_model` for more info. .. code:: python @@ -134,8 +118,8 @@ Example of creating a new model and then destroying it. See 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 +py:method:`~juju.model.Model.add_machine` method. A +py: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 @@ -192,7 +176,7 @@ 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. +py:class:`juju.model.ModelObserver` subclass. .. code:: python @@ -283,7 +267,7 @@ to the entity and type of change that you wish to handle. # specific handler method is not defined. -Any :class:`juju.model.ModelEntity` object can be observed directly by +Any py:class:`juju.model.ModelEntity` object can be observed directly by registering callbacks on the object itself. .. code:: python diff --git a/docs/readme.rst b/docs/readme.rst index ecfbc5a..87666d0 100644 --- a/docs/readme.rst +++ b/docs/readme.rst @@ -38,18 +38,15 @@ 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. +ubuntu charm, then exits: .. code:: python - #!/usr/bin/python3.5 + #!/usr/bin/python3 - import asyncio import logging + import sys from juju import loop from juju.model import Model @@ -63,26 +60,28 @@ and in the documentation. # 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', - ) + try: + # Deploy a single unit of the ubuntu charm, using the latest revision + # from the stable channel of the Charm Store. + ubuntu_app = await model.deploy( + 'ubuntu', + application_name='ubuntu', + series='xenial', + channel='stable', + ) - # Disconnect from the api server and cleanup. - model.disconnect() + if '--wait' in sys.argv: + # optionally block until the application is ready + await model.block_until(lambda: ubuntu_app.status == 'active') + finally: + # Disconnect from the api server and cleanup. + await model.disconnect() def main(): - # Set logging level to debug so we can see verbose output from the - # juju library. - logging.basicConfig(level=logging.DEBUG) + logging.basicConfig(level=logging.INFO) - # Quiet logging from the websocket library. If you want to see - # everything sent over the wire, set this to DEBUG. + # 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) @@ -93,3 +92,12 @@ and in the documentation. if __name__ == '__main__': main() + + +More examples can be found in the docs, as well as in the ``examples/`` +directory of the source tree which can be run using ``tox``. For +example, to run ``examples/connect_current_model.py``, use: + +.. code:: bash + + tox -e example -- examples/connect_current_model.py diff --git a/docs/requirements.txt b/docs/requirements.txt index 06377bf..dabf3a0 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,7 +1,5 @@ -websockets -pyyaml -theblues -python-dateutil -sphinx +pytz<2018.0,>=2017.2 # conflict between sphinx and macaroonbakery +pymacaroons>=0.13.0,<1.0 # force new version with pynacl instead of libnacl +sphinx==1.6.5 sphinxcontrib-asyncio sphinx_rtd_theme diff --git a/docs/upstream-updates/index.rst b/docs/upstream-updates/index.rst index 52099e6..41f448a 100644 --- a/docs/upstream-updates/index.rst +++ b/docs/upstream-updates/index.rst @@ -1,5 +1,5 @@ -Upstream Updates -================ +Syncing Upstream Updates +======================== Updating the facade and definitions code generated from the schema to reflect changes in upstream Juju consists of two steps: @@ -48,6 +48,54 @@ as well as one or more of the `juju/client/_clientX.py` files, depending on which facades were touched. +Integrating into the Object Layer +--------------------------------- + +Once the raw client APIs are synced, you may need to integrate any new or +changed API calls into the object layer, to provide a clean, Pythonic way +to interact with the model. This may be as simple as adding an optional +parameter to an existing model method, tweaking what manipulations, if any +the model method does to the data before it is sent to the API, or it may +require adding an entirely new model method to capture the new functionality. + +In general, the approach should be to make the interactions with the model +layer use the same patterns as when you use the CLI, just with Python idioms +and OO approaches. + +When trying to determine what client calls need to be made and what data to +be sent for a given Juju CLI action, it is very useful to add +`--debug --logging-config TRACE` to any Juju CLI command to view the full +conversation between the CLI client and the API server. For example: + +``` +[johnsca@murdoch:~] $ juju deploy --debug --logging-config TRACE ./builds/test +11:51:20 INFO juju.cmd supercommand.go:56 running juju [2.3.5 gc go1.10] +11:51:20 DEBUG juju.cmd supercommand.go:57 args: []string{"/snap/juju/3884/bin/juju", "deploy", "--debug", "--logging-config", "TRACE", "./builds/test"} +11:51:20 INFO juju.juju api.go:67 connecting to API addresses: [35.172.119.191:17070 172.31.94.16:17070 252.94.16.1:17070] +11:51:20 TRACE juju.api certpool.go:49 cert dir "/etc/juju/certs.d" does not exist +11:51:20 DEBUG juju.api apiclient.go:843 successfully dialed "wss://35.172.119.191:17070/model/a7317969-6dab-4ba4-844b-af3d661c228d/api" +11:51:20 INFO juju.api apiclient.go:597 connection established to "wss://35.172.119.191:17070/model/a7317969-6dab-4ba4-844b-af3d661c228d/api" +... +11:51:20 INFO juju.cmd.juju.application series_selector.go:71 with the configured model default series "xenial" +11:51:20 DEBUG httpbakery client.go:244 client do POST https://35.172.119.191:17070/model/a7317969-6dab-4ba4-844b-af3d661c228d/charms?revision=0&schema=local&series=xenial { +11:51:21 DEBUG httpbakery client.go:246 } -> error +11:51:21 INFO cmd deploy.go:1096 Deploying charm "local:xenial/test-0". +11:51:21 TRACE juju.rpc.jsoncodec codec.go:225 -> {"request-id":3,"type":"Charms","version":2,"request":"CharmInfo","params":{"url":"local:xenial/test-0"}} +11:51:21 TRACE juju.rpc.jsoncodec codec.go:120 <- {"request-id":3,"response":{"revision":0,"url":"local:xenial/test-0","config":{"test":{"type":"string","default":""}},"meta":{"name":"test","summary":"test","description":"test","subordinate":false,"series":["xenial"],"resources":{"dummy":{"name":"dummy","type":"file","path":"dummy.snap","description":"dummy snap"}},"min-juju-version":"0.0.0"},"actions":{}}} +11:51:21 TRACE juju.rpc.jsoncodec codec.go:225 -> {"request-id":4,"type":"Charms","version":2,"request":"IsMetered","params":{"url":"local:xenial/test-0"}} +11:51:21 TRACE juju.rpc.jsoncodec codec.go:120 <- {"request-id":4,"response":{"metered":false}} +11:51:21 TRACE juju.rpc.jsoncodec codec.go:225 -> {"request-id":5,"type":"Resources","version":1,"request":"AddPendingResources","params":{"tag":"application-test","url":"local:xenial/test-0","channel":"","macaroon":null,"resources":[{"name":"dummy","type":"file","path":"dummy.snap","description":"dummy snap","origin":"store","revision":-1,"fingerprint":"","size":0}]}} +11:51:21 TRACE juju.rpc.jsoncodec codec.go:120 <- {"request-id":5,"response":{"pending-ids":["c0ffdd92-da23-4fb2-8d41-d82d58423447"]}} +11:51:21 TRACE juju.rpc.jsoncodec codec.go:225 -> {"request-id":6,"type":"Application","version":5,"request":"Deploy","params":{"applications":[{"application":"test","series":"xenial","charm-url":"local:xenial/test-0","channel":"","num-units":1,"config-yaml":"","constraints":{},"resources":{"dummy":"c0ffdd92-da23-4fb2-8d41-d82d58423447"}}]}} +11:51:21 TRACE juju.rpc.jsoncodec codec.go:120 <- {"request-id":6,"response":{"results":[{}]}} +11:51:21 TRACE juju.rpc.jsoncodec codec.go:123 <- error: read tcp 192.168.1.102:52168->35.172.119.191:17070: use of closed network connection (closing true) +11:51:21 DEBUG juju.api monitor.go:35 RPC connection died +11:51:21 INFO cmd supercommand.go:465 command finished +``` + +Note that this will contain login information (which has been removed from the above). + + Overrides --------- diff --git a/examples/action.py b/examples/action.py index 0f25647..f839f11 100644 --- a/examples/action.py +++ b/examples/action.py @@ -7,7 +7,6 @@ This example: 4. Waits for the action results to come back, then exits. """ -import asyncio import logging from juju import loop @@ -27,8 +26,8 @@ async def run_action(unit): async def main(): model = Model() - await model.connect_current() - await model.reset(force=True) + # connect to current model with current user, per Juju CLI + await model.connect() app = await model.deploy( 'git', diff --git a/examples/add_machine.py b/examples/add_machine.py index 8ae2d40..33d0c34 100755 --- a/examples/add_machine.py +++ b/examples/add_machine.py @@ -19,7 +19,7 @@ GB = 1024 async def main(): model = Model() - await model.connect_current() + await model.connect() try: # add a new default machine diff --git a/examples/add_model.py b/examples/add_model.py index 3e46490..88766f1 100644 --- a/examples/add_model.py +++ b/examples/add_model.py @@ -19,7 +19,8 @@ LOG = getLogger(__name__) async def main(): controller = Controller() print("Connecting to controller") - await controller.connect_current() + # connect to current controller with current user, per Juju CLI + await controller.connect() try: model_name = "addmodeltest-{}".format(uuid.uuid4()) diff --git a/examples/allwatcher.py b/examples/allwatcher.py index c78d689..884230b 100644 --- a/examples/allwatcher.py +++ b/examples/allwatcher.py @@ -16,7 +16,7 @@ from juju import loop async def watch(): - conn = await Connection.connect_current() + conn = await Connection.connect() allwatcher = client.AllWatcherFacade.from_connection(conn) while True: change = await allwatcher.Next() diff --git a/examples/config.py b/examples/config.py index bacc840..c7580f6 100644 --- a/examples/config.py +++ b/examples/config.py @@ -6,7 +6,6 @@ This example: 3. Deploys a charm and prints its config and constraints """ -import asyncio import logging from juju.model import Model @@ -19,8 +18,8 @@ MB = 1 async def main(): model = Model() - await model.connect_current() - await model.reset(force=True) + # connect to current model with current user, per Juju CLI + await model.connect() ubuntu_app = await model.deploy( 'mysql', @@ -47,7 +46,7 @@ async def main(): await model.disconnect() - + if __name__ == '__main__': logging.basicConfig(level=logging.DEBUG) ws_logger = logging.getLogger('websockets.protocol') diff --git a/examples/connect_current_model.py b/examples/connect_current_model.py new file mode 100644 index 0000000..b46a09c --- /dev/null +++ b/examples/connect_current_model.py @@ -0,0 +1,27 @@ +""" +This is a very basic example that connects to the currently selected model +and prints the number of applications deployed to it. +""" +import logging + +from juju import loop +from juju.model import Model + +log = logging.getLogger(__name__) + + +async def main(): + model = Model() + try: + # connect to the current model with the current user, per the Juju CLI + await model.connect() + print('There are {} applications'.format(len(model.applications))) + finally: + if model.is_connected(): + print('Disconnecting from model') + await model.disconnect() + + +if __name__ == '__main__': + logging.basicConfig(level=logging.INFO) + loop.run(main()) diff --git a/examples/controller.py b/examples/controller.py index 6002f68..b61a6f6 100644 --- a/examples/controller.py +++ b/examples/controller.py @@ -8,7 +8,6 @@ This example: 5. Destroys the model """ -import asyncio import logging from juju.controller import Controller @@ -17,7 +16,8 @@ from juju import loop async def main(): controller = Controller() - await controller.connect_current() + # connect to current controller with current user, per Juju CLI + await controller.connect() model = await controller.add_model( 'my-test-model', 'aws', diff --git a/examples/credential.py b/examples/credential.py new file mode 100644 index 0000000..e653536 --- /dev/null +++ b/examples/credential.py @@ -0,0 +1,47 @@ +import sys +from juju import loop +from juju.controller import Controller + + +async def main(cloud_name, credential_name): + controller = Controller() + model = None + print('Connecting to controller') + # connect to current controller with current user, per Juju CLI + await controller.connect() + try: + print('Adding model') + model = await controller.add_model( + 'test', + cloud_name=cloud_name, + credential_name=credential_name) + + # verify credential + print("Verify model's credential: {}".format( + model.info.cloud_credential_tag)) + + # verify we can deploy + print('Deploying ubuntu') + app = await model.deploy('ubuntu-10') + + print('Waiting for active') + await model.block_until( + lambda: app.units and all(unit.workload_status == 'active' + for unit in app.units)) + + print('Removing ubuntu') + await app.remove() + finally: + print('Cleaning up') + if model: + print('Removing model') + model_uuid = model.info.uuid + await model.disconnect() + await controller.destroy_model(model_uuid) + print('Disconnecting') + await controller.disconnect() + + +if __name__ == '__main__': + assert len(sys.argv) > 2, 'Please provide a cloud and credential name' + loop.run(main(sys.argv[1], sys.argv[2])) diff --git a/examples/deploy.py b/examples/deploy.py index e6c306a..43764d7 100644 --- a/examples/deploy.py +++ b/examples/deploy.py @@ -13,7 +13,8 @@ from juju.model import Model async def main(): model = Model() print('Connecting to model') - await model.connect_current() + # connect to current model with current user, per Juju CLI + await model.connect() try: print('Deploying ubuntu') diff --git a/examples/fullstatus.py b/examples/fullstatus.py index cdaf51d..5548423 100644 --- a/examples/fullstatus.py +++ b/examples/fullstatus.py @@ -5,7 +5,7 @@ from juju.client.client import ClientFacade from juju import loop async def status(): - conn = await Connection.connect_current() + conn = await Connection.connect() client = ClientFacade.from_connection(conn) patterns = None diff --git a/examples/future.py b/examples/future.py index 0180325..5e974cf 100644 --- a/examples/future.py +++ b/examples/future.py @@ -2,7 +2,6 @@ This example doesn't work - it demonstrates features that don't exist yet. """ -import asyncio import logging from juju.model import Model @@ -11,8 +10,8 @@ from juju import loop async def main(): model = Model() - await model.connect_current() - await model.reset(force=True) + # connect to current model with current user, per Juju CLI + await model.connect() goal_state = Model.from_yaml('bundle-like-thing') ubuntu_app = await model.deploy( diff --git a/examples/leadership.py b/examples/leadership.py index b231003..dbd1b6e 100644 --- a/examples/leadership.py +++ b/examples/leadership.py @@ -13,7 +13,7 @@ from juju import loop async def report_leadership(): model = Model() - await model.connect_current() + await model.connect() print("Leadership: ") for app in model.applications.values(): diff --git a/examples/livemodel.py b/examples/livemodel.py index 47eb999..1b10ac9 100644 --- a/examples/livemodel.py +++ b/examples/livemodel.py @@ -6,8 +6,6 @@ This example: 3. Runs forever (kill with Ctrl-C) """ -import asyncio - from juju.model import Model from juju import loop @@ -21,7 +19,8 @@ async def on_model_change(delta, old, new, model): async def watch_model(): model = Model() - await model.connect_current() + # connect to current model with current user, per Juju CLI + await model.connect() model.add_observer(on_model_change) diff --git a/examples/localcharm.py b/examples/localcharm.py index 978703e..b9481d4 100644 --- a/examples/localcharm.py +++ b/examples/localcharm.py @@ -15,7 +15,7 @@ from juju import loop async def main(): model = Model() - await model.connect_current() + await model.connect() # Deploy a local charm using a path to the charm directory await model.deploy( diff --git a/examples/relate.py b/examples/relate.py index 8f1e708..347e021 100644 --- a/examples/relate.py +++ b/examples/relate.py @@ -40,59 +40,63 @@ class MyModelObserver(ModelObserver): async def main(): model = Model() - await model.connect_current() + # connect to current model with current user, per Juju CLI + await model.connect() - model.add_observer(MyRemoveObserver()) - await model.reset(force=True) - model.add_observer(MyModelObserver()) + try: + 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)) - )) + 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)) + )) + finally: + await model.disconnect() if __name__ == '__main__': - logging.basicConfig(level=logging.DEBUG) + logging.basicConfig(level=logging.INFO) ws_logger = logging.getLogger('websockets.protocol') ws_logger.setLevel(logging.INFO) loop.run(main()) diff --git a/examples/unitrun.py b/examples/unitrun.py index 3dfacd6..805f0ae 100644 --- a/examples/unitrun.py +++ b/examples/unitrun.py @@ -7,7 +7,6 @@ This example: 4. Waits for the action results to come back, then exits. """ -import asyncio import logging from juju.model import Model @@ -24,8 +23,8 @@ async def run_command(unit): async def main(): model = Model() - await model.connect_current() - await model.reset(force=True) + # connect to current model with current user, per Juju CLI + await model.connect() app = await model.deploy( 'ubuntu-0', diff --git a/juju/application.py b/juju/application.py index 8719a62..3f7f02e 100644 --- a/juju/application.py +++ b/juju/application.py @@ -1,3 +1,17 @@ +# 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. + import asyncio import logging @@ -37,6 +51,24 @@ class Application(model.ModelEntity): if unit.application == self.name ] + @property + def relations(self): + return [rel for rel in self.model.relations if rel.matches(self.name)] + + def related_applications(self, endpoint_name=None): + apps = {} + for rel in self.relations: + if rel.is_peer: + local_ep, remote_ep = rel.endpoints[0] + else: + def is_us(ep): + return ep.application.name == self.name + local_ep, remote_ep = sorted(rel.endpoints, key=is_us) + if endpoint_name is not None and endpoint_name != local_ep.name: + continue + apps[remote_ep.application.name] = remote_ep.application + return apps + @property def status(self): """Get the application status, as set by the charm's leader. @@ -99,6 +131,31 @@ class Application(model.ModelEntity): add_units = add_unit + async def scale(self, scale=None, scale_change=None): + """ + Set or adjust the scale of this (K8s) application. + + One or the other of scale or scale_change must be provided. + + :param int scale: Scale to which to set this application. + :param int scale_change: Amount by which to adjust the scale of this + application (can be positive or negative). + """ + app_facade = client.ApplicationFacade.from_connection(self.connection) + + if (scale, scale_change) == (None, None): + raise ValueError('Must provide either scale or scale_change') + + log.debug( + 'Scaling application %s %s %s', + self.name, 'to' if scale else 'by', scale or scale_change) + + await app_facade.ScaleApplications([ + client.ScaleApplicationParam(application_tag=self.tag, + scale=scale, + scale_change=scale_change) + ]) + def allocate(self, budget, value): """Allocate budget to this application. @@ -196,22 +253,43 @@ class Application(model.ModelEntity): result = (await app_facade.Get(self.name)).constraints return vars(result) if result else result - def get_actions(self, schema=False): + async def get_actions(self, schema=False): """Get actions defined for this application. :param bool schema: Return the full action schema - + :return dict: The charms actions, empty dict if none are defined. """ - raise NotImplementedError() - - def get_resources(self, details=False): + actions = {} + entity = [{"tag": self.tag}] + action_facade = client.ActionFacade.from_connection(self.connection) + results = ( + await action_facade.ApplicationsCharmsActions(entity)).results + for result in results: + if result.application_tag == self.tag and result.actions: + actions = result.actions + break + if not schema: + actions = {k: v['description'] for k, v in actions.items()} + return actions + + async def get_resources(self): """Return resources for this application. - :param bool details: Include detailed info about resources used by each - unit - + Returns a dict mapping resource name to + :class:`~juju._definitions.CharmResource` instances. """ - raise NotImplementedError() + facade = client.ResourcesFacade.from_connection(self.connection) + response = await facade.ListResources([client.Entity(self.tag)]) + + resources = dict() + for result in response.results: + for resource in result.charm_store_resources or []: + resources[resource.name] = resource + for resource in result.resources or []: + if resource.charmresource: + resource = resource.charmresource + resources[resource.name] = resource + return resources async def run(self, command, timeout=None): """Run command on all units for this application. @@ -252,12 +330,10 @@ class Application(model.ModelEntity): ) return await self.ann_facade.Set([ann]) - async def set_config(self, config, to_default=False): + async def set_config(self, config): """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) @@ -266,6 +342,20 @@ class Application(model.ModelEntity): return await app_facade.Set(self.name, config) + async def reset_config(self, to_default): + """ + Restore application config to default values. + + :param list to_default: A list of config options to be reset to their + default value. + """ + app_facade = client.ApplicationFacade.from_connection(self.connection) + + log.debug( + 'Restoring default config for %s: %s', self.name, to_default) + + return await app_facade.Unset(self.name, to_default) + async def set_constraints(self, constraints): """Set machine constraints for this application. @@ -342,8 +432,13 @@ class Application(model.ModelEntity): raise ValueError("switch and revision are mutually exclusive") client_facade = client.ClientFacade.from_connection(self.connection) + resources_facade = client.ResourcesFacade.from_connection( + self.connection) app_facade = client.ApplicationFacade.from_connection(self.connection) + charmstore = self.model.charmstore + charmstore_entity = None + if switch is not None: charm_url = switch if not charm_url.startswith('cs:'): @@ -354,18 +449,65 @@ class Application(model.ModelEntity): 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'] + charmstore_entity = await charmstore.entity(charm_url, + channel=channel) + charm_url = charmstore_entity['Id'] if charm_url == self.data['charm-url']: raise JujuError('already running charm "%s"' % charm_url) + # Update charm await client_facade.AddCharm( url=charm_url, channel=channel ) + # Update resources + if not charmstore_entity: + charmstore_entity = await charmstore.entity(charm_url, + channel=channel) + store_resources = charmstore_entity['Meta']['resources'] + + request_data = [client.Entity(self.tag)] + response = await resources_facade.ListResources(request_data) + existing_resources = { + resource.name: resource + for resource in response.results[0].resources + } + + resources_to_update = [ + resource for resource in store_resources + if resource['Name'] not in existing_resources or + existing_resources[resource['Name']].origin != 'upload' + ] + + if resources_to_update: + request_data = [ + client.CharmResource( + description=resource.get('Description'), + fingerprint=resource['Fingerprint'], + name=resource['Name'], + path=resource['Path'], + revision=resource['Revision'], + size=resource['Size'], + type_=resource['Type'], + origin='store', + ) for resource in resources_to_update + ] + response = await resources_facade.AddPendingResources( + self.tag, + charm_url, + request_data + ) + pending_ids = response.pending_ids + resource_ids = { + resource['Name']: id + for resource, id in zip(resources_to_update, pending_ids) + } + else: + resource_ids = None + + # Update application await app_facade.SetCharm( application=self.entity_id, channel=channel, @@ -374,7 +516,7 @@ class Application(model.ModelEntity): config_settings_yaml=None, force_series=force_series, force_units=force_units, - resource_ids=None, + resource_ids=resource_ids, storage_constraints=None ) diff --git a/juju/client/_client.py b/juju/client/_client.py index d510e11..c9fdef2 100644 --- a/juju/client/_client.py +++ b/juju/client/_client.py @@ -3,33 +3,37 @@ from juju.client._definitions import * -from juju.client import _client1, _client2, _client3, _client4, _client5 +from juju.client import _client2, _client1, _client3, _client4, _client5, _client8, _client7, _client9 CLIENTS = { - "1": _client1, "2": _client2, + "1": _client1, "3": _client3, "4": _client4, - "5": _client5 + "5": _client5, + "8": _client8, + "7": _client7, + "9": _client9 } def lookup_facade(name, version): - """ - Given a facade name and version, attempt to pull that facade out - of the correct client.py file. + """ + Given a facade name and version, attempt to pull that facade out + of the correct client.py file. - """ + """ + for _version in range(int(version), 0, -1): 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 + facade = getattr(CLIENTS[str(_version)], name) + return facade + except (KeyError, AttributeError): + continue + else: + raise ImportError("No supported version for facade: " + "{}".format(name)) @@ -44,7 +48,14 @@ class TypeFactory: @param connection: initialized Connection object. """ - version = connection.facades[cls.__name__[:-6]] + facade_name = cls.__name__ + if not facade_name.endswith('Facade'): + raise TypeError('Unexpected class name: {}'.format(facade_name)) + facade_name = facade_name[:-len('Facade')] + version = connection.facades.get(facade_name) + if version is None: + raise Exception('No facade {} in facades {}'.format(facade_name, + connection.facades)) c = lookup_facade(cls.__name__, version) c = c() @@ -57,6 +68,10 @@ class ActionFacade(TypeFactory): pass +class ActionPrunerFacade(TypeFactory): + pass + + class AgentFacade(TypeFactory): pass @@ -81,6 +96,10 @@ class ApplicationFacade(TypeFactory): pass +class ApplicationOffersFacade(TypeFactory): + pass + + class ApplicationRelationsWatcherFacade(TypeFactory): pass @@ -101,6 +120,26 @@ class BundleFacade(TypeFactory): pass +class CAASAgentFacade(TypeFactory): + pass + + +class CAASFirewallerFacade(TypeFactory): + pass + + +class CAASOperatorFacade(TypeFactory): + pass + + +class CAASOperatorProvisionerFacade(TypeFactory): + pass + + +class CAASUnitProvisionerFacade(TypeFactory): + pass + + class CharmRevisionUpdaterFacade(TypeFactory): pass @@ -125,6 +164,22 @@ class ControllerFacade(TypeFactory): pass +class CredentialManagerFacade(TypeFactory): + pass + + +class CredentialValidatorFacade(TypeFactory): + pass + + +class CrossControllerFacade(TypeFactory): + pass + + +class CrossModelRelationsFacade(TypeFactory): + pass + + class DeployerFacade(TypeFactory): pass @@ -141,10 +196,22 @@ class EntityWatcherFacade(TypeFactory): pass +class ExternalControllerUpdaterFacade(TypeFactory): + pass + + +class FanConfigurerFacade(TypeFactory): + pass + + class FilesystemAttachmentsWatcherFacade(TypeFactory): pass +class FirewallRulesFacade(TypeFactory): + pass + + class FirewallerFacade(TypeFactory): pass @@ -253,10 +320,18 @@ class ModelManagerFacade(TypeFactory): pass +class ModelUpgraderFacade(TypeFactory): + pass + + class NotifyWatcherFacade(TypeFactory): pass +class OfferStatusWatcherFacade(TypeFactory): + pass + + class PayloadsFacade(TypeFactory): pass @@ -281,6 +356,10 @@ class RebootFacade(TypeFactory): pass +class RelationStatusWatcherFacade(TypeFactory): + pass + + class RelationUnitsWatcherFacade(TypeFactory): pass @@ -289,6 +368,10 @@ class RemoteApplicationWatcherFacade(TypeFactory): pass +class RemoteRelationsFacade(TypeFactory): + pass + + class RemoteRelationsWatcherFacade(TypeFactory): pass @@ -353,6 +436,10 @@ class UniterFacade(TypeFactory): pass +class UpgradeSeriesFacade(TypeFactory): + pass + + class UpgraderFacade(TypeFactory): pass @@ -361,6 +448,10 @@ class UserManagerFacade(TypeFactory): pass +class VolumeAttachmentPlansWatcherFacade(TypeFactory): + pass + + class VolumeAttachmentsWatcherFacade(TypeFactory): pass diff --git a/juju/client/_client1.py b/juju/client/_client1.py index 3774056..dd84e78 100644 --- a/juju/client/_client1.py +++ b/juju/client/_client1.py @@ -5,6 +5,102 @@ from juju.client.facade import Type, ReturnMapping from juju.client._definitions import * +class ActionPrunerFacade(Type): + name = 'ActionPruner' + version = 1 + schema = {'definitions': {'ActionPruneArgs': {'additionalProperties': False, + 'properties': {'max-history-mb': {'type': 'integer'}, + 'max-history-time': {'type': 'integer'}}, + 'required': ['max-history-time', + 'max-history-mb'], + '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'}, + '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'}}, + 'properties': {'ModelConfig': {'properties': {'Result': {'$ref': '#/definitions/ModelConfigResult'}}, + 'type': 'object'}, + 'Prune': {'properties': {'Params': {'$ref': '#/definitions/ActionPruneArgs'}}, + 'type': 'object'}, + 'WatchForModelConfigChanges': {'properties': {'Result': {'$ref': '#/definitions/NotifyWatchResult'}}, + 'type': 'object'}}, + 'type': 'object'} + + + @ReturnMapping(ModelConfigResult) + async def ModelConfig(self): + ''' + + Returns -> typing.Mapping[str, typing.Any] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='ActionPruner', + request='ModelConfig', + version=1, + 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='ActionPruner', + request='Prune', + version=1, + 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='ActionPruner', + request='WatchForModelConfigChanges', + version=1, + params=_params) + + reply = await self.rpc(msg) + return reply + + + class AgentToolsFacade(Type): name = 'AgentTools' version = 1 @@ -19,7 +115,10 @@ class AgentToolsFacade(Type): ''' # map input types to rpc msg _params = dict() - msg = dict(type='AgentTools', request='UpdateToolsAvailable', version=1, params=_params) + msg = dict(type='AgentTools', + request='UpdateToolsAvailable', + version=1, + params=_params) reply = await self.rpc(msg) return reply @@ -50,11 +149,14 @@ class AllWatcherFacade(Type): async def Next(self): ''' - Returns -> typing.Sequence<+T_co>[~Delta]<~Delta> + Returns -> typing.Sequence[~Delta] ''' # map input types to rpc msg _params = dict() - msg = dict(type='AllWatcher', request='Next', version=1, params=_params) + msg = dict(type='AllWatcher', + request='Next', + version=1, + params=_params) reply = await self.rpc(msg) return reply @@ -69,7 +171,10 @@ class AllWatcherFacade(Type): ''' # map input types to rpc msg _params = dict() - msg = dict(type='AllWatcher', request='Stop', version=1, params=_params) + msg = dict(type='AllWatcher', + request='Stop', + version=1, + params=_params) reply = await self.rpc(msg) return reply @@ -130,7 +235,10 @@ class ApplicationRelationsWatcherFacade(Type): ''' # map input types to rpc msg _params = dict() - msg = dict(type='ApplicationRelationsWatcher', request='Next', version=1, params=_params) + msg = dict(type='ApplicationRelationsWatcher', + request='Next', + version=1, + params=_params) reply = await self.rpc(msg) return reply @@ -145,7 +253,10 @@ class ApplicationRelationsWatcherFacade(Type): ''' # map input types to rpc msg _params = dict() - msg = dict(type='ApplicationRelationsWatcher', request='Stop', version=1, params=_params) + msg = dict(type='ApplicationRelationsWatcher', + request='Stop', + version=1, + params=_params) reply = await self.rpc(msg) return reply @@ -201,12 +312,15 @@ class ApplicationScalerFacade(Type): @ReturnMapping(ErrorResults) async def Rescale(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='ApplicationScaler', request='Rescale', version=1, params=_params) + msg = dict(type='ApplicationScaler', + request='Rescale', + version=1, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -217,11 +331,14 @@ class ApplicationScalerFacade(Type): async def Watch(self): ''' - Returns -> typing.Union[typing.Sequence<+T_co>[str], _ForwardRef('Error')] + Returns -> typing.Union[typing.Sequence[str], _ForwardRef('Error'), str] ''' # map input types to rpc msg _params = dict() - msg = dict(type='ApplicationScaler', request='Watch', version=1, params=_params) + msg = dict(type='ApplicationScaler', + request='Watch', + version=1, + params=_params) reply = await self.rpc(msg) return reply @@ -327,7 +444,10 @@ class BackupsFacade(Type): ''' # map input types to rpc msg _params = dict() - msg = dict(type='Backups', request='Create', version=1, params=_params) + msg = dict(type='Backups', + request='Create', + version=1, + params=_params) _params['notes'] = notes reply = await self.rpc(msg) return reply @@ -342,7 +462,10 @@ class BackupsFacade(Type): ''' # map input types to rpc msg _params = dict() - msg = dict(type='Backups', request='FinishRestore', version=1, params=_params) + msg = dict(type='Backups', + request='FinishRestore', + version=1, + params=_params) reply = await self.rpc(msg) return reply @@ -357,7 +480,10 @@ class BackupsFacade(Type): ''' # map input types to rpc msg _params = dict() - msg = dict(type='Backups', request='Info', version=1, params=_params) + msg = dict(type='Backups', + request='Info', + version=1, + params=_params) _params['id'] = id_ reply = await self.rpc(msg) return reply @@ -368,11 +494,14 @@ class BackupsFacade(Type): async def List(self): ''' - Returns -> typing.Sequence<+T_co>[~BackupsMetadataResult]<~BackupsMetadataResult> + Returns -> typing.Sequence[~BackupsMetadataResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Backups', request='List', version=1, params=_params) + msg = dict(type='Backups', + request='List', + version=1, + params=_params) reply = await self.rpc(msg) return reply @@ -387,7 +516,10 @@ class BackupsFacade(Type): ''' # map input types to rpc msg _params = dict() - msg = dict(type='Backups', request='PrepareRestore', version=1, params=_params) + msg = dict(type='Backups', + request='PrepareRestore', + version=1, + params=_params) reply = await self.rpc(msg) return reply @@ -402,7 +534,10 @@ class BackupsFacade(Type): ''' # map input types to rpc msg _params = dict() - msg = dict(type='Backups', request='Remove', version=1, params=_params) + msg = dict(type='Backups', + request='Remove', + version=1, + params=_params) _params['id'] = id_ reply = await self.rpc(msg) return reply @@ -417,7 +552,10 @@ class BackupsFacade(Type): ''' # map input types to rpc msg _params = dict() - msg = dict(type='Backups', request='Restore', version=1, params=_params) + msg = dict(type='Backups', + request='Restore', + version=1, + params=_params) _params['backup-id'] = backup_id reply = await self.rpc(msg) return reply @@ -460,208 +598,193 @@ class BundleFacade(Type): async def GetChanges(self, yaml): ''' yaml : str - Returns -> typing.Sequence<+T_co>[~BundleChange]<~BundleChange> + Returns -> typing.Union[typing.Sequence[~BundleChange], typing.Sequence[str]] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Bundle', request='GetChanges', version=1, params=_params) + 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' +class CAASAgentFacade(Type): + name = 'CAASAgent' 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, + schema = {'definitions': {'CloudCredential': {'additionalProperties': False, + 'properties': {'attrs': {'patternProperties': {'.*': {'type': 'string'}}, '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'], + 'auth-type': {'type': 'string'}, + 'redacted': {'items': {'type': 'string'}, + 'type': 'array'}}, + 'required': ['auth-type'], + 'type': 'object'}, + 'CloudSpec': {'additionalProperties': False, + 'properties': {'cacertificates': {'items': {'type': 'string'}, + 'type': 'array'}, + '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'}, - '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'], + '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'}, + 'ModelTag': {'additionalProperties': False, 'type': 'object'}, + 'NotifyWatchResult': {'additionalProperties': False, + 'properties': {'NotifyWatcherId': {'type': 'string'}, + 'error': {'$ref': '#/definitions/Error'}}, + 'required': ['NotifyWatcherId'], + 'type': 'object'}}, + 'properties': {'CloudSpec': {'properties': {'Params': {'$ref': '#/definitions/Entities'}, + 'Result': {'$ref': '#/definitions/CloudSpecResults'}}, + 'type': 'object'}, + 'GetCloudSpec': {'properties': {'Params': {'$ref': '#/definitions/ModelTag'}, + 'Result': {'$ref': '#/definitions/CloudSpecResult'}}, 'type': 'object'}, - 'Constraints': {'additionalProperties': False, - 'properties': {'Count': {'type': 'integer'}, - 'Pool': {'type': 'string'}, - 'Size': {'type': 'integer'}}, - 'required': ['Pool', 'Size', 'Count'], + 'ModelConfig': {'properties': {'Result': {'$ref': '#/definitions/ModelConfigResult'}}, + 'type': 'object'}, + 'WatchForModelConfigChanges': {'properties': {'Result': {'$ref': '#/definitions/NotifyWatchResult'}}, + 'type': 'object'}}, + 'type': 'object'} + + + @ReturnMapping(CloudSpecResults) + async def CloudSpec(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~CloudSpecResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='CAASAgent', + request='CloudSpec', + version=1, + 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='CAASAgent', + request='GetCloudSpec', + version=1, + params=_params) + + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ModelConfigResult) + async def ModelConfig(self): + ''' + + Returns -> typing.Mapping[str, typing.Any] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='CAASAgent', + request='ModelConfig', + version=1, + 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='CAASAgent', + request='WatchForModelConfigChanges', + version=1, + params=_params) + + reply = await self.rpc(msg) + return reply + + + +class CAASFirewallerFacade(Type): + name = 'CAASFirewaller' + version = 1 + schema = {'definitions': {'ApplicationGetConfigResults': {'additionalProperties': False, + 'properties': {'Results': {'items': {'$ref': '#/definitions/ConfigResult'}, + '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'}, - '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, + 'ConfigResult': {'additionalProperties': False, + 'properties': {'config': {'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'}, + 'error': {'$ref': '#/definitions/Error'}}, + 'required': ['config'], + 'type': 'object'}, 'Entities': {'additionalProperties': False, 'properties': {'entities': {'items': {'$ref': '#/definitions/Entity'}, 'type': 'array'}}, @@ -671,16 +794,6 @@ class ClientFacade(Type): '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'}, @@ -691,922 +804,3820 @@ class ClientFacade(Type): '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'], + 'LifeResult': {'additionalProperties': False, + 'properties': {'error': {'$ref': '#/definitions/Error'}, + 'life': {'type': 'string'}}, + 'required': ['life'], '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'], + 'LifeResults': {'additionalProperties': False, + 'properties': {'results': {'items': {'$ref': '#/definitions/LifeResult'}, + 'type': 'array'}}, + 'required': ['results'], 'type': 'object'}, - 'ModelConfigResults': {'additionalProperties': False, - 'properties': {'config': {'patternProperties': {'.*': {'$ref': '#/definitions/ConfigValue'}}, - 'type': 'object'}}, - 'required': ['config'], + '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'}, - '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'], + 'StringsWatchResult': {'additionalProperties': False, + 'properties': {'changes': {'items': {'type': 'string'}, + 'type': 'array'}, + 'error': {'$ref': '#/definitions/Error'}, + 'watcher-id': {'type': 'string'}}, + 'required': ['watcher-id'], + 'type': 'object'}}, + 'properties': {'ApplicationsConfig': {'properties': {'Params': {'$ref': '#/definitions/Entities'}, + 'Result': {'$ref': '#/definitions/ApplicationGetConfigResults'}}, + 'type': 'object'}, + 'IsExposed': {'properties': {'Params': {'$ref': '#/definitions/Entities'}, + 'Result': {'$ref': '#/definitions/BoolResults'}}, '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'], + 'Life': {'properties': {'Params': {'$ref': '#/definitions/Entities'}, + 'Result': {'$ref': '#/definitions/LifeResults'}}, + 'type': 'object'}, + 'Watch': {'properties': {'Params': {'$ref': '#/definitions/Entities'}, + 'Result': {'$ref': '#/definitions/NotifyWatchResults'}}, + 'type': 'object'}, + 'WatchApplications': {'properties': {'Result': {'$ref': '#/definitions/StringsWatchResult'}}, + 'type': 'object'}}, + 'type': 'object'} + + + @ReturnMapping(ApplicationGetConfigResults) + async def ApplicationsConfig(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ConfigResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='CAASFirewaller', + request='ApplicationsConfig', + version=1, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(BoolResults) + async def IsExposed(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~BoolResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='CAASFirewaller', + request='IsExposed', + version=1, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(LifeResults) + async def Life(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~LifeResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='CAASFirewaller', + 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[~Entity] + Returns -> typing.Sequence[~NotifyWatchResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='CAASFirewaller', + request='Watch', + version=1, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(StringsWatchResult) + async def WatchApplications(self): + ''' + + Returns -> typing.Union[typing.Sequence[str], _ForwardRef('Error'), str] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='CAASFirewaller', + request='WatchApplications', + version=1, + params=_params) + + reply = await self.rpc(msg) + return reply + + + +class CAASOperatorFacade(Type): + name = 'CAASOperator' + 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'}, + 'ApplicationCharm': {'additionalProperties': False, + 'properties': {'charm-modified-version': {'type': 'integer'}, + 'force-upgrade': {'type': 'boolean'}, + 'sha256': {'type': 'string'}, + 'url': {'type': 'string'}}, + 'required': ['url', + 'sha256', + 'charm-modified-version'], + 'type': 'object'}, + 'ApplicationCharmResult': {'additionalProperties': False, + 'properties': {'error': {'$ref': '#/definitions/Error'}, + 'result': {'$ref': '#/definitions/ApplicationCharm'}}, + 'type': 'object'}, + 'ApplicationCharmResults': {'additionalProperties': False, + 'properties': {'results': {'items': {'$ref': '#/definitions/ApplicationCharmResult'}, + 'type': 'array'}}, + 'required': ['results'], + 'type': 'object'}, + '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'}, - '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'], + 'EntitiesVersion': {'additionalProperties': False, + 'properties': {'agent-tools': {'items': {'$ref': '#/definitions/EntityVersion'}, + 'type': 'array'}}, + 'required': ['agent-tools'], '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'], + 'Entity': {'additionalProperties': False, + 'properties': {'tag': {'type': 'string'}}, + 'required': ['tag'], 'type': 'object'}, - 'Placement': {'additionalProperties': False, - 'properties': {'directive': {'type': 'string'}, - 'scope': {'type': 'string'}}, - 'required': ['scope', 'directive'], + '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'}, + 'EntityString': {'additionalProperties': False, + 'properties': {'tag': {'type': 'string'}, + 'value': {'type': 'string'}}, + 'required': ['tag', 'value'], + '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'}, - 'PrivateAddress': {'additionalProperties': False, + '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'}, + 'ModelResult': {'additionalProperties': False, + 'properties': {'error': {'$ref': '#/definitions/Error'}, + 'name': {'type': 'string'}, + 'type': {'type': 'string'}, + 'uuid': {'type': 'string'}}, + 'required': ['name', 'uuid', 'type'], + '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'}, + 'SetPodSpecParams': {'additionalProperties': False, + 'properties': {'specs': {'items': {'$ref': '#/definitions/EntityString'}, + 'type': 'array'}}, + 'required': ['specs'], + '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'}, + 'Version': {'additionalProperties': False, + 'properties': {'version': {'$ref': '#/definitions/Binary'}}, + 'required': ['version'], + 'type': 'object'}}, + 'properties': {'APIAddresses': {'properties': {'Result': {'$ref': '#/definitions/StringsResult'}}, + 'type': 'object'}, + 'APIHostPorts': {'properties': {'Result': {'$ref': '#/definitions/APIHostPortsResult'}}, + 'type': 'object'}, + 'Charm': {'properties': {'Params': {'$ref': '#/definitions/Entities'}, + 'Result': {'$ref': '#/definitions/ApplicationCharmResults'}}, + 'type': 'object'}, + 'CurrentModel': {'properties': {'Result': {'$ref': '#/definitions/ModelResult'}}, + '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'}, + 'SetPodSpec': {'properties': {'Params': {'$ref': '#/definitions/SetPodSpecParams'}, + 'Result': {'$ref': '#/definitions/ErrorResults'}}, + 'type': 'object'}, + 'SetStatus': {'properties': {'Params': {'$ref': '#/definitions/SetStatus'}, + 'Result': {'$ref': '#/definitions/ErrorResults'}}, + 'type': 'object'}, + 'SetTools': {'properties': {'Params': {'$ref': '#/definitions/EntitiesVersion'}, + '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'}, + '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[str]] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='CAASOperator', + request='APIAddresses', + version=1, + params=_params) + + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(APIHostPortsResult) + async def APIHostPorts(self): + ''' + + Returns -> typing.Sequence[~HostPort] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='CAASOperator', + request='APIHostPorts', + version=1, + params=_params) + + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ApplicationCharmResults) + async def Charm(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ApplicationCharmResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='CAASOperator', + request='Charm', + version=1, + 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='CAASOperator', + request='CurrentModel', + version=1, + params=_params) + + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(LifeResults) + async def Life(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~LifeResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='CAASOperator', + 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='CAASOperator', + request='ModelUUID', + version=1, + params=_params) + + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResults) + async def Remove(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='CAASOperator', + request='Remove', + version=1, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResults) + async def SetPodSpec(self, specs): + ''' + specs : typing.Sequence[~EntityString] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='CAASOperator', + request='SetPodSpec', + version=1, + params=_params) + _params['specs'] = specs + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResults) + async def SetStatus(self, entities): + ''' + entities : typing.Sequence[~EntityStatusArgs] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='CAASOperator', + request='SetStatus', + 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[~EntityVersion] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='CAASOperator', + request='SetTools', + version=1, + params=_params) + _params['agent-tools'] = agent_tools + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(NotifyWatchResults) + async def Watch(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~NotifyWatchResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='CAASOperator', + 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='CAASOperator', + request='WatchAPIHostPorts', + version=1, + params=_params) + + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(StringsWatchResults) + async def WatchUnits(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~StringsWatchResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='CAASOperator', + request='WatchUnits', + version=1, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + +class CAASOperatorProvisionerFacade(Type): + name = 'CAASOperatorProvisioner' + 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'}, + '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'}, + 'HostPort': {'additionalProperties': False, + 'properties': {'Address': {'$ref': '#/definitions/Address'}, + 'port': {'type': 'integer'}}, + 'required': ['Address', 'port'], + 'type': 'object'}, + 'KubernetesFilesystemAttachmentParams': {'additionalProperties': False, + 'properties': {'mount-point': {'type': 'string'}, + 'provider': {'type': 'string'}, + 'read-only': {'type': 'boolean'}}, + 'required': ['provider'], + 'type': 'object'}, + 'KubernetesFilesystemParams': {'additionalProperties': False, + 'properties': {'attachment': {'$ref': '#/definitions/KubernetesFilesystemAttachmentParams'}, + 'attributes': {'patternProperties': {'.*': {'additionalProperties': True, + 'type': 'object'}}, + 'type': 'object'}, + 'provider': {'type': 'string'}, + 'size': {'type': 'integer'}, + 'storagename': {'type': 'string'}, + 'tags': {'patternProperties': {'.*': {'type': 'string'}}, + 'type': 'object'}}, + 'required': ['storagename', + 'size', + 'provider'], + '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'}, + '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'}, + 'OperatorProvisioningInfo': {'additionalProperties': False, + 'properties': {'api-addresses': {'items': {'type': 'string'}, + 'type': 'array'}, + 'charm-storage': {'$ref': '#/definitions/KubernetesFilesystemParams'}, + 'image-path': {'type': 'string'}, + 'tags': {'patternProperties': {'.*': {'type': 'string'}}, + 'type': 'object'}, + 'version': {'$ref': '#/definitions/Number'}}, + 'required': ['image-path', + 'version', + 'api-addresses', + 'charm-storage'], + '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'}}, + 'properties': {'APIAddresses': {'properties': {'Result': {'$ref': '#/definitions/StringsResult'}}, + 'type': 'object'}, + 'APIHostPorts': {'properties': {'Result': {'$ref': '#/definitions/APIHostPortsResult'}}, + 'type': 'object'}, + 'Life': {'properties': {'Params': {'$ref': '#/definitions/Entities'}, + 'Result': {'$ref': '#/definitions/LifeResults'}}, + 'type': 'object'}, + 'ModelUUID': {'properties': {'Result': {'$ref': '#/definitions/StringResult'}}, + 'type': 'object'}, + 'OperatorProvisioningInfo': {'properties': {'Result': {'$ref': '#/definitions/OperatorProvisioningInfo'}}, + 'type': 'object'}, + 'SetPasswords': {'properties': {'Params': {'$ref': '#/definitions/EntityPasswords'}, + 'Result': {'$ref': '#/definitions/ErrorResults'}}, + 'type': 'object'}, + 'WatchAPIHostPorts': {'properties': {'Result': {'$ref': '#/definitions/NotifyWatchResult'}}, + 'type': 'object'}, + 'WatchApplications': {'properties': {'Result': {'$ref': '#/definitions/StringsWatchResult'}}, + 'type': 'object'}}, + 'type': 'object'} + + + @ReturnMapping(StringsResult) + async def APIAddresses(self): + ''' + + Returns -> typing.Union[_ForwardRef('Error'), typing.Sequence[str]] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='CAASOperatorProvisioner', + request='APIAddresses', + version=1, + params=_params) + + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(APIHostPortsResult) + async def APIHostPorts(self): + ''' + + Returns -> typing.Sequence[~HostPort] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='CAASOperatorProvisioner', + request='APIHostPorts', + version=1, + params=_params) + + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(LifeResults) + async def Life(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~LifeResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='CAASOperatorProvisioner', + 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='CAASOperatorProvisioner', + request='ModelUUID', + version=1, + params=_params) + + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(OperatorProvisioningInfo) + async def OperatorProvisioningInfo(self): + ''' + + Returns -> typing.Union[typing.Sequence[str], _ForwardRef('KubernetesFilesystemParams'), str, typing.Mapping[str, str], _ForwardRef('Number')] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='CAASOperatorProvisioner', + request='OperatorProvisioningInfo', + version=1, + params=_params) + + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResults) + async def SetPasswords(self, changes): + ''' + changes : typing.Sequence[~EntityPassword] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='CAASOperatorProvisioner', + request='SetPasswords', + version=1, + params=_params) + _params['changes'] = changes + 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='CAASOperatorProvisioner', + request='WatchAPIHostPorts', + version=1, + params=_params) + + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(StringsWatchResult) + async def WatchApplications(self): + ''' + + Returns -> typing.Union[typing.Sequence[str], _ForwardRef('Error'), str] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='CAASOperatorProvisioner', + request='WatchApplications', + version=1, + params=_params) + + reply = await self.rpc(msg) + return reply + + + +class CAASUnitProvisionerFacade(Type): + name = 'CAASUnitProvisioner' + version = 1 + 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'}, + 'ApplicationGetConfigResults': {'additionalProperties': False, + 'properties': {'Results': {'items': {'$ref': '#/definitions/ConfigResult'}, + 'type': 'array'}}, + 'required': ['Results'], + 'type': 'object'}, + 'ApplicationUnitParams': {'additionalProperties': False, + 'properties': {'address': {'type': 'string'}, + 'data': {'patternProperties': {'.*': {'additionalProperties': True, + 'type': 'object'}}, + 'type': 'object'}, + 'filesystem-info': {'items': {'$ref': '#/definitions/KubernetesFilesystemInfo'}, + 'type': 'array'}, + 'info': {'type': 'string'}, + 'ports': {'items': {'type': 'string'}, + 'type': 'array'}, + 'provider-id': {'type': 'string'}, + 'status': {'type': 'string'}, + 'unit-tag': {'type': 'string'}}, + 'required': ['provider-id', + 'unit-tag', + 'address', + 'ports', + 'status', + 'info'], + 'type': 'object'}, + 'ConfigResult': {'additionalProperties': False, + 'properties': {'config': {'patternProperties': {'.*': {'additionalProperties': True, + 'type': 'object'}}, + 'type': 'object'}, + 'error': {'$ref': '#/definitions/Error'}}, + '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'}, + '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'}, + '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'}, + 'KubernetesDeviceParams': {'additionalProperties': False, + 'properties': {'Attributes': {'patternProperties': {'.*': {'type': 'string'}}, + 'type': 'object'}, + 'Count': {'type': 'integer'}, + 'Type': {'type': 'string'}}, + 'required': ['Type', + 'Count', + 'Attributes'], + 'type': 'object'}, + 'KubernetesFilesystemAttachmentParams': {'additionalProperties': False, + 'properties': {'mount-point': {'type': 'string'}, + 'provider': {'type': 'string'}, + 'read-only': {'type': 'boolean'}}, + 'required': ['provider'], + 'type': 'object'}, + 'KubernetesFilesystemInfo': {'additionalProperties': False, + 'properties': {'data': {'patternProperties': {'.*': {'additionalProperties': True, + 'type': 'object'}}, + 'type': 'object'}, + 'filesystem-id': {'type': 'string'}, + 'info': {'type': 'string'}, + 'mount-point': {'type': 'string'}, + 'pool': {'type': 'string'}, + 'read-only': {'type': 'boolean'}, + 'size': {'type': 'integer'}, + 'status': {'type': 'string'}, + 'storagename': {'type': 'string'}, + 'volume': {'$ref': '#/definitions/KubernetesVolumeInfo'}}, + 'required': ['storagename', + 'pool', + 'size', + 'filesystem-id', + 'status', + 'info', + 'volume'], + 'type': 'object'}, + 'KubernetesFilesystemParams': {'additionalProperties': False, + 'properties': {'attachment': {'$ref': '#/definitions/KubernetesFilesystemAttachmentParams'}, + 'attributes': {'patternProperties': {'.*': {'additionalProperties': True, + 'type': 'object'}}, + 'type': 'object'}, + 'provider': {'type': 'string'}, + 'size': {'type': 'integer'}, + 'storagename': {'type': 'string'}, + 'tags': {'patternProperties': {'.*': {'type': 'string'}}, + 'type': 'object'}}, + 'required': ['storagename', + 'size', + 'provider'], + 'type': 'object'}, + 'KubernetesProvisioningInfo': {'additionalProperties': False, + 'properties': {'constraints': {'$ref': '#/definitions/Value'}, + 'devices': {'items': {'$ref': '#/definitions/KubernetesDeviceParams'}, + 'type': 'array'}, + 'filesystems': {'items': {'$ref': '#/definitions/KubernetesFilesystemParams'}, + 'type': 'array'}, + 'placement': {'type': 'string'}, + 'pod-spec': {'type': 'string'}, + 'tags': {'patternProperties': {'.*': {'type': 'string'}}, + 'type': 'object'}, + 'volumes': {'items': {'$ref': '#/definitions/KubernetesVolumeParams'}, + 'type': 'array'}}, + 'required': ['pod-spec', + 'constraints'], + 'type': 'object'}, + 'KubernetesProvisioningInfoResult': {'additionalProperties': False, + 'properties': {'error': {'$ref': '#/definitions/Error'}, + 'result': {'$ref': '#/definitions/KubernetesProvisioningInfo'}}, + 'required': ['result'], + 'type': 'object'}, + 'KubernetesProvisioningInfoResults': {'additionalProperties': False, + 'properties': {'results': {'items': {'$ref': '#/definitions/KubernetesProvisioningInfoResult'}, + 'type': 'array'}}, + 'required': ['results'], + 'type': 'object'}, + 'KubernetesVolumeAttachmentParams': {'additionalProperties': False, + 'properties': {'provider': {'type': 'string'}, + 'read-only': {'type': 'boolean'}}, + 'required': ['provider'], + 'type': 'object'}, + 'KubernetesVolumeInfo': {'additionalProperties': False, + 'properties': {'data': {'patternProperties': {'.*': {'additionalProperties': True, + 'type': 'object'}}, + 'type': 'object'}, + 'info': {'type': 'string'}, + 'persistent': {'type': 'boolean'}, + 'pool': {'type': 'string'}, + 'size': {'type': 'integer'}, + 'status': {'type': 'string'}, + 'volume-id': {'type': 'string'}}, + 'required': ['volume-id', + 'size', + 'persistent', + 'status', + 'info'], + 'type': 'object'}, + 'KubernetesVolumeParams': {'additionalProperties': False, + 'properties': {'attachment': {'$ref': '#/definitions/KubernetesVolumeAttachmentParams'}, + 'attributes': {'patternProperties': {'.*': {'additionalProperties': True, + 'type': 'object'}}, + 'type': 'object'}, + 'provider': {'type': 'string'}, + 'size': {'type': 'integer'}, + 'storagename': {'type': 'string'}, + 'tags': {'patternProperties': {'.*': {'type': 'string'}}, + 'type': 'object'}}, + 'required': ['storagename', + 'size', + 'provider'], + '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'}, + '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'}, + 'UpdateApplicationServiceArg': {'additionalProperties': False, + 'properties': {'addresses': {'items': {'$ref': '#/definitions/Address'}, + 'type': 'array'}, + 'application-tag': {'type': 'string'}, + 'provider-id': {'type': 'string'}}, + 'required': ['application-tag', + 'provider-id', + 'addresses'], + 'type': 'object'}, + 'UpdateApplicationServiceArgs': {'additionalProperties': False, + 'properties': {'args': {'items': {'$ref': '#/definitions/UpdateApplicationServiceArg'}, + 'type': 'array'}}, + 'required': ['args'], + 'type': 'object'}, + 'UpdateApplicationUnitArgs': {'additionalProperties': False, + 'properties': {'args': {'items': {'$ref': '#/definitions/UpdateApplicationUnits'}, + 'type': 'array'}}, + 'required': ['args'], + 'type': 'object'}, + 'UpdateApplicationUnits': {'additionalProperties': False, + 'properties': {'application-tag': {'type': 'string'}, + 'units': {'items': {'$ref': '#/definitions/ApplicationUnitParams'}, + 'type': 'array'}}, + 'required': ['application-tag', + 'units'], + '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'}, + 'zones': {'items': {'type': 'string'}, + 'type': 'array'}}, + 'type': 'object'}}, + 'properties': {'ApplicationsConfig': {'properties': {'Params': {'$ref': '#/definitions/Entities'}, + 'Result': {'$ref': '#/definitions/ApplicationGetConfigResults'}}, + 'type': 'object'}, + 'ApplicationsScale': {'properties': {'Params': {'$ref': '#/definitions/Entities'}, + 'Result': {'$ref': '#/definitions/IntResults'}}, + 'type': 'object'}, + 'Life': {'properties': {'Params': {'$ref': '#/definitions/Entities'}, + 'Result': {'$ref': '#/definitions/LifeResults'}}, + 'type': 'object'}, + 'ProvisioningInfo': {'properties': {'Params': {'$ref': '#/definitions/Entities'}, + 'Result': {'$ref': '#/definitions/KubernetesProvisioningInfoResults'}}, + 'type': 'object'}, + 'SetOperatorStatus': {'properties': {'Params': {'$ref': '#/definitions/SetStatus'}, + 'Result': {'$ref': '#/definitions/ErrorResults'}}, + 'type': 'object'}, + 'UpdateApplicationsService': {'properties': {'Params': {'$ref': '#/definitions/UpdateApplicationServiceArgs'}, + 'Result': {'$ref': '#/definitions/ErrorResults'}}, + 'type': 'object'}, + 'UpdateApplicationsUnits': {'properties': {'Params': {'$ref': '#/definitions/UpdateApplicationUnitArgs'}, + 'Result': {'$ref': '#/definitions/ErrorResults'}}, + 'type': 'object'}, + 'WatchApplications': {'properties': {'Result': {'$ref': '#/definitions/StringsWatchResult'}}, + 'type': 'object'}, + 'WatchApplicationsScale': {'properties': {'Params': {'$ref': '#/definitions/Entities'}, + 'Result': {'$ref': '#/definitions/NotifyWatchResults'}}, + 'type': 'object'}, + 'WatchPodSpec': {'properties': {'Params': {'$ref': '#/definitions/Entities'}, + 'Result': {'$ref': '#/definitions/NotifyWatchResults'}}, + 'type': 'object'}}, + 'type': 'object'} + + + @ReturnMapping(ApplicationGetConfigResults) + async def ApplicationsConfig(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ConfigResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='CAASUnitProvisioner', + request='ApplicationsConfig', + version=1, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(IntResults) + async def ApplicationsScale(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~IntResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='CAASUnitProvisioner', + request='ApplicationsScale', + version=1, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(LifeResults) + async def Life(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~LifeResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='CAASUnitProvisioner', + request='Life', + version=1, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(KubernetesProvisioningInfoResults) + async def ProvisioningInfo(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~KubernetesProvisioningInfoResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='CAASUnitProvisioner', + request='ProvisioningInfo', + version=1, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResults) + async def SetOperatorStatus(self, entities): + ''' + entities : typing.Sequence[~EntityStatusArgs] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='CAASUnitProvisioner', + request='SetOperatorStatus', + version=1, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResults) + async def UpdateApplicationsService(self, args): + ''' + args : typing.Sequence[~UpdateApplicationServiceArg] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='CAASUnitProvisioner', + request='UpdateApplicationsService', + version=1, + params=_params) + _params['args'] = args + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResults) + async def UpdateApplicationsUnits(self, args): + ''' + args : typing.Sequence[~UpdateApplicationUnits] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='CAASUnitProvisioner', + request='UpdateApplicationsUnits', + version=1, + params=_params) + _params['args'] = args + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(StringsWatchResult) + async def WatchApplications(self): + ''' + + Returns -> typing.Union[typing.Sequence[str], _ForwardRef('Error'), str] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='CAASUnitProvisioner', + request='WatchApplications', + version=1, + params=_params) + + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(NotifyWatchResults) + async def WatchApplicationsScale(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~NotifyWatchResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='CAASUnitProvisioner', + request='WatchApplicationsScale', + version=1, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(NotifyWatchResults) + async def WatchPodSpec(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~NotifyWatchResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='CAASUnitProvisioner', + request='WatchPodSpec', + version=1, + params=_params) + _params['entities'] = entities + 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'], + '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[~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[~AddMachineParams] + Returns -> typing.Sequence[~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[~AddMachineParams] + Returns -> typing.Sequence[~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[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[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[~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[str] + Returns -> typing.Union[typing.Mapping[str, ~ApplicationStatus], str, typing.Mapping[str, ~MachineStatus], _ForwardRef('ModelStatusInfo'), typing.Mapping[str, ~ApplicationOfferStatus], typing.Sequence[~RelationStatus], typing.Mapping[str, ~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.Union[typing.Sequence[~BundleChange], typing.Sequence[str]] + ''' + # 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[~AddMachineParams] + Returns -> typing.Sequence[~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[str, ~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'), str, typing.Sequence[~ModelMachineInfo], _ForwardRef('ModelMigrationStatus'), _ForwardRef('ModelSLAInfo'), _ForwardRef('EntityStatus'), typing.Sequence[~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[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[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[~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[str] + Returns -> typing.Sequence[~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[~Entity] + Returns -> typing.Sequence[~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[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[~StatusHistoryRequest] + Returns -> typing.Sequence[~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'}, - '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'], + '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[~Entity] + Returns -> typing.Sequence[~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[str, ~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[~Entity] + Returns -> typing.Sequence[~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[~CloudInstanceTypesConstraint] + Returns -> typing.Sequence[~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[~Entity] + Returns -> typing.Sequence[~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[~UpdateCloudCredential] + Returns -> typing.Sequence[~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[~UserCloud] + Returns -> typing.Sequence[~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 CredentialManagerFacade(Type): + name = 'CredentialManager' + 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'}, + 'InvalidateCredentialArg': {'additionalProperties': False, + 'properties': {'reason': {'type': 'string'}}, + 'type': 'object'}, + 'Macaroon': {'additionalProperties': False, 'type': 'object'}}, + 'properties': {'InvalidateModelCredential': {'properties': {'Params': {'$ref': '#/definitions/InvalidateCredentialArg'}, + 'Result': {'$ref': '#/definitions/ErrorResult'}}, + 'type': 'object'}}, + 'type': 'object'} + + + @ReturnMapping(ErrorResult) + async def InvalidateModelCredential(self, reason): + ''' + reason : str + Returns -> Error + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='CredentialManager', + request='InvalidateModelCredential', + version=1, + params=_params) + _params['reason'] = reason + reply = await self.rpc(msg) + return reply + + + +class CrossControllerFacade(Type): + name = 'CrossController' + version = 1 + schema = {'definitions': {'ControllerAPIInfoResult': {'additionalProperties': False, + 'properties': {'addresses': {'items': {'type': 'string'}, + 'type': 'array'}, + 'cacert': {'type': 'string'}, + 'error': {'$ref': '#/definitions/Error'}}, + 'required': ['addresses', + 'cacert'], + 'type': 'object'}, + 'ControllerAPIInfoResults': {'additionalProperties': False, + 'properties': {'results': {'items': {'$ref': '#/definitions/ControllerAPIInfoResult'}, + 'type': 'array'}}, + 'required': ['results'], 'type': 'object'}, - 'PublicAddress': {'additionalProperties': False, - 'properties': {'target': {'type': 'string'}}, - 'required': ['target'], + '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'}}, + 'properties': {'ControllerInfo': {'properties': {'Result': {'$ref': '#/definitions/ControllerAPIInfoResults'}}, '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'], + 'WatchControllerInfo': {'properties': {'Result': {'$ref': '#/definitions/NotifyWatchResults'}}, + 'type': 'object'}}, + 'type': 'object'} + + + @ReturnMapping(ControllerAPIInfoResults) + async def ControllerInfo(self): + ''' + + Returns -> typing.Sequence[~ControllerAPIInfoResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='CrossController', + request='ControllerInfo', + version=1, + params=_params) + + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(NotifyWatchResults) + async def WatchControllerInfo(self): + ''' + + Returns -> typing.Sequence[~NotifyWatchResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='CrossController', + request='WatchControllerInfo', + version=1, + params=_params) + + reply = await self.rpc(msg) + return reply + + + +class CrossModelRelationsFacade(Type): + name = 'CrossModelRelations' + version = 1 + schema = {'definitions': {'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'}, + 'IngressNetworksChangeEvent': {'additionalProperties': False, + 'properties': {'application-token': {'type': 'string'}, + 'ingress-required': {'type': 'boolean'}, + 'macaroons': {'items': {'$ref': '#/definitions/Macaroon'}, + 'type': 'array'}, + 'networks': {'items': {'type': 'string'}, + 'type': 'array'}, + 'relation-token': {'type': 'string'}}, + 'required': ['relation-token', + 'application-token', + 'ingress-required'], + 'type': 'object'}, + 'IngressNetworksChanges': {'additionalProperties': False, + 'properties': {'changes': {'items': {'$ref': '#/definitions/IngressNetworksChangeEvent'}, + 'type': 'array'}}, + 'type': 'object'}, + 'Macaroon': {'additionalProperties': False, 'type': 'object'}, + 'OfferArg': {'additionalProperties': False, + 'properties': {'macaroons': {'items': {'$ref': '#/definitions/Macaroon'}, + 'type': 'array'}, + 'offer-uuid': {'type': 'string'}}, + 'required': ['offer-uuid'], + 'type': 'object'}, + 'OfferArgs': {'additionalProperties': False, + 'properties': {'args': {'items': {'$ref': '#/definitions/OfferArg'}, + 'type': 'array'}}, + 'required': ['args'], + 'type': 'object'}, + 'OfferStatusChange': {'additionalProperties': False, + 'properties': {'offer-name': {'type': 'string'}, + 'status': {'$ref': '#/definitions/EntityStatus'}}, + 'required': ['offer-name', 'status'], + 'type': 'object'}, + 'OfferStatusWatchResult': {'additionalProperties': False, + 'properties': {'changes': {'items': {'$ref': '#/definitions/OfferStatusChange'}, + 'type': 'array'}, + 'error': {'$ref': '#/definitions/Error'}, + 'watcher-id': {'type': 'string'}}, + 'required': ['watcher-id', + 'changes'], + 'type': 'object'}, + 'OfferStatusWatchResults': {'additionalProperties': False, + 'properties': {'results': {'items': {'$ref': '#/definitions/OfferStatusWatchResult'}, + 'type': 'array'}}, + 'required': ['results'], 'type': 'object'}, + 'RegisterRemoteRelationArg': {'additionalProperties': False, + 'properties': {'application-token': {'type': 'string'}, + 'local-endpoint-name': {'type': 'string'}, + 'macaroons': {'items': {'$ref': '#/definitions/Macaroon'}, + 'type': 'array'}, + 'offer-uuid': {'type': 'string'}, + 'relation-token': {'type': 'string'}, + 'remote-endpoint': {'$ref': '#/definitions/RemoteEndpoint'}, + 'remote-space': {'$ref': '#/definitions/RemoteSpace'}, + 'source-model-tag': {'type': 'string'}}, + 'required': ['application-token', + 'source-model-tag', + 'relation-token', + 'remote-endpoint', + 'remote-space', + 'offer-uuid', + 'local-endpoint-name'], + 'type': 'object'}, + 'RegisterRemoteRelationArgs': {'additionalProperties': False, + 'properties': {'relations': {'items': {'$ref': '#/definitions/RegisterRemoteRelationArg'}, + 'type': 'array'}}, + 'required': ['relations'], + 'type': 'object'}, + 'RegisterRemoteRelationResult': {'additionalProperties': False, + 'properties': {'error': {'$ref': '#/definitions/Error'}, + 'result': {'$ref': '#/definitions/RemoteRelationDetails'}}, + 'type': 'object'}, + 'RegisterRemoteRelationResults': {'additionalProperties': False, + 'properties': {'results': {'items': {'$ref': '#/definitions/RegisterRemoteRelationResult'}, + 'type': 'array'}}, + 'type': 'object'}, + 'RelationLifeSuspendedStatusChange': {'additionalProperties': False, + 'properties': {'key': {'type': 'string'}, + 'life': {'type': 'string'}, + 'suspended': {'type': 'boolean'}, + 'suspended-reason': {'type': 'string'}}, + 'required': ['key', + 'life', + 'suspended', + 'suspended-reason'], + 'type': 'object'}, + 'RelationLifeSuspendedStatusWatchResult': {'additionalProperties': False, + 'properties': {'changes': {'items': {'$ref': '#/definitions/RelationLifeSuspendedStatusChange'}, + 'type': 'array'}, + 'error': {'$ref': '#/definitions/Error'}, + 'watcher-id': {'type': 'string'}}, + 'required': ['watcher-id', + 'changes'], + 'type': 'object'}, + 'RelationStatusWatchResults': {'additionalProperties': False, + 'properties': {'results': {'items': {'$ref': '#/definitions/RelationLifeSuspendedStatusWatchResult'}, + 'type': 'array'}}, + 'required': ['results'], + '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'}, + 'RelationUnitsWatchResults': {'additionalProperties': False, + 'properties': {'results': {'items': {'$ref': '#/definitions/RelationUnitsWatchResult'}, + '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'}}, + 'role': {'type': 'string'}}, 'required': ['name', 'role', 'interface', - 'limit', - 'scope'], + 'limit'], 'type': 'object'}, - 'ResolveCharmResult': {'additionalProperties': False, - 'properties': {'error': {'type': 'string'}, - 'url': {'type': 'string'}}, + 'RemoteEntityArg': {'additionalProperties': False, + 'properties': {'macaroons': {'items': {'$ref': '#/definitions/Macaroon'}, + 'type': 'array'}, + 'relation-token': {'type': 'string'}}, + 'required': ['relation-token'], + 'type': 'object'}, + 'RemoteEntityArgs': {'additionalProperties': False, + 'properties': {'args': {'items': {'$ref': '#/definitions/RemoteEntityArg'}, + 'type': 'array'}}, + 'required': ['args'], + 'type': 'object'}, + 'RemoteRelationChangeEvent': {'additionalProperties': False, + 'properties': {'application-token': {'type': 'string'}, + 'changed-units': {'items': {'$ref': '#/definitions/RemoteRelationUnitChange'}, + 'type': 'array'}, + 'departed-units': {'items': {'type': 'integer'}, + 'type': 'array'}, + 'force-cleanup': {'type': 'boolean'}, + 'life': {'type': 'string'}, + 'macaroons': {'items': {'$ref': '#/definitions/Macaroon'}, + 'type': 'array'}, + 'relation-token': {'type': 'string'}, + 'suspended': {'type': 'boolean'}, + 'suspended-reason': {'type': 'string'}}, + 'required': ['relation-token', + 'application-token', + 'life'], + 'type': 'object'}, + 'RemoteRelationDetails': {'additionalProperties': False, + 'properties': {'macaroon': {'$ref': '#/definitions/Macaroon'}, + 'relation-token': {'type': 'string'}}, + 'required': ['relation-token'], + 'type': 'object'}, + 'RemoteRelationUnit': {'additionalProperties': False, + 'properties': {'macaroons': {'items': {'$ref': '#/definitions/Macaroon'}, + 'type': 'array'}, + 'relation-token': {'type': 'string'}, + 'unit': {'type': 'string'}}, + 'required': ['relation-token', 'unit'], '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'], + 'RemoteRelationUnitChange': {'additionalProperties': False, + 'properties': {'settings': {'patternProperties': {'.*': {'additionalProperties': True, + 'type': 'object'}}, + 'type': 'object'}, + 'unit-id': {'type': 'integer'}}, + 'required': ['unit-id'], + 'type': 'object'}, + 'RemoteRelationUnits': {'additionalProperties': False, + 'properties': {'relation-units': {'items': {'$ref': '#/definitions/RemoteRelationUnit'}, + 'type': 'array'}}, + 'required': ['relation-units'], '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'}, + 'RemoteRelationsChanges': {'additionalProperties': False, + 'properties': {'changes': {'items': {'$ref': '#/definitions/RemoteRelationChangeEvent'}, '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'}, + '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'}, - 'CACert': {'properties': {'Result': {'$ref': '#/definitions/BytesResult'}}, - 'type': 'object'}, - 'DestroyMachines': {'properties': {'Params': {'$ref': '#/definitions/DestroyMachines'}}, + 'SettingsResult': {'additionalProperties': False, + 'properties': {'error': {'$ref': '#/definitions/Error'}, + 'settings': {'patternProperties': {'.*': {'type': 'string'}}, + 'type': 'object'}}, + 'required': ['settings'], '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'}}, + 'SettingsResults': {'additionalProperties': False, + 'properties': {'results': {'items': {'$ref': '#/definitions/SettingsResult'}, + 'type': 'array'}}, + 'required': ['results'], 'type': 'object'}, - 'GetModelConstraints': {'properties': {'Result': {'$ref': '#/definitions/GetConstraintsResults'}}, + 'StringsWatchResult': {'additionalProperties': False, + 'properties': {'changes': {'items': {'type': 'string'}, + 'type': 'array'}, + 'error': {'$ref': '#/definitions/Error'}, + 'watcher-id': {'type': 'string'}}, + 'required': ['watcher-id'], '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'}}, + 'StringsWatchResults': {'additionalProperties': False, + 'properties': {'results': {'items': {'$ref': '#/definitions/StringsWatchResult'}, + 'type': 'array'}}, + 'required': ['results'], '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'}}, + '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'}, + 'UnitSettings': {'additionalProperties': False, + 'properties': {'version': {'type': 'integer'}}, + 'required': ['version'], + 'type': 'object'}}, + 'properties': {'PublishIngressNetworkChanges': {'properties': {'Params': {'$ref': '#/definitions/IngressNetworksChanges'}, + 'Result': {'$ref': '#/definitions/ErrorResults'}}, + 'type': 'object'}, + 'PublishRelationChanges': {'properties': {'Params': {'$ref': '#/definitions/RemoteRelationsChanges'}, + 'Result': {'$ref': '#/definitions/ErrorResults'}}, + 'type': 'object'}, + 'RegisterRemoteRelations': {'properties': {'Params': {'$ref': '#/definitions/RegisterRemoteRelationArgs'}, + 'Result': {'$ref': '#/definitions/RegisterRemoteRelationResults'}}, + 'type': 'object'}, + 'RelationUnitSettings': {'properties': {'Params': {'$ref': '#/definitions/RemoteRelationUnits'}, + 'Result': {'$ref': '#/definitions/SettingsResults'}}, + 'type': 'object'}, + 'WatchEgressAddressesForRelations': {'properties': {'Params': {'$ref': '#/definitions/RemoteEntityArgs'}, + 'Result': {'$ref': '#/definitions/StringsWatchResults'}}, + 'type': 'object'}, + 'WatchOfferStatus': {'properties': {'Params': {'$ref': '#/definitions/OfferArgs'}, + 'Result': {'$ref': '#/definitions/OfferStatusWatchResults'}}, + 'type': 'object'}, + 'WatchRelationUnits': {'properties': {'Params': {'$ref': '#/definitions/RemoteEntityArgs'}, + 'Result': {'$ref': '#/definitions/RelationUnitsWatchResults'}}, + 'type': 'object'}, + 'WatchRelationsSuspendedStatus': {'properties': {'Params': {'$ref': '#/definitions/RemoteEntityArgs'}, + 'Result': {'$ref': '#/definitions/RelationStatusWatchResults'}}, + '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): + @ReturnMapping(ErrorResults) + async def PublishIngressNetworkChanges(self, changes): ''' - - Returns -> typing.Sequence<+T_co>[int] + changes : typing.Sequence[~IngressNetworksChangeEvent] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Client', request='CACert', version=1, params=_params) - + msg = dict(type='CrossModelRelations', + request='PublishIngressNetworkChanges', + version=1, + params=_params) + _params['changes'] = changes reply = await self.rpc(msg) return reply - @ReturnMapping(None) - async def DestroyMachines(self, force, machine_names): + @ReturnMapping(ErrorResults) + async def PublishRelationChanges(self, changes): ''' - force : bool - machine_names : typing.Sequence<+T_co>[str] - Returns -> None + changes : typing.Sequence[~RemoteRelationChangeEvent] + Returns -> typing.Sequence[~ErrorResult] ''' # 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 + msg = dict(type='CrossModelRelations', + request='PublishRelationChanges', + version=1, + params=_params) + _params['changes'] = changes reply = await self.rpc(msg) return reply - @ReturnMapping(FindToolsResult) - async def FindTools(self, arch, major, minor, number, series): + @ReturnMapping(RegisterRemoteRelationResults) + async def RegisterRemoteRelations(self, relations): ''' - arch : str - major : int - minor : int - number : Number - series : str - Returns -> typing.Union[_ForwardRef('Error'), typing.Sequence<+T_co>[~Tools]<~Tools>] + relations : typing.Sequence[~RegisterRemoteRelationArg] + Returns -> typing.Sequence[~RegisterRemoteRelationResult] ''' # 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 + msg = dict(type='CrossModelRelations', + request='RegisterRemoteRelations', + version=1, + params=_params) + _params['relations'] = relations reply = await self.rpc(msg) return reply - @ReturnMapping(FullStatus) - async def FullStatus(self, patterns): + @ReturnMapping(SettingsResults) + async def RelationUnitSettings(self, relation_units): ''' - 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>] + relation_units : typing.Sequence[~RemoteRelationUnit] + Returns -> typing.Sequence[~SettingsResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Client', request='FullStatus', version=1, params=_params) - _params['patterns'] = patterns + msg = dict(type='CrossModelRelations', + request='RelationUnitSettings', + version=1, + params=_params) + _params['relation-units'] = relation_units reply = await self.rpc(msg) return reply - @ReturnMapping(BundleChangesResults) - async def GetBundleChanges(self, yaml): + @ReturnMapping(StringsWatchResults) + async def WatchEgressAddressesForRelations(self, args): ''' - yaml : str - Returns -> typing.Sequence<+T_co>[~BundleChange]<~BundleChange> + args : typing.Sequence[~RemoteEntityArg] + Returns -> typing.Sequence[~StringsWatchResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Client', request='GetBundleChanges', version=1, params=_params) - _params['yaml'] = yaml + msg = dict(type='CrossModelRelations', + request='WatchEgressAddressesForRelations', + version=1, + params=_params) + _params['args'] = args reply = await self.rpc(msg) return reply - @ReturnMapping(GetConstraintsResults) - async def GetModelConstraints(self): + @ReturnMapping(OfferStatusWatchResults) + async def WatchOfferStatus(self, args): ''' - - Returns -> Value + args : typing.Sequence[~OfferArg] + Returns -> typing.Sequence[~OfferStatusWatchResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Client', request='GetModelConstraints', version=1, params=_params) - + msg = dict(type='CrossModelRelations', + request='WatchOfferStatus', + version=1, + params=_params) + _params['args'] = args reply = await self.rpc(msg) return reply - @ReturnMapping(AddMachinesResults) - async def InjectMachines(self, params): + @ReturnMapping(RelationUnitsWatchResults) + async def WatchRelationUnits(self, args): ''' - params : typing.Sequence<+T_co>[~AddMachineParams]<~AddMachineParams> - Returns -> typing.Sequence<+T_co>[~AddMachinesResult]<~AddMachinesResult> + args : typing.Sequence[~RemoteEntityArg] + Returns -> typing.Sequence[~RelationUnitsWatchResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Client', request='InjectMachines', version=1, params=_params) - _params['params'] = params + msg = dict(type='CrossModelRelations', + request='WatchRelationUnits', + version=1, + params=_params) + _params['args'] = args reply = await self.rpc(msg) return reply - @ReturnMapping(ModelConfigResults) - async def ModelGet(self): + @ReturnMapping(RelationStatusWatchResults) + async def WatchRelationsSuspendedStatus(self, args): ''' - - Returns -> typing.Mapping<~KT, +VT_co>[str, ~ConfigValue]<~ConfigValue> + args : typing.Sequence[~RemoteEntityArg] + Returns -> typing.Sequence[~RelationLifeSuspendedStatusWatchResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Client', request='ModelGet', version=1, params=_params) - + msg = dict(type='CrossModelRelations', + request='WatchRelationsSuspendedStatus', + version=1, + params=_params) + _params['args'] = args reply = await self.rpc(msg) return reply - @ReturnMapping(ModelInfo) - async def ModelInfo(self): - ''' +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'}, + 'DeployerConnectionValues': {'additionalProperties': False, + 'properties': {'api-addresses': {'items': {'type': 'string'}, + 'type': 'array'}}, + 'required': ['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'}, + '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'}, + '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'} + - Returns -> typing.Union[_ForwardRef('Number'), _ForwardRef('ModelMigrationStatus'), _ForwardRef('ModelSLAInfo'), _ForwardRef('EntityStatus'), typing.Sequence<+T_co>[~ModelUserInfo]<~ModelUserInfo>] + @ReturnMapping(StringsResult) + async def APIAddresses(self): ''' - # 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 + Returns -> typing.Union[_ForwardRef('Error'), typing.Sequence[str]] ''' # 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 - + msg = dict(type='Deployer', + request='APIAddresses', + version=1, + params=_params) - - @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> + @ReturnMapping(APIHostPortsResult) + async def APIHostPorts(self): ''' - # 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 + Returns -> typing.Sequence[~HostPort] ''' # 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 - - + msg = dict(type='Deployer', + request='APIHostPorts', + version=1, + params=_params) - @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 + @ReturnMapping(DeployerConnectionValues) + async def ConnectionInfo(self): ''' - # 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> + Returns -> typing.Sequence[str] ''' # 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 - + msg = dict(type='Deployer', + request='ConnectionInfo', + version=1, + params=_params) - - @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): + @ReturnMapping(LifeResults) + async def Life(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~LifeResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Client', request='RetryProvisioning', version=1, params=_params) + msg = dict(type='Deployer', + request='Life', + version=1, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -1614,161 +4625,135 @@ class ClientFacade(Type): @ReturnMapping(StringResult) - async def SLALevel(self): + async def ModelUUID(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) + msg = dict(type='Deployer', + request='ModelUUID', + version=1, + params=_params) reply = await self.rpc(msg) return reply - @ReturnMapping(None) - async def SetModelAgentVersion(self, version): + @ReturnMapping(ErrorResults) + async def Remove(self, entities): ''' - version : Number - Returns -> None + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Client', request='SetModelAgentVersion', version=1, params=_params) - _params['version'] = version + msg = dict(type='Deployer', + request='Remove', + version=1, + params=_params) + _params['entities'] = entities reply = await self.rpc(msg) return reply - @ReturnMapping(None) - async def SetModelConstraints(self, application, constraints): + @ReturnMapping(ErrorResults) + async def SetPasswords(self, changes): ''' - application : str - constraints : Value - Returns -> None + changes : typing.Sequence[~EntityPassword] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Client', request='SetModelConstraints', version=1, params=_params) - _params['application'] = application - _params['constraints'] = constraints + msg = dict(type='Deployer', + request='SetPasswords', + version=1, + params=_params) + _params['changes'] = changes reply = await self.rpc(msg) return reply - @ReturnMapping(None) - async def SetSLALevel(self, creds, level): + @ReturnMapping(ErrorResults) + async def SetStatus(self, entities): ''' - creds : typing.Sequence<+T_co>[int] - level : str - Returns -> None + entities : typing.Sequence[~EntityStatusArgs] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Client', request='SetSLALevel', version=1, params=_params) - _params['creds'] = creds - _params['level'] = level + msg = dict(type='Deployer', + request='SetStatus', + version=1, + params=_params) + _params['entities'] = entities reply = await self.rpc(msg) return reply - @ReturnMapping(StatusHistoryResults) - async def StatusHistory(self, requests): + @ReturnMapping(ErrorResults) + async def UpdateStatus(self, entities): ''' - requests : typing.Sequence<+T_co>[~StatusHistoryRequest]<~StatusHistoryRequest> - Returns -> typing.Sequence<+T_co>[~StatusHistoryResult]<~StatusHistoryResult> + entities : typing.Sequence[~EntityStatusArgs] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Client', request='StatusHistory', version=1, params=_params) - _params['requests'] = requests + msg = dict(type='Deployer', + request='UpdateStatus', + version=1, + params=_params) + _params['entities'] = entities reply = await self.rpc(msg) return reply - @ReturnMapping(AllWatcherId) - async def WatchAll(self): + @ReturnMapping(NotifyWatchResult) + async def WatchAPIHostPorts(self): ''' - Returns -> str + Returns -> typing.Union[str, _ForwardRef('Error')] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Client', request='WatchAll', version=1, params=_params) + msg = dict(type='Deployer', + request='WatchAPIHostPorts', + 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, + + @ReturnMapping(StringsWatchResults) + async def WatchUnits(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~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 ExternalControllerUpdaterFacade(Type): + name = 'ExternalControllerUpdater' + version = 1 + schema = {'definitions': {'Entities': {'additionalProperties': False, 'properties': {'entities': {'items': {'$ref': '#/definitions/Entity'}, 'type': 'array'}}, 'required': ['entities'], @@ -1795,254 +4780,330 @@ class CloudFacade(Type): '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'}, + 'ExternalControllerInfo': {'additionalProperties': False, + 'properties': {'addrs': {'items': {'type': 'string'}, + 'type': 'array'}, + 'ca-cert': {'type': 'string'}, + 'controller-alias': {'type': 'string'}, + 'controller-tag': {'type': 'string'}}, + 'required': ['controller-tag', + 'controller-alias', + 'addrs', + 'ca-cert'], + 'type': 'object'}, + 'ExternalControllerInfoResult': {'additionalProperties': False, + 'properties': {'error': {'$ref': '#/definitions/Error'}, + 'result': {'$ref': '#/definitions/ExternalControllerInfo'}}, + 'required': ['result', + 'error'], + 'type': 'object'}, + 'ExternalControllerInfoResults': {'additionalProperties': False, + 'properties': {'results': {'items': {'$ref': '#/definitions/ExternalControllerInfoResult'}, + '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'], + 'SetExternalControllerInfoParams': {'additionalProperties': False, + 'properties': {'info': {'$ref': '#/definitions/ExternalControllerInfo'}}, + 'required': ['info'], + 'type': 'object'}, + 'SetExternalControllersInfoParams': {'additionalProperties': False, + 'properties': {'controllers': {'items': {'$ref': '#/definitions/SetExternalControllerInfoParams'}, + 'type': 'array'}}, + 'required': ['controllers'], + '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': {'ExternalControllerInfo': {'properties': {'Params': {'$ref': '#/definitions/Entities'}, + 'Result': {'$ref': '#/definitions/ExternalControllerInfoResults'}}, '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'}}, + 'SetExternalControllerInfo': {'properties': {'Params': {'$ref': '#/definitions/SetExternalControllersInfoParams'}, + 'Result': {'$ref': '#/definitions/ErrorResults'}}, + 'type': 'object'}, + 'WatchExternalControllers': {'properties': {'Result': {'$ref': '#/definitions/StringsWatchResults'}}, + 'type': 'object'}}, 'type': 'object'} - @ReturnMapping(CloudResults) - async def Cloud(self, entities): + @ReturnMapping(ExternalControllerInfoResults) + async def ExternalControllerInfo(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~CloudResult]<~CloudResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ExternalControllerInfoResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Cloud', request='Cloud', version=1, params=_params) + msg = dict(type='ExternalControllerUpdater', + request='ExternalControllerInfo', + version=1, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply - @ReturnMapping(CloudsResult) - async def Clouds(self): + @ReturnMapping(ErrorResults) + async def SetExternalControllerInfo(self, controllers): + ''' + controllers : typing.Sequence[~SetExternalControllerInfoParams] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='ExternalControllerUpdater', + request='SetExternalControllerInfo', + version=1, + params=_params) + _params['controllers'] = controllers + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(StringsWatchResults) + async def WatchExternalControllers(self): ''' - Returns -> typing.Mapping<~KT, +VT_co>[str, ~Cloud]<~Cloud> + Returns -> typing.Sequence[~StringsWatchResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Cloud', request='Clouds', version=1, params=_params) + msg = dict(type='ExternalControllerUpdater', + request='WatchExternalControllers', + version=1, + params=_params) reply = await self.rpc(msg) return reply - @ReturnMapping(CloudCredentialResults) - async def Credential(self, entities): +class FanConfigurerFacade(Type): + name = 'FanConfigurer' + 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'}, + 'FanConfigEntry': {'additionalProperties': False, + 'properties': {'overlay': {'type': 'string'}, + 'underlay': {'type': 'string'}}, + 'required': ['underlay', 'overlay'], + 'type': 'object'}, + 'FanConfigResult': {'additionalProperties': False, + 'properties': {'fans': {'items': {'$ref': '#/definitions/FanConfigEntry'}, + 'type': 'array'}}, + 'required': ['fans'], + 'type': 'object'}, + 'Macaroon': {'additionalProperties': False, 'type': 'object'}, + 'NotifyWatchResult': {'additionalProperties': False, + 'properties': {'NotifyWatcherId': {'type': 'string'}, + 'error': {'$ref': '#/definitions/Error'}}, + 'required': ['NotifyWatcherId'], + 'type': 'object'}}, + 'properties': {'FanConfig': {'properties': {'Result': {'$ref': '#/definitions/FanConfigResult'}}, + 'type': 'object'}, + 'WatchForFanConfigChanges': {'properties': {'Result': {'$ref': '#/definitions/NotifyWatchResult'}}, + 'type': 'object'}}, + 'type': 'object'} + + + @ReturnMapping(FanConfigResult) + async def FanConfig(self): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~CloudCredentialResult]<~CloudCredentialResult> + + Returns -> typing.Sequence[~FanConfigEntry] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Cloud', request='Credential', version=1, params=_params) - _params['entities'] = entities + msg = dict(type='FanConfigurer', + request='FanConfig', + version=1, + params=_params) + reply = await self.rpc(msg) return reply - @ReturnMapping(StringResult) - async def DefaultCloud(self): + @ReturnMapping(NotifyWatchResult) + async def WatchForFanConfigChanges(self): ''' - Returns -> typing.Union[_ForwardRef('Error'), str] + Returns -> typing.Union[str, _ForwardRef('Error')] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Cloud', request='DefaultCloud', version=1, params=_params) + msg = dict(type='FanConfigurer', + request='WatchForFanConfigChanges', + version=1, + params=_params) reply = await self.rpc(msg) return reply - @ReturnMapping(InstanceTypesResults) - async def InstanceTypes(self, constraints): +class FirewallRulesFacade(Type): + name = 'FirewallRules' + 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'}, + 'FirewallRule': {'additionalProperties': False, + 'properties': {'known-service': {'type': 'string'}, + 'whitelist-cidrs': {'items': {'type': 'string'}, + 'type': 'array'}}, + 'required': ['known-service'], + 'type': 'object'}, + 'FirewallRuleArgs': {'additionalProperties': False, + 'properties': {'args': {'items': {'$ref': '#/definitions/FirewallRule'}, + 'type': 'array'}}, + 'required': ['args'], + 'type': 'object'}, + 'ListFirewallRulesResults': {'additionalProperties': False, + 'properties': {'Rules': {'items': {'$ref': '#/definitions/FirewallRule'}, + 'type': 'array'}}, + 'required': ['Rules'], + 'type': 'object'}, + 'Macaroon': {'additionalProperties': False, 'type': 'object'}}, + 'properties': {'ListFirewallRules': {'properties': {'Result': {'$ref': '#/definitions/ListFirewallRulesResults'}}, + 'type': 'object'}, + 'SetFirewallRules': {'properties': {'Params': {'$ref': '#/definitions/FirewallRuleArgs'}, + 'Result': {'$ref': '#/definitions/ErrorResults'}}, + 'type': 'object'}}, + 'type': 'object'} + + + @ReturnMapping(ListFirewallRulesResults) + async def ListFirewallRules(self): ''' - constraints : typing.Sequence<+T_co>[~CloudInstanceTypesConstraint]<~CloudInstanceTypesConstraint> - Returns -> typing.Sequence<+T_co>[~InstanceTypesResult]<~InstanceTypesResult> + + Returns -> typing.Sequence[~FirewallRule] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Cloud', request='InstanceTypes', version=1, params=_params) - _params['constraints'] = constraints + msg = dict(type='FirewallRules', + request='ListFirewallRules', + version=1, + params=_params) + reply = await self.rpc(msg) return reply @ReturnMapping(ErrorResults) - async def RevokeCredentials(self, entities): + async def SetFirewallRules(self, args): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + args : typing.Sequence[~FirewallRule] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Cloud', request='RevokeCredentials', version=1, params=_params) - _params['entities'] = entities + msg = dict(type='FirewallRules', + request='SetFirewallRules', + version=1, + params=_params) + _params['args'] = args 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 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): + async def ReportKeys(self, entity_keys): ''' - user_clouds : typing.Sequence<+T_co>[~UserCloud]<~UserCloud> - Returns -> typing.Sequence<+T_co>[~StringsResult]<~StringsResult> + entity_keys : typing.Sequence[~SSHHostKeys] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Cloud', request='UserCredentials', version=1, params=_params) - _params['user-clouds'] = user_clouds + msg = dict(type='HostKeyReporter', + request='ReportKeys', + version=1, + params=_params) + _params['entity-keys'] = entity_keys reply = await self.rpc(msg) return reply -class DeployerFacade(Type): - name = 'Deployer' +class KeyManagerFacade(Type): + name = 'KeyManager' 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, + schema = {'definitions': {'Entities': {'additionalProperties': False, 'properties': {'entities': {'items': {'$ref': '#/definitions/Entity'}, 'type': 'array'}}, 'required': ['entities'], @@ -2051,28 +5112,6 @@ class DeployerFacade(Type): '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'}, @@ -2091,288 +5130,415 @@ class DeployerFacade(Type): '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'], + 'ListSSHKeys': {'additionalProperties': False, + 'properties': {'entities': {'$ref': '#/definitions/Entities'}, + 'mode': {'type': 'boolean'}}, + 'required': ['entities', 'mode'], 'type': 'object'}, 'Macaroon': {'additionalProperties': False, 'type': 'object'}, - 'NotifyWatchResult': {'additionalProperties': False, - 'properties': {'NotifyWatcherId': {'type': 'string'}, - 'error': {'$ref': '#/definitions/Error'}}, - 'required': ['NotifyWatcherId'], + 'ModifyUserSSHKeys': {'additionalProperties': False, + 'properties': {'ssh-keys': {'items': {'type': 'string'}, + 'type': 'array'}, + 'user': {'type': 'string'}}, + 'required': ['user', 'ssh-keys'], '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'}}, + '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(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): + @ReturnMapping(ErrorResults) + async def AddKeys(self, ssh_keys, user): ''' - - Returns -> typing.Sequence<+T_co>[~HostPort]<~HostPort> + ssh_keys : typing.Sequence[str] + user : str + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Deployer', request='APIHostPorts', version=1, params=_params) - + 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(BytesResult) - async def CACert(self): + @ReturnMapping(ErrorResults) + async def DeleteKeys(self, ssh_keys, user): ''' - - Returns -> typing.Sequence<+T_co>[int] + ssh_keys : typing.Sequence[str] + user : str + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Deployer', request='CACert', version=1, params=_params) - + 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(DeployerConnectionValues) - async def ConnectionInfo(self): + @ReturnMapping(ErrorResults) + async def ImportKeys(self, ssh_keys, user): ''' - - Returns -> typing.Sequence<+T_co>[str] + ssh_keys : typing.Sequence[str] + user : str + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Deployer', request='ConnectionInfo', version=1, params=_params) - + 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(LifeResults) - async def Life(self, entities): + @ReturnMapping(StringsResults) + async def ListKeys(self, entities, mode): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~LifeResult]<~LifeResult> + entities : Entities + mode : bool + Returns -> typing.Sequence[~StringsResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Deployer', request='Life', version=1, params=_params) + msg = dict(type='KeyManager', + request='ListKeys', + version=1, + params=_params) _params['entities'] = entities + _params['mode'] = mode reply = await self.rpc(msg) return reply - @ReturnMapping(StringResult) - async def ModelUUID(self): +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): ''' - - Returns -> typing.Union[_ForwardRef('Error'), str] + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~StringsResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Deployer', request='ModelUUID', version=1, params=_params) - + msg = dict(type='KeyUpdater', + request='AuthorisedKeys', + version=1, + params=_params) + _params['entities'] = entities reply = await self.rpc(msg) return reply - @ReturnMapping(ErrorResults) - async def Remove(self, entities): + @ReturnMapping(NotifyWatchResults) + async def WatchAuthorisedKeys(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~NotifyWatchResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Deployer', request='Remove', version=1, params=_params) + msg = dict(type='KeyUpdater', + request='WatchAuthorisedKeys', + 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 - - +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(ErrorResults) - async def SetStatus(self, entities): + @ReturnMapping(LifeResults) + async def Life(self, entities): ''' - entities : typing.Sequence<+T_co>[~EntityStatusArgs]<~EntityStatusArgs> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~LifeResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Deployer', request='SetStatus', version=1, params=_params) + msg = dict(type='LifeFlag', + request='Life', + 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): + @ReturnMapping(NotifyWatchResults) + async def Watch(self, entities): ''' - entities : typing.Sequence<+T_co>[~EntityStatusArgs]<~EntityStatusArgs> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~NotifyWatchResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Deployer', request='UpdateStatus', version=1, params=_params) + msg = dict(type='LifeFlag', + request='Watch', + version=1, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply - @ReturnMapping(NotifyWatchResult) - async def WatchAPIHostPorts(self): - ''' +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'} + - Returns -> typing.Union[str, _ForwardRef('Error')] + @ReturnMapping(LogForwardingGetLastSentResults) + async def GetLastSent(self, ids): + ''' + ids : typing.Sequence[~LogForwardingID] + Returns -> typing.Sequence[~LogForwardingGetLastSentResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Deployer', request='WatchAPIHostPorts', version=1, params=_params) - + msg = dict(type='LogForwarding', + request='GetLastSent', + version=1, + params=_params) + _params['ids'] = ids reply = await self.rpc(msg) return reply - @ReturnMapping(StringsWatchResults) - async def WatchUnits(self, entities): + @ReturnMapping(ErrorResults) + async def SetLastSent(self, params): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~StringsWatchResult]<~StringsWatchResult> + params : typing.Sequence[~LogForwardingSetLastSentParam] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Deployer', request='WatchUnits', version=1, params=_params) - _params['entities'] = entities + msg = dict(type='LogForwarding', + request='SetLastSent', + version=1, + params=_params) + _params['params'] = params reply = await self.rpc(msg) return reply -class HostKeyReporterFacade(Type): - name = 'HostKeyReporter' +class LoggerFacade(Type): + name = 'Logger' version = 1 - schema = {'definitions': {'Error': {'additionalProperties': False, + 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'}}, @@ -2382,51 +5548,127 @@ class HostKeyReporterFacade(Type): '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'}}, + '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(ErrorResults) - async def ReportKeys(self, entity_keys): + @ReturnMapping(StringResults) + async def LoggingConfig(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~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): ''' - entity_keys : typing.Sequence<+T_co>[~SSHHostKeys]<~SSHHostKeys> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~NotifyWatchResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='HostKeyReporter', request='ReportKeys', version=1, params=_params) - _params['entity-keys'] = entity_keys + msg = dict(type='Logger', + request='WatchLoggingConfig', + version=1, + params=_params) + _params['entities'] = entities reply = await self.rpc(msg) return reply -class KeyManagerFacade(Type): - name = 'KeyManager' +class MachineActionsFacade(Type): + name = 'MachineActions' version = 1 - schema = {'definitions': {'Entities': {'additionalProperties': False, + 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'], @@ -2453,119 +5695,146 @@ class KeyManagerFacade(Type): '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'}, + 'StringsWatchResult': {'additionalProperties': False, + 'properties': {'changes': {'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'}}, + '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'}, - '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'}}, + '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(ErrorResults) - async def AddKeys(self, ssh_keys, user): + @ReturnMapping(ActionResults) + async def Actions(self, entities): ''' - ssh_keys : typing.Sequence<+T_co>[str] - user : str - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ActionResult] ''' # 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 + msg = dict(type='MachineActions', + request='Actions', + version=1, + params=_params) + _params['entities'] = entities reply = await self.rpc(msg) return reply @ReturnMapping(ErrorResults) - async def DeleteKeys(self, ssh_keys, user): + async def BeginActions(self, entities): ''' - ssh_keys : typing.Sequence<+T_co>[str] - user : str - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~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 + msg = dict(type='MachineActions', + request='BeginActions', + version=1, + params=_params) + _params['entities'] = entities reply = await self.rpc(msg) return reply @ReturnMapping(ErrorResults) - async def ImportKeys(self, ssh_keys, user): + async def FinishActions(self, results): ''' - ssh_keys : typing.Sequence<+T_co>[str] - user : str - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + results : typing.Sequence[~ActionExecutionResult] + Returns -> typing.Sequence[~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 + msg = dict(type='MachineActions', + request='FinishActions', + version=1, + params=_params) + _params['results'] = results reply = await self.rpc(msg) return reply - @ReturnMapping(StringsResults) - async def ListKeys(self, entities, mode): + @ReturnMapping(ActionsByReceivers) + async def RunningActions(self, entities): ''' - entities : Entities - mode : bool - Returns -> typing.Sequence<+T_co>[~StringsResult]<~StringsResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ActionsByReceiver] ''' # map input types to rpc msg _params = dict() - msg = dict(type='KeyManager', request='ListKeys', version=1, params=_params) + msg = dict(type='MachineActions', + request='RunningActions', + version=1, + params=_params) _params['entities'] = entities - _params['mode'] = mode reply = await self.rpc(msg) return reply -class KeyUpdaterFacade(Type): - name = 'KeyUpdater' + @ReturnMapping(StringsWatchResults) + async def WatchActionNotifications(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~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'], @@ -2591,34 +5860,89 @@ class KeyUpdaterFacade(Type): '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'}}, + '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(StringsResults) - async def AuthorisedKeys(self, entities): + @ReturnMapping(EntitiesResults) + async def AllMachineRemovals(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~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[~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>[~StringsResult]<~StringsResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ProviderInterfaceInfoResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='KeyUpdater', request='AuthorisedKeys', version=1, params=_params) + msg = dict(type='MachineUndertaker', + request='GetMachineProviderInterfaceInfo', + version=1, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -2626,24 +5950,40 @@ class KeyUpdaterFacade(Type): @ReturnMapping(NotifyWatchResults) - async def WatchAuthorisedKeys(self, entities): + async def WatchMachineRemovals(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~NotifyWatchResult]<~NotifyWatchResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~NotifyWatchResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='KeyUpdater', request='WatchAuthorisedKeys', version=1, params=_params) + msg = dict(type='MachineUndertaker', + request='WatchMachineRemovals', + version=1, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply -class LifeFlagFacade(Type): - name = 'LifeFlag' +class MachinerFacade(Type): + name = 'Machiner' version = 1 - schema = {'definitions': {'Entities': {'additionalProperties': False, + 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'}, + 'Entities': {'additionalProperties': False, 'properties': {'entities': {'items': {'$ref': '#/definitions/Entity'}, 'type': 'array'}}, 'required': ['entities'], @@ -2652,6 +5992,18 @@ class LifeFlagFacade(Type): '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'}, @@ -2662,6 +6014,30 @@ class LifeFlagFacade(Type): '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'}}, @@ -2673,6 +6049,61 @@ class LifeFlagFacade(Type): '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'}, + 'is-default-gateway': {'type': 'boolean'}, + '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'}}, @@ -2682,361 +6113,228 @@ class LifeFlagFacade(Type): 'properties': {'results': {'items': {'$ref': '#/definitions/NotifyWatchResult'}, 'type': 'array'}}, 'required': ['results'], - 'type': 'object'}}, - 'properties': {'Life': {'properties': {'Params': {'$ref': '#/definitions/Entities'}, + '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'}, + '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'}}, + 'type': 'object'}, + 'WatchAPIHostPorts': {'properties': {'Result': {'$ref': '#/definitions/NotifyWatchResult'}}, + '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(StringsResult) + async def APIAddresses(self): + ''' - @ReturnMapping(LogForwardingGetLastSentResults) - async def GetLastSent(self, ids): + Returns -> typing.Union[_ForwardRef('Error'), typing.Sequence[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): ''' - ids : typing.Sequence<+T_co>[~LogForwardingID]<~LogForwardingID> - Returns -> typing.Sequence<+T_co>[~LogForwardingGetLastSentResult]<~LogForwardingGetLastSentResult> + + Returns -> typing.Sequence[~HostPort] ''' # map input types to rpc msg _params = dict() - msg = dict(type='LogForwarding', request='GetLastSent', version=1, params=_params) - _params['ids'] = ids + msg = dict(type='Machiner', + request='APIHostPorts', + version=1, + params=_params) + reply = await self.rpc(msg) return reply @ReturnMapping(ErrorResults) - async def SetLastSent(self, params): + async def EnsureDead(self, entities): ''' - params : typing.Sequence<+T_co>[~LogForwardingSetLastSentParam]<~LogForwardingSetLastSentParam> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='LogForwarding', request='SetLastSent', version=1, params=_params) - _params['params'] = params + msg = dict(type='Machiner', + request='EnsureDead', + version=1, + params=_params) + _params['entities'] = entities 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): + @ReturnMapping(JobsResults) + async def Jobs(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~StringResult]<~StringResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~JobsResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Logger', request='LoggingConfig', version=1, params=_params) + msg = dict(type='Machiner', + request='Jobs', + version=1, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply - @ReturnMapping(NotifyWatchResults) - async def WatchLoggingConfig(self, entities): + @ReturnMapping(LifeResults) + async def Life(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~NotifyWatchResult]<~NotifyWatchResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~LifeResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Logger', request='WatchLoggingConfig', version=1, params=_params) + msg = dict(type='Machiner', + request='Life', + 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(StringResult) + async def ModelUUID(self): + ''' - @ReturnMapping(ActionResults) - async def Actions(self, entities): + 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): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~ActionResult]<~ActionResult> + machine_addresses : typing.Sequence[~MachineAddresses] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='MachineActions', request='Actions', version=1, params=_params) - _params['entities'] = entities + 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[~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 BeginActions(self, entities): + async def SetProviderNetworkConfig(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='MachineActions', request='BeginActions', version=1, params=_params) + msg = dict(type='Machiner', + request='SetProviderNetworkConfig', + version=1, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -3044,69 +6342,85 @@ class MachineActionsFacade(Type): @ReturnMapping(ErrorResults) - async def FinishActions(self, results): + async def SetStatus(self, entities): ''' - results : typing.Sequence<+T_co>[~ActionExecutionResult]<~ActionExecutionResult> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + entities : typing.Sequence[~EntityStatusArgs] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='MachineActions', request='FinishActions', version=1, params=_params) - _params['results'] = results + msg = dict(type='Machiner', + request='SetStatus', + version=1, + params=_params) + _params['entities'] = entities reply = await self.rpc(msg) return reply - @ReturnMapping(ActionsByReceivers) - async def RunningActions(self, entities): + @ReturnMapping(ErrorResults) + async def UpdateStatus(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~ActionsByReceiver]<~ActionsByReceiver> + entities : typing.Sequence[~EntityStatusArgs] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='MachineActions', request='RunningActions', version=1, params=_params) + msg = dict(type='Machiner', + request='UpdateStatus', + version=1, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply - @ReturnMapping(StringsWatchResults) - async def WatchActionNotifications(self, entities): + @ReturnMapping(NotifyWatchResults) + async def Watch(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~StringsWatchResult]<~StringsWatchResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~NotifyWatchResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='MachineActions', request='WatchActionNotifications', version=1, params=_params) + msg = dict(type='Machiner', + request='Watch', + version=1, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply -class MachineUndertakerFacade(Type): - name = 'MachineUndertaker' + @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'}, - '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'], @@ -3122,6 +6436,17 @@ class MachineUndertakerFacade(Type): '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'}}, @@ -3131,81 +6456,28 @@ class MachineUndertakerFacade(Type): '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'}}, + '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(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): + @ReturnMapping(MeterStatusResults) + async def GetMeterStatus(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~ProviderInterfaceInfoResult]<~ProviderInterfaceInfoResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~MeterStatusResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='MachineUndertaker', request='GetMachineProviderInterfaceInfo', version=1, params=_params) + msg = dict(type='MeterStatus', + request='GetMeterStatus', + version=1, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -3213,42 +6485,27 @@ class MachineUndertakerFacade(Type): @ReturnMapping(NotifyWatchResults) - async def WatchMachineRemovals(self, entities): + async def WatchMeterStatus(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~NotifyWatchResult]<~NotifyWatchResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~NotifyWatchResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='MachineUndertaker', request='WatchMachineRemovals', version=1, params=_params) + msg = dict(type='MeterStatus', + request='WatchMeterStatus', + version=1, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply -class MachinerFacade(Type): - name = 'Machiner' +class MetricsManagerFacade(Type): + name = 'MetricsManager' 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, + schema = {'definitions': {'Entities': {'additionalProperties': False, 'properties': {'entities': {'items': {'$ref': '#/definitions/Entity'}, 'type': 'array'}}, 'required': ['entities'], @@ -3257,18 +6514,6 @@ class MachinerFacade(Type): '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'}, @@ -3287,87 +6532,94 @@ class MachinerFacade(Type): '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'], + 'Macaroon': {'additionalProperties': False, 'type': 'object'}}, + 'properties': {'AddJujuMachineMetrics': {'type': 'object'}, + 'CleanupOldMetrics': {'properties': {'Params': {'$ref': '#/definitions/Entities'}, + 'Result': {'$ref': '#/definitions/ErrorResults'}}, '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'}, + '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[~Entity] + Returns -> typing.Sequence[~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[~Entity] + Returns -> typing.Sequence[~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'}}, @@ -3378,296 +6630,413 @@ class MachinerFacade(Type): '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'}}, + 'PhaseResult': {'additionalProperties': False, + 'properties': {'error': {'$ref': '#/definitions/Error'}, + 'phase': {'type': 'string'}}, 'type': 'object'}, - 'CACert': {'properties': {'Result': {'$ref': '#/definitions/BytesResult'}}, + '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[~Entity] + Returns -> typing.Sequence[~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[~Entity] + Returns -> typing.Sequence[~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'}, - 'EnsureDead': {'properties': {'Params': {'$ref': '#/definitions/Entities'}, - 'Result': {'$ref': '#/definitions/ErrorResults'}}, + 'ErrorInfo': {'additionalProperties': False, + 'properties': {'macaroon': {'$ref': '#/definitions/Macaroon'}, + 'macaroon-path': {'type': 'string'}}, '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'}}, + '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'}, - 'SetObservedNetworkConfig': {'properties': {'Params': {'$ref': '#/definitions/SetMachineNetworkConfig'}}, - 'type': 'object'}, - 'SetProviderNetworkConfig': {'properties': {'Params': {'$ref': '#/definitions/Entities'}, - 'Result': {'$ref': '#/definitions/ErrorResults'}}, + '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'}, - 'SetStatus': {'properties': {'Params': {'$ref': '#/definitions/SetStatus'}, - 'Result': {'$ref': '#/definitions/ErrorResults'}}, + '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'}, - 'UpdateStatus': {'properties': {'Params': {'$ref': '#/definitions/SetStatus'}, - 'Result': {'$ref': '#/definitions/ErrorResults'}}, - 'type': 'object'}, - 'Watch': {'properties': {'Params': {'$ref': '#/definitions/Entities'}, - 'Result': {'$ref': '#/definitions/NotifyWatchResults'}}, + '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'}, - 'WatchAPIHostPorts': {'properties': {'Result': {'$ref': '#/definitions/NotifyWatchResult'}}, - 'type': 'object'}}, + 'WatchMinionReports': {'properties': {'Result': {'$ref': '#/definitions/NotifyWatchResult'}}, + 'type': 'object'}}, 'type': 'object'} - @ReturnMapping(StringsResult) - async def APIAddresses(self): + @ReturnMapping(SerializedModel) + async def Export(self): ''' - Returns -> typing.Union[_ForwardRef('Error'), typing.Sequence<+T_co>[str]] + Returns -> typing.Union[typing.Sequence[int], typing.Sequence[str], typing.Sequence[~SerializedModelTools]] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Machiner', request='APIAddresses', version=1, params=_params) + msg = dict(type='MigrationMaster', + request='Export', + version=1, + params=_params) reply = await self.rpc(msg) return reply - @ReturnMapping(APIHostPortsResult) - async def APIHostPorts(self): + @ReturnMapping(MasterMigrationStatus) + async def MigrationStatus(self): ''' - Returns -> typing.Sequence<+T_co>[~HostPort]<~HostPort> + Returns -> typing.Union[str, _ForwardRef('MigrationSpec')] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Machiner', request='APIHostPorts', version=1, params=_params) + msg = dict(type='MigrationMaster', + request='MigrationStatus', + version=1, + params=_params) reply = await self.rpc(msg) return reply - @ReturnMapping(BytesResult) - async def CACert(self): + @ReturnMapping(MinionReports) + async def MinionReports(self): ''' - Returns -> typing.Sequence<+T_co>[int] + Returns -> typing.Union[typing.Sequence[str], str, int] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Machiner', request='CACert', version=1, params=_params) + msg = dict(type='MigrationMaster', + request='MinionReports', + 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> + @ReturnMapping(MigrationModelInfo) + async def ModelInfo(self): ''' - # 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> + Returns -> typing.Union[_ForwardRef('Number'), str] ''' # 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 - + msg = dict(type='MigrationMaster', + request='ModelInfo', + version=1, + params=_params) - - @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): + @ReturnMapping(None) + async def Prechecks(self): ''' - Returns -> typing.Union[_ForwardRef('Error'), str] + Returns -> None ''' # map input types to rpc msg _params = dict() - msg = dict(type='Machiner', request='ModelUUID', version=1, params=_params) + msg = dict(type='MigrationMaster', + request='Prechecks', + version=1, + params=_params) reply = await self.rpc(msg) return reply - @ReturnMapping(ErrorResults) - async def SetMachineAddresses(self, machine_addresses): + @ReturnMapping(None) + async def Reap(self): ''' - machine_addresses : typing.Sequence<+T_co>[~MachineAddresses]<~MachineAddresses> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + + Returns -> None ''' # map input types to rpc msg _params = dict() - msg = dict(type='Machiner', request='SetMachineAddresses', version=1, params=_params) - _params['machine-addresses'] = machine_addresses + msg = dict(type='MigrationMaster', + request='Reap', + version=1, + params=_params) + reply = await self.rpc(msg) return reply @ReturnMapping(None) - async def SetObservedNetworkConfig(self, config, tag): + async def SetPhase(self, phase): ''' - config : typing.Sequence<+T_co>[~NetworkConfig]<~NetworkConfig> - tag : str + phase : 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 + msg = dict(type='MigrationMaster', + request='SetPhase', + version=1, + params=_params) + _params['phase'] = phase reply = await self.rpc(msg) return reply - @ReturnMapping(ErrorResults) - async def SetProviderNetworkConfig(self, entities): + @ReturnMapping(None) + async def SetStatusMessage(self, message): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + message : str + Returns -> None ''' # map input types to rpc msg _params = dict() - msg = dict(type='Machiner', request='SetProviderNetworkConfig', version=1, params=_params) - _params['entities'] = entities + msg = dict(type='MigrationMaster', + request='SetStatusMessage', + version=1, + params=_params) + _params['message'] = message 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> + @ReturnMapping(NotifyWatchResult) + async def Watch(self): ''' - # 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> + Returns -> typing.Union[str, _ForwardRef('Error')] ''' # 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 + msg = dict(type='MigrationMaster', + request='Watch', + version=1, + params=_params) - - - @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): + async def WatchMinionReports(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) + msg = dict(type='MigrationMaster', + request='WatchMinionReports', + version=1, + params=_params) reply = await self.rpc(msg) return reply -class MeterStatusFacade(Type): - name = 'MeterStatus' +class MigrationMinionFacade(Type): + name = 'MigrationMinion' 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, + schema = {'definitions': {'Error': {'additionalProperties': False, 'properties': {'code': {'type': 'string'}, 'info': {'$ref': '#/definitions/ErrorInfo'}, 'message': {'type': 'string'}}, @@ -3678,237 +7047,144 @@ class MeterStatusFacade(Type): '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'}, + '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'}, - '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 - - + 'type': 'object'}}, + 'properties': {'Report': {'properties': {'Params': {'$ref': '#/definitions/MinionReport'}}, + 'type': 'object'}, + 'Watch': {'properties': {'Result': {'$ref': '#/definitions/NotifyWatchResult'}}, + 'type': 'object'}}, + 'type': 'object'} + - @ReturnMapping(ErrorResults) - async def CleanupOldMetrics(self, entities): + @ReturnMapping(None) + async def Report(self, migration_id, phase, success): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + migration_id : str + phase : str + success : bool + Returns -> None ''' # map input types to rpc msg _params = dict() - msg = dict(type='MetricsManager', request='CleanupOldMetrics', version=1, params=_params) - _params['entities'] = entities + 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(ErrorResults) - async def SendMetrics(self, entities): + @ReturnMapping(NotifyWatchResult) + async def Watch(self): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + + Returns -> typing.Union[str, _ForwardRef('Error')] ''' # map input types to rpc msg _params = dict() - msg = dict(type='MetricsManager', request='SendMetrics', version=1, params=_params) - _params['entities'] = entities + msg = dict(type='MigrationMinion', + request='Watch', + version=1, + params=_params) + reply = await self.rpc(msg) return reply -class MigrationFlagFacade(Type): - name = 'MigrationFlag' +class MigrationStatusWatcherFacade(Type): + name = 'MigrationStatusWatcher' 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'}}, + 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(PhaseResults) - async def Phase(self, entities): + @ReturnMapping(MigrationStatus) + async def Next(self): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~PhaseResult]<~PhaseResult> + + Returns -> typing.Union[int, str, typing.Sequence[str]] ''' # map input types to rpc msg _params = dict() - msg = dict(type='MigrationFlag', request='Phase', version=1, params=_params) - _params['entities'] = entities + msg = dict(type='MigrationStatusWatcher', + request='Next', + version=1, + params=_params) + reply = await self.rpc(msg) return reply - @ReturnMapping(NotifyWatchResults) - async def Watch(self, entities): + @ReturnMapping(None) + async def Stop(self): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~NotifyWatchResult]<~NotifyWatchResult> + + Returns -> None ''' # map input types to rpc msg _params = dict() - msg = dict(type='MigrationFlag', request='Watch', version=1, params=_params) - _params['entities'] = entities + msg = dict(type='MigrationStatusWatcher', + request='Stop', + version=1, + params=_params) + reply = await self.rpc(msg) return reply -class MigrationMasterFacade(Type): - name = 'MigrationMaster' +class MigrationTargetFacade(Type): + name = 'MigrationTarget' version = 1 - schema = {'definitions': {'Error': {'additionalProperties': False, + 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'}, + 'Error': {'additionalProperties': False, 'properties': {'code': {'type': 'string'}, 'info': {'$ref': '#/definitions/ErrorInfo'}, 'message': {'type': 'string'}}, @@ -3918,18 +7194,15 @@ class MigrationMasterFacade(Type): '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'}, - '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'}, @@ -3942,45 +7215,10 @@ class MigrationMasterFacade(Type): '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'}, + 'ModelArgs': {'additionalProperties': False, + 'properties': {'model-tag': {'type': 'string'}}, + 'required': ['model-tag'], + 'type': 'object'}, 'Number': {'additionalProperties': False, 'properties': {'Build': {'type': 'integer'}, 'Major': {'type': 'integer'}, @@ -4044,90 +7282,316 @@ class MigrationMasterFacade(Type): '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'}}, + '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'}, + 'CheckMachines': {'properties': {'Params': {'$ref': '#/definitions/ModelArgs'}, + 'Result': {'$ref': '#/definitions/ErrorResults'}}, + '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[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(ErrorResults) + async def CheckMachines(self, model_tag): + ''' + model_tag : str + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='MigrationTarget', + request='CheckMachines', + version=1, + params=_params) + _params['model-tag'] = model_tag + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(None) + async def Import(self, bytes_, charms, tools): + ''' + bytes_ : typing.Sequence[int] + charms : typing.Sequence[str] + tools : typing.Sequence[~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'}, - 'MigrationStatus': {'properties': {'Result': {'$ref': '#/definitions/MasterMigrationStatus'}}, - 'type': 'object'}, - 'MinionReports': {'properties': {'Result': {'$ref': '#/definitions/MinionReports'}}, + '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'}, - 'ModelInfo': {'properties': {'Result': {'$ref': '#/definitions/MigrationModelInfo'}}, + 'ModelSet': {'additionalProperties': False, + 'properties': {'config': {'patternProperties': {'.*': {'additionalProperties': True, + 'type': 'object'}}, + 'type': 'object'}}, + 'required': ['config'], 'type': 'object'}, - 'Prechecks': {'type': 'object'}, - 'Reap': {'type': 'object'}, - 'SetPhase': {'properties': {'Params': {'$ref': '#/definitions/SetMigrationPhaseArgs'}}, + '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'}, - 'SetStatusMessage': {'properties': {'Params': {'$ref': '#/definitions/SetMigrationStatusMessageArgs'}}, - 'type': 'object'}, - 'Watch': {'properties': {'Result': {'$ref': '#/definitions/NotifyWatchResult'}}, - 'type': 'object'}, - 'WatchMinionReports': {'properties': {'Result': {'$ref': '#/definitions/NotifyWatchResult'}}, - '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(SerializedModel) - async def Export(self): + @ReturnMapping(ModelConfigResults) + async def ModelGet(self): ''' - Returns -> typing.Sequence<+T_co>[~SerializedModelTools]<~SerializedModelTools> + Returns -> typing.Mapping[str, ~ConfigValue] ''' # map input types to rpc msg _params = dict() - msg = dict(type='MigrationMaster', request='Export', version=1, params=_params) + msg = dict(type='ModelConfig', + request='ModelGet', + version=1, + params=_params) reply = await self.rpc(msg) return reply - @ReturnMapping(MasterMigrationStatus) - async def MigrationStatus(self): + @ReturnMapping(None) + async def ModelSet(self, config): ''' - - Returns -> typing.Union[str, _ForwardRef('MigrationSpec')] + config : typing.Mapping[str, typing.Any] + Returns -> None ''' # map input types to rpc msg _params = dict() - msg = dict(type='MigrationMaster', request='MigrationStatus', version=1, params=_params) - + msg = dict(type='ModelConfig', + request='ModelSet', + version=1, + params=_params) + _params['config'] = config reply = await self.rpc(msg) return reply - @ReturnMapping(MinionReports) - async def MinionReports(self): + @ReturnMapping(None) + async def ModelUnset(self, keys): ''' - - Returns -> typing.Union[typing.Sequence<+T_co>[str], int] + keys : typing.Sequence[str] + Returns -> None ''' # map input types to rpc msg _params = dict() - msg = dict(type='MigrationMaster', request='MinionReports', version=1, params=_params) - + msg = dict(type='ModelConfig', + request='ModelUnset', + version=1, + params=_params) + _params['keys'] = keys reply = await self.rpc(msg) return reply - @ReturnMapping(MigrationModelInfo) - async def ModelInfo(self): + @ReturnMapping(StringResult) + async def SLALevel(self): ''' - Returns -> typing.Union[_ForwardRef('Number'), str] + Returns -> typing.Union[_ForwardRef('Error'), str] ''' # map input types to rpc msg _params = dict() - msg = dict(type='MigrationMaster', request='ModelInfo', version=1, params=_params) + msg = dict(type='ModelConfig', + request='SLALevel', + version=1, + params=_params) reply = await self.rpc(msg) return reply @@ -4135,199 +7599,309 @@ class MigrationMasterFacade(Type): @ReturnMapping(None) - async def Prechecks(self): + async def SetSLALevel(self, creds, level): ''' - + creds : typing.Sequence[int] + level : str Returns -> None ''' # map input types to rpc msg _params = dict() - msg = dict(type='MigrationMaster', request='Prechecks', version=1, params=_params) - + msg = dict(type='ModelConfig', + request='SetSLALevel', + version=1, + params=_params) + _params['creds'] = creds + _params['level'] = level reply = await self.rpc(msg) return reply - @ReturnMapping(None) - async def Reap(self): +class ModelUpgraderFacade(Type): + name = 'ModelUpgrader' + 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'}, + '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'}, + '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'}, + 'SetModelEnvironVersion': {'additionalProperties': False, + 'properties': {'model-tag': {'type': 'string'}, + 'version': {'type': 'integer'}}, + 'required': ['model-tag', + 'version'], + 'type': 'object'}, + 'SetModelEnvironVersions': {'additionalProperties': False, + 'properties': {'models': {'items': {'$ref': '#/definitions/SetModelEnvironVersion'}, + 'type': 'array'}}, + 'type': 'object'}, + 'SetStatus': {'additionalProperties': False, + 'properties': {'entities': {'items': {'$ref': '#/definitions/EntityStatusArgs'}, + 'type': 'array'}}, + 'required': ['entities'], + 'type': 'object'}}, + 'properties': {'ModelEnvironVersion': {'properties': {'Params': {'$ref': '#/definitions/Entities'}, + 'Result': {'$ref': '#/definitions/IntResults'}}, + 'type': 'object'}, + 'ModelTargetEnvironVersion': {'properties': {'Params': {'$ref': '#/definitions/Entities'}, + 'Result': {'$ref': '#/definitions/IntResults'}}, + 'type': 'object'}, + 'SetModelEnvironVersion': {'properties': {'Params': {'$ref': '#/definitions/SetModelEnvironVersions'}, + 'Result': {'$ref': '#/definitions/ErrorResults'}}, + 'type': 'object'}, + 'SetModelStatus': {'properties': {'Params': {'$ref': '#/definitions/SetStatus'}, + 'Result': {'$ref': '#/definitions/ErrorResults'}}, + 'type': 'object'}, + 'WatchModelEnvironVersion': {'properties': {'Params': {'$ref': '#/definitions/Entities'}, + 'Result': {'$ref': '#/definitions/NotifyWatchResults'}}, + 'type': 'object'}}, + 'type': 'object'} + + + @ReturnMapping(IntResults) + async def ModelEnvironVersion(self, entities): ''' - - Returns -> None + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~IntResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='MigrationMaster', request='Reap', version=1, params=_params) - + msg = dict(type='ModelUpgrader', + request='ModelEnvironVersion', + version=1, + params=_params) + _params['entities'] = entities reply = await self.rpc(msg) return reply - @ReturnMapping(None) - async def SetPhase(self, phase): + @ReturnMapping(IntResults) + async def ModelTargetEnvironVersion(self, entities): ''' - phase : str - Returns -> None + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~IntResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='MigrationMaster', request='SetPhase', version=1, params=_params) - _params['phase'] = phase + msg = dict(type='ModelUpgrader', + request='ModelTargetEnvironVersion', + version=1, + params=_params) + _params['entities'] = entities reply = await self.rpc(msg) return reply - @ReturnMapping(None) - async def SetStatusMessage(self, message): + @ReturnMapping(ErrorResults) + async def SetModelEnvironVersion(self, models): ''' - message : str - Returns -> None + models : typing.Sequence[~SetModelEnvironVersion] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='MigrationMaster', request='SetStatusMessage', version=1, params=_params) - _params['message'] = message + msg = dict(type='ModelUpgrader', + request='SetModelEnvironVersion', + version=1, + params=_params) + _params['models'] = models reply = await self.rpc(msg) return reply - @ReturnMapping(NotifyWatchResult) - async def Watch(self): + @ReturnMapping(ErrorResults) + async def SetModelStatus(self, entities): ''' - - Returns -> typing.Union[str, _ForwardRef('Error')] + entities : typing.Sequence[~EntityStatusArgs] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='MigrationMaster', request='Watch', version=1, params=_params) - + msg = dict(type='ModelUpgrader', + request='SetModelStatus', + version=1, + params=_params) + _params['entities'] = entities reply = await self.rpc(msg) return reply - @ReturnMapping(NotifyWatchResult) - async def WatchMinionReports(self): + @ReturnMapping(NotifyWatchResults) + async def WatchModelEnvironVersion(self, entities): ''' - - Returns -> typing.Union[str, _ForwardRef('Error')] + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~NotifyWatchResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='MigrationMaster', request='WatchMinionReports', version=1, params=_params) - + msg = dict(type='ModelUpgrader', + request='WatchModelEnvironVersion', + version=1, + params=_params) + _params['entities'] = entities reply = await self.rpc(msg) return reply -class MigrationMinionFacade(Type): - name = 'MigrationMinion' +class NotifyWatcherFacade(Type): + name = 'NotifyWatcher' 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'}}, + schema = {'properties': {'Next': {'type': 'object'}, 'Stop': {'type': 'object'}}, 'type': 'object'} @ReturnMapping(None) - async def Report(self, migration_id, phase, success): + async def Next(self): ''' - 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 + msg = dict(type='NotifyWatcher', + request='Next', + version=1, + params=_params) + reply = await self.rpc(msg) return reply - @ReturnMapping(NotifyWatchResult) - async def Watch(self): + @ReturnMapping(None) + async def Stop(self): ''' - Returns -> typing.Union[str, _ForwardRef('Error')] + Returns -> None ''' # map input types to rpc msg _params = dict() - msg = dict(type='MigrationMinion', request='Watch', version=1, params=_params) + msg = dict(type='NotifyWatcher', + request='Stop', + version=1, + params=_params) reply = await self.rpc(msg) return reply -class MigrationStatusWatcherFacade(Type): - name = 'MigrationStatusWatcher' +class OfferStatusWatcherFacade(Type): + name = 'OfferStatusWatcher' 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'}}, + schema = {'definitions': {'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'}, + 'Macaroon': {'additionalProperties': False, 'type': 'object'}, + 'OfferStatusChange': {'additionalProperties': False, + 'properties': {'offer-name': {'type': 'string'}, + 'status': {'$ref': '#/definitions/EntityStatus'}}, + 'required': ['offer-name', 'status'], + 'type': 'object'}, + 'OfferStatusWatchResult': {'additionalProperties': False, + 'properties': {'changes': {'items': {'$ref': '#/definitions/OfferStatusChange'}, + 'type': 'array'}, + 'error': {'$ref': '#/definitions/Error'}, + 'watcher-id': {'type': 'string'}}, + 'required': ['watcher-id', + 'changes'], + 'type': 'object'}}, + 'properties': {'Next': {'properties': {'Result': {'$ref': '#/definitions/OfferStatusWatchResult'}}, 'type': 'object'}, 'Stop': {'type': 'object'}}, 'type': 'object'} - @ReturnMapping(MigrationStatus) + @ReturnMapping(OfferStatusWatchResult) async def Next(self): ''' - Returns -> typing.Union[int, typing.Sequence<+T_co>[str]] + Returns -> typing.Union[typing.Sequence[~OfferStatusChange], _ForwardRef('Error'), str] ''' # map input types to rpc msg _params = dict() - msg = dict(type='MigrationStatusWatcher', request='Next', version=1, params=_params) + msg = dict(type='OfferStatusWatcher', + request='Next', + version=1, + params=_params) reply = await self.rpc(msg) return reply @@ -4337,322 +7911,281 @@ class MigrationStatusWatcherFacade(Type): @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 + msg = dict(type='OfferStatusWatcher', + request='Stop', + version=1, + params=_params) + reply = await self.rpc(msg) return reply - @ReturnMapping(None) - async def Activate(self, model_tag): +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): ''' - model_tag : str - Returns -> None + patterns : typing.Sequence[str] + Returns -> typing.Sequence[~Payload] ''' # map input types to rpc msg _params = dict() - msg = dict(type='MigrationTarget', request='Activate', version=1, params=_params) - _params['model-tag'] = model_tag + msg = dict(type='Payloads', + request='List', + version=1, + params=_params) + _params['patterns'] = patterns reply = await self.rpc(msg) return reply - @ReturnMapping(None) - async def AdoptResources(self, model_tag, source_controller_version): +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): ''' - model_tag : str - source_controller_version : Number - Returns -> None + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~PayloadResult] ''' # 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 + msg = dict(type='PayloadsHookContext', + request='List', + version=1, + params=_params) + _params['entities'] = entities reply = await self.rpc(msg) return reply - @ReturnMapping(BytesResult) - async def CACert(self): + @ReturnMapping(PayloadResults) + async def LookUp(self, args): ''' - - Returns -> typing.Sequence<+T_co>[int] + args : typing.Sequence[~LookUpPayloadArg] + Returns -> typing.Sequence[~PayloadResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='MigrationTarget', request='CACert', version=1, params=_params) - + msg = dict(type='PayloadsHookContext', + request='LookUp', + version=1, + params=_params) + _params['args'] = args reply = await self.rpc(msg) return reply - @ReturnMapping(None) - async def Import(self, bytes_, charms, tools): + @ReturnMapping(PayloadResults) + async def SetStatus(self, args): ''' - bytes_ : typing.Sequence<+T_co>[int] - charms : typing.Sequence<+T_co>[str] - tools : typing.Sequence<+T_co>[~SerializedModelTools]<~SerializedModelTools> - Returns -> None + args : typing.Sequence[~SetPayloadStatusArg] + Returns -> typing.Sequence[~PayloadResult] ''' # 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 + msg = dict(type='PayloadsHookContext', + request='SetStatus', + version=1, + params=_params) + _params['args'] = args reply = await self.rpc(msg) return reply - @ReturnMapping(str) - async def LatestLogTime(self, model_tag): + @ReturnMapping(PayloadResults) + async def Track(self, payloads): ''' - model_tag : str - Returns -> str + payloads : typing.Sequence[~Payload] + Returns -> typing.Sequence[~PayloadResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='MigrationTarget', request='LatestLogTime', version=1, params=_params) - _params['model-tag'] = model_tag + msg = dict(type='PayloadsHookContext', + request='Track', + version=1, + params=_params) + _params['payloads'] = payloads reply = await self.rpc(msg) return reply - @ReturnMapping(None) - async def Prechecks(self, agent_version, name, owner_tag, uuid): + @ReturnMapping(PayloadResults) + async def Untrack(self, entities): ''' - agent_version : Number - name : str - owner_tag : str - uuid : str - Returns -> None + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~PayloadResult] ''' # 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 + msg = dict(type='PayloadsHookContext', + request='Untrack', + version=1, + params=_params) + _params['entities'] = entities reply = await self.rpc(msg) return reply -class ModelConfigFacade(Type): - name = 'ModelConfig' +class PingerFacade(Type): + name = 'Pinger' 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'}}, + schema = {'properties': {'Ping': {'type': 'object'}, 'Stop': {'type': 'object'}}, 'type': 'object'} - @ReturnMapping(ModelConfigResults) - async def ModelGet(self): + @ReturnMapping(None) + async def Ping(self): ''' - Returns -> typing.Mapping<~KT, +VT_co>[str, ~ConfigValue]<~ConfigValue> + Returns -> None ''' # map input types to rpc msg _params = dict() - msg = dict(type='ModelConfig', request='ModelGet', version=1, params=_params) + msg = dict(type='Pinger', + request='Ping', + version=1, + params=_params) reply = await self.rpc(msg) return reply @@ -4660,44 +8193,173 @@ class ModelConfigFacade(Type): @ReturnMapping(None) - async def ModelSet(self, config): + async def Stop(self): ''' - 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 + msg = dict(type='Pinger', + request='Stop', + version=1, + params=_params) + reply = await self.rpc(msg) return reply - @ReturnMapping(None) - async def ModelUnset(self, keys): +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): ''' - keys : typing.Sequence<+T_co>[str] - Returns -> None + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ProxyConfigResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='ModelConfig', request='ModelUnset', version=1, params=_params) - _params['keys'] = keys + msg = dict(type='ProxyUpdater', + request='ProxyConfig', + version=1, + params=_params) + _params['entities'] = entities reply = await self.rpc(msg) return reply - @ReturnMapping(StringResult) - async def SLALevel(self): + @ReturnMapping(NotifyWatchResults) + async def WatchForProxyConfigAndAPIHostPortChanges(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~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 - Returns -> typing.Union[_ForwardRef('Error'), str] + + +class RelationStatusWatcherFacade(Type): + name = 'RelationStatusWatcher' + 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'}, + 'RelationLifeSuspendedStatusChange': {'additionalProperties': False, + 'properties': {'key': {'type': 'string'}, + 'life': {'type': 'string'}, + 'suspended': {'type': 'boolean'}, + 'suspended-reason': {'type': 'string'}}, + 'required': ['key', + 'life', + 'suspended', + 'suspended-reason'], + 'type': 'object'}, + 'RelationLifeSuspendedStatusWatchResult': {'additionalProperties': False, + 'properties': {'changes': {'items': {'$ref': '#/definitions/RelationLifeSuspendedStatusChange'}, + 'type': 'array'}, + 'error': {'$ref': '#/definitions/Error'}, + 'watcher-id': {'type': 'string'}}, + 'required': ['watcher-id', + 'changes'], + 'type': 'object'}}, + 'properties': {'Next': {'properties': {'Result': {'$ref': '#/definitions/RelationLifeSuspendedStatusWatchResult'}}, + 'type': 'object'}, + 'Stop': {'type': 'object'}}, + 'type': 'object'} + + + @ReturnMapping(RelationLifeSuspendedStatusWatchResult) + async def Next(self): + ''' + + Returns -> typing.Union[typing.Sequence[~RelationLifeSuspendedStatusChange], _ForwardRef('Error'), str] ''' # map input types to rpc msg _params = dict() - msg = dict(type='ModelConfig', request='SLALevel', version=1, params=_params) + msg = dict(type='RelationStatusWatcher', + request='Next', + version=1, + params=_params) reply = await self.rpc(msg) return reply @@ -4705,38 +8367,73 @@ class ModelConfigFacade(Type): @ReturnMapping(None) - async def SetSLALevel(self, creds, level): + async def Stop(self): ''' - 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 + msg = dict(type='RelationStatusWatcher', + request='Stop', + version=1, + params=_params) + reply = await self.rpc(msg) return reply -class NotifyWatcherFacade(Type): - name = 'NotifyWatcher' +class RelationUnitsWatcherFacade(Type): + name = 'RelationUnitsWatcher' version = 1 - schema = {'properties': {'Next': {'type': 'object'}, 'Stop': {'type': 'object'}}, + 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(None) + @ReturnMapping(RelationUnitsWatchResult) async def Next(self): ''' - Returns -> None + Returns -> typing.Union[_ForwardRef('RelationUnitsChange'), _ForwardRef('Error'), str] ''' # map input types to rpc msg _params = dict() - msg = dict(type='NotifyWatcher', request='Next', version=1, params=_params) + msg = dict(type='RelationUnitsWatcher', + request='Next', + version=1, + params=_params) reply = await self.rpc(msg) return reply @@ -4751,68 +8448,138 @@ class NotifyWatcherFacade(Type): ''' # map input types to rpc msg _params = dict() - msg = dict(type='NotifyWatcher', request='Stop', version=1, params=_params) + msg = dict(type='RelationUnitsWatcher', + request='Stop', + version=1, + params=_params) reply = await self.rpc(msg) return reply -class PayloadsFacade(Type): - name = 'Payloads' +class RemoteApplicationWatcherFacade(Type): + name = 'RemoteApplicationWatcher' 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'}}, + 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(PayloadListResults) - async def List(self, patterns): + @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): ''' - patterns : typing.Sequence<+T_co>[str] - Returns -> typing.Sequence<+T_co>[~Payload]<~Payload> + + Returns -> None ''' # map input types to rpc msg _params = dict() - msg = dict(type='Payloads', request='List', version=1, params=_params) - _params['patterns'] = patterns + msg = dict(type='RemoteApplicationWatcher', + request='Stop', + version=1, + params=_params) + reply = await self.rpc(msg) return reply -class PayloadsHookContextFacade(Type): - name = 'PayloadsHookContext' +class RemoteRelationsFacade(Type): + name = 'RemoteRelations' version = 1 - schema = {'definitions': {'Entities': {'additionalProperties': False, + schema = {'definitions': {'ControllerAPIInfoResult': {'additionalProperties': False, + 'properties': {'addresses': {'items': {'type': 'string'}, + 'type': 'array'}, + 'cacert': {'type': 'string'}, + 'error': {'$ref': '#/definitions/Error'}}, + 'required': ['addresses', + 'cacert'], + 'type': 'object'}, + 'ControllerAPIInfoResults': {'additionalProperties': False, + 'properties': {'results': {'items': {'$ref': '#/definitions/ControllerAPIInfoResult'}, + 'type': 'array'}}, + 'required': ['results'], + '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'], @@ -4821,6 +8588,28 @@ class PayloadsHookContextFacade(Type): 'properties': {'tag': {'type': 'string'}}, 'required': ['tag'], 'type': 'object'}, + 'EntityMacaroonArg': {'additionalProperties': False, + 'properties': {'macaroon': {'$ref': '#/definitions/Macaroon'}, + 'tag': {'type': 'string'}}, + 'required': ['macaroon', 'tag'], + 'type': 'object'}, + 'EntityMacaroonArgs': {'additionalProperties': False, + 'properties': {'Args': {'items': {'$ref': '#/definitions/EntityMacaroonArg'}, + 'type': 'array'}}, + 'required': ['Args'], + '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'}, @@ -4831,172 +8620,583 @@ class PayloadsHookContextFacade(Type): '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'}, + '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'}, + 'GetTokenArg': {'additionalProperties': False, + 'properties': {'tag': {'type': 'string'}}, + 'required': ['tag'], + 'type': 'object'}, + 'GetTokenArgs': {'additionalProperties': False, + 'properties': {'Args': {'items': {'$ref': '#/definitions/GetTokenArg'}, + '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'], + 'RelationUnit': {'additionalProperties': False, + 'properties': {'relation': {'type': 'string'}, + 'unit': {'type': 'string'}}, + 'required': ['relation', 'unit'], + 'type': 'object'}, + 'RelationUnits': {'additionalProperties': False, + 'properties': {'relation-units': {'items': {'$ref': '#/definitions/RelationUnit'}, + 'type': 'array'}}, + 'required': ['relation-units'], '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'], + 'RelationUnitsChange': {'additionalProperties': False, + 'properties': {'changed': {'patternProperties': {'.*': {'$ref': '#/definitions/UnitSettings'}}, + 'type': 'object'}, + 'departed': {'items': {'type': 'string'}, + 'type': 'array'}}, + 'required': ['changed'], 'type': 'object'}, - 'SetPayloadStatusArgs': {'additionalProperties': False, - 'properties': {'args': {'items': {'$ref': '#/definitions/SetPayloadStatusArg'}, - 'type': 'array'}}, - 'required': ['args'], + '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'}, + 'RemoteApplication': {'additionalProperties': False, + 'properties': {'is-consumer-proxy': {'type': 'boolean'}, + 'life': {'type': 'string'}, + 'macaroon': {'$ref': '#/definitions/Macaroon'}, + 'model-uuid': {'type': 'string'}, + 'name': {'type': 'string'}, + 'offer-uuid': {'type': 'string'}, + 'status': {'type': 'string'}}, + 'required': ['name', + 'offer-uuid', + 'model-uuid', + 'is-consumer-proxy'], + 'type': 'object'}, + 'RemoteApplicationResult': {'additionalProperties': False, + 'properties': {'error': {'$ref': '#/definitions/Error'}, + 'result': {'$ref': '#/definitions/RemoteApplication'}}, + 'type': 'object'}, + 'RemoteApplicationResults': {'additionalProperties': False, + 'properties': {'results': {'items': {'$ref': '#/definitions/RemoteApplicationResult'}, + 'type': 'array'}}, + 'type': 'object'}, + 'RemoteEndpoint': {'additionalProperties': False, + 'properties': {'interface': {'type': 'string'}, + 'limit': {'type': 'integer'}, + 'name': {'type': 'string'}, + 'role': {'type': 'string'}}, + 'required': ['name', + 'role', + 'interface', + 'limit'], + 'type': 'object'}, + 'RemoteEntityTokenArg': {'additionalProperties': False, + 'properties': {'tag': {'type': 'string'}, + 'token': {'type': 'string'}}, + 'required': ['tag'], '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'}}, + 'RemoteEntityTokenArgs': {'additionalProperties': False, + 'properties': {'Args': {'items': {'$ref': '#/definitions/RemoteEntityTokenArg'}, + 'type': 'array'}}, + 'required': ['Args'], + 'type': 'object'}, + 'RemoteRelation': {'additionalProperties': False, + 'properties': {'application-name': {'type': 'string'}, + 'endpoint': {'$ref': '#/definitions/RemoteEndpoint'}, + 'id': {'type': 'integer'}, + 'key': {'type': 'string'}, + 'life': {'type': 'string'}, + 'remote-application-name': {'type': 'string'}, + 'remote-endpoint-name': {'type': 'string'}, + 'source-model-uuid': {'type': 'string'}, + 'suspended': {'type': 'boolean'}}, + 'required': ['life', + 'suspended', + 'id', + 'key', + 'application-name', + 'endpoint', + 'remote-application-name', + 'remote-endpoint-name', + 'source-model-uuid'], + 'type': 'object'}, + 'RemoteRelationChangeEvent': {'additionalProperties': False, + 'properties': {'application-token': {'type': 'string'}, + 'changed-units': {'items': {'$ref': '#/definitions/RemoteRelationUnitChange'}, + 'type': 'array'}, + 'departed-units': {'items': {'type': 'integer'}, + 'type': 'array'}, + 'force-cleanup': {'type': 'boolean'}, + 'life': {'type': 'string'}, + 'macaroons': {'items': {'$ref': '#/definitions/Macaroon'}, + 'type': 'array'}, + 'relation-token': {'type': 'string'}, + 'suspended': {'type': 'boolean'}, + 'suspended-reason': {'type': 'string'}}, + 'required': ['relation-token', + 'application-token', + 'life'], + 'type': 'object'}, + 'RemoteRelationResult': {'additionalProperties': False, + 'properties': {'error': {'$ref': '#/definitions/Error'}, + 'result': {'$ref': '#/definitions/RemoteRelation'}}, + 'type': 'object'}, + 'RemoteRelationResults': {'additionalProperties': False, + 'properties': {'results': {'items': {'$ref': '#/definitions/RemoteRelationResult'}, + 'type': 'array'}}, + 'required': ['results'], + 'type': 'object'}, + 'RemoteRelationUnitChange': {'additionalProperties': False, + 'properties': {'settings': {'patternProperties': {'.*': {'additionalProperties': True, + 'type': 'object'}}, + 'type': 'object'}, + 'unit-id': {'type': 'integer'}}, + 'required': ['unit-id'], + 'type': 'object'}, + 'RemoteRelationsChanges': {'additionalProperties': False, + 'properties': {'changes': {'items': {'$ref': '#/definitions/RemoteRelationChangeEvent'}, + 'type': 'array'}}, + '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'}, + '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'}, + 'TokenResult': {'additionalProperties': False, + 'properties': {'error': {'$ref': '#/definitions/Error'}, + 'token': {'type': 'string'}}, + 'type': 'object'}, + 'TokenResults': {'additionalProperties': False, + 'properties': {'results': {'items': {'$ref': '#/definitions/TokenResult'}, + 'type': 'array'}}, + 'type': 'object'}, + 'UnitSettings': {'additionalProperties': False, + 'properties': {'version': {'type': 'integer'}}, + 'required': ['version'], + 'type': 'object'}}, + 'properties': {'ConsumeRemoteRelationChanges': {'properties': {'Params': {'$ref': '#/definitions/RemoteRelationsChanges'}, + 'Result': {'$ref': '#/definitions/ErrorResults'}}, + 'type': 'object'}, + 'ControllerAPIInfoForModels': {'properties': {'Params': {'$ref': '#/definitions/Entities'}, + 'Result': {'$ref': '#/definitions/ControllerAPIInfoResults'}}, + 'type': 'object'}, + 'ControllerConfig': {'properties': {'Result': {'$ref': '#/definitions/ControllerConfigResult'}}, + 'type': 'object'}, + 'ExportEntities': {'properties': {'Params': {'$ref': '#/definitions/Entities'}, + 'Result': {'$ref': '#/definitions/TokenResults'}}, + 'type': 'object'}, + 'GetTokens': {'properties': {'Params': {'$ref': '#/definitions/GetTokenArgs'}, + 'Result': {'$ref': '#/definitions/StringResults'}}, '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'}}, + 'ImportRemoteEntities': {'properties': {'Params': {'$ref': '#/definitions/RemoteEntityTokenArgs'}, + 'Result': {'$ref': '#/definitions/ErrorResults'}}, + 'type': 'object'}, + 'RelationUnitSettings': {'properties': {'Params': {'$ref': '#/definitions/RelationUnits'}, + 'Result': {'$ref': '#/definitions/SettingsResults'}}, + 'type': 'object'}, + 'Relations': {'properties': {'Params': {'$ref': '#/definitions/Entities'}, + 'Result': {'$ref': '#/definitions/RemoteRelationResults'}}, + 'type': 'object'}, + 'RemoteApplications': {'properties': {'Params': {'$ref': '#/definitions/Entities'}, + 'Result': {'$ref': '#/definitions/RemoteApplicationResults'}}, + 'type': 'object'}, + 'SaveMacaroons': {'properties': {'Params': {'$ref': '#/definitions/EntityMacaroonArgs'}, + 'Result': {'$ref': '#/definitions/ErrorResults'}}, + 'type': 'object'}, + 'SetRemoteApplicationsStatus': {'properties': {'Params': {'$ref': '#/definitions/SetStatus'}, + 'Result': {'$ref': '#/definitions/ErrorResults'}}, + 'type': 'object'}, + 'WatchLocalRelationUnits': {'properties': {'Params': {'$ref': '#/definitions/Entities'}, + 'Result': {'$ref': '#/definitions/RelationUnitsWatchResults'}}, + 'type': 'object'}, + 'WatchRemoteApplicationRelations': {'properties': {'Params': {'$ref': '#/definitions/Entities'}, + 'Result': {'$ref': '#/definitions/StringsWatchResults'}}, + 'type': 'object'}, + 'WatchRemoteApplications': {'properties': {'Result': {'$ref': '#/definitions/StringsWatchResult'}}, + 'type': 'object'}, + 'WatchRemoteRelations': {'properties': {'Result': {'$ref': '#/definitions/StringsWatchResult'}}, + 'type': 'object'}}, 'type': 'object'} - @ReturnMapping(PayloadResults) - async def List(self, entities): + @ReturnMapping(ErrorResults) + async def ConsumeRemoteRelationChanges(self, changes): + ''' + changes : typing.Sequence[~RemoteRelationChangeEvent] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='RemoteRelations', + request='ConsumeRemoteRelationChanges', + version=1, + params=_params) + _params['changes'] = changes + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ControllerAPIInfoResults) + async def ControllerAPIInfoForModels(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ControllerAPIInfoResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='RemoteRelations', + request='ControllerAPIInfoForModels', + version=1, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ControllerConfigResult) + async def ControllerConfig(self): + ''' + + Returns -> typing.Mapping[str, typing.Any] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='RemoteRelations', + request='ControllerConfig', + version=1, + params=_params) + + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(TokenResults) + async def ExportEntities(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~PayloadResult]<~PayloadResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~TokenResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='PayloadsHookContext', request='List', version=1, params=_params) + msg = dict(type='RemoteRelations', + request='ExportEntities', + version=1, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply - @ReturnMapping(PayloadResults) - async def LookUp(self, args): + @ReturnMapping(StringResults) + async def GetTokens(self, args): ''' - args : typing.Sequence<+T_co>[~LookUpPayloadArg]<~LookUpPayloadArg> - Returns -> typing.Sequence<+T_co>[~PayloadResult]<~PayloadResult> + args : typing.Sequence[~GetTokenArg] + Returns -> typing.Sequence[~StringResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='PayloadsHookContext', request='LookUp', version=1, params=_params) - _params['args'] = args + msg = dict(type='RemoteRelations', + request='GetTokens', + version=1, + params=_params) + _params['Args'] = args reply = await self.rpc(msg) return reply - @ReturnMapping(PayloadResults) - async def SetStatus(self, args): + @ReturnMapping(ErrorResults) + async def ImportRemoteEntities(self, args): ''' - args : typing.Sequence<+T_co>[~SetPayloadStatusArg]<~SetPayloadStatusArg> - Returns -> typing.Sequence<+T_co>[~PayloadResult]<~PayloadResult> + args : typing.Sequence[~RemoteEntityTokenArg] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='PayloadsHookContext', request='SetStatus', version=1, params=_params) - _params['args'] = args + msg = dict(type='RemoteRelations', + request='ImportRemoteEntities', + version=1, + params=_params) + _params['Args'] = args reply = await self.rpc(msg) return reply - @ReturnMapping(PayloadResults) - async def Track(self, payloads): + @ReturnMapping(SettingsResults) + async def RelationUnitSettings(self, relation_units): ''' - payloads : typing.Sequence<+T_co>[~Payload]<~Payload> - Returns -> typing.Sequence<+T_co>[~PayloadResult]<~PayloadResult> + relation_units : typing.Sequence[~RelationUnit] + Returns -> typing.Sequence[~SettingsResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='PayloadsHookContext', request='Track', version=1, params=_params) - _params['payloads'] = payloads + msg = dict(type='RemoteRelations', + request='RelationUnitSettings', + version=1, + params=_params) + _params['relation-units'] = relation_units reply = await self.rpc(msg) return reply - @ReturnMapping(PayloadResults) - async def Untrack(self, entities): + @ReturnMapping(RemoteRelationResults) + async def Relations(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~PayloadResult]<~PayloadResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~RemoteRelationResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='PayloadsHookContext', request='Untrack', version=1, params=_params) + msg = dict(type='RemoteRelations', + request='Relations', + version=1, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply -class PingerFacade(Type): - name = 'Pinger' + @ReturnMapping(RemoteApplicationResults) + async def RemoteApplications(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~RemoteApplicationResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='RemoteRelations', + request='RemoteApplications', + version=1, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResults) + async def SaveMacaroons(self, args): + ''' + args : typing.Sequence[~EntityMacaroonArg] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='RemoteRelations', + request='SaveMacaroons', + version=1, + params=_params) + _params['Args'] = args + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResults) + async def SetRemoteApplicationsStatus(self, entities): + ''' + entities : typing.Sequence[~EntityStatusArgs] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='RemoteRelations', + request='SetRemoteApplicationsStatus', + version=1, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(RelationUnitsWatchResults) + async def WatchLocalRelationUnits(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~RelationUnitsWatchResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='RemoteRelations', + request='WatchLocalRelationUnits', + version=1, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(StringsWatchResults) + async def WatchRemoteApplicationRelations(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~StringsWatchResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='RemoteRelations', + request='WatchRemoteApplicationRelations', + version=1, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(StringsWatchResult) + async def WatchRemoteApplications(self): + ''' + + Returns -> typing.Union[typing.Sequence[str], _ForwardRef('Error'), str] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='RemoteRelations', + request='WatchRemoteApplications', + version=1, + params=_params) + + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(StringsWatchResult) + async def WatchRemoteRelations(self): + ''' + + Returns -> typing.Union[typing.Sequence[str], _ForwardRef('Error'), str] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='RemoteRelations', + request='WatchRemoteRelations', + version=1, + params=_params) + + reply = await self.rpc(msg) + return reply + + + +class RemoteRelationsWatcherFacade(Type): + name = 'RemoteRelationsWatcher' version = 1 - schema = {'properties': {'Ping': {'type': 'object'}, 'Stop': {'type': 'object'}}, + 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(None) - async def Ping(self): + @ReturnMapping(RemoteRelationsWatchResult) + async def Next(self): ''' - Returns -> None + Returns -> typing.Union[str, _ForwardRef('RemoteRelationsChange'), _ForwardRef('Error')] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Pinger', request='Ping', version=1, params=_params) + msg = dict(type='RemoteRelationsWatcher', + request='Next', + version=1, + params=_params) reply = await self.rpc(msg) return reply @@ -5011,21 +9211,63 @@ class PingerFacade(Type): ''' # map input types to rpc msg _params = dict() - msg = dict(type='Pinger', request='Stop', version=1, params=_params) + msg = dict(type='RemoteRelationsWatcher', + request='Stop', + version=1, + params=_params) reply = await self.rpc(msg) return reply -class ProxyUpdaterFacade(Type): - name = 'ProxyUpdater' +class ResourcesFacade(Type): + name = 'Resources' version = 1 - schema = {'definitions': {'Entities': {'additionalProperties': False, - 'properties': {'entities': {'items': {'$ref': '#/definitions/Entity'}, - 'type': 'array'}}, - 'required': ['entities'], - 'type': 'object'}, + schema = {'definitions': {'AddCharmWithAuthorization': {'additionalProperties': False, + 'properties': {'channel': {'type': 'string'}, + 'force': {'type': 'boolean'}, + 'macaroon': {'$ref': '#/definitions/Macaroon'}, + 'url': {'type': 'string'}}, + 'required': ['url', + 'channel', + 'macaroon', + 'force'], + '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'], @@ -5040,82 +9282,129 @@ class ProxyUpdaterFacade(Type): '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'}, + 'ErrorResult': {'additionalProperties': False, + 'properties': {'error': {'$ref': '#/definitions/Error'}}, + 'type': 'object'}, + 'ListResourcesArgs': {'additionalProperties': False, + 'properties': {'entities': {'items': {'$ref': '#/definitions/Entity'}, 'type': 'array'}}, - 'required': ['results'], + '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'}, - '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'}}, + 'ListResources': {'properties': {'Params': {'$ref': '#/definitions/ListResourcesArgs'}, + 'Result': {'$ref': '#/definitions/ResourcesResults'}}, + 'type': 'object'}}, 'type': 'object'} - @ReturnMapping(ProxyConfigResults) - async def ProxyConfig(self, entities): + @ReturnMapping(AddPendingResourcesResult) + async def AddPendingResources(self, addcharmwithauthorization, entity, resources): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~ProxyConfigResult]<~ProxyConfigResult> + addcharmwithauthorization : AddCharmWithAuthorization + entity : Entity + resources : typing.Sequence[~CharmResource] + Returns -> typing.Union[_ForwardRef('ErrorResult'), typing.Sequence[str]] ''' # map input types to rpc msg _params = dict() - msg = dict(type='ProxyUpdater', request='ProxyConfig', version=1, params=_params) - _params['entities'] = entities + 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(NotifyWatchResults) - async def WatchForProxyConfigAndAPIHostPortChanges(self, entities): + @ReturnMapping(ResourcesResults) + async def ListResources(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~NotifyWatchResult]<~NotifyWatchResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ResourcesResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='ProxyUpdater', request='WatchForProxyConfigAndAPIHostPortChanges', version=1, params=_params) + msg = dict(type='Resources', + request='ListResources', + version=1, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply -class RelationUnitsWatcherFacade(Type): - name = 'RelationUnitsWatcher' +class ResourcesHookContextFacade(Type): + name = 'ResourcesHookContext' version = 1 - schema = {'definitions': {'Error': {'additionalProperties': False, + 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'}}, @@ -5125,65 +9414,79 @@ class RelationUnitsWatcherFacade(Type): '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'}, - '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'}}, + '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(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): + @ReturnMapping(UnitResourcesResult) + async def GetResourceInfo(self, resource_names): ''' - - Returns -> None + resource_names : typing.Sequence[str] + Returns -> typing.Union[_ForwardRef('ErrorResult'), typing.Sequence[~UnitResourceResult]] ''' # map input types to rpc msg _params = dict() - msg = dict(type='RelationUnitsWatcher', request='Stop', version=1, params=_params) - + msg = dict(type='ResourcesHookContext', + request='GetResourceInfo', + version=1, + params=_params) + _params['resource-names'] = resource_names reply = await self.rpc(msg) return reply -class RemoteApplicationWatcherFacade(Type): - name = 'RemoteApplicationWatcher' +class RetryStrategyFacade(Type): + name = 'RetryStrategy' version = 1 - schema = {'definitions': {'Error': {'additionalProperties': False, + 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'}}, @@ -5194,89 +9497,95 @@ class RemoteApplicationWatcherFacade(Type): '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'}}, + '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(RemoteApplicationWatchResult) - async def Next(self): + @ReturnMapping(RetryStrategyResults) + async def RetryStrategy(self, entities): ''' - - Returns -> typing.Union[_ForwardRef('RemoteApplicationChange'), _ForwardRef('Error'), str] + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~RetryStrategyResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='RemoteApplicationWatcher', request='Next', version=1, params=_params) - + msg = dict(type='RetryStrategy', + request='RetryStrategy', + version=1, + params=_params) + _params['entities'] = entities reply = await self.rpc(msg) return reply - @ReturnMapping(None) - async def Stop(self): + @ReturnMapping(NotifyWatchResults) + async def WatchRetryStrategy(self, entities): ''' - - Returns -> None + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~NotifyWatchResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='RemoteApplicationWatcher', request='Stop', version=1, params=_params) - + msg = dict(type='RetryStrategy', + request='WatchRetryStrategy', + version=1, + params=_params) + _params['entities'] = entities reply = await self.rpc(msg) return reply -class RemoteRelationsWatcherFacade(Type): - name = 'RemoteRelationsWatcher' +class SSHClientFacade(Type): + name = 'SSHClient' version = 1 - schema = {'definitions': {'Error': {'additionalProperties': False, + 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'}}, @@ -5287,253 +9596,208 @@ class RemoteRelationsWatcherFacade(Type): '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'], + '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'}, - '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'}}, + '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(RemoteRelationsWatchResult) - async def Next(self): + @ReturnMapping(SSHAddressResults) + async def PrivateAddress(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~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 -> typing.Union[str, _ForwardRef('RemoteRelationsChange'), _ForwardRef('Error')] + Returns -> bool ''' # map input types to rpc msg _params = dict() - msg = dict(type='RemoteRelationsWatcher', request='Next', version=1, params=_params) + msg = dict(type='SSHClient', + request='Proxy', + version=1, + params=_params) reply = await self.rpc(msg) return reply - @ReturnMapping(None) - async def Stop(self): + @ReturnMapping(SSHAddressResults) + async def PublicAddress(self, entities): ''' - - Returns -> None + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~SSHAddressResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='RemoteRelationsWatcher', request='Stop', version=1, params=_params) + 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[~Entity] + Returns -> typing.Sequence[~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 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'}}, +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(AddPendingResourcesResult) - async def AddPendingResources(self, addcharmwithauthorization, entity, resources): + @ReturnMapping(ErrorResults) + async def Claim(self, claims): ''' - addcharmwithauthorization : AddCharmWithAuthorization - entity : Entity - resources : typing.Sequence<+T_co>[~CharmResource]<~CharmResource> - Returns -> typing.Union[_ForwardRef('ErrorResult'), typing.Sequence<+T_co>[str]] + claims : typing.Sequence[~SingularClaim] + Returns -> typing.Sequence[~ErrorResult] ''' # 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 + msg = dict(type='Singular', + request='Claim', + version=1, + params=_params) + _params['claims'] = claims reply = await self.rpc(msg) return reply - @ReturnMapping(ResourcesResults) - async def ListResources(self, entities): + @ReturnMapping(ErrorResults) + async def Wait(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~ResourcesResult]<~ResourcesResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Resources', request='ListResources', version=1, params=_params) + msg = dict(type='Singular', + request='Wait', + version=1, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply -class ResourcesHookContextFacade(Type): - name = 'ResourcesHookContext' +class StringsWatcherFacade(Type): + name = 'StringsWatcher' 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, + schema = {'definitions': {'Error': {'additionalProperties': False, 'properties': {'code': {'type': 'string'}, 'info': {'$ref': '#/definitions/ErrorInfo'}, 'message': {'type': 'string'}}, @@ -5543,75 +9807,71 @@ class ResourcesHookContextFacade(Type): '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'}}, + '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(UnitResourcesResult) - async def GetResourceInfo(self, resource_names): + @ReturnMapping(StringsWatchResult) + async def Next(self): ''' - resource_names : typing.Sequence<+T_co>[str] - Returns -> typing.Union[_ForwardRef('ErrorResult'), typing.Sequence<+T_co>[~UnitResourceResult]<~UnitResourceResult>] + + Returns -> typing.Union[typing.Sequence[str], _ForwardRef('Error'), str] ''' # map input types to rpc msg _params = dict() - msg = dict(type='ResourcesHookContext', request='GetResourceInfo', version=1, params=_params) - _params['resource-names'] = resource_names + msg = dict(type='StringsWatcher', + request='Next', + version=1, + params=_params) + reply = await self.rpc(msg) return reply -class RetryStrategyFacade(Type): - name = 'RetryStrategy' + @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': {'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'}, + 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'}, @@ -5622,7 +9882,21 @@ class RetryStrategyFacade(Type): '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'}}, @@ -5633,188 +9907,173 @@ class RetryStrategyFacade(Type): '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'}}, + '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'}, - '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'}}, + '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(RetryStrategyResults) - async def RetryStrategy(self, entities): + @ReturnMapping(ModelConfigResult) + async def ModelConfig(self): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~RetryStrategyResult]<~RetryStrategyResult> + + Returns -> typing.Mapping[str, typing.Any] ''' # map input types to rpc msg _params = dict() - msg = dict(type='RetryStrategy', request='RetryStrategy', version=1, params=_params) - _params['entities'] = entities + msg = dict(type='Undertaker', + request='ModelConfig', + version=1, + params=_params) + reply = await self.rpc(msg) return reply - @ReturnMapping(NotifyWatchResults) - async def WatchRetryStrategy(self, entities): + @ReturnMapping(UndertakerModelInfoResult) + async def ModelInfo(self): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~NotifyWatchResult]<~NotifyWatchResult> + + Returns -> typing.Union[_ForwardRef('Error'), _ForwardRef('UndertakerModelInfo')] ''' # map input types to rpc msg _params = dict() - msg = dict(type='RetryStrategy', request='WatchRetryStrategy', version=1, params=_params) - _params['entities'] = entities + msg = dict(type='Undertaker', + request='ModelInfo', + version=1, + params=_params) + 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): + @ReturnMapping(None) + async def ProcessDyingModel(self): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~SSHAddressResult]<~SSHAddressResult> + + Returns -> None ''' # map input types to rpc msg _params = dict() - msg = dict(type='SSHClient', request='PrivateAddress', version=1, params=_params) - _params['entities'] = entities + msg = dict(type='Undertaker', + request='ProcessDyingModel', + version=1, + params=_params) + reply = await self.rpc(msg) return reply - @ReturnMapping(SSHProxyResult) - async def Proxy(self): + @ReturnMapping(None) + async def RemoveModel(self): ''' - Returns -> bool + Returns -> None ''' # map input types to rpc msg _params = dict() - msg = dict(type='SSHClient', request='Proxy', version=1, params=_params) + msg = dict(type='Undertaker', + request='RemoveModel', + version=1, + params=_params) reply = await self.rpc(msg) return reply - @ReturnMapping(SSHAddressResults) - async def PublicAddress(self, entities): + @ReturnMapping(ErrorResults) + async def SetStatus(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~SSHAddressResult]<~SSHAddressResult> + entities : typing.Sequence[~EntityStatusArgs] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='SSHClient', request='PublicAddress', version=1, params=_params) + msg = dict(type='Undertaker', + request='SetStatus', + version=1, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply - @ReturnMapping(SSHPublicKeysResults) - async def PublicKeys(self, entities): + @ReturnMapping(ErrorResults) + async def UpdateStatus(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~SSHPublicKeysResult]<~SSHPublicKeysResult> + entities : typing.Sequence[~EntityStatusArgs] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='SSHClient', request='PublicKeys', version=1, params=_params) + msg = dict(type='Undertaker', + request='UpdateStatus', + version=1, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply -class SingularFacade(Type): - name = 'Singular' + @ReturnMapping(NotifyWatchResults) + async def WatchModelResources(self): + ''' + + Returns -> typing.Sequence[~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'}, @@ -5825,6 +10084,18 @@ class SingularFacade(Type): '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'}, @@ -5844,130 +10115,106 @@ class SingularFacade(Type): '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'], + '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'}, - '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'}}, + 'WatchUnitAssignments': {'properties': {'Result': {'$ref': '#/definitions/StringsWatchResult'}}, + 'type': 'object'}}, 'type': 'object'} @ReturnMapping(ErrorResults) - async def Claim(self, claims): + async def AssignUnits(self, entities): ''' - claims : typing.Sequence<+T_co>[~SingularClaim]<~SingularClaim> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Singular', request='Claim', version=1, params=_params) - _params['claims'] = claims + msg = dict(type='UnitAssigner', + request='AssignUnits', + version=1, + params=_params) + _params['entities'] = entities reply = await self.rpc(msg) return reply @ReturnMapping(ErrorResults) - async def Wait(self, entities): + async def SetAgentStatus(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + entities : typing.Sequence[~EntityStatusArgs] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Singular', request='Wait', version=1, params=_params) + msg = dict(type='UnitAssigner', + request='SetAgentStatus', + 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): + async def WatchUnitAssignments(self): ''' - Returns -> None + Returns -> typing.Union[typing.Sequence[str], _ForwardRef('Error'), str] ''' # map input types to rpc msg _params = dict() - msg = dict(type='StringsWatcher', request='Stop', version=1, params=_params) + msg = dict(type='UnitAssigner', + request='WatchUnitAssignments', + version=1, + params=_params) reply = await self.rpc(msg) return reply -class UndertakerFacade(Type): - name = 'Undertaker' +class UpgradeSeriesFacade(Type): + name = 'UpgradeSeries' 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'}, + 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'}, @@ -5983,16 +10230,10 @@ class UndertakerFacade(Type): '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'}, + 'type': 'array'}}, + 'required': ['results'], + 'type': 'object'}, + 'Macaroon': {'additionalProperties': False, 'type': 'object'}, 'NotifyWatchResult': {'additionalProperties': False, 'properties': {'NotifyWatcherId': {'type': 'string'}, 'error': {'$ref': '#/definitions/Error'}}, @@ -6003,256 +10244,340 @@ class UndertakerFacade(Type): '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, + 'PinApplicationResult': {'additionalProperties': False, + 'properties': {'application-name': {'type': 'string'}, + 'error': {'$ref': '#/definitions/Error'}}, + 'required': ['application-name'], + 'type': 'object'}, + 'PinApplicationsResults': {'additionalProperties': False, + 'properties': {'results': {'items': {'$ref': '#/definitions/PinApplicationResult'}, + 'type': 'array'}}, + 'required': ['results'], + 'type': 'object'}, + 'PinnedLeadershipResult': {'additionalProperties': False, + 'properties': {'result': {'patternProperties': {'.*': {'items': {'type': 'string'}, + 'type': 'array'}}, + 'type': 'object'}}, + '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'}, + 'UpdateSeriesArg': {'additionalProperties': False, + 'properties': {'force': {'type': 'boolean'}, + 'series': {'type': 'string'}, + 'tag': {'$ref': '#/definitions/Entity'}}, + 'required': ['tag', 'force', 'series'], + 'type': 'object'}, + 'UpdateSeriesArgs': {'additionalProperties': False, + 'properties': {'args': {'items': {'$ref': '#/definitions/UpdateSeriesArg'}, + 'type': 'array'}}, + 'required': ['args'], + 'type': 'object'}, + 'UpgradeSeriesStartUnitCompletionParam': {'additionalProperties': False, + 'properties': {'entities': {'items': {'$ref': '#/definitions/Entity'}, + 'type': 'array'}, + 'message': {'type': 'string'}}, + 'required': ['entities', + 'message'], + 'type': 'object'}, + 'UpgradeSeriesStatusParam': {'additionalProperties': False, + 'properties': {'entity': {'$ref': '#/definitions/Entity'}, + 'message': {'type': 'string'}, + 'status': {'type': 'string'}}, + 'required': ['entity', + 'status', + 'message'], + 'type': 'object'}, + 'UpgradeSeriesStatusParams': {'additionalProperties': False, + 'properties': {'params': {'items': {'$ref': '#/definitions/UpgradeSeriesStatusParam'}, + 'type': 'array'}}, + 'required': ['params'], + 'type': 'object'}, + 'UpgradeSeriesStatusResult': {'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'}}, + 'status': {'type': 'string'}}, + 'type': 'object'}, + 'UpgradeSeriesStatusResults': {'additionalProperties': False, + 'properties': {'results': {'items': {'$ref': '#/definitions/UpgradeSeriesStatusResult'}, + 'type': 'array'}}, + 'type': 'object'}}, + 'properties': {'FinishUpgradeSeries': {'properties': {'Params': {'$ref': '#/definitions/UpdateSeriesArgs'}, + 'Result': {'$ref': '#/definitions/ErrorResults'}}, + 'type': 'object'}, + 'MachineStatus': {'properties': {'Params': {'$ref': '#/definitions/Entities'}, + 'Result': {'$ref': '#/definitions/UpgradeSeriesStatusResults'}}, + 'type': 'object'}, + 'PinMachineApplications': {'properties': {'Result': {'$ref': '#/definitions/PinApplicationsResults'}}, + 'type': 'object'}, + 'PinnedLeadership': {'properties': {'Result': {'$ref': '#/definitions/PinnedLeadershipResult'}}, + 'type': 'object'}, + 'SetMachineStatus': {'properties': {'Params': {'$ref': '#/definitions/UpgradeSeriesStatusParams'}, + 'Result': {'$ref': '#/definitions/ErrorResults'}}, + 'type': 'object'}, + 'SetUpgradeSeriesUnitStatus': {'properties': {'Params': {'$ref': '#/definitions/UpgradeSeriesStatusParams'}, + 'Result': {'$ref': '#/definitions/ErrorResults'}}, + 'type': 'object'}, + 'StartUnitCompletion': {'properties': {'Params': {'$ref': '#/definitions/UpgradeSeriesStartUnitCompletionParam'}, + 'Result': {'$ref': '#/definitions/ErrorResults'}}, + 'type': 'object'}, + 'TargetSeries': {'properties': {'Params': {'$ref': '#/definitions/Entities'}, + 'Result': {'$ref': '#/definitions/StringResults'}}, 'type': 'object'}, - 'WatchModelResources': {'properties': {'Result': {'$ref': '#/definitions/NotifyWatchResults'}}, - 'type': 'object'}}, + 'UnitsCompleted': {'properties': {'Params': {'$ref': '#/definitions/Entities'}, + 'Result': {'$ref': '#/definitions/EntitiesResults'}}, + 'type': 'object'}, + 'UnitsPrepared': {'properties': {'Params': {'$ref': '#/definitions/Entities'}, + 'Result': {'$ref': '#/definitions/EntitiesResults'}}, + 'type': 'object'}, + 'UnpinMachineApplications': {'properties': {'Result': {'$ref': '#/definitions/PinApplicationsResults'}}, + 'type': 'object'}, + 'UpgradeSeriesUnitStatus': {'properties': {'Params': {'$ref': '#/definitions/Entities'}, + 'Result': {'$ref': '#/definitions/UpgradeSeriesStatusResults'}}, + 'type': 'object'}, + 'WatchUpgradeSeriesNotifications': {'properties': {'Params': {'$ref': '#/definitions/Entities'}, + 'Result': {'$ref': '#/definitions/NotifyWatchResults'}}, + 'type': 'object'}}, 'type': 'object'} - @ReturnMapping(ModelConfigResult) - async def ModelConfig(self): + @ReturnMapping(ErrorResults) + async def FinishUpgradeSeries(self, args): ''' - - Returns -> typing.Mapping<~KT, +VT_co>[str, typing.Any] + args : typing.Sequence[~UpdateSeriesArg] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Undertaker', request='ModelConfig', version=1, params=_params) + msg = dict(type='UpgradeSeries', + request='FinishUpgradeSeries', + version=1, + params=_params) + _params['args'] = args + reply = await self.rpc(msg) + return reply + + + @ReturnMapping(UpgradeSeriesStatusResults) + async def MachineStatus(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~UpgradeSeriesStatusResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='UpgradeSeries', + request='MachineStatus', + version=1, + params=_params) + _params['entities'] = entities reply = await self.rpc(msg) return reply - @ReturnMapping(UndertakerModelInfoResult) - async def ModelInfo(self): + @ReturnMapping(PinApplicationsResults) + async def PinMachineApplications(self): ''' - Returns -> typing.Union[_ForwardRef('Error'), _ForwardRef('UndertakerModelInfo')] + Returns -> typing.Sequence[~PinApplicationResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Undertaker', request='ModelInfo', version=1, params=_params) + msg = dict(type='UpgradeSeries', + request='PinMachineApplications', + version=1, + params=_params) reply = await self.rpc(msg) return reply - @ReturnMapping(None) - async def ProcessDyingModel(self): + @ReturnMapping(PinnedLeadershipResult) + async def PinnedLeadership(self): ''' - Returns -> None + Returns -> typing.Sequence[str] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Undertaker', request='ProcessDyingModel', version=1, params=_params) + msg = dict(type='UpgradeSeries', + request='PinnedLeadership', + version=1, + params=_params) reply = await self.rpc(msg) return reply - @ReturnMapping(None) - async def RemoveModel(self): + @ReturnMapping(ErrorResults) + async def SetMachineStatus(self, params): ''' - - Returns -> None + params : typing.Sequence[~UpgradeSeriesStatusParam] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Undertaker', request='RemoveModel', version=1, params=_params) - + msg = dict(type='UpgradeSeries', + request='SetMachineStatus', + version=1, + params=_params) + _params['params'] = params reply = await self.rpc(msg) return reply @ReturnMapping(ErrorResults) - async def SetStatus(self, entities): + async def SetUpgradeSeriesUnitStatus(self, params): ''' - entities : typing.Sequence<+T_co>[~EntityStatusArgs]<~EntityStatusArgs> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + params : typing.Sequence[~UpgradeSeriesStatusParam] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Undertaker', request='SetStatus', version=1, params=_params) - _params['entities'] = entities + msg = dict(type='UpgradeSeries', + request='SetUpgradeSeriesUnitStatus', + version=1, + params=_params) + _params['params'] = params reply = await self.rpc(msg) return reply @ReturnMapping(ErrorResults) - async def UpdateStatus(self, entities): + async def StartUnitCompletion(self, entities, message): ''' - entities : typing.Sequence<+T_co>[~EntityStatusArgs]<~EntityStatusArgs> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + entities : typing.Sequence[~Entity] + message : str + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Undertaker', request='UpdateStatus', version=1, params=_params) + msg = dict(type='UpgradeSeries', + request='StartUnitCompletion', + version=1, + params=_params) _params['entities'] = entities + _params['message'] = message reply = await self.rpc(msg) return reply - @ReturnMapping(NotifyWatchResults) - async def WatchModelResources(self): + @ReturnMapping(StringResults) + async def TargetSeries(self, entities): ''' - - Returns -> typing.Sequence<+T_co>[~NotifyWatchResult]<~NotifyWatchResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~StringResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Undertaker', request='WatchModelResources', version=1, params=_params) - + msg = dict(type='UpgradeSeries', + request='TargetSeries', + version=1, + params=_params) + _params['entities'] = entities 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): + @ReturnMapping(EntitiesResults) + async def UnitsCompleted(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~EntitiesResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='UnitAssigner', request='AssignUnits', version=1, params=_params) + msg = dict(type='UpgradeSeries', + request='UnitsCompleted', + version=1, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply - @ReturnMapping(ErrorResults) - async def SetAgentStatus(self, entities): + @ReturnMapping(EntitiesResults) + async def UnitsPrepared(self, entities): ''' - entities : typing.Sequence<+T_co>[~EntityStatusArgs]<~EntityStatusArgs> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~EntitiesResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='UnitAssigner', request='SetAgentStatus', version=1, params=_params) + msg = dict(type='UpgradeSeries', + request='UnitsPrepared', + version=1, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply - @ReturnMapping(StringsWatchResult) - async def WatchUnitAssignments(self): + @ReturnMapping(PinApplicationsResults) + async def UnpinMachineApplications(self): ''' - Returns -> typing.Union[typing.Sequence<+T_co>[str], _ForwardRef('Error')] + Returns -> typing.Sequence[~PinApplicationResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='UpgradeSeries', + request='UnpinMachineApplications', + version=1, + params=_params) + + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(UpgradeSeriesStatusResults) + async def UpgradeSeriesUnitStatus(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~UpgradeSeriesStatusResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='UnitAssigner', request='WatchUnitAssignments', version=1, params=_params) + msg = dict(type='UpgradeSeries', + request='UpgradeSeriesUnitStatus', + version=1, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + @ReturnMapping(NotifyWatchResults) + async def WatchUpgradeSeriesNotifications(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~NotifyWatchResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='UpgradeSeries', + request='WatchUpgradeSeriesNotifications', + version=1, + params=_params) + _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -6378,12 +10703,15 @@ class UpgraderFacade(Type): @ReturnMapping(VersionResults) async def DesiredVersion(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~VersionResult]<~VersionResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~VersionResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Upgrader', request='DesiredVersion', version=1, params=_params) + msg = dict(type='Upgrader', + request='DesiredVersion', + version=1, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -6393,12 +10721,15 @@ class UpgraderFacade(Type): @ReturnMapping(ErrorResults) async def SetTools(self, agent_tools): ''' - agent_tools : typing.Sequence<+T_co>[~EntityVersion]<~EntityVersion> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + agent_tools : typing.Sequence[~EntityVersion] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Upgrader', request='SetTools', version=1, params=_params) + msg = dict(type='Upgrader', + request='SetTools', + version=1, + params=_params) _params['agent-tools'] = agent_tools reply = await self.rpc(msg) return reply @@ -6408,12 +10739,15 @@ class UpgraderFacade(Type): @ReturnMapping(ToolsResults) async def Tools(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~ToolsResult]<~ToolsResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ToolsResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Upgrader', request='Tools', version=1, params=_params) + msg = dict(type='Upgrader', + request='Tools', + version=1, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -6423,12 +10757,15 @@ class UpgraderFacade(Type): @ReturnMapping(NotifyWatchResults) async def WatchAPIVersion(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~NotifyWatchResult]<~NotifyWatchResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~NotifyWatchResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Upgrader', request='WatchAPIVersion', version=1, params=_params) + msg = dict(type='Upgrader', + request='WatchAPIVersion', + version=1, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -6555,12 +10892,15 @@ class UserManagerFacade(Type): @ReturnMapping(AddUserResults) async def AddUser(self, users): ''' - users : typing.Sequence<+T_co>[~AddUser]<~AddUser> - Returns -> typing.Sequence<+T_co>[~AddUserResult]<~AddUserResult> + users : typing.Sequence[~AddUser] + Returns -> typing.Sequence[~AddUserResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='UserManager', request='AddUser', version=1, params=_params) + msg = dict(type='UserManager', + request='AddUser', + version=1, + params=_params) _params['users'] = users reply = await self.rpc(msg) return reply @@ -6570,12 +10910,15 @@ class UserManagerFacade(Type): @ReturnMapping(ErrorResults) async def DisableUser(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='UserManager', request='DisableUser', version=1, params=_params) + msg = dict(type='UserManager', + request='DisableUser', + version=1, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -6585,12 +10928,15 @@ class UserManagerFacade(Type): @ReturnMapping(ErrorResults) async def EnableUser(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='UserManager', request='EnableUser', version=1, params=_params) + msg = dict(type='UserManager', + request='EnableUser', + version=1, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -6600,12 +10946,15 @@ class UserManagerFacade(Type): @ReturnMapping(ErrorResults) async def RemoveUser(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='UserManager', request='RemoveUser', version=1, params=_params) + msg = dict(type='UserManager', + request='RemoveUser', + version=1, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -6615,12 +10964,15 @@ class UserManagerFacade(Type): @ReturnMapping(ErrorResults) async def SetPassword(self, changes): ''' - changes : typing.Sequence<+T_co>[~EntityPassword]<~EntityPassword> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + changes : typing.Sequence[~EntityPassword] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='UserManager', request='SetPassword', version=1, params=_params) + msg = dict(type='UserManager', + request='SetPassword', + version=1, + params=_params) _params['changes'] = changes reply = await self.rpc(msg) return reply @@ -6630,16 +10982,89 @@ class UserManagerFacade(Type): @ReturnMapping(UserInfoResults) async def UserInfo(self, entities, include_disabled): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> + entities : typing.Sequence[~Entity] include_disabled : bool - Returns -> typing.Sequence<+T_co>[~UserInfoResult]<~UserInfoResult> + Returns -> typing.Sequence[~UserInfoResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='UserManager', request='UserInfo', version=1, params=_params) + 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 + +class VolumeAttachmentPlansWatcherFacade(Type): + name = 'VolumeAttachmentPlansWatcher' + 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'}, + '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[~MachineStorageId], _ForwardRef('Error'), str] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='VolumeAttachmentPlansWatcher', + 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='VolumeAttachmentPlansWatcher', + request='Stop', + version=1, + params=_params) + + reply = await self.rpc(msg) + return reply + + diff --git a/juju/client/_client2.py b/juju/client/_client2.py index 283e803..4b5b518 100644 --- a/juju/client/_client2.py +++ b/juju/client/_client2.py @@ -165,12 +165,15 @@ class ActionFacade(Type): @ReturnMapping(ActionResults) async def Actions(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~ActionResult]<~ActionResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ActionResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Action', request='Actions', version=2, params=_params) + msg = dict(type='Action', + request='Actions', + version=2, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -180,12 +183,15 @@ class ActionFacade(Type): @ReturnMapping(ApplicationsCharmActionsResults) async def ApplicationsCharmsActions(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~ApplicationCharmActionsResult]<~ApplicationCharmActionsResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ApplicationCharmActionsResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Action', request='ApplicationsCharmsActions', version=2, params=_params) + msg = dict(type='Action', + request='ApplicationsCharmsActions', + version=2, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -195,12 +201,15 @@ class ActionFacade(Type): @ReturnMapping(ActionResults) async def Cancel(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~ActionResult]<~ActionResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ActionResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Action', request='Cancel', version=2, params=_params) + msg = dict(type='Action', + request='Cancel', + version=2, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -210,12 +219,15 @@ class ActionFacade(Type): @ReturnMapping(ActionResults) async def Enqueue(self, actions): ''' - actions : typing.Sequence<+T_co>[~Action]<~Action> - Returns -> typing.Sequence<+T_co>[~ActionResult]<~ActionResult> + actions : typing.Sequence[~Action] + Returns -> typing.Sequence[~ActionResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Action', request='Enqueue', version=2, params=_params) + msg = dict(type='Action', + request='Enqueue', + version=2, + params=_params) _params['actions'] = actions reply = await self.rpc(msg) return reply @@ -225,12 +237,15 @@ class ActionFacade(Type): @ReturnMapping(FindTagsResults) async def FindActionTagsByPrefix(self, prefixes): ''' - prefixes : typing.Sequence<+T_co>[str] - Returns -> typing.Sequence<+T_co>[~Entity]<~Entity> + prefixes : typing.Sequence[str] + Returns -> typing.Sequence[~Entity] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Action', request='FindActionTagsByPrefix', version=2, params=_params) + msg = dict(type='Action', + request='FindActionTagsByPrefix', + version=2, + params=_params) _params['prefixes'] = prefixes reply = await self.rpc(msg) return reply @@ -240,12 +255,15 @@ class ActionFacade(Type): @ReturnMapping(ActionsByNames) async def FindActionsByNames(self, names): ''' - names : typing.Sequence<+T_co>[str] - Returns -> typing.Sequence<+T_co>[~ActionsByName]<~ActionsByName> + names : typing.Sequence[str] + Returns -> typing.Sequence[~ActionsByName] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Action', request='FindActionsByNames', version=2, params=_params) + msg = dict(type='Action', + request='FindActionsByNames', + version=2, + params=_params) _params['names'] = names reply = await self.rpc(msg) return reply @@ -255,12 +273,15 @@ class ActionFacade(Type): @ReturnMapping(ActionsByReceivers) async def ListAll(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~ActionsByReceiver]<~ActionsByReceiver> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ActionsByReceiver] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Action', request='ListAll', version=2, params=_params) + msg = dict(type='Action', + request='ListAll', + version=2, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -270,12 +291,15 @@ class ActionFacade(Type): @ReturnMapping(ActionsByReceivers) async def ListCompleted(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~ActionsByReceiver]<~ActionsByReceiver> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ActionsByReceiver] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Action', request='ListCompleted', version=2, params=_params) + msg = dict(type='Action', + request='ListCompleted', + version=2, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -285,12 +309,15 @@ class ActionFacade(Type): @ReturnMapping(ActionsByReceivers) async def ListPending(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~ActionsByReceiver]<~ActionsByReceiver> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ActionsByReceiver] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Action', request='ListPending', version=2, params=_params) + msg = dict(type='Action', + request='ListPending', + version=2, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -300,12 +327,15 @@ class ActionFacade(Type): @ReturnMapping(ActionsByReceivers) async def ListRunning(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~ActionsByReceiver]<~ActionsByReceiver> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ActionsByReceiver] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Action', request='ListRunning', version=2, params=_params) + msg = dict(type='Action', + request='ListRunning', + version=2, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -315,16 +345,19 @@ class ActionFacade(Type): @ReturnMapping(ActionResults) async def Run(self, applications, commands, machines, timeout, units): ''' - applications : typing.Sequence<+T_co>[str] + applications : typing.Sequence[str] commands : str - machines : typing.Sequence<+T_co>[str] + machines : typing.Sequence[str] timeout : int - units : typing.Sequence<+T_co>[str] - Returns -> typing.Sequence<+T_co>[~ActionResult]<~ActionResult> + units : typing.Sequence[str] + Returns -> typing.Sequence[~ActionResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Action', request='Run', version=2, params=_params) + msg = dict(type='Action', + request='Run', + version=2, + params=_params) _params['applications'] = applications _params['commands'] = commands _params['machines'] = machines @@ -338,16 +371,19 @@ class ActionFacade(Type): @ReturnMapping(ActionResults) async def RunOnAllMachines(self, applications, commands, machines, timeout, units): ''' - applications : typing.Sequence<+T_co>[str] + applications : typing.Sequence[str] commands : str - machines : typing.Sequence<+T_co>[str] + machines : typing.Sequence[str] timeout : int - units : typing.Sequence<+T_co>[str] - Returns -> typing.Sequence<+T_co>[~ActionResult]<~ActionResult> + units : typing.Sequence[str] + Returns -> typing.Sequence[~ActionResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Action', request='RunOnAllMachines', version=2, params=_params) + msg = dict(type='Action', + request='RunOnAllMachines', + version=2, + params=_params) _params['applications'] = applications _params['commands'] = commands _params['machines'] = machines @@ -385,7 +421,9 @@ class AgentFacade(Type): 'required': ['auth-type'], 'type': 'object'}, 'CloudSpec': {'additionalProperties': False, - 'properties': {'credential': {'$ref': '#/definitions/CloudCredential'}, + 'properties': {'cacertificates': {'items': {'type': 'string'}, + 'type': 'array'}, + 'credential': {'$ref': '#/definitions/CloudCredential'}, 'endpoint': {'type': 'string'}, 'identity-endpoint': {'type': 'string'}, 'name': {'type': 'string'}, @@ -402,6 +440,19 @@ class AgentFacade(Type): 'properties': {'results': {'items': {'$ref': '#/definitions/CloudSpecResult'}, 'type': 'array'}}, 'type': 'object'}, + 'ControllerAPIInfoResult': {'additionalProperties': False, + 'properties': {'addresses': {'items': {'type': 'string'}, + 'type': 'array'}, + 'cacert': {'type': 'string'}, + 'error': {'$ref': '#/definitions/Error'}}, + 'required': ['addresses', + 'cacert'], + 'type': 'object'}, + 'ControllerAPIInfoResults': {'additionalProperties': False, + 'properties': {'results': {'items': {'$ref': '#/definitions/ControllerAPIInfoResult'}, + 'type': 'array'}}, + 'required': ['results'], + 'type': 'object'}, 'ControllerConfigResult': {'additionalProperties': False, 'properties': {'config': {'patternProperties': {'.*': {'additionalProperties': True, 'type': 'object'}}, @@ -471,6 +522,7 @@ class AgentFacade(Type): 'properties': {'api-port': {'type': 'integer'}, 'ca-private-key': {'type': 'string'}, 'cert': {'type': 'string'}, + 'controller-api-port': {'type': 'integer'}, 'private-key': {'type': 'string'}, 'shared-secret': {'type': 'string'}, 'state-port': {'type': 'integer'}, @@ -489,6 +541,9 @@ class AgentFacade(Type): 'CloudSpec': {'properties': {'Params': {'$ref': '#/definitions/Entities'}, 'Result': {'$ref': '#/definitions/CloudSpecResults'}}, 'type': 'object'}, + 'ControllerAPIInfoForModels': {'properties': {'Params': {'$ref': '#/definitions/Entities'}, + 'Result': {'$ref': '#/definitions/ControllerAPIInfoResults'}}, + 'type': 'object'}, 'ControllerConfig': {'properties': {'Result': {'$ref': '#/definitions/ControllerConfigResult'}}, 'type': 'object'}, 'GetCloudSpec': {'properties': {'Params': {'$ref': '#/definitions/ModelTag'}, @@ -517,12 +572,15 @@ class AgentFacade(Type): @ReturnMapping(ErrorResults) async def ClearReboot(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Agent', request='ClearReboot', version=2, params=_params) + msg = dict(type='Agent', + request='ClearReboot', + version=2, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -532,12 +590,33 @@ class AgentFacade(Type): @ReturnMapping(CloudSpecResults) async def CloudSpec(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~CloudSpecResult]<~CloudSpecResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~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(ControllerAPIInfoResults) + async def ControllerAPIInfoForModels(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ControllerAPIInfoResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Agent', request='CloudSpec', version=2, params=_params) + msg = dict(type='Agent', + request='ControllerAPIInfoForModels', + version=2, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -548,11 +627,14 @@ class AgentFacade(Type): async def ControllerConfig(self): ''' - Returns -> typing.Mapping<~KT, +VT_co>[str, typing.Any] + Returns -> typing.Mapping[str, typing.Any] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Agent', request='ControllerConfig', version=2, params=_params) + msg = dict(type='Agent', + request='ControllerConfig', + version=2, + params=_params) reply = await self.rpc(msg) return reply @@ -567,7 +649,10 @@ class AgentFacade(Type): ''' # map input types to rpc msg _params = dict() - msg = dict(type='Agent', request='GetCloudSpec', version=2, params=_params) + msg = dict(type='Agent', + request='GetCloudSpec', + version=2, + params=_params) reply = await self.rpc(msg) return reply @@ -577,12 +662,15 @@ class AgentFacade(Type): @ReturnMapping(AgentGetEntitiesResults) async def GetEntities(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~AgentGetEntitiesResult]<~AgentGetEntitiesResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~AgentGetEntitiesResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Agent', request='GetEntities', version=2, params=_params) + msg = dict(type='Agent', + request='GetEntities', + version=2, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -597,7 +685,10 @@ class AgentFacade(Type): ''' # map input types to rpc msg _params = dict() - msg = dict(type='Agent', request='IsMaster', version=2, params=_params) + msg = dict(type='Agent', + request='IsMaster', + version=2, + params=_params) reply = await self.rpc(msg) return reply @@ -608,11 +699,14 @@ class AgentFacade(Type): async def ModelConfig(self): ''' - Returns -> typing.Mapping<~KT, +VT_co>[str, typing.Any] + Returns -> typing.Mapping[str, typing.Any] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Agent', request='ModelConfig', version=2, params=_params) + msg = dict(type='Agent', + request='ModelConfig', + version=2, + params=_params) reply = await self.rpc(msg) return reply @@ -622,12 +716,15 @@ class AgentFacade(Type): @ReturnMapping(ErrorResults) async def SetPasswords(self, changes): ''' - changes : typing.Sequence<+T_co>[~EntityPassword]<~EntityPassword> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + changes : typing.Sequence[~EntityPassword] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Agent', request='SetPasswords', version=2, params=_params) + msg = dict(type='Agent', + request='SetPasswords', + version=2, + params=_params) _params['changes'] = changes reply = await self.rpc(msg) return reply @@ -642,7 +739,10 @@ class AgentFacade(Type): ''' # map input types to rpc msg _params = dict() - msg = dict(type='Agent', request='StateServingInfo', version=2, params=_params) + msg = dict(type='Agent', + request='StateServingInfo', + version=2, + params=_params) reply = await self.rpc(msg) return reply @@ -652,12 +752,15 @@ class AgentFacade(Type): @ReturnMapping(NotifyWatchResults) async def WatchCredentials(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~NotifyWatchResult]<~NotifyWatchResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~NotifyWatchResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Agent', request='WatchCredentials', version=2, params=_params) + msg = dict(type='Agent', + request='WatchCredentials', + version=2, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -672,7 +775,10 @@ class AgentFacade(Type): ''' # map input types to rpc msg _params = dict() - msg = dict(type='Agent', request='WatchForModelConfigChanges', version=2, params=_params) + msg = dict(type='Agent', + request='WatchForModelConfigChanges', + version=2, + params=_params) reply = await self.rpc(msg) return reply @@ -703,11 +809,14 @@ class AllModelWatcherFacade(Type): async def Next(self): ''' - Returns -> typing.Sequence<+T_co>[~Delta]<~Delta> + Returns -> typing.Sequence[~Delta] ''' # map input types to rpc msg _params = dict() - msg = dict(type='AllModelWatcher', request='Next', version=2, params=_params) + msg = dict(type='AllModelWatcher', + request='Next', + version=2, + params=_params) reply = await self.rpc(msg) return reply @@ -722,7 +831,10 @@ class AllModelWatcherFacade(Type): ''' # map input types to rpc msg _params = dict() - msg = dict(type='AllModelWatcher', request='Stop', version=2, params=_params) + msg = dict(type='AllModelWatcher', + request='Stop', + version=2, + params=_params) reply = await self.rpc(msg) return reply @@ -795,12 +907,15 @@ class AnnotationsFacade(Type): @ReturnMapping(AnnotationsGetResults) async def Get(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~AnnotationsGetResult]<~AnnotationsGetResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~AnnotationsGetResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Annotations', request='Get', version=2, params=_params) + msg = dict(type='Annotations', + request='Get', + version=2, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -810,12 +925,15 @@ class AnnotationsFacade(Type): @ReturnMapping(ErrorResults) async def Set(self, annotations): ''' - annotations : typing.Sequence<+T_co>[~EntityAnnotations]<~EntityAnnotations> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + annotations : typing.Sequence[~EntityAnnotations] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Annotations', request='Set', version=2, params=_params) + msg = dict(type='Annotations', + request='Set', + version=2, + params=_params) _params['annotations'] = annotations reply = await self.rpc(msg) return reply @@ -1119,12 +1237,15 @@ class ApplicationFacade(Type): @ReturnMapping(AddRelationResults) async def AddRelation(self, endpoints): ''' - endpoints : typing.Sequence<+T_co>[str] - Returns -> typing.Mapping<~KT, +VT_co>[str, ~CharmRelation]<~CharmRelation> + endpoints : typing.Sequence[str] + Returns -> typing.Mapping[str, ~CharmRelation] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Application', request='AddRelation', version=2, params=_params) + msg = dict(type='Application', + request='AddRelation', + version=2, + params=_params) _params['endpoints'] = endpoints reply = await self.rpc(msg) return reply @@ -1136,12 +1257,15 @@ class ApplicationFacade(Type): ''' application : str num_units : int - placement : typing.Sequence<+T_co>[~Placement]<~Placement> - Returns -> typing.Sequence<+T_co>[str] + placement : typing.Sequence[~Placement] + Returns -> typing.Sequence[str] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Application', request='AddUnits', version=2, params=_params) + msg = dict(type='Application', + request='AddUnits', + version=2, + params=_params) _params['application'] = application _params['num-units'] = num_units _params['placement'] = placement @@ -1154,11 +1278,14 @@ class ApplicationFacade(Type): async def CharmRelations(self, application): ''' application : str - Returns -> typing.Sequence<+T_co>[str] + Returns -> typing.Sequence[str] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Application', request='CharmRelations', version=2, params=_params) + msg = dict(type='Application', + request='CharmRelations', + version=2, + params=_params) _params['application'] = application reply = await self.rpc(msg) return reply @@ -1168,12 +1295,15 @@ class ApplicationFacade(Type): @ReturnMapping(ErrorResults) async def Deploy(self, applications): ''' - applications : typing.Sequence<+T_co>[~ApplicationDeploy]<~ApplicationDeploy> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + applications : typing.Sequence[~ApplicationDeploy] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Application', request='Deploy', version=2, params=_params) + msg = dict(type='Application', + request='Deploy', + version=2, + params=_params) _params['applications'] = applications reply = await self.rpc(msg) return reply @@ -1188,7 +1318,10 @@ class ApplicationFacade(Type): ''' # map input types to rpc msg _params = dict() - msg = dict(type='Application', request='Destroy', version=2, params=_params) + msg = dict(type='Application', + request='Destroy', + version=2, + params=_params) _params['application'] = application reply = await self.rpc(msg) return reply @@ -1198,12 +1331,15 @@ class ApplicationFacade(Type): @ReturnMapping(None) async def DestroyRelation(self, endpoints): ''' - endpoints : typing.Sequence<+T_co>[str] + endpoints : typing.Sequence[str] Returns -> None ''' # map input types to rpc msg _params = dict() - msg = dict(type='Application', request='DestroyRelation', version=2, params=_params) + msg = dict(type='Application', + request='DestroyRelation', + version=2, + params=_params) _params['endpoints'] = endpoints reply = await self.rpc(msg) return reply @@ -1213,12 +1349,15 @@ class ApplicationFacade(Type): @ReturnMapping(None) async def DestroyUnits(self, unit_names): ''' - unit_names : typing.Sequence<+T_co>[str] + unit_names : typing.Sequence[str] Returns -> None ''' # map input types to rpc msg _params = dict() - msg = dict(type='Application', request='DestroyUnits', version=2, params=_params) + msg = dict(type='Application', + request='DestroyUnits', + version=2, + params=_params) _params['unit-names'] = unit_names reply = await self.rpc(msg) return reply @@ -1233,7 +1372,10 @@ class ApplicationFacade(Type): ''' # map input types to rpc msg _params = dict() - msg = dict(type='Application', request='Expose', version=2, params=_params) + msg = dict(type='Application', + request='Expose', + version=2, + params=_params) _params['application'] = application reply = await self.rpc(msg) return reply @@ -1244,11 +1386,14 @@ class ApplicationFacade(Type): async def Get(self, application): ''' application : str - Returns -> typing.Union[str, typing.Mapping<~KT, +VT_co>[str, typing.Any], _ForwardRef('Value')] + Returns -> typing.Union[str, typing.Mapping[str, typing.Any], _ForwardRef('Value')] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Application', request='Get', version=2, params=_params) + msg = dict(type='Application', + request='Get', + version=2, + params=_params) _params['application'] = application reply = await self.rpc(msg) return reply @@ -1263,7 +1408,10 @@ class ApplicationFacade(Type): ''' # map input types to rpc msg _params = dict() - msg = dict(type='Application', request='GetCharmURL', version=2, params=_params) + msg = dict(type='Application', + request='GetCharmURL', + version=2, + params=_params) _params['application'] = application reply = await self.rpc(msg) return reply @@ -1278,7 +1426,10 @@ class ApplicationFacade(Type): ''' # map input types to rpc msg _params = dict() - msg = dict(type='Application', request='GetConstraints', version=2, params=_params) + msg = dict(type='Application', + request='GetConstraints', + version=2, + params=_params) _params['application'] = application reply = await self.rpc(msg) return reply @@ -1289,12 +1440,15 @@ class ApplicationFacade(Type): async def Set(self, application, options): ''' application : str - options : typing.Mapping<~KT, +VT_co>[str, str] + options : typing.Mapping[str, str] Returns -> None ''' # map input types to rpc msg _params = dict() - msg = dict(type='Application', request='Set', version=2, params=_params) + msg = dict(type='Application', + request='Set', + version=2, + params=_params) _params['application'] = application _params['options'] = options reply = await self.rpc(msg) @@ -1308,17 +1462,20 @@ class ApplicationFacade(Type): application : str channel : str charm_url : str - config_settings : typing.Mapping<~KT, +VT_co>[str, str] + config_settings : typing.Mapping[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> + resource_ids : typing.Mapping[str, str] + storage_constraints : typing.Mapping[str, ~StorageConstraints] Returns -> None ''' # map input types to rpc msg _params = dict() - msg = dict(type='Application', request='SetCharm', version=2, params=_params) + msg = dict(type='Application', + request='SetCharm', + version=2, + params=_params) _params['application'] = application _params['channel'] = channel _params['charm-url'] = charm_url @@ -1342,7 +1499,10 @@ class ApplicationFacade(Type): ''' # map input types to rpc msg _params = dict() - msg = dict(type='Application', request='SetConstraints', version=2, params=_params) + msg = dict(type='Application', + request='SetConstraints', + version=2, + params=_params) _params['application'] = application _params['constraints'] = constraints reply = await self.rpc(msg) @@ -1353,12 +1513,15 @@ class ApplicationFacade(Type): @ReturnMapping(ErrorResults) async def SetMetricCredentials(self, creds): ''' - creds : typing.Sequence<+T_co>[~ApplicationMetricCredential]<~ApplicationMetricCredential> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + creds : typing.Sequence[~ApplicationMetricCredential] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Application', request='SetMetricCredentials', version=2, params=_params) + msg = dict(type='Application', + request='SetMetricCredentials', + version=2, + params=_params) _params['creds'] = creds reply = await self.rpc(msg) return reply @@ -1373,7 +1536,10 @@ class ApplicationFacade(Type): ''' # map input types to rpc msg _params = dict() - msg = dict(type='Application', request='Unexpose', version=2, params=_params) + msg = dict(type='Application', + request='Unexpose', + version=2, + params=_params) _params['application'] = application reply = await self.rpc(msg) return reply @@ -1384,12 +1550,15 @@ class ApplicationFacade(Type): async def Unset(self, application, options): ''' application : str - options : typing.Sequence<+T_co>[str] + options : typing.Sequence[str] Returns -> None ''' # map input types to rpc msg _params = dict() - msg = dict(type='Application', request='Unset', version=2, params=_params) + msg = dict(type='Application', + request='Unset', + version=2, + params=_params) _params['application'] = application _params['options'] = options reply = await self.rpc(msg) @@ -1406,13 +1575,16 @@ class ApplicationFacade(Type): force_charm_url : bool force_series : bool min_units : int - settings : typing.Mapping<~KT, +VT_co>[str, str] + settings : typing.Mapping[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) + msg = dict(type='Application', + request='Update', + version=2, + params=_params) _params['application'] = application _params['charm-url'] = charm_url _params['constraints'] = constraints @@ -1426,30 +1598,103 @@ class ApplicationFacade(Type): -class BlockFacade(Type): - name = 'Block' +class ApplicationOffersFacade(Type): + name = 'ApplicationOffers' 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'}}, + schema = {'definitions': {'AddApplicationOffer': {'additionalProperties': False, + 'properties': {'application-description': {'type': 'string'}, + 'application-name': {'type': 'string'}, + 'endpoints': {'patternProperties': {'.*': {'type': 'string'}}, + 'type': 'object'}, + 'model-tag': {'type': 'string'}, + 'offer-name': {'type': 'string'}}, + 'required': ['model-tag', + 'offer-name', + 'application-name', + 'application-description', + 'endpoints'], + 'type': 'object'}, + 'AddApplicationOffers': {'additionalProperties': False, + 'properties': {'Offers': {'items': {'$ref': '#/definitions/AddApplicationOffer'}, + 'type': 'array'}}, + 'required': ['Offers'], + 'type': 'object'}, + 'ApplicationOfferAdminDetails': {'additionalProperties': False, + 'properties': {'ApplicationOfferDetails': {'$ref': '#/definitions/ApplicationOfferDetails'}, + 'application-name': {'type': 'string'}, + 'charm-url': {'type': 'string'}, + 'connections': {'items': {'$ref': '#/definitions/OfferConnection'}, + 'type': 'array'}}, + 'required': ['ApplicationOfferDetails', + 'application-name', + 'charm-url'], + 'type': 'object'}, + 'ApplicationOfferDetails': {'additionalProperties': False, + 'properties': {'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'}, + 'offer-uuid': {'type': 'string'}, + 'source-model-tag': {'type': 'string'}, + 'spaces': {'items': {'$ref': '#/definitions/RemoteSpace'}, + 'type': 'array'}, + 'users': {'items': {'$ref': '#/definitions/OfferUserDetails'}, + 'type': 'array'}}, + 'required': ['source-model-tag', + 'offer-uuid', + 'offer-url', + 'offer-name', + 'application-description'], + 'type': 'object'}, + 'ApplicationOfferResult': {'additionalProperties': False, + 'properties': {'error': {'$ref': '#/definitions/Error'}, + 'result': {'$ref': '#/definitions/ApplicationOfferAdminDetails'}}, + 'type': 'object'}, + 'ApplicationOffersResults': {'additionalProperties': False, + 'properties': {'results': {'items': {'$ref': '#/definitions/ApplicationOfferResult'}, + 'type': 'array'}}, + 'type': 'object'}, + 'ConsumeOfferDetails': {'additionalProperties': False, + 'properties': {'external-controller': {'$ref': '#/definitions/ExternalControllerInfo'}, + 'macaroon': {'$ref': '#/definitions/Macaroon'}, + 'offer': {'$ref': '#/definitions/ApplicationOfferDetails'}}, + 'type': 'object'}, + 'ConsumeOfferDetailsResult': {'additionalProperties': False, + 'properties': {'ConsumeOfferDetails': {'$ref': '#/definitions/ConsumeOfferDetails'}, + 'error': {'$ref': '#/definitions/Error'}}, + 'required': ['ConsumeOfferDetails'], + 'type': 'object'}, + 'ConsumeOfferDetailsResults': {'additionalProperties': False, + 'properties': {'results': {'items': {'$ref': '#/definitions/ConsumeOfferDetailsResult'}, + 'type': 'array'}}, + 'type': 'object'}, + 'DestroyApplicationOffers': {'additionalProperties': False, + 'properties': {'force': {'type': 'boolean'}, + 'offer-urls': {'items': {'type': 'string'}, + 'type': 'array'}}, + 'required': ['offer-urls'], + 'type': 'object'}, + 'EndpointFilterAttributes': {'additionalProperties': False, + 'properties': {'interface': {'type': 'string'}, + 'name': {'type': 'string'}, + 'role': {'type': 'string'}}, + 'required': ['role', + 'interface', + 'name'], + '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'}, - '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'}, @@ -1463,71 +1708,403 @@ class BlockFacade(Type): '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'}}, + 'ErrorResults': {'additionalProperties': False, + 'properties': {'results': {'items': {'$ref': '#/definitions/ErrorResult'}, + 'type': 'array'}}, + 'required': ['results'], + 'type': 'object'}, + 'ExternalControllerInfo': {'additionalProperties': False, + 'properties': {'addrs': {'items': {'type': 'string'}, + 'type': 'array'}, + 'ca-cert': {'type': 'string'}, + 'controller-alias': {'type': 'string'}, + 'controller-tag': {'type': 'string'}}, + 'required': ['controller-tag', + 'controller-alias', + 'addrs', + 'ca-cert'], + 'type': 'object'}, + 'Macaroon': {'additionalProperties': False, 'type': 'object'}, + 'ModifyOfferAccess': {'additionalProperties': False, + 'properties': {'access': {'type': 'string'}, + 'action': {'type': 'string'}, + 'offer-url': {'type': 'string'}, + 'user-tag': {'type': 'string'}}, + 'required': ['user-tag', + 'action', + 'access', + 'offer-url'], + 'type': 'object'}, + 'ModifyOfferAccessRequest': {'additionalProperties': False, + 'properties': {'changes': {'items': {'$ref': '#/definitions/ModifyOfferAccess'}, + 'type': 'array'}}, + 'required': ['changes'], + 'type': 'object'}, + 'OfferConnection': {'additionalProperties': False, + 'properties': {'endpoint': {'type': 'string'}, + 'ingress-subnets': {'items': {'type': 'string'}, + 'type': 'array'}, + 'relation-id': {'type': 'integer'}, + 'source-model-tag': {'type': 'string'}, + 'status': {'$ref': '#/definitions/EntityStatus'}, + 'username': {'type': 'string'}}, + 'required': ['source-model-tag', + 'relation-id', + 'username', + 'endpoint', + 'status', + 'ingress-subnets'], + 'type': 'object'}, + 'OfferFilter': {'additionalProperties': False, + 'properties': {'allowed-users': {'items': {'type': 'string'}, + 'type': 'array'}, + 'application-description': {'type': 'string'}, + 'application-name': {'type': 'string'}, + 'application-user': {'type': 'string'}, + 'connected-users': {'items': {'type': 'string'}, + 'type': 'array'}, + 'endpoints': {'items': {'$ref': '#/definitions/EndpointFilterAttributes'}, + 'type': 'array'}, + 'model-name': {'type': 'string'}, + 'offer-name': {'type': 'string'}, + 'owner-name': {'type': 'string'}}, + 'required': ['owner-name', + 'model-name', + 'offer-name', + 'application-name', + 'application-description', + 'application-user', + 'endpoints', + 'connected-users', + 'allowed-users'], + 'type': 'object'}, + 'OfferFilters': {'additionalProperties': False, + 'properties': {'Filters': {'items': {'$ref': '#/definitions/OfferFilter'}, + 'type': 'array'}}, + 'required': ['Filters'], + 'type': 'object'}, + 'OfferURLs': {'additionalProperties': False, + 'properties': {'offer-urls': {'items': {'type': 'string'}, + 'type': 'array'}}, + 'type': 'object'}, + 'OfferUserDetails': {'additionalProperties': False, + 'properties': {'access': {'type': 'string'}, + 'display-name': {'type': 'string'}, + 'user': {'type': 'string'}}, + 'required': ['user', + 'display-name', + 'access'], + 'type': 'object'}, + 'QueryApplicationOffersResults': {'additionalProperties': False, + 'properties': {'results': {'items': {'$ref': '#/definitions/ApplicationOfferAdminDetails'}, + 'type': 'array'}}, + 'required': ['results'], + 'type': 'object'}, + 'RemoteApplicationInfo': {'additionalProperties': False, + 'properties': {'description': {'type': 'string'}, + 'endpoints': {'items': {'$ref': '#/definitions/RemoteEndpoint'}, + 'type': 'array'}, + 'icon-url-path': {'type': 'string'}, + 'model-tag': {'type': 'string'}, + 'name': {'type': 'string'}, + 'offer-url': {'type': 'string'}, + 'source-model-label': {'type': 'string'}}, + 'required': ['model-tag', + 'name', + 'description', + 'offer-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'}}, + 'required': ['name', + 'role', + 'interface', + 'limit'], + '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'}, + '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': {'ApplicationOffers': {'properties': {'Params': {'$ref': '#/definitions/OfferURLs'}, + 'Result': {'$ref': '#/definitions/ApplicationOffersResults'}}, + 'type': 'object'}, + 'DestroyOffers': {'properties': {'Params': {'$ref': '#/definitions/DestroyApplicationOffers'}, + 'Result': {'$ref': '#/definitions/ErrorResults'}}, + 'type': 'object'}, + 'FindApplicationOffers': {'properties': {'Params': {'$ref': '#/definitions/OfferFilters'}, + 'Result': {'$ref': '#/definitions/QueryApplicationOffersResults'}}, + 'type': 'object'}, + 'GetConsumeDetails': {'properties': {'Params': {'$ref': '#/definitions/OfferURLs'}, + 'Result': {'$ref': '#/definitions/ConsumeOfferDetailsResults'}}, + 'type': 'object'}, + 'ListApplicationOffers': {'properties': {'Params': {'$ref': '#/definitions/OfferFilters'}, + 'Result': {'$ref': '#/definitions/QueryApplicationOffersResults'}}, + 'type': 'object'}, + 'ModifyOfferAccess': {'properties': {'Params': {'$ref': '#/definitions/ModifyOfferAccessRequest'}, + 'Result': {'$ref': '#/definitions/ErrorResults'}}, + 'type': 'object'}, + 'Offer': {'properties': {'Params': {'$ref': '#/definitions/AddApplicationOffers'}, + 'Result': {'$ref': '#/definitions/ErrorResults'}}, + 'type': 'object'}, + 'RemoteApplicationInfo': {'properties': {'Params': {'$ref': '#/definitions/OfferURLs'}, + 'Result': {'$ref': '#/definitions/RemoteApplicationInfoResults'}}, + 'type': 'object'}}, 'type': 'object'} - @ReturnMapping(BlockResults) - async def List(self): + @ReturnMapping(ApplicationOffersResults) + async def ApplicationOffers(self, offer_urls): + ''' + offer_urls : typing.Sequence[str] + Returns -> typing.Sequence[~ApplicationOfferResult] ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='ApplicationOffers', + request='ApplicationOffers', + version=2, + params=_params) + _params['offer-urls'] = offer_urls + reply = await self.rpc(msg) + return reply + + - Returns -> typing.Sequence<+T_co>[~BlockResult]<~BlockResult> + @ReturnMapping(ErrorResults) + async def DestroyOffers(self, force, offer_urls): + ''' + force : bool + offer_urls : typing.Sequence[str] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Block', request='List', version=2, params=_params) + msg = dict(type='ApplicationOffers', + request='DestroyOffers', + version=2, + params=_params) + _params['force'] = force + _params['offer-urls'] = offer_urls + reply = await self.rpc(msg) + return reply + + + @ReturnMapping(QueryApplicationOffersResults) + async def FindApplicationOffers(self, filters): + ''' + filters : typing.Sequence[~OfferFilter] + Returns -> typing.Sequence[~ApplicationOfferAdminDetails] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='ApplicationOffers', + request='FindApplicationOffers', + version=2, + params=_params) + _params['Filters'] = filters reply = await self.rpc(msg) return reply - @ReturnMapping(ErrorResult) - async def SwitchBlockOff(self, message, type_): + @ReturnMapping(ConsumeOfferDetailsResults) + async def GetConsumeDetails(self, offer_urls): ''' - message : str - type_ : str - Returns -> Error + offer_urls : typing.Sequence[str] + Returns -> typing.Sequence[~ConsumeOfferDetailsResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Block', request='SwitchBlockOff', version=2, params=_params) - _params['message'] = message - _params['type'] = type_ + msg = dict(type='ApplicationOffers', + request='GetConsumeDetails', + version=2, + params=_params) + _params['offer-urls'] = offer_urls reply = await self.rpc(msg) return reply - @ReturnMapping(ErrorResult) - async def SwitchBlockOn(self, message, type_): + @ReturnMapping(QueryApplicationOffersResults) + async def ListApplicationOffers(self, filters): ''' - message : str - type_ : str - Returns -> Error + filters : typing.Sequence[~OfferFilter] + Returns -> typing.Sequence[~ApplicationOfferAdminDetails] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Block', request='SwitchBlockOn', version=2, params=_params) - _params['message'] = message - _params['type'] = type_ + msg = dict(type='ApplicationOffers', + request='ListApplicationOffers', + version=2, + params=_params) + _params['Filters'] = filters reply = await self.rpc(msg) return reply -class CharmRevisionUpdaterFacade(Type): - name = 'CharmRevisionUpdater' + @ReturnMapping(ErrorResults) + async def ModifyOfferAccess(self, changes): + ''' + changes : typing.Sequence[~ModifyOfferAccess] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='ApplicationOffers', + request='ModifyOfferAccess', + version=2, + params=_params) + _params['changes'] = changes + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResults) + async def Offer(self, offers): + ''' + offers : typing.Sequence[~AddApplicationOffer] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='ApplicationOffers', + request='Offer', + version=2, + params=_params) + _params['Offers'] = offers + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(RemoteApplicationInfoResults) + async def RemoteApplicationInfo(self, offer_urls): + ''' + offer_urls : typing.Sequence[str] + Returns -> typing.Sequence[~RemoteApplicationInfoResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='ApplicationOffers', + request='RemoteApplicationInfo', + version=2, + params=_params) + _params['offer-urls'] = offer_urls + reply = await self.rpc(msg) + return reply + + + +class BackupsFacade(Type): + name = 'Backups' version = 2 - schema = {'definitions': {'Error': {'additionalProperties': False, + schema = {'definitions': {'BackupsCreateArgs': {'additionalProperties': False, + 'properties': {'keep-copy': {'type': 'boolean'}, + 'no-download': {'type': 'boolean'}, + 'notes': {'type': 'string'}}, + 'required': ['notes', + 'keep-copy', + 'no-download'], + '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'}, + 'filename': {'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', + 'filename'], + 'type': 'object'}, + 'BackupsRemoveArgs': {'additionalProperties': False, + 'properties': {'ids': {'items': {'type': 'string'}, + 'type': 'array'}}, + 'required': ['ids'], + 'type': 'object'}, + 'Error': {'additionalProperties': False, 'properties': {'code': {'type': 'string'}, 'info': {'$ref': '#/definitions/ErrorInfo'}, 'message': {'type': 'string'}}, @@ -1540,235 +2117,2106 @@ class CharmRevisionUpdaterFacade(Type): 'ErrorResult': {'additionalProperties': False, 'properties': {'error': {'$ref': '#/definitions/Error'}}, 'type': 'object'}, - 'Macaroon': {'additionalProperties': False, 'type': 'object'}}, - 'properties': {'UpdateLatestRevisions': {'properties': {'Result': {'$ref': '#/definitions/ErrorResult'}}, - 'type': 'object'}}, + 'ErrorResults': {'additionalProperties': False, + 'properties': {'results': {'items': {'$ref': '#/definitions/ErrorResult'}, + 'type': 'array'}}, + 'required': ['results'], + 'type': 'object'}, + 'Macaroon': {'additionalProperties': False, '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'}, + 'Result': {'$ref': '#/definitions/ErrorResults'}}, + 'type': 'object'}, + 'Restore': {'properties': {'Params': {'$ref': '#/definitions/RestoreArgs'}}, + 'type': 'object'}}, 'type': 'object'} - @ReturnMapping(ErrorResult) - async def UpdateLatestRevisions(self): + @ReturnMapping(BackupsMetadataResult) + async def Create(self, notes): ''' - - Returns -> Error + notes : str + Returns -> typing.Union[str, int, _ForwardRef('Number')] ''' # map input types to rpc msg _params = dict() - msg = dict(type='CharmRevisionUpdater', request='UpdateLatestRevisions', version=2, params=_params) - + msg = dict(type='Backups', + request='Create', + version=2, + params=_params) + _params['notes'] = notes 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'], + @ReturnMapping(None) + async def FinishRestore(self): + ''' + + Returns -> None + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Backups', + request='FinishRestore', + version=2, + 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=2, + params=_params) + _params['id'] = id_ + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(BackupsListResult) + async def List(self): + ''' + + Returns -> typing.Sequence[~BackupsMetadataResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Backups', + request='List', + version=2, + 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=2, + params=_params) + + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResults) + async def Remove(self, id_): + ''' + id_ : str + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Backups', + request='Remove', + version=2, + 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=2, + params=_params) + _params['backup-id'] = backup_id + 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'}, - 'CharmMetrics': {'additionalProperties': False, - 'properties': {'metrics': {'patternProperties': {'.*': {'$ref': '#/definitions/CharmMetric'}}, - 'type': 'object'}, - 'plan': {'$ref': '#/definitions/CharmPlan'}}, - 'required': ['metrics', 'plan'], + 'BlockResults': {'additionalProperties': False, + 'properties': {'results': {'items': {'$ref': '#/definitions/BlockResult'}, + 'type': 'array'}}, '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'}, + 'BlockSwitchParams': {'additionalProperties': False, + 'properties': {'message': {'type': 'string'}, 'type': {'type': 'string'}}, - 'required': ['name', 'type'], + 'required': ['type'], 'type': 'object'}, - 'CharmPlan': {'additionalProperties': False, - 'properties': {'required': {'type': 'boolean'}}, - 'required': ['required'], + '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'}, - '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'], + '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'}, - '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'}}, + 'SwitchBlockOn': {'properties': {'Params': {'$ref': '#/definitions/BlockSwitchParams'}, + 'Result': {'$ref': '#/definitions/ErrorResult'}}, + 'type': 'object'}}, 'type': 'object'} - @ReturnMapping(CharmInfo) - async def CharmInfo(self, url): + @ReturnMapping(BlockResults) + async def List(self): + ''' + + Returns -> typing.Sequence[~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 BundleFacade(Type): + name = 'Bundle' + version = 2 + 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': {'bundleURL': {'type': 'string'}, + 'yaml': {'type': 'string'}}, + 'required': ['yaml', 'bundleURL'], + 'type': 'object'}, + 'BundleChangesResults': {'additionalProperties': False, + 'properties': {'changes': {'items': {'$ref': '#/definitions/BundleChange'}, + 'type': 'array'}, + 'errors': {'items': {'type': 'string'}, + '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'}, + 'Macaroon': {'additionalProperties': False, 'type': 'object'}, + 'StringResult': {'additionalProperties': False, + 'properties': {'error': {'$ref': '#/definitions/Error'}, + 'result': {'type': 'string'}}, + 'required': ['result'], + 'type': 'object'}}, + 'properties': {'ExportBundle': {'properties': {'Result': {'$ref': '#/definitions/StringResult'}}, + 'type': 'object'}, + 'GetChanges': {'properties': {'Params': {'$ref': '#/definitions/BundleChangesParams'}, + 'Result': {'$ref': '#/definitions/BundleChangesResults'}}, + 'type': 'object'}}, + 'type': 'object'} + + + @ReturnMapping(StringResult) + async def ExportBundle(self): + ''' + + Returns -> typing.Union[_ForwardRef('Error'), str] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Bundle', + request='ExportBundle', + version=2, + params=_params) + + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(BundleChangesResults) + async def GetChanges(self, yaml): + ''' + yaml : str + Returns -> typing.Union[typing.Sequence[~BundleChange], typing.Sequence[str]] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Bundle', + request='GetChanges', + version=2, + params=_params) + _params['yaml'] = yaml + 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'}, + 'CharmDevice': {'additionalProperties': False, + 'properties': {'CountMax': {'type': 'integer'}, + 'CountMin': {'type': 'integer'}, + 'Description': {'type': 'string'}, + 'Name': {'type': 'string'}, + 'Type': {'type': 'string'}}, + 'required': ['Name', + 'Description', + 'Type', + 'CountMin', + 'CountMax'], + 'type': 'object'}, + 'CharmInfo': {'additionalProperties': False, + 'properties': {'actions': {'$ref': '#/definitions/CharmActions'}, + 'config': {'patternProperties': {'.*': {'$ref': '#/definitions/CharmOption'}}, + 'type': 'object'}, + 'lxd-profile': {'$ref': '#/definitions/CharmLXDProfile'}, + 'meta': {'$ref': '#/definitions/CharmMeta'}, + 'metrics': {'$ref': '#/definitions/CharmMetrics'}, + 'revision': {'type': 'integer'}, + 'url': {'type': 'string'}}, + 'required': ['revision', 'url', 'config'], + 'type': 'object'}, + 'CharmLXDProfile': {'additionalProperties': False, + 'properties': {'config': {'patternProperties': {'.*': {'type': 'string'}}, + 'type': 'object'}, + 'description': {'type': 'string'}, + 'devices': {'patternProperties': {'.*': {'patternProperties': {'.*': {'type': 'string'}}, + 'type': 'object'}}, + 'type': 'object'}}, + 'required': ['config', + 'description', + 'devices'], + 'type': 'object'}, + 'CharmMeta': {'additionalProperties': False, + 'properties': {'categories': {'items': {'type': 'string'}, + 'type': 'array'}, + 'description': {'type': 'string'}, + 'devices': {'patternProperties': {'.*': {'$ref': '#/definitions/CharmDevice'}}, + 'type': 'object'}, + '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[str, ~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[str] + Returns -> typing.Sequence[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 ClientFacade(Type): + name = 'Client' + version = 2 + 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'}, + 'force': {'type': 'boolean'}, + 'url': {'type': 'string'}}, + 'required': ['url', 'channel', 'force'], + 'type': 'object'}, + 'AddCharmWithAuthorization': {'additionalProperties': False, + 'properties': {'channel': {'type': 'string'}, + 'force': {'type': 'boolean'}, + 'macaroon': {'$ref': '#/definitions/Macaroon'}, + 'url': {'type': 'string'}}, + 'required': ['url', + 'channel', + 'macaroon', + 'force'], + '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'}, + 'ApplicationOfferStatus': {'additionalProperties': False, + 'properties': {'active-connected-count': {'type': 'integer'}, + 'application-name': {'type': 'string'}, + 'charm': {'type': 'string'}, + 'endpoints': {'patternProperties': {'.*': {'$ref': '#/definitions/RemoteEndpoint'}}, + 'type': 'object'}, + 'err': {'additionalProperties': True, + 'type': 'object'}, + 'offer-name': {'type': 'string'}, + 'total-connected-count': {'type': 'integer'}}, + 'required': ['offer-name', + 'application-name', + 'charm', + 'endpoints', + 'active-connected-count', + 'total-connected-count'], + 'type': 'object'}, + 'ApplicationStatus': {'additionalProperties': False, + 'properties': {'can-upgrade-to': {'type': 'string'}, + 'charm': {'type': 'string'}, + 'charm-verion': {'type': 'string'}, + 'endpoint-bindings': {'patternProperties': {'.*': {'type': 'string'}}, + 'type': 'object'}, + 'err': {'additionalProperties': True, + 'type': 'object'}, + 'exposed': {'type': 'boolean'}, + 'int': {'type': 'integer'}, + 'life': {'type': 'string'}, + 'meter-statuses': {'patternProperties': {'.*': {'$ref': '#/definitions/MeterStatus'}}, + 'type': 'object'}, + 'provider-id': {'type': 'string'}, + 'public-address': {'type': 'string'}, + 'relations': {'patternProperties': {'.*': {'items': {'type': 'string'}, + 'type': 'array'}}, + 'type': 'object'}, + 'series': {'type': 'string'}, + 'status': {'$ref': '#/definitions/DetailedStatus'}, + 'string': {'type': 'string'}, + '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', + 'charm-verion', + 'endpoint-bindings', + 'public-address'], + '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': {'bundleURL': {'type': 'string'}, + 'yaml': {'type': 'string'}}, + 'required': ['yaml', 'bundleURL'], + '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': {'agentstream': {'type': 'string'}, + 'arch': {'type': 'string'}, + 'major': {'type': 'integer'}, + 'minor': {'type': 'integer'}, + 'number': {'$ref': '#/definitions/Number'}, + 'series': {'type': 'string'}}, + 'required': ['number', + 'major', + 'minor', + 'arch', + 'series', + 'agentstream'], + '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'}, + 'controller-timestamp': {'format': 'date-time', + 'type': 'string'}, + 'machines': {'patternProperties': {'.*': {'$ref': '#/definitions/MachineStatus'}}, + 'type': 'object'}, + 'model': {'$ref': '#/definitions/ModelStatusInfo'}, + 'offers': {'patternProperties': {'.*': {'$ref': '#/definitions/ApplicationOfferStatus'}}, + 'type': 'object'}, + 'relations': {'items': {'$ref': '#/definitions/RelationStatus'}, + 'type': 'array'}, + 'remote-applications': {'patternProperties': {'.*': {'$ref': '#/definitions/RemoteApplicationStatus'}}, + 'type': 'object'}}, + 'required': ['model', + 'machines', + 'applications', + 'remote-applications', + 'offers', + 'relations', + 'controller-timestamp'], + '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'}, + 'LXDProfile': {'additionalProperties': False, + 'properties': {'config': {'patternProperties': {'.*': {'type': 'string'}}, + 'type': 'object'}, + 'description': {'type': 'string'}, + 'devices': {'patternProperties': {'.*': {'patternProperties': {'.*': {'type': 'string'}}, + 'type': 'object'}}, + 'type': 'object'}}, + 'required': ['config', + 'description', + 'devices'], + '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'}, + 'lxd-profiles': {'patternProperties': {'.*': {'$ref': '#/definitions/LXDProfile'}}, + 'type': 'object'}, + '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'}, + 'type': {'type': 'string'}, + 'users': {'items': {'$ref': '#/definitions/ModelUserInfo'}, + 'type': 'array'}, + 'uuid': {'type': 'string'}}, + 'required': ['name', + 'type', + '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'}, + 'message': {'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'}, + 'type': {'type': 'string'}, + 'version': {'type': 'string'}}, + 'required': ['name', + 'type', + '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'}, + 'status': {'$ref': '#/definitions/DetailedStatus'}}, + 'required': ['id', + 'key', + 'interface', + 'scope', + 'endpoints', + 'status'], + 'type': 'object'}, + 'RemoteApplicationStatus': {'additionalProperties': False, + 'properties': {'endpoints': {'items': {'$ref': '#/definitions/RemoteEndpoint'}, + 'type': 'array'}, + 'err': {'additionalProperties': True, + 'type': 'object'}, + 'life': {'type': 'string'}, + 'offer-name': {'type': 'string'}, + 'offer-url': {'type': 'string'}, + 'relations': {'patternProperties': {'.*': {'items': {'type': 'string'}, + 'type': 'array'}}, + 'type': 'object'}, + 'status': {'$ref': '#/definitions/DetailedStatus'}}, + 'required': ['offer-url', + 'offer-name', + 'endpoints', + 'life', + 'relations', + 'status'], + 'type': 'object'}, + 'RemoteEndpoint': {'additionalProperties': False, + 'properties': {'interface': {'type': 'string'}, + 'limit': {'type': 'integer'}, + 'name': {'type': 'string'}, + 'role': {'type': 'string'}}, + 'required': ['name', + 'role', + 'interface', + 'limit'], + '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': {'force': {'type': 'boolean'}, + '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': {'address': {'type': 'string'}, + 'agent-status': {'$ref': '#/definitions/DetailedStatus'}, + 'charm': {'type': 'string'}, + 'leader': {'type': 'boolean'}, + 'machine': {'type': 'string'}, + 'opened-ports': {'items': {'type': 'string'}, + 'type': 'array'}, + 'provider-id': {'type': 'string'}, + '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'}, + 'zones': {'items': {'type': 'string'}, + 'type': 'array'}}, + '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[~HostPort] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Client', + request='APIHostPorts', + version=2, + 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=2, + 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=2, + 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=2, + 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[~AddMachineParams] + Returns -> typing.Sequence[~AddMachinesResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Client', + request='AddMachines', + version=2, + params=_params) + _params['params'] = params + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(AddMachinesResults) + async def AddMachinesV2(self, params): + ''' + params : typing.Sequence[~AddMachineParams] + Returns -> typing.Sequence[~AddMachinesResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Client', + request='AddMachinesV2', + version=2, + 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=2, + params=_params) + + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(BytesResult) + async def CACert(self): + ''' + + Returns -> typing.Sequence[int] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Client', + request='CACert', + version=2, + params=_params) + + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(None) + async def DestroyMachines(self, force, machine_names): + ''' + force : bool + machine_names : typing.Sequence[str] + Returns -> None + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Client', + request='DestroyMachines', + version=2, + 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[~Tools]] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Client', + request='FindTools', + version=2, + 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[str] + Returns -> typing.Union[typing.Mapping[str, ~ApplicationStatus], str, typing.Mapping[str, ~MachineStatus], _ForwardRef('ModelStatusInfo'), typing.Mapping[str, ~ApplicationOfferStatus], typing.Sequence[~RelationStatus], typing.Mapping[str, ~RemoteApplicationStatus]] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Client', + request='FullStatus', + version=2, + params=_params) + _params['patterns'] = patterns + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(BundleChangesResults) + async def GetBundleChanges(self, yaml): + ''' + yaml : str + Returns -> typing.Union[typing.Sequence[~BundleChange], typing.Sequence[str]] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Client', + request='GetBundleChanges', + version=2, + 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=2, + params=_params) + + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(AddMachinesResults) + async def InjectMachines(self, params): + ''' + params : typing.Sequence[~AddMachineParams] + Returns -> typing.Sequence[~AddMachinesResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Client', + request='InjectMachines', + version=2, + params=_params) + _params['params'] = params + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ModelConfigResults) + async def ModelGet(self): + ''' + + Returns -> typing.Mapping[str, ~ConfigValue] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Client', + request='ModelGet', + version=2, + params=_params) + + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ModelInfo) + async def ModelInfo(self): + ''' + + Returns -> typing.Union[_ForwardRef('Number'), str, typing.Sequence[~ModelMachineInfo], _ForwardRef('ModelMigrationStatus'), _ForwardRef('ModelSLAInfo'), _ForwardRef('EntityStatus'), typing.Sequence[~ModelUserInfo]] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Client', + request='ModelInfo', + version=2, + params=_params) + + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(None) + async def ModelSet(self, config): + ''' + config : typing.Mapping[str, typing.Any] + Returns -> None + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Client', + request='ModelSet', + version=2, + params=_params) + _params['config'] = config + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(None) + async def ModelUnset(self, keys): + ''' + keys : typing.Sequence[str] + Returns -> None + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Client', + request='ModelUnset', + version=2, + params=_params) + _params['keys'] = keys + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ModelUserInfoResults) + async def ModelUserInfo(self): + ''' + + Returns -> typing.Sequence[~ModelUserInfoResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Client', + request='ModelUserInfo', + version=2, + 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=2, + 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=2, + 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=2, + params=_params) + _params['target'] = target + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ResolveCharmResults) + async def ResolveCharms(self, references): + ''' + references : typing.Sequence[str] + Returns -> typing.Sequence[~ResolveCharmResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Client', + request='ResolveCharms', + version=2, + 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=2, + params=_params) + _params['retry'] = retry + _params['unit-name'] = unit_name + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResults) + async def RetryProvisioning(self, entities): ''' - url : str - Returns -> typing.Union[_ForwardRef('CharmActions'), typing.Mapping<~KT, +VT_co>[str, ~CharmOption]<~CharmOption>, _ForwardRef('CharmMeta'), _ForwardRef('CharmMetrics'), int, str] + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Charms', request='CharmInfo', version=2, params=_params) - _params['url'] = url + msg = dict(type='Client', + request='RetryProvisioning', + version=2, + params=_params) + _params['entities'] = entities reply = await self.rpc(msg) return reply - @ReturnMapping(IsMeteredResult) - async def IsMetered(self, url): + @ReturnMapping(StringResult) + async def SLALevel(self): ''' - url : str - Returns -> bool + + Returns -> typing.Union[_ForwardRef('Error'), str] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Charms', request='IsMetered', version=2, params=_params) - _params['url'] = url + msg = dict(type='Client', + request='SLALevel', + version=2, + params=_params) + reply = await self.rpc(msg) return reply - @ReturnMapping(CharmsListResult) - async def List(self, names): + @ReturnMapping(None) + async def SetModelAgentVersion(self, version): ''' - names : typing.Sequence<+T_co>[str] - Returns -> typing.Sequence<+T_co>[str] + version : Number + Returns -> None ''' # map input types to rpc msg _params = dict() - msg = dict(type='Charms', request='List', version=2, params=_params) - _params['names'] = names + msg = dict(type='Client', + request='SetModelAgentVersion', + version=2, + params=_params) + _params['version'] = version reply = await self.rpc(msg) return reply -class CleanerFacade(Type): - name = 'Cleaner' + @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=2, + 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[int] + level : str + Returns -> None + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Client', + request='SetSLALevel', + version=2, + 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[~StatusHistoryRequest] + Returns -> typing.Sequence[~StatusHistoryResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Client', + request='StatusHistory', + version=2, + 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=2, + params=_params) + + reply = await self.rpc(msg) + return reply + + + +class CredentialValidatorFacade(Type): + name = 'CredentialValidator' version = 2 - schema = {'definitions': {'Error': {'additionalProperties': False, + schema = {'definitions': {'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'}}, @@ -1778,27 +4226,69 @@ class CleanerFacade(Type): 'properties': {'macaroon': {'$ref': '#/definitions/Macaroon'}, 'macaroon-path': {'type': 'string'}}, 'type': 'object'}, + 'ErrorResult': {'additionalProperties': False, + 'properties': {'error': {'$ref': '#/definitions/Error'}}, + 'type': 'object'}, + 'InvalidateCredentialArg': {'additionalProperties': False, + 'properties': {'reason': {'type': 'string'}}, + 'type': 'object'}, 'Macaroon': {'additionalProperties': False, 'type': 'object'}, + 'ModelCredential': {'additionalProperties': False, + 'properties': {'credential-tag': {'type': 'string'}, + 'exists': {'type': 'boolean'}, + 'model-tag': {'type': 'string'}, + 'valid': {'type': 'boolean'}}, + 'required': ['model-tag', + 'credential-tag'], + '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'}}, + 'properties': {'InvalidateModelCredential': {'properties': {'Params': {'$ref': '#/definitions/InvalidateCredentialArg'}, + 'Result': {'$ref': '#/definitions/ErrorResult'}}, + 'type': 'object'}, + 'ModelCredential': {'properties': {'Result': {'$ref': '#/definitions/ModelCredential'}}, + 'type': 'object'}, + 'WatchCredential': {'properties': {'Params': {'$ref': '#/definitions/Entity'}, + 'Result': {'$ref': '#/definitions/NotifyWatchResult'}}, + 'type': 'object'}, + 'WatchModelCredential': {'properties': {'Result': {'$ref': '#/definitions/NotifyWatchResult'}}, + 'type': 'object'}}, 'type': 'object'} - @ReturnMapping(None) - async def Cleanup(self): + @ReturnMapping(ErrorResult) + async def InvalidateModelCredential(self, reason): + ''' + reason : str + Returns -> Error + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='CredentialValidator', + request='InvalidateModelCredential', + version=2, + params=_params) + _params['reason'] = reason + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ModelCredential) + async def ModelCredential(self): ''' - Returns -> None + Returns -> typing.Union[str, bool] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Cleaner', request='Cleanup', version=2, params=_params) + msg = dict(type='CredentialValidator', + request='ModelCredential', + version=2, + params=_params) reply = await self.rpc(msg) return reply @@ -1806,14 +4296,35 @@ class CleanerFacade(Type): @ReturnMapping(NotifyWatchResult) - async def WatchCleanups(self): + async def WatchCredential(self, tag): + ''' + tag : str + Returns -> typing.Union[str, _ForwardRef('Error')] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='CredentialValidator', + request='WatchCredential', + version=2, + params=_params) + _params['tag'] = tag + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(NotifyWatchResult) + async def WatchModelCredential(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) + msg = dict(type='CredentialValidator', + request='WatchModelCredential', + version=2, + params=_params) reply = await self.rpc(msg) return reply @@ -1938,12 +4449,15 @@ class DiscoverSpacesFacade(Type): @ReturnMapping(ErrorResults) async def AddSubnets(self, subnets): ''' - subnets : typing.Sequence<+T_co>[~AddSubnetParams]<~AddSubnetParams> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + subnets : typing.Sequence[~AddSubnetParams] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='DiscoverSpaces', request='AddSubnets', version=2, params=_params) + msg = dict(type='DiscoverSpaces', + request='AddSubnets', + version=2, + params=_params) _params['subnets'] = subnets reply = await self.rpc(msg) return reply @@ -1953,12 +4467,15 @@ class DiscoverSpacesFacade(Type): @ReturnMapping(ErrorResults) async def CreateSpaces(self, spaces): ''' - spaces : typing.Sequence<+T_co>[~CreateSpaceParams]<~CreateSpaceParams> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + spaces : typing.Sequence[~CreateSpaceParams] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='DiscoverSpaces', request='CreateSpaces', version=2, params=_params) + msg = dict(type='DiscoverSpaces', + request='CreateSpaces', + version=2, + params=_params) _params['spaces'] = spaces reply = await self.rpc(msg) return reply @@ -1969,11 +4486,14 @@ class DiscoverSpacesFacade(Type): async def ListSpaces(self): ''' - Returns -> typing.Sequence<+T_co>[~ProviderSpace]<~ProviderSpace> + Returns -> typing.Sequence[~ProviderSpace] ''' # map input types to rpc msg _params = dict() - msg = dict(type='DiscoverSpaces', request='ListSpaces', version=2, params=_params) + msg = dict(type='DiscoverSpaces', + request='ListSpaces', + version=2, + params=_params) reply = await self.rpc(msg) return reply @@ -1985,11 +4505,14 @@ class DiscoverSpacesFacade(Type): ''' space_tag : str zone : str - Returns -> typing.Sequence<+T_co>[~Subnet]<~Subnet> + Returns -> typing.Sequence[~Subnet] ''' # map input types to rpc msg _params = dict() - msg = dict(type='DiscoverSpaces', request='ListSubnets', version=2, params=_params) + msg = dict(type='DiscoverSpaces', + request='ListSubnets', + version=2, + params=_params) _params['space-tag'] = space_tag _params['zone'] = zone reply = await self.rpc(msg) @@ -2001,11 +4524,14 @@ class DiscoverSpacesFacade(Type): async def ModelConfig(self): ''' - Returns -> typing.Mapping<~KT, +VT_co>[str, typing.Any] + Returns -> typing.Mapping[str, typing.Any] ''' # map input types to rpc msg _params = dict() - msg = dict(type='DiscoverSpaces', request='ModelConfig', version=2, params=_params) + msg = dict(type='DiscoverSpaces', + request='ModelConfig', + version=2, + params=_params) reply = await self.rpc(msg) return reply @@ -2079,12 +4605,15 @@ class DiskManagerFacade(Type): @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> + machine_block_devices : typing.Sequence[~MachineBlockDevices] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='DiskManager', request='SetMachineBlockDevices', version=2, params=_params) + msg = dict(type='DiskManager', + request='SetMachineBlockDevices', + version=2, + params=_params) _params['machine-block-devices'] = machine_block_devices reply = await self.rpc(msg) return reply @@ -2122,11 +4651,14 @@ class EntityWatcherFacade(Type): async def Next(self): ''' - Returns -> typing.Union[typing.Sequence<+T_co>[str], _ForwardRef('Error')] + Returns -> typing.Union[typing.Sequence[str], _ForwardRef('Error'), str] ''' # map input types to rpc msg _params = dict() - msg = dict(type='EntityWatcher', request='Next', version=2, params=_params) + msg = dict(type='EntityWatcher', + request='Next', + version=2, + params=_params) reply = await self.rpc(msg) return reply @@ -2141,7 +4673,10 @@ class EntityWatcherFacade(Type): ''' # map input types to rpc msg _params = dict() - msg = dict(type='EntityWatcher', request='Stop', version=2, params=_params) + msg = dict(type='EntityWatcher', + request='Stop', + version=2, + params=_params) reply = await self.rpc(msg) return reply @@ -2186,11 +4721,14 @@ class FilesystemAttachmentsWatcherFacade(Type): async def Next(self): ''' - Returns -> typing.Union[typing.Sequence<+T_co>[~MachineStorageId]<~MachineStorageId>, _ForwardRef('Error')] + Returns -> typing.Union[typing.Sequence[~MachineStorageId], _ForwardRef('Error'), str] ''' # map input types to rpc msg _params = dict() - msg = dict(type='FilesystemAttachmentsWatcher', request='Next', version=2, params=_params) + msg = dict(type='FilesystemAttachmentsWatcher', + request='Next', + version=2, + params=_params) reply = await self.rpc(msg) return reply @@ -2205,7 +4743,10 @@ class FilesystemAttachmentsWatcherFacade(Type): ''' # map input types to rpc msg _params = dict() - msg = dict(type='FilesystemAttachmentsWatcher', request='Stop', version=2, params=_params) + msg = dict(type='FilesystemAttachmentsWatcher', + request='Stop', + version=2, + params=_params) reply = await self.rpc(msg) return reply @@ -2283,23 +4824,15 @@ class HighAvailabilityFacade(Type): '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, @@ -2343,7 +4876,9 @@ class HighAvailabilityFacade(Type): 'type': 'array'}, 'tags': {'items': {'type': 'string'}, 'type': 'array'}, - 'virt-type': {'type': 'string'}}, + 'virt-type': {'type': 'string'}, + 'zones': {'items': {'type': 'string'}, + 'type': 'array'}}, 'type': 'object'}}, 'properties': {'EnableHA': {'properties': {'Params': {'$ref': '#/definitions/ControllersSpecs'}, 'Result': {'$ref': '#/definitions/ControllersChangeResults'}}, @@ -2359,12 +4894,15 @@ class HighAvailabilityFacade(Type): @ReturnMapping(ControllersChangeResults) async def EnableHA(self, specs): ''' - specs : typing.Sequence<+T_co>[~ControllersSpec]<~ControllersSpec> - Returns -> typing.Sequence<+T_co>[~ControllersChangeResult]<~ControllersChangeResult> + specs : typing.Sequence[~ControllersSpec] + Returns -> typing.Sequence[~ControllersChangeResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='HighAvailability', request='EnableHA', version=2, params=_params) + msg = dict(type='HighAvailability', + request='EnableHA', + version=2, + params=_params) _params['specs'] = specs reply = await self.rpc(msg) return reply @@ -2374,12 +4912,15 @@ class HighAvailabilityFacade(Type): @ReturnMapping(None) async def ResumeHAReplicationAfterUpgrade(self, members): ''' - members : typing.Sequence<+T_co>[~Member]<~Member> + members : typing.Sequence[~Member] Returns -> None ''' # map input types to rpc msg _params = dict() - msg = dict(type='HighAvailability', request='ResumeHAReplicationAfterUpgrade', version=2, params=_params) + msg = dict(type='HighAvailability', + request='ResumeHAReplicationAfterUpgrade', + version=2, + params=_params) _params['members'] = members reply = await self.rpc(msg) return reply @@ -2390,11 +4931,14 @@ class HighAvailabilityFacade(Type): async def StopHAReplicationForUpgrade(self, target): ''' target : MongoVersion - Returns -> typing.Union[_ForwardRef('HAMember'), typing.Sequence<+T_co>[~Member]<~Member>] + Returns -> typing.Union[typing.Sequence[~HAMember], _ForwardRef('HAMember'), typing.Sequence[~Member]] ''' # map input types to rpc msg _params = dict() - msg = dict(type='HighAvailability', request='StopHAReplicationForUpgrade', version=2, params=_params) + msg = dict(type='HighAvailability', + request='StopHAReplicationForUpgrade', + version=2, + params=_params) _params['target'] = target reply = await self.rpc(msg) return reply @@ -2464,12 +5008,15 @@ class ImageManagerFacade(Type): @ReturnMapping(ErrorResults) async def DeleteImages(self, images): ''' - images : typing.Sequence<+T_co>[~ImageSpec]<~ImageSpec> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + images : typing.Sequence[~ImageSpec] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='ImageManager', request='DeleteImages', version=2, params=_params) + msg = dict(type='ImageManager', + request='DeleteImages', + version=2, + params=_params) _params['images'] = images reply = await self.rpc(msg) return reply @@ -2479,12 +5026,15 @@ class ImageManagerFacade(Type): @ReturnMapping(ListImageResult) async def ListImages(self, images): ''' - images : typing.Sequence<+T_co>[~ImageSpec]<~ImageSpec> - Returns -> typing.Sequence<+T_co>[~ImageMetadata]<~ImageMetadata> + images : typing.Sequence[~ImageSpec] + Returns -> typing.Sequence[~ImageMetadata] ''' # map input types to rpc msg _params = dict() - msg = dict(type='ImageManager', request='ListImages', version=2, params=_params) + msg = dict(type='ImageManager', + request='ListImages', + version=2, + params=_params) _params['images'] = images reply = await self.rpc(msg) return reply @@ -2577,12 +5127,15 @@ class ImageMetadataFacade(Type): @ReturnMapping(ErrorResults) async def Delete(self, image_ids): ''' - image_ids : typing.Sequence<+T_co>[str] - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + image_ids : typing.Sequence[str] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='ImageMetadata', request='Delete', version=2, params=_params) + msg = dict(type='ImageMetadata', + request='Delete', + version=2, + params=_params) _params['image-ids'] = image_ids reply = await self.rpc(msg) return reply @@ -2592,17 +5145,20 @@ class ImageMetadataFacade(Type): @ReturnMapping(ListCloudImageMetadataResult) async def List(self, arches, region, root_storage_type, series, stream, virt_type): ''' - arches : typing.Sequence<+T_co>[str] + arches : typing.Sequence[str] region : str root_storage_type : str - series : typing.Sequence<+T_co>[str] + series : typing.Sequence[str] stream : str virt_type : str - Returns -> typing.Sequence<+T_co>[~CloudImageMetadata]<~CloudImageMetadata> + Returns -> typing.Sequence[~CloudImageMetadata] ''' # map input types to rpc msg _params = dict() - msg = dict(type='ImageMetadata', request='List', version=2, params=_params) + msg = dict(type='ImageMetadata', + request='List', + version=2, + params=_params) _params['arches'] = arches _params['region'] = region _params['root-storage-type'] = root_storage_type @@ -2617,12 +5173,15 @@ class ImageMetadataFacade(Type): @ReturnMapping(ErrorResults) async def Save(self, metadata): ''' - metadata : typing.Sequence<+T_co>[~CloudImageMetadataList]<~CloudImageMetadataList> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + metadata : typing.Sequence[~CloudImageMetadataList] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='ImageMetadata', request='Save', version=2, params=_params) + msg = dict(type='ImageMetadata', + request='Save', + version=2, + params=_params) _params['metadata'] = metadata reply = await self.rpc(msg) return reply @@ -2637,7 +5196,10 @@ class ImageMetadataFacade(Type): ''' # map input types to rpc msg _params = dict() - msg = dict(type='ImageMetadata', request='UpdateFromPublishedImages', version=2, params=_params) + msg = dict(type='ImageMetadata', + request='UpdateFromPublishedImages', + version=2, + params=_params) reply = await self.rpc(msg) return reply @@ -2700,7 +5262,10 @@ class LeadershipServiceFacade(Type): ''' # map input types to rpc msg _params = dict() - msg = dict(type='LeadershipService', request='BlockUntilLeadershipReleased', version=2, params=_params) + msg = dict(type='LeadershipService', + request='BlockUntilLeadershipReleased', + version=2, + params=_params) _params['Name'] = name reply = await self.rpc(msg) return reply @@ -2710,12 +5275,15 @@ class LeadershipServiceFacade(Type): @ReturnMapping(ClaimLeadershipBulkResults) async def ClaimLeadership(self, params): ''' - params : typing.Sequence<+T_co>[~ClaimLeadershipParams]<~ClaimLeadershipParams> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + params : typing.Sequence[~ClaimLeadershipParams] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='LeadershipService', request='ClaimLeadership', version=2, params=_params) + msg = dict(type='LeadershipService', + request='ClaimLeadership', + version=2, + params=_params) _params['params'] = params reply = await self.rpc(msg) return reply @@ -2863,12 +5431,15 @@ class MachineManagerFacade(Type): @ReturnMapping(AddMachinesResults) async def AddMachines(self, params): ''' - params : typing.Sequence<+T_co>[~AddMachineParams]<~AddMachineParams> - Returns -> typing.Sequence<+T_co>[~AddMachinesResult]<~AddMachinesResult> + params : typing.Sequence[~AddMachineParams] + Returns -> typing.Sequence[~AddMachinesResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='MachineManager', request='AddMachines', version=2, params=_params) + msg = dict(type='MachineManager', + request='AddMachines', + version=2, + params=_params) _params['params'] = params reply = await self.rpc(msg) return reply @@ -2878,12 +5449,15 @@ class MachineManagerFacade(Type): @ReturnMapping(InstanceTypesResults) async def InstanceTypes(self, constraints): ''' - constraints : typing.Sequence<+T_co>[~ModelInstanceTypesConstraint]<~ModelInstanceTypesConstraint> - Returns -> typing.Sequence<+T_co>[~InstanceTypesResult]<~InstanceTypesResult> + constraints : typing.Sequence[~ModelInstanceTypesConstraint] + Returns -> typing.Sequence[~InstanceTypesResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='MachineManager', request='InstanceTypes', version=2, params=_params) + msg = dict(type='MachineManager', + request='InstanceTypes', + version=2, + params=_params) _params['constraints'] = constraints reply = await self.rpc(msg) return reply @@ -2914,6 +5488,8 @@ class MetricsAdderFacade(Type): 'Macaroon': {'additionalProperties': False, 'type': 'object'}, 'Metric': {'additionalProperties': False, 'properties': {'key': {'type': 'string'}, + 'labels': {'patternProperties': {'.*': {'type': 'string'}}, + 'type': 'object'}, 'time': {'format': 'date-time', 'type': 'string'}, 'value': {'type': 'string'}}, @@ -2950,12 +5526,15 @@ class MetricsAdderFacade(Type): @ReturnMapping(ErrorResults) async def AddMetricBatches(self, batches): ''' - batches : typing.Sequence<+T_co>[~MetricBatchParam]<~MetricBatchParam> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + batches : typing.Sequence[~MetricBatchParam] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='MetricsAdder', request='AddMetricBatches', version=2, params=_params) + msg = dict(type='MetricsAdder', + request='AddMetricBatches', + version=2, + params=_params) _params['batches'] = batches reply = await self.rpc(msg) return reply @@ -3002,7 +5581,7 @@ class MetricsDebugFacade(Type): 'properties': {'code': {'type': 'string'}, 'info': {'type': 'string'}, 'tag': {'type': 'string'}}, - 'required': ['tag', 'code', 'info'], + 'required': ['tag', 'code'], 'type': 'object'}, 'MeterStatusParams': {'additionalProperties': False, 'properties': {'statues': {'items': {'$ref': '#/definitions/MeterStatusParam'}, @@ -3011,11 +5590,17 @@ class MetricsDebugFacade(Type): 'type': 'object'}, 'MetricResult': {'additionalProperties': False, 'properties': {'key': {'type': 'string'}, + 'labels': {'patternProperties': {'.*': {'type': 'string'}}, + 'type': 'object'}, 'time': {'format': 'date-time', 'type': 'string'}, 'unit': {'type': 'string'}, 'value': {'type': 'string'}}, - 'required': ['time', 'key', 'value', 'unit'], + 'required': ['time', + 'key', + 'value', + 'unit', + 'labels'], 'type': 'object'}, 'MetricResults': {'additionalProperties': False, 'properties': {'results': {'items': {'$ref': '#/definitions/EntityMetrics'}, @@ -3034,12 +5619,15 @@ class MetricsDebugFacade(Type): @ReturnMapping(MetricResults) async def GetMetrics(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~EntityMetrics]<~EntityMetrics> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~EntityMetrics] ''' # map input types to rpc msg _params = dict() - msg = dict(type='MetricsDebug', request='GetMetrics', version=2, params=_params) + msg = dict(type='MetricsDebug', + request='GetMetrics', + version=2, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -3049,18 +5637,203 @@ class MetricsDebugFacade(Type): @ReturnMapping(ErrorResults) async def SetMeterStatus(self, statues): ''' - statues : typing.Sequence<+T_co>[~MeterStatusParam]<~MeterStatusParam> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + statues : typing.Sequence[~MeterStatusParam] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='MetricsDebug', request='SetMeterStatus', version=2, params=_params) + msg = dict(type='MetricsDebug', + request='SetMeterStatus', + version=2, + params=_params) _params['statues'] = statues reply = await self.rpc(msg) return reply +class ModelConfigFacade(Type): + name = 'ModelConfig' + version = 2 + 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'}, + 'ModelSequencesResult': {'additionalProperties': False, + 'properties': {'sequences': {'patternProperties': {'.*': {'type': 'integer'}}, + 'type': 'object'}}, + 'required': ['sequences'], + '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'}, + 'Sequences': {'properties': {'Result': {'$ref': '#/definitions/ModelSequencesResult'}}, + 'type': 'object'}, + 'SetSLALevel': {'properties': {'Params': {'$ref': '#/definitions/ModelSLA'}}, + 'type': 'object'}}, + 'type': 'object'} + + + @ReturnMapping(ModelConfigResults) + async def ModelGet(self): + ''' + + Returns -> typing.Mapping[str, ~ConfigValue] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='ModelConfig', + request='ModelGet', + version=2, + params=_params) + + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(None) + async def ModelSet(self, config): + ''' + config : typing.Mapping[str, typing.Any] + Returns -> None + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='ModelConfig', + request='ModelSet', + version=2, + params=_params) + _params['config'] = config + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(None) + async def ModelUnset(self, keys): + ''' + keys : typing.Sequence[str] + Returns -> None + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='ModelConfig', + request='ModelUnset', + version=2, + 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=2, + params=_params) + + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ModelSequencesResult) + async def Sequences(self): + ''' + + Returns -> typing.Mapping[str, int] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='ModelConfig', + request='Sequences', + version=2, + params=_params) + + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(None) + async def SetSLALevel(self, creds, level): + ''' + creds : typing.Sequence[int] + level : str + Returns -> None + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='ModelConfig', + request='SetSLALevel', + version=2, + params=_params) + _params['creds'] = creds + _params['level'] = level + reply = await self.rpc(msg) + return reply + + + class ModelManagerFacade(Type): name = 'ModelManager' version = 2 @@ -3353,16 +6126,19 @@ class ModelManagerFacade(Type): async def CreateModel(self, cloud_tag, config, credential, name, owner_tag, region): ''' cloud_tag : str - config : typing.Mapping<~KT, +VT_co>[str, typing.Any] + config : typing.Mapping[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>] + Returns -> typing.Union[_ForwardRef('Number'), str, typing.Sequence[~ModelMachineInfo], _ForwardRef('ModelMigrationStatus'), _ForwardRef('ModelSLAInfo'), _ForwardRef('EntityStatus'), typing.Sequence[~ModelUserInfo]] ''' # map input types to rpc msg _params = dict() - msg = dict(type='ModelManager', request='CreateModel', version=2, params=_params) + msg = dict(type='ModelManager', + request='CreateModel', + version=2, + params=_params) _params['cloud-tag'] = cloud_tag _params['config'] = config _params['credential'] = credential @@ -3377,12 +6153,15 @@ class ModelManagerFacade(Type): @ReturnMapping(ErrorResults) async def DestroyModels(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='ModelManager', request='DestroyModels', version=2, params=_params) + msg = dict(type='ModelManager', + request='DestroyModels', + version=2, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -3392,12 +6171,15 @@ class ModelManagerFacade(Type): @ReturnMapping(MapResults) async def DumpModels(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~MapResult]<~MapResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~MapResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='ModelManager', request='DumpModels', version=2, params=_params) + msg = dict(type='ModelManager', + request='DumpModels', + version=2, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -3407,12 +6189,15 @@ class ModelManagerFacade(Type): @ReturnMapping(MapResults) async def DumpModelsDB(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~MapResult]<~MapResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~MapResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='ModelManager', request='DumpModelsDB', version=2, params=_params) + msg = dict(type='ModelManager', + request='DumpModelsDB', + version=2, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -3423,11 +6208,14 @@ class ModelManagerFacade(Type): async def ListModels(self, tag): ''' tag : str - Returns -> typing.Sequence<+T_co>[~UserModel]<~UserModel> + Returns -> typing.Sequence[~UserModel] ''' # map input types to rpc msg _params = dict() - msg = dict(type='ModelManager', request='ListModels', version=2, params=_params) + msg = dict(type='ModelManager', + request='ListModels', + version=2, + params=_params) _params['tag'] = tag reply = await self.rpc(msg) return reply @@ -3438,11 +6226,14 @@ class ModelManagerFacade(Type): async def ModelDefaults(self): ''' - Returns -> typing.Mapping<~KT, +VT_co>[str, ~ModelDefaults]<~ModelDefaults> + Returns -> typing.Mapping[str, ~ModelDefaults] ''' # map input types to rpc msg _params = dict() - msg = dict(type='ModelManager', request='ModelDefaults', version=2, params=_params) + msg = dict(type='ModelManager', + request='ModelDefaults', + version=2, + params=_params) reply = await self.rpc(msg) return reply @@ -3452,12 +6243,15 @@ class ModelManagerFacade(Type): @ReturnMapping(ModelInfoResults) async def ModelInfo(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~ModelInfoResult]<~ModelInfoResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ModelInfoResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='ModelManager', request='ModelInfo', version=2, params=_params) + msg = dict(type='ModelManager', + request='ModelInfo', + version=2, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -3467,58 +6261,174 @@ class ModelManagerFacade(Type): @ReturnMapping(ModelStatusResults) async def ModelStatus(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~ModelStatus]<~ModelStatus> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~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[~ModifyModelAccess] + Returns -> typing.Sequence[~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[~ModelDefaultValues] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='ModelManager', request='ModelStatus', version=2, params=_params) - _params['entities'] = entities + msg = dict(type='ModelManager', + request='SetModelDefaults', + version=2, + params=_params) + _params['config'] = config reply = await self.rpc(msg) return reply @ReturnMapping(ErrorResults) - async def ModifyModelAccess(self, changes): + async def UnsetModelDefaults(self, keys): ''' - changes : typing.Sequence<+T_co>[~ModifyModelAccess]<~ModifyModelAccess> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + keys : typing.Sequence[~ModelUnsetKeys] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='ModelManager', request='ModifyModelAccess', version=2, params=_params) - _params['changes'] = changes + msg = dict(type='ModelManager', + request='UnsetModelDefaults', + version=2, + params=_params) + _params['keys'] = keys reply = await self.rpc(msg) return reply - @ReturnMapping(ErrorResults) - async def SetModelDefaults(self, config): +class ProxyUpdaterFacade(Type): + name = 'ProxyUpdater' + 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'}, + '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'}, + 'juju-proxy-settings': {'$ref': '#/definitions/ProxyConfig'}, + 'legacy-proxy-settings': {'$ref': '#/definitions/ProxyConfig'}, + 'snap-proxy-settings': {'$ref': '#/definitions/ProxyConfig'}, + 'snap-store-assertions': {'type': 'string'}, + 'snap-store-id': {'type': 'string'}}, + 'required': ['legacy-proxy-settings', + 'juju-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): ''' - config : typing.Sequence<+T_co>[~ModelDefaultValues]<~ModelDefaultValues> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ProxyConfigResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='ModelManager', request='SetModelDefaults', version=2, params=_params) - _params['config'] = config + msg = dict(type='ProxyUpdater', + request='ProxyConfig', + version=2, + params=_params) + _params['entities'] = entities reply = await self.rpc(msg) return reply - @ReturnMapping(ErrorResults) - async def UnsetModelDefaults(self, keys): + @ReturnMapping(NotifyWatchResults) + async def WatchForProxyConfigAndAPIHostPortChanges(self, entities): ''' - keys : typing.Sequence<+T_co>[~ModelUnsetKeys]<~ModelUnsetKeys> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~NotifyWatchResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='ModelManager', request='UnsetModelDefaults', version=2, params=_params) - _params['keys'] = keys + msg = dict(type='ProxyUpdater', + request='WatchForProxyConfigAndAPIHostPortChanges', + version=2, + params=_params) + _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -3585,12 +6495,15 @@ class RebootFacade(Type): @ReturnMapping(ErrorResults) async def ClearReboot(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Reboot', request='ClearReboot', version=2, params=_params) + msg = dict(type='Reboot', + request='ClearReboot', + version=2, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -3600,12 +6513,15 @@ class RebootFacade(Type): @ReturnMapping(RebootActionResults) async def GetRebootAction(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~RebootActionResult]<~RebootActionResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~RebootActionResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Reboot', request='GetRebootAction', version=2, params=_params) + msg = dict(type='Reboot', + request='GetRebootAction', + version=2, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -3615,12 +6531,15 @@ class RebootFacade(Type): @ReturnMapping(ErrorResults) async def RequestReboot(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Reboot', request='RequestReboot', version=2, params=_params) + msg = dict(type='Reboot', + request='RequestReboot', + version=2, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -3635,7 +6554,10 @@ class RebootFacade(Type): ''' # map input types to rpc msg _params = dict() - msg = dict(type='Reboot', request='WatchForRebootEvent', version=2, params=_params) + msg = dict(type='Reboot', + request='WatchForRebootEvent', + version=2, + params=_params) reply = await self.rpc(msg) return reply @@ -3656,7 +6578,10 @@ class ResumerFacade(Type): ''' # map input types to rpc msg _params = dict() - msg = dict(type='Resumer', request='ResumeTransactions', version=2, params=_params) + msg = dict(type='Resumer', + request='ResumeTransactions', + version=2, + params=_params) reply = await self.rpc(msg) return reply @@ -3740,12 +6665,15 @@ class SSHClientFacade(Type): @ReturnMapping(SSHAddressesResults) async def AllAddresses(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~SSHAddressesResult]<~SSHAddressesResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~SSHAddressesResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='SSHClient', request='AllAddresses', version=2, params=_params) + msg = dict(type='SSHClient', + request='AllAddresses', + version=2, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -3755,12 +6683,15 @@ class SSHClientFacade(Type): @ReturnMapping(SSHAddressResults) async def PrivateAddress(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~SSHAddressResult]<~SSHAddressResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~SSHAddressResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='SSHClient', request='PrivateAddress', version=2, params=_params) + msg = dict(type='SSHClient', + request='PrivateAddress', + version=2, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -3775,7 +6706,10 @@ class SSHClientFacade(Type): ''' # map input types to rpc msg _params = dict() - msg = dict(type='SSHClient', request='Proxy', version=2, params=_params) + msg = dict(type='SSHClient', + request='Proxy', + version=2, + params=_params) reply = await self.rpc(msg) return reply @@ -3785,12 +6719,15 @@ class SSHClientFacade(Type): @ReturnMapping(SSHAddressResults) async def PublicAddress(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~SSHAddressResult]<~SSHAddressResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~SSHAddressResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='SSHClient', request='PublicAddress', version=2, params=_params) + msg = dict(type='SSHClient', + request='PublicAddress', + version=2, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -3800,12 +6737,104 @@ class SSHClientFacade(Type): @ReturnMapping(SSHPublicKeysResults) async def PublicKeys(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~SSHPublicKeysResult]<~SSHPublicKeysResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~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 SingularFacade(Type): + name = 'Singular' + 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'}, + 'SingularClaim': {'additionalProperties': False, + 'properties': {'claimant-tag': {'type': 'string'}, + 'duration': {'type': 'integer'}, + 'entity-tag': {'type': 'string'}}, + 'required': ['entity-tag', + 'claimant-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[~SingularClaim] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Singular', + request='Claim', + version=2, + params=_params) + _params['claims'] = claims + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResults) + async def Wait(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='SSHClient', request='PublicKeys', version=2, params=_params) + msg = dict(type='Singular', + request='Wait', + version=2, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -3889,12 +6918,15 @@ class SpacesFacade(Type): @ReturnMapping(ErrorResults) async def CreateSpaces(self, spaces): ''' - spaces : typing.Sequence<+T_co>[~CreateSpaceParams]<~CreateSpaceParams> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + spaces : typing.Sequence[~CreateSpaceParams] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Spaces', request='CreateSpaces', version=2, params=_params) + msg = dict(type='Spaces', + request='CreateSpaces', + version=2, + params=_params) _params['spaces'] = spaces reply = await self.rpc(msg) return reply @@ -3905,11 +6937,14 @@ class SpacesFacade(Type): async def ListSpaces(self): ''' - Returns -> typing.Sequence<+T_co>[~Space]<~Space> + Returns -> typing.Sequence[~Space] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Spaces', request='ListSpaces', version=2, params=_params) + msg = dict(type='Spaces', + request='ListSpaces', + version=2, + params=_params) reply = await self.rpc(msg) return reply @@ -3960,11 +6995,14 @@ class StatusHistoryFacade(Type): async def ModelConfig(self): ''' - Returns -> typing.Mapping<~KT, +VT_co>[str, typing.Any] + Returns -> typing.Mapping[str, typing.Any] ''' # map input types to rpc msg _params = dict() - msg = dict(type='StatusHistory', request='ModelConfig', version=2, params=_params) + msg = dict(type='StatusHistory', + request='ModelConfig', + version=2, + params=_params) reply = await self.rpc(msg) return reply @@ -3980,7 +7018,10 @@ class StatusHistoryFacade(Type): ''' # map input types to rpc msg _params = dict() - msg = dict(type='StatusHistory', request='Prune', version=2, params=_params) + 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) @@ -3996,7 +7037,10 @@ class StatusHistoryFacade(Type): ''' # map input types to rpc msg _params = dict() - msg = dict(type='StatusHistory', request='WatchForModelConfigChanges', version=2, params=_params) + msg = dict(type='StatusHistory', + request='WatchForModelConfigChanges', + version=2, + params=_params) reply = await self.rpc(msg) return reply @@ -4103,12 +7147,15 @@ class SubnetsFacade(Type): @ReturnMapping(ErrorResults) async def AddSubnets(self, subnets): ''' - subnets : typing.Sequence<+T_co>[~AddSubnetParams]<~AddSubnetParams> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + subnets : typing.Sequence[~AddSubnetParams] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Subnets', request='AddSubnets', version=2, params=_params) + msg = dict(type='Subnets', + request='AddSubnets', + version=2, + params=_params) _params['subnets'] = subnets reply = await self.rpc(msg) return reply @@ -4119,11 +7166,14 @@ class SubnetsFacade(Type): async def AllSpaces(self): ''' - Returns -> typing.Sequence<+T_co>[~SpaceResult]<~SpaceResult> + Returns -> typing.Sequence[~SpaceResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Subnets', request='AllSpaces', version=2, params=_params) + msg = dict(type='Subnets', + request='AllSpaces', + version=2, + params=_params) reply = await self.rpc(msg) return reply @@ -4134,11 +7184,14 @@ class SubnetsFacade(Type): async def AllZones(self): ''' - Returns -> typing.Sequence<+T_co>[~ZoneResult]<~ZoneResult> + Returns -> typing.Sequence[~ZoneResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Subnets', request='AllZones', version=2, params=_params) + msg = dict(type='Subnets', + request='AllZones', + version=2, + params=_params) reply = await self.rpc(msg) return reply @@ -4150,11 +7203,14 @@ class SubnetsFacade(Type): ''' space_tag : str zone : str - Returns -> typing.Sequence<+T_co>[~Subnet]<~Subnet> + Returns -> typing.Sequence[~Subnet] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Subnets', request='ListSubnets', version=2, params=_params) + msg = dict(type='Subnets', + request='ListSubnets', + version=2, + params=_params) _params['space-tag'] = space_tag _params['zone'] = zone reply = await self.rpc(msg) @@ -4162,6 +7218,254 @@ class SubnetsFacade(Type): +class UserManagerFacade(Type): + name = 'UserManager' + version = 2 + 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'}, + 'ResetPassword': {'properties': {'Params': {'$ref': '#/definitions/Entities'}, + 'Result': {'$ref': '#/definitions/AddUserResults'}}, + '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[~AddUser] + Returns -> typing.Sequence[~AddUserResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='UserManager', + request='AddUser', + version=2, + params=_params) + _params['users'] = users + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResults) + async def DisableUser(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='UserManager', + request='DisableUser', + version=2, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResults) + async def EnableUser(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='UserManager', + request='EnableUser', + version=2, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResults) + async def RemoveUser(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='UserManager', + request='RemoveUser', + version=2, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(AddUserResults) + async def ResetPassword(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~AddUserResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='UserManager', + request='ResetPassword', + version=2, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResults) + async def SetPassword(self, changes): + ''' + changes : typing.Sequence[~EntityPassword] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='UserManager', + request='SetPassword', + version=2, + params=_params) + _params['changes'] = changes + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(UserInfoResults) + async def UserInfo(self, entities, include_disabled): + ''' + entities : typing.Sequence[~Entity] + include_disabled : bool + Returns -> typing.Sequence[~UserInfoResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='UserManager', + request='UserInfo', + version=2, + params=_params) + _params['entities'] = entities + _params['include-disabled'] = include_disabled + reply = await self.rpc(msg) + return reply + + + class VolumeAttachmentsWatcherFacade(Type): name = 'VolumeAttachmentsWatcher' version = 2 @@ -4200,11 +7504,14 @@ class VolumeAttachmentsWatcherFacade(Type): async def Next(self): ''' - Returns -> typing.Union[typing.Sequence<+T_co>[~MachineStorageId]<~MachineStorageId>, _ForwardRef('Error')] + Returns -> typing.Union[typing.Sequence[~MachineStorageId], _ForwardRef('Error'), str] ''' # map input types to rpc msg _params = dict() - msg = dict(type='VolumeAttachmentsWatcher', request='Next', version=2, params=_params) + msg = dict(type='VolumeAttachmentsWatcher', + request='Next', + version=2, + params=_params) reply = await self.rpc(msg) return reply @@ -4219,7 +7526,10 @@ class VolumeAttachmentsWatcherFacade(Type): ''' # map input types to rpc msg _params = dict() - msg = dict(type='VolumeAttachmentsWatcher', request='Stop', version=2, params=_params) + msg = dict(type='VolumeAttachmentsWatcher', + request='Stop', + version=2, + params=_params) reply = await self.rpc(msg) return reply diff --git a/juju/client/_client3.py b/juju/client/_client3.py index 3f9ef55..a63faa8 100644 --- a/juju/client/_client3.py +++ b/juju/client/_client3.py @@ -5,6 +5,395 @@ from juju.client.facade import Type, ReturnMapping from juju.client._definitions import * +class ActionFacade(Type): + name = 'Action' + version = 3 + 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[~Entity] + Returns -> typing.Sequence[~ActionResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Action', + request='Actions', + version=3, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ApplicationsCharmActionsResults) + async def ApplicationsCharmsActions(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ApplicationCharmActionsResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Action', + request='ApplicationsCharmsActions', + version=3, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ActionResults) + async def Cancel(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ActionResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Action', + request='Cancel', + version=3, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ActionResults) + async def Enqueue(self, actions): + ''' + actions : typing.Sequence[~Action] + Returns -> typing.Sequence[~ActionResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Action', + request='Enqueue', + version=3, + params=_params) + _params['actions'] = actions + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(FindTagsResults) + async def FindActionTagsByPrefix(self, prefixes): + ''' + prefixes : typing.Sequence[str] + Returns -> typing.Sequence[~Entity] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Action', + request='FindActionTagsByPrefix', + version=3, + params=_params) + _params['prefixes'] = prefixes + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ActionsByNames) + async def FindActionsByNames(self, names): + ''' + names : typing.Sequence[str] + Returns -> typing.Sequence[~ActionsByName] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Action', + request='FindActionsByNames', + version=3, + params=_params) + _params['names'] = names + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ActionsByReceivers) + async def ListAll(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ActionsByReceiver] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Action', + request='ListAll', + version=3, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ActionsByReceivers) + async def ListCompleted(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ActionsByReceiver] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Action', + request='ListCompleted', + version=3, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ActionsByReceivers) + async def ListPending(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ActionsByReceiver] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Action', + request='ListPending', + version=3, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ActionsByReceivers) + async def ListRunning(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ActionsByReceiver] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Action', + request='ListRunning', + version=3, + 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[str] + commands : str + machines : typing.Sequence[str] + timeout : int + units : typing.Sequence[str] + Returns -> typing.Sequence[~ActionResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Action', + request='Run', + version=3, + 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[str] + commands : str + machines : typing.Sequence[str] + timeout : int + units : typing.Sequence[str] + Returns -> typing.Sequence[~ActionResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Action', + request='RunOnAllMachines', + version=3, + 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 ApplicationFacade(Type): name = 'Application' version = 3 @@ -250,360 +639,1069 @@ class ApplicationFacade(Type): 'type': 'array'}, 'tags': {'items': {'type': 'string'}, 'type': 'array'}, - 'virt-type': {'type': 'string'}}, + '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[str] + Returns -> typing.Mapping[str, ~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[~Placement] + Returns -> typing.Sequence[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[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[~ApplicationDeploy] + Returns -> typing.Sequence[~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[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[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[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[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[str, str] + config_settings_yaml : str + force_series : bool + force_units : bool + resource_ids : typing.Mapping[str, str] + storage_constraints : typing.Mapping[str, ~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[~ApplicationMetricCredential] + Returns -> typing.Sequence[~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[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[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 CloudFacade(Type): + name = 'Cloud' + version = 3 + schema = {'definitions': {'AddCloudArgs': {'additionalProperties': False, + 'properties': {'cloud': {'$ref': '#/definitions/Cloud'}, + 'name': {'type': 'string'}}, + 'required': ['cloud', 'name'], + 'type': 'object'}, + 'Cloud': {'additionalProperties': False, + 'properties': {'auth-types': {'items': {'type': 'string'}, + 'type': 'array'}, + 'ca-certificates': {'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'}, + 'CloudCredentialArg': {'additionalProperties': False, + 'properties': {'cloud-name': {'type': 'string'}, + 'credential-name': {'type': 'string'}}, + 'required': ['cloud-name', + 'credential-name'], + 'type': 'object'}, + 'CloudCredentialArgs': {'additionalProperties': False, + 'properties': {'credentials': {'items': {'$ref': '#/definitions/CloudCredentialArg'}, + 'type': 'array'}, + 'include-secrets': {'type': 'boolean'}}, + 'required': ['include-secrets'], + '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'}, + 'CloudDetails': {'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'}, + 'CloudInfo': {'additionalProperties': False, + 'properties': {'CloudDetails': {'$ref': '#/definitions/CloudDetails'}, + 'users': {'items': {'$ref': '#/definitions/CloudUserInfo'}, + 'type': 'array'}}, + 'required': ['CloudDetails', 'users'], + 'type': 'object'}, + 'CloudInfoResult': {'additionalProperties': False, + 'properties': {'error': {'$ref': '#/definitions/Error'}, + 'result': {'$ref': '#/definitions/CloudInfo'}}, + 'type': 'object'}, + 'CloudInfoResults': {'additionalProperties': False, + 'properties': {'results': {'items': {'$ref': '#/definitions/CloudInfoResult'}, + 'type': 'array'}}, + 'required': ['results'], + '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'}, + 'CloudUserInfo': {'additionalProperties': False, + 'properties': {'access': {'type': 'string'}, + 'display-name': {'type': 'string'}, + 'user': {'type': 'string'}}, + 'required': ['user', + 'display-name', + 'access'], + 'type': 'object'}, + 'CloudsResult': {'additionalProperties': False, + 'properties': {'clouds': {'patternProperties': {'.*': {'$ref': '#/definitions/Cloud'}}, + 'type': 'object'}}, + 'type': 'object'}, + 'ControllerCredentialInfo': {'additionalProperties': False, + 'properties': {'content': {'$ref': '#/definitions/CredentialContent'}, + 'models': {'items': {'$ref': '#/definitions/ModelAccess'}, + 'type': 'array'}}, + 'type': 'object'}, + 'CredentialContent': {'additionalProperties': False, + 'properties': {'attrs': {'patternProperties': {'.*': {'type': 'string'}}, + 'type': 'object'}, + 'auth-type': {'type': 'string'}, + 'cloud': {'type': 'string'}, + 'name': {'type': 'string'}}, + 'required': ['name', + 'cloud', + 'auth-type'], + 'type': 'object'}, + 'CredentialContentResult': {'additionalProperties': False, + 'properties': {'error': {'$ref': '#/definitions/Error'}, + 'result': {'$ref': '#/definitions/ControllerCredentialInfo'}}, + 'type': 'object'}, + 'CredentialContentResults': {'additionalProperties': False, + 'properties': {'results': {'items': {'$ref': '#/definitions/CredentialContentResult'}, + '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'}, + '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'}, + 'ListCloudInfo': {'additionalProperties': False, + 'properties': {'CloudDetails': {'$ref': '#/definitions/CloudDetails'}, + 'user-access': {'type': 'string'}}, + 'required': ['CloudDetails', 'user-access'], + 'type': 'object'}, + 'ListCloudInfoResult': {'additionalProperties': False, + 'properties': {'error': {'$ref': '#/definitions/Error'}, + 'result': {'$ref': '#/definitions/ListCloudInfo'}}, + 'type': 'object'}, + 'ListCloudInfoResults': {'additionalProperties': False, + 'properties': {'results': {'items': {'$ref': '#/definitions/ListCloudInfoResult'}, + 'type': 'array'}}, + 'required': ['results'], + 'type': 'object'}, + 'ListCloudsRequest': {'additionalProperties': False, + 'properties': {'all': {'type': 'boolean'}, + 'user-tag': {'type': 'string'}}, + 'required': ['user-tag'], + 'type': 'object'}, + 'Macaroon': {'additionalProperties': False, 'type': 'object'}, + 'ModelAccess': {'additionalProperties': False, + 'properties': {'access': {'type': 'string'}, + 'model': {'type': 'string'}}, + 'type': 'object'}, + 'ModifyCloudAccess': {'additionalProperties': False, + 'properties': {'access': {'type': 'string'}, + 'action': {'type': 'string'}, + 'cloud-tag': {'type': 'string'}, + 'user-tag': {'type': 'string'}}, + 'required': ['user-tag', + 'cloud-tag', + 'action', + 'access'], + 'type': 'object'}, + 'ModifyCloudAccessRequest': {'additionalProperties': False, + 'properties': {'changes': {'items': {'$ref': '#/definitions/ModifyCloudAccess'}, + 'type': 'array'}}, + 'required': ['changes'], + 'type': 'object'}, + 'RevokeCredentialArg': {'additionalProperties': False, + 'properties': {'force': {'type': 'boolean'}, + 'tag': {'type': 'string'}}, + 'required': ['tag', 'force'], + 'type': 'object'}, + 'RevokeCredentialArgs': {'additionalProperties': False, + 'properties': {'credentials': {'items': {'$ref': '#/definitions/RevokeCredentialArg'}, + 'type': 'array'}}, + 'required': ['credentials'], + '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'}, + 'TaggedCredential': {'additionalProperties': False, + 'properties': {'credential': {'$ref': '#/definitions/CloudCredential'}, + 'tag': {'type': 'string'}}, + 'required': ['tag', 'credential'], + 'type': 'object'}, + 'TaggedCredentials': {'additionalProperties': False, + 'properties': {'credentials': {'items': {'$ref': '#/definitions/TaggedCredential'}, + 'type': 'array'}}, + 'type': 'object'}, + 'UpdateCredentialArgs': {'additionalProperties': False, + 'properties': {'credentials': {'items': {'$ref': '#/definitions/TaggedCredential'}, + 'type': 'array'}, + 'force': {'type': 'boolean'}}, + 'required': ['credentials', 'force'], + 'type': 'object'}, + 'UpdateCredentialModelResult': {'additionalProperties': False, + 'properties': {'errors': {'items': {'$ref': '#/definitions/ErrorResult'}, + 'type': 'array'}, + 'name': {'type': 'string'}, + 'uuid': {'type': 'string'}}, + 'required': ['uuid', 'name'], + 'type': 'object'}, + 'UpdateCredentialResult': {'additionalProperties': False, + 'properties': {'error': {'$ref': '#/definitions/Error'}, + 'models': {'items': {'$ref': '#/definitions/UpdateCredentialModelResult'}, + 'type': 'array'}, + 'tag': {'type': 'string'}}, + 'required': ['tag'], + 'type': 'object'}, + 'UpdateCredentialResults': {'additionalProperties': False, + 'properties': {'results': {'items': {'$ref': '#/definitions/UpdateCredentialResult'}, + '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'}, + 'zones': {'items': {'type': 'string'}, + 'type': 'array'}}, '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'}}, + 'properties': {'AddCloud': {'properties': {'Params': {'$ref': '#/definitions/AddCloudArgs'}}, 'type': 'object'}, - 'CharmRelations': {'properties': {'Params': {'$ref': '#/definitions/ApplicationCharmRelations'}, - 'Result': {'$ref': '#/definitions/ApplicationCharmRelationsResults'}}, + 'AddCredentials': {'properties': {'Params': {'$ref': '#/definitions/TaggedCredentials'}, + 'Result': {'$ref': '#/definitions/ErrorResults'}}, 'type': 'object'}, - 'Deploy': {'properties': {'Params': {'$ref': '#/definitions/ApplicationsDeploy'}, - 'Result': {'$ref': '#/definitions/ErrorResults'}}, + 'CheckCredentialsModels': {'properties': {'Params': {'$ref': '#/definitions/TaggedCredentials'}, + 'Result': {'$ref': '#/definitions/UpdateCredentialResults'}}, + 'type': 'object'}, + 'Cloud': {'properties': {'Params': {'$ref': '#/definitions/Entities'}, + 'Result': {'$ref': '#/definitions/CloudResults'}}, + 'type': 'object'}, + 'CloudInfo': {'properties': {'Params': {'$ref': '#/definitions/Entities'}, + 'Result': {'$ref': '#/definitions/CloudInfoResults'}}, + 'type': 'object'}, + 'Clouds': {'properties': {'Result': {'$ref': '#/definitions/CloudsResult'}}, 'type': 'object'}, - 'Destroy': {'properties': {'Params': {'$ref': '#/definitions/ApplicationDestroy'}}, - 'type': 'object'}, - 'DestroyRelation': {'properties': {'Params': {'$ref': '#/definitions/DestroyRelation'}}, - 'type': 'object'}, - 'DestroyUnits': {'properties': {'Params': {'$ref': '#/definitions/DestroyApplicationUnits'}}, + 'Credential': {'properties': {'Params': {'$ref': '#/definitions/Entities'}, + 'Result': {'$ref': '#/definitions/CloudCredentialResults'}}, + 'type': 'object'}, + 'CredentialContents': {'properties': {'Params': {'$ref': '#/definitions/CloudCredentialArgs'}, + 'Result': {'$ref': '#/definitions/CredentialContentResults'}}, + 'type': 'object'}, + 'DefaultCloud': {'properties': {'Result': {'$ref': '#/definitions/StringResult'}}, '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'}}, + 'InstanceTypes': {'properties': {'Params': {'$ref': '#/definitions/CloudInstanceTypesConstraints'}, + 'Result': {'$ref': '#/definitions/InstanceTypesResults'}}, + 'type': 'object'}, + 'ListCloudInfo': {'properties': {'Params': {'$ref': '#/definitions/ListCloudsRequest'}, + 'Result': {'$ref': '#/definitions/ListCloudInfoResults'}}, + 'type': 'object'}, + 'ModifyCloudAccess': {'properties': {'Params': {'$ref': '#/definitions/ModifyCloudAccessRequest'}, + 'Result': {'$ref': '#/definitions/ErrorResults'}}, + 'type': 'object'}, + 'RemoveClouds': {'properties': {'Params': {'$ref': '#/definitions/Entities'}, + 'Result': {'$ref': '#/definitions/ErrorResults'}}, + 'type': 'object'}, + 'RevokeCredentialsCheckModels': {'properties': {'Params': {'$ref': '#/definitions/RevokeCredentialArgs'}, + 'Result': {'$ref': '#/definitions/ErrorResults'}}, + 'type': 'object'}, + 'UpdateCredentialsCheckModels': {'properties': {'Params': {'$ref': '#/definitions/UpdateCredentialArgs'}, + 'Result': {'$ref': '#/definitions/UpdateCredentialResults'}}, + 'type': 'object'}, + 'UserCredentials': {'properties': {'Params': {'$ref': '#/definitions/UserClouds'}, + 'Result': {'$ref': '#/definitions/StringsResults'}}, + 'type': 'object'}}, 'type': 'object'} - @ReturnMapping(AddRelationResults) - async def AddRelation(self, endpoints): + @ReturnMapping(None) + async def AddCloud(self, cloud, name): ''' - endpoints : typing.Sequence<+T_co>[str] - Returns -> typing.Mapping<~KT, +VT_co>[str, ~CharmRelation]<~CharmRelation> + cloud : Cloud + name : str + Returns -> None ''' # map input types to rpc msg _params = dict() - msg = dict(type='Application', request='AddRelation', version=3, params=_params) - _params['endpoints'] = endpoints + msg = dict(type='Cloud', + request='AddCloud', + version=3, + params=_params) + _params['cloud'] = cloud + _params['name'] = name reply = await self.rpc(msg) return reply - @ReturnMapping(AddApplicationUnitsResults) - async def AddUnits(self, application, num_units, placement): + @ReturnMapping(ErrorResults) + async def AddCredentials(self, credentials): ''' - application : str - num_units : int - placement : typing.Sequence<+T_co>[~Placement]<~Placement> - Returns -> typing.Sequence<+T_co>[str] + credentials : typing.Sequence[~TaggedCredential] + Returns -> typing.Sequence[~ErrorResult] ''' # 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 + msg = dict(type='Cloud', + request='AddCredentials', + version=3, + params=_params) + _params['credentials'] = credentials reply = await self.rpc(msg) return reply - @ReturnMapping(ApplicationCharmRelationsResults) - async def CharmRelations(self, application): + @ReturnMapping(UpdateCredentialResults) + async def CheckCredentialsModels(self, credentials): ''' - application : str - Returns -> typing.Sequence<+T_co>[str] + credentials : typing.Sequence[~TaggedCredential] + Returns -> typing.Sequence[~UpdateCredentialResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Application', request='CharmRelations', version=3, params=_params) - _params['application'] = application + msg = dict(type='Cloud', + request='CheckCredentialsModels', + version=3, + params=_params) + _params['credentials'] = credentials reply = await self.rpc(msg) return reply - @ReturnMapping(ErrorResults) - async def Deploy(self, applications): + @ReturnMapping(CloudResults) + async def Cloud(self, entities): ''' - applications : typing.Sequence<+T_co>[~ApplicationDeploy]<~ApplicationDeploy> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~CloudResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Application', request='Deploy', version=3, params=_params) - _params['applications'] = applications + msg = dict(type='Cloud', + request='Cloud', + version=3, + params=_params) + _params['entities'] = entities reply = await self.rpc(msg) return reply - @ReturnMapping(None) - async def Destroy(self, application): + @ReturnMapping(CloudInfoResults) + async def CloudInfo(self, entities): ''' - application : str - Returns -> None + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~CloudInfoResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Application', request='Destroy', version=3, params=_params) - _params['application'] = application + msg = dict(type='Cloud', + request='CloudInfo', + version=3, + 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 + @ReturnMapping(CloudsResult) + async def Clouds(self): ''' - # 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 + Returns -> typing.Mapping[str, ~Cloud] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Application', request='DestroyUnits', version=3, params=_params) - _params['unit-names'] = unit_names + msg = dict(type='Cloud', + request='Clouds', + version=3, + params=_params) + reply = await self.rpc(msg) return reply - @ReturnMapping(None) - async def Expose(self, application): + @ReturnMapping(CloudCredentialResults) + async def Credential(self, entities): ''' - application : str - Returns -> None + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~CloudCredentialResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Application', request='Expose', version=3, params=_params) - _params['application'] = application + msg = dict(type='Cloud', + request='Credential', + version=3, + params=_params) + _params['entities'] = entities reply = await self.rpc(msg) return reply - @ReturnMapping(ApplicationGetResults) - async def Get(self, application): + @ReturnMapping(CredentialContentResults) + async def CredentialContents(self, credentials, include_secrets): ''' - application : str - Returns -> typing.Union[str, typing.Mapping<~KT, +VT_co>[str, typing.Any], _ForwardRef('Value')] + credentials : typing.Sequence[~CloudCredentialArg] + include_secrets : bool + Returns -> typing.Sequence[~CredentialContentResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Application', request='Get', version=3, params=_params) - _params['application'] = application + msg = dict(type='Cloud', + request='CredentialContents', + version=3, + params=_params) + _params['credentials'] = credentials + _params['include-secrets'] = include_secrets reply = await self.rpc(msg) return reply @ReturnMapping(StringResult) - async def GetCharmURL(self, application): + async def DefaultCloud(self): ''' - 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 + msg = dict(type='Cloud', + request='DefaultCloud', + version=3, + params=_params) - - - @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): + @ReturnMapping(InstanceTypesResults) + async def InstanceTypes(self, constraints): ''' - application : str - options : typing.Mapping<~KT, +VT_co>[str, str] - Returns -> None + constraints : typing.Sequence[~CloudInstanceTypesConstraint] + Returns -> typing.Sequence[~InstanceTypesResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Application', request='Set', version=3, params=_params) - _params['application'] = application - _params['options'] = options + msg = dict(type='Cloud', + request='InstanceTypes', + version=3, + params=_params) + _params['constraints'] = constraints 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): + @ReturnMapping(ListCloudInfoResults) + async def ListCloudInfo(self, all_, user_tag): ''' - 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 + all_ : bool + user_tag : str + Returns -> typing.Sequence[~ListCloudInfoResult] ''' # 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 + msg = dict(type='Cloud', + request='ListCloudInfo', + version=3, + params=_params) + _params['all'] = all_ + _params['user-tag'] = user_tag reply = await self.rpc(msg) return reply - @ReturnMapping(None) - async def SetConstraints(self, application, constraints): + @ReturnMapping(ErrorResults) + async def ModifyCloudAccess(self, changes): ''' - application : str - constraints : Value - Returns -> None + changes : typing.Sequence[~ModifyCloudAccess] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Application', request='SetConstraints', version=3, params=_params) - _params['application'] = application - _params['constraints'] = constraints + msg = dict(type='Cloud', + request='ModifyCloudAccess', + version=3, + params=_params) + _params['changes'] = changes reply = await self.rpc(msg) return reply @ReturnMapping(ErrorResults) - async def SetMetricCredentials(self, creds): + async def RemoveClouds(self, entities): ''' - creds : typing.Sequence<+T_co>[~ApplicationMetricCredential]<~ApplicationMetricCredential> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Application', request='SetMetricCredentials', version=3, params=_params) - _params['creds'] = creds + msg = dict(type='Cloud', + request='RemoveClouds', + version=3, + params=_params) + _params['entities'] = entities reply = await self.rpc(msg) return reply - @ReturnMapping(None) - async def Unexpose(self, application): + @ReturnMapping(ErrorResults) + async def RevokeCredentialsCheckModels(self, credentials): ''' - application : str - Returns -> None + credentials : typing.Sequence[~RevokeCredentialArg] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Application', request='Unexpose', version=3, params=_params) - _params['application'] = application + msg = dict(type='Cloud', + request='RevokeCredentialsCheckModels', + version=3, + params=_params) + _params['credentials'] = credentials reply = await self.rpc(msg) return reply - @ReturnMapping(None) - async def Unset(self, application, options): + @ReturnMapping(UpdateCredentialResults) + async def UpdateCredentialsCheckModels(self, credentials, force): ''' - application : str - options : typing.Sequence<+T_co>[str] - Returns -> None + credentials : typing.Sequence[~TaggedCredential] + force : bool + Returns -> typing.Sequence[~UpdateCredentialResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Application', request='Unset', version=3, params=_params) - _params['application'] = application - _params['options'] = options + msg = dict(type='Cloud', + request='UpdateCredentialsCheckModels', + version=3, + params=_params) + _params['credentials'] = credentials + _params['force'] = force 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): + @ReturnMapping(StringsResults) + async def UserCredentials(self, user_clouds): ''' - 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 + user_clouds : typing.Sequence[~UserCloud] + Returns -> typing.Sequence[~StringsResult] ''' # 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 + msg = dict(type='Cloud', + request='UserCredentials', + version=3, + params=_params) + _params['user-clouds'] = user_clouds reply = await self.rpc(msg) return reply @@ -883,11 +1981,14 @@ class ControllerFacade(Type): async def AllModels(self): ''' - Returns -> typing.Sequence<+T_co>[~UserModel]<~UserModel> + Returns -> typing.Sequence[~UserModel] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Controller', request='AllModels', version=3, params=_params) + msg = dict(type='Controller', + request='AllModels', + version=3, + params=_params) reply = await self.rpc(msg) return reply @@ -897,12 +1998,15 @@ class ControllerFacade(Type): @ReturnMapping(CloudSpecResults) async def CloudSpec(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~CloudSpecResult]<~CloudSpecResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~CloudSpecResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Controller', request='CloudSpec', version=3, params=_params) + msg = dict(type='Controller', + request='CloudSpec', + version=3, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -913,11 +2017,14 @@ class ControllerFacade(Type): async def ControllerConfig(self): ''' - Returns -> typing.Mapping<~KT, +VT_co>[str, typing.Any] + Returns -> typing.Mapping[str, typing.Any] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Controller', request='ControllerConfig', version=3, params=_params) + msg = dict(type='Controller', + request='ControllerConfig', + version=3, + params=_params) reply = await self.rpc(msg) return reply @@ -932,7 +2039,10 @@ class ControllerFacade(Type): ''' # map input types to rpc msg _params = dict() - msg = dict(type='Controller', request='DestroyController', version=3, params=_params) + msg = dict(type='Controller', + request='DestroyController', + version=3, + params=_params) _params['destroy-models'] = destroy_models reply = await self.rpc(msg) return reply @@ -947,7 +2057,10 @@ class ControllerFacade(Type): ''' # map input types to rpc msg _params = dict() - msg = dict(type='Controller', request='GetCloudSpec', version=3, params=_params) + msg = dict(type='Controller', + request='GetCloudSpec', + version=3, + params=_params) reply = await self.rpc(msg) return reply @@ -957,12 +2070,15 @@ class ControllerFacade(Type): @ReturnMapping(UserAccessResults) async def GetControllerAccess(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~UserAccessResult]<~UserAccessResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~UserAccessResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Controller', request='GetControllerAccess', version=3, params=_params) + msg = dict(type='Controller', + request='GetControllerAccess', + version=3, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -973,11 +2089,14 @@ class ControllerFacade(Type): async def HostedModelConfigs(self): ''' - Returns -> typing.Sequence<+T_co>[~HostedModelConfig]<~HostedModelConfig> + Returns -> typing.Sequence[~HostedModelConfig] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Controller', request='HostedModelConfigs', version=3, params=_params) + msg = dict(type='Controller', + request='HostedModelConfigs', + version=3, + params=_params) reply = await self.rpc(msg) return reply @@ -987,12 +2106,15 @@ class ControllerFacade(Type): @ReturnMapping(InitiateMigrationResults) async def InitiateMigration(self, specs): ''' - specs : typing.Sequence<+T_co>[~MigrationSpec]<~MigrationSpec> - Returns -> typing.Sequence<+T_co>[~InitiateMigrationResult]<~InitiateMigrationResult> + specs : typing.Sequence[~MigrationSpec] + Returns -> typing.Sequence[~InitiateMigrationResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Controller', request='InitiateMigration', version=3, params=_params) + msg = dict(type='Controller', + request='InitiateMigration', + version=3, + params=_params) _params['specs'] = specs reply = await self.rpc(msg) return reply @@ -1003,11 +2125,14 @@ class ControllerFacade(Type): async def ListBlockedModels(self): ''' - Returns -> typing.Sequence<+T_co>[~ModelBlockInfo]<~ModelBlockInfo> + Returns -> typing.Sequence[~ModelBlockInfo] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Controller', request='ListBlockedModels', version=3, params=_params) + msg = dict(type='Controller', + request='ListBlockedModels', + version=3, + params=_params) reply = await self.rpc(msg) return reply @@ -1018,11 +2143,14 @@ class ControllerFacade(Type): async def ModelConfig(self): ''' - Returns -> typing.Mapping<~KT, +VT_co>[str, ~ConfigValue]<~ConfigValue> + Returns -> typing.Mapping[str, ~ConfigValue] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Controller', request='ModelConfig', version=3, params=_params) + msg = dict(type='Controller', + request='ModelConfig', + version=3, + params=_params) reply = await self.rpc(msg) return reply @@ -1032,12 +2160,15 @@ class ControllerFacade(Type): @ReturnMapping(ModelStatusResults) async def ModelStatus(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~ModelStatus]<~ModelStatus> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ModelStatus] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Controller', request='ModelStatus', version=3, params=_params) + msg = dict(type='Controller', + request='ModelStatus', + version=3, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -1047,12 +2178,15 @@ class ControllerFacade(Type): @ReturnMapping(ErrorResults) async def ModifyControllerAccess(self, changes): ''' - changes : typing.Sequence<+T_co>[~ModifyControllerAccess]<~ModifyControllerAccess> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + changes : typing.Sequence[~ModifyControllerAccess] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Controller', request='ModifyControllerAccess', version=3, params=_params) + msg = dict(type='Controller', + request='ModifyControllerAccess', + version=3, + params=_params) _params['changes'] = changes reply = await self.rpc(msg) return reply @@ -1067,7 +2201,10 @@ class ControllerFacade(Type): ''' # map input types to rpc msg _params = dict() - msg = dict(type='Controller', request='RemoveBlocks', version=3, params=_params) + msg = dict(type='Controller', + request='RemoveBlocks', + version=3, + params=_params) _params['all'] = all_ reply = await self.rpc(msg) return reply @@ -1082,7 +2219,10 @@ class ControllerFacade(Type): ''' # map input types to rpc msg _params = dict() - msg = dict(type='Controller', request='WatchAllModels', version=3, params=_params) + msg = dict(type='Controller', + request='WatchAllModels', + version=3, + params=_params) reply = await self.rpc(msg) return reply @@ -1287,12 +2427,15 @@ class FirewallerFacade(Type): @ReturnMapping(CloudSpecResults) async def CloudSpec(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~CloudSpecResult]<~CloudSpecResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~CloudSpecResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Firewaller', request='CloudSpec', version=3, params=_params) + msg = dict(type='Firewaller', + request='CloudSpec', + version=3, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -1302,12 +2445,15 @@ class FirewallerFacade(Type): @ReturnMapping(StringResults) async def GetAssignedMachine(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~StringResult]<~StringResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~StringResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Firewaller', request='GetAssignedMachine', version=3, params=_params) + msg = dict(type='Firewaller', + request='GetAssignedMachine', + version=3, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -1322,7 +2468,10 @@ class FirewallerFacade(Type): ''' # map input types to rpc msg _params = dict() - msg = dict(type='Firewaller', request='GetCloudSpec', version=3, params=_params) + msg = dict(type='Firewaller', + request='GetCloudSpec', + version=3, + params=_params) reply = await self.rpc(msg) return reply @@ -1332,12 +2481,15 @@ class FirewallerFacade(Type): @ReturnMapping(BoolResults) async def GetExposed(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~BoolResult]<~BoolResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~BoolResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Firewaller', request='GetExposed', version=3, params=_params) + msg = dict(type='Firewaller', + request='GetExposed', + version=3, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -1347,12 +2499,15 @@ class FirewallerFacade(Type): @ReturnMapping(StringsResults) async def GetMachineActiveSubnets(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~StringsResult]<~StringsResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~StringsResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Firewaller', request='GetMachineActiveSubnets', version=3, params=_params) + msg = dict(type='Firewaller', + request='GetMachineActiveSubnets', + version=3, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -1362,12 +2517,15 @@ class FirewallerFacade(Type): @ReturnMapping(MachinePortsResults) async def GetMachinePorts(self, params): ''' - params : typing.Sequence<+T_co>[~MachinePorts]<~MachinePorts> - Returns -> typing.Sequence<+T_co>[~MachinePortsResult]<~MachinePortsResult> + params : typing.Sequence[~MachinePorts] + Returns -> typing.Sequence[~MachinePortsResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Firewaller', request='GetMachinePorts', version=3, params=_params) + msg = dict(type='Firewaller', + request='GetMachinePorts', + version=3, + params=_params) _params['params'] = params reply = await self.rpc(msg) return reply @@ -1377,12 +2535,15 @@ class FirewallerFacade(Type): @ReturnMapping(StringResults) async def InstanceId(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~StringResult]<~StringResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~StringResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Firewaller', request='InstanceId', version=3, params=_params) + msg = dict(type='Firewaller', + request='InstanceId', + version=3, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -1392,12 +2553,15 @@ class FirewallerFacade(Type): @ReturnMapping(LifeResults) async def Life(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~LifeResult]<~LifeResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~LifeResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Firewaller', request='Life', version=3, params=_params) + msg = dict(type='Firewaller', + request='Life', + version=3, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -1408,11 +2572,14 @@ class FirewallerFacade(Type): async def ModelConfig(self): ''' - Returns -> typing.Mapping<~KT, +VT_co>[str, typing.Any] + Returns -> typing.Mapping[str, typing.Any] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Firewaller', request='ModelConfig', version=3, params=_params) + msg = dict(type='Firewaller', + request='ModelConfig', + version=3, + params=_params) reply = await self.rpc(msg) return reply @@ -1422,12 +2589,15 @@ class FirewallerFacade(Type): @ReturnMapping(NotifyWatchResults) async def Watch(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~NotifyWatchResult]<~NotifyWatchResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~NotifyWatchResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Firewaller', request='Watch', version=3, params=_params) + msg = dict(type='Firewaller', + request='Watch', + version=3, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -1442,7 +2612,10 @@ class FirewallerFacade(Type): ''' # map input types to rpc msg _params = dict() - msg = dict(type='Firewaller', request='WatchForModelConfigChanges', version=3, params=_params) + msg = dict(type='Firewaller', + request='WatchForModelConfigChanges', + version=3, + params=_params) reply = await self.rpc(msg) return reply @@ -1453,11 +2626,14 @@ class FirewallerFacade(Type): async def WatchModelMachines(self): ''' - Returns -> typing.Union[typing.Sequence<+T_co>[str], _ForwardRef('Error')] + Returns -> typing.Union[typing.Sequence[str], _ForwardRef('Error'), str] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Firewaller', request='WatchModelMachines', version=3, params=_params) + msg = dict(type='Firewaller', + request='WatchModelMachines', + version=3, + params=_params) reply = await self.rpc(msg) return reply @@ -1467,12 +2643,15 @@ class FirewallerFacade(Type): @ReturnMapping(StringsWatchResults) async def WatchOpenedPorts(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~StringsWatchResult]<~StringsWatchResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~StringsWatchResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Firewaller', request='WatchOpenedPorts', version=3, params=_params) + msg = dict(type='Firewaller', + request='WatchOpenedPorts', + version=3, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -1482,18 +2661,46 @@ class FirewallerFacade(Type): @ReturnMapping(StringsWatchResults) async def WatchUnits(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~StringsWatchResult]<~StringsWatchResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~StringsWatchResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Firewaller', request='WatchUnits', version=3, params=_params) + msg = dict(type='Firewaller', + request='WatchUnits', + version=3, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply +class ImageMetadataFacade(Type): + name = 'ImageMetadata' + version = 3 + schema = {'properties': {'UpdateFromPublishedImages': {'type': 'object'}}, + 'type': 'object'} + + + @ReturnMapping(None) + async def UpdateFromPublishedImages(self): + ''' + + Returns -> None + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='ImageMetadata', + request='UpdateFromPublishedImages', + version=3, + params=_params) + + reply = await self.rpc(msg) + return reply + + + class InstancePollerFacade(Type): name = 'InstancePoller' version = 3 @@ -1678,12 +2885,15 @@ class InstancePollerFacade(Type): @ReturnMapping(BoolResults) async def AreManuallyProvisioned(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~BoolResult]<~BoolResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~BoolResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='InstancePoller', request='AreManuallyProvisioned', version=3, params=_params) + msg = dict(type='InstancePoller', + request='AreManuallyProvisioned', + version=3, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -1693,12 +2903,15 @@ class InstancePollerFacade(Type): @ReturnMapping(StringResults) async def InstanceId(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~StringResult]<~StringResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~StringResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='InstancePoller', request='InstanceId', version=3, params=_params) + msg = dict(type='InstancePoller', + request='InstanceId', + version=3, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -1708,12 +2921,15 @@ class InstancePollerFacade(Type): @ReturnMapping(StatusResults) async def InstanceStatus(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~StatusResult]<~StatusResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~StatusResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='InstancePoller', request='InstanceStatus', version=3, params=_params) + msg = dict(type='InstancePoller', + request='InstanceStatus', + version=3, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -1723,12 +2939,15 @@ class InstancePollerFacade(Type): @ReturnMapping(LifeResults) async def Life(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~LifeResult]<~LifeResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~LifeResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='InstancePoller', request='Life', version=3, params=_params) + msg = dict(type='InstancePoller', + request='Life', + version=3, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -1739,11 +2958,14 @@ class InstancePollerFacade(Type): async def ModelConfig(self): ''' - Returns -> typing.Mapping<~KT, +VT_co>[str, typing.Any] + Returns -> typing.Mapping[str, typing.Any] ''' # map input types to rpc msg _params = dict() - msg = dict(type='InstancePoller', request='ModelConfig', version=3, params=_params) + msg = dict(type='InstancePoller', + request='ModelConfig', + version=3, + params=_params) reply = await self.rpc(msg) return reply @@ -1753,12 +2975,15 @@ class InstancePollerFacade(Type): @ReturnMapping(MachineAddressesResults) async def ProviderAddresses(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~MachineAddressesResult]<~MachineAddressesResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~MachineAddressesResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='InstancePoller', request='ProviderAddresses', version=3, params=_params) + msg = dict(type='InstancePoller', + request='ProviderAddresses', + version=3, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -1768,12 +2993,15 @@ class InstancePollerFacade(Type): @ReturnMapping(ErrorResults) async def SetInstanceStatus(self, entities): ''' - entities : typing.Sequence<+T_co>[~EntityStatusArgs]<~EntityStatusArgs> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + entities : typing.Sequence[~EntityStatusArgs] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='InstancePoller', request='SetInstanceStatus', version=3, params=_params) + msg = dict(type='InstancePoller', + request='SetInstanceStatus', + version=3, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -1783,12 +3011,15 @@ class InstancePollerFacade(Type): @ReturnMapping(ErrorResults) async def SetProviderAddresses(self, machine_addresses): ''' - machine_addresses : typing.Sequence<+T_co>[~MachineAddresses]<~MachineAddresses> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + machine_addresses : typing.Sequence[~MachineAddresses] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='InstancePoller', request='SetProviderAddresses', version=3, params=_params) + msg = dict(type='InstancePoller', + request='SetProviderAddresses', + version=3, + params=_params) _params['machine-addresses'] = machine_addresses reply = await self.rpc(msg) return reply @@ -1798,12 +3029,15 @@ class InstancePollerFacade(Type): @ReturnMapping(StatusResults) async def Status(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~StatusResult]<~StatusResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~StatusResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='InstancePoller', request='Status', version=3, params=_params) + msg = dict(type='InstancePoller', + request='Status', + version=3, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -1818,7 +3052,10 @@ class InstancePollerFacade(Type): ''' # map input types to rpc msg _params = dict() - msg = dict(type='InstancePoller', request='WatchForModelConfigChanges', version=3, params=_params) + msg = dict(type='InstancePoller', + request='WatchForModelConfigChanges', + version=3, + params=_params) reply = await self.rpc(msg) return reply @@ -1829,11 +3066,14 @@ class InstancePollerFacade(Type): async def WatchModelMachines(self): ''' - Returns -> typing.Union[typing.Sequence<+T_co>[str], _ForwardRef('Error')] + Returns -> typing.Union[typing.Sequence[str], _ForwardRef('Error'), str] ''' # map input types to rpc msg _params = dict() - msg = dict(type='InstancePoller', request='WatchModelMachines', version=3, params=_params) + msg = dict(type='InstancePoller', + request='WatchModelMachines', + version=3, + params=_params) reply = await self.rpc(msg) return reply @@ -2012,12 +3252,15 @@ class MachineManagerFacade(Type): @ReturnMapping(AddMachinesResults) async def AddMachines(self, params): ''' - params : typing.Sequence<+T_co>[~AddMachineParams]<~AddMachineParams> - Returns -> typing.Sequence<+T_co>[~AddMachinesResult]<~AddMachinesResult> + params : typing.Sequence[~AddMachineParams] + Returns -> typing.Sequence[~AddMachinesResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='MachineManager', request='AddMachines', version=3, params=_params) + msg = dict(type='MachineManager', + request='AddMachines', + version=3, + params=_params) _params['params'] = params reply = await self.rpc(msg) return reply @@ -2027,12 +3270,15 @@ class MachineManagerFacade(Type): @ReturnMapping(DestroyMachineResults) async def DestroyMachine(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~DestroyMachineResult]<~DestroyMachineResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~DestroyMachineResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='MachineManager', request='DestroyMachine', version=3, params=_params) + msg = dict(type='MachineManager', + request='DestroyMachine', + version=3, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -2042,12 +3288,15 @@ class MachineManagerFacade(Type): @ReturnMapping(DestroyMachineResults) async def ForceDestroyMachine(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~DestroyMachineResult]<~DestroyMachineResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~DestroyMachineResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='MachineManager', request='ForceDestroyMachine', version=3, params=_params) + msg = dict(type='MachineManager', + request='ForceDestroyMachine', + version=3, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -2057,12 +3306,15 @@ class MachineManagerFacade(Type): @ReturnMapping(InstanceTypesResults) async def InstanceTypes(self, constraints): ''' - constraints : typing.Sequence<+T_co>[~ModelInstanceTypesConstraint]<~ModelInstanceTypesConstraint> - Returns -> typing.Sequence<+T_co>[~InstanceTypesResult]<~InstanceTypesResult> + constraints : typing.Sequence[~ModelInstanceTypesConstraint] + Returns -> typing.Sequence[~InstanceTypesResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='MachineManager', request='InstanceTypes', version=3, params=_params) + msg = dict(type='MachineManager', + request='InstanceTypes', + version=3, + params=_params) _params['constraints'] = constraints reply = await self.rpc(msg) return reply @@ -2377,16 +3629,19 @@ class ModelManagerFacade(Type): async def CreateModel(self, cloud_tag, config, credential, name, owner_tag, region): ''' cloud_tag : str - config : typing.Mapping<~KT, +VT_co>[str, typing.Any] + config : typing.Mapping[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>] + Returns -> typing.Union[_ForwardRef('Number'), str, typing.Sequence[~ModelMachineInfo], _ForwardRef('ModelMigrationStatus'), _ForwardRef('ModelSLAInfo'), _ForwardRef('EntityStatus'), typing.Sequence[~ModelUserInfo]] ''' # map input types to rpc msg _params = dict() - msg = dict(type='ModelManager', request='CreateModel', version=3, params=_params) + msg = dict(type='ModelManager', + request='CreateModel', + version=3, + params=_params) _params['cloud-tag'] = cloud_tag _params['config'] = config _params['credential'] = credential @@ -2401,12 +3656,15 @@ class ModelManagerFacade(Type): @ReturnMapping(ErrorResults) async def DestroyModels(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='ModelManager', request='DestroyModels', version=3, params=_params) + msg = dict(type='ModelManager', + request='DestroyModels', + version=3, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -2416,13 +3674,16 @@ class ModelManagerFacade(Type): @ReturnMapping(StringResults) async def DumpModels(self, entities, simplified): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> + entities : typing.Sequence[~Entity] simplified : bool - Returns -> typing.Sequence<+T_co>[~StringResult]<~StringResult> + Returns -> typing.Sequence[~StringResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='ModelManager', request='DumpModels', version=3, params=_params) + msg = dict(type='ModelManager', + request='DumpModels', + version=3, + params=_params) _params['entities'] = entities _params['simplified'] = simplified reply = await self.rpc(msg) @@ -2433,12 +3694,15 @@ class ModelManagerFacade(Type): @ReturnMapping(MapResults) async def DumpModelsDB(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~MapResult]<~MapResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~MapResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='ModelManager', request='DumpModelsDB', version=3, params=_params) + msg = dict(type='ModelManager', + request='DumpModelsDB', + version=3, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -2449,11 +3713,14 @@ class ModelManagerFacade(Type): async def ListModels(self, tag): ''' tag : str - Returns -> typing.Sequence<+T_co>[~UserModel]<~UserModel> + Returns -> typing.Sequence[~UserModel] ''' # map input types to rpc msg _params = dict() - msg = dict(type='ModelManager', request='ListModels', version=3, params=_params) + msg = dict(type='ModelManager', + request='ListModels', + version=3, + params=_params) _params['tag'] = tag reply = await self.rpc(msg) return reply @@ -2464,11 +3731,14 @@ class ModelManagerFacade(Type): async def ModelDefaults(self): ''' - Returns -> typing.Mapping<~KT, +VT_co>[str, ~ModelDefaults]<~ModelDefaults> + Returns -> typing.Mapping[str, ~ModelDefaults] ''' # map input types to rpc msg _params = dict() - msg = dict(type='ModelManager', request='ModelDefaults', version=3, params=_params) + msg = dict(type='ModelManager', + request='ModelDefaults', + version=3, + params=_params) reply = await self.rpc(msg) return reply @@ -2478,12 +3748,15 @@ class ModelManagerFacade(Type): @ReturnMapping(ModelInfoResults) async def ModelInfo(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~ModelInfoResult]<~ModelInfoResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ModelInfoResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='ModelManager', request='ModelInfo', version=3, params=_params) + msg = dict(type='ModelManager', + request='ModelInfo', + version=3, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -2493,12 +3766,15 @@ class ModelManagerFacade(Type): @ReturnMapping(ModelStatusResults) async def ModelStatus(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~ModelStatus]<~ModelStatus> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ModelStatus] ''' # map input types to rpc msg _params = dict() - msg = dict(type='ModelManager', request='ModelStatus', version=3, params=_params) + msg = dict(type='ModelManager', + request='ModelStatus', + version=3, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -2508,12 +3784,15 @@ class ModelManagerFacade(Type): @ReturnMapping(ErrorResults) async def ModifyModelAccess(self, changes): ''' - changes : typing.Sequence<+T_co>[~ModifyModelAccess]<~ModifyModelAccess> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + changes : typing.Sequence[~ModifyModelAccess] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='ModelManager', request='ModifyModelAccess', version=3, params=_params) + msg = dict(type='ModelManager', + request='ModifyModelAccess', + version=3, + params=_params) _params['changes'] = changes reply = await self.rpc(msg) return reply @@ -2523,12 +3802,15 @@ class ModelManagerFacade(Type): @ReturnMapping(ErrorResults) async def SetModelDefaults(self, config): ''' - config : typing.Sequence<+T_co>[~ModelDefaultValues]<~ModelDefaultValues> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + config : typing.Sequence[~ModelDefaultValues] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='ModelManager', request='SetModelDefaults', version=3, params=_params) + msg = dict(type='ModelManager', + request='SetModelDefaults', + version=3, + params=_params) _params['config'] = config reply = await self.rpc(msg) return reply @@ -2538,12 +3820,15 @@ class ModelManagerFacade(Type): @ReturnMapping(ErrorResults) async def UnsetModelDefaults(self, keys): ''' - keys : typing.Sequence<+T_co>[~ModelUnsetKeys]<~ModelUnsetKeys> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + keys : typing.Sequence[~ModelUnsetKeys] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='ModelManager', request='UnsetModelDefaults', version=3, params=_params) + msg = dict(type='ModelManager', + request='UnsetModelDefaults', + version=3, + params=_params) _params['keys'] = keys reply = await self.rpc(msg) return reply @@ -3203,11 +4488,14 @@ class ProvisionerFacade(Type): async def APIAddresses(self): ''' - Returns -> typing.Union[_ForwardRef('Error'), typing.Sequence<+T_co>[str]] + Returns -> typing.Union[_ForwardRef('Error'), typing.Sequence[str]] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Provisioner', request='APIAddresses', version=3, params=_params) + msg = dict(type='Provisioner', + request='APIAddresses', + version=3, + params=_params) reply = await self.rpc(msg) return reply @@ -3218,11 +4506,14 @@ class ProvisionerFacade(Type): async def APIHostPorts(self): ''' - Returns -> typing.Sequence<+T_co>[~HostPort]<~HostPort> + Returns -> typing.Sequence[~HostPort] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Provisioner', request='APIHostPorts', version=3, params=_params) + msg = dict(type='Provisioner', + request='APIHostPorts', + version=3, + params=_params) reply = await self.rpc(msg) return reply @@ -3233,11 +4524,14 @@ class ProvisionerFacade(Type): async def CACert(self): ''' - Returns -> typing.Sequence<+T_co>[int] + Returns -> typing.Sequence[int] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Provisioner', request='CACert', version=3, params=_params) + msg = dict(type='Provisioner', + request='CACert', + version=3, + params=_params) reply = await self.rpc(msg) return reply @@ -3247,12 +4541,15 @@ class ProvisionerFacade(Type): @ReturnMapping(ConstraintsResults) async def Constraints(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~ConstraintsResult]<~ConstraintsResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ConstraintsResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Provisioner', request='Constraints', version=3, params=_params) + msg = dict(type='Provisioner', + request='Constraints', + version=3, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -3263,11 +4560,14 @@ class ProvisionerFacade(Type): async def ContainerConfig(self): ''' - Returns -> typing.Union[_ForwardRef('UpdateBehavior'), str, _ForwardRef('Settings'), _ForwardRef('Settings'), bool] + Returns -> typing.Union[_ForwardRef('UpdateBehavior'), str, _ForwardRef('Settings'), bool] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Provisioner', request='ContainerConfig', version=3, params=_params) + msg = dict(type='Provisioner', + request='ContainerConfig', + version=3, + params=_params) reply = await self.rpc(msg) return reply @@ -3278,11 +4578,14 @@ class ProvisionerFacade(Type): async def ContainerManagerConfig(self, type_): ''' type_ : str - Returns -> typing.Mapping<~KT, +VT_co>[str, str] + Returns -> typing.Mapping[str, str] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Provisioner', request='ContainerManagerConfig', version=3, params=_params) + msg = dict(type='Provisioner', + request='ContainerManagerConfig', + version=3, + params=_params) _params['type'] = type_ reply = await self.rpc(msg) return reply @@ -3293,11 +4596,14 @@ class ProvisionerFacade(Type): async def ControllerConfig(self): ''' - Returns -> typing.Mapping<~KT, +VT_co>[str, typing.Any] + Returns -> typing.Mapping[str, typing.Any] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Provisioner', request='ControllerConfig', version=3, params=_params) + msg = dict(type='Provisioner', + request='ControllerConfig', + version=3, + params=_params) reply = await self.rpc(msg) return reply @@ -3307,12 +4613,15 @@ class ProvisionerFacade(Type): @ReturnMapping(DistributionGroupResults) async def DistributionGroup(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~DistributionGroupResult]<~DistributionGroupResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~DistributionGroupResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Provisioner', request='DistributionGroup', version=3, params=_params) + msg = dict(type='Provisioner', + request='DistributionGroup', + version=3, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -3322,12 +4631,15 @@ class ProvisionerFacade(Type): @ReturnMapping(ErrorResults) async def EnsureDead(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Provisioner', request='EnsureDead', version=3, params=_params) + msg = dict(type='Provisioner', + request='EnsureDead', + version=3, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -3342,11 +4654,14 @@ class ProvisionerFacade(Type): minor : int number : Number series : str - Returns -> typing.Union[_ForwardRef('Error'), typing.Sequence<+T_co>[~Tools]<~Tools>] + Returns -> typing.Union[_ForwardRef('Error'), typing.Sequence[~Tools]] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Provisioner', request='FindTools', version=3, params=_params) + msg = dict(type='Provisioner', + request='FindTools', + version=3, + params=_params) _params['arch'] = arch _params['major'] = major _params['minor'] = minor @@ -3360,12 +4675,15 @@ class ProvisionerFacade(Type): @ReturnMapping(MachineNetworkConfigResults) async def GetContainerInterfaceInfo(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~MachineNetworkConfigResult]<~MachineNetworkConfigResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~MachineNetworkConfigResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Provisioner', request='GetContainerInterfaceInfo', version=3, params=_params) + msg = dict(type='Provisioner', + request='GetContainerInterfaceInfo', + version=3, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -3375,12 +4693,15 @@ class ProvisionerFacade(Type): @ReturnMapping(HostNetworkChangeResults) async def HostChangesForContainers(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~HostNetworkChange]<~HostNetworkChange> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~HostNetworkChange] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Provisioner', request='HostChangesForContainers', version=3, params=_params) + msg = dict(type='Provisioner', + request='HostChangesForContainers', + version=3, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -3390,12 +4711,15 @@ class ProvisionerFacade(Type): @ReturnMapping(StringResults) async def InstanceId(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~StringResult]<~StringResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~StringResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Provisioner', request='InstanceId', version=3, params=_params) + msg = dict(type='Provisioner', + request='InstanceId', + version=3, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -3405,12 +4729,15 @@ class ProvisionerFacade(Type): @ReturnMapping(StatusResults) async def InstanceStatus(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~StatusResult]<~StatusResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~StatusResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Provisioner', request='InstanceStatus', version=3, params=_params) + msg = dict(type='Provisioner', + request='InstanceStatus', + version=3, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -3420,12 +4747,15 @@ class ProvisionerFacade(Type): @ReturnMapping(LifeResults) async def Life(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~LifeResult]<~LifeResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~LifeResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Provisioner', request='Life', version=3, params=_params) + msg = dict(type='Provisioner', + request='Life', + version=3, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -3436,11 +4766,14 @@ class ProvisionerFacade(Type): async def MachinesWithTransientErrors(self): ''' - Returns -> typing.Sequence<+T_co>[~StatusResult]<~StatusResult> + Returns -> typing.Sequence[~StatusResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Provisioner', request='MachinesWithTransientErrors', version=3, params=_params) + msg = dict(type='Provisioner', + request='MachinesWithTransientErrors', + version=3, + params=_params) reply = await self.rpc(msg) return reply @@ -3450,12 +4783,15 @@ class ProvisionerFacade(Type): @ReturnMapping(ErrorResults) async def MarkMachinesForRemoval(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Provisioner', request='MarkMachinesForRemoval', version=3, params=_params) + msg = dict(type='Provisioner', + request='MarkMachinesForRemoval', + version=3, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -3466,11 +4802,14 @@ class ProvisionerFacade(Type): async def ModelConfig(self): ''' - Returns -> typing.Mapping<~KT, +VT_co>[str, typing.Any] + Returns -> typing.Mapping[str, typing.Any] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Provisioner', request='ModelConfig', version=3, params=_params) + msg = dict(type='Provisioner', + request='ModelConfig', + version=3, + params=_params) reply = await self.rpc(msg) return reply @@ -3485,7 +4824,10 @@ class ProvisionerFacade(Type): ''' # map input types to rpc msg _params = dict() - msg = dict(type='Provisioner', request='ModelUUID', version=3, params=_params) + msg = dict(type='Provisioner', + request='ModelUUID', + version=3, + params=_params) reply = await self.rpc(msg) return reply @@ -3495,12 +4837,15 @@ class ProvisionerFacade(Type): @ReturnMapping(MachineNetworkConfigResults) async def PrepareContainerInterfaceInfo(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~MachineNetworkConfigResult]<~MachineNetworkConfigResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~MachineNetworkConfigResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Provisioner', request='PrepareContainerInterfaceInfo', version=3, params=_params) + msg = dict(type='Provisioner', + request='PrepareContainerInterfaceInfo', + version=3, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -3510,12 +4855,15 @@ class ProvisionerFacade(Type): @ReturnMapping(ProvisioningInfoResults) async def ProvisioningInfo(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~ProvisioningInfoResult]<~ProvisioningInfoResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ProvisioningInfoResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Provisioner', request='ProvisioningInfo', version=3, params=_params) + msg = dict(type='Provisioner', + request='ProvisioningInfo', + version=3, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -3525,12 +4873,15 @@ class ProvisionerFacade(Type): @ReturnMapping(ErrorResults) async def ReleaseContainerAddresses(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Provisioner', request='ReleaseContainerAddresses', version=3, params=_params) + msg = dict(type='Provisioner', + request='ReleaseContainerAddresses', + version=3, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -3540,12 +4891,15 @@ class ProvisionerFacade(Type): @ReturnMapping(ErrorResults) async def Remove(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Provisioner', request='Remove', version=3, params=_params) + msg = dict(type='Provisioner', + request='Remove', + version=3, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -3555,12 +4909,15 @@ class ProvisionerFacade(Type): @ReturnMapping(StringResults) async def Series(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~StringResult]<~StringResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~StringResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Provisioner', request='Series', version=3, params=_params) + msg = dict(type='Provisioner', + request='Series', + version=3, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -3570,13 +4927,16 @@ class ProvisionerFacade(Type): @ReturnMapping(None) async def SetHostMachineNetworkConfig(self, config, tag): ''' - config : typing.Sequence<+T_co>[~NetworkConfig]<~NetworkConfig> + config : typing.Sequence[~NetworkConfig] tag : str Returns -> None ''' # map input types to rpc msg _params = dict() - msg = dict(type='Provisioner', request='SetHostMachineNetworkConfig', version=3, params=_params) + msg = dict(type='Provisioner', + request='SetHostMachineNetworkConfig', + version=3, + params=_params) _params['config'] = config _params['tag'] = tag reply = await self.rpc(msg) @@ -3587,12 +4947,15 @@ class ProvisionerFacade(Type): @ReturnMapping(ErrorResults) async def SetInstanceInfo(self, machines): ''' - machines : typing.Sequence<+T_co>[~InstanceInfo]<~InstanceInfo> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + machines : typing.Sequence[~InstanceInfo] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Provisioner', request='SetInstanceInfo', version=3, params=_params) + msg = dict(type='Provisioner', + request='SetInstanceInfo', + version=3, + params=_params) _params['machines'] = machines reply = await self.rpc(msg) return reply @@ -3602,12 +4965,15 @@ class ProvisionerFacade(Type): @ReturnMapping(ErrorResults) async def SetInstanceStatus(self, entities): ''' - entities : typing.Sequence<+T_co>[~EntityStatusArgs]<~EntityStatusArgs> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + entities : typing.Sequence[~EntityStatusArgs] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Provisioner', request='SetInstanceStatus', version=3, params=_params) + msg = dict(type='Provisioner', + request='SetInstanceStatus', + version=3, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -3617,13 +4983,16 @@ class ProvisionerFacade(Type): @ReturnMapping(None) async def SetObservedNetworkConfig(self, config, tag): ''' - config : typing.Sequence<+T_co>[~NetworkConfig]<~NetworkConfig> + config : typing.Sequence[~NetworkConfig] tag : str Returns -> None ''' # map input types to rpc msg _params = dict() - msg = dict(type='Provisioner', request='SetObservedNetworkConfig', version=3, params=_params) + msg = dict(type='Provisioner', + request='SetObservedNetworkConfig', + version=3, + params=_params) _params['config'] = config _params['tag'] = tag reply = await self.rpc(msg) @@ -3634,12 +5003,15 @@ class ProvisionerFacade(Type): @ReturnMapping(ErrorResults) async def SetPasswords(self, changes): ''' - changes : typing.Sequence<+T_co>[~EntityPassword]<~EntityPassword> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + changes : typing.Sequence[~EntityPassword] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Provisioner', request='SetPasswords', version=3, params=_params) + msg = dict(type='Provisioner', + request='SetPasswords', + version=3, + params=_params) _params['changes'] = changes reply = await self.rpc(msg) return reply @@ -3649,12 +5021,15 @@ class ProvisionerFacade(Type): @ReturnMapping(ErrorResults) async def SetProviderNetworkConfig(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Provisioner', request='SetProviderNetworkConfig', version=3, params=_params) + msg = dict(type='Provisioner', + request='SetProviderNetworkConfig', + version=3, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -3664,12 +5039,15 @@ class ProvisionerFacade(Type): @ReturnMapping(ErrorResults) async def SetStatus(self, entities): ''' - entities : typing.Sequence<+T_co>[~EntityStatusArgs]<~EntityStatusArgs> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + entities : typing.Sequence[~EntityStatusArgs] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Provisioner', request='SetStatus', version=3, params=_params) + msg = dict(type='Provisioner', + request='SetStatus', + version=3, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -3679,12 +5057,15 @@ class ProvisionerFacade(Type): @ReturnMapping(ErrorResults) async def SetSupportedContainers(self, params): ''' - params : typing.Sequence<+T_co>[~MachineContainers]<~MachineContainers> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + params : typing.Sequence[~MachineContainers] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Provisioner', request='SetSupportedContainers', version=3, params=_params) + msg = dict(type='Provisioner', + request='SetSupportedContainers', + version=3, + params=_params) _params['params'] = params reply = await self.rpc(msg) return reply @@ -3695,11 +5076,14 @@ class ProvisionerFacade(Type): async def StateAddresses(self): ''' - Returns -> typing.Union[_ForwardRef('Error'), typing.Sequence<+T_co>[str]] + Returns -> typing.Union[_ForwardRef('Error'), typing.Sequence[str]] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Provisioner', request='StateAddresses', version=3, params=_params) + msg = dict(type='Provisioner', + request='StateAddresses', + version=3, + params=_params) reply = await self.rpc(msg) return reply @@ -3709,12 +5093,15 @@ class ProvisionerFacade(Type): @ReturnMapping(StatusResults) async def Status(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~StatusResult]<~StatusResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~StatusResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Provisioner', request='Status', version=3, params=_params) + msg = dict(type='Provisioner', + request='Status', + version=3, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -3724,12 +5111,15 @@ class ProvisionerFacade(Type): @ReturnMapping(ToolsResults) async def Tools(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~ToolsResult]<~ToolsResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ToolsResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Provisioner', request='Tools', version=3, params=_params) + msg = dict(type='Provisioner', + request='Tools', + version=3, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -3739,12 +5129,15 @@ class ProvisionerFacade(Type): @ReturnMapping(ErrorResults) async def UpdateStatus(self, entities): ''' - entities : typing.Sequence<+T_co>[~EntityStatusArgs]<~EntityStatusArgs> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + entities : typing.Sequence[~EntityStatusArgs] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Provisioner', request='UpdateStatus', version=3, params=_params) + msg = dict(type='Provisioner', + request='UpdateStatus', + version=3, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -3759,7 +5152,10 @@ class ProvisionerFacade(Type): ''' # map input types to rpc msg _params = dict() - msg = dict(type='Provisioner', request='WatchAPIHostPorts', version=3, params=_params) + msg = dict(type='Provisioner', + request='WatchAPIHostPorts', + version=3, + params=_params) reply = await self.rpc(msg) return reply @@ -3769,12 +5165,15 @@ class ProvisionerFacade(Type): @ReturnMapping(StringsWatchResults) async def WatchAllContainers(self, params): ''' - params : typing.Sequence<+T_co>[~WatchContainer]<~WatchContainer> - Returns -> typing.Sequence<+T_co>[~StringsWatchResult]<~StringsWatchResult> + params : typing.Sequence[~WatchContainer] + Returns -> typing.Sequence[~StringsWatchResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Provisioner', request='WatchAllContainers', version=3, params=_params) + msg = dict(type='Provisioner', + request='WatchAllContainers', + version=3, + params=_params) _params['params'] = params reply = await self.rpc(msg) return reply @@ -3784,12 +5183,15 @@ class ProvisionerFacade(Type): @ReturnMapping(StringsWatchResults) async def WatchContainers(self, params): ''' - params : typing.Sequence<+T_co>[~WatchContainer]<~WatchContainer> - Returns -> typing.Sequence<+T_co>[~StringsWatchResult]<~StringsWatchResult> + params : typing.Sequence[~WatchContainer] + Returns -> typing.Sequence[~StringsWatchResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Provisioner', request='WatchContainers', version=3, params=_params) + msg = dict(type='Provisioner', + request='WatchContainers', + version=3, + params=_params) _params['params'] = params reply = await self.rpc(msg) return reply @@ -3804,7 +5206,10 @@ class ProvisionerFacade(Type): ''' # map input types to rpc msg _params = dict() - msg = dict(type='Provisioner', request='WatchForModelConfigChanges', version=3, params=_params) + msg = dict(type='Provisioner', + request='WatchForModelConfigChanges', + version=3, + params=_params) reply = await self.rpc(msg) return reply @@ -3819,7 +5224,10 @@ class ProvisionerFacade(Type): ''' # map input types to rpc msg _params = dict() - msg = dict(type='Provisioner', request='WatchMachineErrorRetry', version=3, params=_params) + msg = dict(type='Provisioner', + request='WatchMachineErrorRetry', + version=3, + params=_params) reply = await self.rpc(msg) return reply @@ -3830,11 +5238,14 @@ class ProvisionerFacade(Type): async def WatchModelMachines(self): ''' - Returns -> typing.Union[typing.Sequence<+T_co>[str], _ForwardRef('Error')] + Returns -> typing.Union[typing.Sequence[str], _ForwardRef('Error'), str] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Provisioner', request='WatchModelMachines', version=3, params=_params) + msg = dict(type='Provisioner', + request='WatchModelMachines', + version=3, + params=_params) reply = await self.rpc(msg) return reply @@ -3919,12 +5330,15 @@ class SpacesFacade(Type): @ReturnMapping(ErrorResults) async def CreateSpaces(self, spaces): ''' - spaces : typing.Sequence<+T_co>[~CreateSpaceParams]<~CreateSpaceParams> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + spaces : typing.Sequence[~CreateSpaceParams] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Spaces', request='CreateSpaces', version=3, params=_params) + msg = dict(type='Spaces', + request='CreateSpaces', + version=3, + params=_params) _params['spaces'] = spaces reply = await self.rpc(msg) return reply @@ -3935,11 +5349,14 @@ class SpacesFacade(Type): async def ListSpaces(self): ''' - Returns -> typing.Sequence<+T_co>[~Space]<~Space> + Returns -> typing.Sequence[~Space] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Spaces', request='ListSpaces', version=3, params=_params) + msg = dict(type='Spaces', + request='ListSpaces', + version=3, + params=_params) reply = await self.rpc(msg) return reply @@ -3954,7 +5371,10 @@ class SpacesFacade(Type): ''' # map input types to rpc msg _params = dict() - msg = dict(type='Spaces', request='ReloadSpaces', version=3, params=_params) + msg = dict(type='Spaces', + request='ReloadSpaces', + version=3, + params=_params) reply = await self.rpc(msg) return reply @@ -4233,12 +5653,15 @@ class StorageFacade(Type): @ReturnMapping(ErrorResults) async def AddToUnit(self, storages): ''' - storages : typing.Sequence<+T_co>[~StorageAddParams]<~StorageAddParams> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + storages : typing.Sequence[~StorageAddParams] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Storage', request='AddToUnit', version=3, params=_params) + msg = dict(type='Storage', + request='AddToUnit', + version=3, + params=_params) _params['storages'] = storages reply = await self.rpc(msg) return reply @@ -4248,12 +5671,15 @@ class StorageFacade(Type): @ReturnMapping(ErrorResults) async def Attach(self, ids): ''' - ids : typing.Sequence<+T_co>[~StorageAttachmentId]<~StorageAttachmentId> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + ids : typing.Sequence[~StorageAttachmentId] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Storage', request='Attach', version=3, params=_params) + msg = dict(type='Storage', + request='Attach', + version=3, + params=_params) _params['ids'] = ids reply = await self.rpc(msg) return reply @@ -4263,14 +5689,17 @@ class StorageFacade(Type): @ReturnMapping(None) async def CreatePool(self, attrs, name, provider): ''' - attrs : typing.Mapping<~KT, +VT_co>[str, typing.Any] + attrs : typing.Mapping[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) + msg = dict(type='Storage', + request='CreatePool', + version=3, + params=_params) _params['attrs'] = attrs _params['name'] = name _params['provider'] = provider @@ -4282,12 +5711,15 @@ class StorageFacade(Type): @ReturnMapping(ErrorResults) async def Destroy(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Storage', request='Destroy', version=3, params=_params) + msg = dict(type='Storage', + request='Destroy', + version=3, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -4297,12 +5729,15 @@ class StorageFacade(Type): @ReturnMapping(ErrorResults) async def Detach(self, ids): ''' - ids : typing.Sequence<+T_co>[~StorageAttachmentId]<~StorageAttachmentId> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + ids : typing.Sequence[~StorageAttachmentId] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Storage', request='Detach', version=3, params=_params) + msg = dict(type='Storage', + request='Detach', + version=3, + params=_params) _params['ids'] = ids reply = await self.rpc(msg) return reply @@ -4312,12 +5747,15 @@ class StorageFacade(Type): @ReturnMapping(FilesystemDetailsListResults) async def ListFilesystems(self, filters): ''' - filters : typing.Sequence<+T_co>[~FilesystemFilter]<~FilesystemFilter> - Returns -> typing.Sequence<+T_co>[~FilesystemDetailsListResult]<~FilesystemDetailsListResult> + filters : typing.Sequence[~FilesystemFilter] + Returns -> typing.Sequence[~FilesystemDetailsListResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Storage', request='ListFilesystems', version=3, params=_params) + msg = dict(type='Storage', + request='ListFilesystems', + version=3, + params=_params) _params['filters'] = filters reply = await self.rpc(msg) return reply @@ -4327,12 +5765,15 @@ class StorageFacade(Type): @ReturnMapping(StoragePoolsResults) async def ListPools(self, filters): ''' - filters : typing.Sequence<+T_co>[~StoragePoolFilter]<~StoragePoolFilter> - Returns -> typing.Sequence<+T_co>[~StoragePoolsResult]<~StoragePoolsResult> + filters : typing.Sequence[~StoragePoolFilter] + Returns -> typing.Sequence[~StoragePoolsResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Storage', request='ListPools', version=3, params=_params) + msg = dict(type='Storage', + request='ListPools', + version=3, + params=_params) _params['filters'] = filters reply = await self.rpc(msg) return reply @@ -4342,12 +5783,15 @@ class StorageFacade(Type): @ReturnMapping(StorageDetailsListResults) async def ListStorageDetails(self, filters): ''' - filters : typing.Sequence<+T_co>[~StorageFilter]<~StorageFilter> - Returns -> typing.Sequence<+T_co>[~StorageDetailsListResult]<~StorageDetailsListResult> + filters : typing.Sequence[~StorageFilter] + Returns -> typing.Sequence[~StorageDetailsListResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Storage', request='ListStorageDetails', version=3, params=_params) + msg = dict(type='Storage', + request='ListStorageDetails', + version=3, + params=_params) _params['filters'] = filters reply = await self.rpc(msg) return reply @@ -4357,12 +5801,15 @@ class StorageFacade(Type): @ReturnMapping(VolumeDetailsListResults) async def ListVolumes(self, filters): ''' - filters : typing.Sequence<+T_co>[~VolumeFilter]<~VolumeFilter> - Returns -> typing.Sequence<+T_co>[~VolumeDetailsListResult]<~VolumeDetailsListResult> + filters : typing.Sequence[~VolumeFilter] + Returns -> typing.Sequence[~VolumeDetailsListResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Storage', request='ListVolumes', version=3, params=_params) + msg = dict(type='Storage', + request='ListVolumes', + version=3, + params=_params) _params['filters'] = filters reply = await self.rpc(msg) return reply @@ -4372,12 +5819,15 @@ class StorageFacade(Type): @ReturnMapping(StorageDetailsResults) async def StorageDetails(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~StorageDetailsResult]<~StorageDetailsResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~StorageDetailsResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Storage', request='StorageDetails', version=3, params=_params) + msg = dict(type='Storage', + request='StorageDetails', + version=3, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -4817,12 +6267,15 @@ class StorageProvisionerFacade(Type): @ReturnMapping(LifeResults) async def AttachmentLife(self, ids): ''' - ids : typing.Sequence<+T_co>[~MachineStorageId]<~MachineStorageId> - Returns -> typing.Sequence<+T_co>[~LifeResult]<~LifeResult> + ids : typing.Sequence[~MachineStorageId] + Returns -> typing.Sequence[~LifeResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='StorageProvisioner', request='AttachmentLife', version=3, params=_params) + msg = dict(type='StorageProvisioner', + request='AttachmentLife', + version=3, + params=_params) _params['ids'] = ids reply = await self.rpc(msg) return reply @@ -4832,12 +6285,15 @@ class StorageProvisionerFacade(Type): @ReturnMapping(ErrorResults) async def EnsureDead(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='StorageProvisioner', request='EnsureDead', version=3, params=_params) + msg = dict(type='StorageProvisioner', + request='EnsureDead', + version=3, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -4847,12 +6303,15 @@ class StorageProvisionerFacade(Type): @ReturnMapping(FilesystemAttachmentParamsResults) async def FilesystemAttachmentParams(self, ids): ''' - ids : typing.Sequence<+T_co>[~MachineStorageId]<~MachineStorageId> - Returns -> typing.Sequence<+T_co>[~FilesystemAttachmentParamsResult]<~FilesystemAttachmentParamsResult> + ids : typing.Sequence[~MachineStorageId] + Returns -> typing.Sequence[~FilesystemAttachmentParamsResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='StorageProvisioner', request='FilesystemAttachmentParams', version=3, params=_params) + msg = dict(type='StorageProvisioner', + request='FilesystemAttachmentParams', + version=3, + params=_params) _params['ids'] = ids reply = await self.rpc(msg) return reply @@ -4862,12 +6321,15 @@ class StorageProvisionerFacade(Type): @ReturnMapping(FilesystemAttachmentResults) async def FilesystemAttachments(self, ids): ''' - ids : typing.Sequence<+T_co>[~MachineStorageId]<~MachineStorageId> - Returns -> typing.Sequence<+T_co>[~FilesystemAttachmentResult]<~FilesystemAttachmentResult> + ids : typing.Sequence[~MachineStorageId] + Returns -> typing.Sequence[~FilesystemAttachmentResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='StorageProvisioner', request='FilesystemAttachments', version=3, params=_params) + msg = dict(type='StorageProvisioner', + request='FilesystemAttachments', + version=3, + params=_params) _params['ids'] = ids reply = await self.rpc(msg) return reply @@ -4877,12 +6339,15 @@ class StorageProvisionerFacade(Type): @ReturnMapping(FilesystemParamsResults) async def FilesystemParams(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~FilesystemParamsResult]<~FilesystemParamsResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~FilesystemParamsResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='StorageProvisioner', request='FilesystemParams', version=3, params=_params) + msg = dict(type='StorageProvisioner', + request='FilesystemParams', + version=3, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -4892,12 +6357,15 @@ class StorageProvisionerFacade(Type): @ReturnMapping(FilesystemResults) async def Filesystems(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~FilesystemResult]<~FilesystemResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~FilesystemResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='StorageProvisioner', request='Filesystems', version=3, params=_params) + msg = dict(type='StorageProvisioner', + request='Filesystems', + version=3, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -4907,12 +6375,15 @@ class StorageProvisionerFacade(Type): @ReturnMapping(StringResults) async def InstanceId(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~StringResult]<~StringResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~StringResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='StorageProvisioner', request='InstanceId', version=3, params=_params) + msg = dict(type='StorageProvisioner', + request='InstanceId', + version=3, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -4922,12 +6393,15 @@ class StorageProvisionerFacade(Type): @ReturnMapping(LifeResults) async def Life(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~LifeResult]<~LifeResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~LifeResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='StorageProvisioner', request='Life', version=3, params=_params) + msg = dict(type='StorageProvisioner', + request='Life', + version=3, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -4937,12 +6411,15 @@ class StorageProvisionerFacade(Type): @ReturnMapping(ErrorResults) async def Remove(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='StorageProvisioner', request='Remove', version=3, params=_params) + msg = dict(type='StorageProvisioner', + request='Remove', + version=3, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -4952,12 +6429,15 @@ class StorageProvisionerFacade(Type): @ReturnMapping(ErrorResults) async def RemoveAttachment(self, ids): ''' - ids : typing.Sequence<+T_co>[~MachineStorageId]<~MachineStorageId> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + ids : typing.Sequence[~MachineStorageId] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='StorageProvisioner', request='RemoveAttachment', version=3, params=_params) + msg = dict(type='StorageProvisioner', + request='RemoveAttachment', + version=3, + params=_params) _params['ids'] = ids reply = await self.rpc(msg) return reply @@ -4967,12 +6447,15 @@ class StorageProvisionerFacade(Type): @ReturnMapping(ErrorResults) async def SetFilesystemAttachmentInfo(self, filesystem_attachments): ''' - filesystem_attachments : typing.Sequence<+T_co>[~FilesystemAttachment]<~FilesystemAttachment> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + filesystem_attachments : typing.Sequence[~FilesystemAttachment] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='StorageProvisioner', request='SetFilesystemAttachmentInfo', version=3, params=_params) + msg = dict(type='StorageProvisioner', + request='SetFilesystemAttachmentInfo', + version=3, + params=_params) _params['filesystem-attachments'] = filesystem_attachments reply = await self.rpc(msg) return reply @@ -4982,12 +6465,15 @@ class StorageProvisionerFacade(Type): @ReturnMapping(ErrorResults) async def SetFilesystemInfo(self, filesystems): ''' - filesystems : typing.Sequence<+T_co>[~Filesystem]<~Filesystem> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + filesystems : typing.Sequence[~Filesystem] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='StorageProvisioner', request='SetFilesystemInfo', version=3, params=_params) + msg = dict(type='StorageProvisioner', + request='SetFilesystemInfo', + version=3, + params=_params) _params['filesystems'] = filesystems reply = await self.rpc(msg) return reply @@ -4997,12 +6483,15 @@ class StorageProvisionerFacade(Type): @ReturnMapping(ErrorResults) async def SetStatus(self, entities): ''' - entities : typing.Sequence<+T_co>[~EntityStatusArgs]<~EntityStatusArgs> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + entities : typing.Sequence[~EntityStatusArgs] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='StorageProvisioner', request='SetStatus', version=3, params=_params) + msg = dict(type='StorageProvisioner', + request='SetStatus', + version=3, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -5012,12 +6501,15 @@ class StorageProvisionerFacade(Type): @ReturnMapping(ErrorResults) async def SetVolumeAttachmentInfo(self, volume_attachments): ''' - volume_attachments : typing.Sequence<+T_co>[~VolumeAttachment]<~VolumeAttachment> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + volume_attachments : typing.Sequence[~VolumeAttachment] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='StorageProvisioner', request='SetVolumeAttachmentInfo', version=3, params=_params) + msg = dict(type='StorageProvisioner', + request='SetVolumeAttachmentInfo', + version=3, + params=_params) _params['volume-attachments'] = volume_attachments reply = await self.rpc(msg) return reply @@ -5027,12 +6519,15 @@ class StorageProvisionerFacade(Type): @ReturnMapping(ErrorResults) async def SetVolumeInfo(self, volumes): ''' - volumes : typing.Sequence<+T_co>[~Volume]<~Volume> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + volumes : typing.Sequence[~Volume] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='StorageProvisioner', request='SetVolumeInfo', version=3, params=_params) + msg = dict(type='StorageProvisioner', + request='SetVolumeInfo', + version=3, + params=_params) _params['volumes'] = volumes reply = await self.rpc(msg) return reply @@ -5042,12 +6537,15 @@ class StorageProvisionerFacade(Type): @ReturnMapping(ErrorResults) async def UpdateStatus(self, entities): ''' - entities : typing.Sequence<+T_co>[~EntityStatusArgs]<~EntityStatusArgs> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + entities : typing.Sequence[~EntityStatusArgs] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='StorageProvisioner', request='UpdateStatus', version=3, params=_params) + msg = dict(type='StorageProvisioner', + request='UpdateStatus', + version=3, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -5057,12 +6555,15 @@ class StorageProvisionerFacade(Type): @ReturnMapping(VolumeAttachmentParamsResults) async def VolumeAttachmentParams(self, ids): ''' - ids : typing.Sequence<+T_co>[~MachineStorageId]<~MachineStorageId> - Returns -> typing.Sequence<+T_co>[~VolumeAttachmentParamsResult]<~VolumeAttachmentParamsResult> + ids : typing.Sequence[~MachineStorageId] + Returns -> typing.Sequence[~VolumeAttachmentParamsResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='StorageProvisioner', request='VolumeAttachmentParams', version=3, params=_params) + msg = dict(type='StorageProvisioner', + request='VolumeAttachmentParams', + version=3, + params=_params) _params['ids'] = ids reply = await self.rpc(msg) return reply @@ -5072,12 +6573,15 @@ class StorageProvisionerFacade(Type): @ReturnMapping(VolumeAttachmentResults) async def VolumeAttachments(self, ids): ''' - ids : typing.Sequence<+T_co>[~MachineStorageId]<~MachineStorageId> - Returns -> typing.Sequence<+T_co>[~VolumeAttachmentResult]<~VolumeAttachmentResult> + ids : typing.Sequence[~MachineStorageId] + Returns -> typing.Sequence[~VolumeAttachmentResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='StorageProvisioner', request='VolumeAttachments', version=3, params=_params) + msg = dict(type='StorageProvisioner', + request='VolumeAttachments', + version=3, + params=_params) _params['ids'] = ids reply = await self.rpc(msg) return reply @@ -5087,12 +6591,15 @@ class StorageProvisionerFacade(Type): @ReturnMapping(BlockDeviceResults) async def VolumeBlockDevices(self, ids): ''' - ids : typing.Sequence<+T_co>[~MachineStorageId]<~MachineStorageId> - Returns -> typing.Sequence<+T_co>[~BlockDeviceResult]<~BlockDeviceResult> + ids : typing.Sequence[~MachineStorageId] + Returns -> typing.Sequence[~BlockDeviceResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='StorageProvisioner', request='VolumeBlockDevices', version=3, params=_params) + msg = dict(type='StorageProvisioner', + request='VolumeBlockDevices', + version=3, + params=_params) _params['ids'] = ids reply = await self.rpc(msg) return reply @@ -5102,12 +6609,15 @@ class StorageProvisionerFacade(Type): @ReturnMapping(VolumeParamsResults) async def VolumeParams(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~VolumeParamsResult]<~VolumeParamsResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~VolumeParamsResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='StorageProvisioner', request='VolumeParams', version=3, params=_params) + msg = dict(type='StorageProvisioner', + request='VolumeParams', + version=3, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -5117,12 +6627,15 @@ class StorageProvisionerFacade(Type): @ReturnMapping(VolumeResults) async def Volumes(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~VolumeResult]<~VolumeResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~VolumeResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='StorageProvisioner', request='Volumes', version=3, params=_params) + msg = dict(type='StorageProvisioner', + request='Volumes', + version=3, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -5132,12 +6645,15 @@ class StorageProvisionerFacade(Type): @ReturnMapping(NotifyWatchResults) async def WatchBlockDevices(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~NotifyWatchResult]<~NotifyWatchResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~NotifyWatchResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='StorageProvisioner', request='WatchBlockDevices', version=3, params=_params) + msg = dict(type='StorageProvisioner', + request='WatchBlockDevices', + version=3, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -5147,12 +6663,15 @@ class StorageProvisionerFacade(Type): @ReturnMapping(MachineStorageIdsWatchResults) async def WatchFilesystemAttachments(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~MachineStorageIdsWatchResult]<~MachineStorageIdsWatchResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~MachineStorageIdsWatchResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='StorageProvisioner', request='WatchFilesystemAttachments', version=3, params=_params) + msg = dict(type='StorageProvisioner', + request='WatchFilesystemAttachments', + version=3, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -5162,12 +6681,15 @@ class StorageProvisionerFacade(Type): @ReturnMapping(StringsWatchResults) async def WatchFilesystems(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~StringsWatchResult]<~StringsWatchResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~StringsWatchResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='StorageProvisioner', request='WatchFilesystems', version=3, params=_params) + msg = dict(type='StorageProvisioner', + request='WatchFilesystems', + version=3, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -5177,12 +6699,15 @@ class StorageProvisionerFacade(Type): @ReturnMapping(NotifyWatchResults) async def WatchMachines(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~NotifyWatchResult]<~NotifyWatchResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~NotifyWatchResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='StorageProvisioner', request='WatchMachines', version=3, params=_params) + msg = dict(type='StorageProvisioner', + request='WatchMachines', + version=3, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -5192,12 +6717,15 @@ class StorageProvisionerFacade(Type): @ReturnMapping(MachineStorageIdsWatchResults) async def WatchVolumeAttachments(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~MachineStorageIdsWatchResult]<~MachineStorageIdsWatchResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~MachineStorageIdsWatchResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='StorageProvisioner', request='WatchVolumeAttachments', version=3, params=_params) + msg = dict(type='StorageProvisioner', + request='WatchVolumeAttachments', + version=3, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -5207,12 +6735,15 @@ class StorageProvisionerFacade(Type): @ReturnMapping(StringsWatchResults) async def WatchVolumes(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~StringsWatchResult]<~StringsWatchResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~StringsWatchResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='StorageProvisioner', request='WatchVolumes', version=3, params=_params) + msg = dict(type='StorageProvisioner', + request='WatchVolumes', + version=3, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply diff --git a/juju/client/_client4.py b/juju/client/_client4.py index 68ee3f9..2795b2c 100644 --- a/juju/client/_client4.py +++ b/juju/client/_client4.py @@ -412,12 +412,15 @@ class ApplicationFacade(Type): @ReturnMapping(AddRelationResults) async def AddRelation(self, endpoints): ''' - endpoints : typing.Sequence<+T_co>[str] - Returns -> typing.Mapping<~KT, +VT_co>[str, ~CharmRelation]<~CharmRelation> + endpoints : typing.Sequence[str] + Returns -> typing.Mapping[str, ~CharmRelation] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Application', request='AddRelation', version=4, params=_params) + msg = dict(type='Application', + request='AddRelation', + version=4, + params=_params) _params['endpoints'] = endpoints reply = await self.rpc(msg) return reply @@ -429,12 +432,15 @@ class ApplicationFacade(Type): ''' application : str num_units : int - placement : typing.Sequence<+T_co>[~Placement]<~Placement> - Returns -> typing.Sequence<+T_co>[str] + placement : typing.Sequence[~Placement] + Returns -> typing.Sequence[str] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Application', request='AddUnits', version=4, params=_params) + msg = dict(type='Application', + request='AddUnits', + version=4, + params=_params) _params['application'] = application _params['num-units'] = num_units _params['placement'] = placement @@ -447,11 +453,14 @@ class ApplicationFacade(Type): async def CharmRelations(self, application): ''' application : str - Returns -> typing.Sequence<+T_co>[str] + Returns -> typing.Sequence[str] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Application', request='CharmRelations', version=4, params=_params) + msg = dict(type='Application', + request='CharmRelations', + version=4, + params=_params) _params['application'] = application reply = await self.rpc(msg) return reply @@ -461,12 +470,15 @@ class ApplicationFacade(Type): @ReturnMapping(ConsumeApplicationResults) async def Consume(self, args): ''' - args : typing.Sequence<+T_co>[~ConsumeApplicationArg]<~ConsumeApplicationArg> - Returns -> typing.Sequence<+T_co>[~ConsumeApplicationResult]<~ConsumeApplicationResult> + args : typing.Sequence[~ConsumeApplicationArg] + Returns -> typing.Sequence[~ConsumeApplicationResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Application', request='Consume', version=4, params=_params) + msg = dict(type='Application', + request='Consume', + version=4, + params=_params) _params['args'] = args reply = await self.rpc(msg) return reply @@ -476,12 +488,15 @@ class ApplicationFacade(Type): @ReturnMapping(ErrorResults) async def Deploy(self, applications): ''' - applications : typing.Sequence<+T_co>[~ApplicationDeploy]<~ApplicationDeploy> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + applications : typing.Sequence[~ApplicationDeploy] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Application', request='Deploy', version=4, params=_params) + msg = dict(type='Application', + request='Deploy', + version=4, + params=_params) _params['applications'] = applications reply = await self.rpc(msg) return reply @@ -496,7 +511,10 @@ class ApplicationFacade(Type): ''' # map input types to rpc msg _params = dict() - msg = dict(type='Application', request='Destroy', version=4, params=_params) + msg = dict(type='Application', + request='Destroy', + version=4, + params=_params) _params['application'] = application reply = await self.rpc(msg) return reply @@ -506,12 +524,15 @@ class ApplicationFacade(Type): @ReturnMapping(DestroyApplicationResults) async def DestroyApplication(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~DestroyApplicationResult]<~DestroyApplicationResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~DestroyApplicationResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Application', request='DestroyApplication', version=4, params=_params) + msg = dict(type='Application', + request='DestroyApplication', + version=4, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -521,12 +542,15 @@ class ApplicationFacade(Type): @ReturnMapping(None) async def DestroyRelation(self, endpoints): ''' - endpoints : typing.Sequence<+T_co>[str] + endpoints : typing.Sequence[str] Returns -> None ''' # map input types to rpc msg _params = dict() - msg = dict(type='Application', request='DestroyRelation', version=4, params=_params) + msg = dict(type='Application', + request='DestroyRelation', + version=4, + params=_params) _params['endpoints'] = endpoints reply = await self.rpc(msg) return reply @@ -536,12 +560,15 @@ class ApplicationFacade(Type): @ReturnMapping(DestroyUnitResults) async def DestroyUnit(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~DestroyUnitResult]<~DestroyUnitResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~DestroyUnitResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Application', request='DestroyUnit', version=4, params=_params) + msg = dict(type='Application', + request='DestroyUnit', + version=4, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -551,12 +578,15 @@ class ApplicationFacade(Type): @ReturnMapping(None) async def DestroyUnits(self, unit_names): ''' - unit_names : typing.Sequence<+T_co>[str] + unit_names : typing.Sequence[str] Returns -> None ''' # map input types to rpc msg _params = dict() - msg = dict(type='Application', request='DestroyUnits', version=4, params=_params) + msg = dict(type='Application', + request='DestroyUnits', + version=4, + params=_params) _params['unit-names'] = unit_names reply = await self.rpc(msg) return reply @@ -571,7 +601,10 @@ class ApplicationFacade(Type): ''' # map input types to rpc msg _params = dict() - msg = dict(type='Application', request='Expose', version=4, params=_params) + msg = dict(type='Application', + request='Expose', + version=4, + params=_params) _params['application'] = application reply = await self.rpc(msg) return reply @@ -582,11 +615,14 @@ class ApplicationFacade(Type): async def Get(self, application): ''' application : str - Returns -> typing.Union[str, typing.Mapping<~KT, +VT_co>[str, typing.Any], _ForwardRef('Value')] + Returns -> typing.Union[str, typing.Mapping[str, typing.Any], _ForwardRef('Value')] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Application', request='Get', version=4, params=_params) + msg = dict(type='Application', + request='Get', + version=4, + params=_params) _params['application'] = application reply = await self.rpc(msg) return reply @@ -601,7 +637,10 @@ class ApplicationFacade(Type): ''' # map input types to rpc msg _params = dict() - msg = dict(type='Application', request='GetCharmURL', version=4, params=_params) + msg = dict(type='Application', + request='GetCharmURL', + version=4, + params=_params) _params['application'] = application reply = await self.rpc(msg) return reply @@ -616,7 +655,10 @@ class ApplicationFacade(Type): ''' # map input types to rpc msg _params = dict() - msg = dict(type='Application', request='GetConstraints', version=4, params=_params) + msg = dict(type='Application', + request='GetConstraints', + version=4, + params=_params) _params['application'] = application reply = await self.rpc(msg) return reply @@ -626,12 +668,15 @@ class ApplicationFacade(Type): @ReturnMapping(RemoteApplicationInfoResults) async def RemoteApplicationInfo(self, application_urls): ''' - application_urls : typing.Sequence<+T_co>[str] - Returns -> typing.Sequence<+T_co>[~RemoteApplicationInfoResult]<~RemoteApplicationInfoResult> + application_urls : typing.Sequence[str] + Returns -> typing.Sequence[~RemoteApplicationInfoResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Application', request='RemoteApplicationInfo', version=4, params=_params) + msg = dict(type='Application', + request='RemoteApplicationInfo', + version=4, + params=_params) _params['application-urls'] = application_urls reply = await self.rpc(msg) return reply @@ -642,12 +687,15 @@ class ApplicationFacade(Type): async def Set(self, application, options): ''' application : str - options : typing.Mapping<~KT, +VT_co>[str, str] + options : typing.Mapping[str, str] Returns -> None ''' # map input types to rpc msg _params = dict() - msg = dict(type='Application', request='Set', version=4, params=_params) + msg = dict(type='Application', + request='Set', + version=4, + params=_params) _params['application'] = application _params['options'] = options reply = await self.rpc(msg) @@ -661,17 +709,20 @@ class ApplicationFacade(Type): application : str channel : str charm_url : str - config_settings : typing.Mapping<~KT, +VT_co>[str, str] + config_settings : typing.Mapping[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> + resource_ids : typing.Mapping[str, str] + storage_constraints : typing.Mapping[str, ~StorageConstraints] Returns -> None ''' # map input types to rpc msg _params = dict() - msg = dict(type='Application', request='SetCharm', version=4, params=_params) + msg = dict(type='Application', + request='SetCharm', + version=4, + params=_params) _params['application'] = application _params['channel'] = channel _params['charm-url'] = charm_url @@ -695,7 +746,10 @@ class ApplicationFacade(Type): ''' # map input types to rpc msg _params = dict() - msg = dict(type='Application', request='SetConstraints', version=4, params=_params) + msg = dict(type='Application', + request='SetConstraints', + version=4, + params=_params) _params['application'] = application _params['constraints'] = constraints reply = await self.rpc(msg) @@ -706,12 +760,15 @@ class ApplicationFacade(Type): @ReturnMapping(ErrorResults) async def SetMetricCredentials(self, creds): ''' - creds : typing.Sequence<+T_co>[~ApplicationMetricCredential]<~ApplicationMetricCredential> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + creds : typing.Sequence[~ApplicationMetricCredential] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Application', request='SetMetricCredentials', version=4, params=_params) + msg = dict(type='Application', + request='SetMetricCredentials', + version=4, + params=_params) _params['creds'] = creds reply = await self.rpc(msg) return reply @@ -726,7 +783,10 @@ class ApplicationFacade(Type): ''' # map input types to rpc msg _params = dict() - msg = dict(type='Application', request='Unexpose', version=4, params=_params) + msg = dict(type='Application', + request='Unexpose', + version=4, + params=_params) _params['application'] = application reply = await self.rpc(msg) return reply @@ -737,12 +797,15 @@ class ApplicationFacade(Type): async def Unset(self, application, options): ''' application : str - options : typing.Sequence<+T_co>[str] + options : typing.Sequence[str] Returns -> None ''' # map input types to rpc msg _params = dict() - msg = dict(type='Application', request='Unset', version=4, params=_params) + msg = dict(type='Application', + request='Unset', + version=4, + params=_params) _params['application'] = application _params['options'] = options reply = await self.rpc(msg) @@ -759,13 +822,16 @@ class ApplicationFacade(Type): force_charm_url : bool force_series : bool min_units : int - settings : typing.Mapping<~KT, +VT_co>[str, str] + settings : typing.Mapping[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) + msg = dict(type='Application', + request='Update', + version=4, + params=_params) _params['application'] = application _params['charm-url'] = charm_url _params['constraints'] = constraints @@ -779,6 +845,1687 @@ class ApplicationFacade(Type): +class StorageFacade(Type): + name = 'Storage' + version = 4 + schema = {'definitions': {'AddStorageDetails': {'additionalProperties': False, + 'properties': {'storage-tags': {'items': {'type': 'string'}, + 'type': 'array'}}, + 'required': ['storage-tags'], + 'type': 'object'}, + 'AddStorageResult': {'additionalProperties': False, + 'properties': {'error': {'$ref': '#/definitions/Error'}, + 'result': {'$ref': '#/definitions/AddStorageDetails'}}, + 'type': 'object'}, + 'AddStorageResults': {'additionalProperties': False, + 'properties': {'results': {'items': {'$ref': '#/definitions/AddStorageResult'}, + 'type': 'array'}}, + 'required': ['results'], + 'type': 'object'}, + 'BulkImportStorageParams': {'additionalProperties': False, + 'properties': {'storage': {'items': {'$ref': '#/definitions/ImportStorageParams'}, + 'type': 'array'}}, + 'required': ['storage'], + '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'}, + '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'}, + 'unit-attachments': {'patternProperties': {'.*': {'$ref': '#/definitions/FilesystemAttachmentDetails'}}, + 'type': 'object'}, + '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'}, + 'ImportStorageDetails': {'additionalProperties': False, + 'properties': {'storage-tag': {'type': 'string'}}, + 'required': ['storage-tag'], + 'type': 'object'}, + 'ImportStorageParams': {'additionalProperties': False, + 'properties': {'kind': {'type': 'integer'}, + 'pool': {'type': 'string'}, + 'provider-id': {'type': 'string'}, + 'storage-name': {'type': 'string'}}, + 'required': ['kind', + 'pool', + 'provider-id', + 'storage-name'], + 'type': 'object'}, + 'ImportStorageResult': {'additionalProperties': False, + 'properties': {'error': {'$ref': '#/definitions/Error'}, + 'result': {'$ref': '#/definitions/ImportStorageDetails'}}, + 'type': 'object'}, + 'ImportStorageResults': {'additionalProperties': False, + 'properties': {'results': {'items': {'$ref': '#/definitions/ImportStorageResult'}, + 'type': 'array'}}, + 'required': ['results'], + 'type': 'object'}, + 'Macaroon': {'additionalProperties': False, 'type': 'object'}, + 'RemoveStorage': {'additionalProperties': False, + 'properties': {'storage': {'items': {'$ref': '#/definitions/RemoveStorageInstance'}, + 'type': 'array'}}, + 'required': ['storage'], + 'type': 'object'}, + 'RemoveStorageInstance': {'additionalProperties': False, + 'properties': {'destroy-attachments': {'type': 'boolean'}, + 'destroy-storage': {'type': 'boolean'}, + 'tag': {'type': 'string'}}, + 'required': ['tag'], + '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'}, + 'plan-info': {'$ref': '#/definitions/VolumeAttachmentPlanInfo'}, + 'read-only': {'type': 'boolean'}}, + 'type': 'object'}, + 'VolumeAttachmentPlanInfo': {'additionalProperties': False, + 'properties': {'device-attributes': {'patternProperties': {'.*': {'type': 'string'}}, + 'type': 'object'}, + 'device-type': {'type': 'string'}}, + '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'}, + 'unit-attachments': {'patternProperties': {'.*': {'$ref': '#/definitions/VolumeAttachmentDetails'}}, + 'type': 'object'}, + '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/AddStorageResults'}}, + 'type': 'object'}, + 'Attach': {'properties': {'Params': {'$ref': '#/definitions/StorageAttachmentIds'}, + 'Result': {'$ref': '#/definitions/ErrorResults'}}, + 'type': 'object'}, + 'CreatePool': {'properties': {'Params': {'$ref': '#/definitions/StoragePool'}}, + 'type': 'object'}, + 'Detach': {'properties': {'Params': {'$ref': '#/definitions/StorageAttachmentIds'}, + 'Result': {'$ref': '#/definitions/ErrorResults'}}, + 'type': 'object'}, + 'Import': {'properties': {'Params': {'$ref': '#/definitions/BulkImportStorageParams'}, + 'Result': {'$ref': '#/definitions/ImportStorageResults'}}, + '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'}, + 'Remove': {'properties': {'Params': {'$ref': '#/definitions/RemoveStorage'}, + 'Result': {'$ref': '#/definitions/ErrorResults'}}, + 'type': 'object'}, + 'StorageDetails': {'properties': {'Params': {'$ref': '#/definitions/Entities'}, + 'Result': {'$ref': '#/definitions/StorageDetailsResults'}}, + 'type': 'object'}}, + 'type': 'object'} + + + @ReturnMapping(AddStorageResults) + async def AddToUnit(self, storages): + ''' + storages : typing.Sequence[~StorageAddParams] + Returns -> typing.Sequence[~AddStorageResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Storage', + request='AddToUnit', + version=4, + params=_params) + _params['storages'] = storages + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResults) + async def Attach(self, ids): + ''' + ids : typing.Sequence[~StorageAttachmentId] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Storage', + request='Attach', + version=4, + params=_params) + _params['ids'] = ids + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(None) + async def CreatePool(self, attrs, name, provider): + ''' + attrs : typing.Mapping[str, typing.Any] + name : str + provider : str + Returns -> None + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Storage', + request='CreatePool', + version=4, + params=_params) + _params['attrs'] = attrs + _params['name'] = name + _params['provider'] = provider + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResults) + async def Detach(self, ids): + ''' + ids : typing.Sequence[~StorageAttachmentId] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Storage', + request='Detach', + version=4, + params=_params) + _params['ids'] = ids + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ImportStorageResults) + async def Import(self, storage): + ''' + storage : typing.Sequence[~ImportStorageParams] + Returns -> typing.Sequence[~ImportStorageResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Storage', + request='Import', + version=4, + params=_params) + _params['storage'] = storage + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(FilesystemDetailsListResults) + async def ListFilesystems(self, filters): + ''' + filters : typing.Sequence[~FilesystemFilter] + Returns -> typing.Sequence[~FilesystemDetailsListResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Storage', + request='ListFilesystems', + version=4, + params=_params) + _params['filters'] = filters + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(StoragePoolsResults) + async def ListPools(self, filters): + ''' + filters : typing.Sequence[~StoragePoolFilter] + Returns -> typing.Sequence[~StoragePoolsResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Storage', + request='ListPools', + version=4, + params=_params) + _params['filters'] = filters + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(StorageDetailsListResults) + async def ListStorageDetails(self, filters): + ''' + filters : typing.Sequence[~StorageFilter] + Returns -> typing.Sequence[~StorageDetailsListResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Storage', + request='ListStorageDetails', + version=4, + params=_params) + _params['filters'] = filters + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(VolumeDetailsListResults) + async def ListVolumes(self, filters): + ''' + filters : typing.Sequence[~VolumeFilter] + Returns -> typing.Sequence[~VolumeDetailsListResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Storage', + request='ListVolumes', + version=4, + params=_params) + _params['filters'] = filters + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResults) + async def Remove(self, storage): + ''' + storage : typing.Sequence[~RemoveStorageInstance] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Storage', + request='Remove', + version=4, + params=_params) + _params['storage'] = storage + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(StorageDetailsResults) + async def StorageDetails(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~StorageDetailsResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Storage', + request='StorageDetails', + version=4, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + +class StorageProvisionerFacade(Type): + name = 'StorageProvisioner' + version = 4 + 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'}, + 'RemoveFilesystemParams': {'additionalProperties': False, + 'properties': {'destroy': {'type': 'boolean'}, + 'filesystem-id': {'type': 'string'}, + 'provider': {'type': 'string'}}, + 'required': ['provider', + 'filesystem-id'], + 'type': 'object'}, + 'RemoveFilesystemParamsResult': {'additionalProperties': False, + 'properties': {'error': {'$ref': '#/definitions/Error'}, + 'result': {'$ref': '#/definitions/RemoveFilesystemParams'}}, + 'required': ['result'], + 'type': 'object'}, + 'RemoveFilesystemParamsResults': {'additionalProperties': False, + 'properties': {'results': {'items': {'$ref': '#/definitions/RemoveFilesystemParamsResult'}, + 'type': 'array'}}, + 'type': 'object'}, + 'RemoveVolumeParams': {'additionalProperties': False, + 'properties': {'destroy': {'type': 'boolean'}, + 'provider': {'type': 'string'}, + 'volume-id': {'type': 'string'}}, + 'required': ['provider', 'volume-id'], + 'type': 'object'}, + 'RemoveVolumeParamsResult': {'additionalProperties': False, + 'properties': {'error': {'$ref': '#/definitions/Error'}, + 'result': {'$ref': '#/definitions/RemoveVolumeParams'}}, + 'required': ['result'], + 'type': 'object'}, + 'RemoveVolumeParamsResults': {'additionalProperties': False, + 'properties': {'results': {'items': {'$ref': '#/definitions/RemoveVolumeParamsResult'}, + 'type': 'array'}}, + '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'}, + 'plan-info': {'$ref': '#/definitions/VolumeAttachmentPlanInfo'}, + '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'}, + 'VolumeAttachmentPlan': {'additionalProperties': False, + 'properties': {'block-device': {'$ref': '#/definitions/BlockDevice'}, + 'life': {'type': 'string'}, + 'machine-tag': {'type': 'string'}, + 'plan-info': {'$ref': '#/definitions/VolumeAttachmentPlanInfo'}, + 'volume-tag': {'type': 'string'}}, + 'required': ['volume-tag', + 'machine-tag', + 'plan-info'], + 'type': 'object'}, + 'VolumeAttachmentPlanInfo': {'additionalProperties': False, + 'properties': {'device-attributes': {'patternProperties': {'.*': {'type': 'string'}}, + 'type': 'object'}, + 'device-type': {'type': 'string'}}, + 'type': 'object'}, + 'VolumeAttachmentPlanResult': {'additionalProperties': False, + 'properties': {'error': {'$ref': '#/definitions/Error'}, + 'result': {'$ref': '#/definitions/VolumeAttachmentPlan'}}, + 'required': ['result'], + 'type': 'object'}, + 'VolumeAttachmentPlanResults': {'additionalProperties': False, + 'properties': {'results': {'items': {'$ref': '#/definitions/VolumeAttachmentPlanResult'}, + 'type': 'array'}}, + 'type': 'object'}, + 'VolumeAttachmentPlans': {'additionalProperties': False, + 'properties': {'volume-plans': {'items': {'$ref': '#/definitions/VolumeAttachmentPlan'}, + 'type': 'array'}}, + 'required': ['volume-plans'], + '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'}, + 'CreateVolumeAttachmentPlans': {'properties': {'Params': {'$ref': '#/definitions/VolumeAttachmentPlans'}, + 'Result': {'$ref': '#/definitions/ErrorResults'}}, + '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'}, + 'RemoveFilesystemParams': {'properties': {'Params': {'$ref': '#/definitions/Entities'}, + 'Result': {'$ref': '#/definitions/RemoveFilesystemParamsResults'}}, + 'type': 'object'}, + 'RemoveVolumeAttachmentPlan': {'properties': {'Params': {'$ref': '#/definitions/MachineStorageIds'}, + 'Result': {'$ref': '#/definitions/ErrorResults'}}, + 'type': 'object'}, + 'RemoveVolumeParams': {'properties': {'Params': {'$ref': '#/definitions/Entities'}, + 'Result': {'$ref': '#/definitions/RemoveVolumeParamsResults'}}, + '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'}, + 'SetVolumeAttachmentPlanBlockInfo': {'properties': {'Params': {'$ref': '#/definitions/VolumeAttachmentPlans'}, + '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'}, + 'VolumeAttachmentPlans': {'properties': {'Params': {'$ref': '#/definitions/MachineStorageIds'}, + 'Result': {'$ref': '#/definitions/VolumeAttachmentPlanResults'}}, + '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'}, + 'WatchApplications': {'properties': {'Result': {'$ref': '#/definitions/StringsWatchResult'}}, + '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'}, + 'WatchVolumeAttachmentPlans': {'properties': {'Params': {'$ref': '#/definitions/Entities'}, + 'Result': {'$ref': '#/definitions/MachineStorageIdsWatchResults'}}, + '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[~MachineStorageId] + Returns -> typing.Sequence[~LifeResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='StorageProvisioner', + request='AttachmentLife', + version=4, + params=_params) + _params['ids'] = ids + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResults) + async def CreateVolumeAttachmentPlans(self, volume_plans): + ''' + volume_plans : typing.Sequence[~VolumeAttachmentPlan] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='StorageProvisioner', + request='CreateVolumeAttachmentPlans', + version=4, + params=_params) + _params['volume-plans'] = volume_plans + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResults) + async def EnsureDead(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='StorageProvisioner', + request='EnsureDead', + version=4, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(FilesystemAttachmentParamsResults) + async def FilesystemAttachmentParams(self, ids): + ''' + ids : typing.Sequence[~MachineStorageId] + Returns -> typing.Sequence[~FilesystemAttachmentParamsResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='StorageProvisioner', + request='FilesystemAttachmentParams', + version=4, + params=_params) + _params['ids'] = ids + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(FilesystemAttachmentResults) + async def FilesystemAttachments(self, ids): + ''' + ids : typing.Sequence[~MachineStorageId] + Returns -> typing.Sequence[~FilesystemAttachmentResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='StorageProvisioner', + request='FilesystemAttachments', + version=4, + params=_params) + _params['ids'] = ids + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(FilesystemParamsResults) + async def FilesystemParams(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~FilesystemParamsResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='StorageProvisioner', + request='FilesystemParams', + version=4, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(FilesystemResults) + async def Filesystems(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~FilesystemResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='StorageProvisioner', + request='Filesystems', + version=4, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(StringResults) + async def InstanceId(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~StringResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='StorageProvisioner', + request='InstanceId', + version=4, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(LifeResults) + async def Life(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~LifeResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='StorageProvisioner', + request='Life', + version=4, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResults) + async def Remove(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='StorageProvisioner', + request='Remove', + version=4, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResults) + async def RemoveAttachment(self, ids): + ''' + ids : typing.Sequence[~MachineStorageId] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='StorageProvisioner', + request='RemoveAttachment', + version=4, + params=_params) + _params['ids'] = ids + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(RemoveFilesystemParamsResults) + async def RemoveFilesystemParams(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~RemoveFilesystemParamsResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='StorageProvisioner', + request='RemoveFilesystemParams', + version=4, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResults) + async def RemoveVolumeAttachmentPlan(self, ids): + ''' + ids : typing.Sequence[~MachineStorageId] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='StorageProvisioner', + request='RemoveVolumeAttachmentPlan', + version=4, + params=_params) + _params['ids'] = ids + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(RemoveVolumeParamsResults) + async def RemoveVolumeParams(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~RemoveVolumeParamsResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='StorageProvisioner', + request='RemoveVolumeParams', + version=4, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResults) + async def SetFilesystemAttachmentInfo(self, filesystem_attachments): + ''' + filesystem_attachments : typing.Sequence[~FilesystemAttachment] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='StorageProvisioner', + request='SetFilesystemAttachmentInfo', + version=4, + params=_params) + _params['filesystem-attachments'] = filesystem_attachments + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResults) + async def SetFilesystemInfo(self, filesystems): + ''' + filesystems : typing.Sequence[~Filesystem] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='StorageProvisioner', + request='SetFilesystemInfo', + version=4, + params=_params) + _params['filesystems'] = filesystems + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResults) + async def SetStatus(self, entities): + ''' + entities : typing.Sequence[~EntityStatusArgs] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='StorageProvisioner', + request='SetStatus', + version=4, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResults) + async def SetVolumeAttachmentInfo(self, volume_attachments): + ''' + volume_attachments : typing.Sequence[~VolumeAttachment] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='StorageProvisioner', + request='SetVolumeAttachmentInfo', + version=4, + params=_params) + _params['volume-attachments'] = volume_attachments + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResults) + async def SetVolumeAttachmentPlanBlockInfo(self, volume_plans): + ''' + volume_plans : typing.Sequence[~VolumeAttachmentPlan] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='StorageProvisioner', + request='SetVolumeAttachmentPlanBlockInfo', + version=4, + params=_params) + _params['volume-plans'] = volume_plans + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResults) + async def SetVolumeInfo(self, volumes): + ''' + volumes : typing.Sequence[~Volume] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='StorageProvisioner', + request='SetVolumeInfo', + version=4, + params=_params) + _params['volumes'] = volumes + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResults) + async def UpdateStatus(self, entities): + ''' + entities : typing.Sequence[~EntityStatusArgs] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='StorageProvisioner', + request='UpdateStatus', + version=4, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(VolumeAttachmentParamsResults) + async def VolumeAttachmentParams(self, ids): + ''' + ids : typing.Sequence[~MachineStorageId] + Returns -> typing.Sequence[~VolumeAttachmentParamsResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='StorageProvisioner', + request='VolumeAttachmentParams', + version=4, + params=_params) + _params['ids'] = ids + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(VolumeAttachmentPlanResults) + async def VolumeAttachmentPlans(self, ids): + ''' + ids : typing.Sequence[~MachineStorageId] + Returns -> typing.Sequence[~VolumeAttachmentPlanResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='StorageProvisioner', + request='VolumeAttachmentPlans', + version=4, + params=_params) + _params['ids'] = ids + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(VolumeAttachmentResults) + async def VolumeAttachments(self, ids): + ''' + ids : typing.Sequence[~MachineStorageId] + Returns -> typing.Sequence[~VolumeAttachmentResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='StorageProvisioner', + request='VolumeAttachments', + version=4, + params=_params) + _params['ids'] = ids + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(BlockDeviceResults) + async def VolumeBlockDevices(self, ids): + ''' + ids : typing.Sequence[~MachineStorageId] + Returns -> typing.Sequence[~BlockDeviceResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='StorageProvisioner', + request='VolumeBlockDevices', + version=4, + params=_params) + _params['ids'] = ids + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(VolumeParamsResults) + async def VolumeParams(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~VolumeParamsResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='StorageProvisioner', + request='VolumeParams', + version=4, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(VolumeResults) + async def Volumes(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~VolumeResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='StorageProvisioner', + request='Volumes', + version=4, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(StringsWatchResult) + async def WatchApplications(self): + ''' + + Returns -> typing.Union[typing.Sequence[str], _ForwardRef('Error'), str] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='StorageProvisioner', + request='WatchApplications', + version=4, + params=_params) + + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(NotifyWatchResults) + async def WatchBlockDevices(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~NotifyWatchResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='StorageProvisioner', + request='WatchBlockDevices', + version=4, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(MachineStorageIdsWatchResults) + async def WatchFilesystemAttachments(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~MachineStorageIdsWatchResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='StorageProvisioner', + request='WatchFilesystemAttachments', + version=4, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(StringsWatchResults) + async def WatchFilesystems(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~StringsWatchResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='StorageProvisioner', + request='WatchFilesystems', + version=4, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(NotifyWatchResults) + async def WatchMachines(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~NotifyWatchResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='StorageProvisioner', + request='WatchMachines', + version=4, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(MachineStorageIdsWatchResults) + async def WatchVolumeAttachmentPlans(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~MachineStorageIdsWatchResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='StorageProvisioner', + request='WatchVolumeAttachmentPlans', + version=4, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(MachineStorageIdsWatchResults) + async def WatchVolumeAttachments(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~MachineStorageIdsWatchResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='StorageProvisioner', + request='WatchVolumeAttachments', + version=4, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(StringsWatchResults) + async def WatchVolumes(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~StringsWatchResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='StorageProvisioner', + request='WatchVolumes', + version=4, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + class UniterFacade(Type): name = 'Uniter' version = 4 @@ -1624,11 +3371,14 @@ class UniterFacade(Type): async def APIAddresses(self): ''' - Returns -> typing.Union[_ForwardRef('Error'), typing.Sequence<+T_co>[str]] + Returns -> typing.Union[_ForwardRef('Error'), typing.Sequence[str]] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='APIAddresses', version=4, params=_params) + msg = dict(type='Uniter', + request='APIAddresses', + version=4, + params=_params) reply = await self.rpc(msg) return reply @@ -1639,11 +3389,14 @@ class UniterFacade(Type): async def APIHostPorts(self): ''' - Returns -> typing.Sequence<+T_co>[~HostPort]<~HostPort> + Returns -> typing.Sequence[~HostPort] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='APIHostPorts', version=4, params=_params) + msg = dict(type='Uniter', + request='APIHostPorts', + version=4, + params=_params) reply = await self.rpc(msg) return reply @@ -1653,12 +3406,15 @@ class UniterFacade(Type): @ReturnMapping(ActionResults) async def Actions(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~ActionResult]<~ActionResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ActionResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='Actions', version=4, params=_params) + msg = dict(type='Uniter', + request='Actions', + version=4, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -1668,12 +3424,15 @@ class UniterFacade(Type): @ReturnMapping(ErrorResults) async def AddMetricBatches(self, batches): ''' - batches : typing.Sequence<+T_co>[~MetricBatchParam]<~MetricBatchParam> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + batches : typing.Sequence[~MetricBatchParam] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='AddMetricBatches', version=4, params=_params) + msg = dict(type='Uniter', + request='AddMetricBatches', + version=4, + params=_params) _params['batches'] = batches reply = await self.rpc(msg) return reply @@ -1683,12 +3442,15 @@ class UniterFacade(Type): @ReturnMapping(ErrorResults) async def AddUnitStorage(self, storages): ''' - storages : typing.Sequence<+T_co>[~StorageAddParams]<~StorageAddParams> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + storages : typing.Sequence[~StorageAddParams] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='AddUnitStorage', version=4, params=_params) + msg = dict(type='Uniter', + request='AddUnitStorage', + version=4, + params=_params) _params['storages'] = storages reply = await self.rpc(msg) return reply @@ -1698,12 +3460,15 @@ class UniterFacade(Type): @ReturnMapping(MachinePortsResults) async def AllMachinePorts(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~MachinePortsResult]<~MachinePortsResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~MachinePortsResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='AllMachinePorts', version=4, params=_params) + msg = dict(type='Uniter', + request='AllMachinePorts', + version=4, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -1713,12 +3478,15 @@ class UniterFacade(Type): @ReturnMapping(ApplicationStatusResults) async def ApplicationStatus(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~ApplicationStatusResult]<~ApplicationStatusResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ApplicationStatusResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='ApplicationStatus', version=4, params=_params) + msg = dict(type='Uniter', + request='ApplicationStatus', + version=4, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -1728,12 +3496,15 @@ class UniterFacade(Type): @ReturnMapping(StringResults) async def AssignedMachine(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~StringResult]<~StringResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~StringResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='AssignedMachine', version=4, params=_params) + msg = dict(type='Uniter', + request='AssignedMachine', + version=4, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -1743,12 +3514,15 @@ class UniterFacade(Type): @ReturnMapping(StringResults) async def AvailabilityZone(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~StringResult]<~StringResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~StringResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='AvailabilityZone', version=4, params=_params) + msg = dict(type='Uniter', + request='AvailabilityZone', + version=4, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -1758,12 +3532,15 @@ class UniterFacade(Type): @ReturnMapping(ErrorResults) async def BeginActions(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='BeginActions', version=4, params=_params) + msg = dict(type='Uniter', + request='BeginActions', + version=4, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -1774,11 +3551,14 @@ class UniterFacade(Type): async def CACert(self): ''' - Returns -> typing.Sequence<+T_co>[int] + Returns -> typing.Sequence[int] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='CACert', version=4, params=_params) + msg = dict(type='Uniter', + request='CACert', + version=4, + params=_params) reply = await self.rpc(msg) return reply @@ -1788,12 +3568,15 @@ class UniterFacade(Type): @ReturnMapping(StringResults) async def CharmArchiveSha256(self, urls): ''' - urls : typing.Sequence<+T_co>[~CharmURL]<~CharmURL> - Returns -> typing.Sequence<+T_co>[~StringResult]<~StringResult> + urls : typing.Sequence[~CharmURL] + Returns -> typing.Sequence[~StringResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='CharmArchiveSha256', version=4, params=_params) + msg = dict(type='Uniter', + request='CharmArchiveSha256', + version=4, + params=_params) _params['urls'] = urls reply = await self.rpc(msg) return reply @@ -1803,12 +3586,15 @@ class UniterFacade(Type): @ReturnMapping(IntResults) async def CharmModifiedVersion(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~IntResult]<~IntResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~IntResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='CharmModifiedVersion', version=4, params=_params) + msg = dict(type='Uniter', + request='CharmModifiedVersion', + version=4, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -1818,12 +3604,15 @@ class UniterFacade(Type): @ReturnMapping(StringBoolResults) async def CharmURL(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~StringBoolResult]<~StringBoolResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~StringBoolResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='CharmURL', version=4, params=_params) + msg = dict(type='Uniter', + request='CharmURL', + version=4, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -1833,12 +3622,15 @@ class UniterFacade(Type): @ReturnMapping(ErrorResults) async def ClearResolved(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='ClearResolved', version=4, params=_params) + msg = dict(type='Uniter', + request='ClearResolved', + version=4, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -1848,12 +3640,15 @@ class UniterFacade(Type): @ReturnMapping(ErrorResults) async def ClosePorts(self, entities): ''' - entities : typing.Sequence<+T_co>[~EntityPortRange]<~EntityPortRange> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + entities : typing.Sequence[~EntityPortRange] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='ClosePorts', version=4, params=_params) + msg = dict(type='Uniter', + request='ClosePorts', + version=4, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -1863,12 +3658,15 @@ class UniterFacade(Type): @ReturnMapping(ConfigSettingsResults) async def ConfigSettings(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~ConfigSettingsResult]<~ConfigSettingsResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ConfigSettingsResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='ConfigSettings', version=4, params=_params) + msg = dict(type='Uniter', + request='ConfigSettings', + version=4, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -1883,7 +3681,10 @@ class UniterFacade(Type): ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='CurrentModel', version=4, params=_params) + msg = dict(type='Uniter', + request='CurrentModel', + version=4, + params=_params) reply = await self.rpc(msg) return reply @@ -1893,12 +3694,15 @@ class UniterFacade(Type): @ReturnMapping(ErrorResults) async def Destroy(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='Destroy', version=4, params=_params) + msg = dict(type='Uniter', + request='Destroy', + version=4, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -1908,12 +3712,15 @@ class UniterFacade(Type): @ReturnMapping(ErrorResults) async def DestroyAllSubordinates(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='DestroyAllSubordinates', version=4, params=_params) + msg = dict(type='Uniter', + request='DestroyAllSubordinates', + version=4, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -1923,12 +3730,15 @@ class UniterFacade(Type): @ReturnMapping(ErrorResults) async def DestroyUnitStorageAttachments(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='DestroyUnitStorageAttachments', version=4, params=_params) + msg = dict(type='Uniter', + request='DestroyUnitStorageAttachments', + version=4, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -1938,12 +3748,15 @@ class UniterFacade(Type): @ReturnMapping(ErrorResults) async def EnsureDead(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='EnsureDead', version=4, params=_params) + msg = dict(type='Uniter', + request='EnsureDead', + version=4, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -1953,12 +3766,15 @@ class UniterFacade(Type): @ReturnMapping(ErrorResults) async def EnterScope(self, relation_units): ''' - relation_units : typing.Sequence<+T_co>[~RelationUnit]<~RelationUnit> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + relation_units : typing.Sequence[~RelationUnit] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='EnterScope', version=4, params=_params) + msg = dict(type='Uniter', + request='EnterScope', + version=4, + params=_params) _params['relation-units'] = relation_units reply = await self.rpc(msg) return reply @@ -1968,12 +3784,15 @@ class UniterFacade(Type): @ReturnMapping(ErrorResults) async def FinishActions(self, results): ''' - results : typing.Sequence<+T_co>[~ActionExecutionResult]<~ActionExecutionResult> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + results : typing.Sequence[~ActionExecutionResult] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='FinishActions', version=4, params=_params) + msg = dict(type='Uniter', + request='FinishActions', + version=4, + params=_params) _params['results'] = results reply = await self.rpc(msg) return reply @@ -1983,12 +3802,15 @@ class UniterFacade(Type): @ReturnMapping(MeterStatusResults) async def GetMeterStatus(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~MeterStatusResult]<~MeterStatusResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~MeterStatusResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='GetMeterStatus', version=4, params=_params) + msg = dict(type='Uniter', + request='GetMeterStatus', + version=4, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -1998,12 +3820,15 @@ class UniterFacade(Type): @ReturnMapping(StringBoolResults) async def GetPrincipal(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~StringBoolResult]<~StringBoolResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~StringBoolResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='GetPrincipal', version=4, params=_params) + msg = dict(type='Uniter', + request='GetPrincipal', + version=4, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -2013,12 +3838,15 @@ class UniterFacade(Type): @ReturnMapping(BoolResults) async def HasSubordinates(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~BoolResult]<~BoolResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~BoolResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='HasSubordinates', version=4, params=_params) + msg = dict(type='Uniter', + request='HasSubordinates', + version=4, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -2028,12 +3856,15 @@ class UniterFacade(Type): @ReturnMapping(StringsResults) async def JoinedRelations(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~StringsResult]<~StringsResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~StringsResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='JoinedRelations', version=4, params=_params) + msg = dict(type='Uniter', + request='JoinedRelations', + version=4, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -2043,12 +3874,15 @@ class UniterFacade(Type): @ReturnMapping(ErrorResults) async def LeaveScope(self, relation_units): ''' - relation_units : typing.Sequence<+T_co>[~RelationUnit]<~RelationUnit> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + relation_units : typing.Sequence[~RelationUnit] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='LeaveScope', version=4, params=_params) + msg = dict(type='Uniter', + request='LeaveScope', + version=4, + params=_params) _params['relation-units'] = relation_units reply = await self.rpc(msg) return reply @@ -2058,12 +3892,15 @@ class UniterFacade(Type): @ReturnMapping(LifeResults) async def Life(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~LifeResult]<~LifeResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~LifeResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='Life', version=4, params=_params) + msg = dict(type='Uniter', + request='Life', + version=4, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -2073,12 +3910,15 @@ class UniterFacade(Type): @ReturnMapping(ErrorResults) async def Merge(self, params): ''' - params : typing.Sequence<+T_co>[~MergeLeadershipSettingsParam]<~MergeLeadershipSettingsParam> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + params : typing.Sequence[~MergeLeadershipSettingsParam] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='Merge', version=4, params=_params) + msg = dict(type='Uniter', + request='Merge', + version=4, + params=_params) _params['params'] = params reply = await self.rpc(msg) return reply @@ -2089,11 +3929,14 @@ class UniterFacade(Type): async def ModelConfig(self): ''' - Returns -> typing.Mapping<~KT, +VT_co>[str, typing.Any] + Returns -> typing.Mapping[str, typing.Any] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='ModelConfig', version=4, params=_params) + msg = dict(type='Uniter', + request='ModelConfig', + version=4, + params=_params) reply = await self.rpc(msg) return reply @@ -2108,7 +3951,10 @@ class UniterFacade(Type): ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='ModelUUID', version=4, params=_params) + msg = dict(type='Uniter', + request='ModelUUID', + version=4, + params=_params) reply = await self.rpc(msg) return reply @@ -2118,12 +3964,15 @@ class UniterFacade(Type): @ReturnMapping(UnitNetworkConfigResults) async def NetworkConfig(self, args): ''' - args : typing.Sequence<+T_co>[~UnitNetworkConfig]<~UnitNetworkConfig> - Returns -> typing.Sequence<+T_co>[~UnitNetworkConfigResult]<~UnitNetworkConfigResult> + args : typing.Sequence[~UnitNetworkConfig] + Returns -> typing.Sequence[~UnitNetworkConfigResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='NetworkConfig', version=4, params=_params) + msg = dict(type='Uniter', + request='NetworkConfig', + version=4, + params=_params) _params['args'] = args reply = await self.rpc(msg) return reply @@ -2133,12 +3982,15 @@ class UniterFacade(Type): @ReturnMapping(ErrorResults) async def OpenPorts(self, entities): ''' - entities : typing.Sequence<+T_co>[~EntityPortRange]<~EntityPortRange> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + entities : typing.Sequence[~EntityPortRange] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='OpenPorts', version=4, params=_params) + msg = dict(type='Uniter', + request='OpenPorts', + version=4, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -2148,12 +4000,15 @@ class UniterFacade(Type): @ReturnMapping(StringResults) async def PrivateAddress(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~StringResult]<~StringResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~StringResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='PrivateAddress', version=4, params=_params) + msg = dict(type='Uniter', + request='PrivateAddress', + version=4, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -2168,7 +4023,10 @@ class UniterFacade(Type): ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='ProviderType', version=4, params=_params) + msg = dict(type='Uniter', + request='ProviderType', + version=4, + params=_params) reply = await self.rpc(msg) return reply @@ -2178,12 +4036,15 @@ class UniterFacade(Type): @ReturnMapping(StringResults) async def PublicAddress(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~StringResult]<~StringResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~StringResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='PublicAddress', version=4, params=_params) + msg = dict(type='Uniter', + request='PublicAddress', + version=4, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -2193,12 +4054,15 @@ class UniterFacade(Type): @ReturnMapping(GetLeadershipSettingsBulkResults) async def Read(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~GetLeadershipSettingsResult]<~GetLeadershipSettingsResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~GetLeadershipSettingsResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='Read', version=4, params=_params) + msg = dict(type='Uniter', + request='Read', + version=4, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -2208,12 +4072,15 @@ class UniterFacade(Type): @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> + relation_unit_pairs : typing.Sequence[~RelationUnitPair] + Returns -> typing.Sequence[~SettingsResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='ReadRemoteSettings', version=4, params=_params) + msg = dict(type='Uniter', + request='ReadRemoteSettings', + version=4, + params=_params) _params['relation-unit-pairs'] = relation_unit_pairs reply = await self.rpc(msg) return reply @@ -2223,12 +4090,15 @@ class UniterFacade(Type): @ReturnMapping(SettingsResults) async def ReadSettings(self, relation_units): ''' - relation_units : typing.Sequence<+T_co>[~RelationUnit]<~RelationUnit> - Returns -> typing.Sequence<+T_co>[~SettingsResult]<~SettingsResult> + relation_units : typing.Sequence[~RelationUnit] + Returns -> typing.Sequence[~SettingsResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='ReadSettings', version=4, params=_params) + msg = dict(type='Uniter', + request='ReadSettings', + version=4, + params=_params) _params['relation-units'] = relation_units reply = await self.rpc(msg) return reply @@ -2238,12 +4108,15 @@ class UniterFacade(Type): @ReturnMapping(RelationResults) async def Relation(self, relation_units): ''' - relation_units : typing.Sequence<+T_co>[~RelationUnit]<~RelationUnit> - Returns -> typing.Sequence<+T_co>[~RelationResult]<~RelationResult> + relation_units : typing.Sequence[~RelationUnit] + Returns -> typing.Sequence[~RelationResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='Relation', version=4, params=_params) + msg = dict(type='Uniter', + request='Relation', + version=4, + params=_params) _params['relation-units'] = relation_units reply = await self.rpc(msg) return reply @@ -2253,12 +4126,15 @@ class UniterFacade(Type): @ReturnMapping(RelationResults) async def RelationById(self, relation_ids): ''' - relation_ids : typing.Sequence<+T_co>[int] - Returns -> typing.Sequence<+T_co>[~RelationResult]<~RelationResult> + relation_ids : typing.Sequence[int] + Returns -> typing.Sequence[~RelationResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='RelationById', version=4, params=_params) + msg = dict(type='Uniter', + request='RelationById', + version=4, + params=_params) _params['relation-ids'] = relation_ids reply = await self.rpc(msg) return reply @@ -2268,12 +4144,15 @@ class UniterFacade(Type): @ReturnMapping(ErrorResults) async def RemoveStorageAttachments(self, ids): ''' - ids : typing.Sequence<+T_co>[~StorageAttachmentId]<~StorageAttachmentId> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + ids : typing.Sequence[~StorageAttachmentId] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='RemoveStorageAttachments', version=4, params=_params) + msg = dict(type='Uniter', + request='RemoveStorageAttachments', + version=4, + params=_params) _params['ids'] = ids reply = await self.rpc(msg) return reply @@ -2283,12 +4162,15 @@ class UniterFacade(Type): @ReturnMapping(ErrorResults) async def RequestReboot(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='RequestReboot', version=4, params=_params) + msg = dict(type='Uniter', + request='RequestReboot', + version=4, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -2298,12 +4180,15 @@ class UniterFacade(Type): @ReturnMapping(ResolvedModeResults) async def Resolved(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~ResolvedModeResult]<~ResolvedModeResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ResolvedModeResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='Resolved', version=4, params=_params) + msg = dict(type='Uniter', + request='Resolved', + version=4, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -2313,12 +4198,15 @@ class UniterFacade(Type): @ReturnMapping(ErrorResults) async def SetAgentStatus(self, entities): ''' - entities : typing.Sequence<+T_co>[~EntityStatusArgs]<~EntityStatusArgs> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + entities : typing.Sequence[~EntityStatusArgs] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='SetAgentStatus', version=4, params=_params) + msg = dict(type='Uniter', + request='SetAgentStatus', + version=4, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -2328,12 +4216,15 @@ class UniterFacade(Type): @ReturnMapping(ErrorResults) async def SetApplicationStatus(self, entities): ''' - entities : typing.Sequence<+T_co>[~EntityStatusArgs]<~EntityStatusArgs> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + entities : typing.Sequence[~EntityStatusArgs] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='SetApplicationStatus', version=4, params=_params) + msg = dict(type='Uniter', + request='SetApplicationStatus', + version=4, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -2343,12 +4234,15 @@ class UniterFacade(Type): @ReturnMapping(ErrorResults) async def SetCharmURL(self, entities): ''' - entities : typing.Sequence<+T_co>[~EntityCharmURL]<~EntityCharmURL> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + entities : typing.Sequence[~EntityCharmURL] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='SetCharmURL', version=4, params=_params) + msg = dict(type='Uniter', + request='SetCharmURL', + version=4, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -2358,12 +4252,15 @@ class UniterFacade(Type): @ReturnMapping(ErrorResults) async def SetStatus(self, entities): ''' - entities : typing.Sequence<+T_co>[~EntityStatusArgs]<~EntityStatusArgs> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + entities : typing.Sequence[~EntityStatusArgs] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='SetStatus', version=4, params=_params) + msg = dict(type='Uniter', + request='SetStatus', + version=4, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -2373,12 +4270,15 @@ class UniterFacade(Type): @ReturnMapping(ErrorResults) async def SetUnitStatus(self, entities): ''' - entities : typing.Sequence<+T_co>[~EntityStatusArgs]<~EntityStatusArgs> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + entities : typing.Sequence[~EntityStatusArgs] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='SetUnitStatus', version=4, params=_params) + msg = dict(type='Uniter', + request='SetUnitStatus', + version=4, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -2388,12 +4288,15 @@ class UniterFacade(Type): @ReturnMapping(ErrorResults) async def SetWorkloadVersion(self, entities): ''' - entities : typing.Sequence<+T_co>[~EntityWorkloadVersion]<~EntityWorkloadVersion> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + entities : typing.Sequence[~EntityWorkloadVersion] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='SetWorkloadVersion', version=4, params=_params) + msg = dict(type='Uniter', + request='SetWorkloadVersion', + version=4, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -2403,12 +4306,15 @@ class UniterFacade(Type): @ReturnMapping(LifeResults) async def StorageAttachmentLife(self, ids): ''' - ids : typing.Sequence<+T_co>[~StorageAttachmentId]<~StorageAttachmentId> - Returns -> typing.Sequence<+T_co>[~LifeResult]<~LifeResult> + ids : typing.Sequence[~StorageAttachmentId] + Returns -> typing.Sequence[~LifeResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='StorageAttachmentLife', version=4, params=_params) + msg = dict(type='Uniter', + request='StorageAttachmentLife', + version=4, + params=_params) _params['ids'] = ids reply = await self.rpc(msg) return reply @@ -2418,12 +4324,15 @@ class UniterFacade(Type): @ReturnMapping(StorageAttachmentResults) async def StorageAttachments(self, ids): ''' - ids : typing.Sequence<+T_co>[~StorageAttachmentId]<~StorageAttachmentId> - Returns -> typing.Sequence<+T_co>[~StorageAttachmentResult]<~StorageAttachmentResult> + ids : typing.Sequence[~StorageAttachmentId] + Returns -> typing.Sequence[~StorageAttachmentResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='StorageAttachments', version=4, params=_params) + msg = dict(type='Uniter', + request='StorageAttachments', + version=4, + params=_params) _params['ids'] = ids reply = await self.rpc(msg) return reply @@ -2433,12 +4342,15 @@ class UniterFacade(Type): @ReturnMapping(StatusResults) async def UnitStatus(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~StatusResult]<~StatusResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~StatusResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='UnitStatus', version=4, params=_params) + msg = dict(type='Uniter', + request='UnitStatus', + version=4, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -2448,12 +4360,15 @@ class UniterFacade(Type): @ReturnMapping(StorageAttachmentIdsResults) async def UnitStorageAttachments(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~StorageAttachmentIdsResult]<~StorageAttachmentIdsResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~StorageAttachmentIdsResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='UnitStorageAttachments', version=4, params=_params) + msg = dict(type='Uniter', + request='UnitStorageAttachments', + version=4, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -2463,12 +4378,15 @@ class UniterFacade(Type): @ReturnMapping(ErrorResults) async def UpdateSettings(self, relation_units): ''' - relation_units : typing.Sequence<+T_co>[~RelationUnitSettings]<~RelationUnitSettings> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + relation_units : typing.Sequence[~RelationUnitSettings] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='UpdateSettings', version=4, params=_params) + msg = dict(type='Uniter', + request='UpdateSettings', + version=4, + params=_params) _params['relation-units'] = relation_units reply = await self.rpc(msg) return reply @@ -2478,12 +4396,15 @@ class UniterFacade(Type): @ReturnMapping(NotifyWatchResults) async def Watch(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~NotifyWatchResult]<~NotifyWatchResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~NotifyWatchResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='Watch', version=4, params=_params) + msg = dict(type='Uniter', + request='Watch', + version=4, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -2498,7 +4419,10 @@ class UniterFacade(Type): ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='WatchAPIHostPorts', version=4, params=_params) + msg = dict(type='Uniter', + request='WatchAPIHostPorts', + version=4, + params=_params) reply = await self.rpc(msg) return reply @@ -2508,12 +4432,15 @@ class UniterFacade(Type): @ReturnMapping(StringsWatchResults) async def WatchActionNotifications(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~StringsWatchResult]<~StringsWatchResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~StringsWatchResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='WatchActionNotifications', version=4, params=_params) + msg = dict(type='Uniter', + request='WatchActionNotifications', + version=4, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -2523,12 +4450,15 @@ class UniterFacade(Type): @ReturnMapping(StringsWatchResults) async def WatchApplicationRelations(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~StringsWatchResult]<~StringsWatchResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~StringsWatchResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='WatchApplicationRelations', version=4, params=_params) + msg = dict(type='Uniter', + request='WatchApplicationRelations', + version=4, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -2538,12 +4468,15 @@ class UniterFacade(Type): @ReturnMapping(NotifyWatchResults) async def WatchConfigSettings(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~NotifyWatchResult]<~NotifyWatchResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~NotifyWatchResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='WatchConfigSettings', version=4, params=_params) + msg = dict(type='Uniter', + request='WatchConfigSettings', + version=4, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -2558,7 +4491,10 @@ class UniterFacade(Type): ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='WatchForModelConfigChanges', version=4, params=_params) + msg = dict(type='Uniter', + request='WatchForModelConfigChanges', + version=4, + params=_params) reply = await self.rpc(msg) return reply @@ -2568,12 +4504,15 @@ class UniterFacade(Type): @ReturnMapping(NotifyWatchResults) async def WatchLeadershipSettings(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~NotifyWatchResult]<~NotifyWatchResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~NotifyWatchResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='WatchLeadershipSettings', version=4, params=_params) + msg = dict(type='Uniter', + request='WatchLeadershipSettings', + version=4, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -2583,12 +4522,15 @@ class UniterFacade(Type): @ReturnMapping(NotifyWatchResults) async def WatchMeterStatus(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~NotifyWatchResult]<~NotifyWatchResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~NotifyWatchResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='WatchMeterStatus', version=4, params=_params) + msg = dict(type='Uniter', + request='WatchMeterStatus', + version=4, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -2598,12 +4540,15 @@ class UniterFacade(Type): @ReturnMapping(RelationUnitsWatchResults) async def WatchRelationUnits(self, relation_units): ''' - relation_units : typing.Sequence<+T_co>[~RelationUnit]<~RelationUnit> - Returns -> typing.Sequence<+T_co>[~RelationUnitsWatchResult]<~RelationUnitsWatchResult> + relation_units : typing.Sequence[~RelationUnit] + Returns -> typing.Sequence[~RelationUnitsWatchResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='WatchRelationUnits', version=4, params=_params) + msg = dict(type='Uniter', + request='WatchRelationUnits', + version=4, + params=_params) _params['relation-units'] = relation_units reply = await self.rpc(msg) return reply @@ -2613,12 +4558,15 @@ class UniterFacade(Type): @ReturnMapping(NotifyWatchResults) async def WatchStorageAttachments(self, ids): ''' - ids : typing.Sequence<+T_co>[~StorageAttachmentId]<~StorageAttachmentId> - Returns -> typing.Sequence<+T_co>[~NotifyWatchResult]<~NotifyWatchResult> + ids : typing.Sequence[~StorageAttachmentId] + Returns -> typing.Sequence[~NotifyWatchResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='WatchStorageAttachments', version=4, params=_params) + msg = dict(type='Uniter', + request='WatchStorageAttachments', + version=4, + params=_params) _params['ids'] = ids reply = await self.rpc(msg) return reply @@ -2628,12 +4576,15 @@ class UniterFacade(Type): @ReturnMapping(NotifyWatchResults) async def WatchUnitAddresses(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~NotifyWatchResult]<~NotifyWatchResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~NotifyWatchResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='WatchUnitAddresses', version=4, params=_params) + msg = dict(type='Uniter', + request='WatchUnitAddresses', + version=4, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -2643,12 +4594,15 @@ class UniterFacade(Type): @ReturnMapping(StringsWatchResults) async def WatchUnitStorageAttachments(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~StringsWatchResult]<~StringsWatchResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~StringsWatchResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='WatchUnitStorageAttachments', version=4, params=_params) + msg = dict(type='Uniter', + request='WatchUnitStorageAttachments', + version=4, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -2658,12 +4612,15 @@ class UniterFacade(Type): @ReturnMapping(StringResults) async def WorkloadVersion(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~StringResult]<~StringResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~StringResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='WorkloadVersion', version=4, params=_params) + msg = dict(type='Uniter', + request='WorkloadVersion', + version=4, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply diff --git a/juju/client/_client5.py b/juju/client/_client5.py index 22805ed..51d36f3 100644 --- a/juju/client/_client5.py +++ b/juju/client/_client5.py @@ -429,12 +429,15 @@ class ApplicationFacade(Type): @ReturnMapping(AddRelationResults) async def AddRelation(self, endpoints): ''' - endpoints : typing.Sequence<+T_co>[str] - Returns -> typing.Mapping<~KT, +VT_co>[str, ~CharmRelation]<~CharmRelation> + endpoints : typing.Sequence[str] + Returns -> typing.Mapping[str, ~CharmRelation] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Application', request='AddRelation', version=5, params=_params) + msg = dict(type='Application', + request='AddRelation', + version=5, + params=_params) _params['endpoints'] = endpoints reply = await self.rpc(msg) return reply @@ -446,12 +449,15 @@ class ApplicationFacade(Type): ''' application : str num_units : int - placement : typing.Sequence<+T_co>[~Placement]<~Placement> - Returns -> typing.Sequence<+T_co>[str] + placement : typing.Sequence[~Placement] + Returns -> typing.Sequence[str] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Application', request='AddUnits', version=5, params=_params) + msg = dict(type='Application', + request='AddUnits', + version=5, + params=_params) _params['application'] = application _params['num-units'] = num_units _params['placement'] = placement @@ -464,11 +470,14 @@ class ApplicationFacade(Type): async def CharmRelations(self, application): ''' application : str - Returns -> typing.Sequence<+T_co>[str] + Returns -> typing.Sequence[str] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Application', request='CharmRelations', version=5, params=_params) + msg = dict(type='Application', + request='CharmRelations', + version=5, + params=_params) _params['application'] = application reply = await self.rpc(msg) return reply @@ -478,12 +487,15 @@ class ApplicationFacade(Type): @ReturnMapping(ErrorResults) async def Consume(self, args): ''' - args : typing.Sequence<+T_co>[~ConsumeApplicationArg]<~ConsumeApplicationArg> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + args : typing.Sequence[~ConsumeApplicationArg] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Application', request='Consume', version=5, params=_params) + msg = dict(type='Application', + request='Consume', + version=5, + params=_params) _params['args'] = args reply = await self.rpc(msg) return reply @@ -493,12 +505,15 @@ class ApplicationFacade(Type): @ReturnMapping(ErrorResults) async def Deploy(self, applications): ''' - applications : typing.Sequence<+T_co>[~ApplicationDeploy]<~ApplicationDeploy> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + applications : typing.Sequence[~ApplicationDeploy] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Application', request='Deploy', version=5, params=_params) + msg = dict(type='Application', + request='Deploy', + version=5, + params=_params) _params['applications'] = applications reply = await self.rpc(msg) return reply @@ -513,7 +528,10 @@ class ApplicationFacade(Type): ''' # map input types to rpc msg _params = dict() - msg = dict(type='Application', request='Destroy', version=5, params=_params) + msg = dict(type='Application', + request='Destroy', + version=5, + params=_params) _params['application'] = application reply = await self.rpc(msg) return reply @@ -523,12 +541,15 @@ class ApplicationFacade(Type): @ReturnMapping(DestroyApplicationResults) async def DestroyApplication(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~DestroyApplicationResult]<~DestroyApplicationResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~DestroyApplicationResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Application', request='DestroyApplication', version=5, params=_params) + msg = dict(type='Application', + request='DestroyApplication', + version=5, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -538,12 +559,15 @@ class ApplicationFacade(Type): @ReturnMapping(None) async def DestroyRelation(self, endpoints): ''' - endpoints : typing.Sequence<+T_co>[str] + endpoints : typing.Sequence[str] Returns -> None ''' # map input types to rpc msg _params = dict() - msg = dict(type='Application', request='DestroyRelation', version=5, params=_params) + msg = dict(type='Application', + request='DestroyRelation', + version=5, + params=_params) _params['endpoints'] = endpoints reply = await self.rpc(msg) return reply @@ -553,12 +577,15 @@ class ApplicationFacade(Type): @ReturnMapping(DestroyUnitResults) async def DestroyUnit(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~DestroyUnitResult]<~DestroyUnitResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~DestroyUnitResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Application', request='DestroyUnit', version=5, params=_params) + msg = dict(type='Application', + request='DestroyUnit', + version=5, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -568,12 +595,15 @@ class ApplicationFacade(Type): @ReturnMapping(None) async def DestroyUnits(self, unit_names): ''' - unit_names : typing.Sequence<+T_co>[str] + unit_names : typing.Sequence[str] Returns -> None ''' # map input types to rpc msg _params = dict() - msg = dict(type='Application', request='DestroyUnits', version=5, params=_params) + msg = dict(type='Application', + request='DestroyUnits', + version=5, + params=_params) _params['unit-names'] = unit_names reply = await self.rpc(msg) return reply @@ -588,7 +618,10 @@ class ApplicationFacade(Type): ''' # map input types to rpc msg _params = dict() - msg = dict(type='Application', request='Expose', version=5, params=_params) + msg = dict(type='Application', + request='Expose', + version=5, + params=_params) _params['application'] = application reply = await self.rpc(msg) return reply @@ -599,11 +632,14 @@ class ApplicationFacade(Type): async def Get(self, application): ''' application : str - Returns -> typing.Union[str, typing.Mapping<~KT, +VT_co>[str, typing.Any], _ForwardRef('Value')] + Returns -> typing.Union[str, typing.Mapping[str, typing.Any], _ForwardRef('Value')] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Application', request='Get', version=5, params=_params) + msg = dict(type='Application', + request='Get', + version=5, + params=_params) _params['application'] = application reply = await self.rpc(msg) return reply @@ -618,7 +654,10 @@ class ApplicationFacade(Type): ''' # map input types to rpc msg _params = dict() - msg = dict(type='Application', request='GetCharmURL', version=5, params=_params) + msg = dict(type='Application', + request='GetCharmURL', + version=5, + params=_params) _params['application'] = application reply = await self.rpc(msg) return reply @@ -633,7 +672,10 @@ class ApplicationFacade(Type): ''' # map input types to rpc msg _params = dict() - msg = dict(type='Application', request='GetConstraints', version=5, params=_params) + msg = dict(type='Application', + request='GetConstraints', + version=5, + params=_params) _params['application'] = application reply = await self.rpc(msg) return reply @@ -644,12 +686,15 @@ class ApplicationFacade(Type): async def Set(self, application, options): ''' application : str - options : typing.Mapping<~KT, +VT_co>[str, str] + options : typing.Mapping[str, str] Returns -> None ''' # map input types to rpc msg _params = dict() - msg = dict(type='Application', request='Set', version=5, params=_params) + msg = dict(type='Application', + request='Set', + version=5, + params=_params) _params['application'] = application _params['options'] = options reply = await self.rpc(msg) @@ -663,17 +708,20 @@ class ApplicationFacade(Type): application : str channel : str charm_url : str - config_settings : typing.Mapping<~KT, +VT_co>[str, str] + config_settings : typing.Mapping[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> + resource_ids : typing.Mapping[str, str] + storage_constraints : typing.Mapping[str, ~StorageConstraints] Returns -> None ''' # map input types to rpc msg _params = dict() - msg = dict(type='Application', request='SetCharm', version=5, params=_params) + msg = dict(type='Application', + request='SetCharm', + version=5, + params=_params) _params['application'] = application _params['channel'] = channel _params['charm-url'] = charm_url @@ -697,7 +745,10 @@ class ApplicationFacade(Type): ''' # map input types to rpc msg _params = dict() - msg = dict(type='Application', request='SetConstraints', version=5, params=_params) + msg = dict(type='Application', + request='SetConstraints', + version=5, + params=_params) _params['application'] = application _params['constraints'] = constraints reply = await self.rpc(msg) @@ -708,12 +759,15 @@ class ApplicationFacade(Type): @ReturnMapping(ErrorResults) async def SetMetricCredentials(self, creds): ''' - creds : typing.Sequence<+T_co>[~ApplicationMetricCredential]<~ApplicationMetricCredential> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + creds : typing.Sequence[~ApplicationMetricCredential] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Application', request='SetMetricCredentials', version=5, params=_params) + msg = dict(type='Application', + request='SetMetricCredentials', + version=5, + params=_params) _params['creds'] = creds reply = await self.rpc(msg) return reply @@ -728,7 +782,10 @@ class ApplicationFacade(Type): ''' # map input types to rpc msg _params = dict() - msg = dict(type='Application', request='Unexpose', version=5, params=_params) + msg = dict(type='Application', + request='Unexpose', + version=5, + params=_params) _params['application'] = application reply = await self.rpc(msg) return reply @@ -739,12 +796,15 @@ class ApplicationFacade(Type): async def Unset(self, application, options): ''' application : str - options : typing.Sequence<+T_co>[str] + options : typing.Sequence[str] Returns -> None ''' # map input types to rpc msg _params = dict() - msg = dict(type='Application', request='Unset', version=5, params=_params) + msg = dict(type='Application', + request='Unset', + version=5, + params=_params) _params['application'] = application _params['options'] = options reply = await self.rpc(msg) @@ -761,13 +821,16 @@ class ApplicationFacade(Type): force_charm_url : bool force_series : bool min_units : int - settings : typing.Mapping<~KT, +VT_co>[str, str] + settings : typing.Mapping[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) + msg = dict(type='Application', + request='Update', + version=5, + params=_params) _params['application'] = application _params['charm-url'] = charm_url _params['constraints'] = constraints @@ -781,6 +844,2400 @@ class ApplicationFacade(Type): +class ControllerFacade(Type): + name = 'Controller' + version = 5 + 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': {'cacertificates': {'items': {'type': 'string'}, + 'type': 'array'}, + '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'}, + 'ControllerAPIInfoResult': {'additionalProperties': False, + 'properties': {'addresses': {'items': {'type': 'string'}, + 'type': 'array'}, + 'cacert': {'type': 'string'}, + 'error': {'$ref': '#/definitions/Error'}}, + 'required': ['addresses', + 'cacert'], + 'type': 'object'}, + 'ControllerAPIInfoResults': {'additionalProperties': False, + 'properties': {'results': {'items': {'$ref': '#/definitions/ControllerAPIInfoResult'}, + 'type': 'array'}}, + 'required': ['results'], + 'type': 'object'}, + 'ControllerConfigResult': {'additionalProperties': False, + 'properties': {'config': {'patternProperties': {'.*': {'additionalProperties': True, + 'type': 'object'}}, + 'type': 'object'}}, + 'required': ['config'], + 'type': 'object'}, + 'ControllerConfigSet': {'additionalProperties': False, + 'properties': {'config': {'patternProperties': {'.*': {'additionalProperties': True, + 'type': 'object'}}, + 'type': 'object'}}, + 'required': ['config'], + 'type': 'object'}, + 'DestroyControllerArgs': {'additionalProperties': False, + 'properties': {'destroy-models': {'type': 'boolean'}, + 'destroy-storage': {'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'}, + 'type': {'type': 'string'}, + 'uuid': {'type': 'string'}}, + 'required': ['name', 'uuid', 'type', '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'}, + 'ModelFilesystemInfo': {'additionalProperties': False, + 'properties': {'detachable': {'type': 'boolean'}, + 'id': {'type': 'string'}, + 'message': {'type': 'string'}, + 'provider-id': {'type': 'string'}, + 'status': {'type': 'string'}}, + 'required': ['id'], + 'type': 'object'}, + 'ModelMachineInfo': {'additionalProperties': False, + 'properties': {'hardware': {'$ref': '#/definitions/MachineHardware'}, + 'has-vote': {'type': 'boolean'}, + 'id': {'type': 'string'}, + 'instance-id': {'type': 'string'}, + 'message': {'type': 'string'}, + 'status': {'type': 'string'}, + 'wants-vote': {'type': 'boolean'}}, + 'required': ['id'], + 'type': 'object'}, + 'ModelStatus': {'additionalProperties': False, + 'properties': {'application-count': {'type': 'integer'}, + 'error': {'$ref': '#/definitions/Error'}, + 'filesystems': {'items': {'$ref': '#/definitions/ModelFilesystemInfo'}, + 'type': 'array'}, + 'hosted-machine-count': {'type': 'integer'}, + 'life': {'type': 'string'}, + 'machines': {'items': {'$ref': '#/definitions/ModelMachineInfo'}, + 'type': 'array'}, + 'model-tag': {'type': 'string'}, + 'owner-tag': {'type': 'string'}, + 'volumes': {'items': {'$ref': '#/definitions/ModelVolumeInfo'}, + 'type': 'array'}}, + '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'}, + 'ModelVolumeInfo': {'additionalProperties': False, + 'properties': {'detachable': {'type': 'boolean'}, + 'id': {'type': 'string'}, + 'message': {'type': 'string'}, + 'provider-id': {'type': 'string'}, + 'status': {'type': 'string'}}, + 'required': ['id'], + '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'}, + 'ConfigSet': {'properties': {'Params': {'$ref': '#/definitions/ControllerConfigSet'}}, + 'type': 'object'}, + 'ControllerAPIInfoForModels': {'properties': {'Params': {'$ref': '#/definitions/Entities'}, + 'Result': {'$ref': '#/definitions/ControllerAPIInfoResults'}}, + '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[~UserModel] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Controller', + request='AllModels', + version=5, + params=_params) + + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(CloudSpecResults) + async def CloudSpec(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~CloudSpecResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Controller', + request='CloudSpec', + version=5, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(None) + async def ConfigSet(self, config): + ''' + config : typing.Mapping[str, typing.Any] + Returns -> None + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Controller', + request='ConfigSet', + version=5, + params=_params) + _params['config'] = config + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ControllerAPIInfoResults) + async def ControllerAPIInfoForModels(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ControllerAPIInfoResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Controller', + request='ControllerAPIInfoForModels', + version=5, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ControllerConfigResult) + async def ControllerConfig(self): + ''' + + Returns -> typing.Mapping[str, typing.Any] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Controller', + request='ControllerConfig', + version=5, + 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=5, + 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=5, + params=_params) + + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(UserAccessResults) + async def GetControllerAccess(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~UserAccessResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Controller', + request='GetControllerAccess', + version=5, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(HostedModelConfigsResults) + async def HostedModelConfigs(self): + ''' + + Returns -> typing.Sequence[~HostedModelConfig] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Controller', + request='HostedModelConfigs', + version=5, + params=_params) + + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(InitiateMigrationResults) + async def InitiateMigration(self, specs): + ''' + specs : typing.Sequence[~MigrationSpec] + Returns -> typing.Sequence[~InitiateMigrationResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Controller', + request='InitiateMigration', + version=5, + params=_params) + _params['specs'] = specs + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ModelBlockInfoList) + async def ListBlockedModels(self): + ''' + + Returns -> typing.Sequence[~ModelBlockInfo] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Controller', + request='ListBlockedModels', + version=5, + params=_params) + + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ModelConfigResults) + async def ModelConfig(self): + ''' + + Returns -> typing.Mapping[str, ~ConfigValue] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Controller', + request='ModelConfig', + version=5, + params=_params) + + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ModelStatusResults) + async def ModelStatus(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ModelStatus] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Controller', + request='ModelStatus', + version=5, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResults) + async def ModifyControllerAccess(self, changes): + ''' + changes : typing.Sequence[~ModifyControllerAccess] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Controller', + request='ModifyControllerAccess', + version=5, + 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=5, + 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=5, + params=_params) + + reply = await self.rpc(msg) + return reply + + + +class FirewallerFacade(Type): + name = 'Firewaller' + version = 5 + 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': {'cacertificates': {'items': {'type': 'string'}, + 'type': 'array'}, + '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'}, + 'ControllerAPIInfoResult': {'additionalProperties': False, + 'properties': {'addresses': {'items': {'type': 'string'}, + 'type': 'array'}, + 'cacert': {'type': 'string'}, + 'error': {'$ref': '#/definitions/Error'}}, + 'required': ['addresses', + 'cacert'], + 'type': 'object'}, + 'ControllerAPIInfoResults': {'additionalProperties': False, + 'properties': {'results': {'items': {'$ref': '#/definitions/ControllerAPIInfoResult'}, + 'type': 'array'}}, + 'required': ['results'], + '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'}, + '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'}, + 'FirewallRule': {'additionalProperties': False, + 'properties': {'known-service': {'type': 'string'}, + 'whitelist-cidrs': {'items': {'type': 'string'}, + 'type': 'array'}}, + 'required': ['known-service'], + 'type': 'object'}, + 'KnownServiceArgs': {'additionalProperties': False, + 'properties': {'known-services': {'items': {'type': 'string'}, + 'type': 'array'}}, + 'required': ['known-services'], + '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'}, + 'ListFirewallRulesResults': {'additionalProperties': False, + 'properties': {'Rules': {'items': {'$ref': '#/definitions/FirewallRule'}, + 'type': 'array'}}, + 'required': ['Rules'], + 'type': 'object'}, + 'Macaroon': {'additionalProperties': False, 'type': 'object'}, + 'MacaroonResult': {'additionalProperties': False, + 'properties': {'error': {'$ref': '#/definitions/Error'}, + 'result': {'$ref': '#/definitions/Macaroon'}}, + 'type': 'object'}, + 'MacaroonResults': {'additionalProperties': False, + 'properties': {'results': {'items': {'$ref': '#/definitions/MacaroonResult'}, + 'type': 'array'}}, + 'required': ['results'], + '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'}, + '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'}, + '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': {'AreManuallyProvisioned': {'properties': {'Params': {'$ref': '#/definitions/Entities'}, + 'Result': {'$ref': '#/definitions/BoolResults'}}, + 'type': 'object'}, + 'CloudSpec': {'properties': {'Params': {'$ref': '#/definitions/Entities'}, + 'Result': {'$ref': '#/definitions/CloudSpecResults'}}, + 'type': 'object'}, + 'ControllerAPIInfoForModels': {'properties': {'Params': {'$ref': '#/definitions/Entities'}, + 'Result': {'$ref': '#/definitions/ControllerAPIInfoResults'}}, + 'type': 'object'}, + 'ControllerConfig': {'properties': {'Result': {'$ref': '#/definitions/ControllerConfigResult'}}, + 'type': 'object'}, + 'FirewallRules': {'properties': {'Params': {'$ref': '#/definitions/KnownServiceArgs'}, + 'Result': {'$ref': '#/definitions/ListFirewallRulesResults'}}, + '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'}, + 'MacaroonForRelations': {'properties': {'Params': {'$ref': '#/definitions/Entities'}, + 'Result': {'$ref': '#/definitions/MacaroonResults'}}, + 'type': 'object'}, + 'ModelConfig': {'properties': {'Result': {'$ref': '#/definitions/ModelConfigResult'}}, + 'type': 'object'}, + 'SetRelationsStatus': {'properties': {'Params': {'$ref': '#/definitions/SetStatus'}, + 'Result': {'$ref': '#/definitions/ErrorResults'}}, + 'type': 'object'}, + 'Watch': {'properties': {'Params': {'$ref': '#/definitions/Entities'}, + 'Result': {'$ref': '#/definitions/NotifyWatchResults'}}, + 'type': 'object'}, + 'WatchEgressAddressesForRelations': {'properties': {'Params': {'$ref': '#/definitions/Entities'}, + 'Result': {'$ref': '#/definitions/StringsWatchResults'}}, + 'type': 'object'}, + 'WatchForModelConfigChanges': {'properties': {'Result': {'$ref': '#/definitions/NotifyWatchResult'}}, + 'type': 'object'}, + 'WatchIngressAddressesForRelations': {'properties': {'Params': {'$ref': '#/definitions/Entities'}, + 'Result': {'$ref': '#/definitions/StringsWatchResults'}}, + '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(BoolResults) + async def AreManuallyProvisioned(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~BoolResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Firewaller', + request='AreManuallyProvisioned', + version=5, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(CloudSpecResults) + async def CloudSpec(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~CloudSpecResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Firewaller', + request='CloudSpec', + version=5, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ControllerAPIInfoResults) + async def ControllerAPIInfoForModels(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ControllerAPIInfoResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Firewaller', + request='ControllerAPIInfoForModels', + version=5, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ControllerConfigResult) + async def ControllerConfig(self): + ''' + + Returns -> typing.Mapping[str, typing.Any] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Firewaller', + request='ControllerConfig', + version=5, + params=_params) + + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ListFirewallRulesResults) + async def FirewallRules(self, known_services): + ''' + known_services : typing.Sequence[str] + Returns -> typing.Sequence[~FirewallRule] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Firewaller', + request='FirewallRules', + version=5, + params=_params) + _params['known-services'] = known_services + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(StringResults) + async def GetAssignedMachine(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~StringResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Firewaller', + request='GetAssignedMachine', + version=5, + 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=5, + params=_params) + + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(BoolResults) + async def GetExposed(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~BoolResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Firewaller', + request='GetExposed', + version=5, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(StringsResults) + async def GetMachineActiveSubnets(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~StringsResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Firewaller', + request='GetMachineActiveSubnets', + version=5, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(MachinePortsResults) + async def GetMachinePorts(self, params): + ''' + params : typing.Sequence[~MachinePorts] + Returns -> typing.Sequence[~MachinePortsResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Firewaller', + request='GetMachinePorts', + version=5, + params=_params) + _params['params'] = params + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(StringResults) + async def InstanceId(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~StringResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Firewaller', + request='InstanceId', + version=5, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(LifeResults) + async def Life(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~LifeResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Firewaller', + request='Life', + version=5, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(MacaroonResults) + async def MacaroonForRelations(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~MacaroonResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Firewaller', + request='MacaroonForRelations', + version=5, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ModelConfigResult) + async def ModelConfig(self): + ''' + + Returns -> typing.Mapping[str, typing.Any] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Firewaller', + request='ModelConfig', + version=5, + params=_params) + + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResults) + async def SetRelationsStatus(self, entities): + ''' + entities : typing.Sequence[~EntityStatusArgs] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Firewaller', + request='SetRelationsStatus', + version=5, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(NotifyWatchResults) + async def Watch(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~NotifyWatchResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Firewaller', + request='Watch', + version=5, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(StringsWatchResults) + async def WatchEgressAddressesForRelations(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~StringsWatchResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Firewaller', + request='WatchEgressAddressesForRelations', + 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='Firewaller', + request='WatchForModelConfigChanges', + version=5, + params=_params) + + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(StringsWatchResults) + async def WatchIngressAddressesForRelations(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~StringsWatchResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Firewaller', + request='WatchIngressAddressesForRelations', + version=5, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(StringsWatchResult) + async def WatchModelMachines(self): + ''' + + Returns -> typing.Union[typing.Sequence[str], _ForwardRef('Error'), str] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Firewaller', + request='WatchModelMachines', + version=5, + params=_params) + + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(StringsWatchResults) + async def WatchOpenedPorts(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~StringsWatchResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Firewaller', + request='WatchOpenedPorts', + version=5, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(StringsWatchResults) + async def WatchUnits(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~StringsWatchResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Firewaller', + request='WatchUnits', + version=5, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + +class MachineManagerFacade(Type): + name = 'MachineManager' + version = 5 + 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'}, + 'DestroyMachinesParams': {'additionalProperties': False, + 'properties': {'force': {'type': 'boolean'}, + 'keep': {'type': 'boolean'}, + 'machine-tags': {'items': {'type': 'string'}, + 'type': 'array'}}, + 'required': ['machine-tags'], + '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'}, + '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'}, + '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'}, + 'Placement': {'additionalProperties': False, + 'properties': {'directive': {'type': 'string'}, + 'scope': {'type': 'string'}}, + 'required': ['scope', 'directive'], + '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'}, + 'UpdateSeriesArg': {'additionalProperties': False, + 'properties': {'force': {'type': 'boolean'}, + 'series': {'type': 'string'}, + 'tag': {'$ref': '#/definitions/Entity'}}, + 'required': ['tag', 'force', 'series'], + 'type': 'object'}, + 'UpdateSeriesArgs': {'additionalProperties': False, + 'properties': {'args': {'items': {'$ref': '#/definitions/UpdateSeriesArg'}, + 'type': 'array'}}, + 'required': ['args'], + 'type': 'object'}, + 'UpgradeSeriesNotificationParam': {'additionalProperties': False, + 'properties': {'entity': {'$ref': '#/definitions/Entity'}, + 'watcher-id': {'type': 'string'}}, + 'required': ['entity', + 'watcher-id'], + 'type': 'object'}, + 'UpgradeSeriesNotificationParams': {'additionalProperties': False, + 'properties': {'params': {'items': {'$ref': '#/definitions/UpgradeSeriesNotificationParam'}, + 'type': 'array'}}, + 'required': ['params'], + 'type': 'object'}, + 'UpgradeSeriesUnitsResult': {'additionalProperties': False, + 'properties': {'error': {'$ref': '#/definitions/Error'}, + 'unit-names': {'items': {'type': 'string'}, + 'type': 'array'}}, + 'required': ['unit-names'], + 'type': 'object'}, + 'UpgradeSeriesUnitsResults': {'additionalProperties': False, + 'properties': {'Results': {'items': {'$ref': '#/definitions/UpgradeSeriesUnitsResult'}, + 'type': 'array'}}, + 'required': ['Results'], + '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'}, + 'zones': {'items': {'type': 'string'}, + 'type': 'array'}}, + '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'}, + 'DestroyMachineWithParams': {'properties': {'Params': {'$ref': '#/definitions/DestroyMachinesParams'}, + 'Result': {'$ref': '#/definitions/DestroyMachineResults'}}, + 'type': 'object'}, + 'ForceDestroyMachine': {'properties': {'Params': {'$ref': '#/definitions/Entities'}, + 'Result': {'$ref': '#/definitions/DestroyMachineResults'}}, + 'type': 'object'}, + 'GetUpgradeSeriesMessages': {'properties': {'Params': {'$ref': '#/definitions/UpgradeSeriesNotificationParams'}, + 'Result': {'$ref': '#/definitions/StringsResults'}}, + 'type': 'object'}, + 'InstanceTypes': {'properties': {'Params': {'$ref': '#/definitions/ModelInstanceTypesConstraints'}, + 'Result': {'$ref': '#/definitions/InstanceTypesResults'}}, + 'type': 'object'}, + 'UpgradeSeriesComplete': {'properties': {'Params': {'$ref': '#/definitions/UpdateSeriesArg'}, + 'Result': {'$ref': '#/definitions/ErrorResult'}}, + 'type': 'object'}, + 'UpgradeSeriesPrepare': {'properties': {'Params': {'$ref': '#/definitions/UpdateSeriesArg'}, + 'Result': {'$ref': '#/definitions/ErrorResult'}}, + 'type': 'object'}, + 'UpgradeSeriesValidate': {'properties': {'Params': {'$ref': '#/definitions/UpdateSeriesArgs'}, + 'Result': {'$ref': '#/definitions/UpgradeSeriesUnitsResults'}}, + 'type': 'object'}, + 'WatchUpgradeSeriesNotifications': {'properties': {'Params': {'$ref': '#/definitions/Entities'}, + 'Result': {'$ref': '#/definitions/NotifyWatchResults'}}, + 'type': 'object'}}, + 'type': 'object'} + + + @ReturnMapping(AddMachinesResults) + async def AddMachines(self, params): + ''' + params : typing.Sequence[~AddMachineParams] + Returns -> typing.Sequence[~AddMachinesResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='MachineManager', + request='AddMachines', + version=5, + params=_params) + _params['params'] = params + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(DestroyMachineResults) + async def DestroyMachine(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~DestroyMachineResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='MachineManager', + request='DestroyMachine', + version=5, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(DestroyMachineResults) + async def DestroyMachineWithParams(self, force, keep, machine_tags): + ''' + force : bool + keep : bool + machine_tags : typing.Sequence[str] + Returns -> typing.Sequence[~DestroyMachineResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='MachineManager', + request='DestroyMachineWithParams', + version=5, + params=_params) + _params['force'] = force + _params['keep'] = keep + _params['machine-tags'] = machine_tags + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(DestroyMachineResults) + async def ForceDestroyMachine(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~DestroyMachineResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='MachineManager', + request='ForceDestroyMachine', + version=5, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(StringsResults) + async def GetUpgradeSeriesMessages(self, params): + ''' + params : typing.Sequence[~UpgradeSeriesNotificationParam] + Returns -> typing.Sequence[~StringsResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='MachineManager', + request='GetUpgradeSeriesMessages', + version=5, + params=_params) + _params['params'] = params + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(InstanceTypesResults) + async def InstanceTypes(self, constraints): + ''' + constraints : typing.Sequence[~ModelInstanceTypesConstraint] + Returns -> typing.Sequence[~InstanceTypesResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='MachineManager', + request='InstanceTypes', + version=5, + params=_params) + _params['constraints'] = constraints + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResult) + async def UpgradeSeriesComplete(self, force, series, tag): + ''' + force : bool + series : str + tag : Entity + Returns -> Error + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='MachineManager', + request='UpgradeSeriesComplete', + version=5, + params=_params) + _params['force'] = force + _params['series'] = series + _params['tag'] = tag + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResult) + async def UpgradeSeriesPrepare(self, force, series, tag): + ''' + force : bool + series : str + tag : Entity + Returns -> Error + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='MachineManager', + request='UpgradeSeriesPrepare', + version=5, + params=_params) + _params['force'] = force + _params['series'] = series + _params['tag'] = tag + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(UpgradeSeriesUnitsResults) + async def UpgradeSeriesValidate(self, args): + ''' + args : typing.Sequence[~UpdateSeriesArg] + Returns -> typing.Sequence[~UpgradeSeriesUnitsResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='MachineManager', + request='UpgradeSeriesValidate', + version=5, + params=_params) + _params['args'] = args + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(NotifyWatchResults) + async def WatchUpgradeSeriesNotifications(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~NotifyWatchResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='MachineManager', + request='WatchUpgradeSeriesNotifications', + version=5, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + +class ModelManagerFacade(Type): + name = 'ModelManager' + version = 5 + schema = {'definitions': {'ChangeModelCredentialParams': {'additionalProperties': False, + 'properties': {'credential-tag': {'type': 'string'}, + 'model-tag': {'type': 'string'}}, + 'required': ['model-tag', + 'credential-tag'], + 'type': 'object'}, + 'ChangeModelCredentialsParams': {'additionalProperties': False, + 'properties': {'model-credentials': {'items': {'$ref': '#/definitions/ChangeModelCredentialParams'}, + 'type': 'array'}}, + 'required': ['model-credentials'], + 'type': 'object'}, + 'DestroyModelParams': {'additionalProperties': False, + 'properties': {'destroy-storage': {'type': 'boolean'}, + 'model-tag': {'type': 'string'}}, + 'required': ['model-tag'], + 'type': 'object'}, + 'DestroyModelsParams': {'additionalProperties': False, + 'properties': {'models': {'items': {'$ref': '#/definitions/DestroyModelParams'}, + 'type': 'array'}}, + 'required': ['models'], + 'type': 'object'}, + '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'}, + 'type': {'type': 'string'}, + 'uuid': {'type': 'string'}}, + 'required': ['name', 'uuid', 'type', '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'}, + 'ModelEntityCount': {'additionalProperties': False, + 'properties': {'count': {'type': 'integer'}, + 'entity': {'type': 'string'}}, + 'required': ['entity', 'count'], + 'type': 'object'}, + 'ModelFilesystemInfo': {'additionalProperties': False, + 'properties': {'detachable': {'type': 'boolean'}, + 'id': {'type': 'string'}, + 'message': {'type': 'string'}, + 'provider-id': {'type': 'string'}, + 'status': {'type': 'string'}}, + 'required': ['id'], + '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'}, + 'type': {'type': 'string'}, + 'users': {'items': {'$ref': '#/definitions/ModelUserInfo'}, + 'type': 'array'}, + 'uuid': {'type': 'string'}}, + 'required': ['name', + 'type', + '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'}, + 'message': {'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'}, + 'error': {'$ref': '#/definitions/Error'}, + 'filesystems': {'items': {'$ref': '#/definitions/ModelFilesystemInfo'}, + 'type': 'array'}, + 'hosted-machine-count': {'type': 'integer'}, + 'life': {'type': 'string'}, + 'machines': {'items': {'$ref': '#/definitions/ModelMachineInfo'}, + 'type': 'array'}, + 'model-tag': {'type': 'string'}, + 'owner-tag': {'type': 'string'}, + 'volumes': {'items': {'$ref': '#/definitions/ModelVolumeInfo'}, + 'type': 'array'}}, + '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'}, + 'ModelSummariesRequest': {'additionalProperties': False, + 'properties': {'all': {'type': 'boolean'}, + 'user-tag': {'type': 'string'}}, + 'required': ['user-tag'], + 'type': 'object'}, + 'ModelSummary': {'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'}, + 'counts': {'items': {'$ref': '#/definitions/ModelEntityCount'}, + 'type': 'array'}, + 'default-series': {'type': 'string'}, + 'last-connection': {'format': 'date-time', + 'type': 'string'}, + 'life': {'type': 'string'}, + 'migration': {'$ref': '#/definitions/ModelMigrationStatus'}, + 'name': {'type': 'string'}, + 'owner-tag': {'type': 'string'}, + 'provider-type': {'type': 'string'}, + 'sla': {'$ref': '#/definitions/ModelSLAInfo'}, + 'status': {'$ref': '#/definitions/EntityStatus'}, + 'type': {'type': 'string'}, + 'user-access': {'type': 'string'}, + 'uuid': {'type': 'string'}}, + 'required': ['name', + 'uuid', + 'type', + 'controller-uuid', + 'cloud-tag', + 'owner-tag', + 'life', + 'user-access', + 'last-connection', + 'counts', + 'sla', + 'agent-version'], + 'type': 'object'}, + 'ModelSummaryResult': {'additionalProperties': False, + 'properties': {'error': {'$ref': '#/definitions/Error'}, + 'result': {'$ref': '#/definitions/ModelSummary'}}, + 'type': 'object'}, + 'ModelSummaryResults': {'additionalProperties': False, + 'properties': {'results': {'items': {'$ref': '#/definitions/ModelSummaryResult'}, + 'type': 'array'}}, + 'required': ['results'], + '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'}, + 'ModelVolumeInfo': {'additionalProperties': False, + 'properties': {'detachable': {'type': 'boolean'}, + 'id': {'type': 'string'}, + 'message': {'type': 'string'}, + 'provider-id': {'type': 'string'}, + 'status': {'type': 'string'}}, + 'required': ['id'], + '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': {'ChangeModelCredential': {'properties': {'Params': {'$ref': '#/definitions/ChangeModelCredentialsParams'}, + 'Result': {'$ref': '#/definitions/ErrorResults'}}, + 'type': 'object'}, + 'CreateModel': {'properties': {'Params': {'$ref': '#/definitions/ModelCreateArgs'}, + 'Result': {'$ref': '#/definitions/ModelInfo'}}, + 'type': 'object'}, + 'DestroyModels': {'properties': {'Params': {'$ref': '#/definitions/DestroyModelsParams'}, + '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'}, + 'ListModelSummaries': {'properties': {'Params': {'$ref': '#/definitions/ModelSummariesRequest'}, + 'Result': {'$ref': '#/definitions/ModelSummaryResults'}}, + '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(ErrorResults) + async def ChangeModelCredential(self, model_credentials): + ''' + model_credentials : typing.Sequence[~ChangeModelCredentialParams] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='ModelManager', + request='ChangeModelCredential', + version=5, + params=_params) + _params['model-credentials'] = model_credentials + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ModelInfo) + async def CreateModel(self, cloud_tag, config, credential, name, owner_tag, region): + ''' + cloud_tag : str + config : typing.Mapping[str, typing.Any] + credential : str + name : str + owner_tag : str + region : str + Returns -> typing.Union[_ForwardRef('Number'), str, typing.Sequence[~ModelMachineInfo], _ForwardRef('ModelMigrationStatus'), _ForwardRef('ModelSLAInfo'), _ForwardRef('EntityStatus'), typing.Sequence[~ModelUserInfo]] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='ModelManager', + request='CreateModel', + version=5, + 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, models): + ''' + models : typing.Sequence[~DestroyModelParams] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='ModelManager', + request='DestroyModels', + version=5, + params=_params) + _params['models'] = models + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(StringResults) + async def DumpModels(self, entities, simplified): + ''' + entities : typing.Sequence[~Entity] + simplified : bool + Returns -> typing.Sequence[~StringResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='ModelManager', + request='DumpModels', + version=5, + 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[~Entity] + Returns -> typing.Sequence[~MapResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='ModelManager', + request='DumpModelsDB', + version=5, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ModelSummaryResults) + async def ListModelSummaries(self, all_, user_tag): + ''' + all_ : bool + user_tag : str + Returns -> typing.Sequence[~ModelSummaryResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='ModelManager', + request='ListModelSummaries', + version=5, + params=_params) + _params['all'] = all_ + _params['user-tag'] = user_tag + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(UserModelList) + async def ListModels(self, tag): + ''' + tag : str + Returns -> typing.Sequence[~UserModel] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='ModelManager', + request='ListModels', + version=5, + params=_params) + _params['tag'] = tag + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ModelDefaultsResult) + async def ModelDefaults(self): + ''' + + Returns -> typing.Mapping[str, ~ModelDefaults] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='ModelManager', + request='ModelDefaults', + version=5, + params=_params) + + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ModelInfoResults) + async def ModelInfo(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ModelInfoResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='ModelManager', + request='ModelInfo', + version=5, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ModelStatusResults) + async def ModelStatus(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ModelStatus] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='ModelManager', + request='ModelStatus', + version=5, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResults) + async def ModifyModelAccess(self, changes): + ''' + changes : typing.Sequence[~ModifyModelAccess] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='ModelManager', + request='ModifyModelAccess', + version=5, + params=_params) + _params['changes'] = changes + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResults) + async def SetModelDefaults(self, config): + ''' + config : typing.Sequence[~ModelDefaultValues] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='ModelManager', + request='SetModelDefaults', + version=5, + params=_params) + _params['config'] = config + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResults) + async def UnsetModelDefaults(self, keys): + ''' + keys : typing.Sequence[~ModelUnsetKeys] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='ModelManager', + request='UnsetModelDefaults', + version=5, + params=_params) + _params['keys'] = keys + reply = await self.rpc(msg) + return reply + + + class UniterFacade(Type): name = 'Uniter' version = 5 @@ -1590,11 +4047,14 @@ class UniterFacade(Type): async def APIAddresses(self): ''' - Returns -> typing.Union[_ForwardRef('Error'), typing.Sequence<+T_co>[str]] + Returns -> typing.Union[_ForwardRef('Error'), typing.Sequence[str]] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='APIAddresses', version=5, params=_params) + msg = dict(type='Uniter', + request='APIAddresses', + version=5, + params=_params) reply = await self.rpc(msg) return reply @@ -1605,11 +4065,14 @@ class UniterFacade(Type): async def APIHostPorts(self): ''' - Returns -> typing.Sequence<+T_co>[~HostPort]<~HostPort> + Returns -> typing.Sequence[~HostPort] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='APIHostPorts', version=5, params=_params) + msg = dict(type='Uniter', + request='APIHostPorts', + version=5, + params=_params) reply = await self.rpc(msg) return reply @@ -1619,12 +4082,15 @@ class UniterFacade(Type): @ReturnMapping(ActionResults) async def Actions(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~ActionResult]<~ActionResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ActionResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='Actions', version=5, params=_params) + msg = dict(type='Uniter', + request='Actions', + version=5, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -1634,12 +4100,15 @@ class UniterFacade(Type): @ReturnMapping(ErrorResults) async def AddMetricBatches(self, batches): ''' - batches : typing.Sequence<+T_co>[~MetricBatchParam]<~MetricBatchParam> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + batches : typing.Sequence[~MetricBatchParam] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='AddMetricBatches', version=5, params=_params) + msg = dict(type='Uniter', + request='AddMetricBatches', + version=5, + params=_params) _params['batches'] = batches reply = await self.rpc(msg) return reply @@ -1649,12 +4118,15 @@ class UniterFacade(Type): @ReturnMapping(ErrorResults) async def AddUnitStorage(self, storages): ''' - storages : typing.Sequence<+T_co>[~StorageAddParams]<~StorageAddParams> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + storages : typing.Sequence[~StorageAddParams] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='AddUnitStorage', version=5, params=_params) + msg = dict(type='Uniter', + request='AddUnitStorage', + version=5, + params=_params) _params['storages'] = storages reply = await self.rpc(msg) return reply @@ -1664,12 +4136,15 @@ class UniterFacade(Type): @ReturnMapping(MachinePortsResults) async def AllMachinePorts(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~MachinePortsResult]<~MachinePortsResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~MachinePortsResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='AllMachinePorts', version=5, params=_params) + msg = dict(type='Uniter', + request='AllMachinePorts', + version=5, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -1679,12 +4154,15 @@ class UniterFacade(Type): @ReturnMapping(ApplicationStatusResults) async def ApplicationStatus(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~ApplicationStatusResult]<~ApplicationStatusResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ApplicationStatusResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='ApplicationStatus', version=5, params=_params) + msg = dict(type='Uniter', + request='ApplicationStatus', + version=5, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -1694,12 +4172,15 @@ class UniterFacade(Type): @ReturnMapping(StringResults) async def AssignedMachine(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~StringResult]<~StringResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~StringResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='AssignedMachine', version=5, params=_params) + msg = dict(type='Uniter', + request='AssignedMachine', + version=5, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -1709,12 +4190,15 @@ class UniterFacade(Type): @ReturnMapping(StringResults) async def AvailabilityZone(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~StringResult]<~StringResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~StringResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='AvailabilityZone', version=5, params=_params) + msg = dict(type='Uniter', + request='AvailabilityZone', + version=5, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -1724,12 +4208,15 @@ class UniterFacade(Type): @ReturnMapping(ErrorResults) async def BeginActions(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='BeginActions', version=5, params=_params) + msg = dict(type='Uniter', + request='BeginActions', + version=5, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -1740,11 +4227,14 @@ class UniterFacade(Type): async def CACert(self): ''' - Returns -> typing.Sequence<+T_co>[int] + Returns -> typing.Sequence[int] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='CACert', version=5, params=_params) + msg = dict(type='Uniter', + request='CACert', + version=5, + params=_params) reply = await self.rpc(msg) return reply @@ -1754,12 +4244,15 @@ class UniterFacade(Type): @ReturnMapping(StringResults) async def CharmArchiveSha256(self, urls): ''' - urls : typing.Sequence<+T_co>[~CharmURL]<~CharmURL> - Returns -> typing.Sequence<+T_co>[~StringResult]<~StringResult> + urls : typing.Sequence[~CharmURL] + Returns -> typing.Sequence[~StringResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='CharmArchiveSha256', version=5, params=_params) + msg = dict(type='Uniter', + request='CharmArchiveSha256', + version=5, + params=_params) _params['urls'] = urls reply = await self.rpc(msg) return reply @@ -1769,12 +4262,15 @@ class UniterFacade(Type): @ReturnMapping(IntResults) async def CharmModifiedVersion(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~IntResult]<~IntResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~IntResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='CharmModifiedVersion', version=5, params=_params) + msg = dict(type='Uniter', + request='CharmModifiedVersion', + version=5, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -1784,12 +4280,15 @@ class UniterFacade(Type): @ReturnMapping(StringBoolResults) async def CharmURL(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~StringBoolResult]<~StringBoolResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~StringBoolResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='CharmURL', version=5, params=_params) + msg = dict(type='Uniter', + request='CharmURL', + version=5, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -1799,12 +4298,15 @@ class UniterFacade(Type): @ReturnMapping(ErrorResults) async def ClearResolved(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='ClearResolved', version=5, params=_params) + msg = dict(type='Uniter', + request='ClearResolved', + version=5, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -1814,12 +4316,15 @@ class UniterFacade(Type): @ReturnMapping(ErrorResults) async def ClosePorts(self, entities): ''' - entities : typing.Sequence<+T_co>[~EntityPortRange]<~EntityPortRange> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + entities : typing.Sequence[~EntityPortRange] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='ClosePorts', version=5, params=_params) + msg = dict(type='Uniter', + request='ClosePorts', + version=5, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -1829,12 +4334,15 @@ class UniterFacade(Type): @ReturnMapping(ConfigSettingsResults) async def ConfigSettings(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~ConfigSettingsResult]<~ConfigSettingsResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ConfigSettingsResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='ConfigSettings', version=5, params=_params) + msg = dict(type='Uniter', + request='ConfigSettings', + version=5, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -1849,7 +4357,10 @@ class UniterFacade(Type): ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='CurrentModel', version=5, params=_params) + msg = dict(type='Uniter', + request='CurrentModel', + version=5, + params=_params) reply = await self.rpc(msg) return reply @@ -1859,12 +4370,15 @@ class UniterFacade(Type): @ReturnMapping(ErrorResults) async def Destroy(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='Destroy', version=5, params=_params) + msg = dict(type='Uniter', + request='Destroy', + version=5, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -1874,12 +4388,15 @@ class UniterFacade(Type): @ReturnMapping(ErrorResults) async def DestroyAllSubordinates(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='DestroyAllSubordinates', version=5, params=_params) + msg = dict(type='Uniter', + request='DestroyAllSubordinates', + version=5, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -1889,12 +4406,15 @@ class UniterFacade(Type): @ReturnMapping(ErrorResults) async def DestroyUnitStorageAttachments(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='DestroyUnitStorageAttachments', version=5, params=_params) + msg = dict(type='Uniter', + request='DestroyUnitStorageAttachments', + version=5, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -1904,12 +4424,15 @@ class UniterFacade(Type): @ReturnMapping(ErrorResults) async def EnsureDead(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='EnsureDead', version=5, params=_params) + msg = dict(type='Uniter', + request='EnsureDead', + version=5, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -1919,12 +4442,15 @@ class UniterFacade(Type): @ReturnMapping(ErrorResults) async def EnterScope(self, relation_units): ''' - relation_units : typing.Sequence<+T_co>[~RelationUnit]<~RelationUnit> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + relation_units : typing.Sequence[~RelationUnit] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='EnterScope', version=5, params=_params) + msg = dict(type='Uniter', + request='EnterScope', + version=5, + params=_params) _params['relation-units'] = relation_units reply = await self.rpc(msg) return reply @@ -1934,12 +4460,15 @@ class UniterFacade(Type): @ReturnMapping(ErrorResults) async def FinishActions(self, results): ''' - results : typing.Sequence<+T_co>[~ActionExecutionResult]<~ActionExecutionResult> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + results : typing.Sequence[~ActionExecutionResult] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='FinishActions', version=5, params=_params) + msg = dict(type='Uniter', + request='FinishActions', + version=5, + params=_params) _params['results'] = results reply = await self.rpc(msg) return reply @@ -1949,12 +4478,15 @@ class UniterFacade(Type): @ReturnMapping(MeterStatusResults) async def GetMeterStatus(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~MeterStatusResult]<~MeterStatusResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~MeterStatusResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='GetMeterStatus', version=5, params=_params) + msg = dict(type='Uniter', + request='GetMeterStatus', + version=5, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -1964,12 +4496,15 @@ class UniterFacade(Type): @ReturnMapping(StringBoolResults) async def GetPrincipal(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~StringBoolResult]<~StringBoolResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~StringBoolResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='GetPrincipal', version=5, params=_params) + msg = dict(type='Uniter', + request='GetPrincipal', + version=5, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -1979,12 +4514,15 @@ class UniterFacade(Type): @ReturnMapping(BoolResults) async def HasSubordinates(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~BoolResult]<~BoolResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~BoolResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='HasSubordinates', version=5, params=_params) + msg = dict(type='Uniter', + request='HasSubordinates', + version=5, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -1994,12 +4532,15 @@ class UniterFacade(Type): @ReturnMapping(StringsResults) async def JoinedRelations(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~StringsResult]<~StringsResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~StringsResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='JoinedRelations', version=5, params=_params) + msg = dict(type='Uniter', + request='JoinedRelations', + version=5, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -2009,12 +4550,15 @@ class UniterFacade(Type): @ReturnMapping(ErrorResults) async def LeaveScope(self, relation_units): ''' - relation_units : typing.Sequence<+T_co>[~RelationUnit]<~RelationUnit> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + relation_units : typing.Sequence[~RelationUnit] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='LeaveScope', version=5, params=_params) + msg = dict(type='Uniter', + request='LeaveScope', + version=5, + params=_params) _params['relation-units'] = relation_units reply = await self.rpc(msg) return reply @@ -2024,12 +4568,15 @@ class UniterFacade(Type): @ReturnMapping(LifeResults) async def Life(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~LifeResult]<~LifeResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~LifeResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='Life', version=5, params=_params) + msg = dict(type='Uniter', + request='Life', + version=5, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -2039,12 +4586,15 @@ class UniterFacade(Type): @ReturnMapping(ErrorResults) async def Merge(self, params): ''' - params : typing.Sequence<+T_co>[~MergeLeadershipSettingsParam]<~MergeLeadershipSettingsParam> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + params : typing.Sequence[~MergeLeadershipSettingsParam] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='Merge', version=5, params=_params) + msg = dict(type='Uniter', + request='Merge', + version=5, + params=_params) _params['params'] = params reply = await self.rpc(msg) return reply @@ -2055,11 +4605,14 @@ class UniterFacade(Type): async def ModelConfig(self): ''' - Returns -> typing.Mapping<~KT, +VT_co>[str, typing.Any] + Returns -> typing.Mapping[str, typing.Any] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='ModelConfig', version=5, params=_params) + msg = dict(type='Uniter', + request='ModelConfig', + version=5, + params=_params) reply = await self.rpc(msg) return reply @@ -2074,7 +4627,10 @@ class UniterFacade(Type): ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='ModelUUID', version=5, params=_params) + msg = dict(type='Uniter', + request='ModelUUID', + version=5, + params=_params) reply = await self.rpc(msg) return reply @@ -2084,13 +4640,16 @@ class UniterFacade(Type): @ReturnMapping(NetworkInfoResults) async def NetworkInfo(self, bindings, unit): ''' - bindings : typing.Sequence<+T_co>[str] + bindings : typing.Sequence[str] unit : str - Returns -> typing.Mapping<~KT, +VT_co>[str, ~NetworkInfoResult]<~NetworkInfoResult> + Returns -> typing.Mapping[str, ~NetworkInfoResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='NetworkInfo', version=5, params=_params) + msg = dict(type='Uniter', + request='NetworkInfo', + version=5, + params=_params) _params['bindings'] = bindings _params['unit'] = unit reply = await self.rpc(msg) @@ -2101,12 +4660,15 @@ class UniterFacade(Type): @ReturnMapping(ErrorResults) async def OpenPorts(self, entities): ''' - entities : typing.Sequence<+T_co>[~EntityPortRange]<~EntityPortRange> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + entities : typing.Sequence[~EntityPortRange] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='OpenPorts', version=5, params=_params) + msg = dict(type='Uniter', + request='OpenPorts', + version=5, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -2116,12 +4678,15 @@ class UniterFacade(Type): @ReturnMapping(StringResults) async def PrivateAddress(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~StringResult]<~StringResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~StringResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='PrivateAddress', version=5, params=_params) + msg = dict(type='Uniter', + request='PrivateAddress', + version=5, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -2136,7 +4701,10 @@ class UniterFacade(Type): ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='ProviderType', version=5, params=_params) + msg = dict(type='Uniter', + request='ProviderType', + version=5, + params=_params) reply = await self.rpc(msg) return reply @@ -2146,12 +4714,15 @@ class UniterFacade(Type): @ReturnMapping(StringResults) async def PublicAddress(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~StringResult]<~StringResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~StringResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='PublicAddress', version=5, params=_params) + msg = dict(type='Uniter', + request='PublicAddress', + version=5, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -2161,12 +4732,15 @@ class UniterFacade(Type): @ReturnMapping(GetLeadershipSettingsBulkResults) async def Read(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~GetLeadershipSettingsResult]<~GetLeadershipSettingsResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~GetLeadershipSettingsResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='Read', version=5, params=_params) + msg = dict(type='Uniter', + request='Read', + version=5, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -2176,12 +4750,15 @@ class UniterFacade(Type): @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> + relation_unit_pairs : typing.Sequence[~RelationUnitPair] + Returns -> typing.Sequence[~SettingsResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='ReadRemoteSettings', version=5, params=_params) + msg = dict(type='Uniter', + request='ReadRemoteSettings', + version=5, + params=_params) _params['relation-unit-pairs'] = relation_unit_pairs reply = await self.rpc(msg) return reply @@ -2191,12 +4768,15 @@ class UniterFacade(Type): @ReturnMapping(SettingsResults) async def ReadSettings(self, relation_units): ''' - relation_units : typing.Sequence<+T_co>[~RelationUnit]<~RelationUnit> - Returns -> typing.Sequence<+T_co>[~SettingsResult]<~SettingsResult> + relation_units : typing.Sequence[~RelationUnit] + Returns -> typing.Sequence[~SettingsResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='ReadSettings', version=5, params=_params) + msg = dict(type='Uniter', + request='ReadSettings', + version=5, + params=_params) _params['relation-units'] = relation_units reply = await self.rpc(msg) return reply @@ -2206,12 +4786,15 @@ class UniterFacade(Type): @ReturnMapping(RelationResults) async def Relation(self, relation_units): ''' - relation_units : typing.Sequence<+T_co>[~RelationUnit]<~RelationUnit> - Returns -> typing.Sequence<+T_co>[~RelationResult]<~RelationResult> + relation_units : typing.Sequence[~RelationUnit] + Returns -> typing.Sequence[~RelationResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='Relation', version=5, params=_params) + msg = dict(type='Uniter', + request='Relation', + version=5, + params=_params) _params['relation-units'] = relation_units reply = await self.rpc(msg) return reply @@ -2221,12 +4804,15 @@ class UniterFacade(Type): @ReturnMapping(RelationResults) async def RelationById(self, relation_ids): ''' - relation_ids : typing.Sequence<+T_co>[int] - Returns -> typing.Sequence<+T_co>[~RelationResult]<~RelationResult> + relation_ids : typing.Sequence[int] + Returns -> typing.Sequence[~RelationResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='RelationById', version=5, params=_params) + msg = dict(type='Uniter', + request='RelationById', + version=5, + params=_params) _params['relation-ids'] = relation_ids reply = await self.rpc(msg) return reply @@ -2236,12 +4822,15 @@ class UniterFacade(Type): @ReturnMapping(ErrorResults) async def RemoveStorageAttachments(self, ids): ''' - ids : typing.Sequence<+T_co>[~StorageAttachmentId]<~StorageAttachmentId> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + ids : typing.Sequence[~StorageAttachmentId] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='RemoveStorageAttachments', version=5, params=_params) + msg = dict(type='Uniter', + request='RemoveStorageAttachments', + version=5, + params=_params) _params['ids'] = ids reply = await self.rpc(msg) return reply @@ -2251,12 +4840,15 @@ class UniterFacade(Type): @ReturnMapping(ErrorResults) async def RequestReboot(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='RequestReboot', version=5, params=_params) + msg = dict(type='Uniter', + request='RequestReboot', + version=5, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -2266,12 +4858,15 @@ class UniterFacade(Type): @ReturnMapping(ResolvedModeResults) async def Resolved(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~ResolvedModeResult]<~ResolvedModeResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ResolvedModeResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='Resolved', version=5, params=_params) + msg = dict(type='Uniter', + request='Resolved', + version=5, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -2286,7 +4881,10 @@ class UniterFacade(Type): ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='SLALevel', version=5, params=_params) + msg = dict(type='Uniter', + request='SLALevel', + version=5, + params=_params) reply = await self.rpc(msg) return reply @@ -2296,12 +4894,15 @@ class UniterFacade(Type): @ReturnMapping(ErrorResults) async def SetAgentStatus(self, entities): ''' - entities : typing.Sequence<+T_co>[~EntityStatusArgs]<~EntityStatusArgs> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + entities : typing.Sequence[~EntityStatusArgs] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='SetAgentStatus', version=5, params=_params) + msg = dict(type='Uniter', + request='SetAgentStatus', + version=5, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -2311,12 +4912,15 @@ class UniterFacade(Type): @ReturnMapping(ErrorResults) async def SetApplicationStatus(self, entities): ''' - entities : typing.Sequence<+T_co>[~EntityStatusArgs]<~EntityStatusArgs> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + entities : typing.Sequence[~EntityStatusArgs] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='SetApplicationStatus', version=5, params=_params) + msg = dict(type='Uniter', + request='SetApplicationStatus', + version=5, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -2326,12 +4930,15 @@ class UniterFacade(Type): @ReturnMapping(ErrorResults) async def SetCharmURL(self, entities): ''' - entities : typing.Sequence<+T_co>[~EntityCharmURL]<~EntityCharmURL> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + entities : typing.Sequence[~EntityCharmURL] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='SetCharmURL', version=5, params=_params) + msg = dict(type='Uniter', + request='SetCharmURL', + version=5, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -2341,12 +4948,15 @@ class UniterFacade(Type): @ReturnMapping(ErrorResults) async def SetStatus(self, entities): ''' - entities : typing.Sequence<+T_co>[~EntityStatusArgs]<~EntityStatusArgs> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + entities : typing.Sequence[~EntityStatusArgs] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='SetStatus', version=5, params=_params) + msg = dict(type='Uniter', + request='SetStatus', + version=5, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -2356,12 +4966,15 @@ class UniterFacade(Type): @ReturnMapping(ErrorResults) async def SetUnitStatus(self, entities): ''' - entities : typing.Sequence<+T_co>[~EntityStatusArgs]<~EntityStatusArgs> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + entities : typing.Sequence[~EntityStatusArgs] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='SetUnitStatus', version=5, params=_params) + msg = dict(type='Uniter', + request='SetUnitStatus', + version=5, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -2371,12 +4984,15 @@ class UniterFacade(Type): @ReturnMapping(ErrorResults) async def SetWorkloadVersion(self, entities): ''' - entities : typing.Sequence<+T_co>[~EntityWorkloadVersion]<~EntityWorkloadVersion> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + entities : typing.Sequence[~EntityWorkloadVersion] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='SetWorkloadVersion', version=5, params=_params) + msg = dict(type='Uniter', + request='SetWorkloadVersion', + version=5, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -2386,12 +5002,15 @@ class UniterFacade(Type): @ReturnMapping(LifeResults) async def StorageAttachmentLife(self, ids): ''' - ids : typing.Sequence<+T_co>[~StorageAttachmentId]<~StorageAttachmentId> - Returns -> typing.Sequence<+T_co>[~LifeResult]<~LifeResult> + ids : typing.Sequence[~StorageAttachmentId] + Returns -> typing.Sequence[~LifeResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='StorageAttachmentLife', version=5, params=_params) + msg = dict(type='Uniter', + request='StorageAttachmentLife', + version=5, + params=_params) _params['ids'] = ids reply = await self.rpc(msg) return reply @@ -2401,12 +5020,15 @@ class UniterFacade(Type): @ReturnMapping(StorageAttachmentResults) async def StorageAttachments(self, ids): ''' - ids : typing.Sequence<+T_co>[~StorageAttachmentId]<~StorageAttachmentId> - Returns -> typing.Sequence<+T_co>[~StorageAttachmentResult]<~StorageAttachmentResult> + ids : typing.Sequence[~StorageAttachmentId] + Returns -> typing.Sequence[~StorageAttachmentResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='StorageAttachments', version=5, params=_params) + msg = dict(type='Uniter', + request='StorageAttachments', + version=5, + params=_params) _params['ids'] = ids reply = await self.rpc(msg) return reply @@ -2416,12 +5038,15 @@ class UniterFacade(Type): @ReturnMapping(StatusResults) async def UnitStatus(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~StatusResult]<~StatusResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~StatusResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='UnitStatus', version=5, params=_params) + msg = dict(type='Uniter', + request='UnitStatus', + version=5, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -2431,12 +5056,15 @@ class UniterFacade(Type): @ReturnMapping(StorageAttachmentIdsResults) async def UnitStorageAttachments(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~StorageAttachmentIdsResult]<~StorageAttachmentIdsResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~StorageAttachmentIdsResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='UnitStorageAttachments', version=5, params=_params) + msg = dict(type='Uniter', + request='UnitStorageAttachments', + version=5, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -2446,12 +5074,15 @@ class UniterFacade(Type): @ReturnMapping(ErrorResults) async def UpdateSettings(self, relation_units): ''' - relation_units : typing.Sequence<+T_co>[~RelationUnitSettings]<~RelationUnitSettings> - Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + relation_units : typing.Sequence[~RelationUnitSettings] + Returns -> typing.Sequence[~ErrorResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='UpdateSettings', version=5, params=_params) + msg = dict(type='Uniter', + request='UpdateSettings', + version=5, + params=_params) _params['relation-units'] = relation_units reply = await self.rpc(msg) return reply @@ -2461,12 +5092,15 @@ class UniterFacade(Type): @ReturnMapping(NotifyWatchResults) async def Watch(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~NotifyWatchResult]<~NotifyWatchResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~NotifyWatchResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='Watch', version=5, params=_params) + msg = dict(type='Uniter', + request='Watch', + version=5, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -2481,7 +5115,10 @@ class UniterFacade(Type): ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='WatchAPIHostPorts', version=5, params=_params) + msg = dict(type='Uniter', + request='WatchAPIHostPorts', + version=5, + params=_params) reply = await self.rpc(msg) return reply @@ -2491,12 +5128,15 @@ class UniterFacade(Type): @ReturnMapping(StringsWatchResults) async def WatchActionNotifications(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~StringsWatchResult]<~StringsWatchResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~StringsWatchResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='WatchActionNotifications', version=5, params=_params) + msg = dict(type='Uniter', + request='WatchActionNotifications', + version=5, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -2506,12 +5146,15 @@ class UniterFacade(Type): @ReturnMapping(NotifyWatchResults) async def WatchConfigSettings(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~NotifyWatchResult]<~NotifyWatchResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~NotifyWatchResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='WatchConfigSettings', version=5, params=_params) + msg = dict(type='Uniter', + request='WatchConfigSettings', + version=5, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -2526,7 +5169,10 @@ class UniterFacade(Type): ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='WatchForModelConfigChanges', version=5, params=_params) + msg = dict(type='Uniter', + request='WatchForModelConfigChanges', + version=5, + params=_params) reply = await self.rpc(msg) return reply @@ -2536,12 +5182,15 @@ class UniterFacade(Type): @ReturnMapping(NotifyWatchResults) async def WatchLeadershipSettings(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~NotifyWatchResult]<~NotifyWatchResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~NotifyWatchResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='WatchLeadershipSettings', version=5, params=_params) + msg = dict(type='Uniter', + request='WatchLeadershipSettings', + version=5, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -2551,12 +5200,15 @@ class UniterFacade(Type): @ReturnMapping(NotifyWatchResults) async def WatchMeterStatus(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~NotifyWatchResult]<~NotifyWatchResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~NotifyWatchResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='WatchMeterStatus', version=5, params=_params) + msg = dict(type='Uniter', + request='WatchMeterStatus', + version=5, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -2566,12 +5218,15 @@ class UniterFacade(Type): @ReturnMapping(RelationUnitsWatchResults) async def WatchRelationUnits(self, relation_units): ''' - relation_units : typing.Sequence<+T_co>[~RelationUnit]<~RelationUnit> - Returns -> typing.Sequence<+T_co>[~RelationUnitsWatchResult]<~RelationUnitsWatchResult> + relation_units : typing.Sequence[~RelationUnit] + Returns -> typing.Sequence[~RelationUnitsWatchResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='WatchRelationUnits', version=5, params=_params) + msg = dict(type='Uniter', + request='WatchRelationUnits', + version=5, + params=_params) _params['relation-units'] = relation_units reply = await self.rpc(msg) return reply @@ -2581,12 +5236,15 @@ class UniterFacade(Type): @ReturnMapping(NotifyWatchResults) async def WatchStorageAttachments(self, ids): ''' - ids : typing.Sequence<+T_co>[~StorageAttachmentId]<~StorageAttachmentId> - Returns -> typing.Sequence<+T_co>[~NotifyWatchResult]<~NotifyWatchResult> + ids : typing.Sequence[~StorageAttachmentId] + Returns -> typing.Sequence[~NotifyWatchResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='WatchStorageAttachments', version=5, params=_params) + msg = dict(type='Uniter', + request='WatchStorageAttachments', + version=5, + params=_params) _params['ids'] = ids reply = await self.rpc(msg) return reply @@ -2596,12 +5254,15 @@ class UniterFacade(Type): @ReturnMapping(NotifyWatchResults) async def WatchUnitAddresses(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~NotifyWatchResult]<~NotifyWatchResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~NotifyWatchResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='WatchUnitAddresses', version=5, params=_params) + msg = dict(type='Uniter', + request='WatchUnitAddresses', + version=5, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -2611,12 +5272,15 @@ class UniterFacade(Type): @ReturnMapping(StringsWatchResults) async def WatchUnitRelations(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~StringsWatchResult]<~StringsWatchResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~StringsWatchResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='WatchUnitRelations', version=5, params=_params) + msg = dict(type='Uniter', + request='WatchUnitRelations', + version=5, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -2626,12 +5290,15 @@ class UniterFacade(Type): @ReturnMapping(StringsWatchResults) async def WatchUnitStorageAttachments(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~StringsWatchResult]<~StringsWatchResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~StringsWatchResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='WatchUnitStorageAttachments', version=5, params=_params) + msg = dict(type='Uniter', + request='WatchUnitStorageAttachments', + version=5, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply @@ -2641,12 +5308,15 @@ class UniterFacade(Type): @ReturnMapping(StringResults) async def WorkloadVersion(self, entities): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> - Returns -> typing.Sequence<+T_co>[~StringResult]<~StringResult> + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~StringResult] ''' # map input types to rpc msg _params = dict() - msg = dict(type='Uniter', request='WorkloadVersion', version=5, params=_params) + msg = dict(type='Uniter', + request='WorkloadVersion', + version=5, + params=_params) _params['entities'] = entities reply = await self.rpc(msg) return reply diff --git a/juju/client/_client7.py b/juju/client/_client7.py new file mode 100644 index 0000000..1d6cd48 --- /dev/null +++ b/juju/client/_client7.py @@ -0,0 +1,1770 @@ +# 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 ProvisionerFacade(Type): + name = 'Provisioner' + version = 7 + 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'}, + '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'}, + 'CharmLXDProfile': {'additionalProperties': False, + 'properties': {'config': {'patternProperties': {'.*': {'type': 'string'}}, + 'type': 'object'}, + 'description': {'type': 'string'}, + 'devices': {'patternProperties': {'.*': {'patternProperties': {'.*': {'type': 'string'}}, + 'type': 'object'}}, + 'type': 'object'}}, + 'required': ['config', + 'description', + 'devices'], + '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'}, + 'cloudinit-userdata': {'patternProperties': {'.*': {'additionalProperties': True, + 'type': 'object'}}, + 'type': 'object'}, + 'container-inherit-properties': {'type': 'string'}, + 'juju-proxy': {'$ref': '#/definitions/Settings'}, + 'legacy-proxy': {'$ref': '#/definitions/Settings'}, + 'provider-type': {'type': 'string'}, + 'snap-proxy': {'$ref': '#/definitions/Settings'}, + 'ssl-hostname-verification': {'type': 'boolean'}}, + 'required': ['provider-type', + 'authorized-keys', + 'ssl-hostname-verification', + 'legacy-proxy', + 'juju-proxy', + 'apt-proxy', + 'snap-proxy', + 'apt-mirror', + 'UpdateBehavior'], + 'type': 'object'}, + 'ContainerLXDProfile': {'additionalProperties': False, + 'properties': {'name': {'type': 'string'}, + 'profile': {'$ref': '#/definitions/CharmLXDProfile'}}, + 'required': ['profile', 'name'], + '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'}, + 'ContainerProfileResult': {'additionalProperties': False, + 'properties': {'error': {'$ref': '#/definitions/Error'}, + 'lxd-profiles': {'items': {'$ref': '#/definitions/ContainerLXDProfile'}, + 'type': 'array'}}, + 'type': 'object'}, + 'ContainerProfileResults': {'additionalProperties': False, + 'properties': {'results': {'items': {'$ref': '#/definitions/ContainerProfileResult'}, + 'type': 'array'}}, + 'required': ['results'], + 'type': 'object'}, + 'ControllerAPIInfoResult': {'additionalProperties': False, + 'properties': {'addresses': {'items': {'type': 'string'}, + 'type': 'array'}, + 'cacert': {'type': 'string'}, + 'error': {'$ref': '#/definitions/Error'}}, + 'required': ['addresses', + 'cacert'], + 'type': 'object'}, + 'ControllerAPIInfoResults': {'additionalProperties': False, + 'properties': {'results': {'items': {'$ref': '#/definitions/ControllerAPIInfoResult'}, + 'type': 'array'}}, + 'required': ['results'], + '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'}, + 'mac-address': {'type': 'string'}}, + 'required': ['host-device-name', + 'bridge-name', + 'mac-address'], + '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': {'agentstream': {'type': 'string'}, + 'arch': {'type': 'string'}, + 'major': {'type': 'integer'}, + 'minor': {'type': 'integer'}, + 'number': {'$ref': '#/definitions/Number'}, + 'series': {'type': 'string'}}, + 'required': ['number', + 'major', + 'minor', + 'arch', + 'series', + 'agentstream'], + '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'}, + 'charm-profiles': {'items': {'type': 'string'}, + 'type': 'array'}, + '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', + 'charm-profiles'], + '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'}, + 'is-default-gateway': {'type': 'boolean'}, + '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'}, + 'ProfileChangeResult': {'additionalProperties': False, + 'properties': {'error': {'$ref': '#/definitions/Error'}, + 'new-profile-name': {'type': 'string'}, + 'old-profile-name': {'type': 'string'}, + 'profile': {'$ref': '#/definitions/CharmLXDProfile'}, + 'subordinate': {'type': 'boolean'}}, + 'type': 'object'}, + 'ProfileChangeResults': {'additionalProperties': False, + 'properties': {'results': {'items': {'$ref': '#/definitions/ProfileChangeResult'}, + 'type': 'array'}}, + 'required': ['results'], + 'type': 'object'}, + 'ProvisioningInfo': {'additionalProperties': False, + 'properties': {'charm-lxd-profiles': {'items': {'type': 'string'}, + 'type': 'array'}, + 'cloudinit-userdata': {'patternProperties': {'.*': {'additionalProperties': True, + 'type': 'object'}}, + 'type': 'object'}, + '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'}, + 'SetProfileArg': {'additionalProperties': False, + 'properties': {'entity': {'$ref': '#/definitions/Entity'}, + 'profiles': {'items': {'type': 'string'}, + 'type': 'array'}}, + 'required': ['entity', 'profiles'], + 'type': 'object'}, + 'SetProfileArgs': {'additionalProperties': False, + 'properties': {'args': {'items': {'$ref': '#/definitions/SetProfileArg'}, + 'type': 'array'}}, + 'required': ['args'], + 'type': 'object'}, + 'SetProfileUpgradeCompleteArg': {'additionalProperties': False, + 'properties': {'entity': {'$ref': '#/definitions/Entity'}, + 'message': {'type': 'string'}}, + 'required': ['entity', + 'message'], + 'type': 'object'}, + 'SetProfileUpgradeCompleteArgs': {'additionalProperties': False, + 'properties': {'args': {'items': {'$ref': '#/definitions/SetProfileUpgradeCompleteArg'}, + 'type': 'array'}}, + 'required': ['args'], + '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'}, + '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'}, + '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'}, + 'zones': {'items': {'type': 'string'}, + 'type': 'array'}}, + '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'}, + 'plan-info': {'$ref': '#/definitions/VolumeAttachmentPlanInfo'}, + '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'}, + 'VolumeAttachmentPlanInfo': {'additionalProperties': False, + 'properties': {'device-attributes': {'patternProperties': {'.*': {'type': 'string'}}, + 'type': 'object'}, + 'device-type': {'type': 'string'}}, + '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'}, + 'AvailabilityZone': {'properties': {'Params': {'$ref': '#/definitions/Entities'}, + 'Result': {'$ref': '#/definitions/StringResults'}}, + 'type': 'object'}, + 'CACert': {'properties': {'Result': {'$ref': '#/definitions/BytesResult'}}, + 'type': 'object'}, + 'CharmProfileChangeInfo': {'properties': {'Params': {'$ref': '#/definitions/Entities'}, + 'Result': {'$ref': '#/definitions/ProfileChangeResults'}}, + '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'}, + 'ControllerAPIInfoForModels': {'properties': {'Params': {'$ref': '#/definitions/Entities'}, + 'Result': {'$ref': '#/definitions/ControllerAPIInfoResults'}}, + 'type': 'object'}, + 'ControllerConfig': {'properties': {'Result': {'$ref': '#/definitions/ControllerConfigResult'}}, + 'type': 'object'}, + 'DistributionGroup': {'properties': {'Params': {'$ref': '#/definitions/Entities'}, + 'Result': {'$ref': '#/definitions/DistributionGroupResults'}}, + 'type': 'object'}, + 'DistributionGroupByMachineId': {'properties': {'Params': {'$ref': '#/definitions/Entities'}, + 'Result': {'$ref': '#/definitions/StringsResults'}}, + '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'}, + 'GetContainerProfileInfo': {'properties': {'Params': {'$ref': '#/definitions/Entities'}, + 'Result': {'$ref': '#/definitions/ContainerProfileResults'}}, + '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'}, + 'KeepInstance': {'properties': {'Params': {'$ref': '#/definitions/Entities'}, + 'Result': {'$ref': '#/definitions/BoolResults'}}, + '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'}, + 'RemoveUpgradeCharmProfileData': {'properties': {'Params': {'$ref': '#/definitions/Entities'}, + 'Result': {'$ref': '#/definitions/ErrorResults'}}, + 'type': 'object'}, + 'Series': {'properties': {'Params': {'$ref': '#/definitions/Entities'}, + 'Result': {'$ref': '#/definitions/StringResults'}}, + 'type': 'object'}, + 'SetCharmProfiles': {'properties': {'Params': {'$ref': '#/definitions/SetProfileArgs'}, + 'Result': {'$ref': '#/definitions/ErrorResults'}}, + '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'}, + 'SetUpgradeCharmProfileComplete': {'properties': {'Params': {'$ref': '#/definitions/SetProfileUpgradeCompleteArgs'}, + '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'}, + 'WatchContainersCharmProfiles': {'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'}, + 'WatchModelMachinesCharmProfiles': {'properties': {'Result': {'$ref': '#/definitions/StringsWatchResult'}}, + 'type': 'object'}}, + 'type': 'object'} + + + @ReturnMapping(StringsResult) + async def APIAddresses(self): + ''' + + Returns -> typing.Union[_ForwardRef('Error'), typing.Sequence[str]] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Provisioner', + request='APIAddresses', + version=7, + params=_params) + + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(APIHostPortsResult) + async def APIHostPorts(self): + ''' + + Returns -> typing.Sequence[~HostPort] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Provisioner', + request='APIHostPorts', + version=7, + params=_params) + + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(StringResults) + async def AvailabilityZone(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~StringResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Provisioner', + request='AvailabilityZone', + version=7, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(BytesResult) + async def CACert(self): + ''' + + Returns -> typing.Sequence[int] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Provisioner', + request='CACert', + version=7, + params=_params) + + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ProfileChangeResults) + async def CharmProfileChangeInfo(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ProfileChangeResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Provisioner', + request='CharmProfileChangeInfo', + version=7, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ConstraintsResults) + async def Constraints(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ConstraintsResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Provisioner', + request='Constraints', + version=7, + 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'), bool] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Provisioner', + request='ContainerConfig', + version=7, + params=_params) + + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ContainerManagerConfig) + async def ContainerManagerConfig(self, type_): + ''' + type_ : str + Returns -> typing.Mapping[str, str] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Provisioner', + request='ContainerManagerConfig', + version=7, + params=_params) + _params['type'] = type_ + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ControllerAPIInfoResults) + async def ControllerAPIInfoForModels(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ControllerAPIInfoResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Provisioner', + request='ControllerAPIInfoForModels', + version=7, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ControllerConfigResult) + async def ControllerConfig(self): + ''' + + Returns -> typing.Mapping[str, typing.Any] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Provisioner', + request='ControllerConfig', + version=7, + params=_params) + + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(DistributionGroupResults) + async def DistributionGroup(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~DistributionGroupResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Provisioner', + request='DistributionGroup', + version=7, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(StringsResults) + async def DistributionGroupByMachineId(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~StringsResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Provisioner', + request='DistributionGroupByMachineId', + version=7, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResults) + async def EnsureDead(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Provisioner', + request='EnsureDead', + version=7, + 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[~Tools]] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Provisioner', + request='FindTools', + version=7, + 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[~Entity] + Returns -> typing.Sequence[~MachineNetworkConfigResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Provisioner', + request='GetContainerInterfaceInfo', + version=7, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ContainerProfileResults) + async def GetContainerProfileInfo(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ContainerProfileResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Provisioner', + request='GetContainerProfileInfo', + version=7, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(HostNetworkChangeResults) + async def HostChangesForContainers(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~HostNetworkChange] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Provisioner', + request='HostChangesForContainers', + version=7, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(StringResults) + async def InstanceId(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~StringResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Provisioner', + request='InstanceId', + version=7, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(StatusResults) + async def InstanceStatus(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~StatusResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Provisioner', + request='InstanceStatus', + version=7, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(BoolResults) + async def KeepInstance(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~BoolResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Provisioner', + request='KeepInstance', + version=7, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(LifeResults) + async def Life(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~LifeResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Provisioner', + request='Life', + version=7, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(StatusResults) + async def MachinesWithTransientErrors(self): + ''' + + Returns -> typing.Sequence[~StatusResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Provisioner', + request='MachinesWithTransientErrors', + version=7, + params=_params) + + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResults) + async def MarkMachinesForRemoval(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Provisioner', + request='MarkMachinesForRemoval', + version=7, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ModelConfigResult) + async def ModelConfig(self): + ''' + + Returns -> typing.Mapping[str, typing.Any] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Provisioner', + request='ModelConfig', + version=7, + 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=7, + params=_params) + + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(MachineNetworkConfigResults) + async def PrepareContainerInterfaceInfo(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~MachineNetworkConfigResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Provisioner', + request='PrepareContainerInterfaceInfo', + version=7, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ProvisioningInfoResults) + async def ProvisioningInfo(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ProvisioningInfoResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Provisioner', + request='ProvisioningInfo', + version=7, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResults) + async def ReleaseContainerAddresses(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Provisioner', + request='ReleaseContainerAddresses', + version=7, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResults) + async def Remove(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Provisioner', + request='Remove', + version=7, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResults) + async def RemoveUpgradeCharmProfileData(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Provisioner', + request='RemoveUpgradeCharmProfileData', + version=7, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(StringResults) + async def Series(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~StringResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Provisioner', + request='Series', + version=7, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResults) + async def SetCharmProfiles(self, args): + ''' + args : typing.Sequence[~SetProfileArg] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Provisioner', + request='SetCharmProfiles', + version=7, + params=_params) + _params['args'] = args + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(None) + async def SetHostMachineNetworkConfig(self, config, tag): + ''' + config : typing.Sequence[~NetworkConfig] + tag : str + Returns -> None + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Provisioner', + request='SetHostMachineNetworkConfig', + version=7, + 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[~InstanceInfo] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Provisioner', + request='SetInstanceInfo', + version=7, + params=_params) + _params['machines'] = machines + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResults) + async def SetInstanceStatus(self, entities): + ''' + entities : typing.Sequence[~EntityStatusArgs] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Provisioner', + request='SetInstanceStatus', + version=7, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(None) + async def SetObservedNetworkConfig(self, config, tag): + ''' + config : typing.Sequence[~NetworkConfig] + tag : str + Returns -> None + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Provisioner', + request='SetObservedNetworkConfig', + version=7, + 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[~EntityPassword] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Provisioner', + request='SetPasswords', + version=7, + params=_params) + _params['changes'] = changes + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResults) + async def SetProviderNetworkConfig(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Provisioner', + request='SetProviderNetworkConfig', + version=7, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResults) + async def SetStatus(self, entities): + ''' + entities : typing.Sequence[~EntityStatusArgs] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Provisioner', + request='SetStatus', + version=7, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResults) + async def SetSupportedContainers(self, params): + ''' + params : typing.Sequence[~MachineContainers] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Provisioner', + request='SetSupportedContainers', + version=7, + params=_params) + _params['params'] = params + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResults) + async def SetUpgradeCharmProfileComplete(self, args): + ''' + args : typing.Sequence[~SetProfileUpgradeCompleteArg] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Provisioner', + request='SetUpgradeCharmProfileComplete', + version=7, + params=_params) + _params['args'] = args + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(StringsResult) + async def StateAddresses(self): + ''' + + Returns -> typing.Union[_ForwardRef('Error'), typing.Sequence[str]] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Provisioner', + request='StateAddresses', + version=7, + params=_params) + + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(StatusResults) + async def Status(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~StatusResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Provisioner', + request='Status', + version=7, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ToolsResults) + async def Tools(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ToolsResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Provisioner', + request='Tools', + version=7, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResults) + async def UpdateStatus(self, entities): + ''' + entities : typing.Sequence[~EntityStatusArgs] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Provisioner', + request='UpdateStatus', + version=7, + 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=7, + params=_params) + + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(StringsWatchResults) + async def WatchAllContainers(self, params): + ''' + params : typing.Sequence[~WatchContainer] + Returns -> typing.Sequence[~StringsWatchResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Provisioner', + request='WatchAllContainers', + version=7, + params=_params) + _params['params'] = params + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(StringsWatchResults) + async def WatchContainers(self, params): + ''' + params : typing.Sequence[~WatchContainer] + Returns -> typing.Sequence[~StringsWatchResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Provisioner', + request='WatchContainers', + version=7, + params=_params) + _params['params'] = params + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(StringsWatchResults) + async def WatchContainersCharmProfiles(self, params): + ''' + params : typing.Sequence[~WatchContainer] + Returns -> typing.Sequence[~StringsWatchResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Provisioner', + request='WatchContainersCharmProfiles', + version=7, + 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=7, + 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=7, + params=_params) + + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(StringsWatchResult) + async def WatchModelMachines(self): + ''' + + Returns -> typing.Union[typing.Sequence[str], _ForwardRef('Error'), str] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Provisioner', + request='WatchModelMachines', + version=7, + params=_params) + + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(StringsWatchResult) + async def WatchModelMachinesCharmProfiles(self): + ''' + + Returns -> typing.Union[typing.Sequence[str], _ForwardRef('Error'), str] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Provisioner', + request='WatchModelMachinesCharmProfiles', + version=7, + params=_params) + + reply = await self.rpc(msg) + return reply + + diff --git a/juju/client/_client8.py b/juju/client/_client8.py new file mode 100644 index 0000000..35d3caf --- /dev/null +++ b/juju/client/_client8.py @@ -0,0 +1,1278 @@ +# 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 = 8 + 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'}, + 'policy': {'type': 'string'}}, + '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'}, + 'via-cidrs': {'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'}, + 'ApplicationConfigSet': {'additionalProperties': False, + 'properties': {'application': {'type': 'string'}, + 'config': {'patternProperties': {'.*': {'type': 'string'}}, + 'type': 'object'}}, + 'required': ['application', 'config'], + 'type': 'object'}, + 'ApplicationConfigSetArgs': {'additionalProperties': False, + 'properties': {'Args': {'items': {'$ref': '#/definitions/ApplicationConfigSet'}, + 'type': 'array'}}, + 'required': ['Args'], + 'type': 'object'}, + 'ApplicationConfigUnsetArgs': {'additionalProperties': False, + 'properties': {'Args': {'items': {'$ref': '#/definitions/ApplicationUnset'}, + 'type': 'array'}}, + 'required': ['Args'], + 'type': 'object'}, + 'ApplicationConstraint': {'additionalProperties': False, + 'properties': {'constraints': {'$ref': '#/definitions/Value'}, + 'error': {'$ref': '#/definitions/Error'}}, + 'required': ['constraints'], + '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'}, + 'devices': {'patternProperties': {'.*': {'$ref': '#/definitions/Constraints'}}, + 'type': 'object'}, + 'endpoint-bindings': {'patternProperties': {'.*': {'type': 'string'}}, + 'type': 'object'}, + 'num-units': {'type': 'integer'}, + 'placement': {'items': {'$ref': '#/definitions/Placement'}, + 'type': 'array'}, + 'policy': {'type': 'string'}, + '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'}, + 'ApplicationGetConfigResults': {'additionalProperties': False, + 'properties': {'Results': {'items': {'$ref': '#/definitions/ConfigResult'}, + 'type': 'array'}}, + 'required': ['Results'], + 'type': 'object'}, + 'ApplicationGetConstraintsResults': {'additionalProperties': False, + 'properties': {'results': {'items': {'$ref': '#/definitions/ApplicationConstraint'}, + 'type': 'array'}}, + 'required': ['results'], + 'type': 'object'}, + 'ApplicationGetResults': {'additionalProperties': False, + 'properties': {'application': {'type': 'string'}, + 'application-config': {'patternProperties': {'.*': {'additionalProperties': True, + 'type': 'object'}}, + 'type': 'object'}, + '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'}, + 'ApplicationOfferDetails': {'additionalProperties': False, + 'properties': {'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'}, + 'offer-uuid': {'type': 'string'}, + 'source-model-tag': {'type': 'string'}, + 'spaces': {'items': {'$ref': '#/definitions/RemoteSpace'}, + 'type': 'array'}, + 'users': {'items': {'$ref': '#/definitions/OfferUserDetails'}, + 'type': 'array'}}, + 'required': ['source-model-tag', + 'offer-uuid', + 'offer-url', + 'offer-name', + 'application-description'], + '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': {'type': 'boolean'}, + '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', + 'force-units', + 'force-series'], + 'type': 'object'}, + 'ApplicationSetCharmProfile': {'additionalProperties': False, + 'properties': {'application': {'type': 'string'}, + 'charm-url': {'type': 'string'}}, + 'required': ['application', + 'charm-url'], + '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': {'type': 'boolean'}, + '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', + 'force', + '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'}, + 'ConfigResult': {'additionalProperties': False, + 'properties': {'config': {'patternProperties': {'.*': {'additionalProperties': True, + 'type': 'object'}}, + 'type': 'object'}, + 'error': {'$ref': '#/definitions/Error'}}, + 'required': ['config'], + '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': {'ApplicationOfferDetails': {'$ref': '#/definitions/ApplicationOfferDetails'}, + 'application-alias': {'type': 'string'}, + 'external-controller': {'$ref': '#/definitions/ExternalControllerInfo'}, + 'macaroon': {'$ref': '#/definitions/Macaroon'}}, + 'required': ['ApplicationOfferDetails'], + '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'}, + 'DestroyApplicationParams': {'additionalProperties': False, + 'properties': {'application-tag': {'type': 'string'}, + 'destroy-storage': {'type': 'boolean'}}, + 'required': ['application-tag'], + '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'}, + 'DestroyApplicationsParams': {'additionalProperties': False, + 'properties': {'applications': {'items': {'$ref': '#/definitions/DestroyApplicationParams'}, + 'type': 'array'}}, + 'required': ['applications'], + 'type': 'object'}, + 'DestroyConsumedApplicationParams': {'additionalProperties': False, + 'properties': {'application-tag': {'type': 'string'}}, + 'required': ['application-tag'], + 'type': 'object'}, + 'DestroyConsumedApplicationsParams': {'additionalProperties': False, + 'properties': {'applications': {'items': {'$ref': '#/definitions/DestroyConsumedApplicationParams'}, + 'type': 'array'}}, + 'required': ['applications'], + 'type': 'object'}, + 'DestroyRelation': {'additionalProperties': False, + 'properties': {'endpoints': {'items': {'type': 'string'}, + 'type': 'array'}, + 'relation-id': {'type': 'integer'}}, + 'required': ['relation-id'], + 'type': 'object'}, + 'DestroyUnitInfo': {'additionalProperties': False, + 'properties': {'destroyed-storage': {'items': {'$ref': '#/definitions/Entity'}, + 'type': 'array'}, + 'detached-storage': {'items': {'$ref': '#/definitions/Entity'}, + 'type': 'array'}}, + 'type': 'object'}, + 'DestroyUnitParams': {'additionalProperties': False, + 'properties': {'destroy-storage': {'type': 'boolean'}, + 'unit-tag': {'type': 'string'}}, + 'required': ['unit-tag'], + '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'}, + 'DestroyUnitsParams': {'additionalProperties': False, + 'properties': {'units': {'items': {'$ref': '#/definitions/DestroyUnitParams'}, + 'type': 'array'}}, + 'required': ['units'], + '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'}, + 'ExternalControllerInfo': {'additionalProperties': False, + 'properties': {'addrs': {'items': {'type': 'string'}, + 'type': 'array'}, + 'ca-cert': {'type': 'string'}, + 'controller-alias': {'type': 'string'}, + 'controller-tag': {'type': 'string'}}, + 'required': ['controller-tag', + 'controller-alias', + 'addrs', + 'ca-cert'], + 'type': 'object'}, + 'LXDProfileUpgradeMessages': {'additionalProperties': False, + 'properties': {'application': {'$ref': '#/definitions/Entity'}, + 'watcher-id': {'type': 'string'}}, + 'required': ['application', + 'watcher-id'], + 'type': 'object'}, + 'LXDProfileUpgradeMessagesResult': {'additionalProperties': False, + 'properties': {'error': {'$ref': '#/definitions/Error'}, + 'message': {'type': 'string'}, + 'unit-name': {'type': 'string'}}, + 'required': ['unit-name', + 'message'], + 'type': 'object'}, + 'LXDProfileUpgradeMessagesResults': {'additionalProperties': False, + 'properties': {'args': {'items': {'$ref': '#/definitions/LXDProfileUpgradeMessagesResult'}, + 'type': 'array'}}, + 'required': ['args'], + 'type': 'object'}, + 'Macaroon': {'additionalProperties': False, 'type': 'object'}, + 'NotifyWatchResult': {'additionalProperties': False, + 'properties': {'NotifyWatcherId': {'type': 'string'}, + 'error': {'$ref': '#/definitions/Error'}}, + 'required': ['NotifyWatcherId'], + 'type': 'object'}, + 'OfferUserDetails': {'additionalProperties': False, + 'properties': {'access': {'type': 'string'}, + 'display-name': {'type': 'string'}, + 'user': {'type': 'string'}}, + 'required': ['user', + 'display-name', + 'access'], + 'type': 'object'}, + 'Placement': {'additionalProperties': False, + 'properties': {'directive': {'type': 'string'}, + 'scope': {'type': 'string'}}, + 'required': ['scope', 'directive'], + 'type': 'object'}, + 'RelationSuspendedArg': {'additionalProperties': False, + 'properties': {'message': {'type': 'string'}, + 'relation-id': {'type': 'integer'}, + 'suspended': {'type': 'boolean'}}, + 'required': ['relation-id', + 'message', + 'suspended'], + 'type': 'object'}, + 'RelationSuspendedArgs': {'additionalProperties': False, + 'properties': {'args': {'items': {'$ref': '#/definitions/RelationSuspendedArg'}, + 'type': 'array'}}, + 'required': ['args'], + 'type': 'object'}, + 'RemoteEndpoint': {'additionalProperties': False, + 'properties': {'interface': {'type': 'string'}, + 'limit': {'type': 'integer'}, + 'name': {'type': 'string'}, + 'role': {'type': 'string'}}, + 'required': ['name', + 'role', + 'interface', + 'limit'], + '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'}, + 'ScaleApplicationInfo': {'additionalProperties': False, + 'properties': {'num-units': {'type': 'integer'}}, + 'required': ['num-units'], + 'type': 'object'}, + 'ScaleApplicationParams': {'additionalProperties': False, + 'properties': {'application-tag': {'type': 'string'}, + 'scale': {'type': 'integer'}, + 'scale-change': {'type': 'integer'}}, + 'required': ['application-tag', + 'scale'], + 'type': 'object'}, + 'ScaleApplicationResult': {'additionalProperties': False, + 'properties': {'error': {'$ref': '#/definitions/Error'}, + 'info': {'$ref': '#/definitions/ScaleApplicationInfo'}}, + 'type': 'object'}, + 'ScaleApplicationResults': {'additionalProperties': False, + 'properties': {'results': {'items': {'$ref': '#/definitions/ScaleApplicationResult'}, + 'type': 'array'}}, + 'type': 'object'}, + 'ScaleApplicationsParams': {'additionalProperties': False, + 'properties': {'applications': {'items': {'$ref': '#/definitions/ScaleApplicationParams'}, + 'type': 'array'}}, + 'required': ['applications'], + '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'}, + 'UnitsResolved': {'additionalProperties': False, + 'properties': {'all': {'type': 'boolean'}, + 'retry': {'type': 'boolean'}, + 'tags': {'$ref': '#/definitions/Entities'}}, + 'type': 'object'}, + 'UpdateSeriesArg': {'additionalProperties': False, + 'properties': {'force': {'type': 'boolean'}, + 'series': {'type': 'string'}, + 'tag': {'$ref': '#/definitions/Entity'}}, + 'required': ['tag', 'force', 'series'], + 'type': 'object'}, + 'UpdateSeriesArgs': {'additionalProperties': False, + 'properties': {'args': {'items': {'$ref': '#/definitions/UpdateSeriesArg'}, + 'type': 'array'}}, + 'required': ['args'], + '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'}, + 'zones': {'items': {'type': 'string'}, + 'type': 'array'}}, + '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'}, + 'CharmConfig': {'properties': {'Params': {'$ref': '#/definitions/Entities'}, + 'Result': {'$ref': '#/definitions/ApplicationGetConfigResults'}}, + '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/DestroyApplicationsParams'}, + 'Result': {'$ref': '#/definitions/DestroyApplicationResults'}}, + 'type': 'object'}, + 'DestroyConsumedApplications': {'properties': {'Params': {'$ref': '#/definitions/DestroyConsumedApplicationsParams'}, + 'Result': {'$ref': '#/definitions/ErrorResults'}}, + 'type': 'object'}, + 'DestroyRelation': {'properties': {'Params': {'$ref': '#/definitions/DestroyRelation'}}, + 'type': 'object'}, + 'DestroyUnit': {'properties': {'Params': {'$ref': '#/definitions/DestroyUnitsParams'}, + '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'}, + 'GetConfig': {'properties': {'Params': {'$ref': '#/definitions/Entities'}, + 'Result': {'$ref': '#/definitions/ApplicationGetConfigResults'}}, + 'type': 'object'}, + 'GetConstraints': {'properties': {'Params': {'$ref': '#/definitions/Entities'}, + 'Result': {'$ref': '#/definitions/ApplicationGetConstraintsResults'}}, + 'type': 'object'}, + 'GetLXDProfileUpgradeMessages': {'properties': {'Params': {'$ref': '#/definitions/LXDProfileUpgradeMessages'}, + 'Result': {'$ref': '#/definitions/LXDProfileUpgradeMessagesResults'}}, + 'type': 'object'}, + 'ResolveUnitErrors': {'properties': {'Params': {'$ref': '#/definitions/UnitsResolved'}, + 'Result': {'$ref': '#/definitions/ErrorResults'}}, + 'type': 'object'}, + 'ScaleApplications': {'properties': {'Params': {'$ref': '#/definitions/ScaleApplicationsParams'}, + 'Result': {'$ref': '#/definitions/ScaleApplicationResults'}}, + 'type': 'object'}, + 'Set': {'properties': {'Params': {'$ref': '#/definitions/ApplicationSet'}}, + 'type': 'object'}, + 'SetApplicationsConfig': {'properties': {'Params': {'$ref': '#/definitions/ApplicationConfigSetArgs'}, + 'Result': {'$ref': '#/definitions/ErrorResults'}}, + 'type': 'object'}, + 'SetCharm': {'properties': {'Params': {'$ref': '#/definitions/ApplicationSetCharm'}}, + 'type': 'object'}, + 'SetCharmProfile': {'properties': {'Params': {'$ref': '#/definitions/ApplicationSetCharmProfile'}}, + 'type': 'object'}, + 'SetConstraints': {'properties': {'Params': {'$ref': '#/definitions/SetConstraints'}}, + 'type': 'object'}, + 'SetMetricCredentials': {'properties': {'Params': {'$ref': '#/definitions/ApplicationMetricCredentials'}, + 'Result': {'$ref': '#/definitions/ErrorResults'}}, + 'type': 'object'}, + 'SetRelationsSuspended': {'properties': {'Params': {'$ref': '#/definitions/RelationSuspendedArgs'}, + 'Result': {'$ref': '#/definitions/ErrorResults'}}, + 'type': 'object'}, + 'Unexpose': {'properties': {'Params': {'$ref': '#/definitions/ApplicationUnexpose'}}, + 'type': 'object'}, + 'Unset': {'properties': {'Params': {'$ref': '#/definitions/ApplicationUnset'}}, + 'type': 'object'}, + 'UnsetApplicationsConfig': {'properties': {'Params': {'$ref': '#/definitions/ApplicationConfigUnsetArgs'}, + 'Result': {'$ref': '#/definitions/ErrorResults'}}, + 'type': 'object'}, + 'Update': {'properties': {'Params': {'$ref': '#/definitions/ApplicationUpdate'}}, + 'type': 'object'}, + 'UpdateApplicationSeries': {'properties': {'Params': {'$ref': '#/definitions/UpdateSeriesArgs'}, + 'Result': {'$ref': '#/definitions/ErrorResults'}}, + 'type': 'object'}, + 'WatchLXDProfileUpgradeNotifications': {'properties': {'Params': {'$ref': '#/definitions/Entity'}, + 'Result': {'$ref': '#/definitions/NotifyWatchResult'}}, + 'type': 'object'}}, + 'type': 'object'} + + + @ReturnMapping(AddRelationResults) + async def AddRelation(self, endpoints): + ''' + endpoints : typing.Sequence[str] + Returns -> typing.Mapping[str, ~CharmRelation] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Application', + request='AddRelation', + version=8, + 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[~Placement] + Returns -> typing.Sequence[str] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Application', + request='AddUnits', + version=8, + params=_params) + _params['application'] = application + _params['num-units'] = num_units + _params['placement'] = placement + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ApplicationGetConfigResults) + async def CharmConfig(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ConfigResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Application', + request='CharmConfig', + version=8, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ApplicationCharmRelationsResults) + async def CharmRelations(self, application): + ''' + application : str + Returns -> typing.Sequence[str] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Application', + request='CharmRelations', + version=8, + params=_params) + _params['application'] = application + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResults) + async def Consume(self, args): + ''' + args : typing.Sequence[~ConsumeApplicationArg] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Application', + request='Consume', + version=8, + params=_params) + _params['args'] = args + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResults) + async def Deploy(self, applications): + ''' + applications : typing.Sequence[~ApplicationDeploy] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Application', + request='Deploy', + version=8, + 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=8, + params=_params) + _params['application'] = application + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(DestroyApplicationResults) + async def DestroyApplication(self, applications): + ''' + applications : typing.Sequence[~DestroyApplicationParams] + Returns -> typing.Sequence[~DestroyApplicationResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Application', + request='DestroyApplication', + version=8, + params=_params) + _params['applications'] = applications + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResults) + async def DestroyConsumedApplications(self, applications): + ''' + applications : typing.Sequence[~DestroyConsumedApplicationParams] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Application', + request='DestroyConsumedApplications', + version=8, + params=_params) + _params['applications'] = applications + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(None) + async def DestroyRelation(self, endpoints): + ''' + endpoints : typing.Sequence[str] + Returns -> None + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Application', + request='DestroyRelation', + version=8, + params=_params) + _params['endpoints'] = endpoints + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(DestroyUnitResults) + async def DestroyUnit(self, units): + ''' + units : typing.Sequence[~DestroyUnitParams] + Returns -> typing.Sequence[~DestroyUnitResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Application', + request='DestroyUnit', + version=8, + params=_params) + _params['units'] = units + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(None) + async def DestroyUnits(self, unit_names): + ''' + unit_names : typing.Sequence[str] + Returns -> None + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Application', + request='DestroyUnits', + version=8, + 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=8, + 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[str, typing.Any], _ForwardRef('Value')] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Application', + request='Get', + version=8, + 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=8, + params=_params) + _params['application'] = application + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ApplicationGetConfigResults) + async def GetConfig(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ConfigResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Application', + request='GetConfig', + version=8, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ApplicationGetConstraintsResults) + async def GetConstraints(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ApplicationConstraint] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Application', + request='GetConstraints', + version=8, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(LXDProfileUpgradeMessagesResults) + async def GetLXDProfileUpgradeMessages(self, application, watcher_id): + ''' + application : Entity + watcher_id : str + Returns -> typing.Sequence[~LXDProfileUpgradeMessagesResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Application', + request='GetLXDProfileUpgradeMessages', + version=8, + params=_params) + _params['application'] = application + _params['watcher-id'] = watcher_id + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResults) + async def ResolveUnitErrors(self, all_, retry, tags): + ''' + all_ : bool + retry : bool + tags : Entities + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Application', + request='ResolveUnitErrors', + version=8, + params=_params) + _params['all'] = all_ + _params['retry'] = retry + _params['tags'] = tags + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ScaleApplicationResults) + async def ScaleApplications(self, applications): + ''' + applications : typing.Sequence[~ScaleApplicationParams] + Returns -> typing.Sequence[~ScaleApplicationResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Application', + request='ScaleApplications', + version=8, + params=_params) + _params['applications'] = applications + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(None) + async def Set(self, application, options): + ''' + application : str + options : typing.Mapping[str, str] + Returns -> None + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Application', + request='Set', + version=8, + params=_params) + _params['application'] = application + _params['options'] = options + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResults) + async def SetApplicationsConfig(self, args): + ''' + args : typing.Sequence[~ApplicationConfigSet] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Application', + request='SetApplicationsConfig', + version=8, + params=_params) + _params['Args'] = args + 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[str, str] + config_settings_yaml : str + force_series : bool + force_units : bool + resource_ids : typing.Mapping[str, str] + storage_constraints : typing.Mapping[str, ~StorageConstraints] + Returns -> None + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Application', + request='SetCharm', + version=8, + 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 SetCharmProfile(self, application, charm_url): + ''' + application : str + charm_url : str + Returns -> None + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Application', + request='SetCharmProfile', + version=8, + params=_params) + _params['application'] = application + _params['charm-url'] = charm_url + 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=8, + 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[~ApplicationMetricCredential] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Application', + request='SetMetricCredentials', + version=8, + params=_params) + _params['creds'] = creds + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResults) + async def SetRelationsSuspended(self, args): + ''' + args : typing.Sequence[~RelationSuspendedArg] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Application', + request='SetRelationsSuspended', + version=8, + params=_params) + _params['args'] = args + 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=8, + 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[str] + Returns -> None + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Application', + request='Unset', + version=8, + params=_params) + _params['application'] = application + _params['options'] = options + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResults) + async def UnsetApplicationsConfig(self, args): + ''' + args : typing.Sequence[~ApplicationUnset] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Application', + request='UnsetApplicationsConfig', + version=8, + params=_params) + _params['Args'] = args + 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[str, str] + settings_yaml : str + Returns -> None + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Application', + request='Update', + version=8, + 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 + + + + @ReturnMapping(ErrorResults) + async def UpdateApplicationSeries(self, args): + ''' + args : typing.Sequence[~UpdateSeriesArg] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Application', + request='UpdateApplicationSeries', + version=8, + params=_params) + _params['args'] = args + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(NotifyWatchResult) + async def WatchLXDProfileUpgradeNotifications(self, tag): + ''' + tag : str + Returns -> typing.Union[str, _ForwardRef('Error')] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Application', + request='WatchLXDProfileUpgradeNotifications', + version=8, + params=_params) + _params['tag'] = tag + reply = await self.rpc(msg) + return reply + + diff --git a/juju/client/_client9.py b/juju/client/_client9.py new file mode 100644 index 0000000..d87dd8f --- /dev/null +++ b/juju/client/_client9.py @@ -0,0 +1,2385 @@ +# 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 UniterFacade(Type): + name = 'Uniter' + version = 9 + 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'}, + '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'}, + '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': {'cacertificates': {'items': {'type': 'string'}, + 'type': 'array'}, + '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'}, + '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'}, + 'EntityString': {'additionalProperties': False, + 'properties': {'tag': {'type': 'string'}, + 'value': {'type': 'string'}}, + 'required': ['tag', 'value'], + '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'}, + 'GoalState': {'additionalProperties': False, + 'properties': {'relations': {'patternProperties': {'.*': {'patternProperties': {'.*': {'$ref': '#/definitions/GoalStateStatus'}}, + 'type': 'object'}}, + 'type': 'object'}, + 'units': {'patternProperties': {'.*': {'$ref': '#/definitions/GoalStateStatus'}}, + 'type': 'object'}}, + 'required': ['units', 'relations'], + 'type': 'object'}, + 'GoalStateResult': {'additionalProperties': False, + 'properties': {'error': {'$ref': '#/definitions/Error'}, + 'result': {'$ref': '#/definitions/GoalState'}}, + 'required': ['result', 'error'], + 'type': 'object'}, + 'GoalStateResults': {'additionalProperties': False, + 'properties': {'results': {'items': {'$ref': '#/definitions/GoalStateResult'}, + 'type': 'array'}}, + 'required': ['results'], + 'type': 'object'}, + 'GoalStateStatus': {'additionalProperties': False, + 'properties': {'since': {'format': 'date-time', + 'type': 'string'}, + 'status': {'type': 'string'}}, + 'required': ['status', 'since'], + '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'}, + 'hostname': {'type': 'string'}, + 'value': {'type': 'string'}}, + 'required': ['hostname', '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'}, + 'unit-tag': {'type': 'string'}}, + 'required': ['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'}, + 'labels': {'patternProperties': {'.*': {'type': 'string'}}, + 'type': 'object'}, + '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'}, + 'type': {'type': 'string'}, + 'uuid': {'type': 'string'}}, + 'required': ['name', 'uuid', 'type'], + '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'}, + 'relation-id': {'type': 'integer'}, + 'unit': {'type': 'string'}}, + 'required': ['unit', 'bindings'], + 'type': 'object'}, + 'NetworkInfoResult': {'additionalProperties': False, + 'properties': {'bind-addresses': {'items': {'$ref': '#/definitions/NetworkInfo'}, + 'type': 'array'}, + 'egress-subnets': {'items': {'type': 'string'}, + 'type': 'array'}, + 'error': {'$ref': '#/definitions/Error'}, + 'ingress-addresses': {'items': {'type': 'string'}, + 'type': 'array'}}, + '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': {'bool': {'type': 'boolean'}, + 'endpoint': {'$ref': '#/definitions/Endpoint'}, + 'error': {'$ref': '#/definitions/Error'}, + 'id': {'type': 'integer'}, + 'key': {'type': 'string'}, + 'life': {'type': 'string'}, + 'other-application': {'type': 'string'}}, + 'required': ['life', + 'id', + 'key', + 'endpoint'], + 'type': 'object'}, + 'RelationResults': {'additionalProperties': False, + 'properties': {'results': {'items': {'$ref': '#/definitions/RelationResult'}, + 'type': 'array'}}, + 'required': ['results'], + 'type': 'object'}, + 'RelationStatusArg': {'additionalProperties': False, + 'properties': {'message': {'type': 'string'}, + 'relation-id': {'type': 'integer'}, + 'status': {'type': 'string'}, + 'unit-tag': {'type': 'string'}}, + 'required': ['unit-tag', + 'relation-id', + 'status', + 'message'], + 'type': 'object'}, + 'RelationStatusArgs': {'additionalProperties': False, + 'properties': {'args': {'items': {'$ref': '#/definitions/RelationStatusArg'}, + 'type': 'array'}}, + 'required': ['args'], + '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'}, + 'RelationUnitStatus': {'additionalProperties': False, + 'properties': {'in-scope': {'type': 'boolean'}, + 'relation-tag': {'type': 'string'}, + 'suspended': {'type': 'boolean'}}, + 'required': ['relation-tag', + 'in-scope', + 'suspended'], + 'type': 'object'}, + 'RelationUnitStatusResult': {'additionalProperties': False, + 'properties': {'error': {'$ref': '#/definitions/Error'}, + 'results': {'items': {'$ref': '#/definitions/RelationUnitStatus'}, + 'type': 'array'}}, + 'required': ['results'], + 'type': 'object'}, + 'RelationUnitStatusResults': {'additionalProperties': False, + 'properties': {'results': {'items': {'$ref': '#/definitions/RelationUnitStatusResult'}, + 'type': 'array'}}, + 'required': ['results'], + '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'}, + 'SetPodSpecParams': {'additionalProperties': False, + 'properties': {'specs': {'items': {'$ref': '#/definitions/EntityString'}, + 'type': 'array'}}, + 'required': ['specs'], + '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'}, + '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'}, + 'UnitRefreshResult': {'additionalProperties': False, + 'properties': {'Error': {'$ref': '#/definitions/Error'}, + 'Life': {'type': 'string'}, + 'Resolved': {'type': 'string'}}, + 'required': ['Life', + 'Resolved', + 'Error'], + 'type': 'object'}, + 'UnitRefreshResults': {'additionalProperties': False, + 'properties': {'Results': {'items': {'$ref': '#/definitions/UnitRefreshResult'}, + 'type': 'array'}}, + 'required': ['Results'], + 'type': 'object'}, + 'UnitSettings': {'additionalProperties': False, + 'properties': {'version': {'type': 'integer'}}, + 'required': ['version'], + 'type': 'object'}, + 'UpgradeSeriesStatusParam': {'additionalProperties': False, + 'properties': {'entity': {'$ref': '#/definitions/Entity'}, + 'message': {'type': 'string'}, + 'status': {'type': 'string'}}, + 'required': ['entity', + 'status', + 'message'], + 'type': 'object'}, + 'UpgradeSeriesStatusParams': {'additionalProperties': False, + 'properties': {'params': {'items': {'$ref': '#/definitions/UpgradeSeriesStatusParam'}, + 'type': 'array'}}, + 'required': ['params'], + 'type': 'object'}, + 'UpgradeSeriesStatusResult': {'additionalProperties': False, + 'properties': {'error': {'$ref': '#/definitions/Error'}, + 'status': {'type': 'string'}}, + 'type': 'object'}, + 'UpgradeSeriesStatusResults': {'additionalProperties': False, + 'properties': {'results': {'items': {'$ref': '#/definitions/UpgradeSeriesStatusResult'}, + 'type': 'array'}}, + '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'}, + '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'}, + 'CloudSpec': {'properties': {'Result': {'$ref': '#/definitions/CloudSpecResult'}}, + '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'}, + 'GoalStates': {'properties': {'Params': {'$ref': '#/definitions/Entities'}, + 'Result': {'$ref': '#/definitions/GoalStateResults'}}, + 'type': 'object'}, + 'HasSubordinates': {'properties': {'Params': {'$ref': '#/definitions/Entities'}, + 'Result': {'$ref': '#/definitions/BoolResults'}}, + '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'}, + 'Refresh': {'properties': {'Params': {'$ref': '#/definitions/Entities'}, + 'Result': {'$ref': '#/definitions/UnitRefreshResults'}}, + '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'}, + 'RelationsStatus': {'properties': {'Params': {'$ref': '#/definitions/Entities'}, + 'Result': {'$ref': '#/definitions/RelationUnitStatusResults'}}, + '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'}, + 'SetPodSpec': {'properties': {'Params': {'$ref': '#/definitions/SetPodSpecParams'}, + 'Result': {'$ref': '#/definitions/ErrorResults'}}, + 'type': 'object'}, + 'SetRelationStatus': {'properties': {'Params': {'$ref': '#/definitions/RelationStatusArgs'}, + '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'}, + 'SetUpgradeSeriesUnitStatus': {'properties': {'Params': {'$ref': '#/definitions/UpgradeSeriesStatusParams'}, + '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'}, + 'UpgradeSeriesUnitStatus': {'properties': {'Params': {'$ref': '#/definitions/Entities'}, + 'Result': {'$ref': '#/definitions/UpgradeSeriesStatusResults'}}, + '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'}, + 'WatchConfigSettingsHash': {'properties': {'Params': {'$ref': '#/definitions/Entities'}, + 'Result': {'$ref': '#/definitions/StringsWatchResults'}}, + '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'}, + 'WatchTrustConfigSettingsHash': {'properties': {'Params': {'$ref': '#/definitions/Entities'}, + 'Result': {'$ref': '#/definitions/StringsWatchResults'}}, + 'type': 'object'}, + 'WatchUnitAddressesHash': {'properties': {'Params': {'$ref': '#/definitions/Entities'}, + 'Result': {'$ref': '#/definitions/StringsWatchResults'}}, + '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'}, + 'WatchUpgradeSeriesNotifications': {'properties': {'Params': {'$ref': '#/definitions/Entities'}, + 'Result': {'$ref': '#/definitions/NotifyWatchResults'}}, + '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[str]] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Uniter', + request='APIAddresses', + version=9, + params=_params) + + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(APIHostPortsResult) + async def APIHostPorts(self): + ''' + + Returns -> typing.Sequence[~HostPort] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Uniter', + request='APIHostPorts', + version=9, + params=_params) + + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ActionResults) + async def Actions(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ActionResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Uniter', + request='Actions', + version=9, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResults) + async def AddMetricBatches(self, batches): + ''' + batches : typing.Sequence[~MetricBatchParam] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Uniter', + request='AddMetricBatches', + version=9, + params=_params) + _params['batches'] = batches + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResults) + async def AddUnitStorage(self, storages): + ''' + storages : typing.Sequence[~StorageAddParams] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Uniter', + request='AddUnitStorage', + version=9, + params=_params) + _params['storages'] = storages + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(MachinePortsResults) + async def AllMachinePorts(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~MachinePortsResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Uniter', + request='AllMachinePorts', + version=9, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ApplicationStatusResults) + async def ApplicationStatus(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ApplicationStatusResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Uniter', + request='ApplicationStatus', + version=9, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(StringResults) + async def AssignedMachine(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~StringResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Uniter', + request='AssignedMachine', + version=9, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(StringResults) + async def AvailabilityZone(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~StringResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Uniter', + request='AvailabilityZone', + version=9, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResults) + async def BeginActions(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Uniter', + request='BeginActions', + version=9, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(StringResults) + async def CharmArchiveSha256(self, urls): + ''' + urls : typing.Sequence[~CharmURL] + Returns -> typing.Sequence[~StringResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Uniter', + request='CharmArchiveSha256', + version=9, + params=_params) + _params['urls'] = urls + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(IntResults) + async def CharmModifiedVersion(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~IntResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Uniter', + request='CharmModifiedVersion', + version=9, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(StringBoolResults) + async def CharmURL(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~StringBoolResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Uniter', + request='CharmURL', + version=9, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResults) + async def ClearResolved(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Uniter', + request='ClearResolved', + version=9, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResults) + async def ClosePorts(self, entities): + ''' + entities : typing.Sequence[~EntityPortRange] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Uniter', + request='ClosePorts', + version=9, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(CloudSpecResult) + async def CloudSpec(self): + ''' + + Returns -> typing.Union[_ForwardRef('Error'), _ForwardRef('CloudSpec')] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Uniter', + request='CloudSpec', + version=9, + params=_params) + + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ConfigSettingsResults) + async def ConfigSettings(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ConfigSettingsResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Uniter', + request='ConfigSettings', + version=9, + 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=9, + params=_params) + + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResults) + async def Destroy(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Uniter', + request='Destroy', + version=9, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResults) + async def DestroyAllSubordinates(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Uniter', + request='DestroyAllSubordinates', + version=9, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResults) + async def DestroyUnitStorageAttachments(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Uniter', + request='DestroyUnitStorageAttachments', + version=9, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResults) + async def EnsureDead(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Uniter', + request='EnsureDead', + version=9, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResults) + async def EnterScope(self, relation_units): + ''' + relation_units : typing.Sequence[~RelationUnit] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Uniter', + request='EnterScope', + version=9, + params=_params) + _params['relation-units'] = relation_units + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResults) + async def FinishActions(self, results): + ''' + results : typing.Sequence[~ActionExecutionResult] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Uniter', + request='FinishActions', + version=9, + params=_params) + _params['results'] = results + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(MeterStatusResults) + async def GetMeterStatus(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~MeterStatusResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Uniter', + request='GetMeterStatus', + version=9, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(StringBoolResults) + async def GetPrincipal(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~StringBoolResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Uniter', + request='GetPrincipal', + version=9, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(GoalStateResults) + async def GoalStates(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~GoalStateResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Uniter', + request='GoalStates', + version=9, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(BoolResults) + async def HasSubordinates(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~BoolResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Uniter', + request='HasSubordinates', + version=9, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResults) + async def LeaveScope(self, relation_units): + ''' + relation_units : typing.Sequence[~RelationUnit] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Uniter', + request='LeaveScope', + version=9, + params=_params) + _params['relation-units'] = relation_units + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(LifeResults) + async def Life(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~LifeResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Uniter', + request='Life', + version=9, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResults) + async def Merge(self, params): + ''' + params : typing.Sequence[~MergeLeadershipSettingsParam] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Uniter', + request='Merge', + version=9, + params=_params) + _params['params'] = params + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ModelConfigResult) + async def ModelConfig(self): + ''' + + Returns -> typing.Mapping[str, typing.Any] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Uniter', + request='ModelConfig', + version=9, + 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=9, + params=_params) + + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(NetworkInfoResults) + async def NetworkInfo(self, bindings, unit): + ''' + bindings : typing.Sequence[str] + unit : str + Returns -> typing.Mapping[str, ~NetworkInfoResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Uniter', + request='NetworkInfo', + version=9, + 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[~EntityPortRange] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Uniter', + request='OpenPorts', + version=9, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(StringResults) + async def PrivateAddress(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~StringResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Uniter', + request='PrivateAddress', + version=9, + 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=9, + params=_params) + + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(StringResults) + async def PublicAddress(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~StringResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Uniter', + request='PublicAddress', + version=9, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(GetLeadershipSettingsBulkResults) + async def Read(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~GetLeadershipSettingsResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Uniter', + request='Read', + version=9, + 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[~RelationUnitPair] + Returns -> typing.Sequence[~SettingsResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Uniter', + request='ReadRemoteSettings', + version=9, + 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[~RelationUnit] + Returns -> typing.Sequence[~SettingsResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Uniter', + request='ReadSettings', + version=9, + params=_params) + _params['relation-units'] = relation_units + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(UnitRefreshResults) + async def Refresh(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~UnitRefreshResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Uniter', + request='Refresh', + version=9, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(RelationResults) + async def Relation(self, relation_units): + ''' + relation_units : typing.Sequence[~RelationUnit] + Returns -> typing.Sequence[~RelationResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Uniter', + request='Relation', + version=9, + 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[int] + Returns -> typing.Sequence[~RelationResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Uniter', + request='RelationById', + version=9, + params=_params) + _params['relation-ids'] = relation_ids + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(RelationUnitStatusResults) + async def RelationsStatus(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~RelationUnitStatusResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Uniter', + request='RelationsStatus', + version=9, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResults) + async def RemoveStorageAttachments(self, ids): + ''' + ids : typing.Sequence[~StorageAttachmentId] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Uniter', + request='RemoveStorageAttachments', + version=9, + params=_params) + _params['ids'] = ids + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResults) + async def RequestReboot(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Uniter', + request='RequestReboot', + version=9, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ResolvedModeResults) + async def Resolved(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~ResolvedModeResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Uniter', + request='Resolved', + version=9, + 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=9, + params=_params) + + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResults) + async def SetAgentStatus(self, entities): + ''' + entities : typing.Sequence[~EntityStatusArgs] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Uniter', + request='SetAgentStatus', + version=9, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResults) + async def SetApplicationStatus(self, entities): + ''' + entities : typing.Sequence[~EntityStatusArgs] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Uniter', + request='SetApplicationStatus', + version=9, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResults) + async def SetCharmURL(self, entities): + ''' + entities : typing.Sequence[~EntityCharmURL] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Uniter', + request='SetCharmURL', + version=9, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResults) + async def SetPodSpec(self, specs): + ''' + specs : typing.Sequence[~EntityString] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Uniter', + request='SetPodSpec', + version=9, + params=_params) + _params['specs'] = specs + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResults) + async def SetRelationStatus(self, args): + ''' + args : typing.Sequence[~RelationStatusArg] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Uniter', + request='SetRelationStatus', + version=9, + params=_params) + _params['args'] = args + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResults) + async def SetStatus(self, entities): + ''' + entities : typing.Sequence[~EntityStatusArgs] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Uniter', + request='SetStatus', + version=9, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResults) + async def SetUnitStatus(self, entities): + ''' + entities : typing.Sequence[~EntityStatusArgs] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Uniter', + request='SetUnitStatus', + version=9, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResults) + async def SetUpgradeSeriesUnitStatus(self, params): + ''' + params : typing.Sequence[~UpgradeSeriesStatusParam] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Uniter', + request='SetUpgradeSeriesUnitStatus', + version=9, + params=_params) + _params['params'] = params + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResults) + async def SetWorkloadVersion(self, entities): + ''' + entities : typing.Sequence[~EntityWorkloadVersion] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Uniter', + request='SetWorkloadVersion', + version=9, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(LifeResults) + async def StorageAttachmentLife(self, ids): + ''' + ids : typing.Sequence[~StorageAttachmentId] + Returns -> typing.Sequence[~LifeResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Uniter', + request='StorageAttachmentLife', + version=9, + params=_params) + _params['ids'] = ids + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(StorageAttachmentResults) + async def StorageAttachments(self, ids): + ''' + ids : typing.Sequence[~StorageAttachmentId] + Returns -> typing.Sequence[~StorageAttachmentResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Uniter', + request='StorageAttachments', + version=9, + params=_params) + _params['ids'] = ids + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(StatusResults) + async def UnitStatus(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~StatusResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Uniter', + request='UnitStatus', + version=9, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(StorageAttachmentIdsResults) + async def UnitStorageAttachments(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~StorageAttachmentIdsResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Uniter', + request='UnitStorageAttachments', + version=9, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(ErrorResults) + async def UpdateSettings(self, relation_units): + ''' + relation_units : typing.Sequence[~RelationUnitSettings] + Returns -> typing.Sequence[~ErrorResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Uniter', + request='UpdateSettings', + version=9, + params=_params) + _params['relation-units'] = relation_units + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(UpgradeSeriesStatusResults) + async def UpgradeSeriesUnitStatus(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~UpgradeSeriesStatusResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Uniter', + request='UpgradeSeriesUnitStatus', + version=9, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(NotifyWatchResults) + async def Watch(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~NotifyWatchResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Uniter', + request='Watch', + version=9, + 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=9, + params=_params) + + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(StringsWatchResults) + async def WatchActionNotifications(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~StringsWatchResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Uniter', + request='WatchActionNotifications', + version=9, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(StringsWatchResults) + async def WatchConfigSettingsHash(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~StringsWatchResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Uniter', + request='WatchConfigSettingsHash', + version=9, + 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=9, + params=_params) + + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(NotifyWatchResults) + async def WatchLeadershipSettings(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~NotifyWatchResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Uniter', + request='WatchLeadershipSettings', + version=9, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(NotifyWatchResults) + async def WatchMeterStatus(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~NotifyWatchResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Uniter', + request='WatchMeterStatus', + version=9, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(RelationUnitsWatchResults) + async def WatchRelationUnits(self, relation_units): + ''' + relation_units : typing.Sequence[~RelationUnit] + Returns -> typing.Sequence[~RelationUnitsWatchResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Uniter', + request='WatchRelationUnits', + version=9, + params=_params) + _params['relation-units'] = relation_units + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(NotifyWatchResults) + async def WatchStorageAttachments(self, ids): + ''' + ids : typing.Sequence[~StorageAttachmentId] + Returns -> typing.Sequence[~NotifyWatchResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Uniter', + request='WatchStorageAttachments', + version=9, + params=_params) + _params['ids'] = ids + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(StringsWatchResults) + async def WatchTrustConfigSettingsHash(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~StringsWatchResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Uniter', + request='WatchTrustConfigSettingsHash', + version=9, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(StringsWatchResults) + async def WatchUnitAddressesHash(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~StringsWatchResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Uniter', + request='WatchUnitAddressesHash', + version=9, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(StringsWatchResults) + async def WatchUnitRelations(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~StringsWatchResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Uniter', + request='WatchUnitRelations', + version=9, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(StringsWatchResults) + async def WatchUnitStorageAttachments(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~StringsWatchResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Uniter', + request='WatchUnitStorageAttachments', + version=9, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(NotifyWatchResults) + async def WatchUpgradeSeriesNotifications(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~NotifyWatchResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Uniter', + request='WatchUpgradeSeriesNotifications', + version=9, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + + + @ReturnMapping(StringResults) + async def WorkloadVersion(self, entities): + ''' + entities : typing.Sequence[~Entity] + Returns -> typing.Sequence[~StringResult] + ''' + # map input types to rpc msg + _params = dict() + msg = dict(type='Uniter', + request='WorkloadVersion', + version=9, + params=_params) + _params['entities'] = entities + reply = await self.rpc(msg) + return reply + + diff --git a/juju/client/_definitions.py b/juju/client/_definitions.py index 198784d..7122308 100644 --- a/juju/client/_definitions.py +++ b/juju/client/_definitions.py @@ -9,7 +9,7 @@ class APIHostPortsResult(Type): _toPy = {'servers': 'servers'} def __init__(self, servers=None, **unknown_fields): ''' - servers : typing.Sequence<+T_co>[~HostPort]<~HostPort> + servers : typing.Sequence[~HostPort] ''' self.servers = [HostPort.from_json(o) for o in servers or []] @@ -21,7 +21,7 @@ class Action(Type): def __init__(self, name=None, parameters=None, receiver=None, tag=None, **unknown_fields): ''' name : str - parameters : typing.Mapping<~KT, +VT_co>[str, typing.Any] + parameters : typing.Mapping[str, typing.Any] receiver : str tag : str ''' @@ -39,7 +39,7 @@ class ActionExecutionResult(Type): ''' action_tag : str message : str - results : typing.Mapping<~KT, +VT_co>[str, typing.Any] + results : typing.Mapping[str, typing.Any] status : str ''' self.action_tag = action_tag @@ -54,12 +54,25 @@ class ActionExecutionResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~ActionExecutionResult]<~ActionExecutionResult> + results : typing.Sequence[~ActionExecutionResult] ''' self.results = [ActionExecutionResult.from_json(o) for o in results or []] +class ActionPruneArgs(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 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'} @@ -70,7 +83,7 @@ class ActionResult(Type): enqueued : str error : Error message : str - output : typing.Mapping<~KT, +VT_co>[str, typing.Any] + output : typing.Mapping[str, typing.Any] started : str status : str ''' @@ -90,7 +103,7 @@ class ActionResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~ActionResult]<~ActionResult> + results : typing.Sequence[~ActionResult] ''' self.results = [ActionResult.from_json(o) for o in results or []] @@ -102,7 +115,7 @@ class ActionSpec(Type): def __init__(self, description=None, params=None, **unknown_fields): ''' description : str - params : typing.Mapping<~KT, +VT_co>[str, typing.Any] + params : typing.Mapping[str, typing.Any] ''' self.description = description self.params = params @@ -114,7 +127,7 @@ class Actions(Type): _toPy = {'actions': 'actions'} def __init__(self, actions=None, **unknown_fields): ''' - actions : typing.Sequence<+T_co>[~Action]<~Action> + actions : typing.Sequence[~Action] ''' self.actions = [Action.from_json(o) for o in actions or []] @@ -125,7 +138,7 @@ class ActionsByName(Type): _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> + actions : typing.Sequence[~ActionResult] error : Error name : str ''' @@ -140,7 +153,7 @@ class ActionsByNames(Type): _toPy = {'actions': 'actions'} def __init__(self, actions=None, **unknown_fields): ''' - actions : typing.Sequence<+T_co>[~ActionsByName]<~ActionsByName> + actions : typing.Sequence[~ActionsByName] ''' self.actions = [ActionsByName.from_json(o) for o in actions or []] @@ -151,7 +164,7 @@ class ActionsByReceiver(Type): _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> + actions : typing.Sequence[~ActionResult] error : Error receiver : str ''' @@ -166,12 +179,42 @@ class ActionsByReceivers(Type): _toPy = {'actions': 'actions'} def __init__(self, actions=None, **unknown_fields): ''' - actions : typing.Sequence<+T_co>[~ActionsByReceiver]<~ActionsByReceiver> + actions : typing.Sequence[~ActionsByReceiver] ''' self.actions = [ActionsByReceiver.from_json(o) for o in actions or []] +class AddApplicationOffer(Type): + _toSchema = {'application_description': 'application-description', 'application_name': 'application-name', 'endpoints': 'endpoints', 'model_tag': 'model-tag', 'offer_name': 'offer-name'} + _toPy = {'application-description': 'application_description', 'application-name': 'application_name', 'endpoints': 'endpoints', 'model-tag': 'model_tag', 'offer-name': 'offer_name'} + def __init__(self, application_description=None, application_name=None, endpoints=None, model_tag=None, offer_name=None, **unknown_fields): + ''' + application_description : str + application_name : str + endpoints : typing.Mapping[str, str] + model_tag : str + offer_name : str + ''' + self.application_description = application_description + self.application_name = application_name + self.endpoints = endpoints + self.model_tag = model_tag + self.offer_name = offer_name + + + +class AddApplicationOffers(Type): + _toSchema = {'offers': 'Offers'} + _toPy = {'Offers': 'offers'} + def __init__(self, offers=None, **unknown_fields): + ''' + offers : typing.Sequence[~AddApplicationOffer] + ''' + self.offers = [AddApplicationOffer.from_json(o) for o in offers or []] + + + class AddApplicationUnits(Type): _toSchema = {'application': 'application', 'num_units': 'num-units', 'placement': 'placement'} _toPy = {'application': 'application', 'num-units': 'num_units', 'placement': 'placement'} @@ -179,7 +222,7 @@ class AddApplicationUnits(Type): ''' application : str num_units : int - placement : typing.Sequence<+T_co>[~Placement]<~Placement> + placement : typing.Sequence[~Placement] ''' self.application = application self.num_units = num_units @@ -192,7 +235,7 @@ class AddApplicationUnitsResults(Type): _toPy = {'units': 'units'} def __init__(self, units=None, **unknown_fields): ''' - units : typing.Sequence<+T_co>[str] + units : typing.Sequence[str] ''' self.units = units @@ -226,18 +269,31 @@ class AddCharmWithAuthorization(Type): +class AddCloudArgs(Type): + _toSchema = {'cloud': 'cloud', 'name': 'name'} + _toPy = {'cloud': 'cloud', 'name': 'name'} + def __init__(self, cloud=None, name=None, **unknown_fields): + ''' + cloud : Cloud + name : str + ''' + self.cloud = Cloud.from_json(cloud) if cloud else None + self.name = name + + + 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> + addresses : typing.Sequence[~Address] constraints : Value container_type : str - disks : typing.Sequence<+T_co>[~Constraints]<~Constraints> + disks : typing.Sequence[~Constraints] hardware_characteristics : HardwareCharacteristics instance_id : str - jobs : typing.Sequence<+T_co>[str] + jobs : typing.Sequence[str] nonce : str parent_id : str placement : Placement @@ -262,7 +318,7 @@ class AddMachines(Type): _toPy = {'params': 'params'} def __init__(self, params=None, **unknown_fields): ''' - params : typing.Sequence<+T_co>[~AddMachineParams]<~AddMachineParams> + params : typing.Sequence[~AddMachineParams] ''' self.params = [AddMachineParams.from_json(o) for o in params or []] @@ -286,7 +342,7 @@ class AddMachinesResults(Type): _toPy = {'machines': 'machines'} def __init__(self, machines=None, **unknown_fields): ''' - machines : typing.Sequence<+T_co>[~AddMachinesResult]<~AddMachinesResult> + machines : typing.Sequence[~AddMachinesResult] ''' self.machines = [AddMachinesResult.from_json(o) for o in machines or []] @@ -299,7 +355,7 @@ class AddPendingResourcesArgs(Type): ''' addcharmwithauthorization : AddCharmWithAuthorization entity : Entity - resources : typing.Sequence<+T_co>[~CharmResource]<~CharmResource> + resources : typing.Sequence[~CharmResource] ''' self.addcharmwithauthorization = AddCharmWithAuthorization.from_json(addcharmwithauthorization) if addcharmwithauthorization else None self.entity = Entity.from_json(entity) if entity else None @@ -313,7 +369,7 @@ class AddPendingResourcesResult(Type): def __init__(self, errorresult=None, pending_ids=None, **unknown_fields): ''' errorresult : ErrorResult - pending_ids : typing.Sequence<+T_co>[str] + pending_ids : typing.Sequence[str] ''' self.errorresult = ErrorResult.from_json(errorresult) if errorresult else None self.pending_ids = pending_ids @@ -325,7 +381,7 @@ class AddRelation(Type): _toPy = {'endpoints': 'endpoints'} def __init__(self, endpoints=None, **unknown_fields): ''' - endpoints : typing.Sequence<+T_co>[str] + endpoints : typing.Sequence[str] ''' self.endpoints = endpoints @@ -336,12 +392,47 @@ class AddRelationResults(Type): _toPy = {'endpoints': 'endpoints'} def __init__(self, endpoints=None, **unknown_fields): ''' - endpoints : typing.Mapping<~KT, +VT_co>[str, ~CharmRelation]<~CharmRelation> + endpoints : typing.Mapping[str, ~CharmRelation] ''' self.endpoints = endpoints +class AddStorageDetails(Type): + _toSchema = {'storage_tags': 'storage-tags'} + _toPy = {'storage-tags': 'storage_tags'} + def __init__(self, storage_tags=None, **unknown_fields): + ''' + storage_tags : typing.Sequence[str] + ''' + self.storage_tags = storage_tags + + + +class AddStorageResult(Type): + _toSchema = {'error': 'error', 'result': 'result'} + _toPy = {'error': 'error', 'result': 'result'} + def __init__(self, error=None, result=None, **unknown_fields): + ''' + error : Error + result : AddStorageDetails + ''' + self.error = Error.from_json(error) if error else None + self.result = AddStorageDetails.from_json(result) if result else None + + + +class AddStorageResults(Type): + _toSchema = {'results': 'results'} + _toPy = {'results': 'results'} + def __init__(self, results=None, **unknown_fields): + ''' + results : typing.Sequence[~AddStorageResult] + ''' + self.results = [AddStorageResult.from_json(o) for o in results or []] + + + 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'} @@ -350,7 +441,7 @@ class AddSubnetParams(Type): space_tag : str subnet_provider_id : str subnet_tag : str - zones : typing.Sequence<+T_co>[str] + zones : typing.Sequence[str] ''' self.space_tag = space_tag self.subnet_provider_id = subnet_provider_id @@ -364,7 +455,7 @@ class AddSubnetsParams(Type): _toPy = {'subnets': 'subnets'} def __init__(self, subnets=None, **unknown_fields): ''' - subnets : typing.Sequence<+T_co>[~AddSubnetParams]<~AddSubnetParams> + subnets : typing.Sequence[~AddSubnetParams] ''' self.subnets = [AddSubnetParams.from_json(o) for o in subnets or []] @@ -391,7 +482,7 @@ class AddUserResult(Type): def __init__(self, error=None, secret_key=None, tag=None, **unknown_fields): ''' error : Error - secret_key : typing.Sequence<+T_co>[int] + secret_key : typing.Sequence[int] tag : str ''' self.error = Error.from_json(error) if error else None @@ -405,7 +496,7 @@ class AddUserResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~AddUserResult]<~AddUserResult> + results : typing.Sequence[~AddUserResult] ''' self.results = [AddUserResult.from_json(o) for o in results or []] @@ -416,7 +507,7 @@ class AddUsers(Type): _toPy = {'users': 'users'} def __init__(self, users=None, **unknown_fields): ''' - users : typing.Sequence<+T_co>[~AddUser]<~AddUser> + users : typing.Sequence[~AddUser] ''' self.users = [AddUser.from_json(o) for o in users or []] @@ -459,7 +550,7 @@ class AgentGetEntitiesResult(Type): ''' container_type : str error : Error - jobs : typing.Sequence<+T_co>[str] + jobs : typing.Sequence[str] life : str ''' self.container_type = container_type @@ -474,7 +565,7 @@ class AgentGetEntitiesResults(Type): _toPy = {'entities': 'entities'} def __init__(self, entities=None, **unknown_fields): ''' - entities : typing.Sequence<+T_co>[~AgentGetEntitiesResult]<~AgentGetEntitiesResult> + entities : typing.Sequence[~AgentGetEntitiesResult] ''' self.entities = [AgentGetEntitiesResult.from_json(o) for o in entities or []] @@ -507,7 +598,7 @@ class AllWatcherNextResults(Type): _toPy = {'deltas': 'deltas'} def __init__(self, deltas=None, **unknown_fields): ''' - deltas : typing.Sequence<+T_co>[~Delta]<~Delta> + deltas : typing.Sequence[~Delta] ''' self.deltas = [Delta.from_json(o) for o in deltas or []] @@ -518,7 +609,7 @@ class AnnotationsGetResult(Type): _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] + annotations : typing.Mapping[str, str] entity : str error : ErrorResult ''' @@ -533,7 +624,7 @@ class AnnotationsGetResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~AnnotationsGetResult]<~AnnotationsGetResult> + results : typing.Sequence[~AnnotationsGetResult] ''' self.results = [AnnotationsGetResult.from_json(o) for o in results or []] @@ -544,18 +635,35 @@ class AnnotationsSet(Type): _toPy = {'annotations': 'annotations'} def __init__(self, annotations=None, **unknown_fields): ''' - annotations : typing.Sequence<+T_co>[~EntityAnnotations]<~EntityAnnotations> + annotations : typing.Sequence[~EntityAnnotations] ''' self.annotations = [EntityAnnotations.from_json(o) for o in annotations or []] +class ApplicationCharm(Type): + _toSchema = {'charm_modified_version': 'charm-modified-version', 'force_upgrade': 'force-upgrade', 'sha256': 'sha256', 'url': 'url'} + _toPy = {'charm-modified-version': 'charm_modified_version', 'force-upgrade': 'force_upgrade', 'sha256': 'sha256', 'url': 'url'} + def __init__(self, charm_modified_version=None, force_upgrade=None, sha256=None, url=None, **unknown_fields): + ''' + charm_modified_version : int + force_upgrade : bool + sha256 : str + url : str + ''' + self.charm_modified_version = charm_modified_version + self.force_upgrade = force_upgrade + self.sha256 = sha256 + self.url = url + + + 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> + actions : typing.Mapping[str, ~ActionSpec] application_tag : str error : Error ''' @@ -581,39 +689,117 @@ class ApplicationCharmRelationsResults(Type): _toPy = {'charm-relations': 'charm_relations'} def __init__(self, charm_relations=None, **unknown_fields): ''' - charm_relations : typing.Sequence<+T_co>[str] + charm_relations : typing.Sequence[str] ''' self.charm_relations = charm_relations +class ApplicationCharmResult(Type): + _toSchema = {'error': 'error', 'result': 'result'} + _toPy = {'error': 'error', 'result': 'result'} + def __init__(self, error=None, result=None, **unknown_fields): + ''' + error : Error + result : ApplicationCharm + ''' + self.error = Error.from_json(error) if error else None + self.result = ApplicationCharm.from_json(result) if result else None + + + +class ApplicationCharmResults(Type): + _toSchema = {'results': 'results'} + _toPy = {'results': 'results'} + def __init__(self, results=None, **unknown_fields): + ''' + results : typing.Sequence[~ApplicationCharmResult] + ''' + self.results = [ApplicationCharmResult.from_json(o) for o in results or []] + + + +class ApplicationConfigSet(Type): + _toSchema = {'application': 'application', 'config': 'config'} + _toPy = {'application': 'application', 'config': 'config'} + def __init__(self, application=None, config=None, **unknown_fields): + ''' + application : str + config : typing.Mapping[str, str] + ''' + self.application = application + self.config = config + + + +class ApplicationConfigSetArgs(Type): + _toSchema = {'args': 'Args'} + _toPy = {'Args': 'args'} + def __init__(self, args=None, **unknown_fields): + ''' + args : typing.Sequence[~ApplicationConfigSet] + ''' + self.args = [ApplicationConfigSet.from_json(o) for o in args or []] + + + +class ApplicationConfigUnsetArgs(Type): + _toSchema = {'args': 'Args'} + _toPy = {'Args': 'args'} + def __init__(self, args=None, **unknown_fields): + ''' + args : typing.Sequence[~ApplicationUnset] + ''' + self.args = [ApplicationUnset.from_json(o) for o in args or []] + + + +class ApplicationConstraint(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 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): + _toSchema = {'application': 'application', 'attach_storage': 'attach-storage', 'channel': 'channel', 'charm_url': 'charm-url', 'config': 'config', 'config_yaml': 'config-yaml', 'constraints': 'constraints', 'devices': 'devices', 'endpoint_bindings': 'endpoint-bindings', 'num_units': 'num-units', 'placement': 'placement', 'policy': 'policy', 'resources': 'resources', 'series': 'series', 'storage': 'storage'} + _toPy = {'application': 'application', 'attach-storage': 'attach_storage', 'channel': 'channel', 'charm-url': 'charm_url', 'config': 'config', 'config-yaml': 'config_yaml', 'constraints': 'constraints', 'devices': 'devices', 'endpoint-bindings': 'endpoint_bindings', 'num-units': 'num_units', 'placement': 'placement', 'policy': 'policy', 'resources': 'resources', 'series': 'series', 'storage': 'storage'} + def __init__(self, application=None, attach_storage=None, channel=None, charm_url=None, config=None, config_yaml=None, constraints=None, devices=None, endpoint_bindings=None, num_units=None, placement=None, policy=None, resources=None, series=None, storage=None, **unknown_fields): ''' application : str + attach_storage : typing.Sequence[str] channel : str charm_url : str - config : typing.Mapping<~KT, +VT_co>[str, str] + config : typing.Mapping[str, str] config_yaml : str constraints : Value - endpoint_bindings : typing.Mapping<~KT, +VT_co>[str, str] + devices : typing.Mapping[str, ~Constraints] + endpoint_bindings : typing.Mapping[str, str] num_units : int - placement : typing.Sequence<+T_co>[~Placement]<~Placement> - resources : typing.Mapping<~KT, +VT_co>[str, str] + placement : typing.Sequence[~Placement] + policy : str + resources : typing.Mapping[str, str] series : str - storage : typing.Mapping<~KT, +VT_co>[str, ~Constraints]<~Constraints> + storage : typing.Mapping[str, ~Constraints] ''' self.application = application + self.attach_storage = attach_storage 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.devices = devices self.endpoint_bindings = endpoint_bindings self.num_units = num_units self.placement = [Placement.from_json(o) for o in placement or []] + self.policy = policy self.resources = resources self.series = series self.storage = storage @@ -653,6 +839,28 @@ class ApplicationGet(Type): +class ApplicationGetConfigResults(Type): + _toSchema = {'results': 'Results'} + _toPy = {'Results': 'results'} + def __init__(self, results=None, **unknown_fields): + ''' + results : typing.Sequence[~ConfigResult] + ''' + self.results = [ConfigResult.from_json(o) for o in results or []] + + + +class ApplicationGetConstraintsResults(Type): + _toSchema = {'results': 'results'} + _toPy = {'results': 'results'} + def __init__(self, results=None, **unknown_fields): + ''' + results : typing.Sequence[~ApplicationConstraint] + ''' + self.results = [ApplicationConstraint.from_json(o) for o in results or []] + + + 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'} @@ -660,7 +868,7 @@ class ApplicationGetResults(Type): ''' application : str charm : str - config : typing.Mapping<~KT, +VT_co>[str, typing.Any] + config : typing.Mapping[str, typing.Any] constraints : Value series : str ''' @@ -678,7 +886,7 @@ class ApplicationMetricCredential(Type): def __init__(self, application=None, metrics_credentials=None, **unknown_fields): ''' application : str - metrics_credentials : typing.Sequence<+T_co>[int] + metrics_credentials : typing.Sequence[int] ''' self.application = application self.metrics_credentials = metrics_credentials @@ -690,7 +898,7 @@ class ApplicationMetricCredentials(Type): _toPy = {'creds': 'creds'} def __init__(self, creds=None, **unknown_fields): ''' - creds : typing.Sequence<+T_co>[~ApplicationMetricCredential]<~ApplicationMetricCredential> + creds : typing.Sequence[~ApplicationMetricCredential] ''' self.creds = [ApplicationMetricCredential.from_json(o) for o in creds or []] @@ -703,12 +911,12 @@ class ApplicationOffer(Type): ''' access : str application_description : str - bindings : typing.Mapping<~KT, +VT_co>[str, str] - endpoints : typing.Sequence<+T_co>[~RemoteEndpoint]<~RemoteEndpoint> + bindings : typing.Mapping[str, str] + endpoints : typing.Sequence[~RemoteEndpoint] offer_name : str offer_url : str source_model_tag : str - spaces : typing.Sequence<+T_co>[~RemoteSpace]<~RemoteSpace> + spaces : typing.Sequence[~RemoteSpace] ''' self.access = access self.application_description = application_description @@ -721,13 +929,104 @@ class ApplicationOffer(Type): +class ApplicationOfferAdminDetails(Type): + _toSchema = {'application_name': 'application-name', 'applicationofferdetails': 'ApplicationOfferDetails', 'charm_url': 'charm-url', 'connections': 'connections'} + _toPy = {'ApplicationOfferDetails': 'applicationofferdetails', 'application-name': 'application_name', 'charm-url': 'charm_url', 'connections': 'connections'} + def __init__(self, applicationofferdetails=None, application_name=None, charm_url=None, connections=None, **unknown_fields): + ''' + applicationofferdetails : ApplicationOfferDetails + application_name : str + charm_url : str + connections : typing.Sequence[~OfferConnection] + ''' + self.applicationofferdetails = ApplicationOfferDetails.from_json(applicationofferdetails) if applicationofferdetails else None + self.application_name = application_name + self.charm_url = charm_url + self.connections = [OfferConnection.from_json(o) for o in connections or []] + + + +class ApplicationOfferDetails(Type): + _toSchema = {'application_description': 'application-description', 'bindings': 'bindings', 'endpoints': 'endpoints', 'offer_name': 'offer-name', 'offer_url': 'offer-url', 'offer_uuid': 'offer-uuid', 'source_model_tag': 'source-model-tag', 'spaces': 'spaces', 'users': 'users'} + _toPy = {'application-description': 'application_description', 'bindings': 'bindings', 'endpoints': 'endpoints', 'offer-name': 'offer_name', 'offer-url': 'offer_url', 'offer-uuid': 'offer_uuid', 'source-model-tag': 'source_model_tag', 'spaces': 'spaces', 'users': 'users'} + def __init__(self, application_description=None, bindings=None, endpoints=None, offer_name=None, offer_url=None, offer_uuid=None, source_model_tag=None, spaces=None, users=None, **unknown_fields): + ''' + application_description : str + bindings : typing.Mapping[str, str] + endpoints : typing.Sequence[~RemoteEndpoint] + offer_name : str + offer_url : str + offer_uuid : str + source_model_tag : str + spaces : typing.Sequence[~RemoteSpace] + users : typing.Sequence[~OfferUserDetails] + ''' + 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.offer_uuid = offer_uuid + self.source_model_tag = source_model_tag + self.spaces = [RemoteSpace.from_json(o) for o in spaces or []] + self.users = [OfferUserDetails.from_json(o) for o in users or []] + + + +class ApplicationOfferResult(Type): + _toSchema = {'error': 'error', 'result': 'result'} + _toPy = {'error': 'error', 'result': 'result'} + def __init__(self, error=None, result=None, **unknown_fields): + ''' + error : Error + result : ApplicationOfferAdminDetails + ''' + self.error = Error.from_json(error) if error else None + self.result = ApplicationOfferAdminDetails.from_json(result) if result else None + + + +class ApplicationOfferStatus(Type): + _toSchema = {'active_connected_count': 'active-connected-count', 'application_name': 'application-name', 'charm': 'charm', 'endpoints': 'endpoints', 'err': 'err', 'offer_name': 'offer-name', 'total_connected_count': 'total-connected-count'} + _toPy = {'active-connected-count': 'active_connected_count', 'application-name': 'application_name', 'charm': 'charm', 'endpoints': 'endpoints', 'err': 'err', 'offer-name': 'offer_name', 'total-connected-count': 'total_connected_count'} + def __init__(self, active_connected_count=None, application_name=None, charm=None, endpoints=None, err=None, offer_name=None, total_connected_count=None, **unknown_fields): + ''' + active_connected_count : int + application_name : str + charm : str + endpoints : typing.Mapping[str, ~RemoteEndpoint] + err : typing.Mapping[str, typing.Any] + offer_name : str + total_connected_count : int + ''' + self.active_connected_count = active_connected_count + self.application_name = application_name + self.charm = charm + self.endpoints = endpoints + self.err = err + self.offer_name = offer_name + self.total_connected_count = total_connected_count + + + +class ApplicationOffersResults(Type): + _toSchema = {'results': 'results'} + _toPy = {'results': 'results'} + def __init__(self, results=None, **unknown_fields): + ''' + results : typing.Sequence[~ApplicationOfferResult] + ''' + self.results = [ApplicationOfferResult.from_json(o) for o in results 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] + changed : typing.Sequence[~RelationChange] + removed : typing.Sequence[int] ''' self.changed = [RelationChange.from_json(o) for o in changed or []] self.removed = removed @@ -755,7 +1054,7 @@ class ApplicationSet(Type): def __init__(self, application=None, options=None, **unknown_fields): ''' application : str - options : typing.Mapping<~KT, +VT_co>[str, str] + options : typing.Mapping[str, str] ''' self.application = application self.options = options @@ -770,12 +1069,12 @@ class ApplicationSetCharm(Type): application : str channel : str charm_url : str - config_settings : typing.Mapping<~KT, +VT_co>[str, str] + config_settings : typing.Mapping[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> + resource_ids : typing.Mapping[str, str] + storage_constraints : typing.Mapping[str, ~StorageConstraints] ''' self.application = application self.channel = channel @@ -789,6 +1088,19 @@ class ApplicationSetCharm(Type): +class ApplicationSetCharmProfile(Type): + _toSchema = {'application': 'application', 'charm_url': 'charm-url'} + _toPy = {'application': 'application', 'charm-url': 'charm_url'} + def __init__(self, application=None, charm_url=None, **unknown_fields): + ''' + application : str + charm_url : str + ''' + self.application = application + self.charm_url = charm_url + + + 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'} @@ -796,15 +1108,15 @@ class ApplicationStatus(Type): ''' can_upgrade_to : str charm : str - err : typing.Mapping<~KT, +VT_co>[str, typing.Any] + err : typing.Mapping[str, typing.Any] exposed : bool life : str - meter_statuses : typing.Mapping<~KT, +VT_co>[str, ~MeterStatus]<~MeterStatus> - relations : typing.Sequence<+T_co>[str] + meter_statuses : typing.Mapping[str, ~MeterStatus] + relations : typing.Sequence[str] series : str status : DetailedStatus - subordinate_to : typing.Sequence<+T_co>[str] - units : typing.Mapping<~KT, +VT_co>[str, ~UnitStatus]<~UnitStatus> + subordinate_to : typing.Sequence[str] + units : typing.Mapping[str, ~UnitStatus] workload_version : str ''' self.can_upgrade_to = can_upgrade_to @@ -829,7 +1141,7 @@ class ApplicationStatusResult(Type): ''' application : StatusResult error : Error - units : typing.Mapping<~KT, +VT_co>[str, ~StatusResult]<~StatusResult> + units : typing.Mapping[str, ~StatusResult] ''' self.application = StatusResult.from_json(application) if application else None self.error = Error.from_json(error) if error else None @@ -842,7 +1154,7 @@ class ApplicationStatusResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~ApplicationStatusResult]<~ApplicationStatusResult> + results : typing.Sequence[~ApplicationStatusResult] ''' self.results = [ApplicationStatusResult.from_json(o) for o in results or []] @@ -864,7 +1176,7 @@ class ApplicationURLs(Type): _toPy = {'application-urls': 'application_urls'} def __init__(self, application_urls=None, **unknown_fields): ''' - application_urls : typing.Sequence<+T_co>[str] + application_urls : typing.Sequence[str] ''' self.application_urls = application_urls @@ -881,13 +1193,38 @@ class ApplicationUnexpose(Type): +class ApplicationUnitParams(Type): + _toSchema = {'address': 'address', 'data': 'data', 'filesystem_info': 'filesystem-info', 'info': 'info', 'ports': 'ports', 'provider_id': 'provider-id', 'status': 'status', 'unit_tag': 'unit-tag'} + _toPy = {'address': 'address', 'data': 'data', 'filesystem-info': 'filesystem_info', 'info': 'info', 'ports': 'ports', 'provider-id': 'provider_id', 'status': 'status', 'unit-tag': 'unit_tag'} + def __init__(self, address=None, data=None, filesystem_info=None, info=None, ports=None, provider_id=None, status=None, unit_tag=None, **unknown_fields): + ''' + address : str + data : typing.Mapping[str, typing.Any] + filesystem_info : typing.Sequence[~KubernetesFilesystemInfo] + info : str + ports : typing.Sequence[str] + provider_id : str + status : str + unit_tag : str + ''' + self.address = address + self.data = data + self.filesystem_info = [KubernetesFilesystemInfo.from_json(o) for o in filesystem_info or []] + self.info = info + self.ports = ports + self.provider_id = provider_id + self.status = status + self.unit_tag = unit_tag + + + 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] + options : typing.Sequence[str] ''' self.application = application self.options = options @@ -905,7 +1242,7 @@ class ApplicationUpdate(Type): force_charm_url : bool force_series : bool min_units : int - settings : typing.Mapping<~KT, +VT_co>[str, str] + settings : typing.Mapping[str, str] settings_yaml : str ''' self.application = application @@ -924,7 +1261,7 @@ class ApplicationsCharmActionsResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~ApplicationCharmActionsResult]<~ApplicationCharmActionsResult> + results : typing.Sequence[~ApplicationCharmActionsResult] ''' self.results = [ApplicationCharmActionsResult.from_json(o) for o in results or []] @@ -935,7 +1272,7 @@ class ApplicationsDeploy(Type): _toPy = {'applications': 'applications'} def __init__(self, applications=None, **unknown_fields): ''' - applications : typing.Sequence<+T_co>[~ApplicationDeploy]<~ApplicationDeploy> + applications : typing.Sequence[~ApplicationDeploy] ''' self.applications = [ApplicationDeploy.from_json(o) for o in applications or []] @@ -979,7 +1316,7 @@ class BackupsListResult(Type): _toPy = {'list': 'list_'} def __init__(self, list_=None, **unknown_fields): ''' - list_ : typing.Sequence<+T_co>[~BackupsMetadataResult]<~BackupsMetadataResult> + list_ : typing.Sequence[~BackupsMetadataResult] ''' self.list_ = [BackupsMetadataResult.from_json(o) for o in list_ or []] @@ -1073,7 +1410,7 @@ class BlockDevice(Type): 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] + devicelinks : typing.Sequence[str] devicename : str filesystemtype : str hardwareid : str @@ -1114,7 +1451,7 @@ class BlockDeviceResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~BlockDeviceResult]<~BlockDeviceResult> + results : typing.Sequence[~BlockDeviceResult] ''' self.results = [BlockDeviceResult.from_json(o) for o in results or []] @@ -1138,7 +1475,7 @@ class BlockResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~BlockResult]<~BlockResult> + results : typing.Sequence[~BlockResult] ''' self.results = [BlockResult.from_json(o) for o in results or []] @@ -1175,21 +1512,32 @@ class BoolResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~BoolResult]<~BoolResult> + results : typing.Sequence[~BoolResult] ''' self.results = [BoolResult.from_json(o) for o in results or []] +class BulkImportStorageParams(Type): + _toSchema = {'storage': 'storage'} + _toPy = {'storage': 'storage'} + def __init__(self, storage=None, **unknown_fields): + ''' + storage : typing.Sequence[~ImportStorageParams] + ''' + self.storage = [ImportStorageParams.from_json(o) for o in storage 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] + args : typing.Sequence[typing.Any] id_ : str method : str - requires : typing.Sequence<+T_co>[str] + requires : typing.Sequence[str] ''' self.args = args self.id_ = id_ @@ -1214,8 +1562,8 @@ class BundleChangesResults(Type): _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] + changes : typing.Sequence[~BundleChange] + errors : typing.Sequence[str] ''' self.changes = [BundleChange.from_json(o) for o in changes or []] self.errors = errors @@ -1227,19 +1575,43 @@ class BytesResult(Type): _toPy = {'result': 'result'} def __init__(self, result=None, **unknown_fields): ''' - result : typing.Sequence<+T_co>[int] + result : typing.Sequence[int] ''' self.result = result +class ChangeModelCredentialParams(Type): + _toSchema = {'credential_tag': 'credential-tag', 'model_tag': 'model-tag'} + _toPy = {'credential-tag': 'credential_tag', 'model-tag': 'model_tag'} + def __init__(self, credential_tag=None, model_tag=None, **unknown_fields): + ''' + credential_tag : str + model_tag : str + ''' + self.credential_tag = credential_tag + self.model_tag = model_tag + + + +class ChangeModelCredentialsParams(Type): + _toSchema = {'model_credentials': 'model-credentials'} + _toPy = {'model-credentials': 'model_credentials'} + def __init__(self, model_credentials=None, **unknown_fields): + ''' + model_credentials : typing.Sequence[~ChangeModelCredentialParams] + ''' + self.model_credentials = [ChangeModelCredentialParams.from_json(o) for o in model_credentials or []] + + + 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] + params : typing.Mapping[str, typing.Any] ''' self.description = description self.params = params @@ -1251,19 +1623,38 @@ class CharmActions(Type): _toPy = {'specs': 'specs'} def __init__(self, specs=None, **unknown_fields): ''' - specs : typing.Mapping<~KT, +VT_co>[str, ~CharmActionSpec]<~CharmActionSpec> + specs : typing.Mapping[str, ~CharmActionSpec] ''' self.specs = specs +class CharmDevice(Type): + _toSchema = {'countmax': 'CountMax', 'countmin': 'CountMin', 'description': 'Description', 'name': 'Name', 'type_': 'Type'} + _toPy = {'CountMax': 'countmax', 'CountMin': 'countmin', 'Description': 'description', 'Name': 'name', 'Type': 'type_'} + def __init__(self, countmax=None, countmin=None, description=None, name=None, type_=None, **unknown_fields): + ''' + countmax : int + countmin : int + description : str + name : str + type_ : str + ''' + self.countmax = countmax + self.countmin = countmin + self.description = description + self.name = name + self.type_ = type_ + + + 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> + config : typing.Mapping[str, ~CharmOption] meta : CharmMeta metrics : CharmMetrics revision : int @@ -1278,27 +1669,42 @@ class CharmInfo(Type): +class CharmLXDProfile(Type): + _toSchema = {'config': 'config', 'description': 'description', 'devices': 'devices'} + _toPy = {'config': 'config', 'description': 'description', 'devices': 'devices'} + def __init__(self, config=None, description=None, devices=None, **unknown_fields): + ''' + config : typing.Mapping[str, str] + description : str + devices : typing.Mapping[str, typing.Any] + ''' + self.config = config + self.description = description + self.devices = devices + + + 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] + categories : typing.Sequence[str] description : str - extra_bindings : typing.Mapping<~KT, +VT_co>[str, str] + extra_bindings : typing.Mapping[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> + payload_classes : typing.Mapping[str, ~CharmPayloadClass] + peers : typing.Mapping[str, ~CharmRelation] + provides : typing.Mapping[str, ~CharmRelation] + requires : typing.Mapping[str, ~CharmRelation] + resources : typing.Mapping[str, ~CharmResourceMeta] + series : typing.Sequence[str] + storage : typing.Mapping[str, ~CharmStorage] subordinate : bool summary : str - tags : typing.Sequence<+T_co>[str] - terms : typing.Sequence<+T_co>[str] + tags : typing.Sequence[str] + terms : typing.Sequence[str] ''' self.categories = categories self.description = description @@ -1337,7 +1743,7 @@ class CharmMetrics(Type): _toPy = {'metrics': 'metrics', 'plan': 'plan'} def __init__(self, metrics=None, plan=None, **unknown_fields): ''' - metrics : typing.Mapping<~KT, +VT_co>[str, ~CharmMetric]<~CharmMetric> + metrics : typing.Mapping[str, ~CharmMetric] plan : CharmPlan ''' self.metrics = metrics @@ -1350,7 +1756,7 @@ class CharmOption(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] + default : typing.Mapping[str, typing.Any] description : str type_ : str ''' @@ -1411,7 +1817,7 @@ class CharmResource(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] + fingerprint : typing.Sequence[int] name : str origin : str path : str @@ -1458,7 +1864,7 @@ class CharmStorage(Type): location : str minimum_size : int name : str - properties : typing.Sequence<+T_co>[str] + properties : typing.Sequence[str] read_only : bool shared : bool type_ : str @@ -1492,7 +1898,7 @@ class CharmURLs(Type): _toPy = {'urls': 'urls'} def __init__(self, urls=None, **unknown_fields): ''' - urls : typing.Sequence<+T_co>[~CharmURL]<~CharmURL> + urls : typing.Sequence[~CharmURL] ''' self.urls = [CharmURL.from_json(o) for o in urls or []] @@ -1503,7 +1909,7 @@ class CharmsList(Type): _toPy = {'names': 'names'} def __init__(self, names=None, **unknown_fields): ''' - names : typing.Sequence<+T_co>[str] + names : typing.Sequence[str] ''' self.names = names @@ -1514,7 +1920,7 @@ class CharmsListResult(Type): _toPy = {'charm-urls': 'charm_urls'} def __init__(self, charm_urls=None, **unknown_fields): ''' - charm_urls : typing.Sequence<+T_co>[str] + charm_urls : typing.Sequence[str] ''' self.charm_urls = charm_urls @@ -1525,7 +1931,7 @@ class ClaimLeadershipBulkParams(Type): _toPy = {'params': 'params'} def __init__(self, params=None, **unknown_fields): ''' - params : typing.Sequence<+T_co>[~ClaimLeadershipParams]<~ClaimLeadershipParams> + params : typing.Sequence[~ClaimLeadershipParams] ''' self.params = [ClaimLeadershipParams.from_json(o) for o in params or []] @@ -1536,7 +1942,7 @@ class ClaimLeadershipBulkResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + results : typing.Sequence[~ErrorResult] ''' self.results = [ErrorResult.from_json(o) for o in results or []] @@ -1562,10 +1968,10 @@ class Cloud(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] + auth_types : typing.Sequence[str] endpoint : str identity_endpoint : str - regions : typing.Sequence<+T_co>[~CloudRegion]<~CloudRegion> + regions : typing.Sequence[~CloudRegion] storage_endpoint : str type_ : str ''' @@ -1583,9 +1989,9 @@ class CloudCredential(Type): _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] + attrs : typing.Mapping[str, str] auth_type : str - redacted : typing.Sequence<+T_co>[str] + redacted : typing.Sequence[str] ''' self.attrs = attrs self.auth_type = auth_type @@ -1593,9 +1999,35 @@ class CloudCredential(Type): -class CloudCredentialResult(Type): - _toSchema = {'error': 'error', 'result': 'result'} - _toPy = {'error': 'error', 'result': 'result'} +class CloudCredentialArg(Type): + _toSchema = {'cloud_name': 'cloud-name', 'credential_name': 'credential-name'} + _toPy = {'cloud-name': 'cloud_name', 'credential-name': 'credential_name'} + def __init__(self, cloud_name=None, credential_name=None, **unknown_fields): + ''' + cloud_name : str + credential_name : str + ''' + self.cloud_name = cloud_name + self.credential_name = credential_name + + + +class CloudCredentialArgs(Type): + _toSchema = {'credentials': 'credentials', 'include_secrets': 'include-secrets'} + _toPy = {'credentials': 'credentials', 'include-secrets': 'include_secrets'} + def __init__(self, credentials=None, include_secrets=None, **unknown_fields): + ''' + credentials : typing.Sequence[~CloudCredentialArg] + include_secrets : bool + ''' + self.credentials = [CloudCredentialArg.from_json(o) for o in credentials or []] + self.include_secrets = include_secrets + + + +class CloudCredentialResult(Type): + _toSchema = {'error': 'error', 'result': 'result'} + _toPy = {'error': 'error', 'result': 'result'} def __init__(self, error=None, result=None, **unknown_fields): ''' error : Error @@ -1611,12 +2043,33 @@ class CloudCredentialResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~CloudCredentialResult]<~CloudCredentialResult> + results : typing.Sequence[~CloudCredentialResult] ''' self.results = [CloudCredentialResult.from_json(o) for o in results or []] +class CloudDetails(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[str] + endpoint : str + identity_endpoint : str + regions : typing.Sequence[~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 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'} @@ -1653,12 +2106,49 @@ class CloudImageMetadataList(Type): _toPy = {'metadata': 'metadata'} def __init__(self, metadata=None, **unknown_fields): ''' - metadata : typing.Sequence<+T_co>[~CloudImageMetadata]<~CloudImageMetadata> + metadata : typing.Sequence[~CloudImageMetadata] ''' self.metadata = [CloudImageMetadata.from_json(o) for o in metadata or []] +class CloudInfo(Type): + _toSchema = {'clouddetails': 'CloudDetails', 'users': 'users'} + _toPy = {'CloudDetails': 'clouddetails', 'users': 'users'} + def __init__(self, clouddetails=None, users=None, **unknown_fields): + ''' + clouddetails : CloudDetails + users : typing.Sequence[~CloudUserInfo] + ''' + self.clouddetails = CloudDetails.from_json(clouddetails) if clouddetails else None + self.users = [CloudUserInfo.from_json(o) for o in users or []] + + + +class CloudInfoResult(Type): + _toSchema = {'error': 'error', 'result': 'result'} + _toPy = {'error': 'error', 'result': 'result'} + def __init__(self, error=None, result=None, **unknown_fields): + ''' + error : Error + result : CloudInfo + ''' + self.error = Error.from_json(error) if error else None + self.result = CloudInfo.from_json(result) if result else None + + + +class CloudInfoResults(Type): + _toSchema = {'results': 'results'} + _toPy = {'results': 'results'} + def __init__(self, results=None, **unknown_fields): + ''' + results : typing.Sequence[~CloudInfoResult] + ''' + self.results = [CloudInfoResult.from_json(o) for o in results or []] + + + class CloudInstanceTypesConstraint(Type): _toSchema = {'cloud_tag': 'cloud-tag', 'constraints': 'constraints', 'region': 'region'} _toPy = {'cloud-tag': 'cloud_tag', 'constraints': 'constraints', 'region': 'region'} @@ -1679,7 +2169,7 @@ class CloudInstanceTypesConstraints(Type): _toPy = {'constraints': 'constraints'} def __init__(self, constraints=None, **unknown_fields): ''' - constraints : typing.Sequence<+T_co>[~CloudInstanceTypesConstraint]<~CloudInstanceTypesConstraint> + constraints : typing.Sequence[~CloudInstanceTypesConstraint] ''' self.constraints = [CloudInstanceTypesConstraint.from_json(o) for o in constraints or []] @@ -1720,7 +2210,7 @@ class CloudResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~CloudResult]<~CloudResult> + results : typing.Sequence[~CloudResult] ''' self.results = [CloudResult.from_json(o) for o in results or []] @@ -1767,30 +2257,58 @@ class CloudSpecResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~CloudSpecResult]<~CloudSpecResult> + results : typing.Sequence[~CloudSpecResult] ''' self.results = [CloudSpecResult.from_json(o) for o in results or []] +class CloudUserInfo(Type): + _toSchema = {'access': 'access', 'display_name': 'display-name', 'user': 'user'} + _toPy = {'access': 'access', 'display-name': 'display_name', 'user': 'user'} + def __init__(self, access=None, display_name=None, user=None, **unknown_fields): + ''' + access : str + display_name : str + user : str + ''' + self.access = access + self.display_name = display_name + self.user = user + + + 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> + clouds : typing.Mapping[str, ~Cloud] ''' self.clouds = clouds +class ConfigResult(Type): + _toSchema = {'config': 'config', 'error': 'error'} + _toPy = {'config': 'config', 'error': 'error'} + def __init__(self, config=None, error=None, **unknown_fields): + ''' + config : typing.Mapping[str, typing.Any] + error : Error + ''' + self.config = config + self.error = Error.from_json(error) if error else None + + + 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] + settings : typing.Mapping[str, typing.Any] ''' self.error = Error.from_json(error) if error else None self.settings = settings @@ -1802,7 +2320,7 @@ class ConfigSettingsResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~ConfigSettingsResult]<~ConfigSettingsResult> + results : typing.Sequence[~ConfigSettingsResult] ''' self.results = [ConfigSettingsResult.from_json(o) for o in results or []] @@ -1814,7 +2332,7 @@ class ConfigValue(Type): def __init__(self, source=None, value=None, **unknown_fields): ''' source : str - value : typing.Mapping<~KT, +VT_co>[str, typing.Any] + value : typing.Mapping[str, typing.Any] ''' self.source = source self.value = value @@ -1854,7 +2372,7 @@ class ConstraintsResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~ConstraintsResult]<~ConstraintsResult> + results : typing.Sequence[~ConstraintsResult] ''' self.results = [ConstraintsResult.from_json(o) for o in results or []] @@ -1878,7 +2396,7 @@ class ConsumeApplicationArgs(Type): _toPy = {'args': 'args'} def __init__(self, args=None, **unknown_fields): ''' - args : typing.Sequence<+T_co>[~ConsumeApplicationArg]<~ConsumeApplicationArg> + args : typing.Sequence[~ConsumeApplicationArg] ''' self.args = [ConsumeApplicationArg.from_json(o) for o in args or []] @@ -1902,12 +2420,51 @@ class ConsumeApplicationResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~ConsumeApplicationResult]<~ConsumeApplicationResult> + results : typing.Sequence[~ConsumeApplicationResult] ''' self.results = [ConsumeApplicationResult.from_json(o) for o in results or []] +class ConsumeOfferDetails(Type): + _toSchema = {'external_controller': 'external-controller', 'macaroon': 'macaroon', 'offer': 'offer'} + _toPy = {'external-controller': 'external_controller', 'macaroon': 'macaroon', 'offer': 'offer'} + def __init__(self, external_controller=None, macaroon=None, offer=None, **unknown_fields): + ''' + external_controller : ExternalControllerInfo + macaroon : Macaroon + offer : ApplicationOfferDetails + ''' + self.external_controller = ExternalControllerInfo.from_json(external_controller) if external_controller else None + self.macaroon = Macaroon.from_json(macaroon) if macaroon else None + self.offer = ApplicationOfferDetails.from_json(offer) if offer else None + + + +class ConsumeOfferDetailsResult(Type): + _toSchema = {'consumeofferdetails': 'ConsumeOfferDetails', 'error': 'error'} + _toPy = {'ConsumeOfferDetails': 'consumeofferdetails', 'error': 'error'} + def __init__(self, consumeofferdetails=None, error=None, **unknown_fields): + ''' + consumeofferdetails : ConsumeOfferDetails + error : Error + ''' + self.consumeofferdetails = ConsumeOfferDetails.from_json(consumeofferdetails) if consumeofferdetails else None + self.error = Error.from_json(error) if error else None + + + +class ConsumeOfferDetailsResults(Type): + _toSchema = {'results': 'results'} + _toPy = {'results': 'results'} + def __init__(self, results=None, **unknown_fields): + ''' + results : typing.Sequence[~ConsumeOfferDetailsResult] + ''' + self.results = [ConsumeOfferDetailsResult.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'} @@ -1931,12 +2488,25 @@ class ContainerConfig(Type): +class ContainerLXDProfile(Type): + _toSchema = {'name': 'name', 'profile': 'profile'} + _toPy = {'name': 'name', 'profile': 'profile'} + def __init__(self, name=None, profile=None, **unknown_fields): + ''' + name : str + profile : CharmLXDProfile + ''' + self.name = name + self.profile = CharmLXDProfile.from_json(profile) if profile else None + + + class ContainerManagerConfig(Type): _toSchema = {'config': 'config'} _toPy = {'config': 'config'} def __init__(self, config=None, **unknown_fields): ''' - config : typing.Mapping<~KT, +VT_co>[str, str] + config : typing.Mapping[str, str] ''' self.config = config @@ -1953,17 +2523,91 @@ class ContainerManagerConfigParams(Type): +class ContainerProfileResult(Type): + _toSchema = {'error': 'error', 'lxd_profiles': 'lxd-profiles'} + _toPy = {'error': 'error', 'lxd-profiles': 'lxd_profiles'} + def __init__(self, error=None, lxd_profiles=None, **unknown_fields): + ''' + error : Error + lxd_profiles : typing.Sequence[~ContainerLXDProfile] + ''' + self.error = Error.from_json(error) if error else None + self.lxd_profiles = [ContainerLXDProfile.from_json(o) for o in lxd_profiles or []] + + + +class ContainerProfileResults(Type): + _toSchema = {'results': 'results'} + _toPy = {'results': 'results'} + def __init__(self, results=None, **unknown_fields): + ''' + results : typing.Sequence[~ContainerProfileResult] + ''' + self.results = [ContainerProfileResult.from_json(o) for o in results or []] + + + +class ControllerAPIInfoResult(Type): + _toSchema = {'addresses': 'addresses', 'cacert': 'cacert', 'error': 'error'} + _toPy = {'addresses': 'addresses', 'cacert': 'cacert', 'error': 'error'} + def __init__(self, addresses=None, cacert=None, error=None, **unknown_fields): + ''' + addresses : typing.Sequence[str] + cacert : str + error : Error + ''' + self.addresses = addresses + self.cacert = cacert + self.error = Error.from_json(error) if error else None + + + +class ControllerAPIInfoResults(Type): + _toSchema = {'results': 'results'} + _toPy = {'results': 'results'} + def __init__(self, results=None, **unknown_fields): + ''' + results : typing.Sequence[~ControllerAPIInfoResult] + ''' + self.results = [ControllerAPIInfoResult.from_json(o) for o in results or []] + + + 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] + config : typing.Mapping[str, typing.Any] + ''' + self.config = config + + + +class ControllerConfigSet(Type): + _toSchema = {'config': 'config'} + _toPy = {'config': 'config'} + def __init__(self, config=None, **unknown_fields): + ''' + config : typing.Mapping[str, typing.Any] ''' self.config = config +class ControllerCredentialInfo(Type): + _toSchema = {'content': 'content', 'models': 'models'} + _toPy = {'content': 'content', 'models': 'models'} + def __init__(self, content=None, models=None, **unknown_fields): + ''' + content : CredentialContent + models : typing.Sequence[~ModelAccess] + ''' + self.content = CredentialContent.from_json(content) if content else None + self.models = [ModelAccess.from_json(o) for o in models or []] + + + class ControllersChangeResult(Type): _toSchema = {'error': 'error', 'result': 'result'} _toPy = {'error': 'error', 'result': 'result'} @@ -1982,7 +2626,7 @@ class ControllersChangeResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~ControllersChangeResult]<~ControllersChangeResult> + results : typing.Sequence[~ControllersChangeResult] ''' self.results = [ControllersChangeResult.from_json(o) for o in results or []] @@ -1993,12 +2637,12 @@ class ControllersChanges(Type): _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] + added : typing.Sequence[str] + converted : typing.Sequence[str] + demoted : typing.Sequence[str] + maintained : typing.Sequence[str] + promoted : typing.Sequence[str] + removed : typing.Sequence[str] ''' self.added = added self.converted = converted @@ -2016,7 +2660,7 @@ class ControllersSpec(Type): ''' constraints : Value num_controllers : int - placement : typing.Sequence<+T_co>[str] + placement : typing.Sequence[str] series : str ''' self.constraints = Value.from_json(constraints) if constraints else None @@ -2031,7 +2675,7 @@ class ControllersSpecs(Type): _toPy = {'specs': 'specs'} def __init__(self, specs=None, **unknown_fields): ''' - specs : typing.Sequence<+T_co>[~ControllersSpec]<~ControllersSpec> + specs : typing.Sequence[~ControllersSpec] ''' self.specs = [ControllersSpec.from_json(o) for o in specs or []] @@ -2045,7 +2689,7 @@ class CreateSpaceParams(Type): provider_id : str public : bool space_tag : str - subnet_tags : typing.Sequence<+T_co>[str] + subnet_tags : typing.Sequence[str] ''' self.provider_id = provider_id self.public = public @@ -2059,18 +2703,59 @@ class CreateSpacesParams(Type): _toPy = {'spaces': 'spaces'} def __init__(self, spaces=None, **unknown_fields): ''' - spaces : typing.Sequence<+T_co>[~CreateSpaceParams]<~CreateSpaceParams> + spaces : typing.Sequence[~CreateSpaceParams] ''' self.spaces = [CreateSpaceParams.from_json(o) for o in spaces or []] +class CredentialContent(Type): + _toSchema = {'attrs': 'attrs', 'auth_type': 'auth-type', 'cloud': 'cloud', 'name': 'name'} + _toPy = {'attrs': 'attrs', 'auth-type': 'auth_type', 'cloud': 'cloud', 'name': 'name'} + def __init__(self, attrs=None, auth_type=None, cloud=None, name=None, **unknown_fields): + ''' + attrs : typing.Mapping[str, str] + auth_type : str + cloud : str + name : str + ''' + self.attrs = attrs + self.auth_type = auth_type + self.cloud = cloud + self.name = name + + + +class CredentialContentResult(Type): + _toSchema = {'error': 'error', 'result': 'result'} + _toPy = {'error': 'error', 'result': 'result'} + def __init__(self, error=None, result=None, **unknown_fields): + ''' + error : Error + result : ControllerCredentialInfo + ''' + self.error = Error.from_json(error) if error else None + self.result = ControllerCredentialInfo.from_json(result) if result else None + + + +class CredentialContentResults(Type): + _toSchema = {'results': 'results'} + _toPy = {'results': 'results'} + def __init__(self, results=None, **unknown_fields): + ''' + results : typing.Sequence[~CredentialContentResult] + ''' + self.results = [CredentialContentResult.from_json(o) for o in results 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] + entity : typing.Mapping[str, typing.Any] removed : bool ''' self.entity = entity @@ -2083,8 +2768,8 @@ class DeployerConnectionValues(Type): _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] + api_addresses : typing.Sequence[str] + state_addresses : typing.Sequence[str] ''' self.api_addresses = api_addresses self.state_addresses = state_addresses @@ -2096,9 +2781,9 @@ class DestroyApplicationInfo(Type): _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> + destroyed_storage : typing.Sequence[~Entity] + destroyed_units : typing.Sequence[~Entity] + detached_storage : typing.Sequence[~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 []] @@ -2106,6 +2791,32 @@ class DestroyApplicationInfo(Type): +class DestroyApplicationOffers(Type): + _toSchema = {'force': 'force', 'offer_urls': 'offer-urls'} + _toPy = {'force': 'force', 'offer-urls': 'offer_urls'} + def __init__(self, force=None, offer_urls=None, **unknown_fields): + ''' + force : bool + offer_urls : typing.Sequence[str] + ''' + self.force = force + self.offer_urls = offer_urls + + + +class DestroyApplicationParams(Type): + _toSchema = {'application_tag': 'application-tag', 'destroy_storage': 'destroy-storage'} + _toPy = {'application-tag': 'application_tag', 'destroy-storage': 'destroy_storage'} + def __init__(self, application_tag=None, destroy_storage=None, **unknown_fields): + ''' + application_tag : str + destroy_storage : bool + ''' + self.application_tag = application_tag + self.destroy_storage = destroy_storage + + + class DestroyApplicationResult(Type): _toSchema = {'error': 'error', 'info': 'info'} _toPy = {'error': 'error', 'info': 'info'} @@ -2124,7 +2835,7 @@ class DestroyApplicationResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~DestroyApplicationResult]<~DestroyApplicationResult> + results : typing.Sequence[~DestroyApplicationResult] ''' self.results = [DestroyApplicationResult.from_json(o) for o in results or []] @@ -2135,12 +2846,45 @@ class DestroyApplicationUnits(Type): _toPy = {'unit-names': 'unit_names'} def __init__(self, unit_names=None, **unknown_fields): ''' - unit_names : typing.Sequence<+T_co>[str] + unit_names : typing.Sequence[str] ''' self.unit_names = unit_names +class DestroyApplicationsParams(Type): + _toSchema = {'applications': 'applications'} + _toPy = {'applications': 'applications'} + def __init__(self, applications=None, **unknown_fields): + ''' + applications : typing.Sequence[~DestroyApplicationParams] + ''' + self.applications = [DestroyApplicationParams.from_json(o) for o in applications or []] + + + +class DestroyConsumedApplicationParams(Type): + _toSchema = {'application_tag': 'application-tag'} + _toPy = {'application-tag': 'application_tag'} + def __init__(self, application_tag=None, **unknown_fields): + ''' + application_tag : str + ''' + self.application_tag = application_tag + + + +class DestroyConsumedApplicationsParams(Type): + _toSchema = {'applications': 'applications'} + _toPy = {'applications': 'applications'} + def __init__(self, applications=None, **unknown_fields): + ''' + applications : typing.Sequence[~DestroyConsumedApplicationParams] + ''' + self.applications = [DestroyConsumedApplicationParams.from_json(o) for o in applications or []] + + + class DestroyControllerArgs(Type): _toSchema = {'destroy_models': 'destroy-models'} _toPy = {'destroy-models': 'destroy_models'} @@ -2157,9 +2901,9 @@ class DestroyMachineInfo(Type): _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> + destroyed_storage : typing.Sequence[~Entity] + destroyed_units : typing.Sequence[~Entity] + detached_storage : typing.Sequence[~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 []] @@ -2185,7 +2929,7 @@ class DestroyMachineResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~DestroyMachineResult]<~DestroyMachineResult> + results : typing.Sequence[~DestroyMachineResult] ''' self.results = [DestroyMachineResult.from_json(o) for o in results or []] @@ -2197,19 +2941,58 @@ class DestroyMachines(Type): def __init__(self, force=None, machine_names=None, **unknown_fields): ''' force : bool - machine_names : typing.Sequence<+T_co>[str] + machine_names : typing.Sequence[str] ''' self.force = force self.machine_names = machine_names +class DestroyMachinesParams(Type): + _toSchema = {'force': 'force', 'keep': 'keep', 'machine_tags': 'machine-tags'} + _toPy = {'force': 'force', 'keep': 'keep', 'machine-tags': 'machine_tags'} + def __init__(self, force=None, keep=None, machine_tags=None, **unknown_fields): + ''' + force : bool + keep : bool + machine_tags : typing.Sequence[str] + ''' + self.force = force + self.keep = keep + self.machine_tags = machine_tags + + + +class DestroyModelParams(Type): + _toSchema = {'destroy_storage': 'destroy-storage', 'model_tag': 'model-tag'} + _toPy = {'destroy-storage': 'destroy_storage', 'model-tag': 'model_tag'} + def __init__(self, destroy_storage=None, model_tag=None, **unknown_fields): + ''' + destroy_storage : bool + model_tag : str + ''' + self.destroy_storage = destroy_storage + self.model_tag = model_tag + + + +class DestroyModelsParams(Type): + _toSchema = {'models': 'models'} + _toPy = {'models': 'models'} + def __init__(self, models=None, **unknown_fields): + ''' + models : typing.Sequence[~DestroyModelParams] + ''' + self.models = [DestroyModelParams.from_json(o) for o in models or []] + + + class DestroyRelation(Type): _toSchema = {'endpoints': 'endpoints'} _toPy = {'endpoints': 'endpoints'} def __init__(self, endpoints=None, **unknown_fields): ''' - endpoints : typing.Sequence<+T_co>[str] + endpoints : typing.Sequence[str] ''' self.endpoints = endpoints @@ -2220,14 +3003,27 @@ class DestroyUnitInfo(Type): _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> + destroyed_storage : typing.Sequence[~Entity] + detached_storage : typing.Sequence[~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 DestroyUnitParams(Type): + _toSchema = {'destroy_storage': 'destroy-storage', 'unit_tag': 'unit-tag'} + _toPy = {'destroy-storage': 'destroy_storage', 'unit-tag': 'unit_tag'} + def __init__(self, destroy_storage=None, unit_tag=None, **unknown_fields): + ''' + destroy_storage : bool + unit_tag : str + ''' + self.destroy_storage = destroy_storage + self.unit_tag = unit_tag + + + class DestroyUnitResult(Type): _toSchema = {'error': 'error', 'info': 'info'} _toPy = {'error': 'error', 'info': 'info'} @@ -2246,19 +3042,30 @@ class DestroyUnitResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~DestroyUnitResult]<~DestroyUnitResult> + results : typing.Sequence[~DestroyUnitResult] ''' self.results = [DestroyUnitResult.from_json(o) for o in results or []] +class DestroyUnitsParams(Type): + _toSchema = {'units': 'units'} + _toPy = {'units': 'units'} + def __init__(self, units=None, **unknown_fields): + ''' + units : typing.Sequence[~DestroyUnitParams] + ''' + self.units = [DestroyUnitParams.from_json(o) for o in units 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] + data : typing.Mapping[str, typing.Any] + err : typing.Mapping[str, typing.Any] info : str kind : str life : str @@ -2295,7 +3102,7 @@ class DiscoverSpacesResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~ProviderSpace]<~ProviderSpace> + results : typing.Sequence[~ProviderSpace] ''' self.results = [ProviderSpace.from_json(o) for o in results or []] @@ -2307,7 +3114,7 @@ class DistributionGroupResult(Type): def __init__(self, error=None, result=None, **unknown_fields): ''' error : Error - result : typing.Sequence<+T_co>[str] + result : typing.Sequence[str] ''' self.error = Error.from_json(error) if error else None self.result = result @@ -2319,7 +3126,7 @@ class DistributionGroupResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~DistributionGroupResult]<~DistributionGroupResult> + results : typing.Sequence[~DistributionGroupResult] ''' self.results = [DistributionGroupResult.from_json(o) for o in results or []] @@ -2330,7 +3137,7 @@ class DumpModelRequest(Type): _toPy = {'entities': 'entities', 'simplified': 'simplified'} def __init__(self, entities=None, simplified=None, **unknown_fields): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> + entities : typing.Sequence[~Entity] simplified : bool ''' self.entities = [Entity.from_json(o) for o in entities or []] @@ -2351,15 +3158,30 @@ class Endpoint(Type): -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): +class EndpointFilterAttributes(Type): + _toSchema = {'interface': 'interface', 'name': 'name', 'role': 'role'} + _toPy = {'interface': 'interface', 'name': 'name', 'role': 'role'} + def __init__(self, interface=None, name=None, role=None, **unknown_fields): ''' - application : str + interface : str name : str role : str - subordinate : bool + ''' + self.interface = interface + self.name = name + self.role = role + + + +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 @@ -2373,7 +3195,7 @@ class Entities(Type): _toPy = {'entities': 'entities'} def __init__(self, entities=None, **unknown_fields): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> + entities : typing.Sequence[~Entity] ''' self.entities = [Entity.from_json(o) for o in entities or []] @@ -2384,7 +3206,7 @@ class EntitiesCharmURL(Type): _toPy = {'entities': 'entities'} def __init__(self, entities=None, **unknown_fields): ''' - entities : typing.Sequence<+T_co>[~EntityCharmURL]<~EntityCharmURL> + entities : typing.Sequence[~EntityCharmURL] ''' self.entities = [EntityCharmURL.from_json(o) for o in entities or []] @@ -2395,7 +3217,7 @@ class EntitiesPortRanges(Type): _toPy = {'entities': 'entities'} def __init__(self, entities=None, **unknown_fields): ''' - entities : typing.Sequence<+T_co>[~EntityPortRange]<~EntityPortRange> + entities : typing.Sequence[~EntityPortRange] ''' self.entities = [EntityPortRange.from_json(o) for o in entities or []] @@ -2406,7 +3228,7 @@ class EntitiesResult(Type): _toPy = {'entities': 'entities', 'error': 'error'} def __init__(self, entities=None, error=None, **unknown_fields): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> + entities : typing.Sequence[~Entity] error : Error ''' self.entities = [Entity.from_json(o) for o in entities or []] @@ -2419,7 +3241,7 @@ class EntitiesResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~EntitiesResult]<~EntitiesResult> + results : typing.Sequence[~EntitiesResult] ''' self.results = [EntitiesResult.from_json(o) for o in results or []] @@ -2430,7 +3252,7 @@ class EntitiesVersion(Type): _toPy = {'agent-tools': 'agent_tools'} def __init__(self, agent_tools=None, **unknown_fields): ''' - agent_tools : typing.Sequence<+T_co>[~EntityVersion]<~EntityVersion> + agent_tools : typing.Sequence[~EntityVersion] ''' self.agent_tools = [EntityVersion.from_json(o) for o in agent_tools or []] @@ -2441,7 +3263,7 @@ class EntitiesWatchResult(Type): _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] + changes : typing.Sequence[str] error : Error watcher_id : str ''' @@ -2467,7 +3289,7 @@ class EntityAnnotations(Type): _toPy = {'annotations': 'annotations', 'entity': 'entity'} def __init__(self, annotations=None, entity=None, **unknown_fields): ''' - annotations : typing.Mapping<~KT, +VT_co>[str, str] + annotations : typing.Mapping[str, str] entity : str ''' self.annotations = annotations @@ -2488,13 +3310,37 @@ class EntityCharmURL(Type): +class EntityMacaroonArg(Type): + _toSchema = {'macaroon': 'macaroon', 'tag': 'tag'} + _toPy = {'macaroon': 'macaroon', 'tag': 'tag'} + def __init__(self, macaroon=None, tag=None, **unknown_fields): + ''' + macaroon : Macaroon + tag : str + ''' + self.macaroon = Macaroon.from_json(macaroon) if macaroon else None + self.tag = tag + + + +class EntityMacaroonArgs(Type): + _toSchema = {'args': 'Args'} + _toPy = {'Args': 'args'} + def __init__(self, args=None, **unknown_fields): + ''' + args : typing.Sequence[~EntityMacaroonArg] + ''' + self.args = [EntityMacaroonArg.from_json(o) for o in args or []] + + + 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> + metrics : typing.Sequence[~MetricResult] ''' self.error = Error.from_json(error) if error else None self.metrics = [MetricResult.from_json(o) for o in metrics or []] @@ -2519,7 +3365,7 @@ class EntityPasswords(Type): _toPy = {'changes': 'changes'} def __init__(self, changes=None, **unknown_fields): ''' - changes : typing.Sequence<+T_co>[~EntityPassword]<~EntityPassword> + changes : typing.Sequence[~EntityPassword] ''' self.changes = [EntityPassword.from_json(o) for o in changes or []] @@ -2547,7 +3393,7 @@ class EntityStatus(Type): _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] + data : typing.Mapping[str, typing.Any] info : str since : str status : str @@ -2564,7 +3410,7 @@ class EntityStatusArgs(Type): _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] + data : typing.Mapping[str, typing.Any] info : str status : str tag : str @@ -2576,6 +3422,19 @@ class EntityStatusArgs(Type): +class EntityString(Type): + _toSchema = {'tag': 'tag', 'value': 'value'} + _toPy = {'tag': 'tag', 'value': 'value'} + def __init__(self, tag=None, value=None, **unknown_fields): + ''' + tag : str + value : str + ''' + self.tag = tag + self.value = value + + + class EntityVersion(Type): _toSchema = {'tag': 'tag', 'tools': 'tools'} _toPy = {'tag': 'tag', 'tools': 'tools'} @@ -2607,7 +3466,7 @@ class EntityWorkloadVersions(Type): _toPy = {'entities': 'entities'} def __init__(self, entities=None, **unknown_fields): ''' - entities : typing.Sequence<+T_co>[~EntityWorkloadVersion]<~EntityWorkloadVersion> + entities : typing.Sequence[~EntityWorkloadVersion] ''' self.entities = [EntityWorkloadVersion.from_json(o) for o in entities or []] @@ -2618,7 +3477,7 @@ class EnvListArgs(Type): _toPy = {'patterns': 'patterns'} def __init__(self, patterns=None, **unknown_fields): ''' - patterns : typing.Sequence<+T_co>[str] + patterns : typing.Sequence[str] ''' self.patterns = patterns @@ -2629,7 +3488,7 @@ class EnvListResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~Payload]<~Payload> + results : typing.Sequence[~Payload] ''' self.results = [Payload.from_json(o) for o in results or []] @@ -2679,12 +3538,77 @@ class ErrorResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult> + results : typing.Sequence[~ErrorResult] ''' self.results = [ErrorResult.from_json(o) for o in results or []] +class ExternalControllerInfo(Type): + _toSchema = {'addrs': 'addrs', 'ca_cert': 'ca-cert', 'controller_alias': 'controller-alias', 'controller_tag': 'controller-tag'} + _toPy = {'addrs': 'addrs', 'ca-cert': 'ca_cert', 'controller-alias': 'controller_alias', 'controller-tag': 'controller_tag'} + def __init__(self, addrs=None, ca_cert=None, controller_alias=None, controller_tag=None, **unknown_fields): + ''' + addrs : typing.Sequence[str] + ca_cert : str + controller_alias : str + controller_tag : str + ''' + self.addrs = addrs + self.ca_cert = ca_cert + self.controller_alias = controller_alias + self.controller_tag = controller_tag + + + +class ExternalControllerInfoResult(Type): + _toSchema = {'error': 'error', 'result': 'result'} + _toPy = {'error': 'error', 'result': 'result'} + def __init__(self, error=None, result=None, **unknown_fields): + ''' + error : Error + result : ExternalControllerInfo + ''' + self.error = Error.from_json(error) if error else None + self.result = ExternalControllerInfo.from_json(result) if result else None + + + +class ExternalControllerInfoResults(Type): + _toSchema = {'results': 'results'} + _toPy = {'results': 'results'} + def __init__(self, results=None, **unknown_fields): + ''' + results : typing.Sequence[~ExternalControllerInfoResult] + ''' + self.results = [ExternalControllerInfoResult.from_json(o) for o in results or []] + + + +class FanConfigEntry(Type): + _toSchema = {'overlay': 'overlay', 'underlay': 'underlay'} + _toPy = {'overlay': 'overlay', 'underlay': 'underlay'} + def __init__(self, overlay=None, underlay=None, **unknown_fields): + ''' + overlay : str + underlay : str + ''' + self.overlay = overlay + self.underlay = underlay + + + +class FanConfigResult(Type): + _toSchema = {'fans': 'fans'} + _toPy = {'fans': 'fans'} + def __init__(self, fans=None, **unknown_fields): + ''' + fans : typing.Sequence[~FanConfigEntry] + ''' + self.fans = [FanConfigEntry.from_json(o) for o in fans 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'} @@ -2782,7 +3706,7 @@ class FilesystemAttachmentParamsResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~FilesystemAttachmentParamsResult]<~FilesystemAttachmentParamsResult> + results : typing.Sequence[~FilesystemAttachmentParamsResult] ''' self.results = [FilesystemAttachmentParamsResult.from_json(o) for o in results or []] @@ -2806,7 +3730,7 @@ class FilesystemAttachmentResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~FilesystemAttachmentResult]<~FilesystemAttachmentResult> + results : typing.Sequence[~FilesystemAttachmentResult] ''' self.results = [FilesystemAttachmentResult.from_json(o) for o in results or []] @@ -2817,7 +3741,7 @@ class FilesystemAttachments(Type): _toPy = {'filesystem-attachments': 'filesystem_attachments'} def __init__(self, filesystem_attachments=None, **unknown_fields): ''' - filesystem_attachments : typing.Sequence<+T_co>[~FilesystemAttachment]<~FilesystemAttachment> + filesystem_attachments : typing.Sequence[~FilesystemAttachment] ''' self.filesystem_attachments = [FilesystemAttachment.from_json(o) for o in filesystem_attachments or []] @@ -2830,7 +3754,7 @@ class FilesystemDetails(Type): ''' filesystem_tag : str info : FilesystemInfo - machine_attachments : typing.Mapping<~KT, +VT_co>[str, ~FilesystemAttachmentInfo]<~FilesystemAttachmentInfo> + machine_attachments : typing.Mapping[str, ~FilesystemAttachmentInfo] status : EntityStatus storage : StorageDetails volume_tag : str @@ -2850,7 +3774,7 @@ class FilesystemDetailsListResult(Type): def __init__(self, error=None, result=None, **unknown_fields): ''' error : Error - result : typing.Sequence<+T_co>[~FilesystemDetails]<~FilesystemDetails> + result : typing.Sequence[~FilesystemDetails] ''' self.error = Error.from_json(error) if error else None self.result = [FilesystemDetails.from_json(o) for o in result or []] @@ -2862,7 +3786,7 @@ class FilesystemDetailsListResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~FilesystemDetailsListResult]<~FilesystemDetailsListResult> + results : typing.Sequence[~FilesystemDetailsListResult] ''' self.results = [FilesystemDetailsListResult.from_json(o) for o in results or []] @@ -2873,7 +3797,7 @@ class FilesystemFilter(Type): _toPy = {'machines': 'machines'} def __init__(self, machines=None, **unknown_fields): ''' - machines : typing.Sequence<+T_co>[str] + machines : typing.Sequence[str] ''' self.machines = machines @@ -2884,7 +3808,7 @@ class FilesystemFilters(Type): _toPy = {'filters': 'filters'} def __init__(self, filters=None, **unknown_fields): ''' - filters : typing.Sequence<+T_co>[~FilesystemFilter]<~FilesystemFilter> + filters : typing.Sequence[~FilesystemFilter] ''' self.filters = [FilesystemFilter.from_json(o) for o in filters or []] @@ -2909,11 +3833,11 @@ class FilesystemParams(Type): 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] + attributes : typing.Mapping[str, typing.Any] filesystem_tag : str provider : str size : int - tags : typing.Mapping<~KT, +VT_co>[str, str] + tags : typing.Mapping[str, str] volume_tag : str ''' self.attachment = FilesystemAttachmentParams.from_json(attachment) if attachment else None @@ -2944,7 +3868,7 @@ class FilesystemParamsResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~FilesystemParamsResult]<~FilesystemParamsResult> + results : typing.Sequence[~FilesystemParamsResult] ''' self.results = [FilesystemParamsResult.from_json(o) for o in results or []] @@ -2968,7 +3892,7 @@ class FilesystemResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~FilesystemResult]<~FilesystemResult> + results : typing.Sequence[~FilesystemResult] ''' self.results = [FilesystemResult.from_json(o) for o in results or []] @@ -2979,7 +3903,7 @@ class Filesystems(Type): _toPy = {'filesystems': 'filesystems'} def __init__(self, filesystems=None, **unknown_fields): ''' - filesystems : typing.Sequence<+T_co>[~Filesystem]<~Filesystem> + filesystems : typing.Sequence[~Filesystem] ''' self.filesystems = [Filesystem.from_json(o) for o in filesystems or []] @@ -2990,7 +3914,7 @@ class FindActionsByNames(Type): _toPy = {'names': 'names'} def __init__(self, names=None, **unknown_fields): ''' - names : typing.Sequence<+T_co>[str] + names : typing.Sequence[str] ''' self.names = names @@ -3001,7 +3925,7 @@ class FindTags(Type): _toPy = {'prefixes': 'prefixes'} def __init__(self, prefixes=None, **unknown_fields): ''' - prefixes : typing.Sequence<+T_co>[str] + prefixes : typing.Sequence[str] ''' self.prefixes = prefixes @@ -3012,7 +3936,7 @@ class FindTagsResults(Type): _toPy = {'matches': 'matches'} def __init__(self, matches=None, **unknown_fields): ''' - matches : typing.Sequence<+T_co>[~Entity]<~Entity> + matches : typing.Sequence[~Entity] ''' self.matches = [Entity.from_json(o) for o in matches or []] @@ -3043,27 +3967,55 @@ class FindToolsResult(Type): def __init__(self, error=None, list_=None, **unknown_fields): ''' error : Error - list_ : typing.Sequence<+T_co>[~Tools]<~Tools> + list_ : typing.Sequence[~Tools] ''' self.error = Error.from_json(error) if error else None self.list_ = [Tools.from_json(o) for o in list_ or []] +class FirewallRule(Type): + _toSchema = {'known_service': 'known-service', 'whitelist_cidrs': 'whitelist-cidrs'} + _toPy = {'known-service': 'known_service', 'whitelist-cidrs': 'whitelist_cidrs'} + def __init__(self, known_service=None, whitelist_cidrs=None, **unknown_fields): + ''' + known_service : str + whitelist_cidrs : typing.Sequence[str] + ''' + self.known_service = known_service + self.whitelist_cidrs = whitelist_cidrs + + + +class FirewallRuleArgs(Type): + _toSchema = {'args': 'args'} + _toPy = {'args': 'args'} + def __init__(self, args=None, **unknown_fields): + ''' + args : typing.Sequence[~FirewallRule] + ''' + self.args = [FirewallRule.from_json(o) for o in args 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): + _toSchema = {'applications': 'applications', 'controller_timestamp': 'controller-timestamp', 'machines': 'machines', 'model': 'model', 'offers': 'offers', 'relations': 'relations', 'remote_applications': 'remote-applications'} + _toPy = {'applications': 'applications', 'controller-timestamp': 'controller_timestamp', 'machines': 'machines', 'model': 'model', 'offers': 'offers', 'relations': 'relations', 'remote-applications': 'remote_applications'} + def __init__(self, applications=None, controller_timestamp=None, machines=None, model=None, offers=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> + applications : typing.Mapping[str, ~ApplicationStatus] + controller_timestamp : str + machines : typing.Mapping[str, ~MachineStatus] model : ModelStatusInfo - relations : typing.Sequence<+T_co>[~RelationStatus]<~RelationStatus> - remote_applications : typing.Mapping<~KT, +VT_co>[str, ~RemoteApplicationStatus]<~RemoteApplicationStatus> + offers : typing.Mapping[str, ~ApplicationOfferStatus] + relations : typing.Sequence[~RelationStatus] + remote_applications : typing.Mapping[str, ~RemoteApplicationStatus] ''' self.applications = applications + self.controller_timestamp = controller_timestamp self.machines = machines self.model = ModelStatusInfo.from_json(model) if model else None + self.offers = offers self.relations = [RelationStatus.from_json(o) for o in relations or []] self.remote_applications = remote_applications @@ -3096,7 +4048,7 @@ class GetLeadershipSettingsBulkResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~GetLeadershipSettingsResult]<~GetLeadershipSettingsResult> + results : typing.Sequence[~GetLeadershipSettingsResult] ''' self.results = [GetLeadershipSettingsResult.from_json(o) for o in results or []] @@ -3108,13 +4060,85 @@ class GetLeadershipSettingsResult(Type): def __init__(self, error=None, settings=None, **unknown_fields): ''' error : Error - settings : typing.Mapping<~KT, +VT_co>[str, str] + settings : typing.Mapping[str, str] ''' self.error = Error.from_json(error) if error else None self.settings = settings +class GetTokenArg(Type): + _toSchema = {'tag': 'tag'} + _toPy = {'tag': 'tag'} + def __init__(self, tag=None, **unknown_fields): + ''' + tag : str + ''' + self.tag = tag + + + +class GetTokenArgs(Type): + _toSchema = {'args': 'Args'} + _toPy = {'Args': 'args'} + def __init__(self, args=None, **unknown_fields): + ''' + args : typing.Sequence[~GetTokenArg] + ''' + self.args = [GetTokenArg.from_json(o) for o in args or []] + + + +class GoalState(Type): + _toSchema = {'relations': 'relations', 'units': 'units'} + _toPy = {'relations': 'relations', 'units': 'units'} + def __init__(self, relations=None, units=None, **unknown_fields): + ''' + relations : typing.Mapping[str, typing.Any] + units : typing.Mapping[str, ~GoalStateStatus] + ''' + self.relations = relations + self.units = units + + + +class GoalStateResult(Type): + _toSchema = {'error': 'error', 'result': 'result'} + _toPy = {'error': 'error', 'result': 'result'} + def __init__(self, error=None, result=None, **unknown_fields): + ''' + error : Error + result : GoalState + ''' + self.error = Error.from_json(error) if error else None + self.result = GoalState.from_json(result) if result else None + + + +class GoalStateResults(Type): + _toSchema = {'results': 'results'} + _toPy = {'results': 'results'} + def __init__(self, results=None, **unknown_fields): + ''' + results : typing.Sequence[~GoalStateResult] + ''' + self.results = [GoalStateResult.from_json(o) for o in results or []] + + + +class GoalStateStatus(Type): + _toSchema = {'since': 'since', 'status': 'status'} + _toPy = {'since': 'since', 'status': 'status'} + def __init__(self, since=None, status=None, **unknown_fields): + ''' + since : str + status : str + ''' + self.since = since + self.status = status + + + class HAMember(Type): _toSchema = {'public_address': 'public-address', 'series': 'series', 'tag': 'tag'} _toPy = {'public-address': 'public_address', 'series': 'series', 'tag': 'tag'} @@ -3141,7 +4165,7 @@ class HardwareCharacteristics(Type): cpu_power : int mem : int root_disk : int - tags : typing.Sequence<+T_co>[str] + tags : typing.Sequence[str] ''' self.arch = arch self.availability_zone = availability_zone @@ -3159,7 +4183,7 @@ class History(Type): def __init__(self, error=None, statuses=None, **unknown_fields): ''' error : Error - statuses : typing.Sequence<+T_co>[~DetailedStatus]<~DetailedStatus> + statuses : typing.Sequence[~DetailedStatus] ''' self.error = Error.from_json(error) if error else None self.statuses = [DetailedStatus.from_json(o) for o in statuses or []] @@ -3172,7 +4196,7 @@ class HostNetworkChange(Type): def __init__(self, error=None, new_bridges=None, reconfigure_delay=None, **unknown_fields): ''' error : Error - new_bridges : typing.Sequence<+T_co>[~DeviceBridgeInfo]<~DeviceBridgeInfo> + new_bridges : typing.Sequence[~DeviceBridgeInfo] reconfigure_delay : int ''' self.error = Error.from_json(error) if error else None @@ -3186,7 +4210,7 @@ class HostNetworkChangeResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~HostNetworkChange]<~HostNetworkChange> + results : typing.Sequence[~HostNetworkChange] ''' self.results = [HostNetworkChange.from_json(o) for o in results or []] @@ -3211,7 +4235,7 @@ class HostedModelConfig(Type): 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] + config : typing.Mapping[str, typing.Any] error : Error name : str owner : str @@ -3229,7 +4253,7 @@ class HostedModelConfigsResults(Type): _toPy = {'models': 'models'} def __init__(self, models=None, **unknown_fields): ''' - models : typing.Sequence<+T_co>[~HostedModelConfig]<~HostedModelConfig> + models : typing.Sequence[~HostedModelConfig] ''' self.models = [HostedModelConfig.from_json(o) for o in models or []] @@ -3240,7 +4264,7 @@ class ImageFilterParams(Type): _toPy = {'images': 'images'} def __init__(self, images=None, **unknown_fields): ''' - images : typing.Sequence<+T_co>[~ImageSpec]<~ImageSpec> + images : typing.Sequence[~ImageSpec] ''' self.images = [ImageSpec.from_json(o) for o in images or []] @@ -3270,10 +4294,10 @@ class ImageMetadataFilter(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] + arches : typing.Sequence[str] region : str root_storage_type : str - series : typing.Sequence<+T_co>[str] + series : typing.Sequence[str] stream : str virt_type : str ''' @@ -3301,12 +4325,94 @@ class ImageSpec(Type): +class ImportStorageDetails(Type): + _toSchema = {'storage_tag': 'storage-tag'} + _toPy = {'storage-tag': 'storage_tag'} + def __init__(self, storage_tag=None, **unknown_fields): + ''' + storage_tag : str + ''' + self.storage_tag = storage_tag + + + +class ImportStorageParams(Type): + _toSchema = {'kind': 'kind', 'pool': 'pool', 'provider_id': 'provider-id', 'storage_name': 'storage-name'} + _toPy = {'kind': 'kind', 'pool': 'pool', 'provider-id': 'provider_id', 'storage-name': 'storage_name'} + def __init__(self, kind=None, pool=None, provider_id=None, storage_name=None, **unknown_fields): + ''' + kind : int + pool : str + provider_id : str + storage_name : str + ''' + self.kind = kind + self.pool = pool + self.provider_id = provider_id + self.storage_name = storage_name + + + +class ImportStorageResult(Type): + _toSchema = {'error': 'error', 'result': 'result'} + _toPy = {'error': 'error', 'result': 'result'} + def __init__(self, error=None, result=None, **unknown_fields): + ''' + error : Error + result : ImportStorageDetails + ''' + self.error = Error.from_json(error) if error else None + self.result = ImportStorageDetails.from_json(result) if result else None + + + +class ImportStorageResults(Type): + _toSchema = {'results': 'results'} + _toPy = {'results': 'results'} + def __init__(self, results=None, **unknown_fields): + ''' + results : typing.Sequence[~ImportStorageResult] + ''' + self.results = [ImportStorageResult.from_json(o) for o in results or []] + + + +class IngressNetworksChangeEvent(Type): + _toSchema = {'application_token': 'application-token', 'ingress_required': 'ingress-required', 'macaroons': 'macaroons', 'networks': 'networks', 'relation_token': 'relation-token'} + _toPy = {'application-token': 'application_token', 'ingress-required': 'ingress_required', 'macaroons': 'macaroons', 'networks': 'networks', 'relation-token': 'relation_token'} + def __init__(self, application_token=None, ingress_required=None, macaroons=None, networks=None, relation_token=None, **unknown_fields): + ''' + application_token : str + ingress_required : bool + macaroons : typing.Sequence[~Macaroon] + networks : typing.Sequence[str] + relation_token : str + ''' + self.application_token = application_token + self.ingress_required = ingress_required + self.macaroons = [Macaroon.from_json(o) for o in macaroons or []] + self.networks = networks + self.relation_token = relation_token + + + +class IngressNetworksChanges(Type): + _toSchema = {'changes': 'changes'} + _toPy = {'changes': 'changes'} + def __init__(self, changes=None, **unknown_fields): + ''' + changes : typing.Sequence[~IngressNetworksChangeEvent] + ''' + self.changes = [IngressNetworksChangeEvent.from_json(o) for o in changes or []] + + + class InitiateMigrationArgs(Type): _toSchema = {'specs': 'specs'} _toPy = {'specs': 'specs'} def __init__(self, specs=None, **unknown_fields): ''' - specs : typing.Sequence<+T_co>[~MigrationSpec]<~MigrationSpec> + specs : typing.Sequence[~MigrationSpec] ''' self.specs = [MigrationSpec.from_json(o) for o in specs or []] @@ -3332,7 +4438,7 @@ class InitiateMigrationResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~InitiateMigrationResult]<~InitiateMigrationResult> + results : typing.Sequence[~InitiateMigrationResult] ''' self.results = [InitiateMigrationResult.from_json(o) for o in results or []] @@ -3345,11 +4451,11 @@ class InstanceInfo(Type): ''' characteristics : HardwareCharacteristics instance_id : str - network_config : typing.Sequence<+T_co>[~NetworkConfig]<~NetworkConfig> + network_config : typing.Sequence[~NetworkConfig] nonce : str tag : str - volume_attachments : typing.Mapping<~KT, +VT_co>[str, ~VolumeAttachmentInfo]<~VolumeAttachmentInfo> - volumes : typing.Sequence<+T_co>[~Volume]<~Volume> + volume_attachments : typing.Mapping[str, ~VolumeAttachmentInfo] + volumes : typing.Sequence[~Volume] ''' self.characteristics = HardwareCharacteristics.from_json(characteristics) if characteristics else None self.instance_id = instance_id @@ -3366,7 +4472,7 @@ class InstanceType(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] + arches : typing.Sequence[str] cost : int cpu_cores : int deprecated : bool @@ -3395,7 +4501,7 @@ class InstanceTypesResult(Type): cost_divisor : int cost_unit : str error : Error - instance_types : typing.Sequence<+T_co>[~InstanceType]<~InstanceType> + instance_types : typing.Sequence[~InstanceType] ''' self.cost_currency = cost_currency self.cost_divisor = cost_divisor @@ -3410,7 +4516,7 @@ class InstanceTypesResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~InstanceTypesResult]<~InstanceTypesResult> + results : typing.Sequence[~InstanceTypesResult] ''' self.results = [InstanceTypesResult.from_json(o) for o in results or []] @@ -3421,7 +4527,7 @@ class InstancesInfo(Type): _toPy = {'machines': 'machines'} def __init__(self, machines=None, **unknown_fields): ''' - machines : typing.Sequence<+T_co>[~InstanceInfo]<~InstanceInfo> + machines : typing.Sequence[~InstanceInfo] ''' self.machines = [InstanceInfo.from_json(o) for o in machines or []] @@ -3445,7 +4551,7 @@ class IntResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~IntResult]<~IntResult> + results : typing.Sequence[~IntResult] ''' self.results = [IntResult.from_json(o) for o in results or []] @@ -3464,6 +4570,17 @@ class InterfaceAddress(Type): +class InvalidateCredentialArg(Type): + _toSchema = {'reason': 'reason'} + _toPy = {'reason': 'reason'} + def __init__(self, reason=None, **unknown_fields): + ''' + reason : str + ''' + self.reason = reason + + + class IsMasterResult(Type): _toSchema = {'master': 'master'} _toPy = {'master': 'master'} @@ -3492,7 +4609,7 @@ class JobsResult(Type): def __init__(self, error=None, jobs=None, **unknown_fields): ''' error : Error - jobs : typing.Sequence<+T_co>[str] + jobs : typing.Sequence[str] ''' self.error = Error.from_json(error) if error else None self.jobs = jobs @@ -3504,70 +4621,380 @@ class JobsResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~JobsResult]<~JobsResult> + results : typing.Sequence[~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): +class KnownServiceArgs(Type): + _toSchema = {'known_services': 'known-services'} + _toPy = {'known-services': 'known_services'} + def __init__(self, known_services=None, **unknown_fields): ''' - error : Error - life : str + known_services : typing.Sequence[str] ''' - self.error = Error.from_json(error) if error else None - self.life = life + self.known_services = known_services -class LifeResults(Type): - _toSchema = {'results': 'results'} - _toPy = {'results': 'results'} - def __init__(self, results=None, **unknown_fields): +class KubernetesDeviceParams(Type): + _toSchema = {'attributes': 'Attributes', 'count': 'Count', 'type_': 'Type'} + _toPy = {'Attributes': 'attributes', 'Count': 'count', 'Type': 'type_'} + def __init__(self, attributes=None, count=None, type_=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~LifeResult]<~LifeResult> + attributes : typing.Mapping[str, str] + count : int + type_ : str ''' - self.results = [LifeResult.from_json(o) for o in results or []] + self.attributes = attributes + self.count = count + self.type_ = type_ -class ListCloudImageMetadataResult(Type): - _toSchema = {'result': 'result'} - _toPy = {'result': 'result'} - def __init__(self, result=None, **unknown_fields): +class KubernetesFilesystemAttachmentParams(Type): + _toSchema = {'mount_point': 'mount-point', 'provider': 'provider', 'read_only': 'read-only'} + _toPy = {'mount-point': 'mount_point', 'provider': 'provider', 'read-only': 'read_only'} + def __init__(self, mount_point=None, provider=None, read_only=None, **unknown_fields): ''' - result : typing.Sequence<+T_co>[~CloudImageMetadata]<~CloudImageMetadata> + mount_point : str + provider : str + read_only : bool ''' - self.result = [CloudImageMetadata.from_json(o) for o in result or []] + self.mount_point = mount_point + self.provider = provider + self.read_only = read_only -class ListImageResult(Type): - _toSchema = {'result': 'result'} - _toPy = {'result': 'result'} - def __init__(self, result=None, **unknown_fields): +class KubernetesFilesystemInfo(Type): + _toSchema = {'data': 'data', 'filesystem_id': 'filesystem-id', 'info': 'info', 'mount_point': 'mount-point', 'pool': 'pool', 'read_only': 'read-only', 'size': 'size', 'status': 'status', 'storagename': 'storagename', 'volume': 'volume'} + _toPy = {'data': 'data', 'filesystem-id': 'filesystem_id', 'info': 'info', 'mount-point': 'mount_point', 'pool': 'pool', 'read-only': 'read_only', 'size': 'size', 'status': 'status', 'storagename': 'storagename', 'volume': 'volume'} + def __init__(self, data=None, filesystem_id=None, info=None, mount_point=None, pool=None, read_only=None, size=None, status=None, storagename=None, volume=None, **unknown_fields): ''' - result : typing.Sequence<+T_co>[~ImageMetadata]<~ImageMetadata> + data : typing.Mapping[str, typing.Any] + filesystem_id : str + info : str + mount_point : str + pool : str + read_only : bool + size : int + status : str + storagename : str + volume : KubernetesVolumeInfo ''' - self.result = [ImageMetadata.from_json(o) for o in result or []] + self.data = data + self.filesystem_id = filesystem_id + self.info = info + self.mount_point = mount_point + self.pool = pool + self.read_only = read_only + self.size = size + self.status = status + self.storagename = storagename + self.volume = KubernetesVolumeInfo.from_json(volume) if volume else None -class ListResourcesArgs(Type): - _toSchema = {'entities': 'entities'} - _toPy = {'entities': 'entities'} - def __init__(self, entities=None, **unknown_fields): +class KubernetesFilesystemParams(Type): + _toSchema = {'attachment': 'attachment', 'attributes': 'attributes', 'provider': 'provider', 'size': 'size', 'storagename': 'storagename', 'tags': 'tags'} + _toPy = {'attachment': 'attachment', 'attributes': 'attributes', 'provider': 'provider', 'size': 'size', 'storagename': 'storagename', 'tags': 'tags'} + def __init__(self, attachment=None, attributes=None, provider=None, size=None, storagename=None, tags=None, **unknown_fields): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> + attachment : KubernetesFilesystemAttachmentParams + attributes : typing.Mapping[str, typing.Any] + provider : str + size : int + storagename : str + tags : typing.Mapping[str, str] ''' - self.entities = [Entity.from_json(o) for o in entities or []] + self.attachment = KubernetesFilesystemAttachmentParams.from_json(attachment) if attachment else None + self.attributes = attributes + self.provider = provider + self.size = size + self.storagename = storagename + self.tags = tags -class ListSSHKeys(Type): +class KubernetesProvisioningInfo(Type): + _toSchema = {'constraints': 'constraints', 'devices': 'devices', 'filesystems': 'filesystems', 'placement': 'placement', 'pod_spec': 'pod-spec', 'tags': 'tags', 'volumes': 'volumes'} + _toPy = {'constraints': 'constraints', 'devices': 'devices', 'filesystems': 'filesystems', 'placement': 'placement', 'pod-spec': 'pod_spec', 'tags': 'tags', 'volumes': 'volumes'} + def __init__(self, constraints=None, devices=None, filesystems=None, placement=None, pod_spec=None, tags=None, volumes=None, **unknown_fields): + ''' + constraints : Value + devices : typing.Sequence[~KubernetesDeviceParams] + filesystems : typing.Sequence[~KubernetesFilesystemParams] + placement : str + pod_spec : str + tags : typing.Mapping[str, str] + volumes : typing.Sequence[~KubernetesVolumeParams] + ''' + self.constraints = Value.from_json(constraints) if constraints else None + self.devices = [KubernetesDeviceParams.from_json(o) for o in devices or []] + self.filesystems = [KubernetesFilesystemParams.from_json(o) for o in filesystems or []] + self.placement = placement + self.pod_spec = pod_spec + self.tags = tags + self.volumes = [KubernetesVolumeParams.from_json(o) for o in volumes or []] + + + +class KubernetesProvisioningInfoResult(Type): + _toSchema = {'error': 'error', 'result': 'result'} + _toPy = {'error': 'error', 'result': 'result'} + def __init__(self, error=None, result=None, **unknown_fields): + ''' + error : Error + result : KubernetesProvisioningInfo + ''' + self.error = Error.from_json(error) if error else None + self.result = KubernetesProvisioningInfo.from_json(result) if result else None + + + +class KubernetesProvisioningInfoResults(Type): + _toSchema = {'results': 'results'} + _toPy = {'results': 'results'} + def __init__(self, results=None, **unknown_fields): + ''' + results : typing.Sequence[~KubernetesProvisioningInfoResult] + ''' + self.results = [KubernetesProvisioningInfoResult.from_json(o) for o in results or []] + + + +class KubernetesVolumeAttachmentParams(Type): + _toSchema = {'provider': 'provider', 'read_only': 'read-only'} + _toPy = {'provider': 'provider', 'read-only': 'read_only'} + def __init__(self, provider=None, read_only=None, **unknown_fields): + ''' + provider : str + read_only : bool + ''' + self.provider = provider + self.read_only = read_only + + + +class KubernetesVolumeInfo(Type): + _toSchema = {'data': 'data', 'info': 'info', 'persistent': 'persistent', 'pool': 'pool', 'size': 'size', 'status': 'status', 'volume_id': 'volume-id'} + _toPy = {'data': 'data', 'info': 'info', 'persistent': 'persistent', 'pool': 'pool', 'size': 'size', 'status': 'status', 'volume-id': 'volume_id'} + def __init__(self, data=None, info=None, persistent=None, pool=None, size=None, status=None, volume_id=None, **unknown_fields): + ''' + data : typing.Mapping[str, typing.Any] + info : str + persistent : bool + pool : str + size : int + status : str + volume_id : str + ''' + self.data = data + self.info = info + self.persistent = persistent + self.pool = pool + self.size = size + self.status = status + self.volume_id = volume_id + + + +class KubernetesVolumeParams(Type): + _toSchema = {'attachment': 'attachment', 'attributes': 'attributes', 'provider': 'provider', 'size': 'size', 'storagename': 'storagename', 'tags': 'tags'} + _toPy = {'attachment': 'attachment', 'attributes': 'attributes', 'provider': 'provider', 'size': 'size', 'storagename': 'storagename', 'tags': 'tags'} + def __init__(self, attachment=None, attributes=None, provider=None, size=None, storagename=None, tags=None, **unknown_fields): + ''' + attachment : KubernetesVolumeAttachmentParams + attributes : typing.Mapping[str, typing.Any] + provider : str + size : int + storagename : str + tags : typing.Mapping[str, str] + ''' + self.attachment = KubernetesVolumeAttachmentParams.from_json(attachment) if attachment else None + self.attributes = attributes + self.provider = provider + self.size = size + self.storagename = storagename + self.tags = tags + + + +class LXDProfile(Type): + _toSchema = {'config': 'config', 'description': 'description', 'devices': 'devices'} + _toPy = {'config': 'config', 'description': 'description', 'devices': 'devices'} + def __init__(self, config=None, description=None, devices=None, **unknown_fields): + ''' + config : typing.Mapping[str, str] + description : str + devices : typing.Mapping[str, typing.Any] + ''' + self.config = config + self.description = description + self.devices = devices + + + +class LXDProfileUpgradeMessages(Type): + _toSchema = {'application': 'application', 'watcher_id': 'watcher-id'} + _toPy = {'application': 'application', 'watcher-id': 'watcher_id'} + def __init__(self, application=None, watcher_id=None, **unknown_fields): + ''' + application : Entity + watcher_id : str + ''' + self.application = Entity.from_json(application) if application else None + self.watcher_id = watcher_id + + + +class LXDProfileUpgradeMessagesResult(Type): + _toSchema = {'error': 'error', 'message': 'message', 'unit_name': 'unit-name'} + _toPy = {'error': 'error', 'message': 'message', 'unit-name': 'unit_name'} + def __init__(self, error=None, message=None, unit_name=None, **unknown_fields): + ''' + error : Error + message : str + unit_name : str + ''' + self.error = Error.from_json(error) if error else None + self.message = message + self.unit_name = unit_name + + + +class LXDProfileUpgradeMessagesResults(Type): + _toSchema = {'args': 'args'} + _toPy = {'args': 'args'} + def __init__(self, args=None, **unknown_fields): + ''' + args : typing.Sequence[~LXDProfileUpgradeMessagesResult] + ''' + self.args = [LXDProfileUpgradeMessagesResult.from_json(o) for o in args 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[~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[~CloudImageMetadata] + ''' + self.result = [CloudImageMetadata.from_json(o) for o in result or []] + + + +class ListCloudInfo(Type): + _toSchema = {'clouddetails': 'CloudDetails', 'user_access': 'user-access'} + _toPy = {'CloudDetails': 'clouddetails', 'user-access': 'user_access'} + def __init__(self, clouddetails=None, user_access=None, **unknown_fields): + ''' + clouddetails : CloudDetails + user_access : str + ''' + self.clouddetails = CloudDetails.from_json(clouddetails) if clouddetails else None + self.user_access = user_access + + + +class ListCloudInfoResult(Type): + _toSchema = {'error': 'error', 'result': 'result'} + _toPy = {'error': 'error', 'result': 'result'} + def __init__(self, error=None, result=None, **unknown_fields): + ''' + error : Error + result : ListCloudInfo + ''' + self.error = Error.from_json(error) if error else None + self.result = ListCloudInfo.from_json(result) if result else None + + + +class ListCloudInfoResults(Type): + _toSchema = {'results': 'results'} + _toPy = {'results': 'results'} + def __init__(self, results=None, **unknown_fields): + ''' + results : typing.Sequence[~ListCloudInfoResult] + ''' + self.results = [ListCloudInfoResult.from_json(o) for o in results or []] + + + +class ListCloudsRequest(Type): + _toSchema = {'all_': 'all', 'user_tag': 'user-tag'} + _toPy = {'all': 'all_', 'user-tag': 'user_tag'} + def __init__(self, all_=None, user_tag=None, **unknown_fields): + ''' + all_ : bool + user_tag : str + ''' + self.all_ = all_ + self.user_tag = user_tag + + + +class ListFirewallRulesResults(Type): + _toSchema = {'rules': 'Rules'} + _toPy = {'Rules': 'rules'} + def __init__(self, rules=None, **unknown_fields): + ''' + rules : typing.Sequence[~FirewallRule] + ''' + self.rules = [FirewallRule.from_json(o) for o in rules or []] + + + +class ListImageResult(Type): + _toSchema = {'result': 'result'} + _toPy = {'result': 'result'} + def __init__(self, result=None, **unknown_fields): + ''' + result : typing.Sequence[~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[~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): @@ -3585,7 +5012,7 @@ class ListSpacesResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~Space]<~Space> + results : typing.Sequence[~Space] ''' self.results = [Space.from_json(o) for o in results or []] @@ -3596,7 +5023,7 @@ class ListSubnetsResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~Subnet]<~Subnet> + results : typing.Sequence[~Subnet] ''' self.results = [Subnet.from_json(o) for o in results or []] @@ -3607,7 +5034,7 @@ class ListUnitResourcesArgs(Type): _toPy = {'resource-names': 'resource_names'} def __init__(self, resource_names=None, **unknown_fields): ''' - resource_names : typing.Sequence<+T_co>[str] + resource_names : typing.Sequence[str] ''' self.resource_names = resource_names @@ -3618,7 +5045,7 @@ class LogForwardingGetLastSentParams(Type): _toPy = {'ids': 'ids'} def __init__(self, ids=None, **unknown_fields): ''' - ids : typing.Sequence<+T_co>[~LogForwardingID]<~LogForwardingID> + ids : typing.Sequence[~LogForwardingID] ''' self.ids = [LogForwardingID.from_json(o) for o in ids or []] @@ -3644,7 +5071,7 @@ class LogForwardingGetLastSentResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~LogForwardingGetLastSentResult]<~LogForwardingGetLastSentResult> + results : typing.Sequence[~LogForwardingGetLastSentResult] ''' self.results = [LogForwardingGetLastSentResult.from_json(o) for o in results or []] @@ -3683,7 +5110,7 @@ class LogForwardingSetLastSentParams(Type): _toPy = {'params': 'params'} def __init__(self, params=None, **unknown_fields): ''' - params : typing.Sequence<+T_co>[~LogForwardingSetLastSentParam]<~LogForwardingSetLastSentParam> + params : typing.Sequence[~LogForwardingSetLastSentParam] ''' self.params = [LogForwardingSetLastSentParam.from_json(o) for o in params or []] @@ -3707,7 +5134,7 @@ class LookUpArgs(Type): _toPy = {'args': 'args'} def __init__(self, args=None, **unknown_fields): ''' - args : typing.Sequence<+T_co>[~LookUpArg]<~LookUpArg> + args : typing.Sequence[~LookUpArg] ''' self.args = [LookUpArg.from_json(o) for o in args or []] @@ -3731,7 +5158,7 @@ class LookUpPayloadArgs(Type): _toPy = {'args': 'args'} def __init__(self, args=None, **unknown_fields): ''' - args : typing.Sequence<+T_co>[~LookUpPayloadArg]<~LookUpPayloadArg> + args : typing.Sequence[~LookUpPayloadArg] ''' self.args = [LookUpPayloadArg.from_json(o) for o in args or []] @@ -3748,12 +5175,36 @@ class Macaroon(Type): +class MacaroonResult(Type): + _toSchema = {'error': 'error', 'result': 'result'} + _toPy = {'error': 'error', 'result': 'result'} + def __init__(self, error=None, result=None, **unknown_fields): + ''' + error : Error + result : Macaroon + ''' + self.error = Error.from_json(error) if error else None + self.result = Macaroon.from_json(result) if result else None + + + +class MacaroonResults(Type): + _toSchema = {'results': 'results'} + _toPy = {'results': 'results'} + def __init__(self, results=None, **unknown_fields): + ''' + results : typing.Sequence[~MacaroonResult] + ''' + self.results = [MacaroonResult.from_json(o) for o in results or []] + + + 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> + addresses : typing.Sequence[~Address] tag : str ''' self.addresses = [Address.from_json(o) for o in addresses or []] @@ -3766,7 +5217,7 @@ class MachineAddressesResult(Type): _toPy = {'addresses': 'addresses', 'error': 'error'} def __init__(self, addresses=None, error=None, **unknown_fields): ''' - addresses : typing.Sequence<+T_co>[~Address]<~Address> + addresses : typing.Sequence[~Address] error : Error ''' self.addresses = [Address.from_json(o) for o in addresses or []] @@ -3779,7 +5230,7 @@ class MachineAddressesResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~MachineAddressesResult]<~MachineAddressesResult> + results : typing.Sequence[~MachineAddressesResult] ''' self.results = [MachineAddressesResult.from_json(o) for o in results or []] @@ -3790,7 +5241,7 @@ class MachineBlockDevices(Type): _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> + block_devices : typing.Sequence[~BlockDevice] machine : str ''' self.block_devices = [BlockDevice.from_json(o) for o in block_devices or []] @@ -3803,7 +5254,7 @@ class MachineContainers(Type): _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] + container_types : typing.Sequence[str] machine_tag : str ''' self.container_types = container_types @@ -3816,7 +5267,7 @@ class MachineContainersParams(Type): _toPy = {'params': 'params'} def __init__(self, params=None, **unknown_fields): ''' - params : typing.Sequence<+T_co>[~MachineContainers]<~MachineContainers> + params : typing.Sequence[~MachineContainers] ''' self.params = [MachineContainers.from_json(o) for o in params or []] @@ -3833,7 +5284,7 @@ class MachineHardware(Type): cpu_power : int mem : int root_disk : int - tags : typing.Sequence<+T_co>[str] + tags : typing.Sequence[str] ''' self.arch = arch self.availability_zone = availability_zone @@ -3851,7 +5302,7 @@ class MachineNetworkConfigResult(Type): def __init__(self, error=None, info=None, **unknown_fields): ''' error : Error - info : typing.Sequence<+T_co>[~NetworkConfig]<~NetworkConfig> + info : typing.Sequence[~NetworkConfig] ''' self.error = Error.from_json(error) if error else None self.info = [NetworkConfig.from_json(o) for o in info or []] @@ -3863,7 +5314,7 @@ class MachineNetworkConfigResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~MachineNetworkConfigResult]<~MachineNetworkConfigResult> + results : typing.Sequence[~MachineNetworkConfigResult] ''' self.results = [MachineNetworkConfigResult.from_json(o) for o in results or []] @@ -3902,7 +5353,7 @@ class MachinePortsParams(Type): _toPy = {'params': 'params'} def __init__(self, params=None, **unknown_fields): ''' - params : typing.Sequence<+T_co>[~MachinePorts]<~MachinePorts> + params : typing.Sequence[~MachinePorts] ''' self.params = [MachinePorts.from_json(o) for o in params or []] @@ -3914,7 +5365,7 @@ class MachinePortsResult(Type): def __init__(self, error=None, ports=None, **unknown_fields): ''' error : Error - ports : typing.Sequence<+T_co>[~MachinePortRange]<~MachinePortRange> + ports : typing.Sequence[~MachinePortRange] ''' self.error = Error.from_json(error) if error else None self.ports = [MachinePortRange.from_json(o) for o in ports or []] @@ -3926,7 +5377,7 @@ class MachinePortsResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~MachinePortsResult]<~MachinePortsResult> + results : typing.Sequence[~MachinePortsResult] ''' self.results = [MachinePortsResult.from_json(o) for o in results or []] @@ -3938,15 +5389,15 @@ class MachineStatus(Type): 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> + containers : typing.Mapping[str, ~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] + ip_addresses : typing.Sequence[str] + jobs : typing.Sequence[str] series : str wants_vote : bool ''' @@ -3983,7 +5434,7 @@ class MachineStorageIds(Type): _toPy = {'ids': 'ids'} def __init__(self, ids=None, **unknown_fields): ''' - ids : typing.Sequence<+T_co>[~MachineStorageId]<~MachineStorageId> + ids : typing.Sequence[~MachineStorageId] ''' self.ids = [MachineStorageId.from_json(o) for o in ids or []] @@ -3994,7 +5445,7 @@ class MachineStorageIdsWatchResult(Type): _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> + changes : typing.Sequence[~MachineStorageId] error : Error watcher_id : str ''' @@ -4009,7 +5460,7 @@ class MachineStorageIdsWatchResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~MachineStorageIdsWatchResult]<~MachineStorageIdsWatchResult> + results : typing.Sequence[~MachineStorageIdsWatchResult] ''' self.results = [MachineStorageIdsWatchResult.from_json(o) for o in results or []] @@ -4021,7 +5472,7 @@ class MapResult(Type): def __init__(self, error=None, result=None, **unknown_fields): ''' error : Error - result : typing.Mapping<~KT, +VT_co>[str, typing.Any] + result : typing.Mapping[str, typing.Any] ''' self.error = Error.from_json(error) if error else None self.result = result @@ -4033,7 +5484,7 @@ class MapResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~MapResult]<~MapResult> + results : typing.Sequence[~MapResult] ''' self.results = [MapResult.from_json(o) for o in results or []] @@ -4068,7 +5519,7 @@ class Member(Type): id_ : int priority : float slavedelay : int - tags : typing.Mapping<~KT, +VT_co>[str, str] + tags : typing.Mapping[str, str] votes : int ''' self.address = address @@ -4088,7 +5539,7 @@ class MergeLeadershipSettingsBulkParams(Type): _toPy = {'params': 'params'} def __init__(self, params=None, **unknown_fields): ''' - params : typing.Sequence<+T_co>[~MergeLeadershipSettingsParam]<~MergeLeadershipSettingsParam> + params : typing.Sequence[~MergeLeadershipSettingsParam] ''' self.params = [MergeLeadershipSettingsParam.from_json(o) for o in params or []] @@ -4100,7 +5551,7 @@ class MergeLeadershipSettingsParam(Type): def __init__(self, application_tag=None, settings=None, **unknown_fields): ''' application_tag : str - settings : typing.Mapping<~KT, +VT_co>[str, str] + settings : typing.Mapping[str, str] ''' self.application_tag = application_tag self.settings = settings @@ -4112,7 +5563,7 @@ class MetadataImageIds(Type): _toPy = {'image-ids': 'image_ids'} def __init__(self, image_ids=None, **unknown_fields): ''' - image_ids : typing.Sequence<+T_co>[str] + image_ids : typing.Sequence[str] ''' self.image_ids = image_ids @@ -4123,7 +5574,7 @@ class MetadataSaveParams(Type): _toPy = {'metadata': 'metadata'} def __init__(self, metadata=None, **unknown_fields): ''' - metadata : typing.Sequence<+T_co>[~CloudImageMetadataList]<~CloudImageMetadataList> + metadata : typing.Sequence[~CloudImageMetadataList] ''' self.metadata = [CloudImageMetadataList.from_json(o) for o in metadata or []] @@ -4162,7 +5613,7 @@ class MeterStatusParams(Type): _toPy = {'statues': 'statues'} def __init__(self, statues=None, **unknown_fields): ''' - statues : typing.Sequence<+T_co>[~MeterStatusParam]<~MeterStatusParam> + statues : typing.Sequence[~MeterStatusParam] ''' self.statues = [MeterStatusParam.from_json(o) for o in statues or []] @@ -4188,7 +5639,7 @@ class MeterStatusResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~MeterStatusResult]<~MeterStatusResult> + results : typing.Sequence[~MeterStatusResult] ''' self.results = [MeterStatusResult.from_json(o) for o in results or []] @@ -4216,7 +5667,7 @@ class MetricBatch(Type): ''' charm_url : str created : str - metrics : typing.Sequence<+T_co>[~Metric]<~Metric> + metrics : typing.Sequence[~Metric] uuid : str ''' self.charm_url = charm_url @@ -4244,7 +5695,7 @@ class MetricBatchParams(Type): _toPy = {'batches': 'batches'} def __init__(self, batches=None, **unknown_fields): ''' - batches : typing.Sequence<+T_co>[~MetricBatchParam]<~MetricBatchParam> + batches : typing.Sequence[~MetricBatchParam] ''' self.batches = [MetricBatchParam.from_json(o) for o in batches or []] @@ -4272,7 +5723,7 @@ class MetricResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~EntityMetrics]<~EntityMetrics> + results : typing.Sequence[~EntityMetrics] ''' self.results = [EntityMetrics.from_json(o) for o in results or []] @@ -4321,9 +5772,9 @@ class MigrationStatus(Type): external_control : bool migration_id : str phase : str - source_api_addrs : typing.Sequence<+T_co>[str] + source_api_addrs : typing.Sequence[str] source_ca_cert : str - target_api_addrs : typing.Sequence<+T_co>[str] + target_api_addrs : typing.Sequence[str] target_ca_cert : str ''' self.attempt = attempt @@ -4342,7 +5793,7 @@ class MigrationTargetInfo(Type): _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] + addrs : typing.Sequence[str] auth_tag : str ca_cert : str controller_tag : str @@ -4378,12 +5829,12 @@ class MinionReports(Type): _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] + failed : typing.Sequence[str] migration_id : str phase : str success_count : int unknown_count : int - unknown_sample : typing.Sequence<+T_co>[str] + unknown_sample : typing.Sequence[str] ''' self.failed = failed self.migration_id = migration_id @@ -4409,6 +5860,19 @@ class Model(Type): +class ModelAccess(Type): + _toSchema = {'access': 'access', 'model': 'model'} + _toPy = {'access': 'access', 'model': 'model'} + def __init__(self, access=None, model=None, **unknown_fields): + ''' + access : str + model : str + ''' + self.access = access + self.model = model + + + class ModelArgs(Type): _toSchema = {'model_tag': 'model-tag'} _toPy = {'model-tag': 'model_tag'} @@ -4425,7 +5889,7 @@ class ModelBlockInfo(Type): _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] + blocks : typing.Sequence[str] model_uuid : str name : str owner_tag : str @@ -4442,7 +5906,7 @@ class ModelBlockInfoList(Type): _toPy = {'models': 'models'} def __init__(self, models=None, **unknown_fields): ''' - models : typing.Sequence<+T_co>[~ModelBlockInfo]<~ModelBlockInfo> + models : typing.Sequence[~ModelBlockInfo] ''' self.models = [ModelBlockInfo.from_json(o) for o in models or []] @@ -4453,7 +5917,7 @@ class ModelConfigResult(Type): _toPy = {'config': 'config'} def __init__(self, config=None, **unknown_fields): ''' - config : typing.Mapping<~KT, +VT_co>[str, typing.Any] + config : typing.Mapping[str, typing.Any] ''' self.config = config @@ -4464,7 +5928,7 @@ class ModelConfigResults(Type): _toPy = {'config': 'config'} def __init__(self, config=None, **unknown_fields): ''' - config : typing.Mapping<~KT, +VT_co>[str, ~ConfigValue]<~ConfigValue> + config : typing.Mapping[str, ~ConfigValue] ''' self.config = config @@ -4476,7 +5940,7 @@ class ModelCreateArgs(Type): 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] + config : typing.Mapping[str, typing.Any] credential : str name : str owner_tag : str @@ -4491,6 +5955,23 @@ class ModelCreateArgs(Type): +class ModelCredential(Type): + _toSchema = {'credential_tag': 'credential-tag', 'exists': 'exists', 'model_tag': 'model-tag', 'valid': 'valid'} + _toPy = {'credential-tag': 'credential_tag', 'exists': 'exists', 'model-tag': 'model_tag', 'valid': 'valid'} + def __init__(self, credential_tag=None, exists=None, model_tag=None, valid=None, **unknown_fields): + ''' + credential_tag : str + exists : bool + model_tag : str + valid : bool + ''' + self.credential_tag = credential_tag + self.exists = exists + self.model_tag = model_tag + self.valid = valid + + + 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'} @@ -4498,7 +5979,7 @@ class ModelDefaultValues(Type): ''' cloud_region : str cloud_tag : str - config : typing.Mapping<~KT, +VT_co>[str, typing.Any] + config : typing.Mapping[str, typing.Any] ''' self.cloud_region = cloud_region self.cloud_tag = cloud_tag @@ -4511,9 +5992,9 @@ class ModelDefaults(Type): _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> + controller : typing.Mapping[str, typing.Any] + default : typing.Mapping[str, typing.Any] + regions : typing.Sequence[~RegionDefaults] ''' self.controller = controller self.default = default @@ -4526,16 +6007,48 @@ class ModelDefaultsResult(Type): _toPy = {'config': 'config'} def __init__(self, config=None, **unknown_fields): ''' - config : typing.Mapping<~KT, +VT_co>[str, ~ModelDefaults]<~ModelDefaults> + config : typing.Mapping[str, ~ModelDefaults] ''' self.config = config +class ModelEntityCount(Type): + _toSchema = {'count': 'count', 'entity': 'entity'} + _toPy = {'count': 'count', 'entity': 'entity'} + def __init__(self, count=None, entity=None, **unknown_fields): + ''' + count : int + entity : str + ''' + self.count = count + self.entity = entity + + + +class ModelFilesystemInfo(Type): + _toSchema = {'detachable': 'detachable', 'id_': 'id', 'message': 'message', 'provider_id': 'provider-id', 'status': 'status'} + _toPy = {'detachable': 'detachable', 'id': 'id_', 'message': 'message', 'provider-id': 'provider_id', 'status': 'status'} + def __init__(self, detachable=None, id_=None, message=None, provider_id=None, status=None, **unknown_fields): + ''' + detachable : bool + id_ : str + message : str + provider_id : str + status : str + ''' + self.detachable = detachable + self.id_ = id_ + self.message = message + self.provider_id = provider_id + self.status = status + + + 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): + _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', 'type_': 'type', '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', 'type': 'type_', '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, type_=None, users=None, uuid=None, **unknown_fields): ''' agent_version : Number cloud_credential_tag : str @@ -4544,14 +6057,15 @@ class ModelInfo(Type): controller_uuid : str default_series : str life : str - machines : typing.Sequence<+T_co>[~ModelMachineInfo]<~ModelMachineInfo> + machines : typing.Sequence[~ModelMachineInfo] migration : ModelMigrationStatus name : str owner_tag : str provider_type : str sla : ModelSLAInfo status : EntityStatus - users : typing.Sequence<+T_co>[~ModelUserInfo]<~ModelUserInfo> + type_ : str + users : typing.Sequence[~ModelUserInfo] uuid : str ''' self.agent_version = Number.from_json(agent_version) if agent_version else None @@ -4568,6 +6082,7 @@ class ModelInfo(Type): 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.type_ = type_ self.users = [ModelUserInfo.from_json(o) for o in users or []] self.uuid = uuid @@ -4591,7 +6106,7 @@ class ModelInfoResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~ModelInfoResult]<~ModelInfoResult> + results : typing.Sequence[~ModelInfoResult] ''' self.results = [ModelInfoResult.from_json(o) for o in results or []] @@ -4613,7 +6128,7 @@ class ModelInstanceTypesConstraints(Type): _toPy = {'constraints': 'constraints'} def __init__(self, constraints=None, **unknown_fields): ''' - constraints : typing.Sequence<+T_co>[~ModelInstanceTypesConstraint]<~ModelInstanceTypesConstraint> + constraints : typing.Sequence[~ModelInstanceTypesConstraint] ''' self.constraints = [ModelInstanceTypesConstraint.from_json(o) for o in constraints or []] @@ -4675,7 +6190,7 @@ class ModelSLA(Type): _toPy = {'creds': 'creds', 'level': 'level'} def __init__(self, creds=None, level=None, **unknown_fields): ''' - creds : typing.Sequence<+T_co>[int] + creds : typing.Sequence[int] level : str ''' self.creds = creds @@ -4696,12 +6211,23 @@ class ModelSLAInfo(Type): +class ModelSequencesResult(Type): + _toSchema = {'sequences': 'sequences'} + _toPy = {'sequences': 'sequences'} + def __init__(self, sequences=None, **unknown_fields): + ''' + sequences : typing.Mapping[str, int] + ''' + self.sequences = sequences + + + 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] + config : typing.Mapping[str, typing.Any] ''' self.config = config @@ -4715,7 +6241,7 @@ class ModelStatus(Type): application_count : int hosted_machine_count : int life : str - machines : typing.Sequence<+T_co>[~ModelMachineInfo]<~ModelMachineInfo> + machines : typing.Sequence[~ModelMachineInfo] model_tag : str owner_tag : str ''' @@ -4729,9 +6255,9 @@ class ModelStatus(Type): 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): + _toSchema = {'available_version': 'available-version', 'cloud_tag': 'cloud-tag', 'meter_status': 'meter-status', 'model_status': 'model-status', 'name': 'name', 'region': 'region', 'sla': 'sla', 'type_': 'type', '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', 'type': 'type_', 'version': 'version'} + def __init__(self, available_version=None, cloud_tag=None, meter_status=None, model_status=None, name=None, region=None, sla=None, type_=None, version=None, **unknown_fields): ''' available_version : str cloud_tag : str @@ -4740,6 +6266,7 @@ class ModelStatusInfo(Type): name : str region : str sla : str + type_ : str version : str ''' self.available_version = available_version @@ -4749,6 +6276,7 @@ class ModelStatusInfo(Type): self.name = name self.region = region self.sla = sla + self.type_ = type_ self.version = version @@ -4758,12 +6286,94 @@ class ModelStatusResults(Type): _toPy = {'models': 'models'} def __init__(self, models=None, **unknown_fields): ''' - models : typing.Sequence<+T_co>[~ModelStatus]<~ModelStatus> + models : typing.Sequence[~ModelStatus] ''' self.models = [ModelStatus.from_json(o) for o in models or []] +class ModelSummariesRequest(Type): + _toSchema = {'all_': 'all', 'user_tag': 'user-tag'} + _toPy = {'all': 'all_', 'user-tag': 'user_tag'} + def __init__(self, all_=None, user_tag=None, **unknown_fields): + ''' + all_ : bool + user_tag : str + ''' + self.all_ = all_ + self.user_tag = user_tag + + + +class ModelSummary(Type): + _toSchema = {'agent_version': 'agent-version', 'cloud_credential_tag': 'cloud-credential-tag', 'cloud_region': 'cloud-region', 'cloud_tag': 'cloud-tag', 'controller_uuid': 'controller-uuid', 'counts': 'counts', 'default_series': 'default-series', 'last_connection': 'last-connection', 'life': 'life', 'migration': 'migration', 'name': 'name', 'owner_tag': 'owner-tag', 'provider_type': 'provider-type', 'sla': 'sla', 'status': 'status', 'type_': 'type', 'user_access': 'user-access', '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', 'counts': 'counts', 'default-series': 'default_series', 'last-connection': 'last_connection', 'life': 'life', 'migration': 'migration', 'name': 'name', 'owner-tag': 'owner_tag', 'provider-type': 'provider_type', 'sla': 'sla', 'status': 'status', 'type': 'type_', 'user-access': 'user_access', 'uuid': 'uuid'} + def __init__(self, agent_version=None, cloud_credential_tag=None, cloud_region=None, cloud_tag=None, controller_uuid=None, counts=None, default_series=None, last_connection=None, life=None, migration=None, name=None, owner_tag=None, provider_type=None, sla=None, status=None, type_=None, user_access=None, uuid=None, **unknown_fields): + ''' + agent_version : Number + cloud_credential_tag : str + cloud_region : str + cloud_tag : str + controller_uuid : str + counts : typing.Sequence[~ModelEntityCount] + default_series : str + last_connection : str + life : str + migration : ModelMigrationStatus + name : str + owner_tag : str + provider_type : str + sla : ModelSLAInfo + status : EntityStatus + type_ : str + user_access : str + 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.counts = [ModelEntityCount.from_json(o) for o in counts or []] + self.default_series = default_series + self.last_connection = last_connection + self.life = life + 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.type_ = type_ + self.user_access = user_access + self.uuid = uuid + + + +class ModelSummaryResult(Type): + _toSchema = {'error': 'error', 'result': 'result'} + _toPy = {'error': 'error', 'result': 'result'} + def __init__(self, error=None, result=None, **unknown_fields): + ''' + error : Error + result : ModelSummary + ''' + self.error = Error.from_json(error) if error else None + self.result = ModelSummary.from_json(result) if result else None + + + +class ModelSummaryResults(Type): + _toSchema = {'results': 'results'} + _toPy = {'results': 'results'} + def __init__(self, results=None, **unknown_fields): + ''' + results : typing.Sequence[~ModelSummaryResult] + ''' + self.results = [ModelSummaryResult.from_json(o) for o in results or []] + + + class ModelTag(Type): _toSchema = {} _toPy = {} @@ -4780,7 +6390,7 @@ class ModelUnset(Type): _toPy = {'keys': 'keys'} def __init__(self, keys=None, **unknown_fields): ''' - keys : typing.Sequence<+T_co>[str] + keys : typing.Sequence[str] ''' self.keys = keys @@ -4793,7 +6403,7 @@ class ModelUnsetKeys(Type): ''' cloud_region : str cloud_tag : str - keys : typing.Sequence<+T_co>[str] + keys : typing.Sequence[str] ''' self.cloud_region = cloud_region self.cloud_tag = cloud_tag @@ -4836,12 +6446,59 @@ class ModelUserInfoResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~ModelUserInfoResult]<~ModelUserInfoResult> + results : typing.Sequence[~ModelUserInfoResult] ''' self.results = [ModelUserInfoResult.from_json(o) for o in results or []] +class ModelVolumeInfo(Type): + _toSchema = {'detachable': 'detachable', 'id_': 'id', 'message': 'message', 'provider_id': 'provider-id', 'status': 'status'} + _toPy = {'detachable': 'detachable', 'id': 'id_', 'message': 'message', 'provider-id': 'provider_id', 'status': 'status'} + def __init__(self, detachable=None, id_=None, message=None, provider_id=None, status=None, **unknown_fields): + ''' + detachable : bool + id_ : str + message : str + provider_id : str + status : str + ''' + self.detachable = detachable + self.id_ = id_ + self.message = message + self.provider_id = provider_id + self.status = status + + + +class ModifyCloudAccess(Type): + _toSchema = {'access': 'access', 'action': 'action', 'cloud_tag': 'cloud-tag', 'user_tag': 'user-tag'} + _toPy = {'access': 'access', 'action': 'action', 'cloud-tag': 'cloud_tag', 'user-tag': 'user_tag'} + def __init__(self, access=None, action=None, cloud_tag=None, user_tag=None, **unknown_fields): + ''' + access : str + action : str + cloud_tag : str + user_tag : str + ''' + self.access = access + self.action = action + self.cloud_tag = cloud_tag + self.user_tag = user_tag + + + +class ModifyCloudAccessRequest(Type): + _toSchema = {'changes': 'changes'} + _toPy = {'changes': 'changes'} + def __init__(self, changes=None, **unknown_fields): + ''' + changes : typing.Sequence[~ModifyCloudAccess] + ''' + self.changes = [ModifyCloudAccess.from_json(o) for o in changes or []] + + + class ModifyControllerAccess(Type): _toSchema = {'access': 'access', 'action': 'action', 'user_tag': 'user-tag'} _toPy = {'access': 'access', 'action': 'action', 'user-tag': 'user_tag'} @@ -4862,7 +6519,7 @@ class ModifyControllerAccessRequest(Type): _toPy = {'changes': 'changes'} def __init__(self, changes=None, **unknown_fields): ''' - changes : typing.Sequence<+T_co>[~ModifyControllerAccess]<~ModifyControllerAccess> + changes : typing.Sequence[~ModifyControllerAccess] ''' self.changes = [ModifyControllerAccess.from_json(o) for o in changes or []] @@ -4890,18 +6547,46 @@ class ModifyModelAccessRequest(Type): _toPy = {'changes': 'changes'} def __init__(self, changes=None, **unknown_fields): ''' - changes : typing.Sequence<+T_co>[~ModifyModelAccess]<~ModifyModelAccess> + changes : typing.Sequence[~ModifyModelAccess] ''' self.changes = [ModifyModelAccess.from_json(o) for o in changes or []] +class ModifyOfferAccess(Type): + _toSchema = {'access': 'access', 'action': 'action', 'offer_url': 'offer-url', 'user_tag': 'user-tag'} + _toPy = {'access': 'access', 'action': 'action', 'offer-url': 'offer_url', 'user-tag': 'user_tag'} + def __init__(self, access=None, action=None, offer_url=None, user_tag=None, **unknown_fields): + ''' + access : str + action : str + offer_url : str + user_tag : str + ''' + self.access = access + self.action = action + self.offer_url = offer_url + self.user_tag = user_tag + + + +class ModifyOfferAccessRequest(Type): + _toSchema = {'changes': 'changes'} + _toPy = {'changes': 'changes'} + def __init__(self, changes=None, **unknown_fields): + ''' + changes : typing.Sequence[~ModifyOfferAccess] + ''' + self.changes = [ModifyOfferAccess.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] + ssh_keys : typing.Sequence[str] user : str ''' self.ssh_keys = ssh_keys @@ -4914,9 +6599,9 @@ class MongoUpgradeResults(Type): _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> + ha_members : typing.Sequence[~HAMember] master : HAMember - rs_members : typing.Sequence<+T_co>[~Member]<~Member> + rs_members : typing.Sequence[~Member] ''' self.ha_members = [HAMember.from_json(o) for o in ha_members or []] self.master = HAMember.from_json(master) if master else None @@ -4951,8 +6636,8 @@ class NetworkConfig(Type): config_type : str device_index : int disabled : bool - dns_search_domains : typing.Sequence<+T_co>[str] - dns_servers : typing.Sequence<+T_co>[str] + dns_search_domains : typing.Sequence[str] + dns_servers : typing.Sequence[str] gateway_address : str interface_name : str interface_type : str @@ -4995,7 +6680,7 @@ class NetworkInfo(Type): _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> + addresses : typing.Sequence[~InterfaceAddress] interface_name : str mac_address : str ''' @@ -5010,7 +6695,7 @@ class NetworkInfoParams(Type): _toPy = {'bindings': 'bindings', 'unit': 'unit'} def __init__(self, bindings=None, unit=None, **unknown_fields): ''' - bindings : typing.Sequence<+T_co>[str] + bindings : typing.Sequence[str] unit : str ''' self.bindings = bindings @@ -5024,7 +6709,7 @@ class NetworkInfoResult(Type): def __init__(self, error=None, network_info=None, **unknown_fields): ''' error : Error - network_info : typing.Sequence<+T_co>[~NetworkInfo]<~NetworkInfo> + network_info : typing.Sequence[~NetworkInfo] ''' self.error = Error.from_json(error) if error else None self.network_info = [NetworkInfo.from_json(o) for o in network_info or []] @@ -5036,7 +6721,7 @@ class NetworkInfoResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Mapping<~KT, +VT_co>[str, ~NetworkInfoResult]<~NetworkInfoResult> + results : typing.Mapping[str, ~NetworkInfoResult] ''' self.results = results @@ -5047,9 +6732,9 @@ class NetworkInterface(Type): _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] + dns_nameservers : typing.Sequence[str] gateway : str - ip_addresses : typing.Sequence<+T_co>[str] + ip_addresses : typing.Sequence[str] is_up : bool mac_address : str space : str @@ -5096,7 +6781,7 @@ class NotifyWatchResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~NotifyWatchResult]<~NotifyWatchResult> + results : typing.Sequence[~NotifyWatchResult] ''' self.results = [NotifyWatchResult.from_json(o) for o in results or []] @@ -5121,6 +6806,173 @@ class Number(Type): +class OfferArg(Type): + _toSchema = {'macaroons': 'macaroons', 'offer_uuid': 'offer-uuid'} + _toPy = {'macaroons': 'macaroons', 'offer-uuid': 'offer_uuid'} + def __init__(self, macaroons=None, offer_uuid=None, **unknown_fields): + ''' + macaroons : typing.Sequence[~Macaroon] + offer_uuid : str + ''' + self.macaroons = [Macaroon.from_json(o) for o in macaroons or []] + self.offer_uuid = offer_uuid + + + +class OfferArgs(Type): + _toSchema = {'args': 'args'} + _toPy = {'args': 'args'} + def __init__(self, args=None, **unknown_fields): + ''' + args : typing.Sequence[~OfferArg] + ''' + self.args = [OfferArg.from_json(o) for o in args or []] + + + +class OfferConnection(Type): + _toSchema = {'endpoint': 'endpoint', 'ingress_subnets': 'ingress-subnets', 'relation_id': 'relation-id', 'source_model_tag': 'source-model-tag', 'status': 'status', 'username': 'username'} + _toPy = {'endpoint': 'endpoint', 'ingress-subnets': 'ingress_subnets', 'relation-id': 'relation_id', 'source-model-tag': 'source_model_tag', 'status': 'status', 'username': 'username'} + def __init__(self, endpoint=None, ingress_subnets=None, relation_id=None, source_model_tag=None, status=None, username=None, **unknown_fields): + ''' + endpoint : str + ingress_subnets : typing.Sequence[str] + relation_id : int + source_model_tag : str + status : EntityStatus + username : str + ''' + self.endpoint = endpoint + self.ingress_subnets = ingress_subnets + self.relation_id = relation_id + self.source_model_tag = source_model_tag + self.status = EntityStatus.from_json(status) if status else None + self.username = username + + + +class OfferFilter(Type): + _toSchema = {'allowed_users': 'allowed-users', 'application_description': 'application-description', 'application_name': 'application-name', 'application_user': 'application-user', 'connected_users': 'connected-users', 'endpoints': 'endpoints', 'model_name': 'model-name', 'offer_name': 'offer-name', 'owner_name': 'owner-name'} + _toPy = {'allowed-users': 'allowed_users', 'application-description': 'application_description', 'application-name': 'application_name', 'application-user': 'application_user', 'connected-users': 'connected_users', 'endpoints': 'endpoints', 'model-name': 'model_name', 'offer-name': 'offer_name', 'owner-name': 'owner_name'} + def __init__(self, allowed_users=None, application_description=None, application_name=None, application_user=None, connected_users=None, endpoints=None, model_name=None, offer_name=None, owner_name=None, **unknown_fields): + ''' + allowed_users : typing.Sequence[str] + application_description : str + application_name : str + application_user : str + connected_users : typing.Sequence[str] + endpoints : typing.Sequence[~EndpointFilterAttributes] + model_name : str + offer_name : str + owner_name : str + ''' + self.allowed_users = allowed_users + self.application_description = application_description + self.application_name = application_name + self.application_user = application_user + self.connected_users = connected_users + self.endpoints = [EndpointFilterAttributes.from_json(o) for o in endpoints or []] + self.model_name = model_name + self.offer_name = offer_name + self.owner_name = owner_name + + + +class OfferFilters(Type): + _toSchema = {'filters': 'Filters'} + _toPy = {'Filters': 'filters'} + def __init__(self, filters=None, **unknown_fields): + ''' + filters : typing.Sequence[~OfferFilter] + ''' + self.filters = [OfferFilter.from_json(o) for o in filters or []] + + + +class OfferStatusChange(Type): + _toSchema = {'offer_name': 'offer-name', 'status': 'status'} + _toPy = {'offer-name': 'offer_name', 'status': 'status'} + def __init__(self, offer_name=None, status=None, **unknown_fields): + ''' + offer_name : str + status : EntityStatus + ''' + self.offer_name = offer_name + self.status = EntityStatus.from_json(status) if status else None + + + +class OfferStatusWatchResult(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[~OfferStatusChange] + error : Error + watcher_id : str + ''' + self.changes = [OfferStatusChange.from_json(o) for o in changes or []] + self.error = Error.from_json(error) if error else None + self.watcher_id = watcher_id + + + +class OfferStatusWatchResults(Type): + _toSchema = {'results': 'results'} + _toPy = {'results': 'results'} + def __init__(self, results=None, **unknown_fields): + ''' + results : typing.Sequence[~OfferStatusWatchResult] + ''' + self.results = [OfferStatusWatchResult.from_json(o) for o in results or []] + + + +class OfferURLs(Type): + _toSchema = {'offer_urls': 'offer-urls'} + _toPy = {'offer-urls': 'offer_urls'} + def __init__(self, offer_urls=None, **unknown_fields): + ''' + offer_urls : typing.Sequence[str] + ''' + self.offer_urls = offer_urls + + + +class OfferUserDetails(Type): + _toSchema = {'access': 'access', 'display_name': 'display-name', 'user': 'user'} + _toPy = {'access': 'access', 'display-name': 'display_name', 'user': 'user'} + def __init__(self, access=None, display_name=None, user=None, **unknown_fields): + ''' + access : str + display_name : str + user : str + ''' + self.access = access + self.display_name = display_name + self.user = user + + + +class OperatorProvisioningInfo(Type): + _toSchema = {'api_addresses': 'api-addresses', 'charm_storage': 'charm-storage', 'image_path': 'image-path', 'tags': 'tags', 'version': 'version'} + _toPy = {'api-addresses': 'api_addresses', 'charm-storage': 'charm_storage', 'image-path': 'image_path', 'tags': 'tags', 'version': 'version'} + def __init__(self, api_addresses=None, charm_storage=None, image_path=None, tags=None, version=None, **unknown_fields): + ''' + api_addresses : typing.Sequence[str] + charm_storage : KubernetesFilesystemParams + image_path : str + tags : typing.Mapping[str, str] + version : Number + ''' + self.api_addresses = api_addresses + self.charm_storage = KubernetesFilesystemParams.from_json(charm_storage) if charm_storage else None + self.image_path = image_path + self.tags = tags + self.version = Number.from_json(version) if version else None + + + 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'} @@ -5128,7 +6980,7 @@ class Payload(Type): ''' class_ : str id_ : str - labels : typing.Sequence<+T_co>[str] + labels : typing.Sequence[str] machine : str status : str type_ : str @@ -5149,7 +7001,7 @@ class PayloadListArgs(Type): _toPy = {'patterns': 'patterns'} def __init__(self, patterns=None, **unknown_fields): ''' - patterns : typing.Sequence<+T_co>[str] + patterns : typing.Sequence[str] ''' self.patterns = patterns @@ -5160,7 +7012,7 @@ class PayloadListResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~Payload]<~Payload> + results : typing.Sequence[~Payload] ''' self.results = [Payload.from_json(o) for o in results or []] @@ -5188,7 +7040,7 @@ class PayloadResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~PayloadResult]<~PayloadResult> + results : typing.Sequence[~PayloadResult] ''' self.results = [PayloadResult.from_json(o) for o in results or []] @@ -5212,12 +7064,47 @@ class PhaseResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~PhaseResult]<~PhaseResult> + results : typing.Sequence[~PhaseResult] ''' self.results = [PhaseResult.from_json(o) for o in results or []] +class PinApplicationResult(Type): + _toSchema = {'application_name': 'application-name', 'error': 'error'} + _toPy = {'application-name': 'application_name', 'error': 'error'} + def __init__(self, application_name=None, error=None, **unknown_fields): + ''' + application_name : str + error : Error + ''' + self.application_name = application_name + self.error = Error.from_json(error) if error else None + + + +class PinApplicationsResults(Type): + _toSchema = {'results': 'results'} + _toPy = {'results': 'results'} + def __init__(self, results=None, **unknown_fields): + ''' + results : typing.Sequence[~PinApplicationResult] + ''' + self.results = [PinApplicationResult.from_json(o) for o in results or []] + + + +class PinnedLeadershipResult(Type): + _toSchema = {'result': 'result'} + _toPy = {'result': 'result'} + def __init__(self, result=None, **unknown_fields): + ''' + result : typing.Sequence[str] + ''' + self.result = result + + + class Placement(Type): _toSchema = {'directive': 'directive', 'scope': 'scope'} _toPy = {'directive': 'directive', 'scope': 'scope'} @@ -5268,6 +7155,36 @@ class PrivateAddressResults(Type): +class ProfileChangeResult(Type): + _toSchema = {'error': 'error', 'new_profile_name': 'new-profile-name', 'old_profile_name': 'old-profile-name', 'profile': 'profile', 'subordinate': 'subordinate'} + _toPy = {'error': 'error', 'new-profile-name': 'new_profile_name', 'old-profile-name': 'old_profile_name', 'profile': 'profile', 'subordinate': 'subordinate'} + def __init__(self, error=None, new_profile_name=None, old_profile_name=None, profile=None, subordinate=None, **unknown_fields): + ''' + error : Error + new_profile_name : str + old_profile_name : str + profile : CharmLXDProfile + subordinate : bool + ''' + self.error = Error.from_json(error) if error else None + self.new_profile_name = new_profile_name + self.old_profile_name = old_profile_name + self.profile = CharmLXDProfile.from_json(profile) if profile else None + self.subordinate = subordinate + + + +class ProfileChangeResults(Type): + _toSchema = {'results': 'results'} + _toPy = {'results': 'results'} + def __init__(self, results=None, **unknown_fields): + ''' + results : typing.Sequence[~ProfileChangeResult] + ''' + self.results = [ProfileChangeResult.from_json(o) for o in results or []] + + + 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'} @@ -5289,7 +7206,7 @@ class ProviderInterfaceInfoResult(Type): def __init__(self, error=None, interfaces=None, machine_tag=None, **unknown_fields): ''' error : Error - interfaces : typing.Sequence<+T_co>[~ProviderInterfaceInfo]<~ProviderInterfaceInfo> + interfaces : typing.Sequence[~ProviderInterfaceInfo] machine_tag : str ''' self.error = Error.from_json(error) if error else None @@ -5303,7 +7220,7 @@ class ProviderInterfaceInfoResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~ProviderInterfaceInfoResult]<~ProviderInterfaceInfoResult> + results : typing.Sequence[~ProviderInterfaceInfoResult] ''' self.results = [ProviderInterfaceInfoResult.from_json(o) for o in results or []] @@ -5317,7 +7234,7 @@ class ProviderSpace(Type): error : Error name : str provider_id : str - subnets : typing.Sequence<+T_co>[~Subnet]<~Subnet> + subnets : typing.Sequence[~Subnet] ''' self.error = Error.from_json(error) if error else None self.name = name @@ -5332,15 +7249,15 @@ class ProvisioningInfo(Type): 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] + controller_config : typing.Mapping[str, typing.Any] + endpoint_bindings : typing.Mapping[str, str] + image_metadata : typing.Sequence[~CloudImageMetadata] + jobs : typing.Sequence[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> + subnets_to_zones : typing.Sequence[str] + tags : typing.Mapping[str, str] + volumes : typing.Sequence[~VolumeParams] ''' self.constraints = Value.from_json(constraints) if constraints else None self.controller_config = controller_config @@ -5373,7 +7290,7 @@ class ProvisioningInfoResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~ProvisioningInfoResult]<~ProvisioningInfoResult> + results : typing.Sequence[~ProvisioningInfoResult] ''' self.results = [ProvisioningInfoResult.from_json(o) for o in results or []] @@ -5444,7 +7361,7 @@ class ProxyConfigResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~ProxyConfigResult]<~ProxyConfigResult> + results : typing.Sequence[~ProxyConfigResult] ''' self.results = [ProxyConfigResult.from_json(o) for o in results or []] @@ -5472,6 +7389,17 @@ class PublicAddressResults(Type): +class QueryApplicationOffersResults(Type): + _toSchema = {'results': 'results'} + _toPy = {'results': 'results'} + def __init__(self, results=None, **unknown_fields): + ''' + results : typing.Sequence[~ApplicationOfferAdminDetails] + ''' + self.results = [ApplicationOfferAdminDetails.from_json(o) for o in results or []] + + + class RebootActionResult(Type): _toSchema = {'error': 'error', 'result': 'result'} _toPy = {'error': 'error', 'result': 'result'} @@ -5490,7 +7418,7 @@ class RebootActionResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~RebootActionResult]<~RebootActionResult> + results : typing.Sequence[~RebootActionResult] ''' self.results = [RebootActionResult.from_json(o) for o in results or []] @@ -5502,20 +7430,80 @@ class RegionDefaults(Type): def __init__(self, region_name=None, value=None, **unknown_fields): ''' region_name : str - value : typing.Mapping<~KT, +VT_co>[str, typing.Any] + value : typing.Mapping[str, typing.Any] ''' self.region_name = region_name self.value = value +class RegisterRemoteRelationArg(Type): + _toSchema = {'application_token': 'application-token', 'local_endpoint_name': 'local-endpoint-name', 'macaroons': 'macaroons', 'offer_uuid': 'offer-uuid', 'relation_token': 'relation-token', 'remote_endpoint': 'remote-endpoint', 'remote_space': 'remote-space', 'source_model_tag': 'source-model-tag'} + _toPy = {'application-token': 'application_token', 'local-endpoint-name': 'local_endpoint_name', 'macaroons': 'macaroons', 'offer-uuid': 'offer_uuid', 'relation-token': 'relation_token', 'remote-endpoint': 'remote_endpoint', 'remote-space': 'remote_space', 'source-model-tag': 'source_model_tag'} + def __init__(self, application_token=None, local_endpoint_name=None, macaroons=None, offer_uuid=None, relation_token=None, remote_endpoint=None, remote_space=None, source_model_tag=None, **unknown_fields): + ''' + application_token : str + local_endpoint_name : str + macaroons : typing.Sequence[~Macaroon] + offer_uuid : str + relation_token : str + remote_endpoint : RemoteEndpoint + remote_space : RemoteSpace + source_model_tag : str + ''' + self.application_token = application_token + self.local_endpoint_name = local_endpoint_name + self.macaroons = [Macaroon.from_json(o) for o in macaroons or []] + self.offer_uuid = offer_uuid + self.relation_token = relation_token + self.remote_endpoint = RemoteEndpoint.from_json(remote_endpoint) if remote_endpoint else None + self.remote_space = RemoteSpace.from_json(remote_space) if remote_space else None + self.source_model_tag = source_model_tag + + + +class RegisterRemoteRelationArgs(Type): + _toSchema = {'relations': 'relations'} + _toPy = {'relations': 'relations'} + def __init__(self, relations=None, **unknown_fields): + ''' + relations : typing.Sequence[~RegisterRemoteRelationArg] + ''' + self.relations = [RegisterRemoteRelationArg.from_json(o) for o in relations or []] + + + +class RegisterRemoteRelationResult(Type): + _toSchema = {'error': 'error', 'result': 'result'} + _toPy = {'error': 'error', 'result': 'result'} + def __init__(self, error=None, result=None, **unknown_fields): + ''' + error : Error + result : RemoteRelationDetails + ''' + self.error = Error.from_json(error) if error else None + self.result = RemoteRelationDetails.from_json(result) if result else None + + + +class RegisterRemoteRelationResults(Type): + _toSchema = {'results': 'results'} + _toPy = {'results': 'results'} + def __init__(self, results=None, **unknown_fields): + ''' + results : typing.Sequence[~RegisterRemoteRelationResult] + ''' + self.results = [RegisterRemoteRelationResult.from_json(o) for o in results or []] + + + 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] + changedunits : typing.Mapping[str, ~RelationUnitChange] + departedunits : typing.Sequence[str] id_ : int life : str ''' @@ -5531,12 +7519,44 @@ class RelationIds(Type): _toPy = {'relation-ids': 'relation_ids'} def __init__(self, relation_ids=None, **unknown_fields): ''' - relation_ids : typing.Sequence<+T_co>[int] + relation_ids : typing.Sequence[int] ''' self.relation_ids = relation_ids +class RelationLifeSuspendedStatusChange(Type): + _toSchema = {'key': 'key', 'life': 'life', 'suspended': 'suspended', 'suspended_reason': 'suspended-reason'} + _toPy = {'key': 'key', 'life': 'life', 'suspended': 'suspended', 'suspended-reason': 'suspended_reason'} + def __init__(self, key=None, life=None, suspended=None, suspended_reason=None, **unknown_fields): + ''' + key : str + life : str + suspended : bool + suspended_reason : str + ''' + self.key = key + self.life = life + self.suspended = suspended + self.suspended_reason = suspended_reason + + + +class RelationLifeSuspendedStatusWatchResult(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[~RelationLifeSuspendedStatusChange] + error : Error + watcher_id : str + ''' + self.changes = [RelationLifeSuspendedStatusChange.from_json(o) for o in changes or []] + self.error = Error.from_json(error) if error else None + self.watcher_id = watcher_id + + + 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'} @@ -5561,7 +7581,7 @@ class RelationResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~RelationResult]<~RelationResult> + results : typing.Sequence[~RelationResult] ''' self.results = [RelationResult.from_json(o) for o in results or []] @@ -5572,7 +7592,7 @@ class RelationStatus(Type): _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> + endpoints : typing.Sequence[~EndpointStatus] id_ : int interface : str key : str @@ -5586,6 +7606,71 @@ class RelationStatus(Type): +class RelationStatusArg(Type): + _toSchema = {'message': 'message', 'relation_id': 'relation-id', 'status': 'status', 'unit_tag': 'unit-tag'} + _toPy = {'message': 'message', 'relation-id': 'relation_id', 'status': 'status', 'unit-tag': 'unit_tag'} + def __init__(self, message=None, relation_id=None, status=None, unit_tag=None, **unknown_fields): + ''' + message : str + relation_id : int + status : str + unit_tag : str + ''' + self.message = message + self.relation_id = relation_id + self.status = status + self.unit_tag = unit_tag + + + +class RelationStatusArgs(Type): + _toSchema = {'args': 'args'} + _toPy = {'args': 'args'} + def __init__(self, args=None, **unknown_fields): + ''' + args : typing.Sequence[~RelationStatusArg] + ''' + self.args = [RelationStatusArg.from_json(o) for o in args or []] + + + +class RelationStatusWatchResults(Type): + _toSchema = {'results': 'results'} + _toPy = {'results': 'results'} + def __init__(self, results=None, **unknown_fields): + ''' + results : typing.Sequence[~RelationLifeSuspendedStatusWatchResult] + ''' + self.results = [RelationLifeSuspendedStatusWatchResult.from_json(o) for o in results or []] + + + +class RelationSuspendedArg(Type): + _toSchema = {'message': 'message', 'relation_id': 'relation-id', 'suspended': 'suspended'} + _toPy = {'message': 'message', 'relation-id': 'relation_id', 'suspended': 'suspended'} + def __init__(self, message=None, relation_id=None, suspended=None, **unknown_fields): + ''' + message : str + relation_id : int + suspended : bool + ''' + self.message = message + self.relation_id = relation_id + self.suspended = suspended + + + +class RelationSuspendedArgs(Type): + _toSchema = {'args': 'args'} + _toPy = {'args': 'args'} + def __init__(self, args=None, **unknown_fields): + ''' + args : typing.Sequence[~RelationSuspendedArg] + ''' + self.args = [RelationSuspendedArg.from_json(o) for o in args or []] + + + class RelationUnit(Type): _toSchema = {'relation': 'relation', 'unit': 'unit'} _toPy = {'relation': 'relation', 'unit': 'unit'} @@ -5604,7 +7689,7 @@ class RelationUnitChange(Type): _toPy = {'settings': 'settings'} def __init__(self, settings=None, **unknown_fields): ''' - settings : typing.Mapping<~KT, +VT_co>[str, typing.Any] + settings : typing.Mapping[str, typing.Any] ''' self.settings = settings @@ -5630,7 +7715,7 @@ class RelationUnitPairs(Type): _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> + relation_unit_pairs : typing.Sequence[~RelationUnitPair] ''' self.relation_unit_pairs = [RelationUnitPair.from_json(o) for o in relation_unit_pairs or []] @@ -5642,7 +7727,7 @@ class RelationUnitSettings(Type): def __init__(self, relation=None, settings=None, unit=None, **unknown_fields): ''' relation : str - settings : typing.Mapping<~KT, +VT_co>[str, str] + settings : typing.Mapping[str, str] unit : str ''' self.relation = relation @@ -5651,12 +7736,51 @@ class RelationUnitSettings(Type): +class RelationUnitStatus(Type): + _toSchema = {'in_scope': 'in-scope', 'relation_tag': 'relation-tag', 'suspended': 'suspended'} + _toPy = {'in-scope': 'in_scope', 'relation-tag': 'relation_tag', 'suspended': 'suspended'} + def __init__(self, in_scope=None, relation_tag=None, suspended=None, **unknown_fields): + ''' + in_scope : bool + relation_tag : str + suspended : bool + ''' + self.in_scope = in_scope + self.relation_tag = relation_tag + self.suspended = suspended + + + +class RelationUnitStatusResult(Type): + _toSchema = {'error': 'error', 'results': 'results'} + _toPy = {'error': 'error', 'results': 'results'} + def __init__(self, error=None, results=None, **unknown_fields): + ''' + error : Error + results : typing.Sequence[~RelationUnitStatus] + ''' + self.error = Error.from_json(error) if error else None + self.results = [RelationUnitStatus.from_json(o) for o in results or []] + + + +class RelationUnitStatusResults(Type): + _toSchema = {'results': 'results'} + _toPy = {'results': 'results'} + def __init__(self, results=None, **unknown_fields): + ''' + results : typing.Sequence[~RelationUnitStatusResult] + ''' + self.results = [RelationUnitStatusResult.from_json(o) for o in results or []] + + + 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> + relation_units : typing.Sequence[~RelationUnit] ''' self.relation_units = [RelationUnit.from_json(o) for o in relation_units or []] @@ -5667,8 +7791,8 @@ class RelationUnitsChange(Type): _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] + changed : typing.Mapping[str, ~UnitSettings] + departed : typing.Sequence[str] ''' self.changed = changed self.departed = departed @@ -5680,7 +7804,7 @@ class RelationUnitsSettings(Type): _toPy = {'relation-units': 'relation_units'} def __init__(self, relation_units=None, **unknown_fields): ''' - relation_units : typing.Sequence<+T_co>[~RelationUnitSettings]<~RelationUnitSettings> + relation_units : typing.Sequence[~RelationUnitSettings] ''' self.relation_units = [RelationUnitSettings.from_json(o) for o in relation_units or []] @@ -5706,12 +7830,35 @@ class RelationUnitsWatchResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~RelationUnitsWatchResult]<~RelationUnitsWatchResult> + results : typing.Sequence[~RelationUnitsWatchResult] ''' self.results = [RelationUnitsWatchResult.from_json(o) for o in results or []] +class RemoteApplication(Type): + _toSchema = {'is_consumer_proxy': 'is-consumer-proxy', 'life': 'life', 'macaroon': 'macaroon', 'model_uuid': 'model-uuid', 'name': 'name', 'offer_uuid': 'offer-uuid', 'status': 'status'} + _toPy = {'is-consumer-proxy': 'is_consumer_proxy', 'life': 'life', 'macaroon': 'macaroon', 'model-uuid': 'model_uuid', 'name': 'name', 'offer-uuid': 'offer_uuid', 'status': 'status'} + def __init__(self, is_consumer_proxy=None, life=None, macaroon=None, model_uuid=None, name=None, offer_uuid=None, status=None, **unknown_fields): + ''' + is_consumer_proxy : bool + life : str + macaroon : Macaroon + model_uuid : str + name : str + offer_uuid : str + status : str + ''' + self.is_consumer_proxy = is_consumer_proxy + self.life = life + self.macaroon = Macaroon.from_json(macaroon) if macaroon else None + self.model_uuid = model_uuid + self.name = name + self.offer_uuid = offer_uuid + self.status = status + + + class RemoteApplicationChange(Type): _toSchema = {'application_tag': 'application-tag', 'life': 'life', 'relations': 'relations'} _toPy = {'application-tag': 'application_tag', 'life': 'life', 'relations': 'relations'} @@ -5734,7 +7881,7 @@ class RemoteApplicationInfo(Type): ''' application_url : str description : str - endpoints : typing.Sequence<+T_co>[~RemoteEndpoint]<~RemoteEndpoint> + endpoints : typing.Sequence[~RemoteEndpoint] icon_url_path : str model_tag : str name : str @@ -5768,12 +7915,36 @@ class RemoteApplicationInfoResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~RemoteApplicationInfoResult]<~RemoteApplicationInfoResult> + results : typing.Sequence[~RemoteApplicationInfoResult] ''' self.results = [RemoteApplicationInfoResult.from_json(o) for o in results or []] +class RemoteApplicationResult(Type): + _toSchema = {'error': 'error', 'result': 'result'} + _toPy = {'error': 'error', 'result': 'result'} + def __init__(self, error=None, result=None, **unknown_fields): + ''' + error : Error + result : RemoteApplication + ''' + self.error = Error.from_json(error) if error else None + self.result = RemoteApplication.from_json(result) if result else None + + + +class RemoteApplicationResults(Type): + _toSchema = {'results': 'results'} + _toPy = {'results': 'results'} + def __init__(self, results=None, **unknown_fields): + ''' + results : typing.Sequence[~RemoteApplicationResult] + ''' + self.results = [RemoteApplicationResult.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'} @@ -5781,10 +7952,10 @@ class RemoteApplicationStatus(Type): ''' application_name : str application_url : str - endpoints : typing.Sequence<+T_co>[~RemoteEndpoint]<~RemoteEndpoint> - err : typing.Mapping<~KT, +VT_co>[str, typing.Any] + endpoints : typing.Sequence[~RemoteEndpoint] + err : typing.Mapping[str, typing.Any] life : str - relations : typing.Sequence<+T_co>[str] + relations : typing.Sequence[str] status : DetailedStatus ''' self.application_name = application_name @@ -5831,6 +8002,30 @@ class RemoteEndpoint(Type): +class RemoteEntityArg(Type): + _toSchema = {'macaroons': 'macaroons', 'relation_token': 'relation-token'} + _toPy = {'macaroons': 'macaroons', 'relation-token': 'relation_token'} + def __init__(self, macaroons=None, relation_token=None, **unknown_fields): + ''' + macaroons : typing.Sequence[~Macaroon] + relation_token : str + ''' + self.macaroons = [Macaroon.from_json(o) for o in macaroons or []] + self.relation_token = relation_token + + + +class RemoteEntityArgs(Type): + _toSchema = {'args': 'args'} + _toPy = {'args': 'args'} + def __init__(self, args=None, **unknown_fields): + ''' + args : typing.Sequence[~RemoteEntityArg] + ''' + self.args = [RemoteEntityArg.from_json(o) for o in args or []] + + + class RemoteEntityId(Type): _toSchema = {'model_uuid': 'model-uuid', 'token': 'token'} _toPy = {'model-uuid': 'model_uuid', 'token': 'token'} @@ -5844,13 +8039,64 @@ class RemoteEntityId(Type): +class RemoteEntityTokenArg(Type): + _toSchema = {'tag': 'tag', 'token': 'token'} + _toPy = {'tag': 'tag', 'token': 'token'} + def __init__(self, tag=None, token=None, **unknown_fields): + ''' + tag : str + token : str + ''' + self.tag = tag + self.token = token + + + +class RemoteEntityTokenArgs(Type): + _toSchema = {'args': 'Args'} + _toPy = {'Args': 'args'} + def __init__(self, args=None, **unknown_fields): + ''' + args : typing.Sequence[~RemoteEntityTokenArg] + ''' + self.args = [RemoteEntityTokenArg.from_json(o) for o in args or []] + + + +class RemoteRelation(Type): + _toSchema = {'application_name': 'application-name', 'endpoint': 'endpoint', 'id_': 'id', 'key': 'key', 'life': 'life', 'remote_application_name': 'remote-application-name', 'remote_endpoint_name': 'remote-endpoint-name', 'source_model_uuid': 'source-model-uuid', 'suspended': 'suspended'} + _toPy = {'application-name': 'application_name', 'endpoint': 'endpoint', 'id': 'id_', 'key': 'key', 'life': 'life', 'remote-application-name': 'remote_application_name', 'remote-endpoint-name': 'remote_endpoint_name', 'source-model-uuid': 'source_model_uuid', 'suspended': 'suspended'} + def __init__(self, application_name=None, endpoint=None, id_=None, key=None, life=None, remote_application_name=None, remote_endpoint_name=None, source_model_uuid=None, suspended=None, **unknown_fields): + ''' + application_name : str + endpoint : RemoteEndpoint + id_ : int + key : str + life : str + remote_application_name : str + remote_endpoint_name : str + source_model_uuid : str + suspended : bool + ''' + self.application_name = application_name + self.endpoint = RemoteEndpoint.from_json(endpoint) if endpoint else None + self.id_ = id_ + self.key = key + self.life = life + self.remote_application_name = remote_application_name + self.remote_endpoint_name = remote_endpoint_name + self.source_model_uuid = source_model_uuid + self.suspended = suspended + + + 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] + changed_units : typing.Mapping[str, ~RemoteRelationUnitChange] + departed_units : typing.Sequence[str] id_ : int life : str ''' @@ -5861,16 +8107,106 @@ class RemoteRelationChange(Type): +class RemoteRelationChangeEvent(Type): + _toSchema = {'application_token': 'application-token', 'changed_units': 'changed-units', 'departed_units': 'departed-units', 'force_cleanup': 'force-cleanup', 'life': 'life', 'macaroons': 'macaroons', 'relation_token': 'relation-token', 'suspended': 'suspended', 'suspended_reason': 'suspended-reason'} + _toPy = {'application-token': 'application_token', 'changed-units': 'changed_units', 'departed-units': 'departed_units', 'force-cleanup': 'force_cleanup', 'life': 'life', 'macaroons': 'macaroons', 'relation-token': 'relation_token', 'suspended': 'suspended', 'suspended-reason': 'suspended_reason'} + def __init__(self, application_token=None, changed_units=None, departed_units=None, force_cleanup=None, life=None, macaroons=None, relation_token=None, suspended=None, suspended_reason=None, **unknown_fields): + ''' + application_token : str + changed_units : typing.Sequence[~RemoteRelationUnitChange] + departed_units : typing.Sequence[int] + force_cleanup : bool + life : str + macaroons : typing.Sequence[~Macaroon] + relation_token : str + suspended : bool + suspended_reason : str + ''' + self.application_token = application_token + self.changed_units = [RemoteRelationUnitChange.from_json(o) for o in changed_units or []] + self.departed_units = departed_units + self.force_cleanup = force_cleanup + self.life = life + self.macaroons = [Macaroon.from_json(o) for o in macaroons or []] + self.relation_token = relation_token + self.suspended = suspended + self.suspended_reason = suspended_reason + + + +class RemoteRelationDetails(Type): + _toSchema = {'macaroon': 'macaroon', 'relation_token': 'relation-token'} + _toPy = {'macaroon': 'macaroon', 'relation-token': 'relation_token'} + def __init__(self, macaroon=None, relation_token=None, **unknown_fields): + ''' + macaroon : Macaroon + relation_token : str + ''' + self.macaroon = Macaroon.from_json(macaroon) if macaroon else None + self.relation_token = relation_token + + + +class RemoteRelationResult(Type): + _toSchema = {'error': 'error', 'result': 'result'} + _toPy = {'error': 'error', 'result': 'result'} + def __init__(self, error=None, result=None, **unknown_fields): + ''' + error : Error + result : RemoteRelation + ''' + self.error = Error.from_json(error) if error else None + self.result = RemoteRelation.from_json(result) if result else None + + + +class RemoteRelationResults(Type): + _toSchema = {'results': 'results'} + _toPy = {'results': 'results'} + def __init__(self, results=None, **unknown_fields): + ''' + results : typing.Sequence[~RemoteRelationResult] + ''' + self.results = [RemoteRelationResult.from_json(o) for o in results or []] + + + +class RemoteRelationUnit(Type): + _toSchema = {'macaroons': 'macaroons', 'relation_token': 'relation-token', 'unit': 'unit'} + _toPy = {'macaroons': 'macaroons', 'relation-token': 'relation_token', 'unit': 'unit'} + def __init__(self, macaroons=None, relation_token=None, unit=None, **unknown_fields): + ''' + macaroons : typing.Sequence[~Macaroon] + relation_token : str + unit : str + ''' + self.macaroons = [Macaroon.from_json(o) for o in macaroons or []] + self.relation_token = relation_token + self.unit = unit + + + 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 + settings : typing.Mapping[str, typing.Any] + unit_id : RemoteEntityId + ''' + self.settings = settings + self.unit_id = RemoteEntityId.from_json(unit_id) if unit_id else None + + + +class RemoteRelationUnits(Type): + _toSchema = {'relation_units': 'relation-units'} + _toPy = {'relation-units': 'relation_units'} + def __init__(self, relation_units=None, **unknown_fields): + ''' + relation_units : typing.Sequence[~RemoteRelationUnit] ''' - self.settings = settings - self.unit_id = RemoteEntityId.from_json(unit_id) if unit_id else None + self.relation_units = [RemoteRelationUnit.from_json(o) for o in relation_units or []] @@ -5879,9 +8215,9 @@ class RemoteRelationsChange(Type): _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> + changed : typing.Sequence[~RemoteRelationChange] initial : bool - removed : typing.Sequence<+T_co>[int] + removed : typing.Sequence[int] ''' self.changed = [RemoteRelationChange.from_json(o) for o in changed or []] self.initial = initial @@ -5889,6 +8225,17 @@ class RemoteRelationsChange(Type): +class RemoteRelationsChanges(Type): + _toSchema = {'changes': 'changes'} + _toPy = {'changes': 'changes'} + def __init__(self, changes=None, **unknown_fields): + ''' + changes : typing.Sequence[~RemoteRelationChangeEvent] + ''' + self.changes = [RemoteRelationChangeEvent.from_json(o) for o in changes or []] + + + class RemoteRelationsWatchResult(Type): _toSchema = {'change': 'change', 'error': 'error', 'remoterelationswatcherid': 'RemoteRelationsWatcherId'} _toPy = {'RemoteRelationsWatcherId': 'remoterelationswatcherid', 'change': 'change', 'error': 'error'} @@ -5911,9 +8258,9 @@ class RemoteSpace(Type): ''' cloud_type : str name : str - provider_attributes : typing.Mapping<~KT, +VT_co>[str, typing.Any] + provider_attributes : typing.Mapping[str, typing.Any] provider_id : str - subnets : typing.Sequence<+T_co>[~Subnet]<~Subnet> + subnets : typing.Sequence[~Subnet] ''' self.cloud_type = cloud_type self.name = name @@ -5934,6 +8281,110 @@ class RemoveBlocksArgs(Type): +class RemoveFilesystemParams(Type): + _toSchema = {'destroy': 'destroy', 'filesystem_id': 'filesystem-id', 'provider': 'provider'} + _toPy = {'destroy': 'destroy', 'filesystem-id': 'filesystem_id', 'provider': 'provider'} + def __init__(self, destroy=None, filesystem_id=None, provider=None, **unknown_fields): + ''' + destroy : bool + filesystem_id : str + provider : str + ''' + self.destroy = destroy + self.filesystem_id = filesystem_id + self.provider = provider + + + +class RemoveFilesystemParamsResult(Type): + _toSchema = {'error': 'error', 'result': 'result'} + _toPy = {'error': 'error', 'result': 'result'} + def __init__(self, error=None, result=None, **unknown_fields): + ''' + error : Error + result : RemoveFilesystemParams + ''' + self.error = Error.from_json(error) if error else None + self.result = RemoveFilesystemParams.from_json(result) if result else None + + + +class RemoveFilesystemParamsResults(Type): + _toSchema = {'results': 'results'} + _toPy = {'results': 'results'} + def __init__(self, results=None, **unknown_fields): + ''' + results : typing.Sequence[~RemoveFilesystemParamsResult] + ''' + self.results = [RemoveFilesystemParamsResult.from_json(o) for o in results or []] + + + +class RemoveStorage(Type): + _toSchema = {'storage': 'storage'} + _toPy = {'storage': 'storage'} + def __init__(self, storage=None, **unknown_fields): + ''' + storage : typing.Sequence[~RemoveStorageInstance] + ''' + self.storage = [RemoveStorageInstance.from_json(o) for o in storage or []] + + + +class RemoveStorageInstance(Type): + _toSchema = {'destroy_attachments': 'destroy-attachments', 'destroy_storage': 'destroy-storage', 'tag': 'tag'} + _toPy = {'destroy-attachments': 'destroy_attachments', 'destroy-storage': 'destroy_storage', 'tag': 'tag'} + def __init__(self, destroy_attachments=None, destroy_storage=None, tag=None, **unknown_fields): + ''' + destroy_attachments : bool + destroy_storage : bool + tag : str + ''' + self.destroy_attachments = destroy_attachments + self.destroy_storage = destroy_storage + self.tag = tag + + + +class RemoveVolumeParams(Type): + _toSchema = {'destroy': 'destroy', 'provider': 'provider', 'volume_id': 'volume-id'} + _toPy = {'destroy': 'destroy', 'provider': 'provider', 'volume-id': 'volume_id'} + def __init__(self, destroy=None, provider=None, volume_id=None, **unknown_fields): + ''' + destroy : bool + provider : str + volume_id : str + ''' + self.destroy = destroy + self.provider = provider + self.volume_id = volume_id + + + +class RemoveVolumeParamsResult(Type): + _toSchema = {'error': 'error', 'result': 'result'} + _toPy = {'error': 'error', 'result': 'result'} + def __init__(self, error=None, result=None, **unknown_fields): + ''' + error : Error + result : RemoveVolumeParams + ''' + self.error = Error.from_json(error) if error else None + self.result = RemoveVolumeParams.from_json(result) if result else None + + + +class RemoveVolumeParamsResults(Type): + _toSchema = {'results': 'results'} + _toPy = {'results': 'results'} + def __init__(self, results=None, **unknown_fields): + ''' + results : typing.Sequence[~RemoveVolumeParamsResult] + ''' + self.results = [RemoveVolumeParamsResult.from_json(o) for o in results or []] + + + class ResolveCharmResult(Type): _toSchema = {'error': 'error', 'url': 'url'} _toPy = {'error': 'error', 'url': 'url'} @@ -5952,7 +8403,7 @@ class ResolveCharmResults(Type): _toPy = {'urls': 'urls'} def __init__(self, urls=None, **unknown_fields): ''' - urls : typing.Sequence<+T_co>[~ResolveCharmResult]<~ResolveCharmResult> + urls : typing.Sequence[~ResolveCharmResult] ''' self.urls = [ResolveCharmResult.from_json(o) for o in urls or []] @@ -5963,7 +8414,7 @@ class ResolveCharms(Type): _toPy = {'references': 'references'} def __init__(self, references=None, **unknown_fields): ''' - references : typing.Sequence<+T_co>[str] + references : typing.Sequence[str] ''' self.references = references @@ -6000,7 +8451,7 @@ class ResolvedModeResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~ResolvedModeResult]<~ResolvedModeResult> + results : typing.Sequence[~ResolvedModeResult] ''' self.results = [ResolvedModeResult.from_json(o) for o in results or []] @@ -6046,9 +8497,9 @@ class ResourcesResult(Type): 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> + charm_store_resources : typing.Sequence[~CharmResource] + resources : typing.Sequence[~Resource] + unit_resources : typing.Sequence[~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 []] @@ -6062,7 +8513,7 @@ class ResourcesResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~ResourcesResult]<~ResourcesResult> + results : typing.Sequence[~ResourcesResult] ''' self.results = [ResourcesResult.from_json(o) for o in results or []] @@ -6084,7 +8535,7 @@ class ResumeReplicationParams(Type): _toPy = {'members': 'members'} def __init__(self, members=None, **unknown_fields): ''' - members : typing.Sequence<+T_co>[~Member]<~Member> + members : typing.Sequence[~Member] ''' self.members = [Member.from_json(o) for o in members or []] @@ -6127,22 +8578,46 @@ class RetryStrategyResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~RetryStrategyResult]<~RetryStrategyResult> + results : typing.Sequence[~RetryStrategyResult] ''' self.results = [RetryStrategyResult.from_json(o) for o in results or []] +class RevokeCredentialArg(Type): + _toSchema = {'force': 'force', 'tag': 'tag'} + _toPy = {'force': 'force', 'tag': 'tag'} + def __init__(self, force=None, tag=None, **unknown_fields): + ''' + force : bool + tag : str + ''' + self.force = force + self.tag = tag + + + +class RevokeCredentialArgs(Type): + _toSchema = {'credentials': 'credentials'} + _toPy = {'credentials': 'credentials'} + def __init__(self, credentials=None, **unknown_fields): + ''' + credentials : typing.Sequence[~RevokeCredentialArg] + ''' + self.credentials = [RevokeCredentialArg.from_json(o) for o in credentials 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] + applications : typing.Sequence[str] commands : str - machines : typing.Sequence<+T_co>[str] + machines : typing.Sequence[str] timeout : int - units : typing.Sequence<+T_co>[str] + units : typing.Sequence[str] ''' self.applications = applications self.commands = commands @@ -6170,7 +8645,7 @@ class SSHAddressResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~SSHAddressResult]<~SSHAddressResult> + results : typing.Sequence[~SSHAddressResult] ''' self.results = [SSHAddressResult.from_json(o) for o in results or []] @@ -6181,7 +8656,7 @@ class SSHAddressesResult(Type): _toPy = {'addresses': 'addresses', 'error': 'error'} def __init__(self, addresses=None, error=None, **unknown_fields): ''' - addresses : typing.Sequence<+T_co>[str] + addresses : typing.Sequence[str] error : Error ''' self.addresses = addresses @@ -6194,7 +8669,7 @@ class SSHAddressesResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~SSHAddressesResult]<~SSHAddressesResult> + results : typing.Sequence[~SSHAddressesResult] ''' self.results = [SSHAddressesResult.from_json(o) for o in results or []] @@ -6205,7 +8680,7 @@ class SSHHostKeySet(Type): _toPy = {'entity-keys': 'entity_keys'} def __init__(self, entity_keys=None, **unknown_fields): ''' - entity_keys : typing.Sequence<+T_co>[~SSHHostKeys]<~SSHHostKeys> + entity_keys : typing.Sequence[~SSHHostKeys] ''' self.entity_keys = [SSHHostKeys.from_json(o) for o in entity_keys or []] @@ -6216,7 +8691,7 @@ class SSHHostKeys(Type): _toPy = {'public-keys': 'public_keys', 'tag': 'tag'} def __init__(self, public_keys=None, tag=None, **unknown_fields): ''' - public_keys : typing.Sequence<+T_co>[str] + public_keys : typing.Sequence[str] tag : str ''' self.public_keys = public_keys @@ -6241,7 +8716,7 @@ class SSHPublicKeysResult(Type): def __init__(self, error=None, public_keys=None, **unknown_fields): ''' error : Error - public_keys : typing.Sequence<+T_co>[str] + public_keys : typing.Sequence[str] ''' self.error = Error.from_json(error) if error else None self.public_keys = public_keys @@ -6253,20 +8728,81 @@ class SSHPublicKeysResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~SSHPublicKeysResult]<~SSHPublicKeysResult> + results : typing.Sequence[~SSHPublicKeysResult] ''' self.results = [SSHPublicKeysResult.from_json(o) for o in results or []] +class ScaleApplicationInfo(Type): + _toSchema = {'num_units': 'num-units'} + _toPy = {'num-units': 'num_units'} + def __init__(self, num_units=None, **unknown_fields): + ''' + num_units : int + ''' + self.num_units = num_units + + + +class ScaleApplicationParams(Type): + _toSchema = {'application_tag': 'application-tag', 'scale': 'scale', 'scale_change': 'scale-change'} + _toPy = {'application-tag': 'application_tag', 'scale': 'scale', 'scale-change': 'scale_change'} + def __init__(self, application_tag=None, scale=None, scale_change=None, **unknown_fields): + ''' + application_tag : str + scale : int + scale_change : int + ''' + self.application_tag = application_tag + self.scale = scale + self.scale_change = scale_change + + + +class ScaleApplicationResult(Type): + _toSchema = {'error': 'error', 'info': 'info'} + _toPy = {'error': 'error', 'info': 'info'} + def __init__(self, error=None, info=None, **unknown_fields): + ''' + error : Error + info : ScaleApplicationInfo + ''' + self.error = Error.from_json(error) if error else None + self.info = ScaleApplicationInfo.from_json(info) if info else None + + + +class ScaleApplicationResults(Type): + _toSchema = {'results': 'results'} + _toPy = {'results': 'results'} + def __init__(self, results=None, **unknown_fields): + ''' + results : typing.Sequence[~ScaleApplicationResult] + ''' + self.results = [ScaleApplicationResult.from_json(o) for o in results or []] + + + +class ScaleApplicationsParams(Type): + _toSchema = {'applications': 'applications'} + _toPy = {'applications': 'applications'} + def __init__(self, applications=None, **unknown_fields): + ''' + applications : typing.Sequence[~ScaleApplicationParams] + ''' + self.applications = [ScaleApplicationParams.from_json(o) for o in applications 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> + bytes_ : typing.Sequence[int] + charms : typing.Sequence[str] + tools : typing.Sequence[~SerializedModelTools] ''' self.bytes_ = bytes_ self.charms = charms @@ -6283,7 +8819,7 @@ class SerializedModelResource(Type): application_revision : SerializedModelResourceRevision charmstore_revision : SerializedModelResourceRevision name : str - unit_revisions : typing.Mapping<~KT, +VT_co>[str, ~SerializedModelResourceRevision]<~SerializedModelResourceRevision> + unit_revisions : typing.Mapping[str, ~SerializedModelResourceRevision] ''' self.application = application self.application_revision = SerializedModelResourceRevision.from_json(application_revision) if application_revision else None @@ -6346,12 +8882,34 @@ class SetConstraints(Type): +class SetExternalControllerInfoParams(Type): + _toSchema = {'info': 'info'} + _toPy = {'info': 'info'} + def __init__(self, info=None, **unknown_fields): + ''' + info : ExternalControllerInfo + ''' + self.info = ExternalControllerInfo.from_json(info) if info else None + + + +class SetExternalControllersInfoParams(Type): + _toSchema = {'controllers': 'controllers'} + _toPy = {'controllers': 'controllers'} + def __init__(self, controllers=None, **unknown_fields): + ''' + controllers : typing.Sequence[~SetExternalControllerInfoParams] + ''' + self.controllers = [SetExternalControllerInfoParams.from_json(o) for o in controllers or []] + + + 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> + machine_block_devices : typing.Sequence[~MachineBlockDevices] ''' self.machine_block_devices = [MachineBlockDevices.from_json(o) for o in machine_block_devices or []] @@ -6362,7 +8920,7 @@ class SetMachineNetworkConfig(Type): _toPy = {'config': 'config', 'tag': 'tag'} def __init__(self, config=None, tag=None, **unknown_fields): ''' - config : typing.Sequence<+T_co>[~NetworkConfig]<~NetworkConfig> + config : typing.Sequence[~NetworkConfig] tag : str ''' self.config = [NetworkConfig.from_json(o) for o in config or []] @@ -6375,7 +8933,7 @@ class SetMachinesAddresses(Type): _toPy = {'machine-addresses': 'machine_addresses'} def __init__(self, machine_addresses=None, **unknown_fields): ''' - machine_addresses : typing.Sequence<+T_co>[~MachineAddresses]<~MachineAddresses> + machine_addresses : typing.Sequence[~MachineAddresses] ''' self.machine_addresses = [MachineAddresses.from_json(o) for o in machine_addresses or []] @@ -6419,12 +8977,36 @@ class SetModelDefaults(Type): _toPy = {'config': 'config'} def __init__(self, config=None, **unknown_fields): ''' - config : typing.Sequence<+T_co>[~ModelDefaultValues]<~ModelDefaultValues> + config : typing.Sequence[~ModelDefaultValues] ''' self.config = [ModelDefaultValues.from_json(o) for o in config or []] +class SetModelEnvironVersion(Type): + _toSchema = {'model_tag': 'model-tag', 'version': 'version'} + _toPy = {'model-tag': 'model_tag', 'version': 'version'} + def __init__(self, model_tag=None, version=None, **unknown_fields): + ''' + model_tag : str + version : int + ''' + self.model_tag = model_tag + self.version = version + + + +class SetModelEnvironVersions(Type): + _toSchema = {'models': 'models'} + _toPy = {'models': 'models'} + def __init__(self, models=None, **unknown_fields): + ''' + models : typing.Sequence[~SetModelEnvironVersion] + ''' + self.models = [SetModelEnvironVersion.from_json(o) for o in models or []] + + + class SetPayloadStatusArg(Type): _toSchema = {'entity': 'Entity', 'status': 'status'} _toPy = {'Entity': 'entity', 'status': 'status'} @@ -6443,18 +9025,77 @@ class SetPayloadStatusArgs(Type): _toPy = {'args': 'args'} def __init__(self, args=None, **unknown_fields): ''' - args : typing.Sequence<+T_co>[~SetPayloadStatusArg]<~SetPayloadStatusArg> + args : typing.Sequence[~SetPayloadStatusArg] ''' self.args = [SetPayloadStatusArg.from_json(o) for o in args or []] +class SetPodSpecParams(Type): + _toSchema = {'specs': 'specs'} + _toPy = {'specs': 'specs'} + def __init__(self, specs=None, **unknown_fields): + ''' + specs : typing.Sequence[~EntityString] + ''' + self.specs = [EntityString.from_json(o) for o in specs or []] + + + +class SetProfileArg(Type): + _toSchema = {'entity': 'entity', 'profiles': 'profiles'} + _toPy = {'entity': 'entity', 'profiles': 'profiles'} + def __init__(self, entity=None, profiles=None, **unknown_fields): + ''' + entity : Entity + profiles : typing.Sequence[str] + ''' + self.entity = Entity.from_json(entity) if entity else None + self.profiles = profiles + + + +class SetProfileArgs(Type): + _toSchema = {'args': 'args'} + _toPy = {'args': 'args'} + def __init__(self, args=None, **unknown_fields): + ''' + args : typing.Sequence[~SetProfileArg] + ''' + self.args = [SetProfileArg.from_json(o) for o in args or []] + + + +class SetProfileUpgradeCompleteArg(Type): + _toSchema = {'entity': 'entity', 'message': 'message'} + _toPy = {'entity': 'entity', 'message': 'message'} + def __init__(self, entity=None, message=None, **unknown_fields): + ''' + entity : Entity + message : str + ''' + self.entity = Entity.from_json(entity) if entity else None + self.message = message + + + +class SetProfileUpgradeCompleteArgs(Type): + _toSchema = {'args': 'args'} + _toPy = {'args': 'args'} + def __init__(self, args=None, **unknown_fields): + ''' + args : typing.Sequence[~SetProfileUpgradeCompleteArg] + ''' + self.args = [SetProfileUpgradeCompleteArg.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> + entities : typing.Sequence[~EntityStatusArgs] ''' self.entities = [EntityStatusArgs.from_json(o) for o in entities or []] @@ -6478,7 +9119,7 @@ class SetStatusArgs(Type): _toPy = {'args': 'args'} def __init__(self, args=None, **unknown_fields): ''' - args : typing.Sequence<+T_co>[~SetStatusArg]<~SetStatusArg> + args : typing.Sequence[~SetStatusArg] ''' self.args = [SetStatusArg.from_json(o) for o in args or []] @@ -6507,7 +9148,7 @@ class SettingsResult(Type): def __init__(self, error=None, settings=None, **unknown_fields): ''' error : Error - settings : typing.Mapping<~KT, +VT_co>[str, str] + settings : typing.Mapping[str, str] ''' self.error = Error.from_json(error) if error else None self.settings = settings @@ -6519,7 +9160,7 @@ class SettingsResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~SettingsResult]<~SettingsResult> + results : typing.Sequence[~SettingsResult] ''' self.results = [SettingsResult.from_json(o) for o in results or []] @@ -6545,7 +9186,7 @@ class SingularClaims(Type): _toPy = {'claims': 'claims'} def __init__(self, claims=None, **unknown_fields): ''' - claims : typing.Sequence<+T_co>[~SingularClaim]<~SingularClaim> + claims : typing.Sequence[~SingularClaim] ''' self.claims = [SingularClaim.from_json(o) for o in claims or []] @@ -6558,7 +9199,7 @@ class Space(Type): ''' error : Error name : str - subnets : typing.Sequence<+T_co>[~Subnet]<~Subnet> + subnets : typing.Sequence[~Subnet] ''' self.error = Error.from_json(error) if error else None self.name = name @@ -6584,7 +9225,7 @@ class SpaceResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~SpaceResult]<~SpaceResult> + results : typing.Sequence[~SpaceResult] ''' self.results = [SpaceResult.from_json(o) for o in results or []] @@ -6663,7 +9304,7 @@ class StatusHistoryRequests(Type): _toPy = {'requests': 'requests'} def __init__(self, requests=None, **unknown_fields): ''' - requests : typing.Sequence<+T_co>[~StatusHistoryRequest]<~StatusHistoryRequest> + requests : typing.Sequence[~StatusHistoryRequest] ''' self.requests = [StatusHistoryRequest.from_json(o) for o in requests or []] @@ -6687,7 +9328,7 @@ class StatusHistoryResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~StatusHistoryResult]<~StatusHistoryResult> + results : typing.Sequence[~StatusHistoryResult] ''' self.results = [StatusHistoryResult.from_json(o) for o in results or []] @@ -6698,7 +9339,7 @@ class StatusParams(Type): _toPy = {'patterns': 'patterns'} def __init__(self, patterns=None, **unknown_fields): ''' - patterns : typing.Sequence<+T_co>[str] + patterns : typing.Sequence[str] ''' self.patterns = patterns @@ -6709,7 +9350,7 @@ class StatusResult(Type): _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] + data : typing.Mapping[str, typing.Any] error : Error id_ : str info : str @@ -6732,7 +9373,7 @@ class StatusResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~StatusResult]<~StatusResult> + results : typing.Sequence[~StatusResult] ''' self.results = [StatusResult.from_json(o) for o in results or []] @@ -6809,7 +9450,7 @@ class StorageAttachmentIds(Type): _toPy = {'ids': 'ids'} def __init__(self, ids=None, **unknown_fields): ''' - ids : typing.Sequence<+T_co>[~StorageAttachmentId]<~StorageAttachmentId> + ids : typing.Sequence[~StorageAttachmentId] ''' self.ids = [StorageAttachmentId.from_json(o) for o in ids or []] @@ -6833,7 +9474,7 @@ class StorageAttachmentIdsResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~StorageAttachmentIdsResult]<~StorageAttachmentIdsResult> + results : typing.Sequence[~StorageAttachmentIdsResult] ''' self.results = [StorageAttachmentIdsResult.from_json(o) for o in results or []] @@ -6857,7 +9498,7 @@ class StorageAttachmentResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~StorageAttachmentResult]<~StorageAttachmentResult> + results : typing.Sequence[~StorageAttachmentResult] ''' self.results = [StorageAttachmentResult.from_json(o) for o in results or []] @@ -6883,7 +9524,7 @@ class StorageDetails(Type): _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> + attachments : typing.Mapping[str, ~StorageAttachmentDetails] kind : int owner_tag : str persistent : bool @@ -6905,7 +9546,7 @@ class StorageDetailsListResult(Type): def __init__(self, error=None, result=None, **unknown_fields): ''' error : Error - result : typing.Sequence<+T_co>[~StorageDetails]<~StorageDetails> + result : typing.Sequence[~StorageDetails] ''' self.error = Error.from_json(error) if error else None self.result = [StorageDetails.from_json(o) for o in result or []] @@ -6917,7 +9558,7 @@ class StorageDetailsListResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~StorageDetailsListResult]<~StorageDetailsListResult> + results : typing.Sequence[~StorageDetailsListResult] ''' self.results = [StorageDetailsListResult.from_json(o) for o in results or []] @@ -6941,7 +9582,7 @@ class StorageDetailsResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~StorageDetailsResult]<~StorageDetailsResult> + results : typing.Sequence[~StorageDetailsResult] ''' self.results = [StorageDetailsResult.from_json(o) for o in results or []] @@ -6963,7 +9604,7 @@ class StorageFilters(Type): _toPy = {'filters': 'filters'} def __init__(self, filters=None, **unknown_fields): ''' - filters : typing.Sequence<+T_co>[~StorageFilter]<~StorageFilter> + filters : typing.Sequence[~StorageFilter] ''' self.filters = [StorageFilter.from_json(o) for o in filters or []] @@ -6974,7 +9615,7 @@ class StoragePool(Type): _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] + attrs : typing.Mapping[str, typing.Any] name : str provider : str ''' @@ -6989,8 +9630,8 @@ class StoragePoolFilter(Type): _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] + names : typing.Sequence[str] + providers : typing.Sequence[str] ''' self.names = names self.providers = providers @@ -7002,7 +9643,7 @@ class StoragePoolFilters(Type): _toPy = {'filters': 'filters'} def __init__(self, filters=None, **unknown_fields): ''' - filters : typing.Sequence<+T_co>[~StoragePoolFilter]<~StoragePoolFilter> + filters : typing.Sequence[~StoragePoolFilter] ''' self.filters = [StoragePoolFilter.from_json(o) for o in filters or []] @@ -7014,7 +9655,7 @@ class StoragePoolsResult(Type): def __init__(self, error=None, storage_pools=None, **unknown_fields): ''' error : Error - storage_pools : typing.Sequence<+T_co>[~StoragePool]<~StoragePool> + storage_pools : typing.Sequence[~StoragePool] ''' self.error = Error.from_json(error) if error else None self.storage_pools = [StoragePool.from_json(o) for o in storage_pools or []] @@ -7026,7 +9667,7 @@ class StoragePoolsResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~StoragePoolsResult]<~StoragePoolsResult> + results : typing.Sequence[~StoragePoolsResult] ''' self.results = [StoragePoolsResult.from_json(o) for o in results or []] @@ -7037,7 +9678,7 @@ class StoragesAddParams(Type): _toPy = {'storages': 'storages'} def __init__(self, storages=None, **unknown_fields): ''' - storages : typing.Sequence<+T_co>[~StorageAddParams]<~StorageAddParams> + storages : typing.Sequence[~StorageAddParams] ''' self.storages = [StorageAddParams.from_json(o) for o in storages or []] @@ -7063,7 +9704,7 @@ class StringBoolResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~StringBoolResult]<~StringBoolResult> + results : typing.Sequence[~StringBoolResult] ''' self.results = [StringBoolResult.from_json(o) for o in results or []] @@ -7087,7 +9728,7 @@ class StringResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~StringResult]<~StringResult> + results : typing.Sequence[~StringResult] ''' self.results = [StringResult.from_json(o) for o in results or []] @@ -7099,7 +9740,7 @@ class StringsResult(Type): def __init__(self, error=None, result=None, **unknown_fields): ''' error : Error - result : typing.Sequence<+T_co>[str] + result : typing.Sequence[str] ''' self.error = Error.from_json(error) if error else None self.result = result @@ -7111,7 +9752,7 @@ class StringsResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~StringsResult]<~StringsResult> + results : typing.Sequence[~StringsResult] ''' self.results = [StringsResult.from_json(o) for o in results or []] @@ -7122,7 +9763,7 @@ class StringsWatchResult(Type): _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] + changes : typing.Sequence[str] error : Error watcher_id : str ''' @@ -7137,45 +9778,93 @@ class StringsWatchResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~StringsWatchResult]<~StringsWatchResult> + results : typing.Sequence[~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[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 TaggedCredential(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 TaggedCredentials(Type): + _toSchema = {'credentials': 'credentials'} + _toPy = {'credentials': 'credentials'} + def __init__(self, credentials=None, **unknown_fields): + ''' + credentials : typing.Sequence[~TaggedCredential] ''' - self.results = [StringsWatchResult.from_json(o) for o in results or []] + self.credentials = [TaggedCredential.from_json(o) for o in credentials 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): +class TokenResult(Type): + _toSchema = {'error': 'error', 'token': 'token'} + _toPy = {'error': 'error', 'token': 'token'} + def __init__(self, error=None, token=None, **unknown_fields): ''' - cidr : str - life : str - provider_id : str - space_tag : str - status : str - vlan_tag : int - zones : typing.Sequence<+T_co>[str] + error : Error + token : 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 + self.error = Error.from_json(error) if error else None + self.token = token -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): +class TokenResults(Type): + _toSchema = {'results': 'results'} + _toPy = {'results': 'results'} + def __init__(self, results=None, **unknown_fields): ''' - space_tag : str - zone : str + results : typing.Sequence[~TokenResult] ''' - self.space_tag = space_tag - self.zone = zone + self.results = [TokenResult.from_json(o) for o in results or []] @@ -7203,7 +9892,7 @@ class ToolsResult(Type): ''' disable_ssl_hostname_verification : bool error : Error - tools : typing.Sequence<+T_co>[~Tools]<~Tools> + tools : typing.Sequence[~Tools] ''' self.disable_ssl_hostname_verification = disable_ssl_hostname_verification self.error = Error.from_json(error) if error else None @@ -7216,7 +9905,7 @@ class ToolsResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~ToolsResult]<~ToolsResult> + results : typing.Sequence[~ToolsResult] ''' self.results = [ToolsResult.from_json(o) for o in results or []] @@ -7227,7 +9916,7 @@ class TrackArgs(Type): _toPy = {'payloads': 'payloads'} def __init__(self, payloads=None, **unknown_fields): ''' - payloads : typing.Sequence<+T_co>[~Payload]<~Payload> + payloads : typing.Sequence[~Payload] ''' self.payloads = [Payload.from_json(o) for o in payloads or []] @@ -7238,7 +9927,7 @@ class TrackPayloadArgs(Type): _toPy = {'payloads': 'payloads'} def __init__(self, payloads=None, **unknown_fields): ''' - payloads : typing.Sequence<+T_co>[~Payload]<~Payload> + payloads : typing.Sequence[~Payload] ''' self.payloads = [Payload.from_json(o) for o in payloads or []] @@ -7295,7 +9984,7 @@ class UnitNetworkConfigResult(Type): def __init__(self, error=None, info=None, **unknown_fields): ''' error : Error - info : typing.Sequence<+T_co>[~NetworkConfig]<~NetworkConfig> + info : typing.Sequence[~NetworkConfig] ''' self.error = Error.from_json(error) if error else None self.info = [NetworkConfig.from_json(o) for o in info or []] @@ -7307,12 +9996,38 @@ class UnitNetworkConfigResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~UnitNetworkConfigResult]<~UnitNetworkConfigResult> + results : typing.Sequence[~UnitNetworkConfigResult] ''' self.results = [UnitNetworkConfigResult.from_json(o) for o in results or []] +class UnitRefreshResult(Type): + _toSchema = {'error': 'Error', 'life': 'Life', 'resolved': 'Resolved'} + _toPy = {'Error': 'error', 'Life': 'life', 'Resolved': 'resolved'} + def __init__(self, error=None, life=None, resolved=None, **unknown_fields): + ''' + error : Error + life : str + resolved : str + ''' + self.error = Error.from_json(error) if error else None + self.life = life + self.resolved = resolved + + + +class UnitRefreshResults(Type): + _toSchema = {'results': 'Results'} + _toPy = {'Results': 'results'} + def __init__(self, results=None, **unknown_fields): + ''' + results : typing.Sequence[~UnitRefreshResult] + ''' + self.results = [UnitRefreshResult.from_json(o) for o in results or []] + + + class UnitResourceResult(Type): _toSchema = {'errorresult': 'ErrorResult', 'resource': 'resource'} _toPy = {'ErrorResult': 'errorresult', 'resource': 'resource'} @@ -7332,8 +10047,8 @@ class UnitResources(Type): 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> + download_progress : typing.Mapping[str, int] + resources : typing.Sequence[~Resource] ''' self.entity = Entity.from_json(entity) if entity else None self.download_progress = download_progress @@ -7347,7 +10062,7 @@ class UnitResourcesResult(Type): def __init__(self, errorresult=None, resources=None, **unknown_fields): ''' errorresult : ErrorResult - resources : typing.Sequence<+T_co>[~UnitResourceResult]<~UnitResourceResult> + resources : typing.Sequence[~UnitResourceResult] ''' self.errorresult = ErrorResult.from_json(errorresult) if errorresult else None self.resources = [UnitResourceResult.from_json(o) for o in resources or []] @@ -7374,9 +10089,9 @@ class UnitStatus(Type): charm : str leader : bool machine : str - opened_ports : typing.Sequence<+T_co>[str] + opened_ports : typing.Sequence[str] public_address : str - subordinates : typing.Mapping<~KT, +VT_co>[str, ~UnitStatus]<~UnitStatus> + subordinates : typing.Mapping[str, ~UnitStatus] workload_status : DetailedStatus workload_version : str ''' @@ -7397,23 +10112,88 @@ class UnitsNetworkConfig(Type): _toPy = {'args': 'args'} def __init__(self, args=None, **unknown_fields): ''' - args : typing.Sequence<+T_co>[~UnitNetworkConfig]<~UnitNetworkConfig> + args : typing.Sequence[~UnitNetworkConfig] ''' self.args = [UnitNetworkConfig.from_json(o) for o in args or []] +class UnitsResolved(Type): + _toSchema = {'all_': 'all', 'retry': 'retry', 'tags': 'tags'} + _toPy = {'all': 'all_', 'retry': 'retry', 'tags': 'tags'} + def __init__(self, all_=None, retry=None, tags=None, **unknown_fields): + ''' + all_ : bool + retry : bool + tags : Entities + ''' + self.all_ = all_ + self.retry = retry + self.tags = Entities.from_json(tags) if tags else None + + + class UnsetModelDefaults(Type): _toSchema = {'keys': 'keys'} _toPy = {'keys': 'keys'} def __init__(self, keys=None, **unknown_fields): ''' - keys : typing.Sequence<+T_co>[~ModelUnsetKeys]<~ModelUnsetKeys> + keys : typing.Sequence[~ModelUnsetKeys] ''' self.keys = [ModelUnsetKeys.from_json(o) for o in keys or []] +class UpdateApplicationServiceArg(Type): + _toSchema = {'addresses': 'addresses', 'application_tag': 'application-tag', 'provider_id': 'provider-id'} + _toPy = {'addresses': 'addresses', 'application-tag': 'application_tag', 'provider-id': 'provider_id'} + def __init__(self, addresses=None, application_tag=None, provider_id=None, **unknown_fields): + ''' + addresses : typing.Sequence[~Address] + application_tag : str + provider_id : str + ''' + self.addresses = [Address.from_json(o) for o in addresses or []] + self.application_tag = application_tag + self.provider_id = provider_id + + + +class UpdateApplicationServiceArgs(Type): + _toSchema = {'args': 'args'} + _toPy = {'args': 'args'} + def __init__(self, args=None, **unknown_fields): + ''' + args : typing.Sequence[~UpdateApplicationServiceArg] + ''' + self.args = [UpdateApplicationServiceArg.from_json(o) for o in args or []] + + + +class UpdateApplicationUnitArgs(Type): + _toSchema = {'args': 'args'} + _toPy = {'args': 'args'} + def __init__(self, args=None, **unknown_fields): + ''' + args : typing.Sequence[~UpdateApplicationUnits] + ''' + self.args = [UpdateApplicationUnits.from_json(o) for o in args or []] + + + +class UpdateApplicationUnits(Type): + _toSchema = {'application_tag': 'application-tag', 'units': 'units'} + _toPy = {'application-tag': 'application_tag', 'units': 'units'} + def __init__(self, application_tag=None, units=None, **unknown_fields): + ''' + application_tag : str + units : typing.Sequence[~ApplicationUnitParams] + ''' + self.application_tag = application_tag + self.units = [ApplicationUnitParams.from_json(o) for o in units 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'} @@ -7445,12 +10225,92 @@ class UpdateCloudCredentials(Type): _toPy = {'credentials': 'credentials'} def __init__(self, credentials=None, **unknown_fields): ''' - credentials : typing.Sequence<+T_co>[~UpdateCloudCredential]<~UpdateCloudCredential> + credentials : typing.Sequence[~UpdateCloudCredential] ''' self.credentials = [UpdateCloudCredential.from_json(o) for o in credentials or []] +class UpdateCredentialArgs(Type): + _toSchema = {'credentials': 'credentials', 'force': 'force'} + _toPy = {'credentials': 'credentials', 'force': 'force'} + def __init__(self, credentials=None, force=None, **unknown_fields): + ''' + credentials : typing.Sequence[~TaggedCredential] + force : bool + ''' + self.credentials = [TaggedCredential.from_json(o) for o in credentials or []] + self.force = force + + + +class UpdateCredentialModelResult(Type): + _toSchema = {'errors': 'errors', 'name': 'name', 'uuid': 'uuid'} + _toPy = {'errors': 'errors', 'name': 'name', 'uuid': 'uuid'} + def __init__(self, errors=None, name=None, uuid=None, **unknown_fields): + ''' + errors : typing.Sequence[~ErrorResult] + name : str + uuid : str + ''' + self.errors = [ErrorResult.from_json(o) for o in errors or []] + self.name = name + self.uuid = uuid + + + +class UpdateCredentialResult(Type): + _toSchema = {'error': 'error', 'models': 'models', 'tag': 'tag'} + _toPy = {'error': 'error', 'models': 'models', 'tag': 'tag'} + def __init__(self, error=None, models=None, tag=None, **unknown_fields): + ''' + error : Error + models : typing.Sequence[~UpdateCredentialModelResult] + tag : str + ''' + self.error = Error.from_json(error) if error else None + self.models = [UpdateCredentialModelResult.from_json(o) for o in models or []] + self.tag = tag + + + +class UpdateCredentialResults(Type): + _toSchema = {'results': 'results'} + _toPy = {'results': 'results'} + def __init__(self, results=None, **unknown_fields): + ''' + results : typing.Sequence[~UpdateCredentialResult] + ''' + self.results = [UpdateCredentialResult.from_json(o) for o in results or []] + + + +class UpdateSeriesArg(Type): + _toSchema = {'force': 'force', 'series': 'series', 'tag': 'tag'} + _toPy = {'force': 'force', 'series': 'series', 'tag': 'tag'} + def __init__(self, force=None, series=None, tag=None, **unknown_fields): + ''' + force : bool + series : str + tag : Entity + ''' + self.force = force + self.series = series + self.tag = Entity.from_json(tag) if tag else None + + + +class UpdateSeriesArgs(Type): + _toSchema = {'args': 'args'} + _toPy = {'args': 'args'} + def __init__(self, args=None, **unknown_fields): + ''' + args : typing.Sequence[~UpdateSeriesArg] + ''' + self.args = [UpdateSeriesArg.from_json(o) for o in args or []] + + + class UpgradeMongoParams(Type): _toSchema = {'target': 'target'} _toPy = {'target': 'target'} @@ -7462,6 +10322,117 @@ class UpgradeMongoParams(Type): +class UpgradeSeriesNotificationParam(Type): + _toSchema = {'entity': 'entity', 'watcher_id': 'watcher-id'} + _toPy = {'entity': 'entity', 'watcher-id': 'watcher_id'} + def __init__(self, entity=None, watcher_id=None, **unknown_fields): + ''' + entity : Entity + watcher_id : str + ''' + self.entity = Entity.from_json(entity) if entity else None + self.watcher_id = watcher_id + + + +class UpgradeSeriesNotificationParams(Type): + _toSchema = {'params': 'params'} + _toPy = {'params': 'params'} + def __init__(self, params=None, **unknown_fields): + ''' + params : typing.Sequence[~UpgradeSeriesNotificationParam] + ''' + self.params = [UpgradeSeriesNotificationParam.from_json(o) for o in params or []] + + + +class UpgradeSeriesStartUnitCompletionParam(Type): + _toSchema = {'entities': 'entities', 'message': 'message'} + _toPy = {'entities': 'entities', 'message': 'message'} + def __init__(self, entities=None, message=None, **unknown_fields): + ''' + entities : typing.Sequence[~Entity] + message : str + ''' + self.entities = [Entity.from_json(o) for o in entities or []] + self.message = message + + + +class UpgradeSeriesStatusParam(Type): + _toSchema = {'entity': 'entity', 'message': 'message', 'status': 'status'} + _toPy = {'entity': 'entity', 'message': 'message', 'status': 'status'} + def __init__(self, entity=None, message=None, status=None, **unknown_fields): + ''' + entity : Entity + message : str + status : str + ''' + self.entity = Entity.from_json(entity) if entity else None + self.message = message + self.status = status + + + +class UpgradeSeriesStatusParams(Type): + _toSchema = {'params': 'params'} + _toPy = {'params': 'params'} + def __init__(self, params=None, **unknown_fields): + ''' + params : typing.Sequence[~UpgradeSeriesStatusParam] + ''' + self.params = [UpgradeSeriesStatusParam.from_json(o) for o in params or []] + + + +class UpgradeSeriesStatusResult(Type): + _toSchema = {'error': 'error', 'status': 'status'} + _toPy = {'error': 'error', 'status': 'status'} + def __init__(self, error=None, status=None, **unknown_fields): + ''' + error : Error + status : str + ''' + self.error = Error.from_json(error) if error else None + self.status = status + + + +class UpgradeSeriesStatusResults(Type): + _toSchema = {'results': 'results'} + _toPy = {'results': 'results'} + def __init__(self, results=None, **unknown_fields): + ''' + results : typing.Sequence[~UpgradeSeriesStatusResult] + ''' + self.results = [UpgradeSeriesStatusResult.from_json(o) for o in results or []] + + + +class UpgradeSeriesUnitsResult(Type): + _toSchema = {'error': 'error', 'unit_names': 'unit-names'} + _toPy = {'error': 'error', 'unit-names': 'unit_names'} + def __init__(self, error=None, unit_names=None, **unknown_fields): + ''' + error : Error + unit_names : typing.Sequence[str] + ''' + self.error = Error.from_json(error) if error else None + self.unit_names = unit_names + + + +class UpgradeSeriesUnitsResults(Type): + _toSchema = {'results': 'Results'} + _toPy = {'Results': 'results'} + def __init__(self, results=None, **unknown_fields): + ''' + results : typing.Sequence[~UpgradeSeriesUnitsResult] + ''' + self.results = [UpgradeSeriesUnitsResult.from_json(o) for o in results or []] + + + class UserAccess(Type): _toSchema = {'access': 'access', 'user_tag': 'user-tag'} _toPy = {'access': 'access', 'user-tag': 'user_tag'} @@ -7493,7 +10464,7 @@ class UserAccessResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~UserAccessResult]<~UserAccessResult> + results : typing.Sequence[~UserAccessResult] ''' self.results = [UserAccessResult.from_json(o) for o in results or []] @@ -7517,7 +10488,7 @@ class UserClouds(Type): _toPy = {'user-clouds': 'user_clouds'} def __init__(self, user_clouds=None, **unknown_fields): ''' - user_clouds : typing.Sequence<+T_co>[~UserCloud]<~UserCloud> + user_clouds : typing.Sequence[~UserCloud] ''' self.user_clouds = [UserCloud.from_json(o) for o in user_clouds or []] @@ -7551,7 +10522,7 @@ class UserInfoRequest(Type): _toPy = {'entities': 'entities', 'include-disabled': 'include_disabled'} def __init__(self, entities=None, include_disabled=None, **unknown_fields): ''' - entities : typing.Sequence<+T_co>[~Entity]<~Entity> + entities : typing.Sequence[~Entity] include_disabled : bool ''' self.entities = [Entity.from_json(o) for o in entities or []] @@ -7577,7 +10548,7 @@ class UserInfoResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~UserInfoResult]<~UserInfoResult> + results : typing.Sequence[~UserInfoResult] ''' self.results = [UserInfoResult.from_json(o) for o in results or []] @@ -7601,7 +10572,7 @@ class UserModelList(Type): _toPy = {'user-models': 'user_models'} def __init__(self, user_models=None, **unknown_fields): ''' - user_models : typing.Sequence<+T_co>[~UserModel]<~UserModel> + user_models : typing.Sequence[~UserModel] ''' self.user_models = [UserModel.from_json(o) for o in user_models or []] @@ -7619,8 +10590,8 @@ class Value(Type): instance_type : str mem : int root_disk : int - spaces : typing.Sequence<+T_co>[str] - tags : typing.Sequence<+T_co>[str] + spaces : typing.Sequence[str] + tags : typing.Sequence[str] virt_type : str ''' self.arch = arch @@ -7665,7 +10636,7 @@ class VersionResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~VersionResult]<~VersionResult> + results : typing.Sequence[~VersionResult] ''' self.results = [VersionResult.from_json(o) for o in results or []] @@ -7768,12 +10739,79 @@ class VolumeAttachmentParamsResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~VolumeAttachmentParamsResult]<~VolumeAttachmentParamsResult> + results : typing.Sequence[~VolumeAttachmentParamsResult] ''' self.results = [VolumeAttachmentParamsResult.from_json(o) for o in results or []] +class VolumeAttachmentPlan(Type): + _toSchema = {'block_device': 'block-device', 'life': 'life', 'machine_tag': 'machine-tag', 'plan_info': 'plan-info', 'volume_tag': 'volume-tag'} + _toPy = {'block-device': 'block_device', 'life': 'life', 'machine-tag': 'machine_tag', 'plan-info': 'plan_info', 'volume-tag': 'volume_tag'} + def __init__(self, block_device=None, life=None, machine_tag=None, plan_info=None, volume_tag=None, **unknown_fields): + ''' + block_device : BlockDevice + life : str + machine_tag : str + plan_info : VolumeAttachmentPlanInfo + volume_tag : str + ''' + self.block_device = BlockDevice.from_json(block_device) if block_device else None + self.life = life + self.machine_tag = machine_tag + self.plan_info = VolumeAttachmentPlanInfo.from_json(plan_info) if plan_info else None + self.volume_tag = volume_tag + + + +class VolumeAttachmentPlanInfo(Type): + _toSchema = {'device_attributes': 'device-attributes', 'device_type': 'device-type'} + _toPy = {'device-attributes': 'device_attributes', 'device-type': 'device_type'} + def __init__(self, device_attributes=None, device_type=None, **unknown_fields): + ''' + device_attributes : typing.Mapping[str, str] + device_type : str + ''' + self.device_attributes = device_attributes + self.device_type = device_type + + + +class VolumeAttachmentPlanResult(Type): + _toSchema = {'error': 'error', 'result': 'result'} + _toPy = {'error': 'error', 'result': 'result'} + def __init__(self, error=None, result=None, **unknown_fields): + ''' + error : Error + result : VolumeAttachmentPlan + ''' + self.error = Error.from_json(error) if error else None + self.result = VolumeAttachmentPlan.from_json(result) if result else None + + + +class VolumeAttachmentPlanResults(Type): + _toSchema = {'results': 'results'} + _toPy = {'results': 'results'} + def __init__(self, results=None, **unknown_fields): + ''' + results : typing.Sequence[~VolumeAttachmentPlanResult] + ''' + self.results = [VolumeAttachmentPlanResult.from_json(o) for o in results or []] + + + +class VolumeAttachmentPlans(Type): + _toSchema = {'volume_plans': 'volume-plans'} + _toPy = {'volume-plans': 'volume_plans'} + def __init__(self, volume_plans=None, **unknown_fields): + ''' + volume_plans : typing.Sequence[~VolumeAttachmentPlan] + ''' + self.volume_plans = [VolumeAttachmentPlan.from_json(o) for o in volume_plans or []] + + + class VolumeAttachmentResult(Type): _toSchema = {'error': 'error', 'result': 'result'} _toPy = {'error': 'error', 'result': 'result'} @@ -7792,7 +10830,7 @@ class VolumeAttachmentResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~VolumeAttachmentResult]<~VolumeAttachmentResult> + results : typing.Sequence[~VolumeAttachmentResult] ''' self.results = [VolumeAttachmentResult.from_json(o) for o in results or []] @@ -7803,7 +10841,7 @@ class VolumeAttachments(Type): _toPy = {'volume-attachments': 'volume_attachments'} def __init__(self, volume_attachments=None, **unknown_fields): ''' - volume_attachments : typing.Sequence<+T_co>[~VolumeAttachment]<~VolumeAttachment> + volume_attachments : typing.Sequence[~VolumeAttachment] ''' self.volume_attachments = [VolumeAttachment.from_json(o) for o in volume_attachments or []] @@ -7815,7 +10853,7 @@ class VolumeDetails(Type): 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> + machine_attachments : typing.Mapping[str, ~VolumeAttachmentInfo] status : EntityStatus storage : StorageDetails volume_tag : str @@ -7834,7 +10872,7 @@ class VolumeDetailsListResult(Type): def __init__(self, error=None, result=None, **unknown_fields): ''' error : Error - result : typing.Sequence<+T_co>[~VolumeDetails]<~VolumeDetails> + result : typing.Sequence[~VolumeDetails] ''' self.error = Error.from_json(error) if error else None self.result = [VolumeDetails.from_json(o) for o in result or []] @@ -7846,7 +10884,7 @@ class VolumeDetailsListResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~VolumeDetailsListResult]<~VolumeDetailsListResult> + results : typing.Sequence[~VolumeDetailsListResult] ''' self.results = [VolumeDetailsListResult.from_json(o) for o in results or []] @@ -7857,7 +10895,7 @@ class VolumeFilter(Type): _toPy = {'machines': 'machines'} def __init__(self, machines=None, **unknown_fields): ''' - machines : typing.Sequence<+T_co>[str] + machines : typing.Sequence[str] ''' self.machines = machines @@ -7868,7 +10906,7 @@ class VolumeFilters(Type): _toPy = {'filters': 'filters'} def __init__(self, filters=None, **unknown_fields): ''' - filters : typing.Sequence<+T_co>[~VolumeFilter]<~VolumeFilter> + filters : typing.Sequence[~VolumeFilter] ''' self.filters = [VolumeFilter.from_json(o) for o in filters or []] @@ -7897,10 +10935,10 @@ class VolumeParams(Type): 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] + attributes : typing.Mapping[str, typing.Any] provider : str size : int - tags : typing.Mapping<~KT, +VT_co>[str, str] + tags : typing.Mapping[str, str] volume_tag : str ''' self.attachment = VolumeAttachmentParams.from_json(attachment) if attachment else None @@ -7930,7 +10968,7 @@ class VolumeParamsResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~VolumeParamsResult]<~VolumeParamsResult> + results : typing.Sequence[~VolumeParamsResult] ''' self.results = [VolumeParamsResult.from_json(o) for o in results or []] @@ -7954,7 +10992,7 @@ class VolumeResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~VolumeResult]<~VolumeResult> + results : typing.Sequence[~VolumeResult] ''' self.results = [VolumeResult.from_json(o) for o in results or []] @@ -7965,7 +11003,7 @@ class Volumes(Type): _toPy = {'volumes': 'volumes'} def __init__(self, volumes=None, **unknown_fields): ''' - volumes : typing.Sequence<+T_co>[~Volume]<~Volume> + volumes : typing.Sequence[~Volume] ''' self.volumes = [Volume.from_json(o) for o in volumes or []] @@ -7989,7 +11027,7 @@ class WatchContainers(Type): _toPy = {'params': 'params'} def __init__(self, params=None, **unknown_fields): ''' - params : typing.Sequence<+T_co>[~WatchContainer]<~WatchContainer> + params : typing.Sequence[~WatchContainer] ''' self.params = [WatchContainer.from_json(o) for o in params or []] @@ -8015,7 +11053,7 @@ class ZoneResults(Type): _toPy = {'results': 'results'} def __init__(self, results=None, **unknown_fields): ''' - results : typing.Sequence<+T_co>[~ZoneResult]<~ZoneResult> + results : typing.Sequence[~ZoneResult] ''' self.results = [ZoneResult.from_json(o) for o in results or []] diff --git a/juju/client/client.py b/juju/client/client.py index 89b5248..2721d07 100644 --- a/juju/client/client.py +++ b/juju/client/client.py @@ -1,11 +1,10 @@ '''Replace auto-generated classes with our own, where necessary. ''' -from . import _client, _definitions, overrides - +from . import _client, _definitions, overrides # isort:skip for o in overrides.__all__: - if not "Facade" in o: + if "Facade" not 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!) @@ -31,4 +30,4 @@ for o in overrides.__patches__: if not a.startswith('_'): setattr(c_type, a, getattr(o_type, a)) -from ._client import * # noqa +from ._client import * # noqa, isort:skip diff --git a/juju/client/connection.py b/juju/client/connection.py index 7457391..f2150b7 100644 --- a/juju/client/connection.py +++ b/juju/client/connection.py @@ -1,28 +1,21 @@ +import asyncio import base64 -import io import json import logging -import os -import random -import shlex import ssl -import string -import subprocess +import urllib.request 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 +import macaroonbakery.httpbakery as httpbakery +import macaroonbakery.bakery as bakery +import websockets +from juju import errors, tag, utils from juju.client import client -from juju.errors import JujuError, JujuAPIError, JujuConnectionError from juju.utils import IdQueue -log = logging.getLogger("websocket") +log = logging.getLogger('juju.client.connection') class Monitor: @@ -30,7 +23,7 @@ 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 + reference to the Connection.receiver Future. Upon inspection of these objects, this class determines whether the connection is in an 'error', 'connected' or 'disconnected' state. @@ -48,10 +41,6 @@ class Monitor: 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): @@ -81,7 +70,8 @@ class Monitor: return self.DISCONNECTING # connection closed uncleanly (we didn't call connection.close) - if self.receiver_stopped.is_set() or not connection.ws.open: + stopped = connection._receiver_task.stopped.is_set() + if stopped or not connection.ws.open: return self.ERROR # everything is fine! @@ -96,47 +86,103 @@ class Connection: 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 + @classmethod + async def connect( + cls, + endpoint=None, + uuid=None, + username=None, + password=None, + cacert=None, + bakery_client=None, + loop=None, + max_frame_size=None, + retries=3, + retry_backoff=10, + ): + """Connect to the websocket. + + If uuid is None, the connection will be to the controller. Otherwise it + will be to the model. + + :param str endpoint: The hostname:port of the controller to connect to. + :param str uuid: The model UUID to connect to (None for a + controller-only connection). + :param str username: The username for controller-local users (or None + to use macaroon-based login.) + :param str password: The password for controller-local users. + :param str cacert: The CA certificate of the controller + (PEM formatted). + :param httpbakery.Client bakery_client: The macaroon bakery client to + to use when performing macaroon-based login. Macaroon tokens + acquired when logging will be saved to bakery_client.cookies. + If this is None, a default bakery_client will be used. + :param asyncio.BaseEventLoop loop: The event loop to use for async + operations. + :param int max_frame_size: The maximum websocket frame size to allow. + :param int retries: When connecting or reconnecting, and all endpoints + fail, how many times to retry the connection before giving up. + :param int retry_backoff: Number of seconds to increase the wait + between connection retry attempts (a backoff of 10 with 3 retries + would wait 10s, 20s, and 30s). + """ + self = cls() + if endpoint is None: + raise ValueError('no endpoint provided') 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 + if bakery_client is None: + bakery_client = httpbakery.Client() + self.bakery_client = bakery_client + if username and '@' in username and not username.endswith('@local'): + # We're trying to log in as an external user - we need to use + # macaroon authentication with no username or password. + if password is not None: + raise errors.JujuAuthError('cannot log in as external ' + 'user with a password') + username = None + self.usertag = tag.user(username) + self.password = password self.loop = loop or asyncio.get_event_loop() self.__request_id__ = 0 + + # The following instance variables are initialized by the + # _connect_with_redirect method, but create them here + # as a reminder that they will exist. self.addr = None self.ws = None + self.endpoint = None + self.cacert = None + self.info = None + + # Create that _Task objects but don't start the tasks yet. + self._pinger_task = _Task(self._pinger, self.loop) + self._receiver_task = _Task(self._receiver, self.loop) + + self._retries = retries + self._retry_backoff = retry_backoff + self.facades = {} self.messages = IdQueue(loop=self.loop) self.monitor = Monitor(connection=self) - if max_frame_size is self.DEFAULT_FRAME_SIZE: + if max_frame_size is None: max_frame_size = self.MAX_FRAME_SIZE self.max_frame_size = max_frame_size + await self._connect_with_redirect([(endpoint, cacert)]) + return self + + @property + def username(self): + if not self.usertag: + return None + return self.usertag[len('user-'):] @property def is_open(self): @@ -146,39 +192,34 @@ class Connection: return ssl.create_default_context( purpose=ssl.Purpose.CLIENT_AUTH, cadata=cert) - async def open(self): + async def _open(self, endpoint, cacert): if self.uuid: - url = "wss://{}/model/{}/api".format(self.endpoint, self.uuid) + url = "wss://{}/model/{}/api".format(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 + url = "wss://{}/api".format(endpoint) + + return (await websockets.connect( + url, + ssl=self._get_ssl(cacert), + loop=self.loop, + max_size=self.max_frame_size, + ), url, endpoint, cacert) 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._pinger_task.stopped.wait() + await self._receiver_task.stopped.wait() await self.ws.close() self.ws = None - async def recv(self, request_id): + 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): + async def _receiver(self): try: while self.is_open: result = await utils.run_with_interrupt( @@ -205,10 +246,8 @@ class Connection: # make pending listeners aware of the error await self.messages.put_all(e) raise - finally: - self.monitor.receiver_stopped.set() - async def pinger(self): + 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. @@ -232,11 +271,21 @@ class Connection: loop=self.loop) if self.monitor.close_called.is_set(): break - finally: - self.monitor.pinger_stopped.set() - return + except websockets.exceptions.ConnectionClosed: + # The connection has closed - we can't do anything + # more until the connection is restarted. + log.debug('ping failed because of closed connection') + pass async def rpc(self, msg, encoder=None): + '''Make an RPC to the API. The message is encoded as JSON + using the given encoder if any. + :param msg: Parameters for the call (will be encoded as JSON). + :param encoder: Encoder to be used when encoding the message. + :return: The result of the call. + :raises JujuAPIError: When there's an error returned. + :raises JujuError: + ''' self.__request_id__ += 1 msg['request-id'] = self.__request_id__ if'params' not in msg: @@ -244,7 +293,12 @@ class Connection: if "version" not in msg: msg['version'] = self.facades[msg['type']] outgoing = json.dumps(msg, indent=2, cls=encoder) + log.debug('connection {} -> {}'.format(id(self), outgoing)) for attempt in range(3): + if self.monitor.status == Monitor.DISCONNECTED: + # closed cleanly; shouldn't try to reconnect + raise websockets.exceptions.ConnectionClosed( + 0, 'websocket closed') try: await self.ws.send(outgoing) break @@ -257,14 +311,19 @@ class Connection: # 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 self.monitor.status != Monitor.CONNECTED: + # reconnect failed; abort and shutdown + log.error('RPC: Automatic reconnect failed') + raise + result = await self._recv(msg['request-id']) + log.debug('connection {} <- {}'.format(id(self), result)) if not result: return result if 'error' in result: # API Error Response - raise JujuAPIError(result) + raise errors.JujuAPIError(result) if 'response' not in result: # This may never happen @@ -272,30 +331,34 @@ class Connection: if 'results' in result['response']: # Check for errors in a result list. - errors = [] + # TODO This loses the results that might have succeeded. + # Perhaps JujuError should return all the results including + # errors, or perhaps a keyword parameter to the rpc method + # could be added to trigger this behaviour. + err_results = [] for res in result['response']['results']: if res.get('error', {}).get('message'): - errors.append(res['error']['message']) - if errors: - raise JujuError(errors) + err_results.append(res['error']['message']) + if err_results: + raise errors.JujuError(err_results) elif result['response'].get('error', {}).get('message'): - raise JujuError(result['response']['error']['message']) + raise errors.JujuError(result['response']['error']['message']) return result - def http_headers(self): + 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: + if not self.usertag: return {} creds = u'{}:{}'.format( - tag.user(self.username), + self.usertag, self.password or '' ) token = base64.b64encode(creds.encode()) @@ -328,70 +391,46 @@ class Connection: "/model/{}".format(self.uuid) if self.uuid else "" ) - return conn, self.http_headers(), path + 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, - ) + return await Connection.connect(**self.connect_params()) + + def connect_params(self): + """Return a tuple of parameters suitable for passing to + Connection.connect that can be used to make a new connection + to the same controller (and model if specified. The first + element in the returned tuple holds the endpoint argument; + the other holds a dict of the keyword args. + """ + return { + 'endpoint': self.endpoint, + 'uuid': self.uuid, + 'username': self.username, + 'password': self.password, + 'cacert': self.cacert, + 'bakery_client': self.bakery_client, + 'loop': self.loop, + 'max_frame_size': 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, + username=self.username, + password=self.password, + cacert=self.cacert, + bakery_client=self.bakery_client, + loop=self.loop, + max_frame_size=self.max_frame_size, ) - 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. """ @@ -400,224 +439,163 @@ class Connection: 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() + await self._connect_with_login([(self.endpoint, self.cacert)]) + + async def _connect(self, endpoints): + if len(endpoints) == 0: + raise errors.JujuConnectionError('no endpoints to connect to') + + async def _try_endpoint(endpoint, cacert, delay): + if delay: + await asyncio.sleep(delay) + return await self._open(endpoint, cacert) + + # Try all endpoints in parallel, with slight increasing delay (+100ms + # for each subsequent endpoint); the delay allows us to prefer the + # earlier endpoints over the latter. Use first successful connection. + tasks = [self.loop.create_task(_try_endpoint(endpoint, cacert, + 0.1 * i)) + for i, (endpoint, cacert) in enumerate(endpoints)] + for attempt in range(self._retries + 1): + for task in asyncio.as_completed(tasks, loop=self.loop): + try: + result = await task + break + except ConnectionError: + continue # ignore; try another endpoint + else: + _endpoints_str = ', '.join([endpoint + for endpoint, cacert in endpoints]) + if attempt < self._retries: + log.debug('Retrying connection to endpoints: {}; ' + 'attempt {} of {}'.format(_endpoints_str, + attempt + 1, + self._retries + 1)) + await asyncio.sleep((attempt + 1) * self._retry_backoff) + continue + else: + raise errors.JujuConnectionError( + 'Unable to connect to any endpoint: ' + '{}'.format(_endpoints_str)) + # only executed if inner loop's else did not continue + # (i.e., inner loop did break due to successful connection) + break + for task in tasks: + task.cancel() + self.ws = result[0] + self.addr = result[1] + self.endpoint = result[2] + self.cacert = result[3] + self._receiver_task.start() + log.debug("Driver connected to juju %s", self.addr) + self.monitor.close_called.clear() - @classmethod - async def connect( - cls, endpoint, uuid, username, password, cacert=None, - macaroons=None, loop=None, max_frame_size=None): + async def _connect_with_login(self, endpoints): """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. - + :return: The response field of login response JSON object. """ - 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: [:] + success = False + try: + await self._connect(endpoints) + # It's possible that we may get several discharge-required errors, + # corresponding to different levels of authentication, so retry + # a few times. + for i in range(0, 2): + result = (await self.login())['response'] + macaroonJSON = result.get('discharge-required') + if macaroonJSON is None: + self.info = result + success = True + return result + macaroon = bakery.Macaroon.from_dict(macaroonJSON) + self.bakery_client.handle_error( + httpbakery.Error( + code=httpbakery.ERR_DISCHARGE_REQUIRED, + message=result.get('discharge-required-error'), + version=macaroon.version, + info=httpbakery.ErrorInfo( + macaroon=macaroon, + macaroon_path=result.get('macaroon-path'), + ), + ), + # note: remove the port number. + 'https://' + self.endpoint + '/', + ) + raise errors.JujuAuthError('failed to authenticate ' + 'after several attempts') + finally: + if not success: + await self.close() - """ - jujudata = JujuData() + async def _connect_with_redirect(self, endpoints): + try: + login_result = await self._connect_with_login(endpoints) + except errors.JujuRedirectException as e: + login_result = await self._connect_with_login(e.endpoints) + self._build_facades(login_result.get('facades', {})) + self._pinger_task.start() - 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): + 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 + params = {} + params['auth-tag'] = self.usertag + if self.password: + params['credentials'] = self.password + else: + macaroons = _macaroons_for_domain(self.bakery_client.cookies, + self.endpoint) + params['macaroons'] = [[bakery.macaroon_to_dict(m) for m in ms] + for ms in macaroons] - async def redirect_info(self): try: - result = await self.rpc({ + return await self.rpc({ "type": "Admin", - "request": "RedirectInfo", + "request": "Login", "version": 3, + "params": params, }) - 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] + except errors.JujuAPIError as e: + if e.error_code != 'redirection required': + raise + log.info('Controller requested redirect') + # Fetch additional redirection information now so that + # we can safely close the connection after login + # fails. + redirect_info = (await self.rpc({ + "type": "Admin", + "request": "RedirectInfo", + "version": 3, + }))['response'] + raise errors.JujuRedirectException(redirect_info) from e -def get_macaroons(controller_name=None): - """Decode and return macaroons from default ~/.go-cookies +class _Task: + def __init__(self, task, loop): + self.stopped = asyncio.Event(loop=loop) + self.stopped.set() + self.task = task + self.loop = loop - """ - 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(): + def start(self): + async def run(): 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 - ] + return await self.task() + finally: + self.stopped.set() + self.stopped.clear() + self.loop.create_task(run()) + + +def _macaroons_for_domain(cookies, domain): + '''Return any macaroons from the given cookie jar that + apply to the given domain name.''' + req = urllib.request.Request('https://' + domain + '/') + cookies.add_cookie_header(req) + return httpbakery.extract_macaroons(req) diff --git a/juju/client/connector.py b/juju/client/connector.py new file mode 100644 index 0000000..a30adbf --- /dev/null +++ b/juju/client/connector.py @@ -0,0 +1,156 @@ +import asyncio +import logging +import copy + +import macaroonbakery.httpbakery as httpbakery +from juju.client.connection import Connection +from juju.client.gocookies import go_to_py_cookie, GoCookieJar +from juju.client.jujudata import FileJujuData +from juju.errors import JujuConnectionError, JujuError + +log = logging.getLogger('connector') + + +class NoConnectionException(Exception): + '''Raised by Connector when the connection method is called + and there is no current connection.''' + pass + + +class Connector: + '''This class abstracts out a reconnectable client that can connect + to controllers and models found in the Juju data files. + ''' + def __init__( + self, + loop=None, + max_frame_size=None, + bakery_client=None, + jujudata=None, + ): + '''Initialize a connector that will use the given parameters + by default when making a new connection''' + self.max_frame_size = max_frame_size + self.loop = loop or asyncio.get_event_loop() + self.bakery_client = bakery_client + self._connection = None + self.controller_name = None + self.model_name = None + self.jujudata = jujudata or FileJujuData() + + def is_connected(self): + '''Report whether there is a currently connected controller or not''' + return self._connection is not None + + def connection(self): + '''Return the current connection; raises an exception if there + is no current connection.''' + if not self.is_connected(): + raise NoConnectionException('not connected') + return self._connection + + async def connect(self, **kwargs): + """Connect to an arbitrary Juju model. + + kwargs are passed through to Connection.connect() + """ + kwargs.setdefault('loop', self.loop) + kwargs.setdefault('max_frame_size', self.max_frame_size) + kwargs.setdefault('bakery_client', self.bakery_client) + if 'macaroons' in kwargs: + if not kwargs['bakery_client']: + kwargs['bakery_client'] = httpbakery.Client() + if not kwargs['bakery_client'].cookies: + kwargs['bakery_client'].cookies = GoCookieJar() + jar = kwargs['bakery_client'].cookies + for macaroon in kwargs.pop('macaroons'): + jar.set_cookie(go_to_py_cookie(macaroon)) + self._connection = await Connection.connect(**kwargs) + + async def disconnect(self): + """Shut down the watcher task and close websockets. + """ + if self._connection: + log.debug('Closing model connection') + await self._connection.close() + self._connection = None + + async def connect_controller(self, controller_name=None): + """Connect to a controller by name. If the name is empty, it + connect to the current controller. + """ + if not controller_name: + controller_name = self.jujudata.current_controller() + if not controller_name: + raise JujuConnectionError('No current controller') + + controller = self.jujudata.controllers()[controller_name] + # TODO change Connection so we can pass all the endpoints + # instead of just the first. + endpoint = controller['api-endpoints'][0] + accounts = self.jujudata.accounts().get(controller_name, {}) + + await self.connect( + endpoint=endpoint, + uuid=None, + username=accounts.get('user'), + password=accounts.get('password'), + cacert=controller.get('ca-cert'), + bakery_client=self.bakery_client_for_controller(controller_name), + ) + self.controller_name = controller_name + + async def connect_model(self, model_name=None): + """Connect to a model by name. If either controller or model + parts of the name are empty, the current controller and/or model + will be used. + + :param str model: : + """ + + try: + controller_name, model_name = self.jujudata.parse_model(model_name) + controller = self.jujudata.controllers().get(controller_name) + except JujuError as e: + raise JujuConnectionError(e.message) from e + if controller is None: + raise JujuConnectionError('Controller {} not found'.format( + controller_name)) + # TODO change Connection so we can pass all the endpoints + # instead of just the first one. + endpoint = controller['api-endpoints'][0] + account = self.jujudata.accounts().get(controller_name, {}) + models = self.jujudata.models().get(controller_name, {}).get('models', + {}) + if model_name not in models: + raise JujuConnectionError('Model not found: {}'.format(model_name)) + + # TODO if there's no record for the required model name, connect + # to the controller to find out the model's uuid, then connect + # to that. This will let connect_model work with models that + # haven't necessarily synced with the local juju data, + # and also remove the need for base.CleanModel to + # subclass JujuData. + await self.connect( + endpoint=endpoint, + uuid=models[model_name]['uuid'], + username=account.get('user'), + password=account.get('password'), + cacert=controller.get('ca-cert'), + bakery_client=self.bakery_client_for_controller(controller_name), + ) + self.controller_name = controller_name + self.model_name = controller_name + ':' + model_name + + def bakery_client_for_controller(self, controller_name): + '''Make a copy of the bakery client with a the appropriate controller's + cookiejar in it. + ''' + bakery_client = self.bakery_client + if bakery_client: + bakery_client = copy.copy(bakery_client) + else: + bakery_client = httpbakery.Client() + bakery_client.cookies = self.jujudata.cookies_for_controller( + controller_name) + return bakery_client diff --git a/juju/client/facade.py b/juju/client/facade.py index c959e01..ec20c38 100644 --- a/juju/client/facade.py +++ b/juju/client/facade.py @@ -1,25 +1,25 @@ 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 collections import defaultdict +from glob import glob +from pathlib import Path +from typing import Any, Mapping, Sequence, TypeVar, Union from . import codegen _marker = object() -JUJU_VERSION = re.compile('[0-9]+\.[0-9-]+[\.\-][0-9a-z]+(\.[0-9]+)?') +JUJU_VERSION = re.compile(r'[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'] + 'ModelInfo', 'ApplicationDeploy'] # Map basic types to Python's typing with a callable @@ -44,19 +44,20 @@ HEADER = """\ # 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.py file. + """ + Given a facade name and version, attempt to pull that facade out + of the correct client.py file. - """ + """ + for _version in range(int(version), 0, -1): 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 + facade = getattr(CLIENTS[str(_version)], name) + return facade + except (KeyError, AttributeError): + continue + else: + raise ImportError("No supported version for facade: " + "{}".format(name)) ''' @@ -73,7 +74,14 @@ class TypeFactory: @param connection: initialized Connection object. """ - version = connection.facades[cls.__name__[:-6]] + facade_name = cls.__name__ + if not facade_name.endswith('Facade'): + raise TypeError('Unexpected class name: {}'.format(facade_name)) + facade_name = facade_name[:-len('Facade')] + version = connection.facades.get(facade_name) + if version is None: + raise Exception('No facade {} in facades {}'.format(facade_name, + connection.facades)) c = lookup_facade(cls.__name__, version) c = c() @@ -127,6 +135,7 @@ class TypeRegistry(dict): return self[refname] + _types = TypeRegistry() _registry = KindRegistry() CLASSES = {} @@ -170,13 +179,13 @@ def name_to_py(name): 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__ + if str(kind).startswith('~'): + return str(kind)[1:] + if issubclass(kind, typing.GenericMeta): + return str(kind)[1:] return kind @@ -257,7 +266,7 @@ def buildTypes(schema, capture): 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: + if name in capture and name not in NAUGHTY_CLASSES: continue args = Args(kind) # Write Factory class for _client.py @@ -277,9 +286,7 @@ class {}(Type): 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) + textwrap.indent(args.get_doc(), INDENT * 2))] if not args: source.append("{}pass".format(INDENT * 2)) @@ -289,7 +296,16 @@ class {}(Type): 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)) + 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)) elif issubclass(arg_type, typing.Sequence): value_type = ( arg_type_name.__parameters__[0] @@ -297,10 +313,16 @@ class {}(Type): 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)) + 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)) + source.append("{}self.{} = {}".format(INDENT * 2, + arg_name, + arg_name)) elif issubclass(arg_type, typing.Mapping): value_type = ( arg_type_name.__parameters__[1] @@ -308,15 +330,21 @@ class {}(Type): 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)) + 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)) + source.append("{}self.{} = {}".format(INDENT * 2, + arg_name, + arg_name)) else: - source.append("{}self.{} = {}".format(INDENT * 2, arg_name, arg_name)) + source.append("{}self.{} = {}".format(INDENT * 2, + arg_name, + arg_name)) source = "\n".join(source) capture.clear(name) @@ -414,7 +442,7 @@ def ReturnMapping(cls): return decorator -def makeFunc(cls, name, params, result, async=True): +def makeFunc(cls, name, params, result, _async=True): INDENT = " " args = Args(params) assignments = [] @@ -428,21 +456,24 @@ def makeFunc(cls, name, params, result, async=True): source = """ @ReturnMapping({rettype}) -{async}def {name}(self{argsep}{args}): +{_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) + msg = dict(type='{cls.name}', + request='{name}', + version={cls.version}, + params=_params) {assignments} - reply = {await}self.rpc(msg) + reply = {_await}self.rpc(msg) return reply """ - fsource = source.format(async="async " if async else "", + fsource = source.format(_async="async " if _async else "", name=name, argsep=", " if args else "", args=args, @@ -451,7 +482,7 @@ def makeFunc(cls, name, params, result, async=True): docstring=textwrap.indent(args.get_doc(), INDENT), cls=cls, assignments=assignments, - await="await " if async else "") + _await="await " if _async else "") ns = _getns() exec(fsource, ns) func = ns[name] @@ -539,7 +570,7 @@ class Type: return d def to_json(self): - return json.dumps(self.serialize()) + return json.dumps(self.serialize(), cls=TypeEncoder, sort_keys=True) class Schema(dict): @@ -576,7 +607,7 @@ class Schema(dict): if not defs: return for d, data in defs.items(): - if d in _registry and not d in NAUGHTY_CLASSES: + if d in _registry and d not in NAUGHTY_CLASSES: continue node = self.deref(data, d) kind = node.get("type") @@ -762,6 +793,7 @@ def generate_facades(options): return captures + def setup(): parser = argparse.ArgumentParser() parser.add_argument("-s", "--schema", default="juju/client/schemas*") @@ -769,6 +801,7 @@ def setup(): options = parser.parse_args() return options + def main(): options = setup() @@ -780,5 +813,6 @@ def main(): write_definitions(captures, options, last_version) write_client(captures, options) + if __name__ == '__main__': main() diff --git a/juju/client/gocookies.py b/juju/client/gocookies.py new file mode 100644 index 0000000..3e48b8d --- /dev/null +++ b/juju/client/gocookies.py @@ -0,0 +1,102 @@ +import datetime +import http.cookiejar as cookiejar +import json +import time + +import pyrfc3339 + + +class GoCookieJar(cookiejar.FileCookieJar): + '''A CookieJar implementation that reads and writes cookies + to the cookiejar format as understood by the Go package + github.com/juju/persistent-cookiejar.''' + def _really_load(self, f, filename, ignore_discard, ignore_expires): + '''Implement the _really_load method called by FileCookieJar + to implement the actual cookie loading''' + data = json.load(f) or [] + now = time.time() + for cookie in map(go_to_py_cookie, data): + if not ignore_expires and cookie.is_expired(now): + continue + self.set_cookie(cookie) + + def save(self, filename=None, ignore_discard=False, ignore_expires=False): + '''Implement the FileCookieJar abstract method.''' + if filename is None: + if self.filename is not None: + filename = self.filename + else: + raise ValueError(cookiejar.MISSING_FILENAME_TEXT) + + # TODO: obtain file lock, read contents of file, and merge with + # current content. + go_cookies = [] + now = time.time() + for cookie in self: + if not ignore_discard and cookie.discard: + continue + if not ignore_expires and cookie.is_expired(now): + continue + go_cookies.append(py_to_go_cookie(cookie)) + with open(filename, "w") as f: + f.write(json.dumps(go_cookies)) + + +def go_to_py_cookie(go_cookie): + '''Convert a Go-style JSON-unmarshaled cookie into a Python cookie''' + expires = None + if go_cookie.get('Expires') is not None: + t = pyrfc3339.parse(go_cookie['Expires']) + expires = t.timestamp() + return cookiejar.Cookie( + version=0, + name=go_cookie['Name'], + value=go_cookie['Value'], + port=None, + port_specified=False, + # Unfortunately Python cookies don't record the original + # host that the cookie came from, so we'll just use Domain + # for that purpose, and record that the domain was specified, + # even though it probably was not. This means that + # we won't correctly record the CanonicalHost entry + # when writing the cookie file after reading it. + domain=go_cookie['Domain'], + domain_specified=not go_cookie['HostOnly'], + domain_initial_dot=False, + path=go_cookie['Path'], + path_specified=True, + secure=go_cookie['Secure'], + expires=expires, + discard=False, + comment=None, + comment_url=None, + rest=None, + rfc2109=False, + ) + + +def py_to_go_cookie(py_cookie): + '''Convert a python cookie to the JSON-marshalable Go-style cookie form.''' + # TODO (perhaps): + # HttpOnly + # Creation + # LastAccess + # Updated + # not done properly: CanonicalHost. + go_cookie = { + 'Name': py_cookie.name, + 'Value': py_cookie.value, + 'Domain': py_cookie.domain, + 'HostOnly': not py_cookie.domain_specified, + 'Persistent': not py_cookie.discard, + 'Secure': py_cookie.secure, + 'CanonicalHost': py_cookie.domain, + } + if py_cookie.path_specified: + go_cookie['Path'] = py_cookie.path + if py_cookie.expires is not None: + unix_time = datetime.datetime.fromtimestamp(py_cookie.expires) + # Note: fromtimestamp bizarrely produces a time without + # a time zone, so we need to use accept_naive. + go_cookie['Expires'] = pyrfc3339.generate(unix_time, accept_naive=True) + return go_cookie diff --git a/juju/client/jujudata.py b/juju/client/jujudata.py new file mode 100644 index 0000000..8b844c2 --- /dev/null +++ b/juju/client/jujudata.py @@ -0,0 +1,219 @@ +import abc +import io +import os +import pathlib + +import juju.client.client as jujuclient +import yaml +from juju import tag +from juju.client.gocookies import GoCookieJar +from juju.errors import JujuError + + +class NoModelException(Exception): + pass + + +class JujuData: + __metaclass__ = abc.ABCMeta + + @abc.abstractmethod + def current_controller(self): + '''Return the current controller name''' + raise NotImplementedError() + + @abc.abstractmethod + def controllers(self): + '''Return all the currently known controllers as a dict + mapping controller name to a dict containing the + following string keys: + uuid: The UUID of the controller + api-endpoints: A list of host:port addresses for the controller. + ca-cert: the PEM-encoded CA cert of the controller (optional) + + This is compatible with the "controllers" entry in the YAML-unmarshaled data + stored in ~/.local/share/juju/controllers.yaml. + ''' + raise NotImplementedError() + + @abc.abstractmethod + def models(self): + '''Return all the currently known models as a dict + containing a key for each known controller, + each holding a dict value containing an optional "current-model" + key (the name of the current model for that controller, + if there is one), and a dict mapping fully-qualified + model names to a dict containing a "uuid" key with the + key for that model. + This is compatible with the YAML-unmarshaled data + stored in ~/.local/share/juju/models.yaml. + ''' + raise NotImplementedError() + + @abc.abstractmethod + def accounts(self): + '''Return the currently known accounts, as a dict + containing a key for each known controller, with + each value holding a dict with the following keys: + + user: The username to use when logging into the controller (str) + password: The password to use when logging into the controller (str, optional) + ''' + raise NotImplementedError() + + @abc.abstractmethod + def cookies_for_controller(self, controller_name): + '''Return the cookie jar to use when connecting to the + controller with the given name. + :return http.cookiejar.CookieJar + ''' + raise NotImplementedError() + + @abc.abstractmethod + def current_model(self, controller_name=None, model_only=False): + '''Return the current model, qualified by its controller name. + If controller_name is specified, the current model for + that controller will be returned. + If model_only is true, only the model name, not qualified by + its controller name, will be returned. + ''' + raise NotImplementedError() + + def parse_model(self, model): + """Split the given model_name into controller and model parts. + If the controller part is empty, the current controller will be used. + If the model part is empty, the current model will be used for + the controller. + The returned model name will always be qualified with a username. + :param model str: The model name to parse. + :return (str, str): The controller and model names. + """ + # TODO if model is empty, use $JUJU_MODEL environment variable. + if model and ':' in model: + # explicit controller given + controller_name, model_name = model.split(':') + else: + # use the current controller if one isn't explicitly given + controller_name = self.current_controller() + model_name = model + if not controller_name: + controller_name = self.current_controller() + if not model_name: + model_name = self.current_model(controller_name, model_only=True) + if not model_name: + raise NoModelException('no current model') + + if '/' not in model_name: + # model name doesn't include a user prefix, so add one + # by using the current user for the controller. + accounts = self.accounts().get(controller_name) + if accounts is None: + raise JujuError('No account found for controller {} '.format(controller_name)) + username = accounts.get('user') + if username is None: + raise JujuError('No username found for controller {}'.format(controller_name)) + model_name = username + "/" + model_name + + return controller_name, model_name + + +class FileJujuData(JujuData): + '''Provide access to the Juju client configuration files. + Any configuration file is read once and then cached.''' + def __init__(self): + self.path = os.environ.get('JUJU_DATA') or '~/.local/share/juju' + self.path = os.path.abspath(os.path.expanduser(self.path)) + # _loaded keeps track of the loaded YAML from + # the Juju data files so we don't need to load the same + # file many times. + self._loaded = {} + + def refresh(self): + '''Forget the cache of configuration file data''' + self._loaded = {} + + def current_controller(self): + '''Return the current controller name''' + return self._load_yaml('controllers.yaml', 'current-controller') + + def current_model(self, controller_name=None, model_only=False): + '''Return the current model, qualified by its controller name. + If controller_name is specified, the current model for + that controller will be returned. + + If model_only is true, only the model name, not qualified by + its controller name, will be returned. + ''' + # TODO respect JUJU_MODEL environment variable. + if not controller_name: + controller_name = self.current_controller() + if not controller_name: + raise JujuError('No current controller') + models = self.models()[controller_name] + if 'current-model' not in models: + return None + if model_only: + return models['current-model'] + return controller_name + ':' + models['current-model'] + + def load_credential(self, cloud, name=None): + """Load a local credential. + + :param str cloud: Name of cloud to load credentials from. + :param str name: Name of credential. If None, the default credential + will be used, if available. + :return: A CloudCredential instance, or None. + """ + try: + cloud = tag.untag('cloud-', cloud) + creds_data = self.credentials()[cloud] + if not name: + default_credential = creds_data.pop('default-credential', None) + default_region = creds_data.pop('default-region', None) # noqa + if default_credential: + name = creds_data['default-credential'] + elif len(creds_data) == 1: + name = list(creds_data)[0] + else: + return None, None + cred_data = creds_data[name] + auth_type = cred_data.pop('auth-type') + return name, jujuclient.CloudCredential( + auth_type=auth_type, + attrs=cred_data, + ) + except (KeyError, FileNotFoundError): + return None, None + + 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 credentials(self): + return self._load_yaml('credentials.yaml', 'credentials') + + def _load_yaml(self, filename, key): + if filename in self._loaded: + # Data already exists in the cache. + return self._loaded[filename].get(key) + # TODO use the file lock like Juju does. + filepath = os.path.join(self.path, filename) + with io.open(filepath, 'rt') as f: + data = yaml.safe_load(f) + self._loaded[filename] = data + return data.get(key) + + def cookies_for_controller(self, controller_name): + f = pathlib.Path(self.path) / 'cookies' / (controller_name + '.json') + if not f.exists(): + f = pathlib.Path('~/.go-cookies').expanduser() + # TODO if neither cookie file exists, where should + # we create the cookies? + jar = GoCookieJar(str(f)) + jar.load() + return jar diff --git a/juju/client/overrides.py b/juju/client/overrides.py index f439adb..49ab931 100644 --- a/juju/client/overrides.py +++ b/juju/client/overrides.py @@ -1,21 +1,21 @@ -from collections import namedtuple import re +from collections import namedtuple +from . import _client, _definitions from .facade import ReturnMapping, Type, TypeEncoder -from .import _client -from .import _definitions - __all__ = [ 'Delta', 'Number', 'Binary', 'ConfigValue', + 'Resource', ] __patches__ = [ 'ResourcesFacade', 'AllWatcherFacade', + 'ActionFacade', ] @@ -106,6 +106,42 @@ class AllWatcherFacade(Type): return result +class ActionFacade(Type): + + class _FindTagsResults(Type): + _toSchema = {'matches': 'matches'} + _toPy = {'matches': 'matches'} + + def __init__(self, matches=None, **unknown_fields): + ''' + FindTagsResults wraps the mapping between the requested prefix and the + matching tags for each requested prefix. + + Matches map[string][]Entity `json:"matches"` + ''' + self.matches = {} + matches = matches or {} + for prefix, tags in matches.items(): + self.matches[prefix] = [_definitions.Entity.from_json(r) + for r in tags] + + @ReturnMapping(_FindTagsResults) + async def FindActionTagsByPrefix(self, prefixes): + ''' + prefixes : typing.Sequence[str] + Returns -> typing.Sequence[~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 + + class Number(_definitions.Number): """ This type represents a semver string. @@ -139,14 +175,24 @@ class Number(_definitions.Number): def __str__(self): return self.serialize() + @property + def _cmp(self): + return (self.major, self.minor, self.tag, self.patch, self.build) + 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) + return isinstance(other, type(self)) and self._cmp == other._cmp + + def __lt__(self, other): + return self._cmp < other._cmp + + def __le__(self, other): + return self._cmp <= other._cmp + + def __gt__(self, other): + return self._cmp > other._cmp + + def __ge__(self, other): + return self._cmp >= other._cmp @classmethod def from_json(cls, data): @@ -273,3 +319,47 @@ class ConfigValue(_definitions.ConfigValue): return '<{} source={} value={}>'.format(type(self).__name__, repr(self.source), repr(self.value)) + + +class Resource(Type): + _toSchema = {'application': 'application', + 'charmresource': 'CharmResource', + 'id_': 'id', + 'pending_id': 'pending-id', + 'timestamp': 'timestamp', + 'username': 'username', + 'name': 'name', + 'origin': 'origin'} + _toPy = {'CharmResource': 'charmresource', + 'application': 'application', + 'id': 'id_', + 'pending-id': 'pending_id', + 'timestamp': 'timestamp', + 'username': 'username', + 'name': 'name', + 'origin': 'origin'} + + def __init__(self, charmresource=None, application=None, id_=None, + pending_id=None, timestamp=None, username=None, name=None, + origin=None, **unknown_fields): + ''' + charmresource : CharmResource + application : str + id_ : str + pending_id : str + timestamp : str + username : str + name: str + origin : str + ''' + if charmresource: + self.charmresource = _client.CharmResource.from_json(charmresource) + else: + self.charmresource = None + self.application = application + self.id_ = id_ + self.pending_id = pending_id + self.timestamp = timestamp + self.username = username + self.name = name + self.origin = origin diff --git a/juju/client/runner.py b/juju/client/runner.py index 61f2963..6545bc4 100644 --- a/juju/client/runner.py +++ b/juju/client/runner.py @@ -1,6 +1,4 @@ - - class AsyncRunner: async def __call__(self, facade_method, *args, **kwargs): await self.connection.rpc(facade_method(*args, **kwargs)) @@ -15,14 +13,9 @@ class ThreadedRunner: # 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 - - - - - +# 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 diff --git a/juju/client/schemas-juju-2.5-rc1.json b/juju/client/schemas-juju-2.5-rc1.json new file mode 100644 index 0000000..b53dd0b --- /dev/null +++ b/juju/client/schemas-juju-2.5-rc1.json @@ -0,0 +1,37036 @@ +[ + { + "Name": "Action", + "Version": 3, + "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": "ActionPruner", + "Version": 1, + "Schema": { + "type": "object", + "properties": { + "ModelConfig": { + "type": "object", + "properties": { + "Result": { + "$ref": "#/definitions/ModelConfigResult" + } + } + }, + "Prune": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/ActionPruneArgs" + } + } + }, + "WatchForModelConfigChanges": { + "type": "object", + "properties": { + "Result": { + "$ref": "#/definitions/NotifyWatchResult" + } + } + } + }, + "definitions": { + "ActionPruneArgs": { + "type": "object", + "properties": { + "max-history-mb": { + "type": "integer" + }, + "max-history-time": { + "type": "integer" + } + }, + "additionalProperties": false, + "required": [ + "max-history-time", + "max-history-mb" + ] + }, + "Error": { + "type": "object", + "properties": { + "code": { + "type": "string" + }, + "info": { + "$ref": "#/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" + ] + } + } + } + }, + { + "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" + } + } + }, + "ControllerAPIInfoForModels": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/Entities" + }, + "Result": { + "$ref": "#/definitions/ControllerAPIInfoResults" + } + } + }, + "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": { + "cacertificates": { + "type": "array", + "items": { + "type": "string" + } + }, + "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 + }, + "ControllerAPIInfoResult": { + "type": "object", + "properties": { + "addresses": { + "type": "array", + "items": { + "type": "string" + } + }, + "cacert": { + "type": "string" + }, + "error": { + "$ref": "#/definitions/Error" + } + }, + "additionalProperties": false, + "required": [ + "addresses", + "cacert" + ] + }, + "ControllerAPIInfoResults": { + "type": "object", + "properties": { + "results": { + "type": "array", + "items": { + "$ref": "#/definitions/ControllerAPIInfoResult" + } + } + }, + "additionalProperties": false, + "required": [ + "results" + ] + }, + "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" + }, + "controller-api-port": { + "type": "integer" + }, + "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": 8, + "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" + } + } + }, + "CharmConfig": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/Entities" + }, + "Result": { + "$ref": "#/definitions/ApplicationGetConfigResults" + } + } + }, + "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/DestroyApplicationsParams" + }, + "Result": { + "$ref": "#/definitions/DestroyApplicationResults" + } + } + }, + "DestroyConsumedApplications": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/DestroyConsumedApplicationsParams" + }, + "Result": { + "$ref": "#/definitions/ErrorResults" + } + } + }, + "DestroyRelation": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/DestroyRelation" + } + } + }, + "DestroyUnit": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/DestroyUnitsParams" + }, + "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" + } + } + }, + "GetConfig": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/Entities" + }, + "Result": { + "$ref": "#/definitions/ApplicationGetConfigResults" + } + } + }, + "GetConstraints": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/Entities" + }, + "Result": { + "$ref": "#/definitions/ApplicationGetConstraintsResults" + } + } + }, + "GetLXDProfileUpgradeMessages": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/LXDProfileUpgradeMessages" + }, + "Result": { + "$ref": "#/definitions/LXDProfileUpgradeMessagesResults" + } + } + }, + "ResolveUnitErrors": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/UnitsResolved" + }, + "Result": { + "$ref": "#/definitions/ErrorResults" + } + } + }, + "ScaleApplications": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/ScaleApplicationsParams" + }, + "Result": { + "$ref": "#/definitions/ScaleApplicationResults" + } + } + }, + "Set": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/ApplicationSet" + } + } + }, + "SetApplicationsConfig": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/ApplicationConfigSetArgs" + }, + "Result": { + "$ref": "#/definitions/ErrorResults" + } + } + }, + "SetCharm": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/ApplicationSetCharm" + } + } + }, + "SetCharmProfile": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/ApplicationSetCharmProfile" + } + } + }, + "SetConstraints": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/SetConstraints" + } + } + }, + "SetMetricCredentials": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/ApplicationMetricCredentials" + }, + "Result": { + "$ref": "#/definitions/ErrorResults" + } + } + }, + "SetRelationsSuspended": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/RelationSuspendedArgs" + }, + "Result": { + "$ref": "#/definitions/ErrorResults" + } + } + }, + "Unexpose": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/ApplicationUnexpose" + } + } + }, + "Unset": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/ApplicationUnset" + } + } + }, + "UnsetApplicationsConfig": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/ApplicationConfigUnsetArgs" + }, + "Result": { + "$ref": "#/definitions/ErrorResults" + } + } + }, + "Update": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/ApplicationUpdate" + } + } + }, + "UpdateApplicationSeries": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/UpdateSeriesArgs" + }, + "Result": { + "$ref": "#/definitions/ErrorResults" + } + } + }, + "WatchLXDProfileUpgradeNotifications": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/Entity" + }, + "Result": { + "$ref": "#/definitions/NotifyWatchResult" + } + } + } + }, + "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" + } + }, + "policy": { + "type": "string" + } + }, + "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" + } + }, + "via-cidrs": { + "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" + ] + }, + "ApplicationConfigSet": { + "type": "object", + "properties": { + "application": { + "type": "string" + }, + "config": { + "type": "object", + "patternProperties": { + ".*": { + "type": "string" + } + } + } + }, + "additionalProperties": false, + "required": [ + "application", + "config" + ] + }, + "ApplicationConfigSetArgs": { + "type": "object", + "properties": { + "Args": { + "type": "array", + "items": { + "$ref": "#/definitions/ApplicationConfigSet" + } + } + }, + "additionalProperties": false, + "required": [ + "Args" + ] + }, + "ApplicationConfigUnsetArgs": { + "type": "object", + "properties": { + "Args": { + "type": "array", + "items": { + "$ref": "#/definitions/ApplicationUnset" + } + } + }, + "additionalProperties": false, + "required": [ + "Args" + ] + }, + "ApplicationConstraint": { + "type": "object", + "properties": { + "constraints": { + "$ref": "#/definitions/Value" + }, + "error": { + "$ref": "#/definitions/Error" + } + }, + "additionalProperties": false, + "required": [ + "constraints" + ] + }, + "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" + }, + "devices": { + "type": "object", + "patternProperties": { + ".*": { + "$ref": "#/definitions/Constraints" + } + } + }, + "endpoint-bindings": { + "type": "object", + "patternProperties": { + ".*": { + "type": "string" + } + } + }, + "num-units": { + "type": "integer" + }, + "placement": { + "type": "array", + "items": { + "$ref": "#/definitions/Placement" + } + }, + "policy": { + "type": "string" + }, + "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" + ] + }, + "ApplicationGetConfigResults": { + "type": "object", + "properties": { + "Results": { + "type": "array", + "items": { + "$ref": "#/definitions/ConfigResult" + } + } + }, + "additionalProperties": false, + "required": [ + "Results" + ] + }, + "ApplicationGetConstraintsResults": { + "type": "object", + "properties": { + "results": { + "type": "array", + "items": { + "$ref": "#/definitions/ApplicationConstraint" + } + } + }, + "additionalProperties": false, + "required": [ + "results" + ] + }, + "ApplicationGetResults": { + "type": "object", + "properties": { + "application": { + "type": "string" + }, + "application-config": { + "type": "object", + "patternProperties": { + ".*": { + "type": "object", + "additionalProperties": true + } + } + }, + "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" + ] + }, + "ApplicationOfferDetails": { + "type": "object", + "properties": { + "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" + }, + "offer-uuid": { + "type": "string" + }, + "source-model-tag": { + "type": "string" + }, + "spaces": { + "type": "array", + "items": { + "$ref": "#/definitions/RemoteSpace" + } + }, + "users": { + "type": "array", + "items": { + "$ref": "#/definitions/OfferUserDetails" + } + } + }, + "additionalProperties": false, + "required": [ + "source-model-tag", + "offer-uuid", + "offer-url", + "offer-name", + "application-description" + ] + }, + "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": { + "type": "boolean" + }, + "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", + "force-units", + "force-series" + ] + }, + "ApplicationSetCharmProfile": { + "type": "object", + "properties": { + "application": { + "type": "string" + }, + "charm-url": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "application", + "charm-url" + ] + }, + "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": { + "type": "boolean" + }, + "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", + "force", + "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" + ] + }, + "ConfigResult": { + "type": "object", + "properties": { + "config": { + "type": "object", + "patternProperties": { + ".*": { + "type": "object", + "additionalProperties": true + } + } + }, + "error": { + "$ref": "#/definitions/Error" + } + }, + "additionalProperties": false, + "required": [ + "config" + ] + }, + "Constraints": { + "type": "object", + "properties": { + "Count": { + "type": "integer" + }, + "Pool": { + "type": "string" + }, + "Size": { + "type": "integer" + } + }, + "additionalProperties": false, + "required": [ + "Pool", + "Size", + "Count" + ] + }, + "ConsumeApplicationArg": { + "type": "object", + "properties": { + "ApplicationOfferDetails": { + "$ref": "#/definitions/ApplicationOfferDetails" + }, + "application-alias": { + "type": "string" + }, + "external-controller": { + "$ref": "#/definitions/ExternalControllerInfo" + }, + "macaroon": { + "$ref": "#/definitions/Macaroon" + } + }, + "additionalProperties": false, + "required": [ + "ApplicationOfferDetails" + ] + }, + "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 + }, + "DestroyApplicationParams": { + "type": "object", + "properties": { + "application-tag": { + "type": "string" + }, + "destroy-storage": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "application-tag" + ] + }, + "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" + ] + }, + "DestroyApplicationsParams": { + "type": "object", + "properties": { + "applications": { + "type": "array", + "items": { + "$ref": "#/definitions/DestroyApplicationParams" + } + } + }, + "additionalProperties": false, + "required": [ + "applications" + ] + }, + "DestroyConsumedApplicationParams": { + "type": "object", + "properties": { + "application-tag": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "application-tag" + ] + }, + "DestroyConsumedApplicationsParams": { + "type": "object", + "properties": { + "applications": { + "type": "array", + "items": { + "$ref": "#/definitions/DestroyConsumedApplicationParams" + } + } + }, + "additionalProperties": false, + "required": [ + "applications" + ] + }, + "DestroyRelation": { + "type": "object", + "properties": { + "endpoints": { + "type": "array", + "items": { + "type": "string" + } + }, + "relation-id": { + "type": "integer" + } + }, + "additionalProperties": false, + "required": [ + "relation-id" + ] + }, + "DestroyUnitInfo": { + "type": "object", + "properties": { + "destroyed-storage": { + "type": "array", + "items": { + "$ref": "#/definitions/Entity" + } + }, + "detached-storage": { + "type": "array", + "items": { + "$ref": "#/definitions/Entity" + } + } + }, + "additionalProperties": false + }, + "DestroyUnitParams": { + "type": "object", + "properties": { + "destroy-storage": { + "type": "boolean" + }, + "unit-tag": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "unit-tag" + ] + }, + "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 + }, + "DestroyUnitsParams": { + "type": "object", + "properties": { + "units": { + "type": "array", + "items": { + "$ref": "#/definitions/DestroyUnitParams" + } + } + }, + "additionalProperties": false, + "required": [ + "units" + ] + }, + "Entities": { + "type": "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" + ] + }, + "ExternalControllerInfo": { + "type": "object", + "properties": { + "addrs": { + "type": "array", + "items": { + "type": "string" + } + }, + "ca-cert": { + "type": "string" + }, + "controller-alias": { + "type": "string" + }, + "controller-tag": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "controller-tag", + "controller-alias", + "addrs", + "ca-cert" + ] + }, + "LXDProfileUpgradeMessages": { + "type": "object", + "properties": { + "application": { + "$ref": "#/definitions/Entity" + }, + "watcher-id": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "application", + "watcher-id" + ] + }, + "LXDProfileUpgradeMessagesResult": { + "type": "object", + "properties": { + "error": { + "$ref": "#/definitions/Error" + }, + "message": { + "type": "string" + }, + "unit-name": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "unit-name", + "message" + ] + }, + "LXDProfileUpgradeMessagesResults": { + "type": "object", + "properties": { + "args": { + "type": "array", + "items": { + "$ref": "#/definitions/LXDProfileUpgradeMessagesResult" + } + } + }, + "additionalProperties": false, + "required": [ + "args" + ] + }, + "Macaroon": { + "type": "object", + "additionalProperties": false + }, + "NotifyWatchResult": { + "type": "object", + "properties": { + "NotifyWatcherId": { + "type": "string" + }, + "error": { + "$ref": "#/definitions/Error" + } + }, + "additionalProperties": false, + "required": [ + "NotifyWatcherId" + ] + }, + "OfferUserDetails": { + "type": "object", + "properties": { + "access": { + "type": "string" + }, + "display-name": { + "type": "string" + }, + "user": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "user", + "display-name", + "access" + ] + }, + "Placement": { + "type": "object", + "properties": { + "directive": { + "type": "string" + }, + "scope": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "scope", + "directive" + ] + }, + "RelationSuspendedArg": { + "type": "object", + "properties": { + "message": { + "type": "string" + }, + "relation-id": { + "type": "integer" + }, + "suspended": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "relation-id", + "message", + "suspended" + ] + }, + "RelationSuspendedArgs": { + "type": "object", + "properties": { + "args": { + "type": "array", + "items": { + "$ref": "#/definitions/RelationSuspendedArg" + } + } + }, + "additionalProperties": false, + "required": [ + "args" + ] + }, + "RemoteEndpoint": { + "type": "object", + "properties": { + "interface": { + "type": "string" + }, + "limit": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "role": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "name", + "role", + "interface", + "limit" + ] + }, + "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" + ] + }, + "ScaleApplicationInfo": { + "type": "object", + "properties": { + "num-units": { + "type": "integer" + } + }, + "additionalProperties": false, + "required": [ + "num-units" + ] + }, + "ScaleApplicationParams": { + "type": "object", + "properties": { + "application-tag": { + "type": "string" + }, + "scale": { + "type": "integer" + }, + "scale-change": { + "type": "integer" + } + }, + "additionalProperties": false, + "required": [ + "application-tag", + "scale" + ] + }, + "ScaleApplicationResult": { + "type": "object", + "properties": { + "error": { + "$ref": "#/definitions/Error" + }, + "info": { + "$ref": "#/definitions/ScaleApplicationInfo" + } + }, + "additionalProperties": false + }, + "ScaleApplicationResults": { + "type": "object", + "properties": { + "results": { + "type": "array", + "items": { + "$ref": "#/definitions/ScaleApplicationResult" + } + } + }, + "additionalProperties": false + }, + "ScaleApplicationsParams": { + "type": "object", + "properties": { + "applications": { + "type": "array", + "items": { + "$ref": "#/definitions/ScaleApplicationParams" + } + } + }, + "additionalProperties": false, + "required": [ + "applications" + ] + }, + "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" + ] + }, + "UnitsResolved": { + "type": "object", + "properties": { + "all": { + "type": "boolean" + }, + "retry": { + "type": "boolean" + }, + "tags": { + "$ref": "#/definitions/Entities" + } + }, + "additionalProperties": false + }, + "UpdateSeriesArg": { + "type": "object", + "properties": { + "force": { + "type": "boolean" + }, + "series": { + "type": "string" + }, + "tag": { + "$ref": "#/definitions/Entity" + } + }, + "additionalProperties": false, + "required": [ + "tag", + "force", + "series" + ] + }, + "UpdateSeriesArgs": { + "type": "object", + "properties": { + "args": { + "type": "array", + "items": { + "$ref": "#/definitions/UpdateSeriesArg" + } + } + }, + "additionalProperties": false, + "required": [ + "args" + ] + }, + "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" + }, + "zones": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + } + } + } + }, + { + "Name": "ApplicationOffers", + "Version": 2, + "Schema": { + "type": "object", + "properties": { + "ApplicationOffers": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/OfferURLs" + }, + "Result": { + "$ref": "#/definitions/ApplicationOffersResults" + } + } + }, + "DestroyOffers": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/DestroyApplicationOffers" + }, + "Result": { + "$ref": "#/definitions/ErrorResults" + } + } + }, + "FindApplicationOffers": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/OfferFilters" + }, + "Result": { + "$ref": "#/definitions/QueryApplicationOffersResults" + } + } + }, + "GetConsumeDetails": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/OfferURLs" + }, + "Result": { + "$ref": "#/definitions/ConsumeOfferDetailsResults" + } + } + }, + "ListApplicationOffers": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/OfferFilters" + }, + "Result": { + "$ref": "#/definitions/QueryApplicationOffersResults" + } + } + }, + "ModifyOfferAccess": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/ModifyOfferAccessRequest" + }, + "Result": { + "$ref": "#/definitions/ErrorResults" + } + } + }, + "Offer": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/AddApplicationOffers" + }, + "Result": { + "$ref": "#/definitions/ErrorResults" + } + } + }, + "RemoteApplicationInfo": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/OfferURLs" + }, + "Result": { + "$ref": "#/definitions/RemoteApplicationInfoResults" + } + } + } + }, + "definitions": { + "AddApplicationOffer": { + "type": "object", + "properties": { + "application-description": { + "type": "string" + }, + "application-name": { + "type": "string" + }, + "endpoints": { + "type": "object", + "patternProperties": { + ".*": { + "type": "string" + } + } + }, + "model-tag": { + "type": "string" + }, + "offer-name": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "model-tag", + "offer-name", + "application-name", + "application-description", + "endpoints" + ] + }, + "AddApplicationOffers": { + "type": "object", + "properties": { + "Offers": { + "type": "array", + "items": { + "$ref": "#/definitions/AddApplicationOffer" + } + } + }, + "additionalProperties": false, + "required": [ + "Offers" + ] + }, + "ApplicationOfferAdminDetails": { + "type": "object", + "properties": { + "ApplicationOfferDetails": { + "$ref": "#/definitions/ApplicationOfferDetails" + }, + "application-name": { + "type": "string" + }, + "charm-url": { + "type": "string" + }, + "connections": { + "type": "array", + "items": { + "$ref": "#/definitions/OfferConnection" + } + } + }, + "additionalProperties": false, + "required": [ + "ApplicationOfferDetails", + "application-name", + "charm-url" + ] + }, + "ApplicationOfferDetails": { + "type": "object", + "properties": { + "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" + }, + "offer-uuid": { + "type": "string" + }, + "source-model-tag": { + "type": "string" + }, + "spaces": { + "type": "array", + "items": { + "$ref": "#/definitions/RemoteSpace" + } + }, + "users": { + "type": "array", + "items": { + "$ref": "#/definitions/OfferUserDetails" + } + } + }, + "additionalProperties": false, + "required": [ + "source-model-tag", + "offer-uuid", + "offer-url", + "offer-name", + "application-description" + ] + }, + "ApplicationOfferResult": { + "type": "object", + "properties": { + "error": { + "$ref": "#/definitions/Error" + }, + "result": { + "$ref": "#/definitions/ApplicationOfferAdminDetails" + } + }, + "additionalProperties": false + }, + "ApplicationOffersResults": { + "type": "object", + "properties": { + "results": { + "type": "array", + "items": { + "$ref": "#/definitions/ApplicationOfferResult" + } + } + }, + "additionalProperties": false + }, + "ConsumeOfferDetails": { + "type": "object", + "properties": { + "external-controller": { + "$ref": "#/definitions/ExternalControllerInfo" + }, + "macaroon": { + "$ref": "#/definitions/Macaroon" + }, + "offer": { + "$ref": "#/definitions/ApplicationOfferDetails" + } + }, + "additionalProperties": false + }, + "ConsumeOfferDetailsResult": { + "type": "object", + "properties": { + "ConsumeOfferDetails": { + "$ref": "#/definitions/ConsumeOfferDetails" + }, + "error": { + "$ref": "#/definitions/Error" + } + }, + "additionalProperties": false, + "required": [ + "ConsumeOfferDetails" + ] + }, + "ConsumeOfferDetailsResults": { + "type": "object", + "properties": { + "results": { + "type": "array", + "items": { + "$ref": "#/definitions/ConsumeOfferDetailsResult" + } + } + }, + "additionalProperties": false + }, + "DestroyApplicationOffers": { + "type": "object", + "properties": { + "force": { + "type": "boolean" + }, + "offer-urls": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false, + "required": [ + "offer-urls" + ] + }, + "EndpointFilterAttributes": { + "type": "object", + "properties": { + "interface": { + "type": "string" + }, + "name": { + "type": "string" + }, + "role": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "role", + "interface", + "name" + ] + }, + "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" + ] + }, + "ExternalControllerInfo": { + "type": "object", + "properties": { + "addrs": { + "type": "array", + "items": { + "type": "string" + } + }, + "ca-cert": { + "type": "string" + }, + "controller-alias": { + "type": "string" + }, + "controller-tag": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "controller-tag", + "controller-alias", + "addrs", + "ca-cert" + ] + }, + "Macaroon": { + "type": "object", + "additionalProperties": false + }, + "ModifyOfferAccess": { + "type": "object", + "properties": { + "access": { + "type": "string" + }, + "action": { + "type": "string" + }, + "offer-url": { + "type": "string" + }, + "user-tag": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "user-tag", + "action", + "access", + "offer-url" + ] + }, + "ModifyOfferAccessRequest": { + "type": "object", + "properties": { + "changes": { + "type": "array", + "items": { + "$ref": "#/definitions/ModifyOfferAccess" + } + } + }, + "additionalProperties": false, + "required": [ + "changes" + ] + }, + "OfferConnection": { + "type": "object", + "properties": { + "endpoint": { + "type": "string" + }, + "ingress-subnets": { + "type": "array", + "items": { + "type": "string" + } + }, + "relation-id": { + "type": "integer" + }, + "source-model-tag": { + "type": "string" + }, + "status": { + "$ref": "#/definitions/EntityStatus" + }, + "username": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "source-model-tag", + "relation-id", + "username", + "endpoint", + "status", + "ingress-subnets" + ] + }, + "OfferFilter": { + "type": "object", + "properties": { + "allowed-users": { + "type": "array", + "items": { + "type": "string" + } + }, + "application-description": { + "type": "string" + }, + "application-name": { + "type": "string" + }, + "application-user": { + "type": "string" + }, + "connected-users": { + "type": "array", + "items": { + "type": "string" + } + }, + "endpoints": { + "type": "array", + "items": { + "$ref": "#/definitions/EndpointFilterAttributes" + } + }, + "model-name": { + "type": "string" + }, + "offer-name": { + "type": "string" + }, + "owner-name": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "owner-name", + "model-name", + "offer-name", + "application-name", + "application-description", + "application-user", + "endpoints", + "connected-users", + "allowed-users" + ] + }, + "OfferFilters": { + "type": "object", + "properties": { + "Filters": { + "type": "array", + "items": { + "$ref": "#/definitions/OfferFilter" + } + } + }, + "additionalProperties": false, + "required": [ + "Filters" + ] + }, + "OfferURLs": { + "type": "object", + "properties": { + "offer-urls": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "OfferUserDetails": { + "type": "object", + "properties": { + "access": { + "type": "string" + }, + "display-name": { + "type": "string" + }, + "user": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "user", + "display-name", + "access" + ] + }, + "QueryApplicationOffersResults": { + "type": "object", + "properties": { + "results": { + "type": "array", + "items": { + "$ref": "#/definitions/ApplicationOfferAdminDetails" + } + } + }, + "additionalProperties": false, + "required": [ + "results" + ] + }, + "RemoteApplicationInfo": { + "type": "object", + "properties": { + "description": { + "type": "string" + }, + "endpoints": { + "type": "array", + "items": { + "$ref": "#/definitions/RemoteEndpoint" + } + }, + "icon-url-path": { + "type": "string" + }, + "model-tag": { + "type": "string" + }, + "name": { + "type": "string" + }, + "offer-url": { + "type": "string" + }, + "source-model-label": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "model-tag", + "name", + "description", + "offer-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" + } + }, + "additionalProperties": false, + "required": [ + "name", + "role", + "interface", + "limit" + ] + }, + "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" + ] + }, + "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": "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": 2, + "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" + }, + "Result": { + "$ref": "#/definitions/ErrorResults" + } + } + }, + "Restore": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/RestoreArgs" + } + } + } + }, + "definitions": { + "BackupsCreateArgs": { + "type": "object", + "properties": { + "keep-copy": { + "type": "boolean" + }, + "no-download": { + "type": "boolean" + }, + "notes": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "notes", + "keep-copy", + "no-download" + ] + }, + "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" + }, + "filename": { + "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", + "filename" + ] + }, + "BackupsRemoveArgs": { + "type": "object", + "properties": { + "ids": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false, + "required": [ + "ids" + ] + }, + "Error": { + "type": "object", + "properties": { + "code": { + "type": "string" + }, + "info": { + "$ref": "#/definitions/ErrorInfo" + }, + "message": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "message", + "code" + ] + }, + "ErrorInfo": { + "type": "object", + "properties": { + "macaroon": { + "$ref": "#/definitions/Macaroon" + }, + "macaroon-path": { + "type": "string" + } + }, + "additionalProperties": false + }, + "ErrorResult": { + "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 + }, + "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": 2, + "Schema": { + "type": "object", + "properties": { + "ExportBundle": { + "type": "object", + "properties": { + "Result": { + "$ref": "#/definitions/StringResult" + } + } + }, + "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": { + "bundleURL": { + "type": "string" + }, + "yaml": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "yaml", + "bundleURL" + ] + }, + "BundleChangesResults": { + "type": "object", + "properties": { + "changes": { + "type": "array", + "items": { + "$ref": "#/definitions/BundleChange" + } + }, + "errors": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "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 + }, + "Macaroon": { + "type": "object", + "additionalProperties": false + }, + "StringResult": { + "type": "object", + "properties": { + "error": { + "$ref": "#/definitions/Error" + }, + "result": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "result" + ] + } + } + } + }, + { + "Name": "CAASAgent", + "Version": 1, + "Schema": { + "type": "object", + "properties": { + "CloudSpec": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/Entities" + }, + "Result": { + "$ref": "#/definitions/CloudSpecResults" + } + } + }, + "GetCloudSpec": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/ModelTag" + }, + "Result": { + "$ref": "#/definitions/CloudSpecResult" + } + } + }, + "ModelConfig": { + "type": "object", + "properties": { + "Result": { + "$ref": "#/definitions/ModelConfigResult" + } + } + }, + "WatchForModelConfigChanges": { + "type": "object", + "properties": { + "Result": { + "$ref": "#/definitions/NotifyWatchResult" + } + } + } + }, + "definitions": { + "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": { + "cacertificates": { + "type": "array", + "items": { + "type": "string" + } + }, + "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 + }, + "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" + ] + } + } + } + }, + { + "Name": "CAASFirewaller", + "Version": 1, + "Schema": { + "type": "object", + "properties": { + "ApplicationsConfig": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/Entities" + }, + "Result": { + "$ref": "#/definitions/ApplicationGetConfigResults" + } + } + }, + "IsExposed": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/Entities" + }, + "Result": { + "$ref": "#/definitions/BoolResults" + } + } + }, + "Life": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/Entities" + }, + "Result": { + "$ref": "#/definitions/LifeResults" + } + } + }, + "Watch": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/Entities" + }, + "Result": { + "$ref": "#/definitions/NotifyWatchResults" + } + } + }, + "WatchApplications": { + "type": "object", + "properties": { + "Result": { + "$ref": "#/definitions/StringsWatchResult" + } + } + } + }, + "definitions": { + "ApplicationGetConfigResults": { + "type": "object", + "properties": { + "Results": { + "type": "array", + "items": { + "$ref": "#/definitions/ConfigResult" + } + } + }, + "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" + ] + }, + "ConfigResult": { + "type": "object", + "properties": { + "config": { + "type": "object", + "patternProperties": { + ".*": { + "type": "object", + "additionalProperties": true + } + } + }, + "error": { + "$ref": "#/definitions/Error" + } + }, + "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" + ] + }, + "Error": { + "type": "object", + "properties": { + "code": { + "type": "string" + }, + "info": { + "$ref": "#/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" + ] + }, + "StringsWatchResult": { + "type": "object", + "properties": { + "changes": { + "type": "array", + "items": { + "type": "string" + } + }, + "error": { + "$ref": "#/definitions/Error" + }, + "watcher-id": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "watcher-id" + ] + } + } + } + }, + { + "Name": "CAASOperator", + "Version": 1, + "Schema": { + "type": "object", + "properties": { + "APIAddresses": { + "type": "object", + "properties": { + "Result": { + "$ref": "#/definitions/StringsResult" + } + } + }, + "APIHostPorts": { + "type": "object", + "properties": { + "Result": { + "$ref": "#/definitions/APIHostPortsResult" + } + } + }, + "Charm": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/Entities" + }, + "Result": { + "$ref": "#/definitions/ApplicationCharmResults" + } + } + }, + "CurrentModel": { + "type": "object", + "properties": { + "Result": { + "$ref": "#/definitions/ModelResult" + } + } + }, + "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" + } + } + }, + "SetPodSpec": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/SetPodSpecParams" + }, + "Result": { + "$ref": "#/definitions/ErrorResults" + } + } + }, + "SetStatus": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/SetStatus" + }, + "Result": { + "$ref": "#/definitions/ErrorResults" + } + } + }, + "SetTools": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/EntitiesVersion" + }, + "Result": { + "$ref": "#/definitions/ErrorResults" + } + } + }, + "Watch": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/Entities" + }, + "Result": { + "$ref": "#/definitions/NotifyWatchResults" + } + } + }, + "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" + ] + }, + "ApplicationCharm": { + "type": "object", + "properties": { + "charm-modified-version": { + "type": "integer" + }, + "force-upgrade": { + "type": "boolean" + }, + "sha256": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "url", + "sha256", + "charm-modified-version" + ] + }, + "ApplicationCharmResult": { + "type": "object", + "properties": { + "error": { + "$ref": "#/definitions/Error" + }, + "result": { + "$ref": "#/definitions/ApplicationCharm" + } + }, + "additionalProperties": false + }, + "ApplicationCharmResults": { + "type": "object", + "properties": { + "results": { + "type": "array", + "items": { + "$ref": "#/definitions/ApplicationCharmResult" + } + } + }, + "additionalProperties": false, + "required": [ + "results" + ] + }, + "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" + ] + }, + "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" + ] + }, + "EntityString": { + "type": "object", + "properties": { + "tag": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "tag", + "value" + ] + }, + "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" + ] + }, + "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 + }, + "ModelResult": { + "type": "object", + "properties": { + "error": { + "$ref": "#/definitions/Error" + }, + "name": { + "type": "string" + }, + "type": { + "type": "string" + }, + "uuid": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "name", + "uuid", + "type" + ] + }, + "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" + ] + }, + "SetPodSpecParams": { + "type": "object", + "properties": { + "specs": { + "type": "array", + "items": { + "$ref": "#/definitions/EntityString" + } + } + }, + "additionalProperties": false, + "required": [ + "specs" + ] + }, + "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" + ] + }, + "Version": { + "type": "object", + "properties": { + "version": { + "$ref": "#/definitions/Binary" + } + }, + "additionalProperties": false, + "required": [ + "version" + ] + } + } + } + }, + { + "Name": "CAASOperatorProvisioner", + "Version": 1, + "Schema": { + "type": "object", + "properties": { + "APIAddresses": { + "type": "object", + "properties": { + "Result": { + "$ref": "#/definitions/StringsResult" + } + } + }, + "APIHostPorts": { + "type": "object", + "properties": { + "Result": { + "$ref": "#/definitions/APIHostPortsResult" + } + } + }, + "Life": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/Entities" + }, + "Result": { + "$ref": "#/definitions/LifeResults" + } + } + }, + "ModelUUID": { + "type": "object", + "properties": { + "Result": { + "$ref": "#/definitions/StringResult" + } + } + }, + "OperatorProvisioningInfo": { + "type": "object", + "properties": { + "Result": { + "$ref": "#/definitions/OperatorProvisioningInfo" + } + } + }, + "SetPasswords": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/EntityPasswords" + }, + "Result": { + "$ref": "#/definitions/ErrorResults" + } + } + }, + "WatchAPIHostPorts": { + "type": "object", + "properties": { + "Result": { + "$ref": "#/definitions/NotifyWatchResult" + } + } + }, + "WatchApplications": { + "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" + ] + }, + "Entities": { + "type": "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" + ] + }, + "HostPort": { + "type": "object", + "properties": { + "Address": { + "$ref": "#/definitions/Address" + }, + "port": { + "type": "integer" + } + }, + "additionalProperties": false, + "required": [ + "Address", + "port" + ] + }, + "KubernetesFilesystemAttachmentParams": { + "type": "object", + "properties": { + "mount-point": { + "type": "string" + }, + "provider": { + "type": "string" + }, + "read-only": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "provider" + ] + }, + "KubernetesFilesystemParams": { + "type": "object", + "properties": { + "attachment": { + "$ref": "#/definitions/KubernetesFilesystemAttachmentParams" + }, + "attributes": { + "type": "object", + "patternProperties": { + ".*": { + "type": "object", + "additionalProperties": true + } + } + }, + "provider": { + "type": "string" + }, + "size": { + "type": "integer" + }, + "storagename": { + "type": "string" + }, + "tags": { + "type": "object", + "patternProperties": { + ".*": { + "type": "string" + } + } + } + }, + "additionalProperties": false, + "required": [ + "storagename", + "size", + "provider" + ] + }, + "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" + ] + }, + "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" + ] + }, + "OperatorProvisioningInfo": { + "type": "object", + "properties": { + "api-addresses": { + "type": "array", + "items": { + "type": "string" + } + }, + "charm-storage": { + "$ref": "#/definitions/KubernetesFilesystemParams" + }, + "image-path": { + "type": "string" + }, + "tags": { + "type": "object", + "patternProperties": { + ".*": { + "type": "string" + } + } + }, + "version": { + "$ref": "#/definitions/Number" + } + }, + "additionalProperties": false, + "required": [ + "image-path", + "version", + "api-addresses", + "charm-storage" + ] + }, + "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" + ] + } + } + } + }, + { + "Name": "CAASUnitProvisioner", + "Version": 1, + "Schema": { + "type": "object", + "properties": { + "ApplicationsConfig": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/Entities" + }, + "Result": { + "$ref": "#/definitions/ApplicationGetConfigResults" + } + } + }, + "ApplicationsScale": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/Entities" + }, + "Result": { + "$ref": "#/definitions/IntResults" + } + } + }, + "Life": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/Entities" + }, + "Result": { + "$ref": "#/definitions/LifeResults" + } + } + }, + "ProvisioningInfo": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/Entities" + }, + "Result": { + "$ref": "#/definitions/KubernetesProvisioningInfoResults" + } + } + }, + "SetOperatorStatus": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/SetStatus" + }, + "Result": { + "$ref": "#/definitions/ErrorResults" + } + } + }, + "UpdateApplicationsService": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/UpdateApplicationServiceArgs" + }, + "Result": { + "$ref": "#/definitions/ErrorResults" + } + } + }, + "UpdateApplicationsUnits": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/UpdateApplicationUnitArgs" + }, + "Result": { + "$ref": "#/definitions/ErrorResults" + } + } + }, + "WatchApplications": { + "type": "object", + "properties": { + "Result": { + "$ref": "#/definitions/StringsWatchResult" + } + } + }, + "WatchApplicationsScale": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/Entities" + }, + "Result": { + "$ref": "#/definitions/NotifyWatchResults" + } + } + }, + "WatchPodSpec": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/Entities" + }, + "Result": { + "$ref": "#/definitions/NotifyWatchResults" + } + } + } + }, + "definitions": { + "Address": { + "type": "object", + "properties": { + "scope": { + "type": "string" + }, + "space-name": { + "type": "string" + }, + "type": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "value", + "type", + "scope" + ] + }, + "ApplicationGetConfigResults": { + "type": "object", + "properties": { + "Results": { + "type": "array", + "items": { + "$ref": "#/definitions/ConfigResult" + } + } + }, + "additionalProperties": false, + "required": [ + "Results" + ] + }, + "ApplicationUnitParams": { + "type": "object", + "properties": { + "address": { + "type": "string" + }, + "data": { + "type": "object", + "patternProperties": { + ".*": { + "type": "object", + "additionalProperties": true + } + } + }, + "filesystem-info": { + "type": "array", + "items": { + "$ref": "#/definitions/KubernetesFilesystemInfo" + } + }, + "info": { + "type": "string" + }, + "ports": { + "type": "array", + "items": { + "type": "string" + } + }, + "provider-id": { + "type": "string" + }, + "status": { + "type": "string" + }, + "unit-tag": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "provider-id", + "unit-tag", + "address", + "ports", + "status", + "info" + ] + }, + "ConfigResult": { + "type": "object", + "properties": { + "config": { + "type": "object", + "patternProperties": { + ".*": { + "type": "object", + "additionalProperties": true + } + } + }, + "error": { + "$ref": "#/definitions/Error" + } + }, + "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" + ] + }, + "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" + ] + }, + "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" + ] + }, + "KubernetesDeviceParams": { + "type": "object", + "properties": { + "Attributes": { + "type": "object", + "patternProperties": { + ".*": { + "type": "string" + } + } + }, + "Count": { + "type": "integer" + }, + "Type": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "Type", + "Count", + "Attributes" + ] + }, + "KubernetesFilesystemAttachmentParams": { + "type": "object", + "properties": { + "mount-point": { + "type": "string" + }, + "provider": { + "type": "string" + }, + "read-only": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "provider" + ] + }, + "KubernetesFilesystemInfo": { + "type": "object", + "properties": { + "data": { + "type": "object", + "patternProperties": { + ".*": { + "type": "object", + "additionalProperties": true + } + } + }, + "filesystem-id": { + "type": "string" + }, + "info": { + "type": "string" + }, + "mount-point": { + "type": "string" + }, + "pool": { + "type": "string" + }, + "read-only": { + "type": "boolean" + }, + "size": { + "type": "integer" + }, + "status": { + "type": "string" + }, + "storagename": { + "type": "string" + }, + "volume": { + "$ref": "#/definitions/KubernetesVolumeInfo" + } + }, + "additionalProperties": false, + "required": [ + "storagename", + "pool", + "size", + "filesystem-id", + "status", + "info", + "volume" + ] + }, + "KubernetesFilesystemParams": { + "type": "object", + "properties": { + "attachment": { + "$ref": "#/definitions/KubernetesFilesystemAttachmentParams" + }, + "attributes": { + "type": "object", + "patternProperties": { + ".*": { + "type": "object", + "additionalProperties": true + } + } + }, + "provider": { + "type": "string" + }, + "size": { + "type": "integer" + }, + "storagename": { + "type": "string" + }, + "tags": { + "type": "object", + "patternProperties": { + ".*": { + "type": "string" + } + } + } + }, + "additionalProperties": false, + "required": [ + "storagename", + "size", + "provider" + ] + }, + "KubernetesProvisioningInfo": { + "type": "object", + "properties": { + "constraints": { + "$ref": "#/definitions/Value" + }, + "devices": { + "type": "array", + "items": { + "$ref": "#/definitions/KubernetesDeviceParams" + } + }, + "filesystems": { + "type": "array", + "items": { + "$ref": "#/definitions/KubernetesFilesystemParams" + } + }, + "placement": { + "type": "string" + }, + "pod-spec": { + "type": "string" + }, + "tags": { + "type": "object", + "patternProperties": { + ".*": { + "type": "string" + } + } + }, + "volumes": { + "type": "array", + "items": { + "$ref": "#/definitions/KubernetesVolumeParams" + } + } + }, + "additionalProperties": false, + "required": [ + "pod-spec", + "constraints" + ] + }, + "KubernetesProvisioningInfoResult": { + "type": "object", + "properties": { + "error": { + "$ref": "#/definitions/Error" + }, + "result": { + "$ref": "#/definitions/KubernetesProvisioningInfo" + } + }, + "additionalProperties": false, + "required": [ + "result" + ] + }, + "KubernetesProvisioningInfoResults": { + "type": "object", + "properties": { + "results": { + "type": "array", + "items": { + "$ref": "#/definitions/KubernetesProvisioningInfoResult" + } + } + }, + "additionalProperties": false, + "required": [ + "results" + ] + }, + "KubernetesVolumeAttachmentParams": { + "type": "object", + "properties": { + "provider": { + "type": "string" + }, + "read-only": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "provider" + ] + }, + "KubernetesVolumeInfo": { + "type": "object", + "properties": { + "data": { + "type": "object", + "patternProperties": { + ".*": { + "type": "object", + "additionalProperties": true + } + } + }, + "info": { + "type": "string" + }, + "persistent": { + "type": "boolean" + }, + "pool": { + "type": "string" + }, + "size": { + "type": "integer" + }, + "status": { + "type": "string" + }, + "volume-id": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "volume-id", + "size", + "persistent", + "status", + "info" + ] + }, + "KubernetesVolumeParams": { + "type": "object", + "properties": { + "attachment": { + "$ref": "#/definitions/KubernetesVolumeAttachmentParams" + }, + "attributes": { + "type": "object", + "patternProperties": { + ".*": { + "type": "object", + "additionalProperties": true + } + } + }, + "provider": { + "type": "string" + }, + "size": { + "type": "integer" + }, + "storagename": { + "type": "string" + }, + "tags": { + "type": "object", + "patternProperties": { + ".*": { + "type": "string" + } + } + } + }, + "additionalProperties": false, + "required": [ + "storagename", + "size", + "provider" + ] + }, + "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" + ] + }, + "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" + ] + }, + "UpdateApplicationServiceArg": { + "type": "object", + "properties": { + "addresses": { + "type": "array", + "items": { + "$ref": "#/definitions/Address" + } + }, + "application-tag": { + "type": "string" + }, + "provider-id": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "application-tag", + "provider-id", + "addresses" + ] + }, + "UpdateApplicationServiceArgs": { + "type": "object", + "properties": { + "args": { + "type": "array", + "items": { + "$ref": "#/definitions/UpdateApplicationServiceArg" + } + } + }, + "additionalProperties": false, + "required": [ + "args" + ] + }, + "UpdateApplicationUnitArgs": { + "type": "object", + "properties": { + "args": { + "type": "array", + "items": { + "$ref": "#/definitions/UpdateApplicationUnits" + } + } + }, + "additionalProperties": false, + "required": [ + "args" + ] + }, + "UpdateApplicationUnits": { + "type": "object", + "properties": { + "application-tag": { + "type": "string" + }, + "units": { + "type": "array", + "items": { + "$ref": "#/definitions/ApplicationUnitParams" + } + } + }, + "additionalProperties": false, + "required": [ + "application-tag", + "units" + ] + }, + "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" + }, + "zones": { + "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 + }, + "CharmDevice": { + "type": "object", + "properties": { + "CountMax": { + "type": "integer" + }, + "CountMin": { + "type": "integer" + }, + "Description": { + "type": "string" + }, + "Name": { + "type": "string" + }, + "Type": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "Name", + "Description", + "Type", + "CountMin", + "CountMax" + ] + }, + "CharmInfo": { + "type": "object", + "properties": { + "actions": { + "$ref": "#/definitions/CharmActions" + }, + "config": { + "type": "object", + "patternProperties": { + ".*": { + "$ref": "#/definitions/CharmOption" + } + } + }, + "lxd-profile": { + "$ref": "#/definitions/CharmLXDProfile" + }, + "meta": { + "$ref": "#/definitions/CharmMeta" + }, + "metrics": { + "$ref": "#/definitions/CharmMetrics" + }, + "revision": { + "type": "integer" + }, + "url": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "revision", + "url", + "config" + ] + }, + "CharmLXDProfile": { + "type": "object", + "properties": { + "config": { + "type": "object", + "patternProperties": { + ".*": { + "type": "string" + } + } + }, + "description": { + "type": "string" + }, + "devices": { + "type": "object", + "patternProperties": { + ".*": { + "type": "object", + "patternProperties": { + ".*": { + "type": "string" + } + } + } + } + } + }, + "additionalProperties": false, + "required": [ + "config", + "description", + "devices" + ] + }, + "CharmMeta": { + "type": "object", + "properties": { + "categories": { + "type": "array", + "items": { + "type": "string" + } + }, + "description": { + "type": "string" + }, + "devices": { + "type": "object", + "patternProperties": { + ".*": { + "$ref": "#/definitions/CharmDevice" + } + } + }, + "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": 2, + "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" + }, + "force": { + "type": "boolean" + }, + "url": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "url", + "channel", + "force" + ] + }, + "AddCharmWithAuthorization": { + "type": "object", + "properties": { + "channel": { + "type": "string" + }, + "force": { + "type": "boolean" + }, + "macaroon": { + "$ref": "#/definitions/Macaroon" + }, + "url": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "url", + "channel", + "macaroon", + "force" + ] + }, + "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" + ] + }, + "ApplicationOfferStatus": { + "type": "object", + "properties": { + "active-connected-count": { + "type": "integer" + }, + "application-name": { + "type": "string" + }, + "charm": { + "type": "string" + }, + "endpoints": { + "type": "object", + "patternProperties": { + ".*": { + "$ref": "#/definitions/RemoteEndpoint" + } + } + }, + "err": { + "type": "object", + "additionalProperties": true + }, + "offer-name": { + "type": "string" + }, + "total-connected-count": { + "type": "integer" + } + }, + "additionalProperties": false, + "required": [ + "offer-name", + "application-name", + "charm", + "endpoints", + "active-connected-count", + "total-connected-count" + ] + }, + "ApplicationStatus": { + "type": "object", + "properties": { + "can-upgrade-to": { + "type": "string" + }, + "charm": { + "type": "string" + }, + "charm-verion": { + "type": "string" + }, + "endpoint-bindings": { + "type": "object", + "patternProperties": { + ".*": { + "type": "string" + } + } + }, + "err": { + "type": "object", + "additionalProperties": true + }, + "exposed": { + "type": "boolean" + }, + "int": { + "type": "integer" + }, + "life": { + "type": "string" + }, + "meter-statuses": { + "type": "object", + "patternProperties": { + ".*": { + "$ref": "#/definitions/MeterStatus" + } + } + }, + "provider-id": { + "type": "string" + }, + "public-address": { + "type": "string" + }, + "relations": { + "type": "object", + "patternProperties": { + ".*": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "series": { + "type": "string" + }, + "status": { + "$ref": "#/definitions/DetailedStatus" + }, + "string": { + "type": "string" + }, + "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", + "charm-verion", + "endpoint-bindings", + "public-address" + ] + }, + "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": { + "bundleURL": { + "type": "string" + }, + "yaml": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "yaml", + "bundleURL" + ] + }, + "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": { + "agentstream": { + "type": "string" + }, + "arch": { + "type": "string" + }, + "major": { + "type": "integer" + }, + "minor": { + "type": "integer" + }, + "number": { + "$ref": "#/definitions/Number" + }, + "series": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "number", + "major", + "minor", + "arch", + "series", + "agentstream" + ] + }, + "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" + } + } + }, + "controller-timestamp": { + "type": "string", + "format": "date-time" + }, + "machines": { + "type": "object", + "patternProperties": { + ".*": { + "$ref": "#/definitions/MachineStatus" + } + } + }, + "model": { + "$ref": "#/definitions/ModelStatusInfo" + }, + "offers": { + "type": "object", + "patternProperties": { + ".*": { + "$ref": "#/definitions/ApplicationOfferStatus" + } + } + }, + "relations": { + "type": "array", + "items": { + "$ref": "#/definitions/RelationStatus" + } + }, + "remote-applications": { + "type": "object", + "patternProperties": { + ".*": { + "$ref": "#/definitions/RemoteApplicationStatus" + } + } + } + }, + "additionalProperties": false, + "required": [ + "model", + "machines", + "applications", + "remote-applications", + "offers", + "relations", + "controller-timestamp" + ] + }, + "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" + ] + }, + "LXDProfile": { + "type": "object", + "properties": { + "config": { + "type": "object", + "patternProperties": { + ".*": { + "type": "string" + } + } + }, + "description": { + "type": "string" + }, + "devices": { + "type": "object", + "patternProperties": { + ".*": { + "type": "object", + "patternProperties": { + ".*": { + "type": "string" + } + } + } + } + } + }, + "additionalProperties": false, + "required": [ + "config", + "description", + "devices" + ] + }, + "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" + } + }, + "lxd-profiles": { + "type": "object", + "patternProperties": { + ".*": { + "$ref": "#/definitions/LXDProfile" + } + } + }, + "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" + }, + "type": { + "type": "string" + }, + "users": { + "type": "array", + "items": { + "$ref": "#/definitions/ModelUserInfo" + } + }, + "uuid": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "name", + "type", + "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" + }, + "message": { + "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" + }, + "type": { + "type": "string" + }, + "version": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "name", + "type", + "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" + }, + "status": { + "$ref": "#/definitions/DetailedStatus" + } + }, + "additionalProperties": false, + "required": [ + "id", + "key", + "interface", + "scope", + "endpoints", + "status" + ] + }, + "RemoteApplicationStatus": { + "type": "object", + "properties": { + "endpoints": { + "type": "array", + "items": { + "$ref": "#/definitions/RemoteEndpoint" + } + }, + "err": { + "type": "object", + "additionalProperties": true + }, + "life": { + "type": "string" + }, + "offer-name": { + "type": "string" + }, + "offer-url": { + "type": "string" + }, + "relations": { + "type": "object", + "patternProperties": { + ".*": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "status": { + "$ref": "#/definitions/DetailedStatus" + } + }, + "additionalProperties": false, + "required": [ + "offer-url", + "offer-name", + "endpoints", + "life", + "relations", + "status" + ] + }, + "RemoteEndpoint": { + "type": "object", + "properties": { + "interface": { + "type": "string" + }, + "limit": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "role": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "name", + "role", + "interface", + "limit" + ] + }, + "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": { + "force": { + "type": "boolean" + }, + "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": { + "address": { + "type": "string" + }, + "agent-status": { + "$ref": "#/definitions/DetailedStatus" + }, + "charm": { + "type": "string" + }, + "leader": { + "type": "boolean" + }, + "machine": { + "type": "string" + }, + "opened-ports": { + "type": "array", + "items": { + "type": "string" + } + }, + "provider-id": { + "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" + }, + "zones": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + } + } + } + }, + { + "Name": "Cloud", + "Version": 3, + "Schema": { + "type": "object", + "properties": { + "AddCloud": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/AddCloudArgs" + } + } + }, + "AddCredentials": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/TaggedCredentials" + }, + "Result": { + "$ref": "#/definitions/ErrorResults" + } + } + }, + "CheckCredentialsModels": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/TaggedCredentials" + }, + "Result": { + "$ref": "#/definitions/UpdateCredentialResults" + } + } + }, + "Cloud": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/Entities" + }, + "Result": { + "$ref": "#/definitions/CloudResults" + } + } + }, + "CloudInfo": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/Entities" + }, + "Result": { + "$ref": "#/definitions/CloudInfoResults" + } + } + }, + "Clouds": { + "type": "object", + "properties": { + "Result": { + "$ref": "#/definitions/CloudsResult" + } + } + }, + "Credential": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/Entities" + }, + "Result": { + "$ref": "#/definitions/CloudCredentialResults" + } + } + }, + "CredentialContents": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/CloudCredentialArgs" + }, + "Result": { + "$ref": "#/definitions/CredentialContentResults" + } + } + }, + "DefaultCloud": { + "type": "object", + "properties": { + "Result": { + "$ref": "#/definitions/StringResult" + } + } + }, + "InstanceTypes": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/CloudInstanceTypesConstraints" + }, + "Result": { + "$ref": "#/definitions/InstanceTypesResults" + } + } + }, + "ListCloudInfo": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/ListCloudsRequest" + }, + "Result": { + "$ref": "#/definitions/ListCloudInfoResults" + } + } + }, + "ModifyCloudAccess": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/ModifyCloudAccessRequest" + }, + "Result": { + "$ref": "#/definitions/ErrorResults" + } + } + }, + "RemoveClouds": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/Entities" + }, + "Result": { + "$ref": "#/definitions/ErrorResults" + } + } + }, + "RevokeCredentialsCheckModels": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/RevokeCredentialArgs" + }, + "Result": { + "$ref": "#/definitions/ErrorResults" + } + } + }, + "UpdateCredentialsCheckModels": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/UpdateCredentialArgs" + }, + "Result": { + "$ref": "#/definitions/UpdateCredentialResults" + } + } + }, + "UserCredentials": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/UserClouds" + }, + "Result": { + "$ref": "#/definitions/StringsResults" + } + } + } + }, + "definitions": { + "AddCloudArgs": { + "type": "object", + "properties": { + "cloud": { + "$ref": "#/definitions/Cloud" + }, + "name": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "cloud", + "name" + ] + }, + "Cloud": { + "type": "object", + "properties": { + "auth-types": { + "type": "array", + "items": { + "type": "string" + } + }, + "ca-certificates": { + "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" + ] + }, + "CloudCredentialArg": { + "type": "object", + "properties": { + "cloud-name": { + "type": "string" + }, + "credential-name": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "cloud-name", + "credential-name" + ] + }, + "CloudCredentialArgs": { + "type": "object", + "properties": { + "credentials": { + "type": "array", + "items": { + "$ref": "#/definitions/CloudCredentialArg" + } + }, + "include-secrets": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "include-secrets" + ] + }, + "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 + }, + "CloudDetails": { + "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" + ] + }, + "CloudInfo": { + "type": "object", + "properties": { + "CloudDetails": { + "$ref": "#/definitions/CloudDetails" + }, + "users": { + "type": "array", + "items": { + "$ref": "#/definitions/CloudUserInfo" + } + } + }, + "additionalProperties": false, + "required": [ + "CloudDetails", + "users" + ] + }, + "CloudInfoResult": { + "type": "object", + "properties": { + "error": { + "$ref": "#/definitions/Error" + }, + "result": { + "$ref": "#/definitions/CloudInfo" + } + }, + "additionalProperties": false + }, + "CloudInfoResults": { + "type": "object", + "properties": { + "results": { + "type": "array", + "items": { + "$ref": "#/definitions/CloudInfoResult" + } + } + }, + "additionalProperties": false, + "required": [ + "results" + ] + }, + "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 + }, + "CloudUserInfo": { + "type": "object", + "properties": { + "access": { + "type": "string" + }, + "display-name": { + "type": "string" + }, + "user": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "user", + "display-name", + "access" + ] + }, + "CloudsResult": { + "type": "object", + "properties": { + "clouds": { + "type": "object", + "patternProperties": { + ".*": { + "$ref": "#/definitions/Cloud" + } + } + } + }, + "additionalProperties": false + }, + "ControllerCredentialInfo": { + "type": "object", + "properties": { + "content": { + "$ref": "#/definitions/CredentialContent" + }, + "models": { + "type": "array", + "items": { + "$ref": "#/definitions/ModelAccess" + } + } + }, + "additionalProperties": false + }, + "CredentialContent": { + "type": "object", + "properties": { + "attrs": { + "type": "object", + "patternProperties": { + ".*": { + "type": "string" + } + } + }, + "auth-type": { + "type": "string" + }, + "cloud": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "name", + "cloud", + "auth-type" + ] + }, + "CredentialContentResult": { + "type": "object", + "properties": { + "error": { + "$ref": "#/definitions/Error" + }, + "result": { + "$ref": "#/definitions/ControllerCredentialInfo" + } + }, + "additionalProperties": false + }, + "CredentialContentResults": { + "type": "object", + "properties": { + "results": { + "type": "array", + "items": { + "$ref": "#/definitions/CredentialContentResult" + } + } + }, + "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" + ] + }, + "ListCloudInfo": { + "type": "object", + "properties": { + "CloudDetails": { + "$ref": "#/definitions/CloudDetails" + }, + "user-access": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "CloudDetails", + "user-access" + ] + }, + "ListCloudInfoResult": { + "type": "object", + "properties": { + "error": { + "$ref": "#/definitions/Error" + }, + "result": { + "$ref": "#/definitions/ListCloudInfo" + } + }, + "additionalProperties": false + }, + "ListCloudInfoResults": { + "type": "object", + "properties": { + "results": { + "type": "array", + "items": { + "$ref": "#/definitions/ListCloudInfoResult" + } + } + }, + "additionalProperties": false, + "required": [ + "results" + ] + }, + "ListCloudsRequest": { + "type": "object", + "properties": { + "all": { + "type": "boolean" + }, + "user-tag": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "user-tag" + ] + }, + "Macaroon": { + "type": "object", + "additionalProperties": false + }, + "ModelAccess": { + "type": "object", + "properties": { + "access": { + "type": "string" + }, + "model": { + "type": "string" + } + }, + "additionalProperties": false + }, + "ModifyCloudAccess": { + "type": "object", + "properties": { + "access": { + "type": "string" + }, + "action": { + "type": "string" + }, + "cloud-tag": { + "type": "string" + }, + "user-tag": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "user-tag", + "cloud-tag", + "action", + "access" + ] + }, + "ModifyCloudAccessRequest": { + "type": "object", + "properties": { + "changes": { + "type": "array", + "items": { + "$ref": "#/definitions/ModifyCloudAccess" + } + } + }, + "additionalProperties": false, + "required": [ + "changes" + ] + }, + "RevokeCredentialArg": { + "type": "object", + "properties": { + "force": { + "type": "boolean" + }, + "tag": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "tag", + "force" + ] + }, + "RevokeCredentialArgs": { + "type": "object", + "properties": { + "credentials": { + "type": "array", + "items": { + "$ref": "#/definitions/RevokeCredentialArg" + } + } + }, + "additionalProperties": false, + "required": [ + "credentials" + ] + }, + "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" + ] + }, + "TaggedCredential": { + "type": "object", + "properties": { + "credential": { + "$ref": "#/definitions/CloudCredential" + }, + "tag": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "tag", + "credential" + ] + }, + "TaggedCredentials": { + "type": "object", + "properties": { + "credentials": { + "type": "array", + "items": { + "$ref": "#/definitions/TaggedCredential" + } + } + }, + "additionalProperties": false + }, + "UpdateCredentialArgs": { + "type": "object", + "properties": { + "credentials": { + "type": "array", + "items": { + "$ref": "#/definitions/TaggedCredential" + } + }, + "force": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "credentials", + "force" + ] + }, + "UpdateCredentialModelResult": { + "type": "object", + "properties": { + "errors": { + "type": "array", + "items": { + "$ref": "#/definitions/ErrorResult" + } + }, + "name": { + "type": "string" + }, + "uuid": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "uuid", + "name" + ] + }, + "UpdateCredentialResult": { + "type": "object", + "properties": { + "error": { + "$ref": "#/definitions/Error" + }, + "models": { + "type": "array", + "items": { + "$ref": "#/definitions/UpdateCredentialModelResult" + } + }, + "tag": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "tag" + ] + }, + "UpdateCredentialResults": { + "type": "object", + "properties": { + "results": { + "type": "array", + "items": { + "$ref": "#/definitions/UpdateCredentialResult" + } + } + }, + "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" + }, + "zones": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + } + } + } + }, + { + "Name": "Controller", + "Version": 5, + "Schema": { + "type": "object", + "properties": { + "AllModels": { + "type": "object", + "properties": { + "Result": { + "$ref": "#/definitions/UserModelList" + } + } + }, + "CloudSpec": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/Entities" + }, + "Result": { + "$ref": "#/definitions/CloudSpecResults" + } + } + }, + "ConfigSet": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/ControllerConfigSet" + } + } + }, + "ControllerAPIInfoForModels": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/Entities" + }, + "Result": { + "$ref": "#/definitions/ControllerAPIInfoResults" + } + } + }, + "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": { + "cacertificates": { + "type": "array", + "items": { + "type": "string" + } + }, + "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" + ] + }, + "ControllerAPIInfoResult": { + "type": "object", + "properties": { + "addresses": { + "type": "array", + "items": { + "type": "string" + } + }, + "cacert": { + "type": "string" + }, + "error": { + "$ref": "#/definitions/Error" + } + }, + "additionalProperties": false, + "required": [ + "addresses", + "cacert" + ] + }, + "ControllerAPIInfoResults": { + "type": "object", + "properties": { + "results": { + "type": "array", + "items": { + "$ref": "#/definitions/ControllerAPIInfoResult" + } + } + }, + "additionalProperties": false, + "required": [ + "results" + ] + }, + "ControllerConfigResult": { + "type": "object", + "properties": { + "config": { + "type": "object", + "patternProperties": { + ".*": { + "type": "object", + "additionalProperties": true + } + } + } + }, + "additionalProperties": false, + "required": [ + "config" + ] + }, + "ControllerConfigSet": { + "type": "object", + "properties": { + "config": { + "type": "object", + "patternProperties": { + ".*": { + "type": "object", + "additionalProperties": true + } + } + } + }, + "additionalProperties": false, + "required": [ + "config" + ] + }, + "DestroyControllerArgs": { + "type": "object", + "properties": { + "destroy-models": { + "type": "boolean" + }, + "destroy-storage": { + "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" + }, + "type": { + "type": "string" + }, + "uuid": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "name", + "uuid", + "type", + "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" + ] + }, + "ModelFilesystemInfo": { + "type": "object", + "properties": { + "detachable": { + "type": "boolean" + }, + "id": { + "type": "string" + }, + "message": { + "type": "string" + }, + "provider-id": { + "type": "string" + }, + "status": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "id" + ] + }, + "ModelMachineInfo": { + "type": "object", + "properties": { + "hardware": { + "$ref": "#/definitions/MachineHardware" + }, + "has-vote": { + "type": "boolean" + }, + "id": { + "type": "string" + }, + "instance-id": { + "type": "string" + }, + "message": { + "type": "string" + }, + "status": { + "type": "string" + }, + "wants-vote": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "id" + ] + }, + "ModelStatus": { + "type": "object", + "properties": { + "application-count": { + "type": "integer" + }, + "error": { + "$ref": "#/definitions/Error" + }, + "filesystems": { + "type": "array", + "items": { + "$ref": "#/definitions/ModelFilesystemInfo" + } + }, + "hosted-machine-count": { + "type": "integer" + }, + "life": { + "type": "string" + }, + "machines": { + "type": "array", + "items": { + "$ref": "#/definitions/ModelMachineInfo" + } + }, + "model-tag": { + "type": "string" + }, + "owner-tag": { + "type": "string" + }, + "volumes": { + "type": "array", + "items": { + "$ref": "#/definitions/ModelVolumeInfo" + } + } + }, + "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 + }, + "ModelVolumeInfo": { + "type": "object", + "properties": { + "detachable": { + "type": "boolean" + }, + "id": { + "type": "string" + }, + "message": { + "type": "string" + }, + "provider-id": { + "type": "string" + }, + "status": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "id" + ] + }, + "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": "CredentialManager", + "Version": 1, + "Schema": { + "type": "object", + "properties": { + "InvalidateModelCredential": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/InvalidateCredentialArg" + }, + "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 + }, + "InvalidateCredentialArg": { + "type": "object", + "properties": { + "reason": { + "type": "string" + } + }, + "additionalProperties": false + }, + "Macaroon": { + "type": "object", + "additionalProperties": false + } + } + } + }, + { + "Name": "CredentialValidator", + "Version": 2, + "Schema": { + "type": "object", + "properties": { + "InvalidateModelCredential": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/InvalidateCredentialArg" + }, + "Result": { + "$ref": "#/definitions/ErrorResult" + } + } + }, + "ModelCredential": { + "type": "object", + "properties": { + "Result": { + "$ref": "#/definitions/ModelCredential" + } + } + }, + "WatchCredential": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/Entity" + }, + "Result": { + "$ref": "#/definitions/NotifyWatchResult" + } + } + }, + "WatchModelCredential": { + "type": "object", + "properties": { + "Result": { + "$ref": "#/definitions/NotifyWatchResult" + } + } + } + }, + "definitions": { + "Entity": { + "type": "object", + "properties": { + "tag": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "tag" + ] + }, + "Error": { + "type": "object", + "properties": { + "code": { + "type": "string" + }, + "info": { + "$ref": "#/definitions/ErrorInfo" + }, + "message": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "message", + "code" + ] + }, + "ErrorInfo": { + "type": "object", + "properties": { + "macaroon": { + "$ref": "#/definitions/Macaroon" + }, + "macaroon-path": { + "type": "string" + } + }, + "additionalProperties": false + }, + "ErrorResult": { + "type": "object", + "properties": { + "error": { + "$ref": "#/definitions/Error" + } + }, + "additionalProperties": false + }, + "InvalidateCredentialArg": { + "type": "object", + "properties": { + "reason": { + "type": "string" + } + }, + "additionalProperties": false + }, + "Macaroon": { + "type": "object", + "additionalProperties": false + }, + "ModelCredential": { + "type": "object", + "properties": { + "credential-tag": { + "type": "string" + }, + "exists": { + "type": "boolean" + }, + "model-tag": { + "type": "string" + }, + "valid": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "model-tag", + "credential-tag" + ] + }, + "NotifyWatchResult": { + "type": "object", + "properties": { + "NotifyWatcherId": { + "type": "string" + }, + "error": { + "$ref": "#/definitions/Error" + } + }, + "additionalProperties": false, + "required": [ + "NotifyWatcherId" + ] + } + } + } + }, + { + "Name": "CrossController", + "Version": 1, + "Schema": { + "type": "object", + "properties": { + "ControllerInfo": { + "type": "object", + "properties": { + "Result": { + "$ref": "#/definitions/ControllerAPIInfoResults" + } + } + }, + "WatchControllerInfo": { + "type": "object", + "properties": { + "Result": { + "$ref": "#/definitions/NotifyWatchResults" + } + } + } + }, + "definitions": { + "ControllerAPIInfoResult": { + "type": "object", + "properties": { + "addresses": { + "type": "array", + "items": { + "type": "string" + } + }, + "cacert": { + "type": "string" + }, + "error": { + "$ref": "#/definitions/Error" + } + }, + "additionalProperties": false, + "required": [ + "addresses", + "cacert" + ] + }, + "ControllerAPIInfoResults": { + "type": "object", + "properties": { + "results": { + "type": "array", + "items": { + "$ref": "#/definitions/ControllerAPIInfoResult" + } + } + }, + "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 + }, + "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": "CrossModelRelations", + "Version": 1, + "Schema": { + "type": "object", + "properties": { + "PublishIngressNetworkChanges": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/IngressNetworksChanges" + }, + "Result": { + "$ref": "#/definitions/ErrorResults" + } + } + }, + "PublishRelationChanges": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/RemoteRelationsChanges" + }, + "Result": { + "$ref": "#/definitions/ErrorResults" + } + } + }, + "RegisterRemoteRelations": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/RegisterRemoteRelationArgs" + }, + "Result": { + "$ref": "#/definitions/RegisterRemoteRelationResults" + } + } + }, + "RelationUnitSettings": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/RemoteRelationUnits" + }, + "Result": { + "$ref": "#/definitions/SettingsResults" + } + } + }, + "WatchEgressAddressesForRelations": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/RemoteEntityArgs" + }, + "Result": { + "$ref": "#/definitions/StringsWatchResults" + } + } + }, + "WatchOfferStatus": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/OfferArgs" + }, + "Result": { + "$ref": "#/definitions/OfferStatusWatchResults" + } + } + }, + "WatchRelationUnits": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/RemoteEntityArgs" + }, + "Result": { + "$ref": "#/definitions/RelationUnitsWatchResults" + } + } + }, + "WatchRelationsSuspendedStatus": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/RemoteEntityArgs" + }, + "Result": { + "$ref": "#/definitions/RelationStatusWatchResults" + } + } + } + }, + "definitions": { + "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" + ] + }, + "IngressNetworksChangeEvent": { + "type": "object", + "properties": { + "application-token": { + "type": "string" + }, + "ingress-required": { + "type": "boolean" + }, + "macaroons": { + "type": "array", + "items": { + "$ref": "#/definitions/Macaroon" + } + }, + "networks": { + "type": "array", + "items": { + "type": "string" + } + }, + "relation-token": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "relation-token", + "application-token", + "ingress-required" + ] + }, + "IngressNetworksChanges": { + "type": "object", + "properties": { + "changes": { + "type": "array", + "items": { + "$ref": "#/definitions/IngressNetworksChangeEvent" + } + } + }, + "additionalProperties": false + }, + "Macaroon": { + "type": "object", + "additionalProperties": false + }, + "OfferArg": { + "type": "object", + "properties": { + "macaroons": { + "type": "array", + "items": { + "$ref": "#/definitions/Macaroon" + } + }, + "offer-uuid": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "offer-uuid" + ] + }, + "OfferArgs": { + "type": "object", + "properties": { + "args": { + "type": "array", + "items": { + "$ref": "#/definitions/OfferArg" + } + } + }, + "additionalProperties": false, + "required": [ + "args" + ] + }, + "OfferStatusChange": { + "type": "object", + "properties": { + "offer-name": { + "type": "string" + }, + "status": { + "$ref": "#/definitions/EntityStatus" + } + }, + "additionalProperties": false, + "required": [ + "offer-name", + "status" + ] + }, + "OfferStatusWatchResult": { + "type": "object", + "properties": { + "changes": { + "type": "array", + "items": { + "$ref": "#/definitions/OfferStatusChange" + } + }, + "error": { + "$ref": "#/definitions/Error" + }, + "watcher-id": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "watcher-id", + "changes" + ] + }, + "OfferStatusWatchResults": { + "type": "object", + "properties": { + "results": { + "type": "array", + "items": { + "$ref": "#/definitions/OfferStatusWatchResult" + } + } + }, + "additionalProperties": false, + "required": [ + "results" + ] + }, + "RegisterRemoteRelationArg": { + "type": "object", + "properties": { + "application-token": { + "type": "string" + }, + "local-endpoint-name": { + "type": "string" + }, + "macaroons": { + "type": "array", + "items": { + "$ref": "#/definitions/Macaroon" + } + }, + "offer-uuid": { + "type": "string" + }, + "relation-token": { + "type": "string" + }, + "remote-endpoint": { + "$ref": "#/definitions/RemoteEndpoint" + }, + "remote-space": { + "$ref": "#/definitions/RemoteSpace" + }, + "source-model-tag": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "application-token", + "source-model-tag", + "relation-token", + "remote-endpoint", + "remote-space", + "offer-uuid", + "local-endpoint-name" + ] + }, + "RegisterRemoteRelationArgs": { + "type": "object", + "properties": { + "relations": { + "type": "array", + "items": { + "$ref": "#/definitions/RegisterRemoteRelationArg" + } + } + }, + "additionalProperties": false, + "required": [ + "relations" + ] + }, + "RegisterRemoteRelationResult": { + "type": "object", + "properties": { + "error": { + "$ref": "#/definitions/Error" + }, + "result": { + "$ref": "#/definitions/RemoteRelationDetails" + } + }, + "additionalProperties": false + }, + "RegisterRemoteRelationResults": { + "type": "object", + "properties": { + "results": { + "type": "array", + "items": { + "$ref": "#/definitions/RegisterRemoteRelationResult" + } + } + }, + "additionalProperties": false + }, + "RelationLifeSuspendedStatusChange": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "life": { + "type": "string" + }, + "suspended": { + "type": "boolean" + }, + "suspended-reason": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "key", + "life", + "suspended", + "suspended-reason" + ] + }, + "RelationLifeSuspendedStatusWatchResult": { + "type": "object", + "properties": { + "changes": { + "type": "array", + "items": { + "$ref": "#/definitions/RelationLifeSuspendedStatusChange" + } + }, + "error": { + "$ref": "#/definitions/Error" + }, + "watcher-id": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "watcher-id", + "changes" + ] + }, + "RelationStatusWatchResults": { + "type": "object", + "properties": { + "results": { + "type": "array", + "items": { + "$ref": "#/definitions/RelationLifeSuspendedStatusWatchResult" + } + } + }, + "additionalProperties": false, + "required": [ + "results" + ] + }, + "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" + ] + }, + "RelationUnitsWatchResults": { + "type": "object", + "properties": { + "results": { + "type": "array", + "items": { + "$ref": "#/definitions/RelationUnitsWatchResult" + } + } + }, + "additionalProperties": false, + "required": [ + "results" + ] + }, + "RemoteEndpoint": { + "type": "object", + "properties": { + "interface": { + "type": "string" + }, + "limit": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "role": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "name", + "role", + "interface", + "limit" + ] + }, + "RemoteEntityArg": { + "type": "object", + "properties": { + "macaroons": { + "type": "array", + "items": { + "$ref": "#/definitions/Macaroon" + } + }, + "relation-token": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "relation-token" + ] + }, + "RemoteEntityArgs": { + "type": "object", + "properties": { + "args": { + "type": "array", + "items": { + "$ref": "#/definitions/RemoteEntityArg" + } + } + }, + "additionalProperties": false, + "required": [ + "args" + ] + }, + "RemoteRelationChangeEvent": { + "type": "object", + "properties": { + "application-token": { + "type": "string" + }, + "changed-units": { + "type": "array", + "items": { + "$ref": "#/definitions/RemoteRelationUnitChange" + } + }, + "departed-units": { + "type": "array", + "items": { + "type": "integer" + } + }, + "force-cleanup": { + "type": "boolean" + }, + "life": { + "type": "string" + }, + "macaroons": { + "type": "array", + "items": { + "$ref": "#/definitions/Macaroon" + } + }, + "relation-token": { + "type": "string" + }, + "suspended": { + "type": "boolean" + }, + "suspended-reason": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "relation-token", + "application-token", + "life" + ] + }, + "RemoteRelationDetails": { + "type": "object", + "properties": { + "macaroon": { + "$ref": "#/definitions/Macaroon" + }, + "relation-token": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "relation-token" + ] + }, + "RemoteRelationUnit": { + "type": "object", + "properties": { + "macaroons": { + "type": "array", + "items": { + "$ref": "#/definitions/Macaroon" + } + }, + "relation-token": { + "type": "string" + }, + "unit": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "relation-token", + "unit" + ] + }, + "RemoteRelationUnitChange": { + "type": "object", + "properties": { + "settings": { + "type": "object", + "patternProperties": { + ".*": { + "type": "object", + "additionalProperties": true + } + } + }, + "unit-id": { + "type": "integer" + } + }, + "additionalProperties": false, + "required": [ + "unit-id" + ] + }, + "RemoteRelationUnits": { + "type": "object", + "properties": { + "relation-units": { + "type": "array", + "items": { + "$ref": "#/definitions/RemoteRelationUnit" + } + } + }, + "additionalProperties": false, + "required": [ + "relation-units" + ] + }, + "RemoteRelationsChanges": { + "type": "object", + "properties": { + "changes": { + "type": "array", + "items": { + "$ref": "#/definitions/RemoteRelationChangeEvent" + } + } + }, + "additionalProperties": false + }, + "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" + ] + }, + "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" + ] + }, + "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" + ] + }, + "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" + ] + }, + "UnitSettings": { + "type": "object", + "properties": { + "version": { + "type": "integer" + } + }, + "additionalProperties": false, + "required": [ + "version" + ] + } + } + } + }, + { + "Name": "Deployer", + "Version": 1, + "Schema": { + "type": "object", + "properties": { + "APIAddresses": { + "type": "object", + "properties": { + "Result": { + "$ref": "#/definitions/StringsResult" + } + } + }, + "APIHostPorts": { + "type": "object", + "properties": { + "Result": { + "$ref": "#/definitions/APIHostPortsResult" + } + } + }, + "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" + } + } + }, + "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" + ] + }, + "DeployerConnectionValues": { + "type": "object", + "properties": { + "api-addresses": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false, + "required": [ + "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": "ExternalControllerUpdater", + "Version": 1, + "Schema": { + "type": "object", + "properties": { + "ExternalControllerInfo": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/Entities" + }, + "Result": { + "$ref": "#/definitions/ExternalControllerInfoResults" + } + } + }, + "SetExternalControllerInfo": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/SetExternalControllersInfoParams" + }, + "Result": { + "$ref": "#/definitions/ErrorResults" + } + } + }, + "WatchExternalControllers": { + "type": "object", + "properties": { + "Result": { + "$ref": "#/definitions/StringsWatchResults" + } + } + } + }, + "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" + ] + }, + "ExternalControllerInfo": { + "type": "object", + "properties": { + "addrs": { + "type": "array", + "items": { + "type": "string" + } + }, + "ca-cert": { + "type": "string" + }, + "controller-alias": { + "type": "string" + }, + "controller-tag": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "controller-tag", + "controller-alias", + "addrs", + "ca-cert" + ] + }, + "ExternalControllerInfoResult": { + "type": "object", + "properties": { + "error": { + "$ref": "#/definitions/Error" + }, + "result": { + "$ref": "#/definitions/ExternalControllerInfo" + } + }, + "additionalProperties": false, + "required": [ + "result", + "error" + ] + }, + "ExternalControllerInfoResults": { + "type": "object", + "properties": { + "results": { + "type": "array", + "items": { + "$ref": "#/definitions/ExternalControllerInfoResult" + } + } + }, + "additionalProperties": false, + "required": [ + "results" + ] + }, + "Macaroon": { + "type": "object", + "additionalProperties": false + }, + "SetExternalControllerInfoParams": { + "type": "object", + "properties": { + "info": { + "$ref": "#/definitions/ExternalControllerInfo" + } + }, + "additionalProperties": false, + "required": [ + "info" + ] + }, + "SetExternalControllersInfoParams": { + "type": "object", + "properties": { + "controllers": { + "type": "array", + "items": { + "$ref": "#/definitions/SetExternalControllerInfoParams" + } + } + }, + "additionalProperties": false, + "required": [ + "controllers" + ] + }, + "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": "FanConfigurer", + "Version": 1, + "Schema": { + "type": "object", + "properties": { + "FanConfig": { + "type": "object", + "properties": { + "Result": { + "$ref": "#/definitions/FanConfigResult" + } + } + }, + "WatchForFanConfigChanges": { + "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 + }, + "FanConfigEntry": { + "type": "object", + "properties": { + "overlay": { + "type": "string" + }, + "underlay": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "underlay", + "overlay" + ] + }, + "FanConfigResult": { + "type": "object", + "properties": { + "fans": { + "type": "array", + "items": { + "$ref": "#/definitions/FanConfigEntry" + } + } + }, + "additionalProperties": false, + "required": [ + "fans" + ] + }, + "Macaroon": { + "type": "object", + "additionalProperties": false + }, + "NotifyWatchResult": { + "type": "object", + "properties": { + "NotifyWatcherId": { + "type": "string" + }, + "error": { + "$ref": "#/definitions/Error" + } + }, + "additionalProperties": false, + "required": [ + "NotifyWatcherId" + ] + } + } + } + }, + { + "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": "FirewallRules", + "Version": 1, + "Schema": { + "type": "object", + "properties": { + "ListFirewallRules": { + "type": "object", + "properties": { + "Result": { + "$ref": "#/definitions/ListFirewallRulesResults" + } + } + }, + "SetFirewallRules": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/FirewallRuleArgs" + }, + "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" + ] + }, + "FirewallRule": { + "type": "object", + "properties": { + "known-service": { + "type": "string" + }, + "whitelist-cidrs": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false, + "required": [ + "known-service" + ] + }, + "FirewallRuleArgs": { + "type": "object", + "properties": { + "args": { + "type": "array", + "items": { + "$ref": "#/definitions/FirewallRule" + } + } + }, + "additionalProperties": false, + "required": [ + "args" + ] + }, + "ListFirewallRulesResults": { + "type": "object", + "properties": { + "Rules": { + "type": "array", + "items": { + "$ref": "#/definitions/FirewallRule" + } + } + }, + "additionalProperties": false, + "required": [ + "Rules" + ] + }, + "Macaroon": { + "type": "object", + "additionalProperties": false + } + } + } + }, + { + "Name": "Firewaller", + "Version": 5, + "Schema": { + "type": "object", + "properties": { + "AreManuallyProvisioned": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/Entities" + }, + "Result": { + "$ref": "#/definitions/BoolResults" + } + } + }, + "CloudSpec": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/Entities" + }, + "Result": { + "$ref": "#/definitions/CloudSpecResults" + } + } + }, + "ControllerAPIInfoForModels": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/Entities" + }, + "Result": { + "$ref": "#/definitions/ControllerAPIInfoResults" + } + } + }, + "ControllerConfig": { + "type": "object", + "properties": { + "Result": { + "$ref": "#/definitions/ControllerConfigResult" + } + } + }, + "FirewallRules": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/KnownServiceArgs" + }, + "Result": { + "$ref": "#/definitions/ListFirewallRulesResults" + } + } + }, + "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" + } + } + }, + "MacaroonForRelations": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/Entities" + }, + "Result": { + "$ref": "#/definitions/MacaroonResults" + } + } + }, + "ModelConfig": { + "type": "object", + "properties": { + "Result": { + "$ref": "#/definitions/ModelConfigResult" + } + } + }, + "SetRelationsStatus": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/SetStatus" + }, + "Result": { + "$ref": "#/definitions/ErrorResults" + } + } + }, + "Watch": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/Entities" + }, + "Result": { + "$ref": "#/definitions/NotifyWatchResults" + } + } + }, + "WatchEgressAddressesForRelations": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/Entities" + }, + "Result": { + "$ref": "#/definitions/StringsWatchResults" + } + } + }, + "WatchForModelConfigChanges": { + "type": "object", + "properties": { + "Result": { + "$ref": "#/definitions/NotifyWatchResult" + } + } + }, + "WatchIngressAddressesForRelations": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/Entities" + }, + "Result": { + "$ref": "#/definitions/StringsWatchResults" + } + } + }, + "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": { + "cacertificates": { + "type": "array", + "items": { + "type": "string" + } + }, + "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 + }, + "ControllerAPIInfoResult": { + "type": "object", + "properties": { + "addresses": { + "type": "array", + "items": { + "type": "string" + } + }, + "cacert": { + "type": "string" + }, + "error": { + "$ref": "#/definitions/Error" + } + }, + "additionalProperties": false, + "required": [ + "addresses", + "cacert" + ] + }, + "ControllerAPIInfoResults": { + "type": "object", + "properties": { + "results": { + "type": "array", + "items": { + "$ref": "#/definitions/ControllerAPIInfoResult" + } + } + }, + "additionalProperties": false, + "required": [ + "results" + ] + }, + "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" + ] + }, + "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" + ] + }, + "FirewallRule": { + "type": "object", + "properties": { + "known-service": { + "type": "string" + }, + "whitelist-cidrs": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false, + "required": [ + "known-service" + ] + }, + "KnownServiceArgs": { + "type": "object", + "properties": { + "known-services": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false, + "required": [ + "known-services" + ] + }, + "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" + ] + }, + "ListFirewallRulesResults": { + "type": "object", + "properties": { + "Rules": { + "type": "array", + "items": { + "$ref": "#/definitions/FirewallRule" + } + } + }, + "additionalProperties": false, + "required": [ + "Rules" + ] + }, + "Macaroon": { + "type": "object", + "additionalProperties": false + }, + "MacaroonResult": { + "type": "object", + "properties": { + "error": { + "$ref": "#/definitions/Error" + }, + "result": { + "$ref": "#/definitions/Macaroon" + } + }, + "additionalProperties": false + }, + "MacaroonResults": { + "type": "object", + "properties": { + "results": { + "type": "array", + "items": { + "$ref": "#/definitions/MacaroonResult" + } + } + }, + "additionalProperties": false, + "required": [ + "results" + ] + }, + "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" + ] + }, + "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" + ] + }, + "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" + }, + "Id": { + "type": "integer" + }, + "Priority": { + "type": "number" + }, + "Tags": { + "type": "object", + "patternProperties": { + ".*": { + "type": "string" + } + } + }, + "Votes": { + "type": "integer" + } + }, + "additionalProperties": false, + "required": [ + "Id", + "Address", + "Priority", + "Tags", + "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" + }, + "zones": { + "type": "array", + "items": { + "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": 3, + "Schema": { + "type": "object", + "properties": { + "UpdateFromPublishedImages": { + "type": "object" + } + } + } + }, + { + "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": 5, + "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" + } + } + }, + "DestroyMachineWithParams": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/DestroyMachinesParams" + }, + "Result": { + "$ref": "#/definitions/DestroyMachineResults" + } + } + }, + "ForceDestroyMachine": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/Entities" + }, + "Result": { + "$ref": "#/definitions/DestroyMachineResults" + } + } + }, + "GetUpgradeSeriesMessages": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/UpgradeSeriesNotificationParams" + }, + "Result": { + "$ref": "#/definitions/StringsResults" + } + } + }, + "InstanceTypes": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/ModelInstanceTypesConstraints" + }, + "Result": { + "$ref": "#/definitions/InstanceTypesResults" + } + } + }, + "UpgradeSeriesComplete": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/UpdateSeriesArg" + }, + "Result": { + "$ref": "#/definitions/ErrorResult" + } + } + }, + "UpgradeSeriesPrepare": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/UpdateSeriesArg" + }, + "Result": { + "$ref": "#/definitions/ErrorResult" + } + } + }, + "UpgradeSeriesValidate": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/UpdateSeriesArgs" + }, + "Result": { + "$ref": "#/definitions/UpgradeSeriesUnitsResults" + } + } + }, + "WatchUpgradeSeriesNotifications": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/Entities" + }, + "Result": { + "$ref": "#/definitions/NotifyWatchResults" + } + } + } + }, + "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 + }, + "DestroyMachinesParams": { + "type": "object", + "properties": { + "force": { + "type": "boolean" + }, + "keep": { + "type": "boolean" + }, + "machine-tags": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false, + "required": [ + "machine-tags" + ] + }, + "Entities": { + "type": "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 + }, + "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" + ] + }, + "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" + ] + }, + "Placement": { + "type": "object", + "properties": { + "directive": { + "type": "string" + }, + "scope": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "scope", + "directive" + ] + }, + "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" + ] + }, + "UpdateSeriesArg": { + "type": "object", + "properties": { + "force": { + "type": "boolean" + }, + "series": { + "type": "string" + }, + "tag": { + "$ref": "#/definitions/Entity" + } + }, + "additionalProperties": false, + "required": [ + "tag", + "force", + "series" + ] + }, + "UpdateSeriesArgs": { + "type": "object", + "properties": { + "args": { + "type": "array", + "items": { + "$ref": "#/definitions/UpdateSeriesArg" + } + } + }, + "additionalProperties": false, + "required": [ + "args" + ] + }, + "UpgradeSeriesNotificationParam": { + "type": "object", + "properties": { + "entity": { + "$ref": "#/definitions/Entity" + }, + "watcher-id": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "entity", + "watcher-id" + ] + }, + "UpgradeSeriesNotificationParams": { + "type": "object", + "properties": { + "params": { + "type": "array", + "items": { + "$ref": "#/definitions/UpgradeSeriesNotificationParam" + } + } + }, + "additionalProperties": false, + "required": [ + "params" + ] + }, + "UpgradeSeriesUnitsResult": { + "type": "object", + "properties": { + "error": { + "$ref": "#/definitions/Error" + }, + "unit-names": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false, + "required": [ + "unit-names" + ] + }, + "UpgradeSeriesUnitsResults": { + "type": "object", + "properties": { + "Results": { + "type": "array", + "items": { + "$ref": "#/definitions/UpgradeSeriesUnitsResult" + } + } + }, + "additionalProperties": false, + "required": [ + "Results" + ] + }, + "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" + }, + "zones": { + "type": "array", + "items": { + "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" + } + } + }, + "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" + ] + }, + "Entities": { + "type": "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" + }, + "is-default-gateway": { + "type": "boolean" + }, + "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" + }, + "labels": { + "type": "object", + "patternProperties": { + ".*": { + "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" + ] + }, + "MeterStatusParams": { + "type": "object", + "properties": { + "statues": { + "type": "array", + "items": { + "$ref": "#/definitions/MeterStatusParam" + } + } + }, + "additionalProperties": false, + "required": [ + "statues" + ] + }, + "MetricResult": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "labels": { + "type": "object", + "patternProperties": { + ".*": { + "type": "string" + } + } + }, + "time": { + "type": "string", + "format": "date-time" + }, + "unit": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "time", + "key", + "value", + "unit", + "labels" + ] + }, + "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" + } + } + }, + "CheckMachines": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/ModelArgs" + }, + "Result": { + "$ref": "#/definitions/ErrorResults" + } + } + }, + "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" + ] + }, + "Error": { + "type": "object", + "properties": { + "code": { + "type": "string" + }, + "info": { + "$ref": "#/definitions/ErrorInfo" + }, + "message": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "message", + "code" + ] + }, + "ErrorInfo": { + "type": "object", + "properties": { + "macaroon": { + "$ref": "#/definitions/Macaroon" + }, + "macaroon-path": { + "type": "string" + } + }, + "additionalProperties": false + }, + "ErrorResult": { + "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 + }, + "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": 2, + "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" + } + } + }, + "Sequences": { + "type": "object", + "properties": { + "Result": { + "$ref": "#/definitions/ModelSequencesResult" + } + } + }, + "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" + ] + }, + "ModelSequencesResult": { + "type": "object", + "properties": { + "sequences": { + "type": "object", + "patternProperties": { + ".*": { + "type": "integer" + } + } + } + }, + "additionalProperties": false, + "required": [ + "sequences" + ] + }, + "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": 5, + "Schema": { + "type": "object", + "properties": { + "ChangeModelCredential": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/ChangeModelCredentialsParams" + }, + "Result": { + "$ref": "#/definitions/ErrorResults" + } + } + }, + "CreateModel": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/ModelCreateArgs" + }, + "Result": { + "$ref": "#/definitions/ModelInfo" + } + } + }, + "DestroyModels": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/DestroyModelsParams" + }, + "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" + } + } + }, + "ListModelSummaries": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/ModelSummariesRequest" + }, + "Result": { + "$ref": "#/definitions/ModelSummaryResults" + } + } + }, + "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": { + "ChangeModelCredentialParams": { + "type": "object", + "properties": { + "credential-tag": { + "type": "string" + }, + "model-tag": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "model-tag", + "credential-tag" + ] + }, + "ChangeModelCredentialsParams": { + "type": "object", + "properties": { + "model-credentials": { + "type": "array", + "items": { + "$ref": "#/definitions/ChangeModelCredentialParams" + } + } + }, + "additionalProperties": false, + "required": [ + "model-credentials" + ] + }, + "DestroyModelParams": { + "type": "object", + "properties": { + "destroy-storage": { + "type": "boolean" + }, + "model-tag": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "model-tag" + ] + }, + "DestroyModelsParams": { + "type": "object", + "properties": { + "models": { + "type": "array", + "items": { + "$ref": "#/definitions/DestroyModelParams" + } + } + }, + "additionalProperties": false, + "required": [ + "models" + ] + }, + "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" + }, + "type": { + "type": "string" + }, + "uuid": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "name", + "uuid", + "type", + "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" + ] + }, + "ModelEntityCount": { + "type": "object", + "properties": { + "count": { + "type": "integer" + }, + "entity": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "entity", + "count" + ] + }, + "ModelFilesystemInfo": { + "type": "object", + "properties": { + "detachable": { + "type": "boolean" + }, + "id": { + "type": "string" + }, + "message": { + "type": "string" + }, + "provider-id": { + "type": "string" + }, + "status": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "id" + ] + }, + "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" + }, + "type": { + "type": "string" + }, + "users": { + "type": "array", + "items": { + "$ref": "#/definitions/ModelUserInfo" + } + }, + "uuid": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "name", + "type", + "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" + }, + "message": { + "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" + }, + "error": { + "$ref": "#/definitions/Error" + }, + "filesystems": { + "type": "array", + "items": { + "$ref": "#/definitions/ModelFilesystemInfo" + } + }, + "hosted-machine-count": { + "type": "integer" + }, + "life": { + "type": "string" + }, + "machines": { + "type": "array", + "items": { + "$ref": "#/definitions/ModelMachineInfo" + } + }, + "model-tag": { + "type": "string" + }, + "owner-tag": { + "type": "string" + }, + "volumes": { + "type": "array", + "items": { + "$ref": "#/definitions/ModelVolumeInfo" + } + } + }, + "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" + ] + }, + "ModelSummariesRequest": { + "type": "object", + "properties": { + "all": { + "type": "boolean" + }, + "user-tag": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "user-tag" + ] + }, + "ModelSummary": { + "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" + }, + "counts": { + "type": "array", + "items": { + "$ref": "#/definitions/ModelEntityCount" + } + }, + "default-series": { + "type": "string" + }, + "last-connection": { + "type": "string", + "format": "date-time" + }, + "life": { + "type": "string" + }, + "migration": { + "$ref": "#/definitions/ModelMigrationStatus" + }, + "name": { + "type": "string" + }, + "owner-tag": { + "type": "string" + }, + "provider-type": { + "type": "string" + }, + "sla": { + "$ref": "#/definitions/ModelSLAInfo" + }, + "status": { + "$ref": "#/definitions/EntityStatus" + }, + "type": { + "type": "string" + }, + "user-access": { + "type": "string" + }, + "uuid": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "name", + "uuid", + "type", + "controller-uuid", + "cloud-tag", + "owner-tag", + "life", + "user-access", + "last-connection", + "counts", + "sla", + "agent-version" + ] + }, + "ModelSummaryResult": { + "type": "object", + "properties": { + "error": { + "$ref": "#/definitions/Error" + }, + "result": { + "$ref": "#/definitions/ModelSummary" + } + }, + "additionalProperties": false + }, + "ModelSummaryResults": { + "type": "object", + "properties": { + "results": { + "type": "array", + "items": { + "$ref": "#/definitions/ModelSummaryResult" + } + } + }, + "additionalProperties": false, + "required": [ + "results" + ] + }, + "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" + ] + }, + "ModelVolumeInfo": { + "type": "object", + "properties": { + "detachable": { + "type": "boolean" + }, + "id": { + "type": "string" + }, + "message": { + "type": "string" + }, + "provider-id": { + "type": "string" + }, + "status": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "id" + ] + }, + "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": "ModelUpgrader", + "Version": 1, + "Schema": { + "type": "object", + "properties": { + "ModelEnvironVersion": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/Entities" + }, + "Result": { + "$ref": "#/definitions/IntResults" + } + } + }, + "ModelTargetEnvironVersion": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/Entities" + }, + "Result": { + "$ref": "#/definitions/IntResults" + } + } + }, + "SetModelEnvironVersion": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/SetModelEnvironVersions" + }, + "Result": { + "$ref": "#/definitions/ErrorResults" + } + } + }, + "SetModelStatus": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/SetStatus" + }, + "Result": { + "$ref": "#/definitions/ErrorResults" + } + } + }, + "WatchModelEnvironVersion": { + "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" + ] + }, + "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" + ] + }, + "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" + ] + }, + "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" + ] + }, + "SetModelEnvironVersion": { + "type": "object", + "properties": { + "model-tag": { + "type": "string" + }, + "version": { + "type": "integer" + } + }, + "additionalProperties": false, + "required": [ + "model-tag", + "version" + ] + }, + "SetModelEnvironVersions": { + "type": "object", + "properties": { + "models": { + "type": "array", + "items": { + "$ref": "#/definitions/SetModelEnvironVersion" + } + } + }, + "additionalProperties": false + }, + "SetStatus": { + "type": "object", + "properties": { + "entities": { + "type": "array", + "items": { + "$ref": "#/definitions/EntityStatusArgs" + } + } + }, + "additionalProperties": false, + "required": [ + "entities" + ] + } + } + } + }, + { + "Name": "NotifyWatcher", + "Version": 1, + "Schema": { + "type": "object", + "properties": { + "Next": { + "type": "object" + }, + "Stop": { + "type": "object" + } + } + } + }, + { + "Name": "OfferStatusWatcher", + "Version": 1, + "Schema": { + "type": "object", + "properties": { + "Next": { + "type": "object", + "properties": { + "Result": { + "$ref": "#/definitions/OfferStatusWatchResult" + } + } + }, + "Stop": { + "type": "object" + } + }, + "definitions": { + "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 + }, + "Macaroon": { + "type": "object", + "additionalProperties": false + }, + "OfferStatusChange": { + "type": "object", + "properties": { + "offer-name": { + "type": "string" + }, + "status": { + "$ref": "#/definitions/EntityStatus" + } + }, + "additionalProperties": false, + "required": [ + "offer-name", + "status" + ] + }, + "OfferStatusWatchResult": { + "type": "object", + "properties": { + "changes": { + "type": "array", + "items": { + "$ref": "#/definitions/OfferStatusChange" + } + }, + "error": { + "$ref": "#/definitions/Error" + }, + "watcher-id": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "watcher-id", + "changes" + ] + } + } + } + }, + { + "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": 7, + "Schema": { + "type": "object", + "properties": { + "APIAddresses": { + "type": "object", + "properties": { + "Result": { + "$ref": "#/definitions/StringsResult" + } + } + }, + "APIHostPorts": { + "type": "object", + "properties": { + "Result": { + "$ref": "#/definitions/APIHostPortsResult" + } + } + }, + "AvailabilityZone": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/Entities" + }, + "Result": { + "$ref": "#/definitions/StringResults" + } + } + }, + "CACert": { + "type": "object", + "properties": { + "Result": { + "$ref": "#/definitions/BytesResult" + } + } + }, + "CharmProfileChangeInfo": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/Entities" + }, + "Result": { + "$ref": "#/definitions/ProfileChangeResults" + } + } + }, + "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" + } + } + }, + "ControllerAPIInfoForModels": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/Entities" + }, + "Result": { + "$ref": "#/definitions/ControllerAPIInfoResults" + } + } + }, + "ControllerConfig": { + "type": "object", + "properties": { + "Result": { + "$ref": "#/definitions/ControllerConfigResult" + } + } + }, + "DistributionGroup": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/Entities" + }, + "Result": { + "$ref": "#/definitions/DistributionGroupResults" + } + } + }, + "DistributionGroupByMachineId": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/Entities" + }, + "Result": { + "$ref": "#/definitions/StringsResults" + } + } + }, + "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" + } + } + }, + "GetContainerProfileInfo": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/Entities" + }, + "Result": { + "$ref": "#/definitions/ContainerProfileResults" + } + } + }, + "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" + } + } + }, + "KeepInstance": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/Entities" + }, + "Result": { + "$ref": "#/definitions/BoolResults" + } + } + }, + "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" + } + } + }, + "RemoveUpgradeCharmProfileData": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/Entities" + }, + "Result": { + "$ref": "#/definitions/ErrorResults" + } + } + }, + "Series": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/Entities" + }, + "Result": { + "$ref": "#/definitions/StringResults" + } + } + }, + "SetCharmProfiles": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/SetProfileArgs" + }, + "Result": { + "$ref": "#/definitions/ErrorResults" + } + } + }, + "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" + } + } + }, + "SetUpgradeCharmProfileComplete": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/SetProfileUpgradeCompleteArgs" + }, + "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" + } + } + }, + "WatchContainersCharmProfiles": { + "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" + } + } + }, + "WatchModelMachinesCharmProfiles": { + "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" + ] + }, + "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" + ] + }, + "CharmLXDProfile": { + "type": "object", + "properties": { + "config": { + "type": "object", + "patternProperties": { + ".*": { + "type": "string" + } + } + }, + "description": { + "type": "string" + }, + "devices": { + "type": "object", + "patternProperties": { + ".*": { + "type": "object", + "patternProperties": { + ".*": { + "type": "string" + } + } + } + } + } + }, + "additionalProperties": false, + "required": [ + "config", + "description", + "devices" + ] + }, + "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" + }, + "cloudinit-userdata": { + "type": "object", + "patternProperties": { + ".*": { + "type": "object", + "additionalProperties": true + } + } + }, + "container-inherit-properties": { + "type": "string" + }, + "juju-proxy": { + "$ref": "#/definitions/Settings" + }, + "legacy-proxy": { + "$ref": "#/definitions/Settings" + }, + "provider-type": { + "type": "string" + }, + "snap-proxy": { + "$ref": "#/definitions/Settings" + }, + "ssl-hostname-verification": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "provider-type", + "authorized-keys", + "ssl-hostname-verification", + "legacy-proxy", + "juju-proxy", + "apt-proxy", + "snap-proxy", + "apt-mirror", + "UpdateBehavior" + ] + }, + "ContainerLXDProfile": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "profile": { + "$ref": "#/definitions/CharmLXDProfile" + } + }, + "additionalProperties": false, + "required": [ + "profile", + "name" + ] + }, + "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" + ] + }, + "ContainerProfileResult": { + "type": "object", + "properties": { + "error": { + "$ref": "#/definitions/Error" + }, + "lxd-profiles": { + "type": "array", + "items": { + "$ref": "#/definitions/ContainerLXDProfile" + } + } + }, + "additionalProperties": false + }, + "ContainerProfileResults": { + "type": "object", + "properties": { + "results": { + "type": "array", + "items": { + "$ref": "#/definitions/ContainerProfileResult" + } + } + }, + "additionalProperties": false, + "required": [ + "results" + ] + }, + "ControllerAPIInfoResult": { + "type": "object", + "properties": { + "addresses": { + "type": "array", + "items": { + "type": "string" + } + }, + "cacert": { + "type": "string" + }, + "error": { + "$ref": "#/definitions/Error" + } + }, + "additionalProperties": false, + "required": [ + "addresses", + "cacert" + ] + }, + "ControllerAPIInfoResults": { + "type": "object", + "properties": { + "results": { + "type": "array", + "items": { + "$ref": "#/definitions/ControllerAPIInfoResult" + } + } + }, + "additionalProperties": false, + "required": [ + "results" + ] + }, + "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" + }, + "mac-address": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "host-device-name", + "bridge-name", + "mac-address" + ] + }, + "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": { + "agentstream": { + "type": "string" + }, + "arch": { + "type": "string" + }, + "major": { + "type": "integer" + }, + "minor": { + "type": "integer" + }, + "number": { + "$ref": "#/definitions/Number" + }, + "series": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "number", + "major", + "minor", + "arch", + "series", + "agentstream" + ] + }, + "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" + }, + "charm-profiles": { + "type": "array", + "items": { + "type": "string" + } + }, + "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", + "charm-profiles" + ] + }, + "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" + }, + "is-default-gateway": { + "type": "boolean" + }, + "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" + ] + }, + "ProfileChangeResult": { + "type": "object", + "properties": { + "error": { + "$ref": "#/definitions/Error" + }, + "new-profile-name": { + "type": "string" + }, + "old-profile-name": { + "type": "string" + }, + "profile": { + "$ref": "#/definitions/CharmLXDProfile" + }, + "subordinate": { + "type": "boolean" + } + }, + "additionalProperties": false + }, + "ProfileChangeResults": { + "type": "object", + "properties": { + "results": { + "type": "array", + "items": { + "$ref": "#/definitions/ProfileChangeResult" + } + } + }, + "additionalProperties": false, + "required": [ + "results" + ] + }, + "ProvisioningInfo": { + "type": "object", + "properties": { + "charm-lxd-profiles": { + "type": "array", + "items": { + "type": "string" + } + }, + "cloudinit-userdata": { + "type": "object", + "patternProperties": { + ".*": { + "type": "object", + "additionalProperties": true + } + } + }, + "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" + ] + }, + "SetProfileArg": { + "type": "object", + "properties": { + "entity": { + "$ref": "#/definitions/Entity" + }, + "profiles": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false, + "required": [ + "entity", + "profiles" + ] + }, + "SetProfileArgs": { + "type": "object", + "properties": { + "args": { + "type": "array", + "items": { + "$ref": "#/definitions/SetProfileArg" + } + } + }, + "additionalProperties": false, + "required": [ + "args" + ] + }, + "SetProfileUpgradeCompleteArg": { + "type": "object", + "properties": { + "entity": { + "$ref": "#/definitions/Entity" + }, + "message": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "entity", + "message" + ] + }, + "SetProfileUpgradeCompleteArgs": { + "type": "object", + "properties": { + "args": { + "type": "array", + "items": { + "$ref": "#/definitions/SetProfileUpgradeCompleteArg" + } + } + }, + "additionalProperties": false, + "required": [ + "args" + ] + }, + "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 + }, + "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" + ] + }, + "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" + }, + "zones": { + "type": "array", + "items": { + "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" + }, + "plan-info": { + "$ref": "#/definitions/VolumeAttachmentPlanInfo" + }, + "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" + ] + }, + "VolumeAttachmentPlanInfo": { + "type": "object", + "properties": { + "device-attributes": { + "type": "object", + "patternProperties": { + ".*": { + "type": "string" + } + } + }, + "device-type": { + "type": "string" + } + }, + "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" + ] + }, + "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": 2, + "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" + }, + "juju-proxy-settings": { + "$ref": "#/definitions/ProxyConfig" + }, + "legacy-proxy-settings": { + "$ref": "#/definitions/ProxyConfig" + }, + "snap-proxy-settings": { + "$ref": "#/definitions/ProxyConfig" + }, + "snap-store-assertions": { + "type": "string" + }, + "snap-store-id": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "legacy-proxy-settings", + "juju-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": "RelationStatusWatcher", + "Version": 1, + "Schema": { + "type": "object", + "properties": { + "Next": { + "type": "object", + "properties": { + "Result": { + "$ref": "#/definitions/RelationLifeSuspendedStatusWatchResult" + } + } + }, + "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 + }, + "RelationLifeSuspendedStatusChange": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "life": { + "type": "string" + }, + "suspended": { + "type": "boolean" + }, + "suspended-reason": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "key", + "life", + "suspended", + "suspended-reason" + ] + }, + "RelationLifeSuspendedStatusWatchResult": { + "type": "object", + "properties": { + "changes": { + "type": "array", + "items": { + "$ref": "#/definitions/RelationLifeSuspendedStatusChange" + } + }, + "error": { + "$ref": "#/definitions/Error" + }, + "watcher-id": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "watcher-id", + "changes" + ] + } + } + } + }, + { + "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": "RemoteRelations", + "Version": 1, + "Schema": { + "type": "object", + "properties": { + "ConsumeRemoteRelationChanges": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/RemoteRelationsChanges" + }, + "Result": { + "$ref": "#/definitions/ErrorResults" + } + } + }, + "ControllerAPIInfoForModels": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/Entities" + }, + "Result": { + "$ref": "#/definitions/ControllerAPIInfoResults" + } + } + }, + "ControllerConfig": { + "type": "object", + "properties": { + "Result": { + "$ref": "#/definitions/ControllerConfigResult" + } + } + }, + "ExportEntities": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/Entities" + }, + "Result": { + "$ref": "#/definitions/TokenResults" + } + } + }, + "GetTokens": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/GetTokenArgs" + }, + "Result": { + "$ref": "#/definitions/StringResults" + } + } + }, + "ImportRemoteEntities": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/RemoteEntityTokenArgs" + }, + "Result": { + "$ref": "#/definitions/ErrorResults" + } + } + }, + "RelationUnitSettings": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/RelationUnits" + }, + "Result": { + "$ref": "#/definitions/SettingsResults" + } + } + }, + "Relations": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/Entities" + }, + "Result": { + "$ref": "#/definitions/RemoteRelationResults" + } + } + }, + "RemoteApplications": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/Entities" + }, + "Result": { + "$ref": "#/definitions/RemoteApplicationResults" + } + } + }, + "SaveMacaroons": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/EntityMacaroonArgs" + }, + "Result": { + "$ref": "#/definitions/ErrorResults" + } + } + }, + "SetRemoteApplicationsStatus": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/SetStatus" + }, + "Result": { + "$ref": "#/definitions/ErrorResults" + } + } + }, + "WatchLocalRelationUnits": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/Entities" + }, + "Result": { + "$ref": "#/definitions/RelationUnitsWatchResults" + } + } + }, + "WatchRemoteApplicationRelations": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/Entities" + }, + "Result": { + "$ref": "#/definitions/StringsWatchResults" + } + } + }, + "WatchRemoteApplications": { + "type": "object", + "properties": { + "Result": { + "$ref": "#/definitions/StringsWatchResult" + } + } + }, + "WatchRemoteRelations": { + "type": "object", + "properties": { + "Result": { + "$ref": "#/definitions/StringsWatchResult" + } + } + } + }, + "definitions": { + "ControllerAPIInfoResult": { + "type": "object", + "properties": { + "addresses": { + "type": "array", + "items": { + "type": "string" + } + }, + "cacert": { + "type": "string" + }, + "error": { + "$ref": "#/definitions/Error" + } + }, + "additionalProperties": false, + "required": [ + "addresses", + "cacert" + ] + }, + "ControllerAPIInfoResults": { + "type": "object", + "properties": { + "results": { + "type": "array", + "items": { + "$ref": "#/definitions/ControllerAPIInfoResult" + } + } + }, + "additionalProperties": false, + "required": [ + "results" + ] + }, + "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" + ] + }, + "EntityMacaroonArg": { + "type": "object", + "properties": { + "macaroon": { + "$ref": "#/definitions/Macaroon" + }, + "tag": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "macaroon", + "tag" + ] + }, + "EntityMacaroonArgs": { + "type": "object", + "properties": { + "Args": { + "type": "array", + "items": { + "$ref": "#/definitions/EntityMacaroonArg" + } + } + }, + "additionalProperties": false, + "required": [ + "Args" + ] + }, + "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" + ] + }, + "GetTokenArg": { + "type": "object", + "properties": { + "tag": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "tag" + ] + }, + "GetTokenArgs": { + "type": "object", + "properties": { + "Args": { + "type": "array", + "items": { + "$ref": "#/definitions/GetTokenArg" + } + } + }, + "additionalProperties": false, + "required": [ + "Args" + ] + }, + "Macaroon": { + "type": "object", + "additionalProperties": false + }, + "RelationUnit": { + "type": "object", + "properties": { + "relation": { + "type": "string" + }, + "unit": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "relation", + "unit" + ] + }, + "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" + ] + }, + "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" + ] + }, + "RemoteApplication": { + "type": "object", + "properties": { + "is-consumer-proxy": { + "type": "boolean" + }, + "life": { + "type": "string" + }, + "macaroon": { + "$ref": "#/definitions/Macaroon" + }, + "model-uuid": { + "type": "string" + }, + "name": { + "type": "string" + }, + "offer-uuid": { + "type": "string" + }, + "status": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "name", + "offer-uuid", + "model-uuid", + "is-consumer-proxy" + ] + }, + "RemoteApplicationResult": { + "type": "object", + "properties": { + "error": { + "$ref": "#/definitions/Error" + }, + "result": { + "$ref": "#/definitions/RemoteApplication" + } + }, + "additionalProperties": false + }, + "RemoteApplicationResults": { + "type": "object", + "properties": { + "results": { + "type": "array", + "items": { + "$ref": "#/definitions/RemoteApplicationResult" + } + } + }, + "additionalProperties": false + }, + "RemoteEndpoint": { + "type": "object", + "properties": { + "interface": { + "type": "string" + }, + "limit": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "role": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "name", + "role", + "interface", + "limit" + ] + }, + "RemoteEntityTokenArg": { + "type": "object", + "properties": { + "tag": { + "type": "string" + }, + "token": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "tag" + ] + }, + "RemoteEntityTokenArgs": { + "type": "object", + "properties": { + "Args": { + "type": "array", + "items": { + "$ref": "#/definitions/RemoteEntityTokenArg" + } + } + }, + "additionalProperties": false, + "required": [ + "Args" + ] + }, + "RemoteRelation": { + "type": "object", + "properties": { + "application-name": { + "type": "string" + }, + "endpoint": { + "$ref": "#/definitions/RemoteEndpoint" + }, + "id": { + "type": "integer" + }, + "key": { + "type": "string" + }, + "life": { + "type": "string" + }, + "remote-application-name": { + "type": "string" + }, + "remote-endpoint-name": { + "type": "string" + }, + "source-model-uuid": { + "type": "string" + }, + "suspended": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "life", + "suspended", + "id", + "key", + "application-name", + "endpoint", + "remote-application-name", + "remote-endpoint-name", + "source-model-uuid" + ] + }, + "RemoteRelationChangeEvent": { + "type": "object", + "properties": { + "application-token": { + "type": "string" + }, + "changed-units": { + "type": "array", + "items": { + "$ref": "#/definitions/RemoteRelationUnitChange" + } + }, + "departed-units": { + "type": "array", + "items": { + "type": "integer" + } + }, + "force-cleanup": { + "type": "boolean" + }, + "life": { + "type": "string" + }, + "macaroons": { + "type": "array", + "items": { + "$ref": "#/definitions/Macaroon" + } + }, + "relation-token": { + "type": "string" + }, + "suspended": { + "type": "boolean" + }, + "suspended-reason": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "relation-token", + "application-token", + "life" + ] + }, + "RemoteRelationResult": { + "type": "object", + "properties": { + "error": { + "$ref": "#/definitions/Error" + }, + "result": { + "$ref": "#/definitions/RemoteRelation" + } + }, + "additionalProperties": false + }, + "RemoteRelationResults": { + "type": "object", + "properties": { + "results": { + "type": "array", + "items": { + "$ref": "#/definitions/RemoteRelationResult" + } + } + }, + "additionalProperties": false, + "required": [ + "results" + ] + }, + "RemoteRelationUnitChange": { + "type": "object", + "properties": { + "settings": { + "type": "object", + "patternProperties": { + ".*": { + "type": "object", + "additionalProperties": true + } + } + }, + "unit-id": { + "type": "integer" + } + }, + "additionalProperties": false, + "required": [ + "unit-id" + ] + }, + "RemoteRelationsChanges": { + "type": "object", + "properties": { + "changes": { + "type": "array", + "items": { + "$ref": "#/definitions/RemoteRelationChangeEvent" + } + } + }, + "additionalProperties": false + }, + "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" + ] + }, + "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" + ] + }, + "TokenResult": { + "type": "object", + "properties": { + "error": { + "$ref": "#/definitions/Error" + }, + "token": { + "type": "string" + } + }, + "additionalProperties": false + }, + "TokenResults": { + "type": "object", + "properties": { + "results": { + "type": "array", + "items": { + "$ref": "#/definitions/TokenResult" + } + } + }, + "additionalProperties": false + }, + "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" + }, + "force": { + "type": "boolean" + }, + "macaroon": { + "$ref": "#/definitions/Macaroon" + }, + "url": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "url", + "channel", + "macaroon", + "force" + ] + }, + "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": 2, + "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": { + "claimant-tag": { + "type": "string" + }, + "duration": { + "type": "integer" + }, + "entity-tag": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "entity-tag", + "claimant-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": 4, + "Schema": { + "type": "object", + "properties": { + "AddToUnit": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/StoragesAddParams" + }, + "Result": { + "$ref": "#/definitions/AddStorageResults" + } + } + }, + "Attach": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/StorageAttachmentIds" + }, + "Result": { + "$ref": "#/definitions/ErrorResults" + } + } + }, + "CreatePool": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/StoragePool" + } + } + }, + "Detach": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/StorageAttachmentIds" + }, + "Result": { + "$ref": "#/definitions/ErrorResults" + } + } + }, + "Import": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/BulkImportStorageParams" + }, + "Result": { + "$ref": "#/definitions/ImportStorageResults" + } + } + }, + "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" + } + } + }, + "Remove": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/RemoveStorage" + }, + "Result": { + "$ref": "#/definitions/ErrorResults" + } + } + }, + "StorageDetails": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/Entities" + }, + "Result": { + "$ref": "#/definitions/StorageDetailsResults" + } + } + } + }, + "definitions": { + "AddStorageDetails": { + "type": "object", + "properties": { + "storage-tags": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false, + "required": [ + "storage-tags" + ] + }, + "AddStorageResult": { + "type": "object", + "properties": { + "error": { + "$ref": "#/definitions/Error" + }, + "result": { + "$ref": "#/definitions/AddStorageDetails" + } + }, + "additionalProperties": false + }, + "AddStorageResults": { + "type": "object", + "properties": { + "results": { + "type": "array", + "items": { + "$ref": "#/definitions/AddStorageResult" + } + } + }, + "additionalProperties": false, + "required": [ + "results" + ] + }, + "BulkImportStorageParams": { + "type": "object", + "properties": { + "storage": { + "type": "array", + "items": { + "$ref": "#/definitions/ImportStorageParams" + } + } + }, + "additionalProperties": false, + "required": [ + "storage" + ] + }, + "Entities": { + "type": "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" + }, + "unit-attachments": { + "type": "object", + "patternProperties": { + ".*": { + "$ref": "#/definitions/FilesystemAttachmentDetails" + } + } + }, + "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" + ] + }, + "ImportStorageDetails": { + "type": "object", + "properties": { + "storage-tag": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "storage-tag" + ] + }, + "ImportStorageParams": { + "type": "object", + "properties": { + "kind": { + "type": "integer" + }, + "pool": { + "type": "string" + }, + "provider-id": { + "type": "string" + }, + "storage-name": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "kind", + "pool", + "provider-id", + "storage-name" + ] + }, + "ImportStorageResult": { + "type": "object", + "properties": { + "error": { + "$ref": "#/definitions/Error" + }, + "result": { + "$ref": "#/definitions/ImportStorageDetails" + } + }, + "additionalProperties": false + }, + "ImportStorageResults": { + "type": "object", + "properties": { + "results": { + "type": "array", + "items": { + "$ref": "#/definitions/ImportStorageResult" + } + } + }, + "additionalProperties": false, + "required": [ + "results" + ] + }, + "Macaroon": { + "type": "object", + "additionalProperties": false + }, + "RemoveStorage": { + "type": "object", + "properties": { + "storage": { + "type": "array", + "items": { + "$ref": "#/definitions/RemoveStorageInstance" + } + } + }, + "additionalProperties": false, + "required": [ + "storage" + ] + }, + "RemoveStorageInstance": { + "type": "object", + "properties": { + "destroy-attachments": { + "type": "boolean" + }, + "destroy-storage": { + "type": "boolean" + }, + "tag": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "tag" + ] + }, + "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" + }, + "plan-info": { + "$ref": "#/definitions/VolumeAttachmentPlanInfo" + }, + "read-only": { + "type": "boolean" + } + }, + "additionalProperties": false + }, + "VolumeAttachmentPlanInfo": { + "type": "object", + "properties": { + "device-attributes": { + "type": "object", + "patternProperties": { + ".*": { + "type": "string" + } + } + }, + "device-type": { + "type": "string" + } + }, + "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" + }, + "unit-attachments": { + "type": "object", + "patternProperties": { + ".*": { + "$ref": "#/definitions/VolumeAttachmentDetails" + } + } + }, + "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": 4, + "Schema": { + "type": "object", + "properties": { + "AttachmentLife": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/MachineStorageIds" + }, + "Result": { + "$ref": "#/definitions/LifeResults" + } + } + }, + "CreateVolumeAttachmentPlans": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/VolumeAttachmentPlans" + }, + "Result": { + "$ref": "#/definitions/ErrorResults" + } + } + }, + "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" + } + } + }, + "RemoveFilesystemParams": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/Entities" + }, + "Result": { + "$ref": "#/definitions/RemoveFilesystemParamsResults" + } + } + }, + "RemoveVolumeAttachmentPlan": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/MachineStorageIds" + }, + "Result": { + "$ref": "#/definitions/ErrorResults" + } + } + }, + "RemoveVolumeParams": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/Entities" + }, + "Result": { + "$ref": "#/definitions/RemoveVolumeParamsResults" + } + } + }, + "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" + } + } + }, + "SetVolumeAttachmentPlanBlockInfo": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/VolumeAttachmentPlans" + }, + "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" + } + } + }, + "VolumeAttachmentPlans": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/MachineStorageIds" + }, + "Result": { + "$ref": "#/definitions/VolumeAttachmentPlanResults" + } + } + }, + "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" + } + } + }, + "WatchApplications": { + "type": "object", + "properties": { + "Result": { + "$ref": "#/definitions/StringsWatchResult" + } + } + }, + "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" + } + } + }, + "WatchVolumeAttachmentPlans": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/Entities" + }, + "Result": { + "$ref": "#/definitions/MachineStorageIdsWatchResults" + } + } + }, + "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" + ] + }, + "RemoveFilesystemParams": { + "type": "object", + "properties": { + "destroy": { + "type": "boolean" + }, + "filesystem-id": { + "type": "string" + }, + "provider": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "provider", + "filesystem-id" + ] + }, + "RemoveFilesystemParamsResult": { + "type": "object", + "properties": { + "error": { + "$ref": "#/definitions/Error" + }, + "result": { + "$ref": "#/definitions/RemoveFilesystemParams" + } + }, + "additionalProperties": false, + "required": [ + "result" + ] + }, + "RemoveFilesystemParamsResults": { + "type": "object", + "properties": { + "results": { + "type": "array", + "items": { + "$ref": "#/definitions/RemoveFilesystemParamsResult" + } + } + }, + "additionalProperties": false + }, + "RemoveVolumeParams": { + "type": "object", + "properties": { + "destroy": { + "type": "boolean" + }, + "provider": { + "type": "string" + }, + "volume-id": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "provider", + "volume-id" + ] + }, + "RemoveVolumeParamsResult": { + "type": "object", + "properties": { + "error": { + "$ref": "#/definitions/Error" + }, + "result": { + "$ref": "#/definitions/RemoveVolumeParams" + } + }, + "additionalProperties": false, + "required": [ + "result" + ] + }, + "RemoveVolumeParamsResults": { + "type": "object", + "properties": { + "results": { + "type": "array", + "items": { + "$ref": "#/definitions/RemoveVolumeParamsResult" + } + } + }, + "additionalProperties": false + }, + "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" + }, + "plan-info": { + "$ref": "#/definitions/VolumeAttachmentPlanInfo" + }, + "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 + }, + "VolumeAttachmentPlan": { + "type": "object", + "properties": { + "block-device": { + "$ref": "#/definitions/BlockDevice" + }, + "life": { + "type": "string" + }, + "machine-tag": { + "type": "string" + }, + "plan-info": { + "$ref": "#/definitions/VolumeAttachmentPlanInfo" + }, + "volume-tag": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "volume-tag", + "machine-tag", + "plan-info" + ] + }, + "VolumeAttachmentPlanInfo": { + "type": "object", + "properties": { + "device-attributes": { + "type": "object", + "patternProperties": { + ".*": { + "type": "string" + } + } + }, + "device-type": { + "type": "string" + } + }, + "additionalProperties": false + }, + "VolumeAttachmentPlanResult": { + "type": "object", + "properties": { + "error": { + "$ref": "#/definitions/Error" + }, + "result": { + "$ref": "#/definitions/VolumeAttachmentPlan" + } + }, + "additionalProperties": false, + "required": [ + "result" + ] + }, + "VolumeAttachmentPlanResults": { + "type": "object", + "properties": { + "results": { + "type": "array", + "items": { + "$ref": "#/definitions/VolumeAttachmentPlanResult" + } + } + }, + "additionalProperties": false + }, + "VolumeAttachmentPlans": { + "type": "object", + "properties": { + "volume-plans": { + "type": "array", + "items": { + "$ref": "#/definitions/VolumeAttachmentPlan" + } + } + }, + "additionalProperties": false, + "required": [ + "volume-plans" + ] + }, + "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": 9, + "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" + } + } + }, + "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" + } + } + }, + "CloudSpec": { + "type": "object", + "properties": { + "Result": { + "$ref": "#/definitions/CloudSpecResult" + } + } + }, + "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" + } + } + }, + "GoalStates": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/Entities" + }, + "Result": { + "$ref": "#/definitions/GoalStateResults" + } + } + }, + "HasSubordinates": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/Entities" + }, + "Result": { + "$ref": "#/definitions/BoolResults" + } + } + }, + "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" + } + } + }, + "Refresh": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/Entities" + }, + "Result": { + "$ref": "#/definitions/UnitRefreshResults" + } + } + }, + "Relation": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/RelationUnits" + }, + "Result": { + "$ref": "#/definitions/RelationResults" + } + } + }, + "RelationById": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/RelationIds" + }, + "Result": { + "$ref": "#/definitions/RelationResults" + } + } + }, + "RelationsStatus": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/Entities" + }, + "Result": { + "$ref": "#/definitions/RelationUnitStatusResults" + } + } + }, + "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" + } + } + }, + "SetPodSpec": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/SetPodSpecParams" + }, + "Result": { + "$ref": "#/definitions/ErrorResults" + } + } + }, + "SetRelationStatus": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/RelationStatusArgs" + }, + "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" + } + } + }, + "SetUpgradeSeriesUnitStatus": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/UpgradeSeriesStatusParams" + }, + "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" + } + } + }, + "UpgradeSeriesUnitStatus": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/Entities" + }, + "Result": { + "$ref": "#/definitions/UpgradeSeriesStatusResults" + } + } + }, + "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" + } + } + }, + "WatchConfigSettingsHash": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/Entities" + }, + "Result": { + "$ref": "#/definitions/StringsWatchResults" + } + } + }, + "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" + } + } + }, + "WatchTrustConfigSettingsHash": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/Entities" + }, + "Result": { + "$ref": "#/definitions/StringsWatchResults" + } + } + }, + "WatchUnitAddressesHash": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/Entities" + }, + "Result": { + "$ref": "#/definitions/StringsWatchResults" + } + } + }, + "WatchUnitRelations": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/Entities" + }, + "Result": { + "$ref": "#/definitions/StringsWatchResults" + } + } + }, + "WatchUnitStorageAttachments": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/Entities" + }, + "Result": { + "$ref": "#/definitions/StringsWatchResults" + } + } + }, + "WatchUpgradeSeriesNotifications": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/Entities" + }, + "Result": { + "$ref": "#/definitions/NotifyWatchResults" + } + } + }, + "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" + ] + }, + "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" + ] + }, + "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": { + "cacertificates": { + "type": "array", + "items": { + "type": "string" + } + }, + "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 + }, + "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" + ] + }, + "EntityString": { + "type": "object", + "properties": { + "tag": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "tag", + "value" + ] + }, + "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" + ] + }, + "GoalState": { + "type": "object", + "properties": { + "relations": { + "type": "object", + "patternProperties": { + ".*": { + "type": "object", + "patternProperties": { + ".*": { + "$ref": "#/definitions/GoalStateStatus" + } + } + } + } + }, + "units": { + "type": "object", + "patternProperties": { + ".*": { + "$ref": "#/definitions/GoalStateStatus" + } + } + } + }, + "additionalProperties": false, + "required": [ + "units", + "relations" + ] + }, + "GoalStateResult": { + "type": "object", + "properties": { + "error": { + "$ref": "#/definitions/Error" + }, + "result": { + "$ref": "#/definitions/GoalState" + } + }, + "additionalProperties": false, + "required": [ + "result", + "error" + ] + }, + "GoalStateResults": { + "type": "object", + "properties": { + "results": { + "type": "array", + "items": { + "$ref": "#/definitions/GoalStateResult" + } + } + }, + "additionalProperties": false, + "required": [ + "results" + ] + }, + "GoalStateStatus": { + "type": "object", + "properties": { + "since": { + "type": "string", + "format": "date-time" + }, + "status": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "status", + "since" + ] + }, + "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" + }, + "hostname": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "hostname", + "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" + } + } + }, + "unit-tag": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "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" + }, + "labels": { + "type": "object", + "patternProperties": { + ".*": { + "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" + }, + "type": { + "type": "string" + }, + "uuid": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "name", + "uuid", + "type" + ] + }, + "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" + } + }, + "relation-id": { + "type": "integer" + }, + "unit": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "unit", + "bindings" + ] + }, + "NetworkInfoResult": { + "type": "object", + "properties": { + "bind-addresses": { + "type": "array", + "items": { + "$ref": "#/definitions/NetworkInfo" + } + }, + "egress-subnets": { + "type": "array", + "items": { + "type": "string" + } + }, + "error": { + "$ref": "#/definitions/Error" + }, + "ingress-addresses": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "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": { + "bool": { + "type": "boolean" + }, + "endpoint": { + "$ref": "#/definitions/Endpoint" + }, + "error": { + "$ref": "#/definitions/Error" + }, + "id": { + "type": "integer" + }, + "key": { + "type": "string" + }, + "life": { + "type": "string" + }, + "other-application": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "life", + "id", + "key", + "endpoint" + ] + }, + "RelationResults": { + "type": "object", + "properties": { + "results": { + "type": "array", + "items": { + "$ref": "#/definitions/RelationResult" + } + } + }, + "additionalProperties": false, + "required": [ + "results" + ] + }, + "RelationStatusArg": { + "type": "object", + "properties": { + "message": { + "type": "string" + }, + "relation-id": { + "type": "integer" + }, + "status": { + "type": "string" + }, + "unit-tag": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "unit-tag", + "relation-id", + "status", + "message" + ] + }, + "RelationStatusArgs": { + "type": "object", + "properties": { + "args": { + "type": "array", + "items": { + "$ref": "#/definitions/RelationStatusArg" + } + } + }, + "additionalProperties": false, + "required": [ + "args" + ] + }, + "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" + ] + }, + "RelationUnitStatus": { + "type": "object", + "properties": { + "in-scope": { + "type": "boolean" + }, + "relation-tag": { + "type": "string" + }, + "suspended": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "relation-tag", + "in-scope", + "suspended" + ] + }, + "RelationUnitStatusResult": { + "type": "object", + "properties": { + "error": { + "$ref": "#/definitions/Error" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/definitions/RelationUnitStatus" + } + } + }, + "additionalProperties": false, + "required": [ + "results" + ] + }, + "RelationUnitStatusResults": { + "type": "object", + "properties": { + "results": { + "type": "array", + "items": { + "$ref": "#/definitions/RelationUnitStatusResult" + } + } + }, + "additionalProperties": false, + "required": [ + "results" + ] + }, + "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" + ] + }, + "SetPodSpecParams": { + "type": "object", + "properties": { + "specs": { + "type": "array", + "items": { + "$ref": "#/definitions/EntityString" + } + } + }, + "additionalProperties": false, + "required": [ + "specs" + ] + }, + "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 + }, + "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" + ] + }, + "UnitRefreshResult": { + "type": "object", + "properties": { + "Error": { + "$ref": "#/definitions/Error" + }, + "Life": { + "type": "string" + }, + "Resolved": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "Life", + "Resolved", + "Error" + ] + }, + "UnitRefreshResults": { + "type": "object", + "properties": { + "Results": { + "type": "array", + "items": { + "$ref": "#/definitions/UnitRefreshResult" + } + } + }, + "additionalProperties": false, + "required": [ + "Results" + ] + }, + "UnitSettings": { + "type": "object", + "properties": { + "version": { + "type": "integer" + } + }, + "additionalProperties": false, + "required": [ + "version" + ] + }, + "UpgradeSeriesStatusParam": { + "type": "object", + "properties": { + "entity": { + "$ref": "#/definitions/Entity" + }, + "message": { + "type": "string" + }, + "status": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "entity", + "status", + "message" + ] + }, + "UpgradeSeriesStatusParams": { + "type": "object", + "properties": { + "params": { + "type": "array", + "items": { + "$ref": "#/definitions/UpgradeSeriesStatusParam" + } + } + }, + "additionalProperties": false, + "required": [ + "params" + ] + }, + "UpgradeSeriesStatusResult": { + "type": "object", + "properties": { + "error": { + "$ref": "#/definitions/Error" + }, + "status": { + "type": "string" + } + }, + "additionalProperties": false + }, + "UpgradeSeriesStatusResults": { + "type": "object", + "properties": { + "results": { + "type": "array", + "items": { + "$ref": "#/definitions/UpgradeSeriesStatusResult" + } + } + }, + "additionalProperties": false + } + } + } + }, + { + "Name": "UpgradeSeries", + "Version": 1, + "Schema": { + "type": "object", + "properties": { + "FinishUpgradeSeries": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/UpdateSeriesArgs" + }, + "Result": { + "$ref": "#/definitions/ErrorResults" + } + } + }, + "MachineStatus": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/Entities" + }, + "Result": { + "$ref": "#/definitions/UpgradeSeriesStatusResults" + } + } + }, + "PinMachineApplications": { + "type": "object", + "properties": { + "Result": { + "$ref": "#/definitions/PinApplicationsResults" + } + } + }, + "PinnedLeadership": { + "type": "object", + "properties": { + "Result": { + "$ref": "#/definitions/PinnedLeadershipResult" + } + } + }, + "SetMachineStatus": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/UpgradeSeriesStatusParams" + }, + "Result": { + "$ref": "#/definitions/ErrorResults" + } + } + }, + "SetUpgradeSeriesUnitStatus": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/UpgradeSeriesStatusParams" + }, + "Result": { + "$ref": "#/definitions/ErrorResults" + } + } + }, + "StartUnitCompletion": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/UpgradeSeriesStartUnitCompletionParam" + }, + "Result": { + "$ref": "#/definitions/ErrorResults" + } + } + }, + "TargetSeries": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/Entities" + }, + "Result": { + "$ref": "#/definitions/StringResults" + } + } + }, + "UnitsCompleted": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/Entities" + }, + "Result": { + "$ref": "#/definitions/EntitiesResults" + } + } + }, + "UnitsPrepared": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/Entities" + }, + "Result": { + "$ref": "#/definitions/EntitiesResults" + } + } + }, + "UnpinMachineApplications": { + "type": "object", + "properties": { + "Result": { + "$ref": "#/definitions/PinApplicationsResults" + } + } + }, + "UpgradeSeriesUnitStatus": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/Entities" + }, + "Result": { + "$ref": "#/definitions/UpgradeSeriesStatusResults" + } + } + }, + "WatchUpgradeSeriesNotifications": { + "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 + }, + "ErrorResult": { + "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" + ] + }, + "PinApplicationResult": { + "type": "object", + "properties": { + "application-name": { + "type": "string" + }, + "error": { + "$ref": "#/definitions/Error" + } + }, + "additionalProperties": false, + "required": [ + "application-name" + ] + }, + "PinApplicationsResults": { + "type": "object", + "properties": { + "results": { + "type": "array", + "items": { + "$ref": "#/definitions/PinApplicationResult" + } + } + }, + "additionalProperties": false, + "required": [ + "results" + ] + }, + "PinnedLeadershipResult": { + "type": "object", + "properties": { + "result": { + "type": "object", + "patternProperties": { + ".*": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + }, + "additionalProperties": false + }, + "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" + ] + }, + "UpdateSeriesArg": { + "type": "object", + "properties": { + "force": { + "type": "boolean" + }, + "series": { + "type": "string" + }, + "tag": { + "$ref": "#/definitions/Entity" + } + }, + "additionalProperties": false, + "required": [ + "tag", + "force", + "series" + ] + }, + "UpdateSeriesArgs": { + "type": "object", + "properties": { + "args": { + "type": "array", + "items": { + "$ref": "#/definitions/UpdateSeriesArg" + } + } + }, + "additionalProperties": false, + "required": [ + "args" + ] + }, + "UpgradeSeriesStartUnitCompletionParam": { + "type": "object", + "properties": { + "entities": { + "type": "array", + "items": { + "$ref": "#/definitions/Entity" + } + }, + "message": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "entities", + "message" + ] + }, + "UpgradeSeriesStatusParam": { + "type": "object", + "properties": { + "entity": { + "$ref": "#/definitions/Entity" + }, + "message": { + "type": "string" + }, + "status": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "entity", + "status", + "message" + ] + }, + "UpgradeSeriesStatusParams": { + "type": "object", + "properties": { + "params": { + "type": "array", + "items": { + "$ref": "#/definitions/UpgradeSeriesStatusParam" + } + } + }, + "additionalProperties": false, + "required": [ + "params" + ] + }, + "UpgradeSeriesStatusResult": { + "type": "object", + "properties": { + "error": { + "$ref": "#/definitions/Error" + }, + "status": { + "type": "string" + } + }, + "additionalProperties": false + }, + "UpgradeSeriesStatusResults": { + "type": "object", + "properties": { + "results": { + "type": "array", + "items": { + "$ref": "#/definitions/UpgradeSeriesStatusResult" + } + } + }, + "additionalProperties": false + } + } + } + }, + { + "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": 2, + "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" + } + } + }, + "ResetPassword": { + "type": "object", + "properties": { + "Params": { + "$ref": "#/definitions/Entities" + }, + "Result": { + "$ref": "#/definitions/AddUserResults" + } + } + }, + "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": "VolumeAttachmentPlansWatcher", + "Version": 1, + "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": "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" + ] + } + } + } + } +] diff --git a/juju/client/schemas-juju-latest.json b/juju/client/schemas-juju-latest.json index 6a2593e..37e41ea 120000 --- a/juju/client/schemas-juju-latest.json +++ b/juju/client/schemas-juju-latest.json @@ -1 +1 @@ -schemas-juju-2.3-alpha1.json \ No newline at end of file +schemas-juju-2.5-rc1.json \ No newline at end of file diff --git a/juju/constraints.py b/juju/constraints.py index 998862d..0050673 100644 --- a/juju/constraints.py +++ b/juju/constraints.py @@ -29,6 +29,8 @@ FACTORS = { "P": 1024 * 1024 * 1024 } +LIST_KEYS = {'tags', 'spaces'} + SNAKE1 = re.compile(r'(.)([A-Z][a-z]+)') SNAKE2 = re.compile('([a-z0-9])([A-Z])') @@ -47,8 +49,10 @@ def parse(constraints): return constraints constraints = { - normalize_key(k): normalize_value(v) for k, v in [ - s.split("=") for s in constraints.split(" ")]} + normalize_key(k): ( + normalize_list_value(v) if k in LIST_KEYS else + normalize_value(v) + ) for k, v in [s.split("=") for s in constraints.split(" ")]} return constraints @@ -72,13 +76,12 @@ def normalize_value(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 + + +def normalize_list_value(value): + values = value.strip().split(',') + return [normalize_value(value) for value in values] diff --git a/juju/controller.py b/juju/controller.py index 9b452c7..d3902ba 100644 --- a/juju/controller.py +++ b/juju/controller.py @@ -1,65 +1,239 @@ import asyncio +import json import logging +from pathlib import Path -from . import tag -from . import utils -from .client import client -from .client import connection -from .model import Model +from . import errors, tag, utils +from .client import client, connector +from .user import User log = logging.getLogger(__name__) -class Controller(object): - def __init__(self, loop=None, - max_frame_size=connection.Connection.DEFAULT_FRAME_SIZE): +class Controller: + def __init__( + self, + loop=None, + max_frame_size=None, + bakery_client=None, + jujudata=None, + ): """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 + If jujudata is None, jujudata.FileJujuData will be used. + :param loop: an asyncio event loop + :param max_frame_size: See + `juju.client.connection.Connection.MAX_FRAME_SIZE` + :param bakery_client httpbakery.Client: The bakery client to use + for macaroon authorization. + :param jujudata JujuData: The source for current controller + information. """ - 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._connector = connector.Connector( + loop=loop, + max_frame_size=max_frame_size, + bakery_client=bakery_client, + jujudata=jujudata, + ) + async def __aenter__(self): + await self.connect() + return self + + async def __aexit__(self, exc_type, exc, tb): + await self.disconnect() + + @property + def loop(self): + return self._connector.loop + + async def connect(self, *args, **kwargs): + """Connect to a Juju controller. + + This supports two calling conventions: + + The controller and (optionally) authentication information can be + taken from the data files created by the Juju CLI. This convention + will be used if a ``controller_name`` is specified, or if the + ``endpoint`` is not. + + Otherwise, both the ``endpoint`` and authentication information + (``username`` and ``password``, or ``bakery_client`` and/or + ``macaroons``) are required. + + If a single positional argument is given, it will be assumed to be + the ``controller_name``. Otherwise, the first positional argument, + if any, must be the ``endpoint``. + + Available parameters are: + + :param str controller_name: Name of controller registered with the + Juju CLI. + :param str endpoint: The hostname:port of the controller to connect to. + :param str username: The username for controller-local users (or None + to use macaroon-based login.) + :param str password: The password for controller-local users. + :param str cacert: The CA certificate of the controller + (PEM formatted). + :param httpbakery.Client bakery_client: The macaroon bakery client to + to use when performing macaroon-based login. Macaroon tokens + acquired when logging will be saved to bakery_client.cookies. + If this is None, a default bakery_client will be used. + :param list macaroons: List of macaroons to load into the + ``bakery_client``. + :param asyncio.BaseEventLoop loop: The event loop to use for async + operations. + :param int max_frame_size: The maximum websocket frame size to allow. """ - self.connection = await connection.Connection.connect( - endpoint, None, username, password, cacert, macaroons, - max_frame_size=self.max_frame_size) + await self.disconnect() + if 'endpoint' not in kwargs and len(args) < 2: + if args and 'model_name' in kwargs: + raise TypeError('connect() got multiple values for ' + 'controller_name') + elif args: + controller_name = args[0] + else: + controller_name = kwargs.pop('controller_name', None) + await self._connector.connect_controller(controller_name, **kwargs) + else: + if 'controller_name' in kwargs: + raise TypeError('connect() got values for both ' + 'controller_name and endpoint') + if args and 'endpoint' in kwargs: + raise TypeError('connect() got multiple values for endpoint') + has_userpass = (len(args) >= 3 or + {'username', 'password'}.issubset(kwargs)) + has_macaroons = (len(args) >= 5 or not + {'bakery_client', 'macaroons'}.isdisjoint(kwargs)) + if not (has_userpass or has_macaroons): + raise TypeError('connect() missing auth params') + arg_names = [ + 'endpoint', + 'username', + 'password', + 'cacert', + 'bakery_client', + 'macaroons', + 'loop', + 'max_frame_size', + ] + for i, arg in enumerate(args): + kwargs[arg_names[i]] = arg + if 'endpoint' not in kwargs: + raise ValueError('endpoint is required ' + 'if controller_name not given') + if not ({'username', 'password'}.issubset(kwargs) or + {'bakery_client', 'macaroons'}.intersection(kwargs)): + raise ValueError('Authentication parameters are required ' + 'if controller_name not given') + await self._connector.connect(**kwargs) 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)) + .. deprecated:: 0.7.3 + Use :meth:`.connect()` instead. + """ + return await self.connect() 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 + .. deprecated:: 0.7.3 + Use :meth:`.connect(controller_name)` instead. + """ + return await self.connect(controller_name) + + async def _connect_direct(self, **kwargs): + await self.disconnect() + await self._connector.connect(**kwargs) + + def is_connected(self): + """Reports whether the Controller is currently connected.""" + return self._connector.is_connected() + + def connection(self): + """Return the current Connection object. It raises an exception + if the Controller is disconnected""" + return self._connector.connection() + + @property + def controller_name(self): + return self._connector.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 + await self._connector.disconnect() + + async def add_credential(self, name=None, credential=None, cloud=None, + owner=None, force=False): + """Add or update a credential to the controller. + + :param str name: Name of new credential. If None, the default + local credential is used. Name must be provided if a credential + is given. + :param CloudCredential credential: Credential to add. If not given, + it will attempt to read from local data, if available. + :param str cloud: Name of cloud to associate the credential with. + Defaults to the same cloud as the controller. + :param str owner: Username that will own the credential. Defaults to + the current user. + :param bool force: Force indicates whether the update should be forced. + It's only supported for facade v3 or later. + Defaults to false. + :returns: Name of credential that was uploaded. + """ + if not cloud: + cloud = await self.get_cloud() + + if not owner: + owner = self.connection().info['user-info']['identity'] + + if credential and not name: + raise errors.JujuError('Name must be provided for credential') + + if not credential: + name, credential = self._connector.jujudata.load_credential(cloud, + name) + if credential is None: + raise errors.JujuError( + 'Unable to find credential: {}'.format(name)) + + if credential.auth_type == 'jsonfile' and 'file' in credential.attrs: + # file creds have to be loaded before being sent to the controller + try: + # it might already be JSON + json.loads(credential.attrs['file']) + except json.JSONDecodeError: + # not valid JSON, so maybe it's a file + cred_path = Path(credential.attrs['file']) + if cred_path.exists(): + # make a copy + cred_json = credential.to_json() + credential = client.CloudCredential.from_json(cred_json) + # inline the cred + credential.attrs['file'] = cred_path.read_text() + + log.debug('Uploading credential %s', name) + cloud_facade = client.CloudFacade.from_connection(self.connection()) + tagged_credentials = [ + client.UpdateCloudCredential( + tag=tag.credential(cloud, tag.untag('user-', owner), name), + credential=credential, + )] + if cloud_facade.version >= 3: + # UpdateCredentials was renamed to UpdateCredentialsCheckModels + # in facade version 3. + await cloud_facade.UpdateCredentialsCheckModels( + credentials=tagged_credentials, force=force, + ) + else: + await cloud_facade.UpdateCredentials(tagged_credentials) + return name async def add_model( self, model_name, cloud_name=None, credential_name=None, @@ -70,21 +244,30 @@ class Controller(object): :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. + creating the model. If not given, it will attempt to find a + default credential. :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. - + :return Model: A connection to the newly created model. """ model_facade = client.ModelManagerFacade.from_connection( - self.connection) + self.connection()) - owner = owner or self.connection.info['user-info']['identity'] + owner = owner or self.connection().info['user-info']['identity'] cloud_name = cloud_name or await self.get_cloud() + try: + # attempt to add/update the credential from local data if available + credential_name = await self.add_credential( + name=credential_name, + cloud=cloud_name, + owner=owner) + except errors.JujuError: + # if it's not available locally, assume it's on the controller + pass + if credential_name: credential = tag.credential( cloud_name, @@ -96,6 +279,11 @@ class Controller(object): log.debug('Creating model %s', model_name) + if not config or 'authorized-keys' not in config: + config = config or {} + config['authorized-keys'] = await utils.read_ssh_key( + loop=self._connector.loop) + model_info = await model_facade.CreateModel( tag.cloud(cloud_name), config, @@ -104,75 +292,72 @@ class Controller(object): 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 ` 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, - ) + from juju.model import Model + model = Model(jujudata=self._connector.jujudata) + kwargs = self.connection().connect_params() + kwargs['uuid'] = model_info.uuid + await model._connect_direct(**kwargs) return model - async def destroy_models(self, *uuids): + async def destroy_models(self, *models, destroy_storage=False): """Destroy one or more models. - :param str \*uuids: UUIDs of models to destroy + :param str *models: Names or UUIDs of models to destroy + :param bool destroy_storage: Whether or not to destroy storage when + destroying the models. Defaults to false. """ + uuids = await self.model_uuids() + models = [uuids[model] if model in uuids else model + for model in models] + model_facade = client.ModelManagerFacade.from_connection( - self.connection) + self.connection()) log.debug( 'Destroying model%s %s', - '' if len(uuids) == 1 else 's', - ', '.join(uuids) + '' if len(models) == 1 else 's', + ', '.join(models) ) - await model_facade.DestroyModels([ - client.Entity(tag.model(uuid)) - for uuid in uuids - ]) + if model_facade.version >= 5: + params = [ + client.DestroyModelParams(model_tag=tag.model(model), + destroy_storage=destroy_storage) + for model in models] + else: + params = [client.Entity(tag.model(model)) for model in models] + + await model_facade.DestroyModels(params) 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 password: Password :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 - + :returns: A :class:`~juju.user.User` instance """ 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) + user_facade = client.UserManagerFacade.from_connection( + self.connection()) + users = [client.AddUser(display_name=display_name, + username=username, + password=password)] + results = await user_facade.AddUser(users) + secret_key = results.results[0].secret_key + return await self.get_user(username, secret_key=secret_key) + + async def remove_user(self, username): + """Remove a user from this controller. + """ + client_facade = client.UserManagerFacade.from_connection( + self.connection()) + user = tag.user(username) + await client_facade.RemoveUser([client.Entity(user)]) async def change_user_password(self, username, password): """Change the password for a user in this controller. @@ -181,10 +366,24 @@ class Controller(object): :param str password: New password """ - user_facade = client.UserManagerFacade.from_connection(self.connection) + user_facade = client.UserManagerFacade.from_connection( + self.connection()) entity = client.EntityPassword(password, tag.user(username)) return await user_facade.SetPassword([entity]) + async def reset_user_password(self, username): + """Reset user password. + + :param str username: Username + :returns: A :class:`~juju.user.User` instance + """ + user_facade = client.UserManagerFacade.from_connection( + self.connection()) + entity = client.Entity(tag.user(username)) + results = await user_facade.ResetPassword([entity]) + secret_key = results.results[0].secret_key + return await self.get_user(username, secret_key=secret_key) + async def destroy(self, destroy_all_models=False): """Destroy this controller. @@ -193,7 +392,7 @@ class Controller(object): """ controller_facade = client.ControllerFacade.from_connection( - self.connection) + self.connection()) return await controller_facade.DestroyController(destroy_all_models) async def disable_user(self, username): @@ -202,7 +401,8 @@ class Controller(object): :param str username: Username """ - user_facade = client.UserManagerFacade.from_connection(self.connection) + user_facade = client.UserManagerFacade.from_connection( + self.connection()) entity = client.Entity(tag.user(username)) return await user_facade.DisableUser([entity]) @@ -210,7 +410,8 @@ class Controller(object): """Re-enable a previously disabled user. """ - user_facade = client.UserManagerFacade.from_connection(self.connection) + user_facade = client.UserManagerFacade.from_connection( + self.connection()) entity = client.Entity(tag.user(username)) return await user_facade.EnableUser([entity]) @@ -225,28 +426,57 @@ class Controller(object): """ Get the name of the cloud that this controller lives on. """ - cloud_facade = client.CloudFacade.from_connection(self.connection) + 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) - + """ + .. deprecated:: 0.7.0 + Use :meth:`.list_models` instead. + """ + controller_facade = client.ControllerFacade.from_connection( + self.connection()) + for attempt in (1, 2, 3): + try: + return await controller_facade.AllModels() + except errors.JujuAPIError as e: + # retry concurrency error until resolved in Juju + # see: https://bugs.launchpad.net/juju/+bug/1721786 + if 'has been removed' not in e.message or attempt == 3: + raise + + async def model_uuids(self): + """Return a mapping of model names to UUIDs. """ controller_facade = client.ControllerFacade.from_connection( - self.connection) - return await controller_facade.AllModels() + self.connection()) + for attempt in (1, 2, 3): + try: + response = await controller_facade.AllModels() + return {um.model.name: um.model.uuid + for um in response.user_models} + except errors.JujuAPIError as e: + # retry concurrency error until resolved in Juju + # see: https://bugs.launchpad.net/juju/+bug/1721786 + if 'has been removed' not in e.message or attempt == 3: + raise + await asyncio.sleep(attempt, loop=self._connector.loop) + + async def list_models(self): + """Return list of names of the available models on this controller. + + Equivalent to ``sorted((await self.model_uuids()).keys())`` + """ + uuids = await self.model_uuids() + return sorted(uuids.keys()) def get_payloads(self, *patterns): """Return list of known payloads. - :param str \*patterns: Patterns to match against + :param str *patterns: Patterns to match against Each pattern will be checked against the following info in Juju:: @@ -261,14 +491,6 @@ class Controller(object): """ 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. @@ -284,48 +506,128 @@ class Controller(object): """ raise NotImplementedError() - def get_model(self, name): - """Get a model by name. - - :param str name: Model name + async def get_model(self, model): + """Get a model by name or UUID. + :param str model: Model name or UUID + :returns Model: Connected Model instance. """ - raise NotImplementedError() + uuids = await self.model_uuids() + if model in uuids: + uuid = uuids[model] + else: + uuid = model - async def get_user(self, username, include_disabled=False): + from juju.model import Model + model = Model() + kwargs = self.connection().connect_params() + kwargs['uuid'] = uuid + await model._connect_direct(**kwargs) + return model + + async def get_user(self, username, secret_key=None): """Get a user by name. :param str username: Username - + :param str secret_key: Issued by juju when add or reset user + password + :returns: A :class:`~juju.user.User` instance """ client_facade = client.UserManagerFacade.from_connection( - self.connection) + self.connection()) user = tag.user(username) - return await client_facade.UserInfo([client.Entity(user)], - include_disabled) + args = [client.Entity(user)] + try: + response = await client_facade.UserInfo(args, True) + except errors.JujuError as e: + if 'permission denied' in e.errors: + # apparently, trying to get info for a nonexistent user returns + # a "permission denied" error rather than an empty result set + return None + raise + if response.results and response.results[0].result: + return User(self, response.results[0].result, secret_key=secret_key) + return None + + async def get_users(self, include_disabled=False): + """Return list of users that can connect to this controller. - async def grant(self, username, acl='login'): - """Set access level of the given user on the controller + :param bool include_disabled: Include disabled users + :returns: A list of :class:`~juju.user.User` instances + """ + client_facade = client.UserManagerFacade.from_connection( + self.connection()) + response = await client_facade.UserInfo(None, include_disabled) + return [User(self, r.result) for r in response.results] + async def grant(self, username, acl='login'): + """Grant access level of the given user on the controller. + Note that if the user already has higher permissions than the + provided ACL, this will do nothing (see revoke for a way to + remove permissions). :param str username: Username :param str acl: Access control ('login', 'add-model' or 'superuser') - + :returns: True if new access was granted, False if user already had + requested access or greater. Raises JujuError if failed. """ controller_facade = client.ControllerFacade.from_connection( - self.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 + try: + await controller_facade.ModifyControllerAccess([changes]) + return True + except errors.JujuError as e: + if 'user already has' in str(e): + return False + else: + raise + + async def revoke(self, username, acl='login'): + """Removes some or all access of a user to from a controller + If 'login' access is revoked, the user will no longer have any + permissions on the controller. Revoking a higher privilege from + a user without that privilege will have no effect. :param str username: username - + :param str acl: Access to remove ('login', 'add-model' or 'superuser') """ controller_facade = client.ControllerFacade.from_connection( - self.connection) + self.connection()) user = tag.user(username) changes = client.ModifyControllerAccess('login', 'revoke', user) return await controller_facade.ModifyControllerAccess([changes]) + + async def grant_model(self, username, model_uuid, acl='read'): + """Grant a user access to a model. Note that if the user + already has higher permissions than the provided ACL, + this will do nothing (see revoke_model for a way to remove + permissions). + + :param str username: Username + :param str model_uuid: The UUID of the model to change. + :param str acl: Access control ('read, 'write' or 'admin') + """ + model_facade = client.ModelManagerFacade.from_connection( + self.connection()) + user = tag.user(username) + model = tag.model(model_uuid) + changes = client.ModifyModelAccess(acl, 'grant', model, user) + return await model_facade.ModifyModelAccess([changes]) + + async def revoke_model(self, username, model_uuid, acl='read'): + """Revoke some or all of a user's access to a model. + If 'read' access is revoked, the user will no longer have any + permissions on the model. Revoking a higher privilege from + a user without that privilege will have no effect. + + :param str username: Username to revoke + :param str model_uuid: The UUID of the model to change. + :param str acl: Access control ('read, 'write' or 'admin') + """ + model_facade = client.ModelManagerFacade.from_connection( + self.connection()) + user = tag.user(username) + model = tag.model(model_uuid) + changes = client.ModifyModelAccess(acl, 'revoke', model, user) + return await model_facade.ModifyModelAccess([changes]) diff --git a/juju/errors.py b/juju/errors.py index de52174..da11cdb 100644 --- a/juju/errors.py +++ b/juju/errors.py @@ -1,5 +1,16 @@ class JujuError(Exception): - pass + def __init__(self, *args, **kwargs): + self.message = '' + self.errors = [] + if args: + self.message = str(args[0]) + if isinstance(args[0], (list, tuple)): + self.errors = args[0] + elif len(args) > 1: + self.errors = list(args) + else: + self.errors = [self.message] + super().__init__(*args, **kwargs) class JujuAPIError(JujuError): @@ -14,3 +25,25 @@ class JujuAPIError(JujuError): class JujuConnectionError(ConnectionError, JujuError): pass + + +class JujuAuthError(JujuConnectionError): + pass + + +class JujuRedirectException(Exception): + """Exception indicating that a redirection was requested""" + def __init__(self, redirect_info): + self.redirect_info = redirect_info + + @property + def ca_cert(self): + return self.redirect_info['ca-cert'] + + @property + def endpoints(self): + return [ + ('{value}:{port}'.format(**s), self.ca_cert) + for servers in self.redirect_info['servers'] + for s in servers if s['scope'] == 'public' + ] diff --git a/juju/juju.py b/juju/juju.py index a9fcbbe..444155f 100644 --- a/juju/juju.py +++ b/juju/juju.py @@ -19,7 +19,7 @@ class Juju(object): def agree(self, *terms): """Agree to the terms of a charm. - :param str \*terms: Terms to agree to + :param str *terms: Terms to agree to """ raise NotImplementedError() diff --git a/juju/loop.py b/juju/loop.py index 4abedfc..aca726b 100644 --- a/juju/loop.py +++ b/juju/loop.py @@ -24,7 +24,7 @@ def run(*steps): try: loop.add_signal_handler(signal.SIGINT, abort) added = True - except ValueError as e: + except (ValueError, OSError, RuntimeError) as e: # add_signal_handler doesn't work in a thread if 'main thread' not in str(e): raise diff --git a/juju/machine.py b/juju/machine.py index 23b41c6..39bfa11 100644 --- a/juju/machine.py +++ b/juju/machine.py @@ -2,7 +2,7 @@ import asyncio import logging import os -from dateutil.parser import parse as parse_date +import pyrfc3339 from . import model, utils from .client import client @@ -14,7 +14,18 @@ log = logging.getLogger(__name__) class Machine(model.ModelEntity): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) - self.on_change(self._workaround_1695335) + self.model.loop.create_task(self._queue_workarounds()) + + async def _queue_workarounds(self): + model = self.model + if not model.info: + await utils.run_with_interrupt(model.get_info(), + model._watch_stopping, + loop=model.loop) + if model._watch_stopping.is_set(): + return + if model.info.agent_version < client.Number.from_json('2.2.3'): + self.on_change(self._workaround_1695335) async def _workaround_1695335(self, delta, old, new, model): """ @@ -39,7 +50,7 @@ class Machine(model.ModelEntity): full_status = await utils.run_with_interrupt(model.get_status(), model._watch_stopping, - model.loop) + loop=model.loop) if model._watch_stopping.is_set(): return @@ -66,8 +77,8 @@ class Machine(model.ModelEntity): 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']) + status_since = pyrfc3339.parse(machine['instance-status']['since']) + delta_since = pyrfc3339.parse(delta.data['instance-status']['since']) if status_since > delta_since: for status_key in ('status', 'info', 'since'): delta_key = key_map[status_key] @@ -135,7 +146,8 @@ class Machine(model.ModelEntity): :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 + :param scp_opts: Additional options to the `scp` command + :type scp_opts: str or list """ if proxy: raise NotImplementedError('proxy option is not implemented') @@ -152,7 +164,8 @@ class Machine(model.ModelEntity): :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 + :param scp_opts: Additional options to the `scp` command + :type scp_opts: str or list """ if proxy: raise NotImplementedError('proxy option is not implemented') @@ -169,9 +182,11 @@ class Machine(model.ModelEntity): 'scp', '-i', os.path.expanduser('~/.local/share/juju/ssh/juju_id_rsa'), '-o', 'StrictHostKeyChecking=no', - source, destination + '-q', + '-B' ] - cmd += scp_opts.split() + cmd.extend(scp_opts.split() if isinstance(scp_opts, str) else scp_opts) + cmd.extend([source, destination]) loop = self.model.loop process = await asyncio.create_subprocess_exec(*cmd, loop=loop) await process.wait() @@ -211,7 +226,7 @@ class Machine(model.ModelEntity): """Get the time when the `agent_status` was last updated. """ - return parse_date(self.safe_data['agent-status']['since']) + return pyrfc3339.parse(self.safe_data['agent-status']['since']) @property def agent_version(self): @@ -244,7 +259,7 @@ class Machine(model.ModelEntity): """Get the time when the `status` was last updated. """ - return parse_date(self.safe_data['instance-status']['since']) + return pyrfc3339.parse(self.safe_data['instance-status']['since']) @property def dns_name(self): @@ -260,3 +275,10 @@ class Machine(model.ModelEntity): if addresses: return addresses[0]['value'] return None + + @property + def series(self): + """Returns the series of the current machine + + """ + return self.safe_data['series'] diff --git a/juju/model.py b/juju/model.py index bd8709a..bd7d430 100644 --- a/juju/model.py +++ b/juju/model.py @@ -14,26 +14,28 @@ from concurrent.futures import CancelledError from functools import partial from pathlib import Path -import websockets -import yaml import theblues.charmstore import theblues.errors +import websockets +import yaml from . import tag, utils -from .client import client -from .client import connection +from .client import client, connector 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 .client.client import Value +from .constraints import parse as parse_constraints +from .constraints import normalize_key +from .delta import get_entity_class, get_entity_delta +from .errors import JujuAPIError, JujuError from .exceptions import DeadEntityException -from .errors import JujuError, JujuAPIError from .placement import parse as parse_placement +from . import provisioner + log = logging.getLogger(__name__) -class _Observer(object): +class _Observer: """Wrapper around an observer callable. This wrapper allows filter criteria to be associated with the @@ -77,7 +79,7 @@ class _Observer(object): return True -class ModelObserver(object): +class ModelObserver: """ Base class for creating observers that react to changes in a model. """ @@ -100,7 +102,7 @@ class ModelObserver(object): pass -class ModelState(object): +class ModelState: """Holds the state of the model, including the delta history of all entities in the model. @@ -144,6 +146,14 @@ class ModelState(object): """ return self._live_entity_map('unit') + @property + def relations(self): + """Return a map of relation-id:Relation for all relations currently in + the model. + + """ + return self._live_entity_map('relation') + def entity_history(self, entity_type, entity_id): """Return the history deque for an entity. @@ -209,7 +219,7 @@ class ModelState(object): connected=connected) -class ModelEntity(object): +class ModelEntity: """An object in the Model tree""" def __init__(self, entity_id, model, history_index=-1, connected=True): @@ -228,7 +238,7 @@ class ModelEntity(object): self.model = model self._history_index = history_index self.connected = connected - self.connection = model.connection + self.connection = model.connection() def __repr__(self): return '<{} entity_id="{}">'.format(type(self).__name__, @@ -380,90 +390,207 @@ class ModelEntity(object): return self.model.state.get_entity(self.entity_type, self.entity_id) -class Model(object): +class Model: """ 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. + def __init__( + self, + loop=None, + max_frame_size=None, + bakery_client=None, + jujudata=None, + ): + """Instantiate a new Model. + + The connect method will need to be called before this + object can be used for anything interesting. + + If jujudata is None, jujudata.FileJujuData will be used. :param loop: an asyncio event loop :param max_frame_size: See `juju.client.connection.Connection.MAX_FRAME_SIZE` + :param bakery_client httpbakery.Client: The bakery client to use + for macaroon authorization. + :param jujudata JujuData: The source for current controller information + """ + self._connector = connector.Connector( + loop=loop, + max_frame_size=max_frame_size, + bakery_client=bakery_client, + jujudata=jujudata, + ) + self._observers = weakref.WeakValueDictionary() + self.state = ModelState(self) + self._info = None + self._watch_stopping = asyncio.Event(loop=self._connector.loop) + self._watch_stopped = asyncio.Event(loop=self._connector.loop) + self._watch_received = asyncio.Event(loop=self._connector.loop) + self._watch_stopped.set() + self._charmstore = CharmStore(self._connector.loop) + def is_connected(self): + """Reports whether the Model is currently connected.""" + return self._connector.is_connected() + + @property + def loop(self): + return self._connector.loop + + def connection(self): + """Return the current Connection object. It raises an exception + if the Model is disconnected""" + return self._connector.connection() + + async def get_controller(self): + """Return a Controller instance for the currently connected model. + :return Controller: """ - 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) + from juju.controller import Controller + controller = Controller(jujudata=self._connector.jujudata) + kwargs = self.connection().connect_params() + kwargs.pop('uuid') + await controller._connect_direct(**kwargs) + return controller async def __aenter__(self): - await self.connect_current() + await self.connect() 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, **kwargs): + """Connect to a juju model. - async def connect(self, *args, **kw): - """Connect to an arbitrary Juju model. + This supports two calling conventions: - args and kw are passed through to Connection.connect() + The model and (optionally) authentication information can be taken + from the data files created by the Juju CLI. This convention will + be used if a ``model_name`` is specified, or if the ``endpoint`` + and ``uuid`` are not. - """ - 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() + Otherwise, all of the ``endpoint``, ``uuid``, and authentication + information (``username`` and ``password``, or ``bakery_client`` and/or + ``macaroons``) are required. - async def connect_current(self): - """Connect to the current Juju model. + If a single positional argument is given, it will be assumed to be + the ``model_name``. Otherwise, the first positional argument, if any, + must be the ``endpoint``. + + Available parameters are: + :param model_name: Format [controller:][user/]model + :param str endpoint: The hostname:port of the controller to connect to. + :param str uuid: The model UUID to connect to. + :param str username: The username for controller-local users (or None + to use macaroon-based login.) + :param str password: The password for controller-local users. + :param str cacert: The CA certificate of the controller + (PEM formatted). + :param httpbakery.Client bakery_client: The macaroon bakery client to + to use when performing macaroon-based login. Macaroon tokens + acquired when logging will be saved to bakery_client.cookies. + If this is None, a default bakery_client will be used. + :param list macaroons: List of macaroons to load into the + ``bakery_client``. + :param asyncio.BaseEventLoop loop: The event loop to use for async + operations. + :param int max_frame_size: The maximum websocket frame size to allow. """ - self.connection = await connection.Connection.connect_current( - self.loop, max_frame_size=self.max_frame_size) + await self.disconnect() + if 'endpoint' not in kwargs and len(args) < 2: + if args and 'model_name' in kwargs: + raise TypeError('connect() got multiple values for model_name') + elif args: + model_name = args[0] + else: + model_name = kwargs.pop('model_name', None) + await self._connector.connect_model(model_name, **kwargs) + else: + if 'model_name' in kwargs: + raise TypeError('connect() got values for both ' + 'model_name and endpoint') + if args and 'endpoint' in kwargs: + raise TypeError('connect() got multiple values for endpoint') + if len(args) < 2 and 'uuid' not in kwargs: + raise TypeError('connect() missing value for uuid') + has_userpass = (len(args) >= 4 or + {'username', 'password'}.issubset(kwargs)) + has_macaroons = (len(args) >= 6 or not + {'bakery_client', 'macaroons'}.isdisjoint(kwargs)) + if not (has_userpass or has_macaroons): + raise TypeError('connect() missing auth params') + arg_names = [ + 'endpoint', + 'uuid', + 'username', + 'password', + 'cacert', + 'bakery_client', + 'macaroons', + 'loop', + 'max_frame_size', + ] + for i, arg in enumerate(args): + kwargs[arg_names[i]] = arg + if not {'endpoint', 'uuid'}.issubset(kwargs): + raise ValueError('endpoint and uuid are required ' + 'if model_name not given') + if not ({'username', 'password'}.issubset(kwargs) or + {'bakery_client', 'macaroons'}.intersection(kwargs)): + raise ValueError('Authentication parameters are required ' + 'if model_name not given') + await self._connector.connect(**kwargs) 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 + """ + .. deprecated:: 0.6.2 + Use ``connect(model_name=model_name)`` instead. + """ + return await self.connect(model_name=model_name) + async def connect_current(self): + """ + .. deprecated:: 0.6.2 + Use ``connect()`` instead. """ - self.connection = await connection.Connection.connect_model( - model_name, self.loop, self.max_frame_size) + return await self.connect() + + async def _connect_direct(self, **kwargs): + await self.disconnect() + await self._connector.connect(**kwargs) await self._after_connect() async def _after_connect(self): - """Run initialization steps after connecting to websocket. - - """ self._watch() + + # Wait for the first packet of data from the AllWatcher, + # which contains all information on the model. + # TODO this means that we can't do anything until + # we've received all the model data, which might be + # a whole load of unneeded data if all the client wants + # to do is make one RPC call. 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: + if not self._watch_stopped.is_set(): log.debug('Stopping watcher task') self._watch_stopping.set() await self._watch_stopped.wait() + self._watch_stopping.clear() + + if self.is_connected(): log.debug('Closing model connection') - await self.connection.close() - self.connection = None + await self._connector.disconnect() + self._info = None async def add_local_charm_dir(self, charm_dir, series): """Upload a local charm to the model. @@ -480,7 +607,7 @@ class Model(object): 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) + charm_url = await self._connector.loop.run_in_executor(None, func) log.debug('Uploaded local charm: %s -> %s', charm_dir, charm_url) return charm_url @@ -505,7 +632,7 @@ class Model(object): instead. """ - conn, headers, path_prefix = self.connection.https_connection() + conn, headers, path_prefix = self.connection().https_connection() path = "%s/charms?series=%s" % (path_prefix, series) headers['Content-Type'] = 'application/zip' if size: @@ -549,13 +676,20 @@ class Model(object): async def block_until(self, *conditions, timeout=None, wait_period=0.5): """Return only after all conditions are true. + Raises `websockets.ConnectionClosed` if disconnected. """ - 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) + def _disconnected(): + return not (self.is_connected() and self.connection().is_open) + + def done(): + return _disconnected() or all(c() for c in conditions) + + await utils.block_until(done, + timeout=timeout, + wait_period=wait_period, + loop=self.loop) + if _disconnected(): + raise websockets.ConnectionClosed(1006, 'no reason') @property def applications(self): @@ -581,6 +715,13 @@ class Model(object): """ return self.state.units + @property + def relations(self): + """Return a list of all Relations currently in the model. + + """ + return list(self.state.relations.values()) + async def get_info(self): """Return a client.ModelInfo object for this Model. @@ -594,13 +735,21 @@ class Model(object): explicit call to this method. """ - facade = client.ClientFacade.from_connection(self.connection) + facade = client.ClientFacade.from_connection(self.connection()) - self.info = await facade.ModelInfo() + self._info = await facade.ModelInfo() log.debug('Got ModelInfo: %s', vars(self.info)) return self.info + @property + def info(self): + """Return the cached client.ModelInfo object for this Model. + + If Model.get_info() has not been called, this will return None. + """ + return self._info + def add_observer( self, callable_, entity_type=None, action=None, entity_id=None, predicate=None): @@ -639,7 +788,7 @@ class Model(object): """ observer = _Observer( callable_, entity_type, action, entity_id, predicate) - self.observers[observer] = callable_ + self._observers[observer] = callable_ def _watch(self): """Start an asynchronous watch against this model. @@ -650,13 +799,13 @@ class Model(object): async def _all_watcher(): try: allwatcher = client.AllWatcherFacade.from_connection( - self.connection) + self.connection()) while not self._watch_stopping.is_set(): try: results = await utils.run_with_interrupt( allwatcher.Next(), self._watch_stopping, - self.loop) + loop=self._connector.loop) except JujuAPIError as e: if 'watcher was stopped' not in str(e): raise @@ -673,19 +822,27 @@ class Model(object): del allwatcher.Id continue except websockets.ConnectionClosed: - monitor = self.connection.monitor + monitor = self.connection().monitor if monitor.status == monitor.ERROR: # closed unexpectedly, try to reopen log.warning( 'Watcher: connection closed, reopening') - await self.connection.reconnect() + await self.connection().reconnect() + if monitor.status != monitor.CONNECTED: + # reconnect failed; abort and shutdown + log.error('Watcher: automatic reconnect ' + 'failed; stopping watcher') + break del allwatcher.Id continue else: # closed on request, go ahead and shutdown break if self._watch_stopping.is_set(): - await allwatcher.Stop() + try: + await allwatcher.Stop() + except websockets.ConnectionClosed: + pass # can't stop on a closed conn break for delta in results.deltas: delta = get_entity_delta(delta) @@ -704,7 +861,7 @@ class Model(object): self._watch_received.clear() self._watch_stopping.clear() self._watch_stopped.clear() - self.loop.create_task(_all_watcher()) + self._connector.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 @@ -724,10 +881,10 @@ class Model(object): 'Model changed: %s %s %s', delta.entity, delta.type, delta.get_id()) - for o in self.observers: + for o in self._observers: if o.cares_about(delta): asyncio.ensure_future(o(delta, old_obj, new_obj, self), - loop=self.loop) + loop=self._connector.loop) async def _wait(self, entity_type, entity_id, action, predicate=None): """ @@ -744,7 +901,7 @@ class Model(object): has a 'completed' status. See the _Observer class for details. """ - q = asyncio.Queue(loop=self.loop) + q = asyncio.Queue(loop=self._connector.loop) async def callback(delta, old, new, model): await q.put(delta.get_id()) @@ -755,24 +912,19 @@ class Model(object): # '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): + async def _wait_for_new(self, entity_type, entity_id): """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. + Waits for an object of type ``entity_type`` with id ``entity_id`` + to appear in the model. This is similar to watching for the + object using ``block_until``, but uses the watcher rather than + polling. """ # 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) + return await self._wait(entity_type, entity_id, None) async def wait_for_action(self, action_id): """Given an action, wait for it to complete.""" @@ -785,7 +937,7 @@ class Model(object): def predicate(delta): return delta.data['status'] in ('completed', 'failed') - return await self._wait('action', action_id, 'change', predicate) + return await self._wait('action', action_id, None, predicate) async def add_machine( self, spec=None, constraints=None, disks=None, series=None): @@ -798,7 +950,8 @@ class Model(object): (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 + 'ssh:user@10.10.0.3:/path/to/private/key' - manually provision + a machine with ssh and the private key used for authentication 'zone=us-east-1a' - starts a machine in zone us-east-1s on AWS 'maas2.name' - acquire machine maas2.name on MAAS @@ -847,12 +1000,25 @@ class Model(object): """ params = client.AddMachineParams() - params.jobs = ['JobHostUnits'] if spec: - placement = parse_placement(spec) - if placement: - params.placement = placement[0] + if spec.startswith("ssh:"): + placement, target, private_key_path = spec.split(":") + user, host = target.split("@") + + sshProvisioner = provisioner.SSHProvisioner( + host=host, + user=user, + private_key_path=private_key_path, + ) + + params = sshProvisioner.provision_machine() + else: + placement = parse_placement(spec) + if placement: + params.placement = placement[0] + + params.jobs = ['JobHostUnits'] if constraints: params.constraints = client.Value.from_json(constraints) @@ -865,12 +1031,23 @@ class Model(object): params.series = series # Submit the request. - client_facade = client.ClientFacade.from_connection(self.connection) + 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 + + if spec: + if spec.startswith("ssh:"): + # Need to run this after AddMachines has been called, + # as we need the machine_id + await sshProvisioner.install_agent( + self.connection(), + params.nonce, + machine_id, + ) + log.debug('Added new machine %s', machine_id) return await self._wait_for_new('machine', machine_id) @@ -881,29 +1058,34 @@ class Model(object): :param str relation2: '[:]' """ - app_facade = client.ApplicationFacade.from_connection(self.connection) + connection = self.connection() + app_facade = client.ApplicationFacade.from_connection(connection) log.debug( 'Adding relation %s <-> %s', relation1, relation2) + def _find_relation(*specs): + for rel in self.relations: + if rel.matches(*specs): + return rel + return None + 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 + rel = _find_relation(relation1, relation2) + if rel: + return rel + raise JujuError('Relation {} {} exists but not in model'.format( + relation1, relation2)) - def predicate(delta): - endpoints = {} - for endpoint in delta.data['endpoints']: - endpoints[endpoint['application-name']] = endpoint['relation'] - return endpoints == result.endpoints + specs = ['{}:{}'.format(app, data['name']) + for app, data in result.endpoints.items()] - return await self._wait_for_new('relation', None, predicate) + await self.block_until(lambda: _find_relation(*specs) is not None) + return _find_relation(*specs) def add_space(self, name, *cidrs): """Add a new network space. @@ -912,7 +1094,7 @@ class Model(object): (optional) list of existing subnet CIDRs with it. :param str name: Name of the space - :param \*cidrs: Optional list of existing subnet CIDRs + :param *cidrs: Optional list of existing subnet CIDRs """ raise NotImplementedError() @@ -924,7 +1106,7 @@ class Model(object): :param str key: The public ssh key """ - key_facade = client.KeyManagerFacade.from_connection(self.connection) + key_facade = client.KeyManagerFacade.from_connection(self.connection()) return await key_facade.AddKeys([key], user) add_ssh_keys = add_ssh_key @@ -933,7 +1115,7 @@ class Model(object): :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 + :param str *zones: Zone(s) in which the subnet resides """ raise NotImplementedError() @@ -947,7 +1129,7 @@ class Model(object): def block(self, *commands): """Add a new block to this model. - :param str \*commands: The commands to block. Valid values are + :param str *commands: The commands to block. Valid values are 'all-changes', 'destroy-model', 'remove-object' """ @@ -984,7 +1166,7 @@ class Model(object): :param str name: Name to give the storage pool :param str provider_type: Pool provider type - :param \*\*pool_config: key/value pool configuration pairs + :param **pool_config: key/value pool configuration pairs """ raise NotImplementedError() @@ -1033,7 +1215,7 @@ class Model(object): 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): + to=None, devices=None): """Deploy a new service or bundle. :param str entity_url: Charm or bundle url @@ -1072,20 +1254,27 @@ class Model(object): for k, v in storage.items() } + entity_path = Path(entity_url.replace('local:', '')) + bundle_path = entity_path / 'bundle.yaml' + metadata_path = entity_path / 'metadata.yaml' + is_local = ( entity_url.startswith('local:') or - os.path.isdir(entity_url) + entity_path.is_dir() or + entity_path.is_file() ) if is_local: entity_id = entity_url.replace('local:', '') else: - entity = await self.charmstore.entity(entity_url, channel=channel) + entity = await self.charmstore.entity(entity_url, channel=channel, + include_stats=False) entity_id = entity['Id'] - client_facade = client.ClientFacade.from_connection(self.connection) + client_facade = client.ClientFacade.from_connection(self.connection()) is_bundle = ((is_local and - (Path(entity_id) / 'bundle.yaml').exists()) or + (entity_id.endswith('.yaml') and entity_path.exists()) or + bundle_path.exists()) or (not is_local and 'bundle/' in entity_id)) if is_bundle: @@ -1100,9 +1289,9 @@ class Model(object): await asyncio.gather(*[ asyncio.ensure_future( self._wait_for_new('application', app_name), - loop=self.loop) + loop=self._connector.loop) for app_name in pending_apps - ], loop=self.loop) + ], loop=self._connector.loop) return [app for name, app in self.applications.items() if name in handler.applications] else: @@ -1116,8 +1305,11 @@ class Model(object): # actually support them yet anyway resources = await self._add_store_resources(application_name, entity_id, - entity) + entity=entity) else: + if not application_name: + metadata = yaml.load(metadata_path.read_text()) + application_name = metadata['name'] # We have a local charm dir that needs to be uploaded charm_dir = os.path.abspath( os.path.expanduser(entity_id)) @@ -1139,13 +1331,16 @@ class Model(object): storage=storage, channel=channel, num_units=num_units, - placement=parse_placement(to) + placement=parse_placement(to), + devices=devices, ) - async def _add_store_resources(self, application, entity_url, entity=None): + async def _add_store_resources(self, application, entity_url, + overrides=None, entity=None): if not entity: # avoid extra charm store call if one was already made - entity = await self.charmstore.entity(entity_url) + entity = await self.charmstore.entity(entity_url, + include_stats=False) resources = [ { 'description': resource['Description'], @@ -1159,11 +1354,22 @@ class Model(object): } for resource in entity['Meta']['resources'] ] + if overrides: + names = {r['name'] for r in resources} + unknown = overrides.keys() - names + if unknown: + raise JujuError('Unrecognized resource{}: {}'.format( + 's' if len(unknown) > 1 else '', + ', '.join(unknown))) + for resource in resources: + if resource['name'] in overrides: + resource['revision'] = overrides[resource['name']] + if not resources: return None resources_facade = client.ResourcesFacade.from_connection( - self.connection) + self.connection()) response = await resources_facade.AddPendingResources( tag.application(application), entity_url, @@ -1175,7 +1381,8 @@ class Model(object): async def _deploy(self, charm_url, application, series, config, constraints, endpoint_bindings, resources, storage, - channel=None, num_units=None, placement=None): + channel=None, num_units=None, placement=None, + devices=None): """Logic shared between `Model.deploy` and `BundleHandler.deploy`. """ log.info('Deploying %s', charm_url) @@ -1186,7 +1393,7 @@ class Model(object): default_flow_style=False) app_facade = client.ApplicationFacade.from_connection( - self.connection) + self.connection()) app = client.ApplicationDeploy( charm_url=charm_url, @@ -1199,9 +1406,9 @@ class Model(object): num_units=num_units, resources=resources, storage=storage, - placement=placement + placement=placement, + devices=devices, ) - result = await app_facade.Deploy([app]) errors = [r.error.message for r in result.results if r.error] if errors: @@ -1218,7 +1425,8 @@ class Model(object): """Destroy units by name. """ - app_facade = client.ApplicationFacade.from_connection(self.connection) + connection = self.connection() + app_facade = client.ApplicationFacade.from_connection(connection) log.debug( 'Destroying unit%s %s', @@ -1263,7 +1471,7 @@ class Model(object): which have `source` and `value` attributes. """ config_facade = client.ModelConfigFacade.from_connection( - self.connection + self.connection() ) result = await config_facade.ModelGet() config = result.config @@ -1271,27 +1479,30 @@ class Model(object): config[key] = ConfigValue.from_json(value) return config - def get_constraints(self): + async 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]) + :returns: A ``dict`` of constraints. + """ + constraints = {} + client_facade = client.ClientFacade.from_connection(self.connection()) + result = await client_facade.GetModelConstraints() + + # GetModelConstraints returns GetConstraintsResults which has a + # 'constraints' attribute. If no constraints have been set + # GetConstraintsResults.constraints is None. Otherwise + # GetConstraintsResults.constraints has an attribute for each possible + # constraint, each of these in turn will be None if they have not been + # set. + if result.constraints: + constraint_types = [a for a in dir(result.constraints) + if a in Value._toSchema.keys()] + for constraint in constraint_types: + value = getattr(result.constraints, constraint) + if value is not None: + constraints[constraint] = getattr(result.constraints, + constraint) + return constraints def import_ssh_key(self, identity): """Add a public SSH key from a trusted indentity source to this model. @@ -1326,7 +1537,7 @@ class Model(object): else it's fingerprint """ - key_facade = client.KeyManagerFacade.from_connection(self.connection) + 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) @@ -1386,7 +1597,7 @@ class Model(object): def remove_machine(self, *machine_ids): """Remove a machine from this model. - :param str \*machine_ids: Ids of the machines to remove + :param str *machine_ids: Ids of the machines to remove """ raise NotImplementedError() @@ -1399,10 +1610,10 @@ class Model(object): :param str user: Juju user to which the key is registered """ - key_facade = client.KeyManagerFacade.from_connection(self.connection) + 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])) + 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 @@ -1427,20 +1638,6 @@ class Model(object): """ 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. @@ -1457,38 +1654,86 @@ class Model(object): `ConfigValue` instances, as returned by `get_config`. """ config_facade = client.ModelConfigFacade.from_connection( - self.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): + async def set_constraints(self, constraints): """Set machine constraints on this model. - :param :class:`juju.Constraints` constraints: Machine constraints - + :param dict config: Mapping of model constraints """ - raise NotImplementedError() + client_facade = client.ClientFacade.from_connection(self.connection()) + await client_facade.SetModelConstraints( + application='', + constraints=constraints) - def get_action_output(self, action_uuid, wait=-1): + async def get_action_output(self, action_uuid, wait=None): """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 - + :param int wait: Time in seconds to wait for action to complete. + :return dict: Output from action + :raises: :class:`JujuError` if invalid action_uuid """ - raise NotImplementedError() + action_facade = client.ActionFacade.from_connection( + self.connection() + ) + entity = [{'tag': tag.action(action_uuid)}] + # Cannot use self.wait_for_action as the action event has probably + # already happened and self.wait_for_action works by processing + # model deltas and checking if they match our type. If the action + # has already occured then the delta has gone. + + async def _wait_for_action_status(): + while True: + action_output = await action_facade.Actions(entity) + if action_output.results[0].status in ('completed', 'failed'): + return + else: + await asyncio.sleep(1) + await asyncio.wait_for( + _wait_for_action_status(), + timeout=wait) + action_output = await action_facade.Actions(entity) + # ActionResult.output is None if the action produced no output + if action_output.results[0].output is None: + output = {} + else: + output = action_output.results[0].output + return output - 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. + async def get_action_status(self, uuid_or_prefix=None, name=None): + """Get the status of all actions, filtered by ID, ID prefix, or name. :param str uuid_or_prefix: Filter by action uuid or prefix :param str name: Filter by action name """ - raise NotImplementedError() + results = {} + action_results = [] + action_facade = client.ActionFacade.from_connection( + self.connection() + ) + if name: + name_results = await action_facade.FindActionsByNames([name]) + action_results.extend(name_results.actions[0].actions) + if uuid_or_prefix: + # Collect list of actions matching uuid or prefix + matching_actions = await action_facade.FindActionTagsByPrefix( + [uuid_or_prefix]) + entities = [] + for actions in matching_actions.matches.values(): + entities = [{'tag': a.tag} for a in actions] + # Get action results matching action tags + uuid_results = await action_facade.Actions(entities) + action_results.extend(uuid_results.results) + for a in action_results: + results[tag.untag('action-', a.action.tag)] = a.status + return results def get_budget(self, budget_name): """Get budget usage info. @@ -1506,7 +1751,7 @@ class Model(object): :param bool utc: Display time as UTC in RFC3339 format """ - client_facade = client.ClientFacade.from_connection(self.connection) + client_facade = client.ClientFacade.from_connection(self.connection()) return await client_facade.FullStatus(filters) def sync_tools( @@ -1529,7 +1774,7 @@ class Model(object): def unblock(self, *commands): """Unblock an operation that would alter this model. - :param str \*commands: The commands to unblock. Valid values are + :param str *commands: The commands to unblock. Valid values are 'all-changes', 'destroy-model', 'remove-object' """ @@ -1538,7 +1783,7 @@ class Model(object): def unset_config(self, *keys): """Unset configuration on this model. - :param str \*keys: The keys to unset + :param str *keys: The keys to unset """ raise NotImplementedError() @@ -1578,7 +1823,7 @@ class Model(object): async def get_metrics(self, *tags): """Retrieve metrics. - :param str \*tags: Tags of entities from which to 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 @@ -1587,7 +1832,7 @@ class Model(object): ', '.join(tags) if tags else "all units") metrics_facade = client.MetricsDebugFacade.from_connection( - self.connection) + self.connection()) entities = [client.Entity(tag) for tag in tags] metrics_result = await metrics_facade.GetMetrics(entities) @@ -1623,7 +1868,7 @@ def get_charm_series(path): return series[0] if series else None -class BundleHandler(object): +class BundleHandler: """ Handle bundles by using the API to translate bundle YAML into a plan of steps and then dispatching each of those using the API. @@ -1637,12 +1882,14 @@ class BundleHandler(object): for unit_name, unit in model.units.items(): app_units = self._units_by_app.setdefault(unit.application, []) app_units.append(unit_name) + self.bundle_facade = client.BundleFacade.from_connection( + model.connection()) self.client_facade = client.ClientFacade.from_connection( - model.connection) + model.connection()) self.app_facade = client.ApplicationFacade.from_connection( - model.connection) + model.connection()) self.ann_facade = client.AnnotationsFacade.from_connection( - model.connection) + model.connection()) async def _handle_local_charms(self, bundle): """Search for references to local charms (i.e. filesystem paths) @@ -1658,8 +1905,9 @@ class BundleHandler(object): apps, args = [], [] default_series = bundle.get('series') + apps_dict = bundle.get('applications', bundle.get('services', {})) for app_name in self.applications: - app_dict = bundle['services'][app_name] + app_dict = apps_dict[app_name] charm_dir = os.path.abspath(os.path.expanduser(app_dict['charm'])) if not os.path.isdir(charm_dir): continue @@ -1688,13 +1936,16 @@ class BundleHandler(object): ], 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 + apps_dict[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: + is_store_url = entity_id.startswith('cs:') + + if not is_store_url and os.path.isfile(entity_id): + bundle_yaml = Path(entity_id).read_text() + elif not is_store_url and os.path.isdir(entity_id): bundle_yaml = (Path(entity_id) / "bundle.yaml").read_text() else: bundle_yaml = await self.charmstore.files(entity_id, @@ -1703,9 +1954,12 @@ class BundleHandler(object): self.bundle = yaml.safe_load(bundle_yaml) self.bundle = await self._handle_local_charms(self.bundle) - self.plan = await self.client_facade.GetBundleChanges( + self.plan = await self.bundle_facade.GetChanges( yaml.dump(self.bundle)) + if self.plan.errors: + raise JujuError(self.plan.errors) + async def execute_plan(self): for step in self.plan.changes: method = getattr(self, step.method) @@ -1714,7 +1968,9 @@ class BundleHandler(object): @property def applications(self): - return list(self.bundle['services'].keys()) + apps_dict = self.bundle.get('applications', + self.bundle.get('services', {})) + return list(apps_dict.keys()) def resolve(self, reference): if reference and reference.startswith('$'): @@ -1769,7 +2025,11 @@ class BundleHandler(object): # Fix up values, as necessary. if 'parent_id' in params: - params['parent_id'] = self.resolve(params['parent_id']) + if params['parent_id'].startswith('$addUnit'): + unit = self.resolve(params['parent_id'])[0] + params['parent_id'] = unit.machine.entity_id + else: + params['parent_id'] = self.resolve(params['parent_id']) params['constraints'] = parse_constraints( params.get('constraints')) @@ -1810,7 +2070,7 @@ class BundleHandler(object): return await self.model.add_relation(*endpoints) async def deploy(self, charm, series, application, options, constraints, - storage, endpoint_bindings, resources): + storage, endpoint_bindings, *args): """ :param charm string: Charm holds the URL of the charm to be used to deploy this @@ -1835,17 +2095,35 @@ class BundleHandler(object): :param endpoint_bindings map[string]string: EndpointBindings holds the optional endpoint bindings + :param devices map[string]string: + Devices holds the optional devices constraints. + (Only given on Juju 2.5+) + :param resources map[string]int: Resources identifies the revision to use for each resource of the application's charm. + + :param num_units int: + NumUnits holds the number of units required. For IAAS models, this + will be 0 and separate AddUnitChanges will be used. For Kubernetes + models, this will be used to scale the application. + (Only given on Juju 2.5+) """ # 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 len(args) == 1: + # Juju 2.4 and below only sends the resources + resources = args[0] + devices, num_units = None, None + else: + # Juju 2.5+ sends devices before resources, as well as num_units + # There might be placement but we need to ignore that. + devices, resources, num_units = args[:3] + if not charm.startswith('local:'): - resources = await self.model._add_store_resources(application, - charm) + resources = await self.model._add_store_resources( + application, charm, overrides=resources) await self.model._deploy( charm_url=charm, application=application, @@ -1855,6 +2133,8 @@ class BundleHandler(object): endpoint_bindings=endpoint_bindings, resources=resources, storage=storage, + devices=devices, + num_units=num_units, ) return application @@ -1886,6 +2166,20 @@ class BundleHandler(object): to=placement, ) + async def scale(self, application, scale): + """ + Handle a change of scale to a k8s application. + + :param string application: + Application holds the application placeholder name for which a unit + is added. + + :param int scale: + New scale value to use. + """ + application = self.resolve(application) + return await self.model.applications[application].scale(scale=scale) + async def expose(self, application): """ :param application string: @@ -1917,13 +2211,13 @@ class BundleHandler(object): return await entity.set_annotations(annotations) -class CharmStore(object): +class CharmStore: """ Async wrapper around theblues.charmstore.CharmStore """ - def __init__(self, loop): + def __init__(self, loop, cs_timeout=20): self.loop = loop - self._cs = theblues.charmstore.CharmStore(timeout=5) + self._cs = theblues.charmstore.CharmStore(timeout=cs_timeout) def __getattr__(self, name): """ @@ -1949,7 +2243,7 @@ class CharmStore(object): return wrapper -class CharmArchiveGenerator(object): +class CharmArchiveGenerator: """ Create a Zip archive of a local charm directory for upload to a controller. @@ -1966,9 +2260,9 @@ class CharmArchiveGenerator(object): Ignored:: - * build/\* - This is used for packing the charm itself and any + * build/* - This is used for packing the charm itself and any similar tasks. - * \*/.\* - Hidden files are all ignored for now. This will most + * */.* - Hidden files are all ignored for now. This will most likely be changed into a specific ignore list (.bzr, etc) diff --git a/juju/provisioner.py b/juju/provisioner.py new file mode 100644 index 0000000..da8be16 --- /dev/null +++ b/juju/provisioner.py @@ -0,0 +1,366 @@ +from .client import client + +import paramiko +import os +import re +import tempfile +import shlex +from subprocess import ( + CalledProcessError, +) +import uuid + + +arches = [ + [re.compile(r"amd64|x86_64"), "amd64"], + [re.compile(r"i?[3-9]86"), "i386"], + [re.compile(r"(arm$)|(armv.*)"), "armhf"], + [re.compile(r"aarch64"), "arm64"], + [re.compile(r"ppc64|ppc64el|ppc64le"), "ppc64el"], + [re.compile(r"s390x?"), "s390x"], + +] + + +def normalize_arch(rawArch): + """Normalize the architecture string.""" + for arch in arches: + if arch[0].match(rawArch): + return arch[1] + + +DETECTION_SCRIPT = """#!/bin/bash +set -e +os_id=$(grep '^ID=' /etc/os-release | tr -d '"' | cut -d= -f2) +if [ "$os_id" = 'centos' ]; then + os_version=$(grep '^VERSION_ID=' /etc/os-release | tr -d '"' | cut -d= -f2) + echo "centos$os_version" +else + lsb_release -cs +fi +uname -m +grep MemTotal /proc/meminfo +cat /proc/cpuinfo +""" + +INITIALIZE_UBUNTU_SCRIPT = """set -e +(id ubuntu &> /dev/null) || useradd -m ubuntu -s /bin/bash +umask 0077 +temp=$(mktemp) +echo 'ubuntu ALL=(ALL) NOPASSWD:ALL' > $temp +install -m 0440 $temp /etc/sudoers.d/90-juju-ubuntu +rm $temp +su ubuntu -c 'install -D -m 0600 /dev/null ~/.ssh/authorized_keys' +export authorized_keys="{}" +if [ ! -z "$authorized_keys" ]; then + su ubuntu -c 'echo $authorized_keys >> ~/.ssh/authorized_keys' +fi +""" + + +class SSHProvisioner: + """Provision a manually created machine via SSH.""" + user = "" + host = "" + private_key_path = "" + + def __init__(self, user, host, private_key_path): + self.host = host + self.user = user + self.private_key_path = private_key_path + + def _get_ssh_client(self, host, user, key): + """Return a connected Paramiko ssh object. + + :param str host: The host to connect to. + :param str user: The user to connect as. + :param str key: The private key to authenticate with. + + :return: object: A paramiko.SSHClient + :raises: :class:`paramiko.ssh_exception.SSHException` if the + connection failed + """ + + ssh = paramiko.SSHClient() + ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) + + pkey = None + + # Read the private key into a paramiko.RSAKey + if os.path.exists(key): + with open(key, 'r') as f: + pkey = paramiko.RSAKey.from_private_key(f) + + ####################################################################### + # There is a bug in some versions of OpenSSH 4.3 (CentOS/RHEL5) where # + # the server may not send the SSH_MSG_USERAUTH_BANNER message except # + # when responding to an auth_none request. For example, paramiko will # + # attempt to use password authentication when a password is set, but # + # the server could deny that, instead requesting keyboard-interactive.# + # The hack to workaround this is to attempt a reconnect, which will # + # receive the right banner, and authentication can proceed. See the # + # following for more info: # + # https://github.com/paramiko/paramiko/issues/432 # + # https://github.com/paramiko/paramiko/pull/438 # + ####################################################################### + + try: + ssh.connect(host, port=22, username=user, pkey=pkey) + except paramiko.ssh_exception.SSHException as e: + if 'Error reading SSH protocol banner' == str(e): + # Once more, with feeling + ssh.connect(host, port=22, username=user, pkey=pkey) + else: + # Reraise the original exception + raise e + + return ssh + + def _run_command(self, ssh, cmd, pty=True): + """Run a command remotely via SSH. + + :param object ssh: The SSHClient + :param str cmd: The command to execute + :param list cmd: The `shlex.split` command to execute + :param bool pty: Whether to allocate a pty + + :return: tuple: The stdout and stderr of the command execution + :raises: :class:`CalledProcessError` if the command fails + """ + + if isinstance(cmd, str): + cmd = shlex.split(cmd) + + if type(cmd) is not list: + cmd = [cmd] + + cmds = ' '.join(cmd) + stdin, stdout, stderr = ssh.exec_command(cmds, get_pty=pty) + retcode = stdout.channel.recv_exit_status() + + if retcode > 0: + output = stderr.read().strip() + raise CalledProcessError(returncode=retcode, cmd=cmd, + output=output) + return ( + stdout.read().decode('utf-8').strip(), + stderr.read().decode('utf-8').strip() + ) + + def _init_ubuntu_user(self): + """Initialize the ubuntu user. + + :return: bool: If the initialization was successful + :raises: :class:`paramiko.ssh_exception.AuthenticationException` + if the authentication fails + """ + + # TODO: Test this on an image without the ubuntu user setup. + + auth_user = self.user + ssh = None + try: + # Run w/o allocating a pty, so we fail if sudo prompts for a passwd + ssh = self._get_ssh_client( + self.host, + "ubuntu", + self.private_key_path, + ) + + stdout, stderr = self._run_command(ssh, "sudo -n true", pty=False) + except paramiko.ssh_exception.AuthenticationException as e: + raise e + else: + auth_user = "ubuntu" + finally: + if ssh: + ssh.close() + + # if the above fails, run the init script as the authenticated user + + # Infer the public key + public_key = None + public_key_path = "{}.pub".format(self.private_key_path) + + if not os.path.exists(public_key_path): + raise FileNotFoundError( + "Public key '{}' doesn't exist.".format(public_key_path) + ) + + with open(public_key_path, "r") as f: + public_key = f.readline() + + script = INITIALIZE_UBUNTU_SCRIPT.format(public_key) + + try: + ssh = self._get_ssh_client( + self.host, + auth_user, + self.private_key_path, + ) + + self._run_command( + ssh, + ["sudo", "/bin/bash -c " + shlex.quote(script)], + pty=True + ) + except paramiko.ssh_exception.AuthenticationException as e: + raise e + finally: + ssh.close() + + return True + + def _detect_hardware_and_os(self, ssh): + """Detect the target hardware capabilities and OS series. + + :param object ssh: The SSHClient + :return: str: A raw string containing OS and hardware information. + """ + + info = { + 'series': '', + 'arch': '', + 'cpu-cores': '', + 'mem': '', + } + + stdout, stderr = self._run_command( + ssh, + ["sudo", "/bin/bash -c " + shlex.quote(DETECTION_SCRIPT)], + pty=True, + ) + + lines = stdout.split("\n") + info['series'] = lines[0].strip() + info['arch'] = normalize_arch(lines[1].strip()) + + memKb = re.split(r'\s+', lines[2])[1] + + # Convert megabytes -> kilobytes + info['mem'] = round(int(memKb) / 1024) + + # Detect available CPUs + recorded = {} + for line in lines[3:]: + physical_id = "" + print(line) + + if line.find("physical id") == 0: + physical_id = line.split(":")[1].strip() + elif line.find("cpu cores") == 0: + cores = line.split(":")[1].strip() + + if physical_id not in recorded.keys(): + info['cpu-cores'] += cores + recorded[physical_id] = True + + return info + + def provision_machine(self): + """Perform the initial provisioning of the target machine. + + :return: bool: The client.AddMachineParams + :raises: :class:`paramiko.ssh_exception.AuthenticationException` + if the upload fails + """ + params = client.AddMachineParams() + + if self._init_ubuntu_user(): + try: + + ssh = self._get_ssh_client( + self.host, + self.user, + self.private_key_path + ) + + hw = self._detect_hardware_and_os(ssh) + params.series = hw['series'] + params.instance_id = "manual:{}".format(self.host) + params.nonce = "manual:{}:{}".format( + self.host, + str(uuid.uuid4()), # a nop for Juju w/manual machines + ) + params.hardware_characteristics = { + 'arch': hw['arch'], + 'mem': int(hw['mem']), + 'cpu-cores': int(hw['cpu-cores']), + } + params.addresses = [{ + 'value': self.host, + 'type': 'ipv4', + 'scope': 'public', + }] + + except paramiko.ssh_exception.AuthenticationException as e: + raise e + finally: + ssh.close() + + return params + + async def install_agent(self, connection, nonce, machine_id): + """ + :param object connection: Connection to Juju API + :param str nonce: The nonce machine specification + :param str machine_id: The id assigned to the machine + + :return: bool: If the initialization was successful + """ + + # The path where the Juju agent should be installed. + data_dir = "/var/lib/juju" + + # Disabling this prevents `apt-get update` from running initially, so + # charms will fail to deploy + disable_package_commands = False + + client_facade = client.ClientFacade.from_connection(connection) + results = await client_facade.ProvisioningScript( + data_dir, + disable_package_commands, + machine_id, + nonce, + ) + + self._run_configure_script(results.script) + + def _run_configure_script(self, script): + """Run the script to install the Juju agent on the target machine. + + :param str script: The script returned by the ProvisioningScript API + :raises: :class:`paramiko.ssh_exception.AuthenticationException` + if the upload fails + """ + + _, tmpFile = tempfile.mkstemp() + with open(tmpFile, 'w') as f: + f.write(script) + + try: + # get ssh client + ssh = self._get_ssh_client( + self.host, + "ubuntu", + self.private_key_path, + ) + + # copy the local copy of the script to the remote machine + sftp = paramiko.SFTPClient.from_transport(ssh.get_transport()) + sftp.put( + tmpFile, + tmpFile, + ) + + # run the provisioning script + stdout, stderr = self._run_command( + ssh, + "sudo /bin/bash {}".format(tmpFile), + ) + + except paramiko.ssh_exception.AuthenticationException as e: + raise e + finally: + os.remove(tmpFile) + ssh.close() diff --git a/juju/relation.py b/juju/relation.py index ef8946a..d2f2053 100644 --- a/juju/relation.py +++ b/juju/relation.py @@ -5,7 +5,119 @@ from . import model log = logging.getLogger(__name__) +class Endpoint: + def __init__(self, model, data): + self.model = model + self.data = data + + def __repr__(self): + return ''.format(self.application.name, self.name) + + @property + def application(self): + return self.model.applications[self.data['application-name']] + + @property + def name(self): + return self.data['relation']['name'] + + @property + def interface(self): + return self.data['relation']['interface'] + + @property + def role(self): + return self.data['relation']['role'] + + @property + def scope(self): + return self.data['relation']['scope'] + + class Relation(model.ModelEntity): + def __repr__(self): + return ''.format(self.entity_id, self.key) + + @property + def endpoints(self): + return [Endpoint(self.model, data) + for data in self.safe_data['endpoints']] + + @property + def provides(self): + """ + The endpoint on the provides side of this relation, or None. + """ + for endpoint in self.endpoints: + if endpoint.role == 'provider': + return endpoint + return None + + @property + def requires(self): + """ + The endpoint on the requires side of this relation, or None. + """ + for endpoint in self.endpoints: + if endpoint.role == 'requirer': + return endpoint + return None + + @property + def peers(self): + """ + The peers endpoint of this relation, or None. + """ + for endpoint in self.endpoints: + if endpoint.role == 'peer': + return endpoint + return None + + @property + def is_subordinate(self): + return any(ep.scope == 'container' for ep in self.endpoints) + + @property + def is_peer(self): + return any(ep.role == 'peer' for ep in self.endpoints) + + def matches(self, *specs): + """ + Check if this relation matches relationship specs. + + Relation specs are strings that would be given to Juju to establish a + relation, and should be in the form ``[:]`` + where the ``:`` suffix is optional. If the suffix is + omitted, this relation will match on any endpoint as long as the given + application is involved. + + In other words, this relation will match a spec if that spec could have + created this relation. + + :return: True if all specs match. + """ + for spec in specs: + if ':' in spec: + app_name, endpoint_name = spec.split(':') + else: + app_name, endpoint_name = spec, None + for endpoint in self.endpoints: + if app_name == endpoint.application.name and \ + endpoint_name in (endpoint.name, None): + # found a match for this spec, so move to next one + break + else: + # no match for this spec + return False + return True + + @property + def applications(self): + """ + All applications involved in this relation. + """ + return [ep.application for ep in self.endpoints] + async def destroy(self): raise NotImplementedError() # TODO: destroy a relation diff --git a/juju/tag.py b/juju/tag.py index 2514229..282e0a6 100644 --- a/juju/tag.py +++ b/juju/tag.py @@ -1,3 +1,8 @@ +# TODO: Tags should be a proper class, so that we can distinguish whether +# something is already a tag or not. For example, 'user-foo' is a valid +# username, but is ambiguous with the already-tagged username 'foo'. + + def _prefix(prefix, s): if s and not s.startswith(prefix): return '{}{}'.format(prefix, s) @@ -29,3 +34,7 @@ def user(username): def application(app_name): return _prefix('application-', app_name) + + +def action(action_uuid): + return _prefix('action-', action_uuid) diff --git a/juju/unit.py b/juju/unit.py index fc597bf..e8ecd96 100644 --- a/juju/unit.py +++ b/juju/unit.py @@ -1,6 +1,6 @@ import logging -from dateutil.parser import parse as parse_date +import pyrfc3339 from . import model from .client import client @@ -21,7 +21,7 @@ class Unit(model.ModelEntity): """Get the time when the `agent_status` was last updated. """ - return parse_date(self.safe_data['agent-status']['since']) + return pyrfc3339.parse(self.safe_data['agent-status']['since']) @property def agent_status_message(self): @@ -42,7 +42,7 @@ class Unit(model.ModelEntity): """Get the time when the `workload_status` was last updated. """ - return parse_date(self.safe_data['workload-status']['since']) + return pyrfc3339.parse(self.safe_data['workload-status']['since']) @property def workload_status_message(self): @@ -122,7 +122,8 @@ class Unit(model.ModelEntity): """Run command on this unit. :param str command: The command to run - :param int timeout: Time to wait before command is considered failed + :param int timeout: Time, in seconds, to wait before command is + considered failed :returns: A :class:`juju.action.Action` instance. """ @@ -131,6 +132,10 @@ class Unit(model.ModelEntity): log.debug( 'Running `%s` on %s', command, self.name) + if timeout: + # Convert seconds to nanoseconds + timeout = int(timeout * 1000000000) + res = await action.Run( [], command, @@ -144,7 +149,7 @@ class Unit(model.ModelEntity): """Run an action on this unit. :param str action_name: Name of action to run - :param \*\*params: Action parameters + :param **params: Action parameters :returns: A :class:`juju.action.Action` instance. Note that this only enqueues the action. You will need to call @@ -182,7 +187,8 @@ class Unit(model.ModelEntity): :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 + :param scp_opts: Additional options to the `scp` command + :type scp_opts: str or list """ await self.machine.scp_to(source, destination, user=user, proxy=proxy, scp_opts=scp_opts) @@ -195,7 +201,8 @@ class Unit(model.ModelEntity): :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 + :param scp_opts: Additional options to the `scp` command + :type scp_opts: str or list """ await self.machine.scp_from(source, destination, user=user, proxy=proxy, scp_opts=scp_opts) diff --git a/juju/user.py b/juju/user.py new file mode 100644 index 0000000..389d210 --- /dev/null +++ b/juju/user.py @@ -0,0 +1,86 @@ +import logging + +import pyrfc3339 + +from . import tag + +log = logging.getLogger(__name__) + + +class User(object): + def __init__(self, controller, user_info, secret_key=None): + self.controller = controller + self._user_info = user_info + self._secret_key = secret_key + + @property + def tag(self): + return tag.user(self.username) + + @property + def username(self): + return self._user_info.username + + @property + def display_name(self): + return self._user_info.display_name + + @property + def last_connection(self): + return pyrfc3339.parse(self._user_info.last_connection) + + @property + def access(self): + return self._user_info.access + + @property + def date_created(self): + return self._user_info.date_created + + @property + def enabled(self): + return not self._user_info.disabled + + @property + def disabled(self): + return self._user_info.disabled + + @property + def created_by(self): + return self._user_info.created_by + + @property + def secret_key(self): + return self._secret_key + + async def set_password(self, password): + """Update this user's password. + """ + await self.controller.change_user_password(self.username, password) + self._user_info.password = password + + async def grant(self, acl='login'): + """Set access level of this user on the controller. + + :param str acl: Access control ('login', 'add-model', or 'superuser') + """ + if await self.controller.grant(self.username, acl): + self._user_info.access = acl + + async def revoke(self): + """Removes all access rights for this user from the controller. + """ + await self.controller.revoke(self.username) + self._user_info.access = '' + + async def disable(self): + """Disable this user. + """ + await self.controller.disable_user(self.username) + self._user_info.disabled = True + + async def enable(self): + """Re-enable this user. + """ + await self.controller.enable_user(self.username) + self._user_info.disabled = False diff --git a/juju/utils.py b/juju/utils.py index 1d1b24e..1038ed1 100644 --- a/juju/utils.py +++ b/juju/utils.py @@ -3,6 +3,9 @@ import os from collections import defaultdict from functools import partial from pathlib import Path +import base64 +from pyasn1.type import univ, char +from pyasn1.codec.der.encoder import encode async def execute_process(*cmd, log=None, loop=None): @@ -11,11 +14,11 @@ async def execute_process(*cmd, log=None, loop=None): ''' p = await asyncio.create_subprocess_exec( - *cmd, - stdin=asyncio.subprocess.PIPE, - stdout=asyncio.subprocess.PIPE, - stderr=asyncio.subprocess.PIPE, - loop=loop) + *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) @@ -46,6 +49,7 @@ async def read_ssh_key(loop): can be passed on to a model. ''' + loop = loop or asyncio.get_event_loop() return await loop.run_in_executor(None, _read_ssh_key) @@ -71,28 +75,91 @@ class IdQueue: await queue.put(value) -async def run_with_interrupt(task, event, loop=None): +async def block_until(*conditions, timeout=None, wait_period=0.5, loop=None): + """Return only after all conditions are true. + + """ + async def _block(): + while not all(c() for c in conditions): + await asyncio.sleep(wait_period, loop=loop) + await asyncio.wait_for(_block(), timeout, loop=loop) + + +async def run_with_interrupt(task, *events, loop=None): """ - Awaits a task while allowing it to be interrupted by an `asyncio.Event`. + Awaits a task while allowing it to be interrupted by one or more + `asyncio.Event`s. - 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. + If the task finishes without the events becoming set, the results of the + task will be returned. If the event become 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 events: One or more `asyncio.Event`s 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], + task = asyncio.ensure_future(task, loop=loop) + event_tasks = [loop.create_task(event.wait()) for event in events] + done, pending = await asyncio.wait([task] + event_tasks, 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] + f.cancel() # cancel unfinished tasks + for f in done: + f.exception() # prevent "exception was not retrieved" errors + if task in done: + return task.result() # may raise exception else: return None + + +class Addrs(univ.SequenceOf): + componentType = char.PrintableString() + + +class RegistrationInfo(univ.Sequence): + """ + ASN.1 representation of: + + type RegistrationInfo struct { + User string + + Addrs []string + + SecretKey []byte + + ControllerName string + } + """ + pass + + +def generate_user_controller_access_token(username, controller_endpoints, secret_key, controller_name): + """" Implement in python what is currently done in GO + https://github.com/juju/juju/blob/a5ab92ec9b7f5da3678d9ac603fe52d45af24412/cmd/juju/user/utils.go#L16 + + :param username: name of the user to register + :param controller_endpoints: juju controller endpoints list in the format : + :param secret_key: base64 encoded string of the secret-key generated by juju + :param controller_name: name of the controller to register to. + """ + + # Secret key is returned as base64 encoded string in: + # https://websockets.readthedocs.io/en/stable/_modules/websockets/protocol.html#WebSocketCommonProtocol.recv + # Deconding it before marshalling into the ASN.1 message + secret_key = base64.b64decode(secret_key) + addr = Addrs() + for endpoint in controller_endpoints: + addr.append(endpoint) + + registration_string = RegistrationInfo() + registration_string.setComponentByPosition(0, char.PrintableString(username)) + registration_string.setComponentByPosition(1, addr) + registration_string.setComponentByPosition(2, univ.OctetString(secret_key)) + registration_string.setComponentByPosition(3, char.PrintableString(controller_name)) + registration_string = encode(registration_string) + remainder = len(registration_string) % 3 + registration_string += b"\0" * (3 - remainder) + return base64.urlsafe_b64encode(registration_string) diff --git a/setup.py b/setup.py index df12cfe..01036da 100644 --- a/setup.py +++ b/setup.py @@ -30,10 +30,13 @@ setup( packages=find_packages( exclude=["*.tests", "*.tests.*", "tests.*", "tests"]), install_requires=[ - 'websockets', - 'pyyaml', - 'theblues', - 'python-dateutil' + 'macaroonbakery>=1.1,<2.0', + 'pyRFC3339>=1.0,<2.0', + 'pyyaml>=3.0,<=4.2', + 'theblues>=0.3.8,<1.0', + 'websockets>=7.0,<8.0', + 'paramiko>=2.4.0,<3.0.0', + 'pyasn1>=0.4.4', ], include_package_data=True, maintainer='Juju Ecosystem Engineering', @@ -48,6 +51,8 @@ setup( "Programming Language :: Python", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.5", + "Programming Language :: Python :: 3.6", + "Programming Language :: Python :: 3.7", ], entry_points={ 'console_scripts': [ diff --git a/tests/base.py b/tests/base.py index e1ec452..600372c 100644 --- a/tests/base.py +++ b/tests/base.py @@ -1,67 +1,148 @@ -import mock +import inspect import subprocess import uuid +from contextlib import contextmanager +from pathlib import Path -import pytest - +import mock +from juju.client.jujudata import FileJujuData from juju.controller import Controller -from juju.client.connection import JujuData + +import pytest def is_bootstrapped(): - result = subprocess.run(['juju', 'switch'], stdout=subprocess.PIPE) - return ( - result.returncode == 0 and - len(result.stdout.decode().strip()) > 0) + try: + result = subprocess.run(['juju', 'switch'], stdout=subprocess.PIPE) + return ( + result.returncode == 0 and + len(result.stdout.decode().strip()) > 0) + except FileNotFoundError: + return False + bootstrapped = pytest.mark.skipif( not is_bootstrapped(), reason='bootstrapped Juju environment required') +test_run_nonce = uuid.uuid4().hex[-4:] + class CleanController(): + """ + Context manager that automatically connects and disconnects from + the currently active controller. + + Note: Unlike CleanModel, this will not create a new controller for you, + and an active controller must already be available. + """ def __init__(self): - self.controller = None + self._controller = None async def __aenter__(self): - self.controller = Controller() - await self.controller.connect_current() - return self.controller + self._controller = Controller() + await self._controller.connect() + return self._controller async def __aexit__(self, exc_type, exc, tb): - await self.controller.disconnect() + await self._controller.disconnect() class CleanModel(): - def __init__(self): - self.controller = None - self.model = None + """ + Context manager that automatically connects to the currently active + controller, adds a fresh model, returns the connection to that model, + and automatically disconnects and cleans up the model. + + The new model is also set as the current default for the controller + connection. + """ + def __init__(self, bakery_client=None): + self._controller = None + self._model = None + self._model_uuid = None + self._bakery_client = bakery_client 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) + model_nonce = uuid.uuid4().hex[-4:] + frame = inspect.stack()[1] + test_name = frame.function.replace('_', '-') + jujudata = TestJujuData() + self._controller = Controller( + jujudata=jujudata, + bakery_client=self._bakery_client, + ) + controller_name = jujudata.current_controller() + user_name = jujudata.accounts()[controller_name]['user'] + await self._controller.connect(controller_name) + + model_name = 'test-{}-{}-{}'.format( + test_run_nonce, + test_name, + model_nonce, + ) + self._model = await self._controller.add_model(model_name) + + # Change the JujuData instance so that it will return the new + # model as the current model name, so that we'll connect + # to it by default. + jujudata.set_model( + controller_name, + user_name + "/" + model_name, + self._model.info.uuid, + ) # save the model UUID in case test closes model - self.model_uuid = self.model.info.uuid + 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 + 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() + await self._model.disconnect() + await self._controller.destroy_model(self._model_uuid) + await self._controller.disconnect() + + +class TestJujuData(FileJujuData): + def __init__(self): + self.__controller_name = None + self.__model_name = None + self.__model_uuid = None + super().__init__() + + def set_model(self, controller_name, model_name, model_uuid): + self.__controller_name = controller_name + self.__model_name = model_name + self.__model_uuid = model_uuid + + def current_model(self, *args, **kwargs): + return self.__model_name or super().current_model(*args, **kwargs) + + def models(self): + all_models = super().models() + if self.__model_name is None: + return all_models + all_models.setdefault(self.__controller_name, {}) + all_models[self.__controller_name].setdefault('models', {}) + cmodels = all_models[self.__controller_name]['models'] + cmodels[self.__model_name] = {'uuid': self.__model_uuid} + return all_models class AsyncMock(mock.MagicMock): async def __call__(self, *args, **kwargs): return super().__call__(*args, **kwargs) + + +@contextmanager +def patch_file(filename): + """ + "Patch" a file so that its current contents are automatically restored + when the context is exited. + """ + filepath = Path(filename).expanduser() + data = filepath.read_bytes() + try: + yield + finally: + filepath.write_bytes(data) diff --git a/tests/bundle/invalid.yaml b/tests/bundle/invalid.yaml new file mode 100644 index 0000000..2e51c1e --- /dev/null +++ b/tests/bundle/invalid.yaml @@ -0,0 +1,7 @@ +applications: + myapp: + charm: cs:xenial/ubuntu-0 + num_units: 1 + to: + - 0 + - 0 diff --git a/tests/bundle/mini-bundle.yaml b/tests/bundle/mini-bundle.yaml new file mode 100644 index 0000000..84d9a61 --- /dev/null +++ b/tests/bundle/mini-bundle.yaml @@ -0,0 +1,9 @@ +series: xenial +applications: + dummy-sink: + charm: cs:~juju-qa/dummy-sink + num_units: 1 + dummy-subordinate: + charm: cs:~juju-qa/dummy-subordinate +relations: + - ['dummy-sink', 'dummy-subordinate'] diff --git a/tests/integration/bundle/bundle-resource-rev.yaml b/tests/integration/bundle/bundle-resource-rev.yaml new file mode 100644 index 0000000..c8feb83 --- /dev/null +++ b/tests/integration/bundle/bundle-resource-rev.yaml @@ -0,0 +1,7 @@ +series: xenial +services: + ghost: + charm: "cs:ghost-19" + num_units: 1 + resources: + ghost-stable: 11 diff --git a/tests/integration/cert.pem b/tests/integration/cert.pem new file mode 100644 index 0000000..684029e --- /dev/null +++ b/tests/integration/cert.pem @@ -0,0 +1,33 @@ +-----BEGIN CERTIFICATE----- +MIIFxDCCA6ygAwIBAgIJAPBHQW1VVLhYMA0GCSqGSIb3DQEBCwUAMHcxCzAJBgNV +BAYTAlVTMRcwFQYDVQQIDA5Ob3J0aCBDYXJvbGluYTEQMA4GA1UEBwwHUmFsZWln +aDESMBAGA1UECgwJQ2Fub25pY2FsMSkwJwYDVQQDDCBweXRob24tbGlianVqdS5p +bnRlZ3JhdGlvbi50ZXN0czAeFw0xODEyMTEyMDQyMThaFw0xOTEyMTEyMDQyMTha +MHcxCzAJBgNVBAYTAlVTMRcwFQYDVQQIDA5Ob3J0aCBDYXJvbGluYTEQMA4GA1UE +BwwHUmFsZWlnaDESMBAGA1UECgwJQ2Fub25pY2FsMSkwJwYDVQQDDCBweXRob24t +bGlianVqdS5pbnRlZ3JhdGlvbi50ZXN0czCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBANkkfNI4Q3eIIrXZF3xxnD9Bbp06jPeoEokUSrC98L5XwCtxs9Ma +fWPqiSukPq3A0pPcRobFOu5o+pu6+1pFjcmtKICsp+CwHV52+IfozvNlhRMUFPb2 +IxU86tgpMcBAM5wLz85DoNSu4EjOku0rB8Z0GMfvvuc7aYtDQoKJSScHGWWFTaJT +mtXmmKKSPtyPZ5PCQOv2Qmg5ujs4RS3R8dq4WRAd5F8YzRBgmtPYRrjwgEjD7GTq +Xlt+COqn5+RgWFIH0pQ1xHkslBzBByzsyjLJPdV/ugNIZk6GNOzLAw3ynl/9xGGh +RAOrBsKVQPs3liZoGXVqKxHyNgWh8V58TgiFDuRZiZwQDV6cRkxOkGQIXohkS7uC +5OXrAsyyVPrRoWfQMggxM1jH3H+93PoRqEsLypLxw53h9Seep4tOggw/hgOolLFg +diAT/IU3yhESXnXpAA8G2rDKO32hw+vWuaGCbH6bShb+9ZfkAmLUiSVm9ClbkZRQ +IaXmtBwsLS2IBxW51jrjSuXvqlBZc01pIUC2CT7aTrbftpA+w6i1bZpqjCukUSAx +t4dRjzL/h/drp5xxlqXOZL9yjYl8vFul4LFKkpkJGIKESEksxULZR/3b+WA7oyiA +Ph9UgnKU730dKVSfWbi/0tsCA/4HKIJ9qucCrfxyL8hizJ+1w9NZJ3ZbAgMBAAGj +UzBRMB0GA1UdDgQWBBSv/7Fraw7XviWwlnPGc+CTJA0rKjAfBgNVHSMEGDAWgBSv +/7Fraw7XviWwlnPGc+CTJA0rKjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB +CwUAA4ICAQCluQ7qFgNoGPkAkdoDXN26OhQcfrCmjvPufurs8Fc4Yxumupz01Df+ +zu3J2pG+tfThi37sRZsxN/jhtZOVgaXPSgpgB8Tz16YCK3KTEHXil/i6wp4JGmnQ +VsOo8cGLEvcmFg98/l2Tu31IXaSm7Fc/VxVB0fhzvIa0xG+osU3Dy4GWhDQrkkJ8 +MErTvEAb8QnY1y20ThPAZ5StBZ/ZLwPksuzkvJwGN8FI00k1RCznDNArzKouuZZt +JdfjnFtT+nrP0XSAlphfI0o7Gbm6jqVLPIekp8iPJuAmk55biZ9rAJBu8DsHtBpQ +cbpH+84y/xaC9svPgD9Un6dDDYXQ4QZL393oZW1RM4apR9gOz/8NxW2bJyPVxA3M +nmHphZjyGrOLN/QjrZV93Dv65SIivzT2zYEztvK4rjui31J3VDeNEe7uMFGq5Pmq +7HRrcPY2sMSOHkzOTFmd5qwaPD9EzkM5UT5YJDEE7YUjkR8LlxP5Xvo82HXxKl8D +8Tk09HuBMWg69QjuVThBNJSWpIxTbQEfm/2j+fm1L1kE9N7+97y69eDTNdOxJK5D +zaKoAjgoneZZzZN6fblfbQuAsDdJ2xLR0DTBlxA9Gv7OYbUpXm3eAyfYL4AmqvHI +HtfgPeSH2+wQVteiVa7q0BIto75XE3m8+xIOQsAUEb04fcacEpKZlw== +-----END CERTIFICATE----- diff --git a/tests/integration/key.pem b/tests/integration/key.pem new file mode 100644 index 0000000..664123e --- /dev/null +++ b/tests/integration/key.pem @@ -0,0 +1,52 @@ +-----BEGIN PRIVATE KEY----- +MIIJQgIBADANBgkqhkiG9w0BAQEFAASCCSwwggkoAgEAAoICAQDZJHzSOEN3iCK1 +2Rd8cZw/QW6dOoz3qBKJFEqwvfC+V8ArcbPTGn1j6okrpD6twNKT3EaGxTruaPqb +uvtaRY3JrSiArKfgsB1edviH6M7zZYUTFBT29iMVPOrYKTHAQDOcC8/OQ6DUruBI +zpLtKwfGdBjH777nO2mLQ0KCiUknBxllhU2iU5rV5piikj7cj2eTwkDr9kJoObo7 +OEUt0fHauFkQHeRfGM0QYJrT2Ea48IBIw+xk6l5bfgjqp+fkYFhSB9KUNcR5LJQc +wQcs7MoyyT3Vf7oDSGZOhjTsywMN8p5f/cRhoUQDqwbClUD7N5YmaBl1aisR8jYF +ofFefE4IhQ7kWYmcEA1enEZMTpBkCF6IZEu7guTl6wLMslT60aFn0DIIMTNYx9x/ +vdz6EahLC8qS8cOd4fUnnqeLToIMP4YDqJSxYHYgE/yFN8oREl516QAPBtqwyjt9 +ocPr1rmhgmx+m0oW/vWX5AJi1IklZvQpW5GUUCGl5rQcLC0tiAcVudY640rl76pQ +WXNNaSFAtgk+2k6237aQPsOotW2aaowrpFEgMbeHUY8y/4f3a6eccZalzmS/co2J +fLxbpeCxSpKZCRiChEhJLMVC2Uf92/lgO6MogD4fVIJylO99HSlUn1m4v9LbAgP+ +ByiCfarnAq38ci/IYsyftcPTWSd2WwIDAQABAoICAFbe9Rz5K2ynxxMvbej4XsUj +vUgjw3/U+s1ik9sPsj/ERXpb+9BJ+b4+d3BBPl4vFU/YQVLrlv8IerJQ5PwhdW8o +2lpYOLV4X9eKCzX8WscfZ1TRpO2EXVbCz0V5fZDnXn5gb1uazL4p1ErscfV2UJ8B +lWRvstU5fKkdWH92wxBdE7j80qlNf1Vx8sCfd4yvxoVjoquEEt81sR6+DVcedf7F +38PF4bZ16pxRub9k+C5G8VurHmjlJqi9zH1sfSZtsQfoX0OyGw9LWVoDk4ZSmTYm +Mpm2hsmHbn6dzJCrS2aKGPhYQve4F8jL5GF2as/WVji5Tu4dcmu0lg480p61ZlXf +Q58qw4uXMU2KfiuLKyTV8MlmktMhDiHAmzAbIXskdmV2BNlIwyudsVXT1QD0BKH5 +I+8edW1OPLK72/kt9VT1paRbTiCL0NWk99QCL1VxPB4FupQQm1Hk2KnMrUfjFUOm +9cuOP1S0HcHCMHN4+y0UCmn3phrWmfI/KlDZCxmSd8gvNwKkPSW5ONuYmZlpE5Wm +s7FwRoAGGvSsjXOC3N6m48b0dQNLnMvSXQIRiDbnTzChNJ3q7y9u0o/dqATCtelx +S7ouVKxHqSdy9G8WK0XQAFqny2dcoHZiiuxWboF9p1zEia43pdFVy/7g08KjSBQ1 +vzVGhUDYtquqq0MociWBAoIBAQD6C8ZDBU8VWwOIPL+zX8/4MNp0PfcJrOwk1vF0 +J0aPRRvqx0g6yhzjrCtWNrQnHV6Oc9FBg/NPAthAAQWYEwQr77RJWRtle/n7cH2A +qFkAL0nYokti7TdFMe82a8hlnuo9GQl340t95j03/HDAtrqQ0xFi32Rpp54MgHLU +FW2AYTv7CLV18p7yHIMdn0ESORPxlc/hYuuyL6ZPm/7DF/bbieY1+ZVAzn1ls17m +dQctagpInRC2EDL17lQK86Mh7PGdVTIaJMFvzdyuIn8qswe1n3FA0OCL7VBfMjE8 +caUZ3kfGfeNKtkUvGALoXploZhDTmfDs5XQFIoMvwi87lClBAoIBAQDeUCQMyPUC +TcfDKmeKAiGjm4Amtb+rvA3SbPSJvteOaohyqKFswUf9fNCrJim1QVpQ+PtArlAx +WK9X8g44+OOWx2moLxlptzjzsYEXJYzUtIjuFE10xiGJEvthmWAZ+EB7Gexu7696 +M4LcWkAivCAwcM5e2Gr3DtMMS4E9fxNZfEn7RNFtTs6Cit/R2VITlbYnECSU13FY +DI37g8umCR01pTZ/7VVUwVMeq/irFKwTfkHoF2Fyxbp8CT91ydRsYCBs395xcEH1 +2rblBXUlGj01eVZtTX2HVSS78o/ak+Q3WJQvh1Hds8yS7QdirkOpmGGzvwpIhjzB +ztHsgjbFt3ybAoIBAA1HAsgcSA7CPnXFhAhqVgi/z1nM0Ila/U8XesrIKx8AdHML +EfLNOKt+QO7bCMXq8VJvI/VupETVydXcOAfTOq16lQAwExxYcPXBC2kBh3hTCoDO +XWJrZjvuYt1o68M5pQaJhc8v6ppM14NZjEMvcMiv7IRriFFz7RiM2YwZdy8R+rVh +yQDyWS5SBURVaIcnML/rTJaTQiC8FwCzL9v8MceGkwrareo7DL2RwMBMBo2Ky/D/ +JhwE0C/u79eFCGyMwGeyVm689OiS7dzxR/9kckxaoxDmBoZnm5TyfVrQTgwJmZYY +qTEWbKYLiFv+afb5NHuH+RsbNAXxxzWKAigPvgECggEAYD8H7HUQBchQxMDWBJy5 +nZBT4e5rpdkLjt9W20/BGMosep9hC6l+FlN0L7Sc9/jsNgQlGrKcy1Be0U9dMvMl +7QA2UPbbJLaLNI3TmobKOshSQ+iMRBMHL8YFCRMS1QtyNxlZEAo6yUgFzopQG/mg +YfhkkBFX9c/4NOl3cX1TjjlN+jeoB4/HviKLldllPE9jhfPqMno3euwsiAheIWru +t2vodWf1unTcHHpNdRvFB8dwlx+QM9VA0DRcwgz4J1dSknA1aJ02IU9oQSyks8Rx +XXZDoZybzPxio+/2saW3dvKlbRJDsh0GY1G1EdbqOkFbgyshM5bSNQHqRl91gRHY +IwKCAQEApF790G7J1IgNrLBxLlzEkVcv2Az8QDHviC8MxdVerGj62E5fGUb44Z+p +SM2vjjtL7yeTPuH0K7bbVtDMZoj3l81BHY6OnmFTLPSlMnUYXs7aVjbIK3EMQtHa +EyNOiwNtIOAUMqQ3C/KXWxdO0J8/kY6b7cvZwj5zDLYt+4j8BN8w8EL0Kgxw9Bd/ +DL++Nz3IqoOoPF0aK7hVTklVzONIdaGL2OjlyESKZOWJR1pypLC9+nUAAFbtPN5Q +8xyG3Rqoo7j697M50LP4ZMCE8WK/uZth4LPU9KWJAJ3FHrKki0qB1zbYXS4OMFbj +hg+Fb1z8af0WL9PCAwsWQMTaSx88tQ== +-----END PRIVATE KEY----- diff --git a/tests/integration/test_application.py b/tests/integration/test_application.py index 1a4fcaa..b705832 100644 --- a/tests/integration/test_application.py +++ b/tests/integration/test_application.py @@ -1,3 +1,5 @@ +import asyncio + import pytest from .. import base @@ -10,9 +12,9 @@ MB = 1 async def test_action(event_loop): async with base.CleanModel() as model: ubuntu_app = await model.deploy( - 'mysql', + 'percona-cluster', application_name='mysql', - series='trusty', + series='xenial', channel='stable', config={ 'tuning-level': 'safest', @@ -27,11 +29,20 @@ async def test_action(event_loop): config = await ubuntu_app.get_config() assert config['tuning-level']['value'] == 'fast' + # Restore config back to default + await ubuntu_app.reset_config(['tuning-level']) + config = await ubuntu_app.get_config() + assert config['tuning-level']['value'] == 'safest' + # update and check app constraints await ubuntu_app.set_constraints({'mem': 512 * MB}) constraints = await ubuntu_app.get_constraints() assert constraints['mem'] == 512 * MB + # check action definitions + actions = await ubuntu_app.get_actions() + assert 'backup' in actions.keys() + @base.bootstrapped @pytest.mark.asyncio @@ -92,3 +103,32 @@ async def test_upgrade_charm_switch(event_loop): assert app.data['charm-url'] == 'cs:ubuntu-0' await app.upgrade_charm(switch='ubuntu-8') assert app.data['charm-url'] == 'cs:ubuntu-8' + + +@base.bootstrapped +@pytest.mark.asyncio +async def test_upgrade_charm_resource(event_loop): + async with base.CleanModel() as model: + app = await model.deploy('cs:~cynerva/upgrade-charm-resource-test-1') + + def units_ready(): + if not app.units: + return False + unit = app.units[0] + return unit.workload_status == 'active' and \ + unit.agent_status == 'idle' + + await asyncio.wait_for(model.block_until(units_ready), timeout=480) + unit = app.units[0] + expected_message = 'I have no resource.' + assert unit.workload_status_message == expected_message + + await app.upgrade_charm(revision=2) + await asyncio.wait_for( + model.block_until( + lambda: unit.workload_status_message != 'I have no resource.' + ), + timeout=60 + ) + expected_message = 'My resource: I am the resource.' + assert app.units[0].workload_status_message == expected_message diff --git a/tests/integration/test_client.py b/tests/integration/test_client.py index e4c9c92..240c471 100644 --- a/tests/integration/test_client.py +++ b/tests/integration/test_client.py @@ -1,7 +1,7 @@ -import pytest - from juju.client import client +import pytest + from .. import base @@ -9,7 +9,7 @@ from .. import base @pytest.mark.asyncio async def test_user_info(event_loop): async with base.CleanModel() as model: - controller_conn = await model.connection.controller() + controller_conn = await model.connection().controller() um = client.UserManagerFacade.from_connection(controller_conn) result = await um.UserInfo( diff --git a/tests/integration/test_connection.py b/tests/integration/test_connection.py index 290203d..6647a03 100644 --- a/tests/integration/test_connection.py +++ b/tests/integration/test_connection.py @@ -1,28 +1,30 @@ import asyncio -import pytest +import http +import logging +import socket +import ssl +from contextlib import closing +from pathlib import Path -from juju.client.connection import Connection from juju.client import client -from .. import base +from juju.client.connection import Connection +from juju.controller import Controller +from juju.utils import run_with_interrupt +import pytest +import websockets -@base.bootstrapped -@pytest.mark.asyncio -async def test_connect_current(event_loop): - async with base.CleanModel(): - conn = await Connection.connect_current() +from .. import base - assert isinstance(conn, Connection) - await conn.close() + +logger = logging.getLogger(__name__) @base.bootstrapped @pytest.mark.asyncio async def test_monitor(event_loop): - - async with base.CleanModel(): - conn = await Connection.connect_current() - + async with base.CleanModel() as model: + conn = model.connection() assert conn.monitor.status == 'connected' await conn.close() @@ -33,15 +35,17 @@ async def test_monitor(event_loop): @pytest.mark.asyncio async def test_monitor_catches_error(event_loop): - async with base.CleanModel(): - conn = await Connection.connect_current() + async with base.CleanModel() as model: + conn = model.connection() assert conn.monitor.status == 'connected' - await conn.ws.close() - - assert conn.monitor.status == 'error' - - await conn.close() + try: + async with conn.monitor.reconnecting: + await conn.ws.close() + await asyncio.sleep(1) + assert conn.monitor.status == 'error' + finally: + await conn.close() @base.bootstrapped @@ -55,7 +59,7 @@ async def test_full_status(event_loop): channel='stable', ) - c = client.ClientFacade.from_connection(model.connection) + c = client.ClientFacade.from_connection(model.connection()) await c.FullStatus(None) @@ -64,15 +68,8 @@ async def test_full_status(event_loop): @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) + kwargs = model.connection().connect_params() + conn = await Connection.connect(**kwargs) try: await asyncio.sleep(0.1) assert conn.is_open @@ -81,3 +78,159 @@ async def test_reconnect(event_loop): await model.block_until(lambda: conn.is_open, timeout=3) finally: await conn.close() + + +@base.bootstrapped +@pytest.mark.asyncio +async def test_redirect(event_loop): + controller = Controller() + await controller.connect() + kwargs = controller.connection().connect_params() + await controller.disconnect() + + # websockets.server.logger.setLevel(logging.DEBUG) + # websockets.client.logger.setLevel(logging.DEBUG) + # # websockets.protocol.logger.setLevel(logging.DEBUG) + # logger.setLevel(logging.DEBUG) + + destination = 'wss://{}/api'.format(kwargs['endpoint']) + redirect_statuses = [ + http.HTTPStatus.MOVED_PERMANENTLY, + http.HTTPStatus.FOUND, + http.HTTPStatus.SEE_OTHER, + http.HTTPStatus.TEMPORARY_REDIRECT, + http.HTTPStatus.PERMANENT_REDIRECT, + ] + test_server_cert = Path(__file__).with_name('cert.pem') + kwargs['cacert'] += '\n' + test_server_cert.read_text() + server = RedirectServer(destination, event_loop) + try: + for status in redirect_statuses: + logger.debug('test: starting {}'.format(status)) + server.start(status) + await run_with_interrupt(server.running.wait(), + server.terminated) + if server.exception: + raise server.exception + assert not server.terminated.is_set() + logger.debug('test: started') + kwargs_copy = dict(kwargs, + endpoint='localhost:{}'.format(server.port)) + logger.debug('test: connecting') + conn = await Connection.connect(**kwargs_copy) + logger.debug('test: connected') + await conn.close() + logger.debug('test: stopping') + server.stop() + await server.stopped.wait() + logger.debug('test: stopped') + finally: + server.terminate() + await server.terminated.wait() + + +class RedirectServer: + def __init__(self, destination, loop): + self.destination = destination + self.loop = loop + self._start = asyncio.Event() + self._stop = asyncio.Event() + self._terminate = asyncio.Event() + self.running = asyncio.Event() + self.stopped = asyncio.Event() + self.terminated = asyncio.Event() + if hasattr(ssl, 'PROTOCOL_TLS_SERVER'): + # python 3.6+ + protocol = ssl.PROTOCOL_TLS_SERVER + elif hasattr(ssl, 'PROTOCOL_TLS'): + # python 3.5.3+ + protocol = ssl.PROTOCOL_TLS + else: + # python 3.5.2 + protocol = ssl.PROTOCOL_TLSv1_2 + self.ssl_context = ssl.SSLContext(protocol) + crt_file = Path(__file__).with_name('cert.pem') + key_file = Path(__file__).with_name('key.pem') + self.ssl_context.load_cert_chain(str(crt_file), str(key_file)) + self.status = None + self.port = None + self._task = self.loop.create_task(self.run()) + + def start(self, status): + self.status = status + self.port = self._find_free_port() + self._start.set() + + def stop(self): + self._stop.set() + + def terminate(self): + self._terminate.set() + self.stop() + + @property + def exception(self): + try: + return self._task.exception() + except (asyncio.CancelledError, asyncio.InvalidStateError): + return None + + async def run(self): + logger.debug('server: active') + + async def hello(websocket, path): + await websocket.send('hello') + + async def redirect(path, request_headers): + return self.status, {'Location': self.destination}, b"" + + try: + while not self._terminate.is_set(): + await run_with_interrupt(self._start.wait(), + self._terminate, + loop=self.loop) + if self._terminate.is_set(): + break + self._start.clear() + logger.debug('server: starting {}'.format(self.status)) + try: + async with websockets.serve(ws_handler=hello, + process_request=redirect, + host='localhost', + port=self.port, + ssl=self.ssl_context, + loop=self.loop): + self.stopped.clear() + self.running.set() + logger.debug('server: started') + while not self._stop.is_set(): + await run_with_interrupt( + asyncio.sleep(1, loop=self.loop), + self._stop, + loop=self.loop) + logger.debug('server: tick') + logger.debug('server: stopping') + except asyncio.CancelledError: + break + finally: + self.stopped.set() + self._stop.clear() + self.running.clear() + logger.debug('server: stopped') + logger.debug('server: terminating') + except asyncio.CancelledError: + pass + finally: + self._start.clear() + self._stop.clear() + self._terminate.clear() + self.stopped.set() + self.running.clear() + self.terminated.set() + logger.debug('server: terminated') + + def _find_free_port(self): + with closing(socket.socket(socket.AF_INET, socket.SOCK_STREAM)) as s: + s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + s.bind(('', 0)) + return s.getsockname()[1] diff --git a/tests/integration/test_controller.py b/tests/integration/test_controller.py index f3840cc..6423a98 100644 --- a/tests/integration/test_controller.py +++ b/tests/integration/test_controller.py @@ -1,20 +1,35 @@ -import pytest +import asyncio +import subprocess import uuid -from .. import base +from juju.client.connection import Connection +from juju.client.jujudata import FileJujuData from juju.controller import Controller from juju.errors import JujuAPIError +import pytest + +from .. import base + @base.bootstrapped @pytest.mark.asyncio -async def test_add_user(event_loop): +async def test_add_remove_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 + user = await controller.get_user(username) + assert user is None + user = await controller.add_user(username) + assert user is not None + assert user.secret_key is not None + assert user.username == username + users = await controller.get_users() + assert any(u.username == username for u in users) + await controller.remove_user(username) + user = await controller.get_user(username) + assert user is None + users = await controller.get_users() + assert not any(u.username == username for u in users) @base.bootstrapped @@ -22,15 +37,23 @@ async def test_add_user(event_loop): 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 + user = await controller.add_user(username) + + await user.disable() + assert not user.enabled + assert user.disabled + + fresh = await controller.get_user(username) # fetch fresh copy + assert not fresh.enabled + assert fresh.disabled + + await user.enable() + assert user.enabled + assert not user.disabled + + fresh = await controller.get_user(username) # fetch fresh copy + assert fresh.enabled + assert not fresh.disabled @base.bootstrapped @@ -38,40 +61,168 @@ async def test_disable_enable_user(event_loop): 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') + user = await controller.add_user(username) + await user.set_password('password') + # Check that we can connect with the new password. + new_connection = None + try: + kwargs = controller.connection().connect_params() + kwargs['username'] = username + kwargs['password'] = 'password' + new_connection = await Connection.connect(**kwargs) + except JujuAPIError: + raise AssertionError('Unable to connect with new password') + finally: + if new_connection: + await new_connection.close() + + +@base.bootstrapped +@pytest.mark.asyncio +async def test_reset_user_password(event_loop): + async with base.CleanController() as controller: + username = 'test{}'.format(uuid.uuid4()) + user = await controller.add_user(username) + origin_secret_key = user.secret_key + await user.set_password('password') + await controller.reset_user_password(username) + user = await controller.get_user(username) + new_secret_key = user.secret_key + # Check secret key is different after the reset. + assert origin_secret_key != new_secret_key + # Check that we can't connect with the old password. + new_connection = None try: - new_controller = Controller() - await new_controller.connect( - controller.connection.endpoint, username, 'password') - result = True - await new_controller.disconnect() + kwargs = controller.connection().connect_params() + kwargs['username'] = username + kwargs['password'] = 'password' + new_connection = await Connection.connect(**kwargs) except JujuAPIError: - result = False - assert result is True + pass + finally: + # No connection with old password + assert new_connection is None @base.bootstrapped @pytest.mark.asyncio -async def test_grant(event_loop): +async def test_grant_revoke(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' + user = await controller.add_user(username) + await user.grant('superuser') + assert user.access == 'superuser' + fresh = await controller.get_user(username) # fetch fresh copy + assert fresh.access == 'superuser' + await user.grant('login') # already has 'superuser', so no-op + assert user.access == 'superuser' + fresh = await controller.get_user(username) # fetch fresh copy + assert fresh.access == 'superuser' + await user.revoke() + assert user.access == '' + fresh = await controller.get_user(username) # fetch fresh copy + assert fresh.access == '' @base.bootstrapped @pytest.mark.asyncio -async def test_get_models(event_loop): +async def test_list_models(event_loop): async with base.CleanController() as controller: - result = await controller.get_models() - assert isinstance(result.serialize()['user-models'], list) + async with base.CleanModel() as model: + result = await controller.list_models() + assert model.info.name in result + + +@base.bootstrapped +@pytest.mark.asyncio +async def test_get_model(event_loop): + async with base.CleanController() as controller: + by_name, by_uuid = None, None + model_name = 'test-{}'.format(uuid.uuid4()) + model = await controller.add_model(model_name) + model_uuid = model.info.uuid + await model.disconnect() + try: + by_name = await controller.get_model(model_name) + by_uuid = await controller.get_model(model_uuid) + assert by_name.info.name == model_name + assert by_name.info.uuid == model_uuid + assert by_uuid.info.name == model_name + assert by_uuid.info.uuid == model_uuid + finally: + if by_name: + await by_name.disconnect() + if by_uuid: + await by_uuid.disconnect() + await controller.destroy_model(model_name) + + +async def _wait_for_model(controller, model_name): + while model_name not in await controller.list_models(): + await asyncio.sleep(0.5, loop=controller.loop) + + +async def _wait_for_model_gone(controller, model_name): + while model_name in await controller.list_models(): + await asyncio.sleep(0.5, loop=controller.loop) + + +@base.bootstrapped +@pytest.mark.asyncio +async def test_destroy_model_by_name(event_loop): + async with base.CleanController() as controller: + model_name = 'test-{}'.format(uuid.uuid4()) + model = await controller.add_model(model_name) + await model.disconnect() + await asyncio.wait_for(_wait_for_model(controller, + model_name), + timeout=60) + await controller.destroy_model(model_name) + await asyncio.wait_for(_wait_for_model_gone(controller, + model_name), + timeout=60) + + +@base.bootstrapped +@pytest.mark.asyncio +async def test_add_destroy_model_by_uuid(event_loop): + async with base.CleanController() as controller: + model_name = 'test-{}'.format(uuid.uuid4()) + model = await controller.add_model(model_name) + model_uuid = model.info.uuid + await model.disconnect() + await asyncio.wait_for(_wait_for_model(controller, + model_name), + timeout=60) + await controller.destroy_model(model_uuid) + await asyncio.wait_for(_wait_for_model_gone(controller, + model_name), + timeout=60) + + +# this test must be run serially because it modifies the login password +@pytest.mark.serial +@base.bootstrapped +@pytest.mark.asyncio +async def test_macaroon_auth(event_loop): + jujudata = FileJujuData() + account = jujudata.accounts()[jujudata.current_controller()] + with base.patch_file('~/.local/share/juju/accounts.yaml'): + if 'password' in account: + # force macaroon auth by "changing" password to current password + result = subprocess.run( + ['juju', 'change-user-password'], + input='{0}\n{0}\n'.format(account['password']), + universal_newlines=True, + stderr=subprocess.PIPE) + assert result.returncode == 0, ('Failed to change password: ' + '{}'.format(result.stderr)) + controller = Controller() + try: + await controller.connect() + assert controller.is_connected() + finally: + if controller.is_connected(): + await controller.disconnect() + async with base.CleanModel(): + pass # create and login to model works diff --git a/tests/integration/test_errors.py b/tests/integration/test_errors.py index 06b3826..b10dd06 100644 --- a/tests/integration/test_errors.py +++ b/tests/integration/test_errors.py @@ -40,7 +40,7 @@ async def test_juju_error_in_results_list(event_loop): from juju.client import client async with base.CleanModel() as model: - ann_facade = client.AnnotationsFacade.from_connection(model.connection) + ann_facade = client.AnnotationsFacade.from_connection(model.connection()) ann = client.EntityAnnotations( entity='badtag', @@ -58,11 +58,11 @@ async def test_juju_error_in_result(event_loop): looking at a single result coming back. ''' - from juju.errors import JujuError + from juju.errors import JujuError from juju.client import client async with base.CleanModel() as model: - app_facade = client.ApplicationFacade.from_connection(model.connection) + app_facade = client.ApplicationFacade.from_connection(model.connection()) with pytest.raises(JujuError): return await app_facade.GetCharmURL('foo') diff --git a/tests/integration/test_macaroon_auth.py b/tests/integration/test_macaroon_auth.py new file mode 100644 index 0000000..9911c41 --- /dev/null +++ b/tests/integration/test_macaroon_auth.py @@ -0,0 +1,108 @@ +import logging +import os + +import macaroonbakery.bakery as bakery +import macaroonbakery.httpbakery as httpbakery +import macaroonbakery.httpbakery.agent as agent +from juju.errors import JujuAPIError +from juju.model import Model + +import pytest + +from .. import base + +log = logging.getLogger(__name__) + + +@base.bootstrapped +@pytest.mark.asyncio +@pytest.mark.xfail +async def test_macaroon_auth(event_loop): + auth_info, username = agent_auth_info() + # Create a bakery client that can do agent authentication. + client = httpbakery.Client( + key=auth_info.key, + interaction_methods=[agent.AgentInteractor(auth_info)], + ) + + async with base.CleanModel(bakery_client=client) as m: + async with await m.get_controller() as c: + await c.grant_model(username, m.info.uuid, 'admin') + async with Model( + jujudata=NoAccountsJujuData(m._connector.jujudata), + bakery_client=client, + ): + pass + + +@base.bootstrapped +@pytest.mark.asyncio +@pytest.mark.xfail +async def test_macaroon_auth_with_bad_key(event_loop): + auth_info, username = agent_auth_info() + # Use a random key rather than the correct key. + auth_info = auth_info._replace(key=bakery.generate_key()) + # Create a bakery client can do agent authentication. + client = httpbakery.Client( + key=auth_info.key, + interaction_methods=[agent.AgentInteractor(auth_info)], + ) + + async with base.CleanModel(bakery_client=client) as m: + async with await m.get_controller() as c: + await c.grant_model(username, m.info.uuid, 'admin') + try: + async with Model( + jujudata=NoAccountsJujuData(m._connector.jujudata), + bakery_client=client, + ): + pytest.fail('Should not be able to connect with invalid key') + except httpbakery.BakeryException: + # We're expecting this because we're using the + # wrong key. + pass + + +@base.bootstrapped +@pytest.mark.asyncio +async def test_macaroon_auth_with_unauthorized_user(event_loop): + auth_info, username = agent_auth_info() + # Create a bakery client can do agent authentication. + client = httpbakery.Client( + key=auth_info.key, + interaction_methods=[agent.AgentInteractor(auth_info)], + ) + async with base.CleanModel(bakery_client=client) as m: + # Note: no grant of rights to the agent user. + try: + async with Model( + jujudata=NoAccountsJujuData(m._connector.jujudata), + bakery_client=client, + ): + pytest.fail('Should not be able to connect without grant') + except (JujuAPIError, httpbakery.DischargeError): + # We're expecting this because we're using the + # wrong user name. + pass + + +def agent_auth_info(): + agent_data = os.environ.get('TEST_AGENTS') + if agent_data is None: + pytest.skip('skipping macaroon_auth because no TEST_AGENTS ' + 'environment variable is set') + auth_info = agent.read_auth_info(agent_data) + if len(auth_info.agents) != 1: + raise Exception('TEST_AGENTS agent data requires exactly one agent') + return auth_info, auth_info.agents[0].username + + +class NoAccountsJujuData: + def __init__(self, jujudata): + self.__jujudata = jujudata + + def __getattr__(self, name): + return getattr(self.__jujudata, name) + + def accounts(self): + return {} diff --git a/tests/integration/test_machine.py b/tests/integration/test_machine.py index 60de035..070208a 100644 --- a/tests/integration/test_machine.py +++ b/tests/integration/test_machine.py @@ -1,8 +1,8 @@ import asyncio -import pytest - from tempfile import NamedTemporaryFile +import pytest + from .. import base @@ -26,21 +26,24 @@ async def test_status(event_loop): assert machine.agent_status == 'pending' assert not machine.agent_version + # there is some inconsistency in the capitalization of status_message + # between different providers await asyncio.wait_for( - model.block_until(lambda: (machine.status == 'running' and - machine.agent_status == 'started')), + model.block_until( + lambda: (machine.status == 'running' and + machine.status_message.lower() == '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): + # ensure that asyncio.subprocess will work; + try: + asyncio.get_child_watcher().attach_loop(event_loop) + except RuntimeError: + pytest.skip('test_scp will always fail outside of MainThread') async with base.CleanModel() as model: await model.add_machine() await asyncio.wait_for( @@ -55,8 +58,8 @@ async def test_scp(event_loop): with NamedTemporaryFile() as f: f.write(b'testcontents') f.flush() - await machine.scp_to(f.name, 'testfile') + await machine.scp_to(f.name, 'testfile', scp_opts='-p') with NamedTemporaryFile() as f: - await machine.scp_from('testfile', f.name) + await machine.scp_from('testfile', f.name, scp_opts='-p') assert f.read() == b'testcontents' diff --git a/tests/integration/test_model.py b/tests/integration/test_model.py index 8506786..93695b5 100644 --- a/tests/integration/test_model.py +++ b/tests/integration/test_model.py @@ -1,11 +1,23 @@ import asyncio +import mock from concurrent.futures import ThreadPoolExecutor from pathlib import Path +import paramiko + +from juju.client.client import ConfigValue, ApplicationFacade +from juju.model import Model, ModelObserver +from juju.utils import block_until, run_with_interrupt +from juju.errors import JujuError + +import os +import pylxd +import time +import uuid + import pytest from .. import base -from juju.model import Model -from juju.client.client import ConfigValue + MB = 1 GB = 1024 @@ -14,16 +26,59 @@ SSH_KEY = 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCsYMJGNGG74HAJha3n2CFmWYsOOaORn @base.bootstrapped @pytest.mark.asyncio -async def test_deploy_local_bundle(event_loop): - from pathlib import Path +async def test_deploy_local_bundle_dir(event_loop): 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 + wordpress = model.applications.get('wordpress') + mysql = model.applications.get('mysql') + assert wordpress and mysql + await block_until(lambda: (len(wordpress.units) == 1 and + len(mysql.units) == 1), + timeout=60 * 4) + + +@base.bootstrapped +@pytest.mark.asyncio +async def test_deploy_local_bundle_file(event_loop): + tests_dir = Path(__file__).absolute().parent.parent + bundle_path = tests_dir / 'bundle' + mini_bundle_file_path = bundle_path / 'mini-bundle.yaml' + + async with base.CleanModel() as model: + await model.deploy(str(mini_bundle_file_path)) + + dummy_sink = model.applications.get('dummy-sink') + dummy_subordinate = model.applications.get('dummy-subordinate') + assert dummy_sink and dummy_subordinate + await block_until(lambda: (len(dummy_sink.units) == 1 and + len(dummy_subordinate.units) == 1), + timeout=60 * 4) + + +@base.bootstrapped +@pytest.mark.asyncio +async def test_deploy_invalid_bundle(event_loop): + tests_dir = Path(__file__).absolute().parent.parent + bundle_path = tests_dir / 'bundle' / 'invalid.yaml' + async with base.CleanModel() as model: + with pytest.raises(JujuError): + await model.deploy(str(bundle_path)) + + +@base.bootstrapped +@pytest.mark.asyncio +async def test_deploy_local_charm(event_loop): + from pathlib import Path + tests_dir = Path(__file__).absolute().parent.parent + charm_path = tests_dir / 'charm' + + async with base.CleanModel() as model: + await model.deploy(str(charm_path)) + assert 'charm' in model.applications @base.bootstrapped @@ -43,7 +98,7 @@ async def test_deploy_channels_revs(event_loop): 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') + rev = await model.deploy(charm + '-2', 'a3') assert [a.charm_url for a in (stable, edge, rev)] == [ 'cs:~johnsca/libjuju-test-1', @@ -91,6 +146,115 @@ async def test_add_machine(event_loop): assert len(model.machines) == 0 +@base.bootstrapped +@pytest.mark.asyncio +async def test_add_manual_machine_ssh(event_loop): + + # Verify controller is localhost + async with base.CleanController() as controller: + cloud = await controller.get_cloud() + if cloud != "localhost": + pytest.skip('Skipping because test requires lxd.') + + async with base.CleanModel() as model: + private_key_path = os.path.expanduser( + "~/.local/share/juju/ssh/juju_id_rsa" + ) + public_key_path = os.path.expanduser( + "~/.local/share/juju/ssh/juju_id_rsa.pub" + ) + + # connect using the local unix socket + client = pylxd.Client() + + test_name = "test-{}-add-manual-machine-ssh".format( + uuid.uuid4().hex[-4:] + ) + + # create profile w/cloud-init and juju ssh key + public_key = "" + with open(public_key_path, "r") as f: + public_key = f.readline() + + profile = client.profiles.create( + test_name, + config={'user.user-data': '#cloud-config\n' + 'ssh_authorized_keys:\n' + '- {}'.format(public_key)}, + devices={ + 'root': {'path': '/', 'pool': 'default', 'type': 'disk'}, + 'eth0': { + 'nictype': 'bridged', + 'parent': 'lxdbr0', + 'type': 'nic' + } + } + ) + + # create lxc machine + config = { + 'name': test_name, + 'source': { + 'type': 'image', + 'alias': 'xenial', + 'mode': 'pull', + 'protocol': 'simplestreams', + 'server': 'https://cloud-images.ubuntu.com/releases', + }, + 'profiles': [test_name], + } + container = client.containers.create(config, wait=True) + container.start(wait=True) + + def wait_for_network(container, timeout=30): + """Wait for eth0 to have an ipv4 address.""" + starttime = time.time() + while(time.time() < starttime + timeout): + time.sleep(1) + if 'eth0' in container.state().network: + addresses = container.state().network['eth0']['addresses'] + if len(addresses) > 0: + if addresses[0]['family'] == 'inet': + return addresses[0] + return None + + host = wait_for_network(container) + assert host, 'Failed to get address for machine' + + # HACK: We need to give sshd a chance to bind to the interface, + # and pylxd's container.execute seems to be broken and fails and/or + # hangs trying to properly check if the service is up. + time.sleep(5) + + for attempt in range(1, 4): + try: + # add a new manual machine + machine1 = await model.add_machine(spec='ssh:{}@{}:{}'.format( + "ubuntu", + host['address'], + private_key_path, + )) + except paramiko.ssh_exception.NoValidConnectionsError: + if attempt == 3: + raise + # retry the ssh connection a few times if it fails + time.sleep(attempt * 5) + else: + break + + assert len(model.machines) == 1 + + res = await machine1.destroy(force=True) + + assert res is None + assert len(model.machines) == 0 + + container.stop(wait=True) + container.delete(wait=True) + + profile.delete() + + @base.bootstrapped @pytest.mark.asyncio async def test_relate(event_loop): @@ -111,17 +275,44 @@ async def test_relate(event_loop): # subordinates must be deployed without units num_units=0, ) - my_relation = await model.add_relation( - 'ubuntu', - 'nrpe', - ) + + relation_added = asyncio.Event() + timeout = asyncio.Event() + + class TestObserver(ModelObserver): + async def on_relation_add(self, delta, old, new, model): + if set(new.key.split()) == {'nrpe:general-info', + 'ubuntu:juju-info'}: + relation_added.set() + event_loop.call_later(2, timeout.set) + + model.add_observer(TestObserver()) + + real_app_facade = ApplicationFacade.from_connection(model.connection()) + mock_app_facade = mock.MagicMock() + + async def mock_AddRelation(*args): + # force response delay from AddRelation to test race condition + # (see https://github.com/juju/python-libjuju/issues/191) + result = await real_app_facade.AddRelation(*args) + await relation_added.wait() + return result + + mock_app_facade.AddRelation = mock_AddRelation + + with mock.patch.object(ApplicationFacade, 'from_connection', + return_value=mock_app_facade): + my_relation = await run_with_interrupt(model.add_relation( + 'ubuntu', + 'nrpe', + ), timeout, loop=event_loop) 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) +async def _deploy_in_loop(new_loop, model_name, jujudata): + new_model = Model(new_loop, jujudata=jujudata) + await new_model.connect(model_name) try: await new_model.deploy('cs:xenial/ubuntu') assert 'ubuntu' in new_model.applications @@ -129,18 +320,6 @@ async def _deploy_in_loop(new_loop, model_name): 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): @@ -150,7 +329,9 @@ async def test_explicit_loop_threaded(event_loop): with ThreadPoolExecutor(1) as executor: f = executor.submit( new_loop.run_until_complete, - _deploy_in_loop(new_loop, model_name)) + _deploy_in_loop(new_loop, + model_name, + model._connector.jujudata)) f.result() await model._wait_for_new('application', 'ubuntu') assert 'ubuntu' in model.applications @@ -167,7 +348,7 @@ async def test_store_resources_charm(event_loop): 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' @@ -186,10 +367,33 @@ async def test_store_resources_bundle(event_loop): 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' + resources = await ghost.get_resources() + assert resources['ghost-stable'].revision >= 12 + + +@base.bootstrapped +@pytest.mark.asyncio +async def test_store_resources_bundle_revs(event_loop): + async with base.CleanModel() as model: + bundle = str(Path(__file__).parent / 'bundle/bundle-resource-rev.yaml') + 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' + resources = await ghost.get_resources() + assert resources['ghost-stable'].revision == 11 @base.bootstrapped @@ -218,9 +422,8 @@ async def test_get_machines(event_loop): @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 + await model.connection().ws.close() + await block_until(model.is_connected, timeout=3) @base.bootstrapped @@ -236,6 +439,15 @@ async def test_config(event_loop): assert result['extra-info'].source == 'model' assert result['extra-info'].value == 'booyah' + +@base.bootstrapped +@pytest.mark.asyncio +async def test_set_constraints(event_loop): + async with base.CleanModel() as model: + await model.set_constraints({'cpu-power': 1}) + cons = await model.get_constraints() + assert cons['cpu_power'] == 1 + # @base.bootstrapped # @pytest.mark.asyncio # async def test_grant(event_loop) diff --git a/tests/integration/test_unit.py b/tests/integration/test_unit.py index 1604c31..bb34969 100644 --- a/tests/integration/test_unit.py +++ b/tests/integration/test_unit.py @@ -1,8 +1,8 @@ import asyncio -import pytest - from tempfile import NamedTemporaryFile +import pytest + from .. import base @@ -25,6 +25,18 @@ async def test_run(event_loop): assert 'Stdout' in action.results break + for unit in app.units: + action = await unit.run('sleep 1', timeout=0.5) + assert isinstance(action, Action) + assert action.status == 'failed' + break + + for unit in app.units: + action = await unit.run('sleep 0.5', timeout=2) + assert isinstance(action, Action) + assert action.status == 'completed' + break + @base.bootstrapped @pytest.mark.asyncio @@ -46,12 +58,21 @@ async def test_run_action(event_loop): for unit in app.units: action = await run_action(unit) assert action.results == {'dir': '/var/git/myrepo.git'} + out = await model.get_action_output(action.entity_id, wait=5) + assert out == {'dir': '/var/git/myrepo.git'} + status = await model.get_action_status(uuid_or_prefix=action.entity_id) + assert status[action.entity_id] == 'completed' break @base.bootstrapped @pytest.mark.asyncio async def test_scp(event_loop): + # ensure that asyncio.subprocess will work; + try: + asyncio.get_child_watcher().attach_loop(event_loop) + except RuntimeError: + pytest.skip('test_scp will always fail outside of MainThread') async with base.CleanModel() as model: app = await model.deploy('ubuntu') diff --git a/tests/unit/test_client.py b/tests/unit/test_client.py index 7828cf3..1d18bf9 100644 --- a/tests/unit/test_client.py +++ b/tests/unit/test_client.py @@ -4,16 +4,12 @@ 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 + for i in range(1, 5): # Assert versions 1-4 in client dict assert str(i) in client.CLIENTS @@ -21,5 +17,10 @@ def test_from_connection(): connection = mock.Mock() connection.facades = {"Action": 2} action_facade = client.ActionFacade.from_connection(connection) + assert action_facade + - +def test_to_json(): + uml = client.UserModelList([client.UserModel()]) + assert uml.to_json() == ('{"user-models": [{"last-connection": null, ' + '"model": null}]}') diff --git a/tests/unit/test_connection.py b/tests/unit/test_connection.py index f69b8d6..0925d84 100644 --- a/tests/unit/test_connection.py +++ b/tests/unit/test_connection.py @@ -1,13 +1,14 @@ import asyncio import json -import mock -import pytest from collections import deque +import mock +from juju.client.connection import Connection from websockets.exceptions import ConnectionClosed +import pytest + from .. import base -from juju.client.connection import Connection class WebsocketMock: @@ -31,7 +32,6 @@ class WebsocketMock: @pytest.mark.asyncio async def test_out_of_order(event_loop): - con = Connection(*[None]*4) ws = WebsocketMock([ {'request-id': 1}, {'request-id': 3}, @@ -42,13 +42,24 @@ async def test_out_of_order(event_loop): {'request-id': 2}, {'request-id': 3}, ] - con._get_sll = mock.MagicMock() + minimal_facades = [{'name': 'Pinger', 'versions': [1]}] + con = None try: - with mock.patch('websockets.connect', base.AsyncMock(return_value=ws)): - await con.open() + with \ + mock.patch('websockets.connect', base.AsyncMock(return_value=ws)), \ + mock.patch( + 'juju.client.connection.Connection.login', + base.AsyncMock(return_value={'response': { + 'facades': minimal_facades, + }}), + ), \ + mock.patch('juju.client.connection.Connection._get_ssl'), \ + mock.patch('juju.client.connection.Connection._pinger', base.AsyncMock()): + con = await Connection.connect('0.1.2.3:999') actual_responses = [] for i in range(3): actual_responses.append(await con.rpc({'version': 1})) assert actual_responses == expected_responses finally: - await con.close() + if con: + await con.close() diff --git a/tests/unit/test_constraints.py b/tests/unit/test_constraints.py index cb9d773..3c52090 100644 --- a/tests/unit/test_constraints.py +++ b/tests/unit/test_constraints.py @@ -6,6 +6,7 @@ import unittest from juju import constraints + class TestConstraints(unittest.TestCase): def test_mem_regex(self): @@ -31,6 +32,12 @@ class TestConstraints(unittest.TestCase): self.assertEqual(_("10G"), 10 * 1024) self.assertEqual(_("10M"), 10) self.assertEqual(_("10"), 10) + self.assertEqual(_("foo,bar"), "foo,bar") + + def test_normalize_list_val(self): + _ = constraints.normalize_list_value + + self.assertEqual(_("foo"), ["foo"]) self.assertEqual(_("foo,bar"), ["foo", "bar"]) def test_parse_constraints(self): @@ -42,6 +49,9 @@ class TestConstraints(unittest.TestCase): ) self.assertEqual( - _("mem=10G foo=bar,baz"), - {"mem": 10 * 1024, "foo": ["bar", "baz"]} + _("mem=10G foo=bar,baz tags=tag1 spaces=space1,space2"), + {"mem": 10 * 1024, + "foo": "bar,baz", + "tags": ["tag1"], + "spaces": ["space1", "space2"]} ) diff --git a/tests/unit/test_controller.py b/tests/unit/test_controller.py new file mode 100644 index 0000000..b95b5ee --- /dev/null +++ b/tests/unit/test_controller.py @@ -0,0 +1,140 @@ +import asynctest +import mock +from pathlib import Path +from tempfile import NamedTemporaryFile + +from juju.controller import Controller +from juju.client import client + +from .. import base + + +class TestControllerConnect(asynctest.TestCase): + @asynctest.patch('juju.client.connector.Connector.connect_controller') + async def test_no_args(self, mock_connect_controller): + c = Controller() + await c.connect() + mock_connect_controller.assert_called_once_with(None) + + @asynctest.patch('juju.client.connector.Connector.connect_controller') + async def test_with_controller_name(self, mock_connect_controller): + c = Controller() + await c.connect(controller_name='foo') + mock_connect_controller.assert_called_once_with('foo') + + @asynctest.patch('juju.client.connector.Connector.connect') + async def test_with_endpoint_and_no_auth(self, mock_connect): + c = Controller() + with self.assertRaises(TypeError): + await c.connect(endpoint='0.1.2.3:4566') + self.assertEqual(mock_connect.call_count, 0) + + @asynctest.patch('juju.client.connector.Connector.connect') + async def test_with_endpoint_and_userpass(self, mock_connect): + c = Controller() + with self.assertRaises(TypeError): + await c.connect(endpoint='0.1.2.3:4566', username='dummy') + await c.connect(endpoint='0.1.2.3:4566', + username='user', + password='pass') + mock_connect.assert_called_once_with(endpoint='0.1.2.3:4566', + username='user', + password='pass') + + @asynctest.patch('juju.client.connector.Connector.connect') + async def test_with_endpoint_and_bakery_client(self, mock_connect): + c = Controller() + await c.connect(endpoint='0.1.2.3:4566', bakery_client='bakery') + mock_connect.assert_called_once_with(endpoint='0.1.2.3:4566', + bakery_client='bakery') + + @asynctest.patch('juju.client.connector.Connector.connect') + async def test_with_endpoint_and_macaroons(self, mock_connect): + c = Controller() + await c.connect(endpoint='0.1.2.3:4566', + macaroons=['macaroon']) + mock_connect.assert_called_with(endpoint='0.1.2.3:4566', + macaroons=['macaroon']) + await c.connect(endpoint='0.1.2.3:4566', + bakery_client='bakery', + macaroons=['macaroon']) + mock_connect.assert_called_with(endpoint='0.1.2.3:4566', + bakery_client='bakery', + macaroons=['macaroon']) + + @asynctest.patch('juju.client.connector.Connector.connect_controller') + @asynctest.patch('juju.client.connector.Connector.connect') + async def test_with_posargs(self, mock_connect, mock_connect_controller): + c = Controller() + await c.connect('foo') + mock_connect_controller.assert_called_once_with('foo') + with self.assertRaises(TypeError): + await c.connect('endpoint', 'user') + await c.connect('endpoint', 'user', 'pass') + mock_connect.assert_called_once_with(endpoint='endpoint', + username='user', + password='pass') + await c.connect('endpoint', 'user', 'pass', 'cacert', 'bakery', + 'macaroons', 'loop', 'max_frame_size') + mock_connect.assert_called_with(endpoint='endpoint', + username='user', + password='pass', + cacert='cacert', + bakery_client='bakery', + macaroons='macaroons', + loop='loop', + max_frame_size='max_frame_size') + + @asynctest.patch('juju.client.client.CloudFacade') + async def test_file_cred_v2(self, mock_cf): + with NamedTemporaryFile() as tempfile: + tempfile.close() + temppath = Path(tempfile.name) + temppath.write_text('cred-test') + cred = client.CloudCredential(auth_type='jsonfile', + attrs={'file': tempfile.name}) + jujudata = mock.MagicMock() + c = Controller(jujudata=jujudata) + c._connector = base.AsyncMock() + up_creds = base.AsyncMock() + cloud_facade = mock_cf.from_connection() + cloud_facade.version = 2 + cloud_facade.UpdateCredentials = up_creds + await c.add_credential( + name='name', + credential=cred, + cloud='cloud', + owner='owner', + ) + assert up_creds.called + new_cred = up_creds.call_args[0][0][0].credential + assert cred.attrs['file'] == tempfile.name + assert new_cred.attrs['file'] == 'cred-test' + + @asynctest.patch('juju.client.client.CloudFacade') + async def test_file_cred_v3(self, mock_cf): + with NamedTemporaryFile() as tempfile: + tempfile.close() + temppath = Path(tempfile.name) + temppath.write_text('cred-test') + cred = client.CloudCredential(auth_type='jsonfile', + attrs={'file': tempfile.name}) + jujudata = mock.MagicMock() + c = Controller(jujudata=jujudata) + c._connector = base.AsyncMock() + up_creds = base.AsyncMock() + cloud_facade = mock_cf.from_connection() + cloud_facade.version = 3 + cloud_facade.UpdateCredentialsCheckModels = up_creds + await c.add_credential( + name='name', + credential=cred, + cloud='cloud', + owner='owner', + force=True, + ) + assert up_creds.called + assert up_creds.call_args[1]['force'] + new_cred = up_creds.call_args[1]['credentials'][0].credential + assert cred.attrs['file'] == tempfile.name + assert new_cred.attrs['file'] == 'cred-test' diff --git a/tests/unit/test_gocookies.py b/tests/unit/test_gocookies.py new file mode 100644 index 0000000..033a0e9 --- /dev/null +++ b/tests/unit/test_gocookies.py @@ -0,0 +1,244 @@ +""" +Tests for the gocookies code. +""" +import os +import shutil +import tempfile +import unittest +import urllib.request + +import pyrfc3339 +from juju.client.gocookies import GoCookieJar + +# cookie_content holds the JSON contents of a Go-produced +# cookie file (reformatted so it's not all on one line but +# otherwise unchanged). +cookie_content = """ +[ + { + "CanonicalHost": "bar.com", + "Creation": "2017-11-17T08:53:55.088820092Z", + "Domain": "bar.com", + "Expires": "2345-11-15T18:16:08Z", + "HostOnly": true, + "HttpOnly": false, + "LastAccess": "2017-11-17T08:53:55.088822562Z", + "Name": "bar", + "Path": "/", + "Persistent": true, + "Secure": false, + "Updated": "2017-11-17T08:53:55.088822562Z", + "Value": "bar-value" + }, + { + "CanonicalHost": "x.foo.com", + "Creation": "2017-11-17T08:53:55.088814857Z", + "Domain": "x.foo.com", + "Expires": "2345-11-15T18:16:05Z", + "HostOnly": true, + "HttpOnly": false, + "LastAccess": "2017-11-17T08:53:55.088884015Z", + "Name": "foo", + "Path": "/path", + "Persistent": true, + "Secure": false, + "Updated": "2017-11-17T08:53:55.088814857Z", + "Value": "foo-path-value" + }, + { + "CanonicalHost": "x.foo.com", + "Creation": "2017-11-17T08:53:55.088814857Z", + "Domain": "foo.com", + "Expires": "2345-11-15T18:16:06Z", + "HostOnly": false, + "HttpOnly": false, + "LastAccess": "2017-11-17T08:53:55.088919437Z", + "Name": "foo4", + "Path": "/path", + "Persistent": true, + "Secure": false, + "Updated": "2017-11-17T08:53:55.088814857Z", + "Value": "foo4-value" + }, + { + "CanonicalHost": "x.foo.com", + "Creation": "2017-11-17T08:53:55.088790709Z", + "Domain": "x.foo.com", + "Expires": "2345-11-15T18:16:01Z", + "HostOnly": true, + "HttpOnly": false, + "LastAccess": "2017-11-17T08:53:55.088884015Z", + "Name": "foo", + "Path": "/", + "Persistent": true, + "Secure": false, + "Updated": "2017-11-17T08:53:55.088790709Z", + "Value": "foo-value" + }, + { + "CanonicalHost": "x.foo.com", + "Creation": "2017-11-17T08:53:55.088790709Z", + "Domain": "foo.com", + "Expires": "2345-11-15T18:16:02Z", + "HostOnly": false, + "HttpOnly": false, + "LastAccess": "2017-11-17T08:53:55.088919437Z", + "Name": "foo1", + "Path": "/", + "Persistent": true, + "Secure": false, + "Updated": "2017-11-17T08:53:55.088790709Z", + "Value": "foo1-value" + }, + { + "CanonicalHost": "x.foo.com", + "Creation": "2017-11-17T08:53:55.088790709Z", + "Domain": "x.foo.com", + "Expires": "2345-11-15T18:16:03Z", + "HostOnly": true, + "HttpOnly": false, + "LastAccess": "2017-11-17T08:53:55.088850252Z", + "Name": "foo2", + "Path": "/", + "Persistent": true, + "Secure": true, + "Updated": "2017-11-17T08:53:55.088790709Z", + "Value": "foo2-value" + }, + { + "CanonicalHost": "x.foo.com", + "Creation": "2017-11-17T08:53:55.088790709Z", + "Domain": "foo.com", + "Expires": "2345-11-15T18:16:04Z", + "HostOnly": false, + "HttpOnly": false, + "LastAccess": "2017-11-17T08:53:55.088919437Z", + "Name": "foo3", + "Path": "/", + "Persistent": true, + "Secure": false, + "Updated": "2017-11-17T08:53:55.088790709Z", + "Value": "foo3-value" + } +] +""" + +# cookie_content_queries holds a set of queries +# that were automatically generated by running +# the queries on the above cookie_content data +# and printing the results. +cookie_content_queries = [ + ('http://x.foo.com', [ + ('foo', 'foo-value'), + ('foo1', 'foo1-value'), + ('foo3', 'foo3-value'), + ]), + ('https://x.foo.com', [ + ('foo', 'foo-value'), + ('foo1', 'foo1-value'), + ('foo2', 'foo2-value'), + ('foo3', 'foo3-value'), + ]), + ('http://arble.foo.com', [ + ('foo1', 'foo1-value'), + ('foo3', 'foo3-value'), + ]), + ('http://arble.com', [ + ]), + ('http://x.foo.com/path/x', [ + ('foo', 'foo-path-value'), + ('foo4', 'foo4-value'), + ('foo', 'foo-value'), + ('foo1', 'foo1-value'), + ('foo3', 'foo3-value'), + ]), + ('http://arble.foo.com/path/x', [ + ('foo4', 'foo4-value'), + ('foo1', 'foo1-value'), + ('foo3', 'foo3-value'), + ]), + ('http://foo.com/path/x', [ + ('foo4', 'foo4-value'), + ('foo1', 'foo1-value'), + ('foo3', 'foo3-value'), + ]), +] + + +class TestGoCookieJar(unittest.TestCase): + def setUp(self): + self.dir = tempfile.mkdtemp() + + def tearDown(self): + shutil.rmtree(self.dir) + + def test_readcookies(self): + jar = self.load_jar(cookie_content) + self.assert_jar_queries(jar, cookie_content_queries) + + def test_roundtrip(self): + jar = self.load_jar(cookie_content) + filename2 = os.path.join(self.dir, 'cookies2') + jar.save(filename=filename2) + jar = GoCookieJar() + jar.load(filename=filename2) + self.assert_jar_queries(jar, cookie_content_queries) + + def test_expiry_time(self): + content = '''[ + { + "CanonicalHost": "bar.com", + "Creation": "2017-11-17T08:53:55.088820092Z", + "Domain": "bar.com", + "Expires": "2345-11-15T18:16:08Z", + "HostOnly": true, + "HttpOnly": false, + "LastAccess": "2017-11-17T08:53:55.088822562Z", + "Name": "bar", + "Path": "/", + "Persistent": true, + "Secure": false, + "Updated": "2017-11-17T08:53:55.088822562Z", + "Value": "bar-value" + } + ]''' + jar = self.load_jar(content) + got_expires = tuple(jar)[0].expires + want_expires = int(pyrfc3339.parse('2345-11-15T18:16:08Z').timestamp()) + self.assertEqual(got_expires, want_expires) + + def load_jar(self, content): + filename = os.path.join(self.dir, 'cookies') + with open(filename, 'x') as f: + f.write(content) + jar = GoCookieJar() + jar.load(filename=filename) + return jar + + def assert_jar_queries(self, jar, queries): + '''Assert that all the given queries (see cookie_content_queries) + are satisfied when run on the given cookie jar. + :param jar CookieJar: the cookie jar to query + :param queries: the queries to run. + ''' + for url, want_cookies in queries: + req = urllib.request.Request(url) + jar.add_cookie_header(req) + # We can't use SimpleCookie to find out what cookies + # have been presented, because SimpleCookie + # only allows one cookie with a given name, + # so we naively parse the cookies ourselves, which + # is OK because we know we don't have to deal + # with any complex cases. + + cookie_header = req.get_header('Cookie') + got_cookies = [] + if cookie_header is not None: + got_cookies = [ + tuple(part.split('=')) + for part in cookie_header.split('; ') + ] + got_cookies.sort() + want_cookies = list(want_cookies) + want_cookies.sort() + self.assertEqual(got_cookies, want_cookies, msg='query {}; got {}; want {}'.format(url, got_cookies, want_cookies)) diff --git a/tests/unit/test_loop.py b/tests/unit/test_loop.py index f12368e..9043df6 100644 --- a/tests/unit/test_loop.py +++ b/tests/unit/test_loop.py @@ -1,5 +1,6 @@ import asyncio import unittest + import juju.loop @@ -15,6 +16,7 @@ class TestLoop(unittest.TestCase): def test_run(self): assert asyncio.get_event_loop() == self.loop + async def _test(): return 'success' self.assertEqual(juju.loop.run(_test()), 'success') diff --git a/tests/unit/test_model.py b/tests/unit/test_model.py index 222d881..2753d85 100644 --- a/tests/unit/test_model.py +++ b/tests/unit/test_model.py @@ -1,8 +1,12 @@ import unittest import mock + import asynctest +from juju.client.jujudata import FileJujuData +from juju.model import Model + def _make_delta(entity, type_, data=None): from juju.client.client import Delta @@ -68,8 +72,8 @@ class TestModelState(unittest.TestCase): from juju.model import Model from juju.application import Application - loop = mock.MagicMock() - model = Model(loop=loop) + model = Model() + model._connector = mock.MagicMock() delta = _make_delta('application', 'add', dict(name='foo')) # test add @@ -118,7 +122,7 @@ def test_get_series(): class TestContextManager(asynctest.TestCase): @asynctest.patch('juju.model.Model.disconnect') - @asynctest.patch('juju.model.Model.connect_current') + @asynctest.patch('juju.model.Model.connect') async def test_normal_use(self, mock_connect, mock_disconnect): from juju.model import Model @@ -129,7 +133,7 @@ class TestContextManager(asynctest.TestCase): self.assertTrue(mock_disconnect.called) @asynctest.patch('juju.model.Model.disconnect') - @asynctest.patch('juju.model.Model.connect_current') + @asynctest.patch('juju.model.Model.connect') async def test_exception(self, mock_connect, mock_disconnect): from juju.model import Model @@ -143,13 +147,118 @@ class TestContextManager(asynctest.TestCase): 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): + async def test_no_current_connection(self): from juju.model import Model from juju.errors import JujuConnectionError - mock_current_controller.return_value = "" + class NoControllerJujuData(FileJujuData): + def current_controller(self): + return "" with self.assertRaises(JujuConnectionError): - async with Model(): + async with Model(jujudata=NoControllerJujuData()): pass + + +@asynctest.patch('juju.model.Model._after_connect') +class TestModelConnect(asynctest.TestCase): + @asynctest.patch('juju.client.connector.Connector.connect_model') + async def test_no_args(self, mock_connect_model, _): + m = Model() + await m.connect() + mock_connect_model.assert_called_once_with(None) + + @asynctest.patch('juju.client.connector.Connector.connect_model') + async def test_with_model_name(self, mock_connect_model, _): + m = Model() + await m.connect(model_name='foo') + mock_connect_model.assert_called_once_with('foo') + + @asynctest.patch('juju.client.connector.Connector.connect_model') + async def test_with_endpoint_but_no_uuid(self, mock_connect_model, _): + m = Model() + with self.assertRaises(TypeError): + await m.connect(endpoint='0.1.2.3:4566') + self.assertEqual(mock_connect_model.call_count, 0) + + @asynctest.patch('juju.client.connector.Connector.connect') + async def test_with_endpoint_and_uuid_no_auth(self, mock_connect, _): + m = Model() + with self.assertRaises(TypeError): + await m.connect(endpoint='0.1.2.3:4566', uuid='some-uuid') + self.assertEqual(mock_connect.call_count, 0) + + @asynctest.patch('juju.client.connector.Connector.connect') + async def test_with_endpoint_and_uuid_with_userpass(self, mock_connect, _): + m = Model() + with self.assertRaises(TypeError): + await m.connect(endpoint='0.1.2.3:4566', + uuid='some-uuid', + username='user') + await m.connect(endpoint='0.1.2.3:4566', + uuid='some-uuid', + username='user', + password='pass') + mock_connect.assert_called_once_with(endpoint='0.1.2.3:4566', + uuid='some-uuid', + username='user', + password='pass') + + @asynctest.patch('juju.client.connector.Connector.connect') + async def test_with_endpoint_and_uuid_with_bakery(self, mock_connect, _): + m = Model() + await m.connect(endpoint='0.1.2.3:4566', + uuid='some-uuid', + bakery_client='bakery') + mock_connect.assert_called_once_with(endpoint='0.1.2.3:4566', + uuid='some-uuid', + bakery_client='bakery') + + @asynctest.patch('juju.client.connector.Connector.connect') + async def test_with_endpoint_and_uuid_with_macaroon(self, mock_connect, _): + m = Model() + with self.assertRaises(TypeError): + await m.connect(endpoint='0.1.2.3:4566', + uuid='some-uuid', + username='user') + await m.connect(endpoint='0.1.2.3:4566', + uuid='some-uuid', + macaroons=['macaroon']) + mock_connect.assert_called_with(endpoint='0.1.2.3:4566', + uuid='some-uuid', + macaroons=['macaroon']) + await m.connect(endpoint='0.1.2.3:4566', + uuid='some-uuid', + bakery_client='bakery', + macaroons=['macaroon']) + mock_connect.assert_called_with(endpoint='0.1.2.3:4566', + uuid='some-uuid', + bakery_client='bakery', + macaroons=['macaroon']) + + @asynctest.patch('juju.client.connector.Connector.connect_model') + @asynctest.patch('juju.client.connector.Connector.connect') + async def test_with_posargs(self, mock_connect, mock_connect_model, _): + m = Model() + await m.connect('foo') + mock_connect_model.assert_called_once_with('foo') + with self.assertRaises(TypeError): + await m.connect('endpoint', 'uuid') + with self.assertRaises(TypeError): + await m.connect('endpoint', 'uuid', 'user') + await m.connect('endpoint', 'uuid', 'user', 'pass') + mock_connect.assert_called_once_with(endpoint='endpoint', + uuid='uuid', + username='user', + password='pass') + await m.connect('endpoint', 'uuid', 'user', 'pass', 'cacert', 'bakery', + 'macaroons', 'loop', 'max_frame_size') + mock_connect.assert_called_with(endpoint='endpoint', + uuid='uuid', + username='user', + password='pass', + cacert='cacert', + bakery_client='bakery', + macaroons='macaroons', + loop='loop', + max_frame_size='max_frame_size') diff --git a/tests/unit/test_overrides.py b/tests/unit/test_overrides.py index 6485408..a5835ff 100644 --- a/tests/unit/test_overrides.py +++ b/tests/unit/test_overrides.py @@ -1,6 +1,6 @@ -import pytest +from juju.client.overrides import Binary, Number # noqa -from juju.client.overrides import Number, Binary # noqa +import pytest # test cases ported from: diff --git a/tests/unit/test_placement.py b/tests/unit/test_placement.py index a78a28d..5a933ec 100644 --- a/tests/unit/test_placement.py +++ b/tests/unit/test_placement.py @@ -5,7 +5,7 @@ import unittest from juju import placement -from juju.client import client + class TestPlacement(unittest.TestCase): diff --git a/tests/unit/test_registration_string.py b/tests/unit/test_registration_string.py new file mode 100644 index 0000000..f4fea44 --- /dev/null +++ b/tests/unit/test_registration_string.py @@ -0,0 +1,18 @@ +# +# Test our placement helper +# + +import unittest + +from juju.utils import generate_user_controller_access_token + + +class TestRegistrationString(unittest.TestCase): + def test_generate_user_controller_access_token(self): + controller_name = "localhost-localhost" + endpoints = ["192.168.1.1:17070", "192.168.1.2:17070", "192.168.1.3:17070"] + username = "test-01234" + secret_key = "paNZrqOw51ONk1kTER6rkm4hdPcg5VgC/dzXYxtUZaM=" + reg_string = generate_user_controller_access_token(username, endpoints, secret_key, controller_name) + assert reg_string == b"MH4TCnRlc3QtMDEyMzQwORMRMTkyLjE2OC4xLjE6MTcwNzATETE5Mi4xNjguMS4yOjE3MDcwExExOTIuMTY4" \ + b"LjEuMzoxNzA3MAQgpaNZrqOw51ONk1kTER6rkm4hdPcg5VgC_dzXYxtUZaMTE2xvY2FsaG9zdC1sb2NhbGhvc3QA" diff --git a/tox.ini b/tox.ini index 789bbeb..350a1fc 100644 --- a/tox.ini +++ b/tox.ini @@ -4,25 +4,63 @@ # and then run "tox" from this directory. [tox] -envlist = py35 +envlist = lint,py3 skipsdist=True +[pytest] +markers = + serial: mark a test that must run by itself + [testenv] +basepython=python3 usedevelop=True +# for testing with other python versions +commands = py.test --tb native -ra -v -s -n auto -k 'not integration' -m 'not serial' {posargs} passenv = HOME + TEST_AGENTS deps = + asynctest + ipdb + mock pytest pytest-asyncio pytest-xdist - mock - asynctest - ipdb + Twine + # use fork to pick up fix for https://github.com/aaugustin/websockets/pull/528 + git+https://github.com/johnsca/websockets@bug/client-redirects#egg=websockets + +[testenv:py3] +# default tox env excludes integration and serial tests +commands = + # These need to be installed in a specific order + pip install urllib3==1.22 + pip install pylxd + py.test --tb native -ra -v -s -n auto -k 'not integration' -m 'not serial' {posargs} -[testenv:py35] -# default tox env excludes integration tests -commands = py.test -ra -v -s -x -n auto -k 'not integration' {posargs} +[testenv:lint] +envdir = {toxworkdir}/py3 +commands = + flake8 --ignore E501,W504 {posargs} juju tests +deps = + flake8 [testenv:integration] -basepython=python3 -commands = py.test -ra -v -s -x -n auto {posargs} +envdir = {toxworkdir}/py3 +commands = + # These need to be installed in a specific order + pip install urllib3==1.22 + pip install pylxd + py.test --tb native -ra -v -s -n auto -k 'integration' -m 'not serial' {posargs} + +[testenv:serial] +# tests that can't be run in parallel +envdir = {toxworkdir}/py3 +commands = py.test --tb native -ra -v -s {posargs:-m 'serial'} + +[testenv:example] +envdir = {toxworkdir}/py3 +commands = python {posargs} + +[flake8] +exclude = juju/client/_* -- 2.17.1