Commit 702c3270 authored by Dimitris Aragiorgis's avatar Dimitris Aragiorgis Committed by Klaus Aehlig

Make disk.name and disk.uuid available in bdev

Until now Disk name and uuid was not available on bdev level.
In case of ExtStorage, this info is useful, and may be for other
templates in the future too.

This patch treats the name and uuid object slots just like the size
one and passes them to BlockDev.__init__() and to BlockDev.Create().

The ExtStrorage interface exports these options to scripts via the
VOL_CNAME and VOL_UUID environment variables.

This fixes Issue 696.
Signed-off-by: default avatarDimitris Aragiorgis <dimara@grnet.gr>
Signed-off-by: default avatarKlaus Aehlig <aehlig@google.com>
Reviewed-by: default avatarKlaus Aehlig <aehlig@google.com>
parent 1ab752c8
...@@ -72,7 +72,8 @@ class BlockDev(object): ...@@ -72,7 +72,8 @@ class BlockDev(object):
after assembly we'll have our correct major/minor. after assembly we'll have our correct major/minor.
""" """
def __init__(self, unique_id, children, size, params, dyn_params): # pylint: disable=W0613
def __init__(self, unique_id, children, size, params, dyn_params, *args):
self._children = children self._children = children
self.dev_path = None self.dev_path = None
self.unique_id = unique_id self.unique_id = unique_id
...@@ -111,7 +112,7 @@ class BlockDev(object): ...@@ -111,7 +112,7 @@ class BlockDev(object):
@classmethod @classmethod
def Create(cls, unique_id, children, size, spindles, params, excl_stor, def Create(cls, unique_id, children, size, spindles, params, excl_stor,
dyn_params): dyn_params, *args):
"""Create the device. """Create the device.
If the device cannot be created, it will return None If the device cannot be created, it will return None
......
...@@ -1205,12 +1205,14 @@ class ExtStorageDevice(base.BlockDev): ...@@ -1205,12 +1205,14 @@ class ExtStorageDevice(base.BlockDev):
handling of the externally provided block devices. handling of the externally provided block devices.
""" """
def __init__(self, unique_id, children, size, params, dyn_params): def __init__(self, unique_id, children, size, params, dyn_params, *args):
"""Attaches to an extstorage block device. """Attaches to an extstorage block device.
""" """
super(ExtStorageDevice, self).__init__(unique_id, children, size, params, super(ExtStorageDevice, self).__init__(unique_id, children, size, params,
dyn_params) dyn_params)
(self.name, self.uuid) = args
if not isinstance(unique_id, (tuple, list)) or len(unique_id) != 2: if not isinstance(unique_id, (tuple, list)) or len(unique_id) != 2:
raise ValueError("Invalid configuration data %s" % str(unique_id)) raise ValueError("Invalid configuration data %s" % str(unique_id))
...@@ -1222,13 +1224,15 @@ class ExtStorageDevice(base.BlockDev): ...@@ -1222,13 +1224,15 @@ class ExtStorageDevice(base.BlockDev):
@classmethod @classmethod
def Create(cls, unique_id, children, size, spindles, params, excl_stor, def Create(cls, unique_id, children, size, spindles, params, excl_stor,
dyn_params): dyn_params, *args):
"""Create a new extstorage device. """Create a new extstorage device.
Provision a new volume using an extstorage provider, which will Provision a new volume using an extstorage provider, which will
then be mapped to a block device. then be mapped to a block device.
""" """
(name, uuid) = args
if not isinstance(unique_id, (tuple, list)) or len(unique_id) != 2: if not isinstance(unique_id, (tuple, list)) or len(unique_id) != 2:
raise errors.ProgrammerError("Invalid configuration data %s" % raise errors.ProgrammerError("Invalid configuration data %s" %
str(unique_id)) str(unique_id))
...@@ -1239,7 +1243,7 @@ class ExtStorageDevice(base.BlockDev): ...@@ -1239,7 +1243,7 @@ class ExtStorageDevice(base.BlockDev):
# Call the External Storage's create script, # Call the External Storage's create script,
# to provision a new Volume inside the External Storage # to provision a new Volume inside the External Storage
_ExtStorageAction(constants.ES_ACTION_CREATE, unique_id, _ExtStorageAction(constants.ES_ACTION_CREATE, unique_id,
params, str(size)) params, size=str(size), name=name, uuid=uuid)
return ExtStorageDevice(unique_id, children, size, params, dyn_params) return ExtStorageDevice(unique_id, children, size, params, dyn_params)
...@@ -1257,7 +1261,7 @@ class ExtStorageDevice(base.BlockDev): ...@@ -1257,7 +1261,7 @@ class ExtStorageDevice(base.BlockDev):
# Call the External Storage's remove script, # Call the External Storage's remove script,
# to remove the Volume from the External Storage # to remove the Volume from the External Storage
_ExtStorageAction(constants.ES_ACTION_REMOVE, self.unique_id, _ExtStorageAction(constants.ES_ACTION_REMOVE, self.unique_id,
self.ext_params) self.ext_params, name=self.name, uuid=self.uuid)
def Rename(self, new_id): def Rename(self, new_id):
"""Rename this device. """Rename this device.
...@@ -1277,7 +1281,8 @@ class ExtStorageDevice(base.BlockDev): ...@@ -1277,7 +1281,8 @@ class ExtStorageDevice(base.BlockDev):
# Call the External Storage's attach script, # Call the External Storage's attach script,
# to attach an existing Volume to a block device under /dev # to attach an existing Volume to a block device under /dev
self.dev_path = _ExtStorageAction(constants.ES_ACTION_ATTACH, self.dev_path = _ExtStorageAction(constants.ES_ACTION_ATTACH,
self.unique_id, self.ext_params) self.unique_id, self.ext_params,
name=self.name, uuid=self.uuid)
try: try:
st = os.stat(self.dev_path) st = os.stat(self.dev_path)
...@@ -1312,7 +1317,7 @@ class ExtStorageDevice(base.BlockDev): ...@@ -1312,7 +1317,7 @@ class ExtStorageDevice(base.BlockDev):
# Call the External Storage's detach script, # Call the External Storage's detach script,
# to detach an existing Volume from it's block device under /dev # to detach an existing Volume from it's block device under /dev
_ExtStorageAction(constants.ES_ACTION_DETACH, self.unique_id, _ExtStorageAction(constants.ES_ACTION_DETACH, self.unique_id,
self.ext_params) self.ext_params, name=self.name, uuid=self.uuid)
self.minor = None self.minor = None
self.dev_path = None self.dev_path = None
...@@ -1353,7 +1358,8 @@ class ExtStorageDevice(base.BlockDev): ...@@ -1353,7 +1358,8 @@ class ExtStorageDevice(base.BlockDev):
# Call the External Storage's grow script, # Call the External Storage's grow script,
# to grow an existing Volume inside the External Storage # to grow an existing Volume inside the External Storage
_ExtStorageAction(constants.ES_ACTION_GROW, self.unique_id, _ExtStorageAction(constants.ES_ACTION_GROW, self.unique_id,
self.ext_params, str(self.size), grow=str(new_size)) self.ext_params, size=str(self.size), grow=str(new_size),
name=self.name, uuid=self.uuid)
def SetInfo(self, text): def SetInfo(self, text):
"""Update metadata with info text. """Update metadata with info text.
...@@ -1369,11 +1375,13 @@ class ExtStorageDevice(base.BlockDev): ...@@ -1369,11 +1375,13 @@ class ExtStorageDevice(base.BlockDev):
# Call the External Storage's setinfo script, # Call the External Storage's setinfo script,
# to set metadata for an existing Volume inside the External Storage # to set metadata for an existing Volume inside the External Storage
_ExtStorageAction(constants.ES_ACTION_SETINFO, self.unique_id, _ExtStorageAction(constants.ES_ACTION_SETINFO, self.unique_id,
self.ext_params, metadata=text) self.ext_params, metadata=text,
name=self.name, uuid=self.uuid)
def _ExtStorageAction(action, unique_id, ext_params, def _ExtStorageAction(action, unique_id, ext_params,
size=None, grow=None, metadata=None): size=None, grow=None, metadata=None,
name=None, uuid=None):
"""Take an External Storage action. """Take an External Storage action.
Take an External Storage action concerning or affecting Take an External Storage action concerning or affecting
...@@ -1393,6 +1401,10 @@ def _ExtStorageAction(action, unique_id, ext_params, ...@@ -1393,6 +1401,10 @@ def _ExtStorageAction(action, unique_id, ext_params,
@param grow: the new size in mebibytes (after grow) @param grow: the new size in mebibytes (after grow)
@type metadata: string @type metadata: string
@param metadata: metadata info of the Volume, for use by the provider @param metadata: metadata info of the Volume, for use by the provider
@type name: string
@param name: name of the Volume (objects.Disk.name)
@type uuid: string
@param uuid: uuid of the Volume (objects.Disk.uuid)
@rtype: None or a block device path (during attach) @rtype: None or a block device path (during attach)
""" """
...@@ -1405,7 +1417,7 @@ def _ExtStorageAction(action, unique_id, ext_params, ...@@ -1405,7 +1417,7 @@ def _ExtStorageAction(action, unique_id, ext_params,
# Create the basic environment for the driver's scripts # Create the basic environment for the driver's scripts
create_env = _ExtStorageEnvironment(unique_id, ext_params, size, create_env = _ExtStorageEnvironment(unique_id, ext_params, size,
grow, metadata) grow, metadata, name, uuid)
# Do not use log file for action `attach' as we need # Do not use log file for action `attach' as we need
# to get the output from RunResult # to get the output from RunResult
...@@ -1522,7 +1534,8 @@ def ExtStorageFromDisk(name, base_dir=None): ...@@ -1522,7 +1534,8 @@ def ExtStorageFromDisk(name, base_dir=None):
def _ExtStorageEnvironment(unique_id, ext_params, def _ExtStorageEnvironment(unique_id, ext_params,
size=None, grow=None, metadata=None): size=None, grow=None, metadata=None,
name=None, uuid=None):
"""Calculate the environment for an External Storage script. """Calculate the environment for an External Storage script.
@type unique_id: tuple (driver, vol_name) @type unique_id: tuple (driver, vol_name)
...@@ -1535,6 +1548,10 @@ def _ExtStorageEnvironment(unique_id, ext_params, ...@@ -1535,6 +1548,10 @@ def _ExtStorageEnvironment(unique_id, ext_params,
@param grow: new size of Volume after grow (in mebibytes) @param grow: new size of Volume after grow (in mebibytes)
@type metadata: string @type metadata: string
@param metadata: metadata info of the Volume @param metadata: metadata info of the Volume
@type name: string
@param name: name of the Volume (objects.Disk.name)
@type uuid: string
@param uuid: uuid of the Volume (objects.Disk.uuid)
@rtype: dict @rtype: dict
@return: dict of environment variables @return: dict of environment variables
...@@ -1557,6 +1574,12 @@ def _ExtStorageEnvironment(unique_id, ext_params, ...@@ -1557,6 +1574,12 @@ def _ExtStorageEnvironment(unique_id, ext_params,
if metadata is not None: if metadata is not None:
result["VOL_METADATA"] = metadata result["VOL_METADATA"] = metadata
if name is not None:
result["VOL_CNAME"] = name
if uuid is not None:
result["VOL_UUID"] = uuid
return result return result
...@@ -1611,7 +1634,8 @@ def FindDevice(disk, children): ...@@ -1611,7 +1634,8 @@ def FindDevice(disk, children):
""" """
_VerifyDiskType(disk.dev_type) _VerifyDiskType(disk.dev_type)
device = DEV_MAP[disk.dev_type](disk.logical_id, children, disk.size, device = DEV_MAP[disk.dev_type](disk.logical_id, children, disk.size,
disk.params, disk.dynamic_params) disk.params, disk.dynamic_params,
disk.name, disk.uuid)
if not device.attached: if not device.attached:
return None return None
return device return device
...@@ -1633,7 +1657,8 @@ def Assemble(disk, children): ...@@ -1633,7 +1657,8 @@ def Assemble(disk, children):
_VerifyDiskType(disk.dev_type) _VerifyDiskType(disk.dev_type)
_VerifyDiskParams(disk) _VerifyDiskParams(disk)
device = DEV_MAP[disk.dev_type](disk.logical_id, children, disk.size, device = DEV_MAP[disk.dev_type](disk.logical_id, children, disk.size,
disk.params, disk.dynamic_params) disk.params, disk.dynamic_params,
disk.name, disk.uuid)
device.Assemble() device.Assemble()
return device return device
...@@ -1656,7 +1681,8 @@ def Create(disk, children, excl_stor): ...@@ -1656,7 +1681,8 @@ def Create(disk, children, excl_stor):
_VerifyDiskParams(disk) _VerifyDiskParams(disk)
device = DEV_MAP[disk.dev_type].Create(disk.logical_id, children, disk.size, device = DEV_MAP[disk.dev_type].Create(disk.logical_id, children, disk.size,
disk.spindles, disk.params, excl_stor, disk.spindles, disk.params, excl_stor,
disk.dynamic_params) disk.dynamic_params,
disk.name, disk.uuid)
return device return device
# Please keep this at the bottom of the file for visibility. # Please keep this at the bottom of the file for visibility.
......
...@@ -63,6 +63,12 @@ VOL_METADATA ...@@ -63,6 +63,12 @@ VOL_METADATA
metadata to be associated with the volume. Currently, Ganeti sets metadata to be associated with the volume. Currently, Ganeti sets
this value to ``originstname+X`` where ``X`` is the instance's name. this value to ``originstname+X`` where ``X`` is the instance's name.
VOL_CNAME
The name of the Disk config object (optional).
VOL_UUID
The uuid of the Disk config object.
EXECUTABLE SCRIPTS EXECUTABLE SCRIPTS
------------------ ------------------
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment