Merge lp:~gnuoy/charms/trusty/neutron-openvswitch/local-metadata into lp:~openstack-charmers-archive/charms/trusty/neutron-openvswitch/next

Proposed by Liam Young on 2015-09-08
Status: Merged
Merged at revision: 86
Proposed branch: lp:~gnuoy/charms/trusty/neutron-openvswitch/local-metadata
Merge into: lp:~openstack-charmers-archive/charms/trusty/neutron-openvswitch/next
Diff against target: 537 lines (+186/-69)
8 files modified
config.yaml (+7/-1)
hooks/neutron_ovs_context.py (+3/-2)
hooks/neutron_ovs_hooks.py (+16/-19)
hooks/neutron_ovs_utils.py (+58/-13)
templates/icehouse/dhcp_agent.ini (+14/-0)
unit_tests/test_neutron_ovs_context.py (+5/-5)
unit_tests/test_neutron_ovs_hooks.py (+21/-21)
unit_tests/test_neutron_ovs_utils.py (+62/-8)
To merge this branch: bzr merge lp:~gnuoy/charms/trusty/neutron-openvswitch/local-metadata
Reviewer Review Type Date Requested Status
James Page 2015-09-08 Approve on 2015-09-09
Review via email: mp+270416@code.launchpad.net
To post a comment you must log in.
James Page (james-page) wrote :

Minor niggles - LGTM

review: Approve

charm_lint_check #10043 neutron-openvswitch-next for gnuoy mp270416
    LINT FAIL: lint-test failed
    LINT FAIL: charm-proof failed

LINT Results (max last 2 lines):
make: *** [lint] Error 100
ERROR:root:Make target returned non-zero.

Full lint test output: http://paste.ubuntu.com/12415827/
Build: http://10.245.162.77:8080/job/charm_lint_check/10043/

charm_unit_test #9209 neutron-openvswitch-next for gnuoy mp270416
    UNIT OK: passed

Build: http://10.245.162.77:8080/job/charm_unit_test/9209/

charm_amulet_test #6429 neutron-openvswitch-next for gnuoy mp270416
    AMULET FAIL: amulet-test failed

AMULET Results (max last 2 lines):
make: *** [test] Error 1
ERROR:root:Make target returned non-zero.

Full amulet test output: http://paste.ubuntu.com/12415978/
Build: http://10.245.162.77:8080/job/charm_amulet_test/6429/

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'config.yaml'
2--- config.yaml 2015-08-18 21:18:45 +0000
3+++ config.yaml 2015-09-12 09:04:08 +0000
4@@ -98,4 +98,10 @@
5 traffic to the external public network. Valid values are either MAC
6 addresses (in which case only MAC addresses for interfaces without an IP
7 address already assigned will be used), or interfaces (eth0)
8-
9+ enable-local-dhcp-and-metadata:
10+ type: boolean
11+ default: false
12+ description: |
13+ Enable a local dhcp server which also serves metadata. Useful for
14+ deployments which do not include a neutron-gateway. This is a good option
15+ for VLAN provider network management.
16
17=== modified file 'hooks/neutron_ovs_context.py'
18--- hooks/neutron_ovs_context.py 2015-04-15 14:08:36 +0000
19+++ hooks/neutron_ovs_context.py 2015-09-12 09:04:08 +0000
20@@ -108,10 +108,11 @@
21 return secret
22
23
24-class DVRSharedSecretContext(OSContextGenerator):
25+class SharedSecretContext(OSContextGenerator):
26
27 def __call__(self):
28- if NeutronAPIContext()()['enable_dvr']:
29+ if NeutronAPIContext()()['enable_dvr'] or \
30+ config('enable-local-dhcp-and-metadata'):
31 ctxt = {
32 'shared_secret': get_shared_secret(),
33 'local_ip': resolve_address(),
34
35=== modified file 'hooks/neutron_ovs_hooks.py'
36--- hooks/neutron_ovs_hooks.py 2015-04-02 20:35:37 +0000
37+++ hooks/neutron_ovs_hooks.py 2015-09-12 09:04:08 +0000
38@@ -20,25 +20,24 @@
39 restart_on_change
40 )
41
42-from charmhelpers.fetch import (
43- apt_install, apt_update, apt_purge
44-)
45-
46 from charmhelpers.contrib.openstack.utils import (
47 os_requires_version,
48 )
49
50 from neutron_ovs_utils import (
51+ DHCP_PACKAGES,
52 DVR_PACKAGES,
53 configure_ovs,
54- determine_packages,
55 git_install,
56 get_topics,
57- determine_dvr_packages,
58 get_shared_secret,
59 register_configs,
60 restart_map,
61 use_dvr,
62+ enable_nova_metadata,
63+ enable_local_dhcp,
64+ install_packages,
65+ purge_packages,
66 )
67
68 hooks = Hooks()
69@@ -47,11 +46,7 @@
70
71 @hooks.hook()
72 def install():
73- apt_update()
74- pkgs = determine_packages()
75- for pkg in pkgs:
76- apt_install(pkg, fatal=True)
77-
78+ install_packages()
79 git_install(config('openstack-origin-git'))
80
81
82@@ -59,10 +54,7 @@
83 @hooks.hook('config-changed')
84 @restart_on_change(restart_map())
85 def config_changed():
86- if determine_dvr_packages():
87- apt_update()
88- apt_install(determine_dvr_packages(), fatal=True)
89-
90+ install_packages()
91 if git_install_requested():
92 if config_value_changed('openstack-origin-git'):
93 git_install(config('openstack-origin-git'))
94@@ -71,16 +63,17 @@
95 CONFIGS.write_all()
96 for rid in relation_ids('zeromq-configuration'):
97 zeromq_configuration_relation_joined(rid)
98+ for rid in relation_ids('neutron-plugin'):
99+ neutron_plugin_joined(relation_id=rid)
100
101
102 @hooks.hook('neutron-plugin-api-relation-changed')
103 @restart_on_change(restart_map())
104 def neutron_plugin_api_changed():
105 if use_dvr():
106- apt_update()
107- apt_install(DVR_PACKAGES, fatal=True)
108+ install_packages()
109 else:
110- apt_purge(DVR_PACKAGES, fatal=True)
111+ purge_packages(DVR_PACKAGES)
112 configure_ovs()
113 CONFIGS.write_all()
114 # If dvr setting has changed, need to pass that on
115@@ -90,7 +83,11 @@
116
117 @hooks.hook('neutron-plugin-relation-joined')
118 def neutron_plugin_joined(relation_id=None):
119- secret = get_shared_secret() if use_dvr() else None
120+ if enable_local_dhcp():
121+ install_packages()
122+ else:
123+ purge_packages(DHCP_PACKAGES)
124+ secret = get_shared_secret() if enable_nova_metadata() else None
125 rel_data = {
126 'metadata-shared-secret': secret,
127 }
128
129=== modified file 'hooks/neutron_ovs_utils.py'
130--- hooks/neutron_ovs_utils.py 2015-07-14 19:52:15 +0000
131+++ hooks/neutron_ovs_utils.py 2015-09-12 09:04:08 +0000
132@@ -43,6 +43,13 @@
133
134 from charmhelpers.core.templating import render
135
136+from charmhelpers.fetch import (
137+ apt_install,
138+ apt_purge,
139+ apt_update,
140+ filter_installed_packages,
141+)
142+
143 BASE_GIT_PACKAGES = [
144 'libffi-dev',
145 'libssl-dev',
146@@ -66,6 +73,7 @@
147 ]
148
149 NOVA_CONF_DIR = "/etc/nova"
150+NEUTRON_DHCP_AGENT_CONF = "/etc/neutron/dhcp_agent.ini"
151 NEUTRON_CONF_DIR = "/etc/neutron"
152 NEUTRON_CONF = '%s/neutron.conf' % NEUTRON_CONF_DIR
153 NEUTRON_DEFAULT = '/etc/default/neutron-server'
154@@ -75,6 +83,7 @@
155 EXT_PORT_CONF = '/etc/init/ext-port.conf'
156 NEUTRON_METADATA_AGENT_CONF = "/etc/neutron/metadata_agent.ini"
157 DVR_PACKAGES = ['neutron-l3-agent']
158+DHCP_PACKAGES = ['neutron-metadata-agent', 'neutron-dhcp-agent']
159 PHY_NIC_MTU_CONF = '/etc/init/os-charm-phy-nic-mtu.conf'
160 TEMPLATES = 'templates/'
161
162@@ -95,6 +104,19 @@
163 'contexts': [context.PhyNICMTUContext()],
164 }),
165 ])
166+METADATA_RESOURCE_MAP = OrderedDict([
167+ (NEUTRON_METADATA_AGENT_CONF, {
168+ 'services': ['neutron-metadata-agent'],
169+ 'contexts': [neutron_ovs_context.SharedSecretContext(),
170+ neutron_ovs_context.APIIdentityServiceContext()],
171+ }),
172+])
173+DHCP_RESOURCE_MAP = OrderedDict([
174+ (NEUTRON_DHCP_AGENT_CONF, {
175+ 'services': ['neutron-dhcp-agent'],
176+ 'contexts': [],
177+ }),
178+])
179 DVR_RESOURCE_MAP = OrderedDict([
180 (NEUTRON_L3_AGENT_CONF, {
181 'services': ['neutron-l3-agent'],
182@@ -108,11 +130,6 @@
183 'services': ['neutron-l3-agent'],
184 'contexts': [context.ExternalPortContext()],
185 }),
186- (NEUTRON_METADATA_AGENT_CONF, {
187- 'services': ['neutron-metadata-agent'],
188- 'contexts': [neutron_ovs_context.DVRSharedSecretContext(),
189- neutron_ovs_context.APIIdentityServiceContext()],
190- }),
191 ])
192 TEMPLATES = 'templates/'
193 INT_BRIDGE = "br-int"
194@@ -120,16 +137,30 @@
195 DATA_BRIDGE = 'br-data'
196
197
198-def determine_dvr_packages():
199- if not git_install_requested():
200- if use_dvr():
201- return DVR_PACKAGES
202- return []
203+def install_packages():
204+ apt_update()
205+ apt_install(filter_installed_packages(determine_packages()))
206+
207+
208+def purge_packages(pkg_list):
209+ purge_pkgs = []
210+ required_packages = determine_packages()
211+ for pkg in pkg_list:
212+ if pkg not in required_packages:
213+ purge_pkgs.append(pkg)
214+ if purge_pkgs:
215+ apt_purge(purge_pkgs, fatal=True)
216
217
218 def determine_packages():
219- pkgs = neutron_plugin_attribute('ovs', 'packages', 'neutron')
220- pkgs.extend(determine_dvr_packages())
221+ pkgs = []
222+ plugin_pkgs = neutron_plugin_attribute('ovs', 'packages', 'neutron')
223+ for plugin_pkg in plugin_pkgs:
224+ pkgs.extend(plugin_pkg)
225+ if use_dvr():
226+ pkgs.extend(DVR_PACKAGES)
227+ if enable_local_dhcp():
228+ pkgs.extend(DHCP_PACKAGES)
229
230 if git_install_requested():
231 pkgs.extend(BASE_GIT_PACKAGES)
232@@ -158,8 +189,14 @@
233 resource_map = deepcopy(BASE_RESOURCE_MAP)
234 if use_dvr():
235 resource_map.update(DVR_RESOURCE_MAP)
236+ resource_map.update(METADATA_RESOURCE_MAP)
237 dvr_services = ['neutron-metadata-agent', 'neutron-l3-agent']
238 resource_map[NEUTRON_CONF]['services'] += dvr_services
239+ if enable_local_dhcp():
240+ resource_map.update(METADATA_RESOURCE_MAP)
241+ resource_map.update(DHCP_RESOURCE_MAP)
242+ metadata_services = ['neutron-metadata-agent', 'neutron-dhcp-agent']
243+ resource_map[NEUTRON_CONF]['services'] += metadata_services
244 return resource_map
245
246
247@@ -209,7 +246,7 @@
248
249
250 def get_shared_secret():
251- ctxt = neutron_ovs_context.DVRSharedSecretContext()()
252+ ctxt = neutron_ovs_context.SharedSecretContext()()
253 if 'shared_secret' in ctxt:
254 return ctxt['shared_secret']
255
256@@ -218,6 +255,14 @@
257 return context.NeutronAPIContext()()['enable_dvr']
258
259
260+def enable_nova_metadata():
261+ return use_dvr() or enable_local_dhcp()
262+
263+
264+def enable_local_dhcp():
265+ return config('enable-local-dhcp-and-metadata')
266+
267+
268 def git_install(projects_yaml):
269 """Perform setup, and install git repos specified in yaml parameter."""
270 if git_install_requested():
271
272=== added file 'templates/icehouse/dhcp_agent.ini'
273--- templates/icehouse/dhcp_agent.ini 1970-01-01 00:00:00 +0000
274+++ templates/icehouse/dhcp_agent.ini 2015-09-12 09:04:08 +0000
275@@ -0,0 +1,14 @@
276+###############################################################################
277+# [ WARNING ]
278+# Configuration file maintained by Juju. Local changes may be overwritten.
279+###############################################################################
280+[DEFAULT]
281+state_path = /var/lib/neutron
282+interface_driver = neutron.agent.linux.interface.OVSInterfaceDriver
283+dhcp_driver = neutron.agent.linux.dhcp.Dnsmasq
284+root_helper = sudo /usr/bin/neutron-rootwrap /etc/neutron/rootwrap.conf
285+
286+enable_metadata_network = True
287+enable_isolated_metadata = True
288+
289+ovs_use_veth = True
290
291=== modified file 'unit_tests/test_neutron_ovs_context.py'
292--- unit_tests/test_neutron_ovs_context.py 2015-08-18 21:18:45 +0000
293+++ unit_tests/test_neutron_ovs_context.py 2015-09-12 09:04:08 +0000
294@@ -250,11 +250,11 @@
295 self.assertEquals(context.L3AgentContext()(), {'agent_mode': 'legacy'})
296
297
298-class DVRSharedSecretContext(CharmTestCase):
299+class SharedSecretContext(CharmTestCase):
300
301 def setUp(self):
302- super(DVRSharedSecretContext, self).setUp(context,
303- TO_PATCH)
304+ super(SharedSecretContext, self).setUp(context,
305+ TO_PATCH)
306 self.config.side_effect = self.test_config.get
307
308 @patch('os.path')
309@@ -286,7 +286,7 @@
310 _NeutronAPIContext.side_effect = fake_context({'enable_dvr': True})
311 _shared_secret.return_value = 'secret_thing'
312 self.resolve_address.return_value = '10.0.0.10'
313- self.assertEquals(context.DVRSharedSecretContext()(),
314+ self.assertEquals(context.SharedSecretContext()(),
315 {'shared_secret': 'secret_thing',
316 'local_ip': '10.0.0.10'})
317
318@@ -297,4 +297,4 @@
319 _NeutronAPIContext.side_effect = fake_context({'enable_dvr': False})
320 _shared_secret.return_value = 'secret_thing'
321 self.resolve_address.return_value = '10.0.0.10'
322- self.assertEquals(context.DVRSharedSecretContext()(), {})
323+ self.assertEquals(context.SharedSecretContext()(), {})
324
325=== modified file 'unit_tests/test_neutron_ovs_hooks.py'
326--- unit_tests/test_neutron_ovs_hooks.py 2015-04-02 20:35:37 +0000
327+++ unit_tests/test_neutron_ovs_hooks.py 2015-09-12 09:04:08 +0000
328@@ -1,4 +1,4 @@
329-from mock import MagicMock, patch, call
330+from mock import MagicMock, patch
331 import yaml
332
333 from test_utils import CharmTestCase
334@@ -19,13 +19,8 @@
335 utils.restart_map = _map
336
337 TO_PATCH = [
338- 'apt_update',
339- 'apt_install',
340- 'apt_purge',
341 'config',
342 'CONFIGS',
343- 'determine_packages',
344- 'determine_dvr_packages',
345 'get_shared_secret',
346 'git_install',
347 'log',
348@@ -33,6 +28,10 @@
349 'relation_set',
350 'configure_ovs',
351 'use_dvr',
352+ 'install_packages',
353+ 'purge_packages',
354+ 'enable_nova_metadata',
355+ 'enable_local_dhcp',
356 ]
357 NEUTRON_CONF_DIR = "/etc/neutron"
358
359@@ -54,19 +53,12 @@
360 @patch.object(hooks, 'git_install_requested')
361 def test_install_hook(self, git_requested):
362 git_requested.return_value = False
363- _pkgs = ['foo', 'bar']
364- self.determine_packages.return_value = [_pkgs]
365 self._call_hook('install')
366- self.apt_update.assert_called_with()
367- self.apt_install.assert_has_calls([
368- call(_pkgs, fatal=True),
369- ])
370+ self.install_packages.assert_called_with()
371
372 @patch.object(hooks, 'git_install_requested')
373 def test_install_hook_git(self, git_requested):
374 git_requested.return_value = True
375- _pkgs = ['foo', 'bar']
376- self.determine_packages.return_value = _pkgs
377 openstack_origin_git = {
378 'repositories': [
379 {'name': 'requirements',
380@@ -81,8 +73,7 @@
381 projects_yaml = yaml.dump(openstack_origin_git)
382 self.test_config.set('openstack-origin-git', projects_yaml)
383 self._call_hook('install')
384- self.apt_update.assert_called_with()
385- self.assertTrue(self.determine_packages)
386+ self.install_packages.assert_called_with()
387 self.git_install.assert_called_with(projects_yaml)
388
389 @patch.object(hooks, 'git_install_requested')
390@@ -124,13 +115,9 @@
391 @patch.object(hooks, 'git_install_requested')
392 def test_config_changed_dvr(self, git_requested):
393 git_requested.return_value = False
394- self.determine_dvr_packages.return_value = ['dvr']
395 self._call_hook('config-changed')
396- self.apt_update.assert_called_with()
397+ self.install_packages.assert_called_with()
398 self.assertTrue(self.CONFIGS.write_all.called)
399- self.apt_install.assert_has_calls([
400- call(['dvr'], fatal=True),
401- ])
402 self.configure_ovs.assert_called_with()
403
404 @patch.object(hooks, 'neutron_plugin_joined')
405@@ -140,9 +127,22 @@
406 self.configure_ovs.assert_called_with()
407 self.assertTrue(self.CONFIGS.write_all.called)
408 _plugin_joined.assert_called_with(relation_id='rid')
409+ self.install_packages.assert_called_with()
410+
411+ @patch.object(hooks, 'neutron_plugin_joined')
412+ def test_neutron_plugin_api_nodvr(self, _plugin_joined):
413+ self.use_dvr.return_value = False
414+ self.relation_ids.return_value = ['rid']
415+ self._call_hook('neutron-plugin-api-relation-changed')
416+ self.configure_ovs.assert_called_with()
417+ self.assertTrue(self.CONFIGS.write_all.called)
418+ _plugin_joined.assert_called_with(relation_id='rid')
419+ self.purge_packages.assert_called_with(['neutron-l3-agent'])
420
421 @patch.object(hooks, 'git_install_requested')
422 def test_neutron_plugin_joined(self, git_requested):
423+ self.enable_nova_metadata.return_value = True
424+ self.enable_local_dhcp.return_value = True
425 git_requested.return_value = False
426 self.get_shared_secret.return_value = 'secret'
427 self._call_hook('neutron-plugin-relation-joined')
428
429=== modified file 'unit_tests/test_neutron_ovs_utils.py'
430--- unit_tests/test_neutron_ovs_utils.py 2015-05-07 18:48:58 +0000
431+++ unit_tests/test_neutron_ovs_utils.py 2015-09-12 09:04:08 +0000
432@@ -18,8 +18,11 @@
433 TO_PATCH = [
434 'add_bridge',
435 'add_bridge_port',
436+ 'apt_install',
437+ 'apt_update',
438 'config',
439 'os_release',
440+ 'filter_installed_packages',
441 'neutron_plugin_attribute',
442 'full_restart',
443 'service_restart',
444@@ -75,19 +78,57 @@
445 # Reset cached cache
446 hookenv.cache = {}
447
448+ @patch.object(nutils, 'determine_packages')
449+ def test_install_packages(self, _determine_packages):
450+ _determine_packages.return_value = 'randompkg'
451+ nutils.install_packages()
452+ self.apt_update.assert_called_with()
453+ self.apt_install.assert_called_with(self.filter_installed_packages())
454+
455 @patch.object(nutils, 'use_dvr')
456 @patch.object(nutils, 'git_install_requested')
457 @patch.object(charmhelpers.contrib.openstack.neutron, 'os_release')
458 @patch.object(charmhelpers.contrib.openstack.neutron, 'headers_package')
459 def test_determine_packages(self, _head_pkgs, _os_rel, _git_requested,
460 _use_dvr):
461- _git_requested.return_value = False
462- _use_dvr.return_value = False
463- _os_rel.return_value = 'trusty'
464- _head_pkgs.return_value = head_pkg
465- pkg_list = nutils.determine_packages()
466- expect = [['neutron-plugin-openvswitch-agent'], [head_pkg]]
467- self.assertItemsEqual(pkg_list, expect)
468+ self.test_config.set('enable-local-dhcp-and-metadata', False)
469+ _git_requested.return_value = False
470+ _use_dvr.return_value = False
471+ _os_rel.return_value = 'trusty'
472+ _head_pkgs.return_value = head_pkg
473+ pkg_list = nutils.determine_packages()
474+ expect = ['neutron-plugin-openvswitch-agent', head_pkg]
475+ self.assertItemsEqual(pkg_list, expect)
476+
477+ @patch.object(nutils, 'use_dvr')
478+ @patch.object(nutils, 'git_install_requested')
479+ @patch.object(charmhelpers.contrib.openstack.neutron, 'os_release')
480+ @patch.object(charmhelpers.contrib.openstack.neutron, 'headers_package')
481+ def test_determine_packages_metadata(self, _head_pkgs, _os_rel,
482+ _git_requested, _use_dvr):
483+ self.test_config.set('enable-local-dhcp-and-metadata', True)
484+ _git_requested.return_value = False
485+ _use_dvr.return_value = False
486+ _os_rel.return_value = 'trusty'
487+ _head_pkgs.return_value = head_pkg
488+ pkg_list = nutils.determine_packages()
489+ expect = ['neutron-plugin-openvswitch-agent', head_pkg,
490+ 'neutron-metadata-agent', 'neutron-dhcp-agent']
491+ self.assertItemsEqual(pkg_list, expect)
492+
493+ @patch.object(nutils, 'use_dvr')
494+ @patch.object(nutils, 'git_install_requested')
495+ @patch.object(charmhelpers.contrib.openstack.neutron, 'os_release')
496+ @patch.object(charmhelpers.contrib.openstack.neutron, 'headers_package')
497+ def test_determine_packages_git(self, _head_pkgs, _os_rel,
498+ _git_requested, _use_dvr):
499+ self.test_config.set('enable-local-dhcp-and-metadata', False)
500+ _git_requested.return_value = True
501+ _use_dvr.return_value = True
502+ _os_rel.return_value = 'trusty'
503+ _head_pkgs.return_value = head_pkg
504+ pkg_list = nutils.determine_packages()
505+ self.assertFalse('neutron-l3-agent' in pkg_list)
506
507 @patch.object(nutils, 'use_dvr')
508 def test_register_configs(self, _use_dvr):
509@@ -128,6 +169,19 @@
510 [self.assertIn(q_conf, _map.keys()) for q_conf in confs]
511 self.assertEqual(_map[nutils.NEUTRON_CONF]['services'], svcs)
512
513+ @patch.object(nutils, 'enable_local_dhcp')
514+ @patch.object(nutils, 'use_dvr')
515+ def test_resource_map_dhcp(self, _use_dvr, _enable_local_dhcp):
516+ _enable_local_dhcp.return_value = True
517+ _use_dvr.return_value = False
518+ _map = nutils.resource_map()
519+ svcs = ['neutron-plugin-openvswitch-agent', 'neutron-metadata-agent',
520+ 'neutron-dhcp-agent']
521+ confs = [nutils.NEUTRON_CONF, nutils.NEUTRON_METADATA_AGENT_CONF,
522+ nutils.NEUTRON_DHCP_AGENT_CONF]
523+ [self.assertIn(q_conf, _map.keys()) for q_conf in confs]
524+ self.assertEqual(_map[nutils.NEUTRON_CONF]['services'], svcs)
525+
526 @patch.object(nutils, 'use_dvr')
527 def test_restart_map(self, _use_dvr):
528 _use_dvr.return_value = False
529@@ -213,7 +267,7 @@
530 ])
531 self.add_bridge_port.assert_called_with('br-ex', 'eth0')
532
533- @patch.object(neutron_ovs_context, 'DVRSharedSecretContext')
534+ @patch.object(neutron_ovs_context, 'SharedSecretContext')
535 def test_get_shared_secret(self, _dvr_secret_ctxt):
536 _dvr_secret_ctxt.return_value = \
537 DummyContext(return_value={'shared_secret': 'supersecret'})

Subscribers

People subscribed via source and target branches