Blame tests/unittests/test_datasource/test_aliyun.py

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