1
from argparse import Namespace
2
from contextlib import contextmanager
6
from assess_bootstrap import (
12
prepare_temp_metadata,
14
from deploy_stack import (
17
from fakejuju import (
21
_temp_env as temp_env,
32
class TestParseArgs(TestCase):
34
def test_parse_args(self):
35
with temp_dir() as log_dir:
36
args = parse_args(['base', 'foo', 'bar', log_dir, 'baz'])
39
agent_stream=None, agent_url=None, bootstrap_host=None,
40
deadline=None, debug=False, env='foo', juju_bin='bar',
41
keep_env=False, local_metadata_source=None, logs=log_dir,
42
machine=[], part='base', region=None, series=None,
43
temp_env_name='baz', upload_tools=False, verbose=20),
46
def test_parse_args_debug(self):
47
args = parse_args(['base', 'foo', 'bar', '--debug'])
48
self.assertEqual(args.debug, True)
50
def test_parse_args_region(self):
51
args = parse_args(['base', 'foo', 'bar', '--region', 'foo'])
52
self.assertEqual(args.region, 'foo')
54
def test_parse_args_temp_env_name(self):
55
args = parse_args(['base', 'fee', 'fi', 'foe', 'fum'])
56
self.assertEqual(args.temp_env_name, 'fum')
58
def test_parse_args_local_metadata_source(self):
59
args = parse_args(['base', 'foo', 'bar',
60
'--local-metadata-source', 'qux'])
61
self.assertEqual(args.local_metadata_source, 'qux')
63
def test_parse_args_part(self):
64
args = parse_args(['metadata'])
65
self.assertEqual(args.part, 'metadata')
68
class TestPrepareMetadata(TestCase):
70
def test_prepare_metadata(self):
71
client = fake_juju_client()
72
with patch.object(client, 'sync_tools') as sync_mock:
73
with temp_dir() as metadata_dir:
74
prepare_metadata(client, metadata_dir)
75
sync_mock.assert_called_once_with(metadata_dir)
77
def test_prepare_temp_metadata(self):
78
client = fake_juju_client()
79
with patch('assess_bootstrap.prepare_metadata',
80
autospec=True) as prepare_mock:
81
with prepare_temp_metadata(client) as metadata_dir:
83
prepare_mock.assert_called_once_with(client, metadata_dir)
85
def test_prepare_temp_metadata_source(self):
86
client = fake_juju_client()
87
with patch('assess_bootstrap.prepare_metadata',
88
autospec=True) as prepare_mock:
89
with temp_dir() as source_dir:
90
with prepare_temp_metadata(
91
client, source_dir) as metadata_dir:
93
self.assertEqual(source_dir, metadata_dir)
94
self.assertEqual(0, prepare_mock.call_count)
98
def assess_bootstrap_cxt(juju_version=None):
99
"""Mock helper functions used in the bootstrap process.
101
Use the bar environment."""
102
if juju_version is None:
103
juju_version = '1.25.5'
104
call_cxt = patch('subprocess.call')
105
cc_cxt = patch('subprocess.check_call')
106
gv_cxt = patch('jujupy.EnvJujuClient.get_version',
107
side_effect=lambda cls: juju_version)
108
gjo_cxt = patch('jujupy.EnvJujuClient.get_juju_output', autospec=True,
110
imc_cxt = patch('jujupy.EnvJujuClient.iter_model_clients',
111
autospec=True, return_value=[])
112
env_cxt = temp_env({'environments': {'bar': {'type': 'foo'}}})
113
with call_cxt, cc_cxt, gv_cxt, gjo_cxt, env_cxt, imc_cxt:
118
def extended_bootstrap_cxt(juju_version=None):
119
"""Extention to assess_bootstrap_cxt if you are using runtime_context."""
120
with assess_bootstrap_cxt(juju_version):
121
gmdn_cxt = patch('deploy_stack.get_machine_dns_name')
122
delkh_cxt = patch('deploy_stack.dump_env_logs_known_hosts')
123
with gmdn_cxt, delkh_cxt:
127
class TestAssessBootstrap(FakeHomeTestCase):
130
def sub_assess_mocks(self):
131
"""Mock all of the sub assess functions."""
132
base_patch = patch('assess_bootstrap.assess_base_bootstrap',
134
metadata_patch = patch('assess_bootstrap.assess_metadata',
136
with base_patch as base_mock, metadata_patch as metadata_mock:
137
yield (base_mock, metadata_mock)
139
def test_assess_bootstrap_part_base(self):
140
args = parse_args(['base', 'bar'])
141
with assess_bootstrap_cxt():
142
with self.sub_assess_mocks() as (base_mock, metadata_mock):
143
assess_bootstrap(args)
144
self.assertEqual(1, base_mock.call_count)
145
self.assertEqual(0, metadata_mock.call_count)
147
def test_assess_bootstrap_part_metadata(self):
148
args = parse_args(['metadata', 'bar'])
149
with assess_bootstrap_cxt():
150
with self.sub_assess_mocks() as (base_mock, metadata_mock):
151
assess_bootstrap(args)
152
self.assertEqual(0, base_mock.call_count)
153
self.assertEqual(1, metadata_mock.call_count)
156
class TestAssessBaseBootstrap(FakeHomeTestCase):
158
def test_assess_base_bootstrap_defaults(self):
160
self.assertEqual(myself.env.config,
161
{'name': 'bar', 'type': 'foo'})
162
with extended_bootstrap_cxt():
163
with patch('jujupy.EnvJujuClient.bootstrap', side_effect=check,
165
assess_bootstrap(parse_args(['base', 'bar', '/foo']))
166
self.assertRegexpMatches(
167
self.log_stream.getvalue(),
168
r"(?m)^INFO Environment successfully bootstrapped.$")
170
def test_assess_base_bootstrap_region_temp_env(self):
174
'name': 'qux', 'type': 'foo', 'region': 'baz'})
175
self.assertEqual(myself.env.environment, 'qux')
176
with extended_bootstrap_cxt():
177
with patch('jujupy.EnvJujuClient.bootstrap', side_effect=check,
179
args = parse_args(['base', 'bar', '/foo'])
181
args.temp_env_name = 'qux'
182
assess_bootstrap(args)
183
self.assertRegexpMatches(
184
self.log_stream.getvalue(),
185
r"(?m)^INFO Environment successfully bootstrapped.$")
188
class TestAssessMetadata(FakeHomeTestCase):
190
target_dict = {'name': 'qux', 'type': 'foo',
191
'agent-metadata-url': INVALID_URL}
193
def get_url(self, bs_manager):
194
"""Wrap up the agent-metadata-url as model-config data."""
195
url = bs_manager.client.env.config['agent-metadata-url']
196
return {'agent-metadata-url': {'value': url}}
198
def test_assess_metadata(self):
199
def check(myself, metadata_source=None):
200
self.assertEqual(self.target_dict, myself.env.config)
201
self.assertIsNotNone(metadata_source)
202
with extended_bootstrap_cxt('2.0-rc1'):
203
with patch('jujupy.EnvJujuClient.bootstrap', side_effect=check,
205
args = parse_args(['metadata', 'bar', '/foo'])
206
args.temp_env_name = 'qux'
207
bs_manager = BootstrapManager.from_args(args)
209
bs_manager.client, 'get_model_config',
210
side_effect=lambda: self.get_url(bs_manager)):
211
assess_metadata(bs_manager, None)
213
def test_assess_metadata_local_source(self):
214
def check(myself, metadata_source=None):
215
self.assertEqual(self.target_dict, myself.env.config)
216
self.assertEqual('agents', metadata_source)
217
with extended_bootstrap_cxt('2.0-rc1'):
218
with patch('jujupy.EnvJujuClient.bootstrap', side_effect=check,
220
args = parse_args(['metadata', 'bar', '/foo'])
221
args.temp_env_name = 'qux'
222
bs_manager = BootstrapManager.from_args(args)
224
bs_manager.client, 'get_model_config',
225
side_effect=lambda: self.get_url(bs_manager)):
226
assess_metadata(bs_manager, 'agents')