Merge branch 'stable-2.13' into stable-2.14
authorKlaus Aehlig <aehlig@google.com>
Thu, 14 Jan 2016 17:01:17 +0000 (18:01 +0100)
committerKlaus Aehlig <aehlig@google.com>
Thu, 14 Jan 2016 17:26:07 +0000 (18:26 +0100)
* stable-2.13
  Run ssh-key renewal in debug mode during upgrade

* stable-2.12
  Increase minimal sizes of test online nodes
  Also log the high-level upgrade steps
  Add function to provide logged user feedback
  Run renew-crypto in upgrades in debug mode
  Unconditionally log upgrades at debug level
  Document healthy-majority restriction on master-failover
  Check for healthy majority on master failover with voting
  Add a predicate testing that a majority of nodes is healthy
  Fix outdated comment
  Pass arguments to correct daemons during master-failover
  Fix documentation for master-failover

* stable-2.11
  (no changes)

* stable-2.10
  KVM: explicitly configure routed NICs late

Signed-off-by: Klaus Aehlig <aehlig@google.com>
Reviewed-by: Helga Velroyen <helgav@google.com>

1  2 
lib/backend.py
lib/bootstrap.py
lib/cli.py
lib/client/gnt_cluster.py
lib/hypervisor/hv_kvm/__init__.py
test/hs/Test/Ganeti/HTools/Node.hs

diff --cc lib/backend.py
Simple merge
Simple merge
diff --cc lib/cli.py
Simple merge
@@@ -2179,8 -2187,44 +2187,8 @@@ def _VersionSpecificDowngrade()
  
    @return: True upon success
    """
-   ToStdout("Performing version-specific downgrade tasks.")
+   ToStdoutAndLoginfo("Performing version-specific downgrade tasks.")
  
 -  # Determine if this cluster is set up with SSH handling
 -  # (aka not using --no-ssh-init), check if the public
 -  # keyfile exists.
 -  update_keys = os.path.exists(pathutils.SSH_PUB_KEYS)
 -
 -  if not update_keys:
 -    return True
 -
 -  ToStdout("Replace nodes' SSH keys with the master's keys.")
 -  (_, root_keyfiles) = \
 -    ssh.GetAllUserFiles(constants.SSH_LOGIN_USER, mkdir=False, dircheck=False)
 -
 -  dsa_root_keyfiles = dict((kind, value) for (kind, value)
 -                           in root_keyfiles.items()
 -                           if kind == constants.SSHK_DSA)
 -  master_private_keyfile, master_public_keyfile = \
 -      dsa_root_keyfiles[constants.SSHK_DSA]
 -
 -  nodes = ssconf.SimpleStore().GetOnlineNodeList()
 -  master_node = ssconf.SimpleStore().GetMasterNode()
 -  cluster_name = ssconf.SimpleStore().GetClusterName()
 -
 -  # If master node is in 'nodes', remove it
 -  if master_node in nodes:
 -    nodes.remove(master_node)
 -
 -  srun = ssh.SshRunner(cluster_name=cluster_name)
 -  for name in nodes:
 -    for key_file in [master_private_keyfile, master_public_keyfile]:
 -      command = utils.text.ShellQuoteArgs([
 -          "scp", key_file, "%s:%s" % (name, key_file)])
 -      result = srun.Run(master_node, constants.SSH_LOGIN_USER, command)
 -      if result.exit_code != 0:
 -        ToStderr("Overiding SSH key '%s' of node '%s' failed. You might"
 -                 " want to clean up manually." % (key_file, name))
 -
    return True
  
  
Simple merge
@@@ -114,33 -113,11 +114,33 @@@ genOnlineNode :: Gen Node.Nod
  genOnlineNode =
    arbitrary `suchThat` (\n -> not (Node.offline n) &&
                                not (Node.failN1 n) &&
-                               Node.availDisk n > 0 &&
-                               Node.availMem n > 0 &&
-                               Node.availCpu n > 0 &&
-                               Node.tSpindles n > 0)
+                               Node.availDisk n > 2 * Types.unitDsk &&
+                               Node.availMem n > 2 * Types.unitMem &&
+                               Node.availCpu n > 2 &&
+                               Node.tSpindles n > 2)
  
 +-- | Helper function to generate a sane empty node with consistent
 +-- internal data.
 +genEmptyOnlineNode :: Gen Node.Node
 +genEmptyOnlineNode =
 +  (do node <- arbitrary
 +      let fmem = truncate (Node.tMem node) - Node.nMem node
 +      let node' = node { Node.offline = False
 +                       , Node.fMem = fmem
 +                       , Node.fMemForth = fmem
 +                       , Node.pMem = fromIntegral fmem / Node.tMem node
 +                       , Node.pMemForth = fromIntegral fmem / Node.tMem node
 +                       , Node.rMem = 0
 +                       , Node.rMemForth = 0
 +                       , Node.pRem = 0
 +                       , Node.pRemForth = 0
 +                       }
 +      return node') `suchThat` (\ n -> not (Node.failN1 n) &&
 +                                       Node.availDisk n > 0 &&
 +                                       Node.availMem n > 0 &&
 +                                       Node.availCpu n > 0 &&
 +                                       Node.tSpindles n > 0)
 +
  -- | Generate a node with exclusive storage enabled.
  genExclStorNode :: Gen Node.Node
  genExclStorNode = do