Statistics
| Branch: | Tag: | Revision:

root / test / ganeti.client.gnt_cluster_unittest.py @ 66d1f035

History | View | Annotate | Download (5 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 66d1f035 René Nussbaumer
  def testPingFnRemoveHostsUp(self):
52 66d1f035 René Nussbaumer
    seen = set()
53 66d1f035 René Nussbaumer
    def _FakeSeenPing(ip, *args, **kwargs):
54 66d1f035 René Nussbaumer
      node = self.ips2node[ip]
55 66d1f035 René Nussbaumer
      self.assertFalse(node in seen)
56 66d1f035 René Nussbaumer
      seen.add(node)
57 66d1f035 René Nussbaumer
      return True
58 66d1f035 René Nussbaumer
59 66d1f035 René Nussbaumer
    helper = gnt_cluster._RunWhenNodesReachableHelper(self.nodes,
60 66d1f035 René Nussbaumer
                                                      self._FakeAction,
61 66d1f035 René Nussbaumer
                                                      self.nodes2ip, port=0,
62 66d1f035 René Nussbaumer
                                                      _ping_fn=_FakeSeenPing,
63 66d1f035 René Nussbaumer
                                                      _sleep_fn=self._FakeSleep)
64 66d1f035 René Nussbaumer
65 66d1f035 René Nussbaumer
    nodes_len = len(self.nodes)
66 66d1f035 René Nussbaumer
    for (num, _) in enumerate(self.nodes):
67 66d1f035 René Nussbaumer
      helper.Wait(5)
68 66d1f035 René Nussbaumer
      if num < nodes_len - 1:
69 66d1f035 René Nussbaumer
        self.assertRaises(utils.RetryAgain, helper)
70 66d1f035 René Nussbaumer
      else:
71 66d1f035 René Nussbaumer
        helper()
72 66d1f035 René Nussbaumer
73 66d1f035 René Nussbaumer
    self.assertEqual(seen, self.nodes)
74 66d1f035 René Nussbaumer
    self.assertFalse(helper.down)
75 66d1f035 René Nussbaumer
    self.assertEqual(helper.up, self.nodes)
76 66d1f035 René Nussbaumer
77 66d1f035 René Nussbaumer
  def testActionReturnFalseSetsHelperFalse(self):
78 66d1f035 René Nussbaumer
    called = False
79 66d1f035 René Nussbaumer
    def _FalseAction(*args):
80 66d1f035 René Nussbaumer
      return called
81 66d1f035 René Nussbaumer
82 66d1f035 René Nussbaumer
    helper = gnt_cluster._RunWhenNodesReachableHelper(self.nodes, _FalseAction,
83 66d1f035 René Nussbaumer
                                                      self.nodes2ip, port=0,
84 66d1f035 René Nussbaumer
                                                      _ping_fn=self._FakePing,
85 66d1f035 René Nussbaumer
                                                      _sleep_fn=self._FakeSleep)
86 66d1f035 René Nussbaumer
    for _ in self.nodes:
87 66d1f035 René Nussbaumer
      try:
88 66d1f035 René Nussbaumer
        helper()
89 66d1f035 René Nussbaumer
      except utils.RetryAgain:
90 66d1f035 René Nussbaumer
        called = True
91 66d1f035 René Nussbaumer
92 66d1f035 René Nussbaumer
    self.assertFalse(helper.success)
93 66d1f035 René Nussbaumer
94 66d1f035 René Nussbaumer
  def testMaybeInstanceStartup(self):
95 66d1f035 René Nussbaumer
    instances_arg = []
96 66d1f035 René Nussbaumer
    def _FakeInstanceStart(opts, instances, start):
97 66d1f035 René Nussbaumer
      instances_arg.append(set(instances))
98 66d1f035 René Nussbaumer
      return None
99 66d1f035 René Nussbaumer
100 66d1f035 René Nussbaumer
    inst_map = {
101 66d1f035 René Nussbaumer
      "inst1": set(["node1", "node2"]),
102 66d1f035 René Nussbaumer
      "inst2": set(["node1", "node3"]),
103 66d1f035 René Nussbaumer
      "inst3": set(["node2", "node1"]),
104 66d1f035 René Nussbaumer
      "inst4": set(["node2", "node1", "node3"]),
105 66d1f035 René Nussbaumer
      "inst5": set(["node4"]),
106 66d1f035 René Nussbaumer
      }
107 66d1f035 René Nussbaumer
108 66d1f035 René Nussbaumer
    fn = _FakeInstanceStart
109 66d1f035 René Nussbaumer
    self.assert_(gnt_cluster._MaybeInstanceStartup(None, inst_map, set(),
110 66d1f035 René Nussbaumer
                                                   _instance_start_fn=fn))
111 66d1f035 René Nussbaumer
    self.assertFalse(instances_arg)
112 66d1f035 René Nussbaumer
    result = gnt_cluster._MaybeInstanceStartup(None, inst_map, set(["node1"]),
113 66d1f035 René Nussbaumer
                                               _instance_start_fn=fn)
114 66d1f035 René Nussbaumer
    self.assert_(result)
115 66d1f035 René Nussbaumer
    self.assertFalse(instances_arg)
116 66d1f035 René Nussbaumer
    result = gnt_cluster._MaybeInstanceStartup(None, inst_map,
117 66d1f035 René Nussbaumer
                                               set(["node1", "node3"]),
118 66d1f035 René Nussbaumer
                                               _instance_start_fn=fn)
119 66d1f035 René Nussbaumer
    self.assert_(result is None)
120 66d1f035 René Nussbaumer
    self.assertEqual(instances_arg.pop(0), set(["inst2"]))
121 66d1f035 René Nussbaumer
    self.assertFalse("inst2" in inst_map)
122 66d1f035 René Nussbaumer
    result = gnt_cluster._MaybeInstanceStartup(None, inst_map,
123 66d1f035 René Nussbaumer
                                               set(["node1", "node3"]),
124 66d1f035 René Nussbaumer
                                               _instance_start_fn=fn)
125 66d1f035 René Nussbaumer
    self.assert_(result)
126 66d1f035 René Nussbaumer
    self.assertFalse(instances_arg)
127 66d1f035 René Nussbaumer
    result = gnt_cluster._MaybeInstanceStartup(None, inst_map,
128 66d1f035 René Nussbaumer
                                               set(["node1", "node3", "node2"]),
129 66d1f035 René Nussbaumer
                                               _instance_start_fn=fn)
130 66d1f035 René Nussbaumer
    self.assertEqual(instances_arg.pop(0), set(["inst1", "inst3", "inst4"]))
131 66d1f035 René Nussbaumer
    self.assert_(result is None)
132 66d1f035 René Nussbaumer
    result = gnt_cluster._MaybeInstanceStartup(None, inst_map,
133 66d1f035 René Nussbaumer
                                               set(["node1", "node3", "node2",
134 66d1f035 René Nussbaumer
                                                    "node4"]),
135 66d1f035 René Nussbaumer
                                               _instance_start_fn=fn)
136 66d1f035 René Nussbaumer
    self.assert_(result is None)
137 66d1f035 René Nussbaumer
    self.assertEqual(instances_arg.pop(0), set(["inst5"]))
138 66d1f035 René Nussbaumer
    self.assertFalse(inst_map)
139 66d1f035 René Nussbaumer
140 66d1f035 René Nussbaumer
141 66d1f035 René Nussbaumer
if __name__ == "__main__":
142 66d1f035 René Nussbaumer
  testutils.GanetiTestProgram()