[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