From 85444c68c8728d4324b71218d15d4f04ecdb4fbd Mon Sep 17 00:00:00 2001
From: Scott Moser <smoser@ubuntu.com>
Date: Mon, 31 Jan 2011 16:40:43 -0500
Subject: replace DataSource's self.log

After adding the 'log' element to the DataSource class, pickling would
fail with
  TypeError: can't pickle file objects

Instead of having the object with a log reference, use one from
'DataSource.log' and have that set by cloudinit
---
 cloudinit/DataSource.py        | 17 +++++++++++------
 cloudinit/DataSourceEc2.py     | 13 +++++++------
 cloudinit/DataSourceNoCloud.py |  9 +++++----
 cloudinit/DataSourceOVF.py     |  4 ++--
 cloudinit/__init__.py          |  3 ++-
 5 files changed, 27 insertions(+), 19 deletions(-)

diff --git a/cloudinit/DataSource.py b/cloudinit/DataSource.py
index 21404ecc..43f66eff 100644
--- a/cloudinit/DataSource.py
+++ b/cloudinit/DataSource.py
@@ -22,17 +22,22 @@ DEP_NETWORK = "NETWORK"
 
 import UserDataHandler as ud
 
+log = None
+def setlog(log_in=None, name="DataSource"):
+    log = log_in
+    if log is None:
+        class NullHandler(logging.Handler):
+            def emit(self,record): pass
+        log = logging.getLogger(name)
+        log.addHandler(NullHandler())
+
 class DataSource:
     userdata = None
     metadata = None
     userdata_raw = None
-    log = None
 
-    def __init__(self, log=None):
-        if not log:
-            import logging
-            log = logging.log
-        self.log = log
+    def __init__(self):
+        pass
 
     def get_userdata(self):
         if self.userdata == None:
diff --git a/cloudinit/DataSourceEc2.py b/cloudinit/DataSourceEc2.py
index 183c57b8..eb0036a5 100644
--- a/cloudinit/DataSourceEc2.py
+++ b/cloudinit/DataSourceEc2.py
@@ -17,6 +17,7 @@
 #    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 import DataSource
+log = DataSource.log
 
 from cloudinit import seeddir
 import cloudinit.util as util
@@ -40,7 +41,7 @@ class DataSourceEc2(DataSource.DataSource):
         if util.read_optional_seed(seedret,base=self.seeddir+ "/"):
             self.userdata_raw = seedret['user-data']
             self.metadata = seedret['meta-data']
-            self.log.debug("using seeded ec2 data in %s" % self.seeddir)
+            log.debug("using seeded ec2 data in %s" % self.seeddir)
             return True
         
         try:
@@ -102,13 +103,13 @@ class DataSourceEc2(DataSource.DataSource):
                 reason = "url error [%s]" % e.reason
     
             if x == 0:
-                self.log.warning("waiting for metadata service at %s\n" % url)
+                log.warning("waiting for metadata service at %s\n" % url)
 
-            self.log.warning("  %s [%02s/%s]: %s\n" %
+            log.warning("  %s [%02s/%s]: %s\n" %
                 (time.strftime("%H:%M:%S",time.gmtime()), x+1, sleeps, reason))
             time.sleep(sleeptime)
 
-        self.log.critical("giving up on md after %i seconds\n" %
+        log.critical("giving up on md after %i seconds\n" %
                   int(time.time()-starttime))
         return False
 
@@ -128,7 +129,7 @@ class DataSourceEc2(DataSource.DataSource):
             if entname == "ephemeral" and name == "ephemeral0":
                 found = device
         if found == None:
-            self.log.warn("unable to convert %s to a device" % name)
+            log.warn("unable to convert %s to a device" % name)
             return None
 
         # LP: #611137
@@ -151,7 +152,7 @@ class DataSourceEc2(DataSource.DataSource):
             for nto in tlist:
                 cand = "/dev/%s%s" % (nto, short[len(nfrom):])
                 if os.path.exists(cand):
-                    self.log.debug("remapped device name %s => %s" % (found,cand))
+                    log.debug("remapped device name %s => %s" % (found,cand))
                     return(cand)
         return ofound
 
diff --git a/cloudinit/DataSourceNoCloud.py b/cloudinit/DataSourceNoCloud.py
index 4cbbeded..5aebb50f 100644
--- a/cloudinit/DataSourceNoCloud.py
+++ b/cloudinit/DataSourceNoCloud.py
@@ -17,6 +17,7 @@
 #    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 import DataSource
+log = DataSource.log
 
 from cloudinit import seeddir
 import cloudinit.util as util
@@ -54,7 +55,7 @@ class DataSourceNoCloud(DataSource.DataSource):
             if parse_cmdline_data(self.cmdline_id, md):
                 found.append("cmdline")
         except:
-            util.logexc(self.log,util.WARN)
+            util.logexc(log)
             return False
 
         # check to see if the seeddir has data.
@@ -63,7 +64,7 @@ class DataSourceNoCloud(DataSource.DataSource):
             md = util.mergedict(md,seedret['meta-data'])
             ud = seedret['user-data']
             found.append(self.seeddir)
-            self.log.debug("using seeded cache data in %s" % self.seeddir)
+            log.debug("using seeded cache data in %s" % self.seeddir)
 
         # there was no indication on kernel cmdline or data
         # in the seeddir suggesting this handler should be used.
@@ -80,14 +81,14 @@ class DataSourceNoCloud(DataSource.DataSource):
                     seedfound=proto
                     break
             if not seedfound:
-                self.log.debug("seed from %s not supported by %s" %
+                log.debug("seed from %s not supported by %s" %
                     (seedfrom, self.__class__))
                 return False
 
             # this could throw errors, but the user told us to do it
             # so if errors are raised, let them raise
             (md_seed,ud) = util.read_seeded(seedfrom)
-            self.log.debug("using seeded cache data from %s" % seedfrom)
+            log.debug("using seeded cache data from %s" % seedfrom)
 
             # values in the command line override those from the seed
             md = util.mergedict(md,md_seed)
diff --git a/cloudinit/DataSourceOVF.py b/cloudinit/DataSourceOVF.py
index 31d0c407..a126c8bd 100644
--- a/cloudinit/DataSourceOVF.py
+++ b/cloudinit/DataSourceOVF.py
@@ -87,12 +87,12 @@ class DataSourceOVF(DataSource.DataSource):
                     seedfound = proto
                     break
             if not seedfound:
-                self.log.debug("seed from %s not supported by %s" %
+                log.debug("seed from %s not supported by %s" %
                     (seedfrom, self.__class__))
                 return False
 
             (md_seed,ud) = util.read_seeded(seedfrom)
-            self.log.debug("using seeded cache data from %s" % seedfrom)
+            log.debug("using seeded cache data from %s" % seedfrom)
 
             md = util.mergedict(md,md_seed)
             found.append(seedfrom)
diff --git a/cloudinit/__init__.py b/cloudinit/__init__.py
index 7406e19f..47e4e10a 100644
--- a/cloudinit/__init__.py
+++ b/cloudinit/__init__.py
@@ -102,6 +102,7 @@ def logging_set_from_cfg(cfg):
 
 
 import DataSource
+DataSource.setlog(log)
 import UserDataHandler
 
 class CloudInit:
@@ -190,7 +191,7 @@ class CloudInit:
         for cls in dslist:
             ds = cls.__name__
             try:
-                s = cls(log)
+                s = cls()
                 if s.get_data():
                     self.datasource = s
                     self.datasource_name = ds
-- 
cgit v1.2.3