This patch adds node_unittest.py containing the framework for unit
testing LUNodeAdd.
At this point, only test setup and tests for OpenvSwitch are
implemented.

Parts of setUp() were written by Thomas Thrainer.

Signed-off-by: Thomas Thrainer <[email protected]>
Signed-off-by: Sebastian Gebhard <[email protected]>
---
 Makefile.am                     |   1 +
 test/py/cmdlib/node_unittest.py | 135 ++++++++++++++++++++++++++++++++++++++++
 2 files changed, 136 insertions(+)
 create mode 100644 test/py/cmdlib/node_unittest.py

diff --git a/Makefile.am b/Makefile.am
index 8ef1bbe..ffda510 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1325,6 +1325,7 @@ python_tests = \
        test/py/cmdlib/instance_migration_unittest.py \
        test/py/cmdlib/instance_query_unittest.py \
        test/py/cmdlib/instance_storage_unittest.py \
+       test/py/cmdlib/node_unittest.py \
        test/py/cmdlib/test_unittest.py \
        test/py/cfgupgrade_unittest.py \
        test/py/docs_unittest.py \
diff --git a/test/py/cmdlib/node_unittest.py b/test/py/cmdlib/node_unittest.py
new file mode 100644
index 0000000..a90d924
--- /dev/null
+++ b/test/py/cmdlib/node_unittest.py
@@ -0,0 +1,135 @@
+#!/usr/bin/python
+#
+
+# Copyright (C) 2013 Google Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+
+"""Tests for LUNode*
+
+"""
+
+from collections import defaultdict
+
+from ganeti import constants
+from ganeti import objects
+from ganeti import opcodes
+
+from testsupport import *
+
+import testutils
+
+
+class TestLUNodeAdd(CmdlibTestCase):
+  def setUp(self):
+    super(TestLUNodeAdd, self).setUp()
+
+    # One node for testing readding:
+    self.node_readd = self.cfg.AddNewNode()
+    self.op_readd = opcodes.OpNodeAdd(node_name=self.node_readd.name,
+                                      readd=True,
+                                      primary_ip=self.node_readd.primary_ip,
+                                      
secondary_ip=self.node_readd.secondary_ip)
+
+    # One node for testing adding:
+    # don't add to configuration now!
+    self.node_add = objects.Node(name="node_add",
+                                 primary_ip="192.0.2.200",
+                                 secondary_ip="203.0.113.200")
+
+    self.op_add = opcodes.OpNodeAdd(node_name=self.node_add.name,
+                                    primary_ip=self.node_add.primary_ip,
+                                    secondary_ip=self.node_add.secondary_ip)
+
+    self.netutils_mod.TcpPing.return_value = True
+
+    self.mocked_dns_rpc = self.rpc_mod.DnsOnlyRunner.return_value
+
+    self.mocked_dns_rpc.call_version.return_value = \
+      self.RpcResultsBuilder(use_node_names=True) \
+        .AddSuccessfulNode(self.node_add, constants.CONFIG_VERSION) \
+        .AddSuccessfulNode(self.node_readd, constants.CONFIG_VERSION) \
+        .Build()
+
+    node_verify_result = \
+      self.RpcResultsBuilder() \
+        .CreateSuccessfulNodeResult(self.node_add, {constants.NV_NODELIST: []})
+    # 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, {})
+
+  def testOvsParamsButNotEnabled(self):
+    ndparams = {
+      constants.ND_OVS: False,
+      constants.ND_OVS_NAME: "testswitch",
+    }
+
+    op = self.CopyOpCode(self.op_add,
+                         ndparams=ndparams)
+
+    self.ExecOpCodeExpectOpPrereqError(op, "OpenvSwitch is not enabled")
+
+  def testOvsNoLink(self):
+    ndparams = {
+      constants.ND_OVS: True,
+      constants.ND_OVS_NAME: "testswitch",
+      constants.ND_OVS_LINK: None,
+    }
+
+    op = self.CopyOpCode(self.op_add,
+                         ndparams=ndparams)
+
+    self.ExecOpCode(op)
+    self.assertLogContainsRegex(
+      "No physical interface for OpenvSwitch was given."
+      " OpenvSwitch will not have an outside connection."
+      " This might not be what you want")
+
+    created_node = self.cfg.GetNodeInfoByName(op.node_name)
+    self.assertEqual(ndparams[constants.ND_OVS],
+                     created_node.ndparams.get(constants.ND_OVS, None))
+    self.assertEqual(ndparams[constants.ND_OVS_NAME],
+                     created_node.ndparams.get(constants.ND_OVS_NAME, None))
+    self.assertEqual(ndparams[constants.ND_OVS_LINK],
+                     created_node.ndparams.get(constants.ND_OVS_LINK, None))
+
+  def testWithoutOVS(self):
+    self.ExecOpCode(self.op_add)
+
+    created_node = self.cfg.GetNodeInfoByName(self.op_add.node_name)
+    self.assertEqual(None,
+                     created_node.ndparams.get(constants.ND_OVS, None))
+
+  def testWithOVS(self):
+    ndparams = {
+      constants.ND_OVS: True,
+      constants.ND_OVS_LINK: "eth2",
+    }
+
+    op = self.CopyOpCode(self.op_add,
+                         ndparams=ndparams)
+
+    self.ExecOpCode(op)
+
+    created_node = self.cfg.GetNodeInfoByName(op.node_name)
+    self.assertEqual(ndparams[constants.ND_OVS],
+                     created_node.ndparams.get(constants.ND_OVS, None))
+    self.assertEqual(ndparams[constants.ND_OVS_LINK],
+                     created_node.ndparams.get(constants.ND_OVS_LINK, None))
+
+if __name__ == "__main__":
+  testutils.GanetiTestProgram()
-- 
1.8.1.2

Reply via email to