File: //lib/python3.6/site-packages/cloudinit/sources/DataSourceAliYun.py
# This file is part of cloud-init. See LICENSE file for license information.
from cloudinit import sources
from cloudinit.sources import DataSourceEc2 as EC2
from cloudinit.distros.aliyun import ImageType
from cloudinit import util
from cloudinit.event import EventType
from cloudinit import log as logging
LOG = logging.getLogger(__name__)
ALIYUN_PRODUCT = "Alibaba Cloud ECS"
class DataSourceAliYun(EC2.DataSourceEc2):
dsname = 'AliYun'
metadata_urls = ['http://100.100.100.200']
# The minimum supported metadata_version from the ec2 metadata apis
min_metadata_version = '2016-01-01'
extended_metadata_versions = []
version_url_suffix = '/cloudinit/version'
report_url_suffix = '/cloudinit/report'
def get_ntp_conf(self):
if not self.metadata:
return {}
return self.metadata.get('ntp-conf')
def get_source_address(self):
if not self.metadata or not self.metadata.get('source-address'):
return []
source_address = self.metadata.get('source-address')
if isinstance(source_address, str):
source_address = [source_address]
return source_address
@property
def version_url(self):
return self.metadata_address + self.version_url_suffix
@property
def report_url(self):
return self.metadata_address + self.report_url_suffix
def __init__(self, sys_cfg, distro, paths):
super(DataSourceAliYun, self).__init__(sys_cfg, distro, paths)
self.update_events['network'].add(EventType.BOOT)
def get_hostname(self, fqdn=False, resolve_ip=False, metadata_only=False):
return self.metadata.get('hostname', 'localhost.localdomain')
def get_public_ssh_keys(self):
return parse_public_keys(self.metadata.get('public-keys', {}))
# ebmhfg5.2xlarge / ebmhfg4.4xlarge this instance type product name not Alibaba Cloud ECS
#def _get_cloud_name(self):
# if _is_aliyun():
# return EC2.CloudNames.ALIYUN
# else:
# return EC2.CloudNames.NO_EC2_METADATA
def _get_cloud_name(self):
return EC2.CloudNames.ALIYUN
def _is_aliyun():
return util.read_dmi_data('system-product-name') == ALIYUN_PRODUCT
def parse_public_keys(public_keys):
keys = []
for _key_id, key_body in public_keys.items():
if isinstance(key_body, str):
keys.append(key_body.strip())
elif isinstance(key_body, list):
keys.extend(key_body)
elif isinstance(key_body, dict):
key = key_body.get('openssh-key', [])
if isinstance(key, str):
keys.append(key.strip())
elif isinstance(key, list):
keys.extend(key)
return keys
class DataSourceAliYun2Local(DataSourceAliYun):
"""Datasource run at init-local which sets up network to query metadata.
In init-local, no network is available. This subclass sets up minimal
networking with dhclient on a viable nic so that it can talk to the
metadata service. If the metadata service provides network configuration
then render the network configuration for that instance based on metadata.
"""
perform_dhcp_setup = True
def get_data(self):
if self.distro.cname == "aliyunlinux" and self.distro.get_image_type() == ImageType.IMAGE_QBOOT:
self.perform_dhcp_setup = False # Use dhcp before querying metadata
if self.distro == "aliyun" :
return False
supported_platforms = (EC2.CloudNames.ALIYUN,)
if self.cloud_name not in supported_platforms:
LOG.debug("Local AliYun mode only supported on %s, not %s",
supported_platforms, self.cloud_name)
return False
return super(DataSourceAliYun2Local, self).get_data()
# Used to match classes to dependencies
datasources = [
(DataSourceAliYun2Local, (sources.DEP_FILESYSTEM,)), # Run at init-local
(DataSourceAliYun, (sources.DEP_FILESYSTEM, sources.DEP_NETWORK)),
]
# Return a list of data sources that match this set of dependencies
def get_datasource_list(depends):
return sources.list_from_depends(depends, datasources)
# vi: ts=4 expandtab