Merge lp:~hazmat/pyjuju/local-respect-series into lp:pyjuju

Proposed by Kapil Thangavelu
Status: Merged
Approved by: Jim Baker
Approved revision: 450
Merged at revision: 454
Proposed branch: lp:~hazmat/pyjuju/local-respect-series
Merge into: lp:pyjuju
Diff against target: 348 lines (+56/-27)
9 files modified
juju/lib/lxc/__init__.py (+10/-2)
juju/lib/lxc/data/juju-create (+5/-2)
juju/lib/lxc/tests/test_lxc.py (+18/-10)
juju/machine/tests/test_unit_deployment.py (+6/-3)
juju/machine/unit.py (+5/-2)
juju/providers/local/__init__.py (+2/-1)
juju/providers/local/agent.py (+5/-2)
juju/providers/local/tests/test_agent.py (+4/-4)
juju/providers/local/tests/test_provider.py (+1/-1)
To merge this branch: bzr merge lp:~hazmat/pyjuju/local-respect-series
Reviewer Review Type Date Requested Status
Jim Baker (community) Approve
Benjamin Saller (community) Approve
Review via email: mp+90182@code.launchpad.net

Description of the change

Modify local provider to respect the environment's default-series

Fixes issues with creating precise containers.

To post a comment you must log in.
Revision history for this message
Benjamin Saller (bcsaller) wrote :

[1] There are now a few places that precise and oneiric are included in the code. It might be worth it to make these imported constants from a single file CURRENT_UBUNTU_LTS_SERIES="", CURRENT_UBUNTU_SERIES="" and use those imported symbols through the codebase.

[2] You assert juju series in machine unit.
    [2.1] No validation that the series name is valid is preformed, though this might be YAGNI
    [2.2] It seems series is required, we might want to update the docs to reflect that a value must be provided

review: Approve
Revision history for this message
Clint Byrum (clint-fewbar) wrote :

Excerpts from Kapil Thangavelu's message of Wed Jan 25 18:31:29 UTC 2012:
> Kapil Thangavelu has proposed merging lp:~hazmat/juju/local-respect-series into lp:juju.
>
> Requested reviews:
> juju hackers (juju)
> Related bugs:
> Bug #914392 in juju: "LXC local provider does not respect 'series' (only installs oneiric)"
> https://bugs.launchpad.net/juju/+bug/914392
>
> For more details, see:
> https://code.launchpad.net/~hazmat/juju/local-respect-series/+merge/90182
>
> Modify local provider to respect the environment's default-series
>
> Fixes issues with creating precise containers.

I'm a little nervous about the fact that some functions have "oneiric"
and some "precise" as defaults.

It seems like it would be safer to *always* require the user to specify,
or at the very least, take this from the environment default-series.

Revision history for this message
Kapil Thangavelu (hazmat) wrote :

Excerpts from Clint Byrum's message of Thu Jan 26 01:58:23 UTC 2012:
> Excerpts from Kapil Thangavelu's message of Wed Jan 25 18:31:29 UTC 2012:
> > Kapil Thangavelu has proposed merging lp:~hazmat/juju/local-respect-series into lp:juju.
> >
> > Requested reviews:
> > juju hackers (juju)
> > Related bugs:
> > Bug #914392 in juju: "LXC local provider does not respect 'series' (only installs oneiric)"
> > https://bugs.launchpad.net/juju/+bug/914392
> >
> > For more details, see:
> > https://code.launchpad.net/~hazmat/juju/local-respect-series/+merge/90182
> >
> > Modify local provider to respect the environment's default-series
> >
> > Fixes issues with creating precise containers.
>
> I'm a little nervous about the fact that some functions have "oneiric"
> and some "precise" as defaults.
>
> It seems like it would be safer to *always* require the user to specify,
> or at the very least, take this from the environment default-series.
>

The value is required and always passed, but there are some defaults in place
which where just to ease impl. I'll remove those and make it required
throughout. Most of the precise/oneiric values are in place for testing which
would remain regardless.

-k

Revision history for this message
Jim Baker (jimbaker) wrote :

+1, looks good to me. The only thing I found problematic was this signature:

=== modified file 'juju/lib/lxc/__init__.py'
--- juju/lib/lxc/__init__.py 2011-10-04 23:38:52 +0000
+++ juju/lib/lxc/__init__.py 2012-02-03 00:27:50 +0000
@@ -154,7 +154,8 @@
                  customize_script=None,
                  debug_log=None,
                  console_log=None,
- customize_log=None):
+ customize_log=None,
+ series="oneiric"):

But according to the earlier comments, you are planning to make this arg required for non-tests anyway.

review: Approve
451. By Kapil Thangavelu

remove series default values inline, series is required

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'juju/lib/lxc/__init__.py'
--- juju/lib/lxc/__init__.py 2011-10-04 23:38:52 +0000
+++ juju/lib/lxc/__init__.py 2012-02-11 15:52:20 +0000
@@ -148,6 +148,7 @@
148 def __init__(self,148 def __init__(self,
149 container_name,149 container_name,
150 public_key,150 public_key,
151 series,
151 origin,152 origin,
152 origin_source=None,153 origin_source=None,
153 network_name="virbr0",154 network_name="virbr0",
@@ -161,6 +162,8 @@
161162
162 :param public_key: SSH public key163 :param public_key: SSH public key
163164
165 :param series: distro release series (oneiric, precise, etc)
166
164 :param origin: distro|ppa|branch167 :param origin: distro|ppa|branch
165168
166 :param origin_source: when origin is branch supply a valid bzr branch169 :param origin_source: when origin is branch supply a valid bzr branch
@@ -186,6 +189,7 @@
186 self.public_key = public_key189 self.public_key = public_key
187 self.origin = origin190 self.origin = origin
188 self.source = origin_source191 self.source = origin_source
192 self.series = series
189 self.network_name = network_name193 self.network_name = network_name
190194
191 @property195 @property
@@ -260,7 +264,10 @@
260 """Create the container synchronously."""264 """Create the container synchronously."""
261 if not self.is_constructed():265 if not self.is_constructed():
262 lxc_config = self._make_lxc_config(self.network_name)266 lxc_config = self._make_lxc_config(self.network_name)
263 _lxc_create(self.container_name, config_file=lxc_config)267 _lxc_create(
268 self.container_name,
269 config_file=lxc_config,
270 release=self.series)
264 os.unlink(lxc_config)271 os.unlink(lxc_config)
265 self._customize_container()272 self._customize_container()
266273
@@ -286,7 +293,8 @@
286 debug_log=self.debug_log,293 debug_log=self.debug_log,
287 console_log=self.console_log,294 console_log=self.console_log,
288 customize_script=self.customize_script,295 customize_script=self.customize_script,
289 network_name=self.network_name)296 network_name=self.network_name,
297 series=self.series)
290298
291 if not container.is_constructed():299 if not container.is_constructed():
292 _lxc_clone(self.container_name, container_name)300 _lxc_clone(self.container_name, container_name)
293301
=== modified file 'juju/lib/lxc/data/juju-create'
--- juju/lib/lxc/data/juju-create 2011-10-12 18:08:30 +0000
+++ juju/lib/lxc/data/juju-create 2012-02-11 15:52:20 +0000
@@ -1,6 +1,8 @@
1#!/bin/bash1#!/bin/bash
2set -x2set -x
33
4APT_OPTIONS="-o Dpkg::Options::= --force-confnew --force-yes -fuy"
5
4setup_apt_cache()6setup_apt_cache()
5{7{
6# We ask the host to run apt-cache-server by default speeding the deployment of n units8# We ask the host to run apt-cache-server by default speeding the deployment of n units
@@ -17,6 +19,9 @@
1719
18setup_networking()20setup_networking()
19{21{
22 # Ensure we have the resolvconf installed before configuring it.
23 apt-get install $APT_OPTIONS resolvconf
24
20 # Use dnsmasq to resolve names from the bridge25 # Use dnsmasq to resolve names from the bridge
21 # This script executes from a chroot, so directly modify the output file.26 # This script executes from a chroot, so directly modify the output file.
22 cat <<EOF > /etc/resolvconf/run/resolv.conf27 cat <<EOF > /etc/resolvconf/run/resolv.conf
@@ -89,8 +94,6 @@
89 fi94 fi
9095
91 export DEBIAN_FRONTEND=noninteractive96 export DEBIAN_FRONTEND=noninteractive
92 APT_OPTIONS="-o Dpkg::Options::= --force-confnew --force-yes -fuy"
93
94 echo "Setting up juju in container"97 echo "Setting up juju in container"
95 apt-get install $APT_OPTIONS bzr tmux sudo python-software-properties python-yaml98 apt-get install $APT_OPTIONS bzr tmux sudo python-software-properties python-yaml
9699
97100
=== modified file 'juju/lib/lxc/tests/test_lxc.py'
--- juju/lib/lxc/tests/test_lxc.py 2011-10-01 00:04:14 +0000
+++ juju/lib/lxc/tests/test_lxc.py 2012-02-11 15:52:20 +0000
@@ -69,7 +69,6 @@
69 self.addCleanup(self.clean_container, DEFAULT_CONTAINER)69 self.addCleanup(self.clean_container, DEFAULT_CONTAINER)
7070
71 _lxc_create(DEFAULT_CONTAINER, config_file=self.config)71 _lxc_create(DEFAULT_CONTAINER, config_file=self.config)
72
73 _lxc_start(DEFAULT_CONTAINER)72 _lxc_start(DEFAULT_CONTAINER)
74 _lxc_stop(DEFAULT_CONTAINER)73 _lxc_stop(DEFAULT_CONTAINER)
7574
@@ -84,12 +83,15 @@
84 def test_lxc_container(self):83 def test_lxc_container(self):
85 self.addCleanup(self.clean_container, DEFAULT_CONTAINER)84 self.addCleanup(self.clean_container, DEFAULT_CONTAINER)
86 customize_log = self.makeFile()85 customize_log = self.makeFile()
87 c = LXCContainer(86 c = LXCContainer(DEFAULT_CONTAINER,
88 DEFAULT_CONTAINER, "dsa...", "ppa", customize_log=customize_log)87 "dsa...",
8988 "precise",
89 "ppa",
90 customize_log=customize_log)
90 running = yield c.is_running()91 running = yield c.is_running()
91 self.assertFalse(running)92 self.assertFalse(running)
92 self.assertFalse(c.is_constructed())93 self.assertFalse(c.is_constructed())
94
93 # verify we can't run a non-constructed container95 # verify we can't run a non-constructed container
94 failure = c.run()96 failure = c.run()
95 yield self.assertFailure(failure, LXCError)97 yield self.assertFailure(failure, LXCError)
@@ -107,13 +109,13 @@
107 output = _lxc_ls()109 output = _lxc_ls()
108 self.assertIn(DEFAULT_CONTAINER, output)110 self.assertIn(DEFAULT_CONTAINER, output)
109111
110 # verify we have a path into the container112 # Verify we have a path into the container
111 self.assertTrue(os.path.exists(c.rootfs))113 self.assertTrue(os.path.exists(c.rootfs))
112 self.assertTrue(c.is_constructed())114 self.assertTrue(c.is_constructed())
113115
114 self.verify_container(c, "dsa...", "ppa")116 self.verify_container(c, "dsa...", "precise", "ppa")
115117
116 # verify that we are in containers118 # Verify that we are in containers
117 containers = yield get_containers(None)119 containers = yield get_containers(None)
118 self.assertEqual(containers[DEFAULT_CONTAINER], True)120 self.assertEqual(containers[DEFAULT_CONTAINER], True)
119121
@@ -158,7 +160,8 @@
158160
159 master_container = LXCContainer(DEFAULT_CONTAINER,161 master_container = LXCContainer(DEFAULT_CONTAINER,
160 origin="ppa",162 origin="ppa",
161 public_key="dsa...")163 public_key="dsa...",
164 series="oneiric")
162165
163 # verify that we cannot clone an unconstructed container166 # verify that we cannot clone an unconstructed container
164 failure = master_container.clone("test_lxc_fail")167 failure = master_container.clone("test_lxc_fail")
@@ -182,7 +185,7 @@
182 output = _lxc_ls()185 output = _lxc_ls()
183 self.assertIn(DEFAULT_CONTAINER, output)186 self.assertIn(DEFAULT_CONTAINER, output)
184187
185 self.verify_container(c, "dsa...", "ppa")188 self.verify_container(c, "dsa...", "oneiric", "ppa")
186189
187 # verify that we are in containers190 # verify that we are in containers
188 containers = yield get_containers(None)191 containers = yield get_containers(None)
@@ -202,7 +205,7 @@
202205
203 yield master_container.destroy()206 yield master_container.destroy()
204207
205 def verify_container(self, c, public_key, origin):208 def verify_container(self, c, public_key, series, origin):
206 """Verify properties of an LXCContainer"""209 """Verify properties of an LXCContainer"""
207210
208 def p(path):211 def p(path):
@@ -259,6 +262,11 @@
259 self.assertIn('Acquire::http { Proxy "http://192.168.122.1:3142"; };',262 self.assertIn('Acquire::http { Proxy "http://192.168.122.1:3142"; };',
260 apt_proxy)263 apt_proxy)
261264
265 # Verify the container release series.
266 with open(os.path.join(c.rootfs, "etc", "lsb-release")) as fh:
267 lsb_info = fh.read()
268 self.assertIn(series, lsb_info)
269
262 # check basic juju installation270 # check basic juju installation
263 # these could be more through271 # these could be more through
264 if origin == "ppa":272 if origin == "ppa":
265273
=== modified file 'juju/machine/tests/test_unit_deployment.py'
--- juju/machine/tests/test_unit_deployment.py 2011-10-05 13:59:44 +0000
+++ juju/machine/tests/test_unit_deployment.py 2012-02-11 15:52:20 +0000
@@ -348,6 +348,8 @@
348 # Setup unit namespace348 # Setup unit namespace
349 environ = dict(os.environ)349 environ = dict(os.environ)
350 environ["JUJU_UNIT_NS"] = "ns1"350 environ["JUJU_UNIT_NS"] = "ns1"
351 environ["JUJU_SERIES"] = "precise"
352
351 self.change_environment(**environ)353 self.change_environment(**environ)
352354
353 self.unit_deploy = UnitContainerDeployment(355 self.unit_deploy = UnitContainerDeployment(
@@ -411,7 +413,8 @@
411413
412 @inlineCallbacks414 @inlineCallbacks
413 def test_start(self):415 def test_start(self):
414 container = LXCContainer(self.unit_name, None, None, None)416 container = LXCContainer(
417 self.unit_name, None, None, None, series="precise")
415 rootfs = self.makeDir()418 rootfs = self.makeDir()
416 env = dict(os.environ)419 env = dict(os.environ)
417 env["JUJU_PUBLIC_KEY"] = "dsa ..."420 env["JUJU_PUBLIC_KEY"] = "dsa ..."
@@ -442,7 +445,6 @@
442 self.assertIn('JUJU_ZOOKEEPER="127.0.1.1:2181"', job)445 self.assertIn('JUJU_ZOOKEEPER="127.0.1.1:2181"', job)
443 self.assertIn('JUJU_MACHINE_ID="0"', job)446 self.assertIn('JUJU_MACHINE_ID="0"', job)
444 self.assertIn('JUJU_UNIT_NAME="riak/0"', job)447 self.assertIn('JUJU_UNIT_NAME="riak/0"', job)
445
446 # Verify the symlink exists448 # Verify the symlink exists
447 self.assertTrue(os.path.lexists(os.path.join(449 self.assertTrue(os.path.lexists(os.path.join(
448 self.unit_deploy.juju_home, "units",450 self.unit_deploy.juju_home, "units",
@@ -468,7 +470,8 @@
468 @inlineCallbacks470 @inlineCallbacks
469 def test_get_container(self):471 def test_get_container(self):
470 rootfs = self.makeDir()472 rootfs = self.makeDir()
471 container = LXCContainer(self.unit_name, None, None, None)473 container = LXCContainer(
474 self.unit_name, None, None, None, series="precise")
472475
473 mock_deploy = self.mocker.patch(self.unit_deploy)476 mock_deploy = self.mocker.patch(self.unit_deploy)
474 mock_deploy._get_master_template(ANY, ANY, ANY)477 mock_deploy._get_master_template(ANY, ANY, ANY)
475478
=== modified file 'juju/machine/unit.py'
--- juju/machine/unit.py 2011-10-01 00:04:14 +0000
+++ juju/machine/unit.py 2012-02-11 15:52:20 +0000
@@ -189,10 +189,13 @@
189189
190 self._unit_namespace = os.environ.get("JUJU_UNIT_NS")190 self._unit_namespace = os.environ.get("JUJU_UNIT_NS")
191 self._juju_origin = os.environ.get("JUJU_ORIGIN")191 self._juju_origin = os.environ.get("JUJU_ORIGIN")
192 self._juju_series = os.environ.get("JUJU_SERIES")
192 assert self._unit_namespace is not None, "Required unit ns not found"193 assert self._unit_namespace is not None, "Required unit ns not found"
194 assert self._juju_series is not None, "Required juju series not found"
193195
194 self.pid_file = None196 self.pid_file = None
195 self.container = LXCContainer(self.container_name, None, None, None)197 self.container = LXCContainer(
198 self.container_name, None, None, None, series=self._juju_series)
196199
197 @property200 @property
198 def container_name(self):201 def container_name(self):
@@ -250,7 +253,7 @@
250253
251 master_template = LXCContainer(254 master_template = LXCContainer(
252 container_template_name, origin=self._juju_origin,255 container_template_name, origin=self._juju_origin,
253 public_key=public_key)256 public_key=public_key, series=self._juju_series)
254257
255 # Debug log for the customize script, customize is only run on master.258 # Debug log for the customize script, customize is only run on master.
256 customize_log_path = os.path.join(259 customize_log_path = os.path.join(
257260
=== modified file 'juju/providers/local/__init__.py'
--- juju/providers/local/__init__.py 2011-11-16 13:56:03 +0000
+++ juju/providers/local/__init__.py 2012-02-11 15:52:20 +0000
@@ -141,7 +141,8 @@
141 log_file=log_file,141 log_file=log_file,
142 juju_origin=juju_origin,142 juju_origin=juju_origin,
143 juju_unit_namespace=self._qualified_name,143 juju_unit_namespace=self._qualified_name,
144 public_key=public_key)144 public_key=public_key,
145 juju_series=self.config["default-series"])
145 log.info(146 log.info(
146 "Starting machine agent (origin: %s)... ", agent.juju_origin)147 "Starting machine agent (origin: %s)... ", agent.juju_origin)
147 yield agent.start()148 yield agent.start()
148149
=== modified file 'juju/providers/local/agent.py'
--- juju/providers/local/agent.py 2011-10-05 12:14:41 +0000
+++ juju/providers/local/agent.py 2012-02-11 15:52:20 +0000
@@ -15,11 +15,12 @@
15 agent_module = "juju.agents.machine"15 agent_module = "juju.agents.machine"
1616
17 def __init__(17 def __init__(
18 self, pid_file, zookeeper_hosts=None, machine_id="0",18 self, pid_file, juju_series=None, zookeeper_hosts=None, machine_id="0",
19 log_file=None, juju_directory="/var/lib/juju",19 log_file=None, juju_directory="/var/lib/juju",
20 juju_unit_namespace="", public_key=None, juju_origin="ppa"):20 juju_unit_namespace="", public_key=None, juju_origin="ppa"):
21 """21 """
22 :param pid_file: Path to file used to store process id.22 :param pid_file: Path to file used to store process id.
23 :param juju_series: The release series to use (maverick, natty, etc).
23 :param machine_id: machine id for the local machine.24 :param machine_id: machine id for the local machine.
24 :param zookeeper_hosts: Zookeeper hosts to connect.25 :param zookeeper_hosts: Zookeeper hosts to connect.
25 :param log_file: A file to use for the agent logs.26 :param log_file: A file to use for the agent logs.
@@ -39,6 +40,7 @@
39 self._log_file = log_file40 self._log_file = log_file
40 self._public_key = public_key41 self._public_key = public_key
41 self._juju_origin = juju_origin42 self._juju_origin = juju_origin
43 self._juju_series = juju_series
4244
43 if self._juju_origin is None:45 if self._juju_origin is None:
44 origin, source = get_default_origin()46 origin, source = get_default_origin()
@@ -54,7 +56,7 @@
54 def start(self):56 def start(self):
55 """Start the machine agent.57 """Start the machine agent.
56 """58 """
57 assert self._zookeeper_hosts and self._log_file59 assert self._zookeeper_hosts and self._log_file and self._juju_series
5860
59 if (yield self.is_running()):61 if (yield self.is_running()):
60 return62 return
@@ -67,6 +69,7 @@
67 "JUJU_MACHINE_ID=%s" % self._machine_id,69 "JUJU_MACHINE_ID=%s" % self._machine_id,
68 "JUJU_HOME=%s" % self._juju_directory,70 "JUJU_HOME=%s" % self._juju_directory,
69 "JUJU_UNIT_NS=%s" % self._juju_unit_namespace,71 "JUJU_UNIT_NS=%s" % self._juju_unit_namespace,
72 "JUJU_SERIES=%s" % self._juju_series,
70 "PYTHONPATH=%s" % ":".join(sys.path),73 "PYTHONPATH=%s" % ":".join(sys.path),
71 sys.executable, "-m", self.agent_module,74 sys.executable, "-m", self.agent_module,
72 "-n", "--pidfile", self._pid_file,75 "-n", "--pidfile", self._pid_file,
7376
=== modified file 'juju/providers/local/tests/test_agent.py'
--- juju/providers/local/tests/test_agent.py 2011-10-05 12:14:41 +0000
+++ juju/providers/local/tests/test_agent.py 2012-02-11 15:52:20 +0000
@@ -27,7 +27,7 @@
27 log_file = self.makeFile()27 log_file = self.makeFile()
2828
29 agent = ManagedMachineAgent(29 agent = ManagedMachineAgent(
30 pid_file, get_test_zookeeper_address(),30 pid_file, "precise", get_test_zookeeper_address(),
31 juju_directory=juju_directory,31 juju_directory=juju_directory,
32 log_file=log_file, juju_unit_namespace="ns1",32 log_file=log_file, juju_unit_namespace="ns1",
33 juju_origin="lp:juju/trunk")33 juju_origin="lp:juju/trunk")
@@ -50,7 +50,8 @@
50 JUJU_MACHINE_ID="0",50 JUJU_MACHINE_ID="0",
51 JUJU_HOME=juju_directory,51 JUJU_HOME=juju_directory,
52 JUJU_ORIGIN="lp:juju/trunk",52 JUJU_ORIGIN="lp:juju/trunk",
53 JUJU_UNIT_NS="ns1"))53 JUJU_UNIT_NS="ns1",
54 JUJU_SERIES="precise"))
5455
55 @inlineCallbacks56 @inlineCallbacks
56 def test_managed_agent_root(self):57 def test_managed_agent_root(self):
@@ -66,14 +67,13 @@
66 self.addCleanup(cleanup_root_file, log_file)67 self.addCleanup(cleanup_root_file, log_file)
6768
68 agent = ManagedMachineAgent(69 agent = ManagedMachineAgent(
69 pid_file, machine_id="0", log_file=log_file,70 pid_file, "precise", machine_id="0", log_file=log_file,
70 zookeeper_hosts=get_test_zookeeper_address(),71 zookeeper_hosts=get_test_zookeeper_address(),
71 juju_directory=juju_directory)72 juju_directory=juju_directory)
7273
73 agent.agent_module = "juju.agents.dummy"74 agent.agent_module = "juju.agents.dummy"
74 self.assertFalse((yield agent.is_running()))75 self.assertFalse((yield agent.is_running()))
75 yield agent.start()76 yield agent.start()
76
77 # Give a moment for the process to start and write its config77 # Give a moment for the process to start and write its config
78 yield self.sleep(0.1)78 yield self.sleep(0.1)
79 self.assertTrue((yield agent.is_running()))79 self.assertTrue((yield agent.is_running()))
8080
=== modified file 'juju/providers/local/tests/test_provider.py'
--- juju/providers/local/tests/test_provider.py 2011-10-07 18:40:48 +0000
+++ juju/providers/local/tests/test_provider.py 2012-02-11 15:52:20 +0000
@@ -29,7 +29,7 @@
29 self.provider = MachineProvider(29 self.provider = MachineProvider(
30 "local-test", {30 "local-test", {
31 "admin-secret": "admin:abc", "data-dir": self.makeDir(),31 "admin-secret": "admin:abc", "data-dir": self.makeDir(),
32 "authorized-keys": "fooabc123"})32 "authorized-keys": "fooabc123", "default-series": "oneiric"})
33 self.output = self.capture_logging(33 self.output = self.capture_logging(
34 "juju.local-dev", level=logging.DEBUG)34 "juju.local-dev", level=logging.DEBUG)
35 zookeeper.set_debug_level(0)35 zookeeper.set_debug_level(0)

Subscribers

People subscribed via source and target branches

to status/vote changes: