1
1
from argparse import Namespace
7
7
from assess_jes_deploy import (
11
make_hosted_env_client,
13
13
from jujupy import (
15
16
JUJU_DEV_FEATURE_FLAGS,
19
from tests.test_jujupy import fake_juju_client
22
class TestJES(tests.FakeHomeTestCase):
21
class TestJES(unittest.TestCase):
24
23
client_class = EnvJujuClient25
26
25
@patch('assess_jes_deploy.get_random_string', autospec=True)
27
@patch('jujupy.SimpleEnvironment.from_config')
26
@patch('assess_jes_deploy.SimpleEnvironment.from_config')
28
27
def mock_client(self, from_config_func, get_random_string_func):
29
28
from_config_func.return_value = SimpleEnvironment('baz', {})
30
29
get_random_string_func.return_value = 'fakeran'
31
30
client = self.client_class(
32
31
SimpleEnvironment.from_config('baz'),
33
32
'1.25-foobar', 'path')
34
client.enable_feature('jes')
33
client._use_jes = True
37
36
@patch('assess_jes_deploy.get_random_string', autospec=True)
65
64
check_token_func.assert_called_once_with(client, 'tokenfakeran')
66
65
print_now_func.assert_called_once_with('checking services in token')
68
@patch('jujupy.EnvJujuClient.get_full_path')
69
@patch('jujupy.EnvJujuClient.add_ssh_machines', autospec=True)
67
@patch('assess_jes_deploy.EnvJujuClient.get_full_path')
68
@patch('assess_jes_deploy.EnvJujuClient.add_ssh_machines', autospec=True)
70
69
@patch('assess_jes_deploy.boot_context', autospec=True)
71
70
@patch('assess_jes_deploy.configure_logging', autospec=True)
72
@patch('assess_jes_deploy.client_from_config')
71
@patch('assess_jes_deploy.SimpleEnvironment.from_config')
72
@patch('assess_jes_deploy.EnvJujuClient.by_version')
73
73
def test_jes_setup(
76
77
configure_logging_func,
78
79
add_ssh_machines_func,
79
80
get_full_path_func):
80
81
# patch helper funcs
81
82
expected_client = self.mock_client()
83
expected_env = SimpleEnvironment('baz', {})
84
from_config_func.return_value = expected_env
82
85
by_version_func.return_value = expected_client
83
86
configure_logging_func.return_value = None
84
87
get_full_path_func.return_value = '/path/to/juju'
94
97
with patch.object(expected_client, 'enable_jes'):
95
98
with patch.object(expected_client, 'is_jes_enabled',
96
99
return_value=True):
97
with jes_setup(setup_args) as (client, charm_series, base_env):
100
with jes_setup(setup_args) as (client, charm_previx, base_env):
98
101
self.assertEqual(1, client.is_jes_enabled.call_count)
99
102
self.assertEqual(0, client.enable_jes.call_count)
101
104
# assert that jes_setup provides expected values
102
105
self.assertIs(client, expected_client)
103
self.assertEqual(charm_series, 'trusty')
106
self.assertEqual(charm_previx, 'local:trusty/')
104
107
self.assertEqual(base_env, 'baz')
106
109
# assert that helper funcs were called with expected args.
107
110
by_version_func.assert_called_once_with(
108
'baz', '/path/to/bin/juju', True)
111
expected_env, '/path/to/bin/juju', True)
110
113
configure_logging_func.assert_called_once_with(True)
111
114
boot_context_func.assert_called_once_with(
112
115
'jesjob', expected_client, 'localhost', ['0'], 'trusty',
113
'some_url', 'devel', 'log/dir', True, upload_tools=False,
116
'some_url', 'devel', 'log/dir', True, False, permanent=True,
114
117
region='region-foo')
119
add_ssh_machines_func.assert_called_once_with(client, ['0'])
116
121
# Setup jes with a client that requires a call to enable_jes.
117
122
with patch.object(expected_client, 'enable_jes'):
118
123
with patch.object(expected_client, 'is_jes_enabled',
121
126
self.assertEqual(1, client.is_jes_enabled.call_count)
122
127
self.assertEqual(1, client.enable_jes.call_count)
125
class TestHostedEnvironment(tests.FakeHomeTestCase):
127
def test_hosted_environment(self):
128
hosting_client = fake_juju_client()
129
log_dir = os.path.join(self.home_dir, 'logs')
131
with hosted_environment(hosting_client, log_dir, 'bar') as client:
132
models = client._backend.controller_state.models
133
model_state = models[client.model_name]
134
self.assertEqual({'name-bar': model_state},
135
hosting_client._backend.controller_state.models)
136
self.assertEqual('created', model_state.state)
137
self.assertEqual('model-destroyed', model_state.state)
138
self.assertTrue(os.path.isdir(os.path.join(log_dir, 'bar')))
140
def test_gathers_machine_logs(self):
141
hosting_client = fake_juju_client()
142
log_dir = os.path.join(self.home_dir, 'logs')
144
with patch("deploy_stack.copy_remote_logs", autospec=True) as mock_crl:
145
with hosted_environment(hosting_client, log_dir, 'bar') as client:
146
client.juju("deploy", ["cs:a-application"])
147
status = client.get_status()
148
unit_machine = status.get_unit("a-application/0")["machine"]
149
addr = status.status["machines"][unit_machine]["dns-name"]
150
hosted_dir = os.path.join(log_dir, "bar")
151
machine_dir = os.path.join(hosted_dir, "machine-0")
152
self.assertTrue(os.path.isdir(hosted_dir))
153
self.assertTrue(os.path.isdir(machine_dir))
154
self.assertEqual(mock_crl.call_count, 1)
155
self.assertEqual(mock_crl.call_args[0][0].address, addr)
156
self.assertEqual(mock_crl.call_args[0][1], machine_dir)
129
@patch('assess_jes_deploy.EnvJujuClient.by_version')
130
def test_make_hosted_env_client(
134
by_version_func.return_value = client
136
env = SimpleEnvironment('env', {'type': 'any'})
137
old_client = EnvJujuClient(env, None, '/a/path')
138
make_hosted_env_client(old_client, 'test')
140
self.assertEqual(by_version_func.call_count, 1)
141
call_args = by_version_func.call_args[0]
142
self.assertIsInstance(call_args[0], SimpleEnvironment)
143
self.assertEqual(call_args[0].environment, 'env-test')
144
self.assertEqual(call_args[0].config, {'type': 'any'})
145
self.assertEqual(call_args[1:], ('/a/path', False))
147
client.enable_jes.assert_called_once_with()