Merge lp:~hazmat/pyjuju/managed-zk-client into lp:pyjuju

Proposed by Kapil Thangavelu
Status: Merged
Merged at revision: 526
Proposed branch: lp:~hazmat/pyjuju/managed-zk-client
Merge into: lp:pyjuju
Diff against target: 274 lines (+18/-26)
10 files modified
juju/agents/base.py (+2/-1)
juju/charm/tests/test_publisher.py (+1/-3)
juju/lib/testing.py (+2/-1)
juju/providers/dummy.py (+3/-2)
juju/providers/local/__init__.py (+1/-0)
juju/state/tests/common.py (+1/-3)
juju/state/tests/test_base.py (+3/-5)
juju/state/tests/test_initialize.py (+1/-3)
juju/state/tests/test_relation.py (+1/-2)
juju/state/tests/test_utils.py (+3/-6)
To merge this branch: bzr merge lp:~hazmat/pyjuju/managed-zk-client
Reviewer Review Type Date Requested Status
Juju Engineering Pending
Review via email: mp+101132@code.launchpad.net

Description of the change

managed zk connections for transient and session failures.

This branch switches agents to use managed session clients
which automatically retry in the face of transient disconnections, and
automatically restablish session on expiration (with watch
and ephemeral node handling).

https://codereview.appspot.com/5989050/

To post a comment you must log in.
Revision history for this message
Kapil Thangavelu (hazmat) wrote :
Download full text (11.4 KiB)

Reviewers: mp+101132_code.launchpad.net,

Message:
Please take a look.

Description:
managed zk connections for transient and session failures.

This branch switches agents to use managed session clients
which automatically retry in the face of transient disconnections, and
automatically restablish session on expiration (with watch
and ephemeral node handling).

https://code.launchpad.net/~hazmat/juju/managed-zk-client/+merge/101132

(do not edit description out of merge proposal)

Please review this at https://codereview.appspot.com/5989050/

Affected files:
   A [revision details]
   M juju/agents/base.py
   M juju/charm/tests/test_publisher.py
   M juju/lib/testing.py
   M juju/providers/dummy.py
   M juju/providers/local/__init__.py
   M juju/state/tests/common.py
   M juju/state/tests/test_base.py
   M juju/state/tests/test_initialize.py
   M juju/state/tests/test_relation.py
   M juju/state/tests/test_utils.py

Index: [revision details]
=== added file '[revision details]'
--- [revision details] 2012-01-01 00:00:00 +0000
+++ [revision details] 2012-01-01 00:00:00 +0000
@@ -0,0 +1,2 @@
+Old revision:
<email address hidden>
+New revision:
<email address hidden>

Index: juju/agents/base.py
=== modified file 'juju/agents/base.py'
--- juju/agents/base.py 2011-11-30 09:22:38 +0000
+++ juju/agents/base.py 2012-04-04 04:04:30 +0000
@@ -13,6 +13,7 @@
  from twisted.python.log import PythonLoggingObserver

  from txzookeeper import ZookeeperClient
+from txzookeeper.managed import ManagedClient

  from juju.control.options import setup_twistd_options
  from juju.errors import NoConnection, JujuError
@@ -202,7 +203,7 @@
      def connect(self):
          """Return an authenticated connection to the juju zookeeper."""
          yield self._kill_existing_session()
- self.client = yield ZookeeperClient().connect(
+ self.client = yield ManagedClient().connect(
              self.config["zookeeper_servers"])
          save_client_id(
              self.config["session_file"], self.client.client_id)

Index: juju/lib/testing.py
=== modified file 'juju/lib/testing.py'
--- juju/lib/testing.py 2012-03-29 22:34:58 +0000
+++ juju/lib/testing.py 2012-04-06 14:42:06 +0000
@@ -10,6 +10,7 @@
  from twisted.trial.unittest import TestCase as TrialTestCase

  from txzookeeper import ZookeeperClient
+from txzookeeper.managed import ManagedClient

  from juju.lib.mocker import MockerTestCase
  from juju.tests.common import get_test_zookeeper_address
@@ -154,7 +155,7 @@
          returnValue(True)

      def get_zookeeper_client(self):
- client = ZookeeperClient(
+ client = ManagedClient(
              get_test_zookeeper_address(), session_timeout=1000)
          return client

Index: juju/providers/dummy.py
=== modified file 'juju/providers/dummy.py'
--- juju/providers/dummy.py 2012-03-29 01:37:57 +0000
+++ juju/providers/dummy.py 2012-04-06 16:35:31 +0000
@@ -4,7 +4,8 @@

  from twisted.internet.defer import inlineCallbacks, returnValue, succeed,
fail

-from txzookeeper import ZookeeperClient
+#from txzookeeper import ZookeeperClient
+from txzookeeper....

Revision history for this message
William Reade (fwereade) wrote :

LGTM

I retain some misgivings about making this change at this late stage,
but this change and the txzookeeper one both appear to be entirely sane.
I think we're good :).

https://codereview.appspot.com/5989050/

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'juju/agents/base.py'
2--- juju/agents/base.py 2011-11-30 09:22:38 +0000
3+++ juju/agents/base.py 2012-04-06 16:39:29 +0000
4@@ -13,6 +13,7 @@
5 from twisted.python.log import PythonLoggingObserver
6
7 from txzookeeper import ZookeeperClient
8+from txzookeeper.managed import ManagedClient
9
10 from juju.control.options import setup_twistd_options
11 from juju.errors import NoConnection, JujuError
12@@ -202,7 +203,7 @@
13 def connect(self):
14 """Return an authenticated connection to the juju zookeeper."""
15 yield self._kill_existing_session()
16- self.client = yield ZookeeperClient().connect(
17+ self.client = yield ManagedClient().connect(
18 self.config["zookeeper_servers"])
19 save_client_id(
20 self.config["session_file"], self.client.client_id)
21
22=== modified file 'juju/charm/tests/test_publisher.py'
23--- juju/charm/tests/test_publisher.py 2012-02-16 18:27:06 +0000
24+++ juju/charm/tests/test_publisher.py 2012-04-06 16:39:29 +0000
25@@ -6,7 +6,6 @@
26 from twisted.internet.defer import inlineCallbacks, fail
27 from twisted.python.failure import Failure
28
29-from txzookeeper import ZookeeperClient
30 from txzookeeper.tests.utils import deleteTree
31
32 from juju.charm.bundle import CharmBundle
33@@ -17,7 +16,6 @@
34 from juju.providers.dummy import FileStorage
35 from juju.state.charm import CharmStateManager
36 from juju.state.errors import StateChanged
37-from juju.tests.common import get_test_zookeeper_address
38
39 from juju.environment.tests.test_config import (
40 EnvironmentsConfigTestBase, SAMPLE_ENV)
41@@ -54,7 +52,7 @@
42 self.charm_storage_key = under.quote(
43 "%s:%s" % (self.charm_id, self.charm.get_sha256()))
44
45- self.client = ZookeeperClient(get_test_zookeeper_address())
46+ self.client = self.get_zookeeper_client()
47 self.storage_dir = self.makeDir()
48 self.storage = FileStorage(self.storage_dir)
49 self.publisher = CharmPublisher(self.client, self.storage)
50
51=== modified file 'juju/lib/testing.py'
52--- juju/lib/testing.py 2012-03-29 22:34:58 +0000
53+++ juju/lib/testing.py 2012-04-06 16:39:29 +0000
54@@ -10,6 +10,7 @@
55 from twisted.trial.unittest import TestCase as TrialTestCase
56
57 from txzookeeper import ZookeeperClient
58+from txzookeeper.managed import ManagedClient
59
60 from juju.lib.mocker import MockerTestCase
61 from juju.tests.common import get_test_zookeeper_address
62@@ -154,7 +155,7 @@
63 returnValue(True)
64
65 def get_zookeeper_client(self):
66- client = ZookeeperClient(
67+ client = ManagedClient(
68 get_test_zookeeper_address(), session_timeout=1000)
69 return client
70
71
72=== modified file 'juju/providers/dummy.py'
73--- juju/providers/dummy.py 2012-03-29 01:37:57 +0000
74+++ juju/providers/dummy.py 2012-04-06 16:39:29 +0000
75@@ -4,7 +4,8 @@
76
77 from twisted.internet.defer import inlineCallbacks, returnValue, succeed, fail
78
79-from txzookeeper import ZookeeperClient
80+#from txzookeeper import ZookeeperClient
81+from txzookeeper.managed import ManagedClient
82
83 from juju.errors import (
84 EnvironmentNotFound, MachinesNotFound, ProviderError)
85@@ -61,7 +62,7 @@
86 attempting to connect to the same provider, if that's feasible.
87 Unused for the dummy provider.
88 """
89- return ZookeeperClient(
90+ return ManagedClient(
91 os.environ.get("ZOOKEEPER_ADDRESS", "127.0.0.1:2181"),
92 session_timeout=1000).connect()
93
94
95=== modified file 'juju/providers/local/__init__.py'
96--- juju/providers/local/__init__.py 2012-03-29 01:37:57 +0000
97+++ juju/providers/local/__init__.py 2012-04-06 16:39:29 +0000
98@@ -129,6 +129,7 @@
99 hierarchy = StateHierarchy(
100 client, admin_identity, "local", constraints.data, "local")
101 yield hierarchy.initialize()
102+ yield client.close()
103
104 # Startup the machine agent
105 log_file = os.path.join(self._directory, "machine-agent.log")
106
107=== modified file 'juju/state/tests/common.py'
108--- juju/state/tests/common.py 2012-03-30 10:13:09 +0000
109+++ juju/state/tests/common.py 2012-04-06 16:39:29 +0000
110@@ -2,14 +2,12 @@
111
112 import zookeeper
113
114-from txzookeeper import ZookeeperClient
115 from txzookeeper.tests.utils import deleteTree
116
117 from juju.charm.directory import CharmDirectory
118 from juju.charm.tests.test_directory import sample_directory
119 from juju.environment.tests.test_config import EnvironmentsConfigTestBase
120 from juju.state.topology import InternalTopology
121-from juju.tests.common import get_test_zookeeper_address
122
123
124 class StateTestBase(EnvironmentsConfigTestBase):
125@@ -33,7 +31,7 @@
126 # Close and reopen connection, so that watches set during
127 # testing are not affected by the cleaning up.
128 self.client.close()
129- client = ZookeeperClient(get_test_zookeeper_address())
130+ client = self.get_zookeeper_client()
131 yield client.connect()
132 deleteTree(handle=client.handle)
133 client.close()
134
135=== modified file 'juju/state/tests/test_base.py'
136--- juju/state/tests/test_base.py 2011-09-15 18:50:23 +0000
137+++ juju/state/tests/test_base.py 2012-04-06 16:39:29 +0000
138@@ -1,12 +1,10 @@
139 from twisted.internet.defer import inlineCallbacks, Deferred
140-from txzookeeper import ZookeeperClient
141
142 from juju.state.tests.common import StateTestBase
143
144 from juju.state.base import StateBase
145 from juju.state.errors import StopWatcher
146 from juju.state.topology import InternalTopology
147-from juju.tests.common import get_test_zookeeper_address
148
149
150 class StateBaseTest(StateTestBase):
151@@ -339,7 +337,7 @@
152
153 # Use a separate client connection for watching so it can be
154 # disconnected.
155- watch_client = ZookeeperClient(get_test_zookeeper_address())
156+ watch_client = self.get_zookeeper_client()
157 yield watch_client.connect()
158 watch_base = StateBase(watch_client)
159
160@@ -402,7 +400,7 @@
161 """
162 # Use a separate client connection for watching so it can be
163 # disconnected.
164- watch_client = ZookeeperClient(get_test_zookeeper_address())
165+ watch_client = self.get_zookeeper_client()
166 yield watch_client.connect()
167 watch_base = StateBase(watch_client)
168
169@@ -416,7 +414,7 @@
170 topology = InternalTopology()
171 topology.add_machine("m-0")
172 yield self.set_topology(topology)
173-
174+
175 # Now disconnect the client.
176 watch_client.close()
177 self.assertFalse(watch_client.connected)
178
179=== modified file 'juju/state/tests/test_initialize.py'
180--- juju/state/tests/test_initialize.py 2012-03-29 01:37:57 +0000
181+++ juju/state/tests/test_initialize.py 2012-04-06 16:39:29 +0000
182@@ -1,7 +1,6 @@
183 import zookeeper
184
185 from twisted.internet.defer import inlineCallbacks
186-from txzookeeper import ZookeeperClient
187 from txzookeeper.tests.utils import deleteTree
188
189 from juju.environment.tests.test_config import EnvironmentsConfigTestBase
190@@ -10,7 +9,6 @@
191 GlobalSettingsStateManager, EnvironmentStateManager)
192 from juju.state.initialize import StateHierarchy
193 from juju.state.machine import MachineStateManager
194-from juju.tests.common import get_test_zookeeper_address
195
196
197 class LayoutTest(EnvironmentsConfigTestBase):
198@@ -20,7 +18,7 @@
199 yield super(LayoutTest, self).setUp()
200 self.log = self.capture_logging("juju.state.init")
201 zookeeper.set_debug_level(0)
202- self.client = ZookeeperClient(get_test_zookeeper_address())
203+ self.client = self.get_zookeeper_client()
204 self.identity = make_identity("admin:genie")
205 constraints_data = {
206 "arch": "arm",
207
208=== modified file 'juju/state/tests/test_relation.py'
209--- juju/state/tests/test_relation.py 2012-04-06 11:19:31 +0000
210+++ juju/state/tests/test_relation.py 2012-04-06 16:39:29 +0000
211@@ -8,7 +8,6 @@
212
213 from twisted.internet.defer import (
214 inlineCallbacks, returnValue, Deferred, fail, succeed)
215-from txzookeeper import ZookeeperClient
216
217 from juju.charm.directory import CharmDirectory
218 from juju.charm.tests import local_charm_id
219@@ -854,7 +853,7 @@
220
221 # manually construct a unit relation state using a separate
222 # connection.
223- client2 = ZookeeperClient(self.client.servers)
224+ client2 = self.get_zookeeper_client()
225 yield client2.connect()
226 service_relation = ServiceRelationState(
227 client2,
228
229=== modified file 'juju/state/tests/test_utils.py'
230--- juju/state/tests/test_utils.py 2012-02-01 15:39:08 +0000
231+++ juju/state/tests/test_utils.py 2012-04-06 16:39:29 +0000
232@@ -8,7 +8,6 @@
233 from twisted.internet import reactor
234 from twisted.internet.defer import inlineCallbacks
235 from twisted.internet.threads import deferToThread
236-from txzookeeper import ZookeeperClient
237 import yaml
238
239 from juju.lib.testing import TestCase
240@@ -18,8 +17,6 @@
241 PortWatcher, remove_tree, dict_merge, get_open_port,
242 YAMLState, YAMLStateNodeMixin, AddedItem, ModifiedItem, DeletedItem)
243
244-from juju.tests.common import get_test_zookeeper_address
245-
246
247 class PortWait(TestCase):
248
249@@ -193,7 +190,7 @@
250 def setUp(self):
251 yield super(RemoveTreeTest, self).setUp()
252 zookeeper.set_debug_level(0)
253- self.client = ZookeeperClient(get_test_zookeeper_address())
254+ self.client = self.get_zookeeper_client()
255 yield self.client.connect()
256
257 @inlineCallbacks
258@@ -309,7 +306,7 @@
259 @inlineCallbacks
260 def setUp(self):
261 zookeeper.set_debug_level(0)
262- self.client = ZookeeperClient(get_test_zookeeper_address())
263+ self.client = self.get_zookeeper_client()
264 yield self.client.connect()
265 self.path = "/zoo"
266
267@@ -653,7 +650,7 @@
268 @inlineCallbacks
269 def setUp(self):
270 zookeeper.set_debug_level(0)
271- self.client = ZookeeperClient(get_test_zookeeper_address())
272+ self.client = self.get_zookeeper_client()
273 yield self.client.connect()
274 self.path = "/path"
275

Subscribers

People subscribed via source and target branches

to status/vote changes: