diff options
Diffstat (limited to 'cloudinit/DataSource.py')
-rw-r--r-- | cloudinit/DataSource.py | 63 |
1 files changed, 35 insertions, 28 deletions
diff --git a/cloudinit/DataSource.py b/cloudinit/DataSource.py index 06061a2e..f38e3b20 100644 --- a/cloudinit/DataSource.py +++ b/cloudinit/DataSource.py @@ -1,8 +1,10 @@ # vi: ts=4 expandtab # # Copyright (C) 2009-2010 Canonical Ltd. +# Copyright (C) 2012 Hewlett-Packard Development Company, L.P. # # Author: Scott Moser <scott.moser@canonical.com> +# Author: Juerg Hafliger <juerg.haefliger@hp.com> # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License version 3, as @@ -20,22 +22,23 @@ DEP_FILESYSTEM = "FILESYSTEM" DEP_NETWORK = "NETWORK" -import UserDataHandler as ud +import cloudinit.UserDataHandler as ud import cloudinit.util as util import socket + class DataSource: userdata = None metadata = None userdata_raw = None cfgname = "" - # system config (passed in from cloudinit, + # system config (passed in from cloudinit, # cloud-config before input from the DataSource) - sys_cfg = { } + sys_cfg = {} # datasource config, the cloud-config['datasource']['__name__'] - ds_cfg = { } # datasource config + ds_cfg = {} # datasource config - def __init__(self,sys_cfg=None): + def __init__(self, sys_cfg=None): if not self.cfgname: name = str(self.__class__).split(".")[-1] if name.startswith("DataSource"): @@ -45,7 +48,7 @@ class DataSource: self.sys_cfg = sys_cfg self.ds_cfg = util.get_cfg_by_path(self.sys_cfg, - ("datasource",self.cfgname),self.ds_cfg) + ("datasource", self.cfgname), self.ds_cfg) def get_userdata(self): if self.userdata == None: @@ -55,26 +58,26 @@ class DataSource: def get_userdata_raw(self): return(self.userdata_raw) - # the data sources' config_obj is a cloud-config formated # object that came to it from ways other than cloud-config # because cloud-config content would be handled elsewhere def get_config_obj(self): - return({ }) + return({}) def get_public_ssh_keys(self): keys = [] - if not self.metadata.has_key('public-keys'): return([]) + if 'public-keys' not in self.metadata: + return([]) if isinstance(self.metadata['public-keys'], str): - return([self.metadata['public-keys'],]) - - for keyname, klist in self.metadata['public-keys'].items(): + return([self.metadata['public-keys'], ]) + + for _keyname, klist in self.metadata['public-keys'].items(): # lp:506332 uec metadata service responds with # data that makes boto populate a string for 'klist' rather # than a list. - if isinstance(klist,str): - klist = [ klist ] + if isinstance(klist, str): + klist = [klist] for pkey in klist: # there is an empty string at the end of the keylist, trim it if pkey: @@ -82,7 +85,7 @@ class DataSource: return(keys) - def device_name_to_device(self, name): + def device_name_to_device(self, _name): # translate a 'name' to a device # the primary function at this point is on ec2 # to consult metadata service, that has @@ -103,7 +106,7 @@ class DataSource: def get_hostname(self, fqdn=False): defdomain = "localdomain" - defhost = "localhost" + defhost = "localhost" domain = defdomain if not 'local-hostname' in self.metadata: @@ -119,19 +122,18 @@ class DataSource: fqdn = util.get_fqdn_from_hosts(hostname) if fqdn and fqdn.find(".") > 0: - toks = fqdn.split(".") + toks = str(fqdn).split(".") elif hostname: - toks = [ hostname, defdomain ] + toks = [hostname, defdomain] else: - toks = [ defhost, defdomain ] - + toks = [defhost, defdomain] else: # if there is an ipv4 address in 'local-hostname', then # make up a hostname (LP: #475354) in format ip-xx.xx.xx.xx lhost = self.metadata['local-hostname'] if is_ipv4(lhost): - toks = "ip-%s" % lhost.replace(".","-") + toks = "ip-%s" % lhost.replace(".", "-") else: toks = lhost.split(".") @@ -142,10 +144,11 @@ class DataSource: hostname = toks[0] if fqdn: - return "%s.%s" % (hostname,domain) + return "%s.%s" % (hostname, domain) else: return hostname + # return a list of classes that have the same depends as 'depends' # iterate through cfg_list, loading "DataSourceCollections" modules # and calling their "get_datasource_list". @@ -157,11 +160,14 @@ class DataSource: # ie, pkglist=[ "foo", "" ] # will first try to load foo.DataSource<item> # then DataSource<item> -def list_sources(cfg_list, depends, pkglist=[]): +def list_sources(cfg_list, depends, pkglist=None): + if pkglist is None: + pkglist = [] retlist = [] for ds_coll in cfg_list: for pkg in pkglist: - if pkg: pkg="%s." % pkg + if pkg: + pkg = "%s." % pkg try: mod = __import__("%sDataSource%s" % (pkg, ds_coll)) if pkg: @@ -173,15 +179,16 @@ def list_sources(cfg_list, depends, pkglist=[]): raise return(retlist) + # depends is a list of dependencies (DEP_FILESYSTEM) # dslist is a list of 2 item lists -# dslist = [ +# dslist = [ # ( class, ( depends-that-this-class-needs ) ) # } # it returns a list of 'class' that matched these deps exactly # it is a helper function for DataSourceCollections def list_from_depends(depends, dslist): - retlist = [ ] + retlist = [] depset = set(depends) for elem in dslist: (cls, deps) = elem @@ -197,8 +204,8 @@ def is_ipv4(instr): return False try: - r = filter(lambda x: int(x) < 256 and x > 0, toks) + toks = [x for x in toks if (int(x) < 256 and int(x) > 0)] except: return False - return True + return (len(toks) == 4) |