Merge lp:~sseman/juju-ci-tools/add-juju1x-to-multi-series into lp:juju-ci-tools

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
Reviewer Review Type Date Requested Status
Curtis Hovey (community) code Approve
Review via email: mp+292747@code.launchpad.net

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_multi_series_charms to support Juju 1.X tests.

To post a comment you must log in.
Revision history for this message
Curtis Hovey (sinzui) wrote :

Thank you.

review: Approve (code)

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'assess_multi_series_charms.py'
--- assess_multi_series_charms.py 2016-04-15 16:59:14 +0000
+++ assess_multi_series_charms.py 2016-04-25 06:32:05 +0000
@@ -36,6 +36,7 @@
36import argparse36import argparse
37from collections import namedtuple37from collections import namedtuple
38import logging38import logging
39import os
39import subprocess40import subprocess
40import sys41import sys
4142
@@ -43,6 +44,7 @@
43from utility import (44from utility import (
44 add_basic_testing_arguments,45 add_basic_testing_arguments,
45 configure_logging,46 configure_logging,
47 local_charm_path,
46 make_charm,48 make_charm,
47 temp_dir,49 temp_dir,
48)50)
@@ -55,7 +57,8 @@
55log = logging.getLogger("assess_multi_series_charms")57log = logging.getLogger("assess_multi_series_charms")
5658
5759
58Test = namedtuple("Test", ["series", "service", "force", "success", "machine"])60Test = namedtuple("Test", ["series", "service", "force", "success", "machine",
61 "juju1x_supported"])
5962
6063
61def assess_multi_series_charms(client):64def assess_multi_series_charms(client):
@@ -67,28 +70,38 @@
67 """70 """
68 tests = [71 tests = [
69 Test(series="precise", service='test0', force=False, success=False,72 Test(series="precise", service='test0', force=False, success=False,
70 machine=None),73 machine=None, juju1x_supported=False),
71 Test(series=None, service='test1', force=False, success=True,74 Test(series=None, service='test1', force=False, success=True,
72 machine='0'),75 machine='0', juju1x_supported=True),
73 Test(series="trusty", service='test2', force=False, success=True,76 Test(series="trusty", service='test2', force=False, success=True,
74 machine='1'),77 machine='1', juju1x_supported=True),
75 Test(series="xenial", service='test3', force=False, success=True,78 Test(series="xenial", service='test3', force=False, success=True,
76 machine='2'),79 machine='2', juju1x_supported=False),
77 Test(series="precise", service='test4', force=True, success=True,80 Test(series="precise", service='test4', force=True, success=True,
78 machine='3'),81 machine='3', juju1x_supported=False),
79 ]82 ]
80 with temp_dir() as charm_dir:83 with temp_dir() as repository:
81 make_charm(charm_dir, series=['trusty', 'xenial'])84 charm_name = 'dummy'
85 charm_dir = os.path.join(repository, 'trusty', charm_name)
86 os.makedirs(charm_dir)
87 make_charm(
88 charm_dir, min_ver=None, series=['trusty', 'xenial'],
89 name=charm_name)
90 charm_path = local_charm_path(
91 charm=charm_name, juju_ver=client.version, series='trusty',
92 repository=os.path.dirname(charm_dir))
82 for test in tests:93 for test in tests:
94 if client.is_juju1x() and not test.juju1x_supported:
95 continue
83 log.info(96 log.info(
84 "Assessing multi series charms: test: {} charm_dir:{}".format(97 "Assessing multi series charms: test: {} charm_dir:{}".format(
85 test, charm_dir))98 test, charm_path))
86 assert_deploy(client, test, charm_dir)99 assert_deploy(client, test, charm_path, repository=repository)
87 if test.machine:100 if test.machine:
88 check_series(client, machine=test.machine, series=test.series)101 check_series(client, machine=test.machine, series=test.series)
89102
90103
91def assert_deploy(client, test, charm_dir):104def assert_deploy(client, test, charm_path, repository=None):
92 """Deploy a charm and assert a success or fail.105 """Deploy a charm and assert a success or fail.
93106
94 :param client: Juju client107 :param client: Juju client
@@ -97,16 +110,20 @@
97 :type test: Test110 :type test: Test
98 :param charm_dir:111 :param charm_dir:
99 :type charm_dir: str112 :type charm_dir: str
113 :param repository: Direcotry path to the repository
114 :type repository: str
100 :return: None115 :return: None
101 """116 """
102 if test.success:117 if test.success:
103 client.deploy(charm=charm_dir, series=test.series,118 client.deploy(charm=charm_path, series=test.series,
104 service=test.service, force=test.force)119 service=test.service, force=test.force,
120 repository=repository)
105 client.wait_for_started()121 client.wait_for_started()
106 else:122 else:
107 try:123 try:
108 client.deploy(charm=charm_dir, series=test.series,124 client.deploy(charm=charm_path, series=test.series,
109 service=test.service, force=test.force)125 service=test.service, force=test.force,
126 repository=repository)
110 except subprocess.CalledProcessError:127 except subprocess.CalledProcessError:
111 return128 return
112 raise JujuAssertionError('Assert deploy failed for {}'.format(test))129 raise JujuAssertionError('Assert deploy failed for {}'.format(test))
113130
=== modified file 'jujupy.py'
--- jujupy.py 2016-04-21 22:09:04 +0000
+++ jujupy.py 2016-04-25 06:32:05 +0000
@@ -1114,6 +1114,9 @@
1114 def add_subnet(self, subnet, space):1114 def add_subnet(self, subnet, space):
1115 self.juju('add-subnet', (subnet, space))1115 self.juju('add-subnet', (subnet, space))
11161116
1117 def is_juju1x(self):
1118 return self.version.startswith('1.')
1119
11171120
1118class EnvJujuClient2B2(EnvJujuClient):1121class EnvJujuClient2B2(EnvJujuClient):
11191122
11201123
=== modified file 'tests/test_assess_multi_series_charms.py'
--- tests/test_assess_multi_series_charms.py 2016-04-14 19:29:39 +0000
+++ tests/test_assess_multi_series_charms.py 2016-04-25 06:32:05 +0000
@@ -6,6 +6,7 @@
6 Mock,6 Mock,
7 patch,7 patch,
8)8)
9import os
9import StringIO10import StringIO
10import subprocess11import subprocess
1112
@@ -71,7 +72,10 @@
7172
72 def test_assess_multi_series_charms(self):73 def test_assess_multi_series_charms(self):
73 mock_client = Mock(74 mock_client = Mock(
74 spec=["deploy", "get_juju_output", "wait_for_started"])75 spec=["deploy", "get_juju_output", "wait_for_started",
76 "is_juju1x"])
77 mock_client.version = '2.0.0'
78 mock_client.is_juju1x.return_value = False
75 mock_client.get_juju_output.return_value = "Codename: trusty"79 mock_client.get_juju_output.return_value = "Codename: trusty"
76 mock_client.deploy.side_effect = [80 mock_client.deploy.side_effect = [
77 subprocess.CalledProcessError(None, None),81 subprocess.CalledProcessError(None, None),
@@ -88,16 +92,18 @@
88 autospec=True) as cs_mock:92 autospec=True) as cs_mock:
89 assess_multi_series_charms(mock_client)93 assess_multi_series_charms(mock_client)
90 self.assertEqual(mock_client.wait_for_started.call_count, 4)94 self.assertEqual(mock_client.wait_for_started.call_count, 4)
95 charm = os.path.join(charm_dir, 'trusty', 'dummy')
91 calls = [96 calls = [
92 call(charm=charm_dir, force=False, series='precise',97 call(charm=charm, force=False, repository=charm_dir,
93 service='test0'),98 series='precise', service='test0'),
94 call(charm=charm_dir, force=False, series=None, service='test1'),99 call(charm=charm, force=False, repository=charm_dir,
95 call(charm=charm_dir, force=False, series='trusty',100 series=None, service='test1'),
96 service='test2'),101 call(charm=charm, force=False, repository=charm_dir,
97 call(charm=charm_dir, force=False, series='xenial',102 series='trusty', service='test2'),
98 service='test3'),103 call(charm=charm, force=False, repository=charm_dir,
99 call(charm=charm_dir, force=True, series='precise',104 series='xenial', service='test3'),
100 service='test4')105 call(charm=charm, force=True, repository=charm_dir,
106 series='precise', service='test4')
101 ]107 ]
102 self.assertEqual(mock_client.deploy.mock_calls, calls)108 self.assertEqual(mock_client.deploy.mock_calls, calls)
103 td_mock.assert_called_once_with()109 td_mock.assert_called_once_with()
@@ -108,33 +114,66 @@
108 call(mock_client, machine='3', series='precise')]114 call(mock_client, machine='3', series='precise')]
109 self.assertEqual(cs_mock.mock_calls, cs_calls)115 self.assertEqual(cs_mock.mock_calls, cs_calls)
110116
117 def test_assess_multi_series_charms_juju1x(self):
118 mock_client = Mock(
119 spec=[
120 "deploy", "get_juju_output", "wait_for_started", "is_juju1x"])
121 mock_client.version = '1.25.5'
122 mock_client.is_juju1x.return_value = True
123 mock_client.get_juju_output.return_value = "Codename: trusty"
124 mock_client.deploy.return_value = None
125 with temp_dir() as charm_dir:
126 with patch('assess_multi_series_charms.temp_dir',
127 autospec=True) as td_mock:
128 td_mock.return_value.__enter__.return_value = charm_dir
129 with patch('assess_multi_series_charms.check_series',
130 autospec=True) as cs_mock:
131 assess_multi_series_charms(mock_client)
132 self.assertEqual(mock_client.wait_for_started.call_count, 2)
133 charm = os.path.join('local:trusty', 'dummy')
134 calls = [
135 call(charm=charm, force=False, repository=charm_dir,
136 series=None, service='test1'),
137 call(charm=charm, force=False, repository=charm_dir,
138 series='trusty', service='test2')
139 ]
140 self.assertEqual(mock_client.deploy.mock_calls, calls)
141 td_mock.assert_called_once_with()
142 cs_calls = [
143 call(mock_client, machine='0', series=None),
144 call(mock_client, machine='1', series='trusty')]
145 self.assertEqual(cs_mock.mock_calls, cs_calls)
146
111 def test_assert_deploy(self):147 def test_assert_deploy(self):
112 test = Test(series='trusty', service='test1', force=False,148 test = Test(series='trusty', service='test1', force=False,
113 success=True, machine='0')149 success=True, machine='0', juju1x_supported=False)
114 mock_client = Mock(150 mock_client = Mock(
115 spec=["deploy", "get_juju_output", "wait_for_started"])151 spec=["deploy", "get_juju_output", "wait_for_started"])
116 assert_deploy(mock_client, test, '/tmp/foo')152 assert_deploy(mock_client, test, '/tmp/foo')
117 mock_client.deploy.assert_called_once_with(153 mock_client.deploy.assert_called_once_with(
118 charm='/tmp/foo', force=False, series='trusty', service='test1')154 charm='/tmp/foo', force=False, repository=None, series='trusty',
155 service='test1')
119156
120 def test_assert_deploy_success_false(self):157 def test_assert_deploy_success_false(self):
121 test = Test(series='trusty', service='test1', force=False,158 test = Test(series='trusty', service='test1', force=False,
122 success=False, machine='0')159 success=False, machine='0', juju1x_supported=False)
123 mock_client = Mock(160 mock_client = Mock(
124 spec=["deploy", "get_juju_output", "wait_for_started"])161 spec=["deploy", "get_juju_output", "wait_for_started"])
125 mock_client.deploy.side_effect = subprocess.CalledProcessError(162 mock_client.deploy.side_effect = subprocess.CalledProcessError(
126 None, None)163 None, None)
127 assert_deploy(mock_client, test, '/tmp/foo')164 assert_deploy(mock_client, test, '/tmp/foo')
128 mock_client.deploy.assert_called_once_with(165 mock_client.deploy.assert_called_once_with(
129 charm='/tmp/foo', force=False, series='trusty', service='test1')166 charm='/tmp/foo', force=False, repository=None, series='trusty',
167 service='test1')
130168
131 def test_assert_deploy_success_false_raises_exception(self):169 def test_assert_deploy_success_false_raises_exception(self):
132 test = Test(series='trusty', service='test1', force=False,170 test = Test(series='trusty', service='test1', force=False,
133 success=False, machine='0')171 success=False, machine='0', juju1x_supported=False)
134 mock_client = Mock(172 mock_client = Mock(
135 spec=["deploy", "get_juju_output", "wait_for_started"])173 spec=["deploy", "get_juju_output", "wait_for_started"])
136 with self.assertRaisesRegexp(174 with self.assertRaisesRegexp(
137 JujuAssertionError, 'Assert deploy failed for'):175 JujuAssertionError, 'Assert deploy failed for'):
138 assert_deploy(mock_client, test, '/tmp/foo')176 assert_deploy(mock_client, test, '/tmp/foo')
139 mock_client.deploy.assert_called_once_with(177 mock_client.deploy.assert_called_once_with(
140 charm='/tmp/foo', force=False, series='trusty', service='test1')178 charm='/tmp/foo', force=False, repository=None, series='trusty',
179 service='test1')
141180
=== modified file 'tests/test_jujupy.py'
--- tests/test_jujupy.py 2016-04-22 04:14:41 +0000
+++ tests/test_jujupy.py 2016-04-25 06:32:05 +0000
@@ -2806,6 +2806,14 @@
2806 client.enable_feature('nomongo')2806 client.enable_feature('nomongo')
2807 self.assertEqual(str(ctx.exception), "Unknown feature flag: 'nomongo'")2807 self.assertEqual(str(ctx.exception), "Unknown feature flag: 'nomongo'")
28082808
2809 def test_is_juju1x(self):
2810 client = EnvJujuClient(None, '1.25.5', None)
2811 self.assertTrue(client.is_juju1x())
2812
2813 def test_is_juju1x_false(self):
2814 client = EnvJujuClient(None, '2.0.0', None)
2815 self.assertFalse(client.is_juju1x())
2816
28092817
2810class TestEnvJujuClient2B2(ClientTest):2818class TestEnvJujuClient2B2(ClientTest):
28112819

Subscribers

People subscribed via source and target branches