Merge lp:~sseman/juju-ci-tools/add-juju1x-to-multi-series into lp:juju-ci-tools
- add-juju1x-to-multi-series
- Merge into trunk
Proposed by
Seman
Status: | Merged |
---|---|
Merged at revision: | 1373 |
Proposed branch: | lp:~sseman/juju-ci-tools/add-juju1x-to-multi-series |
Merge into: | lp:juju-ci-tools |
Diff against target: |
260 lines (+98/-31) 4 files modified
assess_multi_series_charms.py (+32/-15) jujupy.py (+3/-0) tests/test_assess_multi_series_charms.py (+55/-16) tests/test_jujupy.py (+8/-0) |
To merge this branch: | bzr merge lp:~sseman/juju-ci-tools/add-juju1x-to-multi-series |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Curtis Hovey (community) | code | Approve | |
Review via email: mp+292747@code.launchpad.net |
Commit message
Description of the change
Juju version 1.25.5 supports list of series in the charm's metadata.yaml file. It pops the first series in list and use it as a default series.
This branch updates the assess_
To post a comment you must log in.
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'assess_multi_series_charms.py' | |||
2 | --- assess_multi_series_charms.py 2016-04-15 16:59:14 +0000 | |||
3 | +++ assess_multi_series_charms.py 2016-04-25 06:32:05 +0000 | |||
4 | @@ -36,6 +36,7 @@ | |||
5 | 36 | import argparse | 36 | import argparse |
6 | 37 | from collections import namedtuple | 37 | from collections import namedtuple |
7 | 38 | import logging | 38 | import logging |
8 | 39 | import os | ||
9 | 39 | import subprocess | 40 | import subprocess |
10 | 40 | import sys | 41 | import sys |
11 | 41 | 42 | ||
12 | @@ -43,6 +44,7 @@ | |||
13 | 43 | from utility import ( | 44 | from utility import ( |
14 | 44 | add_basic_testing_arguments, | 45 | add_basic_testing_arguments, |
15 | 45 | configure_logging, | 46 | configure_logging, |
16 | 47 | local_charm_path, | ||
17 | 46 | make_charm, | 48 | make_charm, |
18 | 47 | temp_dir, | 49 | temp_dir, |
19 | 48 | ) | 50 | ) |
20 | @@ -55,7 +57,8 @@ | |||
21 | 55 | log = logging.getLogger("assess_multi_series_charms") | 57 | log = logging.getLogger("assess_multi_series_charms") |
22 | 56 | 58 | ||
23 | 57 | 59 | ||
25 | 58 | Test = namedtuple("Test", ["series", "service", "force", "success", "machine"]) | 60 | Test = namedtuple("Test", ["series", "service", "force", "success", "machine", |
26 | 61 | "juju1x_supported"]) | ||
27 | 59 | 62 | ||
28 | 60 | 63 | ||
29 | 61 | def assess_multi_series_charms(client): | 64 | def assess_multi_series_charms(client): |
30 | @@ -67,28 +70,38 @@ | |||
31 | 67 | """ | 70 | """ |
32 | 68 | tests = [ | 71 | tests = [ |
33 | 69 | Test(series="precise", service='test0', force=False, success=False, | 72 | Test(series="precise", service='test0', force=False, success=False, |
35 | 70 | machine=None), | 73 | machine=None, juju1x_supported=False), |
36 | 71 | Test(series=None, service='test1', force=False, success=True, | 74 | Test(series=None, service='test1', force=False, success=True, |
38 | 72 | machine='0'), | 75 | machine='0', juju1x_supported=True), |
39 | 73 | Test(series="trusty", service='test2', force=False, success=True, | 76 | Test(series="trusty", service='test2', force=False, success=True, |
41 | 74 | machine='1'), | 77 | machine='1', juju1x_supported=True), |
42 | 75 | Test(series="xenial", service='test3', force=False, success=True, | 78 | Test(series="xenial", service='test3', force=False, success=True, |
44 | 76 | machine='2'), | 79 | machine='2', juju1x_supported=False), |
45 | 77 | Test(series="precise", service='test4', force=True, success=True, | 80 | Test(series="precise", service='test4', force=True, success=True, |
47 | 78 | machine='3'), | 81 | machine='3', juju1x_supported=False), |
48 | 79 | ] | 82 | ] |
51 | 80 | with temp_dir() as charm_dir: | 83 | with temp_dir() as repository: |
52 | 81 | make_charm(charm_dir, series=['trusty', 'xenial']) | 84 | charm_name = 'dummy' |
53 | 85 | charm_dir = os.path.join(repository, 'trusty', charm_name) | ||
54 | 86 | os.makedirs(charm_dir) | ||
55 | 87 | make_charm( | ||
56 | 88 | charm_dir, min_ver=None, series=['trusty', 'xenial'], | ||
57 | 89 | name=charm_name) | ||
58 | 90 | charm_path = local_charm_path( | ||
59 | 91 | charm=charm_name, juju_ver=client.version, series='trusty', | ||
60 | 92 | repository=os.path.dirname(charm_dir)) | ||
61 | 82 | for test in tests: | 93 | for test in tests: |
62 | 94 | if client.is_juju1x() and not test.juju1x_supported: | ||
63 | 95 | continue | ||
64 | 83 | log.info( | 96 | log.info( |
65 | 84 | "Assessing multi series charms: test: {} charm_dir:{}".format( | 97 | "Assessing multi series charms: test: {} charm_dir:{}".format( |
68 | 85 | test, charm_dir)) | 98 | test, charm_path)) |
69 | 86 | assert_deploy(client, test, charm_dir) | 99 | assert_deploy(client, test, charm_path, repository=repository) |
70 | 87 | if test.machine: | 100 | if test.machine: |
71 | 88 | check_series(client, machine=test.machine, series=test.series) | 101 | check_series(client, machine=test.machine, series=test.series) |
72 | 89 | 102 | ||
73 | 90 | 103 | ||
75 | 91 | def assert_deploy(client, test, charm_dir): | 104 | def assert_deploy(client, test, charm_path, repository=None): |
76 | 92 | """Deploy a charm and assert a success or fail. | 105 | """Deploy a charm and assert a success or fail. |
77 | 93 | 106 | ||
78 | 94 | :param client: Juju client | 107 | :param client: Juju client |
79 | @@ -97,16 +110,20 @@ | |||
80 | 97 | :type test: Test | 110 | :type test: Test |
81 | 98 | :param charm_dir: | 111 | :param charm_dir: |
82 | 99 | :type charm_dir: str | 112 | :type charm_dir: str |
83 | 113 | :param repository: Direcotry path to the repository | ||
84 | 114 | :type repository: str | ||
85 | 100 | :return: None | 115 | :return: None |
86 | 101 | """ | 116 | """ |
87 | 102 | if test.success: | 117 | if test.success: |
90 | 103 | client.deploy(charm=charm_dir, series=test.series, | 118 | client.deploy(charm=charm_path, series=test.series, |
91 | 104 | service=test.service, force=test.force) | 119 | service=test.service, force=test.force, |
92 | 120 | repository=repository) | ||
93 | 105 | client.wait_for_started() | 121 | client.wait_for_started() |
94 | 106 | else: | 122 | else: |
95 | 107 | try: | 123 | try: |
98 | 108 | client.deploy(charm=charm_dir, series=test.series, | 124 | client.deploy(charm=charm_path, series=test.series, |
99 | 109 | service=test.service, force=test.force) | 125 | service=test.service, force=test.force, |
100 | 126 | repository=repository) | ||
101 | 110 | except subprocess.CalledProcessError: | 127 | except subprocess.CalledProcessError: |
102 | 111 | return | 128 | return |
103 | 112 | raise JujuAssertionError('Assert deploy failed for {}'.format(test)) | 129 | raise JujuAssertionError('Assert deploy failed for {}'.format(test)) |
104 | 113 | 130 | ||
105 | === modified file 'jujupy.py' | |||
106 | --- jujupy.py 2016-04-21 22:09:04 +0000 | |||
107 | +++ jujupy.py 2016-04-25 06:32:05 +0000 | |||
108 | @@ -1114,6 +1114,9 @@ | |||
109 | 1114 | def add_subnet(self, subnet, space): | 1114 | def add_subnet(self, subnet, space): |
110 | 1115 | self.juju('add-subnet', (subnet, space)) | 1115 | self.juju('add-subnet', (subnet, space)) |
111 | 1116 | 1116 | ||
112 | 1117 | def is_juju1x(self): | ||
113 | 1118 | return self.version.startswith('1.') | ||
114 | 1119 | |||
115 | 1117 | 1120 | ||
116 | 1118 | class EnvJujuClient2B2(EnvJujuClient): | 1121 | class EnvJujuClient2B2(EnvJujuClient): |
117 | 1119 | 1122 | ||
118 | 1120 | 1123 | ||
119 | === modified file 'tests/test_assess_multi_series_charms.py' | |||
120 | --- tests/test_assess_multi_series_charms.py 2016-04-14 19:29:39 +0000 | |||
121 | +++ tests/test_assess_multi_series_charms.py 2016-04-25 06:32:05 +0000 | |||
122 | @@ -6,6 +6,7 @@ | |||
123 | 6 | Mock, | 6 | Mock, |
124 | 7 | patch, | 7 | patch, |
125 | 8 | ) | 8 | ) |
126 | 9 | import os | ||
127 | 9 | import StringIO | 10 | import StringIO |
128 | 10 | import subprocess | 11 | import subprocess |
129 | 11 | 12 | ||
130 | @@ -71,7 +72,10 @@ | |||
131 | 71 | 72 | ||
132 | 72 | def test_assess_multi_series_charms(self): | 73 | def test_assess_multi_series_charms(self): |
133 | 73 | mock_client = Mock( | 74 | mock_client = Mock( |
135 | 74 | spec=["deploy", "get_juju_output", "wait_for_started"]) | 75 | spec=["deploy", "get_juju_output", "wait_for_started", |
136 | 76 | "is_juju1x"]) | ||
137 | 77 | mock_client.version = '2.0.0' | ||
138 | 78 | mock_client.is_juju1x.return_value = False | ||
139 | 75 | mock_client.get_juju_output.return_value = "Codename: trusty" | 79 | mock_client.get_juju_output.return_value = "Codename: trusty" |
140 | 76 | mock_client.deploy.side_effect = [ | 80 | mock_client.deploy.side_effect = [ |
141 | 77 | subprocess.CalledProcessError(None, None), | 81 | subprocess.CalledProcessError(None, None), |
142 | @@ -88,16 +92,18 @@ | |||
143 | 88 | autospec=True) as cs_mock: | 92 | autospec=True) as cs_mock: |
144 | 89 | assess_multi_series_charms(mock_client) | 93 | assess_multi_series_charms(mock_client) |
145 | 90 | self.assertEqual(mock_client.wait_for_started.call_count, 4) | 94 | self.assertEqual(mock_client.wait_for_started.call_count, 4) |
146 | 95 | charm = os.path.join(charm_dir, 'trusty', 'dummy') | ||
147 | 91 | calls = [ | 96 | calls = [ |
157 | 92 | call(charm=charm_dir, force=False, series='precise', | 97 | call(charm=charm, force=False, repository=charm_dir, |
158 | 93 | service='test0'), | 98 | series='precise', service='test0'), |
159 | 94 | call(charm=charm_dir, force=False, series=None, service='test1'), | 99 | call(charm=charm, force=False, repository=charm_dir, |
160 | 95 | call(charm=charm_dir, force=False, series='trusty', | 100 | series=None, service='test1'), |
161 | 96 | service='test2'), | 101 | call(charm=charm, force=False, repository=charm_dir, |
162 | 97 | call(charm=charm_dir, force=False, series='xenial', | 102 | series='trusty', service='test2'), |
163 | 98 | service='test3'), | 103 | call(charm=charm, force=False, repository=charm_dir, |
164 | 99 | call(charm=charm_dir, force=True, series='precise', | 104 | series='xenial', service='test3'), |
165 | 100 | service='test4') | 105 | call(charm=charm, force=True, repository=charm_dir, |
166 | 106 | series='precise', service='test4') | ||
167 | 101 | ] | 107 | ] |
168 | 102 | self.assertEqual(mock_client.deploy.mock_calls, calls) | 108 | self.assertEqual(mock_client.deploy.mock_calls, calls) |
169 | 103 | td_mock.assert_called_once_with() | 109 | td_mock.assert_called_once_with() |
170 | @@ -108,33 +114,66 @@ | |||
171 | 108 | call(mock_client, machine='3', series='precise')] | 114 | call(mock_client, machine='3', series='precise')] |
172 | 109 | self.assertEqual(cs_mock.mock_calls, cs_calls) | 115 | self.assertEqual(cs_mock.mock_calls, cs_calls) |
173 | 110 | 116 | ||
174 | 117 | def test_assess_multi_series_charms_juju1x(self): | ||
175 | 118 | mock_client = Mock( | ||
176 | 119 | spec=[ | ||
177 | 120 | "deploy", "get_juju_output", "wait_for_started", "is_juju1x"]) | ||
178 | 121 | mock_client.version = '1.25.5' | ||
179 | 122 | mock_client.is_juju1x.return_value = True | ||
180 | 123 | mock_client.get_juju_output.return_value = "Codename: trusty" | ||
181 | 124 | mock_client.deploy.return_value = None | ||
182 | 125 | with temp_dir() as charm_dir: | ||
183 | 126 | with patch('assess_multi_series_charms.temp_dir', | ||
184 | 127 | autospec=True) as td_mock: | ||
185 | 128 | td_mock.return_value.__enter__.return_value = charm_dir | ||
186 | 129 | with patch('assess_multi_series_charms.check_series', | ||
187 | 130 | autospec=True) as cs_mock: | ||
188 | 131 | assess_multi_series_charms(mock_client) | ||
189 | 132 | self.assertEqual(mock_client.wait_for_started.call_count, 2) | ||
190 | 133 | charm = os.path.join('local:trusty', 'dummy') | ||
191 | 134 | calls = [ | ||
192 | 135 | call(charm=charm, force=False, repository=charm_dir, | ||
193 | 136 | series=None, service='test1'), | ||
194 | 137 | call(charm=charm, force=False, repository=charm_dir, | ||
195 | 138 | series='trusty', service='test2') | ||
196 | 139 | ] | ||
197 | 140 | self.assertEqual(mock_client.deploy.mock_calls, calls) | ||
198 | 141 | td_mock.assert_called_once_with() | ||
199 | 142 | cs_calls = [ | ||
200 | 143 | call(mock_client, machine='0', series=None), | ||
201 | 144 | call(mock_client, machine='1', series='trusty')] | ||
202 | 145 | self.assertEqual(cs_mock.mock_calls, cs_calls) | ||
203 | 146 | |||
204 | 111 | def test_assert_deploy(self): | 147 | def test_assert_deploy(self): |
205 | 112 | test = Test(series='trusty', service='test1', force=False, | 148 | test = Test(series='trusty', service='test1', force=False, |
207 | 113 | success=True, machine='0') | 149 | success=True, machine='0', juju1x_supported=False) |
208 | 114 | mock_client = Mock( | 150 | mock_client = Mock( |
209 | 115 | spec=["deploy", "get_juju_output", "wait_for_started"]) | 151 | spec=["deploy", "get_juju_output", "wait_for_started"]) |
210 | 116 | assert_deploy(mock_client, test, '/tmp/foo') | 152 | assert_deploy(mock_client, test, '/tmp/foo') |
211 | 117 | mock_client.deploy.assert_called_once_with( | 153 | mock_client.deploy.assert_called_once_with( |
213 | 118 | charm='/tmp/foo', force=False, series='trusty', service='test1') | 154 | charm='/tmp/foo', force=False, repository=None, series='trusty', |
214 | 155 | service='test1') | ||
215 | 119 | 156 | ||
216 | 120 | def test_assert_deploy_success_false(self): | 157 | def test_assert_deploy_success_false(self): |
217 | 121 | test = Test(series='trusty', service='test1', force=False, | 158 | test = Test(series='trusty', service='test1', force=False, |
219 | 122 | success=False, machine='0') | 159 | success=False, machine='0', juju1x_supported=False) |
220 | 123 | mock_client = Mock( | 160 | mock_client = Mock( |
221 | 124 | spec=["deploy", "get_juju_output", "wait_for_started"]) | 161 | spec=["deploy", "get_juju_output", "wait_for_started"]) |
222 | 125 | mock_client.deploy.side_effect = subprocess.CalledProcessError( | 162 | mock_client.deploy.side_effect = subprocess.CalledProcessError( |
223 | 126 | None, None) | 163 | None, None) |
224 | 127 | assert_deploy(mock_client, test, '/tmp/foo') | 164 | assert_deploy(mock_client, test, '/tmp/foo') |
225 | 128 | mock_client.deploy.assert_called_once_with( | 165 | mock_client.deploy.assert_called_once_with( |
227 | 129 | charm='/tmp/foo', force=False, series='trusty', service='test1') | 166 | charm='/tmp/foo', force=False, repository=None, series='trusty', |
228 | 167 | service='test1') | ||
229 | 130 | 168 | ||
230 | 131 | def test_assert_deploy_success_false_raises_exception(self): | 169 | def test_assert_deploy_success_false_raises_exception(self): |
231 | 132 | test = Test(series='trusty', service='test1', force=False, | 170 | test = Test(series='trusty', service='test1', force=False, |
233 | 133 | success=False, machine='0') | 171 | success=False, machine='0', juju1x_supported=False) |
234 | 134 | mock_client = Mock( | 172 | mock_client = Mock( |
235 | 135 | spec=["deploy", "get_juju_output", "wait_for_started"]) | 173 | spec=["deploy", "get_juju_output", "wait_for_started"]) |
236 | 136 | with self.assertRaisesRegexp( | 174 | with self.assertRaisesRegexp( |
237 | 137 | JujuAssertionError, 'Assert deploy failed for'): | 175 | JujuAssertionError, 'Assert deploy failed for'): |
238 | 138 | assert_deploy(mock_client, test, '/tmp/foo') | 176 | assert_deploy(mock_client, test, '/tmp/foo') |
239 | 139 | mock_client.deploy.assert_called_once_with( | 177 | mock_client.deploy.assert_called_once_with( |
241 | 140 | charm='/tmp/foo', force=False, series='trusty', service='test1') | 178 | charm='/tmp/foo', force=False, repository=None, series='trusty', |
242 | 179 | service='test1') | ||
243 | 141 | 180 | ||
244 | === modified file 'tests/test_jujupy.py' | |||
245 | --- tests/test_jujupy.py 2016-04-22 04:14:41 +0000 | |||
246 | +++ tests/test_jujupy.py 2016-04-25 06:32:05 +0000 | |||
247 | @@ -2806,6 +2806,14 @@ | |||
248 | 2806 | client.enable_feature('nomongo') | 2806 | client.enable_feature('nomongo') |
249 | 2807 | self.assertEqual(str(ctx.exception), "Unknown feature flag: 'nomongo'") | 2807 | self.assertEqual(str(ctx.exception), "Unknown feature flag: 'nomongo'") |
250 | 2808 | 2808 | ||
251 | 2809 | def test_is_juju1x(self): | ||
252 | 2810 | client = EnvJujuClient(None, '1.25.5', None) | ||
253 | 2811 | self.assertTrue(client.is_juju1x()) | ||
254 | 2812 | |||
255 | 2813 | def test_is_juju1x_false(self): | ||
256 | 2814 | client = EnvJujuClient(None, '2.0.0', None) | ||
257 | 2815 | self.assertFalse(client.is_juju1x()) | ||
258 | 2816 | |||
259 | 2809 | 2817 | ||
260 | 2810 | class TestEnvJujuClient2B2(ClientTest): | 2818 | class TestEnvJujuClient2B2(ClientTest): |
261 | 2811 | 2819 |
Thank you.