Blame cloudinit/sources/DataSourceDigitalOcean.py

Packit Service a04d08
# Author: Neal Shrader <neal@digitalocean.com>
Packit Service a04d08
# Author: Ben Howard  <bh@digitalocean.com>
Packit Service a04d08
#
Packit Service a04d08
# This file is part of cloud-init. See LICENSE file for license information.
Packit Service a04d08
Packit Service a04d08
# DigitalOcean Droplet API:
Packit Service a04d08
# https://developers.digitalocean.com/documentation/metadata/
Packit Service a04d08
Packit Service a04d08
from cloudinit import log as logging
Packit Service a04d08
from cloudinit import sources
Packit Service a04d08
from cloudinit import util
Packit Service a04d08
Packit Service a04d08
import cloudinit.sources.helpers.digitalocean as do_helper
Packit Service a04d08
Packit Service a04d08
LOG = logging.getLogger(__name__)
Packit Service a04d08
Packit Service a04d08
BUILTIN_DS_CONFIG = {
Packit Service a04d08
    'metadata_url': 'http://169.254.169.254/metadata/v1.json',
Packit Service a04d08
}
Packit Service a04d08
Packit Service a04d08
# Wait for a up to a minute, retrying the meta-data server
Packit Service a04d08
# every 2 seconds.
Packit Service a04d08
MD_RETRIES = 30
Packit Service a04d08
MD_TIMEOUT = 2
Packit Service a04d08
MD_WAIT_RETRY = 2
Packit Service a04d08
MD_USE_IPV4LL = True
Packit Service a04d08
Packit Service a04d08
Packit Service a04d08
class DataSourceDigitalOcean(sources.DataSource):
Packit Service a04d08
Packit Service a04d08
    dsname = 'DigitalOcean'
Packit Service a04d08
Packit Service a04d08
    def __init__(self, sys_cfg, distro, paths):
Packit Service a04d08
        sources.DataSource.__init__(self, sys_cfg, distro, paths)
Packit Service a04d08
        self.distro = distro
Packit Service a04d08
        self.metadata = dict()
Packit Service a04d08
        self.ds_cfg = util.mergemanydict([
Packit Service a04d08
            util.get_cfg_by_path(sys_cfg, ["datasource", "DigitalOcean"], {}),
Packit Service a04d08
            BUILTIN_DS_CONFIG])
Packit Service a04d08
        self.metadata_address = self.ds_cfg['metadata_url']
Packit Service a04d08
        self.retries = self.ds_cfg.get('retries', MD_RETRIES)
Packit Service a04d08
        self.timeout = self.ds_cfg.get('timeout', MD_TIMEOUT)
Packit Service a04d08
        self.use_ip4LL = self.ds_cfg.get('use_ip4LL', MD_USE_IPV4LL)
Packit Service a04d08
        self.wait_retry = self.ds_cfg.get('wait_retry', MD_WAIT_RETRY)
Packit Service a04d08
        self._network_config = None
Packit Service a04d08
Packit Service a04d08
    def _get_sysinfo(self):
Packit Service a04d08
        return do_helper.read_sysinfo()
Packit Service a04d08
Packit Service a04d08
    def _get_data(self):
Packit Service a04d08
        (is_do, droplet_id) = self._get_sysinfo()
Packit Service a04d08
Packit Service a04d08
        # only proceed if we know we are on DigitalOcean
Packit Service a04d08
        if not is_do:
Packit Service a04d08
            return False
Packit Service a04d08
Packit Service a04d08
        LOG.info("Running on digital ocean. droplet_id=%s", droplet_id)
Packit Service a04d08
Packit Service a04d08
        ipv4LL_nic = None
Packit Service a04d08
        if self.use_ip4LL:
Packit Service 751c4a
            ipv4LL_nic = do_helper.assign_ipv4_link_local(self.distro)
Packit Service a04d08
Packit Service a04d08
        md = do_helper.read_metadata(
Packit Service a04d08
            self.metadata_address, timeout=self.timeout,
Packit Service a04d08
            sec_between=self.wait_retry, retries=self.retries)
Packit Service a04d08
Packit Service a04d08
        self.metadata_full = md
Packit Service a04d08
        self.metadata['instance-id'] = md.get('droplet_id', droplet_id)
Packit Service a04d08
        self.metadata['local-hostname'] = md.get('hostname', droplet_id)
Packit Service a04d08
        self.metadata['interfaces'] = md.get('interfaces')
Packit Service a04d08
        self.metadata['public-keys'] = md.get('public_keys')
Packit Service a04d08
        self.metadata['availability_zone'] = md.get('region', 'default')
Packit Service a04d08
        self.vendordata_raw = md.get("vendor_data", None)
Packit Service a04d08
        self.userdata_raw = md.get("user_data", None)
Packit Service a04d08
Packit Service a04d08
        if ipv4LL_nic:
Packit Service a04d08
            do_helper.del_ipv4_link_local(ipv4LL_nic)
Packit Service a04d08
Packit Service a04d08
        return True
Packit Service a04d08
Packit Service a04d08
    def check_instance_id(self, sys_cfg):
Packit Service a04d08
        return sources.instance_id_matches_system_uuid(
Packit Service a04d08
            self.get_instance_id(), 'system-serial-number')
Packit Service a04d08
Packit Service a04d08
    @property
Packit Service a04d08
    def network_config(self):
Packit Service a04d08
        """Configure the networking. This needs to be done each boot, since
Packit Service a04d08
           the IP information may have changed due to snapshot and/or
Packit Service a04d08
           migration.
Packit Service a04d08
        """
Packit Service a04d08
Packit Service a04d08
        if self._network_config:
Packit Service a04d08
            return self._network_config
Packit Service a04d08
Packit Service a04d08
        interfaces = self.metadata.get('interfaces')
Packit Service a04d08
        LOG.debug(interfaces)
Packit Service a04d08
        if not interfaces:
Packit Service a04d08
            raise Exception("Unable to get meta-data from server....")
Packit Service a04d08
Packit Service a04d08
        nameservers = self.metadata_full['dns']['nameservers']
Packit Service a04d08
        self._network_config = do_helper.convert_network_configuration(
Packit Service a04d08
            interfaces, nameservers)
Packit Service a04d08
        return self._network_config
Packit Service a04d08
Packit Service a04d08
Packit Service a04d08
# Used to match classes to dependencies
Packit Service a04d08
datasources = [
Packit Service a04d08
    (DataSourceDigitalOcean, (sources.DEP_FILESYSTEM, )),
Packit Service a04d08
]
Packit Service a04d08
Packit Service a04d08
Packit Service a04d08
# Return a list of data sources that match this set of dependencies
Packit Service a04d08
def get_datasource_list(depends):
Packit Service a04d08
    return sources.list_from_depends(depends, datasources)
Packit Service a04d08
Packit Service a04d08
# vi: ts=4 expandtab