Statistics
| Branch: | Tag: | Revision:

root / test / py / ganeti.rapi.rlib2_unittest.py @ da5f09ef

History | View | Annotate | Download (57.8 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 a82d9394 Michael Hanselmann
      "reason_text": ["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 4a90bd4f Michele Tartara
    self.assertEqual(op.reason,
388 a82d9394 Michael Hanselmann
                     (constants.INSTANCE_REASON_SOURCE_RAPI, "System update"))
389 ac4888c1 Michael Hanselmann
390 ac4888c1 Michael Hanselmann
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
391 ac4888c1 Michael Hanselmann
392 ac4888c1 Michael Hanselmann
393 4717e6eb Michael Hanselmann
class TestInstanceStartup(unittest.TestCase):
394 4717e6eb Michael Hanselmann
  def test(self):
395 4717e6eb Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
396 4717e6eb Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_instances_name_startup, ["inst31083"], {
397 4717e6eb Michael Hanselmann
      "force": ["1"],
398 4717e6eb Michael Hanselmann
      "no_remember": ["1"],
399 4717e6eb Michael Hanselmann
      }, {}, clfactory)
400 4717e6eb Michael Hanselmann
    job_id = handler.PUT()
401 4717e6eb Michael Hanselmann
402 4717e6eb Michael Hanselmann
    cl = clfactory.GetNextClient()
403 4717e6eb Michael Hanselmann
    self.assertRaises(IndexError, clfactory.GetNextClient)
404 4717e6eb Michael Hanselmann
405 4717e6eb Michael Hanselmann
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
406 4717e6eb Michael Hanselmann
    self.assertEqual(job_id, exp_job_id)
407 4717e6eb Michael Hanselmann
    self.assertTrue(isinstance(op, opcodes.OpInstanceStartup))
408 4717e6eb Michael Hanselmann
    self.assertEqual(op.instance_name, "inst31083")
409 4717e6eb Michael Hanselmann
    self.assertTrue(op.no_remember)
410 4717e6eb Michael Hanselmann
    self.assertTrue(op.force)
411 4717e6eb Michael Hanselmann
    self.assertFalse(op.dry_run)
412 4717e6eb Michael Hanselmann
413 4717e6eb Michael Hanselmann
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
414 4717e6eb Michael Hanselmann
415 4717e6eb Michael Hanselmann
416 3175ade6 Michael Hanselmann
class TestInstanceShutdown(unittest.TestCase):
417 3175ade6 Michael Hanselmann
  def test(self):
418 3175ade6 Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
419 3175ade6 Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_instances_name_shutdown, ["inst26791"], {
420 3175ade6 Michael Hanselmann
      "no_remember": ["0"],
421 3175ade6 Michael Hanselmann
      }, {}, clfactory)
422 3175ade6 Michael Hanselmann
    job_id = handler.PUT()
423 3175ade6 Michael Hanselmann
424 3175ade6 Michael Hanselmann
    cl = clfactory.GetNextClient()
425 3175ade6 Michael Hanselmann
    self.assertRaises(IndexError, clfactory.GetNextClient)
426 3175ade6 Michael Hanselmann
427 3175ade6 Michael Hanselmann
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
428 3175ade6 Michael Hanselmann
    self.assertEqual(job_id, exp_job_id)
429 3175ade6 Michael Hanselmann
    self.assertTrue(isinstance(op, opcodes.OpInstanceShutdown))
430 3175ade6 Michael Hanselmann
    self.assertEqual(op.instance_name, "inst26791")
431 3175ade6 Michael Hanselmann
    self.assertFalse(op.no_remember)
432 3175ade6 Michael Hanselmann
    self.assertFalse(op.dry_run)
433 3175ade6 Michael Hanselmann
434 3175ade6 Michael Hanselmann
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
435 3175ade6 Michael Hanselmann
436 3175ade6 Michael Hanselmann
437 1824a7a1 Michael Hanselmann
class TestInstanceActivateDisks(unittest.TestCase):
438 1824a7a1 Michael Hanselmann
  def test(self):
439 1824a7a1 Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
440 1824a7a1 Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_instances_name_activate_disks, ["xyz"], {
441 1824a7a1 Michael Hanselmann
      "ignore_size": ["1"],
442 1824a7a1 Michael Hanselmann
      }, {}, clfactory)
443 1824a7a1 Michael Hanselmann
    job_id = handler.PUT()
444 1824a7a1 Michael Hanselmann
445 1824a7a1 Michael Hanselmann
    cl = clfactory.GetNextClient()
446 1824a7a1 Michael Hanselmann
    self.assertRaises(IndexError, clfactory.GetNextClient)
447 1824a7a1 Michael Hanselmann
448 1824a7a1 Michael Hanselmann
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
449 1824a7a1 Michael Hanselmann
    self.assertEqual(job_id, exp_job_id)
450 1824a7a1 Michael Hanselmann
    self.assertTrue(isinstance(op, opcodes.OpInstanceActivateDisks))
451 1824a7a1 Michael Hanselmann
    self.assertEqual(op.instance_name, "xyz")
452 1824a7a1 Michael Hanselmann
    self.assertTrue(op.ignore_size)
453 1824a7a1 Michael Hanselmann
    self.assertFalse(hasattr(op, "dry_run"))
454 1824a7a1 Michael Hanselmann
455 1824a7a1 Michael Hanselmann
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
456 1824a7a1 Michael Hanselmann
457 1824a7a1 Michael Hanselmann
458 973ec124 Michael Hanselmann
class TestInstanceDeactivateDisks(unittest.TestCase):
459 973ec124 Michael Hanselmann
  def test(self):
460 973ec124 Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
461 973ec124 Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_instances_name_deactivate_disks,
462 973ec124 Michael Hanselmann
                             ["inst22357"], {}, {}, clfactory)
463 973ec124 Michael Hanselmann
    job_id = handler.PUT()
464 973ec124 Michael Hanselmann
465 973ec124 Michael Hanselmann
    cl = clfactory.GetNextClient()
466 973ec124 Michael Hanselmann
    self.assertRaises(IndexError, clfactory.GetNextClient)
467 973ec124 Michael Hanselmann
468 973ec124 Michael Hanselmann
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
469 973ec124 Michael Hanselmann
    self.assertEqual(job_id, exp_job_id)
470 973ec124 Michael Hanselmann
    self.assertTrue(isinstance(op, opcodes.OpInstanceDeactivateDisks))
471 973ec124 Michael Hanselmann
    self.assertEqual(op.instance_name, "inst22357")
472 973ec124 Michael Hanselmann
    self.assertFalse(hasattr(op, "dry_run"))
473 973ec124 Michael Hanselmann
    self.assertFalse(hasattr(op, "force"))
474 a52978c7 Michael Hanselmann
475 a52978c7 Michael Hanselmann
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
476 a52978c7 Michael Hanselmann
477 a52978c7 Michael Hanselmann
478 a52978c7 Michael Hanselmann
class TestInstanceRecreateDisks(unittest.TestCase):
479 a52978c7 Michael Hanselmann
  def test(self):
480 a52978c7 Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
481 a52978c7 Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_instances_name_recreate_disks,
482 a52978c7 Michael Hanselmann
                             ["inst22357"], {}, {}, clfactory)
483 a52978c7 Michael Hanselmann
    job_id = handler.POST()
484 a52978c7 Michael Hanselmann
485 a52978c7 Michael Hanselmann
    cl = clfactory.GetNextClient()
486 a52978c7 Michael Hanselmann
    self.assertRaises(IndexError, clfactory.GetNextClient)
487 a52978c7 Michael Hanselmann
488 a52978c7 Michael Hanselmann
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
489 a52978c7 Michael Hanselmann
    self.assertEqual(job_id, exp_job_id)
490 a52978c7 Michael Hanselmann
    self.assertTrue(isinstance(op, opcodes.OpInstanceRecreateDisks))
491 a52978c7 Michael Hanselmann
    self.assertEqual(op.instance_name, "inst22357")
492 a52978c7 Michael Hanselmann
    self.assertFalse(hasattr(op, "dry_run"))
493 a52978c7 Michael Hanselmann
    self.assertFalse(hasattr(op, "force"))
494 973ec124 Michael Hanselmann
495 973ec124 Michael Hanselmann
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
496 973ec124 Michael Hanselmann
497 973ec124 Michael Hanselmann
498 b5f2ab80 Michael Hanselmann
class TestInstanceFailover(unittest.TestCase):
499 b5f2ab80 Michael Hanselmann
  def test(self):
500 b5f2ab80 Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
501 b5f2ab80 Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_instances_name_failover,
502 b5f2ab80 Michael Hanselmann
                             ["inst12794"], {}, {}, clfactory)
503 b5f2ab80 Michael Hanselmann
    job_id = handler.PUT()
504 b5f2ab80 Michael Hanselmann
505 b5f2ab80 Michael Hanselmann
    cl = clfactory.GetNextClient()
506 b5f2ab80 Michael Hanselmann
    self.assertRaises(IndexError, clfactory.GetNextClient)
507 b5f2ab80 Michael Hanselmann
508 b5f2ab80 Michael Hanselmann
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
509 b5f2ab80 Michael Hanselmann
    self.assertEqual(job_id, exp_job_id)
510 b5f2ab80 Michael Hanselmann
    self.assertTrue(isinstance(op, opcodes.OpInstanceFailover))
511 b5f2ab80 Michael Hanselmann
    self.assertEqual(op.instance_name, "inst12794")
512 b5f2ab80 Michael Hanselmann
    self.assertFalse(hasattr(op, "dry_run"))
513 b5f2ab80 Michael Hanselmann
    self.assertFalse(hasattr(op, "force"))
514 b5f2ab80 Michael Hanselmann
515 b5f2ab80 Michael Hanselmann
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
516 b5f2ab80 Michael Hanselmann
517 b5f2ab80 Michael Hanselmann
518 335965b9 Michael Hanselmann
class TestInstanceDiskGrow(unittest.TestCase):
519 335965b9 Michael Hanselmann
  def test(self):
520 335965b9 Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
521 335965b9 Michael Hanselmann
    data = {
522 335965b9 Michael Hanselmann
      "amount": 1024,
523 335965b9 Michael Hanselmann
      }
524 335965b9 Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_instances_name_disk_grow,
525 335965b9 Michael Hanselmann
                             ["inst10742", "3"], {}, data, clfactory)
526 335965b9 Michael Hanselmann
    job_id = handler.POST()
527 335965b9 Michael Hanselmann
528 335965b9 Michael Hanselmann
    cl = clfactory.GetNextClient()
529 335965b9 Michael Hanselmann
    self.assertRaises(IndexError, clfactory.GetNextClient)
530 335965b9 Michael Hanselmann
531 335965b9 Michael Hanselmann
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
532 335965b9 Michael Hanselmann
    self.assertEqual(job_id, exp_job_id)
533 335965b9 Michael Hanselmann
    self.assertTrue(isinstance(op, opcodes.OpInstanceGrowDisk))
534 335965b9 Michael Hanselmann
    self.assertEqual(op.instance_name, "inst10742")
535 335965b9 Michael Hanselmann
    self.assertEqual(op.disk, 3)
536 335965b9 Michael Hanselmann
    self.assertEqual(op.amount, 1024)
537 335965b9 Michael Hanselmann
    self.assertFalse(hasattr(op, "dry_run"))
538 335965b9 Michael Hanselmann
    self.assertFalse(hasattr(op, "force"))
539 335965b9 Michael Hanselmann
540 335965b9 Michael Hanselmann
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
541 335965b9 Michael Hanselmann
542 335965b9 Michael Hanselmann
543 1c63311d Michael Hanselmann
class TestBackupPrepare(unittest.TestCase):
544 1c63311d Michael Hanselmann
  def test(self):
545 1c63311d Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
546 1c63311d Michael Hanselmann
    queryargs = {
547 1c63311d Michael Hanselmann
      "mode": constants.EXPORT_MODE_REMOTE,
548 1c63311d Michael Hanselmann
      }
549 1c63311d Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_instances_name_prepare_export,
550 1c63311d Michael Hanselmann
                             ["inst17925"], queryargs, {}, clfactory)
551 1c63311d Michael Hanselmann
    job_id = handler.PUT()
552 1c63311d Michael Hanselmann
553 1c63311d Michael Hanselmann
    cl = clfactory.GetNextClient()
554 1c63311d Michael Hanselmann
    self.assertRaises(IndexError, clfactory.GetNextClient)
555 1c63311d Michael Hanselmann
556 1c63311d Michael Hanselmann
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
557 1c63311d Michael Hanselmann
    self.assertEqual(job_id, exp_job_id)
558 1c63311d Michael Hanselmann
    self.assertTrue(isinstance(op, opcodes.OpBackupPrepare))
559 1c63311d Michael Hanselmann
    self.assertEqual(op.instance_name, "inst17925")
560 1c63311d Michael Hanselmann
    self.assertEqual(op.mode, constants.EXPORT_MODE_REMOTE)
561 1c63311d Michael Hanselmann
    self.assertFalse(hasattr(op, "dry_run"))
562 1c63311d Michael Hanselmann
    self.assertFalse(hasattr(op, "force"))
563 1c63311d Michael Hanselmann
564 1c63311d Michael Hanselmann
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
565 1c63311d Michael Hanselmann
566 1c63311d Michael Hanselmann
567 86f1f5d4 Michael Hanselmann
class TestGroupRemove(unittest.TestCase):
568 86f1f5d4 Michael Hanselmann
  def test(self):
569 86f1f5d4 Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
570 86f1f5d4 Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_groups_name,
571 86f1f5d4 Michael Hanselmann
                             ["grp28575"], {}, {}, clfactory)
572 86f1f5d4 Michael Hanselmann
    job_id = handler.DELETE()
573 86f1f5d4 Michael Hanselmann
574 86f1f5d4 Michael Hanselmann
    cl = clfactory.GetNextClient()
575 86f1f5d4 Michael Hanselmann
    self.assertRaises(IndexError, clfactory.GetNextClient)
576 86f1f5d4 Michael Hanselmann
577 86f1f5d4 Michael Hanselmann
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
578 86f1f5d4 Michael Hanselmann
    self.assertEqual(job_id, exp_job_id)
579 86f1f5d4 Michael Hanselmann
    self.assertTrue(isinstance(op, opcodes.OpGroupRemove))
580 86f1f5d4 Michael Hanselmann
    self.assertEqual(op.group_name, "grp28575")
581 86f1f5d4 Michael Hanselmann
    self.assertFalse(op.dry_run)
582 86f1f5d4 Michael Hanselmann
    self.assertFalse(hasattr(op, "force"))
583 86f1f5d4 Michael Hanselmann
584 86f1f5d4 Michael Hanselmann
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
585 86f1f5d4 Michael Hanselmann
586 86f1f5d4 Michael Hanselmann
587 eb08e09d Michael Hanselmann
class TestStorageQuery(unittest.TestCase):
588 eb08e09d Michael Hanselmann
  def test(self):
589 eb08e09d Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
590 eb08e09d Michael Hanselmann
    queryargs = {
591 eb08e09d Michael Hanselmann
      "storage_type": constants.ST_LVM_PV,
592 eb08e09d Michael Hanselmann
      "output_fields": "name,other",
593 eb08e09d Michael Hanselmann
      }
594 eb08e09d Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_nodes_name_storage,
595 eb08e09d Michael Hanselmann
                             ["node21075"], queryargs, {}, clfactory)
596 eb08e09d Michael Hanselmann
    job_id = handler.GET()
597 eb08e09d Michael Hanselmann
598 eb08e09d Michael Hanselmann
    cl = clfactory.GetNextClient()
599 eb08e09d Michael Hanselmann
    self.assertRaises(IndexError, clfactory.GetNextClient)
600 eb08e09d Michael Hanselmann
601 eb08e09d Michael Hanselmann
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
602 eb08e09d Michael Hanselmann
    self.assertEqual(job_id, exp_job_id)
603 eb08e09d Michael Hanselmann
    self.assertTrue(isinstance(op, opcodes.OpNodeQueryStorage))
604 eb08e09d Michael Hanselmann
    self.assertEqual(op.nodes, ["node21075"])
605 eb08e09d Michael Hanselmann
    self.assertEqual(op.storage_type, constants.ST_LVM_PV)
606 eb08e09d Michael Hanselmann
    self.assertEqual(op.output_fields, ["name", "other"])
607 eb08e09d Michael Hanselmann
    self.assertFalse(hasattr(op, "dry_run"))
608 eb08e09d Michael Hanselmann
    self.assertFalse(hasattr(op, "force"))
609 eb08e09d Michael Hanselmann
610 eb08e09d Michael Hanselmann
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
611 eb08e09d Michael Hanselmann
612 eb08e09d Michael Hanselmann
  def testErrors(self):
613 eb08e09d Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
614 eb08e09d Michael Hanselmann
615 eb08e09d Michael Hanselmann
    queryargs = {
616 eb08e09d Michael Hanselmann
      "output_fields": "name,other",
617 eb08e09d Michael Hanselmann
      }
618 eb08e09d Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_nodes_name_storage,
619 eb08e09d Michael Hanselmann
                             ["node10538"], queryargs, {}, clfactory)
620 eb08e09d Michael Hanselmann
    self.assertRaises(http.HttpBadRequest, handler.GET)
621 eb08e09d Michael Hanselmann
622 eb08e09d Michael Hanselmann
    queryargs = {
623 eb08e09d Michael Hanselmann
      "storage_type": constants.ST_LVM_VG,
624 eb08e09d Michael Hanselmann
      }
625 eb08e09d Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_nodes_name_storage,
626 eb08e09d Michael Hanselmann
                             ["node21273"], queryargs, {}, clfactory)
627 eb08e09d Michael Hanselmann
    self.assertRaises(http.HttpBadRequest, handler.GET)
628 eb08e09d Michael Hanselmann
629 eb08e09d Michael Hanselmann
    queryargs = {
630 eb08e09d Michael Hanselmann
      "storage_type": "##unknown_storage##",
631 eb08e09d Michael Hanselmann
      "output_fields": "name,other",
632 eb08e09d Michael Hanselmann
      }
633 eb08e09d Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_nodes_name_storage,
634 eb08e09d Michael Hanselmann
                             ["node10315"], queryargs, {}, clfactory)
635 eb08e09d Michael Hanselmann
    self.assertRaises(http.HttpBadRequest, handler.GET)
636 eb08e09d Michael Hanselmann
637 eb08e09d Michael Hanselmann
638 8d232068 Michael Hanselmann
class TestStorageModify(unittest.TestCase):
639 8d232068 Michael Hanselmann
  def test(self):
640 8d232068 Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
641 8d232068 Michael Hanselmann
642 8d232068 Michael Hanselmann
    for allocatable in [None, "1", "0"]:
643 8d232068 Michael Hanselmann
      queryargs = {
644 8d232068 Michael Hanselmann
        "storage_type": constants.ST_LVM_VG,
645 8d232068 Michael Hanselmann
        "name": "pv-a",
646 8d232068 Michael Hanselmann
        }
647 8d232068 Michael Hanselmann
648 8d232068 Michael Hanselmann
      if allocatable is not None:
649 8d232068 Michael Hanselmann
        queryargs["allocatable"] = allocatable
650 8d232068 Michael Hanselmann
651 8d232068 Michael Hanselmann
      handler = _CreateHandler(rlib2.R_2_nodes_name_storage_modify,
652 8d232068 Michael Hanselmann
                               ["node9292"], queryargs, {}, clfactory)
653 8d232068 Michael Hanselmann
      job_id = handler.PUT()
654 8d232068 Michael Hanselmann
655 8d232068 Michael Hanselmann
      cl = clfactory.GetNextClient()
656 8d232068 Michael Hanselmann
      self.assertRaises(IndexError, clfactory.GetNextClient)
657 8d232068 Michael Hanselmann
658 8d232068 Michael Hanselmann
      (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
659 8d232068 Michael Hanselmann
      self.assertEqual(job_id, exp_job_id)
660 8d232068 Michael Hanselmann
      self.assertTrue(isinstance(op, opcodes.OpNodeModifyStorage))
661 8d232068 Michael Hanselmann
      self.assertEqual(op.node_name, "node9292")
662 8d232068 Michael Hanselmann
      self.assertEqual(op.storage_type, constants.ST_LVM_VG)
663 8d232068 Michael Hanselmann
      self.assertEqual(op.name, "pv-a")
664 8d232068 Michael Hanselmann
      if allocatable is None:
665 8d232068 Michael Hanselmann
        self.assertFalse(op.changes)
666 8d232068 Michael Hanselmann
      else:
667 8d232068 Michael Hanselmann
        assert allocatable in ("0", "1")
668 8d232068 Michael Hanselmann
        self.assertEqual(op.changes, {
669 8d232068 Michael Hanselmann
          constants.SF_ALLOCATABLE: (allocatable == "1"),
670 8d232068 Michael Hanselmann
          })
671 8d232068 Michael Hanselmann
      self.assertFalse(hasattr(op, "dry_run"))
672 8d232068 Michael Hanselmann
      self.assertFalse(hasattr(op, "force"))
673 8d232068 Michael Hanselmann
674 8d232068 Michael Hanselmann
      self.assertRaises(IndexError, cl.GetNextSubmittedJob)
675 8d232068 Michael Hanselmann
676 8d232068 Michael Hanselmann
  def testErrors(self):
677 8d232068 Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
678 8d232068 Michael Hanselmann
679 8d232068 Michael Hanselmann
    # No storage type
680 8d232068 Michael Hanselmann
    queryargs = {
681 8d232068 Michael Hanselmann
      "name": "xyz",
682 8d232068 Michael Hanselmann
      }
683 8d232068 Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_nodes_name_storage_modify,
684 8d232068 Michael Hanselmann
                             ["node26016"], queryargs, {}, clfactory)
685 8d232068 Michael Hanselmann
    self.assertRaises(http.HttpBadRequest, handler.PUT)
686 8d232068 Michael Hanselmann
687 8d232068 Michael Hanselmann
    # No name
688 8d232068 Michael Hanselmann
    queryargs = {
689 8d232068 Michael Hanselmann
      "storage_type": constants.ST_LVM_VG,
690 8d232068 Michael Hanselmann
      }
691 8d232068 Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_nodes_name_storage_modify,
692 8d232068 Michael Hanselmann
                             ["node21218"], queryargs, {}, clfactory)
693 8d232068 Michael Hanselmann
    self.assertRaises(http.HttpBadRequest, handler.PUT)
694 8d232068 Michael Hanselmann
695 8d232068 Michael Hanselmann
    # Invalid value
696 8d232068 Michael Hanselmann
    queryargs = {
697 8d232068 Michael Hanselmann
      "storage_type": constants.ST_LVM_VG,
698 8d232068 Michael Hanselmann
      "name": "pv-b",
699 8d232068 Michael Hanselmann
      "allocatable": "noint",
700 8d232068 Michael Hanselmann
      }
701 8d232068 Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_nodes_name_storage_modify,
702 8d232068 Michael Hanselmann
                             ["node30685"], queryargs, {}, clfactory)
703 8d232068 Michael Hanselmann
    self.assertRaises(http.HttpBadRequest, handler.PUT)
704 8d232068 Michael Hanselmann
705 8d232068 Michael Hanselmann
706 98270691 Michael Hanselmann
class TestStorageRepair(unittest.TestCase):
707 98270691 Michael Hanselmann
  def test(self):
708 98270691 Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
709 98270691 Michael Hanselmann
    queryargs = {
710 98270691 Michael Hanselmann
      "storage_type": constants.ST_LVM_PV,
711 98270691 Michael Hanselmann
      "name": "pv16611",
712 98270691 Michael Hanselmann
      }
713 98270691 Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_nodes_name_storage_repair,
714 98270691 Michael Hanselmann
                             ["node19265"], queryargs, {}, clfactory)
715 98270691 Michael Hanselmann
    job_id = handler.PUT()
716 98270691 Michael Hanselmann
717 98270691 Michael Hanselmann
    cl = clfactory.GetNextClient()
718 98270691 Michael Hanselmann
    self.assertRaises(IndexError, clfactory.GetNextClient)
719 98270691 Michael Hanselmann
720 98270691 Michael Hanselmann
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
721 98270691 Michael Hanselmann
    self.assertEqual(job_id, exp_job_id)
722 98270691 Michael Hanselmann
    self.assertTrue(isinstance(op, opcodes.OpRepairNodeStorage))
723 98270691 Michael Hanselmann
    self.assertEqual(op.node_name, "node19265")
724 98270691 Michael Hanselmann
    self.assertEqual(op.storage_type, constants.ST_LVM_PV)
725 98270691 Michael Hanselmann
    self.assertEqual(op.name, "pv16611")
726 98270691 Michael Hanselmann
    self.assertFalse(hasattr(op, "dry_run"))
727 98270691 Michael Hanselmann
    self.assertFalse(hasattr(op, "force"))
728 98270691 Michael Hanselmann
729 98270691 Michael Hanselmann
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
730 98270691 Michael Hanselmann
731 98270691 Michael Hanselmann
  def testErrors(self):
732 98270691 Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
733 98270691 Michael Hanselmann
734 98270691 Michael Hanselmann
    # No storage type
735 98270691 Michael Hanselmann
    queryargs = {
736 98270691 Michael Hanselmann
      "name": "xyz",
737 98270691 Michael Hanselmann
      }
738 98270691 Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_nodes_name_storage_repair,
739 98270691 Michael Hanselmann
                             ["node11275"], queryargs, {}, clfactory)
740 98270691 Michael Hanselmann
    self.assertRaises(http.HttpBadRequest, handler.PUT)
741 98270691 Michael Hanselmann
742 98270691 Michael Hanselmann
    # No name
743 98270691 Michael Hanselmann
    queryargs = {
744 98270691 Michael Hanselmann
      "storage_type": constants.ST_LVM_VG,
745 98270691 Michael Hanselmann
      }
746 98270691 Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_nodes_name_storage_repair,
747 98270691 Michael Hanselmann
                             ["node21218"], queryargs, {}, clfactory)
748 98270691 Michael Hanselmann
    self.assertRaises(http.HttpBadRequest, handler.PUT)
749 98270691 Michael Hanselmann
750 98270691 Michael Hanselmann
751 460ef073 Michael Hanselmann
class TestTags(unittest.TestCase):
752 460ef073 Michael Hanselmann
  TAG_HANDLERS = [
753 460ef073 Michael Hanselmann
    rlib2.R_2_instances_name_tags,
754 460ef073 Michael Hanselmann
    rlib2.R_2_nodes_name_tags,
755 460ef073 Michael Hanselmann
    rlib2.R_2_groups_name_tags,
756 460ef073 Michael Hanselmann
    rlib2.R_2_tags,
757 460ef073 Michael Hanselmann
    ]
758 460ef073 Michael Hanselmann
759 460ef073 Michael Hanselmann
  def testSetAndDelete(self):
760 460ef073 Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
761 460ef073 Michael Hanselmann
762 460ef073 Michael Hanselmann
    for method, opcls in [("PUT", opcodes.OpTagsSet),
763 460ef073 Michael Hanselmann
                          ("DELETE", opcodes.OpTagsDel)]:
764 460ef073 Michael Hanselmann
      for idx, handler in enumerate(self.TAG_HANDLERS):
765 460ef073 Michael Hanselmann
        dry_run = bool(idx % 2)
766 460ef073 Michael Hanselmann
        name = "test%s" % idx
767 460ef073 Michael Hanselmann
        queryargs = {
768 460ef073 Michael Hanselmann
          "tag": ["foo", "bar", "baz"],
769 460ef073 Michael Hanselmann
          "dry-run": str(int(dry_run)),
770 460ef073 Michael Hanselmann
          }
771 460ef073 Michael Hanselmann
772 460ef073 Michael Hanselmann
        handler = _CreateHandler(handler, [name], queryargs, {}, clfactory)
773 460ef073 Michael Hanselmann
        job_id = getattr(handler, method)()
774 460ef073 Michael Hanselmann
775 460ef073 Michael Hanselmann
        cl = clfactory.GetNextClient()
776 460ef073 Michael Hanselmann
        self.assertRaises(IndexError, clfactory.GetNextClient)
777 460ef073 Michael Hanselmann
778 460ef073 Michael Hanselmann
        (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
779 460ef073 Michael Hanselmann
        self.assertEqual(job_id, exp_job_id)
780 460ef073 Michael Hanselmann
        self.assertTrue(isinstance(op, opcls))
781 460ef073 Michael Hanselmann
        self.assertEqual(op.kind, handler.TAG_LEVEL)
782 460ef073 Michael Hanselmann
        if handler.TAG_LEVEL == constants.TAG_CLUSTER:
783 460ef073 Michael Hanselmann
          self.assertTrue(op.name is None)
784 460ef073 Michael Hanselmann
        else:
785 460ef073 Michael Hanselmann
          self.assertEqual(op.name, name)
786 460ef073 Michael Hanselmann
        self.assertEqual(op.tags, ["foo", "bar", "baz"])
787 460ef073 Michael Hanselmann
        self.assertEqual(op.dry_run, dry_run)
788 460ef073 Michael Hanselmann
        self.assertFalse(hasattr(op, "force"))
789 460ef073 Michael Hanselmann
790 460ef073 Michael Hanselmann
        self.assertRaises(IndexError, cl.GetNextSubmittedJob)
791 460ef073 Michael Hanselmann
792 460ef073 Michael Hanselmann
793 09a43b39 Michael Hanselmann
class TestInstanceCreation(testutils.GanetiTestCase):
794 09a43b39 Michael Hanselmann
  def test(self):
795 09a43b39 Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
796 6395cebb Michael Hanselmann
797 09a43b39 Michael Hanselmann
    name = "inst863.example.com"
798 6395cebb Michael Hanselmann
799 6395cebb Michael Hanselmann
    disk_variants = [
800 6395cebb Michael Hanselmann
      # No disks
801 6395cebb Michael Hanselmann
      [],
802 6395cebb Michael Hanselmann
803 6395cebb Michael Hanselmann
      # Two disks
804 6395cebb Michael Hanselmann
      [{"size": 5, }, {"size": 100, }],
805 6395cebb Michael Hanselmann
806 6395cebb Michael Hanselmann
      # Disk with mode
807 6395cebb Michael Hanselmann
      [{"size": 123, "mode": constants.DISK_RDWR, }],
808 6395cebb Michael Hanselmann
      ]
809 6395cebb Michael Hanselmann
810 6395cebb Michael Hanselmann
    nic_variants = [
811 6395cebb Michael Hanselmann
      # No NIC
812 6395cebb Michael Hanselmann
      [],
813 6395cebb Michael Hanselmann
814 6395cebb Michael Hanselmann
      # Three NICs
815 6395cebb Michael Hanselmann
      [{}, {}, {}],
816 6395cebb Michael Hanselmann
817 6395cebb Michael Hanselmann
      # Two NICs
818 6395cebb Michael Hanselmann
      [
819 54dc4fdb Michael Hanselmann
        { "ip": "192.0.2.6", "mode": constants.NIC_MODE_ROUTED,
820 7be048f0 Michael Hanselmann
          "mac": "01:23:45:67:68:9A",
821 7be048f0 Michael Hanselmann
        },
822 ba05464f Guido Trotter
        { "mode": constants.NIC_MODE_BRIDGED, "link": "br1" },
823 6395cebb Michael Hanselmann
      ],
824 6395cebb Michael Hanselmann
      ]
825 6395cebb Michael Hanselmann
826 6395cebb Michael Hanselmann
    beparam_variants = [
827 6395cebb Michael Hanselmann
      None,
828 6395cebb Michael Hanselmann
      {},
829 6395cebb Michael Hanselmann
      { constants.BE_VCPUS: 2, },
830 861610e9 Guido Trotter
      { constants.BE_MAXMEM: 200, },
831 861610e9 Guido Trotter
      { constants.BE_MEMORY: 256, },
832 6395cebb Michael Hanselmann
      { constants.BE_VCPUS: 2,
833 861610e9 Guido Trotter
        constants.BE_MAXMEM: 1024,
834 861610e9 Guido Trotter
        constants.BE_MINMEM: 1024,
835 42a769f9 Bernardo Dal Seno
        constants.BE_AUTO_BALANCE: True,
836 42a769f9 Bernardo Dal Seno
        constants.BE_ALWAYS_FAILOVER: True, }
837 6395cebb Michael Hanselmann
      ]
838 6395cebb Michael Hanselmann
839 6395cebb Michael Hanselmann
    hvparam_variants = [
840 6395cebb Michael Hanselmann
      None,
841 6395cebb Michael Hanselmann
      { constants.HV_BOOT_ORDER: "anc", },
842 6395cebb Michael Hanselmann
      { constants.HV_KERNEL_PATH: "/boot/fookernel",
843 6395cebb Michael Hanselmann
        constants.HV_ROOT_PATH: "/dev/hda1", },
844 6395cebb Michael Hanselmann
      ]
845 6395cebb Michael Hanselmann
846 6395cebb Michael Hanselmann
    for mode in [constants.INSTANCE_CREATE, constants.INSTANCE_IMPORT]:
847 6395cebb Michael Hanselmann
      for nics in nic_variants:
848 6395cebb Michael Hanselmann
        for disk_template in constants.DISK_TEMPLATES:
849 6395cebb Michael Hanselmann
          for disks in disk_variants:
850 6395cebb Michael Hanselmann
            for beparams in beparam_variants:
851 6395cebb Michael Hanselmann
              for hvparams in hvparam_variants:
852 6395cebb Michael Hanselmann
                for dry_run in [False, True]:
853 09a43b39 Michael Hanselmann
                  queryargs = {
854 09a43b39 Michael Hanselmann
                    "dry-run": str(int(dry_run)),
855 09a43b39 Michael Hanselmann
                    }
856 09a43b39 Michael Hanselmann
857 09a43b39 Michael Hanselmann
                  data = {
858 09a43b39 Michael Hanselmann
                    rlib2._REQ_DATA_VERSION: 1,
859 09a43b39 Michael Hanselmann
                    "name": name,
860 09a43b39 Michael Hanselmann
                    "hypervisor": constants.HT_FAKE,
861 09a43b39 Michael Hanselmann
                    "disks": disks,
862 09a43b39 Michael Hanselmann
                    "nics": nics,
863 09a43b39 Michael Hanselmann
                    "mode": mode,
864 09a43b39 Michael Hanselmann
                    "disk_template": disk_template,
865 09a43b39 Michael Hanselmann
                    "os": "debootstrap",
866 09a43b39 Michael Hanselmann
                    }
867 09a43b39 Michael Hanselmann
868 09a43b39 Michael Hanselmann
                  if beparams is not None:
869 09a43b39 Michael Hanselmann
                    data["beparams"] = beparams
870 09a43b39 Michael Hanselmann
871 09a43b39 Michael Hanselmann
                  if hvparams is not None:
872 09a43b39 Michael Hanselmann
                    data["hvparams"] = hvparams
873 09a43b39 Michael Hanselmann
874 09a43b39 Michael Hanselmann
                  handler = _CreateHandler(rlib2.R_2_instances, [],
875 09a43b39 Michael Hanselmann
                                           queryargs, data, clfactory)
876 09a43b39 Michael Hanselmann
                  job_id = handler.POST()
877 09a43b39 Michael Hanselmann
878 09a43b39 Michael Hanselmann
                  cl = clfactory.GetNextClient()
879 09a43b39 Michael Hanselmann
                  self.assertRaises(IndexError, clfactory.GetNextClient)
880 09a43b39 Michael Hanselmann
881 09a43b39 Michael Hanselmann
                  (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
882 09a43b39 Michael Hanselmann
                  self.assertEqual(job_id, exp_job_id)
883 09a43b39 Michael Hanselmann
                  self.assertRaises(IndexError, cl.GetNextSubmittedJob)
884 09a43b39 Michael Hanselmann
885 09a43b39 Michael Hanselmann
                  self.assertTrue(isinstance(op, opcodes.OpInstanceCreate))
886 09a43b39 Michael Hanselmann
                  self.assertEqual(op.instance_name, name)
887 6395cebb Michael Hanselmann
                  self.assertEqual(op.mode, mode)
888 6395cebb Michael Hanselmann
                  self.assertEqual(op.disk_template, disk_template)
889 6395cebb Michael Hanselmann
                  self.assertEqual(op.dry_run, dry_run)
890 6395cebb Michael Hanselmann
                  self.assertEqual(len(op.disks), len(disks))
891 6395cebb Michael Hanselmann
                  self.assertEqual(len(op.nics), len(nics))
892 6395cebb Michael Hanselmann
893 7be048f0 Michael Hanselmann
                  for opdisk, disk in zip(op.disks, disks):
894 7be048f0 Michael Hanselmann
                    for key in constants.IDISK_PARAMS:
895 7be048f0 Michael Hanselmann
                      self.assertEqual(opdisk.get(key), disk.get(key))
896 7be048f0 Michael Hanselmann
                    self.assertFalse("unknown" in opdisk)
897 7be048f0 Michael Hanselmann
898 7be048f0 Michael Hanselmann
                  for opnic, nic in zip(op.nics, nics):
899 7be048f0 Michael Hanselmann
                    for key in constants.INIC_PARAMS:
900 7be048f0 Michael Hanselmann
                      self.assertEqual(opnic.get(key), nic.get(key))
901 7be048f0 Michael Hanselmann
                    self.assertFalse("unknown" in opnic)
902 7be048f0 Michael Hanselmann
                    self.assertFalse("foobar" in opnic)
903 6395cebb Michael Hanselmann
904 6395cebb Michael Hanselmann
                  if beparams is None:
905 526a662a Michael Hanselmann
                    self.assertFalse(hasattr(op, "beparams"))
906 6395cebb Michael Hanselmann
                  else:
907 6395cebb Michael Hanselmann
                    self.assertEqualValues(op.beparams, beparams)
908 6395cebb Michael Hanselmann
909 6395cebb Michael Hanselmann
                  if hvparams is None:
910 526a662a Michael Hanselmann
                    self.assertFalse(hasattr(op, "hvparams"))
911 6395cebb Michael Hanselmann
                  else:
912 6395cebb Michael Hanselmann
                    self.assertEqualValues(op.hvparams, hvparams)
913 6395cebb Michael Hanselmann
914 526a662a Michael Hanselmann
  def testLegacyName(self):
915 09a43b39 Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
916 09a43b39 Michael Hanselmann
917 526a662a Michael Hanselmann
    name = "inst29128.example.com"
918 526a662a Michael Hanselmann
    data = {
919 09a43b39 Michael Hanselmann
      rlib2._REQ_DATA_VERSION: 1,
920 526a662a Michael Hanselmann
      "name": name,
921 526a662a Michael Hanselmann
      "disks": [],
922 526a662a Michael Hanselmann
      "nics": [],
923 526a662a Michael Hanselmann
      "mode": constants.INSTANCE_CREATE,
924 526a662a Michael Hanselmann
      "disk_template": constants.DT_PLAIN,
925 526a662a Michael Hanselmann
      }
926 09a43b39 Michael Hanselmann
927 09a43b39 Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_instances, [], {}, data, clfactory)
928 09a43b39 Michael Hanselmann
    job_id = handler.POST()
929 09a43b39 Michael Hanselmann
930 09a43b39 Michael Hanselmann
    cl = clfactory.GetNextClient()
931 09a43b39 Michael Hanselmann
    self.assertRaises(IndexError, clfactory.GetNextClient)
932 09a43b39 Michael Hanselmann
933 09a43b39 Michael Hanselmann
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
934 09a43b39 Michael Hanselmann
    self.assertEqual(job_id, exp_job_id)
935 09a43b39 Michael Hanselmann
    self.assertTrue(isinstance(op, opcodes.OpInstanceCreate))
936 526a662a Michael Hanselmann
    self.assertEqual(op.instance_name, name)
937 526a662a Michael Hanselmann
    self.assertFalse(hasattr(op, "name"))
938 09a43b39 Michael Hanselmann
    self.assertFalse(op.dry_run)
939 09a43b39 Michael Hanselmann
940 09a43b39 Michael Hanselmann
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
941 526a662a Michael Hanselmann
942 526a662a Michael Hanselmann
    # Define both
943 09a43b39 Michael Hanselmann
    data["instance_name"] = "other.example.com"
944 09a43b39 Michael Hanselmann
    assert "name" in data and "instance_name" in data
945 09a43b39 Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_instances, [], {}, data, clfactory)
946 09a43b39 Michael Hanselmann
    self.assertRaises(http.HttpBadRequest, handler.POST)
947 09a43b39 Michael Hanselmann
    self.assertRaises(IndexError, clfactory.GetNextClient)
948 526a662a Michael Hanselmann
949 526a662a Michael Hanselmann
  def testLegacyOs(self):
950 09a43b39 Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
951 09a43b39 Michael Hanselmann
952 526a662a Michael Hanselmann
    name = "inst4673.example.com"
953 526a662a Michael Hanselmann
    os = "linux29206"
954 526a662a Michael Hanselmann
    data = {
955 09a43b39 Michael Hanselmann
      rlib2._REQ_DATA_VERSION: 1,
956 526a662a Michael Hanselmann
      "name": name,
957 526a662a Michael Hanselmann
      "os_type": os,
958 526a662a Michael Hanselmann
      "disks": [],
959 526a662a Michael Hanselmann
      "nics": [],
960 526a662a Michael Hanselmann
      "mode": constants.INSTANCE_CREATE,
961 526a662a Michael Hanselmann
      "disk_template": constants.DT_PLAIN,
962 526a662a Michael Hanselmann
      }
963 09a43b39 Michael Hanselmann
964 09a43b39 Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_instances, [], {}, data, clfactory)
965 09a43b39 Michael Hanselmann
    job_id = handler.POST()
966 09a43b39 Michael Hanselmann
967 09a43b39 Michael Hanselmann
    cl = clfactory.GetNextClient()
968 09a43b39 Michael Hanselmann
    self.assertRaises(IndexError, clfactory.GetNextClient)
969 09a43b39 Michael Hanselmann
970 09a43b39 Michael Hanselmann
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
971 09a43b39 Michael Hanselmann
    self.assertEqual(job_id, exp_job_id)
972 09a43b39 Michael Hanselmann
    self.assertTrue(isinstance(op, opcodes.OpInstanceCreate))
973 526a662a Michael Hanselmann
    self.assertEqual(op.instance_name, name)
974 526a662a Michael Hanselmann
    self.assertEqual(op.os_type, os)
975 526a662a Michael Hanselmann
    self.assertFalse(hasattr(op, "os"))
976 09a43b39 Michael Hanselmann
    self.assertFalse(op.dry_run)
977 09a43b39 Michael Hanselmann
978 09a43b39 Michael Hanselmann
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
979 526a662a Michael Hanselmann
980 526a662a Michael Hanselmann
    # Define both
981 09a43b39 Michael Hanselmann
    data["os"] = "linux9584"
982 09a43b39 Michael Hanselmann
    assert "os" in data and "os_type" in data
983 09a43b39 Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_instances, [], {}, data, clfactory)
984 09a43b39 Michael Hanselmann
    self.assertRaises(http.HttpBadRequest, handler.POST)
985 526a662a Michael Hanselmann
986 6395cebb Michael Hanselmann
  def testErrors(self):
987 09a43b39 Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
988 09a43b39 Michael Hanselmann
989 6395cebb Michael Hanselmann
    # Test all required fields
990 6395cebb Michael Hanselmann
    reqfields = {
991 09a43b39 Michael Hanselmann
      rlib2._REQ_DATA_VERSION: 1,
992 6395cebb Michael Hanselmann
      "name": "inst1.example.com",
993 6395cebb Michael Hanselmann
      "disks": [],
994 6395cebb Michael Hanselmann
      "nics": [],
995 6395cebb Michael Hanselmann
      "mode": constants.INSTANCE_CREATE,
996 130f0966 Iustin Pop
      "disk_template": constants.DT_PLAIN,
997 6395cebb Michael Hanselmann
      }
998 6395cebb Michael Hanselmann
999 6395cebb Michael Hanselmann
    for name in reqfields.keys():
1000 09a43b39 Michael Hanselmann
      data = dict(i for i in reqfields.iteritems() if i[0] != name)
1001 09a43b39 Michael Hanselmann
1002 09a43b39 Michael Hanselmann
      handler = _CreateHandler(rlib2.R_2_instances, [], {}, data, clfactory)
1003 09a43b39 Michael Hanselmann
      self.assertRaises(http.HttpBadRequest, handler.POST)
1004 09a43b39 Michael Hanselmann
      self.assertRaises(IndexError, clfactory.GetNextClient)
1005 6395cebb Michael Hanselmann
1006 6395cebb Michael Hanselmann
    # Invalid disks and nics
1007 6395cebb Michael Hanselmann
    for field in ["disks", "nics"]:
1008 526a662a Michael Hanselmann
      invalid_values = [None, 1, "", {}, [1, 2, 3], ["hda1", "hda2"],
1009 3e3ddbf0 Constantinos Venetsanopoulos
                        [{"_unknown_": False, }]]
1010 6395cebb Michael Hanselmann
1011 6395cebb Michael Hanselmann
      for invvalue in invalid_values:
1012 6395cebb Michael Hanselmann
        data = reqfields.copy()
1013 6395cebb Michael Hanselmann
        data[field] = invvalue
1014 09a43b39 Michael Hanselmann
        handler = _CreateHandler(rlib2.R_2_instances, [], {}, data, clfactory)
1015 09a43b39 Michael Hanselmann
        self.assertRaises(http.HttpBadRequest, handler.POST)
1016 09a43b39 Michael Hanselmann
        self.assertRaises(IndexError, clfactory.GetNextClient)
1017 09a43b39 Michael Hanselmann
1018 09a43b39 Michael Hanselmann
  def testVersion(self):
1019 09a43b39 Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
1020 09a43b39 Michael Hanselmann
1021 09a43b39 Michael Hanselmann
    # No version field
1022 09a43b39 Michael Hanselmann
    data = {
1023 09a43b39 Michael Hanselmann
      "name": "inst1.example.com",
1024 09a43b39 Michael Hanselmann
      "disks": [],
1025 09a43b39 Michael Hanselmann
      "nics": [],
1026 09a43b39 Michael Hanselmann
      "mode": constants.INSTANCE_CREATE,
1027 09a43b39 Michael Hanselmann
      "disk_template": constants.DT_PLAIN,
1028 09a43b39 Michael Hanselmann
      }
1029 09a43b39 Michael Hanselmann
1030 09a43b39 Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_instances, [], {}, data, clfactory)
1031 09a43b39 Michael Hanselmann
    self.assertRaises(http.HttpBadRequest, handler.POST)
1032 09a43b39 Michael Hanselmann
1033 09a43b39 Michael Hanselmann
    # Old and incorrect versions
1034 09a43b39 Michael Hanselmann
    for version in [0, -1, 10483, "Hello World"]:
1035 09a43b39 Michael Hanselmann
      data[rlib2._REQ_DATA_VERSION] = version
1036 09a43b39 Michael Hanselmann
1037 09a43b39 Michael Hanselmann
      handler = _CreateHandler(rlib2.R_2_instances, [], {}, data, clfactory)
1038 09a43b39 Michael Hanselmann
      self.assertRaises(http.HttpBadRequest, handler.POST)
1039 09a43b39 Michael Hanselmann
1040 09a43b39 Michael Hanselmann
      self.assertRaises(IndexError, clfactory.GetNextClient)
1041 09a43b39 Michael Hanselmann
1042 09a43b39 Michael Hanselmann
    # Correct version
1043 09a43b39 Michael Hanselmann
    data[rlib2._REQ_DATA_VERSION] = 1
1044 09a43b39 Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_instances, [], {}, data, clfactory)
1045 09a43b39 Michael Hanselmann
    job_id = handler.POST()
1046 09a43b39 Michael Hanselmann
1047 09a43b39 Michael Hanselmann
    cl = clfactory.GetNextClient()
1048 09a43b39 Michael Hanselmann
    self.assertRaises(IndexError, clfactory.GetNextClient)
1049 09a43b39 Michael Hanselmann
1050 09a43b39 Michael Hanselmann
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
1051 09a43b39 Michael Hanselmann
    self.assertEqual(job_id, exp_job_id)
1052 09a43b39 Michael Hanselmann
    self.assertTrue(isinstance(op, opcodes.OpInstanceCreate))
1053 09a43b39 Michael Hanselmann
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
1054 6395cebb Michael Hanselmann
1055 6395cebb Michael Hanselmann
1056 134afbe7 Michael Hanselmann
class TestBackupExport(unittest.TestCase):
1057 ebeb600f Michael Hanselmann
  def test(self):
1058 134afbe7 Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
1059 134afbe7 Michael Hanselmann
1060 ebeb600f Michael Hanselmann
    name = "instmoo"
1061 ebeb600f Michael Hanselmann
    data = {
1062 ebeb600f Michael Hanselmann
      "mode": constants.EXPORT_MODE_REMOTE,
1063 ebeb600f Michael Hanselmann
      "destination": [(1, 2, 3), (99, 99, 99)],
1064 ebeb600f Michael Hanselmann
      "shutdown": True,
1065 ebeb600f Michael Hanselmann
      "remove_instance": True,
1066 07ce3e70 Michael Hanselmann
      "x509_key_name": ["name", "hash"],
1067 07ce3e70 Michael Hanselmann
      "destination_x509_ca": "---cert---"
1068 ebeb600f Michael Hanselmann
      }
1069 134afbe7 Michael Hanselmann
1070 134afbe7 Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_instances_name_export, [name], {},
1071 134afbe7 Michael Hanselmann
                             data, clfactory)
1072 134afbe7 Michael Hanselmann
    job_id = handler.PUT()
1073 134afbe7 Michael Hanselmann
1074 134afbe7 Michael Hanselmann
    cl = clfactory.GetNextClient()
1075 134afbe7 Michael Hanselmann
    self.assertRaises(IndexError, clfactory.GetNextClient)
1076 134afbe7 Michael Hanselmann
1077 134afbe7 Michael Hanselmann
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
1078 134afbe7 Michael Hanselmann
    self.assertEqual(job_id, exp_job_id)
1079 134afbe7 Michael Hanselmann
    self.assertTrue(isinstance(op, opcodes.OpBackupExport))
1080 ebeb600f Michael Hanselmann
    self.assertEqual(op.instance_name, name)
1081 ebeb600f Michael Hanselmann
    self.assertEqual(op.mode, constants.EXPORT_MODE_REMOTE)
1082 134afbe7 Michael Hanselmann
    self.assertEqual(op.target_node, [(1, 2, 3), (99, 99, 99)])
1083 ebeb600f Michael Hanselmann
    self.assertEqual(op.shutdown, True)
1084 ebeb600f Michael Hanselmann
    self.assertEqual(op.remove_instance, True)
1085 134afbe7 Michael Hanselmann
    self.assertEqual(op.x509_key_name, ["name", "hash"])
1086 07ce3e70 Michael Hanselmann
    self.assertEqual(op.destination_x509_ca, "---cert---")
1087 134afbe7 Michael Hanselmann
    self.assertFalse(hasattr(op, "dry_run"))
1088 134afbe7 Michael Hanselmann
    self.assertFalse(hasattr(op, "force"))
1089 134afbe7 Michael Hanselmann
1090 134afbe7 Michael Hanselmann
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
1091 ebeb600f Michael Hanselmann
1092 ebeb600f Michael Hanselmann
  def testDefaults(self):
1093 134afbe7 Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
1094 134afbe7 Michael Hanselmann
1095 ebeb600f Michael Hanselmann
    name = "inst1"
1096 ebeb600f Michael Hanselmann
    data = {
1097 ebeb600f Michael Hanselmann
      "destination": "node2",
1098 ebeb600f Michael Hanselmann
      "shutdown": False,
1099 ebeb600f Michael Hanselmann
      }
1100 134afbe7 Michael Hanselmann
1101 134afbe7 Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_instances_name_export, [name], {},
1102 134afbe7 Michael Hanselmann
                             data, clfactory)
1103 134afbe7 Michael Hanselmann
    job_id = handler.PUT()
1104 134afbe7 Michael Hanselmann
1105 134afbe7 Michael Hanselmann
    cl = clfactory.GetNextClient()
1106 134afbe7 Michael Hanselmann
    self.assertRaises(IndexError, clfactory.GetNextClient)
1107 134afbe7 Michael Hanselmann
1108 134afbe7 Michael Hanselmann
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
1109 134afbe7 Michael Hanselmann
    self.assertEqual(job_id, exp_job_id)
1110 134afbe7 Michael Hanselmann
    self.assertTrue(isinstance(op, opcodes.OpBackupExport))
1111 ebeb600f Michael Hanselmann
    self.assertEqual(op.instance_name, name)
1112 07ce3e70 Michael Hanselmann
    self.assertEqual(op.target_node, "node2")
1113 07ce3e70 Michael Hanselmann
    self.assertFalse(hasattr(op, "mode"))
1114 07ce3e70 Michael Hanselmann
    self.assertFalse(hasattr(op, "remove_instance"))
1115 07ce3e70 Michael Hanselmann
    self.assertFalse(hasattr(op, "destination"))
1116 134afbe7 Michael Hanselmann
    self.assertFalse(hasattr(op, "dry_run"))
1117 134afbe7 Michael Hanselmann
    self.assertFalse(hasattr(op, "force"))
1118 134afbe7 Michael Hanselmann
1119 134afbe7 Michael Hanselmann
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
1120 ebeb600f Michael Hanselmann
1121 ebeb600f Michael Hanselmann
  def testErrors(self):
1122 134afbe7 Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
1123 134afbe7 Michael Hanselmann
1124 134afbe7 Michael Hanselmann
    for value in ["True", "False"]:
1125 134afbe7 Michael Hanselmann
      handler = _CreateHandler(rlib2.R_2_instances_name_export, ["err1"], {}, {
1126 134afbe7 Michael Hanselmann
        "remove_instance": value,
1127 134afbe7 Michael Hanselmann
        }, clfactory)
1128 134afbe7 Michael Hanselmann
      self.assertRaises(http.HttpBadRequest, handler.PUT)
1129 ebeb600f Michael Hanselmann
1130 ebeb600f Michael Hanselmann
1131 075a29be Michael Hanselmann
class TestInstanceMigrate(testutils.GanetiTestCase):
1132 5823e0d2 Michael Hanselmann
  def test(self):
1133 075a29be Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
1134 075a29be Michael Hanselmann
1135 5823e0d2 Michael Hanselmann
    name = "instYooho6ek"
1136 5823e0d2 Michael Hanselmann
1137 5823e0d2 Michael Hanselmann
    for cleanup in [False, True]:
1138 5823e0d2 Michael Hanselmann
      for mode in constants.HT_MIGRATION_MODES:
1139 5823e0d2 Michael Hanselmann
        data = {
1140 5823e0d2 Michael Hanselmann
          "cleanup": cleanup,
1141 5823e0d2 Michael Hanselmann
          "mode": mode,
1142 5823e0d2 Michael Hanselmann
          }
1143 075a29be Michael Hanselmann
1144 075a29be Michael Hanselmann
        handler = _CreateHandler(rlib2.R_2_instances_name_migrate, [name], {},
1145 075a29be Michael Hanselmann
                                 data, clfactory)
1146 075a29be Michael Hanselmann
        job_id = handler.PUT()
1147 075a29be Michael Hanselmann
1148 075a29be Michael Hanselmann
        cl = clfactory.GetNextClient()
1149 075a29be Michael Hanselmann
        self.assertRaises(IndexError, clfactory.GetNextClient)
1150 075a29be Michael Hanselmann
1151 075a29be Michael Hanselmann
        (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
1152 075a29be Michael Hanselmann
        self.assertEqual(job_id, exp_job_id)
1153 075a29be Michael Hanselmann
        self.assertTrue(isinstance(op, opcodes.OpInstanceMigrate))
1154 5823e0d2 Michael Hanselmann
        self.assertEqual(op.instance_name, name)
1155 5823e0d2 Michael Hanselmann
        self.assertEqual(op.mode, mode)
1156 5823e0d2 Michael Hanselmann
        self.assertEqual(op.cleanup, cleanup)
1157 075a29be Michael Hanselmann
        self.assertFalse(hasattr(op, "dry_run"))
1158 075a29be Michael Hanselmann
        self.assertFalse(hasattr(op, "force"))
1159 075a29be Michael Hanselmann
1160 075a29be Michael Hanselmann
        self.assertRaises(IndexError, cl.GetNextSubmittedJob)
1161 5823e0d2 Michael Hanselmann
1162 5823e0d2 Michael Hanselmann
  def testDefaults(self):
1163 075a29be Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
1164 075a29be Michael Hanselmann
1165 5823e0d2 Michael Hanselmann
    name = "instnohZeex0"
1166 5823e0d2 Michael Hanselmann
1167 075a29be Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_instances_name_migrate, [name], {}, {},
1168 075a29be Michael Hanselmann
                             clfactory)
1169 075a29be Michael Hanselmann
    job_id = handler.PUT()
1170 075a29be Michael Hanselmann
1171 075a29be Michael Hanselmann
    cl = clfactory.GetNextClient()
1172 075a29be Michael Hanselmann
    self.assertRaises(IndexError, clfactory.GetNextClient)
1173 075a29be Michael Hanselmann
1174 075a29be Michael Hanselmann
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
1175 075a29be Michael Hanselmann
    self.assertEqual(job_id, exp_job_id)
1176 075a29be Michael Hanselmann
    self.assertTrue(isinstance(op, opcodes.OpInstanceMigrate))
1177 5823e0d2 Michael Hanselmann
    self.assertEqual(op.instance_name, name)
1178 c1a27c9a Michael Hanselmann
    self.assertFalse(hasattr(op, "mode"))
1179 c1a27c9a Michael Hanselmann
    self.assertFalse(hasattr(op, "cleanup"))
1180 075a29be Michael Hanselmann
    self.assertFalse(hasattr(op, "dry_run"))
1181 075a29be Michael Hanselmann
    self.assertFalse(hasattr(op, "force"))
1182 075a29be Michael Hanselmann
1183 075a29be Michael Hanselmann
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
1184 5823e0d2 Michael Hanselmann
1185 5823e0d2 Michael Hanselmann
1186 d56e7dc7 Michael Hanselmann
class TestParseRenameInstanceRequest(testutils.GanetiTestCase):
1187 d56e7dc7 Michael Hanselmann
  def test(self):
1188 d76f9b5d Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
1189 d76f9b5d Michael Hanselmann
1190 d56e7dc7 Michael Hanselmann
    name = "instij0eeph7"
1191 d56e7dc7 Michael Hanselmann
1192 d56e7dc7 Michael Hanselmann
    for new_name in ["ua0aiyoo", "fai3ongi"]:
1193 d56e7dc7 Michael Hanselmann
      for ip_check in [False, True]:
1194 d56e7dc7 Michael Hanselmann
        for name_check in [False, True]:
1195 d56e7dc7 Michael Hanselmann
          data = {
1196 d56e7dc7 Michael Hanselmann
            "new_name": new_name,
1197 d56e7dc7 Michael Hanselmann
            "ip_check": ip_check,
1198 d56e7dc7 Michael Hanselmann
            "name_check": name_check,
1199 d56e7dc7 Michael Hanselmann
            }
1200 d56e7dc7 Michael Hanselmann
1201 d76f9b5d Michael Hanselmann
          handler = _CreateHandler(rlib2.R_2_instances_name_rename, [name],
1202 d76f9b5d Michael Hanselmann
                                   {}, data, clfactory)
1203 d76f9b5d Michael Hanselmann
          job_id = handler.PUT()
1204 d76f9b5d Michael Hanselmann
1205 d76f9b5d Michael Hanselmann
          cl = clfactory.GetNextClient()
1206 d76f9b5d Michael Hanselmann
          self.assertRaises(IndexError, clfactory.GetNextClient)
1207 d76f9b5d Michael Hanselmann
1208 d76f9b5d Michael Hanselmann
          (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
1209 d76f9b5d Michael Hanselmann
          self.assertEqual(job_id, exp_job_id)
1210 d76f9b5d Michael Hanselmann
          self.assertTrue(isinstance(op, opcodes.OpInstanceRename))
1211 d56e7dc7 Michael Hanselmann
          self.assertEqual(op.instance_name, name)
1212 d56e7dc7 Michael Hanselmann
          self.assertEqual(op.new_name, new_name)
1213 d56e7dc7 Michael Hanselmann
          self.assertEqual(op.ip_check, ip_check)
1214 d56e7dc7 Michael Hanselmann
          self.assertEqual(op.name_check, name_check)
1215 d76f9b5d Michael Hanselmann
          self.assertFalse(hasattr(op, "dry_run"))
1216 d76f9b5d Michael Hanselmann
          self.assertFalse(hasattr(op, "force"))
1217 d76f9b5d Michael Hanselmann
1218 d76f9b5d Michael Hanselmann
          self.assertRaises(IndexError, cl.GetNextSubmittedJob)
1219 d56e7dc7 Michael Hanselmann
1220 d56e7dc7 Michael Hanselmann
  def testDefaults(self):
1221 d76f9b5d Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
1222 d76f9b5d Michael Hanselmann
1223 d56e7dc7 Michael Hanselmann
    name = "instahchie3t"
1224 d56e7dc7 Michael Hanselmann
1225 d56e7dc7 Michael Hanselmann
    for new_name in ["thag9mek", "quees7oh"]:
1226 d56e7dc7 Michael Hanselmann
      data = {
1227 d56e7dc7 Michael Hanselmann
        "new_name": new_name,
1228 d56e7dc7 Michael Hanselmann
        }
1229 d56e7dc7 Michael Hanselmann
1230 d76f9b5d Michael Hanselmann
      handler = _CreateHandler(rlib2.R_2_instances_name_rename, [name],
1231 d76f9b5d Michael Hanselmann
                               {}, data, clfactory)
1232 d76f9b5d Michael Hanselmann
      job_id = handler.PUT()
1233 d76f9b5d Michael Hanselmann
1234 d76f9b5d Michael Hanselmann
      cl = clfactory.GetNextClient()
1235 d76f9b5d Michael Hanselmann
      self.assertRaises(IndexError, clfactory.GetNextClient)
1236 d76f9b5d Michael Hanselmann
1237 d76f9b5d Michael Hanselmann
      (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
1238 d76f9b5d Michael Hanselmann
      self.assertEqual(job_id, exp_job_id)
1239 d76f9b5d Michael Hanselmann
      self.assertTrue(isinstance(op, opcodes.OpInstanceRename))
1240 d56e7dc7 Michael Hanselmann
      self.assertEqual(op.instance_name, name)
1241 d56e7dc7 Michael Hanselmann
      self.assertEqual(op.new_name, new_name)
1242 88bc199a Michael Hanselmann
      self.assertFalse(hasattr(op, "ip_check"))
1243 88bc199a Michael Hanselmann
      self.assertFalse(hasattr(op, "name_check"))
1244 d76f9b5d Michael Hanselmann
      self.assertFalse(hasattr(op, "dry_run"))
1245 d76f9b5d Michael Hanselmann
      self.assertFalse(hasattr(op, "force"))
1246 d76f9b5d Michael Hanselmann
1247 d76f9b5d Michael Hanselmann
      self.assertRaises(IndexError, cl.GetNextSubmittedJob)
1248 d56e7dc7 Michael Hanselmann
1249 d56e7dc7 Michael Hanselmann
1250 f3db88ba Michael Hanselmann
class TestParseModifyInstanceRequest(unittest.TestCase):
1251 3882937a Michael Hanselmann
  def test(self):
1252 f3db88ba Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
1253 f3db88ba Michael Hanselmann
1254 3882937a Michael Hanselmann
    name = "instush8gah"
1255 3882937a Michael Hanselmann
1256 3882937a Michael Hanselmann
    test_disks = [
1257 3882937a Michael Hanselmann
      [],
1258 3882937a Michael Hanselmann
      [(1, { constants.IDISK_MODE: constants.DISK_RDWR, })],
1259 3882937a Michael Hanselmann
      ]
1260 3882937a Michael Hanselmann
1261 3882937a Michael Hanselmann
    for osparams in [{}, { "some": "value", "other": "Hello World", }]:
1262 3882937a Michael Hanselmann
      for hvparams in [{}, { constants.HV_KERNEL_PATH: "/some/kernel", }]:
1263 861610e9 Guido Trotter
        for beparams in [{}, { constants.BE_MAXMEM: 128, }]:
1264 3882937a Michael Hanselmann
          for force in [False, True]:
1265 3882937a Michael Hanselmann
            for nics in [[], [(0, { constants.INIC_IP: "192.0.2.1", })]]:
1266 3882937a Michael Hanselmann
              for disks in test_disks:
1267 3882937a Michael Hanselmann
                for disk_template in constants.DISK_TEMPLATES:
1268 3882937a Michael Hanselmann
                  data = {
1269 3882937a Michael Hanselmann
                    "osparams": osparams,
1270 3882937a Michael Hanselmann
                    "hvparams": hvparams,
1271 3882937a Michael Hanselmann
                    "beparams": beparams,
1272 3882937a Michael Hanselmann
                    "nics": nics,
1273 3882937a Michael Hanselmann
                    "disks": disks,
1274 3882937a Michael Hanselmann
                    "force": force,
1275 3882937a Michael Hanselmann
                    "disk_template": disk_template,
1276 3882937a Michael Hanselmann
                    }
1277 3882937a Michael Hanselmann
1278 f3db88ba Michael Hanselmann
                  handler = _CreateHandler(rlib2.R_2_instances_name_modify,
1279 f3db88ba Michael Hanselmann
                                           [name], {}, data, clfactory)
1280 f3db88ba Michael Hanselmann
                  job_id = handler.PUT()
1281 f3db88ba Michael Hanselmann
1282 f3db88ba Michael Hanselmann
                  cl = clfactory.GetNextClient()
1283 f3db88ba Michael Hanselmann
                  self.assertRaises(IndexError, clfactory.GetNextClient)
1284 f3db88ba Michael Hanselmann
1285 f3db88ba Michael Hanselmann
                  (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
1286 f3db88ba Michael Hanselmann
                  self.assertEqual(job_id, exp_job_id)
1287 f3db88ba Michael Hanselmann
                  self.assertTrue(isinstance(op, opcodes.OpInstanceSetParams))
1288 3882937a Michael Hanselmann
                  self.assertEqual(op.instance_name, name)
1289 3882937a Michael Hanselmann
                  self.assertEqual(op.hvparams, hvparams)
1290 3882937a Michael Hanselmann
                  self.assertEqual(op.beparams, beparams)
1291 3882937a Michael Hanselmann
                  self.assertEqual(op.osparams, osparams)
1292 3882937a Michael Hanselmann
                  self.assertEqual(op.force, force)
1293 3882937a Michael Hanselmann
                  self.assertEqual(op.nics, nics)
1294 3882937a Michael Hanselmann
                  self.assertEqual(op.disks, disks)
1295 3882937a Michael Hanselmann
                  self.assertEqual(op.disk_template, disk_template)
1296 ee5549c7 Michael Hanselmann
                  self.assertFalse(hasattr(op, "remote_node"))
1297 ee5549c7 Michael Hanselmann
                  self.assertFalse(hasattr(op, "os_name"))
1298 ee5549c7 Michael Hanselmann
                  self.assertFalse(hasattr(op, "force_variant"))
1299 f3db88ba Michael Hanselmann
                  self.assertFalse(hasattr(op, "dry_run"))
1300 f3db88ba Michael Hanselmann
1301 f3db88ba Michael Hanselmann
                  self.assertRaises(IndexError, cl.GetNextSubmittedJob)
1302 3882937a Michael Hanselmann
1303 3882937a Michael Hanselmann
  def testDefaults(self):
1304 f3db88ba Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
1305 f3db88ba Michael Hanselmann
1306 3882937a Michael Hanselmann
    name = "instir8aish31"
1307 3882937a Michael Hanselmann
1308 f3db88ba Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_instances_name_modify,
1309 f3db88ba Michael Hanselmann
                             [name], {}, {}, clfactory)
1310 f3db88ba Michael Hanselmann
    job_id = handler.PUT()
1311 f3db88ba Michael Hanselmann
1312 f3db88ba Michael Hanselmann
    cl = clfactory.GetNextClient()
1313 f3db88ba Michael Hanselmann
    self.assertRaises(IndexError, clfactory.GetNextClient)
1314 f3db88ba Michael Hanselmann
1315 f3db88ba Michael Hanselmann
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
1316 f3db88ba Michael Hanselmann
    self.assertEqual(job_id, exp_job_id)
1317 f3db88ba Michael Hanselmann
    self.assertTrue(isinstance(op, opcodes.OpInstanceSetParams))
1318 3882937a Michael Hanselmann
    self.assertEqual(op.instance_name, name)
1319 f3db88ba Michael Hanselmann
1320 ee5549c7 Michael Hanselmann
    for i in ["hvparams", "beparams", "osparams", "force", "nics", "disks",
1321 ee5549c7 Michael Hanselmann
              "disk_template", "remote_node", "os_name", "force_variant"]:
1322 ee5549c7 Michael Hanselmann
      self.assertFalse(hasattr(op, i))
1323 3882937a Michael Hanselmann
1324 3882937a Michael Hanselmann
1325 c744425f Michael Hanselmann
class TestParseInstanceReinstallRequest(testutils.GanetiTestCase):
1326 c744425f Michael Hanselmann
  def setUp(self):
1327 c744425f Michael Hanselmann
    testutils.GanetiTestCase.setUp(self)
1328 c744425f Michael Hanselmann
1329 c744425f Michael Hanselmann
    self.Parse = rlib2._ParseInstanceReinstallRequest
1330 c744425f Michael Hanselmann
1331 c744425f Michael Hanselmann
  def _Check(self, ops, name):
1332 c744425f Michael Hanselmann
    expcls = [
1333 ee3e37a7 Iustin Pop
      opcodes.OpInstanceShutdown,
1334 5073fd8f Iustin Pop
      opcodes.OpInstanceReinstall,
1335 c873d91c Iustin Pop
      opcodes.OpInstanceStartup,
1336 c744425f Michael Hanselmann
      ]
1337 c744425f Michael Hanselmann
1338 c744425f Michael Hanselmann
    self.assert_(compat.all(isinstance(op, exp)
1339 c744425f Michael Hanselmann
                            for op, exp in zip(ops, expcls)))
1340 c744425f Michael Hanselmann
    self.assert_(compat.all(op.instance_name == name for op in ops))
1341 c744425f Michael Hanselmann
1342 c744425f Michael Hanselmann
  def test(self):
1343 c744425f Michael Hanselmann
    name = "shoo0tihohma"
1344 c744425f Michael Hanselmann
1345 c744425f Michael Hanselmann
    ops = self.Parse(name, {"os": "sys1", "start": True,})
1346 c744425f Michael Hanselmann
    self.assertEqual(len(ops), 3)
1347 c744425f Michael Hanselmann
    self._Check(ops, name)
1348 c744425f Michael Hanselmann
    self.assertEqual(ops[1].os_type, "sys1")
1349 c744425f Michael Hanselmann
    self.assertFalse(ops[1].osparams)
1350 c744425f Michael Hanselmann
1351 c744425f Michael Hanselmann
    ops = self.Parse(name, {"os": "sys2", "start": False,})
1352 c744425f Michael Hanselmann
    self.assertEqual(len(ops), 2)
1353 c744425f Michael Hanselmann
    self._Check(ops, name)
1354 c744425f Michael Hanselmann
    self.assertEqual(ops[1].os_type, "sys2")
1355 c744425f Michael Hanselmann
1356 c744425f Michael Hanselmann
    osparams = {
1357 c744425f Michael Hanselmann
      "reformat": "1",
1358 c744425f Michael Hanselmann
      }
1359 c744425f Michael Hanselmann
    ops = self.Parse(name, {"os": "sys4035", "start": True,
1360 c744425f Michael Hanselmann
                            "osparams": osparams,})
1361 c744425f Michael Hanselmann
    self.assertEqual(len(ops), 3)
1362 c744425f Michael Hanselmann
    self._Check(ops, name)
1363 c744425f Michael Hanselmann
    self.assertEqual(ops[1].os_type, "sys4035")
1364 c744425f Michael Hanselmann
    self.assertEqual(ops[1].osparams, osparams)
1365 c744425f Michael Hanselmann
1366 c744425f Michael Hanselmann
  def testDefaults(self):
1367 c744425f Michael Hanselmann
    name = "noolee0g"
1368 c744425f Michael Hanselmann
1369 c744425f Michael Hanselmann
    ops = self.Parse(name, {"os": "linux1"})
1370 c744425f Michael Hanselmann
    self.assertEqual(len(ops), 3)
1371 c744425f Michael Hanselmann
    self._Check(ops, name)
1372 c744425f Michael Hanselmann
    self.assertEqual(ops[1].os_type, "linux1")
1373 c744425f Michael Hanselmann
    self.assertFalse(ops[1].osparams)
1374 c744425f Michael Hanselmann
1375 a14b80bc Michael Hanselmann
  def testErrors(self):
1376 97f8e7f0 Michael Hanselmann
    self.assertRaises(http.HttpBadRequest, self.Parse,
1377 97f8e7f0 Michael Hanselmann
                      "foo", "not a dictionary")
1378 a14b80bc Michael Hanselmann
1379 c744425f Michael Hanselmann
1380 cd0d4d5a Michael Hanselmann
class TestGroupRename(unittest.TestCase):
1381 0dbaa9ca Adeodato Simo
  def test(self):
1382 cd0d4d5a Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
1383 cd0d4d5a Michael Hanselmann
1384 cd0d4d5a Michael Hanselmann
    name = "group608242564"
1385 0dbaa9ca Adeodato Simo
    data = {
1386 cd0d4d5a Michael Hanselmann
      "new_name": "ua0aiyoo15112",
1387 0dbaa9ca Adeodato Simo
      }
1388 0dbaa9ca Adeodato Simo
1389 cd0d4d5a Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_groups_name_rename, [name], {}, data,
1390 cd0d4d5a Michael Hanselmann
                             clfactory)
1391 cd0d4d5a Michael Hanselmann
    job_id = handler.PUT()
1392 cd0d4d5a Michael Hanselmann
1393 cd0d4d5a Michael Hanselmann
    cl = clfactory.GetNextClient()
1394 cd0d4d5a Michael Hanselmann
    self.assertRaises(IndexError, clfactory.GetNextClient)
1395 cd0d4d5a Michael Hanselmann
1396 cd0d4d5a Michael Hanselmann
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
1397 cd0d4d5a Michael Hanselmann
    self.assertEqual(job_id, exp_job_id)
1398 0dbaa9ca Adeodato Simo
1399 cd0d4d5a Michael Hanselmann
    self.assertTrue(isinstance(op, opcodes.OpGroupRename))
1400 12da663a Michael Hanselmann
    self.assertEqual(op.group_name, name)
1401 cd0d4d5a Michael Hanselmann
    self.assertEqual(op.new_name, "ua0aiyoo15112")
1402 0dbaa9ca Adeodato Simo
    self.assertFalse(op.dry_run)
1403 cd0d4d5a Michael Hanselmann
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
1404 0dbaa9ca Adeodato Simo
1405 0dbaa9ca Adeodato Simo
  def testDryRun(self):
1406 cd0d4d5a Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
1407 cd0d4d5a Michael Hanselmann
1408 cd0d4d5a Michael Hanselmann
    name = "group28548"
1409 0dbaa9ca Adeodato Simo
    data = {
1410 0dbaa9ca Adeodato Simo
      "new_name": "ua0aiyoo",
1411 0dbaa9ca Adeodato Simo
      }
1412 0dbaa9ca Adeodato Simo
1413 cd0d4d5a Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_groups_name_rename, [name], {
1414 cd0d4d5a Michael Hanselmann
      "dry-run": ["1"],
1415 cd0d4d5a Michael Hanselmann
      }, data, clfactory)
1416 cd0d4d5a Michael Hanselmann
    job_id = handler.PUT()
1417 0dbaa9ca Adeodato Simo
1418 cd0d4d5a Michael Hanselmann
    cl = clfactory.GetNextClient()
1419 cd0d4d5a Michael Hanselmann
    self.assertRaises(IndexError, clfactory.GetNextClient)
1420 cd0d4d5a Michael Hanselmann
1421 cd0d4d5a Michael Hanselmann
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
1422 cd0d4d5a Michael Hanselmann
    self.assertEqual(job_id, exp_job_id)
1423 cd0d4d5a Michael Hanselmann
1424 cd0d4d5a Michael Hanselmann
    self.assertTrue(isinstance(op, opcodes.OpGroupRename))
1425 12da663a Michael Hanselmann
    self.assertEqual(op.group_name, name)
1426 0dbaa9ca Adeodato Simo
    self.assertEqual(op.new_name, "ua0aiyoo")
1427 cd0d4d5a Michael Hanselmann
    self.assertTrue(op.dry_run)
1428 cd0d4d5a Michael Hanselmann
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
1429 0dbaa9ca Adeodato Simo
1430 0dbaa9ca Adeodato Simo
1431 0dbc732c Michael Hanselmann
class TestInstanceReplaceDisks(unittest.TestCase):
1432 d1c172de Michael Hanselmann
  def test(self):
1433 0dbc732c Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
1434 0dbc732c Michael Hanselmann
1435 d1c172de Michael Hanselmann
    name = "inst22568"
1436 d1c172de Michael Hanselmann
1437 d1c172de Michael Hanselmann
    for disks in [range(1, 4), "1,2,3", "1, 2, 3"]:
1438 d1c172de Michael Hanselmann
      data = {
1439 d1c172de Michael Hanselmann
        "mode": constants.REPLACE_DISK_SEC,
1440 d1c172de Michael Hanselmann
        "disks": disks,
1441 d1c172de Michael Hanselmann
        "iallocator": "myalloc",
1442 d1c172de Michael Hanselmann
        }
1443 d1c172de Michael Hanselmann
1444 0dbc732c Michael Hanselmann
      handler = _CreateHandler(rlib2.R_2_instances_name_replace_disks,
1445 0dbc732c Michael Hanselmann
                               [name], {}, data, clfactory)
1446 0dbc732c Michael Hanselmann
      job_id = handler.POST()
1447 0dbc732c Michael Hanselmann
1448 0dbc732c Michael Hanselmann
      cl = clfactory.GetNextClient()
1449 0dbc732c Michael Hanselmann
      self.assertRaises(IndexError, clfactory.GetNextClient)
1450 0dbc732c Michael Hanselmann
1451 0dbc732c Michael Hanselmann
      (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
1452 0dbc732c Michael Hanselmann
      self.assertEqual(job_id, exp_job_id)
1453 0dbc732c Michael Hanselmann
1454 0dbc732c Michael Hanselmann
      self.assertTrue(isinstance(op, opcodes.OpInstanceReplaceDisks))
1455 0dbc732c Michael Hanselmann
      self.assertEqual(op.instance_name, name)
1456 d1c172de Michael Hanselmann
      self.assertEqual(op.mode, constants.REPLACE_DISK_SEC)
1457 d1c172de Michael Hanselmann
      self.assertEqual(op.disks, [1, 2, 3])
1458 d1c172de Michael Hanselmann
      self.assertEqual(op.iallocator, "myalloc")
1459 0dbc732c Michael Hanselmann
      self.assertRaises(IndexError, cl.GetNextSubmittedJob)
1460 d1c172de Michael Hanselmann
1461 d1c172de Michael Hanselmann
  def testDefaults(self):
1462 0dbc732c Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
1463 0dbc732c Michael Hanselmann
1464 d1c172de Michael Hanselmann
    name = "inst11413"
1465 d1c172de Michael Hanselmann
    data = {
1466 d1c172de Michael Hanselmann
      "mode": constants.REPLACE_DISK_AUTO,
1467 d1c172de Michael Hanselmann
      }
1468 d1c172de Michael Hanselmann
1469 0dbc732c Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_instances_name_replace_disks,
1470 0dbc732c Michael Hanselmann
                             [name], {}, data, clfactory)
1471 0dbc732c Michael Hanselmann
    job_id = handler.POST()
1472 0dbc732c Michael Hanselmann
1473 0dbc732c Michael Hanselmann
    cl = clfactory.GetNextClient()
1474 0dbc732c Michael Hanselmann
    self.assertRaises(IndexError, clfactory.GetNextClient)
1475 0dbc732c Michael Hanselmann
1476 0dbc732c Michael Hanselmann
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
1477 0dbc732c Michael Hanselmann
    self.assertEqual(job_id, exp_job_id)
1478 0dbc732c Michael Hanselmann
1479 0dbc732c Michael Hanselmann
    self.assertTrue(isinstance(op, opcodes.OpInstanceReplaceDisks))
1480 0dbc732c Michael Hanselmann
    self.assertEqual(op.instance_name, name)
1481 d1c172de Michael Hanselmann
    self.assertEqual(op.mode, constants.REPLACE_DISK_AUTO)
1482 d1c172de Michael Hanselmann
    self.assertFalse(hasattr(op, "iallocator"))
1483 d1c172de Michael Hanselmann
    self.assertFalse(hasattr(op, "disks"))
1484 0dbc732c Michael Hanselmann
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
1485 d1c172de Michael Hanselmann
1486 539d65ba Michael Hanselmann
  def testNoDisks(self):
1487 0f03d8d4 Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
1488 0f03d8d4 Michael Hanselmann
1489 0f03d8d4 Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_instances_name_replace_disks,
1490 0f03d8d4 Michael Hanselmann
                             ["inst20661"], {}, {}, clfactory)
1491 0f03d8d4 Michael Hanselmann
    self.assertRaises(http.HttpBadRequest, handler.POST)
1492 539d65ba Michael Hanselmann
1493 539d65ba Michael Hanselmann
    for disks in [None, "", {}]:
1494 0f03d8d4 Michael Hanselmann
      handler = _CreateHandler(rlib2.R_2_instances_name_replace_disks,
1495 0f03d8d4 Michael Hanselmann
                               ["inst20661"], {}, {
1496 539d65ba Michael Hanselmann
        "disks": disks,
1497 0f03d8d4 Michael Hanselmann
        }, clfactory)
1498 0f03d8d4 Michael Hanselmann
      self.assertRaises(http.HttpBadRequest, handler.POST)
1499 539d65ba Michael Hanselmann
1500 d1c172de Michael Hanselmann
  def testWrong(self):
1501 0dbc732c Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
1502 0dbc732c Michael Hanselmann
1503 0dbc732c Michael Hanselmann
    data = {
1504 0dbc732c Michael Hanselmann
      "mode": constants.REPLACE_DISK_AUTO,
1505 0dbc732c Michael Hanselmann
      "disks": "hello world",
1506 0dbc732c Michael Hanselmann
      }
1507 0dbc732c Michael Hanselmann
1508 0dbc732c Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_instances_name_replace_disks,
1509 0dbc732c Michael Hanselmann
                             ["foo"], {}, data, clfactory)
1510 0dbc732c Michael Hanselmann
    self.assertRaises(http.HttpBadRequest, handler.POST)
1511 d1c172de Michael Hanselmann
1512 d1c172de Michael Hanselmann
1513 d5211458 Michael Hanselmann
class TestGroupModify(unittest.TestCase):
1514 df340fae Michael Hanselmann
  def test(self):
1515 d5211458 Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
1516 d5211458 Michael Hanselmann
1517 df340fae Michael Hanselmann
    name = "group6002"
1518 df340fae Michael Hanselmann
1519 df340fae Michael Hanselmann
    for policy in constants.VALID_ALLOC_POLICIES:
1520 df340fae Michael Hanselmann
      data = {
1521 df340fae Michael Hanselmann
        "alloc_policy": policy,
1522 df340fae Michael Hanselmann
        }
1523 df340fae Michael Hanselmann
1524 d5211458 Michael Hanselmann
      handler = _CreateHandler(rlib2.R_2_groups_name_modify, [name], {}, data,
1525 d5211458 Michael Hanselmann
                               clfactory)
1526 d5211458 Michael Hanselmann
      job_id = handler.PUT()
1527 d5211458 Michael Hanselmann
1528 d5211458 Michael Hanselmann
      cl = clfactory.GetNextClient()
1529 d5211458 Michael Hanselmann
      self.assertRaises(IndexError, clfactory.GetNextClient)
1530 d5211458 Michael Hanselmann
1531 d5211458 Michael Hanselmann
      (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
1532 d5211458 Michael Hanselmann
      self.assertEqual(job_id, exp_job_id)
1533 d5211458 Michael Hanselmann
1534 d5211458 Michael Hanselmann
      self.assertTrue(isinstance(op, opcodes.OpGroupSetParams))
1535 df340fae Michael Hanselmann
      self.assertEqual(op.group_name, name)
1536 df340fae Michael Hanselmann
      self.assertEqual(op.alloc_policy, policy)
1537 d5211458 Michael Hanselmann
      self.assertFalse(hasattr(op, "dry_run"))
1538 d5211458 Michael Hanselmann
      self.assertRaises(IndexError, cl.GetNextSubmittedJob)
1539 df340fae Michael Hanselmann
1540 df340fae Michael Hanselmann
  def testUnknownPolicy(self):
1541 d5211458 Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
1542 d5211458 Michael Hanselmann
1543 df340fae Michael Hanselmann
    data = {
1544 df340fae Michael Hanselmann
      "alloc_policy": "_unknown_policy_",
1545 df340fae Michael Hanselmann
      }
1546 df340fae Michael Hanselmann
1547 d5211458 Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_groups_name_modify, ["xyz"], {}, data,
1548 d5211458 Michael Hanselmann
                             clfactory)
1549 d5211458 Michael Hanselmann
    self.assertRaises(http.HttpBadRequest, handler.PUT)
1550 d5211458 Michael Hanselmann
    self.assertRaises(IndexError, clfactory.GetNextClient)
1551 df340fae Michael Hanselmann
1552 df340fae Michael Hanselmann
  def testDefaults(self):
1553 d5211458 Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
1554 d5211458 Michael Hanselmann
1555 df340fae Michael Hanselmann
    name = "group6679"
1556 df340fae Michael Hanselmann
1557 d5211458 Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_groups_name_modify, [name], {}, {},
1558 d5211458 Michael Hanselmann
                             clfactory)
1559 d5211458 Michael Hanselmann
    job_id = handler.PUT()
1560 d5211458 Michael Hanselmann
1561 d5211458 Michael Hanselmann
    cl = clfactory.GetNextClient()
1562 d5211458 Michael Hanselmann
    self.assertRaises(IndexError, clfactory.GetNextClient)
1563 d5211458 Michael Hanselmann
1564 d5211458 Michael Hanselmann
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
1565 d5211458 Michael Hanselmann
    self.assertEqual(job_id, exp_job_id)
1566 d5211458 Michael Hanselmann
1567 d5211458 Michael Hanselmann
    self.assertTrue(isinstance(op, opcodes.OpGroupSetParams))
1568 df340fae Michael Hanselmann
    self.assertEqual(op.group_name, name)
1569 df340fae Michael Hanselmann
    self.assertFalse(hasattr(op, "alloc_policy"))
1570 d5211458 Michael Hanselmann
    self.assertFalse(hasattr(op, "dry_run"))
1571 d5211458 Michael Hanselmann
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
1572 df340fae Michael Hanselmann
1573 df340fae Michael Hanselmann
1574 c91407bc Michael Hanselmann
class TestGroupAdd(unittest.TestCase):
1575 527fbde8 Michael Hanselmann
  def test(self):
1576 527fbde8 Michael Hanselmann
    name = "group3618"
1577 c91407bc Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
1578 527fbde8 Michael Hanselmann
1579 527fbde8 Michael Hanselmann
    for policy in constants.VALID_ALLOC_POLICIES:
1580 527fbde8 Michael Hanselmann
      data = {
1581 527fbde8 Michael Hanselmann
        "group_name": name,
1582 527fbde8 Michael Hanselmann
        "alloc_policy": policy,
1583 527fbde8 Michael Hanselmann
        }
1584 527fbde8 Michael Hanselmann
1585 c91407bc Michael Hanselmann
      handler = _CreateHandler(rlib2.R_2_groups, [], {}, data,
1586 c91407bc Michael Hanselmann
                               clfactory)
1587 c91407bc Michael Hanselmann
      job_id = handler.POST()
1588 c91407bc Michael Hanselmann
1589 c91407bc Michael Hanselmann
      cl = clfactory.GetNextClient()
1590 c91407bc Michael Hanselmann
      self.assertRaises(IndexError, clfactory.GetNextClient)
1591 c91407bc Michael Hanselmann
1592 c91407bc Michael Hanselmann
      (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
1593 c91407bc Michael Hanselmann
      self.assertEqual(job_id, exp_job_id)
1594 c91407bc Michael Hanselmann
1595 c91407bc Michael Hanselmann
      self.assertTrue(isinstance(op, opcodes.OpGroupAdd))
1596 527fbde8 Michael Hanselmann
      self.assertEqual(op.group_name, name)
1597 527fbde8 Michael Hanselmann
      self.assertEqual(op.alloc_policy, policy)
1598 527fbde8 Michael Hanselmann
      self.assertFalse(op.dry_run)
1599 c91407bc Michael Hanselmann
      self.assertRaises(IndexError, cl.GetNextSubmittedJob)
1600 527fbde8 Michael Hanselmann
1601 527fbde8 Michael Hanselmann
  def testUnknownPolicy(self):
1602 c91407bc Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
1603 c91407bc Michael Hanselmann
1604 527fbde8 Michael Hanselmann
    data = {
1605 527fbde8 Michael Hanselmann
      "alloc_policy": "_unknown_policy_",
1606 527fbde8 Michael Hanselmann
      }
1607 527fbde8 Michael Hanselmann
1608 c91407bc Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_groups, [], {}, data, clfactory)
1609 c91407bc Michael Hanselmann
    self.assertRaises(http.HttpBadRequest, handler.POST)
1610 c91407bc Michael Hanselmann
    self.assertRaises(IndexError, clfactory.GetNextClient)
1611 527fbde8 Michael Hanselmann
1612 527fbde8 Michael Hanselmann
  def testDefaults(self):
1613 c91407bc Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
1614 c91407bc Michael Hanselmann
1615 527fbde8 Michael Hanselmann
    name = "group15395"
1616 527fbde8 Michael Hanselmann
    data = {
1617 527fbde8 Michael Hanselmann
      "group_name": name,
1618 527fbde8 Michael Hanselmann
      }
1619 527fbde8 Michael Hanselmann
1620 c91407bc Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_groups, [], {}, data, clfactory)
1621 c91407bc Michael Hanselmann
    job_id = handler.POST()
1622 c91407bc Michael Hanselmann
1623 c91407bc Michael Hanselmann
    cl = clfactory.GetNextClient()
1624 c91407bc Michael Hanselmann
    self.assertRaises(IndexError, clfactory.GetNextClient)
1625 c91407bc Michael Hanselmann
1626 c91407bc Michael Hanselmann
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
1627 c91407bc Michael Hanselmann
    self.assertEqual(job_id, exp_job_id)
1628 c91407bc Michael Hanselmann
1629 c91407bc Michael Hanselmann
    self.assertTrue(isinstance(op, opcodes.OpGroupAdd))
1630 527fbde8 Michael Hanselmann
    self.assertEqual(op.group_name, name)
1631 527fbde8 Michael Hanselmann
    self.assertFalse(hasattr(op, "alloc_policy"))
1632 c91407bc Michael Hanselmann
    self.assertFalse(op.dry_run)
1633 527fbde8 Michael Hanselmann
1634 527fbde8 Michael Hanselmann
  def testLegacyName(self):
1635 c91407bc Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
1636 c91407bc Michael Hanselmann
1637 527fbde8 Michael Hanselmann
    name = "group29852"
1638 527fbde8 Michael Hanselmann
    data = {
1639 527fbde8 Michael Hanselmann
      "name": name,
1640 527fbde8 Michael Hanselmann
      }
1641 527fbde8 Michael Hanselmann
1642 c91407bc Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_groups, [], {
1643 c91407bc Michael Hanselmann
      "dry-run": ["1"],
1644 c91407bc Michael Hanselmann
      }, data, clfactory)
1645 c91407bc Michael Hanselmann
    job_id = handler.POST()
1646 c91407bc Michael Hanselmann
1647 c91407bc Michael Hanselmann
    cl = clfactory.GetNextClient()
1648 c91407bc Michael Hanselmann
    self.assertRaises(IndexError, clfactory.GetNextClient)
1649 c91407bc Michael Hanselmann
1650 c91407bc Michael Hanselmann
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
1651 c91407bc Michael Hanselmann
    self.assertEqual(job_id, exp_job_id)
1652 c91407bc Michael Hanselmann
1653 c91407bc Michael Hanselmann
    self.assertTrue(isinstance(op, opcodes.OpGroupAdd))
1654 527fbde8 Michael Hanselmann
    self.assertEqual(op.group_name, name)
1655 c91407bc Michael Hanselmann
    self.assertFalse(hasattr(op, "alloc_policy"))
1656 c91407bc Michael Hanselmann
    self.assertTrue(op.dry_run)
1657 527fbde8 Michael Hanselmann
1658 527fbde8 Michael Hanselmann
1659 51cc8637 Michael Hanselmann
class TestNodeRole(unittest.TestCase):
1660 51cc8637 Michael Hanselmann
  def test(self):
1661 51cc8637 Michael Hanselmann
    clfactory = _FakeClientFactory(_FakeClient)
1662 51cc8637 Michael Hanselmann
1663 51cc8637 Michael Hanselmann
    for role in rlib2._NR_MAP.values():
1664 51cc8637 Michael Hanselmann
      handler = _CreateHandler(rlib2.R_2_nodes_name_role,
1665 51cc8637 Michael Hanselmann
                               ["node-z"], {}, role, clfactory)
1666 51cc8637 Michael Hanselmann
      if role == rlib2._NR_MASTER:
1667 51cc8637 Michael Hanselmann
        self.assertRaises(http.HttpBadRequest, handler.PUT)
1668 51cc8637 Michael Hanselmann
      else:
1669 51cc8637 Michael Hanselmann
        job_id = handler.PUT()
1670 51cc8637 Michael Hanselmann
1671 51cc8637 Michael Hanselmann
        cl = clfactory.GetNextClient()
1672 51cc8637 Michael Hanselmann
        self.assertRaises(IndexError, clfactory.GetNextClient)
1673 51cc8637 Michael Hanselmann
1674 51cc8637 Michael Hanselmann
        (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
1675 51cc8637 Michael Hanselmann
        self.assertEqual(job_id, exp_job_id)
1676 51cc8637 Michael Hanselmann
        self.assertTrue(isinstance(op, opcodes.OpNodeSetParams))
1677 51cc8637 Michael Hanselmann
        self.assertEqual(op.node_name, "node-z")
1678 51cc8637 Michael Hanselmann
        self.assertFalse(op.force)
1679 51cc8637 Michael Hanselmann
        self.assertFalse(hasattr(op, "dry_run"))
1680 51cc8637 Michael Hanselmann
1681 51cc8637 Michael Hanselmann
        if role == rlib2._NR_REGULAR:
1682 51cc8637 Michael Hanselmann
          self.assertFalse(op.drained)
1683 51cc8637 Michael Hanselmann
          self.assertFalse(op.offline)
1684 51cc8637 Michael Hanselmann
          self.assertFalse(op.master_candidate)
1685 51cc8637 Michael Hanselmann
        elif role == rlib2._NR_MASTER_CANDIDATE:
1686 51cc8637 Michael Hanselmann
          self.assertFalse(op.drained)
1687 51cc8637 Michael Hanselmann
          self.assertFalse(op.offline)
1688 51cc8637 Michael Hanselmann
          self.assertTrue(op.master_candidate)
1689 51cc8637 Michael Hanselmann
        elif role == rlib2._NR_DRAINED:
1690 51cc8637 Michael Hanselmann
          self.assertTrue(op.drained)
1691 51cc8637 Michael Hanselmann
          self.assertFalse(op.offline)
1692 51cc8637 Michael Hanselmann
          self.assertFalse(op.master_candidate)
1693 51cc8637 Michael Hanselmann
        elif role == rlib2._NR_OFFLINE:
1694 51cc8637 Michael Hanselmann
          self.assertFalse(op.drained)
1695 51cc8637 Michael Hanselmann
          self.assertTrue(op.offline)
1696 51cc8637 Michael Hanselmann
          self.assertFalse(op.master_candidate)
1697 51cc8637 Michael Hanselmann
        else:
1698 51cc8637 Michael Hanselmann
          self.fail("Unknown role '%s'" % role)
1699 51cc8637 Michael Hanselmann
1700 51cc8637 Michael Hanselmann
      self.assertRaises(IndexError, cl.GetNextSubmittedJob)
1701 51cc8637 Michael Hanselmann
1702 51cc8637 Michael Hanselmann
1703 3429bc89 Michael Hanselmann
class TestSimpleResources(unittest.TestCase):
1704 3429bc89 Michael Hanselmann
  def setUp(self):
1705 3429bc89 Michael Hanselmann
    self.clfactory = _FakeClientFactory(_FakeClient)
1706 3429bc89 Michael Hanselmann
1707 3429bc89 Michael Hanselmann
  def tearDown(self):
1708 3429bc89 Michael Hanselmann
    self.assertRaises(IndexError, self.clfactory.GetNextClient)
1709 3429bc89 Michael Hanselmann
1710 3429bc89 Michael Hanselmann
  def testFeatures(self):
1711 3429bc89 Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_features, [], {}, None, self.clfactory)
1712 3429bc89 Michael Hanselmann
    self.assertEqual(set(handler.GET()), rlib2.ALL_FEATURES)
1713 3429bc89 Michael Hanselmann
1714 132cdb87 Michael Hanselmann
  def testEmpty(self):
1715 132cdb87 Michael Hanselmann
    for cls in [rlib2.R_root, rlib2.R_2]:
1716 132cdb87 Michael Hanselmann
      handler = _CreateHandler(cls, [], {}, None, self.clfactory)
1717 132cdb87 Michael Hanselmann
      self.assertTrue(handler.GET() is None)
1718 3429bc89 Michael Hanselmann
1719 3429bc89 Michael Hanselmann
  def testVersion(self):
1720 3429bc89 Michael Hanselmann
    handler = _CreateHandler(rlib2.R_version, [], {}, None, self.clfactory)
1721 3429bc89 Michael Hanselmann
    self.assertEqual(handler.GET(), constants.RAPI_VERSION)
1722 3429bc89 Michael Hanselmann
1723 3429bc89 Michael Hanselmann
1724 f75ab789 Michael Hanselmann
class TestClusterInfo(unittest.TestCase):
1725 f75ab789 Michael Hanselmann
  class _ClusterInfoClient:
1726 303bc802 Iustin Pop
    def __init__(self, address=None):
1727 f75ab789 Michael Hanselmann
      self.cluster_info = None
1728 f75ab789 Michael Hanselmann
1729 f75ab789 Michael Hanselmann
    def QueryClusterInfo(self):
1730 f75ab789 Michael Hanselmann
      assert self.cluster_info is None
1731 f75ab789 Michael Hanselmann
      self.cluster_info = object()
1732 f75ab789 Michael Hanselmann
      return self.cluster_info
1733 f75ab789 Michael Hanselmann
1734 f75ab789 Michael Hanselmann
  def test(self):
1735 f75ab789 Michael Hanselmann
    clfactory = _FakeClientFactory(self._ClusterInfoClient)
1736 f75ab789 Michael Hanselmann
    handler = _CreateHandler(rlib2.R_2_info, [], {}, None, clfactory)
1737 f75ab789 Michael Hanselmann
    result = handler.GET()
1738 f75ab789 Michael Hanselmann
    cl = clfactory.GetNextClient()
1739 f75ab789 Michael Hanselmann
    self.assertRaises(IndexError, clfactory.GetNextClient)
1740 f75ab789 Michael Hanselmann
    self.assertEqual(result, cl.cluster_info)
1741 f75ab789 Michael Hanselmann
1742 f75ab789 Michael Hanselmann
1743 e5ff1a47 René Nussbaumer
class TestInstancesMultiAlloc(unittest.TestCase):
1744 e5ff1a47 René Nussbaumer
  def testInstanceUpdate(self):
1745 e5ff1a47 René Nussbaumer
    clfactory = _FakeClientFactory(_FakeClient)
1746 e5ff1a47 René Nussbaumer
    data = {
1747 e5ff1a47 René Nussbaumer
      "instances": [{
1748 e5ff1a47 René Nussbaumer
        "instance_name": "bar",
1749 e5ff1a47 René Nussbaumer
        "mode": "create",
1750 e5ff1a47 René Nussbaumer
        }, {
1751 e5ff1a47 René Nussbaumer
        "instance_name": "foo",
1752 e5ff1a47 René Nussbaumer
        "mode": "create",
1753 e5ff1a47 René Nussbaumer
        }],
1754 e5ff1a47 René Nussbaumer
      }
1755 e5ff1a47 René Nussbaumer
    handler = _CreateHandler(rlib2.R_2_instances_multi_alloc, [], {}, data,
1756 e5ff1a47 René Nussbaumer
                             clfactory)
1757 e5ff1a47 René Nussbaumer
    (body, _) = handler.GetPostOpInput()
1758 e5ff1a47 René Nussbaumer
    self.assertTrue(compat.all([inst["OP_ID"] == handler.POST_OPCODE.OP_ID
1759 e5ff1a47 René Nussbaumer
                                for inst in body["instances"]]))
1760 e5ff1a47 René Nussbaumer
1761 e5ff1a47 René Nussbaumer
1762 de959245 Michael Hanselmann
class TestPermissions(unittest.TestCase):
1763 de959245 Michael Hanselmann
  def testEquality(self):
1764 de959245 Michael Hanselmann
    self.assertEqual(rlib2.R_2_query.GET_ACCESS, rlib2.R_2_query.PUT_ACCESS)
1765 de959245 Michael Hanselmann
    self.assertEqual(rlib2.R_2_query.GET_ACCESS,
1766 de959245 Michael Hanselmann
                     rlib2.R_2_instances_name_console.GET_ACCESS)
1767 de959245 Michael Hanselmann
1768 de959245 Michael Hanselmann
  def testMethodAccess(self):
1769 de959245 Michael Hanselmann
    for handler in connector.CONNECTOR.values():
1770 de959245 Michael Hanselmann
      for method in baserlib._SUPPORTED_METHODS:
1771 5224c9bf Michael Hanselmann
        access = baserlib.GetHandlerAccess(handler, method)
1772 5224c9bf Michael Hanselmann
        self.assertFalse(access is None)
1773 de959245 Michael Hanselmann
        self.assertFalse(set(access) - rapi.RAPI_ACCESS_ALL,
1774 de959245 Michael Hanselmann
                         msg=("Handler '%s' uses unknown access options for"
1775 de959245 Michael Hanselmann
                              " method %s" % (handler, method)))
1776 de959245 Michael Hanselmann
        self.assertTrue(rapi.RAPI_ACCESS_READ not in access or
1777 de959245 Michael Hanselmann
                        rapi.RAPI_ACCESS_WRITE in access,
1778 de959245 Michael Hanselmann
                        msg=("Handler '%s' gives query, but not write access"
1779 de959245 Michael Hanselmann
                             " for method %s (the latter includes query and"
1780 de959245 Michael Hanselmann
                             " should therefore be given as well)" %
1781 de959245 Michael Hanselmann
                             (handler, method)))
1782 de959245 Michael Hanselmann
1783 de959245 Michael Hanselmann
1784 2f96c43c Michael Hanselmann
if __name__ == "__main__":
1785 6395cebb Michael Hanselmann
  testutils.GanetiTestProgram()