Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (7 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 a71f835e Michael Hanselmann
153 a71f835e Michael Hanselmann
    self.assertEqual(fn([
154 a71f835e Michael Hanselmann
      (constants.DDM_ADD, {
155 a71f835e Michael Hanselmann
        constants.IDISK_SIZE: 1024,
156 a71f835e Michael Hanselmann
        }),
157 a71f835e Michael Hanselmann
      ]), [
158 a71f835e Michael Hanselmann
      (constants.DDM_ADD, -1, {
159 a71f835e Michael Hanselmann
        constants.IDISK_SIZE: 1024,
160 a71f835e Michael Hanselmann
        }),
161 a71f835e Michael Hanselmann
      ])
162 a71f835e Michael Hanselmann
163 a71f835e Michael Hanselmann
    # New-style calls
164 a71f835e Michael Hanselmann
    self.assertEqual(fn([
165 a71f835e Michael Hanselmann
      (2, {
166 a71f835e Michael Hanselmann
        constants.IDISK_MODE: constants.DISK_RDWR,
167 a71f835e Michael Hanselmann
        }),
168 a71f835e Michael Hanselmann
      ]), [
169 a71f835e Michael Hanselmann
      (constants.DDM_MODIFY, 2, {
170 a71f835e Michael Hanselmann
        constants.IDISK_MODE: constants.DISK_RDWR,
171 a71f835e Michael Hanselmann
        }),
172 a71f835e Michael Hanselmann
      ])
173 a71f835e Michael Hanselmann
174 a71f835e Michael Hanselmann
    self.assertEqual(fn([
175 a71f835e Michael Hanselmann
      (0, {
176 a71f835e Michael Hanselmann
        constants.DDM_ADD: True,
177 a71f835e Michael Hanselmann
        constants.IDISK_SIZE: 4096,
178 a71f835e Michael Hanselmann
        }),
179 a71f835e Michael Hanselmann
      ]), [
180 a71f835e Michael Hanselmann
      (constants.DDM_ADD, 0, {
181 a71f835e Michael Hanselmann
        constants.IDISK_SIZE: 4096,
182 a71f835e Michael Hanselmann
        }),
183 a71f835e Michael Hanselmann
      ])
184 a71f835e Michael Hanselmann
185 a71f835e Michael Hanselmann
    self.assertEqual(fn([
186 a71f835e Michael Hanselmann
      (-1, {
187 a71f835e Michael Hanselmann
        constants.DDM_REMOVE: True,
188 a71f835e Michael Hanselmann
        }),
189 a71f835e Michael Hanselmann
      ]), [
190 a71f835e Michael Hanselmann
      (constants.DDM_REMOVE, -1, {}),
191 a71f835e Michael Hanselmann
      ])
192 a71f835e Michael Hanselmann
193 a71f835e Michael Hanselmann
194 a71f835e Michael Hanselmann
class TestParseDiskSizes(unittest.TestCase):
195 a71f835e Michael Hanselmann
  def test(self):
196 a71f835e Michael Hanselmann
    fn = gnt_instance._ParseDiskSizes
197 a71f835e Michael Hanselmann
198 a71f835e Michael Hanselmann
    self.assertEqual(fn([]), [])
199 a71f835e Michael Hanselmann
200 a71f835e Michael Hanselmann
    # Missing size parameter
201 a71f835e Michael Hanselmann
    self.assertRaises(errors.OpPrereqError, fn, [
202 a71f835e Michael Hanselmann
      (constants.DDM_ADD, 0, {}),
203 a71f835e Michael Hanselmann
      ])
204 a71f835e Michael Hanselmann
205 a71f835e Michael Hanselmann
    # Converting disk size
206 a71f835e Michael Hanselmann
    self.assertEqual(fn([
207 a71f835e Michael Hanselmann
      (constants.DDM_ADD, 11, {
208 a71f835e Michael Hanselmann
        constants.IDISK_SIZE: "9G",
209 a71f835e Michael Hanselmann
        }),
210 a71f835e Michael Hanselmann
      ]), [
211 a71f835e Michael Hanselmann
        (constants.DDM_ADD, 11, {
212 a71f835e Michael Hanselmann
          constants.IDISK_SIZE: 9216,
213 a71f835e Michael Hanselmann
          }),
214 a71f835e Michael Hanselmann
        ])
215 a71f835e Michael Hanselmann
216 a71f835e Michael Hanselmann
    # No size parameter
217 a71f835e Michael Hanselmann
    self.assertEqual(fn([
218 a71f835e Michael Hanselmann
      (constants.DDM_REMOVE, 11, {
219 a71f835e Michael Hanselmann
        "other": "24M",
220 a71f835e Michael Hanselmann
        }),
221 a71f835e Michael Hanselmann
      ]), [
222 a71f835e Michael Hanselmann
        (constants.DDM_REMOVE, 11, {
223 a71f835e Michael Hanselmann
          "other": "24M",
224 a71f835e Michael Hanselmann
          }),
225 a71f835e Michael Hanselmann
        ])
226 a71f835e Michael Hanselmann
227 a71f835e Michael Hanselmann
228 25ce3ec4 Michael Hanselmann
if __name__ == "__main__":
229 25ce3ec4 Michael Hanselmann
  testutils.GanetiTestProgram()