From f3b25e68ac6d28cdacf7408c91da6e9a215ad1e6 Mon Sep 17 00:00:00 2001
From: Scott Moser <smoser@ubuntu.com>
Date: Mon, 4 Feb 2013 22:23:42 -0500
Subject: make config of nocloud datasource able to specify meta-data and
 user-data

LP: #1115833
---
 cloudinit/sources/DataSourceNoCloud.py    | 72 ++++++++++++++++++-------------
 doc/examples/cloud-config-datasources.txt | 11 +++++
 2 files changed, 52 insertions(+), 31 deletions(-)

diff --git a/cloudinit/sources/DataSourceNoCloud.py b/cloudinit/sources/DataSourceNoCloud.py
index bed500a2..d8484437 100644
--- a/cloudinit/sources/DataSourceNoCloud.py
+++ b/cloudinit/sources/DataSourceNoCloud.py
@@ -77,37 +77,47 @@ class DataSourceNoCloud(sources.DataSource):
             found.append("ds_config")
             md["seedfrom"] = self.ds_cfg['seedfrom']
 
-        fslist = util.find_devs_with("TYPE=vfat")
-        fslist.extend(util.find_devs_with("TYPE=iso9660"))
-
-        label_list = util.find_devs_with("LABEL=cidata")
-        devlist = list(set(fslist) & set(label_list))
-        devlist.sort(reverse=True)
-
-        for dev in devlist:
-            try:
-                LOG.debug("Attempting to use data from %s", dev)
-
-                (newmd, newud) = util.mount_cb(dev, util.read_seeded)
-                md = util.mergedict(newmd, md)
-                ud = newud
-
-                # For seed from a device, the default mode is 'net'.
-                # that is more likely to be what is desired.
-                # If they want dsmode of local, then they must
-                # specify that.
-                if 'dsmode' not in md:
-                    md['dsmode'] = "net"
-
-                LOG.debug("Using data from %s", dev)
-                found.append(dev)
-                break
-            except OSError as e:
-                if e.errno != errno.ENOENT:
-                    raise
-            except util.MountFailedError:
-                util.logexc(LOG, ("Failed to mount %s"
-                                  " when looking for data"), dev)
+        # if ds_cfg has 'user-data' and 'meta-data'
+        if 'user-data' in self.ds_cfg and 'meta-data' in self.ds_cfg:
+            if self.ds_cfg['user-data']:
+                ud = util.mergedict(md, self.ds_cfg['user-data'])
+            if self.ds_cfg['meta-data'] is not False:
+                md = util.mergedict(md, self.ds_cfg['meta-data'])
+            if 'ds_config' not in found:
+                found.append("ds_config")
+
+        if self.ds_cfg.get('fs_label', "cidata"):
+            fslist = util.find_devs_with("TYPE=vfat")
+            fslist.extend(util.find_devs_with("TYPE=iso9660"))
+
+            label = self.ds_cfg.get('fs_label')
+            label_list = util.find_devs_with("LABEL=%s" % label)
+            devlist = list(set(fslist) & set(label_list))
+            devlist.sort(reverse=True)
+
+            for dev in devlist:
+                try:
+                    LOG.debug("Attempting to use data from %s", dev)
+
+                    (newmd, newud) = util.mount_cb(dev, util.read_seeded)
+                    md = util.mergedict(newmd, md)
+                    ud = newud
+
+                    # For seed from a device, the default mode is 'net'.
+                    # that is more likely to be what is desired.  If they want
+                    # dsmode of local, then they must specify that.
+                    if 'dsmode' not in md:
+                        md['dsmode'] = "net"
+
+                    LOG.debug("Using data from %s", dev)
+                    found.append(dev)
+                    break
+                except OSError as e:
+                    if e.errno != errno.ENOENT:
+                        raise
+                except util.MountFailedError:
+                    util.logexc(LOG, ("Failed to mount %s"
+                                      " when looking for data"), dev)
 
         # There was no indication on kernel cmdline or data
         # in the seeddir suggesting this handler should be used.
diff --git a/doc/examples/cloud-config-datasources.txt b/doc/examples/cloud-config-datasources.txt
index d10dde05..fc8c22d4 100644
--- a/doc/examples/cloud-config-datasources.txt
+++ b/doc/examples/cloud-config-datasources.txt
@@ -31,3 +31,14 @@ datasource:
     #    <url>/user-data and <url>/meta-data
     # seedfrom: http://my.example.com/i-abcde
     seedfrom: None
+
+    # fs_label: the label on filesystems to be searched for NoCloud source
+    fs_label: cidata
+
+    # these are optional, but allow you to basically provide a datasource
+    # right here
+    user-data: |
+       # This is the user-data verbatum
+    meta-data:
+       instance-id: i-87018aed
+       local-hostname: myhost.internal
-- 
cgit v1.2.3