+
+
+class DevCacheManager(object):
+ """Simple class for managing a chache of block device information.
+
+ """
+ _DEV_PREFIX = "/dev/"
+ _ROOT_DIR = constants.BDEV_CACHE_DIR
+
+ @classmethod
+ def _ConvertPath(cls, dev_path):
+ """Converts a /dev/name path to the cache file name.
+
+ This replaces slashes with underscores and strips the /dev
+ prefix. It then returns the full path to the cache file
+
+ """
+ if dev_path.startswith(cls._DEV_PREFIX):
+ dev_path = dev_path[len(cls._DEV_PREFIX):]
+ dev_path = dev_path.replace("/", "_")
+ fpath = "%s/bdev_%s" % (cls._ROOT_DIR, dev_path)
+ return fpath
+
+ @classmethod
+ def UpdateCache(cls, dev_path, owner, on_primary, iv_name):
+ """Updates the cache information for a given device.
+
+ """
+ if dev_path is None:
+ logger.Error("DevCacheManager.UpdateCache got a None dev_path")
+ return
+ fpath = cls._ConvertPath(dev_path)
+ if on_primary:
+ state = "primary"
+ else:
+ state = "secondary"
+ if iv_name is None:
+ iv_name = "not_visible"
+ fdata = "%s %s %s\n" % (str(owner), state, iv_name)
+ try:
+ utils.WriteFile(fpath, data=fdata)
+ except EnvironmentError, err:
+ logger.Error("Can't update bdev cache for %s, error %s" %
+ (dev_path, str(err)))
+
+ @classmethod
+ def RemoveCache(cls, dev_path):
+ """Remove data for a dev_path.
+
+ """
+ if dev_path is None:
+ logger.Error("DevCacheManager.RemoveCache got a None dev_path")
+ return
+ fpath = cls._ConvertPath(dev_path)
+ try:
+ utils.RemoveFile(fpath)
+ except EnvironmentError, err:
+ logger.Error("Can't update bdev cache for %s, error %s" %
+ (dev_path, str(err)))