[Python-apps-commits] r13991 - in packages/bundlewrap/trunk (8 files)

highvoltage-guest at users.alioth.debian.org highvoltage-guest at users.alioth.debian.org
Wed May 3 17:46:14 UTC 2017


    Date: Wednesday, May 3, 2017 @ 17:46:14
  Author: highvoltage-guest
Revision: 13991

Update to new upstream version 2.17.1

Modified:
  packages/bundlewrap/trunk/CHANGELOG.md
  packages/bundlewrap/trunk/bundlewrap/__init__.py
  packages/bundlewrap/trunk/bundlewrap/cmdline/lock.py
  packages/bundlewrap/trunk/bundlewrap/group.py
  packages/bundlewrap/trunk/bundlewrap/node.py
  packages/bundlewrap/trunk/debian/changelog
  packages/bundlewrap/trunk/setup.py
  packages/bundlewrap/trunk/tests/integration/bw_nodes.py

Modified: packages/bundlewrap/trunk/CHANGELOG.md
===================================================================
--- packages/bundlewrap/trunk/CHANGELOG.md	2017-05-03 17:25:16 UTC (rev 13990)
+++ packages/bundlewrap/trunk/CHANGELOG.md	2017-05-03 17:46:14 UTC (rev 13991)
@@ -1,3 +1,11 @@
+# 2.17.1
+
+2017-04-19
+
+* fixed parent groups not being removed by subgroups' members_remove
+* fixed `bw lock` trying to connect to dummy nodes
+
+
 # 2.17.0
 
 2017-03-26

Modified: packages/bundlewrap/trunk/bundlewrap/__init__.py
===================================================================
--- packages/bundlewrap/trunk/bundlewrap/__init__.py	2017-05-03 17:25:16 UTC (rev 13990)
+++ packages/bundlewrap/trunk/bundlewrap/__init__.py	2017-05-03 17:46:14 UTC (rev 13991)
@@ -1,5 +1,5 @@
 # -*- coding: utf-8 -*-
 from __future__ import unicode_literals
 
-VERSION = (2, 17, 0)
+VERSION = (2, 17, 1)
 VERSION_STRING = ".".join([str(v) for v in VERSION])

Modified: packages/bundlewrap/trunk/bundlewrap/cmdline/lock.py
===================================================================
--- packages/bundlewrap/trunk/bundlewrap/cmdline/lock.py	2017-05-03 17:25:16 UTC (rev 13990)
+++ packages/bundlewrap/trunk/bundlewrap/cmdline/lock.py	2017-05-03 17:46:14 UTC (rev 13991)
@@ -7,12 +7,22 @@
 from ..lock import softlock_add, softlock_list, softlock_remove
 from ..utils.cmdline import get_target_nodes
 from ..utils.table import ROW_SEPARATOR, render_table
-from ..utils.text import blue, bold, error_summary, green, mark_for_translation as _, \
-    randstr, red
+from ..utils.text import bold, error_summary, green, mark_for_translation as _, randstr, red, \
+    yellow
 from ..utils.time import format_timestamp
 from ..utils.ui import io, page_lines
 
 
+def remove_dummy_nodes(targets):
+    _targets = []
+    for node in targets:
+        if list(node.items):
+            _targets.append(node)
+        else:
+            io.stdout(_("{x} {node}  has no items").format(node=bold(node.name), x=yellow("!")))
+    return _targets
+
+
 def remove_lock_if_present(node, lock_id):
     for lock in softlock_list(node):
         if lock['id'] == lock_id:
@@ -24,6 +34,7 @@
 def bw_lock_add(repo, args):
     errors = []
     target_nodes = get_target_nodes(repo, args['target'], adhoc_nodes=args['adhoc_nodes'])
+    target_nodes = remove_dummy_nodes(target_nodes)
     pending_nodes = target_nodes[:]
     max_node_name_length = max([len(node.name) for node in target_nodes])
     lock_id = randstr(length=4).upper()
@@ -75,6 +86,7 @@
 def bw_lock_remove(repo, args):
     errors = []
     target_nodes = get_target_nodes(repo, args['target'], adhoc_nodes=args['adhoc_nodes'])
+    target_nodes = remove_dummy_nodes(target_nodes)
     pending_nodes = target_nodes[:]
     max_node_name_length = max([len(node.name) for node in target_nodes])
 
@@ -128,6 +140,7 @@
 def bw_lock_show(repo, args):
     errors = []
     target_nodes = get_target_nodes(repo, args['target'], adhoc_nodes=args['adhoc_nodes'])
+    target_nodes = remove_dummy_nodes(target_nodes)
     pending_nodes = target_nodes[:]
     locks_on_node = {}
 

Modified: packages/bundlewrap/trunk/bundlewrap/group.py
===================================================================
--- packages/bundlewrap/trunk/bundlewrap/group.py	2017-05-03 17:25:16 UTC (rev 13990)
+++ packages/bundlewrap/trunk/bundlewrap/group.py	2017-05-03 17:46:14 UTC (rev 13991)
@@ -195,9 +195,35 @@
                 yield group
 
     @cached_property
+    def immediate_parent_groups(self):
+        for group in self.repo.groups:
+            if self in group.immediate_subgroups:
+                yield group
+
+    @cached_property
     def subgroups(self):
         """
         Iterator over all subgroups as group objects.
         """
         for group_name in set(self._check_subgroup_names([self.name])):
             yield self.repo.get_group(group_name)
+
+    @cached_property
+    def immediate_subgroups(self):
+        """
+        Iterator over all immediate subgroups as group objects.
+        """
+        for group_name in set(
+            list(self.immediate_subgroup_names) +
+            list(self._subgroup_names_from_patterns)
+        ):
+            try:
+                yield self.repo.get_group(group_name)
+            except NoSuchGroup:
+                raise RepositoryError(_(
+                    "Group '{group}' has '{subgroup}' listed as a subgroup in groups.py, "
+                    "but no such group could be found."
+                ).format(
+                    group=self.name,
+                    subgroup=group_name,
+                ))

Modified: packages/bundlewrap/trunk/bundlewrap/node.py
===================================================================
--- packages/bundlewrap/trunk/bundlewrap/node.py	2017-05-03 17:25:16 UTC (rev 13990)
+++ packages/bundlewrap/trunk/bundlewrap/node.py	2017-05-03 17:46:14 UTC (rev 13991)
@@ -449,19 +449,27 @@
 
         # we have to add parent groups at the very end, since we might
         # have added or removed subgroups thru .members_add/remove
-        for group in list(_groups):
-            for parent_group in group.parent_groups:
-                if cache_result:
-                    with self._dynamic_group_lock:
-                        self._dynamic_groups_resolved = None
-                        if (
-                            not parent_group.members_remove or
-                            not parent_group.members_remove(self)
-                        ):
-                            _groups.add(parent_group)
-                        self._dynamic_groups_resolved = True
-                else:
-                    _groups.add(parent_group)
+        while True:
+            # Since we're only looking at *immediate* parent groups,
+            # we have to keep doing this until we stop adding parent
+            # groups.
+            _original_groups = _groups.copy()
+            for group in list(_groups):
+                for parent_group in group.immediate_parent_groups:
+                    if cache_result:
+                        with self._dynamic_group_lock:
+                            self._dynamic_groups_resolved = None
+                            if (
+                                not parent_group.members_remove or
+                                not parent_group.members_remove(self)
+                            ):
+                                _groups.add(parent_group)
+                            self._dynamic_groups_resolved = True
+                    else:
+                        _groups.add(parent_group)
+            if _groups == _original_groups:
+                # we didn't add any new parent groups, so we can stop
+                break
 
         if cache_result:
             return sorted(_groups)

Modified: packages/bundlewrap/trunk/debian/changelog
===================================================================
--- packages/bundlewrap/trunk/debian/changelog	2017-05-03 17:25:16 UTC (rev 13990)
+++ packages/bundlewrap/trunk/debian/changelog	2017-05-03 17:46:14 UTC (rev 13991)
@@ -1,3 +1,9 @@
+bundlewrap (2.17.1-1) experimental; urgency=medium
+
+  * New upstream release
+
+ -- Jonathan Carter <jcarter at linux.com>  Wed, 03 May 2017 19:40:19 +0200
+
 bundlewrap (2.17.0-1) unstable; urgency=medium
 
   * New upstream release

Modified: packages/bundlewrap/trunk/setup.py
===================================================================
--- packages/bundlewrap/trunk/setup.py	2017-05-03 17:25:16 UTC (rev 13990)
+++ packages/bundlewrap/trunk/setup.py	2017-05-03 17:46:14 UTC (rev 13991)
@@ -16,7 +16,7 @@
 
 setup(
     name="bundlewrap",
-    version="2.17.0",
+    version="2.17.1",
     description="Config management with Python",
     long_description=(
         "By allowing for easy and low-overhead config management, BundleWrap fills the gap between complex deployments using Chef or Puppet and old school system administration over SSH.\n"

Modified: packages/bundlewrap/trunk/tests/integration/bw_nodes.py
===================================================================
--- packages/bundlewrap/trunk/tests/integration/bw_nodes.py	2017-05-03 17:25:16 UTC (rev 13990)
+++ packages/bundlewrap/trunk/tests/integration/bw_nodes.py	2017-05-03 17:46:14 UTC (rev 13991)
@@ -1,4 +1,3 @@
-from json import loads
 from os.path import join
 
 from bundlewrap.utils.testing import make_repo, run
@@ -126,99 +125,6 @@
     assert rcode == 0
 
 
-def test_group_members_add(tmpdir):
-    make_repo(
-        tmpdir,
-        nodes={
-            "node1": {'os': 'centos'},
-            "node2": {'os': 'debian'},
-            "node3": {'os': 'ubuntu'},
-        },
-    )
-    with open(join(str(tmpdir), "groups.py"), 'w') as f:
-        f.write("""
-groups = {
-    "group1": {
-        'members_add': lambda node: node.os == 'centos',
-    },
-    "group2": {
-        'members': ["node2"],
-        'members_add': lambda node: node.os != 'centos',
-    },
-    "group3": {
-        'members_add': lambda node: not node.in_group("group2"),
-    },
-    "group4": {
-        'members': ["node3"],
-    },
-}
-    """)
-    stdout, stderr, rcode = run("BW_TABLE_STYLE=grep bw nodes -a node1 | grep \tgroups | cut -f 3", path=str(tmpdir))
-    assert stdout == b"group1\ngroup3\n"
-    assert stderr == b""
-    assert rcode == 0
-
-    stdout, stderr, rcode = run("BW_TABLE_STYLE=grep bw nodes -a node2 | grep \tgroups | cut -f 3", path=str(tmpdir))
-    assert stdout == b"group2\n"
-    assert stderr == b""
-    assert rcode == 0
-
-    stdout, stderr, rcode = run("BW_TABLE_STYLE=grep bw nodes -a node3 | grep \tgroups | cut -f 3", path=str(tmpdir))
-    assert stdout == b"group2\ngroup3\ngroup4\n"
-    assert stderr == b""
-    assert rcode == 0
-
-
-def test_group_members_remove(tmpdir):
-    make_repo(
-        tmpdir,
-        nodes={
-            "node1": {'os': 'centos'},
-            "node2": {'os': 'debian'},
-            "node3": {'os': 'ubuntu'},
-            "node4": {'os': 'ubuntu'},
-        },
-    )
-    with open(join(str(tmpdir), "groups.py"), 'w') as f:
-        f.write("""
-groups = {
-    "group1": {
-        'members_add': lambda node: node.os == 'ubuntu',
-    },
-    "group2": {
-        'members_add': lambda node: node.os == 'ubuntu',
-        'members_remove': lambda node: node.name == "node3",
-    },
-    "group3": {
-        'members_add': lambda node: not node.in_group("group3"),
-    },
-    "group4": {
-        'subgroups': ["group3"],
-        'members_remove': lambda node: node.os == 'debian',
-    },
-}
-    """)
-    stdout, stderr, rcode = run("BW_TABLE_STYLE=grep bw nodes -a node1 | grep \tgroups | cut -f 3", path=str(tmpdir))
-    assert stdout == b"group3\ngroup4\n"
-    assert stderr == b""
-    assert rcode == 0
-
-    stdout, stderr, rcode = run("BW_TABLE_STYLE=grep bw nodes -a node2 | grep \tgroups | cut -f 3", path=str(tmpdir))
-    assert stdout == b"group3\n"
-    assert stderr == b""
-    assert rcode == 0
-
-    stdout, stderr, rcode = run("BW_TABLE_STYLE=grep bw nodes -a node3 | grep \tgroups | cut -f 3", path=str(tmpdir))
-    assert stdout == b"group1\ngroup3\ngroup4\n"
-    assert stderr == b""
-    assert rcode == 0
-
-    stdout, stderr, rcode = run("BW_TABLE_STYLE=grep bw nodes -a node4 | grep \tgroups | cut -f 3", path=str(tmpdir))
-    assert stdout == b"group1\ngroup2\ngroup3\ngroup4\n"
-    assert stderr == b""
-    assert rcode == 0
-
-
 def test_group_members_remove_bundle(tmpdir):
     make_repo(
         tmpdir,
@@ -254,80 +160,3 @@
     assert stdout == b"bundle1\n"
     assert stderr == b""
     assert rcode == 0
-
-
-def test_group_members_partial_metadata(tmpdir):
-    make_repo(
-        tmpdir,
-        nodes={
-            "node1": {
-                'metadata': {'foo': 1},
-            },
-            "node2": {},
-        },
-    )
-    with open(join(str(tmpdir), "groups.py"), 'w') as f:
-        f.write("""
-groups = {
-    "group1": {
-        'members_add': lambda node: node.metadata.get('foo') == 1,
-    },
-    "group2": {
-        'members': ["node2"],
-        'metadata': {'foo': 1},
-    },
-}
-    """)
-    stdout, stderr, rcode = run("BW_TABLE_STYLE=grep bw nodes -a node1 | grep \tgroups | cut -f 3", path=str(tmpdir))
-    assert stdout == b"group1\n"
-    assert stderr == b""
-    assert rcode == 0
-
-    stdout, stderr, rcode = run("BW_TABLE_STYLE=grep bw nodes -a node2 | grep \tgroups | cut -f 3", path=str(tmpdir))
-    assert stdout == b"group2\n"
-    assert stderr == b""
-    assert rcode == 0
-
-
-def test_group_members_remove_based_on_metadata(tmpdir):
-    make_repo(
-        tmpdir,
-        nodes={
-            "node1": {
-                'metadata': {'remove': False},
-            },
-            "node2": {},
-        },
-    )
-    with open(join(str(tmpdir), "groups.py"), 'w') as f:
-        f.write("""
-groups = {
-    "group1": {
-        'members_add': lambda node: not node.metadata.get('remove', False),
-        'members_remove': lambda node: node.metadata.get('remove', False),
-    },
-    "group2": {
-        'members': ["node2"],
-        'metadata': {'remove': True},
-    },
-    "group3": {
-        'subgroups': ["group1"],
-        'members_remove': lambda node: node.name.endswith("1") and node.metadata.get('redherring', True),
-    },
-}
-    """)
-    stdout, stderr, rcode = run("BW_TABLE_STYLE=grep bw nodes -a node1 | grep \tgroups | cut -f 3", path=str(tmpdir))
-    assert stdout == b"group1\n"
-    assert stderr == b""
-    assert rcode == 0
-
-    stdout, stderr, rcode = run("BW_TABLE_STYLE=grep bw nodes -a node2 | grep \tgroups | cut -f 3", path=str(tmpdir))
-    assert stdout == b"group1\ngroup2\ngroup3\n"
-    assert stderr == b""
-    assert rcode == 0
-
-    # make sure there is no metadata deadlock
-    stdout, stderr, rcode = run("bw metadata node1", path=str(tmpdir))
-    assert loads(stdout.decode('utf-8')) == {'remove': False}
-    assert stderr == b""
-    assert rcode == 0




More information about the Python-apps-commits mailing list