~andrewjbeach/juju-ci-tools/make-local-patcher

« back to all changes in this revision

Viewing changes to tests/test_assess_bootstrap.py

  • Committer: Aaron Bentley
  • Date: 2016-07-08 14:26:06 UTC
  • mfrom: (1465.1.14 client-from-config-5)
  • mto: This revision was merged to the branch mainline in revision 1509.
  • Revision ID: aaron.bentley@canonical.com-20160708142606-4x5rpd5c9jw9bn6n
Merged client-from-config-5 into client-from-config.

Show diffs side-by-side

added added

removed removed

Lines of Context:
5
5
 
6
6
from assess_bootstrap import (
7
7
    assess_bootstrap,
8
 
    assess_metadata,
9
 
    INVALID_URL,
10
8
    parse_args,
11
 
    prepare_metadata,
12
 
    prepare_temp_metadata,
13
 
    )
14
 
from deploy_stack import (
15
 
    BootstrapManager,
16
 
    )
17
 
from fakejuju import (
18
 
    fake_juju_client,
19
9
    )
20
10
from jujupy import (
21
11
    _temp_env as temp_env,
23
13
from tests import (
24
14
    FakeHomeTestCase,
25
15
    TestCase,
26
 
    )
27
 
from utility import (
28
 
    temp_dir,
29
 
    )
 
16
)
30
17
 
31
18
 
32
19
class TestParseArgs(TestCase):
33
20
 
34
21
    def test_parse_args(self):
35
 
        with temp_dir() as log_dir:
36
 
            args = parse_args(['base', 'foo', 'bar', log_dir, 'baz'])
37
 
            self.assertEqual(
38
 
                Namespace(
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),
44
 
                args)
 
22
        args = parse_args(['foo', 'bar'])
 
23
        self.assertEqual(args, Namespace(
 
24
            juju='foo', env='bar', debug=False, region=None,
 
25
            temp_env_name=None))
45
26
 
46
27
    def test_parse_args_debug(self):
47
 
        args = parse_args(['base', 'foo', 'bar', '--debug'])
 
28
        args = parse_args(['foo', 'bar', '--debug'])
48
29
        self.assertEqual(args.debug, True)
49
30
 
50
31
    def test_parse_args_region(self):
51
 
        args = parse_args(['base', 'foo', 'bar', '--region', 'foo'])
 
32
        args = parse_args(['foo', 'bar', '--region', 'foo'])
52
33
        self.assertEqual(args.region, 'foo')
53
34
 
54
35
    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')
57
 
 
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')
62
 
 
63
 
    def test_parse_args_part(self):
64
 
        args = parse_args(['metadata'])
65
 
        self.assertEqual(args.part, 'metadata')
66
 
 
67
 
 
68
 
class TestPrepareMetadata(TestCase):
69
 
 
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)
76
 
 
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:
82
 
                pass
83
 
        prepare_mock.assert_called_once_with(client, metadata_dir)
84
 
 
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:
92
 
                    pass
93
 
        self.assertEqual(source_dir, metadata_dir)
94
 
        self.assertEqual(0, prepare_mock.call_count)
95
 
 
96
 
 
97
 
@contextmanager
98
 
def assess_bootstrap_cxt(juju_version=None):
99
 
    """Mock helper functions used in the bootstrap process.
100
 
 
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,
109
 
                    return_value='')
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:
114
 
        yield
115
 
 
116
 
 
117
 
@contextmanager
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:
124
 
            yield
 
36
        args = parse_args(['foo', 'bar', 'foo'])
 
37
        self.assertEqual(args.temp_env_name, 'foo')
125
38
 
126
39
 
127
40
class TestAssessBootstrap(FakeHomeTestCase):
128
41
 
129
42
    @contextmanager
130
 
    def sub_assess_mocks(self):
131
 
        """Mock all of the sub assess functions."""
132
 
        base_patch = patch('assess_bootstrap.assess_base_bootstrap',
133
 
                           autospec=True)
134
 
        metadata_patch = patch('assess_bootstrap.assess_metadata',
135
 
                               autospec=True)
136
 
        with base_patch as base_mock, metadata_patch as metadata_mock:
137
 
            yield (base_mock, metadata_mock)
138
 
 
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)
146
 
 
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)
154
 
 
155
 
 
156
 
class TestAssessBaseBootstrap(FakeHomeTestCase):
157
 
 
158
 
    def test_assess_base_bootstrap_defaults(self):
 
43
    def assess_boostrap_cxt(self):
 
44
        call_cxt = patch('subprocess.call')
 
45
        cc_cxt = patch('subprocess.check_call')
 
46
        gv_cxt = patch('jujupy.EnvJujuClient.get_version',
 
47
                       side_effect=lambda cls: '1.25.5')
 
48
        gjo_cxt = patch('jujupy.EnvJujuClient.get_juju_output', autospec=True,
 
49
                        return_value='')
 
50
        imc_cxt = patch('jujupy.EnvJujuClient.iter_model_clients',
 
51
                        autospec=True, return_value=[])
 
52
        env_cxt = temp_env({'environments': {'bar': {'type': 'foo'}}})
 
53
        with call_cxt, cc_cxt, gv_cxt, gjo_cxt, env_cxt, imc_cxt:
 
54
            yield
 
55
 
 
56
    def test_assess_bootstrap_defaults(self):
159
57
        def check(myself):
160
58
            self.assertEqual(myself.env.config,
161
59
                             {'name': 'bar', 'type': 'foo'})
162
 
        with extended_bootstrap_cxt():
 
60
        with self.assess_boostrap_cxt():
163
61
            with patch('jujupy.EnvJujuClient.bootstrap', side_effect=check,
164
62
                       autospec=True):
165
 
                assess_bootstrap(parse_args(['base', 'bar', '/foo']))
 
63
                with patch('deploy_stack.get_machine_dns_name'):
 
64
                    with patch('deploy_stack.dump_env_logs_known_hosts'):
 
65
                        assess_bootstrap('/foo', 'bar', False, None, None)
166
66
        self.assertRegexpMatches(
167
67
            self.log_stream.getvalue(),
168
68
            r"(?m)^INFO Environment successfully bootstrapped.$")
169
69
 
170
 
    def test_assess_base_bootstrap_region_temp_env(self):
 
70
    def test_assess_bootstrap_region_temp_env(self):
171
71
        def check(myself):
172
72
            self.assertEqual(
173
73
                myself.env.config, {
174
74
                    'name': 'qux', 'type': 'foo', 'region': 'baz'})
175
75
            self.assertEqual(myself.env.environment, 'qux')
176
 
        with extended_bootstrap_cxt():
 
76
        with self.assess_boostrap_cxt():
177
77
            with patch('jujupy.EnvJujuClient.bootstrap', side_effect=check,
178
78
                       autospec=True):
179
 
                args = parse_args(['base', 'bar', '/foo'])
180
 
                args.region = 'baz'
181
 
                args.temp_env_name = 'qux'
182
 
                assess_bootstrap(args)
 
79
                with patch('deploy_stack.get_machine_dns_name'):
 
80
                    with patch('deploy_stack.dump_env_logs_known_hosts'):
 
81
                        assess_bootstrap('/foo', 'bar', False, 'baz', 'qux')
183
82
        self.assertRegexpMatches(
184
83
            self.log_stream.getvalue(),
185
84
            r"(?m)^INFO Environment successfully bootstrapped.$")
186
 
 
187
 
 
188
 
class TestAssessMetadata(FakeHomeTestCase):
189
 
 
190
 
    target_dict = {'name': 'qux', 'type': 'foo',
191
 
                   'agent-metadata-url': INVALID_URL}
192
 
 
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}}
197
 
 
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,
204
 
                       autospec=True):
205
 
                args = parse_args(['metadata', 'bar', '/foo'])
206
 
                args.temp_env_name = 'qux'
207
 
                bs_manager = BootstrapManager.from_args(args)
208
 
                with patch.object(
209
 
                        bs_manager.client, 'get_model_config',
210
 
                        side_effect=lambda: self.get_url(bs_manager)):
211
 
                    assess_metadata(bs_manager, None)
212
 
 
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,
219
 
                       autospec=True):
220
 
                args = parse_args(['metadata', 'bar', '/foo'])
221
 
                args.temp_env_name = 'qux'
222
 
                bs_manager = BootstrapManager.from_args(args)
223
 
                with patch.object(
224
 
                        bs_manager.client, 'get_model_config',
225
 
                        side_effect=lambda: self.get_url(bs_manager)):
226
 
                    assess_metadata(bs_manager, 'agents')