Merge branch 'stable-2.14' into stable-2.15
authorKlaus Aehlig <aehlig@google.com>
Thu, 12 Nov 2015 10:45:16 +0000 (11:45 +0100)
committerKlaus Aehlig <aehlig@google.com>
Thu, 12 Nov 2015 10:52:25 +0000 (11:52 +0100)
* stable-2.14
  Fix faulty iallocator type check
  Improve cfgupgrade output in case of errors

* stable-2.13
  Extend timeout for gnt-cluster renew-crypto
  Reduce flakyness of GetCmdline test on slow machines
  Remove duplicated words

* stable-2.12
  Revert "Also consider connection time out a network error"
  Clone lists before modifying
  Make lockConfig call retryable
  Return the correct error code in the post-upgrade script
  Make openssl refrain from DH altogether
  Fix upgrades of instances with missing creation time

* stable-2.11
  (no changes)

* stable-2.10
  Remove -X from hspace man page
  Make htools tolerate missing "dtotal" and "dfree" on luxi

Signed-off-by: Klaus Aehlig <aehlig@google.com>
Reviewed-by: Lisa Velden <velden@google.com>

1  2 
lib/tools/cfgupgrade.py
src/Ganeti/Constants.hs

diff --combined lib/tools/cfgupgrade.py
@@@ -1,7 -1,7 +1,7 @@@
  #
  #
  
 -# Copyright (C) 2007, 2008, 2009, 2010, 2011, 2012, 2013 Google Inc.
 +# Copyright (C) 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015 Google Inc.
  # All rights reserved.
  #
  # Redistribution and use in source and binary forms, with or without
@@@ -59,11 -59,11 +59,11 @@@ from ganeti.utils import versio
  #: Target major version we will upgrade to
  TARGET_MAJOR = 2
  #: Target minor version we will upgrade to
 -TARGET_MINOR = 14
 +TARGET_MINOR = 15
  #: Target major version for downgrade
  DOWNGRADE_MAJOR = 2
  #: Target minor version for downgrade
 -DOWNGRADE_MINOR = 13
 +DOWNGRADE_MINOR = 14
  
  # map of legacy device types
  # (mapping differing old LD_* constants to new DT_* constants)
@@@ -115,7 -115,7 +115,7 @@@ def OrFail(description=None)
          f(self)
        except BaseException, e:
          msg = "%s failed:\n%s" % (description or f.func_name, e)
-         logging.error(msg)
+         logging.exception(msg)
          self.config_data = safety
          self.errors.append(msg)
      return wrapped
@@@ -183,12 -183,12 +183,12 @@@ class CfgUpgrade(object)
        self._Downgrade(config_major, config_minor, config_version,
                        config_revision)
  
 -    # Upgrade from 2.{0..13} to 2.14
 -    elif config_major == 2 and config_minor in range(0, 14):
 +    # Upgrade from 2.{0..14} to 2.15
 +    elif config_major == 2 and config_minor in range(0, 15):
        if config_revision != 0:
          logging.warning("Config revision is %s, not 0", config_revision)
        if not self.UpgradeAll():
-         raise Error("Upgrade failed:\n%s", '\n'.join(self.errors))
+         raise Error("Upgrade failed:\n%s" % '\n'.join(self.errors))
  
      elif config_major == TARGET_MAJOR and config_minor == TARGET_MINOR:
        logging.info("No changes necessary")
        for disk in iobj["disks"]:
          duuid = disk["uuid"]
          disk["serial_no"] = 1
-         disk["ctime"] = disk["mtime"] = iobj["ctime"]
+         # Instances may not have the ctime value, and the Haskell serialization
+         # will have set it to zero.
+         disk["ctime"] = disk["mtime"] = iobj.get("ctime", 0)
          self.config_data["disks"][duuid] = disk
          disk_uuids.append(duuid)
        iobj["disks"] = disk_uuids
  
    # DOWNGRADE ------------------------------------------------------------
  
 -  def _RecursiveRemoveNodes(self, disk):
 -    if "nodes" in disk:
 -      del disk["nodes"]
 -    for disk in disk.get("children", []):
 -      self._RecursiveRemoveNodes(disk)
 -
 -  @OrFail("Downgrading disk nodes")
 -  def DowngradeDiskNodes(self):
 -    if "disks" not in self.config_data:
 -      raise Error("Can't find the 'disks' dictionary in the configuration.")
 -    for disk in self.config_data["disks"].itervalues():
 -      self._RecursiveRemoveNodes(disk)
 -
 -  @OrFail("Removing forthcoming instances")
 -  def DowngradeForthcomingInstances(self):
 -    if "instances" not in self.config_data:
 -      raise Error("Can't find the 'instances' dictionary in the configuration.")
 -    instances = self.config_data["instances"]
 -    uuids = instances.keys()
 -    for uuid in uuids:
 -      if instances[uuid].get("forthcoming"):
 -        del instances[uuid]
 +  @classmethod
 +  def DowngradeCollectors(cls, collectors):
 +    if constants.DATA_COLLECTOR_XEN_CPU_LOAD in collectors:
 +      del collectors[constants.DATA_COLLECTOR_XEN_CPU_LOAD]
  
 -  @OrFail("Removing forthcoming disks")
 -  def DowngradeForthcomingDisks(self):
 -    if "instances" not in self.config_data:
 -      raise Error("Can't find the 'instances' dictionary in the configuration.")
 -    instances = self.config_data["instances"]
 -    if "disks" not in self.config_data:
 -      raise Error("Can't find the 'disks' dictionary in the configuration.")
 -    disks = self.config_data["disks"]
 -    uuids = disks.keys()
 -    for uuid in uuids:
 -      if disks[uuid].get("forthcoming"):
 -        del disks[uuid]
 -        for inst in instances:
 -          if "disk" in inst and uuid in inst["disks"]:
 -            inst["disks"].remove(uuid)
 -
 -  @OrFail("Re-adding disk template")
 -  def DowngradeDiskTemplate(self):
 -    if "instances" not in self.config_data:
 -      raise Error("Can't find the 'instances' dictionary in the configuration.")
 -    instances = self.config_data["instances"]
 -    if "disks" not in self.config_data:
 -      raise Error("Can't find the 'disks' dictionary in the configuration.")
 -    disks = self.config_data["disks"]
 -    for inst in instances.values():
 -      instance_disks = [disks.get(uuid) for uuid in inst["disks"]]
 -      if any(d is None for d in instance_disks):
 -        raise Error("Can't find all disks of instance %s in the configuration."
 -                    % inst.name)
 -      dev_types = set(d["dev_type"] for d in instance_disks)
 -      if len(dev_types) > 1:
 -        raise Error("Instance %s has mixed disk types: %s" %
 -                    (inst.name, ', '.join(dev_types)))
 -      elif len(dev_types) < 1:
 -        inst["disk_template"] = constants.DT_DISKLESS
 -      else:
 -        inst["disk_template"] = dev_types.pop()
 +  def DowngradeCluster(self, cluster):
 +    self.DowngradeCollectors(cluster["data_collectors"])
  
    def DowngradeAll(self):
 +    self.DowngradeCluster(self.config_data["cluster"])
      self.config_data["version"] = version.BuildVersion(DOWNGRADE_MAJOR,
                                                         DOWNGRADE_MINOR, 0)
 -    steps = [self.DowngradeForthcomingInstances,
 -             self.DowngradeForthcomingDisks,
 -             self.DowngradeDiskNodes,
 -             self.DowngradeDiskTemplate]
 -    for s in steps:
 -      s()
 -    return not self.errors
 +    return True
  
    def _ComposePaths(self):
      # We need to keep filenames locally because they might be renamed between
diff --combined src/Ganeti/Constants.hs
@@@ -600,7 -600,7 +600,7 @@@ rsaKeyBits = 204
  -- after it's been removed. Use the "openssl" utility to check the
  -- allowed ciphers, e.g.  "openssl ciphers -v HIGH:-DES".
  opensslCiphers :: String
- opensslCiphers = "HIGH:-DES:-3DES:-EXPORT:-ADH"
+ opensslCiphers = "HIGH:-DES:-3DES:-EXPORT:-DH"
  
  -- * X509
  
@@@ -4828,16 -4828,6 +4828,16 @@@ cpuavgloadBufferSize = 15
  cpuavgloadWindowSize :: Int
  cpuavgloadWindowSize = 600
  
 +-- * Xen cpu load collector
 +
 +xentopCommand :: String
 +xentopCommand = "xentop"
 +
 +-- | Minimal observation time in seconds, the xen cpu load collector
 +-- can report load averages for the first time.
 +xentopAverageThreshold :: Int
 +xentopAverageThreshold = 100
 +
  -- * Monitoring daemon
  
  -- | Mond's variable for periodical data collection
@@@ -5327,9 -5317,6 +5327,9 @@@ ipv4NetworkMaxSize = 3
  dataCollectorCPULoad    :: String
  dataCollectorCPULoad    = "cpu-avg-load"
  
 +dataCollectorXenCpuLoad :: String
 +dataCollectorXenCpuLoad = "xen-cpu-avg-load"
 +
  dataCollectorDiskStats  :: String
  dataCollectorDiskStats  = "diskstats"
  
@@@ -5352,7 -5339,6 +5352,7 @@@ dataCollectorNames 
                        , dataCollectorDrbd
                        , dataCollectorLv
                        , dataCollectorInstStatus
 +                      , dataCollectorXenCpuLoad
                        ]
  
  dataCollectorStateActive :: String