1
from cloudinit import helpers
2
from cloudinit.sources import DataSourceNoCloud
3
from cloudinit import util
4
from tests.unittests.helpers import populate_dir
6
from mocker import MockerTestCase
11
class TestNoCloudDataSource(MockerTestCase):
14
self.tmp = self.makeDir()
15
self.paths = helpers.Paths({'cloud_dir': self.tmp})
17
self.cmdline = "root=TESTCMDLINE"
20
self.apply_patches([(util, 'get_cmdline', self._getcmdline)])
21
super(TestNoCloudDataSource, self).setUp()
24
apply_patches([i for i in reversed(self.unapply)])
25
super(TestNoCloudDataSource, self).setUp()
27
def apply_patches(self, patches):
28
ret = apply_patches(patches)
31
def _getcmdline(self):
34
def test_nocloud_seed_dir(self):
35
md = {'instance-id': 'IID', 'dsmode': 'local'}
37
populate_dir(os.path.join(self.paths.seed_dir, "nocloud"),
38
{'user-data': ud, 'meta-data': yaml.safe_dump(md)})
41
'datasource': {'NoCloud': {'fs_label': None}}
44
ds = DataSourceNoCloud.DataSourceNoCloud
46
dsrc = ds(sys_cfg=sys_cfg, distro=None, paths=self.paths)
48
self.assertEqual(dsrc.userdata_raw, ud)
49
self.assertEqual(dsrc.metadata, md)
52
def test_fs_label(self):
53
#find_devs_with should not be called ff fs_label is None
54
ds = DataSourceNoCloud.DataSourceNoCloud
56
class PsuedoException(Exception):
59
def my_find_devs_with(*args, **kwargs):
63
self.apply_patches([(util, 'find_devs_with', my_find_devs_with)])
65
# by default, NoCloud should search for filesystems by label
66
sys_cfg = {'datasource': {'NoCloud': {}}}
67
dsrc = ds(sys_cfg=sys_cfg, distro=None, paths=self.paths)
68
self.assertRaises(PsuedoException, dsrc.get_data)
70
# but disabling searching should just end up with None found
71
sys_cfg = {'datasource': {'NoCloud': {'fs_label': None}}}
72
dsrc = ds(sys_cfg=sys_cfg, distro=None, paths=self.paths)
76
def test_no_datasource_expected(self):
77
#no source should be found if no cmdline, config, and fs_label=None
78
sys_cfg = {'datasource': {'NoCloud': {'fs_label': None}}}
80
ds = DataSourceNoCloud.DataSourceNoCloud
81
dsrc = ds(sys_cfg=sys_cfg, distro=None, paths=self.paths)
82
self.assertFalse(dsrc.get_data())
84
def test_seed_in_config(self):
85
ds = DataSourceNoCloud.DataSourceNoCloud
89
'meta-data': {'instance-id': 'IID'},
90
'user-data': "USER_DATA_RAW",
93
sys_cfg = {'datasource': {'NoCloud': data}}
94
dsrc = ds(sys_cfg=sys_cfg, distro=None, paths=self.paths)
96
self.assertEqual(dsrc.userdata_raw, "USER_DATA_RAW")
97
self.assertEqual(dsrc.metadata.get('instance-id'), 'IID')
101
class TestParseCommandLineData(MockerTestCase):
103
def test_parse_cmdline_data_valid(self):
106
("root=/dev/sda1 %(ds_id)s", {}),
107
("%(ds_id)s; root=/dev/foo", {}),
110
("%(ds_id)s;s=SEED", {'seedfrom': 'SEED'}),
111
("%(ds_id)s;seedfrom=SEED;local-hostname=xhost",
112
{'seedfrom': 'SEED', 'local-hostname': 'xhost'}),
113
("%(ds_id)s;h=xhost",
114
{'local-hostname': 'xhost'}),
115
("%(ds_id)s;h=xhost;i=IID",
116
{'local-hostname': 'xhost', 'instance-id': 'IID'}),
119
for (fmt, expected) in pairs:
121
cmdline = fmt % {'ds_id': ds_id}
122
ret = DataSourceNoCloud.parse_cmdline_data(ds_id=ds_id, fill=fill,
124
self.assertEqual(expected, fill)
127
def test_parse_cmdline_data_none(self):
131
"console=/dev/ttyS0 root=/dev/foo",
138
for cmdline in cmdlines:
140
ret = DataSourceNoCloud.parse_cmdline_data(ds_id=ds_id, fill=fill,
142
self.assertEqual(fill, {})
143
self.assertFalse(ret)
146
def apply_patches(patches):
148
for (ref, name, replace) in patches:
151
orig = getattr(ref, name)
152
setattr(ref, name, replace)
153
ret.append((ref, name, orig))