X-Git-Url: https://code.grnet.gr/git/ganeti-local/blobdiff_plain/b60ae2caf73e26977632ed6ebbcb76b5fa8c493e..7890681c2f6b35d9ed10eac27beadb0f63c931db:/lib/objects.py diff --git a/lib/objects.py b/lib/objects.py index c3f0b46..8ab388f 100644 --- a/lib/objects.py +++ b/lib/objects.py @@ -1,4 +1,4 @@ -#!/usr/bin/python +# # # Copyright (C) 2006, 2007 Google Inc. @@ -27,7 +27,6 @@ pass to and from external parties. """ -import simplejson import ConfigParser import re from cStringIO import StringIO @@ -40,14 +39,6 @@ __all__ = ["ConfigObject", "ConfigData", "NIC", "Disk", "Instance", "OS", "Node", "Cluster"] -# Check whether the simplejson module supports indentation -_JSON_INDENT = 2 -try: - simplejson.dumps(1, indent=_JSON_INDENT) -except TypeError: - _JSON_INDENT = None - - class ConfigObject(object): """A generic config object. @@ -90,34 +81,6 @@ class ConfigObject(object): if name in self.__slots__: setattr(self, name, state[name]) - def Dump(self, fobj): - """Dump to a file object. - - """ - data = self.ToDict() - if _JSON_INDENT is None: - simplejson.dump(data, fobj) - else: - simplejson.dump(data, fobj, indent=_JSON_INDENT) - - @classmethod - def Load(cls, fobj): - """Load data from the given stream. - - """ - return cls.FromDict(simplejson.load(fobj)) - - def Dumps(self): - """Dump and return the string representation.""" - buf = StringIO() - self.Dump(buf) - return buf.getvalue() - - @classmethod - def Loads(cls, data): - """Load data from a string.""" - return cls.Load(StringIO(data)) - def ToDict(self): """Convert to a dict holding only standard python types. @@ -314,15 +277,45 @@ class Disk(ConfigObject): def CreateOnSecondary(self): """Test if this device needs to be created on a secondary node.""" - return self.dev_type in ("drbd", "lvm") + return self.dev_type in (constants.LD_DRBD7, constants.LD_DRBD8, + constants.LD_LV) def AssembleOnSecondary(self): """Test if this device needs to be assembled on a secondary node.""" - return self.dev_type in ("drbd", "lvm") + return self.dev_type in (constants.LD_DRBD7, constants.LD_DRBD8, + constants.LD_LV) def OpenOnSecondary(self): """Test if this device needs to be opened on a secondary node.""" - return self.dev_type in ("lvm",) + return self.dev_type in (constants.LD_LV,) + + def StaticDevPath(self): + """Return the device path if this device type has a static one. + + Some devices (LVM for example) live always at the same /dev/ path, + irrespective of their status. For such devices, we return this + path, for others we return None. + + """ + if self.dev_type == constants.LD_LV: + return "/dev/%s/%s" % (self.logical_id[0], self.logical_id[1]) + return None + + def ChildrenNeeded(self): + """Compute the needed number of children for activation. + + This method will return either -1 (all children) or a positive + number denoting the minimum number of children needed for + activation (only mirrored devices will usually return >=0). + + Currently, only DRBD8 supports diskless activation (therefore we + return 0), for all other we keep the previous semantics and return + -1. + + """ + if self.dev_type == constants.LD_DRBD8: + return 0 + return -1 def GetNodes(self, node): """This function returns the nodes this device lives on. @@ -333,9 +326,9 @@ class Disk(ConfigObject): devices needs to (or can) be assembled. """ - if self.dev_type == "lvm" or self.dev_type == "md_raid1": + if self.dev_type == constants.LD_LV or self.dev_type == constants.LD_MD_R1: result = [node] - elif self.dev_type == "drbd": + elif self.dev_type in constants.LDS_DRBD: result = [self.logical_id[0], self.logical_id[1]] if node not in result: raise errors.ConfigurationError("DRBD device passed unknown node") @@ -410,6 +403,43 @@ class Disk(ConfigObject): obj.physical_id = tuple(obj.physical_id) return obj + def __str__(self): + """Custom str() formatter for disks. + + """ + if self.dev_type == constants.LD_LV: + val = "