The following pull request was submitted through Github. It can be accessed and reviewed at: https://github.com/lxc/pylxd/pull/441
This e-mail was sent by the LXC bot, direct replies will not reach the author unless they happen to be subscribed to this list. === Description (from pull-request) ===
From 1485daefc9eacffe915361207db4bc3b97bdb83f Mon Sep 17 00:00:00 2001 From: Alberto Donato <alberto.don...@canonical.com> Date: Mon, 14 Dec 2020 12:52:05 +0100 Subject: [PATCH 1/2] Extract InstanceState logic to AttributeDict Signed-off-by: Alberto Donato <alberto.don...@canonical.com> --- pylxd/models/_model.py | 12 ++++++++++++ pylxd/models/instance.py | 8 ++------ pylxd/tests/models/test_model.py | 12 ++++++++++++ 3 files changed, 26 insertions(+), 6 deletions(-) diff --git a/pylxd/models/_model.py b/pylxd/models/_model.py index f05f4eae..65d3a11d 100644 --- a/pylxd/models/_model.py +++ b/pylxd/models/_model.py @@ -13,12 +13,24 @@ # under the License. import os import warnings +from copy import deepcopy from pylxd import exceptions MISSING = object() +class AttributeDict: + """Wrap a dict making keys accessible as attributes.""" + + def __init__(self, dct): + for key, value in dct.items(): + setattr(self, key, value) + + def _asdict(self): + return deepcopy(self.__dict__) + + class Attribute: """A metadata class for model attributes.""" diff --git a/pylxd/models/instance.py b/pylxd/models/instance.py index 01ed452b..afb748bd 100644 --- a/pylxd/models/instance.py +++ b/pylxd/models/instance.py @@ -34,13 +34,9 @@ from pylxd.models.operation import Operation -class InstanceState: +class InstanceState(model.AttributeDict): """A simple object for representing instance state.""" - def __init__(self, **kwargs): - for key, value in kwargs.items(): - setattr(self, key, value) - _InstanceExecuteResult = collections.namedtuple( "InstanceExecuteResult", ["exit_code", "stdout", "stderr"] @@ -357,7 +353,7 @@ def _set_state(self, state, timeout=30, force=True, wait=False): def state(self): response = self.api.state.get() - state = InstanceState(**response.json()["metadata"]) + state = InstanceState(response.json()["metadata"]) return state def start(self, timeout=30, force=True, wait=False): diff --git a/pylxd/tests/models/test_model.py b/pylxd/tests/models/test_model.py index 1b626132..cda5182f 100644 --- a/pylxd/tests/models/test_model.py +++ b/pylxd/tests/models/test_model.py @@ -33,6 +33,18 @@ class ChildItem(Item): """A fake model child class.""" +class TestAttributeDict: + def test_from_dict(self): + a = model.AttributeDict({"foo": "bar", "baz": "bza"}) + assert a.foo == "bar" + assert a.baz == "bza" + + def test_as_dict(self): + d = {"foo": "bar", "baz": "bza"} + a = model.AttributeDict(d) + assert a._asdict() == d + + class TestModel(testing.PyLXDTestCase): """Tests for pylxd.model.Model.""" From f414b151370a3652ef4159121b15e437137c68fe Mon Sep 17 00:00:00 2001 From: Alberto Donato <alberto.don...@canonical.com> Date: Mon, 14 Dec 2020 13:09:02 +0100 Subject: [PATCH 2/2] add Network.state() Signed-off-by: Alberto Donato <alberto.don...@canonical.com> --- pylxd/models/network.py | 10 ++++++++ pylxd/tests/models/test_network.py | 40 ++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+) diff --git a/pylxd/models/network.py b/pylxd/models/network.py index 61b3a0c8..84cdce59 100644 --- a/pylxd/models/network.py +++ b/pylxd/models/network.py @@ -16,6 +16,10 @@ from pylxd.models import _model as model +class NetworkState(model.AttributeDict): + """A simple object for representing a network state.""" + + class Network(model.Model): """Model representing a LXD network.""" @@ -125,6 +129,12 @@ def save(self, *args, **kwargs): self.client.assert_has_api_extension("network") super().save(*args, **kwargs) + def state(self): + """Get network state.""" + response = self.api.state.get() + state = NetworkState(response.json()["metadata"]) + return state + @property def api(self): return self.client.api.networks[self.name] diff --git a/pylxd/tests/models/test_network.py b/pylxd/tests/models/test_network.py index 3c67533b..148950f6 100644 --- a/pylxd/tests/models/test_network.py +++ b/pylxd/tests/models/test_network.py @@ -216,6 +216,46 @@ def test_delete(self): network.delete() + def test_state(self): + state = { + "addresses": [ + { + "family": "inet", + "address": "10.87.252.1", + "netmask": "24", + "scope": "global", + }, + { + "family": "inet6", + "address": "fd42:6e0e:6542:a212::1", + "netmask": "64", + "scope": "global", + }, + ], + "counters": { + "bytes_received": 0, + "bytes_sent": 17724, + "packets_received": 0, + "packets_sent": 95, + }, + "hwaddr": "36:19:09:9b:f9:aa", + "mtu": 1500, + "state": "up", + "type": "broadcast", + } + self.add_rule( + { + "json": { + "type": "sync", + "metadata": state, + }, + "method": "GET", + "url": r"^http://pylxd.test/1.0/networks/eth0/state$", + } + ) + network = models.Network.get(self.client, "eth0") + assert network.state()._asdict() == state + def test_str(self): """Network is printed in JSON format.""" network = models.Network.get(self.client, "eth0")
_______________________________________________ lxc-devel mailing list lxc-devel@lists.linuxcontainers.org http://lists.linuxcontainers.org/listinfo/lxc-devel