[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