Statistics
| Branch: | Tag: | Revision:

root / test / ganeti.client.gnt_instance_unittest.py @ c1912a48

History | View | Annotate | Download (7.4 kB)

1 25ce3ec4 Michael Hanselmann
#!/usr/bin/python
2 25ce3ec4 Michael Hanselmann
#
3 25ce3ec4 Michael Hanselmann
4 25ce3ec4 Michael Hanselmann
# Copyright (C) 2011 Google Inc.
5 25ce3ec4 Michael Hanselmann
#
6 25ce3ec4 Michael Hanselmann
# This program is free software; you can redistribute it and/or modify
7 25ce3ec4 Michael Hanselmann
# it under the terms of the GNU General Public License as published by
8 25ce3ec4 Michael Hanselmann
# the Free Software Foundation; either version 2 of the License, or
9 25ce3ec4 Michael Hanselmann
# (at your option) any later version.
10 25ce3ec4 Michael Hanselmann
#
11 25ce3ec4 Michael Hanselmann
# This program is distributed in the hope that it will be useful, but
12 25ce3ec4 Michael Hanselmann
# WITHOUT ANY WARRANTY; without even the implied warranty of
13 25ce3ec4 Michael Hanselmann
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 25ce3ec4 Michael Hanselmann
# General Public License for more details.
15 25ce3ec4 Michael Hanselmann
#
16 25ce3ec4 Michael Hanselmann
# You should have received a copy of the GNU General Public License
17 25ce3ec4 Michael Hanselmann
# along with this program; if not, write to the Free Software
18 25ce3ec4 Michael Hanselmann
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 25ce3ec4 Michael Hanselmann
# 02110-1301, USA.
20 25ce3ec4 Michael Hanselmann
21 25ce3ec4 Michael Hanselmann
22 25ce3ec4 Michael Hanselmann
"""Script for testing ganeti.client.gnt_instance"""
23 25ce3ec4 Michael Hanselmann
24 25ce3ec4 Michael Hanselmann
import unittest
25 25ce3ec4 Michael Hanselmann
26 25ce3ec4 Michael Hanselmann
from ganeti import constants
27 25ce3ec4 Michael Hanselmann
from ganeti import utils
28 25ce3ec4 Michael Hanselmann
from ganeti import errors
29 25ce3ec4 Michael Hanselmann
from ganeti import objects
30 25ce3ec4 Michael Hanselmann
from ganeti.client import gnt_instance
31 25ce3ec4 Michael Hanselmann
32 25ce3ec4 Michael Hanselmann
import testutils
33 25ce3ec4 Michael Hanselmann
34 25ce3ec4 Michael Hanselmann
35 25ce3ec4 Michael Hanselmann
class TestConsole(unittest.TestCase):
36 25ce3ec4 Michael Hanselmann
  def setUp(self):
37 25ce3ec4 Michael Hanselmann
    self._output = []
38 25ce3ec4 Michael Hanselmann
    self._cmds = []
39 25ce3ec4 Michael Hanselmann
    self._next_cmd_exitcode = 0
40 25ce3ec4 Michael Hanselmann
41 abd42b0a Michael Hanselmann
  def _Test(self, console, show_command, cluster_name):
42 abd42b0a Michael Hanselmann
    return gnt_instance._DoConsole(console, show_command, cluster_name,
43 25ce3ec4 Michael Hanselmann
                                   feedback_fn=self._Feedback,
44 25ce3ec4 Michael Hanselmann
                                   _runcmd_fn=self._FakeRunCmd)
45 25ce3ec4 Michael Hanselmann
46 25ce3ec4 Michael Hanselmann
  def _Feedback(self, msg, *args):
47 25ce3ec4 Michael Hanselmann
    if args:
48 25ce3ec4 Michael Hanselmann
      msg = msg % args
49 25ce3ec4 Michael Hanselmann
    self._output.append(msg)
50 25ce3ec4 Michael Hanselmann
51 25ce3ec4 Michael Hanselmann
  def _FakeRunCmd(self, cmd, interactive=None):
52 25ce3ec4 Michael Hanselmann
    self.assertTrue(interactive)
53 25ce3ec4 Michael Hanselmann
    self.assertTrue(isinstance(cmd, list))
54 25ce3ec4 Michael Hanselmann
    self._cmds.append(cmd)
55 25ce3ec4 Michael Hanselmann
    return utils.RunResult(self._next_cmd_exitcode, None, "", "", "cmd",
56 a4ccecf6 Michael Hanselmann
                           utils.process._TIMEOUT_NONE, 5)
57 25ce3ec4 Michael Hanselmann
58 25ce3ec4 Michael Hanselmann
  def testMessage(self):
59 25ce3ec4 Michael Hanselmann
    cons = objects.InstanceConsole(instance="inst98.example.com",
60 25ce3ec4 Michael Hanselmann
                                   kind=constants.CONS_MESSAGE,
61 25ce3ec4 Michael Hanselmann
                                   message="Hello World")
62 25ce3ec4 Michael Hanselmann
    self.assertEqual(self._Test(cons, False, "cluster.example.com"),
63 25ce3ec4 Michael Hanselmann
                     constants.EXIT_SUCCESS)
64 25ce3ec4 Michael Hanselmann
    self.assertEqual(len(self._cmds), 0)
65 25ce3ec4 Michael Hanselmann
    self.assertEqual(self._output, ["Hello World"])
66 25ce3ec4 Michael Hanselmann
67 25ce3ec4 Michael Hanselmann
  def testVnc(self):
68 25ce3ec4 Michael Hanselmann
    cons = objects.InstanceConsole(instance="inst1.example.com",
69 25ce3ec4 Michael Hanselmann
                                   kind=constants.CONS_VNC,
70 25ce3ec4 Michael Hanselmann
                                   host="node1.example.com",
71 25ce3ec4 Michael Hanselmann
                                   port=5901,
72 25ce3ec4 Michael Hanselmann
                                   display=1)
73 25ce3ec4 Michael Hanselmann
    self.assertEqual(self._Test(cons, False, "cluster.example.com"),
74 25ce3ec4 Michael Hanselmann
                     constants.EXIT_SUCCESS)
75 25ce3ec4 Michael Hanselmann
    self.assertEqual(len(self._cmds), 0)
76 25ce3ec4 Michael Hanselmann
    self.assertEqual(len(self._output), 1)
77 25ce3ec4 Michael Hanselmann
    self.assertTrue(" inst1.example.com " in self._output[0])
78 25ce3ec4 Michael Hanselmann
    self.assertTrue(" node1.example.com:5901 " in self._output[0])
79 25ce3ec4 Michael Hanselmann
    self.assertTrue("vnc://node1.example.com:5901/" in self._output[0])
80 25ce3ec4 Michael Hanselmann
81 25ce3ec4 Michael Hanselmann
  def testSshShow(self):
82 25ce3ec4 Michael Hanselmann
    cons = objects.InstanceConsole(instance="inst31.example.com",
83 25ce3ec4 Michael Hanselmann
                                   kind=constants.CONS_SSH,
84 25ce3ec4 Michael Hanselmann
                                   host="node93.example.com",
85 25ce3ec4 Michael Hanselmann
                                   user="user_abc",
86 25ce3ec4 Michael Hanselmann
                                   command="xm console x.y.z")
87 25ce3ec4 Michael Hanselmann
    self.assertEqual(self._Test(cons, True, "cluster.example.com"),
88 25ce3ec4 Michael Hanselmann
                     constants.EXIT_SUCCESS)
89 25ce3ec4 Michael Hanselmann
    self.assertEqual(len(self._cmds), 0)
90 25ce3ec4 Michael Hanselmann
    self.assertEqual(len(self._output), 1)
91 25ce3ec4 Michael Hanselmann
    self.assertTrue(" user_abc@node93.example.com " in self._output[0])
92 25ce3ec4 Michael Hanselmann
    self.assertTrue("'xm console x.y.z'" in self._output[0])
93 25ce3ec4 Michael Hanselmann
94 25ce3ec4 Michael Hanselmann
  def testSshRun(self):
95 25ce3ec4 Michael Hanselmann
    cons = objects.InstanceConsole(instance="inst31.example.com",
96 25ce3ec4 Michael Hanselmann
                                   kind=constants.CONS_SSH,
97 25ce3ec4 Michael Hanselmann
                                   host="node93.example.com",
98 25ce3ec4 Michael Hanselmann
                                   user="user_abc",
99 25ce3ec4 Michael Hanselmann
                                   command=["xm", "console", "x.y.z"])
100 25ce3ec4 Michael Hanselmann
    self.assertEqual(self._Test(cons, False, "cluster.example.com"),
101 25ce3ec4 Michael Hanselmann
                     constants.EXIT_SUCCESS)
102 25ce3ec4 Michael Hanselmann
    self.assertEqual(len(self._cmds), 1)
103 25ce3ec4 Michael Hanselmann
    self.assertEqual(len(self._output), 0)
104 25ce3ec4 Michael Hanselmann
105 25ce3ec4 Michael Hanselmann
    # This is very important to prevent escapes from the console
106 25ce3ec4 Michael Hanselmann
    self.assertTrue("-oEscapeChar=none" in self._cmds[0])
107 25ce3ec4 Michael Hanselmann
108 25ce3ec4 Michael Hanselmann
  def testSshRunFail(self):
109 25ce3ec4 Michael Hanselmann
    cons = objects.InstanceConsole(instance="inst31.example.com",
110 25ce3ec4 Michael Hanselmann
                                   kind=constants.CONS_SSH,
111 25ce3ec4 Michael Hanselmann
                                   host="node93.example.com",
112 25ce3ec4 Michael Hanselmann
                                   user="user_abc",
113 25ce3ec4 Michael Hanselmann
                                   command=["xm", "console", "x.y.z"])
114 25ce3ec4 Michael Hanselmann
115 25ce3ec4 Michael Hanselmann
    self._next_cmd_exitcode = 100
116 25ce3ec4 Michael Hanselmann
    self.assertRaises(errors.OpExecError, self._Test,
117 25ce3ec4 Michael Hanselmann
                      cons, False, "cluster.example.com")
118 25ce3ec4 Michael Hanselmann
    self.assertEqual(len(self._cmds), 1)
119 25ce3ec4 Michael Hanselmann
    self.assertEqual(len(self._output), 0)
120 25ce3ec4 Michael Hanselmann
121 25ce3ec4 Michael Hanselmann
122 a71f835e Michael Hanselmann
class TestConvertNicDiskModifications(unittest.TestCase):
123 a71f835e Michael Hanselmann
  def test(self):
124 a71f835e Michael Hanselmann
    fn = gnt_instance._ConvertNicDiskModifications
125 a71f835e Michael Hanselmann
126 a71f835e Michael Hanselmann
    self.assertEqual(fn([]), [])
127 a71f835e Michael Hanselmann
128 a71f835e Michael Hanselmann
    # Error cases
129 a71f835e Michael Hanselmann
    self.assertRaises(errors.OpPrereqError, fn, [
130 a71f835e Michael Hanselmann
      (constants.DDM_REMOVE, { "param": "value", }),
131 a71f835e Michael Hanselmann
      ])
132 a71f835e Michael Hanselmann
    self.assertRaises(errors.OpPrereqError, fn, [
133 a71f835e Michael Hanselmann
      (0, { constants.DDM_REMOVE: True, "param": "value", }),
134 a71f835e Michael Hanselmann
      ])
135 a71f835e Michael Hanselmann
    self.assertRaises(errors.OpPrereqError, fn, [
136 a71f835e Michael Hanselmann
      ("Hello", {}),
137 a71f835e Michael Hanselmann
      ])
138 a71f835e Michael Hanselmann
    self.assertRaises(errors.OpPrereqError, fn, [
139 a71f835e Michael Hanselmann
      (0, {
140 a71f835e Michael Hanselmann
        constants.DDM_REMOVE: True,
141 a71f835e Michael Hanselmann
        constants.DDM_ADD: True,
142 a71f835e Michael Hanselmann
        }),
143 a71f835e Michael Hanselmann
      ])
144 a71f835e Michael Hanselmann
145 a71f835e Michael Hanselmann
    # Legacy calls
146 a71f835e Michael Hanselmann
    for action in constants.DDMS_VALUES:
147 a71f835e Michael Hanselmann
      self.assertEqual(fn([
148 a71f835e Michael Hanselmann
        (action, {}),
149 a71f835e Michael Hanselmann
        ]), [
150 a71f835e Michael Hanselmann
        (action, -1, {}),
151 a71f835e Michael Hanselmann
        ])
152 7a70541e Michael Hanselmann
      self.assertRaises(errors.OpPrereqError, fn, [
153 7a70541e Michael Hanselmann
        (0, {
154 7a70541e Michael Hanselmann
          action: True,
155 7a70541e Michael Hanselmann
          constants.DDM_MODIFY: True,
156 7a70541e Michael Hanselmann
          }),
157 7a70541e Michael Hanselmann
        ])
158 a71f835e Michael Hanselmann
159 a71f835e Michael Hanselmann
    self.assertEqual(fn([
160 a71f835e Michael Hanselmann
      (constants.DDM_ADD, {
161 a71f835e Michael Hanselmann
        constants.IDISK_SIZE: 1024,
162 a71f835e Michael Hanselmann
        }),
163 a71f835e Michael Hanselmann
      ]), [
164 a71f835e Michael Hanselmann
      (constants.DDM_ADD, -1, {
165 a71f835e Michael Hanselmann
        constants.IDISK_SIZE: 1024,
166 a71f835e Michael Hanselmann
        }),
167 a71f835e Michael Hanselmann
      ])
168 a71f835e Michael Hanselmann
169 a71f835e Michael Hanselmann
    # New-style calls
170 a71f835e Michael Hanselmann
    self.assertEqual(fn([
171 a71f835e Michael Hanselmann
      (2, {
172 a71f835e Michael Hanselmann
        constants.IDISK_MODE: constants.DISK_RDWR,
173 a71f835e Michael Hanselmann
        }),
174 a71f835e Michael Hanselmann
      ]), [
175 a71f835e Michael Hanselmann
      (constants.DDM_MODIFY, 2, {
176 a71f835e Michael Hanselmann
        constants.IDISK_MODE: constants.DISK_RDWR,
177 a71f835e Michael Hanselmann
        }),
178 a71f835e Michael Hanselmann
      ])
179 a71f835e Michael Hanselmann
180 a71f835e Michael Hanselmann
    self.assertEqual(fn([
181 a71f835e Michael Hanselmann
      (0, {
182 a71f835e Michael Hanselmann
        constants.DDM_ADD: True,
183 a71f835e Michael Hanselmann
        constants.IDISK_SIZE: 4096,
184 a71f835e Michael Hanselmann
        }),
185 a71f835e Michael Hanselmann
      ]), [
186 a71f835e Michael Hanselmann
      (constants.DDM_ADD, 0, {
187 a71f835e Michael Hanselmann
        constants.IDISK_SIZE: 4096,
188 a71f835e Michael Hanselmann
        }),
189 a71f835e Michael Hanselmann
      ])
190 a71f835e Michael Hanselmann
191 a71f835e Michael Hanselmann
    self.assertEqual(fn([
192 a71f835e Michael Hanselmann
      (-1, {
193 a71f835e Michael Hanselmann
        constants.DDM_REMOVE: True,
194 a71f835e Michael Hanselmann
        }),
195 a71f835e Michael Hanselmann
      ]), [
196 a71f835e Michael Hanselmann
      (constants.DDM_REMOVE, -1, {}),
197 a71f835e Michael Hanselmann
      ])
198 a71f835e Michael Hanselmann
199 7a70541e Michael Hanselmann
    self.assertEqual(fn([
200 7a70541e Michael Hanselmann
      (-1, {
201 7a70541e Michael Hanselmann
        constants.DDM_MODIFY: True,
202 7a70541e Michael Hanselmann
        constants.IDISK_SIZE: 1024,
203 7a70541e Michael Hanselmann
        }),
204 7a70541e Michael Hanselmann
      ]), [
205 7a70541e Michael Hanselmann
      (constants.DDM_MODIFY, -1, {
206 7a70541e Michael Hanselmann
        constants.IDISK_SIZE: 1024,
207 7a70541e Michael Hanselmann
        }),
208 7a70541e Michael Hanselmann
      ])
209 7a70541e Michael Hanselmann
210 a71f835e Michael Hanselmann
211 a71f835e Michael Hanselmann
class TestParseDiskSizes(unittest.TestCase):
212 a71f835e Michael Hanselmann
  def test(self):
213 a71f835e Michael Hanselmann
    fn = gnt_instance._ParseDiskSizes
214 a71f835e Michael Hanselmann
215 a71f835e Michael Hanselmann
    self.assertEqual(fn([]), [])
216 a71f835e Michael Hanselmann
217 a71f835e Michael Hanselmann
    # Missing size parameter
218 a71f835e Michael Hanselmann
    self.assertRaises(errors.OpPrereqError, fn, [
219 a71f835e Michael Hanselmann
      (constants.DDM_ADD, 0, {}),
220 a71f835e Michael Hanselmann
      ])
221 a71f835e Michael Hanselmann
222 a71f835e Michael Hanselmann
    # Converting disk size
223 a71f835e Michael Hanselmann
    self.assertEqual(fn([
224 a71f835e Michael Hanselmann
      (constants.DDM_ADD, 11, {
225 a71f835e Michael Hanselmann
        constants.IDISK_SIZE: "9G",
226 a71f835e Michael Hanselmann
        }),
227 a71f835e Michael Hanselmann
      ]), [
228 a71f835e Michael Hanselmann
        (constants.DDM_ADD, 11, {
229 a71f835e Michael Hanselmann
          constants.IDISK_SIZE: 9216,
230 a71f835e Michael Hanselmann
          }),
231 a71f835e Michael Hanselmann
        ])
232 a71f835e Michael Hanselmann
233 a71f835e Michael Hanselmann
    # No size parameter
234 a71f835e Michael Hanselmann
    self.assertEqual(fn([
235 a71f835e Michael Hanselmann
      (constants.DDM_REMOVE, 11, {
236 a71f835e Michael Hanselmann
        "other": "24M",
237 a71f835e Michael Hanselmann
        }),
238 a71f835e Michael Hanselmann
      ]), [
239 a71f835e Michael Hanselmann
        (constants.DDM_REMOVE, 11, {
240 a71f835e Michael Hanselmann
          "other": "24M",
241 a71f835e Michael Hanselmann
          }),
242 a71f835e Michael Hanselmann
        ])
243 a71f835e Michael Hanselmann
244 a71f835e Michael Hanselmann
245 25ce3ec4 Michael Hanselmann
if __name__ == "__main__":
246 25ce3ec4 Michael Hanselmann
  testutils.GanetiTestProgram()