1
# Copyright 2013 Canonical Ltd. This software is licensed under the
2
# GNU Affero General Public License version 3 (see the file LICENSE).
4
"""Test the utilities of the per-tenant file storage work."""
6
from __future__ import (
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,
21
from maasserver.testing.factory import factory
22
from maasserver.testing.testcase import TestCase
23
from maastesting.utils import sample_binary_data
26
def make_provider_state_file(node=None):
27
"""Create a 'provider-state' file with a reference (zookeeper-instances)
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)
39
class TestExtractBootstrapNodeSystemId(TestCase):
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)
48
def test_returns_None_if_parsing_fails(self):
51
sample_binary_data, # binary content (invalid yaml)
52
'invalid content', # invalid provider-state content
53
'zookeeper-instances: []', # no instances listed
55
for invalid_content in invalid_contents:
57
extract_bootstrap_node_system_id(invalid_content))
60
class TestGetBootstrapNodeOwner(TestCase):
62
def test_returns_None_if_no_provider_state_file(self):
63
self.assertIsNone(get_bootstrap_node_owner())
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())
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)
74
self.assertIsNone(get_bootstrap_node_owner())
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())