|
Packit Service |
a04d08 |
# This file is part of cloud-init. See LICENSE file for license information.
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
import functools
|
|
Packit Service |
a04d08 |
import httpretty
|
|
Packit Service |
a04d08 |
import os
|
|
Packit Service |
751c4a |
from unittest import mock
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
from cloudinit import helpers
|
|
Packit Service |
a04d08 |
from cloudinit.sources import DataSourceAliYun as ay
|
|
Packit Service |
a04d08 |
from cloudinit.tests import helpers as test_helpers
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
DEFAULT_METADATA = {
|
|
Packit Service |
a04d08 |
'instance-id': 'aliyun-test-vm-00',
|
|
Packit Service |
a04d08 |
'eipv4': '10.0.0.1',
|
|
Packit Service |
a04d08 |
'hostname': 'test-hostname',
|
|
Packit Service |
a04d08 |
'image-id': 'm-test',
|
|
Packit Service |
a04d08 |
'launch-index': '0',
|
|
Packit Service |
a04d08 |
'mac': '00:16:3e:00:00:00',
|
|
Packit Service |
a04d08 |
'network-type': 'vpc',
|
|
Packit Service |
a04d08 |
'private-ipv4': '192.168.0.1',
|
|
Packit Service |
a04d08 |
'serial-number': 'test-string',
|
|
Packit Service |
a04d08 |
'vpc-cidr-block': '192.168.0.0/16',
|
|
Packit Service |
a04d08 |
'vpc-id': 'test-vpc',
|
|
Packit Service |
a04d08 |
'vswitch-id': 'test-vpc',
|
|
Packit Service |
a04d08 |
'vswitch-cidr-block': '192.168.0.0/16',
|
|
Packit Service |
a04d08 |
'zone-id': 'test-zone-1',
|
|
Packit Service |
a04d08 |
'ntp-conf': {'ntp_servers': [
|
|
Packit Service |
a04d08 |
'ntp1.aliyun.com',
|
|
Packit Service |
a04d08 |
'ntp2.aliyun.com',
|
|
Packit Service |
a04d08 |
'ntp3.aliyun.com']},
|
|
Packit Service |
a04d08 |
'source-address': ['http://mirrors.aliyun.com',
|
|
Packit Service |
a04d08 |
'http://mirrors.aliyuncs.com'],
|
|
Packit Service |
a04d08 |
'public-keys': {'key-pair-1': {'openssh-key': 'ssh-rsa AAAAB3...'},
|
|
Packit Service |
a04d08 |
'key-pair-2': {'openssh-key': 'ssh-rsa AAAAB3...'}}
|
|
Packit Service |
a04d08 |
}
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
DEFAULT_USERDATA = """\
|
|
Packit Service |
a04d08 |
#cloud-config
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
hostname: localhost"""
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
def register_mock_metaserver(base_url, data):
|
|
Packit Service |
a04d08 |
def register_helper(register, base_url, body):
|
|
Packit Service |
a04d08 |
if isinstance(body, str):
|
|
Packit Service |
a04d08 |
register(base_url, body)
|
|
Packit Service |
a04d08 |
elif isinstance(body, list):
|
|
Packit Service |
a04d08 |
register(base_url.rstrip('/'), '\n'.join(body) + '\n')
|
|
Packit Service |
a04d08 |
elif isinstance(body, dict):
|
|
Packit Service |
a04d08 |
if not body:
|
|
Packit Service |
a04d08 |
register(base_url.rstrip('/') + '/', 'not found',
|
|
Packit Service |
a04d08 |
status_code=404)
|
|
Packit Service |
a04d08 |
vals = []
|
|
Packit Service |
a04d08 |
for k, v in body.items():
|
|
Packit Service |
a04d08 |
if isinstance(v, (str, list)):
|
|
Packit Service |
a04d08 |
suffix = k.rstrip('/')
|
|
Packit Service |
a04d08 |
else:
|
|
Packit Service |
a04d08 |
suffix = k.rstrip('/') + '/'
|
|
Packit Service |
a04d08 |
vals.append(suffix)
|
|
Packit Service |
a04d08 |
url = base_url.rstrip('/') + '/' + suffix
|
|
Packit Service |
a04d08 |
register_helper(register, url, v)
|
|
Packit Service |
a04d08 |
register(base_url, '\n'.join(vals) + '\n')
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
register = functools.partial(httpretty.register_uri, httpretty.GET)
|
|
Packit Service |
a04d08 |
register_helper(register, base_url, data)
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
class TestAliYunDatasource(test_helpers.HttprettyTestCase):
|
|
Packit Service |
a04d08 |
def setUp(self):
|
|
Packit Service |
a04d08 |
super(TestAliYunDatasource, self).setUp()
|
|
Packit Service |
a04d08 |
cfg = {'datasource': {'AliYun': {'timeout': '1', 'max_wait': '1'}}}
|
|
Packit Service |
a04d08 |
distro = {}
|
|
Packit Service |
a04d08 |
paths = helpers.Paths({'run_dir': self.tmp_dir()})
|
|
Packit Service |
a04d08 |
self.ds = ay.DataSourceAliYun(cfg, distro, paths)
|
|
Packit Service |
a04d08 |
self.metadata_address = self.ds.metadata_urls[0]
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
@property
|
|
Packit Service |
a04d08 |
def default_metadata(self):
|
|
Packit Service |
a04d08 |
return DEFAULT_METADATA
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
@property
|
|
Packit Service |
a04d08 |
def default_userdata(self):
|
|
Packit Service |
a04d08 |
return DEFAULT_USERDATA
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
@property
|
|
Packit Service |
a04d08 |
def metadata_url(self):
|
|
Packit Service |
a04d08 |
return os.path.join(
|
|
Packit Service |
a04d08 |
self.metadata_address,
|
|
Packit Service |
a04d08 |
self.ds.min_metadata_version, 'meta-data') + '/'
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
@property
|
|
Packit Service |
a04d08 |
def userdata_url(self):
|
|
Packit Service |
a04d08 |
return os.path.join(
|
|
Packit Service |
a04d08 |
self.metadata_address,
|
|
Packit Service |
a04d08 |
self.ds.min_metadata_version, 'user-data')
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
# EC2 provides an instance-identity document which must return 404 here
|
|
Packit Service |
a04d08 |
# for this test to pass.
|
|
Packit Service |
a04d08 |
@property
|
|
Packit Service |
a04d08 |
def default_identity(self):
|
|
Packit Service |
a04d08 |
return {}
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
@property
|
|
Packit Service |
a04d08 |
def identity_url(self):
|
|
Packit Service |
a04d08 |
return os.path.join(self.metadata_address,
|
|
Packit Service |
a04d08 |
self.ds.min_metadata_version,
|
|
Packit Service |
a04d08 |
'dynamic', 'instance-identity')
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
def regist_default_server(self):
|
|
Packit Service |
a04d08 |
register_mock_metaserver(self.metadata_url, self.default_metadata)
|
|
Packit Service |
a04d08 |
register_mock_metaserver(self.userdata_url, self.default_userdata)
|
|
Packit Service |
a04d08 |
register_mock_metaserver(self.identity_url, self.default_identity)
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
def _test_get_data(self):
|
|
Packit Service |
a04d08 |
self.assertEqual(self.ds.metadata, self.default_metadata)
|
|
Packit Service |
a04d08 |
self.assertEqual(self.ds.userdata_raw,
|
|
Packit Service |
a04d08 |
self.default_userdata.encode('utf8'))
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
def _test_get_sshkey(self):
|
|
Packit Service |
a04d08 |
pub_keys = [v['openssh-key'] for (_, v) in
|
|
Packit Service |
a04d08 |
self.default_metadata['public-keys'].items()]
|
|
Packit Service |
a04d08 |
self.assertEqual(self.ds.get_public_ssh_keys(), pub_keys)
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
def _test_get_iid(self):
|
|
Packit Service |
a04d08 |
self.assertEqual(self.default_metadata['instance-id'],
|
|
Packit Service |
a04d08 |
self.ds.get_instance_id())
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
def _test_host_name(self):
|
|
Packit Service |
a04d08 |
self.assertEqual(self.default_metadata['hostname'],
|
|
Packit Service |
a04d08 |
self.ds.get_hostname())
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
@mock.patch("cloudinit.sources.DataSourceAliYun._is_aliyun")
|
|
Packit Service |
a04d08 |
def test_with_mock_server(self, m_is_aliyun):
|
|
Packit Service |
a04d08 |
m_is_aliyun.return_value = True
|
|
Packit Service |
a04d08 |
self.regist_default_server()
|
|
Packit Service |
a04d08 |
ret = self.ds.get_data()
|
|
Packit Service |
a04d08 |
self.assertEqual(True, ret)
|
|
Packit Service |
a04d08 |
self.assertEqual(1, m_is_aliyun.call_count)
|
|
Packit Service |
a04d08 |
self._test_get_data()
|
|
Packit Service |
a04d08 |
self._test_get_sshkey()
|
|
Packit Service |
a04d08 |
self._test_get_iid()
|
|
Packit Service |
a04d08 |
self._test_host_name()
|
|
Packit Service |
a04d08 |
self.assertEqual('aliyun', self.ds.cloud_name)
|
|
Packit Service |
a04d08 |
self.assertEqual('ec2', self.ds.platform)
|
|
Packit Service |
a04d08 |
self.assertEqual(
|
|
Packit Service |
751c4a |
'metadata (http://100.100.100.200)', self.ds.subplatform)
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
@mock.patch("cloudinit.sources.DataSourceAliYun._is_aliyun")
|
|
Packit Service |
a04d08 |
def test_returns_false_when_not_on_aliyun(self, m_is_aliyun):
|
|
Packit Service |
a04d08 |
"""If is_aliyun returns false, then get_data should return False."""
|
|
Packit Service |
a04d08 |
m_is_aliyun.return_value = False
|
|
Packit Service |
a04d08 |
self.regist_default_server()
|
|
Packit Service |
a04d08 |
ret = self.ds.get_data()
|
|
Packit Service |
a04d08 |
self.assertEqual(1, m_is_aliyun.call_count)
|
|
Packit Service |
a04d08 |
self.assertEqual(False, ret)
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
def test_parse_public_keys(self):
|
|
Packit Service |
a04d08 |
public_keys = {}
|
|
Packit Service |
a04d08 |
self.assertEqual(ay.parse_public_keys(public_keys), [])
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
public_keys = {'key-pair-0': 'ssh-key-0'}
|
|
Packit Service |
a04d08 |
self.assertEqual(ay.parse_public_keys(public_keys),
|
|
Packit Service |
a04d08 |
[public_keys['key-pair-0']])
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
public_keys = {'key-pair-0': 'ssh-key-0', 'key-pair-1': 'ssh-key-1'}
|
|
Packit Service |
a04d08 |
self.assertEqual(set(ay.parse_public_keys(public_keys)),
|
|
Packit Service |
a04d08 |
set([public_keys['key-pair-0'],
|
|
Packit Service |
a04d08 |
public_keys['key-pair-1']]))
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
public_keys = {'key-pair-0': ['ssh-key-0', 'ssh-key-1']}
|
|
Packit Service |
a04d08 |
self.assertEqual(ay.parse_public_keys(public_keys),
|
|
Packit Service |
a04d08 |
public_keys['key-pair-0'])
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
public_keys = {'key-pair-0': {'openssh-key': []}}
|
|
Packit Service |
a04d08 |
self.assertEqual(ay.parse_public_keys(public_keys), [])
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
public_keys = {'key-pair-0': {'openssh-key': 'ssh-key-0'}}
|
|
Packit Service |
a04d08 |
self.assertEqual(ay.parse_public_keys(public_keys),
|
|
Packit Service |
a04d08 |
[public_keys['key-pair-0']['openssh-key']])
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
public_keys = {'key-pair-0': {'openssh-key': ['ssh-key-0',
|
|
Packit Service |
a04d08 |
'ssh-key-1']}}
|
|
Packit Service |
a04d08 |
self.assertEqual(ay.parse_public_keys(public_keys),
|
|
Packit Service |
a04d08 |
public_keys['key-pair-0']['openssh-key'])
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
class TestIsAliYun(test_helpers.CiTestCase):
|
|
Packit Service |
a04d08 |
ALIYUN_PRODUCT = 'Alibaba Cloud ECS'
|
|
Packit Service |
a04d08 |
read_dmi_data_expected = [mock.call('system-product-name')]
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
@mock.patch("cloudinit.sources.DataSourceAliYun.util.read_dmi_data")
|
|
Packit Service |
a04d08 |
def test_true_on_aliyun_product(self, m_read_dmi_data):
|
|
Packit Service |
a04d08 |
"""Should return true if the dmi product data has expected value."""
|
|
Packit Service |
a04d08 |
m_read_dmi_data.return_value = self.ALIYUN_PRODUCT
|
|
Packit Service |
a04d08 |
ret = ay._is_aliyun()
|
|
Packit Service |
a04d08 |
self.assertEqual(self.read_dmi_data_expected,
|
|
Packit Service |
a04d08 |
m_read_dmi_data.call_args_list)
|
|
Packit Service |
a04d08 |
self.assertEqual(True, ret)
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
@mock.patch("cloudinit.sources.DataSourceAliYun.util.read_dmi_data")
|
|
Packit Service |
a04d08 |
def test_false_on_empty_string(self, m_read_dmi_data):
|
|
Packit Service |
a04d08 |
"""Should return false on empty value returned."""
|
|
Packit Service |
a04d08 |
m_read_dmi_data.return_value = ""
|
|
Packit Service |
a04d08 |
ret = ay._is_aliyun()
|
|
Packit Service |
a04d08 |
self.assertEqual(self.read_dmi_data_expected,
|
|
Packit Service |
a04d08 |
m_read_dmi_data.call_args_list)
|
|
Packit Service |
a04d08 |
self.assertEqual(False, ret)
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
@mock.patch("cloudinit.sources.DataSourceAliYun.util.read_dmi_data")
|
|
Packit Service |
a04d08 |
def test_false_on_unknown_string(self, m_read_dmi_data):
|
|
Packit Service |
a04d08 |
"""Should return false on an unrelated string."""
|
|
Packit Service |
a04d08 |
m_read_dmi_data.return_value = "cubs win"
|
|
Packit Service |
a04d08 |
ret = ay._is_aliyun()
|
|
Packit Service |
a04d08 |
self.assertEqual(self.read_dmi_data_expected,
|
|
Packit Service |
a04d08 |
m_read_dmi_data.call_args_list)
|
|
Packit Service |
a04d08 |
self.assertEqual(False, ret)
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
# vi: ts=4 expandtab
|