Merge lp:~gz/juju-ci-tools/update_assess_template into lp:juju-ci-tools

Proposed by Martin Packman
Status: Merged
Merged at revision: 1200
Proposed branch: lp:~gz/juju-ci-tools/update_assess_template
Merge into: lp:juju-ci-tools
Diff against target: 202 lines (+113/-35)
4 files modified
Makefile (+8/-1)
template_assess.py.tmpl (+33/-30)
template_test.py.tmpl (+69/-0)
tests/test_deploy_stack.py (+3/-4)
To merge this branch: bzr merge lp:~gz/juju-ci-tools/update_assess_template
Reviewer Review Type Date Requested Status
Curtis Hovey (community) code Approve
Review via email: mp+280665@code.launchpad.net

Description of the change

Updates template for assess script including tests and a make target

Doesn't get all the way of providing a good test template, mostly because SimpleEnvironment/EnvJujuClient and now BootstrapManager are all a pain to cleanly test in a main function.

To post a comment you must log in.
1186. By Martin Packman

Add missing template test file

Revision history for this message
Curtis Hovey (sinzui) wrote :

Thank you.

review: Approve (code)
1187. By Martin Packman

Log via the local logger in template

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'Makefile'
2--- Makefile 2015-11-13 16:47:48 +0000
3+++ Makefile 2015-12-16 08:02:25 +0000
4@@ -19,4 +19,11 @@
5 sudo apt-get install -y juju-local juju juju-quickstart juju-deployer
6 sudo apt-get install -y python-pip
7 ./pipdeps.py install
8-.PHONY: lint test apt-update install-deps
9+name=NAMEHERE
10+assess_file=assess_$(name).py
11+test_assess_file=tests/test_assess_$(name).py
12+new-assess:
13+ install -m 755 template_assess.py.tmpl $(assess_file)
14+ install -m 644 template_test.py.tmpl $(test_assess_file)
15+ sed -i -e "s/TEMPLATE/$(name)/g" $(assess_file) $(test_assess_file)
16+.PHONY: lint test cover clean new-assess apt-update install-deps
17
18=== modified file 'template_assess.py.tmpl'
19--- template_assess.py.tmpl 2015-12-09 22:41:07 +0000
20+++ template_assess.py.tmpl 2015-12-16 08:02:25 +0000
21@@ -1,49 +1,52 @@
22-#!/usr/bin/python
23+#!/usr/bin/env python
24+"""TODO: add rough description of what is assessed in this module."""
25+
26 from __future__ import print_function
27
28 __metaclass__ = type
29
30-from argparse import ArgumentParser
31+import argparse
32+import logging
33+import sys
34
35 from deploy_stack import (
36 BootstrapManager,
37 )
38 from utility import (
39- add_basic_testing_arguments
40+ add_basic_testing_arguments,
41+ configure_logging,
42 )
43
44
45-TEST_HUMAN_NAME = "<YOUR TEST HUMAN READABLE HERE>"
46-
47-
48-def parse_args():
49+log = logging.getLogger("assess_TEMPLATE")
50+
51+
52+def assess_TEMPLATE(client):
53+ # Deploy charms, there are several under ./repository
54+ client.juju("deploy", ('local:trusty/my-charm',))
55+ # Wait for the deployment to finish.
56+ client.wait_for_started()
57+ log.info("TODO: Add log line about any test")
58+ # TODO: Add specific functional testing actions here.
59+
60+
61+def parse_args(argv):
62 """Parse all arguments."""
63- parser = ArgumentParser(TEST_HUMAN_NAME)
64- # Add your positional arguments
65+ parser = argparse.ArgumentParser(description="TODO: script info")
66+ # TODO: Add additional positional arguments.
67 add_basic_testing_arguments(parser)
68- # Add your optional arguments.
69- return parser.parse_args()
70-
71-
72-def main():
73- args = parse_args()
74- series = args.series
75- if series is None:
76- args.series = 'trusty'
77+ # TODO: Add additional optional arguments.
78+ return parser.parse_args(argv)
79+
80+
81+def main(argv=None):
82+ args = parse_args(argv)
83+ configure_logging(args.verbose)
84 bs_manager = BootstrapManager.from_args(args)
85- client = bs_manager.client
86 with bs_manager.booted_context(args.upload_tools):
87- client.get_status(60)
88- # Deploy charms, there are several under ./repository
89- client.juju("deploy", ('local:trusty/my-charm',))
90- # Wait for the deployment to finish.
91- client.wait_for_started()
92-
93- # ----------------- CALL YOUR TESTS HERE
94- # At this point you have a juju bootstraped with my-charm
95- # deployed and active with the agent idle.
96- # ----------------- TESTS END HERE
97+ assess_TEMPLATE(bs_manager.client)
98+ return 0
99
100
101 if __name__ == '__main__':
102- main()
103+ sys.exit(main())
104
105=== added file 'template_test.py.tmpl'
106--- template_test.py.tmpl 1970-01-01 00:00:00 +0000
107+++ template_test.py.tmpl 2015-12-16 08:02:25 +0000
108@@ -0,0 +1,69 @@
109+"""Tests for assess_TEMPLATE module."""
110+
111+import logging
112+from mock import Mock, patch
113+import StringIO
114+
115+from assess_TEMPLATE import (
116+ assess_TEMPLATE,
117+ parse_args,
118+ main,
119+)
120+from tests import (
121+ parse_error,
122+ TestCase,
123+)
124+
125+
126+class TestParseArgs(TestCase):
127+
128+ def test_common_args(self):
129+ args = parse_args(["an-env", "/bin/juju", "/tmp/logs", "an-env-mod"])
130+ self.assertEqual("an-env", args.env)
131+ self.assertEqual("/bin/juju", args.juju_bin)
132+ self.assertEqual("/tmp/logs", args.logs)
133+ self.assertEqual("an-env-mod", args.temp_env_name)
134+ self.assertEqual(False, args.debug)
135+
136+ def test_help(self):
137+ fake_stdout = StringIO.StringIO()
138+ with parse_error(self) as fake_stderr:
139+ with patch("sys.stdout", fake_stdout):
140+ parse_args(["--help"])
141+ self.assertEqual("", fake_stderr.getvalue())
142+ self.assertNotIn("TODO", fake_stdout.getvalue())
143+
144+
145+class TestMain(TestCase):
146+
147+ def test_main(self):
148+ argv = ["an-env", "/bin/juju", "/tmp/logs", "an-env-mod", "--verbose"]
149+ env = object()
150+ client = Mock(spec=["is_jes_enabled"])
151+ with patch("assess_TEMPLATE.configure_logging",
152+ autospec=True) as mock_cl:
153+ with patch("assess_TEMPLATE.BootstrapManager.booted_context",
154+ autospec=True) as mock_bc:
155+ with patch("jujupy.SimpleEnvironment.from_config",
156+ return_value=env) as mock_e:
157+ with patch("jujupy.EnvJujuClient.by_version",
158+ return_value=client) as mock_c:
159+ with patch("assess_TEMPLATE.assess_TEMPLATE",
160+ autospec=True) as mock_assess:
161+ main(argv)
162+ mock_cl.assert_called_once_with(logging.DEBUG)
163+ mock_e.assert_called_once_with("an-env")
164+ mock_c.assert_called_once_with(env, "/bin/juju", debug=False)
165+ self.assertEqual(mock_bc.call_count, 1)
166+ mock_assess.assert_called_once_with(client)
167+
168+
169+class TestAssess(TestCase):
170+
171+ def test_TEMPLATE(self):
172+ mock_client = Mock(spec=["juju", "wait_for_started"])
173+ assess_TEMPLATE(mock_client)
174+ mock_client.juju.assert_called_once_with(
175+ 'deploy', ('local:trusty/my-charm',))
176+ mock_client.wait_for_started.assert_called_once_with()
177+ self.assertNotIn("TODO", self.log_stream.getvalue())
178
179=== modified file 'tests/test_deploy_stack.py'
180--- tests/test_deploy_stack.py 2015-12-15 17:03:17 +0000
181+++ tests/test_deploy_stack.py 2015-12-16 08:02:25 +0000
182@@ -251,8 +251,7 @@
183 self.assertEqual(
184 ['machine-2'],
185 sorted(os.listdir(artifacts_dir)))
186- self.assertEqual(
187- (client, {'0': '10.10.0.1'}), gm_mock.call_args[0])
188+ self.assertEqual((client, {'0': '10.10.0.1'}), gm_mock.call_args[0])
189 self.assertEqual(
190 [(self.r2, '%s/machine-2' % artifacts_dir)],
191 [cal[0] for cal in crl_mock.call_args_list])
192@@ -1105,8 +1104,8 @@
193 else:
194 runtime_config = os.path.join(client.env.juju_home, 'environments',
195 'bar.jenv')
196- dl_mock.assert_called_once_with(
197- client, log_dir, runtime_config, {'0': 'foo'})
198+ dl_mock.assert_called_once_with(client, log_dir, runtime_config,
199+ {'0': 'foo'})
200 if keep_env:
201 tear_down_count = 1
202 else:

Subscribers

People subscribed via source and target branches