LGTM, thanks!

On Thu, Dec 19, 2013 at 3:49 PM, Helga Velroyen <[email protected]> wrote:

> This patch adds the certificate of a newly added or
> readded master candidate node to the map of master candidate
> certificates. It removes a master candidate node's certificate
> digest from the candidate certificate map if the node is
> removed from the cluster.
>
> Signed-off-by: Helga Velroyen <[email protected]>
> ---
>  lib/cmdlib/node.py              | 22 ++++++++++++++++++++--
>  test/py/cmdlib/node_unittest.py | 27 ++++++++++++++++++++++++++-
>  2 files changed, 46 insertions(+), 3 deletions(-)
>
> diff --git a/lib/cmdlib/node.py b/lib/cmdlib/node.py
> index 429f21d..09cd9c8 100644
> --- a/lib/cmdlib/node.py
> +++ b/lib/cmdlib/node.py
> @@ -42,7 +42,7 @@ from ganeti.cmdlib.common import CheckParamsNotGlobal, \
>    CheckInstanceState, INSTANCE_DOWN, GetUpdatedParams, \
>    AdjustCandidatePool, CheckIAllocatorOrNode, LoadNodeEvacResult, \
>    GetWantedNodes, MapInstanceLvsToNodes, RunPostHook, \
> -  FindFaultyInstanceDisks, CheckStorageTypeEnabled
> +  FindFaultyInstanceDisks, CheckStorageTypeEnabled,
> AddNodeCertToCandidateCerts
>
>
>  def _DecideSelfPromotion(lu, exceptions=None):
> @@ -414,6 +414,16 @@ class LUNodeAdd(LogicalUnit):
>        self.context.AddNode(self.new_node, self.proc.GetECId())
>        RedistributeAncillaryFiles(self)
>
> +    cluster = self.cfg.GetClusterInfo()
> +    if self.new_node.master_candidate:
> +      AddNodeCertToCandidateCerts(self, self.new_node.uuid, cluster)
> +      self.cfg.Update(cluster, feedback_fn)
> +    else:
> +      if self.new_node.uuid in cluster.candidate_certs:
> +        utils.RemoveNodeFromCandidateCerts(self.new_node.uuid,
> +                                           cluster.candidate_certs)
> +        self.cfg.Update(cluster, feedback_fn)
> +
>
>  class LUNodeSetParams(LogicalUnit):
>    """Modifies the parameters of a node.
> @@ -1473,8 +1483,16 @@ class LUNodeRemove(LogicalUnit):
>        self.LogWarning("Errors encountered on the remote node while
> leaving"
>                        " the cluster: %s", msg)
>
> +    cluster = self.cfg.GetClusterInfo()
> +
> +    # Remove node from candidate certificate list
> +    if self.node.master_candidate:
> +      utils.RemoveNodeFromCandidateCerts(self.node.uuid,
> +                                         cluster.candidate_certs)
> +      self.cfg.Update(cluster, feedback_fn)
> +
>      # Remove node from our /etc/hosts
> -    if self.cfg.GetClusterInfo().modify_etc_hosts:
> +    if cluster.modify_etc_hosts:
>        master_node_uuid = self.cfg.GetMasterNode()
>        result = self.rpc.call_etc_hosts_modify(master_node_uuid,
>                                                constants.ETC_HOSTS_REMOVE,
> diff --git a/test/py/cmdlib/node_unittest.py
> b/test/py/cmdlib/node_unittest.py
> index dc8e124..2a02f9a 100644
> --- a/test/py/cmdlib/node_unittest.py
> +++ b/test/py/cmdlib/node_unittest.py
> @@ -29,7 +29,6 @@ from ganeti import compat
>  from ganeti import constants
>  from ganeti import objects
>  from ganeti import opcodes
> -from ganeti import errors
>
>  from testsupport import *
>
> @@ -81,6 +80,10 @@ class TestLUNodeAdd(CmdlibTestCase):
>      # we can't know the node's UUID in advance, so use defaultdict here
>      self.rpc.call_node_verify.return_value = \
>        defaultdict(lambda: node_verify_result, {})
> +    self.rpc.call_node_crypto_tokens.return_value = \
> +      self.RpcResultsBuilder() \
> +        .CreateSuccessfulNodeResult(self.node_add,
> +            [(constants.CRYPTO_TYPE_SSL, "IA:MA:FA:KE:DI:GE:ST")])
>
>    def testOvsNoLink(self):
>      ndparams = {
> @@ -106,6 +109,28 @@ class TestLUNodeAdd(CmdlibTestCase):
>      self.assertEqual(ndparams[constants.ND_OVS_LINK],
>                       created_node.ndparams.get(constants.ND_OVS_LINK,
> None))
>
> +  def testAddCandidateCert(self):
> +    self.ExecOpCode(self.op_add)
> +
> +    created_node = self.cfg.GetNodeInfoByName(self.op_add.node_name)
> +    cluster = self.cfg.GetClusterInfo()
> +    self.assertTrue(created_node.uuid in cluster.candidate_certs)
> +
> +  def testReAddCandidateCert(self):
> +    cluster = self.cfg.GetClusterInfo()
> +    self.ExecOpCode(self.op_readd)
> +    created_node = self.cfg.GetNodeInfoByName(self.op_readd.node_name)
> +    self.assertTrue(created_node.uuid in cluster.candidate_certs)
> +
> +  def testAddNoCandidateCert(self):
> +    op = self.CopyOpCode(self.op_add,
> +                         master_capable=False)
> +    self.ExecOpCode(op)
> +
> +    created_node = self.cfg.GetNodeInfoByName(self.op_add.node_name)
> +    cluster = self.cfg.GetClusterInfo()
> +    self.assertFalse(created_node.uuid in cluster.candidate_certs)
> +
>    def testWithoutOVS(self):
>      self.ExecOpCode(self.op_add)
>
> --
> 1.8.5.1
>
>

Reply via email to