Revision a9e1819b

b/lib/opcodes_base.py
160 160
  # as OP_ID is dynamically defined
161 161
  __metaclass__ = _AutoOpParamSlots
162 162

  
163
  def __init__(self, **kwargs):
164
    outils.ValidatedSlots.__init__(self, **kwargs)
165
    for key, default, _, _ in self.__class__.GetAllParams():
166
      if not hasattr(self, key):
167
        setattr(self, key, default)
168

  
163 169
  def __getstate__(self):
164 170
    """Generic serializer.
165 171

  
b/test/py/ganeti.jqueue_unittest.py
298 298
class TestQueuedOpCode(unittest.TestCase):
299 299
  def testDefaults(self):
300 300
    def _Check(op):
301
      self.assertFalse(hasattr(op.input, "dry_run"))
301
      self.assertFalse(op.input.dry_run)
302 302
      self.assertEqual(op.priority, constants.OP_PRIO_DEFAULT)
303 303
      self.assertFalse(op.log)
304 304
      self.assert_(op.start_timestamp is None)
......
432 432
    self.assertTrue(compat.all(op.priority == constants.OP_PRIO_DEFAULT
433 433
                               for op in job.ops))
434 434
    self.assertEqual(job.CalcPriority(), constants.OP_PRIO_DEFAULT)
435
    self.assertFalse(compat.any(hasattr(op.input, "priority")
436
                                for op in job.ops))
437 435

  
438 436
    return job
439 437

  
......
445 443
    result = job.ChangePriority(-10)
446 444
    self.assertEqual(job.CalcPriority(), -10)
447 445
    self.assertTrue(compat.all(op.priority == -10 for op in job.ops))
448
    self.assertFalse(compat.any(hasattr(op.input, "priority")
449
                                for op in job.ops))
450 446
    self.assertEqual(result,
451 447
                     (True, ("Priorities of pending opcodes for job 24984 have"
452 448
                             " been changed to -10")))
......
466 462
    self.assertEqual(job.CalcPriority(), constants.OP_PRIO_DEFAULT)
467 463
    self.assertTrue(compat.all(op.priority == constants.OP_PRIO_DEFAULT
468 464
                               for op in job.ops))
469
    self.assertFalse(compat.any(hasattr(op.input, "priority")
470
                                for op in job.ops))
471 465
    self.assertEqual(map(operator.attrgetter("status"), job.ops), [
472 466
      constants.OP_STATUS_SUCCESS,
473 467
      constants.OP_STATUS_SUCCESS,
......
491 485
    self.assertEqual(job.CalcPriority(), constants.OP_PRIO_DEFAULT)
492 486
    self.assertTrue(compat.all(op.priority == constants.OP_PRIO_DEFAULT
493 487
                               for op in job.ops))
494
    self.assertFalse(compat.any(hasattr(op.input, "priority")
495
                                for op in job.ops))
496 488
    self.assertEqual(map(operator.attrgetter("status"), job.ops), [
497 489
      constants.OP_STATUS_SUCCESS,
498 490
      constants.OP_STATUS_SUCCESS,
......
516 508
    self.assertEqual(job.CalcPriority(), constants.OP_PRIO_DEFAULT)
517 509
    self.assertEqual(map(operator.attrgetter("priority"), job.ops),
518 510
                     [constants.OP_PRIO_DEFAULT, 7, 7, 7])
519
    self.assertFalse(compat.any(hasattr(op.input, "priority")
520
                                for op in job.ops))
521 511
    self.assertEqual(map(operator.attrgetter("status"), job.ops), [
522 512
      constants.OP_STATUS_RUNNING,
523 513
      constants.OP_STATUS_QUEUED,
......
543 533
    self.assertEqual(job.CalcPriority(), constants.OP_PRIO_DEFAULT)
544 534
    self.assertTrue(compat.all(op.priority == constants.OP_PRIO_DEFAULT
545 535
                               for op in job.ops))
546
    self.assertFalse(compat.any(hasattr(op.input, "priority")
547
                                for op in job.ops))
548 536
    self.assertEqual(map(operator.attrgetter("status"), job.ops), [
549 537
      constants.OP_STATUS_SUCCESS,
550 538
      constants.OP_STATUS_SUCCESS,
......
568 556
    self.assertEqual(map(operator.attrgetter("priority"), job.ops),
569 557
                     [constants.OP_PRIO_DEFAULT, constants.OP_PRIO_DEFAULT,
570 558
                      -19, -19])
571
    self.assertFalse(compat.any(hasattr(op.input, "priority")
572
                                for op in job.ops))
573 559
    self.assertEqual(map(operator.attrgetter("status"), job.ops), [
574 560
      constants.OP_STATUS_SUCCESS,
575 561
      constants.OP_STATUS_RUNNING,
......
2269 2255
      result = proc(_nextop_fn=self._NextOpcode)
2270 2256
      assert self.curop is not None
2271 2257

  
2272
      # Input priority should never be set or modified
2273
      self.assertFalse(compat.any(hasattr(op.input, "priority")
2274
                                  for op in job.ops))
2275

  
2276 2258
      if result == jqueue._JobProcessor.FINISHED or self.gave_lock:
2277 2259
        # Got lock and/or job is done, result must've been written
2278 2260
        self.assertFalse(job.cur_opctx)
b/test/py/ganeti.mcpu_unittest.py
136 136

  
137 137
    for op in [op1, op2, op3]:
138 138
      self.assertTrue("OP_TEST_DUMMY" in op.comment)
139
      self.assertFalse(hasattr(op, "priority"))
140
      self.assertFalse(hasattr(op, "debug_level"))
141 139

  
142 140
  def testParams(self):
143 141
    src = opcodes.OpTestDummy(priority=constants.OP_PRIO_HIGH,
......
163 161
    self.assertTrue("OP_TEST_DUMMY" in op1.comment)
164 162
    self.assertEqual(op1.debug_level, 3)
165 163

  
166
    self.assertEqual(op2.priority, constants.OP_PRIO_HIGH)
164
    # FIXME: as priority is mandatory, there is no way
165
    # of specifying "just inherit the priority".
167 166
    self.assertEqual(op2.comment, "foobar")
168 167
    self.assertEqual(op2.debug_level, 3)
169 168

  
b/test/py/ganeti.opcodes_unittest.py
219 219
    op = OpTest()
220 220
    before = op.__getstate__()
221 221
    self.assertRaises(errors.OpPrereqError, op.Validate, False)
222
    self.assertFalse(hasattr(op, "nodef"))
223
    self.assertFalse(hasattr(op, "wdef"))
224
    self.assertFalse(hasattr(op, "number"))
225
    self.assertFalse(hasattr(op, "notype"))
222
    self.assertTrue(op.nodef is None)
223
    self.assertEqual(op.wdef, "default")
224
    self.assertEqual(op.number, 0)
225
    self.assertTrue(op.notype is None)
226 226
    self.assertEqual(op.__getstate__(), before, msg="Opcode was modified")
227 227

  
228 228
    # Required parameter "nodef" is provided
......
231 231
    op.Validate(False)
232 232
    self.assertEqual(op.__getstate__(), before, msg="Opcode was modified")
233 233
    self.assertEqual(op.nodef, "foo")
234
    self.assertFalse(hasattr(op, "wdef"))
235
    self.assertFalse(hasattr(op, "number"))
236
    self.assertFalse(hasattr(op, "notype"))
234
    self.assertEqual(op.wdef, "default")
235
    self.assertEqual(op.number, 0)
236
    self.assertTrue(op.notype is None)
237 237

  
238 238
    # Missing required parameter "nodef"
239 239
    op = OpTest(wdef="hello", number=999)
240 240
    before = op.__getstate__()
241 241
    self.assertRaises(errors.OpPrereqError, op.Validate, False)
242
    self.assertFalse(hasattr(op, "nodef"))
243
    self.assertFalse(hasattr(op, "notype"))
242
    self.assertTrue(op.nodef is None)
243
    self.assertTrue(op.notype is None)
244 244
    self.assertEqual(op.__getstate__(), before, msg="Opcode was modified")
245 245

  
246 246
    # Wrong type for "nodef"
......
248 248
    before = op.__getstate__()
249 249
    self.assertRaises(errors.OpPrereqError, op.Validate, False)
250 250
    self.assertEqual(op.nodef, 987)
251
    self.assertFalse(hasattr(op, "notype"))
251
    self.assertTrue(op.notype is None)
252 252
    self.assertEqual(op.__getstate__(), before, msg="Opcode was modified")
253 253

  
254 254
    # Testing different types for "notype"
......
274 274
        ]
275 275

  
276 276
    op = OpTest()
277
    before = op.__getstate__()
278 277
    op.Validate(True)
279
    self.assertNotEqual(op.__getstate__(), before,
280
                        msg="Opcode was not modified")
281 278
    self.assertEqual(op.value1, "default")
282 279
    self.assertEqual(op.value2, "result")
283 280
    self.assert_(op.dry_run is None)
......
285 282
    self.assertEqual(op.priority, constants.OP_PRIO_DEFAULT)
286 283

  
287 284
    op = OpTest(value1="hello", value2="world", debug_level=123)
288
    before = op.__getstate__()
289 285
    op.Validate(True)
290
    self.assertNotEqual(op.__getstate__(), before,
291
                        msg="Opcode was not modified")
292 286
    self.assertEqual(op.value1, "hello")
293 287
    self.assertEqual(op.value2, "world")
294 288
    self.assertEqual(op.debug_level, 123)
b/test/py/ganeti.rapi.baserlib_unittest.py
44 44
    for static in [None, {}]:
45 45
      op = baserlib.FillOpcode(self.OpTest, {}, static)
46 46
      self.assertTrue(isinstance(op, self.OpTest))
47
      self.assertFalse(hasattr(op, "test"))
47
      self.assertTrue(op.test is None)
48 48

  
49 49
  def testStatic(self):
50 50
    op = baserlib.FillOpcode(self.OpTest, {}, {"test": "abc"})
b/test/py/ganeti.rapi.rlib2_unittest.py
468 468
    self.assertTrue(isinstance(op, opcodes.OpInstanceActivateDisks))
469 469
    self.assertEqual(op.instance_name, "xyz")
470 470
    self.assertTrue(op.ignore_size)
471
    self.assertFalse(hasattr(op, "dry_run"))
471
    self.assertFalse(op.dry_run)
472 472

  
473 473
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
474 474

  
......
487 487
    self.assertEqual(job_id, exp_job_id)
488 488
    self.assertTrue(isinstance(op, opcodes.OpInstanceDeactivateDisks))
489 489
    self.assertEqual(op.instance_name, "inst22357")
490
    self.assertFalse(hasattr(op, "dry_run"))
491
    self.assertFalse(hasattr(op, "force"))
490
    self.assertFalse(op.dry_run)
491
    self.assertFalse(op.force)
492 492

  
493 493
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
494 494

  
......
507 507
    self.assertEqual(job_id, exp_job_id)
508 508
    self.assertTrue(isinstance(op, opcodes.OpInstanceRecreateDisks))
509 509
    self.assertEqual(op.instance_name, "inst22357")
510
    self.assertFalse(hasattr(op, "dry_run"))
510
    self.assertFalse(op.dry_run)
511 511
    self.assertFalse(hasattr(op, "force"))
512 512

  
513 513
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
......
527 527
    self.assertEqual(job_id, exp_job_id)
528 528
    self.assertTrue(isinstance(op, opcodes.OpInstanceFailover))
529 529
    self.assertEqual(op.instance_name, "inst12794")
530
    self.assertFalse(hasattr(op, "dry_run"))
530
    self.assertFalse(op.dry_run)
531 531
    self.assertFalse(hasattr(op, "force"))
532 532

  
533 533
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
......
552 552
    self.assertEqual(op.instance_name, "inst10742")
553 553
    self.assertEqual(op.disk, 3)
554 554
    self.assertEqual(op.amount, 1024)
555
    self.assertFalse(hasattr(op, "dry_run"))
555
    self.assertFalse(op.dry_run)
556 556
    self.assertFalse(hasattr(op, "force"))
557 557

  
558 558
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
......
576 576
    self.assertTrue(isinstance(op, opcodes.OpBackupPrepare))
577 577
    self.assertEqual(op.instance_name, "inst17925")
578 578
    self.assertEqual(op.mode, constants.EXPORT_MODE_REMOTE)
579
    self.assertFalse(hasattr(op, "dry_run"))
579
    self.assertFalse(op.dry_run)
580 580
    self.assertFalse(hasattr(op, "force"))
581 581

  
582 582
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
......
622 622
    self.assertEqual(op.nodes, ["node21075"])
623 623
    self.assertEqual(op.storage_type, constants.ST_LVM_PV)
624 624
    self.assertEqual(op.output_fields, ["name", "other"])
625
    self.assertFalse(hasattr(op, "dry_run"))
625
    self.assertFalse(op.dry_run)
626 626
    self.assertFalse(hasattr(op, "force"))
627 627

  
628 628
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
......
687 687
        self.assertEqual(op.changes, {
688 688
          constants.SF_ALLOCATABLE: (allocatable == "1"),
689 689
          })
690
      self.assertFalse(hasattr(op, "dry_run"))
690
      self.assertFalse(op.dry_run)
691 691
      self.assertFalse(hasattr(op, "force"))
692 692

  
693 693
      self.assertRaises(IndexError, cl.GetNextSubmittedJob)
......
742 742
    self.assertEqual(op.node_name, "node19265")
743 743
    self.assertEqual(op.storage_type, constants.ST_LVM_PV)
744 744
    self.assertEqual(op.name, "pv16611")
745
    self.assertFalse(hasattr(op, "dry_run"))
745
    self.assertFalse(op.dry_run)
746 746
    self.assertFalse(hasattr(op, "force"))
747 747

  
748 748
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
......
921 921
                    self.assertFalse("foobar" in opnic)
922 922

  
923 923
                  if beparams is None:
924
                    self.assertFalse(hasattr(op, "beparams"))
924
                    self.assertTrue(op.beparams in [None, {}])
925 925
                  else:
926 926
                    self.assertEqualValues(op.beparams, beparams)
927 927

  
928 928
                  if hvparams is None:
929
                    self.assertFalse(hasattr(op, "hvparams"))
929
                    self.assertTrue(op.hvparams in [None, {}])
930 930
                  else:
931 931
                    self.assertEqualValues(op.hvparams, hvparams)
932 932

  
......
1102 1102
    self.assertEqual(op.remove_instance, True)
1103 1103
    self.assertEqual(op.x509_key_name, ["name", "hash"])
1104 1104
    self.assertEqual(op.destination_x509_ca, "---cert---")
1105
    self.assertFalse(hasattr(op, "dry_run"))
1105
    self.assertFalse(op.dry_run)
1106 1106
    self.assertFalse(hasattr(op, "force"))
1107 1107

  
1108 1108
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
......
1128 1128
    self.assertTrue(isinstance(op, opcodes.OpBackupExport))
1129 1129
    self.assertEqual(op.instance_name, name)
1130 1130
    self.assertEqual(op.target_node, "node2")
1131
    self.assertFalse(hasattr(op, "mode"))
1132
    self.assertFalse(hasattr(op, "remove_instance"))
1131
    self.assertEqual(op.mode, "local")
1132
    self.assertFalse(op.remove_instance)
1133 1133
    self.assertFalse(hasattr(op, "destination"))
1134
    self.assertFalse(hasattr(op, "dry_run"))
1134
    self.assertFalse(op.dry_run)
1135 1135
    self.assertFalse(hasattr(op, "force"))
1136 1136

  
1137 1137
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
......
1172 1172
        self.assertEqual(op.instance_name, name)
1173 1173
        self.assertEqual(op.mode, mode)
1174 1174
        self.assertEqual(op.cleanup, cleanup)
1175
        self.assertFalse(hasattr(op, "dry_run"))
1175
        self.assertFalse(op.dry_run)
1176 1176
        self.assertFalse(hasattr(op, "force"))
1177 1177

  
1178 1178
        self.assertRaises(IndexError, cl.GetNextSubmittedJob)
......
1193 1193
    self.assertEqual(job_id, exp_job_id)
1194 1194
    self.assertTrue(isinstance(op, opcodes.OpInstanceMigrate))
1195 1195
    self.assertEqual(op.instance_name, name)
1196
    self.assertFalse(hasattr(op, "mode"))
1197
    self.assertFalse(hasattr(op, "cleanup"))
1198
    self.assertFalse(hasattr(op, "dry_run"))
1196
    self.assertTrue(op.mode is None)
1197
    self.assertFalse(op.cleanup)
1198
    self.assertFalse(op.dry_run)
1199 1199
    self.assertFalse(hasattr(op, "force"))
1200 1200

  
1201 1201
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
......
1230 1230
          self.assertEqual(op.new_name, new_name)
1231 1231
          self.assertEqual(op.ip_check, ip_check)
1232 1232
          self.assertEqual(op.name_check, name_check)
1233
          self.assertFalse(hasattr(op, "dry_run"))
1233
          self.assertFalse(op.dry_run)
1234 1234
          self.assertFalse(hasattr(op, "force"))
1235 1235

  
1236 1236
          self.assertRaises(IndexError, cl.GetNextSubmittedJob)
......
1257 1257
      self.assertTrue(isinstance(op, opcodes.OpInstanceRename))
1258 1258
      self.assertEqual(op.instance_name, name)
1259 1259
      self.assertEqual(op.new_name, new_name)
1260
      self.assertFalse(hasattr(op, "ip_check"))
1261
      self.assertFalse(hasattr(op, "name_check"))
1262
      self.assertFalse(hasattr(op, "dry_run"))
1260
      self.assertTrue(op.ip_check)
1261
      self.assertTrue(op.name_check)
1262
      self.assertFalse(op.dry_run)
1263 1263
      self.assertFalse(hasattr(op, "force"))
1264 1264

  
1265 1265
      self.assertRaises(IndexError, cl.GetNextSubmittedJob)
......
1311 1311
                  self.assertEqual(op.nics, nics)
1312 1312
                  self.assertEqual(op.disks, disks)
1313 1313
                  self.assertEqual(op.disk_template, disk_template)
1314
                  self.assertFalse(hasattr(op, "remote_node"))
1315
                  self.assertFalse(hasattr(op, "os_name"))
1316
                  self.assertFalse(hasattr(op, "force_variant"))
1317
                  self.assertFalse(hasattr(op, "dry_run"))
1314
                  self.assertTrue(op.remote_node is None)
1315
                  self.assertTrue(op.os_name is None)
1316
                  self.assertFalse(op.force_variant)
1317
                  self.assertFalse(op.dry_run)
1318 1318

  
1319 1319
                  self.assertRaises(IndexError, cl.GetNextSubmittedJob)
1320 1320

  
......
1337 1337

  
1338 1338
    for i in ["hvparams", "beparams", "osparams", "force", "nics", "disks",
1339 1339
              "disk_template", "remote_node", "os_name", "force_variant"]:
1340
      self.assertFalse(hasattr(op, i))
1340
      self.assertTrue(hasattr(op, i))
1341 1341

  
1342 1342

  
1343 1343
class TestParseInstanceReinstallRequest(testutils.GanetiTestCase):
......
1497 1497
    self.assertTrue(isinstance(op, opcodes.OpInstanceReplaceDisks))
1498 1498
    self.assertEqual(op.instance_name, name)
1499 1499
    self.assertEqual(op.mode, constants.REPLACE_DISK_AUTO)
1500
    self.assertFalse(hasattr(op, "iallocator"))
1501
    self.assertFalse(hasattr(op, "disks"))
1500
    self.assertTrue(op.iallocator is None)
1501
    self.assertEqual(op.disks, [])
1502 1502
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
1503 1503

  
1504 1504
  def testNoDisks(self):
......
1552 1552
      self.assertTrue(isinstance(op, opcodes.OpGroupSetParams))
1553 1553
      self.assertEqual(op.group_name, name)
1554 1554
      self.assertEqual(op.alloc_policy, policy)
1555
      self.assertFalse(hasattr(op, "dry_run"))
1555
      self.assertFalse(op.dry_run)
1556 1556
      self.assertRaises(IndexError, cl.GetNextSubmittedJob)
1557 1557

  
1558 1558
  def testUnknownPolicy(self):
......
1584 1584

  
1585 1585
    self.assertTrue(isinstance(op, opcodes.OpGroupSetParams))
1586 1586
    self.assertEqual(op.group_name, name)
1587
    self.assertFalse(hasattr(op, "alloc_policy"))
1588
    self.assertFalse(hasattr(op, "dry_run"))
1587
    self.assertTrue(op.alloc_policy is None)
1588
    self.assertFalse(op.dry_run)
1589 1589
    self.assertRaises(IndexError, cl.GetNextSubmittedJob)
1590 1590

  
1591 1591

  
......
1646 1646

  
1647 1647
    self.assertTrue(isinstance(op, opcodes.OpGroupAdd))
1648 1648
    self.assertEqual(op.group_name, name)
1649
    self.assertFalse(hasattr(op, "alloc_policy"))
1649
    self.assertTrue(op.alloc_policy is None)
1650 1650
    self.assertFalse(op.dry_run)
1651 1651

  
1652 1652
  def testLegacyName(self):
......
1670 1670

  
1671 1671
    self.assertTrue(isinstance(op, opcodes.OpGroupAdd))
1672 1672
    self.assertEqual(op.group_name, name)
1673
    self.assertFalse(hasattr(op, "alloc_policy"))
1673
    self.assertTrue(op.alloc_policy is None)
1674 1674
    self.assertTrue(op.dry_run)
1675 1675

  
1676 1676

  
......
1694 1694
        self.assertTrue(isinstance(op, opcodes.OpNodeSetParams))
1695 1695
        self.assertEqual(op.node_name, "node-z")
1696 1696
        self.assertFalse(op.force)
1697
        self.assertFalse(hasattr(op, "dry_run"))
1697
        self.assertFalse(op.dry_run)
1698 1698

  
1699 1699
        if role == rlib2._NR_REGULAR:
1700 1700
          self.assertFalse(op.drained)

Also available in: Unified diff