[lxc-devel] [pylxd/master] add support for Network.state()
albertodonato on Github
lxc-bot at linuxcontainers.org
Mon Dec 14 12:29:11 UTC 2020
A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 302 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20201214/3b0e85a5/attachment.bin>
-------------- next part --------------
From 1485daefc9eacffe915361207db4bc3b97bdb83f Mon Sep 17 00:00:00 2001
From: Alberto Donato <alberto.donato at 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.donato at 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.donato at canonical.com>
Date: Mon, 14 Dec 2020 13:09:02 +0100
Subject: [PATCH 2/2] add Network.state()
Signed-off-by: Alberto Donato <alberto.donato at 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")
More information about the lxc-devel
mailing list