From 4846bff62e1a5e8f4edd216f900c27c55a319c5b Mon Sep 17 00:00:00 2001
From: Scott Moser <smoser@ubuntu.com>
Date: Fri, 4 Oct 2013 16:16:12 -0400
Subject: simplifications and some function renames

---
 cloudinit/config/cc_disk_setup.py | 50 ++++++++--------------------------
 cloudinit/util.py                 | 57 +++++++++------------------------------
 2 files changed, 24 insertions(+), 83 deletions(-)

diff --git a/cloudinit/config/cc_disk_setup.py b/cloudinit/config/cc_disk_setup.py
index 5faffefc..e903dd4d 100644
--- a/cloudinit/config/cc_disk_setup.py
+++ b/cloudinit/config/cc_disk_setup.py
@@ -94,15 +94,6 @@ def update_disk_setup_devices(disk_setup, tformer):
         LOG.debug("updated disk_setup device entry '%s' to '%s'",
                   origname, transformed)
 
-def reset_part_definition(definition, value):
-    if not value and 'partition' in definition:
-        definition['opartition'] = definition['partition']
-        del definition['partition']
-
-    else:
-        definition['partition'] = value
-
-    return definition
 
 def update_fs_setup_devices(disk_setup, tformer):
     # update 'fs_setup' dictionary anywhere were a device may occur
@@ -117,38 +108,19 @@ def update_fs_setup_devices(disk_setup, tformer):
         if origname is None:
             continue
 
-        transformed = None
-        if len(origname.split('.')) == 2:
-            # this maps ephemeralX.Y to a proper disk name. For example,
-            # if the origname is 'ephemeral0.1' and transformed is /dev/sdb
-            # then the returned device will be /dev/sdb1 _if_ /dev/sdb1 exists
-            # otherwise NONE
-            base_name, partition = origname.split('.')
-            tformed = tformer(base_name)
-            LOG.info("base device for %s is %s" % (origname, tformed))
+        (dev, part) = util.expand_dotted_devname(origname)
 
-            if partition == "0":
-                transformed = tformed
-                definition = reset_part_definition(definition, None)
-
-            elif partition in ("auto", "any"):
-                definition = reset_part_definition(definition, partition)
-                transformed = tformed
-
-            else:
-                definition = reset_part_definition(definition, None)
-                transformed = util.map_device_alias(tformed, alias=origname)
-                LOG.info("%s is mapped to %s" % (origname, transformed))
-
-        else:
-            transformed = tformer(origname)
-
-        if transformed is None or transformed == origname:
-            continue
+        tformed = tformer(dev)
+        if tformed is not None:
+            dev = tformed
+            LOG.debug("%s is mapped to disk=%s part=%s",
+                      origname, tformed, part)
+            definition['_origname'] = origname
+            definition['device'] = tformed
 
-        LOG.info("Mapped %s to physical device %s" % (origname, transformed))
-        definition['_origname'] = origname
-        definition['device'] = transformed
+        if part and 'partition' in definition:
+            definition['_partition'] = definition['partition']
+        definition['partition'] = part
 
 
 def value_splitter(values, start=None):
diff --git a/cloudinit/util.py b/cloudinit/util.py
index 34d111e7..f9957c67 100644
--- a/cloudinit/util.py
+++ b/cloudinit/util.py
@@ -1829,62 +1829,33 @@ def log_time(logfunc, msg, func, args=None, kwargs=None, get_uptime=False):
     return ret
 
 
-def map_partition(alias):
-    """
-    Return partition number for devices like ephemeral0.0 or ephemeral0.1
-
-    Parameters:
-        alaias: the alias, i.e. ephemeral0 or swap0
-        device: the actual device to markup
-
-    Rules:
-        - anything after a . is a parittion
-        - device.0 is the same as device
-    """
-
-    if len(alias.split('.')) == 1:
-        return None
-
-    suffix = alias.split('.')[-1]
-    try:
-        if int(suffix) == 0:
-            return None
-        return int(suffix)
-    except ValueError:
-        pass
-
-    return None
+def expand_dotted_devname(dotted):
+    toks = dotted.rsplit(".", 1)
+    if len(toks) > 1:
+        return toks
+    else:
+        return (dotted, None)
 
 
-def map_device_alias(device, partition=None, alias=None):
+def devnode_for_dev_part(device, partition):
     """
     Find the name of the partition. While this might seem rather
     straight forward, its not since some devices are '<device><partition>'
     while others are '<device>p<partition>'. For example, /dev/xvda3 on EC2
     will present as /dev/xvda3p1 for the first partition since /dev/xvda3 is
     a block device.
-
-    The primary use is to map 'ephemeral0.1' in the datasource to a
-    real device name
     """
+    if not os.path.exists(device):
+        return None
 
-    if not device:
-        raise Exception("Device cannot be undefined!")
-
-    if not partition and not alias:
-        raise Exception("partition or alias is required")
-
-    if alias:
-        partition = map_partition(alias)
-
-    # if the partition doesn't map, return the device
     if not partition:
         return device
 
-    short_name = device.split('/')[-1]
+    short_name = os.path.basename(device)
     sys_path = "/sys/block/%s" % short_name
 
     if not os.path.exists(sys_path):
+        LOG.debug("did not find entry for %s in /sys/block", short_name)
         return None
 
     sys_long_path = sys_path + "/" + short_name
@@ -1895,11 +1866,9 @@ def map_device_alias(device, partition=None, alias=None):
         if not os.path.exists(cdisk):
             continue
 
-        dev_path = "/dev/%s" % cdisk.split('/')[-1]
+        dev_path = "/dev/%s" % os.path.basename(cdisk)
         if os.path.exists(dev_path):
             return dev_path
-        else:
-            LOG.warn("Specificed parition %s does not exist on %s" % (
-                     partition, device))
 
+    LOG.debug("Did not fine partition %s for device %s", partition, device)
     return None
-- 
cgit v1.2.3