[lxc-devel] [pylxd/master] Make models resilient to new attributes in LXD

hsoft on Github lxc-bot at linuxcontainers.org
Fri Jun 2 01:00:16 UTC 2017


A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 655 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20170602/bc1404fb/attachment.bin>
-------------- next part --------------
From 589dc00fadc8e4dbb01071c1d264f2f6f71cb211 Mon Sep 17 00:00:00 2001
From: Virgil Dupras <hsoft at hardcoded.net>
Date: Wed, 31 May 2017 21:15:54 -0400
Subject: [PATCH 1/3] Fix broken CI testing

The whole test suite was broken lately for three reasons:

1. Version in `setp.cfg` was out of sync with git tagging, making `pbr`
   scream.
2. `mock_services` is outdated and unmaintained and doesn't work with
   newer versions of `requests-mock`.
3. The newly added `description` property wasn't properly added in
   mocked LXD.

I've fixed those two problems by updating the `setup.cfg` version,
pinning `requests-mock` to the last version to work and adding a
`description` field to the mocks.

On my machine, all tox tests pass now.
---
 pylxd/tests/mock_lxd.py | 1 +
 setup.cfg               | 2 +-
 test-requirements.txt   | 3 +++
 3 files changed, 5 insertions(+), 1 deletion(-)

diff --git a/pylxd/tests/mock_lxd.py b/pylxd/tests/mock_lxd.py
index 10a3273..e5dc19a 100644
--- a/pylxd/tests/mock_lxd.py
+++ b/pylxd/tests/mock_lxd.py
@@ -185,6 +185,7 @@ def profile_GET(request, context):
                 },
                 'created_at': "1983-06-16T00:00:00-00:00",
                 'last_used_at': "1983-06-16T00:00:00-00:00",
+                'description': "Some description",
                 'devices': {
                     'root': {
                         'path': "/",
diff --git a/setup.cfg b/setup.cfg
index 7abd5b2..62c72db 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -1,7 +1,7 @@
 [metadata]
 name = pylxd
 summary = python library for lxd
-version = 2.2.2
+version = 2.2.4
 description-file =
     README.rst
 author = Paul Hummer
diff --git a/test-requirements.txt b/test-requirements.txt
index ae59d0c..9d3df30 100644
--- a/test-requirements.txt
+++ b/test-requirements.txt
@@ -4,3 +4,6 @@ mock>=1.3.0
 flake8>=2.5.0
 coverage>=4.1
 mock-services>=0.3
+# mock-services is old and unmaintained. Doesn't work with newer versions of
+# requests-mock. Thus, we have to pin it down.
+requests-mock<1.2

From debf7f27fe78009cf90ad7854b3dc91fa45f49e3 Mon Sep 17 00:00:00 2001
From: Virgil Dupras <hsoft at hardcoded.net>
Date: Wed, 31 May 2017 21:32:38 -0400
Subject: [PATCH 2/3] Removing tox envs from travis cache

I suspect that this is what preventing CI checks in PR #233 from
passing.
---
 .travis.yml | 1 -
 1 file changed, 1 deletion(-)

diff --git a/.travis.yml b/.travis.yml
index 11974ad..fc7ed01 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -16,7 +16,6 @@ script:
   - test -d .tox/$TOXENV/log && cat .tox/$TOXENV/log/*.log || true
 cache:
   directories:
-    - .tox/$TOXENV
     - $HOME/.cache/pip
 after_success:
   - codecov

From 5904292b0c82ad0e16181025056aed208f654ac7 Mon Sep 17 00:00:00 2001
From: Virgil Dupras <hsoft at hardcoded.net>
Date: Thu, 1 Jun 2017 20:53:36 -0400
Subject: [PATCH 3/3] Make models resilient to new attributes in LXD

It's been a few times now (ref #188, #230) where we're in a tricky situation
because a new attribute in LXD makes pylxd crash. It's not fun because
it makes us *have* to update pylxd and LXD at the same time.

This commit makes models ignore `AttributeError` during `sync()`, which
should normally fix this problem once and for all.

Depends on #233
---
 pylxd/models/_model.py  | 9 +++++++--
 pylxd/tests/mock_lxd.py | 3 ++-
 2 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/pylxd/models/_model.py b/pylxd/models/_model.py
index c24726b..8eda910 100644
--- a/pylxd/models/_model.py
+++ b/pylxd/models/_model.py
@@ -151,8 +151,13 @@ def sync(self, rollback=False):
         response = self.api.get()
         for key, val in response.json()['metadata'].items():
             if key not in self.__dirty__ or rollback:
-                setattr(self, key, val)
-                self.__dirty__.remove(key)
+                try:
+                    setattr(self, key, val)
+                    self.__dirty__.remove(key)
+                except AttributeError:
+                    # We have received an attribute from the server that we don't support
+                    # in our model. Ignore this error, it doesn't hurt us.
+                    pass
         if rollback:
             self.__dirty__.clear()
 
diff --git a/pylxd/tests/mock_lxd.py b/pylxd/tests/mock_lxd.py
index e5dc19a..201ae67 100644
--- a/pylxd/tests/mock_lxd.py
+++ b/pylxd/tests/mock_lxd.py
@@ -213,7 +213,8 @@ def profile_GET(request, context):
                 ],
                 'stateful': False,
                 'status': "Running",
-                'status_code': 103
+                'status_code': 103,
+                'unsupportedbypylxd': "This attribute is not supported by pylxd. We want to test whether the mere presence of it makes it crash."
             }},
         'method': 'GET',
         'url': r'^http://pylxd.test/1.0/containers/an-container$',


More information about the lxc-devel mailing list