1
from tempfile import mkdtemp
2
from shutil import rmtree
4
from StringIO import StringIO
6
from cloudinit.DataSourceMaaS import (
12
from mocker import MockerTestCase
15
class TestMaasDataSource(MockerTestCase):
18
super(TestMaasDataSource, self).setUp()
19
# Make a temp directoy for tests to use.
20
self.tmp = mkdtemp(prefix="unittest_")
23
super(TestMaasDataSource, self).tearDown()
24
# Clean up temp directory
27
def test_seed_dir_valid(self):
28
"""Verify a valid seeddir is read as such"""
30
data = {'instance-id': 'i-valid01',
31
'local-hostname': 'valid01-hostname',
32
'user-data': 'valid01-userdata'}
34
my_d = os.path.join(self.tmp, "valid")
35
populate_dir(my_d, data)
37
(userdata, metadata) = read_maas_seed_dir(my_d)
39
self.assertEqual(userdata, data['user-data'])
40
for key in ('instance-id', 'local-hostname'):
41
self.assertEqual(data[key], metadata[key])
43
# verify that 'userdata' is not returned as part of the metadata
44
self.assertFalse(('user-data' in metadata))
46
def test_seed_dir_valid_extra(self):
47
"""Verify extra files do not affect seed_dir validity """
49
data = {'instance-id': 'i-valid-extra',
50
'local-hostname': 'valid-extra-hostname',
51
'user-data': 'valid-extra-userdata', 'foo': 'bar'}
53
my_d = os.path.join(self.tmp, "valid_extra")
54
populate_dir(my_d, data)
56
(userdata, metadata) = read_maas_seed_dir(my_d)
58
self.assertEqual(userdata, data['user-data'])
59
for key in ('instance-id', 'local-hostname'):
60
self.assertEqual(data[key], metadata[key])
62
# additional files should not just appear as keys in metadata atm
63
self.assertFalse(('foo' in metadata))
65
def test_seed_dir_invalid(self):
66
"""Verify that invalid seed_dir raises MaasSeedDirMalformed"""
68
valid = {'instance-id': 'i-instanceid',
69
'local-hostname': 'test-hostname', 'user-data': ''}
71
my_based = os.path.join(self.tmp, "valid_extra")
73
# missing 'userdata' file
74
my_d = "%s-01" % my_based
75
invalid_data = copy(valid)
76
del invalid_data['local-hostname']
77
populate_dir(my_d, invalid_data)
78
self.assertRaises(MaasSeedDirMalformed, read_maas_seed_dir, my_d)
80
# missing 'instance-id'
81
my_d = "%s-02" % my_based
82
invalid_data = copy(valid)
83
del invalid_data['instance-id']
84
populate_dir(my_d, invalid_data)
85
self.assertRaises(MaasSeedDirMalformed, read_maas_seed_dir, my_d)
87
def test_seed_dir_none(self):
88
"""Verify that empty seed_dir raises MaasSeedDirNone"""
90
my_d = os.path.join(self.tmp, "valid_empty")
91
self.assertRaises(MaasSeedDirNone, read_maas_seed_dir, my_d)
93
def test_seed_dir_missing(self):
94
"""Verify that missing seed_dir raises MaasSeedDirNone"""
95
self.assertRaises(MaasSeedDirNone, read_maas_seed_dir,
96
os.path.join(self.tmp, "nonexistantdirectory"))
98
def test_seed_url_valid(self):
99
"""Verify that valid seed_url is read as such"""
100
valid = {'meta-data/instance-id': 'i-instanceid',
101
'meta-data/local-hostname': 'test-hostname',
102
'user-data': 'foodata'}
104
my_seed = "http://example.com/xmeta"
105
my_ver = "1999-99-99"
106
my_headers = {'header1': 'value1', 'header2': 'value2'}
108
def my_headers_cb(url):
111
mock_request = self.mocker.replace("urllib2.Request",
113
mock_urlopen = self.mocker.replace("urllib2.urlopen",
116
for (key, val) in valid.iteritems():
117
mock_request("%s/%s/%s" % (my_seed, my_ver, key),
118
data=None, headers=my_headers)
120
self.mocker.result("fake-request-%s" % key)
121
mock_urlopen("fake-request-%s" % key, timeout=None)
122
self.mocker.result(StringIO(val))
126
(userdata, metadata) = read_maas_seed_url(my_seed,
127
header_cb=my_headers_cb, version=my_ver)
129
self.assertEqual("foodata", userdata)
130
self.assertEqual(metadata['instance-id'],
131
valid['meta-data/instance-id'])
132
self.assertEqual(metadata['local-hostname'],
133
valid['meta-data/local-hostname'])
135
def test_seed_url_invalid(self):
136
"""Verify that invalid seed_url raises MaasSeedDirMalformed"""
139
def test_seed_url_missing(self):
140
"""Verify seed_url with no found entries raises MaasSeedDirNone"""
144
def populate_dir(seed_dir, files):
146
for (name, content) in files.iteritems():
147
with open(os.path.join(seed_dir, name), "w") as fp: