~adam-collard/charms/trusty/landscape-client/trunk

« back to all changes in this revision

Viewing changes to hooks/test_hooks.py

  • Committer: Adam Collard
  • Date: 2013-11-19 12:39:44 UTC
  • mto: This revision was merged to the branch mainline in revision 33.
  • Revision ID: adam.collard@canonical.com-20131119123944-vqv3t6323n6tsbqb
Move logic for ceph-client-relation-changed into hooks.py
 * Make it testable
 * Test it
 * Bump revision

Show diffs side-by-side

added added

removed removed

Lines of Context:
7
7
 
8
8
from landscape.deployment import Configuration
9
9
from landscape.lib.fs import read_file
10
 
from hooks import migrate_old_juju_info, HOOKS
11
 
from common import JujuBroker, LandscapeBroker
12
 
 
13
 
 
14
 
class FakeJujuBroker(JujuBroker):
 
10
import hooks
 
11
import common
 
12
 
 
13
 
 
14
class FakeJujuBroker(common.JujuBroker):
15
15
    """A JujuBroker that can be used in unit tests.
16
16
 
17
17
    Instead of executing commands, it returns the output from
23
23
        self.environment = {
24
24
            "JUJU_ENV_UUID": str(uuid4()),
25
25
            "JUJU_API_ADRESSES": "juju.example.com:12345"}
 
26
        self.logs = []
 
27
 
 
28
    def log(self, message):
 
29
        self.logs.append(message)
26
30
 
27
31
    def _run_juju_tool(self, command):
28
32
        """Override _run_juju_tool not not execute any commands."""
29
33
        return self.commands[command]
30
34
 
31
35
 
32
 
class FakeLandscapeBroker(LandscapeBroker):
33
 
    """A LandscapeBroker taht can be use in unittests."""
 
36
class FakeLandscapeBroker(common.LandscapeBroker):
 
37
    """A LandscapeBroker that can be use in unittests."""
34
38
 
35
39
    def try_to_register(self):
36
40
        """Don't check system files or try to actually register the client."""
64
68
                     "juju-api-addresses": "10.0.3.1:17070",
65
69
                     "juju-private-address": "10.0.3.205"}
66
70
        self.setup_old_juju_info(juju_info)
67
 
        migrate_old_juju_info(self.config)
 
71
        hooks.migrate_old_juju_info(self.config)
68
72
        juju_info_path = os.path.join(self.config.data_path, "juju-info.json")
69
73
        self.assertTrue(os.path.exists(juju_info_path))
70
74
        with open(juju_info_path) as juju_info_fh:
85
89
                     "juju-api-addresses": "10.0.3.1:17070",
86
90
                     "juju-private-address": "10.0.3.205"}
87
91
        self.setup_old_juju_info(juju_info)
88
 
        migrate_old_juju_info(self.config)
 
92
        hooks.migrate_old_juju_info(self.config)
89
93
        self.assertEqual([], os.listdir(self.config.meta_data_path))
90
94
 
91
95
    def test_incomplete_juju_info_is_error(self):
97
101
                     "juju-api-addresses": "10.0.3.1:17070",
98
102
                     "juju-private-address": "10.0.3.205"}
99
103
        self.setup_old_juju_info(juju_info)
100
 
        self.assertNotEqual(0, migrate_old_juju_info(self.config))
 
104
        self.assertNotEqual(0, hooks.migrate_old_juju_info(self.config))
101
105
        self.assertGreater(len(os.listdir(self.config.meta_data_path)), 0)
102
106
 
103
107
    def test_idempotent(self):
110
114
                     "juju-api-addresses": "10.0.3.1:17070",
111
115
                     "juju-private-address": "10.0.3.205"}
112
116
        self.setup_old_juju_info(juju_info)
113
 
        migrate_old_juju_info(self.config)
114
 
        self.assertEqual(0, migrate_old_juju_info(self.config))
 
117
        hooks.migrate_old_juju_info(self.config)
 
118
        self.assertEqual(0, hooks.migrate_old_juju_info(self.config))
115
119
 
116
120
 
117
121
class ContainerRelationJoinedTest(TestCase):
128
132
        self.landscape_broker.config.write()
129
133
        self.juju_broker = FakeJujuBroker()
130
134
        self.juju_broker.environment["JUJU_REMOTE_UNIT"] = "remote/0"
131
 
        self.hook = HOOKS["container-relation-joined"]
 
135
        self.hook = hooks.HOOKS["container-relation-joined"]
132
136
 
133
137
    def test_writes_juju_json(self):
134
138
        """
171
175
        self.hook(self.juju_broker, self.landscape_broker)
172
176
 
173
177
        self.assertEqual([True], registration_attempts)
 
178
 
 
179
 
 
180
class CephClientRelationJoinedTest(TestCase):
 
181
    """Test for the ceph-client-relation-changed hook."""
 
182
 
 
183
    def setUp(self):
 
184
        data_path = mkdtemp(prefix=self.__class__.__name__)
 
185
        self.addCleanup(rmtree, data_path)
 
186
        self.landscape_broker = FakeLandscapeBroker()
 
187
        self.landscape_broker.config.data_path = data_path
 
188
        self.landscape_broker.config.config = os.path.join(
 
189
            data_path, "landscape.conf")
 
190
        # self.landscape_broker.config.account_name = "account1"
 
191
        self.landscape_broker.config.write()
 
192
        self.juju_broker = FakeJujuBroker()
 
193
        self.chowned_files = []
 
194
 
 
195
        def stub_chown(filepath):
 
196
            self.chowned_files.append(filepath)
 
197
        hooks.chown = stub_chown
 
198
        # self.juju_broker.environment["JUJU_REMOTE_UNIT"] = "remote/0"
 
199
        self.hook = hooks.HOOKS["ceph-client-relation-changed"]
 
200
 
 
201
    def test_nothing_to_do_with_no_key(self):
 
202
        """
 
203
        If there's no key in the relation information provided by ceph,
 
204
        log and do nothing.
 
205
        """
 
206
        self.assertEqual(0, self.hook(self.juju_broker, self.landscape_broker))
 
207
 
 
208
        [log] = self.juju_broker.logs
 
209
        self.assertEqual(
 
210
            "Ceph key not reported in relation config, nothing to do.", log)
 
211
 
 
212
    def test_ceph_client_path_made(self):
 
213
        """
 
214
        If the ceph client path doesn't exist already it's created and chowned.
 
215
        """
 
216
        self.juju_broker.commands["relation-get"] = {
 
217
            "key": "foo", "auth": "bar", "private-address": "home"}
 
218
 
 
219
        def stub_ceph_write(*args):
 
220
            pass
 
221
        hooks.write_ceph_client_keyring = stub_ceph_write
 
222
        hooks.write_ceph_client_config = stub_ceph_write
 
223
 
 
224
        self.assertEqual(0, self.hook(self.juju_broker, self.landscape_broker))
 
225
 
 
226
        ceph_client_dir = os.path.join(
 
227
            self.landscape_broker.config.data_path, "ceph-client")
 
228
        self.assertTrue(os.path.exists(ceph_client_dir))
 
229
        self.assertEqual([ceph_client_dir], self.chowned_files)
 
230
 
 
231
    def test_write_ceph_client_keyring_called(self):
 
232
        """
 
233
        write_ceph_client_keyring is called with the key from the Juju
 
234
        relation config.
 
235
        """
 
236
        self.juju_broker.commands["relation-get"] = {
 
237
            "key": "foo", "auth": "bar", "private-address": "home"}
 
238
 
 
239
        called_args = []
 
240
 
 
241
        def stub_write_ceph_client_keyring(*args):
 
242
            called_args.append(args)
 
243
 
 
244
        hooks.write_ceph_client_keyring = stub_write_ceph_client_keyring
 
245
 
 
246
        def stub_ceph_write(*args):
 
247
            pass
 
248
        hooks.write_ceph_client_config = stub_ceph_write
 
249
 
 
250
        self.assertEqual(0, self.hook(self.juju_broker, self.landscape_broker))
 
251
        [args] = called_args
 
252
        self.assertEqual(
 
253
            (self.landscape_broker, "landscape-client", "foo"), args)
 
254
 
 
255
    def test_write_ceph_client_config_called(self):
 
256
        """
 
257
        write_ceph_client_config is called with the auth and
 
258
        private-address from the Juju relation config.
 
259
        """
 
260
        self.juju_broker.commands["relation-get"] = {
 
261
            "key": "foo", "auth": "bar", "private-address": "home"}
 
262
 
 
263
        called_args = []
 
264
        keyring_file = object()
 
265
 
 
266
        def stub_ceph_write(*args):
 
267
            return keyring_file
 
268
 
 
269
        hooks.write_ceph_client_keyring = stub_ceph_write
 
270
 
 
271
        def stub_write_ceph_client_config(*args):
 
272
            called_args.append(args)
 
273
        hooks.write_ceph_client_config = stub_write_ceph_client_config
 
274
 
 
275
        self.assertEqual(0, self.hook(self.juju_broker, self.landscape_broker))
 
276
        [args] = called_args
 
277
        self.assertEqual(
 
278
            (self.landscape_broker, "bar", keyring_file, "home"), args)
 
279
 
 
280
    def test_confirmation_logged(self):
 
281
        self.juju_broker.commands["relation-get"] = {
 
282
            "key": "foo", "auth": "bar", "private-address": "home"}
 
283
 
 
284
        def stub_ceph_write(*args):
 
285
            pass
 
286
        hooks.write_ceph_client_keyring = stub_ceph_write
 
287
        hooks.write_ceph_client_config = stub_ceph_write
 
288
 
 
289
        self.assertEqual(0, self.hook(self.juju_broker, self.landscape_broker))
 
290
 
 
291
        [log] = self.juju_broker.logs
 
292
        self.assertEqual("Ceph configuration written to file.", log)