~andreserl/maas/fix_virsh_template

« back to all changes in this revision

Viewing changes to src/maasserver/support/pertenant/tests/test_utils.py

[r=julian-edwards][bug=][author=rvb] Add utility to extract the owner of the bootstrap node.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# Copyright 2013 Canonical Ltd.  This software is licensed under the
 
2
# GNU Affero General Public License version 3 (see the file LICENSE).
 
3
 
 
4
"""Test the utilities of the per-tenant file storage work."""
 
5
 
 
6
from __future__ import (
 
7
    absolute_import,
 
8
    print_function,
 
9
    unicode_literals,
 
10
    )
 
11
 
 
12
__metaclass__ = type
 
13
__all__ = []
 
14
 
 
15
from django.core.urlresolvers import reverse
 
16
from maasserver.support.pertenant.utils import (
 
17
    extract_bootstrap_node_system_id,
 
18
    get_bootstrap_node_owner,
 
19
    PROVIDER_STATE_FILENAME,
 
20
    )
 
21
from maasserver.testing.factory import factory
 
22
from maasserver.testing.testcase import TestCase
 
23
from maastesting.utils import sample_binary_data
 
24
 
 
25
 
 
26
def make_provider_state_file(node=None):
 
27
    """Create a 'provider-state' file with a reference (zookeeper-instances)
 
28
    to a node.
 
29
    """
 
30
    if node is None:
 
31
        node = factory.make_node()
 
32
    node_link = reverse('node_handler', args=[node.system_id])
 
33
    content = 'zookeeper-instances: [%s]\n' % node_link
 
34
    content_data = content.encode('ascii')
 
35
    return factory.make_file_storage(
 
36
        filename=PROVIDER_STATE_FILENAME, content=content_data, owner=None)
 
37
 
 
38
 
 
39
class TestExtractBootstrapNodeSystemId(TestCase):
 
40
 
 
41
    def test_parses_valid_provider_state_file(self):
 
42
        node = factory.make_node()
 
43
        provider_state_file = make_provider_state_file(node=node)
 
44
        system_id = extract_bootstrap_node_system_id(
 
45
            provider_state_file.content)
 
46
        self.assertEqual(system_id, node.system_id)
 
47
 
 
48
    def test_returns_None_if_parsing_fails(self):
 
49
        invalid_contents = [
 
50
            '%',  # invalid yaml
 
51
            sample_binary_data,  # binary content (invalid yaml)
 
52
            'invalid content',  # invalid provider-state content
 
53
            'zookeeper-instances: []',  # no instances listed
 
54
        ]
 
55
        for invalid_content in invalid_contents:
 
56
            self.assertIsNone(
 
57
                extract_bootstrap_node_system_id(invalid_content))
 
58
 
 
59
 
 
60
class TestGetBootstrapNodeOwner(TestCase):
 
61
 
 
62
    def test_returns_None_if_no_provider_state_file(self):
 
63
        self.assertIsNone(get_bootstrap_node_owner())
 
64
 
 
65
    def test_returns_owner_if_node_found(self):
 
66
        node = factory.make_node(owner=factory.make_user())
 
67
        make_provider_state_file(node=node)
 
68
        self.assertEqual(node.owner, get_bootstrap_node_owner())
 
69
 
 
70
    def test_returns_None_if_node_does_not_exist(self):
 
71
        node = factory.make_node(owner=factory.make_user())
 
72
        make_provider_state_file(node=node)
 
73
        node.delete()
 
74
        self.assertIsNone(get_bootstrap_node_owner())
 
75
 
 
76
    def test_returns_None_if_invalid_yaml(self):
 
77
        invalid_content = '%'.encode('ascii')
 
78
        factory.make_file_storage(
 
79
            filename=PROVIDER_STATE_FILENAME, content=invalid_content)
 
80
        self.assertIsNone(get_bootstrap_node_owner())