Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (44.4 kB)

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

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

    
21

    
22
"""Script for unittesting the RAPI rlib2 module
23

24
"""
25

    
26

    
27
import unittest
28
import itertools
29
import random
30

    
31
from ganeti import constants
32
from ganeti import opcodes
33
from ganeti import compat
34
from ganeti import http
35
from ganeti import query
36
from ganeti import luxi
37
from ganeti import errors
38

    
39
from ganeti.rapi import rlib2
40

    
41
import testutils
42

    
43

    
44
class _FakeRequestPrivateData:
45
  def __init__(self, body_data):
46
    self.body_data = body_data
47

    
48

    
49
class _FakeRequest:
50
  def __init__(self, body_data):
51
    self.private = _FakeRequestPrivateData(body_data)
52

    
53

    
54
def _CreateHandler(cls, items, queryargs, body_data, client_cls):
55
  return cls(items, queryargs, _FakeRequest(body_data),
56
             _client_cls=client_cls)
57

    
58

    
59
class _FakeClient:
60
  def __init__(self):
61
    self._jobs = []
62

    
63
  def GetNextSubmittedJob(self):
64
    return self._jobs.pop(0)
65

    
66
  def SubmitJob(self, ops):
67
    job_id = str(1 + int(random.random() * 1000000))
68
    self._jobs.append((job_id, ops))
69
    return job_id
70

    
71

    
72
class _FakeClientFactory:
73
  def __init__(self, cls):
74
    self._client_cls = cls
75
    self._clients = []
76

    
77
  def GetNextClient(self):
78
    return self._clients.pop(0)
79

    
80
  def __call__(self):
81
    cl = self._client_cls()
82
    self._clients.append(cl)
83
    return cl
84

    
85

    
86
class TestConstants(unittest.TestCase):
87
  def testConsole(self):
88
    # Exporting the console field without authentication might expose
89
    # information
90
    assert "console" in query.INSTANCE_FIELDS
91
    self.assertTrue("console" not in rlib2.I_FIELDS)
92

    
93
  def testFields(self):
94
    checks = {
95
      constants.QR_INSTANCE: rlib2.I_FIELDS,
96
      constants.QR_NODE: rlib2.N_FIELDS,
97
      constants.QR_GROUP: rlib2.G_FIELDS,
98
      }
99

    
100
    for (qr, fields) in checks.items():
101
      self.assertFalse(set(fields) - set(query.ALL_FIELDS[qr].keys()))
102

    
103

    
104
class TestClientConnectError(unittest.TestCase):
105
  @staticmethod
106
  def _FailingClient():
107
    raise luxi.NoMasterError("test")
108

    
109
  def test(self):
110
    resources = [
111
      rlib2.R_2_groups,
112
      rlib2.R_2_instances,
113
      rlib2.R_2_nodes,
114
      ]
115
    for cls in resources:
116
      handler = _CreateHandler(cls, ["name"], [], None, self._FailingClient)
117
      self.assertRaises(http.HttpBadGateway, handler.GET)
118

    
119

    
120
class TestJobSubmitError(unittest.TestCase):
121
  class _SubmitErrorClient:
122
    @staticmethod
123
    def SubmitJob(ops):
124
      raise errors.JobQueueFull("test")
125

    
126
  def test(self):
127
    handler = _CreateHandler(rlib2.R_2_redist_config, [], [], None,
128
                             self._SubmitErrorClient)
129
    self.assertRaises(http.HttpServiceUnavailable, handler.PUT)
130

    
131

    
132
class TestClusterModify(unittest.TestCase):
133
  def test(self):
134
    clfactory = _FakeClientFactory(_FakeClient)
135
    handler = _CreateHandler(rlib2.R_2_cluster_modify, [], [], {
136
      "vg_name": "testvg",
137
      "candidate_pool_size": 100,
138
      }, clfactory)
139
    job_id = handler.PUT()
140

    
141
    cl = clfactory.GetNextClient()
142
    self.assertRaises(IndexError, clfactory.GetNextClient)
143

    
144
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
145
    self.assertEqual(job_id, exp_job_id)
146
    self.assertTrue(isinstance(op, opcodes.OpClusterSetParams))
147
    self.assertEqual(op.vg_name, "testvg")
148
    self.assertEqual(op.candidate_pool_size, 100)
149

    
150
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
151

    
152
  def testInvalidValue(self):
153
    for attr in ["vg_name", "candidate_pool_size", "beparams", "_-Unknown#"]:
154
      clfactory = _FakeClientFactory(_FakeClient)
155
      handler = _CreateHandler(rlib2.R_2_cluster_modify, [], [], {
156
        attr: True,
157
        }, clfactory)
158
      self.assertRaises(http.HttpBadRequest, handler.PUT)
159
      self.assertRaises(IndexError, clfactory.GetNextClient)
160

    
161

    
162
class TestRedistConfig(unittest.TestCase):
163
  def test(self):
164
    clfactory = _FakeClientFactory(_FakeClient)
165
    handler = _CreateHandler(rlib2.R_2_redist_config, [], [], None, clfactory)
166
    job_id = handler.PUT()
167

    
168
    cl = clfactory.GetNextClient()
169
    self.assertRaises(IndexError, clfactory.GetNextClient)
170

    
171
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
172
    self.assertEqual(job_id, exp_job_id)
173
    self.assertTrue(isinstance(op, opcodes.OpClusterRedistConf))
174

    
175
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
176

    
177

    
178
class TestNodeMigrate(unittest.TestCase):
179
  def test(self):
180
    clfactory = _FakeClientFactory(_FakeClient)
181
    handler = _CreateHandler(rlib2.R_2_nodes_name_migrate, ["node1"], {}, {
182
      "iallocator": "fooalloc",
183
      }, clfactory)
184
    job_id = handler.POST()
185

    
186
    cl = clfactory.GetNextClient()
187
    self.assertRaises(IndexError, clfactory.GetNextClient)
188

    
189
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
190
    self.assertEqual(job_id, exp_job_id)
191
    self.assertTrue(isinstance(op, opcodes.OpNodeMigrate))
192
    self.assertEqual(op.node_name, "node1")
193
    self.assertEqual(op.iallocator, "fooalloc")
194

    
195
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
196

    
197
  def testQueryArgsConflict(self):
198
    clfactory = _FakeClientFactory(_FakeClient)
199
    handler = _CreateHandler(rlib2.R_2_nodes_name_migrate, ["node2"], {
200
      "live": True,
201
      "mode": constants.HT_MIGRATION_NONLIVE,
202
      }, None, clfactory)
203
    self.assertRaises(http.HttpBadRequest, handler.POST)
204
    self.assertRaises(IndexError, clfactory.GetNextClient)
205

    
206
  def testQueryArgsMode(self):
207
    clfactory = _FakeClientFactory(_FakeClient)
208
    queryargs = {
209
      "mode": [constants.HT_MIGRATION_LIVE],
210
      }
211
    handler = _CreateHandler(rlib2.R_2_nodes_name_migrate, ["node17292"],
212
                             queryargs, None, clfactory)
213
    job_id = handler.POST()
214

    
215
    cl = clfactory.GetNextClient()
216
    self.assertRaises(IndexError, clfactory.GetNextClient)
217

    
218
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
219
    self.assertEqual(job_id, exp_job_id)
220
    self.assertTrue(isinstance(op, opcodes.OpNodeMigrate))
221
    self.assertEqual(op.node_name, "node17292")
222
    self.assertEqual(op.mode, constants.HT_MIGRATION_LIVE)
223

    
224
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
225

    
226
  def testQueryArgsLive(self):
227
    clfactory = _FakeClientFactory(_FakeClient)
228

    
229
    for live in [False, True]:
230
      queryargs = {
231
        "live": [str(int(live))],
232
        }
233
      handler = _CreateHandler(rlib2.R_2_nodes_name_migrate, ["node6940"],
234
                               queryargs, None, clfactory)
235
      job_id = handler.POST()
236

    
237
      cl = clfactory.GetNextClient()
238
      self.assertRaises(IndexError, clfactory.GetNextClient)
239

    
240
      (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
241
      self.assertEqual(job_id, exp_job_id)
242
      self.assertTrue(isinstance(op, opcodes.OpNodeMigrate))
243
      self.assertEqual(op.node_name, "node6940")
244
      if live:
245
        self.assertEqual(op.mode, constants.HT_MIGRATION_LIVE)
246
      else:
247
        self.assertEqual(op.mode, constants.HT_MIGRATION_NONLIVE)
248

    
249
      self.assertRaises(IndexError, cl.GetNextSubmittedJob)
250

    
251

    
252
class TestNodeEvacuate(unittest.TestCase):
253
  def test(self):
254
    clfactory = _FakeClientFactory(_FakeClient)
255
    handler = _CreateHandler(rlib2.R_2_nodes_name_evacuate, ["node92"], {
256
      "dry-run": ["1"],
257
      }, {
258
      "mode": constants.IALLOCATOR_NEVAC_SEC,
259
      }, clfactory)
260
    job_id = handler.POST()
261

    
262
    cl = clfactory.GetNextClient()
263
    self.assertRaises(IndexError, clfactory.GetNextClient)
264

    
265
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
266
    self.assertEqual(job_id, exp_job_id)
267
    self.assertTrue(isinstance(op, opcodes.OpNodeEvacuate))
268
    self.assertEqual(op.node_name, "node92")
269
    self.assertEqual(op.mode, constants.IALLOCATOR_NEVAC_SEC)
270
    self.assertTrue(op.dry_run)
271

    
272
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
273

    
274

    
275
class TestGroupAssignNodes(unittest.TestCase):
276
  def test(self):
277
    clfactory = _FakeClientFactory(_FakeClient)
278
    handler = _CreateHandler(rlib2.R_2_groups_name_assign_nodes, ["grp-a"], {
279
      "dry-run": ["1"],
280
      "force": ["1"],
281
      }, {
282
      "nodes": ["n2", "n3"],
283
      }, clfactory)
284
    job_id = handler.PUT()
285

    
286
    cl = clfactory.GetNextClient()
287
    self.assertRaises(IndexError, clfactory.GetNextClient)
288

    
289
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
290
    self.assertEqual(job_id, exp_job_id)
291
    self.assertTrue(isinstance(op, opcodes.OpGroupAssignNodes))
292
    self.assertEqual(op.group_name, "grp-a")
293
    self.assertEqual(op.nodes, ["n2", "n3"])
294
    self.assertTrue(op.dry_run)
295
    self.assertTrue(op.force)
296

    
297
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
298

    
299

    
300
class TestInstanceDelete(unittest.TestCase):
301
  def test(self):
302
    clfactory = _FakeClientFactory(_FakeClient)
303
    handler = _CreateHandler(rlib2.R_2_instances_name, ["inst30965"], {
304
      "dry-run": ["1"],
305
      }, {}, clfactory)
306
    job_id = handler.DELETE()
307

    
308
    cl = clfactory.GetNextClient()
309
    self.assertRaises(IndexError, clfactory.GetNextClient)
310

    
311
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
312
    self.assertEqual(job_id, exp_job_id)
313
    self.assertTrue(isinstance(op, opcodes.OpInstanceRemove))
314
    self.assertEqual(op.instance_name, "inst30965")
315
    self.assertTrue(op.dry_run)
316
    self.assertFalse(op.ignore_failures)
317

    
318
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
319

    
320

    
321
class TestInstanceInfo(unittest.TestCase):
322
  def test(self):
323
    clfactory = _FakeClientFactory(_FakeClient)
324
    handler = _CreateHandler(rlib2.R_2_instances_name_info, ["inst31217"], {
325
      "static": ["1"],
326
      }, {}, clfactory)
327
    job_id = handler.GET()
328

    
329
    cl = clfactory.GetNextClient()
330
    self.assertRaises(IndexError, clfactory.GetNextClient)
331

    
332
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
333
    self.assertEqual(job_id, exp_job_id)
334
    self.assertTrue(isinstance(op, opcodes.OpInstanceQueryData))
335
    self.assertEqual(op.instances, ["inst31217"])
336
    self.assertTrue(op.static)
337

    
338
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
339

    
340

    
341
class TestInstanceReboot(unittest.TestCase):
342
  def test(self):
343
    clfactory = _FakeClientFactory(_FakeClient)
344
    handler = _CreateHandler(rlib2.R_2_instances_name_reboot, ["inst847"], {
345
      "dry-run": ["1"],
346
      "ignore_secondaries": ["1"],
347
      }, {}, clfactory)
348
    job_id = handler.POST()
349

    
350
    cl = clfactory.GetNextClient()
351
    self.assertRaises(IndexError, clfactory.GetNextClient)
352

    
353
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
354
    self.assertEqual(job_id, exp_job_id)
355
    self.assertTrue(isinstance(op, opcodes.OpInstanceReboot))
356
    self.assertEqual(op.instance_name, "inst847")
357
    self.assertEqual(op.reboot_type, constants.INSTANCE_REBOOT_HARD)
358
    self.assertTrue(op.ignore_secondaries)
359
    self.assertTrue(op.dry_run)
360

    
361
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
362

    
363

    
364
class TestInstanceStartup(unittest.TestCase):
365
  def test(self):
366
    clfactory = _FakeClientFactory(_FakeClient)
367
    handler = _CreateHandler(rlib2.R_2_instances_name_startup, ["inst31083"], {
368
      "force": ["1"],
369
      "no_remember": ["1"],
370
      }, {}, clfactory)
371
    job_id = handler.PUT()
372

    
373
    cl = clfactory.GetNextClient()
374
    self.assertRaises(IndexError, clfactory.GetNextClient)
375

    
376
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
377
    self.assertEqual(job_id, exp_job_id)
378
    self.assertTrue(isinstance(op, opcodes.OpInstanceStartup))
379
    self.assertEqual(op.instance_name, "inst31083")
380
    self.assertTrue(op.no_remember)
381
    self.assertTrue(op.force)
382
    self.assertFalse(op.dry_run)
383

    
384
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
385

    
386

    
387
class TestInstanceShutdown(unittest.TestCase):
388
  def test(self):
389
    clfactory = _FakeClientFactory(_FakeClient)
390
    handler = _CreateHandler(rlib2.R_2_instances_name_shutdown, ["inst26791"], {
391
      "no_remember": ["0"],
392
      }, {}, clfactory)
393
    job_id = handler.PUT()
394

    
395
    cl = clfactory.GetNextClient()
396
    self.assertRaises(IndexError, clfactory.GetNextClient)
397

    
398
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
399
    self.assertEqual(job_id, exp_job_id)
400
    self.assertTrue(isinstance(op, opcodes.OpInstanceShutdown))
401
    self.assertEqual(op.instance_name, "inst26791")
402
    self.assertFalse(op.no_remember)
403
    self.assertFalse(op.dry_run)
404

    
405
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
406

    
407

    
408
class TestInstanceActivateDisks(unittest.TestCase):
409
  def test(self):
410
    clfactory = _FakeClientFactory(_FakeClient)
411
    handler = _CreateHandler(rlib2.R_2_instances_name_activate_disks, ["xyz"], {
412
      "ignore_size": ["1"],
413
      }, {}, clfactory)
414
    job_id = handler.PUT()
415

    
416
    cl = clfactory.GetNextClient()
417
    self.assertRaises(IndexError, clfactory.GetNextClient)
418

    
419
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
420
    self.assertEqual(job_id, exp_job_id)
421
    self.assertTrue(isinstance(op, opcodes.OpInstanceActivateDisks))
422
    self.assertEqual(op.instance_name, "xyz")
423
    self.assertTrue(op.ignore_size)
424
    self.assertFalse(hasattr(op, "dry_run"))
425

    
426
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
427

    
428

    
429
class TestInstanceDeactivateDisks(unittest.TestCase):
430
  def test(self):
431
    clfactory = _FakeClientFactory(_FakeClient)
432
    handler = _CreateHandler(rlib2.R_2_instances_name_deactivate_disks,
433
                             ["inst22357"], {}, {}, clfactory)
434
    job_id = handler.PUT()
435

    
436
    cl = clfactory.GetNextClient()
437
    self.assertRaises(IndexError, clfactory.GetNextClient)
438

    
439
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
440
    self.assertEqual(job_id, exp_job_id)
441
    self.assertTrue(isinstance(op, opcodes.OpInstanceDeactivateDisks))
442
    self.assertEqual(op.instance_name, "inst22357")
443
    self.assertFalse(hasattr(op, "dry_run"))
444
    self.assertFalse(hasattr(op, "force"))
445

    
446
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
447

    
448

    
449
class TestInstanceFailover(unittest.TestCase):
450
  def test(self):
451
    clfactory = _FakeClientFactory(_FakeClient)
452
    handler = _CreateHandler(rlib2.R_2_instances_name_failover,
453
                             ["inst12794"], {}, {}, clfactory)
454
    job_id = handler.PUT()
455

    
456
    cl = clfactory.GetNextClient()
457
    self.assertRaises(IndexError, clfactory.GetNextClient)
458

    
459
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
460
    self.assertEqual(job_id, exp_job_id)
461
    self.assertTrue(isinstance(op, opcodes.OpInstanceFailover))
462
    self.assertEqual(op.instance_name, "inst12794")
463
    self.assertFalse(hasattr(op, "dry_run"))
464
    self.assertFalse(hasattr(op, "force"))
465

    
466
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
467

    
468

    
469
class TestInstanceDiskGrow(unittest.TestCase):
470
  def test(self):
471
    clfactory = _FakeClientFactory(_FakeClient)
472
    data = {
473
      "amount": 1024,
474
      }
475
    handler = _CreateHandler(rlib2.R_2_instances_name_disk_grow,
476
                             ["inst10742", "3"], {}, data, clfactory)
477
    job_id = handler.POST()
478

    
479
    cl = clfactory.GetNextClient()
480
    self.assertRaises(IndexError, clfactory.GetNextClient)
481

    
482
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
483
    self.assertEqual(job_id, exp_job_id)
484
    self.assertTrue(isinstance(op, opcodes.OpInstanceGrowDisk))
485
    self.assertEqual(op.instance_name, "inst10742")
486
    self.assertEqual(op.disk, 3)
487
    self.assertEqual(op.amount, 1024)
488
    self.assertFalse(hasattr(op, "dry_run"))
489
    self.assertFalse(hasattr(op, "force"))
490

    
491
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
492

    
493

    
494
class TestBackupPrepare(unittest.TestCase):
495
  def test(self):
496
    clfactory = _FakeClientFactory(_FakeClient)
497
    queryargs = {
498
      "mode": constants.EXPORT_MODE_REMOTE,
499
      }
500
    handler = _CreateHandler(rlib2.R_2_instances_name_prepare_export,
501
                             ["inst17925"], queryargs, {}, clfactory)
502
    job_id = handler.PUT()
503

    
504
    cl = clfactory.GetNextClient()
505
    self.assertRaises(IndexError, clfactory.GetNextClient)
506

    
507
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
508
    self.assertEqual(job_id, exp_job_id)
509
    self.assertTrue(isinstance(op, opcodes.OpBackupPrepare))
510
    self.assertEqual(op.instance_name, "inst17925")
511
    self.assertEqual(op.mode, constants.EXPORT_MODE_REMOTE)
512
    self.assertFalse(hasattr(op, "dry_run"))
513
    self.assertFalse(hasattr(op, "force"))
514

    
515
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
516

    
517

    
518
class TestGroupRemove(unittest.TestCase):
519
  def test(self):
520
    clfactory = _FakeClientFactory(_FakeClient)
521
    handler = _CreateHandler(rlib2.R_2_groups_name,
522
                             ["grp28575"], {}, {}, clfactory)
523
    job_id = handler.DELETE()
524

    
525
    cl = clfactory.GetNextClient()
526
    self.assertRaises(IndexError, clfactory.GetNextClient)
527

    
528
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
529
    self.assertEqual(job_id, exp_job_id)
530
    self.assertTrue(isinstance(op, opcodes.OpGroupRemove))
531
    self.assertEqual(op.group_name, "grp28575")
532
    self.assertFalse(op.dry_run)
533
    self.assertFalse(hasattr(op, "force"))
534

    
535
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
536

    
537

    
538
class TestStorageQuery(unittest.TestCase):
539
  def test(self):
540
    clfactory = _FakeClientFactory(_FakeClient)
541
    queryargs = {
542
      "storage_type": constants.ST_LVM_PV,
543
      "output_fields": "name,other",
544
      }
545
    handler = _CreateHandler(rlib2.R_2_nodes_name_storage,
546
                             ["node21075"], queryargs, {}, clfactory)
547
    job_id = handler.GET()
548

    
549
    cl = clfactory.GetNextClient()
550
    self.assertRaises(IndexError, clfactory.GetNextClient)
551

    
552
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
553
    self.assertEqual(job_id, exp_job_id)
554
    self.assertTrue(isinstance(op, opcodes.OpNodeQueryStorage))
555
    self.assertEqual(op.nodes, ["node21075"])
556
    self.assertEqual(op.storage_type, constants.ST_LVM_PV)
557
    self.assertEqual(op.output_fields, ["name", "other"])
558
    self.assertFalse(hasattr(op, "dry_run"))
559
    self.assertFalse(hasattr(op, "force"))
560

    
561
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
562

    
563
  def testErrors(self):
564
    clfactory = _FakeClientFactory(_FakeClient)
565

    
566
    queryargs = {
567
      "output_fields": "name,other",
568
      }
569
    handler = _CreateHandler(rlib2.R_2_nodes_name_storage,
570
                             ["node10538"], queryargs, {}, clfactory)
571
    self.assertRaises(http.HttpBadRequest, handler.GET)
572

    
573
    queryargs = {
574
      "storage_type": constants.ST_LVM_VG,
575
      }
576
    handler = _CreateHandler(rlib2.R_2_nodes_name_storage,
577
                             ["node21273"], queryargs, {}, clfactory)
578
    self.assertRaises(http.HttpBadRequest, handler.GET)
579

    
580
    queryargs = {
581
      "storage_type": "##unknown_storage##",
582
      "output_fields": "name,other",
583
      }
584
    handler = _CreateHandler(rlib2.R_2_nodes_name_storage,
585
                             ["node10315"], queryargs, {}, clfactory)
586
    self.assertRaises(http.HttpBadRequest, handler.GET)
587

    
588

    
589
class TestParseInstanceCreateRequestVersion1(testutils.GanetiTestCase):
590
  def setUp(self):
591
    testutils.GanetiTestCase.setUp(self)
592

    
593
    self.Parse = rlib2._ParseInstanceCreateRequestVersion1
594

    
595
  def test(self):
596
    disk_variants = [
597
      # No disks
598
      [],
599

    
600
      # Two disks
601
      [{"size": 5, }, {"size": 100, }],
602

    
603
      # Disk with mode
604
      [{"size": 123, "mode": constants.DISK_RDWR, }],
605
      ]
606

    
607
    nic_variants = [
608
      # No NIC
609
      [],
610

    
611
      # Three NICs
612
      [{}, {}, {}],
613

    
614
      # Two NICs
615
      [
616
        { "ip": "192.0.2.6", "mode": constants.NIC_MODE_ROUTED,
617
          "mac": "01:23:45:67:68:9A",
618
        },
619
        { "mode": constants.NIC_MODE_BRIDGED, "link": "br1" },
620
      ],
621
      ]
622

    
623
    beparam_variants = [
624
      None,
625
      {},
626
      { constants.BE_VCPUS: 2, },
627
      { constants.BE_MEMORY: 123, },
628
      { constants.BE_VCPUS: 2,
629
        constants.BE_MEMORY: 1024,
630
        constants.BE_AUTO_BALANCE: True, }
631
      ]
632

    
633
    hvparam_variants = [
634
      None,
635
      { constants.HV_BOOT_ORDER: "anc", },
636
      { constants.HV_KERNEL_PATH: "/boot/fookernel",
637
        constants.HV_ROOT_PATH: "/dev/hda1", },
638
      ]
639

    
640
    for mode in [constants.INSTANCE_CREATE, constants.INSTANCE_IMPORT]:
641
      for nics in nic_variants:
642
        for disk_template in constants.DISK_TEMPLATES:
643
          for disks in disk_variants:
644
            for beparams in beparam_variants:
645
              for hvparams in hvparam_variants:
646
                data = {
647
                  "name": "inst1.example.com",
648
                  "hypervisor": constants.HT_FAKE,
649
                  "disks": disks,
650
                  "nics": nics,
651
                  "mode": mode,
652
                  "disk_template": disk_template,
653
                  "os": "debootstrap",
654
                  }
655

    
656
                if beparams is not None:
657
                  data["beparams"] = beparams
658

    
659
                if hvparams is not None:
660
                  data["hvparams"] = hvparams
661

    
662
                for dry_run in [False, True]:
663
                  op = self.Parse(data, dry_run)
664
                  self.assert_(isinstance(op, opcodes.OpInstanceCreate))
665
                  self.assertEqual(op.mode, mode)
666
                  self.assertEqual(op.disk_template, disk_template)
667
                  self.assertEqual(op.dry_run, dry_run)
668
                  self.assertEqual(len(op.disks), len(disks))
669
                  self.assertEqual(len(op.nics), len(nics))
670

    
671
                  for opdisk, disk in zip(op.disks, disks):
672
                    for key in constants.IDISK_PARAMS:
673
                      self.assertEqual(opdisk.get(key), disk.get(key))
674
                    self.assertFalse("unknown" in opdisk)
675

    
676
                  for opnic, nic in zip(op.nics, nics):
677
                    for key in constants.INIC_PARAMS:
678
                      self.assertEqual(opnic.get(key), nic.get(key))
679
                    self.assertFalse("unknown" in opnic)
680
                    self.assertFalse("foobar" in opnic)
681

    
682
                  if beparams is None:
683
                    self.assertFalse(hasattr(op, "beparams"))
684
                  else:
685
                    self.assertEqualValues(op.beparams, beparams)
686

    
687
                  if hvparams is None:
688
                    self.assertFalse(hasattr(op, "hvparams"))
689
                  else:
690
                    self.assertEqualValues(op.hvparams, hvparams)
691

    
692
  def testLegacyName(self):
693
    name = "inst29128.example.com"
694
    data = {
695
      "name": name,
696
      "disks": [],
697
      "nics": [],
698
      "mode": constants.INSTANCE_CREATE,
699
      "disk_template": constants.DT_PLAIN,
700
      }
701
    op = self.Parse(data, False)
702
    self.assert_(isinstance(op, opcodes.OpInstanceCreate))
703
    self.assertEqual(op.instance_name, name)
704
    self.assertFalse(hasattr(op, "name"))
705

    
706
    # Define both
707
    data = {
708
      "name": name,
709
      "instance_name": "other.example.com",
710
      "disks": [],
711
      "nics": [],
712
      "mode": constants.INSTANCE_CREATE,
713
      "disk_template": constants.DT_PLAIN,
714
      }
715
    self.assertRaises(http.HttpBadRequest, self.Parse, data, False)
716

    
717
  def testLegacyOs(self):
718
    name = "inst4673.example.com"
719
    os = "linux29206"
720
    data = {
721
      "name": name,
722
      "os_type": os,
723
      "disks": [],
724
      "nics": [],
725
      "mode": constants.INSTANCE_CREATE,
726
      "disk_template": constants.DT_PLAIN,
727
      }
728
    op = self.Parse(data, False)
729
    self.assert_(isinstance(op, opcodes.OpInstanceCreate))
730
    self.assertEqual(op.instance_name, name)
731
    self.assertEqual(op.os_type, os)
732
    self.assertFalse(hasattr(op, "os"))
733

    
734
    # Define both
735
    data = {
736
      "instance_name": name,
737
      "os": os,
738
      "os_type": "linux9584",
739
      "disks": [],
740
      "nics": [],
741
      "mode": constants.INSTANCE_CREATE,
742
      "disk_template": constants.DT_PLAIN,
743
      }
744
    self.assertRaises(http.HttpBadRequest, self.Parse, data, False)
745

    
746
  def testErrors(self):
747
    # Test all required fields
748
    reqfields = {
749
      "name": "inst1.example.com",
750
      "disks": [],
751
      "nics": [],
752
      "mode": constants.INSTANCE_CREATE,
753
      "disk_template": constants.DT_PLAIN,
754
      }
755

    
756
    for name in reqfields.keys():
757
      self.assertRaises(http.HttpBadRequest, self.Parse,
758
                        dict(i for i in reqfields.iteritems() if i[0] != name),
759
                        False)
760

    
761
    # Invalid disks and nics
762
    for field in ["disks", "nics"]:
763
      invalid_values = [None, 1, "", {}, [1, 2, 3], ["hda1", "hda2"],
764
                        [{"_unknown_": 999, }]]
765

    
766
      for invvalue in invalid_values:
767
        data = reqfields.copy()
768
        data[field] = invvalue
769
        self.assertRaises(http.HttpBadRequest, self.Parse, data, False)
770

    
771

    
772
class TestBackupExport(unittest.TestCase):
773
  def test(self):
774
    clfactory = _FakeClientFactory(_FakeClient)
775

    
776
    name = "instmoo"
777
    data = {
778
      "mode": constants.EXPORT_MODE_REMOTE,
779
      "destination": [(1, 2, 3), (99, 99, 99)],
780
      "shutdown": True,
781
      "remove_instance": True,
782
      "x509_key_name": ["name", "hash"],
783
      "destination_x509_ca": "---cert---"
784
      }
785

    
786
    handler = _CreateHandler(rlib2.R_2_instances_name_export, [name], {},
787
                             data, clfactory)
788
    job_id = handler.PUT()
789

    
790
    cl = clfactory.GetNextClient()
791
    self.assertRaises(IndexError, clfactory.GetNextClient)
792

    
793
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
794
    self.assertEqual(job_id, exp_job_id)
795
    self.assertTrue(isinstance(op, opcodes.OpBackupExport))
796
    self.assertEqual(op.instance_name, name)
797
    self.assertEqual(op.mode, constants.EXPORT_MODE_REMOTE)
798
    self.assertEqual(op.target_node, [(1, 2, 3), (99, 99, 99)])
799
    self.assertEqual(op.shutdown, True)
800
    self.assertEqual(op.remove_instance, True)
801
    self.assertEqual(op.x509_key_name, ["name", "hash"])
802
    self.assertEqual(op.destination_x509_ca, "---cert---")
803
    self.assertFalse(hasattr(op, "dry_run"))
804
    self.assertFalse(hasattr(op, "force"))
805

    
806
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
807

    
808
  def testDefaults(self):
809
    clfactory = _FakeClientFactory(_FakeClient)
810

    
811
    name = "inst1"
812
    data = {
813
      "destination": "node2",
814
      "shutdown": False,
815
      }
816

    
817
    handler = _CreateHandler(rlib2.R_2_instances_name_export, [name], {},
818
                             data, clfactory)
819
    job_id = handler.PUT()
820

    
821
    cl = clfactory.GetNextClient()
822
    self.assertRaises(IndexError, clfactory.GetNextClient)
823

    
824
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
825
    self.assertEqual(job_id, exp_job_id)
826
    self.assertTrue(isinstance(op, opcodes.OpBackupExport))
827
    self.assertEqual(op.instance_name, name)
828
    self.assertEqual(op.target_node, "node2")
829
    self.assertFalse(hasattr(op, "mode"))
830
    self.assertFalse(hasattr(op, "remove_instance"))
831
    self.assertFalse(hasattr(op, "destination"))
832
    self.assertFalse(hasattr(op, "dry_run"))
833
    self.assertFalse(hasattr(op, "force"))
834

    
835
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
836

    
837
  def testErrors(self):
838
    clfactory = _FakeClientFactory(_FakeClient)
839

    
840
    for value in ["True", "False"]:
841
      handler = _CreateHandler(rlib2.R_2_instances_name_export, ["err1"], {}, {
842
        "remove_instance": value,
843
        }, clfactory)
844
      self.assertRaises(http.HttpBadRequest, handler.PUT)
845

    
846

    
847
class TestInstanceMigrate(testutils.GanetiTestCase):
848
  def test(self):
849
    clfactory = _FakeClientFactory(_FakeClient)
850

    
851
    name = "instYooho6ek"
852

    
853
    for cleanup in [False, True]:
854
      for mode in constants.HT_MIGRATION_MODES:
855
        data = {
856
          "cleanup": cleanup,
857
          "mode": mode,
858
          }
859

    
860
        handler = _CreateHandler(rlib2.R_2_instances_name_migrate, [name], {},
861
                                 data, clfactory)
862
        job_id = handler.PUT()
863

    
864
        cl = clfactory.GetNextClient()
865
        self.assertRaises(IndexError, clfactory.GetNextClient)
866

    
867
        (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
868
        self.assertEqual(job_id, exp_job_id)
869
        self.assertTrue(isinstance(op, opcodes.OpInstanceMigrate))
870
        self.assertEqual(op.instance_name, name)
871
        self.assertEqual(op.mode, mode)
872
        self.assertEqual(op.cleanup, cleanup)
873
        self.assertFalse(hasattr(op, "dry_run"))
874
        self.assertFalse(hasattr(op, "force"))
875

    
876
        self.assertRaises(IndexError, cl.GetNextSubmittedJob)
877

    
878
  def testDefaults(self):
879
    clfactory = _FakeClientFactory(_FakeClient)
880

    
881
    name = "instnohZeex0"
882

    
883
    handler = _CreateHandler(rlib2.R_2_instances_name_migrate, [name], {}, {},
884
                             clfactory)
885
    job_id = handler.PUT()
886

    
887
    cl = clfactory.GetNextClient()
888
    self.assertRaises(IndexError, clfactory.GetNextClient)
889

    
890
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
891
    self.assertEqual(job_id, exp_job_id)
892
    self.assertTrue(isinstance(op, opcodes.OpInstanceMigrate))
893
    self.assertEqual(op.instance_name, name)
894
    self.assertFalse(hasattr(op, "mode"))
895
    self.assertFalse(hasattr(op, "cleanup"))
896
    self.assertFalse(hasattr(op, "dry_run"))
897
    self.assertFalse(hasattr(op, "force"))
898

    
899
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
900

    
901

    
902
class TestParseRenameInstanceRequest(testutils.GanetiTestCase):
903
  def test(self):
904
    clfactory = _FakeClientFactory(_FakeClient)
905

    
906
    name = "instij0eeph7"
907

    
908
    for new_name in ["ua0aiyoo", "fai3ongi"]:
909
      for ip_check in [False, True]:
910
        for name_check in [False, True]:
911
          data = {
912
            "new_name": new_name,
913
            "ip_check": ip_check,
914
            "name_check": name_check,
915
            }
916

    
917
          handler = _CreateHandler(rlib2.R_2_instances_name_rename, [name],
918
                                   {}, data, clfactory)
919
          job_id = handler.PUT()
920

    
921
          cl = clfactory.GetNextClient()
922
          self.assertRaises(IndexError, clfactory.GetNextClient)
923

    
924
          (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
925
          self.assertEqual(job_id, exp_job_id)
926
          self.assertTrue(isinstance(op, opcodes.OpInstanceRename))
927
          self.assertEqual(op.instance_name, name)
928
          self.assertEqual(op.new_name, new_name)
929
          self.assertEqual(op.ip_check, ip_check)
930
          self.assertEqual(op.name_check, name_check)
931
          self.assertFalse(hasattr(op, "dry_run"))
932
          self.assertFalse(hasattr(op, "force"))
933

    
934
          self.assertRaises(IndexError, cl.GetNextSubmittedJob)
935

    
936
  def testDefaults(self):
937
    clfactory = _FakeClientFactory(_FakeClient)
938

    
939
    name = "instahchie3t"
940

    
941
    for new_name in ["thag9mek", "quees7oh"]:
942
      data = {
943
        "new_name": new_name,
944
        }
945

    
946
      handler = _CreateHandler(rlib2.R_2_instances_name_rename, [name],
947
                               {}, data, clfactory)
948
      job_id = handler.PUT()
949

    
950
      cl = clfactory.GetNextClient()
951
      self.assertRaises(IndexError, clfactory.GetNextClient)
952

    
953
      (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
954
      self.assertEqual(job_id, exp_job_id)
955
      self.assertTrue(isinstance(op, opcodes.OpInstanceRename))
956
      self.assertEqual(op.instance_name, name)
957
      self.assertEqual(op.new_name, new_name)
958
      self.assertFalse(hasattr(op, "ip_check"))
959
      self.assertFalse(hasattr(op, "name_check"))
960
      self.assertFalse(hasattr(op, "dry_run"))
961
      self.assertFalse(hasattr(op, "force"))
962

    
963
      self.assertRaises(IndexError, cl.GetNextSubmittedJob)
964

    
965

    
966
class TestParseModifyInstanceRequest(unittest.TestCase):
967
  def test(self):
968
    clfactory = _FakeClientFactory(_FakeClient)
969

    
970
    name = "instush8gah"
971

    
972
    test_disks = [
973
      [],
974
      [(1, { constants.IDISK_MODE: constants.DISK_RDWR, })],
975
      ]
976

    
977
    for osparams in [{}, { "some": "value", "other": "Hello World", }]:
978
      for hvparams in [{}, { constants.HV_KERNEL_PATH: "/some/kernel", }]:
979
        for beparams in [{}, { constants.BE_MEMORY: 128, }]:
980
          for force in [False, True]:
981
            for nics in [[], [(0, { constants.INIC_IP: "192.0.2.1", })]]:
982
              for disks in test_disks:
983
                for disk_template in constants.DISK_TEMPLATES:
984
                  data = {
985
                    "osparams": osparams,
986
                    "hvparams": hvparams,
987
                    "beparams": beparams,
988
                    "nics": nics,
989
                    "disks": disks,
990
                    "force": force,
991
                    "disk_template": disk_template,
992
                    }
993

    
994
                  handler = _CreateHandler(rlib2.R_2_instances_name_modify,
995
                                           [name], {}, data, clfactory)
996
                  job_id = handler.PUT()
997

    
998
                  cl = clfactory.GetNextClient()
999
                  self.assertRaises(IndexError, clfactory.GetNextClient)
1000

    
1001
                  (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
1002
                  self.assertEqual(job_id, exp_job_id)
1003
                  self.assertTrue(isinstance(op, opcodes.OpInstanceSetParams))
1004
                  self.assertEqual(op.instance_name, name)
1005
                  self.assertEqual(op.hvparams, hvparams)
1006
                  self.assertEqual(op.beparams, beparams)
1007
                  self.assertEqual(op.osparams, osparams)
1008
                  self.assertEqual(op.force, force)
1009
                  self.assertEqual(op.nics, nics)
1010
                  self.assertEqual(op.disks, disks)
1011
                  self.assertEqual(op.disk_template, disk_template)
1012
                  self.assertFalse(hasattr(op, "remote_node"))
1013
                  self.assertFalse(hasattr(op, "os_name"))
1014
                  self.assertFalse(hasattr(op, "force_variant"))
1015
                  self.assertFalse(hasattr(op, "dry_run"))
1016

    
1017
                  self.assertRaises(IndexError, cl.GetNextSubmittedJob)
1018

    
1019
  def testDefaults(self):
1020
    clfactory = _FakeClientFactory(_FakeClient)
1021

    
1022
    name = "instir8aish31"
1023

    
1024
    handler = _CreateHandler(rlib2.R_2_instances_name_modify,
1025
                             [name], {}, {}, clfactory)
1026
    job_id = handler.PUT()
1027

    
1028
    cl = clfactory.GetNextClient()
1029
    self.assertRaises(IndexError, clfactory.GetNextClient)
1030

    
1031
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
1032
    self.assertEqual(job_id, exp_job_id)
1033
    self.assertTrue(isinstance(op, opcodes.OpInstanceSetParams))
1034
    self.assertEqual(op.instance_name, name)
1035

    
1036
    for i in ["hvparams", "beparams", "osparams", "force", "nics", "disks",
1037
              "disk_template", "remote_node", "os_name", "force_variant"]:
1038
      self.assertFalse(hasattr(op, i))
1039

    
1040

    
1041
class TestParseInstanceReinstallRequest(testutils.GanetiTestCase):
1042
  def setUp(self):
1043
    testutils.GanetiTestCase.setUp(self)
1044

    
1045
    self.Parse = rlib2._ParseInstanceReinstallRequest
1046

    
1047
  def _Check(self, ops, name):
1048
    expcls = [
1049
      opcodes.OpInstanceShutdown,
1050
      opcodes.OpInstanceReinstall,
1051
      opcodes.OpInstanceStartup,
1052
      ]
1053

    
1054
    self.assert_(compat.all(isinstance(op, exp)
1055
                            for op, exp in zip(ops, expcls)))
1056
    self.assert_(compat.all(op.instance_name == name for op in ops))
1057

    
1058
  def test(self):
1059
    name = "shoo0tihohma"
1060

    
1061
    ops = self.Parse(name, {"os": "sys1", "start": True,})
1062
    self.assertEqual(len(ops), 3)
1063
    self._Check(ops, name)
1064
    self.assertEqual(ops[1].os_type, "sys1")
1065
    self.assertFalse(ops[1].osparams)
1066

    
1067
    ops = self.Parse(name, {"os": "sys2", "start": False,})
1068
    self.assertEqual(len(ops), 2)
1069
    self._Check(ops, name)
1070
    self.assertEqual(ops[1].os_type, "sys2")
1071

    
1072
    osparams = {
1073
      "reformat": "1",
1074
      }
1075
    ops = self.Parse(name, {"os": "sys4035", "start": True,
1076
                            "osparams": osparams,})
1077
    self.assertEqual(len(ops), 3)
1078
    self._Check(ops, name)
1079
    self.assertEqual(ops[1].os_type, "sys4035")
1080
    self.assertEqual(ops[1].osparams, osparams)
1081

    
1082
  def testDefaults(self):
1083
    name = "noolee0g"
1084

    
1085
    ops = self.Parse(name, {"os": "linux1"})
1086
    self.assertEqual(len(ops), 3)
1087
    self._Check(ops, name)
1088
    self.assertEqual(ops[1].os_type, "linux1")
1089
    self.assertFalse(ops[1].osparams)
1090

    
1091

    
1092
class TestGroupRename(unittest.TestCase):
1093
  def test(self):
1094
    clfactory = _FakeClientFactory(_FakeClient)
1095

    
1096
    name = "group608242564"
1097
    data = {
1098
      "new_name": "ua0aiyoo15112",
1099
      }
1100

    
1101
    handler = _CreateHandler(rlib2.R_2_groups_name_rename, [name], {}, data,
1102
                             clfactory)
1103
    job_id = handler.PUT()
1104

    
1105
    cl = clfactory.GetNextClient()
1106
    self.assertRaises(IndexError, clfactory.GetNextClient)
1107

    
1108
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
1109
    self.assertEqual(job_id, exp_job_id)
1110

    
1111
    self.assertTrue(isinstance(op, opcodes.OpGroupRename))
1112
    self.assertEqual(op.group_name, name)
1113
    self.assertEqual(op.new_name, "ua0aiyoo15112")
1114
    self.assertFalse(op.dry_run)
1115
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
1116

    
1117
  def testDryRun(self):
1118
    clfactory = _FakeClientFactory(_FakeClient)
1119

    
1120
    name = "group28548"
1121
    data = {
1122
      "new_name": "ua0aiyoo",
1123
      }
1124

    
1125
    handler = _CreateHandler(rlib2.R_2_groups_name_rename, [name], {
1126
      "dry-run": ["1"],
1127
      }, data, clfactory)
1128
    job_id = handler.PUT()
1129

    
1130
    cl = clfactory.GetNextClient()
1131
    self.assertRaises(IndexError, clfactory.GetNextClient)
1132

    
1133
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
1134
    self.assertEqual(job_id, exp_job_id)
1135

    
1136
    self.assertTrue(isinstance(op, opcodes.OpGroupRename))
1137
    self.assertEqual(op.group_name, name)
1138
    self.assertEqual(op.new_name, "ua0aiyoo")
1139
    self.assertTrue(op.dry_run)
1140
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
1141

    
1142

    
1143
class TestInstanceReplaceDisks(unittest.TestCase):
1144
  def test(self):
1145
    clfactory = _FakeClientFactory(_FakeClient)
1146

    
1147
    name = "inst22568"
1148

    
1149
    for disks in [range(1, 4), "1,2,3", "1, 2, 3"]:
1150
      data = {
1151
        "mode": constants.REPLACE_DISK_SEC,
1152
        "disks": disks,
1153
        "iallocator": "myalloc",
1154
        }
1155

    
1156
      handler = _CreateHandler(rlib2.R_2_instances_name_replace_disks,
1157
                               [name], {}, data, clfactory)
1158
      job_id = handler.POST()
1159

    
1160
      cl = clfactory.GetNextClient()
1161
      self.assertRaises(IndexError, clfactory.GetNextClient)
1162

    
1163
      (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
1164
      self.assertEqual(job_id, exp_job_id)
1165

    
1166
      self.assertTrue(isinstance(op, opcodes.OpInstanceReplaceDisks))
1167
      self.assertEqual(op.instance_name, name)
1168
      self.assertEqual(op.mode, constants.REPLACE_DISK_SEC)
1169
      self.assertEqual(op.disks, [1, 2, 3])
1170
      self.assertEqual(op.iallocator, "myalloc")
1171
      self.assertRaises(IndexError, cl.GetNextSubmittedJob)
1172

    
1173
  def testDefaults(self):
1174
    clfactory = _FakeClientFactory(_FakeClient)
1175

    
1176
    name = "inst11413"
1177
    data = {
1178
      "mode": constants.REPLACE_DISK_AUTO,
1179
      }
1180

    
1181
    handler = _CreateHandler(rlib2.R_2_instances_name_replace_disks,
1182
                             [name], {}, data, clfactory)
1183
    job_id = handler.POST()
1184

    
1185
    cl = clfactory.GetNextClient()
1186
    self.assertRaises(IndexError, clfactory.GetNextClient)
1187

    
1188
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
1189
    self.assertEqual(job_id, exp_job_id)
1190

    
1191
    self.assertTrue(isinstance(op, opcodes.OpInstanceReplaceDisks))
1192
    self.assertEqual(op.instance_name, name)
1193
    self.assertEqual(op.mode, constants.REPLACE_DISK_AUTO)
1194
    self.assertFalse(hasattr(op, "iallocator"))
1195
    self.assertFalse(hasattr(op, "disks"))
1196
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
1197

    
1198
  def testWrong(self):
1199
    clfactory = _FakeClientFactory(_FakeClient)
1200

    
1201
    data = {
1202
      "mode": constants.REPLACE_DISK_AUTO,
1203
      "disks": "hello world",
1204
      }
1205

    
1206
    handler = _CreateHandler(rlib2.R_2_instances_name_replace_disks,
1207
                             ["foo"], {}, data, clfactory)
1208
    self.assertRaises(http.HttpBadRequest, handler.POST)
1209

    
1210

    
1211
class TestGroupModify(unittest.TestCase):
1212
  def test(self):
1213
    clfactory = _FakeClientFactory(_FakeClient)
1214

    
1215
    name = "group6002"
1216

    
1217
    for policy in constants.VALID_ALLOC_POLICIES:
1218
      data = {
1219
        "alloc_policy": policy,
1220
        }
1221

    
1222
      handler = _CreateHandler(rlib2.R_2_groups_name_modify, [name], {}, data,
1223
                               clfactory)
1224
      job_id = handler.PUT()
1225

    
1226
      cl = clfactory.GetNextClient()
1227
      self.assertRaises(IndexError, clfactory.GetNextClient)
1228

    
1229
      (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
1230
      self.assertEqual(job_id, exp_job_id)
1231

    
1232
      self.assertTrue(isinstance(op, opcodes.OpGroupSetParams))
1233
      self.assertEqual(op.group_name, name)
1234
      self.assertEqual(op.alloc_policy, policy)
1235
      self.assertFalse(hasattr(op, "dry_run"))
1236
      self.assertRaises(IndexError, cl.GetNextSubmittedJob)
1237

    
1238
  def testUnknownPolicy(self):
1239
    clfactory = _FakeClientFactory(_FakeClient)
1240

    
1241
    data = {
1242
      "alloc_policy": "_unknown_policy_",
1243
      }
1244

    
1245
    handler = _CreateHandler(rlib2.R_2_groups_name_modify, ["xyz"], {}, data,
1246
                             clfactory)
1247
    self.assertRaises(http.HttpBadRequest, handler.PUT)
1248
    self.assertRaises(IndexError, clfactory.GetNextClient)
1249

    
1250
  def testDefaults(self):
1251
    clfactory = _FakeClientFactory(_FakeClient)
1252

    
1253
    name = "group6679"
1254

    
1255
    handler = _CreateHandler(rlib2.R_2_groups_name_modify, [name], {}, {},
1256
                             clfactory)
1257
    job_id = handler.PUT()
1258

    
1259
    cl = clfactory.GetNextClient()
1260
    self.assertRaises(IndexError, clfactory.GetNextClient)
1261

    
1262
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
1263
    self.assertEqual(job_id, exp_job_id)
1264

    
1265
    self.assertTrue(isinstance(op, opcodes.OpGroupSetParams))
1266
    self.assertEqual(op.group_name, name)
1267
    self.assertFalse(hasattr(op, "alloc_policy"))
1268
    self.assertFalse(hasattr(op, "dry_run"))
1269
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
1270

    
1271

    
1272
class TestGroupAdd(unittest.TestCase):
1273
  def test(self):
1274
    name = "group3618"
1275
    clfactory = _FakeClientFactory(_FakeClient)
1276

    
1277
    for policy in constants.VALID_ALLOC_POLICIES:
1278
      data = {
1279
        "group_name": name,
1280
        "alloc_policy": policy,
1281
        }
1282

    
1283
      handler = _CreateHandler(rlib2.R_2_groups, [], {}, data,
1284
                               clfactory)
1285
      job_id = handler.POST()
1286

    
1287
      cl = clfactory.GetNextClient()
1288
      self.assertRaises(IndexError, clfactory.GetNextClient)
1289

    
1290
      (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
1291
      self.assertEqual(job_id, exp_job_id)
1292

    
1293
      self.assertTrue(isinstance(op, opcodes.OpGroupAdd))
1294
      self.assertEqual(op.group_name, name)
1295
      self.assertEqual(op.alloc_policy, policy)
1296
      self.assertFalse(op.dry_run)
1297
      self.assertRaises(IndexError, cl.GetNextSubmittedJob)
1298

    
1299
  def testUnknownPolicy(self):
1300
    clfactory = _FakeClientFactory(_FakeClient)
1301

    
1302
    data = {
1303
      "alloc_policy": "_unknown_policy_",
1304
      }
1305

    
1306
    handler = _CreateHandler(rlib2.R_2_groups, [], {}, data, clfactory)
1307
    self.assertRaises(http.HttpBadRequest, handler.POST)
1308
    self.assertRaises(IndexError, clfactory.GetNextClient)
1309

    
1310
  def testDefaults(self):
1311
    clfactory = _FakeClientFactory(_FakeClient)
1312

    
1313
    name = "group15395"
1314
    data = {
1315
      "group_name": name,
1316
      }
1317

    
1318
    handler = _CreateHandler(rlib2.R_2_groups, [], {}, data, clfactory)
1319
    job_id = handler.POST()
1320

    
1321
    cl = clfactory.GetNextClient()
1322
    self.assertRaises(IndexError, clfactory.GetNextClient)
1323

    
1324
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
1325
    self.assertEqual(job_id, exp_job_id)
1326

    
1327
    self.assertTrue(isinstance(op, opcodes.OpGroupAdd))
1328
    self.assertEqual(op.group_name, name)
1329
    self.assertFalse(hasattr(op, "alloc_policy"))
1330
    self.assertFalse(op.dry_run)
1331

    
1332
  def testLegacyName(self):
1333
    clfactory = _FakeClientFactory(_FakeClient)
1334

    
1335
    name = "group29852"
1336
    data = {
1337
      "name": name,
1338
      }
1339

    
1340
    handler = _CreateHandler(rlib2.R_2_groups, [], {
1341
      "dry-run": ["1"],
1342
      }, data, clfactory)
1343
    job_id = handler.POST()
1344

    
1345
    cl = clfactory.GetNextClient()
1346
    self.assertRaises(IndexError, clfactory.GetNextClient)
1347

    
1348
    (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
1349
    self.assertEqual(job_id, exp_job_id)
1350

    
1351
    self.assertTrue(isinstance(op, opcodes.OpGroupAdd))
1352
    self.assertEqual(op.group_name, name)
1353
    self.assertFalse(hasattr(op, "alloc_policy"))
1354
    self.assertTrue(op.dry_run)
1355

    
1356

    
1357
class TestNodeRole(unittest.TestCase):
1358
  def test(self):
1359
    clfactory = _FakeClientFactory(_FakeClient)
1360

    
1361
    for role in rlib2._NR_MAP.values():
1362
      handler = _CreateHandler(rlib2.R_2_nodes_name_role,
1363
                               ["node-z"], {}, role, clfactory)
1364
      if role == rlib2._NR_MASTER:
1365
        self.assertRaises(http.HttpBadRequest, handler.PUT)
1366
      else:
1367
        job_id = handler.PUT()
1368

    
1369
        cl = clfactory.GetNextClient()
1370
        self.assertRaises(IndexError, clfactory.GetNextClient)
1371

    
1372
        (exp_job_id, (op, )) = cl.GetNextSubmittedJob()
1373
        self.assertEqual(job_id, exp_job_id)
1374
        self.assertTrue(isinstance(op, opcodes.OpNodeSetParams))
1375
        self.assertEqual(op.node_name, "node-z")
1376
        self.assertFalse(op.force)
1377
        self.assertFalse(hasattr(op, "dry_run"))
1378

    
1379
        if role == rlib2._NR_REGULAR:
1380
          self.assertFalse(op.drained)
1381
          self.assertFalse(op.offline)
1382
          self.assertFalse(op.master_candidate)
1383
        elif role == rlib2._NR_MASTER_CANDIDATE:
1384
          self.assertFalse(op.drained)
1385
          self.assertFalse(op.offline)
1386
          self.assertTrue(op.master_candidate)
1387
        elif role == rlib2._NR_DRAINED:
1388
          self.assertTrue(op.drained)
1389
          self.assertFalse(op.offline)
1390
          self.assertFalse(op.master_candidate)
1391
        elif role == rlib2._NR_OFFLINE:
1392
          self.assertFalse(op.drained)
1393
          self.assertTrue(op.offline)
1394
          self.assertFalse(op.master_candidate)
1395
        else:
1396
          self.fail("Unknown role '%s'" % role)
1397

    
1398
      self.assertRaises(IndexError, cl.GetNextSubmittedJob)
1399

    
1400

    
1401
if __name__ == '__main__':
1402
  testutils.GanetiTestProgram()