summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/unittests/test_cs_util.py65
-rw-r--r--tests/unittests/test_datasource/test_azure.py83
-rw-r--r--tests/unittests/test_datasource/test_cloudsigma.py59
3 files changed, 197 insertions, 10 deletions
diff --git a/tests/unittests/test_cs_util.py b/tests/unittests/test_cs_util.py
new file mode 100644
index 00000000..7d59222b
--- /dev/null
+++ b/tests/unittests/test_cs_util.py
@@ -0,0 +1,65 @@
+from mocker import MockerTestCase
+
+from cloudinit.cs_utils import Cepko
+
+
+SERVER_CONTEXT = {
+ "cpu": 1000,
+ "cpus_instead_of_cores": False,
+ "global_context": {"some_global_key": "some_global_val"},
+ "mem": 1073741824,
+ "meta": {"ssh_public_key": "ssh-rsa AAAAB3NzaC1yc2E.../hQ5D5 john@doe"},
+ "name": "test_server",
+ "requirements": [],
+ "smp": 1,
+ "tags": ["much server", "very performance"],
+ "uuid": "65b2fb23-8c03-4187-a3ba-8b7c919e889",
+ "vnc_password": "9e84d6cb49e46379"
+}
+
+
+class CepkoMock(Cepko):
+ def all(self):
+ return SERVER_CONTEXT
+
+ def get(self, key="", request_pattern=None):
+ return SERVER_CONTEXT['tags']
+
+
+class CepkoResultTests(MockerTestCase):
+ def setUp(self):
+ self.mocked = self.mocker.replace("cloudinit.cs_utils.Cepko",
+ spec=CepkoMock,
+ count=False,
+ passthrough=False)
+ self.mocked()
+ self.mocker.result(CepkoMock())
+ self.mocker.replay()
+ self.c = Cepko()
+
+ def test_getitem(self):
+ result = self.c.all()
+ self.assertEqual("65b2fb23-8c03-4187-a3ba-8b7c919e889", result['uuid'])
+ self.assertEqual([], result['requirements'])
+ self.assertEqual("much server", result['tags'][0])
+ self.assertEqual(1, result['smp'])
+
+ def test_len(self):
+ self.assertEqual(len(SERVER_CONTEXT), len(self.c.all()))
+
+ def test_contains(self):
+ result = self.c.all()
+ self.assertTrue('uuid' in result)
+ self.assertFalse('uid' in result)
+ self.assertTrue('meta' in result)
+ self.assertFalse('ssh_public_key' in result)
+
+ def test_iter(self):
+ self.assertEqual(sorted(SERVER_CONTEXT.keys()),
+ sorted([key for key in self.c.all()]))
+
+ def test_with_list_as_result(self):
+ result = self.c.get('tags')
+ self.assertEqual('much server', result[0])
+ self.assertTrue('very performance' in result)
+ self.assertEqual(2, len(result))
diff --git a/tests/unittests/test_datasource/test_azure.py b/tests/unittests/test_datasource/test_azure.py
index aad84206..44c537f4 100644
--- a/tests/unittests/test_datasource/test_azure.py
+++ b/tests/unittests/test_datasource/test_azure.py
@@ -1,4 +1,5 @@
from cloudinit import helpers
+from cloudinit.util import load_file
from cloudinit.sources import DataSourceAzure
from tests.unittests.helpers import populate_dir
@@ -6,6 +7,7 @@ import base64
import crypt
from mocker import MockerTestCase
import os
+import stat
import yaml
@@ -72,6 +74,7 @@ class TestAzureDataSource(MockerTestCase):
# patch cloud_dir, so our 'seed_dir' is guaranteed empty
self.paths = helpers.Paths({'cloud_dir': self.tmp})
+ self.waagent_d = os.path.join(self.tmp, 'var', 'lib', 'waagent')
self.unapply = []
super(TestAzureDataSource, self).setUp()
@@ -92,13 +95,6 @@ class TestAzureDataSource(MockerTestCase):
def _invoke_agent(cmd):
data['agent_invoked'] = cmd
- def _write_files(datadir, files, dirmode):
- data['files'] = {}
- data['datadir'] = datadir
- data['datadir_mode'] = dirmode
- for (fname, content) in files.items():
- data['files'][fname] = content
-
def _wait_for_files(flist, _maxwait=None, _naplen=None):
data['waited'] = flist
return []
@@ -119,11 +115,11 @@ class TestAzureDataSource(MockerTestCase):
{'ovf-env.xml': data['ovfcontent']})
mod = DataSourceAzure
+ mod.BUILTIN_DS_CONFIG['data_dir'] = self.waagent_d
self.apply_patches([(mod, 'list_possible_azure_ds_devs', dsdevs)])
self.apply_patches([(mod, 'invoke_agent', _invoke_agent),
- (mod, 'write_files', _write_files),
(mod, 'wait_for_files', _wait_for_files),
(mod, 'pubkeys_from_crt_files',
_pubkeys_from_crt_files),
@@ -147,10 +143,18 @@ class TestAzureDataSource(MockerTestCase):
self.assertTrue(ret)
self.assertEqual(dsrc.userdata_raw, "")
self.assertEqual(dsrc.metadata['local-hostname'], odata['HostName'])
- self.assertTrue('ovf-env.xml' in data['files'])
- self.assertEqual(0700, data['datadir_mode'])
+ self.assertTrue(os.path.isfile(
+ os.path.join(self.waagent_d, 'ovf-env.xml')))
self.assertEqual(dsrc.metadata['instance-id'], 'i-my-azure-id')
+ def test_waagent_d_has_0700_perms(self):
+ # we expect /var/lib/waagent to be created 0700
+ dsrc = self._get_ds({'ovfcontent': construct_valid_ovf_env()})
+ ret = dsrc.get_data()
+ self.assertTrue(ret)
+ self.assertTrue(os.path.isdir(self.waagent_d))
+ self.assertEqual(stat.S_IMODE(os.stat(self.waagent_d).st_mode), 0700)
+
def test_user_cfg_set_agent_command_plain(self):
# set dscfg in via plaintext
# we must have friendly-to-xml formatted plaintext in yaml_cfg
@@ -338,6 +342,65 @@ class TestAzureDataSource(MockerTestCase):
self.assertEqual(userdata, dsrc.userdata_raw)
+ def test_ovf_env_arrives_in_waagent_dir(self):
+ xml = construct_valid_ovf_env(data={}, userdata="FOODATA")
+ dsrc = self._get_ds({'ovfcontent': xml})
+ dsrc.get_data()
+
+ # 'data_dir' is '/var/lib/waagent' (walinux-agent's state dir)
+ # we expect that the ovf-env.xml file is copied there.
+ ovf_env_path = os.path.join(self.waagent_d, 'ovf-env.xml')
+ self.assertTrue(os.path.exists(ovf_env_path))
+ self.assertEqual(xml, load_file(ovf_env_path))
+
+ def test_existing_ovf_same(self):
+ # waagent/SharedConfig left alone if found ovf-env.xml same as cached
+ odata = {'UserData': base64.b64encode("SOMEUSERDATA")}
+ data = {'ovfcontent': construct_valid_ovf_env(data=odata)}
+
+ populate_dir(self.waagent_d,
+ {'ovf-env.xml': data['ovfcontent'],
+ 'otherfile': 'otherfile-content',
+ 'SharedConfig.xml': 'mysharedconfig'})
+
+ dsrc = self._get_ds(data)
+ ret = dsrc.get_data()
+ self.assertTrue(ret)
+ self.assertTrue(os.path.exists(
+ os.path.join(self.waagent_d, 'ovf-env.xml')))
+ self.assertTrue(os.path.exists(
+ os.path.join(self.waagent_d, 'otherfile')))
+ self.assertTrue(os.path.exists(
+ os.path.join(self.waagent_d, 'SharedConfig.xml')))
+
+ def test_existing_ovf_diff(self):
+ # waagent/SharedConfig must be removed if ovfenv is found elsewhere
+
+ # 'get_data' should remove SharedConfig.xml in /var/lib/waagent
+ # if ovf-env.xml differs.
+ cached_ovfenv = construct_valid_ovf_env(
+ {'userdata': base64.b64encode("FOO_USERDATA")})
+ new_ovfenv = construct_valid_ovf_env(
+ {'userdata': base64.b64encode("NEW_USERDATA")})
+
+ populate_dir(self.waagent_d,
+ {'ovf-env.xml': cached_ovfenv,
+ 'SharedConfig.xml': "mysharedconfigxml",
+ 'otherfile': 'otherfilecontent'})
+
+ dsrc = self._get_ds({'ovfcontent': new_ovfenv})
+ ret = dsrc.get_data()
+ self.assertTrue(ret)
+ self.assertEqual(dsrc.userdata_raw, "NEW_USERDATA")
+ self.assertTrue(os.path.exists(
+ os.path.join(self.waagent_d, 'otherfile')))
+ self.assertFalse(
+ os.path.exists(os.path.join(self.waagent_d, 'SharedConfig.xml')))
+ self.assertTrue(
+ os.path.exists(os.path.join(self.waagent_d, 'ovf-env.xml')))
+ self.assertEqual(new_ovfenv,
+ load_file(os.path.join(self.waagent_d, 'ovf-env.xml')))
+
class TestReadAzureOvf(MockerTestCase):
def test_invalid_xml_raises_non_azure_ds(self):
diff --git a/tests/unittests/test_datasource/test_cloudsigma.py b/tests/unittests/test_datasource/test_cloudsigma.py
new file mode 100644
index 00000000..3245aba1
--- /dev/null
+++ b/tests/unittests/test_datasource/test_cloudsigma.py
@@ -0,0 +1,59 @@
+# coding: utf-8
+from unittest import TestCase
+
+from cloudinit.cs_utils import Cepko
+from cloudinit.sources import DataSourceCloudSigma
+
+
+SERVER_CONTEXT = {
+ "cpu": 1000,
+ "cpus_instead_of_cores": False,
+ "global_context": {"some_global_key": "some_global_val"},
+ "mem": 1073741824,
+ "meta": {
+ "ssh_public_key": "ssh-rsa AAAAB3NzaC1yc2E.../hQ5D5 john@doe",
+ "cloudinit-user-data": "#cloud-config\n\n...",
+ },
+ "name": "test_server",
+ "requirements": [],
+ "smp": 1,
+ "tags": ["much server", "very performance"],
+ "uuid": "65b2fb23-8c03-4187-a3ba-8b7c919e8890",
+ "vnc_password": "9e84d6cb49e46379"
+}
+
+
+class CepkoMock(Cepko):
+ result = SERVER_CONTEXT
+
+ def all(self):
+ return self
+
+
+class DataSourceCloudSigmaTest(TestCase):
+ def setUp(self):
+ self.datasource = DataSourceCloudSigma.DataSourceCloudSigma("", "", "")
+ self.datasource.cepko = CepkoMock()
+ self.datasource.get_data()
+
+ def test_get_hostname(self):
+ self.assertEqual("test_server", self.datasource.get_hostname())
+ self.datasource.metadata['name'] = ''
+ self.assertEqual("65b2fb23", self.datasource.get_hostname())
+ self.datasource.metadata['name'] = u'ั‚ะตัั‚'
+ self.assertEqual("65b2fb23", self.datasource.get_hostname())
+
+ def test_get_public_ssh_keys(self):
+ self.assertEqual([SERVER_CONTEXT['meta']['ssh_public_key']],
+ self.datasource.get_public_ssh_keys())
+
+ def test_get_instance_id(self):
+ self.assertEqual(SERVER_CONTEXT['uuid'],
+ self.datasource.get_instance_id())
+
+ def test_metadata(self):
+ self.assertEqual(self.datasource.metadata, SERVER_CONTEXT)
+
+ def test_user_data(self):
+ self.assertEqual(self.datasource.userdata_raw,
+ SERVER_CONTEXT['meta']['cloudinit-user-data'])