Merge lp:~xavpaice/juju-deployer/lp1642157 into lp:juju-deployer

Proposed by Xav Paice
Status: Merged
Merged at revision: 211
Proposed branch: lp:~xavpaice/juju-deployer/lp1642157
Merge into: lp:juju-deployer
Diff against target: 167 lines (+58/-6)
8 files modified
deployer/action/importer.py (+1/-0)
deployer/deployment.py (+1/-0)
deployer/env/base.py (+12/-1)
deployer/service.py (+4/-0)
deployer/tests/test_data/wiki-bindings.yaml (+13/-0)
deployer/tests/test_guiserver.py (+2/-2)
deployer/tests/test_importer.py (+24/-3)
deployer/utils.py (+1/-0)
To merge this branch: bzr merge lp:~xavpaice/juju-deployer/lp1642157
Reviewer Review Type Date Requested Status
Tim Van Steenburgh (community) Approve
Review via email: mp+320017@code.launchpad.net

Description of the change

This adds the ability for juju-deployer to use the --bind cli option, in bundles it's 'bindings'. The option allows us to use spaces with juju 2.1/maas.

If there is already more than one space defined in juju, without this fix all new LXDs will fail to create.

I'm finding test errors with this patch, and would really appreciate some assistance getting the tests to pass.

To post a comment you must log in.
Revision history for this message
Tim Van Steenburgh (tvansteenburgh) wrote :

+1. Tests pass for me.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'deployer/action/importer.py'
2--- deployer/action/importer.py 2017-02-28 14:58:52 +0000
3+++ deployer/action/importer.py 2017-03-16 04:28:01 +0000
4@@ -206,6 +206,7 @@
5 num_units,
6 placement.get(0),
7 charm.series or self.deployment.series,
8+ svc.bindings,
9 )
10
11 if svc.annotations:
12
13=== modified file 'deployer/deployment.py'
14--- deployer/deployment.py 2016-05-12 20:22:06 +0000
15+++ deployer/deployment.py 2017-03-16 04:28:01 +0000
16@@ -312,4 +312,5 @@
17 def to_yaml(dumper, deployment):
18 return dumper.represent_dict(deployment.data)
19
20+
21 yaml.add_representer(Deployment, Deployment.to_yaml)
22
23=== modified file 'deployer/env/base.py'
24--- deployer/env/base.py 2017-02-28 14:58:52 +0000
25+++ deployer/env/base.py 2017-03-16 04:28:01 +0000
26@@ -70,7 +70,7 @@
27
28 def deploy(self, name, charm_url, repo=None, config=None, constraints=None,
29 resources=None, storage=None, num_units=1, force_machine=None,
30- series=None):
31+ series=None, bindings=None):
32 params = self._named_env(["juju", "deploy"])
33 with temp_file() as fh:
34 if config:
35@@ -109,6 +109,17 @@
36 params.extend(["--to=%s" % force_machine])
37 if series and get_juju_major_version() > 1:
38 params.extend(['--series', series])
39+ if bindings:
40+ if not isinstance(bindings, dict):
41+ raise DeploymentError(
42+ "bindings must be specified as a dictionary")
43+ bindings_list = []
44+ for key, value in bindings.items():
45+ if key == "":
46+ bindings_list.append("{}".format(value))
47+ else:
48+ bindings_list.append("{}={}".format(key, value))
49+ params.extend(["--bind \"%s\"" % " ".join(bindings_list)])
50
51 params.extend([charm_url, name])
52 self._check_call(
53
54=== modified file 'deployer/service.py'
55--- deployer/service.py 2017-02-28 14:58:52 +0000
56+++ deployer/service.py 2017-03-16 04:28:01 +0000
57@@ -59,6 +59,10 @@
58 return self.svc_data.get('resources', None)
59
60 @property
61+ def bindings(self):
62+ return self.svc_data.get('bindings', None)
63+
64+ @property
65 def storage(self):
66 return self.svc_data.get('storage', None)
67
68
69=== added file 'deployer/tests/test_data/wiki-bindings.yaml'
70--- deployer/tests/test_data/wiki-bindings.yaml 1970-01-01 00:00:00 +0000
71+++ deployer/tests/test_data/wiki-bindings.yaml 2017-03-16 04:28:01 +0000
72@@ -0,0 +1,13 @@
73+wiki:
74+ series: precise
75+ services:
76+ wiki:
77+ charm: cs:precise/mediawiki
78+ options:
79+ name: $hi_world _are_you_there? {guess_who}
80+ bindings:
81+ "": "default"
82+ db:
83+ charm: cs:precise/mysql
84+ relations:
85+ - [wiki, db]
86
87=== modified file 'deployer/tests/test_guiserver.py'
88--- deployer/tests/test_guiserver.py 2017-02-28 14:58:52 +0000
89+++ deployer/tests/test_guiserver.py 2017-03-16 04:28:01 +0000
90@@ -284,13 +284,13 @@
91 mock.call.deploy(
92 'mysql', 'cs:precise/mysql-28', '', None,
93 {'arch': 'i386', 'cpu-cores': 4, 'mem': '4G'},
94- None, None, 2, None, 'precise'),
95+ None, None, 2, None, 'precise', None),
96 mock.call.set_annotation(
97 'mysql', {'gui-y': '164.547', 'gui-x': '494.347'}),
98 mock.call.deploy(
99 'wordpress', 'cs:precise/wordpress-20', '',
100 {'debug': 'no', 'engine': 'nginx', 'tuning': 'single'},
101- None, None, None, 1, None, 'precise'),
102+ None, None, None, 1, None, 'precise', None),
103 mock.call.set_annotation(
104 'wordpress', {'gui-y': '414.547', 'gui-x': '425.347'}),
105 mock.call.add_units('mysql', 2),
106
107=== modified file 'deployer/tests/test_importer.py'
108--- deployer/tests/test_importer.py 2017-02-28 14:58:52 +0000
109+++ deployer/tests/test_importer.py 2017-03-16 04:28:01 +0000
110@@ -63,7 +63,7 @@
111 env.method_calls[3], mock.call.deploy(
112 'wiki', 'cs:precise/mediawiki',
113 os.environ.get("JUJU_REPOSITORY", ""),
114- config, None, None, None, 1, None, 'precise'))
115+ config, None, None, None, 1, None, 'precise', None))
116 env.add_relation.assert_called_once_with('wiki', 'db')
117
118 @skip_if_offline
119@@ -84,7 +84,7 @@
120 os.environ.get("JUJU_REPOSITORY", ""),
121 config, None,
122 {"config": "./docs/cfg.xml", "tarball": "/some/file.tgz"},
123- None, 1, None, 'precise'))
124+ None, 1, None, 'precise', None))
125 env.add_relation.assert_called_once_with('wiki', 'db')
126
127 @skip_if_offline
128@@ -105,7 +105,28 @@
129 'wiki', 'cs:precise/mediawiki',
130 os.environ.get("JUJU_REPOSITORY", ""),
131 config, None, None, {"web-data": "cinder,10G,1"},
132- 1, None, 'precise'))
133+ 1, None, 'precise', None))
134+ env.add_relation.assert_called_once_with('wiki', 'db')
135+
136+ @skip_if_offline
137+ @skip_if_offline
138+ @mock.patch('deployer.action.importer.time')
139+ def test_importer_with_bindings(self, mock_time):
140+ mock_time.time.return_value = 0
141+ stack = ConfigStack([
142+ os.path.join(self.test_data_dir, 'wiki-bindings.yaml')])
143+ deploy = stack.get('wiki')
144+ env = mock.MagicMock()
145+ importer = Importer(env, deploy, self.options)
146+ importer.run()
147+
148+ config = {'name': '$hi_world _are_you_there? {guess_who}'}
149+ self.assertEqual(
150+ env.method_calls[3], mock.call.deploy(
151+ 'wiki', 'cs:precise/mediawiki',
152+ os.environ.get("JUJU_REPOSITORY", ""),
153+ config, None, None, None,
154+ 1, None, 'precise', {"": "default"}))
155 env.add_relation.assert_called_once_with('wiki', 'db')
156
157 @skip_if_offline
158
159=== modified file 'deployer/utils.py'
160--- deployer/utils.py 2016-10-25 15:28:08 +0000
161+++ deployer/utils.py 2017-03-16 04:28:01 +0000
162@@ -75,6 +75,7 @@
163 node = yaml.ScalarNode(tag=u'tag:yaml.org,2002:str', value=uni)
164 return node
165
166+
167 yaml.add_representer(six.text_type, _unicode_representer)
168
169

Subscribers

People subscribed via source and target branches