Statistics
| Branch: | Tag: | Revision:

root / test / ganeti.client.gnt_cluster_unittest.py @ 526f866b

History | View | Annotate | Download (5.2 kB)

1 66d1f035 René Nussbaumer
#!/usr/bin/python
2 66d1f035 René Nussbaumer
#
3 66d1f035 René Nussbaumer
4 66d1f035 René Nussbaumer
# Copyright (C) 2011 Google Inc.
5 66d1f035 René Nussbaumer
#
6 66d1f035 René Nussbaumer
# This program is free software; you can redistribute it and/or modify
7 66d1f035 René Nussbaumer
# it under the terms of the GNU General Public License as published by
8 66d1f035 René Nussbaumer
# the Free Software Foundation; either version 2 of the License, or
9 66d1f035 René Nussbaumer
# (at your option) any later version.
10 66d1f035 René Nussbaumer
#
11 66d1f035 René Nussbaumer
# This program is distributed in the hope that it will be useful, but
12 66d1f035 René Nussbaumer
# WITHOUT ANY WARRANTY; without even the implied warranty of
13 66d1f035 René Nussbaumer
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 66d1f035 René Nussbaumer
# General Public License for more details.
15 66d1f035 René Nussbaumer
#
16 66d1f035 René Nussbaumer
# You should have received a copy of the GNU General Public License
17 66d1f035 René Nussbaumer
# along with this program; if not, write to the Free Software
18 66d1f035 René Nussbaumer
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 66d1f035 René Nussbaumer
# 02110-1301, USA.
20 66d1f035 René Nussbaumer
21 66d1f035 René Nussbaumer
22 66d1f035 René Nussbaumer
"""Script for testing ganeti.client.gnt_cluster"""
23 66d1f035 René Nussbaumer
24 66d1f035 René Nussbaumer
import unittest
25 66d1f035 René Nussbaumer
26 66d1f035 René Nussbaumer
from ganeti.client import gnt_cluster
27 66d1f035 René Nussbaumer
from ganeti import utils
28 66d1f035 René Nussbaumer
from ganeti import compat
29 66d1f035 René Nussbaumer
30 66d1f035 René Nussbaumer
import testutils
31 66d1f035 René Nussbaumer
32 66d1f035 René Nussbaumer
33 66d1f035 René Nussbaumer
class TestEpo(unittest.TestCase):
34 66d1f035 René Nussbaumer
  def setUp(self):
35 66d1f035 René Nussbaumer
    self.nodes2ip = dict(("node%s" % i, "192.0.2.%s" % i) for i in range(1, 10))
36 66d1f035 René Nussbaumer
    self.nodes = set(self.nodes2ip.keys())
37 66d1f035 René Nussbaumer
    self.ips2node = dict((v, k) for (k, v) in self.nodes2ip.items())
38 66d1f035 René Nussbaumer
39 66d1f035 René Nussbaumer
  def _FakeAction(*args):
40 66d1f035 René Nussbaumer
    return True
41 66d1f035 René Nussbaumer
42 66d1f035 René Nussbaumer
  def _FakePing(ip, port, live_port_needed=False):
43 66d1f035 René Nussbaumer
    self.assert_(live_port_needed)
44 66d1f035 René Nussbaumer
    self.assertEqual(port, 0)
45 66d1f035 René Nussbaumer
    return True
46 66d1f035 René Nussbaumer
47 66d1f035 René Nussbaumer
  def _FakeSleep(secs):
48 66d1f035 René Nussbaumer
    self.assert_(secs >= 0 and secs <= 5)
49 66d1f035 René Nussbaumer
    return
50 66d1f035 René Nussbaumer
51 8e74adce René Nussbaumer
  def _NoopFeedback(self, text):
52 8e74adce René Nussbaumer
    return
53 8e74adce René Nussbaumer
54 66d1f035 René Nussbaumer
  def testPingFnRemoveHostsUp(self):
55 66d1f035 René Nussbaumer
    seen = set()
56 66d1f035 René Nussbaumer
    def _FakeSeenPing(ip, *args, **kwargs):
57 66d1f035 René Nussbaumer
      node = self.ips2node[ip]
58 66d1f035 René Nussbaumer
      self.assertFalse(node in seen)
59 66d1f035 René Nussbaumer
      seen.add(node)
60 66d1f035 René Nussbaumer
      return True
61 66d1f035 René Nussbaumer
62 66d1f035 René Nussbaumer
    helper = gnt_cluster._RunWhenNodesReachableHelper(self.nodes,
63 66d1f035 René Nussbaumer
                                                      self._FakeAction,
64 8e74adce René Nussbaumer
                                                      self.nodes2ip, 0,
65 8e74adce René Nussbaumer
                                                      self._NoopFeedback,
66 66d1f035 René Nussbaumer
                                                      _ping_fn=_FakeSeenPing,
67 66d1f035 René Nussbaumer
                                                      _sleep_fn=self._FakeSleep)
68 66d1f035 René Nussbaumer
69 66d1f035 René Nussbaumer
    nodes_len = len(self.nodes)
70 66d1f035 René Nussbaumer
    for (num, _) in enumerate(self.nodes):
71 66d1f035 René Nussbaumer
      helper.Wait(5)
72 66d1f035 René Nussbaumer
      if num < nodes_len - 1:
73 66d1f035 René Nussbaumer
        self.assertRaises(utils.RetryAgain, helper)
74 66d1f035 René Nussbaumer
      else:
75 66d1f035 René Nussbaumer
        helper()
76 66d1f035 René Nussbaumer
77 66d1f035 René Nussbaumer
    self.assertEqual(seen, self.nodes)
78 66d1f035 René Nussbaumer
    self.assertFalse(helper.down)
79 66d1f035 René Nussbaumer
    self.assertEqual(helper.up, self.nodes)
80 66d1f035 René Nussbaumer
81 66d1f035 René Nussbaumer
  def testActionReturnFalseSetsHelperFalse(self):
82 66d1f035 René Nussbaumer
    called = False
83 66d1f035 René Nussbaumer
    def _FalseAction(*args):
84 66d1f035 René Nussbaumer
      return called
85 66d1f035 René Nussbaumer
86 66d1f035 René Nussbaumer
    helper = gnt_cluster._RunWhenNodesReachableHelper(self.nodes, _FalseAction,
87 8e74adce René Nussbaumer
                                                      self.nodes2ip, 0,
88 8e74adce René Nussbaumer
                                                      self._NoopFeedback,
89 66d1f035 René Nussbaumer
                                                      _ping_fn=self._FakePing,
90 66d1f035 René Nussbaumer
                                                      _sleep_fn=self._FakeSleep)
91 66d1f035 René Nussbaumer
    for _ in self.nodes:
92 66d1f035 René Nussbaumer
      try:
93 66d1f035 René Nussbaumer
        helper()
94 66d1f035 René Nussbaumer
      except utils.RetryAgain:
95 66d1f035 René Nussbaumer
        called = True
96 66d1f035 René Nussbaumer
97 66d1f035 René Nussbaumer
    self.assertFalse(helper.success)
98 66d1f035 René Nussbaumer
99 66d1f035 René Nussbaumer
  def testMaybeInstanceStartup(self):
100 66d1f035 René Nussbaumer
    instances_arg = []
101 66d1f035 René Nussbaumer
    def _FakeInstanceStart(opts, instances, start):
102 66d1f035 René Nussbaumer
      instances_arg.append(set(instances))
103 66d1f035 René Nussbaumer
      return None
104 66d1f035 René Nussbaumer
105 66d1f035 René Nussbaumer
    inst_map = {
106 66d1f035 René Nussbaumer
      "inst1": set(["node1", "node2"]),
107 66d1f035 René Nussbaumer
      "inst2": set(["node1", "node3"]),
108 66d1f035 René Nussbaumer
      "inst3": set(["node2", "node1"]),
109 66d1f035 René Nussbaumer
      "inst4": set(["node2", "node1", "node3"]),
110 66d1f035 René Nussbaumer
      "inst5": set(["node4"]),
111 66d1f035 René Nussbaumer
      }
112 66d1f035 René Nussbaumer
113 66d1f035 René Nussbaumer
    fn = _FakeInstanceStart
114 66d1f035 René Nussbaumer
    self.assert_(gnt_cluster._MaybeInstanceStartup(None, inst_map, set(),
115 66d1f035 René Nussbaumer
                                                   _instance_start_fn=fn))
116 66d1f035 René Nussbaumer
    self.assertFalse(instances_arg)
117 66d1f035 René Nussbaumer
    result = gnt_cluster._MaybeInstanceStartup(None, inst_map, set(["node1"]),
118 66d1f035 René Nussbaumer
                                               _instance_start_fn=fn)
119 66d1f035 René Nussbaumer
    self.assert_(result)
120 66d1f035 René Nussbaumer
    self.assertFalse(instances_arg)
121 66d1f035 René Nussbaumer
    result = gnt_cluster._MaybeInstanceStartup(None, inst_map,
122 66d1f035 René Nussbaumer
                                               set(["node1", "node3"]),
123 66d1f035 René Nussbaumer
                                               _instance_start_fn=fn)
124 66d1f035 René Nussbaumer
    self.assert_(result is None)
125 66d1f035 René Nussbaumer
    self.assertEqual(instances_arg.pop(0), set(["inst2"]))
126 66d1f035 René Nussbaumer
    self.assertFalse("inst2" in inst_map)
127 66d1f035 René Nussbaumer
    result = gnt_cluster._MaybeInstanceStartup(None, inst_map,
128 66d1f035 René Nussbaumer
                                               set(["node1", "node3"]),
129 66d1f035 René Nussbaumer
                                               _instance_start_fn=fn)
130 66d1f035 René Nussbaumer
    self.assert_(result)
131 66d1f035 René Nussbaumer
    self.assertFalse(instances_arg)
132 66d1f035 René Nussbaumer
    result = gnt_cluster._MaybeInstanceStartup(None, inst_map,
133 66d1f035 René Nussbaumer
                                               set(["node1", "node3", "node2"]),
134 66d1f035 René Nussbaumer
                                               _instance_start_fn=fn)
135 66d1f035 René Nussbaumer
    self.assertEqual(instances_arg.pop(0), set(["inst1", "inst3", "inst4"]))
136 66d1f035 René Nussbaumer
    self.assert_(result is None)
137 66d1f035 René Nussbaumer
    result = gnt_cluster._MaybeInstanceStartup(None, inst_map,
138 66d1f035 René Nussbaumer
                                               set(["node1", "node3", "node2",
139 66d1f035 René Nussbaumer
                                                    "node4"]),
140 66d1f035 René Nussbaumer
                                               _instance_start_fn=fn)
141 66d1f035 René Nussbaumer
    self.assert_(result is None)
142 66d1f035 René Nussbaumer
    self.assertEqual(instances_arg.pop(0), set(["inst5"]))
143 66d1f035 René Nussbaumer
    self.assertFalse(inst_map)
144 66d1f035 René Nussbaumer
145 66d1f035 René Nussbaumer
146 66d1f035 René Nussbaumer
if __name__ == "__main__":
147 66d1f035 René Nussbaumer
  testutils.GanetiTestProgram()