Statistics
| Branch: | Tag: | Revision:

root / test / py / ganeti.rapi.rlib2_unittest.py @ 1fa6fcba

History | View | Annotate | Download (58.7 kB)

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

24 6395cebb Michael Hanselmann
"""
25 6395cebb Michael Hanselmann
26 6395cebb Michael Hanselmann
27 6395cebb Michael Hanselmann
import unittest
28 50c7d82e Michael Hanselmann
import itertools
29 50c7d82e Michael Hanselmann
import random
30 6395cebb Michael Hanselmann
31 6395cebb Michael Hanselmann
from ganeti import constants
32 6395cebb Michael Hanselmann
from ganeti import opcodes
33 6395cebb Michael Hanselmann
from ganeti import compat
34 6395cebb Michael Hanselmann
from ganeti import http
35 b82d4c5e Michael Hanselmann
from ganeti import query
36 e02836d6 Michael Hanselmann
from ganeti import luxi
37 e02836d6 Michael Hanselmann
from ganeti import errors
38 de959245 Michael Hanselmann
from ganeti import rapi
39 6395cebb Michael Hanselmann
40 6395cebb Michael Hanselmann
from ganeti.rapi import rlib2
41 de959245 Michael Hanselmann
from ganeti.rapi import baserlib
42 de959245 Michael Hanselmann
from ganeti.rapi import connector
43 6395cebb Michael Hanselmann
44 6395cebb Michael Hanselmann
import testutils
45 6395cebb Michael Hanselmann
46 6395cebb Michael Hanselmann
47 e02836d6 Michael Hanselmann
class _FakeRequestPrivateData:
48 e02836d6 Michael Hanselmann
  def __init__(self, body_data):
49 e02836d6 Michael Hanselmann
    self.body_data = body_data
50 e02836d6 Michael Hanselmann
51 e02836d6 Michael Hanselmann
52 e02836d6 Michael Hanselmann
class _FakeRequest:
53 e02836d6 Michael Hanselmann
  def __init__(self, body_data):
54 e02836d6 Michael Hanselmann
    self.private = _FakeRequestPrivateData(body_data)
55 e02836d6 Michael Hanselmann
56 e02836d6 Michael Hanselmann
57 e02836d6 Michael Hanselmann
def _CreateHandler(cls, items, queryargs, body_data, client_cls):
58 e02836d6 Michael Hanselmann
  return cls(items, queryargs, _FakeRequest(body_data),
59 e02836d6 Michael Hanselmann
             _client_cls=client_cls)
60 e02836d6 Michael Hanselmann
61 e02836d6 Michael Hanselmann
62 50c7d82e Michael Hanselmann
class _FakeClient:
63 303bc802 Iustin Pop
  def __init__(self, address=None):
64 50c7d82e Michael Hanselmann
    self._jobs = []
65 50c7d82e Michael Hanselmann
66 50c7d82e Michael Hanselmann
  def GetNextSubmittedJob(self):
67 50c7d82e Michael Hanselmann
    return self._jobs.pop(0)
68 50c7d82e Michael Hanselmann
69 50c7d82e Michael Hanselmann
  def SubmitJob(self, ops):
70 50c7d82e Michael Hanselmann
    job_id = str(1 + int(random.random() * 1000000))
71 50c7d82e Michael Hanselmann
    self._jobs.append((job_id, ops))
72 50c7d82e Michael Hanselmann
    return job_id
73 50c7d82e Michael Hanselmann
74 50c7d82e Michael Hanselmann
75 50c7d82e Michael Hanselmann
class _FakeClientFactory:
76 50c7d82e Michael Hanselmann
  def __init__(self, cls):
77 50c7d82e Michael Hanselmann
    self._client_cls = cls
78 50c7d82e Michael Hanselmann
    self._clients = []
79 50c7d82e Michael Hanselmann
80 50c7d82e Michael Hanselmann
  def GetNextClient(self):
81 50c7d82e Michael Hanselmann
    return self._clients.pop(0)
82 50c7d82e Michael Hanselmann
83 303bc802 Iustin Pop
  def __call__(self, address=None):
84 303bc802 Iustin Pop
    cl = self._client_cls(address=address)
85 50c7d82e Michael Hanselmann
    self._clients.append(cl)
86 50c7d82e Michael Hanselmann
    return cl
87 50c7d82e Michael Hanselmann
88 50c7d82e Michael Hanselmann
89 b82d4c5e Michael Hanselmann
class TestConstants(unittest.TestCase):
90 b82d4c5e Michael Hanselmann
  def testConsole(self):
91 b82d4c5e Michael Hanselmann
    # Exporting the console field without authentication might expose
92 b82d4c5e Michael Hanselmann
    # information
93 b82d4c5e Michael Hanselmann
    assert "console" in query.INSTANCE_FIELDS
94 b82d4c5e Michael Hanselmann
    self.assertTrue("console" not in rlib2.I_FIELDS)
95 b82d4c5e Michael Hanselmann
96 f4e86448 Michael Hanselmann
  def testFields(self):
97 f4e86448 Michael Hanselmann
    checks = {
98 f4e86448 Michael Hanselmann
      constants.QR_INSTANCE: rlib2.I_FIELDS,
99 f4e86448 Michael Hanselmann
      constants.QR_NODE: rlib2.N_FIELDS,
100 f4e86448 Michael Hanselmann
      constants.QR_GROUP: rlib2.G_FIELDS,
101 f4e86448 Michael Hanselmann
      }
102 f4e86448 Michael Hanselmann
103 f4e86448 Michael Hanselmann
    for (qr, fields) in checks.items():
104 f4e86448 Michael Hanselmann
      self.assertFalse(set(fields) - set(query.ALL_FIELDS[qr].keys()))
105 f4e86448 Michael Hanselmann
106 b82d4c5e Michael Hanselmann
107 e02836d6 Michael Hanselmann
class TestClientConnectError(unittest.TestCase):
108 e02836d6 Michael Hanselmann
  @staticmethod
109 303bc802 Iustin Pop
  def _FailingClient(address=None):
110 e02836d6 Michael Hanselmann
    raise luxi.NoMasterError("test")
111 e02836d6 Michael Hanselmann
112 e02836d6 Michael Hanselmann
  def test(self):
113 e02836d6 Michael Hanselmann
    resources = [
114 e02836d6 Michael Hanselmann
      rlib2.R_2_groups,
115 e02836d6 Michael Hanselmann
      rlib2.R_2_instances,
116 e02836d6 Michael Hanselmann
      rlib2.R_2_nodes,
117 e02836d6 Michael Hanselmann
      ]
118 e02836d6 Michael Hanselmann
    for cls in resources:
119 61f8fda4 Michele Tartara
      handler = _CreateHandler(cls, ["name"], {}, None, self._FailingClient)
120 e02836d6 Michael Hanselmann
      self.assertRaises(http.HttpBadGateway, handler.GET)
121 e02836d6 Michael Hanselmann
122 e02836d6 Michael Hanselmann
123 e02836d6 Michael Hanselmann
class TestJobSubmitError(unittest.TestCase):
124 e02836d6 Michael Hanselmann
  class _SubmitErrorClient:
125 303bc802 Iustin Pop
    def __init__(self, address=None):
126 303bc802 Iustin Pop
      pass
127 303bc802 Iustin Pop
128 e02836d6 Michael Hanselmann
    @staticmethod
129 e02836d6 Michael Hanselmann
    def SubmitJob(ops):
130 e02836d6 Michael Hanselmann
      raise errors.JobQueueFull("test")
131 e02836d6 Michael Hanselmann
132 e02836d6 Michael Hanselmann
  def test(self):
133 61f8fda4 Michele Tartara
    handler = _CreateHandler(rlib2.R_2_redist_config, [], {}, None,
134 e02836d6 Michael Hanselmann
                             self._SubmitErrorClient)
135 e02836d6 Michael Hanselmann
    self.assertRaises(http.HttpServiceUnavailable, handler.PUT)
136 e02836d6 Michael Hanselmann
137 e02836d6 Michael Hanselmann
138 50c7d82e Michael Hanselmann
class TestClusterModify(unittest.TestCase):
139 50c7d82e Michael Hanselmann
  def test(self):
140 50c7d82e Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
141 61f8fda4 Michele Tartara
    handler = _CreateHandler(rlib2.R_2_cluster_modify, [], {}, {
142 50c7d82e Michael Hanselmann
      "vg_name": "testvg",
143 50c7d82e Michael Hanselmann
      "candidate_pool_size": 100,
144 50c7d82e Michael Hanselmann
      }, clfactory)
145 50c7d82e Michael Hanselmann
    job_id = handler.PUT()
146 50c7d82e Michael Hanselmann
147 50c7d82e Michael Hanselmann
    cl = clfactory.GetNextClient()
148 50c7d82e Michael Hanselmann
    self.assertRaises(IndexError, clfactory.GetNextClient)
149 50c7d82e Michael Hanselmann
150 50c7d82e Michael Hanselmann
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
151 50c7d82e Michael Hanselmann
    self.assertEqual(job_id, exp_job_id)
152 50c7d82e Michael Hanselmann
    self.assertTrue(isinstance(op, opcodes.OpClusterSetParams))
153 50c7d82e Michael Hanselmann
    self.assertEqual(op.vg_name, "testvg")
154 50c7d82e Michael Hanselmann
    self.assertEqual(op.candidate_pool_size, 100)
155 50c7d82e Michael Hanselmann
156 50c7d82e Michael Hanselmann
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
157 50c7d82e Michael Hanselmann
158 50c7d82e Michael Hanselmann
  def testInvalidValue(self):
159 50c7d82e Michael Hanselmann
    for attr in ["vg_name", "candidate_pool_size", "beparams", "_-Unknown#"]:
160 50c7d82e Michael Hanselmann
      clfactory = _FakeClientFactory(_FakeClient)
161 61f8fda4 Michele Tartara
      handler = _CreateHandler(rlib2.R_2_cluster_modify, [], {}, {
162 50c7d82e Michael Hanselmann
        attr: True,
163 50c7d82e Michael Hanselmann
        }, clfactory)
164 50c7d82e Michael Hanselmann
      self.assertRaises(http.HttpBadRequest, handler.PUT)
165 50c7d82e Michael Hanselmann
      self.assertRaises(IndexError, clfactory.GetNextClient)
166 50c7d82e Michael Hanselmann
167 50c7d82e Michael Hanselmann
168 8fd625fc Michael Hanselmann
class TestRedistConfig(unittest.TestCase):
169 8fd625fc Michael Hanselmann
  def test(self):
170 8fd625fc Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
171 61f8fda4 Michele Tartara
    handler = _CreateHandler(rlib2.R_2_redist_config, [], {}, None, clfactory)
172 8fd625fc Michael Hanselmann
    job_id = handler.PUT()
173 8fd625fc Michael Hanselmann
174 8fd625fc Michael Hanselmann
    cl = clfactory.GetNextClient()
175 8fd625fc Michael Hanselmann
    self.assertRaises(IndexError, clfactory.GetNextClient)
176 8fd625fc Michael Hanselmann
177 8fd625fc Michael Hanselmann
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
178 8fd625fc Michael Hanselmann
    self.assertEqual(job_id, exp_job_id)
179 8fd625fc Michael Hanselmann
    self.assertTrue(isinstance(op, opcodes.OpClusterRedistConf))
180 8fd625fc Michael Hanselmann
181 8fd625fc Michael Hanselmann
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
182 8fd625fc Michael Hanselmann
183 8fd625fc Michael Hanselmann
184 55168cc7 Michael Hanselmann
class TestNodeMigrate(unittest.TestCase):
185 55168cc7 Michael Hanselmann
  def test(self):
186 55168cc7 Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
187 55168cc7 Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_nodes_name_migrate, ["node1"], {}, {
188 55168cc7 Michael Hanselmann
      "iallocator": "fooalloc",
189 55168cc7 Michael Hanselmann
      }, clfactory)
190 55168cc7 Michael Hanselmann
    job_id = handler.POST()
191 55168cc7 Michael Hanselmann
192 55168cc7 Michael Hanselmann
    cl = clfactory.GetNextClient()
193 55168cc7 Michael Hanselmann
    self.assertRaises(IndexError, clfactory.GetNextClient)
194 55168cc7 Michael Hanselmann
195 55168cc7 Michael Hanselmann
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
196 55168cc7 Michael Hanselmann
    self.assertEqual(job_id, exp_job_id)
197 55168cc7 Michael Hanselmann
    self.assertTrue(isinstance(op, opcodes.OpNodeMigrate))
198 55168cc7 Michael Hanselmann
    self.assertEqual(op.node_name, "node1")
199 55168cc7 Michael Hanselmann
    self.assertEqual(op.iallocator, "fooalloc")
200 55168cc7 Michael Hanselmann
201 55168cc7 Michael Hanselmann
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
202 55168cc7 Michael Hanselmann
203 55168cc7 Michael Hanselmann
  def testQueryArgsConflict(self):
204 55168cc7 Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
205 55168cc7 Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_nodes_name_migrate, ["node2"], {
206 55168cc7 Michael Hanselmann
      "live": True,
207 55168cc7 Michael Hanselmann
      "mode": constants.HT_MIGRATION_NONLIVE,
208 55168cc7 Michael Hanselmann
      }, None, clfactory)
209 55168cc7 Michael Hanselmann
    self.assertRaises(http.HttpBadRequest, handler.POST)
210 55168cc7 Michael Hanselmann
    self.assertRaises(IndexError, clfactory.GetNextClient)
211 55168cc7 Michael Hanselmann
212 55168cc7 Michael Hanselmann
  def testQueryArgsMode(self):
213 55168cc7 Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
214 55168cc7 Michael Hanselmann
    queryargs = {
215 55168cc7 Michael Hanselmann
      "mode": [constants.HT_MIGRATION_LIVE],
216 55168cc7 Michael Hanselmann
      }
217 55168cc7 Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_nodes_name_migrate, ["node17292"],
218 55168cc7 Michael Hanselmann
                             queryargs, None, clfactory)
219 55168cc7 Michael Hanselmann
    job_id = handler.POST()
220 55168cc7 Michael Hanselmann
221 55168cc7 Michael Hanselmann
    cl = clfactory.GetNextClient()
222 55168cc7 Michael Hanselmann
    self.assertRaises(IndexError, clfactory.GetNextClient)
223 55168cc7 Michael Hanselmann
224 55168cc7 Michael Hanselmann
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
225 55168cc7 Michael Hanselmann
    self.assertEqual(job_id, exp_job_id)
226 55168cc7 Michael Hanselmann
    self.assertTrue(isinstance(op, opcodes.OpNodeMigrate))
227 55168cc7 Michael Hanselmann
    self.assertEqual(op.node_name, "node17292")
228 55168cc7 Michael Hanselmann
    self.assertEqual(op.mode, constants.HT_MIGRATION_LIVE)
229 55168cc7 Michael Hanselmann
230 55168cc7 Michael Hanselmann
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
231 55168cc7 Michael Hanselmann
232 55168cc7 Michael Hanselmann
  def testQueryArgsLive(self):
233 55168cc7 Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
234 55168cc7 Michael Hanselmann
235 55168cc7 Michael Hanselmann
    for live in [False, True]:
236 55168cc7 Michael Hanselmann
      queryargs = {
237 55168cc7 Michael Hanselmann
        "live": [str(int(live))],
238 55168cc7 Michael Hanselmann
        }
239 55168cc7 Michael Hanselmann
      handler = _CreateHandler(rlib2.R_2_nodes_name_migrate, ["node6940"],
240 55168cc7 Michael Hanselmann
                               queryargs, None, clfactory)
241 55168cc7 Michael Hanselmann
      job_id = handler.POST()
242 55168cc7 Michael Hanselmann
243 55168cc7 Michael Hanselmann
      cl = clfactory.GetNextClient()
244 55168cc7 Michael Hanselmann
      self.assertRaises(IndexError, clfactory.GetNextClient)
245 55168cc7 Michael Hanselmann
246 55168cc7 Michael Hanselmann
      (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
247 55168cc7 Michael Hanselmann
      self.assertEqual(job_id, exp_job_id)
248 55168cc7 Michael Hanselmann
      self.assertTrue(isinstance(op, opcodes.OpNodeMigrate))
249 55168cc7 Michael Hanselmann
      self.assertEqual(op.node_name, "node6940")
250 55168cc7 Michael Hanselmann
      if live:
251 55168cc7 Michael Hanselmann
        self.assertEqual(op.mode, constants.HT_MIGRATION_LIVE)
252 55168cc7 Michael Hanselmann
      else:
253 55168cc7 Michael Hanselmann
        self.assertEqual(op.mode, constants.HT_MIGRATION_NONLIVE)
254 55168cc7 Michael Hanselmann
255 55168cc7 Michael Hanselmann
      self.assertRaises(IndexError, cl.GetNextSubmittedJob)
256 55168cc7 Michael Hanselmann
257 55168cc7 Michael Hanselmann
258 7fa91722 Michael Hanselmann
class TestNodeEvacuate(unittest.TestCase):
259 7fa91722 Michael Hanselmann
  def test(self):
260 7fa91722 Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
261 7fa91722 Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_nodes_name_evacuate, ["node92"], {
262 7fa91722 Michael Hanselmann
      "dry-run": ["1"],
263 7fa91722 Michael Hanselmann
      }, {
264 7fa91722 Michael Hanselmann
      "mode": constants.IALLOCATOR_NEVAC_SEC,
265 7fa91722 Michael Hanselmann
      }, clfactory)
266 7fa91722 Michael Hanselmann
    job_id = handler.POST()
267 7fa91722 Michael Hanselmann
268 7fa91722 Michael Hanselmann
    cl = clfactory.GetNextClient()
269 7fa91722 Michael Hanselmann
    self.assertRaises(IndexError, clfactory.GetNextClient)
270 7fa91722 Michael Hanselmann
271 7fa91722 Michael Hanselmann
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
272 7fa91722 Michael Hanselmann
    self.assertEqual(job_id, exp_job_id)
273 7fa91722 Michael Hanselmann
    self.assertTrue(isinstance(op, opcodes.OpNodeEvacuate))
274 7fa91722 Michael Hanselmann
    self.assertEqual(op.node_name, "node92")
275 7fa91722 Michael Hanselmann
    self.assertEqual(op.mode, constants.IALLOCATOR_NEVAC_SEC)
276 7fa91722 Michael Hanselmann
    self.assertTrue(op.dry_run)
277 7fa91722 Michael Hanselmann
278 7fa91722 Michael Hanselmann
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
279 7fa91722 Michael Hanselmann
280 7fa91722 Michael Hanselmann
281 42d4d8b9 Michael Hanselmann
class TestNodePowercycle(unittest.TestCase):
282 42d4d8b9 Michael Hanselmann
  def test(self):
283 42d4d8b9 Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
284 42d4d8b9 Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_nodes_name_powercycle, ["node20744"], {
285 42d4d8b9 Michael Hanselmann
      "force": ["1"],
286 42d4d8b9 Michael Hanselmann
      }, None, clfactory)
287 42d4d8b9 Michael Hanselmann
    job_id = handler.POST()
288 42d4d8b9 Michael Hanselmann
289 42d4d8b9 Michael Hanselmann
    cl = clfactory.GetNextClient()
290 42d4d8b9 Michael Hanselmann
    self.assertRaises(IndexError, clfactory.GetNextClient)
291 42d4d8b9 Michael Hanselmann
292 42d4d8b9 Michael Hanselmann
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
293 42d4d8b9 Michael Hanselmann
    self.assertEqual(job_id, exp_job_id)
294 42d4d8b9 Michael Hanselmann
    self.assertTrue(isinstance(op, opcodes.OpNodePowercycle))
295 42d4d8b9 Michael Hanselmann
    self.assertEqual(op.node_name, "node20744")
296 42d4d8b9 Michael Hanselmann
    self.assertTrue(op.force)
297 42d4d8b9 Michael Hanselmann
298 42d4d8b9 Michael Hanselmann
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
299 42d4d8b9 Michael Hanselmann
300 42d4d8b9 Michael Hanselmann
301 87fd3ec7 Michael Hanselmann
class TestGroupAssignNodes(unittest.TestCase):
302 87fd3ec7 Michael Hanselmann
  def test(self):
303 87fd3ec7 Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
304 87fd3ec7 Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_groups_name_assign_nodes, ["grp-a"], {
305 87fd3ec7 Michael Hanselmann
      "dry-run": ["1"],
306 87fd3ec7 Michael Hanselmann
      "force": ["1"],
307 87fd3ec7 Michael Hanselmann
      }, {
308 87fd3ec7 Michael Hanselmann
      "nodes": ["n2", "n3"],
309 87fd3ec7 Michael Hanselmann
      }, clfactory)
310 87fd3ec7 Michael Hanselmann
    job_id = handler.PUT()
311 87fd3ec7 Michael Hanselmann
312 87fd3ec7 Michael Hanselmann
    cl = clfactory.GetNextClient()
313 87fd3ec7 Michael Hanselmann
    self.assertRaises(IndexError, clfactory.GetNextClient)
314 87fd3ec7 Michael Hanselmann
315 87fd3ec7 Michael Hanselmann
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
316 87fd3ec7 Michael Hanselmann
    self.assertEqual(job_id, exp_job_id)
317 87fd3ec7 Michael Hanselmann
    self.assertTrue(isinstance(op, opcodes.OpGroupAssignNodes))
318 87fd3ec7 Michael Hanselmann
    self.assertEqual(op.group_name, "grp-a")
319 87fd3ec7 Michael Hanselmann
    self.assertEqual(op.nodes, ["n2", "n3"])
320 87fd3ec7 Michael Hanselmann
    self.assertTrue(op.dry_run)
321 87fd3ec7 Michael Hanselmann
    self.assertTrue(op.force)
322 87fd3ec7 Michael Hanselmann
323 87fd3ec7 Michael Hanselmann
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
324 87fd3ec7 Michael Hanselmann
325 87fd3ec7 Michael Hanselmann
326 a6fa7892 Michael Hanselmann
class TestInstanceDelete(unittest.TestCase):
327 a6fa7892 Michael Hanselmann
  def test(self):
328 a6fa7892 Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
329 a6fa7892 Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_instances_name, ["inst30965"], {
330 a6fa7892 Michael Hanselmann
      "dry-run": ["1"],
331 a6fa7892 Michael Hanselmann
      }, {}, clfactory)
332 a6fa7892 Michael Hanselmann
    job_id = handler.DELETE()
333 a6fa7892 Michael Hanselmann
334 a6fa7892 Michael Hanselmann
    cl = clfactory.GetNextClient()
335 a6fa7892 Michael Hanselmann
    self.assertRaises(IndexError, clfactory.GetNextClient)
336 a6fa7892 Michael Hanselmann
337 a6fa7892 Michael Hanselmann
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
338 a6fa7892 Michael Hanselmann
    self.assertEqual(job_id, exp_job_id)
339 a6fa7892 Michael Hanselmann
    self.assertTrue(isinstance(op, opcodes.OpInstanceRemove))
340 a6fa7892 Michael Hanselmann
    self.assertEqual(op.instance_name, "inst30965")
341 a6fa7892 Michael Hanselmann
    self.assertTrue(op.dry_run)
342 a6fa7892 Michael Hanselmann
    self.assertFalse(op.ignore_failures)
343 a6fa7892 Michael Hanselmann
344 a6fa7892 Michael Hanselmann
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
345 a6fa7892 Michael Hanselmann
346 a6fa7892 Michael Hanselmann
347 7b3df961 Michael Hanselmann
class TestInstanceInfo(unittest.TestCase):
348 7b3df961 Michael Hanselmann
  def test(self):
349 7b3df961 Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
350 7b3df961 Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_instances_name_info, ["inst31217"], {
351 7b3df961 Michael Hanselmann
      "static": ["1"],
352 7b3df961 Michael Hanselmann
      }, {}, clfactory)
353 7b3df961 Michael Hanselmann
    job_id = handler.GET()
354 7b3df961 Michael Hanselmann
355 7b3df961 Michael Hanselmann
    cl = clfactory.GetNextClient()
356 7b3df961 Michael Hanselmann
    self.assertRaises(IndexError, clfactory.GetNextClient)
357 7b3df961 Michael Hanselmann
358 7b3df961 Michael Hanselmann
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
359 7b3df961 Michael Hanselmann
    self.assertEqual(job_id, exp_job_id)
360 7b3df961 Michael Hanselmann
    self.assertTrue(isinstance(op, opcodes.OpInstanceQueryData))
361 7b3df961 Michael Hanselmann
    self.assertEqual(op.instances, ["inst31217"])
362 7b3df961 Michael Hanselmann
    self.assertTrue(op.static)
363 7b3df961 Michael Hanselmann
364 7b3df961 Michael Hanselmann
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
365 7b3df961 Michael Hanselmann
366 7b3df961 Michael Hanselmann
367 ac4888c1 Michael Hanselmann
class TestInstanceReboot(unittest.TestCase):
368 ac4888c1 Michael Hanselmann
  def test(self):
369 ac4888c1 Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
370 ac4888c1 Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_instances_name_reboot, ["inst847"], {
371 ac4888c1 Michael Hanselmann
      "dry-run": ["1"],
372 ac4888c1 Michael Hanselmann
      "ignore_secondaries": ["1"],
373 55cec070 Michele Tartara
      "reason": ["System update"],
374 ac4888c1 Michael Hanselmann
      }, {}, clfactory)
375 ac4888c1 Michael Hanselmann
    job_id = handler.POST()
376 ac4888c1 Michael Hanselmann
377 ac4888c1 Michael Hanselmann
    cl = clfactory.GetNextClient()
378 ac4888c1 Michael Hanselmann
    self.assertRaises(IndexError, clfactory.GetNextClient)
379 ac4888c1 Michael Hanselmann
380 ac4888c1 Michael Hanselmann
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
381 ac4888c1 Michael Hanselmann
    self.assertEqual(job_id, exp_job_id)
382 ac4888c1 Michael Hanselmann
    self.assertTrue(isinstance(op, opcodes.OpInstanceReboot))
383 ac4888c1 Michael Hanselmann
    self.assertEqual(op.instance_name, "inst847")
384 ac4888c1 Michael Hanselmann
    self.assertEqual(op.reboot_type, constants.INSTANCE_REBOOT_HARD)
385 ac4888c1 Michael Hanselmann
    self.assertTrue(op.ignore_secondaries)
386 ac4888c1 Michael Hanselmann
    self.assertTrue(op.dry_run)
387 55cec070 Michele Tartara
    self.assertEqual(op.reason[0][0], constants.OPCODE_REASON_SRC_USER)
388 55cec070 Michele Tartara
    self.assertEqual(op.reason[0][1], "System update")
389 55cec070 Michele Tartara
    self.assertEqual(op.reason[1][0],
390 55cec070 Michele Tartara
                     "%s:%s" % (constants.OPCODE_REASON_SRC_RLIB2,
391 55cec070 Michele Tartara
                                "instances_name_reboot"))
392 55cec070 Michele Tartara
    self.assertEqual(op.reason[1][1], "")
393 ac4888c1 Michael Hanselmann
394 ac4888c1 Michael Hanselmann
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
395 ac4888c1 Michael Hanselmann
396 ac4888c1 Michael Hanselmann
397 4717e6eb Michael Hanselmann
class TestInstanceStartup(unittest.TestCase):
398 4717e6eb Michael Hanselmann
  def test(self):
399 4717e6eb Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
400 4717e6eb Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_instances_name_startup, ["inst31083"], {
401 4717e6eb Michael Hanselmann
      "force": ["1"],
402 4717e6eb Michael Hanselmann
      "no_remember": ["1"],
403 1fa6fcba Michele Tartara
      "reason": ["Newly created instance"],
404 4717e6eb Michael Hanselmann
      }, {}, clfactory)
405 4717e6eb Michael Hanselmann
    job_id = handler.PUT()
406 4717e6eb Michael Hanselmann
407 4717e6eb Michael Hanselmann
    cl = clfactory.GetNextClient()
408 4717e6eb Michael Hanselmann
    self.assertRaises(IndexError, clfactory.GetNextClient)
409 4717e6eb Michael Hanselmann
410 4717e6eb Michael Hanselmann
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
411 4717e6eb Michael Hanselmann
    self.assertEqual(job_id, exp_job_id)
412 4717e6eb Michael Hanselmann
    self.assertTrue(isinstance(op, opcodes.OpInstanceStartup))
413 4717e6eb Michael Hanselmann
    self.assertEqual(op.instance_name, "inst31083")
414 4717e6eb Michael Hanselmann
    self.assertTrue(op.no_remember)
415 4717e6eb Michael Hanselmann
    self.assertTrue(op.force)
416 4717e6eb Michael Hanselmann
    self.assertFalse(op.dry_run)
417 1fa6fcba Michele Tartara
    self.assertEqual(op.reason[0][0], constants.OPCODE_REASON_SRC_USER)
418 1fa6fcba Michele Tartara
    self.assertEqual(op.reason[0][1], "Newly created instance")
419 1fa6fcba Michele Tartara
    self.assertEqual(op.reason[1][0],
420 1fa6fcba Michele Tartara
                     "%s:%s" % (constants.OPCODE_REASON_SRC_RLIB2,
421 1fa6fcba Michele Tartara
                                "instances_name_startup"))
422 1fa6fcba Michele Tartara
    self.assertEqual(op.reason[1][1], "")
423 4717e6eb Michael Hanselmann
424 4717e6eb Michael Hanselmann
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
425 4717e6eb Michael Hanselmann
426 4717e6eb Michael Hanselmann
427 3175ade6 Michael Hanselmann
class TestInstanceShutdown(unittest.TestCase):
428 3175ade6 Michael Hanselmann
  def test(self):
429 3175ade6 Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
430 3175ade6 Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_instances_name_shutdown, ["inst26791"], {
431 3175ade6 Michael Hanselmann
      "no_remember": ["0"],
432 1f350e0f Michele Tartara
      "reason": ["Not used anymore"],
433 3175ade6 Michael Hanselmann
      }, {}, clfactory)
434 3175ade6 Michael Hanselmann
    job_id = handler.PUT()
435 3175ade6 Michael Hanselmann
436 3175ade6 Michael Hanselmann
    cl = clfactory.GetNextClient()
437 3175ade6 Michael Hanselmann
    self.assertRaises(IndexError, clfactory.GetNextClient)
438 3175ade6 Michael Hanselmann
439 3175ade6 Michael Hanselmann
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
440 3175ade6 Michael Hanselmann
    self.assertEqual(job_id, exp_job_id)
441 3175ade6 Michael Hanselmann
    self.assertTrue(isinstance(op, opcodes.OpInstanceShutdown))
442 3175ade6 Michael Hanselmann
    self.assertEqual(op.instance_name, "inst26791")
443 3175ade6 Michael Hanselmann
    self.assertFalse(op.no_remember)
444 3175ade6 Michael Hanselmann
    self.assertFalse(op.dry_run)
445 1f350e0f Michele Tartara
    self.assertEqual(op.reason[0][0], constants.OPCODE_REASON_SRC_USER)
446 1f350e0f Michele Tartara
    self.assertEqual(op.reason[0][1], "Not used anymore")
447 1f350e0f Michele Tartara
    self.assertEqual(op.reason[1][0],
448 1f350e0f Michele Tartara
                     "%s:%s" % (constants.OPCODE_REASON_SRC_RLIB2,
449 1f350e0f Michele Tartara
                                "instances_name_shutdown"))
450 1f350e0f Michele Tartara
    self.assertEqual(op.reason[1][1], "")
451 3175ade6 Michael Hanselmann
452 3175ade6 Michael Hanselmann
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
453 3175ade6 Michael Hanselmann
454 3175ade6 Michael Hanselmann
455 1824a7a1 Michael Hanselmann
class TestInstanceActivateDisks(unittest.TestCase):
456 1824a7a1 Michael Hanselmann
  def test(self):
457 1824a7a1 Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
458 1824a7a1 Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_instances_name_activate_disks, ["xyz"], {
459 1824a7a1 Michael Hanselmann
      "ignore_size": ["1"],
460 1824a7a1 Michael Hanselmann
      }, {}, clfactory)
461 1824a7a1 Michael Hanselmann
    job_id = handler.PUT()
462 1824a7a1 Michael Hanselmann
463 1824a7a1 Michael Hanselmann
    cl = clfactory.GetNextClient()
464 1824a7a1 Michael Hanselmann
    self.assertRaises(IndexError, clfactory.GetNextClient)
465 1824a7a1 Michael Hanselmann
466 1824a7a1 Michael Hanselmann
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
467 1824a7a1 Michael Hanselmann
    self.assertEqual(job_id, exp_job_id)
468 1824a7a1 Michael Hanselmann
    self.assertTrue(isinstance(op, opcodes.OpInstanceActivateDisks))
469 1824a7a1 Michael Hanselmann
    self.assertEqual(op.instance_name, "xyz")
470 1824a7a1 Michael Hanselmann
    self.assertTrue(op.ignore_size)
471 1824a7a1 Michael Hanselmann
    self.assertFalse(hasattr(op, "dry_run"))
472 1824a7a1 Michael Hanselmann
473 1824a7a1 Michael Hanselmann
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
474 1824a7a1 Michael Hanselmann
475 1824a7a1 Michael Hanselmann
476 973ec124 Michael Hanselmann
class TestInstanceDeactivateDisks(unittest.TestCase):
477 973ec124 Michael Hanselmann
  def test(self):
478 973ec124 Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
479 973ec124 Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_instances_name_deactivate_disks,
480 973ec124 Michael Hanselmann
                             ["inst22357"], {}, {}, clfactory)
481 973ec124 Michael Hanselmann
    job_id = handler.PUT()
482 973ec124 Michael Hanselmann
483 973ec124 Michael Hanselmann
    cl = clfactory.GetNextClient()
484 973ec124 Michael Hanselmann
    self.assertRaises(IndexError, clfactory.GetNextClient)
485 973ec124 Michael Hanselmann
486 973ec124 Michael Hanselmann
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
487 973ec124 Michael Hanselmann
    self.assertEqual(job_id, exp_job_id)
488 973ec124 Michael Hanselmann
    self.assertTrue(isinstance(op, opcodes.OpInstanceDeactivateDisks))
489 973ec124 Michael Hanselmann
    self.assertEqual(op.instance_name, "inst22357")
490 973ec124 Michael Hanselmann
    self.assertFalse(hasattr(op, "dry_run"))
491 973ec124 Michael Hanselmann
    self.assertFalse(hasattr(op, "force"))
492 a52978c7 Michael Hanselmann
493 a52978c7 Michael Hanselmann
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
494 a52978c7 Michael Hanselmann
495 a52978c7 Michael Hanselmann
496 a52978c7 Michael Hanselmann
class TestInstanceRecreateDisks(unittest.TestCase):
497 a52978c7 Michael Hanselmann
  def test(self):
498 a52978c7 Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
499 a52978c7 Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_instances_name_recreate_disks,
500 a52978c7 Michael Hanselmann
                             ["inst22357"], {}, {}, clfactory)
501 a52978c7 Michael Hanselmann
    job_id = handler.POST()
502 a52978c7 Michael Hanselmann
503 a52978c7 Michael Hanselmann
    cl = clfactory.GetNextClient()
504 a52978c7 Michael Hanselmann
    self.assertRaises(IndexError, clfactory.GetNextClient)
505 a52978c7 Michael Hanselmann
506 a52978c7 Michael Hanselmann
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
507 a52978c7 Michael Hanselmann
    self.assertEqual(job_id, exp_job_id)
508 a52978c7 Michael Hanselmann
    self.assertTrue(isinstance(op, opcodes.OpInstanceRecreateDisks))
509 a52978c7 Michael Hanselmann
    self.assertEqual(op.instance_name, "inst22357")
510 a52978c7 Michael Hanselmann
    self.assertFalse(hasattr(op, "dry_run"))
511 a52978c7 Michael Hanselmann
    self.assertFalse(hasattr(op, "force"))
512 973ec124 Michael Hanselmann
513 973ec124 Michael Hanselmann
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
514 973ec124 Michael Hanselmann
515 973ec124 Michael Hanselmann
516 b5f2ab80 Michael Hanselmann
class TestInstanceFailover(unittest.TestCase):
517 b5f2ab80 Michael Hanselmann
  def test(self):
518 b5f2ab80 Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
519 b5f2ab80 Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_instances_name_failover,
520 b5f2ab80 Michael Hanselmann
                             ["inst12794"], {}, {}, clfactory)
521 b5f2ab80 Michael Hanselmann
    job_id = handler.PUT()
522 b5f2ab80 Michael Hanselmann
523 b5f2ab80 Michael Hanselmann
    cl = clfactory.GetNextClient()
524 b5f2ab80 Michael Hanselmann
    self.assertRaises(IndexError, clfactory.GetNextClient)
525 b5f2ab80 Michael Hanselmann
526 b5f2ab80 Michael Hanselmann
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
527 b5f2ab80 Michael Hanselmann
    self.assertEqual(job_id, exp_job_id)
528 b5f2ab80 Michael Hanselmann
    self.assertTrue(isinstance(op, opcodes.OpInstanceFailover))
529 b5f2ab80 Michael Hanselmann
    self.assertEqual(op.instance_name, "inst12794")
530 b5f2ab80 Michael Hanselmann
    self.assertFalse(hasattr(op, "dry_run"))
531 b5f2ab80 Michael Hanselmann
    self.assertFalse(hasattr(op, "force"))
532 b5f2ab80 Michael Hanselmann
533 b5f2ab80 Michael Hanselmann
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
534 b5f2ab80 Michael Hanselmann
535 b5f2ab80 Michael Hanselmann
536 335965b9 Michael Hanselmann
class TestInstanceDiskGrow(unittest.TestCase):
537 335965b9 Michael Hanselmann
  def test(self):
538 335965b9 Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
539 335965b9 Michael Hanselmann
    data = {
540 335965b9 Michael Hanselmann
      "amount": 1024,
541 335965b9 Michael Hanselmann
      }
542 335965b9 Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_instances_name_disk_grow,
543 335965b9 Michael Hanselmann
                             ["inst10742", "3"], {}, data, clfactory)
544 335965b9 Michael Hanselmann
    job_id = handler.POST()
545 335965b9 Michael Hanselmann
546 335965b9 Michael Hanselmann
    cl = clfactory.GetNextClient()
547 335965b9 Michael Hanselmann
    self.assertRaises(IndexError, clfactory.GetNextClient)
548 335965b9 Michael Hanselmann
549 335965b9 Michael Hanselmann
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
550 335965b9 Michael Hanselmann
    self.assertEqual(job_id, exp_job_id)
551 335965b9 Michael Hanselmann
    self.assertTrue(isinstance(op, opcodes.OpInstanceGrowDisk))
552 335965b9 Michael Hanselmann
    self.assertEqual(op.instance_name, "inst10742")
553 335965b9 Michael Hanselmann
    self.assertEqual(op.disk, 3)
554 335965b9 Michael Hanselmann
    self.assertEqual(op.amount, 1024)
555 335965b9 Michael Hanselmann
    self.assertFalse(hasattr(op, "dry_run"))
556 335965b9 Michael Hanselmann
    self.assertFalse(hasattr(op, "force"))
557 335965b9 Michael Hanselmann
558 335965b9 Michael Hanselmann
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
559 335965b9 Michael Hanselmann
560 335965b9 Michael Hanselmann
561 1c63311d Michael Hanselmann
class TestBackupPrepare(unittest.TestCase):
562 1c63311d Michael Hanselmann
  def test(self):
563 1c63311d Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
564 1c63311d Michael Hanselmann
    queryargs = {
565 1c63311d Michael Hanselmann
      "mode": constants.EXPORT_MODE_REMOTE,
566 1c63311d Michael Hanselmann
      }
567 1c63311d Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_instances_name_prepare_export,
568 1c63311d Michael Hanselmann
                             ["inst17925"], queryargs, {}, clfactory)
569 1c63311d Michael Hanselmann
    job_id = handler.PUT()
570 1c63311d Michael Hanselmann
571 1c63311d Michael Hanselmann
    cl = clfactory.GetNextClient()
572 1c63311d Michael Hanselmann
    self.assertRaises(IndexError, clfactory.GetNextClient)
573 1c63311d Michael Hanselmann
574 1c63311d Michael Hanselmann
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
575 1c63311d Michael Hanselmann
    self.assertEqual(job_id, exp_job_id)
576 1c63311d Michael Hanselmann
    self.assertTrue(isinstance(op, opcodes.OpBackupPrepare))
577 1c63311d Michael Hanselmann
    self.assertEqual(op.instance_name, "inst17925")
578 1c63311d Michael Hanselmann
    self.assertEqual(op.mode, constants.EXPORT_MODE_REMOTE)
579 1c63311d Michael Hanselmann
    self.assertFalse(hasattr(op, "dry_run"))
580 1c63311d Michael Hanselmann
    self.assertFalse(hasattr(op, "force"))
581 1c63311d Michael Hanselmann
582 1c63311d Michael Hanselmann
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
583 1c63311d Michael Hanselmann
584 1c63311d Michael Hanselmann
585 86f1f5d4 Michael Hanselmann
class TestGroupRemove(unittest.TestCase):
586 86f1f5d4 Michael Hanselmann
  def test(self):
587 86f1f5d4 Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
588 86f1f5d4 Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_groups_name,
589 86f1f5d4 Michael Hanselmann
                             ["grp28575"], {}, {}, clfactory)
590 86f1f5d4 Michael Hanselmann
    job_id = handler.DELETE()
591 86f1f5d4 Michael Hanselmann
592 86f1f5d4 Michael Hanselmann
    cl = clfactory.GetNextClient()
593 86f1f5d4 Michael Hanselmann
    self.assertRaises(IndexError, clfactory.GetNextClient)
594 86f1f5d4 Michael Hanselmann
595 86f1f5d4 Michael Hanselmann
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
596 86f1f5d4 Michael Hanselmann
    self.assertEqual(job_id, exp_job_id)
597 86f1f5d4 Michael Hanselmann
    self.assertTrue(isinstance(op, opcodes.OpGroupRemove))
598 86f1f5d4 Michael Hanselmann
    self.assertEqual(op.group_name, "grp28575")
599 86f1f5d4 Michael Hanselmann
    self.assertFalse(op.dry_run)
600 86f1f5d4 Michael Hanselmann
    self.assertFalse(hasattr(op, "force"))
601 86f1f5d4 Michael Hanselmann
602 86f1f5d4 Michael Hanselmann
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
603 86f1f5d4 Michael Hanselmann
604 86f1f5d4 Michael Hanselmann
605 eb08e09d Michael Hanselmann
class TestStorageQuery(unittest.TestCase):
606 eb08e09d Michael Hanselmann
  def test(self):
607 eb08e09d Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
608 eb08e09d Michael Hanselmann
    queryargs = {
609 eb08e09d Michael Hanselmann
      "storage_type": constants.ST_LVM_PV,
610 eb08e09d Michael Hanselmann
      "output_fields": "name,other",
611 eb08e09d Michael Hanselmann
      }
612 eb08e09d Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_nodes_name_storage,
613 eb08e09d Michael Hanselmann
                             ["node21075"], queryargs, {}, clfactory)
614 eb08e09d Michael Hanselmann
    job_id = handler.GET()
615 eb08e09d Michael Hanselmann
616 eb08e09d Michael Hanselmann
    cl = clfactory.GetNextClient()
617 eb08e09d Michael Hanselmann
    self.assertRaises(IndexError, clfactory.GetNextClient)
618 eb08e09d Michael Hanselmann
619 eb08e09d Michael Hanselmann
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
620 eb08e09d Michael Hanselmann
    self.assertEqual(job_id, exp_job_id)
621 eb08e09d Michael Hanselmann
    self.assertTrue(isinstance(op, opcodes.OpNodeQueryStorage))
622 eb08e09d Michael Hanselmann
    self.assertEqual(op.nodes, ["node21075"])
623 eb08e09d Michael Hanselmann
    self.assertEqual(op.storage_type, constants.ST_LVM_PV)
624 eb08e09d Michael Hanselmann
    self.assertEqual(op.output_fields, ["name", "other"])
625 eb08e09d Michael Hanselmann
    self.assertFalse(hasattr(op, "dry_run"))
626 eb08e09d Michael Hanselmann
    self.assertFalse(hasattr(op, "force"))
627 eb08e09d Michael Hanselmann
628 eb08e09d Michael Hanselmann
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
629 eb08e09d Michael Hanselmann
630 eb08e09d Michael Hanselmann
  def testErrors(self):
631 eb08e09d Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
632 eb08e09d Michael Hanselmann
633 eb08e09d Michael Hanselmann
    queryargs = {
634 eb08e09d Michael Hanselmann
      "output_fields": "name,other",
635 eb08e09d Michael Hanselmann
      }
636 eb08e09d Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_nodes_name_storage,
637 eb08e09d Michael Hanselmann
                             ["node10538"], queryargs, {}, clfactory)
638 eb08e09d Michael Hanselmann
    self.assertRaises(http.HttpBadRequest, handler.GET)
639 eb08e09d Michael Hanselmann
640 eb08e09d Michael Hanselmann
    queryargs = {
641 eb08e09d Michael Hanselmann
      "storage_type": constants.ST_LVM_VG,
642 eb08e09d Michael Hanselmann
      }
643 eb08e09d Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_nodes_name_storage,
644 eb08e09d Michael Hanselmann
                             ["node21273"], queryargs, {}, clfactory)
645 eb08e09d Michael Hanselmann
    self.assertRaises(http.HttpBadRequest, handler.GET)
646 eb08e09d Michael Hanselmann
647 eb08e09d Michael Hanselmann
    queryargs = {
648 eb08e09d Michael Hanselmann
      "storage_type": "##unknown_storage##",
649 eb08e09d Michael Hanselmann
      "output_fields": "name,other",
650 eb08e09d Michael Hanselmann
      }
651 eb08e09d Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_nodes_name_storage,
652 eb08e09d Michael Hanselmann
                             ["node10315"], queryargs, {}, clfactory)
653 eb08e09d Michael Hanselmann
    self.assertRaises(http.HttpBadRequest, handler.GET)
654 eb08e09d Michael Hanselmann
655 eb08e09d Michael Hanselmann
656 8d232068 Michael Hanselmann
class TestStorageModify(unittest.TestCase):
657 8d232068 Michael Hanselmann
  def test(self):
658 8d232068 Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
659 8d232068 Michael Hanselmann
660 8d232068 Michael Hanselmann
    for allocatable in [None, "1", "0"]:
661 8d232068 Michael Hanselmann
      queryargs = {
662 8d232068 Michael Hanselmann
        "storage_type": constants.ST_LVM_VG,
663 8d232068 Michael Hanselmann
        "name": "pv-a",
664 8d232068 Michael Hanselmann
        }
665 8d232068 Michael Hanselmann
666 8d232068 Michael Hanselmann
      if allocatable is not None:
667 8d232068 Michael Hanselmann
        queryargs["allocatable"] = allocatable
668 8d232068 Michael Hanselmann
669 8d232068 Michael Hanselmann
      handler = _CreateHandler(rlib2.R_2_nodes_name_storage_modify,
670 8d232068 Michael Hanselmann
                               ["node9292"], queryargs, {}, clfactory)
671 8d232068 Michael Hanselmann
      job_id = handler.PUT()
672 8d232068 Michael Hanselmann
673 8d232068 Michael Hanselmann
      cl = clfactory.GetNextClient()
674 8d232068 Michael Hanselmann
      self.assertRaises(IndexError, clfactory.GetNextClient)
675 8d232068 Michael Hanselmann
676 8d232068 Michael Hanselmann
      (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
677 8d232068 Michael Hanselmann
      self.assertEqual(job_id, exp_job_id)
678 8d232068 Michael Hanselmann
      self.assertTrue(isinstance(op, opcodes.OpNodeModifyStorage))
679 8d232068 Michael Hanselmann
      self.assertEqual(op.node_name, "node9292")
680 8d232068 Michael Hanselmann
      self.assertEqual(op.storage_type, constants.ST_LVM_VG)
681 8d232068 Michael Hanselmann
      self.assertEqual(op.name, "pv-a")
682 8d232068 Michael Hanselmann
      if allocatable is None:
683 8d232068 Michael Hanselmann
        self.assertFalse(op.changes)
684 8d232068 Michael Hanselmann
      else:
685 8d232068 Michael Hanselmann
        assert allocatable in ("0", "1")
686 8d232068 Michael Hanselmann
        self.assertEqual(op.changes, {
687 8d232068 Michael Hanselmann
          constants.SF_ALLOCATABLE: (allocatable == "1"),
688 8d232068 Michael Hanselmann
          })
689 8d232068 Michael Hanselmann
      self.assertFalse(hasattr(op, "dry_run"))
690 8d232068 Michael Hanselmann
      self.assertFalse(hasattr(op, "force"))
691 8d232068 Michael Hanselmann
692 8d232068 Michael Hanselmann
      self.assertRaises(IndexError, cl.GetNextSubmittedJob)
693 8d232068 Michael Hanselmann
694 8d232068 Michael Hanselmann
  def testErrors(self):
695 8d232068 Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
696 8d232068 Michael Hanselmann
697 8d232068 Michael Hanselmann
    # No storage type
698 8d232068 Michael Hanselmann
    queryargs = {
699 8d232068 Michael Hanselmann
      "name": "xyz",
700 8d232068 Michael Hanselmann
      }
701 8d232068 Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_nodes_name_storage_modify,
702 8d232068 Michael Hanselmann
                             ["node26016"], queryargs, {}, clfactory)
703 8d232068 Michael Hanselmann
    self.assertRaises(http.HttpBadRequest, handler.PUT)
704 8d232068 Michael Hanselmann
705 8d232068 Michael Hanselmann
    # No name
706 8d232068 Michael Hanselmann
    queryargs = {
707 8d232068 Michael Hanselmann
      "storage_type": constants.ST_LVM_VG,
708 8d232068 Michael Hanselmann
      }
709 8d232068 Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_nodes_name_storage_modify,
710 8d232068 Michael Hanselmann
                             ["node21218"], queryargs, {}, clfactory)
711 8d232068 Michael Hanselmann
    self.assertRaises(http.HttpBadRequest, handler.PUT)
712 8d232068 Michael Hanselmann
713 8d232068 Michael Hanselmann
    # Invalid value
714 8d232068 Michael Hanselmann
    queryargs = {
715 8d232068 Michael Hanselmann
      "storage_type": constants.ST_LVM_VG,
716 8d232068 Michael Hanselmann
      "name": "pv-b",
717 8d232068 Michael Hanselmann
      "allocatable": "noint",
718 8d232068 Michael Hanselmann
      }
719 8d232068 Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_nodes_name_storage_modify,
720 8d232068 Michael Hanselmann
                             ["node30685"], queryargs, {}, clfactory)
721 8d232068 Michael Hanselmann
    self.assertRaises(http.HttpBadRequest, handler.PUT)
722 8d232068 Michael Hanselmann
723 8d232068 Michael Hanselmann
724 98270691 Michael Hanselmann
class TestStorageRepair(unittest.TestCase):
725 98270691 Michael Hanselmann
  def test(self):
726 98270691 Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
727 98270691 Michael Hanselmann
    queryargs = {
728 98270691 Michael Hanselmann
      "storage_type": constants.ST_LVM_PV,
729 98270691 Michael Hanselmann
      "name": "pv16611",
730 98270691 Michael Hanselmann
      }
731 98270691 Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_nodes_name_storage_repair,
732 98270691 Michael Hanselmann
                             ["node19265"], queryargs, {}, clfactory)
733 98270691 Michael Hanselmann
    job_id = handler.PUT()
734 98270691 Michael Hanselmann
735 98270691 Michael Hanselmann
    cl = clfactory.GetNextClient()
736 98270691 Michael Hanselmann
    self.assertRaises(IndexError, clfactory.GetNextClient)
737 98270691 Michael Hanselmann
738 98270691 Michael Hanselmann
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
739 98270691 Michael Hanselmann
    self.assertEqual(job_id, exp_job_id)
740 98270691 Michael Hanselmann
    self.assertTrue(isinstance(op, opcodes.OpRepairNodeStorage))
741 98270691 Michael Hanselmann
    self.assertEqual(op.node_name, "node19265")
742 98270691 Michael Hanselmann
    self.assertEqual(op.storage_type, constants.ST_LVM_PV)
743 98270691 Michael Hanselmann
    self.assertEqual(op.name, "pv16611")
744 98270691 Michael Hanselmann
    self.assertFalse(hasattr(op, "dry_run"))
745 98270691 Michael Hanselmann
    self.assertFalse(hasattr(op, "force"))
746 98270691 Michael Hanselmann
747 98270691 Michael Hanselmann
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
748 98270691 Michael Hanselmann
749 98270691 Michael Hanselmann
  def testErrors(self):
750 98270691 Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
751 98270691 Michael Hanselmann
752 98270691 Michael Hanselmann
    # No storage type
753 98270691 Michael Hanselmann
    queryargs = {
754 98270691 Michael Hanselmann
      "name": "xyz",
755 98270691 Michael Hanselmann
      }
756 98270691 Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_nodes_name_storage_repair,
757 98270691 Michael Hanselmann
                             ["node11275"], queryargs, {}, clfactory)
758 98270691 Michael Hanselmann
    self.assertRaises(http.HttpBadRequest, handler.PUT)
759 98270691 Michael Hanselmann
760 98270691 Michael Hanselmann
    # No name
761 98270691 Michael Hanselmann
    queryargs = {
762 98270691 Michael Hanselmann
      "storage_type": constants.ST_LVM_VG,
763 98270691 Michael Hanselmann
      }
764 98270691 Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_nodes_name_storage_repair,
765 98270691 Michael Hanselmann
                             ["node21218"], queryargs, {}, clfactory)
766 98270691 Michael Hanselmann
    self.assertRaises(http.HttpBadRequest, handler.PUT)
767 98270691 Michael Hanselmann
768 98270691 Michael Hanselmann
769 460ef073 Michael Hanselmann
class TestTags(unittest.TestCase):
770 460ef073 Michael Hanselmann
  TAG_HANDLERS = [
771 460ef073 Michael Hanselmann
    rlib2.R_2_instances_name_tags,
772 460ef073 Michael Hanselmann
    rlib2.R_2_nodes_name_tags,
773 460ef073 Michael Hanselmann
    rlib2.R_2_groups_name_tags,
774 460ef073 Michael Hanselmann
    rlib2.R_2_tags,
775 460ef073 Michael Hanselmann
    ]
776 460ef073 Michael Hanselmann
777 460ef073 Michael Hanselmann
  def testSetAndDelete(self):
778 460ef073 Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
779 460ef073 Michael Hanselmann
780 460ef073 Michael Hanselmann
    for method, opcls in [("PUT", opcodes.OpTagsSet),
781 460ef073 Michael Hanselmann
                          ("DELETE", opcodes.OpTagsDel)]:
782 460ef073 Michael Hanselmann
      for idx, handler in enumerate(self.TAG_HANDLERS):
783 460ef073 Michael Hanselmann
        dry_run = bool(idx % 2)
784 460ef073 Michael Hanselmann
        name = "test%s" % idx
785 460ef073 Michael Hanselmann
        queryargs = {
786 460ef073 Michael Hanselmann
          "tag": ["foo", "bar", "baz"],
787 460ef073 Michael Hanselmann
          "dry-run": str(int(dry_run)),
788 460ef073 Michael Hanselmann
          }
789 460ef073 Michael Hanselmann
790 460ef073 Michael Hanselmann
        handler = _CreateHandler(handler, [name], queryargs, {}, clfactory)
791 460ef073 Michael Hanselmann
        job_id = getattr(handler, method)()
792 460ef073 Michael Hanselmann
793 460ef073 Michael Hanselmann
        cl = clfactory.GetNextClient()
794 460ef073 Michael Hanselmann
        self.assertRaises(IndexError, clfactory.GetNextClient)
795 460ef073 Michael Hanselmann
796 460ef073 Michael Hanselmann
        (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
797 460ef073 Michael Hanselmann
        self.assertEqual(job_id, exp_job_id)
798 460ef073 Michael Hanselmann
        self.assertTrue(isinstance(op, opcls))
799 460ef073 Michael Hanselmann
        self.assertEqual(op.kind, handler.TAG_LEVEL)
800 460ef073 Michael Hanselmann
        if handler.TAG_LEVEL == constants.TAG_CLUSTER:
801 460ef073 Michael Hanselmann
          self.assertTrue(op.name is None)
802 460ef073 Michael Hanselmann
        else:
803 460ef073 Michael Hanselmann
          self.assertEqual(op.name, name)
804 460ef073 Michael Hanselmann
        self.assertEqual(op.tags, ["foo", "bar", "baz"])
805 460ef073 Michael Hanselmann
        self.assertEqual(op.dry_run, dry_run)
806 460ef073 Michael Hanselmann
        self.assertFalse(hasattr(op, "force"))
807 460ef073 Michael Hanselmann
808 460ef073 Michael Hanselmann
        self.assertRaises(IndexError, cl.GetNextSubmittedJob)
809 460ef073 Michael Hanselmann
810 460ef073 Michael Hanselmann
811 09a43b39 Michael Hanselmann
class TestInstanceCreation(testutils.GanetiTestCase):
812 09a43b39 Michael Hanselmann
  def test(self):
813 09a43b39 Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
814 6395cebb Michael Hanselmann
815 09a43b39 Michael Hanselmann
    name = "inst863.example.com"
816 6395cebb Michael Hanselmann
817 6395cebb Michael Hanselmann
    disk_variants = [
818 6395cebb Michael Hanselmann
      # No disks
819 6395cebb Michael Hanselmann
      [],
820 6395cebb Michael Hanselmann
821 6395cebb Michael Hanselmann
      # Two disks
822 6395cebb Michael Hanselmann
      [{"size": 5, }, {"size": 100, }],
823 6395cebb Michael Hanselmann
824 6395cebb Michael Hanselmann
      # Disk with mode
825 6395cebb Michael Hanselmann
      [{"size": 123, "mode": constants.DISK_RDWR, }],
826 6395cebb Michael Hanselmann
      ]
827 6395cebb Michael Hanselmann
828 6395cebb Michael Hanselmann
    nic_variants = [
829 6395cebb Michael Hanselmann
      # No NIC
830 6395cebb Michael Hanselmann
      [],
831 6395cebb Michael Hanselmann
832 6395cebb Michael Hanselmann
      # Three NICs
833 6395cebb Michael Hanselmann
      [{}, {}, {}],
834 6395cebb Michael Hanselmann
835 6395cebb Michael Hanselmann
      # Two NICs
836 6395cebb Michael Hanselmann
      [
837 54dc4fdb Michael Hanselmann
        { "ip": "192.0.2.6", "mode": constants.NIC_MODE_ROUTED,
838 7be048f0 Michael Hanselmann
          "mac": "01:23:45:67:68:9A",
839 7be048f0 Michael Hanselmann
        },
840 ba05464f Guido Trotter
        { "mode": constants.NIC_MODE_BRIDGED, "link": "br1" },
841 6395cebb Michael Hanselmann
      ],
842 6395cebb Michael Hanselmann
      ]
843 6395cebb Michael Hanselmann
844 6395cebb Michael Hanselmann
    beparam_variants = [
845 6395cebb Michael Hanselmann
      None,
846 6395cebb Michael Hanselmann
      {},
847 6395cebb Michael Hanselmann
      { constants.BE_VCPUS: 2, },
848 861610e9 Guido Trotter
      { constants.BE_MAXMEM: 200, },
849 861610e9 Guido Trotter
      { constants.BE_MEMORY: 256, },
850 6395cebb Michael Hanselmann
      { constants.BE_VCPUS: 2,
851 861610e9 Guido Trotter
        constants.BE_MAXMEM: 1024,
852 861610e9 Guido Trotter
        constants.BE_MINMEM: 1024,
853 42a769f9 Bernardo Dal Seno
        constants.BE_AUTO_BALANCE: True,
854 42a769f9 Bernardo Dal Seno
        constants.BE_ALWAYS_FAILOVER: True, }
855 6395cebb Michael Hanselmann
      ]
856 6395cebb Michael Hanselmann
857 6395cebb Michael Hanselmann
    hvparam_variants = [
858 6395cebb Michael Hanselmann
      None,
859 6395cebb Michael Hanselmann
      { constants.HV_BOOT_ORDER: "anc", },
860 6395cebb Michael Hanselmann
      { constants.HV_KERNEL_PATH: "/boot/fookernel",
861 6395cebb Michael Hanselmann
        constants.HV_ROOT_PATH: "/dev/hda1", },
862 6395cebb Michael Hanselmann
      ]
863 6395cebb Michael Hanselmann
864 6395cebb Michael Hanselmann
    for mode in [constants.INSTANCE_CREATE, constants.INSTANCE_IMPORT]:
865 6395cebb Michael Hanselmann
      for nics in nic_variants:
866 6395cebb Michael Hanselmann
        for disk_template in constants.DISK_TEMPLATES:
867 6395cebb Michael Hanselmann
          for disks in disk_variants:
868 6395cebb Michael Hanselmann
            for beparams in beparam_variants:
869 6395cebb Michael Hanselmann
              for hvparams in hvparam_variants:
870 6395cebb Michael Hanselmann
                for dry_run in [False, True]:
871 09a43b39 Michael Hanselmann
                  queryargs = {
872 09a43b39 Michael Hanselmann
                    "dry-run": str(int(dry_run)),
873 09a43b39 Michael Hanselmann
                    }
874 09a43b39 Michael Hanselmann
875 09a43b39 Michael Hanselmann
                  data = {
876 09a43b39 Michael Hanselmann
                    rlib2._REQ_DATA_VERSION: 1,
877 09a43b39 Michael Hanselmann
                    "name": name,
878 09a43b39 Michael Hanselmann
                    "hypervisor": constants.HT_FAKE,
879 09a43b39 Michael Hanselmann
                    "disks": disks,
880 09a43b39 Michael Hanselmann
                    "nics": nics,
881 09a43b39 Michael Hanselmann
                    "mode": mode,
882 09a43b39 Michael Hanselmann
                    "disk_template": disk_template,
883 09a43b39 Michael Hanselmann
                    "os": "debootstrap",
884 09a43b39 Michael Hanselmann
                    }
885 09a43b39 Michael Hanselmann
886 09a43b39 Michael Hanselmann
                  if beparams is not None:
887 09a43b39 Michael Hanselmann
                    data["beparams"] = beparams
888 09a43b39 Michael Hanselmann
889 09a43b39 Michael Hanselmann
                  if hvparams is not None:
890 09a43b39 Michael Hanselmann
                    data["hvparams"] = hvparams
891 09a43b39 Michael Hanselmann
892 09a43b39 Michael Hanselmann
                  handler = _CreateHandler(rlib2.R_2_instances, [],
893 09a43b39 Michael Hanselmann
                                           queryargs, data, clfactory)
894 09a43b39 Michael Hanselmann
                  job_id = handler.POST()
895 09a43b39 Michael Hanselmann
896 09a43b39 Michael Hanselmann
                  cl = clfactory.GetNextClient()
897 09a43b39 Michael Hanselmann
                  self.assertRaises(IndexError, clfactory.GetNextClient)
898 09a43b39 Michael Hanselmann
899 09a43b39 Michael Hanselmann
                  (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
900 09a43b39 Michael Hanselmann
                  self.assertEqual(job_id, exp_job_id)
901 09a43b39 Michael Hanselmann
                  self.assertRaises(IndexError, cl.GetNextSubmittedJob)
902 09a43b39 Michael Hanselmann
903 09a43b39 Michael Hanselmann
                  self.assertTrue(isinstance(op, opcodes.OpInstanceCreate))
904 09a43b39 Michael Hanselmann
                  self.assertEqual(op.instance_name, name)
905 6395cebb Michael Hanselmann
                  self.assertEqual(op.mode, mode)
906 6395cebb Michael Hanselmann
                  self.assertEqual(op.disk_template, disk_template)
907 6395cebb Michael Hanselmann
                  self.assertEqual(op.dry_run, dry_run)
908 6395cebb Michael Hanselmann
                  self.assertEqual(len(op.disks), len(disks))
909 6395cebb Michael Hanselmann
                  self.assertEqual(len(op.nics), len(nics))
910 6395cebb Michael Hanselmann
911 7be048f0 Michael Hanselmann
                  for opdisk, disk in zip(op.disks, disks):
912 7be048f0 Michael Hanselmann
                    for key in constants.IDISK_PARAMS:
913 7be048f0 Michael Hanselmann
                      self.assertEqual(opdisk.get(key), disk.get(key))
914 7be048f0 Michael Hanselmann
                    self.assertFalse("unknown" in opdisk)
915 7be048f0 Michael Hanselmann
916 7be048f0 Michael Hanselmann
                  for opnic, nic in zip(op.nics, nics):
917 7be048f0 Michael Hanselmann
                    for key in constants.INIC_PARAMS:
918 7be048f0 Michael Hanselmann
                      self.assertEqual(opnic.get(key), nic.get(key))
919 7be048f0 Michael Hanselmann
                    self.assertFalse("unknown" in opnic)
920 7be048f0 Michael Hanselmann
                    self.assertFalse("foobar" in opnic)
921 6395cebb Michael Hanselmann
922 6395cebb Michael Hanselmann
                  if beparams is None:
923 526a662a Michael Hanselmann
                    self.assertFalse(hasattr(op, "beparams"))
924 6395cebb Michael Hanselmann
                  else:
925 6395cebb Michael Hanselmann
                    self.assertEqualValues(op.beparams, beparams)
926 6395cebb Michael Hanselmann
927 6395cebb Michael Hanselmann
                  if hvparams is None:
928 526a662a Michael Hanselmann
                    self.assertFalse(hasattr(op, "hvparams"))
929 6395cebb Michael Hanselmann
                  else:
930 6395cebb Michael Hanselmann
                    self.assertEqualValues(op.hvparams, hvparams)
931 6395cebb Michael Hanselmann
932 526a662a Michael Hanselmann
  def testLegacyName(self):
933 09a43b39 Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
934 09a43b39 Michael Hanselmann
935 526a662a Michael Hanselmann
    name = "inst29128.example.com"
936 526a662a Michael Hanselmann
    data = {
937 09a43b39 Michael Hanselmann
      rlib2._REQ_DATA_VERSION: 1,
938 526a662a Michael Hanselmann
      "name": name,
939 526a662a Michael Hanselmann
      "disks": [],
940 526a662a Michael Hanselmann
      "nics": [],
941 526a662a Michael Hanselmann
      "mode": constants.INSTANCE_CREATE,
942 526a662a Michael Hanselmann
      "disk_template": constants.DT_PLAIN,
943 526a662a Michael Hanselmann
      }
944 09a43b39 Michael Hanselmann
945 09a43b39 Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_instances, [], {}, data, clfactory)
946 09a43b39 Michael Hanselmann
    job_id = handler.POST()
947 09a43b39 Michael Hanselmann
948 09a43b39 Michael Hanselmann
    cl = clfactory.GetNextClient()
949 09a43b39 Michael Hanselmann
    self.assertRaises(IndexError, clfactory.GetNextClient)
950 09a43b39 Michael Hanselmann
951 09a43b39 Michael Hanselmann
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
952 09a43b39 Michael Hanselmann
    self.assertEqual(job_id, exp_job_id)
953 09a43b39 Michael Hanselmann
    self.assertTrue(isinstance(op, opcodes.OpInstanceCreate))
954 526a662a Michael Hanselmann
    self.assertEqual(op.instance_name, name)
955 526a662a Michael Hanselmann
    self.assertFalse(hasattr(op, "name"))
956 09a43b39 Michael Hanselmann
    self.assertFalse(op.dry_run)
957 09a43b39 Michael Hanselmann
958 09a43b39 Michael Hanselmann
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
959 526a662a Michael Hanselmann
960 526a662a Michael Hanselmann
    # Define both
961 09a43b39 Michael Hanselmann
    data["instance_name"] = "other.example.com"
962 09a43b39 Michael Hanselmann
    assert "name" in data and "instance_name" in data
963 09a43b39 Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_instances, [], {}, data, clfactory)
964 09a43b39 Michael Hanselmann
    self.assertRaises(http.HttpBadRequest, handler.POST)
965 09a43b39 Michael Hanselmann
    self.assertRaises(IndexError, clfactory.GetNextClient)
966 526a662a Michael Hanselmann
967 526a662a Michael Hanselmann
  def testLegacyOs(self):
968 09a43b39 Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
969 09a43b39 Michael Hanselmann
970 526a662a Michael Hanselmann
    name = "inst4673.example.com"
971 526a662a Michael Hanselmann
    os = "linux29206"
972 526a662a Michael Hanselmann
    data = {
973 09a43b39 Michael Hanselmann
      rlib2._REQ_DATA_VERSION: 1,
974 526a662a Michael Hanselmann
      "name": name,
975 526a662a Michael Hanselmann
      "os_type": os,
976 526a662a Michael Hanselmann
      "disks": [],
977 526a662a Michael Hanselmann
      "nics": [],
978 526a662a Michael Hanselmann
      "mode": constants.INSTANCE_CREATE,
979 526a662a Michael Hanselmann
      "disk_template": constants.DT_PLAIN,
980 526a662a Michael Hanselmann
      }
981 09a43b39 Michael Hanselmann
982 09a43b39 Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_instances, [], {}, data, clfactory)
983 09a43b39 Michael Hanselmann
    job_id = handler.POST()
984 09a43b39 Michael Hanselmann
985 09a43b39 Michael Hanselmann
    cl = clfactory.GetNextClient()
986 09a43b39 Michael Hanselmann
    self.assertRaises(IndexError, clfactory.GetNextClient)
987 09a43b39 Michael Hanselmann
988 09a43b39 Michael Hanselmann
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
989 09a43b39 Michael Hanselmann
    self.assertEqual(job_id, exp_job_id)
990 09a43b39 Michael Hanselmann
    self.assertTrue(isinstance(op, opcodes.OpInstanceCreate))
991 526a662a Michael Hanselmann
    self.assertEqual(op.instance_name, name)
992 526a662a Michael Hanselmann
    self.assertEqual(op.os_type, os)
993 526a662a Michael Hanselmann
    self.assertFalse(hasattr(op, "os"))
994 09a43b39 Michael Hanselmann
    self.assertFalse(op.dry_run)
995 09a43b39 Michael Hanselmann
996 09a43b39 Michael Hanselmann
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
997 526a662a Michael Hanselmann
998 526a662a Michael Hanselmann
    # Define both
999 09a43b39 Michael Hanselmann
    data["os"] = "linux9584"
1000 09a43b39 Michael Hanselmann
    assert "os" in data and "os_type" in data
1001 09a43b39 Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_instances, [], {}, data, clfactory)
1002 09a43b39 Michael Hanselmann
    self.assertRaises(http.HttpBadRequest, handler.POST)
1003 526a662a Michael Hanselmann
1004 6395cebb Michael Hanselmann
  def testErrors(self):
1005 09a43b39 Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
1006 09a43b39 Michael Hanselmann
1007 6395cebb Michael Hanselmann
    # Test all required fields
1008 6395cebb Michael Hanselmann
    reqfields = {
1009 09a43b39 Michael Hanselmann
      rlib2._REQ_DATA_VERSION: 1,
1010 6395cebb Michael Hanselmann
      "name": "inst1.example.com",
1011 6395cebb Michael Hanselmann
      "disks": [],
1012 6395cebb Michael Hanselmann
      "nics": [],
1013 6395cebb Michael Hanselmann
      "mode": constants.INSTANCE_CREATE,
1014 130f0966 Iustin Pop
      "disk_template": constants.DT_PLAIN,
1015 6395cebb Michael Hanselmann
      }
1016 6395cebb Michael Hanselmann
1017 6395cebb Michael Hanselmann
    for name in reqfields.keys():
1018 09a43b39 Michael Hanselmann
      data = dict(i for i in reqfields.iteritems() if i[0] != name)
1019 09a43b39 Michael Hanselmann
1020 09a43b39 Michael Hanselmann
      handler = _CreateHandler(rlib2.R_2_instances, [], {}, data, clfactory)
1021 09a43b39 Michael Hanselmann
      self.assertRaises(http.HttpBadRequest, handler.POST)
1022 09a43b39 Michael Hanselmann
      self.assertRaises(IndexError, clfactory.GetNextClient)
1023 6395cebb Michael Hanselmann
1024 6395cebb Michael Hanselmann
    # Invalid disks and nics
1025 6395cebb Michael Hanselmann
    for field in ["disks", "nics"]:
1026 526a662a Michael Hanselmann
      invalid_values = [None, 1, "", {}, [1, 2, 3], ["hda1", "hda2"],
1027 3e3ddbf0 Constantinos Venetsanopoulos
                        [{"_unknown_": False, }]]
1028 6395cebb Michael Hanselmann
1029 6395cebb Michael Hanselmann
      for invvalue in invalid_values:
1030 6395cebb Michael Hanselmann
        data = reqfields.copy()
1031 6395cebb Michael Hanselmann
        data[field] = invvalue
1032 09a43b39 Michael Hanselmann
        handler = _CreateHandler(rlib2.R_2_instances, [], {}, data, clfactory)
1033 09a43b39 Michael Hanselmann
        self.assertRaises(http.HttpBadRequest, handler.POST)
1034 09a43b39 Michael Hanselmann
        self.assertRaises(IndexError, clfactory.GetNextClient)
1035 09a43b39 Michael Hanselmann
1036 09a43b39 Michael Hanselmann
  def testVersion(self):
1037 09a43b39 Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
1038 09a43b39 Michael Hanselmann
1039 09a43b39 Michael Hanselmann
    # No version field
1040 09a43b39 Michael Hanselmann
    data = {
1041 09a43b39 Michael Hanselmann
      "name": "inst1.example.com",
1042 09a43b39 Michael Hanselmann
      "disks": [],
1043 09a43b39 Michael Hanselmann
      "nics": [],
1044 09a43b39 Michael Hanselmann
      "mode": constants.INSTANCE_CREATE,
1045 09a43b39 Michael Hanselmann
      "disk_template": constants.DT_PLAIN,
1046 09a43b39 Michael Hanselmann
      }
1047 09a43b39 Michael Hanselmann
1048 09a43b39 Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_instances, [], {}, data, clfactory)
1049 09a43b39 Michael Hanselmann
    self.assertRaises(http.HttpBadRequest, handler.POST)
1050 09a43b39 Michael Hanselmann
1051 09a43b39 Michael Hanselmann
    # Old and incorrect versions
1052 09a43b39 Michael Hanselmann
    for version in [0, -1, 10483, "Hello World"]:
1053 09a43b39 Michael Hanselmann
      data[rlib2._REQ_DATA_VERSION] = version
1054 09a43b39 Michael Hanselmann
1055 09a43b39 Michael Hanselmann
      handler = _CreateHandler(rlib2.R_2_instances, [], {}, data, clfactory)
1056 09a43b39 Michael Hanselmann
      self.assertRaises(http.HttpBadRequest, handler.POST)
1057 09a43b39 Michael Hanselmann
1058 09a43b39 Michael Hanselmann
      self.assertRaises(IndexError, clfactory.GetNextClient)
1059 09a43b39 Michael Hanselmann
1060 09a43b39 Michael Hanselmann
    # Correct version
1061 09a43b39 Michael Hanselmann
    data[rlib2._REQ_DATA_VERSION] = 1
1062 09a43b39 Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_instances, [], {}, data, clfactory)
1063 09a43b39 Michael Hanselmann
    job_id = handler.POST()
1064 09a43b39 Michael Hanselmann
1065 09a43b39 Michael Hanselmann
    cl = clfactory.GetNextClient()
1066 09a43b39 Michael Hanselmann
    self.assertRaises(IndexError, clfactory.GetNextClient)
1067 09a43b39 Michael Hanselmann
1068 09a43b39 Michael Hanselmann
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
1069 09a43b39 Michael Hanselmann
    self.assertEqual(job_id, exp_job_id)
1070 09a43b39 Michael Hanselmann
    self.assertTrue(isinstance(op, opcodes.OpInstanceCreate))
1071 09a43b39 Michael Hanselmann
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
1072 6395cebb Michael Hanselmann
1073 6395cebb Michael Hanselmann
1074 134afbe7 Michael Hanselmann
class TestBackupExport(unittest.TestCase):
1075 ebeb600f Michael Hanselmann
  def test(self):
1076 134afbe7 Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
1077 134afbe7 Michael Hanselmann
1078 ebeb600f Michael Hanselmann
    name = "instmoo"
1079 ebeb600f Michael Hanselmann
    data = {
1080 ebeb600f Michael Hanselmann
      "mode": constants.EXPORT_MODE_REMOTE,
1081 ebeb600f Michael Hanselmann
      "destination": [(1, 2, 3), (99, 99, 99)],
1082 ebeb600f Michael Hanselmann
      "shutdown": True,
1083 ebeb600f Michael Hanselmann
      "remove_instance": True,
1084 07ce3e70 Michael Hanselmann
      "x509_key_name": ["name", "hash"],
1085 07ce3e70 Michael Hanselmann
      "destination_x509_ca": "---cert---"
1086 ebeb600f Michael Hanselmann
      }
1087 134afbe7 Michael Hanselmann
1088 134afbe7 Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_instances_name_export, [name], {},
1089 134afbe7 Michael Hanselmann
                             data, clfactory)
1090 134afbe7 Michael Hanselmann
    job_id = handler.PUT()
1091 134afbe7 Michael Hanselmann
1092 134afbe7 Michael Hanselmann
    cl = clfactory.GetNextClient()
1093 134afbe7 Michael Hanselmann
    self.assertRaises(IndexError, clfactory.GetNextClient)
1094 134afbe7 Michael Hanselmann
1095 134afbe7 Michael Hanselmann
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
1096 134afbe7 Michael Hanselmann
    self.assertEqual(job_id, exp_job_id)
1097 134afbe7 Michael Hanselmann
    self.assertTrue(isinstance(op, opcodes.OpBackupExport))
1098 ebeb600f Michael Hanselmann
    self.assertEqual(op.instance_name, name)
1099 ebeb600f Michael Hanselmann
    self.assertEqual(op.mode, constants.EXPORT_MODE_REMOTE)
1100 134afbe7 Michael Hanselmann
    self.assertEqual(op.target_node, [(1, 2, 3), (99, 99, 99)])
1101 ebeb600f Michael Hanselmann
    self.assertEqual(op.shutdown, True)
1102 ebeb600f Michael Hanselmann
    self.assertEqual(op.remove_instance, True)
1103 134afbe7 Michael Hanselmann
    self.assertEqual(op.x509_key_name, ["name", "hash"])
1104 07ce3e70 Michael Hanselmann
    self.assertEqual(op.destination_x509_ca, "---cert---")
1105 134afbe7 Michael Hanselmann
    self.assertFalse(hasattr(op, "dry_run"))
1106 134afbe7 Michael Hanselmann
    self.assertFalse(hasattr(op, "force"))
1107 134afbe7 Michael Hanselmann
1108 134afbe7 Michael Hanselmann
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
1109 ebeb600f Michael Hanselmann
1110 ebeb600f Michael Hanselmann
  def testDefaults(self):
1111 134afbe7 Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
1112 134afbe7 Michael Hanselmann
1113 ebeb600f Michael Hanselmann
    name = "inst1"
1114 ebeb600f Michael Hanselmann
    data = {
1115 ebeb600f Michael Hanselmann
      "destination": "node2",
1116 ebeb600f Michael Hanselmann
      "shutdown": False,
1117 ebeb600f Michael Hanselmann
      }
1118 134afbe7 Michael Hanselmann
1119 134afbe7 Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_instances_name_export, [name], {},
1120 134afbe7 Michael Hanselmann
                             data, clfactory)
1121 134afbe7 Michael Hanselmann
    job_id = handler.PUT()
1122 134afbe7 Michael Hanselmann
1123 134afbe7 Michael Hanselmann
    cl = clfactory.GetNextClient()
1124 134afbe7 Michael Hanselmann
    self.assertRaises(IndexError, clfactory.GetNextClient)
1125 134afbe7 Michael Hanselmann
1126 134afbe7 Michael Hanselmann
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
1127 134afbe7 Michael Hanselmann
    self.assertEqual(job_id, exp_job_id)
1128 134afbe7 Michael Hanselmann
    self.assertTrue(isinstance(op, opcodes.OpBackupExport))
1129 ebeb600f Michael Hanselmann
    self.assertEqual(op.instance_name, name)
1130 07ce3e70 Michael Hanselmann
    self.assertEqual(op.target_node, "node2")
1131 07ce3e70 Michael Hanselmann
    self.assertFalse(hasattr(op, "mode"))
1132 07ce3e70 Michael Hanselmann
    self.assertFalse(hasattr(op, "remove_instance"))
1133 07ce3e70 Michael Hanselmann
    self.assertFalse(hasattr(op, "destination"))
1134 134afbe7 Michael Hanselmann
    self.assertFalse(hasattr(op, "dry_run"))
1135 134afbe7 Michael Hanselmann
    self.assertFalse(hasattr(op, "force"))
1136 134afbe7 Michael Hanselmann
1137 134afbe7 Michael Hanselmann
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
1138 ebeb600f Michael Hanselmann
1139 ebeb600f Michael Hanselmann
  def testErrors(self):
1140 134afbe7 Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
1141 134afbe7 Michael Hanselmann
1142 134afbe7 Michael Hanselmann
    for value in ["True", "False"]:
1143 134afbe7 Michael Hanselmann
      handler = _CreateHandler(rlib2.R_2_instances_name_export, ["err1"], {}, {
1144 134afbe7 Michael Hanselmann
        "remove_instance": value,
1145 134afbe7 Michael Hanselmann
        }, clfactory)
1146 134afbe7 Michael Hanselmann
      self.assertRaises(http.HttpBadRequest, handler.PUT)
1147 ebeb600f Michael Hanselmann
1148 ebeb600f Michael Hanselmann
1149 075a29be Michael Hanselmann
class TestInstanceMigrate(testutils.GanetiTestCase):
1150 5823e0d2 Michael Hanselmann
  def test(self):
1151 075a29be Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
1152 075a29be Michael Hanselmann
1153 5823e0d2 Michael Hanselmann
    name = "instYooho6ek"
1154 5823e0d2 Michael Hanselmann
1155 5823e0d2 Michael Hanselmann
    for cleanup in [False, True]:
1156 5823e0d2 Michael Hanselmann
      for mode in constants.HT_MIGRATION_MODES:
1157 5823e0d2 Michael Hanselmann
        data = {
1158 5823e0d2 Michael Hanselmann
          "cleanup": cleanup,
1159 5823e0d2 Michael Hanselmann
          "mode": mode,
1160 5823e0d2 Michael Hanselmann
          }
1161 075a29be Michael Hanselmann
1162 075a29be Michael Hanselmann
        handler = _CreateHandler(rlib2.R_2_instances_name_migrate, [name], {},
1163 075a29be Michael Hanselmann
                                 data, clfactory)
1164 075a29be Michael Hanselmann
        job_id = handler.PUT()
1165 075a29be Michael Hanselmann
1166 075a29be Michael Hanselmann
        cl = clfactory.GetNextClient()
1167 075a29be Michael Hanselmann
        self.assertRaises(IndexError, clfactory.GetNextClient)
1168 075a29be Michael Hanselmann
1169 075a29be Michael Hanselmann
        (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
1170 075a29be Michael Hanselmann
        self.assertEqual(job_id, exp_job_id)
1171 075a29be Michael Hanselmann
        self.assertTrue(isinstance(op, opcodes.OpInstanceMigrate))
1172 5823e0d2 Michael Hanselmann
        self.assertEqual(op.instance_name, name)
1173 5823e0d2 Michael Hanselmann
        self.assertEqual(op.mode, mode)
1174 5823e0d2 Michael Hanselmann
        self.assertEqual(op.cleanup, cleanup)
1175 075a29be Michael Hanselmann
        self.assertFalse(hasattr(op, "dry_run"))
1176 075a29be Michael Hanselmann
        self.assertFalse(hasattr(op, "force"))
1177 075a29be Michael Hanselmann
1178 075a29be Michael Hanselmann
        self.assertRaises(IndexError, cl.GetNextSubmittedJob)
1179 5823e0d2 Michael Hanselmann
1180 5823e0d2 Michael Hanselmann
  def testDefaults(self):
1181 075a29be Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
1182 075a29be Michael Hanselmann
1183 5823e0d2 Michael Hanselmann
    name = "instnohZeex0"
1184 5823e0d2 Michael Hanselmann
1185 075a29be Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_instances_name_migrate, [name], {}, {},
1186 075a29be Michael Hanselmann
                             clfactory)
1187 075a29be Michael Hanselmann
    job_id = handler.PUT()
1188 075a29be Michael Hanselmann
1189 075a29be Michael Hanselmann
    cl = clfactory.GetNextClient()
1190 075a29be Michael Hanselmann
    self.assertRaises(IndexError, clfactory.GetNextClient)
1191 075a29be Michael Hanselmann
1192 075a29be Michael Hanselmann
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
1193 075a29be Michael Hanselmann
    self.assertEqual(job_id, exp_job_id)
1194 075a29be Michael Hanselmann
    self.assertTrue(isinstance(op, opcodes.OpInstanceMigrate))
1195 5823e0d2 Michael Hanselmann
    self.assertEqual(op.instance_name, name)
1196 c1a27c9a Michael Hanselmann
    self.assertFalse(hasattr(op, "mode"))
1197 c1a27c9a Michael Hanselmann
    self.assertFalse(hasattr(op, "cleanup"))
1198 075a29be Michael Hanselmann
    self.assertFalse(hasattr(op, "dry_run"))
1199 075a29be Michael Hanselmann
    self.assertFalse(hasattr(op, "force"))
1200 075a29be Michael Hanselmann
1201 075a29be Michael Hanselmann
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
1202 5823e0d2 Michael Hanselmann
1203 5823e0d2 Michael Hanselmann
1204 d56e7dc7 Michael Hanselmann
class TestParseRenameInstanceRequest(testutils.GanetiTestCase):
1205 d56e7dc7 Michael Hanselmann
  def test(self):
1206 d76f9b5d Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
1207 d76f9b5d Michael Hanselmann
1208 d56e7dc7 Michael Hanselmann
    name = "instij0eeph7"
1209 d56e7dc7 Michael Hanselmann
1210 d56e7dc7 Michael Hanselmann
    for new_name in ["ua0aiyoo", "fai3ongi"]:
1211 d56e7dc7 Michael Hanselmann
      for ip_check in [False, True]:
1212 d56e7dc7 Michael Hanselmann
        for name_check in [False, True]:
1213 d56e7dc7 Michael Hanselmann
          data = {
1214 d56e7dc7 Michael Hanselmann
            "new_name": new_name,
1215 d56e7dc7 Michael Hanselmann
            "ip_check": ip_check,
1216 d56e7dc7 Michael Hanselmann
            "name_check": name_check,
1217 d56e7dc7 Michael Hanselmann
            }
1218 d56e7dc7 Michael Hanselmann
1219 d76f9b5d Michael Hanselmann
          handler = _CreateHandler(rlib2.R_2_instances_name_rename, [name],
1220 d76f9b5d Michael Hanselmann
                                   {}, data, clfactory)
1221 d76f9b5d Michael Hanselmann
          job_id = handler.PUT()
1222 d76f9b5d Michael Hanselmann
1223 d76f9b5d Michael Hanselmann
          cl = clfactory.GetNextClient()
1224 d76f9b5d Michael Hanselmann
          self.assertRaises(IndexError, clfactory.GetNextClient)
1225 d76f9b5d Michael Hanselmann
1226 d76f9b5d Michael Hanselmann
          (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
1227 d76f9b5d Michael Hanselmann
          self.assertEqual(job_id, exp_job_id)
1228 d76f9b5d Michael Hanselmann
          self.assertTrue(isinstance(op, opcodes.OpInstanceRename))
1229 d56e7dc7 Michael Hanselmann
          self.assertEqual(op.instance_name, name)
1230 d56e7dc7 Michael Hanselmann
          self.assertEqual(op.new_name, new_name)
1231 d56e7dc7 Michael Hanselmann
          self.assertEqual(op.ip_check, ip_check)
1232 d56e7dc7 Michael Hanselmann
          self.assertEqual(op.name_check, name_check)
1233 d76f9b5d Michael Hanselmann
          self.assertFalse(hasattr(op, "dry_run"))
1234 d76f9b5d Michael Hanselmann
          self.assertFalse(hasattr(op, "force"))
1235 d76f9b5d Michael Hanselmann
1236 d76f9b5d Michael Hanselmann
          self.assertRaises(IndexError, cl.GetNextSubmittedJob)
1237 d56e7dc7 Michael Hanselmann
1238 d56e7dc7 Michael Hanselmann
  def testDefaults(self):
1239 d76f9b5d Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
1240 d76f9b5d Michael Hanselmann
1241 d56e7dc7 Michael Hanselmann
    name = "instahchie3t"
1242 d56e7dc7 Michael Hanselmann
1243 d56e7dc7 Michael Hanselmann
    for new_name in ["thag9mek", "quees7oh"]:
1244 d56e7dc7 Michael Hanselmann
      data = {
1245 d56e7dc7 Michael Hanselmann
        "new_name": new_name,
1246 d56e7dc7 Michael Hanselmann
        }
1247 d56e7dc7 Michael Hanselmann
1248 d76f9b5d Michael Hanselmann
      handler = _CreateHandler(rlib2.R_2_instances_name_rename, [name],
1249 d76f9b5d Michael Hanselmann
                               {}, data, clfactory)
1250 d76f9b5d Michael Hanselmann
      job_id = handler.PUT()
1251 d76f9b5d Michael Hanselmann
1252 d76f9b5d Michael Hanselmann
      cl = clfactory.GetNextClient()
1253 d76f9b5d Michael Hanselmann
      self.assertRaises(IndexError, clfactory.GetNextClient)
1254 d76f9b5d Michael Hanselmann
1255 d76f9b5d Michael Hanselmann
      (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
1256 d76f9b5d Michael Hanselmann
      self.assertEqual(job_id, exp_job_id)
1257 d76f9b5d Michael Hanselmann
      self.assertTrue(isinstance(op, opcodes.OpInstanceRename))
1258 d56e7dc7 Michael Hanselmann
      self.assertEqual(op.instance_name, name)
1259 d56e7dc7 Michael Hanselmann
      self.assertEqual(op.new_name, new_name)
1260 88bc199a Michael Hanselmann
      self.assertFalse(hasattr(op, "ip_check"))
1261 88bc199a Michael Hanselmann
      self.assertFalse(hasattr(op, "name_check"))
1262 d76f9b5d Michael Hanselmann
      self.assertFalse(hasattr(op, "dry_run"))
1263 d76f9b5d Michael Hanselmann
      self.assertFalse(hasattr(op, "force"))
1264 d76f9b5d Michael Hanselmann
1265 d76f9b5d Michael Hanselmann
      self.assertRaises(IndexError, cl.GetNextSubmittedJob)
1266 d56e7dc7 Michael Hanselmann
1267 d56e7dc7 Michael Hanselmann
1268 f3db88ba Michael Hanselmann
class TestParseModifyInstanceRequest(unittest.TestCase):
1269 3882937a Michael Hanselmann
  def test(self):
1270 f3db88ba Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
1271 f3db88ba Michael Hanselmann
1272 3882937a Michael Hanselmann
    name = "instush8gah"
1273 3882937a Michael Hanselmann
1274 3882937a Michael Hanselmann
    test_disks = [
1275 3882937a Michael Hanselmann
      [],
1276 3882937a Michael Hanselmann
      [(1, { constants.IDISK_MODE: constants.DISK_RDWR, })],
1277 3882937a Michael Hanselmann
      ]
1278 3882937a Michael Hanselmann
1279 3882937a Michael Hanselmann
    for osparams in [{}, { "some": "value", "other": "Hello World", }]:
1280 3882937a Michael Hanselmann
      for hvparams in [{}, { constants.HV_KERNEL_PATH: "/some/kernel", }]:
1281 861610e9 Guido Trotter
        for beparams in [{}, { constants.BE_MAXMEM: 128, }]:
1282 3882937a Michael Hanselmann
          for force in [False, True]:
1283 3882937a Michael Hanselmann
            for nics in [[], [(0, { constants.INIC_IP: "192.0.2.1", })]]:
1284 3882937a Michael Hanselmann
              for disks in test_disks:
1285 3882937a Michael Hanselmann
                for disk_template in constants.DISK_TEMPLATES:
1286 3882937a Michael Hanselmann
                  data = {
1287 3882937a Michael Hanselmann
                    "osparams": osparams,
1288 3882937a Michael Hanselmann
                    "hvparams": hvparams,
1289 3882937a Michael Hanselmann
                    "beparams": beparams,
1290 3882937a Michael Hanselmann
                    "nics": nics,
1291 3882937a Michael Hanselmann
                    "disks": disks,
1292 3882937a Michael Hanselmann
                    "force": force,
1293 3882937a Michael Hanselmann
                    "disk_template": disk_template,
1294 3882937a Michael Hanselmann
                    }
1295 3882937a Michael Hanselmann
1296 f3db88ba Michael Hanselmann
                  handler = _CreateHandler(rlib2.R_2_instances_name_modify,
1297 f3db88ba Michael Hanselmann
                                           [name], {}, data, clfactory)
1298 f3db88ba Michael Hanselmann
                  job_id = handler.PUT()
1299 f3db88ba Michael Hanselmann
1300 f3db88ba Michael Hanselmann
                  cl = clfactory.GetNextClient()
1301 f3db88ba Michael Hanselmann
                  self.assertRaises(IndexError, clfactory.GetNextClient)
1302 f3db88ba Michael Hanselmann
1303 f3db88ba Michael Hanselmann
                  (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
1304 f3db88ba Michael Hanselmann
                  self.assertEqual(job_id, exp_job_id)
1305 f3db88ba Michael Hanselmann
                  self.assertTrue(isinstance(op, opcodes.OpInstanceSetParams))
1306 3882937a Michael Hanselmann
                  self.assertEqual(op.instance_name, name)
1307 3882937a Michael Hanselmann
                  self.assertEqual(op.hvparams, hvparams)
1308 3882937a Michael Hanselmann
                  self.assertEqual(op.beparams, beparams)
1309 3882937a Michael Hanselmann
                  self.assertEqual(op.osparams, osparams)
1310 3882937a Michael Hanselmann
                  self.assertEqual(op.force, force)
1311 3882937a Michael Hanselmann
                  self.assertEqual(op.nics, nics)
1312 3882937a Michael Hanselmann
                  self.assertEqual(op.disks, disks)
1313 3882937a Michael Hanselmann
                  self.assertEqual(op.disk_template, disk_template)
1314 ee5549c7 Michael Hanselmann
                  self.assertFalse(hasattr(op, "remote_node"))
1315 ee5549c7 Michael Hanselmann
                  self.assertFalse(hasattr(op, "os_name"))
1316 ee5549c7 Michael Hanselmann
                  self.assertFalse(hasattr(op, "force_variant"))
1317 f3db88ba Michael Hanselmann
                  self.assertFalse(hasattr(op, "dry_run"))
1318 f3db88ba Michael Hanselmann
1319 f3db88ba Michael Hanselmann
                  self.assertRaises(IndexError, cl.GetNextSubmittedJob)
1320 3882937a Michael Hanselmann
1321 3882937a Michael Hanselmann
  def testDefaults(self):
1322 f3db88ba Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
1323 f3db88ba Michael Hanselmann
1324 3882937a Michael Hanselmann
    name = "instir8aish31"
1325 3882937a Michael Hanselmann
1326 f3db88ba Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_instances_name_modify,
1327 f3db88ba Michael Hanselmann
                             [name], {}, {}, clfactory)
1328 f3db88ba Michael Hanselmann
    job_id = handler.PUT()
1329 f3db88ba Michael Hanselmann
1330 f3db88ba Michael Hanselmann
    cl = clfactory.GetNextClient()
1331 f3db88ba Michael Hanselmann
    self.assertRaises(IndexError, clfactory.GetNextClient)
1332 f3db88ba Michael Hanselmann
1333 f3db88ba Michael Hanselmann
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
1334 f3db88ba Michael Hanselmann
    self.assertEqual(job_id, exp_job_id)
1335 f3db88ba Michael Hanselmann
    self.assertTrue(isinstance(op, opcodes.OpInstanceSetParams))
1336 3882937a Michael Hanselmann
    self.assertEqual(op.instance_name, name)
1337 f3db88ba Michael Hanselmann
1338 ee5549c7 Michael Hanselmann
    for i in ["hvparams", "beparams", "osparams", "force", "nics", "disks",
1339 ee5549c7 Michael Hanselmann
              "disk_template", "remote_node", "os_name", "force_variant"]:
1340 ee5549c7 Michael Hanselmann
      self.assertFalse(hasattr(op, i))
1341 3882937a Michael Hanselmann
1342 3882937a Michael Hanselmann
1343 c744425f Michael Hanselmann
class TestParseInstanceReinstallRequest(testutils.GanetiTestCase):
1344 c744425f Michael Hanselmann
  def setUp(self):
1345 c744425f Michael Hanselmann
    testutils.GanetiTestCase.setUp(self)
1346 c744425f Michael Hanselmann
1347 c744425f Michael Hanselmann
    self.Parse = rlib2._ParseInstanceReinstallRequest
1348 c744425f Michael Hanselmann
1349 c744425f Michael Hanselmann
  def _Check(self, ops, name):
1350 c744425f Michael Hanselmann
    expcls = [
1351 ee3e37a7 Iustin Pop
      opcodes.OpInstanceShutdown,
1352 5073fd8f Iustin Pop
      opcodes.OpInstanceReinstall,
1353 c873d91c Iustin Pop
      opcodes.OpInstanceStartup,
1354 c744425f Michael Hanselmann
      ]
1355 c744425f Michael Hanselmann
1356 c744425f Michael Hanselmann
    self.assert_(compat.all(isinstance(op, exp)
1357 c744425f Michael Hanselmann
                            for op, exp in zip(ops, expcls)))
1358 c744425f Michael Hanselmann
    self.assert_(compat.all(op.instance_name == name for op in ops))
1359 c744425f Michael Hanselmann
1360 c744425f Michael Hanselmann
  def test(self):
1361 c744425f Michael Hanselmann
    name = "shoo0tihohma"
1362 c744425f Michael Hanselmann
1363 c744425f Michael Hanselmann
    ops = self.Parse(name, {"os": "sys1", "start": True,})
1364 c744425f Michael Hanselmann
    self.assertEqual(len(ops), 3)
1365 c744425f Michael Hanselmann
    self._Check(ops, name)
1366 c744425f Michael Hanselmann
    self.assertEqual(ops[1].os_type, "sys1")
1367 c744425f Michael Hanselmann
    self.assertFalse(ops[1].osparams)
1368 c744425f Michael Hanselmann
1369 c744425f Michael Hanselmann
    ops = self.Parse(name, {"os": "sys2", "start": False,})
1370 c744425f Michael Hanselmann
    self.assertEqual(len(ops), 2)
1371 c744425f Michael Hanselmann
    self._Check(ops, name)
1372 c744425f Michael Hanselmann
    self.assertEqual(ops[1].os_type, "sys2")
1373 c744425f Michael Hanselmann
1374 c744425f Michael Hanselmann
    osparams = {
1375 c744425f Michael Hanselmann
      "reformat": "1",
1376 c744425f Michael Hanselmann
      }
1377 c744425f Michael Hanselmann
    ops = self.Parse(name, {"os": "sys4035", "start": True,
1378 c744425f Michael Hanselmann
                            "osparams": osparams,})
1379 c744425f Michael Hanselmann
    self.assertEqual(len(ops), 3)
1380 c744425f Michael Hanselmann
    self._Check(ops, name)
1381 c744425f Michael Hanselmann
    self.assertEqual(ops[1].os_type, "sys4035")
1382 c744425f Michael Hanselmann
    self.assertEqual(ops[1].osparams, osparams)
1383 c744425f Michael Hanselmann
1384 c744425f Michael Hanselmann
  def testDefaults(self):
1385 c744425f Michael Hanselmann
    name = "noolee0g"
1386 c744425f Michael Hanselmann
1387 c744425f Michael Hanselmann
    ops = self.Parse(name, {"os": "linux1"})
1388 c744425f Michael Hanselmann
    self.assertEqual(len(ops), 3)
1389 c744425f Michael Hanselmann
    self._Check(ops, name)
1390 c744425f Michael Hanselmann
    self.assertEqual(ops[1].os_type, "linux1")
1391 c744425f Michael Hanselmann
    self.assertFalse(ops[1].osparams)
1392 c744425f Michael Hanselmann
1393 a14b80bc Michael Hanselmann
  def testErrors(self):
1394 97f8e7f0 Michael Hanselmann
    self.assertRaises(http.HttpBadRequest, self.Parse,
1395 97f8e7f0 Michael Hanselmann
                      "foo", "not a dictionary")
1396 a14b80bc Michael Hanselmann
1397 c744425f Michael Hanselmann
1398 cd0d4d5a Michael Hanselmann
class TestGroupRename(unittest.TestCase):
1399 0dbaa9ca Adeodato Simo
  def test(self):
1400 cd0d4d5a Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
1401 cd0d4d5a Michael Hanselmann
1402 cd0d4d5a Michael Hanselmann
    name = "group608242564"
1403 0dbaa9ca Adeodato Simo
    data = {
1404 cd0d4d5a Michael Hanselmann
      "new_name": "ua0aiyoo15112",
1405 0dbaa9ca Adeodato Simo
      }
1406 0dbaa9ca Adeodato Simo
1407 cd0d4d5a Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_groups_name_rename, [name], {}, data,
1408 cd0d4d5a Michael Hanselmann
                             clfactory)
1409 cd0d4d5a Michael Hanselmann
    job_id = handler.PUT()
1410 cd0d4d5a Michael Hanselmann
1411 cd0d4d5a Michael Hanselmann
    cl = clfactory.GetNextClient()
1412 cd0d4d5a Michael Hanselmann
    self.assertRaises(IndexError, clfactory.GetNextClient)
1413 cd0d4d5a Michael Hanselmann
1414 cd0d4d5a Michael Hanselmann
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
1415 cd0d4d5a Michael Hanselmann
    self.assertEqual(job_id, exp_job_id)
1416 0dbaa9ca Adeodato Simo
1417 cd0d4d5a Michael Hanselmann
    self.assertTrue(isinstance(op, opcodes.OpGroupRename))
1418 12da663a Michael Hanselmann
    self.assertEqual(op.group_name, name)
1419 cd0d4d5a Michael Hanselmann
    self.assertEqual(op.new_name, "ua0aiyoo15112")
1420 0dbaa9ca Adeodato Simo
    self.assertFalse(op.dry_run)
1421 cd0d4d5a Michael Hanselmann
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
1422 0dbaa9ca Adeodato Simo
1423 0dbaa9ca Adeodato Simo
  def testDryRun(self):
1424 cd0d4d5a Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
1425 cd0d4d5a Michael Hanselmann
1426 cd0d4d5a Michael Hanselmann
    name = "group28548"
1427 0dbaa9ca Adeodato Simo
    data = {
1428 0dbaa9ca Adeodato Simo
      "new_name": "ua0aiyoo",
1429 0dbaa9ca Adeodato Simo
      }
1430 0dbaa9ca Adeodato Simo
1431 cd0d4d5a Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_groups_name_rename, [name], {
1432 cd0d4d5a Michael Hanselmann
      "dry-run": ["1"],
1433 cd0d4d5a Michael Hanselmann
      }, data, clfactory)
1434 cd0d4d5a Michael Hanselmann
    job_id = handler.PUT()
1435 0dbaa9ca Adeodato Simo
1436 cd0d4d5a Michael Hanselmann
    cl = clfactory.GetNextClient()
1437 cd0d4d5a Michael Hanselmann
    self.assertRaises(IndexError, clfactory.GetNextClient)
1438 cd0d4d5a Michael Hanselmann
1439 cd0d4d5a Michael Hanselmann
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
1440 cd0d4d5a Michael Hanselmann
    self.assertEqual(job_id, exp_job_id)
1441 cd0d4d5a Michael Hanselmann
1442 cd0d4d5a Michael Hanselmann
    self.assertTrue(isinstance(op, opcodes.OpGroupRename))
1443 12da663a Michael Hanselmann
    self.assertEqual(op.group_name, name)
1444 0dbaa9ca Adeodato Simo
    self.assertEqual(op.new_name, "ua0aiyoo")
1445 cd0d4d5a Michael Hanselmann
    self.assertTrue(op.dry_run)
1446 cd0d4d5a Michael Hanselmann
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
1447 0dbaa9ca Adeodato Simo
1448 0dbaa9ca Adeodato Simo
1449 0dbc732c Michael Hanselmann
class TestInstanceReplaceDisks(unittest.TestCase):
1450 d1c172de Michael Hanselmann
  def test(self):
1451 0dbc732c Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
1452 0dbc732c Michael Hanselmann
1453 d1c172de Michael Hanselmann
    name = "inst22568"
1454 d1c172de Michael Hanselmann
1455 d1c172de Michael Hanselmann
    for disks in [range(1, 4), "1,2,3", "1, 2, 3"]:
1456 d1c172de Michael Hanselmann
      data = {
1457 d1c172de Michael Hanselmann
        "mode": constants.REPLACE_DISK_SEC,
1458 d1c172de Michael Hanselmann
        "disks": disks,
1459 d1c172de Michael Hanselmann
        "iallocator": "myalloc",
1460 d1c172de Michael Hanselmann
        }
1461 d1c172de Michael Hanselmann
1462 0dbc732c Michael Hanselmann
      handler = _CreateHandler(rlib2.R_2_instances_name_replace_disks,
1463 0dbc732c Michael Hanselmann
                               [name], {}, data, clfactory)
1464 0dbc732c Michael Hanselmann
      job_id = handler.POST()
1465 0dbc732c Michael Hanselmann
1466 0dbc732c Michael Hanselmann
      cl = clfactory.GetNextClient()
1467 0dbc732c Michael Hanselmann
      self.assertRaises(IndexError, clfactory.GetNextClient)
1468 0dbc732c Michael Hanselmann
1469 0dbc732c Michael Hanselmann
      (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
1470 0dbc732c Michael Hanselmann
      self.assertEqual(job_id, exp_job_id)
1471 0dbc732c Michael Hanselmann
1472 0dbc732c Michael Hanselmann
      self.assertTrue(isinstance(op, opcodes.OpInstanceReplaceDisks))
1473 0dbc732c Michael Hanselmann
      self.assertEqual(op.instance_name, name)
1474 d1c172de Michael Hanselmann
      self.assertEqual(op.mode, constants.REPLACE_DISK_SEC)
1475 d1c172de Michael Hanselmann
      self.assertEqual(op.disks, [1, 2, 3])
1476 d1c172de Michael Hanselmann
      self.assertEqual(op.iallocator, "myalloc")
1477 0dbc732c Michael Hanselmann
      self.assertRaises(IndexError, cl.GetNextSubmittedJob)
1478 d1c172de Michael Hanselmann
1479 d1c172de Michael Hanselmann
  def testDefaults(self):
1480 0dbc732c Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
1481 0dbc732c Michael Hanselmann
1482 d1c172de Michael Hanselmann
    name = "inst11413"
1483 d1c172de Michael Hanselmann
    data = {
1484 d1c172de Michael Hanselmann
      "mode": constants.REPLACE_DISK_AUTO,
1485 d1c172de Michael Hanselmann
      }
1486 d1c172de Michael Hanselmann
1487 0dbc732c Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_instances_name_replace_disks,
1488 0dbc732c Michael Hanselmann
                             [name], {}, data, clfactory)
1489 0dbc732c Michael Hanselmann
    job_id = handler.POST()
1490 0dbc732c Michael Hanselmann
1491 0dbc732c Michael Hanselmann
    cl = clfactory.GetNextClient()
1492 0dbc732c Michael Hanselmann
    self.assertRaises(IndexError, clfactory.GetNextClient)
1493 0dbc732c Michael Hanselmann
1494 0dbc732c Michael Hanselmann
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
1495 0dbc732c Michael Hanselmann
    self.assertEqual(job_id, exp_job_id)
1496 0dbc732c Michael Hanselmann
1497 0dbc732c Michael Hanselmann
    self.assertTrue(isinstance(op, opcodes.OpInstanceReplaceDisks))
1498 0dbc732c Michael Hanselmann
    self.assertEqual(op.instance_name, name)
1499 d1c172de Michael Hanselmann
    self.assertEqual(op.mode, constants.REPLACE_DISK_AUTO)
1500 d1c172de Michael Hanselmann
    self.assertFalse(hasattr(op, "iallocator"))
1501 d1c172de Michael Hanselmann
    self.assertFalse(hasattr(op, "disks"))
1502 0dbc732c Michael Hanselmann
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
1503 d1c172de Michael Hanselmann
1504 539d65ba Michael Hanselmann
  def testNoDisks(self):
1505 0f03d8d4 Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
1506 0f03d8d4 Michael Hanselmann
1507 0f03d8d4 Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_instances_name_replace_disks,
1508 0f03d8d4 Michael Hanselmann
                             ["inst20661"], {}, {}, clfactory)
1509 0f03d8d4 Michael Hanselmann
    self.assertRaises(http.HttpBadRequest, handler.POST)
1510 539d65ba Michael Hanselmann
1511 539d65ba Michael Hanselmann
    for disks in [None, "", {}]:
1512 0f03d8d4 Michael Hanselmann
      handler = _CreateHandler(rlib2.R_2_instances_name_replace_disks,
1513 0f03d8d4 Michael Hanselmann
                               ["inst20661"], {}, {
1514 539d65ba Michael Hanselmann
        "disks": disks,
1515 0f03d8d4 Michael Hanselmann
        }, clfactory)
1516 0f03d8d4 Michael Hanselmann
      self.assertRaises(http.HttpBadRequest, handler.POST)
1517 539d65ba Michael Hanselmann
1518 d1c172de Michael Hanselmann
  def testWrong(self):
1519 0dbc732c Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
1520 0dbc732c Michael Hanselmann
1521 0dbc732c Michael Hanselmann
    data = {
1522 0dbc732c Michael Hanselmann
      "mode": constants.REPLACE_DISK_AUTO,
1523 0dbc732c Michael Hanselmann
      "disks": "hello world",
1524 0dbc732c Michael Hanselmann
      }
1525 0dbc732c Michael Hanselmann
1526 0dbc732c Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_instances_name_replace_disks,
1527 0dbc732c Michael Hanselmann
                             ["foo"], {}, data, clfactory)
1528 0dbc732c Michael Hanselmann
    self.assertRaises(http.HttpBadRequest, handler.POST)
1529 d1c172de Michael Hanselmann
1530 d1c172de Michael Hanselmann
1531 d5211458 Michael Hanselmann
class TestGroupModify(unittest.TestCase):
1532 df340fae Michael Hanselmann
  def test(self):
1533 d5211458 Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
1534 d5211458 Michael Hanselmann
1535 df340fae Michael Hanselmann
    name = "group6002"
1536 df340fae Michael Hanselmann
1537 df340fae Michael Hanselmann
    for policy in constants.VALID_ALLOC_POLICIES:
1538 df340fae Michael Hanselmann
      data = {
1539 df340fae Michael Hanselmann
        "alloc_policy": policy,
1540 df340fae Michael Hanselmann
        }
1541 df340fae Michael Hanselmann
1542 d5211458 Michael Hanselmann
      handler = _CreateHandler(rlib2.R_2_groups_name_modify, [name], {}, data,
1543 d5211458 Michael Hanselmann
                               clfactory)
1544 d5211458 Michael Hanselmann
      job_id = handler.PUT()
1545 d5211458 Michael Hanselmann
1546 d5211458 Michael Hanselmann
      cl = clfactory.GetNextClient()
1547 d5211458 Michael Hanselmann
      self.assertRaises(IndexError, clfactory.GetNextClient)
1548 d5211458 Michael Hanselmann
1549 d5211458 Michael Hanselmann
      (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
1550 d5211458 Michael Hanselmann
      self.assertEqual(job_id, exp_job_id)
1551 d5211458 Michael Hanselmann
1552 d5211458 Michael Hanselmann
      self.assertTrue(isinstance(op, opcodes.OpGroupSetParams))
1553 df340fae Michael Hanselmann
      self.assertEqual(op.group_name, name)
1554 df340fae Michael Hanselmann
      self.assertEqual(op.alloc_policy, policy)
1555 d5211458 Michael Hanselmann
      self.assertFalse(hasattr(op, "dry_run"))
1556 d5211458 Michael Hanselmann
      self.assertRaises(IndexError, cl.GetNextSubmittedJob)
1557 df340fae Michael Hanselmann
1558 df340fae Michael Hanselmann
  def testUnknownPolicy(self):
1559 d5211458 Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
1560 d5211458 Michael Hanselmann
1561 df340fae Michael Hanselmann
    data = {
1562 df340fae Michael Hanselmann
      "alloc_policy": "_unknown_policy_",
1563 df340fae Michael Hanselmann
      }
1564 df340fae Michael Hanselmann
1565 d5211458 Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_groups_name_modify, ["xyz"], {}, data,
1566 d5211458 Michael Hanselmann
                             clfactory)
1567 d5211458 Michael Hanselmann
    self.assertRaises(http.HttpBadRequest, handler.PUT)
1568 d5211458 Michael Hanselmann
    self.assertRaises(IndexError, clfactory.GetNextClient)
1569 df340fae Michael Hanselmann
1570 df340fae Michael Hanselmann
  def testDefaults(self):
1571 d5211458 Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
1572 d5211458 Michael Hanselmann
1573 df340fae Michael Hanselmann
    name = "group6679"
1574 df340fae Michael Hanselmann
1575 d5211458 Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_groups_name_modify, [name], {}, {},
1576 d5211458 Michael Hanselmann
                             clfactory)
1577 d5211458 Michael Hanselmann
    job_id = handler.PUT()
1578 d5211458 Michael Hanselmann
1579 d5211458 Michael Hanselmann
    cl = clfactory.GetNextClient()
1580 d5211458 Michael Hanselmann
    self.assertRaises(IndexError, clfactory.GetNextClient)
1581 d5211458 Michael Hanselmann
1582 d5211458 Michael Hanselmann
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
1583 d5211458 Michael Hanselmann
    self.assertEqual(job_id, exp_job_id)
1584 d5211458 Michael Hanselmann
1585 d5211458 Michael Hanselmann
    self.assertTrue(isinstance(op, opcodes.OpGroupSetParams))
1586 df340fae Michael Hanselmann
    self.assertEqual(op.group_name, name)
1587 df340fae Michael Hanselmann
    self.assertFalse(hasattr(op, "alloc_policy"))
1588 d5211458 Michael Hanselmann
    self.assertFalse(hasattr(op, "dry_run"))
1589 d5211458 Michael Hanselmann
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
1590 df340fae Michael Hanselmann
1591 df340fae Michael Hanselmann
1592 c91407bc Michael Hanselmann
class TestGroupAdd(unittest.TestCase):
1593 527fbde8 Michael Hanselmann
  def test(self):
1594 527fbde8 Michael Hanselmann
    name = "group3618"
1595 c91407bc Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
1596 527fbde8 Michael Hanselmann
1597 527fbde8 Michael Hanselmann
    for policy in constants.VALID_ALLOC_POLICIES:
1598 527fbde8 Michael Hanselmann
      data = {
1599 527fbde8 Michael Hanselmann
        "group_name": name,
1600 527fbde8 Michael Hanselmann
        "alloc_policy": policy,
1601 527fbde8 Michael Hanselmann
        }
1602 527fbde8 Michael Hanselmann
1603 c91407bc Michael Hanselmann
      handler = _CreateHandler(rlib2.R_2_groups, [], {}, data,
1604 c91407bc Michael Hanselmann
                               clfactory)
1605 c91407bc Michael Hanselmann
      job_id = handler.POST()
1606 c91407bc Michael Hanselmann
1607 c91407bc Michael Hanselmann
      cl = clfactory.GetNextClient()
1608 c91407bc Michael Hanselmann
      self.assertRaises(IndexError, clfactory.GetNextClient)
1609 c91407bc Michael Hanselmann
1610 c91407bc Michael Hanselmann
      (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
1611 c91407bc Michael Hanselmann
      self.assertEqual(job_id, exp_job_id)
1612 c91407bc Michael Hanselmann
1613 c91407bc Michael Hanselmann
      self.assertTrue(isinstance(op, opcodes.OpGroupAdd))
1614 527fbde8 Michael Hanselmann
      self.assertEqual(op.group_name, name)
1615 527fbde8 Michael Hanselmann
      self.assertEqual(op.alloc_policy, policy)
1616 527fbde8 Michael Hanselmann
      self.assertFalse(op.dry_run)
1617 c91407bc Michael Hanselmann
      self.assertRaises(IndexError, cl.GetNextSubmittedJob)
1618 527fbde8 Michael Hanselmann
1619 527fbde8 Michael Hanselmann
  def testUnknownPolicy(self):
1620 c91407bc Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
1621 c91407bc Michael Hanselmann
1622 527fbde8 Michael Hanselmann
    data = {
1623 527fbde8 Michael Hanselmann
      "alloc_policy": "_unknown_policy_",
1624 527fbde8 Michael Hanselmann
      }
1625 527fbde8 Michael Hanselmann
1626 c91407bc Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_groups, [], {}, data, clfactory)
1627 c91407bc Michael Hanselmann
    self.assertRaises(http.HttpBadRequest, handler.POST)
1628 c91407bc Michael Hanselmann
    self.assertRaises(IndexError, clfactory.GetNextClient)
1629 527fbde8 Michael Hanselmann
1630 527fbde8 Michael Hanselmann
  def testDefaults(self):
1631 c91407bc Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
1632 c91407bc Michael Hanselmann
1633 527fbde8 Michael Hanselmann
    name = "group15395"
1634 527fbde8 Michael Hanselmann
    data = {
1635 527fbde8 Michael Hanselmann
      "group_name": name,
1636 527fbde8 Michael Hanselmann
      }
1637 527fbde8 Michael Hanselmann
1638 c91407bc Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_groups, [], {}, data, clfactory)
1639 c91407bc Michael Hanselmann
    job_id = handler.POST()
1640 c91407bc Michael Hanselmann
1641 c91407bc Michael Hanselmann
    cl = clfactory.GetNextClient()
1642 c91407bc Michael Hanselmann
    self.assertRaises(IndexError, clfactory.GetNextClient)
1643 c91407bc Michael Hanselmann
1644 c91407bc Michael Hanselmann
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
1645 c91407bc Michael Hanselmann
    self.assertEqual(job_id, exp_job_id)
1646 c91407bc Michael Hanselmann
1647 c91407bc Michael Hanselmann
    self.assertTrue(isinstance(op, opcodes.OpGroupAdd))
1648 527fbde8 Michael Hanselmann
    self.assertEqual(op.group_name, name)
1649 527fbde8 Michael Hanselmann
    self.assertFalse(hasattr(op, "alloc_policy"))
1650 c91407bc Michael Hanselmann
    self.assertFalse(op.dry_run)
1651 527fbde8 Michael Hanselmann
1652 527fbde8 Michael Hanselmann
  def testLegacyName(self):
1653 c91407bc Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
1654 c91407bc Michael Hanselmann
1655 527fbde8 Michael Hanselmann
    name = "group29852"
1656 527fbde8 Michael Hanselmann
    data = {
1657 527fbde8 Michael Hanselmann
      "name": name,
1658 527fbde8 Michael Hanselmann
      }
1659 527fbde8 Michael Hanselmann
1660 c91407bc Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_groups, [], {
1661 c91407bc Michael Hanselmann
      "dry-run": ["1"],
1662 c91407bc Michael Hanselmann
      }, data, clfactory)
1663 c91407bc Michael Hanselmann
    job_id = handler.POST()
1664 c91407bc Michael Hanselmann
1665 c91407bc Michael Hanselmann
    cl = clfactory.GetNextClient()
1666 c91407bc Michael Hanselmann
    self.assertRaises(IndexError, clfactory.GetNextClient)
1667 c91407bc Michael Hanselmann
1668 c91407bc Michael Hanselmann
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
1669 c91407bc Michael Hanselmann
    self.assertEqual(job_id, exp_job_id)
1670 c91407bc Michael Hanselmann
1671 c91407bc Michael Hanselmann
    self.assertTrue(isinstance(op, opcodes.OpGroupAdd))
1672 527fbde8 Michael Hanselmann
    self.assertEqual(op.group_name, name)
1673 c91407bc Michael Hanselmann
    self.assertFalse(hasattr(op, "alloc_policy"))
1674 c91407bc Michael Hanselmann
    self.assertTrue(op.dry_run)
1675 527fbde8 Michael Hanselmann
1676 527fbde8 Michael Hanselmann
1677 51cc8637 Michael Hanselmann
class TestNodeRole(unittest.TestCase):
1678 51cc8637 Michael Hanselmann
  def test(self):
1679 51cc8637 Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
1680 51cc8637 Michael Hanselmann
1681 51cc8637 Michael Hanselmann
    for role in rlib2._NR_MAP.values():
1682 51cc8637 Michael Hanselmann
      handler = _CreateHandler(rlib2.R_2_nodes_name_role,
1683 51cc8637 Michael Hanselmann
                               ["node-z"], {}, role, clfactory)
1684 51cc8637 Michael Hanselmann
      if role == rlib2._NR_MASTER:
1685 51cc8637 Michael Hanselmann
        self.assertRaises(http.HttpBadRequest, handler.PUT)
1686 51cc8637 Michael Hanselmann
      else:
1687 51cc8637 Michael Hanselmann
        job_id = handler.PUT()
1688 51cc8637 Michael Hanselmann
1689 51cc8637 Michael Hanselmann
        cl = clfactory.GetNextClient()
1690 51cc8637 Michael Hanselmann
        self.assertRaises(IndexError, clfactory.GetNextClient)
1691 51cc8637 Michael Hanselmann
1692 51cc8637 Michael Hanselmann
        (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
1693 51cc8637 Michael Hanselmann
        self.assertEqual(job_id, exp_job_id)
1694 51cc8637 Michael Hanselmann
        self.assertTrue(isinstance(op, opcodes.OpNodeSetParams))
1695 51cc8637 Michael Hanselmann
        self.assertEqual(op.node_name, "node-z")
1696 51cc8637 Michael Hanselmann
        self.assertFalse(op.force)
1697 51cc8637 Michael Hanselmann
        self.assertFalse(hasattr(op, "dry_run"))
1698 51cc8637 Michael Hanselmann
1699 51cc8637 Michael Hanselmann
        if role == rlib2._NR_REGULAR:
1700 51cc8637 Michael Hanselmann
          self.assertFalse(op.drained)
1701 51cc8637 Michael Hanselmann
          self.assertFalse(op.offline)
1702 51cc8637 Michael Hanselmann
          self.assertFalse(op.master_candidate)
1703 51cc8637 Michael Hanselmann
        elif role == rlib2._NR_MASTER_CANDIDATE:
1704 51cc8637 Michael Hanselmann
          self.assertFalse(op.drained)
1705 51cc8637 Michael Hanselmann
          self.assertFalse(op.offline)
1706 51cc8637 Michael Hanselmann
          self.assertTrue(op.master_candidate)
1707 51cc8637 Michael Hanselmann
        elif role == rlib2._NR_DRAINED:
1708 51cc8637 Michael Hanselmann
          self.assertTrue(op.drained)
1709 51cc8637 Michael Hanselmann
          self.assertFalse(op.offline)
1710 51cc8637 Michael Hanselmann
          self.assertFalse(op.master_candidate)
1711 51cc8637 Michael Hanselmann
        elif role == rlib2._NR_OFFLINE:
1712 51cc8637 Michael Hanselmann
          self.assertFalse(op.drained)
1713 51cc8637 Michael Hanselmann
          self.assertTrue(op.offline)
1714 51cc8637 Michael Hanselmann
          self.assertFalse(op.master_candidate)
1715 51cc8637 Michael Hanselmann
        else:
1716 51cc8637 Michael Hanselmann
          self.fail("Unknown role '%s'" % role)
1717 51cc8637 Michael Hanselmann
1718 51cc8637 Michael Hanselmann
      self.assertRaises(IndexError, cl.GetNextSubmittedJob)
1719 51cc8637 Michael Hanselmann
1720 51cc8637 Michael Hanselmann
1721 3429bc89 Michael Hanselmann
class TestSimpleResources(unittest.TestCase):
1722 3429bc89 Michael Hanselmann
  def setUp(self):
1723 3429bc89 Michael Hanselmann
    self.clfactory = _FakeClientFactory(_FakeClient)
1724 3429bc89 Michael Hanselmann
1725 3429bc89 Michael Hanselmann
  def tearDown(self):
1726 3429bc89 Michael Hanselmann
    self.assertRaises(IndexError, self.clfactory.GetNextClient)
1727 3429bc89 Michael Hanselmann
1728 3429bc89 Michael Hanselmann
  def testFeatures(self):
1729 3429bc89 Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_features, [], {}, None, self.clfactory)
1730 3429bc89 Michael Hanselmann
    self.assertEqual(set(handler.GET()), rlib2.ALL_FEATURES)
1731 3429bc89 Michael Hanselmann
1732 132cdb87 Michael Hanselmann
  def testEmpty(self):
1733 132cdb87 Michael Hanselmann
    for cls in [rlib2.R_root, rlib2.R_2]:
1734 132cdb87 Michael Hanselmann
      handler = _CreateHandler(cls, [], {}, None, self.clfactory)
1735 132cdb87 Michael Hanselmann
      self.assertTrue(handler.GET() is None)
1736 3429bc89 Michael Hanselmann
1737 3429bc89 Michael Hanselmann
  def testVersion(self):
1738 3429bc89 Michael Hanselmann
    handler = _CreateHandler(rlib2.R_version, [], {}, None, self.clfactory)
1739 3429bc89 Michael Hanselmann
    self.assertEqual(handler.GET(), constants.RAPI_VERSION)
1740 3429bc89 Michael Hanselmann
1741 3429bc89 Michael Hanselmann
1742 f75ab789 Michael Hanselmann
class TestClusterInfo(unittest.TestCase):
1743 f75ab789 Michael Hanselmann
  class _ClusterInfoClient:
1744 303bc802 Iustin Pop
    def __init__(self, address=None):
1745 f75ab789 Michael Hanselmann
      self.cluster_info = None
1746 f75ab789 Michael Hanselmann
1747 f75ab789 Michael Hanselmann
    def QueryClusterInfo(self):
1748 f75ab789 Michael Hanselmann
      assert self.cluster_info is None
1749 f75ab789 Michael Hanselmann
      self.cluster_info = object()
1750 f75ab789 Michael Hanselmann
      return self.cluster_info
1751 f75ab789 Michael Hanselmann
1752 f75ab789 Michael Hanselmann
  def test(self):
1753 f75ab789 Michael Hanselmann
    clfactory = _FakeClientFactory(self._ClusterInfoClient)
1754 f75ab789 Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_info, [], {}, None, clfactory)
1755 f75ab789 Michael Hanselmann
    result = handler.GET()
1756 f75ab789 Michael Hanselmann
    cl = clfactory.GetNextClient()
1757 f75ab789 Michael Hanselmann
    self.assertRaises(IndexError, clfactory.GetNextClient)
1758 f75ab789 Michael Hanselmann
    self.assertEqual(result, cl.cluster_info)
1759 f75ab789 Michael Hanselmann
1760 f75ab789 Michael Hanselmann
1761 e5ff1a47 René Nussbaumer
class TestInstancesMultiAlloc(unittest.TestCase):
1762 e5ff1a47 René Nussbaumer
  def testInstanceUpdate(self):
1763 e5ff1a47 René Nussbaumer
    clfactory = _FakeClientFactory(_FakeClient)
1764 e5ff1a47 René Nussbaumer
    data = {
1765 e5ff1a47 René Nussbaumer
      "instances": [{
1766 e5ff1a47 René Nussbaumer
        "instance_name": "bar",
1767 e5ff1a47 René Nussbaumer
        "mode": "create",
1768 e5ff1a47 René Nussbaumer
        }, {
1769 e5ff1a47 René Nussbaumer
        "instance_name": "foo",
1770 e5ff1a47 René Nussbaumer
        "mode": "create",
1771 e5ff1a47 René Nussbaumer
        }],
1772 e5ff1a47 René Nussbaumer
      }
1773 e5ff1a47 René Nussbaumer
    handler = _CreateHandler(rlib2.R_2_instances_multi_alloc, [], {}, data,
1774 e5ff1a47 René Nussbaumer
                             clfactory)
1775 e5ff1a47 René Nussbaumer
    (body, _) = handler.GetPostOpInput()
1776 e5ff1a47 René Nussbaumer
    self.assertTrue(compat.all([inst["OP_ID"] == handler.POST_OPCODE.OP_ID
1777 e5ff1a47 René Nussbaumer
                                for inst in body["instances"]]))
1778 e5ff1a47 René Nussbaumer
1779 e5ff1a47 René Nussbaumer
1780 de959245 Michael Hanselmann
class TestPermissions(unittest.TestCase):
1781 de959245 Michael Hanselmann
  def testEquality(self):
1782 de959245 Michael Hanselmann
    self.assertEqual(rlib2.R_2_query.GET_ACCESS, rlib2.R_2_query.PUT_ACCESS)
1783 de959245 Michael Hanselmann
    self.assertEqual(rlib2.R_2_query.GET_ACCESS,
1784 de959245 Michael Hanselmann
                     rlib2.R_2_instances_name_console.GET_ACCESS)
1785 de959245 Michael Hanselmann
1786 de959245 Michael Hanselmann
  def testMethodAccess(self):
1787 de959245 Michael Hanselmann
    for handler in connector.CONNECTOR.values():
1788 de959245 Michael Hanselmann
      for method in baserlib._SUPPORTED_METHODS:
1789 5224c9bf Michael Hanselmann
        access = baserlib.GetHandlerAccess(handler, method)
1790 5224c9bf Michael Hanselmann
        self.assertFalse(access is None)
1791 de959245 Michael Hanselmann
        self.assertFalse(set(access) - rapi.RAPI_ACCESS_ALL,
1792 de959245 Michael Hanselmann
                         msg=("Handler '%s' uses unknown access options for"
1793 de959245 Michael Hanselmann
                              " method %s" % (handler, method)))
1794 de959245 Michael Hanselmann
        self.assertTrue(rapi.RAPI_ACCESS_READ not in access or
1795 de959245 Michael Hanselmann
                        rapi.RAPI_ACCESS_WRITE in access,
1796 de959245 Michael Hanselmann
                        msg=("Handler '%s' gives query, but not write access"
1797 de959245 Michael Hanselmann
                             " for method %s (the latter includes query and"
1798 de959245 Michael Hanselmann
                             " should therefore be given as well)" %
1799 de959245 Michael Hanselmann
                             (handler, method)))
1800 de959245 Michael Hanselmann
1801 de959245 Michael Hanselmann
1802 2f96c43c Michael Hanselmann
if __name__ == "__main__":
1803 6395cebb Michael Hanselmann
  testutils.GanetiTestProgram()