summaryrefslogtreecommitdiff
path: root/cloudinit/DataSource.py
diff options
context:
space:
mode:
Diffstat (limited to 'cloudinit/DataSource.py')
-rw-r--r--cloudinit/DataSource.py63
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)