Support default udev GCE PD device path

The expected GCE PD device name is google-{name of disk}. This is
because standard GCE images contain a udev rules file which renames
the GCE PD device to google-{name of disk} https://github.com/GoogleCloudPlatform/compute-image-packages/blob/master/google-startup-scripts/lib/udev/rules.d/65-gce-disk-naming.rules. In custome images which do not have that udev rules file
the device gets the default rules apply http://cgit.freedesktop.org/systemd/systemd/tree/rules/60-persistent-storage.rules
and the GCE PD device ends up with a name which looks like scsi-0Google_PersistentDisk_{name of disk}
This patch adds support for that scenario.

Signed-off-by: Sami Wagiaalla <swagiaal@redhat.com>
pull/6/head
Sami Wagiaalla 2015-05-06 13:40:18 -04:00
parent a6b8b2ef59
commit a85451addc
1 changed files with 22 additions and 7 deletions

View File

@ -42,19 +42,34 @@ func (util *GCEDiskUtil) AttachAndMountDisk(pd *gcePersistentDisk, globalPDPath
if err := gce.(*gce_cloud.GCECloud).AttachDisk(pd.pdName, pd.readOnly); err != nil {
return err
}
devicePath := path.Join("/dev/disk/by-id/", "google-"+pd.pdName)
devicePaths := []string{
path.Join("/dev/disk/by-id/", "google-"+pd.pdName),
path.Join("/dev/disk/by-id/", "scsi-0Google_PersistentDisk_"+pd.pdName),
}
if pd.partition != "" {
devicePath = devicePath + "-part" + pd.partition
for i, path := range devicePaths {
devicePaths[i] = path + "-part" + pd.partition
}
}
//TODO(jonesdl) There should probably be better method than busy-waiting here.
numTries := 0
devicePath := ""
// Wait for the disk device to be created
for {
_, err := os.Stat(devicePath)
if err == nil {
break
for _, path := range devicePaths {
_, err := os.Stat(path)
if err == nil {
devicePath = path
break
}
if err != nil && !os.IsNotExist(err) {
return err
}
}
if err != nil && !os.IsNotExist(err) {
return err
if devicePath != "" {
break
}
numTries++
if numTries == 10 {