Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (5 kB)

1
#!/usr/bin/python
2
#
3

    
4
# Copyright (C) 2011 Google Inc.
5
#
6
# This program is free software; you can redistribute it and/or modify
7
# it under the terms of the GNU General Public License as published by
8
# the Free Software Foundation; either version 2 of the License, or
9
# (at your option) any later version.
10
#
11
# This program is distributed in the hope that it will be useful, but
12
# WITHOUT ANY WARRANTY; without even the implied warranty of
13
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14
# General Public License for more details.
15
#
16
# You should have received a copy of the GNU General Public License
17
# along with this program; if not, write to the Free Software
18
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19
# 02110-1301, USA.
20

    
21

    
22
"""Script for testing ganeti.client.gnt_cluster"""
23

    
24
import unittest
25

    
26
from ganeti.client import gnt_cluster
27
from ganeti import utils
28
from ganeti import compat
29

    
30
import testutils
31

    
32

    
33
class TestEpo(unittest.TestCase):
34
  def setUp(self):
35
    self.nodes2ip = dict(("node%s" % i, "192.0.2.%s" % i) for i in range(1, 10))
36
    self.nodes = set(self.nodes2ip.keys())
37
    self.ips2node = dict((v, k) for (k, v) in self.nodes2ip.items())
38

    
39
  def _FakeAction(*args):
40
    return True
41

    
42
  def _FakePing(ip, port, live_port_needed=False):
43
    self.assert_(live_port_needed)
44
    self.assertEqual(port, 0)
45
    return True
46

    
47
  def _FakeSleep(secs):
48
    self.assert_(secs >= 0 and secs <= 5)
49
    return
50

    
51
  def testPingFnRemoveHostsUp(self):
52
    seen = set()
53
    def _FakeSeenPing(ip, *args, **kwargs):
54
      node = self.ips2node[ip]
55
      self.assertFalse(node in seen)
56
      seen.add(node)
57
      return True
58

    
59
    helper = gnt_cluster._RunWhenNodesReachableHelper(self.nodes,
60
                                                      self._FakeAction,
61
                                                      self.nodes2ip, port=0,
62
                                                      _ping_fn=_FakeSeenPing,
63
                                                      _sleep_fn=self._FakeSleep)
64

    
65
    nodes_len = len(self.nodes)
66
    for (num, _) in enumerate(self.nodes):
67
      helper.Wait(5)
68
      if num < nodes_len - 1:
69
        self.assertRaises(utils.RetryAgain, helper)
70
      else:
71
        helper()
72

    
73
    self.assertEqual(seen, self.nodes)
74
    self.assertFalse(helper.down)
75
    self.assertEqual(helper.up, self.nodes)
76

    
77
  def testActionReturnFalseSetsHelperFalse(self):
78
    called = False
79
    def _FalseAction(*args):
80
      return called
81

    
82
    helper = gnt_cluster._RunWhenNodesReachableHelper(self.nodes, _FalseAction,
83
                                                      self.nodes2ip, port=0,
84
                                                      _ping_fn=self._FakePing,
85
                                                      _sleep_fn=self._FakeSleep)
86
    for _ in self.nodes:
87
      try:
88
        helper()
89
      except utils.RetryAgain:
90
        called = True
91

    
92
    self.assertFalse(helper.success)
93

    
94
  def testMaybeInstanceStartup(self):
95
    instances_arg = []
96
    def _FakeInstanceStart(opts, instances, start):
97
      instances_arg.append(set(instances))
98
      return None
99

    
100
    inst_map = {
101
      "inst1": set(["node1", "node2"]),
102
      "inst2": set(["node1", "node3"]),
103
      "inst3": set(["node2", "node1"]),
104
      "inst4": set(["node2", "node1", "node3"]),
105
      "inst5": set(["node4"]),
106
      }
107

    
108
    fn = _FakeInstanceStart
109
    self.assert_(gnt_cluster._MaybeInstanceStartup(None, inst_map, set(),
110
                                                   _instance_start_fn=fn))
111
    self.assertFalse(instances_arg)
112
    result = gnt_cluster._MaybeInstanceStartup(None, inst_map, set(["node1"]),
113
                                               _instance_start_fn=fn)
114
    self.assert_(result)
115
    self.assertFalse(instances_arg)
116
    result = gnt_cluster._MaybeInstanceStartup(None, inst_map,
117
                                               set(["node1", "node3"]),
118
                                               _instance_start_fn=fn)
119
    self.assert_(result is None)
120
    self.assertEqual(instances_arg.pop(0), set(["inst2"]))
121
    self.assertFalse("inst2" in inst_map)
122
    result = gnt_cluster._MaybeInstanceStartup(None, inst_map,
123
                                               set(["node1", "node3"]),
124
                                               _instance_start_fn=fn)
125
    self.assert_(result)
126
    self.assertFalse(instances_arg)
127
    result = gnt_cluster._MaybeInstanceStartup(None, inst_map,
128
                                               set(["node1", "node3", "node2"]),
129
                                               _instance_start_fn=fn)
130
    self.assertEqual(instances_arg.pop(0), set(["inst1", "inst3", "inst4"]))
131
    self.assert_(result is None)
132
    result = gnt_cluster._MaybeInstanceStartup(None, inst_map,
133
                                               set(["node1", "node3", "node2",
134
                                                    "node4"]),
135
                                               _instance_start_fn=fn)
136
    self.assert_(result is None)
137
    self.assertEqual(instances_arg.pop(0), set(["inst5"]))
138
    self.assertFalse(inst_map)
139

    
140

    
141
if __name__ == "__main__":
142
  testutils.GanetiTestProgram()