This patch adds tests for the remaining functionality of LUNodeAdd.

Signed-off-by: Sebastian Gebhard <[email protected]>
---
 test/py/cmdlib/node_unittest.py | 121 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 121 insertions(+)

diff --git a/test/py/cmdlib/node_unittest.py b/test/py/cmdlib/node_unittest.py
index a90d924..1d38eb9 100644
--- a/test/py/cmdlib/node_unittest.py
+++ b/test/py/cmdlib/node_unittest.py
@@ -25,14 +25,22 @@
 
 from collections import defaultdict
 
+from ganeti import compat
 from ganeti import constants
 from ganeti import objects
 from ganeti import opcodes
+from ganeti import errors
 
 from testsupport import *
 
 import testutils
 
+# pylint: disable=W0613
+def _TcpPingFailSecondary(cfg, mock_fct, target, port, timeout=None,
+                          live_port_needed=None, source=None):
+  # This will return True if target is in 192.0.2.0/24 (primary range)
+  # and False if no.
+  return "192.0.2." in target
 
 class TestLUNodeAdd(CmdlibTestCase):
   def setUp(self):
@@ -131,5 +139,118 @@ class TestLUNodeAdd(CmdlibTestCase):
     self.assertEqual(ndparams[constants.ND_OVS_LINK],
                      created_node.ndparams.get(constants.ND_OVS_LINK, None))
 
+  def testReaddingMaster(self):
+    op = opcodes.OpNodeAdd(node_name=self.cfg.GetMasterNodeName(),
+                           readd=True)
+
+    self.ExecOpCodeExpectOpPrereqError(op, "Cannot readd the master node")
+
+  def testReaddNotVmCapableNode(self):
+    self.cfg.AddNewInstance(primary_node=self.node_readd)
+    self.netutils_mod.GetHostname.return_value = \
+      HostnameMock(self.node_readd.name, self.node_readd.primary_ip)
+
+    op = self.CopyOpCode(self.op_readd, vm_capable=False)
+
+    self.ExecOpCodeExpectOpPrereqError(op, "Node .* being re-added with"
+                                       " vm_capable flag set to false, but it"
+                                       " already holds instances")
+
+  def testReaddAndPassNodeGroup(self):
+    op = self.CopyOpCode(self.op_readd,group="groupname")
+
+    self.ExecOpCodeExpectOpPrereqError(op, "Cannot pass a node group when a"
+                                       " node is being readded")
+
+  def testPrimaryIPv6(self):
+    self.master.secondary_ip = self.master.primary_ip
+
+    op = self.CopyOpCode(self.op_add, primary_ip="2001:DB8::1",
+                         secondary_ip=self.REMOVE)
+
+    self.ExecOpCode(op)
+
+  def testInvalidSecondaryIP(self):
+    op = self.CopyOpCode(self.op_add, secondary_ip="333.444.555.777")
+
+    self.ExecOpCodeExpectOpPrereqError(op, "Secondary IP .* needs to be a 
valid"
+                                       " IPv4 address")
+
+  def testNodeAlreadyInCluster(self):
+    op = self.CopyOpCode(self.op_readd, readd=False)
+
+    self.ExecOpCodeExpectOpPrereqError(op, "Node %s is already in the"
+                                       " configuration" % self.node_readd.name)
+
+  def testReaddNodeNotInConfiguration(self):
+    op = self.CopyOpCode(self.op_add, readd=True)
+
+    self.ExecOpCodeExpectOpPrereqError(op, "Node %s is not in the"
+                                       " configuration" % self.node_add.name)
+
+  def testPrimaryIpConflict(self):
+    # In LUNodeAdd, DNS will resolve the node name to an IP address, that is
+    # used to overwrite any given primary_ip value!
+    # Thus we need to mock this DNS resolver here!
+    self.netutils_mod.GetHostname.return_value = \
+      HostnameMock(self.node_add.name, self.node_readd.primary_ip)
+
+    op = self.CopyOpCode(self.op_add)
+
+    self.ExecOpCodeExpectOpPrereqError(op, "New node ip address.* conflict 
with"
+                                       " existing node")
+
+  def testSecondaryIpConflict(self):
+    op = self.CopyOpCode(self.op_add, 
secondary_ip=self.node_readd.secondary_ip)
+
+    self.ExecOpCodeExpectOpPrereqError(op, "New node ip address.* conflict 
with"
+                                       " existing node")
+
+  def testReaddWithDifferentIP(self):
+    op = self.CopyOpCode(self.op_readd, primary_ip="192.0.2.100",
+                         secondary_ip="230.0.113.100")
+
+    self.ExecOpCodeExpectOpPrereqError(op, "Readded node doesn't have the same"
+                                       " IP address configuration as before")
+
+
+  def testNodeHasSecondaryIpButNotMaster(self):
+    self.master.secondary_ip = self.master.primary_ip
+
+    self.ExecOpCodeExpectOpPrereqError(self.op_add, "The master has no"
+                                       " secondary ip but the new node has 
one")
+
+  def testMasterHasSecondaryIpButNotNode(self):
+    op = self.CopyOpCode(self.op_add, secondary_ip=None)
+
+    self.ExecOpCodeExpectOpPrereqError(op, "The master has a secondary ip but"
+                                       " the new node doesn't have one")
+
+  def testNodeNotReachableByPing(self):
+    self.netutils_mod.TcpPing.return_value = False
+
+    op = self.CopyOpCode(self.op_add)
+
+    self.ExecOpCodeExpectOpPrereqError(op, "Node not reachable by ping")
+
+  def testNodeNotReachableByPingOnSecondary(self):
+    self.netutils_mod.TcpPing.side_effect = \
+      compat.partial(_TcpPingFailSecondary, self.cfg, 
self.netutils_mod.TcpPing)
+
+    op = self.CopyOpCode(self.op_add)
+
+    self.ExecOpCodeExpectOpPrereqError(op, "Node secondary ip not reachable by"
+                                       " TCP based ping to node daemon port")
+
+  def testCantGetVersion(self):
+    self.mocked_dns_rpc.call_version.return_value = \
+      self.RpcResultsBuilder(use_node_names=True) \
+        .AddErrorNode(self.node_add) \
+        .Build()
+
+    op = self.CopyOpCode(self.op_add)
+    self.ExecOpCodeExpectOpExecError(op, "Can't get version information from"
+                                     " node %s" % self.node_add.name)
+
 if __name__ == "__main__":
   testutils.GanetiTestProgram()
-- 
1.8.1.2

Reply via email to