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
diff --git a/.gitignore b/.gitignore
index 866a785..6d00fec 100644
--- a/.gitignore
+++ b/.gitignore
@@ -10,3 +10,6 @@
.\#*
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 @@
.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 @@
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 @@
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 <http://www.gnu.org/licenses/>.
+# 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,17 +11,30 @@
-----------------
.. toctree::
+ :caption: Overview
:glob:
:maxdepth: 3
narrative/index
- API Docs <api/modules>
- Internal API Docs <api/juju.client>
+
+
+.. toctree::
+ :caption: API Documentation
+ :glob:
+ :maxdepth: 3
+
+ api/modules
+ api/juju.client
+
+.. toctree::
+ :caption: Project
+ :glob:
+ :maxdepth: 3
+
upstream-updates/index
+ changelog
-.. include:: changelog.rst
-
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 @@
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 @@
from juju.controller import Controller
controller = Controller()
- await controller.connect_current()
+ await controller.connect()
Connecting to a Named Controller
@@ -33,68 +33,60 @@
from juju.controller import Controller
controller = Controller()
- await controller.connect_controller('mycontroller')
+ await controller.connect('mycontroller')
-Connecting with Username/Password Authentication
-------------------------------------------------
+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
+
+ 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)
+
+
+
+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.
+endpoint url and credentials directly. This method does NOT require the
+Juju CLI client to be installed.
.. code:: python
- from juju.controller import Controller
-
controller = Controller()
-
- controller_endpoint = '10.0.4.171:17070'
- username = 'admin'
- password = 'f53f08cfc32a2e257fe5393271d89d62'
-
- # Left out for brevity, but if you have a cert string you should pass it in.
- # You can copy the cert from the output of The `juju show-controller`
- # command.
- cacert = None
-
await controller.connect(
- controller_endpoint,
- username,
- password,
- cacert,
- )
-
-
-Connecting with Macaroon Authentication
----------------------------------------
-To connect to a shared controller, you'll need
-to use macaroon authentication. The simplest example is shown below, and uses
-already-discharged macaroons from the local filesystem. This will work if you
-have the Juju CLI installed.
-
-.. note::
-
- The library does not yet contain support for fetching and discharging
- macaroons. Until it does, if you want to use macaroon auth, you'll need
- to supply already-discharged macaroons yourself.
-
-.. code:: python
-
- from juju.client.connection import get_macaroons()
- from juju.controller import Controller
-
- controller = Controller()
-
- controller_endpoint = '10.0.4.171:17070'
- username = None
- password = None
- cacert = None
- macaroons = get_macaroons()
-
- await controller.connect(
- controller_endpoint,
- username,
- password,
- cacert,
- macaroons,
+ 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 @@
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 @@
.. 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 @@
.. code:: python
- # $ juju switch
- # juju-2.0.1:admin/libjuju
+ model = Model()
+ await model.connect('juju-2.0.1:admin/libjuju')
- from juju.model import Model
+
+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
model = Model()
- await model.connect_model('juju-2.0.1:admin/libjuju')
+ 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",
+ },
+ ])
+
+ # or with a bakery client
+ from macaroonbakery.httpbakery import Client
+ from http.cookiejar import FileCookieJar
+
+ bakery_client=Client()
+ bakery_client.cookies = FileCookieJar('cookies.txt')
+ model = Model()
+ await model.connect(bakery_client=bakery_client)
+
-Connecting with Username/Password Authentication
-------------------------------------------------
+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.
+endpoint url, model UUID, and credentials directly. This method does NOT
+require the Juju CLI client to be installed.
.. code:: python
from juju.model import Model
model = Model()
-
- controller_endpoint = '10.0.4.171:17070'
- model_uuid = 'e8399ac7-078c-4817-8e5e-32316d55b083'
- username = 'admin'
- password = 'f53f08cfc32a2e257fe5393271d89d62'
-
- # Left out for brevity, but if you have a cert string you should pass it in.
- # You can copy the cert from the output of The `juju show-controller`
- # command.
- cacert = None
-
await model.connect(
- controller_endpoint,
- model_uuid,
- username,
- password,
- cacert,
- )
-
-
-Connecting with Macaroon Authentication
----------------------------------------
-To connect to a shared model, or a model an a shared controller, you'll need
-to use macaroon authentication. The simplest example is shown below, and uses
-already-discharged macaroons from the local filesystem. This will work if you
-have the Juju CLI installed.
-
-.. note::
-
- The library does not yet contain support for fetching and discharging
- macaroons. Until it does, if you want to use macaroon auth, you'll need
- to supply already-discharged macaroons yourself.
-
-.. code:: python
-
- from juju.client.connection import get_macaroons()
- from juju.model import Model
-
- model = Model()
-
- controller_endpoint = '10.0.4.171:17070'
- model_uuid = 'e8399ac7-078c-4817-8e5e-32316d55b083'
- username = None
- password = None
- cacert = None
- macaroons = get_macaroons()
-
- await model.connect(
- controller_endpoint,
- model_uuid,
- username,
- password,
- cacert,
- macaroons,
+ 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 @@
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 @@
------------------------------
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 @@
# 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 @@
----------
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 @@
# 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 @@
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 @@
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 <nil>
+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 @@
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 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 @@
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 @@
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 @@
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 @@
3. Deploys a charm and prints its config and constraints
"""
-import asyncio
import logging
from juju.model import Model
@@ -19,8 +18,8 @@
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 @@
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 @@
5. Destroys the model
"""
-import asyncio
import logging
from juju.controller import Controller
@@ -17,7 +16,8 @@
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 @@
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 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 @@
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 @@
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 @@
3. Runs forever (kill with Ctrl-C)
"""
-import asyncio
-
from juju.model import Model
from juju import loop
@@ -21,7 +19,8 @@
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 @@
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 @@
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 @@
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 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
@@ -38,6 +52,24 @@
]
@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 @@
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 @@
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()
+ 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
- def get_resources(self, details=False):
+ 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 @@
)
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 @@
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 @@
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 @@
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 @@
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<version>.py file.
+ """
+ Given a facade name and version, attempt to pull that facade out
+ of the correct client<version>.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 @@
@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 @@
pass
+class ActionPrunerFacade(TypeFactory):
+ pass
+
+
class AgentFacade(TypeFactory):
pass
@@ -81,6 +96,10 @@
pass
+class ApplicationOffersFacade(TypeFactory):
+ pass
+
+
class ApplicationRelationsWatcherFacade(TypeFactory):
pass
@@ -101,6 +120,26 @@
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 @@
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 @@
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 @@
pass
+class ModelUpgraderFacade(TypeFactory):
+ pass
+
+
class NotifyWatcherFacade(TypeFactory):
pass
+class OfferStatusWatcherFacade(TypeFactory):
+ pass
+
+
class PayloadsFacade(TypeFactory):
pass
@@ -281,6 +356,10 @@
pass
+class RelationStatusWatcherFacade(TypeFactory):
+ pass
+
+
class RelationUnitsWatcherFacade(TypeFactory):
pass
@@ -289,6 +368,10 @@
pass
+class RemoteRelationsFacade(TypeFactory):
+ pass
+
+
class RemoteRelationsWatcherFacade(TypeFactory):
pass
@@ -353,6 +436,10 @@
pass
+class UpgradeSeriesFacade(TypeFactory):
+ pass
+
+
class UpgraderFacade(TypeFactory):
pass
@@ -361,6 +448,10 @@
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._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 @@
'''
# 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 @@
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 @@
'''
# 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 @@
'''
# 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 @@
'''
# 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 @@
@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 @@
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 @@
'''
# 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 @@
'''
# 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 @@
'''
# 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 @@
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 @@
'''
# 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 @@
'''
# 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 @@
'''
# 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,17 +598,1582 @@
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 CAASAgentFacade(Type):
+ name = 'CAASAgent'
+ version = 1
+ schema = {'definitions': {'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'},
+ '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'},
+ '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'},
+ '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'},
+ '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'},
+ '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'},
+ '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'},
+ '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'},
+ 'EntitiesVersion': {'additionalProperties': False,
+ 'properties': {'agent-tools': {'items': {'$ref': '#/definitions/EntityVersion'},
+ 'type': 'array'}},
+ 'required': ['agent-tools'],
+ 'type': 'object'},
+ 'Entity': {'additionalProperties': False,
+ 'properties': {'tag': {'type': 'string'}},
+ 'required': ['tag'],
+ 'type': 'object'},
+ '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'},
+ '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
@@ -1218,11 +2921,14 @@
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='Client', request='APIHostPorts', version=1, params=_params)
+ msg = dict(type='Client',
+ request='APIHostPorts',
+ version=1,
+ params=_params)
reply = await self.rpc(msg)
return reply
@@ -1237,7 +2943,10 @@
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='Client', request='AbortCurrentUpgrade', version=1, params=_params)
+ msg = dict(type='Client',
+ request='AbortCurrentUpgrade',
+ version=1,
+ params=_params)
reply = await self.rpc(msg)
return reply
@@ -1253,7 +2962,10 @@
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='Client', request='AddCharm', version=1, params=_params)
+ msg = dict(type='Client',
+ request='AddCharm',
+ version=1,
+ params=_params)
_params['channel'] = channel
_params['url'] = url
reply = await self.rpc(msg)
@@ -1271,7 +2983,10 @@
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='Client', request='AddCharmWithAuthorization', version=1, params=_params)
+ msg = dict(type='Client',
+ request='AddCharmWithAuthorization',
+ version=1,
+ params=_params)
_params['channel'] = channel
_params['macaroon'] = macaroon
_params['url'] = url
@@ -1283,12 +2998,15 @@
@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='Client', request='AddMachines', version=1, params=_params)
+ msg = dict(type='Client',
+ request='AddMachines',
+ version=1,
+ params=_params)
_params['params'] = params
reply = await self.rpc(msg)
return reply
@@ -1298,12 +3016,15 @@
@ReturnMapping(AddMachinesResults)
async def AddMachinesV2(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='Client', request='AddMachinesV2', version=1, params=_params)
+ msg = dict(type='Client',
+ request='AddMachinesV2',
+ version=1,
+ params=_params)
_params['params'] = params
reply = await self.rpc(msg)
return reply
@@ -1318,7 +3039,10 @@
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='Client', request='AgentVersion', version=1, params=_params)
+ msg = dict(type='Client',
+ request='AgentVersion',
+ version=1,
+ params=_params)
reply = await self.rpc(msg)
return reply
@@ -1329,11 +3053,14 @@
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='Client', request='CACert', version=1, params=_params)
+ msg = dict(type='Client',
+ request='CACert',
+ version=1,
+ params=_params)
reply = await self.rpc(msg)
return reply
@@ -1344,12 +3071,15 @@
async def DestroyMachines(self, force, machine_names):
'''
force : bool
- machine_names : typing.Sequence<+T_co>[str]
+ 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)
+ msg = dict(type='Client',
+ request='DestroyMachines',
+ version=1,
+ params=_params)
_params['force'] = force
_params['machine-names'] = machine_names
reply = await self.rpc(msg)
@@ -1365,11 +3095,14 @@
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='Client', request='FindTools', version=1, params=_params)
+ msg = dict(type='Client',
+ request='FindTools',
+ version=1,
+ params=_params)
_params['arch'] = arch
_params['major'] = major
_params['minor'] = minor
@@ -1383,12 +3116,15 @@
@ReturnMapping(FullStatus)
async def FullStatus(self, patterns):
'''
- patterns : typing.Sequence<+T_co>[str]
- Returns -> typing.Union[_ForwardRef('ModelStatusInfo'), typing.Sequence<+T_co>[~RelationStatus]<~RelationStatus>, typing.Mapping<~KT, +VT_co>[str, ~RemoteApplicationStatus]<~RemoteApplicationStatus>]
+ 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)
+ msg = dict(type='Client',
+ request='FullStatus',
+ version=1,
+ params=_params)
_params['patterns'] = patterns
reply = await self.rpc(msg)
return reply
@@ -1399,11 +3135,14 @@
async def GetBundleChanges(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='Client', request='GetBundleChanges', version=1, params=_params)
+ msg = dict(type='Client',
+ request='GetBundleChanges',
+ version=1,
+ params=_params)
_params['yaml'] = yaml
reply = await self.rpc(msg)
return reply
@@ -1418,7 +3157,10 @@
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='Client', request='GetModelConstraints', version=1, params=_params)
+ msg = dict(type='Client',
+ request='GetModelConstraints',
+ version=1,
+ params=_params)
reply = await self.rpc(msg)
return reply
@@ -1428,12 +3170,15 @@
@ReturnMapping(AddMachinesResults)
async def InjectMachines(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='Client', request='InjectMachines', version=1, params=_params)
+ msg = dict(type='Client',
+ request='InjectMachines',
+ version=1,
+ params=_params)
_params['params'] = params
reply = await self.rpc(msg)
return reply
@@ -1444,11 +3189,14 @@
async def ModelGet(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='Client', request='ModelGet', version=1, params=_params)
+ msg = dict(type='Client',
+ request='ModelGet',
+ version=1,
+ params=_params)
reply = await self.rpc(msg)
return reply
@@ -1459,11 +3207,14 @@
async def ModelInfo(self):
'''
- 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='Client', request='ModelInfo', version=1, params=_params)
+ msg = dict(type='Client',
+ request='ModelInfo',
+ version=1,
+ params=_params)
reply = await self.rpc(msg)
return reply
@@ -1473,12 +3224,15 @@
@ReturnMapping(None)
async def ModelSet(self, config):
'''
- config : typing.Mapping<~KT, +VT_co>[str, typing.Any]
+ 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)
+ msg = dict(type='Client',
+ request='ModelSet',
+ version=1,
+ params=_params)
_params['config'] = config
reply = await self.rpc(msg)
return reply
@@ -1488,12 +3242,15 @@
@ReturnMapping(None)
async def ModelUnset(self, keys):
'''
- keys : typing.Sequence<+T_co>[str]
+ keys : typing.Sequence[str]
Returns -> None
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='Client', request='ModelUnset', version=1, params=_params)
+ msg = dict(type='Client',
+ request='ModelUnset',
+ version=1,
+ params=_params)
_params['keys'] = keys
reply = await self.rpc(msg)
return reply
@@ -1504,11 +3261,14 @@
async def ModelUserInfo(self):
'''
- Returns -> typing.Sequence<+T_co>[~ModelUserInfoResult]<~ModelUserInfoResult>
+ Returns -> typing.Sequence[~ModelUserInfoResult]
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='Client', request='ModelUserInfo', version=1, params=_params)
+ msg = dict(type='Client',
+ request='ModelUserInfo',
+ version=1,
+ params=_params)
reply = await self.rpc(msg)
return reply
@@ -1523,7 +3283,10 @@
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='Client', request='PrivateAddress', version=1, params=_params)
+ msg = dict(type='Client',
+ request='PrivateAddress',
+ version=1,
+ params=_params)
_params['target'] = target
reply = await self.rpc(msg)
return reply
@@ -1541,7 +3304,10 @@
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='Client', request='ProvisioningScript', version=1, params=_params)
+ 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
@@ -1559,7 +3325,10 @@
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='Client', request='PublicAddress', version=1, params=_params)
+ msg = dict(type='Client',
+ request='PublicAddress',
+ version=1,
+ params=_params)
_params['target'] = target
reply = await self.rpc(msg)
return reply
@@ -1569,12 +3338,15 @@
@ReturnMapping(ResolveCharmResults)
async def ResolveCharms(self, references):
'''
- references : typing.Sequence<+T_co>[str]
- Returns -> typing.Sequence<+T_co>[~ResolveCharmResult]<~ResolveCharmResult>
+ 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)
+ msg = dict(type='Client',
+ request='ResolveCharms',
+ version=1,
+ params=_params)
_params['references'] = references
reply = await self.rpc(msg)
return reply
@@ -1590,7 +3362,10 @@
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='Client', request='Resolved', version=1, params=_params)
+ msg = dict(type='Client',
+ request='Resolved',
+ version=1,
+ params=_params)
_params['retry'] = retry
_params['unit-name'] = unit_name
reply = await self.rpc(msg)
@@ -1601,12 +3376,15 @@
@ReturnMapping(ErrorResults)
async def RetryProvisioning(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='Client', request='RetryProvisioning', version=1, params=_params)
+ msg = dict(type='Client',
+ request='RetryProvisioning',
+ version=1,
+ params=_params)
_params['entities'] = entities
reply = await self.rpc(msg)
return reply
@@ -1621,7 +3399,10 @@
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='Client', request='SLALevel', version=1, params=_params)
+ msg = dict(type='Client',
+ request='SLALevel',
+ version=1,
+ params=_params)
reply = await self.rpc(msg)
return reply
@@ -1636,7 +3417,10 @@
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='Client', request='SetModelAgentVersion', version=1, params=_params)
+ msg = dict(type='Client',
+ request='SetModelAgentVersion',
+ version=1,
+ params=_params)
_params['version'] = version
reply = await self.rpc(msg)
return reply
@@ -1652,7 +3436,10 @@
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='Client', request='SetModelConstraints', version=1, params=_params)
+ msg = dict(type='Client',
+ request='SetModelConstraints',
+ version=1,
+ params=_params)
_params['application'] = application
_params['constraints'] = constraints
reply = await self.rpc(msg)
@@ -1663,13 +3450,16 @@
@ReturnMapping(None)
async def SetSLALevel(self, creds, level):
'''
- creds : typing.Sequence<+T_co>[int]
+ 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)
+ msg = dict(type='Client',
+ request='SetSLALevel',
+ version=1,
+ params=_params)
_params['creds'] = creds
_params['level'] = level
reply = await self.rpc(msg)
@@ -1680,12 +3470,15 @@
@ReturnMapping(StatusHistoryResults)
async def StatusHistory(self, requests):
'''
- requests : typing.Sequence<+T_co>[~StatusHistoryRequest]<~StatusHistoryRequest>
- Returns -> typing.Sequence<+T_co>[~StatusHistoryResult]<~StatusHistoryResult>
+ 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)
+ msg = dict(type='Client',
+ request='StatusHistory',
+ version=1,
+ params=_params)
_params['requests'] = requests
reply = await self.rpc(msg)
return reply
@@ -1700,7 +3493,10 @@
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='Client', request='WatchAll', version=1, params=_params)
+ msg = dict(type='Client',
+ request='WatchAll',
+ version=1,
+ params=_params)
reply = await self.rpc(msg)
return reply
@@ -1896,12 +3692,15 @@
@ReturnMapping(CloudResults)
async def Cloud(self, entities):
'''
- entities : typing.Sequence<+T_co>[~Entity]<~Entity>
- Returns -> typing.Sequence<+T_co>[~CloudResult]<~CloudResult>
+ 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)
+ msg = dict(type='Cloud',
+ request='Cloud',
+ version=1,
+ params=_params)
_params['entities'] = entities
reply = await self.rpc(msg)
return reply
@@ -1912,11 +3711,14 @@
async def Clouds(self):
'''
- Returns -> typing.Mapping<~KT, +VT_co>[str, ~Cloud]<~Cloud>
+ Returns -> typing.Mapping[str, ~Cloud]
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='Cloud', request='Clouds', version=1, params=_params)
+ msg = dict(type='Cloud',
+ request='Clouds',
+ version=1,
+ params=_params)
reply = await self.rpc(msg)
return reply
@@ -1926,12 +3728,15 @@
@ReturnMapping(CloudCredentialResults)
async def Credential(self, entities):
'''
- entities : typing.Sequence<+T_co>[~Entity]<~Entity>
- Returns -> typing.Sequence<+T_co>[~CloudCredentialResult]<~CloudCredentialResult>
+ 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)
+ msg = dict(type='Cloud',
+ request='Credential',
+ version=1,
+ params=_params)
_params['entities'] = entities
reply = await self.rpc(msg)
return reply
@@ -1946,7 +3751,10 @@
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='Cloud', request='DefaultCloud', version=1, params=_params)
+ msg = dict(type='Cloud',
+ request='DefaultCloud',
+ version=1,
+ params=_params)
reply = await self.rpc(msg)
return reply
@@ -1956,12 +3764,15 @@
@ReturnMapping(InstanceTypesResults)
async def InstanceTypes(self, constraints):
'''
- constraints : typing.Sequence<+T_co>[~CloudInstanceTypesConstraint]<~CloudInstanceTypesConstraint>
- Returns -> typing.Sequence<+T_co>[~InstanceTypesResult]<~InstanceTypesResult>
+ 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)
+ msg = dict(type='Cloud',
+ request='InstanceTypes',
+ version=1,
+ params=_params)
_params['constraints'] = constraints
reply = await self.rpc(msg)
return reply
@@ -1971,12 +3782,15 @@
@ReturnMapping(ErrorResults)
async def RevokeCredentials(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='Cloud', request='RevokeCredentials', version=1, params=_params)
+ msg = dict(type='Cloud',
+ request='RevokeCredentials',
+ version=1,
+ params=_params)
_params['entities'] = entities
reply = await self.rpc(msg)
return reply
@@ -1986,12 +3800,15 @@
@ReturnMapping(ErrorResults)
async def UpdateCredentials(self, credentials):
'''
- credentials : typing.Sequence<+T_co>[~UpdateCloudCredential]<~UpdateCloudCredential>
- Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
+ 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)
+ msg = dict(type='Cloud',
+ request='UpdateCredentials',
+ version=1,
+ params=_params)
_params['credentials'] = credentials
reply = await self.rpc(msg)
return reply
@@ -2001,18 +3818,591 @@
@ReturnMapping(StringsResults)
async def UserCredentials(self, user_clouds):
'''
- user_clouds : typing.Sequence<+T_co>[~UserCloud]<~UserCloud>
- Returns -> typing.Sequence<+T_co>[~StringsResult]<~StringsResult>
+ 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)
+ 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'},
+ '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'},
+ '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'}},
+ 'required': ['name',
+ 'role',
+ 'interface',
+ 'limit'],
+ 'type': 'object'},
+ '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'},
+ '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'},
+ 'RemoteRelationsChanges': {'additionalProperties': False,
+ 'properties': {'changes': {'items': {'$ref': '#/definitions/RemoteRelationChangeEvent'},
+ 'type': 'array'}},
+ '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'},
+ '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'},
+ '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'},
+ '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(ErrorResults)
+ async def PublishIngressNetworkChanges(self, changes):
+ '''
+ changes : typing.Sequence[~IngressNetworksChangeEvent]
+ Returns -> typing.Sequence[~ErrorResult]
+ '''
+ # map input types to rpc msg
+ _params = dict()
+ msg = dict(type='CrossModelRelations',
+ request='PublishIngressNetworkChanges',
+ version=1,
+ params=_params)
+ _params['changes'] = changes
+ reply = await self.rpc(msg)
+ return reply
+
+
+
+ @ReturnMapping(ErrorResults)
+ async def PublishRelationChanges(self, changes):
+ '''
+ changes : typing.Sequence[~RemoteRelationChangeEvent]
+ Returns -> typing.Sequence[~ErrorResult]
+ '''
+ # map input types to rpc msg
+ _params = dict()
+ msg = dict(type='CrossModelRelations',
+ request='PublishRelationChanges',
+ version=1,
+ params=_params)
+ _params['changes'] = changes
+ reply = await self.rpc(msg)
+ return reply
+
+
+
+ @ReturnMapping(RegisterRemoteRelationResults)
+ async def RegisterRemoteRelations(self, relations):
+ '''
+ relations : typing.Sequence[~RegisterRemoteRelationArg]
+ Returns -> typing.Sequence[~RegisterRemoteRelationResult]
+ '''
+ # map input types to rpc msg
+ _params = dict()
+ msg = dict(type='CrossModelRelations',
+ request='RegisterRemoteRelations',
+ version=1,
+ params=_params)
+ _params['relations'] = relations
+ reply = await self.rpc(msg)
+ return reply
+
+
+
+ @ReturnMapping(SettingsResults)
+ async def RelationUnitSettings(self, relation_units):
+ '''
+ relation_units : typing.Sequence[~RemoteRelationUnit]
+ Returns -> typing.Sequence[~SettingsResult]
+ '''
+ # map input types to rpc msg
+ _params = dict()
+ msg = dict(type='CrossModelRelations',
+ request='RelationUnitSettings',
+ version=1,
+ params=_params)
+ _params['relation-units'] = relation_units
+ reply = await self.rpc(msg)
+ return reply
+
+
+
+ @ReturnMapping(StringsWatchResults)
+ async def WatchEgressAddressesForRelations(self, args):
+ '''
+ args : typing.Sequence[~RemoteEntityArg]
+ Returns -> typing.Sequence[~StringsWatchResult]
+ '''
+ # map input types to rpc msg
+ _params = dict()
+ msg = dict(type='CrossModelRelations',
+ request='WatchEgressAddressesForRelations',
+ version=1,
+ params=_params)
+ _params['args'] = args
+ reply = await self.rpc(msg)
+ return reply
+
+
+
+ @ReturnMapping(OfferStatusWatchResults)
+ async def WatchOfferStatus(self, args):
+ '''
+ args : typing.Sequence[~OfferArg]
+ Returns -> typing.Sequence[~OfferStatusWatchResult]
+ '''
+ # map input types to rpc msg
+ _params = dict()
+ msg = dict(type='CrossModelRelations',
+ request='WatchOfferStatus',
+ version=1,
+ params=_params)
+ _params['args'] = args
+ reply = await self.rpc(msg)
+ return reply
+
+
+
+ @ReturnMapping(RelationUnitsWatchResults)
+ async def WatchRelationUnits(self, args):
+ '''
+ args : typing.Sequence[~RemoteEntityArg]
+ Returns -> typing.Sequence[~RelationUnitsWatchResult]
+ '''
+ # map input types to rpc msg
+ _params = dict()
+ msg = dict(type='CrossModelRelations',
+ request='WatchRelationUnits',
+ version=1,
+ params=_params)
+ _params['args'] = args
+ reply = await self.rpc(msg)
+ return reply
+
+
+
+ @ReturnMapping(RelationStatusWatchResults)
+ async def WatchRelationsSuspendedStatus(self, args):
+ '''
+ args : typing.Sequence[~RemoteEntityArg]
+ Returns -> typing.Sequence[~RelationLifeSuspendedStatusWatchResult]
+ '''
+ # map input types to rpc msg
+ _params = dict()
+ msg = dict(type='CrossModelRelations',
+ request='WatchRelationsSuspendedStatus',
+ version=1,
+ params=_params)
+ _params['args'] = args
+ reply = await self.rpc(msg)
+ return reply
+
+
+
class DeployerFacade(Type):
name = 'Deployer'
version = 1
@@ -2029,18 +4419,10 @@
'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': 'array'}},
+ 'required': ['api-addresses'],
'type': 'object'},
'Entities': {'additionalProperties': False,
'properties': {'entities': {'items': {'$ref': '#/definitions/Entity'},
@@ -2143,8 +4525,6 @@
'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'},
@@ -2161,8 +4541,6 @@
'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'},
@@ -2178,11 +4556,14 @@
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='Deployer', request='APIAddresses', version=1, params=_params)
+ msg = dict(type='Deployer',
+ request='APIAddresses',
+ version=1,
+ params=_params)
reply = await self.rpc(msg)
return reply
@@ -2193,26 +4574,14 @@
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='Deployer', request='APIHostPorts', version=1, params=_params)
-
- reply = await self.rpc(msg)
- return reply
-
-
-
- @ReturnMapping(BytesResult)
- async def CACert(self):
- '''
-
- Returns -> typing.Sequence<+T_co>[int]
- '''
- # map input types to rpc msg
- _params = dict()
- msg = dict(type='Deployer', request='CACert', version=1, params=_params)
+ msg = dict(type='Deployer',
+ request='APIHostPorts',
+ version=1,
+ params=_params)
reply = await self.rpc(msg)
return reply
@@ -2223,11 +4592,14 @@
async def ConnectionInfo(self):
'''
- Returns -> typing.Sequence<+T_co>[str]
+ Returns -> typing.Sequence[str]
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='Deployer', request='ConnectionInfo', version=1, params=_params)
+ msg = dict(type='Deployer',
+ request='ConnectionInfo',
+ version=1,
+ params=_params)
reply = await self.rpc(msg)
return reply
@@ -2237,12 +4609,15 @@
@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='Deployer', request='Life', version=1, params=_params)
+ msg = dict(type='Deployer',
+ request='Life',
+ version=1,
+ params=_params)
_params['entities'] = entities
reply = await self.rpc(msg)
return reply
@@ -2257,7 +4632,10 @@
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='Deployer', request='ModelUUID', version=1, params=_params)
+ msg = dict(type='Deployer',
+ request='ModelUUID',
+ version=1,
+ params=_params)
reply = await self.rpc(msg)
return reply
@@ -2267,12 +4645,15 @@
@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='Deployer', request='Remove', version=1, params=_params)
+ msg = dict(type='Deployer',
+ request='Remove',
+ version=1,
+ params=_params)
_params['entities'] = entities
reply = await self.rpc(msg)
return reply
@@ -2282,12 +4663,15 @@
@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='Deployer', request='SetPasswords', version=1, params=_params)
+ msg = dict(type='Deployer',
+ request='SetPasswords',
+ version=1,
+ params=_params)
_params['changes'] = changes
reply = await self.rpc(msg)
return reply
@@ -2297,42 +4681,33 @@
@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='Deployer', request='SetStatus', version=1, params=_params)
+ msg = dict(type='Deployer',
+ request='SetStatus',
+ version=1,
+ params=_params)
_params['entities'] = entities
reply = await self.rpc(msg)
return reply
- @ReturnMapping(StringsResult)
- async def StateAddresses(self):
- '''
-
- Returns -> typing.Union[_ForwardRef('Error'), typing.Sequence<+T_co>[str]]
- '''
- # map input types to rpc msg
- _params = dict()
- msg = dict(type='Deployer', request='StateAddresses', version=1, params=_params)
-
- reply = await self.rpc(msg)
- return reply
-
-
-
@ReturnMapping(ErrorResults)
async def UpdateStatus(self, entities):
'''
- entities : typing.Sequence<+T_co>[~EntityStatusArgs]<~EntityStatusArgs>
- Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
+ entities : typing.Sequence[~EntityStatusArgs]
+ Returns -> typing.Sequence[~ErrorResult]
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='Deployer', request='UpdateStatus', version=1, params=_params)
+ msg = dict(type='Deployer',
+ request='UpdateStatus',
+ version=1,
+ params=_params)
_params['entities'] = entities
reply = await self.rpc(msg)
return reply
@@ -2347,7 +4722,10 @@
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='Deployer', request='WatchAPIHostPorts', version=1, params=_params)
+ msg = dict(type='Deployer',
+ request='WatchAPIHostPorts',
+ version=1,
+ params=_params)
reply = await self.rpc(msg)
return reply
@@ -2357,18 +4735,314 @@
@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='Deployer', request='WatchUnits', version=1, params=_params)
+ 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'],
+ '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'},
+ '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'},
+ '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'},
+ 'SetExternalControllerInfo': {'properties': {'Params': {'$ref': '#/definitions/SetExternalControllersInfoParams'},
+ 'Result': {'$ref': '#/definitions/ErrorResults'}},
+ 'type': 'object'},
+ 'WatchExternalControllers': {'properties': {'Result': {'$ref': '#/definitions/StringsWatchResults'}},
+ 'type': 'object'}},
+ 'type': 'object'}
+
+
+ @ReturnMapping(ExternalControllerInfoResults)
+ async def ExternalControllerInfo(self, entities):
+ '''
+ entities : typing.Sequence[~Entity]
+ Returns -> typing.Sequence[~ExternalControllerInfoResult]
+ '''
+ # map input types to rpc msg
+ _params = dict()
+ msg = dict(type='ExternalControllerUpdater',
+ request='ExternalControllerInfo',
+ version=1,
+ params=_params)
+ _params['entities'] = entities
+ reply = await self.rpc(msg)
+ return reply
+
+
+
+ @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.Sequence[~StringsWatchResult]
+ '''
+ # map input types to rpc msg
+ _params = dict()
+ msg = dict(type='ExternalControllerUpdater',
+ request='WatchExternalControllers',
+ version=1,
+ params=_params)
+
+ reply = await self.rpc(msg)
+ return reply
+
+
+
+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):
+ '''
+
+ Returns -> typing.Sequence[~FanConfigEntry]
+ '''
+ # map input types to rpc msg
+ _params = dict()
+ msg = dict(type='FanConfigurer',
+ request='FanConfig',
+ version=1,
+ params=_params)
+
+ reply = await self.rpc(msg)
+ return reply
+
+
+
+ @ReturnMapping(NotifyWatchResult)
+ async def WatchForFanConfigChanges(self):
+ '''
+
+ Returns -> typing.Union[str, _ForwardRef('Error')]
+ '''
+ # map input types to rpc msg
+ _params = dict()
+ msg = dict(type='FanConfigurer',
+ request='WatchForFanConfigChanges',
+ version=1,
+ params=_params)
+
+ reply = await self.rpc(msg)
+ return reply
+
+
+
+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):
+ '''
+
+ Returns -> typing.Sequence[~FirewallRule]
+ '''
+ # map input types to rpc msg
+ _params = dict()
+ msg = dict(type='FirewallRules',
+ request='ListFirewallRules',
+ version=1,
+ params=_params)
+
+ reply = await self.rpc(msg)
+ return reply
+
+
+
+ @ReturnMapping(ErrorResults)
+ async def SetFirewallRules(self, args):
+ '''
+ args : typing.Sequence[~FirewallRule]
+ Returns -> typing.Sequence[~ErrorResult]
+ '''
+ # map input types to rpc msg
+ _params = dict()
+ 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
@@ -2411,12 +5085,15 @@
@ReturnMapping(ErrorResults)
async def ReportKeys(self, entity_keys):
'''
- entity_keys : typing.Sequence<+T_co>[~SSHHostKeys]<~SSHHostKeys>
- Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
+ entity_keys : typing.Sequence[~SSHHostKeys]
+ Returns -> typing.Sequence[~ErrorResult]
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='HostKeyReporter', request='ReportKeys', version=1, params=_params)
+ msg = dict(type='HostKeyReporter',
+ request='ReportKeys',
+ version=1,
+ params=_params)
_params['entity-keys'] = entity_keys
reply = await self.rpc(msg)
return reply
@@ -2493,13 +5170,16 @@
@ReturnMapping(ErrorResults)
async def AddKeys(self, ssh_keys, user):
'''
- ssh_keys : typing.Sequence<+T_co>[str]
+ ssh_keys : typing.Sequence[str]
user : str
- Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
+ Returns -> typing.Sequence[~ErrorResult]
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='KeyManager', request='AddKeys', 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)
@@ -2510,13 +5190,16 @@
@ReturnMapping(ErrorResults)
async def DeleteKeys(self, ssh_keys, user):
'''
- ssh_keys : typing.Sequence<+T_co>[str]
+ ssh_keys : typing.Sequence[str]
user : str
- Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
+ Returns -> typing.Sequence[~ErrorResult]
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='KeyManager', request='DeleteKeys', 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)
@@ -2527,13 +5210,16 @@
@ReturnMapping(ErrorResults)
async def ImportKeys(self, ssh_keys, user):
'''
- ssh_keys : typing.Sequence<+T_co>[str]
+ ssh_keys : typing.Sequence[str]
user : str
- Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
+ Returns -> typing.Sequence[~ErrorResult]
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='KeyManager', request='ImportKeys', 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)
@@ -2546,11 +5232,14 @@
'''
entities : Entities
mode : bool
- Returns -> typing.Sequence<+T_co>[~StringsResult]<~StringsResult>
+ Returns -> typing.Sequence[~StringsResult]
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='KeyManager', request='ListKeys', 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)
@@ -2613,12 +5302,15 @@
@ReturnMapping(StringsResults)
async def AuthorisedKeys(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='KeyUpdater', request='AuthorisedKeys', version=1, params=_params)
+ msg = dict(type='KeyUpdater',
+ request='AuthorisedKeys',
+ version=1,
+ params=_params)
_params['entities'] = entities
reply = await self.rpc(msg)
return reply
@@ -2628,12 +5320,15 @@
@ReturnMapping(NotifyWatchResults)
async def WatchAuthorisedKeys(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='KeyUpdater',
+ request='WatchAuthorisedKeys',
+ version=1,
+ params=_params)
_params['entities'] = entities
reply = await self.rpc(msg)
return reply
@@ -2695,12 +5390,15 @@
@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='LifeFlag', request='Life', version=1, params=_params)
+ msg = dict(type='LifeFlag',
+ request='Life',
+ version=1,
+ params=_params)
_params['entities'] = entities
reply = await self.rpc(msg)
return reply
@@ -2710,12 +5408,15 @@
@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='LifeFlag', request='Watch', version=1, params=_params)
+ msg = dict(type='LifeFlag',
+ request='Watch',
+ version=1,
+ params=_params)
_params['entities'] = entities
reply = await self.rpc(msg)
return reply
@@ -2792,12 +5493,15 @@
@ReturnMapping(LogForwardingGetLastSentResults)
async def GetLastSent(self, ids):
'''
- ids : typing.Sequence<+T_co>[~LogForwardingID]<~LogForwardingID>
- Returns -> typing.Sequence<+T_co>[~LogForwardingGetLastSentResult]<~LogForwardingGetLastSentResult>
+ ids : typing.Sequence[~LogForwardingID]
+ Returns -> typing.Sequence[~LogForwardingGetLastSentResult]
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='LogForwarding', request='GetLastSent', version=1, params=_params)
+ msg = dict(type='LogForwarding',
+ request='GetLastSent',
+ version=1,
+ params=_params)
_params['ids'] = ids
reply = await self.rpc(msg)
return reply
@@ -2807,12 +5511,15 @@
@ReturnMapping(ErrorResults)
async def SetLastSent(self, params):
'''
- params : typing.Sequence<+T_co>[~LogForwardingSetLastSentParam]<~LogForwardingSetLastSentParam>
- Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
+ params : typing.Sequence[~LogForwardingSetLastSentParam]
+ Returns -> typing.Sequence[~ErrorResult]
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='LogForwarding', request='SetLastSent', version=1, params=_params)
+ msg = dict(type='LogForwarding',
+ request='SetLastSent',
+ version=1,
+ params=_params)
_params['params'] = params
reply = await self.rpc(msg)
return reply
@@ -2874,12 +5581,15 @@
@ReturnMapping(StringResults)
async def LoggingConfig(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='Logger', request='LoggingConfig', version=1, params=_params)
+ msg = dict(type='Logger',
+ request='LoggingConfig',
+ version=1,
+ params=_params)
_params['entities'] = entities
reply = await self.rpc(msg)
return reply
@@ -2889,12 +5599,15 @@
@ReturnMapping(NotifyWatchResults)
async def WatchLoggingConfig(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='Logger', request='WatchLoggingConfig', version=1, params=_params)
+ msg = dict(type='Logger',
+ request='WatchLoggingConfig',
+ version=1,
+ params=_params)
_params['entities'] = entities
reply = await self.rpc(msg)
return reply
@@ -3016,12 +5729,15 @@
@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='MachineActions', request='Actions', version=1, params=_params)
+ msg = dict(type='MachineActions',
+ request='Actions',
+ version=1,
+ params=_params)
_params['entities'] = entities
reply = await self.rpc(msg)
return reply
@@ -3031,12 +5747,15 @@
@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='MachineActions', request='BeginActions', version=1, params=_params)
+ msg = dict(type='MachineActions',
+ request='BeginActions',
+ version=1,
+ params=_params)
_params['entities'] = entities
reply = await self.rpc(msg)
return reply
@@ -3046,12 +5765,15 @@
@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='MachineActions', request='FinishActions', version=1, params=_params)
+ msg = dict(type='MachineActions',
+ request='FinishActions',
+ version=1,
+ params=_params)
_params['results'] = results
reply = await self.rpc(msg)
return reply
@@ -3061,12 +5783,15 @@
@ReturnMapping(ActionsByReceivers)
async def RunningActions(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='MachineActions', request='RunningActions', version=1, params=_params)
+ msg = dict(type='MachineActions',
+ request='RunningActions',
+ version=1,
+ params=_params)
_params['entities'] = entities
reply = await self.rpc(msg)
return reply
@@ -3076,12 +5801,15 @@
@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='MachineActions', request='WatchActionNotifications', version=1, params=_params)
+ msg = dict(type='MachineActions',
+ request='WatchActionNotifications',
+ version=1,
+ params=_params)
_params['entities'] = entities
reply = await self.rpc(msg)
return reply
@@ -3170,12 +5898,15 @@
@ReturnMapping(EntitiesResults)
async def AllMachineRemovals(self, entities):
'''
- entities : typing.Sequence<+T_co>[~Entity]<~Entity>
- Returns -> typing.Sequence<+T_co>[~EntitiesResult]<~EntitiesResult>
+ 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)
+ msg = dict(type='MachineUndertaker',
+ request='AllMachineRemovals',
+ version=1,
+ params=_params)
_params['entities'] = entities
reply = await self.rpc(msg)
return reply
@@ -3185,12 +5916,15 @@
@ReturnMapping(None)
async def CompleteMachineRemovals(self, entities):
'''
- entities : typing.Sequence<+T_co>[~Entity]<~Entity>
+ entities : typing.Sequence[~Entity]
Returns -> None
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='MachineUndertaker', request='CompleteMachineRemovals', version=1, params=_params)
+ msg = dict(type='MachineUndertaker',
+ request='CompleteMachineRemovals',
+ version=1,
+ params=_params)
_params['entities'] = entities
reply = await self.rpc(msg)
return reply
@@ -3200,12 +5934,15 @@
@ReturnMapping(ProviderInterfaceInfoResults)
async def GetMachineProviderInterfaceInfo(self, entities):
'''
- entities : typing.Sequence<+T_co>[~Entity]<~Entity>
- Returns -> typing.Sequence<+T_co>[~ProviderInterfaceInfoResult]<~ProviderInterfaceInfoResult>
+ entities : typing.Sequence[~Entity]
+ Returns -> typing.Sequence[~ProviderInterfaceInfoResult]
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='MachineUndertaker', request='GetMachineProviderInterfaceInfo', version=1, params=_params)
+ msg = dict(type='MachineUndertaker',
+ request='GetMachineProviderInterfaceInfo',
+ version=1,
+ params=_params)
_params['entities'] = entities
reply = await self.rpc(msg)
return reply
@@ -3215,12 +5952,15 @@
@ReturnMapping(NotifyWatchResults)
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='MachineUndertaker', request='WatchMachineRemovals', version=1, params=_params)
+ msg = dict(type='MachineUndertaker',
+ request='WatchMachineRemovals',
+ version=1,
+ params=_params)
_params['entities'] = entities
reply = await self.rpc(msg)
return reply
@@ -3243,11 +5983,6 @@
'value': {'type': 'string'}},
'required': ['value', 'type', 'scope'],
'type': 'object'},
- 'BytesResult': {'additionalProperties': False,
- 'properties': {'result': {'items': {'type': 'integer'},
- 'type': 'array'}},
- 'required': ['result'],
- 'type': 'object'},
'Entities': {'additionalProperties': False,
'properties': {'entities': {'items': {'$ref': '#/definitions/Entity'},
'type': 'array'}},
@@ -3333,6 +6068,7 @@
'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'},
@@ -3408,8 +6144,6 @@
'type': 'object'},
'APIHostPorts': {'properties': {'Result': {'$ref': '#/definitions/APIHostPortsResult'}},
'type': 'object'},
- 'CACert': {'properties': {'Result': {'$ref': '#/definitions/BytesResult'}},
- 'type': 'object'},
'EnsureDead': {'properties': {'Params': {'$ref': '#/definitions/Entities'},
'Result': {'$ref': '#/definitions/ErrorResults'}},
'type': 'object'},
@@ -3447,11 +6181,14 @@
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='Machiner', request='APIAddresses', version=1, params=_params)
+ msg = dict(type='Machiner',
+ request='APIAddresses',
+ version=1,
+ params=_params)
reply = await self.rpc(msg)
return reply
@@ -3462,26 +6199,14 @@
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='Machiner', request='APIHostPorts', version=1, params=_params)
-
- reply = await self.rpc(msg)
- return reply
-
-
-
- @ReturnMapping(BytesResult)
- async def CACert(self):
- '''
-
- Returns -> typing.Sequence<+T_co>[int]
- '''
- # map input types to rpc msg
- _params = dict()
- msg = dict(type='Machiner', request='CACert', version=1, params=_params)
+ msg = dict(type='Machiner',
+ request='APIHostPorts',
+ version=1,
+ params=_params)
reply = await self.rpc(msg)
return reply
@@ -3491,12 +6216,15 @@
@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='Machiner', request='EnsureDead', version=1, params=_params)
+ msg = dict(type='Machiner',
+ request='EnsureDead',
+ version=1,
+ params=_params)
_params['entities'] = entities
reply = await self.rpc(msg)
return reply
@@ -3506,12 +6234,15 @@
@ReturnMapping(JobsResults)
async def Jobs(self, entities):
'''
- entities : typing.Sequence<+T_co>[~Entity]<~Entity>
- Returns -> typing.Sequence<+T_co>[~JobsResult]<~JobsResult>
+ entities : typing.Sequence[~Entity]
+ Returns -> typing.Sequence[~JobsResult]
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='Machiner', request='Jobs', version=1, params=_params)
+ msg = dict(type='Machiner',
+ request='Jobs',
+ version=1,
+ params=_params)
_params['entities'] = entities
reply = await self.rpc(msg)
return reply
@@ -3521,12 +6252,15 @@
@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='Machiner', request='Life', version=1, params=_params)
+ msg = dict(type='Machiner',
+ request='Life',
+ version=1,
+ params=_params)
_params['entities'] = entities
reply = await self.rpc(msg)
return reply
@@ -3541,7 +6275,10 @@
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='Machiner', request='ModelUUID', version=1, params=_params)
+ msg = dict(type='Machiner',
+ request='ModelUUID',
+ version=1,
+ params=_params)
reply = await self.rpc(msg)
return reply
@@ -3551,12 +6288,15 @@
@ReturnMapping(ErrorResults)
async def SetMachineAddresses(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='Machiner', request='SetMachineAddresses', version=1, params=_params)
+ msg = dict(type='Machiner',
+ request='SetMachineAddresses',
+ version=1,
+ params=_params)
_params['machine-addresses'] = machine_addresses
reply = await self.rpc(msg)
return reply
@@ -3566,13 +6306,16 @@
@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='Machiner', request='SetObservedNetworkConfig', version=1, params=_params)
+ msg = dict(type='Machiner',
+ request='SetObservedNetworkConfig',
+ version=1,
+ params=_params)
_params['config'] = config
_params['tag'] = tag
reply = await self.rpc(msg)
@@ -3583,12 +6326,15 @@
@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='Machiner', request='SetProviderNetworkConfig', version=1, params=_params)
+ msg = dict(type='Machiner',
+ request='SetProviderNetworkConfig',
+ version=1,
+ params=_params)
_params['entities'] = entities
reply = await self.rpc(msg)
return reply
@@ -3598,12 +6344,15 @@
@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='Machiner', request='SetStatus', version=1, params=_params)
+ msg = dict(type='Machiner',
+ request='SetStatus',
+ version=1,
+ params=_params)
_params['entities'] = entities
reply = await self.rpc(msg)
return reply
@@ -3613,12 +6362,15 @@
@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='Machiner', request='UpdateStatus', version=1, params=_params)
+ msg = dict(type='Machiner',
+ request='UpdateStatus',
+ version=1,
+ params=_params)
_params['entities'] = entities
reply = await self.rpc(msg)
return reply
@@ -3628,12 +6380,15 @@
@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='Machiner', request='Watch', version=1, params=_params)
+ msg = dict(type='Machiner',
+ request='Watch',
+ version=1,
+ params=_params)
_params['entities'] = entities
reply = await self.rpc(msg)
return reply
@@ -3648,7 +6403,10 @@
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='Machiner', request='WatchAPIHostPorts', version=1, params=_params)
+ msg = dict(type='Machiner',
+ request='WatchAPIHostPorts',
+ version=1,
+ params=_params)
reply = await self.rpc(msg)
return reply
@@ -3711,12 +6469,15 @@
@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='MeterStatus', request='GetMeterStatus', version=1, params=_params)
+ msg = dict(type='MeterStatus',
+ request='GetMeterStatus',
+ version=1,
+ params=_params)
_params['entities'] = entities
reply = await self.rpc(msg)
return reply
@@ -3726,12 +6487,15 @@
@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='MeterStatus', request='WatchMeterStatus', version=1, params=_params)
+ msg = dict(type='MeterStatus',
+ request='WatchMeterStatus',
+ version=1,
+ params=_params)
_params['entities'] = entities
reply = await self.rpc(msg)
return reply
@@ -3787,7 +6551,10 @@
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='MetricsManager', request='AddJujuMachineMetrics', version=1, params=_params)
+ msg = dict(type='MetricsManager',
+ request='AddJujuMachineMetrics',
+ version=1,
+ params=_params)
reply = await self.rpc(msg)
return reply
@@ -3797,12 +6564,15 @@
@ReturnMapping(ErrorResults)
async def CleanupOldMetrics(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='MetricsManager', request='CleanupOldMetrics', version=1, params=_params)
+ msg = dict(type='MetricsManager',
+ request='CleanupOldMetrics',
+ version=1,
+ params=_params)
_params['entities'] = entities
reply = await self.rpc(msg)
return reply
@@ -3812,12 +6582,15 @@
@ReturnMapping(ErrorResults)
async def SendMetrics(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='MetricsManager', request='SendMetrics', version=1, params=_params)
+ msg = dict(type='MetricsManager',
+ request='SendMetrics',
+ version=1,
+ params=_params)
_params['entities'] = entities
reply = await self.rpc(msg)
return reply
@@ -3878,12 +6651,15 @@
@ReturnMapping(PhaseResults)
async def Phase(self, entities):
'''
- entities : typing.Sequence<+T_co>[~Entity]<~Entity>
- Returns -> typing.Sequence<+T_co>[~PhaseResult]<~PhaseResult>
+ 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)
+ msg = dict(type='MigrationFlag',
+ request='Phase',
+ version=1,
+ params=_params)
_params['entities'] = entities
reply = await self.rpc(msg)
return reply
@@ -3893,12 +6669,15 @@
@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='MigrationFlag', request='Watch', version=1, params=_params)
+ msg = dict(type='MigrationFlag',
+ request='Watch',
+ version=1,
+ params=_params)
_params['entities'] = entities
reply = await self.rpc(msg)
return reply
@@ -4078,11 +6857,14 @@
async def Export(self):
'''
- Returns -> typing.Sequence<+T_co>[~SerializedModelTools]<~SerializedModelTools>
+ Returns -> typing.Union[typing.Sequence[int], typing.Sequence[str], typing.Sequence[~SerializedModelTools]]
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='MigrationMaster', request='Export', version=1, params=_params)
+ msg = dict(type='MigrationMaster',
+ request='Export',
+ version=1,
+ params=_params)
reply = await self.rpc(msg)
return reply
@@ -4097,7 +6879,10 @@
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='MigrationMaster', request='MigrationStatus', version=1, params=_params)
+ msg = dict(type='MigrationMaster',
+ request='MigrationStatus',
+ version=1,
+ params=_params)
reply = await self.rpc(msg)
return reply
@@ -4108,11 +6893,14 @@
async def MinionReports(self):
'''
- Returns -> typing.Union[typing.Sequence<+T_co>[str], int]
+ Returns -> typing.Union[typing.Sequence[str], str, int]
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='MigrationMaster', request='MinionReports', version=1, params=_params)
+ msg = dict(type='MigrationMaster',
+ request='MinionReports',
+ version=1,
+ params=_params)
reply = await self.rpc(msg)
return reply
@@ -4127,7 +6915,10 @@
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='MigrationMaster', request='ModelInfo', version=1, params=_params)
+ msg = dict(type='MigrationMaster',
+ request='ModelInfo',
+ version=1,
+ params=_params)
reply = await self.rpc(msg)
return reply
@@ -4142,7 +6933,10 @@
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='MigrationMaster', request='Prechecks', version=1, params=_params)
+ msg = dict(type='MigrationMaster',
+ request='Prechecks',
+ version=1,
+ params=_params)
reply = await self.rpc(msg)
return reply
@@ -4157,7 +6951,10 @@
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='MigrationMaster', request='Reap', version=1, params=_params)
+ msg = dict(type='MigrationMaster',
+ request='Reap',
+ version=1,
+ params=_params)
reply = await self.rpc(msg)
return reply
@@ -4172,7 +6969,10 @@
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='MigrationMaster', request='SetPhase', version=1, params=_params)
+ msg = dict(type='MigrationMaster',
+ request='SetPhase',
+ version=1,
+ params=_params)
_params['phase'] = phase
reply = await self.rpc(msg)
return reply
@@ -4187,7 +6987,10 @@
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='MigrationMaster', request='SetStatusMessage', version=1, params=_params)
+ msg = dict(type='MigrationMaster',
+ request='SetStatusMessage',
+ version=1,
+ params=_params)
_params['message'] = message
reply = await self.rpc(msg)
return reply
@@ -4202,7 +7005,10 @@
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='MigrationMaster', request='Watch', version=1, params=_params)
+ msg = dict(type='MigrationMaster',
+ request='Watch',
+ version=1,
+ params=_params)
reply = await self.rpc(msg)
return reply
@@ -4217,7 +7023,10 @@
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='MigrationMaster', request='WatchMinionReports', version=1, params=_params)
+ msg = dict(type='MigrationMaster',
+ request='WatchMinionReports',
+ version=1,
+ params=_params)
reply = await self.rpc(msg)
return reply
@@ -4268,7 +7077,10 @@
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='MigrationMinion', request='Report', version=1, params=_params)
+ msg = dict(type='MigrationMinion',
+ request='Report',
+ version=1,
+ params=_params)
_params['migration-id'] = migration_id
_params['phase'] = phase
_params['success'] = success
@@ -4285,7 +7097,10 @@
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='MigrationMinion', request='Watch', version=1, params=_params)
+ msg = dict(type='MigrationMinion',
+ request='Watch',
+ version=1,
+ params=_params)
reply = await self.rpc(msg)
return reply
@@ -4323,11 +7138,14 @@
async def Next(self):
'''
- Returns -> typing.Union[int, typing.Sequence<+T_co>[str]]
+ Returns -> typing.Union[int, str, typing.Sequence[str]]
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='MigrationStatusWatcher', request='Next', version=1, params=_params)
+ msg = dict(type='MigrationStatusWatcher',
+ request='Next',
+ version=1,
+ params=_params)
reply = await self.rpc(msg)
return reply
@@ -4342,7 +7160,10 @@
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='MigrationStatusWatcher', request='Stop', version=1, params=_params)
+ msg = dict(type='MigrationStatusWatcher',
+ request='Stop',
+ version=1,
+ params=_params)
reply = await self.rpc(msg)
return reply
@@ -4363,6 +7184,25 @@
'type': 'array'}},
'required': ['result'],
'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'},
'MigrationModelInfo': {'additionalProperties': False,
'properties': {'agent-version': {'$ref': '#/definitions/Number'},
'controller-agent-version': {'$ref': '#/definitions/Number'},
@@ -4451,6 +7291,9 @@
'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'},
@@ -4470,7 +7313,10 @@
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='MigrationTarget', request='Abort', version=1, params=_params)
+ msg = dict(type='MigrationTarget',
+ request='Abort',
+ version=1,
+ params=_params)
_params['model-tag'] = model_tag
reply = await self.rpc(msg)
return reply
@@ -4485,7 +7331,10 @@
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='MigrationTarget', request='Activate', version=1, params=_params)
+ msg = dict(type='MigrationTarget',
+ request='Activate',
+ version=1,
+ params=_params)
_params['model-tag'] = model_tag
reply = await self.rpc(msg)
return reply
@@ -4501,7 +7350,10 @@
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='MigrationTarget', request='AdoptResources', version=1, params=_params)
+ 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)
@@ -4513,28 +7365,52 @@
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='MigrationTarget', request='CACert', version=1, params=_params)
+ 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<+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]
Returns -> None
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='MigrationTarget', request='Import', version=1, params=_params)
+ msg = dict(type='MigrationTarget',
+ request='Import',
+ version=1,
+ params=_params)
_params['bytes'] = bytes_
_params['charms'] = charms
_params['tools'] = tools
@@ -4551,7 +7427,10 @@
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='MigrationTarget', request='LatestLogTime', version=1, params=_params)
+ msg = dict(type='MigrationTarget',
+ request='LatestLogTime',
+ version=1,
+ params=_params)
_params['model-tag'] = model_tag
reply = await self.rpc(msg)
return reply
@@ -4569,7 +7448,10 @@
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='MigrationTarget', request='Prechecks', version=1, params=_params)
+ msg = dict(type='MigrationTarget',
+ request='Prechecks',
+ version=1,
+ params=_params)
_params['agent-version'] = agent_version
_params['name'] = name
_params['owner-tag'] = owner_tag
@@ -4648,11 +7530,14 @@
async def ModelGet(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='ModelConfig', request='ModelGet', version=1, params=_params)
+ msg = dict(type='ModelConfig',
+ request='ModelGet',
+ version=1,
+ params=_params)
reply = await self.rpc(msg)
return reply
@@ -4662,12 +7547,15 @@
@ReturnMapping(None)
async def ModelSet(self, config):
'''
- config : typing.Mapping<~KT, +VT_co>[str, typing.Any]
+ config : typing.Mapping[str, typing.Any]
Returns -> None
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='ModelConfig', request='ModelSet', version=1, params=_params)
+ msg = dict(type='ModelConfig',
+ request='ModelSet',
+ version=1,
+ params=_params)
_params['config'] = config
reply = await self.rpc(msg)
return reply
@@ -4677,12 +7565,15 @@
@ReturnMapping(None)
async def ModelUnset(self, keys):
'''
- keys : typing.Sequence<+T_co>[str]
+ keys : typing.Sequence[str]
Returns -> None
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='ModelConfig', request='ModelUnset', version=1, params=_params)
+ msg = dict(type='ModelConfig',
+ request='ModelUnset',
+ version=1,
+ params=_params)
_params['keys'] = keys
reply = await self.rpc(msg)
return reply
@@ -4697,7 +7588,10 @@
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='ModelConfig', request='SLALevel', version=1, params=_params)
+ msg = dict(type='ModelConfig',
+ request='SLALevel',
+ version=1,
+ params=_params)
reply = await self.rpc(msg)
return reply
@@ -4707,13 +7601,16 @@
@ReturnMapping(None)
async def SetSLALevel(self, creds, level):
'''
- creds : typing.Sequence<+T_co>[int]
+ creds : typing.Sequence[int]
level : str
Returns -> None
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='ModelConfig', request='SetSLALevel', 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)
@@ -4721,6 +7618,192 @@
+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):
+ '''
+ entities : typing.Sequence[~Entity]
+ Returns -> typing.Sequence[~IntResult]
+ '''
+ # map input types to rpc msg
+ _params = dict()
+ msg = dict(type='ModelUpgrader',
+ request='ModelEnvironVersion',
+ version=1,
+ params=_params)
+ _params['entities'] = entities
+ reply = await self.rpc(msg)
+ return reply
+
+
+
+ @ReturnMapping(IntResults)
+ async def ModelTargetEnvironVersion(self, entities):
+ '''
+ entities : typing.Sequence[~Entity]
+ Returns -> typing.Sequence[~IntResult]
+ '''
+ # map input types to rpc msg
+ _params = dict()
+ msg = dict(type='ModelUpgrader',
+ request='ModelTargetEnvironVersion',
+ version=1,
+ params=_params)
+ _params['entities'] = entities
+ reply = await self.rpc(msg)
+ return reply
+
+
+
+ @ReturnMapping(ErrorResults)
+ async def SetModelEnvironVersion(self, models):
+ '''
+ models : typing.Sequence[~SetModelEnvironVersion]
+ Returns -> typing.Sequence[~ErrorResult]
+ '''
+ # map input types to rpc msg
+ _params = dict()
+ msg = dict(type='ModelUpgrader',
+ request='SetModelEnvironVersion',
+ version=1,
+ params=_params)
+ _params['models'] = models
+ reply = await self.rpc(msg)
+ return reply
+
+
+
+ @ReturnMapping(ErrorResults)
+ async def SetModelStatus(self, entities):
+ '''
+ entities : typing.Sequence[~EntityStatusArgs]
+ Returns -> typing.Sequence[~ErrorResult]
+ '''
+ # map input types to rpc msg
+ _params = dict()
+ msg = dict(type='ModelUpgrader',
+ request='SetModelStatus',
+ version=1,
+ params=_params)
+ _params['entities'] = entities
+ reply = await self.rpc(msg)
+ return reply
+
+
+
+ @ReturnMapping(NotifyWatchResults)
+ async def WatchModelEnvironVersion(self, entities):
+ '''
+ entities : typing.Sequence[~Entity]
+ Returns -> typing.Sequence[~NotifyWatchResult]
+ '''
+ # map input types to rpc msg
+ _params = dict()
+ msg = dict(type='ModelUpgrader',
+ request='WatchModelEnvironVersion',
+ version=1,
+ params=_params)
+ _params['entities'] = entities
+ reply = await self.rpc(msg)
+ return reply
+
+
+
class NotifyWatcherFacade(Type):
name = 'NotifyWatcher'
version = 1
@@ -4736,7 +7819,10 @@
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='NotifyWatcher', request='Next', version=1, params=_params)
+ msg = dict(type='NotifyWatcher',
+ request='Next',
+ version=1,
+ params=_params)
reply = await self.rpc(msg)
return reply
@@ -4751,7 +7837,89 @@
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='NotifyWatcher', request='Stop', version=1, params=_params)
+ msg = dict(type='NotifyWatcher',
+ request='Stop',
+ version=1,
+ params=_params)
+
+ reply = await self.rpc(msg)
+ return reply
+
+
+
+class OfferStatusWatcherFacade(Type):
+ name = 'OfferStatusWatcher'
+ 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'},
+ '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(OfferStatusWatchResult)
+ async def Next(self):
+ '''
+
+ Returns -> typing.Union[typing.Sequence[~OfferStatusChange], _ForwardRef('Error'), str]
+ '''
+ # map input types to rpc msg
+ _params = dict()
+ msg = dict(type='OfferStatusWatcher',
+ 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='OfferStatusWatcher',
+ request='Stop',
+ version=1,
+ params=_params)
reply = await self.rpc(msg)
return reply
@@ -4797,12 +7965,15 @@
@ReturnMapping(PayloadListResults)
async def List(self, patterns):
'''
- patterns : typing.Sequence<+T_co>[str]
- Returns -> typing.Sequence<+T_co>[~Payload]<~Payload>
+ patterns : typing.Sequence[str]
+ Returns -> typing.Sequence[~Payload]
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='Payloads', request='List', version=1, params=_params)
+ msg = dict(type='Payloads',
+ request='List',
+ version=1,
+ params=_params)
_params['patterns'] = patterns
reply = await self.rpc(msg)
return reply
@@ -4909,12 +8080,15 @@
@ReturnMapping(PayloadResults)
async def List(self, entities):
'''
- entities : typing.Sequence<+T_co>[~Entity]<~Entity>
- Returns -> typing.Sequence<+T_co>[~PayloadResult]<~PayloadResult>
+ entities : typing.Sequence[~Entity]
+ Returns -> typing.Sequence[~PayloadResult]
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='PayloadsHookContext', request='List', version=1, params=_params)
+ msg = dict(type='PayloadsHookContext',
+ request='List',
+ version=1,
+ params=_params)
_params['entities'] = entities
reply = await self.rpc(msg)
return reply
@@ -4924,12 +8098,15 @@
@ReturnMapping(PayloadResults)
async def LookUp(self, args):
'''
- args : typing.Sequence<+T_co>[~LookUpPayloadArg]<~LookUpPayloadArg>
- Returns -> typing.Sequence<+T_co>[~PayloadResult]<~PayloadResult>
+ args : typing.Sequence[~LookUpPayloadArg]
+ Returns -> typing.Sequence[~PayloadResult]
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='PayloadsHookContext', request='LookUp', version=1, params=_params)
+ msg = dict(type='PayloadsHookContext',
+ request='LookUp',
+ version=1,
+ params=_params)
_params['args'] = args
reply = await self.rpc(msg)
return reply
@@ -4939,12 +8116,15 @@
@ReturnMapping(PayloadResults)
async def SetStatus(self, args):
'''
- args : typing.Sequence<+T_co>[~SetPayloadStatusArg]<~SetPayloadStatusArg>
- Returns -> typing.Sequence<+T_co>[~PayloadResult]<~PayloadResult>
+ args : typing.Sequence[~SetPayloadStatusArg]
+ Returns -> typing.Sequence[~PayloadResult]
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='PayloadsHookContext', request='SetStatus', version=1, params=_params)
+ msg = dict(type='PayloadsHookContext',
+ request='SetStatus',
+ version=1,
+ params=_params)
_params['args'] = args
reply = await self.rpc(msg)
return reply
@@ -4954,12 +8134,15 @@
@ReturnMapping(PayloadResults)
async def Track(self, payloads):
'''
- payloads : typing.Sequence<+T_co>[~Payload]<~Payload>
- Returns -> typing.Sequence<+T_co>[~PayloadResult]<~PayloadResult>
+ payloads : typing.Sequence[~Payload]
+ Returns -> typing.Sequence[~PayloadResult]
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='PayloadsHookContext', request='Track', version=1, params=_params)
+ msg = dict(type='PayloadsHookContext',
+ request='Track',
+ version=1,
+ params=_params)
_params['payloads'] = payloads
reply = await self.rpc(msg)
return reply
@@ -4969,12 +8152,15 @@
@ReturnMapping(PayloadResults)
async def Untrack(self, entities):
'''
- entities : typing.Sequence<+T_co>[~Entity]<~Entity>
- Returns -> typing.Sequence<+T_co>[~PayloadResult]<~PayloadResult>
+ entities : typing.Sequence[~Entity]
+ Returns -> typing.Sequence[~PayloadResult]
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='PayloadsHookContext', request='Untrack', version=1, params=_params)
+ msg = dict(type='PayloadsHookContext',
+ request='Untrack',
+ version=1,
+ params=_params)
_params['entities'] = entities
reply = await self.rpc(msg)
return reply
@@ -4996,7 +8182,10 @@
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='Pinger', request='Ping', version=1, params=_params)
+ msg = dict(type='Pinger',
+ request='Ping',
+ version=1,
+ params=_params)
reply = await self.rpc(msg)
return reply
@@ -5011,7 +8200,10 @@
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='Pinger', request='Stop', version=1, params=_params)
+ msg = dict(type='Pinger',
+ request='Stop',
+ version=1,
+ params=_params)
reply = await self.rpc(msg)
return reply
@@ -5085,12 +8277,15 @@
@ReturnMapping(ProxyConfigResults)
async def ProxyConfig(self, entities):
'''
- entities : typing.Sequence<+T_co>[~Entity]<~Entity>
- Returns -> typing.Sequence<+T_co>[~ProxyConfigResult]<~ProxyConfigResult>
+ entities : typing.Sequence[~Entity]
+ Returns -> typing.Sequence[~ProxyConfigResult]
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='ProxyUpdater', request='ProxyConfig', version=1, params=_params)
+ msg = dict(type='ProxyUpdater',
+ request='ProxyConfig',
+ version=1,
+ params=_params)
_params['entities'] = entities
reply = await self.rpc(msg)
return reply
@@ -5100,18 +8295,95 @@
@ReturnMapping(NotifyWatchResults)
async def WatchForProxyConfigAndAPIHostPortChanges(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='ProxyUpdater', request='WatchForProxyConfigAndAPIHostPortChanges', version=1, params=_params)
+ msg = dict(type='ProxyUpdater',
+ request='WatchForProxyConfigAndAPIHostPortChanges',
+ version=1,
+ params=_params)
_params['entities'] = entities
reply = await self.rpc(msg)
return reply
+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='RelationStatusWatcher',
+ 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='RelationStatusWatcher',
+ request='Stop',
+ version=1,
+ params=_params)
+
+ reply = await self.rpc(msg)
+ return reply
+
+
+
class RelationUnitsWatcherFacade(Type):
name = 'RelationUnitsWatcher'
version = 1
@@ -5158,7 +8430,10 @@
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='RelationUnitsWatcher', request='Next', version=1, params=_params)
+ msg = dict(type='RelationUnitsWatcher',
+ request='Next',
+ version=1,
+ params=_params)
reply = await self.rpc(msg)
return reply
@@ -5173,7 +8448,10 @@
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='RelationUnitsWatcher', request='Stop', version=1, params=_params)
+ msg = dict(type='RelationUnitsWatcher',
+ request='Stop',
+ version=1,
+ params=_params)
reply = await self.rpc(msg)
return reply
@@ -5251,7 +8529,10 @@
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='RemoteApplicationWatcher', request='Next', version=1, params=_params)
+ msg = dict(type='RemoteApplicationWatcher',
+ request='Next',
+ version=1,
+ params=_params)
reply = await self.rpc(msg)
return reply
@@ -5266,7 +8547,583 @@
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='RemoteApplicationWatcher', request='Stop', version=1, params=_params)
+ msg = dict(type='RemoteApplicationWatcher',
+ request='Stop',
+ version=1,
+ params=_params)
+
+ reply = await self.rpc(msg)
+ return reply
+
+
+
+class RemoteRelationsFacade(Type):
+ name = 'RemoteRelations'
+ 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'},
+ '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'},
+ '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'},
+ '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'},
+ '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'},
+ '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'},
+ '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'},
+ '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'},
+ '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'},
+ '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(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[~Entity]
+ Returns -> typing.Sequence[~TokenResult]
+ '''
+ # map input types to rpc msg
+ _params = dict()
+ msg = dict(type='RemoteRelations',
+ request='ExportEntities',
+ version=1,
+ params=_params)
+ _params['entities'] = entities
+ reply = await self.rpc(msg)
+ return reply
+
+
+
+ @ReturnMapping(StringResults)
+ async def GetTokens(self, args):
+ '''
+ args : typing.Sequence[~GetTokenArg]
+ Returns -> typing.Sequence[~StringResult]
+ '''
+ # map input types to rpc msg
+ _params = dict()
+ msg = dict(type='RemoteRelations',
+ request='GetTokens',
+ version=1,
+ params=_params)
+ _params['Args'] = args
+ reply = await self.rpc(msg)
+ return reply
+
+
+
+ @ReturnMapping(ErrorResults)
+ async def ImportRemoteEntities(self, args):
+ '''
+ args : typing.Sequence[~RemoteEntityTokenArg]
+ Returns -> typing.Sequence[~ErrorResult]
+ '''
+ # map input types to rpc msg
+ _params = dict()
+ msg = dict(type='RemoteRelations',
+ request='ImportRemoteEntities',
+ version=1,
+ params=_params)
+ _params['Args'] = args
+ reply = await self.rpc(msg)
+ return reply
+
+
+
+ @ReturnMapping(SettingsResults)
+ async def RelationUnitSettings(self, relation_units):
+ '''
+ relation_units : typing.Sequence[~RelationUnit]
+ Returns -> typing.Sequence[~SettingsResult]
+ '''
+ # map input types to rpc msg
+ _params = dict()
+ msg = dict(type='RemoteRelations',
+ request='RelationUnitSettings',
+ version=1,
+ params=_params)
+ _params['relation-units'] = relation_units
+ reply = await self.rpc(msg)
+ return reply
+
+
+
+ @ReturnMapping(RemoteRelationResults)
+ async def Relations(self, entities):
+ '''
+ entities : typing.Sequence[~Entity]
+ Returns -> typing.Sequence[~RemoteRelationResult]
+ '''
+ # map input types to rpc msg
+ _params = dict()
+ msg = dict(type='RemoteRelations',
+ request='Relations',
+ version=1,
+ params=_params)
+ _params['entities'] = entities
+ reply = await self.rpc(msg)
+ return reply
+
+
+
+ @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
@@ -5336,7 +9193,10 @@
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='RemoteRelationsWatcher', request='Next', version=1, params=_params)
+ msg = dict(type='RemoteRelationsWatcher',
+ request='Next',
+ version=1,
+ params=_params)
reply = await self.rpc(msg)
return reply
@@ -5351,7 +9211,10 @@
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='RemoteRelationsWatcher', request='Stop', version=1, params=_params)
+ msg = dict(type='RemoteRelationsWatcher',
+ request='Stop',
+ version=1,
+ params=_params)
reply = await self.rpc(msg)
return reply
@@ -5363,11 +9226,13 @@
version = 1
schema = {'definitions': {'AddCharmWithAuthorization': {'additionalProperties': False,
'properties': {'channel': {'type': 'string'},
+ 'force': {'type': 'boolean'},
'macaroon': {'$ref': '#/definitions/Macaroon'},
'url': {'type': 'string'}},
'required': ['url',
'channel',
- 'macaroon'],
+ 'macaroon',
+ 'force'],
'type': 'object'},
'AddPendingResourcesArgs': {'additionalProperties': False,
'properties': {'AddCharmWithAuthorization': {'$ref': '#/definitions/AddCharmWithAuthorization'},
@@ -5483,12 +9348,15 @@
'''
addcharmwithauthorization : AddCharmWithAuthorization
entity : Entity
- resources : typing.Sequence<+T_co>[~CharmResource]<~CharmResource>
- Returns -> typing.Union[_ForwardRef('ErrorResult'), typing.Sequence<+T_co>[str]]
+ resources : typing.Sequence[~CharmResource]
+ Returns -> typing.Union[_ForwardRef('ErrorResult'), typing.Sequence[str]]
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='Resources', request='AddPendingResources', version=1, params=_params)
+ msg = dict(type='Resources',
+ request='AddPendingResources',
+ version=1,
+ params=_params)
_params['AddCharmWithAuthorization'] = addcharmwithauthorization
_params['Entity'] = entity
_params['Resources'] = resources
@@ -5500,12 +9368,15 @@
@ReturnMapping(ResourcesResults)
async def ListResources(self, entities):
'''
- entities : typing.Sequence<+T_co>[~Entity]<~Entity>
- Returns -> typing.Sequence<+T_co>[~ResourcesResult]<~ResourcesResult>
+ entities : typing.Sequence[~Entity]
+ Returns -> typing.Sequence[~ResourcesResult]
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='Resources', request='ListResources', version=1, params=_params)
+ msg = dict(type='Resources',
+ request='ListResources',
+ version=1,
+ params=_params)
_params['entities'] = entities
reply = await self.rpc(msg)
return reply
@@ -5588,12 +9459,15 @@
@ReturnMapping(UnitResourcesResult)
async def GetResourceInfo(self, resource_names):
'''
- resource_names : typing.Sequence<+T_co>[str]
- Returns -> typing.Union[_ForwardRef('ErrorResult'), typing.Sequence<+T_co>[~UnitResourceResult]<~UnitResourceResult>]
+ resource_names : typing.Sequence[str]
+ Returns -> typing.Union[_ForwardRef('ErrorResult'), typing.Sequence[~UnitResourceResult]]
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='ResourcesHookContext', request='GetResourceInfo', 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
@@ -5666,12 +9540,15 @@
@ReturnMapping(RetryStrategyResults)
async def RetryStrategy(self, entities):
'''
- entities : typing.Sequence<+T_co>[~Entity]<~Entity>
- Returns -> typing.Sequence<+T_co>[~RetryStrategyResult]<~RetryStrategyResult>
+ entities : typing.Sequence[~Entity]
+ Returns -> typing.Sequence[~RetryStrategyResult]
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='RetryStrategy', request='RetryStrategy', version=1, params=_params)
+ msg = dict(type='RetryStrategy',
+ request='RetryStrategy',
+ version=1,
+ params=_params)
_params['entities'] = entities
reply = await self.rpc(msg)
return reply
@@ -5681,12 +9558,15 @@
@ReturnMapping(NotifyWatchResults)
async def WatchRetryStrategy(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='RetryStrategy', request='WatchRetryStrategy', version=1, params=_params)
+ msg = dict(type='RetryStrategy',
+ request='WatchRetryStrategy',
+ version=1,
+ params=_params)
_params['entities'] = entities
reply = await self.rpc(msg)
return reply
@@ -5756,12 +9636,15 @@
@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=1, params=_params)
+ msg = dict(type='SSHClient',
+ request='PrivateAddress',
+ version=1,
+ params=_params)
_params['entities'] = entities
reply = await self.rpc(msg)
return reply
@@ -5776,7 +9659,10 @@
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='SSHClient', request='Proxy', version=1, params=_params)
+ msg = dict(type='SSHClient',
+ request='Proxy',
+ version=1,
+ params=_params)
reply = await self.rpc(msg)
return reply
@@ -5786,12 +9672,15 @@
@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=1, params=_params)
+ msg = dict(type='SSHClient',
+ request='PublicAddress',
+ version=1,
+ params=_params)
_params['entities'] = entities
reply = await self.rpc(msg)
return reply
@@ -5801,12 +9690,15 @@
@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=1, params=_params)
+ msg = dict(type='SSHClient',
+ request='PublicKeys',
+ version=1,
+ params=_params)
_params['entities'] = entities
reply = await self.rpc(msg)
return reply
@@ -5869,12 +9761,15 @@
@ReturnMapping(ErrorResults)
async def Claim(self, claims):
'''
- claims : typing.Sequence<+T_co>[~SingularClaim]<~SingularClaim>
- Returns -> typing.Sequence<+T_co>[~ErrorResult]<~ErrorResult>
+ claims : typing.Sequence[~SingularClaim]
+ Returns -> typing.Sequence[~ErrorResult]
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='Singular', request='Claim', version=1, params=_params)
+ msg = dict(type='Singular',
+ request='Claim',
+ version=1,
+ params=_params)
_params['claims'] = claims
reply = await self.rpc(msg)
return reply
@@ -5884,12 +9779,15 @@
@ReturnMapping(ErrorResults)
async def Wait(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='Singular', request='Wait', version=1, params=_params)
+ msg = dict(type='Singular',
+ request='Wait',
+ version=1,
+ params=_params)
_params['entities'] = entities
reply = await self.rpc(msg)
return reply
@@ -5927,11 +9825,14 @@
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='StringsWatcher', request='Next', version=1, params=_params)
+ msg = dict(type='StringsWatcher',
+ request='Next',
+ version=1,
+ params=_params)
reply = await self.rpc(msg)
return reply
@@ -5946,7 +9847,10 @@
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='StringsWatcher', request='Stop', version=1, params=_params)
+ msg = dict(type='StringsWatcher',
+ request='Stop',
+ version=1,
+ params=_params)
reply = await self.rpc(msg)
return reply
@@ -6046,11 +9950,14 @@
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='Undertaker', request='ModelConfig', version=1, params=_params)
+ msg = dict(type='Undertaker',
+ request='ModelConfig',
+ version=1,
+ params=_params)
reply = await self.rpc(msg)
return reply
@@ -6065,7 +9972,10 @@
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='Undertaker', request='ModelInfo', version=1, params=_params)
+ msg = dict(type='Undertaker',
+ request='ModelInfo',
+ version=1,
+ params=_params)
reply = await self.rpc(msg)
return reply
@@ -6080,7 +9990,10 @@
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='Undertaker', request='ProcessDyingModel', version=1, params=_params)
+ msg = dict(type='Undertaker',
+ request='ProcessDyingModel',
+ version=1,
+ params=_params)
reply = await self.rpc(msg)
return reply
@@ -6095,7 +10008,10 @@
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='Undertaker', request='RemoveModel', version=1, params=_params)
+ msg = dict(type='Undertaker',
+ request='RemoveModel',
+ version=1,
+ params=_params)
reply = await self.rpc(msg)
return reply
@@ -6105,12 +10021,15 @@
@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='Undertaker', request='SetStatus', version=1, params=_params)
+ msg = dict(type='Undertaker',
+ request='SetStatus',
+ version=1,
+ params=_params)
_params['entities'] = entities
reply = await self.rpc(msg)
return reply
@@ -6120,12 +10039,15 @@
@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='Undertaker', request='UpdateStatus', version=1, params=_params)
+ msg = dict(type='Undertaker',
+ request='UpdateStatus',
+ version=1,
+ params=_params)
_params['entities'] = entities
reply = await self.rpc(msg)
return reply
@@ -6136,11 +10058,14 @@
async def WatchModelResources(self):
'''
- Returns -> typing.Sequence<+T_co>[~NotifyWatchResult]<~NotifyWatchResult>
+ Returns -> typing.Sequence[~NotifyWatchResult]
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='Undertaker', request='WatchModelResources', version=1, params=_params)
+ msg = dict(type='Undertaker',
+ request='WatchModelResources',
+ version=1,
+ params=_params)
reply = await self.rpc(msg)
return reply
@@ -6216,12 +10141,15 @@
@ReturnMapping(ErrorResults)
async def AssignUnits(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='UnitAssigner', request='AssignUnits', version=1, params=_params)
+ msg = dict(type='UnitAssigner',
+ request='AssignUnits',
+ version=1,
+ params=_params)
_params['entities'] = entities
reply = await self.rpc(msg)
return reply
@@ -6231,12 +10159,15 @@
@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='UnitAssigner', request='SetAgentStatus', version=1, params=_params)
+ msg = dict(type='UnitAssigner',
+ request='SetAgentStatus',
+ version=1,
+ params=_params)
_params['entities'] = entities
reply = await self.rpc(msg)
return reply
@@ -6247,17 +10178,411 @@
async def WatchUnitAssignments(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='UnitAssigner', request='WatchUnitAssignments', version=1, params=_params)
+ msg = dict(type='UnitAssigner',
+ request='WatchUnitAssignments',
+ version=1,
+ params=_params)
reply = await self.rpc(msg)
return reply
+class UpgradeSeriesFacade(Type):
+ name = 'UpgradeSeries'
+ version = 1
+ schema = {'definitions': {'Entities': {'additionalProperties': False,
+ 'properties': {'entities': {'items': {'$ref': '#/definitions/Entity'},
+ 'type': 'array'}},
+ 'required': ['entities'],
+ 'type': 'object'},
+ 'EntitiesResult': {'additionalProperties': False,
+ 'properties': {'entities': {'items': {'$ref': '#/definitions/Entity'},
+ 'type': 'array'},
+ 'error': {'$ref': '#/definitions/Error'}},
+ 'required': ['entities'],
+ 'type': 'object'},
+ 'EntitiesResults': {'additionalProperties': False,
+ 'properties': {'results': {'items': {'$ref': '#/definitions/EntitiesResult'},
+ 'type': 'array'}},
+ 'required': ['results'],
+ 'type': 'object'},
+ 'Entity': {'additionalProperties': False,
+ 'properties': {'tag': {'type': 'string'}},
+ 'required': ['tag'],
+ 'type': 'object'},
+ 'Error': {'additionalProperties': False,
+ 'properties': {'code': {'type': 'string'},
+ 'info': {'$ref': '#/definitions/ErrorInfo'},
+ 'message': {'type': 'string'}},
+ 'required': ['message', 'code'],
+ 'type': 'object'},
+ 'ErrorInfo': {'additionalProperties': False,
+ 'properties': {'macaroon': {'$ref': '#/definitions/Macaroon'},
+ 'macaroon-path': {'type': 'string'}},
+ 'type': 'object'},
+ 'ErrorResult': {'additionalProperties': False,
+ 'properties': {'error': {'$ref': '#/definitions/Error'}},
+ 'type': 'object'},
+ 'ErrorResults': {'additionalProperties': False,
+ 'properties': {'results': {'items': {'$ref': '#/definitions/ErrorResult'},
+ 'type': 'array'}},
+ 'required': ['results'],
+ 'type': 'object'},
+ 'Macaroon': {'additionalProperties': False, 'type': 'object'},
+ 'NotifyWatchResult': {'additionalProperties': False,
+ 'properties': {'NotifyWatcherId': {'type': 'string'},
+ 'error': {'$ref': '#/definitions/Error'}},
+ 'required': ['NotifyWatcherId'],
+ 'type': 'object'},
+ 'NotifyWatchResults': {'additionalProperties': False,
+ 'properties': {'results': {'items': {'$ref': '#/definitions/NotifyWatchResult'},
+ 'type': 'array'}},
+ 'required': ['results'],
+ 'type': 'object'},
+ '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'},
+ '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'},
+ '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(ErrorResults)
+ async def FinishUpgradeSeries(self, args):
+ '''
+ args : typing.Sequence[~UpdateSeriesArg]
+ Returns -> typing.Sequence[~ErrorResult]
+ '''
+ # map input types to rpc msg
+ _params = dict()
+ 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(PinApplicationsResults)
+ async def PinMachineApplications(self):
+ '''
+
+ Returns -> typing.Sequence[~PinApplicationResult]
+ '''
+ # map input types to rpc msg
+ _params = dict()
+ msg = dict(type='UpgradeSeries',
+ request='PinMachineApplications',
+ version=1,
+ params=_params)
+
+ reply = await self.rpc(msg)
+ return reply
+
+
+
+ @ReturnMapping(PinnedLeadershipResult)
+ async def PinnedLeadership(self):
+ '''
+
+ Returns -> typing.Sequence[str]
+ '''
+ # map input types to rpc msg
+ _params = dict()
+ msg = dict(type='UpgradeSeries',
+ request='PinnedLeadership',
+ version=1,
+ params=_params)
+
+ reply = await self.rpc(msg)
+ return reply
+
+
+
+ @ReturnMapping(ErrorResults)
+ async def SetMachineStatus(self, params):
+ '''
+ params : typing.Sequence[~UpgradeSeriesStatusParam]
+ Returns -> typing.Sequence[~ErrorResult]
+ '''
+ # map input types to rpc msg
+ _params = dict()
+ msg = dict(type='UpgradeSeries',
+ request='SetMachineStatus',
+ version=1,
+ params=_params)
+ _params['params'] = params
+ 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='UpgradeSeries',
+ request='SetUpgradeSeriesUnitStatus',
+ version=1,
+ params=_params)
+ _params['params'] = params
+ reply = await self.rpc(msg)
+ return reply
+
+
+
+ @ReturnMapping(ErrorResults)
+ async def StartUnitCompletion(self, entities, message):
+ '''
+ entities : typing.Sequence[~Entity]
+ message : str
+ Returns -> typing.Sequence[~ErrorResult]
+ '''
+ # map input types to rpc msg
+ _params = dict()
+ msg = dict(type='UpgradeSeries',
+ request='StartUnitCompletion',
+ version=1,
+ params=_params)
+ _params['entities'] = entities
+ _params['message'] = message
+ reply = await self.rpc(msg)
+ return reply
+
+
+
+ @ReturnMapping(StringResults)
+ async def TargetSeries(self, entities):
+ '''
+ entities : typing.Sequence[~Entity]
+ Returns -> typing.Sequence[~StringResult]
+ '''
+ # map input types to rpc msg
+ _params = dict()
+ msg = dict(type='UpgradeSeries',
+ request='TargetSeries',
+ version=1,
+ params=_params)
+ _params['entities'] = entities
+ reply = await self.rpc(msg)
+ return reply
+
+
+
+ @ReturnMapping(EntitiesResults)
+ async def UnitsCompleted(self, entities):
+ '''
+ entities : typing.Sequence[~Entity]
+ Returns -> typing.Sequence[~EntitiesResult]
+ '''
+ # map input types to rpc msg
+ _params = dict()
+ msg = dict(type='UpgradeSeries',
+ request='UnitsCompleted',
+ version=1,
+ params=_params)
+ _params['entities'] = entities
+ reply = await self.rpc(msg)
+ return reply
+
+
+
+ @ReturnMapping(EntitiesResults)
+ async def UnitsPrepared(self, entities):
+ '''
+ entities : typing.Sequence[~Entity]
+ Returns -> typing.Sequence[~EntitiesResult]
+ '''
+ # map input types to rpc msg
+ _params = dict()
+ msg = dict(type='UpgradeSeries',
+ request='UnitsPrepared',
+ version=1,
+ params=_params)
+ _params['entities'] = entities
+ reply = await self.rpc(msg)
+ return reply
+
+
+
+ @ReturnMapping(PinApplicationsResults)
+ async def UnpinMachineApplications(self):
+ '''
+
+ 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='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
+
+
+
class UpgraderFacade(Type):
name = 'Upgrader'
version = 1
@@ -6378,12 +10703,15 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
'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 @@
'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 @@
'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 @@
'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 @@
@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 @@
@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)
+ 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='ControllerAPIInfoForModels',
+ version=2,
+ params=_params)
_params['entities'] = entities
reply = await self.rpc(msg)
return reply
@@ -548,11 +627,14 @@
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 @@
'''
# 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 @@
@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 @@
'''
# 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 @@
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 @@
@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 @@
'''
# 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 @@
@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 @@
'''
# 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 @@
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 @@
'''
# 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 @@
@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 @@
@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 @@
@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 @@
'''
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 @@
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 @@
@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 @@
'''
# 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 @@
@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 @@
@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 @@
'''
# 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 @@
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 @@
'''
# 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 @@
'''
# 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 @@
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 @@
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 @@
'''
# 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 @@
@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 @@
'''
# 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 @@
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 @@
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,6 +1598,692 @@
+class ApplicationOffersFacade(Type):
+ name = 'ApplicationOffers'
+ version = 2
+ 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'},
+ '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'},
+ '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(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
+
+
+
+ @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='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(ConsumeOfferDetailsResults)
+ async def GetConsumeDetails(self, offer_urls):
+ '''
+ offer_urls : typing.Sequence[str]
+ Returns -> typing.Sequence[~ConsumeOfferDetailsResult]
+ '''
+ # map input types to rpc msg
+ _params = dict()
+ msg = dict(type='ApplicationOffers',
+ request='GetConsumeDetails',
+ version=2,
+ params=_params)
+ _params['offer-urls'] = offer_urls
+ reply = await self.rpc(msg)
+ return reply
+
+
+
+ @ReturnMapping(QueryApplicationOffersResults)
+ async def ListApplicationOffers(self, filters):
+ '''
+ filters : typing.Sequence[~OfferFilter]
+ Returns -> typing.Sequence[~ApplicationOfferAdminDetails]
+ '''
+ # map input types to rpc msg
+ _params = dict()
+ msg = dict(type='ApplicationOffers',
+ request='ListApplicationOffers',
+ version=2,
+ params=_params)
+ _params['Filters'] = filters
+ reply = await self.rpc(msg)
+ return reply
+
+
+
+ @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': {'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'}},
+ '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'},
+ '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(BackupsMetadataResult)
+ async def Create(self, notes):
+ '''
+ notes : str
+ Returns -> typing.Union[str, int, _ForwardRef('Number')]
+ '''
+ # map input types to rpc msg
+ _params = dict()
+ msg = dict(type='Backups',
+ request='Create',
+ version=2,
+ params=_params)
+ _params['notes'] = notes
+ reply = await self.rpc(msg)
+ return reply
+
+
+
+ @ReturnMapping(None)
+ async def FinishRestore(self):
+ '''
+
+ Returns -> None
+ '''
+ # map input types to rpc msg
+ _params = dict()
+ msg = dict(type='Backups',
+ request='FinishRestore',
+ version=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
@@ -1479,11 +2337,14 @@
async def List(self):
'''
- Returns -> typing.Sequence<+T_co>[~BlockResult]<~BlockResult>
+ Returns -> typing.Sequence[~BlockResult]
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='Block', request='List', version=2, params=_params)
+ msg = dict(type='Block',
+ request='List',
+ version=2,
+ params=_params)
reply = await self.rpc(msg)
return reply
@@ -1499,7 +2360,10 @@
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='Block', request='SwitchBlockOff', version=2, params=_params)
+ msg = dict(type='Block',
+ request='SwitchBlockOff',
+ version=2,
+ params=_params)
_params['message'] = message
_params['type'] = type_
reply = await self.rpc(msg)
@@ -1516,7 +2380,10 @@
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='Block', request='SwitchBlockOn', version=2, params=_params)
+ msg = dict(type='Block',
+ request='SwitchBlockOn',
+ version=2,
+ params=_params)
_params['message'] = message
_params['type'] = type_
reply = await self.rpc(msg)
@@ -1524,6 +2391,93 @@
+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
@@ -1554,7 +2508,10 @@
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='CharmRevisionUpdater', request='UpdateLatestRevisions', version=2, params=_params)
+ msg = dict(type='CharmRevisionUpdater',
+ request='UpdateLatestRevisions',
+ version=2,
+ params=_params)
reply = await self.rpc(msg)
return reply
@@ -1575,20 +2532,46 @@
'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'},
@@ -1724,11 +2707,14 @@
async def CharmInfo(self, url):
'''
url : str
- Returns -> typing.Union[_ForwardRef('CharmActions'), typing.Mapping<~KT, +VT_co>[str, ~CharmOption]<~CharmOption>, _ForwardRef('CharmMeta'), _ForwardRef('CharmMetrics'), int, str]
+ 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)
+ msg = dict(type='Charms',
+ request='CharmInfo',
+ version=2,
+ params=_params)
_params['url'] = url
reply = await self.rpc(msg)
return reply
@@ -1743,7 +2729,10 @@
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='Charms', request='IsMetered', version=2, params=_params)
+ msg = dict(type='Charms',
+ request='IsMetered',
+ version=2,
+ params=_params)
_params['url'] = url
reply = await self.rpc(msg)
return reply
@@ -1753,12 +2742,15 @@
@ReturnMapping(CharmsListResult)
async def List(self, names):
'''
- names : typing.Sequence<+T_co>[str]
- Returns -> typing.Sequence<+T_co>[str]
+ 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)
+ msg = dict(type='Charms',
+ request='List',
+ version=2,
+ params=_params)
_params['names'] = names
reply = await self.rpc(msg)
return reply
@@ -1798,7 +2790,10 @@
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='Cleaner', request='Cleanup', version=2, params=_params)
+ msg = dict(type='Cleaner',
+ request='Cleanup',
+ version=2,
+ params=_params)
reply = await self.rpc(msg)
return reply
@@ -1813,7 +2808,1523 @@
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='Cleaner', request='WatchCleanups', version=2, params=_params)
+ 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):
+ '''
+ entities : typing.Sequence[~Entity]
+ Returns -> typing.Sequence[~ErrorResult]
+ '''
+ # map input types to rpc msg
+ _params = dict()
+ msg = dict(type='Client',
+ request='RetryProvisioning',
+ version=2,
+ 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=2,
+ 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=2,
+ 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=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': {'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'},
+ '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': {'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(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 -> typing.Union[str, bool]
+ '''
+ # map input types to rpc msg
+ _params = dict()
+ msg = dict(type='CredentialValidator',
+ request='ModelCredential',
+ version=2,
+ params=_params)
+
+ reply = await self.rpc(msg)
+ return reply
+
+
+
+ @ReturnMapping(NotifyWatchResult)
+ 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='CredentialValidator',
+ request='WatchModelCredential',
+ version=2,
+ params=_params)
reply = await self.rpc(msg)
return reply
@@ -1938,12 +4449,15 @@
@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 @@
@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 @@
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 @@
'''
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 @@
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 @@
@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 @@
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 @@
'''
# 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 @@
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 @@
'''
# 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 @@
'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 @@
'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 @@
@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 @@
@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 @@
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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
'''
# 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 @@
'''
# 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 @@
@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 @@
@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 @@
@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 @@
'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 @@
@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 @@
'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 @@
'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 @@
@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 @@
@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 @@
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 @@
@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 @@
@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 @@
@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 @@
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 @@
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 @@
@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,12 +6261,15 @@
@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)
+ msg = dict(type='ModelManager',
+ request='ModelStatus',
+ version=2,
+ params=_params)
_params['entities'] = entities
reply = await self.rpc(msg)
return reply
@@ -3482,12 +6279,15 @@
@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=2, params=_params)
+ msg = dict(type='ModelManager',
+ request='ModifyModelAccess',
+ version=2,
+ params=_params)
_params['changes'] = changes
reply = await self.rpc(msg)
return reply
@@ -3497,12 +6297,15 @@
@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=2, params=_params)
+ msg = dict(type='ModelManager',
+ request='SetModelDefaults',
+ version=2,
+ params=_params)
_params['config'] = config
reply = await self.rpc(msg)
return reply
@@ -3512,18 +6315,125 @@
@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=2, params=_params)
+ msg = dict(type='ModelManager',
+ request='UnsetModelDefaults',
+ version=2,
+ params=_params)
_params['keys'] = keys
reply = await self.rpc(msg)
return reply
+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):
+ '''
+ entities : typing.Sequence[~Entity]
+ Returns -> typing.Sequence[~ProxyConfigResult]
+ '''
+ # map input types to rpc msg
+ _params = dict()
+ msg = dict(type='ProxyUpdater',
+ request='ProxyConfig',
+ version=2,
+ params=_params)
+ _params['entities'] = entities
+ reply = await self.rpc(msg)
+ return reply
+
+
+
+ @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=2,
+ params=_params)
+ _params['entities'] = entities
+ reply = await self.rpc(msg)
+ return reply
+
+
+
class RebootFacade(Type):
name = 'Reboot'
version = 2
@@ -3585,12 +6495,15 @@
@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 @@
@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 @@
@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 @@
'''
# 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 @@
'''
# 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 @@
@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 @@
@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 @@
'''
# 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 @@
@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 @@
@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)
+ 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='Singular',
+ request='Wait',
+ version=2,
+ params=_params)
_params['entities'] = entities
reply = await self.rpc(msg)
return reply
@@ -3889,12 +6918,15 @@
@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 @@
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 @@
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 @@
'''
# 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 @@
'''
# 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 @@
@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 @@
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 @@
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 @@
'''
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 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 @@
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 @@
'''
# 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._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
@@ -302,12 +691,15 @@
@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=3, params=_params)
+ msg = dict(type='Application',
+ request='AddRelation',
+ version=3,
+ params=_params)
_params['endpoints'] = endpoints
reply = await self.rpc(msg)
return reply
@@ -319,12 +711,15 @@
'''
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=3, params=_params)
+ msg = dict(type='Application',
+ request='AddUnits',
+ version=3,
+ params=_params)
_params['application'] = application
_params['num-units'] = num_units
_params['placement'] = placement
@@ -337,11 +732,14 @@
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=3, params=_params)
+ msg = dict(type='Application',
+ request='CharmRelations',
+ version=3,
+ params=_params)
_params['application'] = application
reply = await self.rpc(msg)
return reply
@@ -351,12 +749,15 @@
@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=3, params=_params)
+ msg = dict(type='Application',
+ request='Deploy',
+ version=3,
+ params=_params)
_params['applications'] = applications
reply = await self.rpc(msg)
return reply
@@ -371,7 +772,10 @@
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='Application', request='Destroy', version=3, params=_params)
+ msg = dict(type='Application',
+ request='Destroy',
+ version=3,
+ params=_params)
_params['application'] = application
reply = await self.rpc(msg)
return reply
@@ -381,12 +785,15 @@
@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=3, params=_params)
+ msg = dict(type='Application',
+ request='DestroyRelation',
+ version=3,
+ params=_params)
_params['endpoints'] = endpoints
reply = await self.rpc(msg)
return reply
@@ -396,12 +803,15 @@
@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=3, params=_params)
+ msg = dict(type='Application',
+ request='DestroyUnits',
+ version=3,
+ params=_params)
_params['unit-names'] = unit_names
reply = await self.rpc(msg)
return reply
@@ -416,7 +826,10 @@
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='Application', request='Expose', version=3, params=_params)
+ msg = dict(type='Application',
+ request='Expose',
+ version=3,
+ params=_params)
_params['application'] = application
reply = await self.rpc(msg)
return reply
@@ -427,11 +840,14 @@
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=3, params=_params)
+ msg = dict(type='Application',
+ request='Get',
+ version=3,
+ params=_params)
_params['application'] = application
reply = await self.rpc(msg)
return reply
@@ -446,7 +862,10 @@
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='Application', request='GetCharmURL', version=3, params=_params)
+ msg = dict(type='Application',
+ request='GetCharmURL',
+ version=3,
+ params=_params)
_params['application'] = application
reply = await self.rpc(msg)
return reply
@@ -461,7 +880,10 @@
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='Application', request='GetConstraints', version=3, params=_params)
+ msg = dict(type='Application',
+ request='GetConstraints',
+ version=3,
+ params=_params)
_params['application'] = application
reply = await self.rpc(msg)
return reply
@@ -472,12 +894,15 @@
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=3, params=_params)
+ msg = dict(type='Application',
+ request='Set',
+ version=3,
+ params=_params)
_params['application'] = application
_params['options'] = options
reply = await self.rpc(msg)
@@ -491,17 +916,20 @@
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=3, params=_params)
+ msg = dict(type='Application',
+ request='SetCharm',
+ version=3,
+ params=_params)
_params['application'] = application
_params['channel'] = channel
_params['charm-url'] = charm_url
@@ -525,7 +953,10 @@
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='Application', request='SetConstraints', version=3, params=_params)
+ msg = dict(type='Application',
+ request='SetConstraints',
+ version=3,
+ params=_params)
_params['application'] = application
_params['constraints'] = constraints
reply = await self.rpc(msg)
@@ -536,12 +967,15 @@
@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=3, params=_params)
+ msg = dict(type='Application',
+ request='SetMetricCredentials',
+ version=3,
+ params=_params)
_params['creds'] = creds
reply = await self.rpc(msg)
return reply
@@ -556,7 +990,10 @@
'''
# map input types to rpc msg
_params = dict()
- msg = dict(type='Application', request='Unexpose', version=3, params=_params)
+ msg = dict(type='Application',
+ request='Unexpose',
+ version=3,
+ params=_params)
_params['application'] = application
reply = await self.rpc(msg)
return reply
@@ -567,12 +1004,15 @@
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=3, params=_params)
+ msg = dict(type='Application',
+ request='Unset',
+ version=3,
+ params=_params)
_params['application'] = application
_params['options'] = options
reply = await self.rpc(msg)
@@ -589,13 +1029,16 @@
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=3, params=_params)
+ msg = dict(type='Application',
+ request='Update',
+ version=3,
+ params=_params)
_params['application'] = application
_params['charm-url'] = charm_url
_params['constraints'] = constraints
@@ -609,6 +1052,661 @@
+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': {'AddCloud': {'properties': {'Params': {'$ref': '#/definitions/AddCloudArgs'}},
+ 'type': 'object'},
+ 'AddCredentials': {'properties': {'Params': {'$ref': '#/definitions/TaggedCredentials'},
+ 'Result': {'$ref': '#/definitions/ErrorResults'}},
+ 'type': 'object'},
+ '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'},
+ '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'},
+ '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(None)
+ async def AddCloud(self, cloud, name):
+ '''
+ cloud : Cloud
+ name : str
+ Returns -> None
+ '''
+ # map input types to rpc msg
+ _params = dict()
+ msg = dict(type='Cloud',
+ request='AddCloud',
+ version=3,
+ params=_params)
+ _params['cloud'] = cloud
+ _params['name'] = name
+ reply = await self.rpc(msg)
+ return reply
+
+
+
+ @ReturnMapping(ErrorResults)
+ async def AddCredentials(self, credentials):
+ '''
+ credentials : typing.Sequence[~TaggedCredential]
+ Returns -> typing.Sequence[~ErrorResult]
+ '''
+ # map input types to rpc msg
+ _params = dict()
+ msg = dict(type='Cloud',
+ request='AddCredentials',
+ version=3,
+ params=_params)
+ _params['credentials'] = credentials
+ reply = await self.rpc(msg)
+ return reply
+
+
+
+ @ReturnMapping(UpdateCredentialResults)
+ async def CheckCredentialsModels(self, credentials):
+ '''
+ credentials : typing.Sequence[~TaggedCredential]
+ Returns -> typing.Sequence[~UpdateCredentialResult]
+ '''
+ # map input types to rpc msg
+ _params = dict()
+ msg = dict(type='Cloud',
+ request='CheckCredentialsModels',
+ version=3,
+ params=_params)
+ _params['credentials'] = credentials
+ reply = await self.rpc(msg)
+ return reply
+
+
+
+ @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=3,
+ params=_params)
+ _params['entities'] = entities
+ reply = await self.rpc(msg)
+ return reply
+
+
+
+ @ReturnMapping(CloudInfoResults)
+ async def CloudInfo(self, entities):
+ '''
+ entities : typing.Sequence[~Entity]
+ Returns -> typing.Sequence[~CloudInfoResult]
+ '''
+ # map input types to rpc msg
+ _params = dict()
+ msg = dict(type='Cloud',
+ request='CloudInfo',
+ version=3,
+ 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=3,
+ 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=3,
+ params=_params)
+ _params['entities'] = entities
+ reply = await self.rpc(msg)
+ return reply
+
+
+
+ @ReturnMapping(CredentialContentResults)
+ async def CredentialContents(self, credentials, include_secrets):
+ '''
+ credentials : typing.Sequence[~CloudCredentialArg]
+ include_secrets : bool
+ Returns -> typing.Sequence[~CredentialContentResult]
+ '''
+ # map input types to rpc msg
+ _params = dict()
+ 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 DefaultCloud(self):
+ '''
+
+ Returns -> typing.Union[_ForwardRef('Error'), str]
+ '''
+ # map input types to rpc msg
+ _params = dict()
+ msg = dict(type='Cloud',
+ request='DefaultCloud',
+ version=3,
+ 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=3,
+ params=_params)
+ _params['constraints'] = constraints
+ reply = await self.rpc(msg)
+ return reply
+
+
+
+ @ReturnMapping(ListCloudInfoResults)
+ async def ListCloudInfo(self, all_, user_tag):
+ '''
+ all_ : bool
+ user_tag : str
+ Returns -> typing.Sequence[~ListCloudInfoResult]
+ '''
+ # map input types to rpc msg
+ _params = dict()
+ 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(ErrorResults)
+ async def ModifyCloudAccess(self, changes):
+ '''
+ changes : typing.Sequence[~ModifyCloudAccess]
+ Returns -> typing.Sequence[~ErrorResult]
+ '''
+ # map input types to rpc msg
+ _params = dict()
+ msg = dict(type='Cloud',
+ request='ModifyCloudAccess',
+ version=3,
+ params=_params)
+ _params['changes'] = changes
+ reply = await self.rpc(msg)
+ return reply
+
+
+
+ @ReturnMapping(ErrorResults)
+ async def RemoveClouds(self, entities):
+ '''
+ entities : typing.Sequence[~Entity]
+ Returns -> typing.Sequence[~ErrorResult]
+ '''
+ # map input types to rpc msg
+ _params = dict()
+ msg = dict(type='Cloud',
+ request='RemoveClouds',
+ version=3,
+ params=_params)
+ _params['entities'] = entities
+ reply = await self.rpc(msg)
+ return reply
+
+
+
+ @ReturnMapping(ErrorResults)
+ async def RevokeCredentialsCheckModels(self, credentials):
+ '''
+ credentials : typing.Sequence[~RevokeCredentialArg]
+ Returns -> typing.Sequence[~ErrorResult]
+ '''
+ # map input types to rpc msg
+ _params = dict()
+ msg = dict(type='Cloud',
+ request='RevokeCredentialsCheckModels',
+ version=3,
+ params=_params)
+ _params['credentials'] = credentials
+ reply = await self.rpc(msg)
+ return reply
+
+
+
+ @ReturnMapping(UpdateCredentialResults)
+ async def UpdateCredentialsCheckModels(self, credentials, force):
+ '''
+ credentials : typing.Sequence[~TaggedCredential]
+ force : bool
+ Returns -> typing.Sequence[~UpdateCredentialResult]
+ '''
+ # map input types to rpc msg
+ _params = dict()
+ msg = dict(type='Cloud',
+ request='UpdateCredentialsCheckModels',
+ version=3,
+ params=_params)
+ _params['credentials'] = credentials
+ _params['force'] = force
+ 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=3,
+ params=_params)
+ _params['user-clouds'] = user_clouds
+ reply = await self.rpc(msg)
+ return reply
+
+
+
class ControllerFacade(Type):
name = 'Controller'
version = 3
@@ -883,11 +1981,14 @@
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 @@
@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 @@
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 @@
'''
# 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 @@
'''
# 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 @@
@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 @@
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 @@
@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 @@
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 @@
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 @@
@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 @@
@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 @@
'''
# 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 @@
'''
# 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 @@
@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 @@
@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 @@
'''
# 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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
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 @@
@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 @@
'''
# 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 @@
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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
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 @@
@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 @@
@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 @@
@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 @@
@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 @@
'''
# 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 @@
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 @@
@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 @@
@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 @@
@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 @@
@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 @@
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 @@
@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 @@
@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 @@
@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 @@
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 @@
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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
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 @@
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 @@
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 @@
@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 @@
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 @@
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 @@
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 @@
@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 @@
@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 @@
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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
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 @@
@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 @@
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 @@
'''
# 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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
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 @@
@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 @@
@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 @@
@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 @@
'''
# 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 @@
@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 @@
@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 @@
'''
# 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 @@
'''
# 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 @@
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 @@
@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 @@
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 @@
'''
# 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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
'''
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 @@
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 @@
@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 @@
@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 @@
'''
# 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 @@
@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 @@
@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 @@
@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 @@
@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 @@
'''
# 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 @@
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 @@
'''
# 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 @@
'''
# 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 @@
@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 @@
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 @@
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 @@
'''
# 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 @@
@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 @@
'''
# 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 @@
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 @@
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 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 @@
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 @@
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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
'''
# 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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
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 @@
'''
# 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 @@
@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 @@
@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 @@
@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 @@
'''
# 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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
'''
# 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 @@
@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 @@
@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 @@
@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 @@
'''
# 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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
'''
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 @@
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 @@
@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 @@
@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 @@
'''
# 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 @@
@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 @@
@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 @@
@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 @@
@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 @@
'''
# 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 @@
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 @@
'''
# 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 @@
'''
# 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 @@
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 @@
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 @@
'''
# 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 @@
@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 @@
'''
# 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 @@
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 @@
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 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 @@
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 @@
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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
'''
# 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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
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 @@
'''
# 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 @@
@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 @@
@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 @@
@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 @@
'''
# 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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
'''
# 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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
'''
# 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 @@
@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 @@
@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 @@
'''
# 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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
_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 @@
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 @@
'''
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 @@
_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 @@
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 @@
_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 @@
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 @@
_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 @@
_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 @@
_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 @@
_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 @@
_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 @@
'''
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 @@
_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 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 @@
_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 @@
_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 @@
'''
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 @@
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 @@
_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 @@
_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 @@
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 @@
_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 @@
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 @@
_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 @@
_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 @@
'''
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 @@
_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 @@
_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 @@
_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 @@
_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 @@
_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 @@
_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 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):
+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
- channel : str
- charm_url : str
- config : typing.Mapping<~KT, +VT_co>[str, str]
- config_yaml : str
- constraints : Value
- endpoint_bindings : typing.Mapping<~KT, +VT_co>[str, str]
- num_units : int
- placement : typing.Sequence<+T_co>[~Placement]<~Placement>
- resources : typing.Mapping<~KT, +VT_co>[str, str]
- series : str
- storage : typing.Mapping<~KT, +VT_co>[str, ~Constraints]<~Constraints>
+ 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', '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[str, str]
+ config_yaml : str
+ constraints : Value
+ devices : typing.Mapping[str, ~Constraints]
+ endpoint_bindings : typing.Mapping[str, str]
+ num_units : int
+ placement : typing.Sequence[~Placement]
+ policy : str
+ resources : typing.Mapping[str, str]
+ series : str
+ 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 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 @@
'''
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 @@
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 @@
_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 @@
'''
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 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 @@
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 @@
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 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 @@
'''
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 @@
'''
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 @@
_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 @@
_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 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 @@
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 @@
_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 @@
_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 @@
_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 @@
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 @@
_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 @@
_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 @@
_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 @@
_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 @@
_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 @@
_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 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 @@
_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 @@
_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 @@
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 @@
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 @@
_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 @@
_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 @@
_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 @@
_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 @@
_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 @@
_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 @@
_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,6 +1999,32 @@
+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'}
@@ -1611,12 +2043,33 @@
_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 @@
_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 @@
_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 @@
_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 @@
_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 @@
_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 @@
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 @@
_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 @@
_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 @@
_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 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 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 @@
_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 @@
_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 @@
'''
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 @@
_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 @@
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 @@
_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 @@
_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 @@
_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 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 @@
_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 @@
_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 @@
_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 @@
_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 @@
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 @@
_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 @@
_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 @@
_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 @@
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 @@
_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 @@
_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,6 +3158,21 @@
+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):
+ '''
+ interface : str
+ name : str
+ role : str
+ '''
+ 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'}
@@ -2373,7 +3195,7 @@
_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 @@
_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 @@
_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 @@
_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 @@
_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 @@
_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 @@
_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 @@
_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 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 @@
_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 @@
_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 @@
_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 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 @@
_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 @@
_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 @@
_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 @@
_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 @@
_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 @@
_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 @@
_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 @@
'''
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 @@
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 @@
_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 @@
_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 @@
_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 @@
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 @@
_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 @@
_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 @@
_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 @@
_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 @@
_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 @@
_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 @@
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 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):
+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):
'''
- applications : typing.Mapping<~KT, +VT_co>[str, ~ApplicationStatus]<~ApplicationStatus>
- machines : typing.Mapping<~KT, +VT_co>[str, ~MachineStatus]<~MachineStatus>
+ 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', '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[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 @@
_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 @@
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 @@
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 @@
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 @@
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 @@
_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 @@
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 @@
_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 @@
_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 @@
_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 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 @@
_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 @@
'''
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 @@
_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 @@
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 @@
_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 @@
_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 @@
_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 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 @@
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,12 +4621,261 @@
_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 KnownServiceArgs(Type):
+ _toSchema = {'known_services': 'known-services'}
+ _toPy = {'known-services': 'known_services'}
+ def __init__(self, known_services=None, **unknown_fields):
+ '''
+ known_services : typing.Sequence[str]
+ '''
+ self.known_services = known_services
+
+
+
+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):
+ '''
+ attributes : typing.Mapping[str, str]
+ count : int
+ type_ : str
+ '''
+ self.attributes = attributes
+ self.count = count
+ self.type_ = type_
+
+
+
+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):
+ '''
+ mount_point : str
+ provider : str
+ read_only : bool
+ '''
+ self.mount_point = mount_point
+ self.provider = provider
+ self.read_only = read_only
+
+
+
+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):
+ '''
+ 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.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 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):
+ '''
+ attachment : KubernetesFilesystemAttachmentParams
+ attributes : typing.Mapping[str, typing.Any]
+ provider : str
+ size : int
+ storagename : str
+ tags : typing.Mapping[str, str]
+ '''
+ 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 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'}
@@ -3528,7 +4894,7 @@
_toPy = {'results': 'results'}
def __init__(self, results=None, **unknown_fields):
'''
- results : typing.Sequence<+T_co>[~LifeResult]<~LifeResult>
+ results : typing.Sequence[~LifeResult]
'''
self.results = [LifeResult.from_json(o) for o in results or []]
@@ -3539,18 +4905,79 @@
_toPy = {'result': 'result'}
def __init__(self, result=None, **unknown_fields):
'''
- result : typing.Sequence<+T_co>[~CloudImageMetadata]<~CloudImageMetadata>
+ 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<+T_co>[~ImageMetadata]<~ImageMetadata>
+ result : typing.Sequence[~ImageMetadata]
'''
self.result = [ImageMetadata.from_json(o) for o in result or []]
@@ -3561,7 +4988,7 @@
_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 []]
@@ -3585,7 +5012,7 @@
_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 @@
_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 @@
_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 @@
_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 @@
_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 @@
_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 @@
_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 @@
_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 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 @@
_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 @@
_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 @@
_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 @@
_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 @@
_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 @@
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 @@
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 @@
_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 @@
_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 @@
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 @@
_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 @@
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 @@
_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 @@
_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 @@
_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 @@
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 @@
_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 @@
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 @@
_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 @@
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 @@
_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 @@
_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 @@
_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 @@
_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 @@
'''
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 @@
_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 @@
_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 @@
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 @@
_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 @@
_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 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 @@
_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 @@
_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 @@
_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 @@
_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 @@
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 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 @@
'''
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 @@
_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 @@
_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 @@
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 @@
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 @@
_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 @@
_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 @@
_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 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 @@
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 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 @@
name : str
region : str
sla : str
+ type_ : str
version : str
'''
self.available_version = available_version
@@ -4749,6 +6276,7 @@
self.name = name
self.region = region
self.sla = sla
+ self.type_ = type_
self.version = version
@@ -4758,12 +6286,94 @@
_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 @@
_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 @@
'''
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 @@
_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 @@
_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 @@
_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 @@
_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 @@
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 @@
_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 @@
_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 @@
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 @@
_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 @@
_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 @@
_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 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_ : str
id_ : str
- labels : typing.Sequence<+T_co>[str]
+ labels : typing.Sequence[str]
machine : str
status : str
type_ : str
@@ -5149,7 +7001,7 @@
_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 @@
_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 @@
_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 @@
_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 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 @@
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 @@
_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 @@
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 @@
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 @@
_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 @@
_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 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 @@
_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 @@
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 @@
_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 @@
_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 @@
_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 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 @@
_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 @@
_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 @@
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 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 @@
_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 @@
_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 @@
_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 @@
'''
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 @@
_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 @@
'''
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 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 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,12 +8107,91 @@
+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]
+ settings : typing.Mapping[str, typing.Any]
unit_id : RemoteEntityId
'''
self.settings = settings
@@ -5874,14 +8199,25 @@
+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.relation_units = [RemoteRelationUnit.from_json(o) for o in relation_units or []]
+
+
+
class RemoteRelationsChange(Type):
_toSchema = {'changed': 'changed', 'initial': 'initial', 'removed': 'removed'}
_toPy = {'changed': 'changed', 'initial': 'initial', 'removed': 'removed'}
def __init__(self, changed=None, initial=None, removed=None, **unknown_fields):
'''
- changed : typing.Sequence<+T_co>[~RemoteRelationChange]<~RemoteRelationChange>
+ 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 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 @@
'''
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 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 @@
_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 @@
_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 @@
_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 @@
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 @@
_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 @@
_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 @@
_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 @@
_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 @@
_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 @@
_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 @@
_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 @@
_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 @@
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 @@
_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 @@
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 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 @@
_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 @@
_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 @@
_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 @@
_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 @@
_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 @@
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 @@
_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 @@
_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 @@
'''
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 @@
_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 @@
_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 @@
_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 @@
_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 @@
_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 @@
_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 @@
_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 @@
_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 @@
_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 @@
_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 @@
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 @@
_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 @@
_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 @@
_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 @@
_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 @@
_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 @@
_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 @@
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 @@
_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 @@
_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 @@
_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 @@
_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 @@
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 @@
_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 @@
_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,7 +9778,7 @@
_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 []]
@@ -7154,7 +9795,7 @@
space_tag : str
status : str
vlan_tag : int
- zones : typing.Sequence<+T_co>[str]
+ zones : typing.Sequence[str]
'''
self.cidr = cidr
self.life = life
@@ -7179,6 +9820,54 @@
+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.credentials = [TaggedCredential.from_json(o) for o in credentials or []]
+
+
+
+class TokenResult(Type):
+ _toSchema = {'error': 'error', 'token': 'token'}
+ _toPy = {'error': 'error', 'token': 'token'}
+ def __init__(self, error=None, token=None, **unknown_fields):
+ '''
+ error : Error
+ token : str
+ '''
+ self.error = Error.from_json(error) if error else None
+ self.token = token
+
+
+
+class TokenResults(Type):
+ _toSchema = {'results': 'results'}
+ _toPy = {'results': 'results'}
+ def __init__(self, results=None, **unknown_fields):
+ '''
+ results : typing.Sequence[~TokenResult]
+ '''
+ self.results = [TokenResult.from_json(o) for o in results or []]
+
+
+
class Tools(Type):
_toSchema = {'sha256': 'sha256', 'size': 'size', 'url': 'url', 'version': 'version'}
_toPy = {'sha256': 'sha256', 'size': 'size', 'url': 'url', 'version': 'version'}
@@ -7203,7 +9892,7 @@
'''
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 @@
_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 @@
_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 @@
_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 @@
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 @@
_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 @@
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 @@
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 @@
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 @@
_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 @@
_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 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 @@
_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 @@
_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 @@
_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 @@
_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 @@
_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 @@
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 @@
_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 @@
_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 @@
_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 @@
_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 @@
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 @@
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 @@
_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 @@
_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 @@
_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 @@
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 @@
_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 @@
_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 @@
_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 @@
_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 @@
_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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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)
+ url = "wss://{}/api".format(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
+ 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 @@
# 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 @@
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 @@
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 @@
# 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 @@
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 @@
"/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 @@
return
async with monitor.reconnecting:
await self.close()
- await self._connect()
+ await self._connect_with_login([(self.endpoint, self.cacert)])
- 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))
+ async def _connect(self, endpoints):
+ if len(endpoints) == 0:
+ raise errors.JujuConnectionError('no endpoints to connect to')
- response = result['response']
- self.info = response.copy()
- self.build_facades(response.get('facades', {}))
- self.loop.create_task(self.pinger())
- self.monitor.pinger_stopped.clear()
+ async def _try_endpoint(endpoint, cacert, delay):
+ if delay:
+ await asyncio.sleep(delay)
+ return await self._open(endpoint, cacert)
- @classmethod
- async def connect(
- cls, endpoint, uuid, username, password, cacert=None,
- macaroons=None, loop=None, max_frame_size=None):
+ # 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()
+
+ 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.
-
+ :return: The response field of login response JSON object.
"""
- client = cls(endpoint, uuid, username, password, cacert, macaroons,
- loop, max_frame_size)
- await client._connect()
- return client
+ 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()
- @classmethod
- async def connect_current(cls, loop=None, max_frame_size=None):
- """Connect to the currently active model.
+ 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()
- """
- jujudata = JujuData()
-
- controller_name = jujudata.current_controller()
- if not controller_name:
- raise JujuConnectionError('No current controller')
-
- model_name = jujudata.current_model()
-
- return await cls.connect_model(
- '{}:{}'.format(controller_name, model_name), loop, max_frame_size)
-
- @classmethod
- async def connect_current_controller(cls, loop=None, max_frame_size=None):
- """Connect to the currently active controller.
-
- """
- jujudata = JujuData()
- controller_name = jujudata.current_controller()
- if not controller_name:
- raise JujuConnectionError('No current controller')
-
- return await cls.connect_controller(controller_name, loop,
- max_frame_size)
-
- @classmethod
- async def connect_controller(cls, controller_name, loop=None,
- max_frame_size=None):
- """Connect to a controller by name.
-
- """
- jujudata = JujuData()
- controller = jujudata.controllers()[controller_name]
- endpoint = controller['api-endpoints'][0]
- cacert = controller.get('ca-cert')
- accounts = jujudata.accounts()[controller_name]
- username = accounts['user']
- password = accounts.get('password')
- macaroons = get_macaroons(controller_name) if not password else None
-
- return await cls.connect(
- endpoint, None, username, password, cacert, macaroons, loop,
- max_frame_size)
-
- @classmethod
- async def connect_model(cls, model, loop=None, max_frame_size=None):
- """Connect to a model by name.
-
- :param str model: [<controller>:]<model>
-
- """
- jujudata = JujuData()
-
- if ':' in model:
- # explicit controller given
- controller_name, model_name = model.split(':')
- else:
- # use the current controller if one isn't explicitly given
- controller_name = jujudata.current_controller()
- model_name = model
-
- accounts = jujudata.accounts()[controller_name]
- username = accounts['user']
- # model name must include a user prefix, so add it if it doesn't
- if '/' not in model_name:
- model_name = '{}/{}'.format(username, model_name)
-
- controller = jujudata.controllers()[controller_name]
- endpoint = controller['api-endpoints'][0]
- cacert = controller.get('ca-cert')
- password = accounts.get('password')
- models = jujudata.models()[controller_name]
- model_uuid = models['models'][model_name]['uuid']
- macaroons = get_macaroons(controller_name) if not password else None
-
- return await cls.connect(
- endpoint, model_uuid, username, password, cacert, macaroons, loop,
- max_frame_size)
-
- def build_facades(self, facades):
+ 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)
+ 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]
- result = await self.rpc({
- "type": "Admin",
- "request": "Login",
- "version": 3,
- "params": {
- "auth-tag": username,
- "credentials": self.password,
- "nonce": "".join(random.sample(string.printable, 12)),
- "macaroons": self.macaroons
- }})
- return result
-
- async def redirect_info(self):
try:
- result = await self.rpc({
+ return await self.rpc({
+ "type": "Admin",
+ "request": "Login",
+ "version": 3,
+ "params": params,
+ })
+ 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,
- })
- except JujuAPIError as e:
- if e.message == 'not redirected':
- return None
- raise
- return result['response']
+ }))['response']
+ raise errors.JujuRedirectException(redirect_info) from e
-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))
+class _Task:
+ def __init__(self, task, loop):
+ self.stopped = asyncio.Event(loop=loop)
+ self.stopped.set()
+ self.task = task
+ self.loop = loop
- def current_controller(self):
- cmd = shlex.split('juju list-controllers --format yaml')
- output = subprocess.check_output(cmd)
- output = yaml.safe_load(output)
- return output.get('current-controller', '')
-
- def current_model(self, controller_name=None):
- if not controller_name:
- controller_name = self.current_controller()
- models = self.models()[controller_name]
- if 'current-model' not in models:
- raise JujuError('No current model')
- return models['current-model']
-
- def controllers(self):
- return self._load_yaml('controllers.yaml', 'controllers')
-
- def models(self):
- return self._load_yaml('models.yaml', 'controllers')
-
- def accounts(self):
- return self._load_yaml('accounts.yaml', 'controllers')
-
- def _load_yaml(self, filename, key):
- filepath = os.path.join(self.path, filename)
- with io.open(filepath, 'rt') as f:
- return yaml.safe_load(f)[key]
-
-
-def get_macaroons(controller_name=None):
- """Decode and return macaroons from default ~/.go-cookies
-
- """
- cookie_files = []
- if controller_name:
- cookie_files.append('~/.local/share/juju/cookies/{}.json'.format(
- controller_name))
- cookie_files.append('~/.go-cookies')
- for cookie_file in cookie_files:
- cookie_file = Path(cookie_file).expanduser()
- if cookie_file.exists():
+ 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 []
+ return await self.task()
+ finally:
+ self.stopped.set()
+ self.stopped.clear()
+ self.loop.create_task(run())
- 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
- ]
+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: <controller>:<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 @@
# Classes and helper functions that we'll write to _client.py
LOOKUP_FACADE = '''
def lookup_facade(name, version):
- """
- Given a facade name and version, attempt to pull that facade out
- of the correct client<version>.py file.
+ """
+ Given a facade name and version, attempt to pull that facade out
+ of the correct client<version>.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 @@
@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 @@
return self[refname]
+
_types = TypeRegistry()
_registry = KindRegistry()
CLASSES = {}
@@ -170,13 +179,13 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
return captures
+
def setup():
parser = argparse.ArgumentParser()
parser.add_argument("-s", "--schema", default="juju/client/schemas*")
@@ -769,6 +801,7 @@
options = parser.parse_args()
return options
+
def main():
options = setup()
@@ -780,5 +813,6 @@
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 @@
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 @@
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 @@
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 @@
# 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 @@
"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 @@
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 @@
# 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.
+ 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
+ self._connector = connector.Connector(
+ loop=loop,
+ max_frame_size=max_frame_size,
+ bakery_client=bakery_client,
+ jujudata=jujudata,
+ )
- async def connect(
- self, endpoint, username, password, cacert=None, macaroons=None):
- """Connect to an arbitrary Juju controller.
+ 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 @@
: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 @@
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 @@
owner,
region
)
-
- # Add our ssh key to the model, to work around
- # https://bugs.launchpad.net/juju/+bug/1643076
- try:
- ssh_key = await utils.read_ssh_key(loop=self.loop)
-
- if self.controller_name:
- model_name = "{}:{}".format(self.controller_name, model_name)
-
- cmd = ['juju', 'add-ssh-key', '-m', model_name, ssh_key]
-
- await utils.execute_process(*cmd, log=log, loop=self.loop)
- except Exception:
- log.exception(
- "Could not add ssh key to model. You will not be able "
- "to ssh into machines in this model. "
- "Manually running `juju add-ssh-key <key>` in the cli "
- "may fix this problem.")
-
- model = Model()
- await model.connect(
- self.connection.endpoint,
- model_info.uuid,
- self.connection.username,
- self.connection.password,
- self.connection.cacert,
- self.connection.macaroons,
- loop=self.loop,
- )
+ 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 @@
: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 @@
"""
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 @@
: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 @@
"""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 @@
"""
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)
- return await controller_facade.AllModels()
+ 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())
+ 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 @@
"""
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 @@
"""
raise NotImplementedError()
- def get_model(self, name):
- """Get a model by name.
+ async def get_model(self, model):
+ """Get a model by name or UUID.
- :param str name: Model name
-
+ :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.
+
+ :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'):
- """Set access level of the given user on the controller
-
+ """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])
+ 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):
- """Removes all access from a controller
+ 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 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 @@
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 @@
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 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 @@
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 @@
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 @@
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 @@
: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 @@
: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 @@
'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 @@
"""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 @@
"""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 @@
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 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 @@
return True
-class ModelObserver(object):
+class ModelObserver:
"""
Base class for creating observers that react to changes in a model.
"""
@@ -100,7 +102,7 @@
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 @@
"""
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 @@
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 @@
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 @@
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.loop = loop or asyncio.get_event_loop()
- self.max_frame_size = max_frame_size
- self.connection = None
- self.observers = weakref.WeakValueDictionary()
+ 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.loop)
- self._watch_stopped = asyncio.Event(loop=self.loop)
- self._watch_received = asyncio.Event(loop=self.loop)
- self._charmstore = CharmStore(self.loop)
+ 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:
+ """
+ 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.
+ Otherwise, all of the ``endpoint``, ``uuid``, 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 ``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.
"""
- if 'loop' not in kw:
- kw['loop'] = self.loop
- if 'max_frame_size' not in kw:
- kw['max_frame_size'] = self.max_frame_size
- self.connection = await connection.Connection.connect(*args, **kw)
- await self._after_connect()
-
- async def connect_current(self):
- """Connect to the current Juju model.
-
- """
- self.connection = await connection.Connection.connect_current(
- self.loop, max_frame_size=self.max_frame_size)
+ await self.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
-
"""
- self.connection = await connection.Connection.connect_model(
- model_name, self.loop, self.max_frame_size)
+ .. 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.
+ """
+ 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 @@
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 @@
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 @@
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 @@
"""
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 @@
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 @@
"""
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 @@
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 @@
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 @@
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 @@
'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 @@
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 @@
# '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 @@
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 @@
(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 @@
"""
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 @@
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 @@
:param str relation2: '<application>[:<relation_name>]'
"""
- 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 @@
(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 @@
: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 @@
: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 @@
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 @@
: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 @@
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 @@
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 @@
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 @@
# 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 @@
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 @@
} 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 @@
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 @@
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 @@
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 @@
"""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 @@
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 @@
config[key] = ConfigValue.from_json(value)
return config
- def get_constraints(self):
+ async def get_constraints(self):
"""Return the machine constraints for this model.
+ :returns: A ``dict`` of constraints.
"""
- raise NotImplementedError()
+ constraints = {}
+ client_facade = client.ClientFacade.from_connection(self.connection())
+ result = await client_facade.GetModelConstraints()
- 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])
+ # 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 @@
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 @@
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 @@
: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 @@
"""
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 @@
`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.
- 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 _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
+
+ 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 @@
: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 @@
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 @@
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 @@
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 @@
', '.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 @@
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 @@
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 @@
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 @@
], 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 @@
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 @@
@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 @@
# 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 @@
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 @@
: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 @@
endpoint_bindings=endpoint_bindings,
resources=resources,
storage=storage,
+ devices=devices,
+ num_units=num_units,
)
return application
@@ -1886,6 +2166,20 @@
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 @@
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 @@
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 @@
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 @@
log = logging.getLogger(__name__)
+class Endpoint:
+ def __init__(self, model, data):
+ self.model = model
+ self.data = data
+
+ def __repr__(self):
+ return '<Endpoint {}:{}>'.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 '<Relation id={} {}>'.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 ``<application>[:<endpoint_name>]``
+ where the ``:<endpoint_name>`` 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 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 @@
"""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 @@
"""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 @@
"""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 @@
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 @@
"""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 @@
: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 @@
: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 @@
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 @@
'''
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 @@
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 @@
await queue.put(value)
-async def run_with_interrupt(task, event, loop=None):
- """
- Awaits a task while allowing it to be interrupted by an `asyncio.Event`.
+async def block_until(*conditions, timeout=None, wait_period=0.5, loop=None):
+ """Return only after all conditions are true.
- 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.
+ """
+ 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 one or more
+ `asyncio.Event`s.
+
+ 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 <ip>:<port>
+ :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 @@
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 @@
"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 mock
+from juju.client.jujudata import FileJujuData
+from juju.controller import Controller
import pytest
-from juju.controller import Controller
-from juju.client.connection import JujuData
-
def is_bootstrapped():
- result = subprocess.run(['juju', 'switch'], stdout=subprocess.PIPE)
- return (
- result.returncode == 0 and
- len(result.stdout.decode().strip()) > 0)
+ 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_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 = 'model-{}'.format(uuid.uuid4())
- self.model = await self.controller.add_model(model_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 @@
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 @@
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 @@
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 @@
@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 juju.client.connection import Connection
+from juju.controller import Controller
+from juju.utils import run_with_interrupt
+
+import pytest
+import websockets
+
from .. import base
-@base.bootstrapped
-@pytest.mark.asyncio
-async def test_connect_current(event_loop):
- async with base.CleanModel():
- conn = await Connection.connect_current()
-
- assert isinstance(conn, Connection)
- await conn.close()
+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 @@
@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 @@
channel='stable',
)
- c = client.ClientFacade.from_connection(model.connection)
+ c = client.ClientFacade.from_connection(model.connection())
await c.FullStatus(None)
@@ -64,15 +68,8 @@
@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 @@
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_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_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:
- 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
+ raise AssertionError('Unable to connect with new password')
+ finally:
+ if new_connection:
+ await new_connection.close()
@base.bootstrapped
@pytest.mark.asyncio
-async def test_grant(event_loop):
+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:
+ kwargs = controller.connection().connect_params()
+ kwargs['username'] = username
+ kwargs['password'] = 'password'
+ new_connection = await Connection.connect(**kwargs)
+ except JujuAPIError:
+ pass
+ finally:
+ # No connection with old password
+ assert new_connection is None
+
+
+@base.bootstrapped
+@pytest.mark.asyncio
+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 @@
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 @@
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 @@
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 @@
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 @@
@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 @@
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',
@@ -93,6 +148,115 @@
@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):
from juju.relation import Relation
@@ -111,17 +275,44 @@
# 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
@@ -131,18 +322,6 @@
@base.bootstrapped
@pytest.mark.asyncio
-async def test_explicit_loop(event_loop):
- async with base.CleanModel() as model:
- model_name = model.info.name
- new_loop = asyncio.new_event_loop()
- new_loop.run_until_complete(
- _deploy_in_loop(new_loop, model_name))
- await model._wait_for_new('application', 'ubuntu')
- assert 'ubuntu' in model.applications
-
-
-@base.bootstrapped
-@pytest.mark.asyncio
async def test_explicit_loop_threaded(event_loop):
async with base.CleanModel() as model:
model_name = model.info.name
@@ -150,7 +329,9 @@
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 @@
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 @@
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 @@
@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 @@
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 @@
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 @@
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 @@
"""
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 @@
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 @@
@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 @@
{'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 @@
from juju import constraints
+
class TestConstraints(unittest.TestCase):
def test_mem_regex(self):
@@ -31,6 +32,12 @@
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 @@
)
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 @@
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 @@
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 @@
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 @@
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 @@
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:py35]
-# default tox env excludes integration tests
-commands = py.test -ra -v -s -x -n auto -k 'not integration' {posargs}
+[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: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/_*