Revision 197b323b

b/lib/opcodes.py
45 45
# Common opcode attributes
46 46

  
47 47
#: output fields for a query operation
48
_POutputFields = ("output_fields", ht.NoDefault, ht.TListOf(ht.TNonEmptyString))
48
_POutputFields = ("output_fields", ht.NoDefault, ht.TListOf(ht.TNonEmptyString),
49
                  None)
49 50

  
50 51
#: the shutdown timeout
51 52
_PShutdownTimeout = ("shutdown_timeout", constants.DEFAULT_SHUTDOWN_TIMEOUT,
52
                     ht.TPositiveInt)
53
                     ht.TPositiveInt, None)
53 54

  
54 55
#: the force parameter
55
_PForce = ("force", False, ht.TBool)
56
_PForce = ("force", False, ht.TBool, None)
56 57

  
57 58
#: a required instance name (for single-instance LUs)
58
_PInstanceName = ("instance_name", ht.NoDefault, ht.TNonEmptyString)
59
_PInstanceName = ("instance_name", ht.NoDefault, ht.TNonEmptyString, None)
59 60

  
60 61
#: Whether to ignore offline nodes
61
_PIgnoreOfflineNodes = ("ignore_offline_nodes", False, ht.TBool)
62
_PIgnoreOfflineNodes = ("ignore_offline_nodes", False, ht.TBool, None)
62 63

  
63 64
#: a required node name (for single-node LUs)
64
_PNodeName = ("node_name", ht.NoDefault, ht.TNonEmptyString)
65
_PNodeName = ("node_name", ht.NoDefault, ht.TNonEmptyString, None)
65 66

  
66 67
#: a required node group name (for single-group LUs)
67
_PGroupName = ("group_name", ht.NoDefault, ht.TNonEmptyString)
68
_PGroupName = ("group_name", ht.NoDefault, ht.TNonEmptyString, None)
68 69

  
69 70
#: Migration type (live/non-live)
70 71
_PMigrationMode = ("mode", None,
71
                   ht.TOr(ht.TNone, ht.TElemOf(constants.HT_MIGRATION_MODES)))
72
                   ht.TOr(ht.TNone, ht.TElemOf(constants.HT_MIGRATION_MODES)),
73
                   None)
72 74

  
73 75
#: Obsolete 'live' migration mode (boolean)
74
_PMigrationLive = ("live", None, ht.TMaybeBool)
76
_PMigrationLive = ("live", None, ht.TMaybeBool, None)
75 77

  
76 78
#: Tag type
77
_PTagKind = ("kind", ht.NoDefault, ht.TElemOf(constants.VALID_TAG_TYPES))
79
_PTagKind = ("kind", ht.NoDefault, ht.TElemOf(constants.VALID_TAG_TYPES), None)
78 80

  
79 81
#: List of tag strings
80
_PTags = ("tags", ht.NoDefault, ht.TListOf(ht.TNonEmptyString))
82
_PTags = ("tags", ht.NoDefault, ht.TListOf(ht.TNonEmptyString), None)
81 83

  
82 84
#: OP_ID conversion regular expression
83 85
_OPID_RE = re.compile("([a-z])([A-Z])")
......
151 153

  
152 154

  
153 155
#: Storage type parameter
154
_PStorageType = ("storage_type", ht.NoDefault, _CheckStorageType)
156
_PStorageType = ("storage_type", ht.NoDefault, _CheckStorageType, None)
155 157

  
156 158

  
157 159
class _AutoOpParamSlots(type):
......
178 180
    params = attrs.setdefault("OP_PARAMS", [])
179 181

  
180 182
    # Use parameter names as slots
181
    slots = [pname for (pname, _, _) in params]
183
    slots = [pname for (pname, _, _, _) in params]
182 184

  
183 185
    assert "OP_DSC_FIELD" not in attrs or attrs["OP_DSC_FIELD"] in slots, \
184 186
      "Class '%s' uses unknown field in OP_DSC_FIELD" % name
......
281 283
                                 requirements
282 284

  
283 285
    """
284
    for (attr_name, default, test) in self.GetAllParams():
286
    for (attr_name, default, test, _) in self.GetAllParams():
285 287
      assert test == ht.NoType or callable(test)
286 288

  
287 289
      if not hasattr(self, attr_name):
......
334 336
  # as OP_ID is dynamically defined
335 337
  WITH_LU = True
336 338
  OP_PARAMS = [
337
    ("dry_run", None, ht.TMaybeBool),
338
    ("debug_level", None, ht.TOr(ht.TNone, ht.TPositiveInt)),
339
    ("dry_run", None, ht.TMaybeBool, None),
340
    ("debug_level", None, ht.TOr(ht.TNone, ht.TPositiveInt), None),
339 341
    ("priority", constants.OP_PRIO_DEFAULT,
340
     ht.TElemOf(constants.OP_PRIO_SUBMIT_VALID)),
342
     ht.TElemOf(constants.OP_PRIO_SUBMIT_VALID), None),
341 343
    ]
342 344

  
343 345
  def __getstate__(self):
......
442 444
  """
443 445
  OP_PARAMS = [
444 446
    ("skip_checks", ht.EmptyList,
445
     ht.TListOf(ht.TElemOf(constants.VERIFY_OPTIONAL_CHECKS))),
446
    ("verbose", False, ht.TBool),
447
    ("error_codes", False, ht.TBool),
448
    ("debug_simulate_errors", False, ht.TBool),
447
     ht.TListOf(ht.TElemOf(constants.VERIFY_OPTIONAL_CHECKS)), None),
448
    ("verbose", False, ht.TBool, None),
449
    ("error_codes", False, ht.TBool, None),
450
    ("debug_simulate_errors", False, ht.TBool, None),
449 451
    ]
450 452

  
451 453

  
......
489 491

  
490 492
  """
491 493
  OP_PARAMS = [
492
    ("instances", ht.EmptyList, ht.TListOf(ht.TNonEmptyString)),
494
    ("instances", ht.EmptyList, ht.TListOf(ht.TNonEmptyString), None),
493 495
    ]
494 496

  
495 497

  
......
511 513
  """
512 514
  OP_DSC_FIELD = "name"
513 515
  OP_PARAMS = [
514
    ("name", ht.NoDefault, ht.TNonEmptyString),
516
    ("name", ht.NoDefault, ht.TNonEmptyString, None),
515 517
    ]
516 518

  
517 519

  
......
523 525

  
524 526
  """
525 527
  OP_PARAMS = [
526
    ("vg_name", None, ht.TMaybeString),
528
    ("vg_name", None, ht.TMaybeString, None),
527 529
    ("enabled_hypervisors", None,
528 530
     ht.TOr(ht.TAnd(ht.TListOf(ht.TElemOf(constants.HYPER_TYPES)), ht.TTrue),
529
            ht.TNone)),
531
            ht.TNone), None),
530 532
    ("hvparams", None, ht.TOr(ht.TDictOf(ht.TNonEmptyString, ht.TDict),
531
                              ht.TNone)),
532
    ("beparams", None, ht.TOr(ht.TDict, ht.TNone)),
533
                              ht.TNone), None),
534
    ("beparams", None, ht.TOr(ht.TDict, ht.TNone), None),
533 535
    ("os_hvp", None, ht.TOr(ht.TDictOf(ht.TNonEmptyString, ht.TDict),
534
                            ht.TNone)),
536
                            ht.TNone), None),
535 537
    ("osparams", None, ht.TOr(ht.TDictOf(ht.TNonEmptyString, ht.TDict),
536
                              ht.TNone)),
537
    ("candidate_pool_size", None, ht.TOr(ht.TStrictPositiveInt, ht.TNone)),
538
    ("uid_pool", None, ht.NoType),
539
    ("add_uids", None, ht.NoType),
540
    ("remove_uids", None, ht.NoType),
541
    ("maintain_node_health", None, ht.TMaybeBool),
542
    ("prealloc_wipe_disks", None, ht.TMaybeBool),
543
    ("nicparams", None, ht.TMaybeDict),
544
    ("ndparams", None, ht.TMaybeDict),
545
    ("drbd_helper", None, ht.TOr(ht.TString, ht.TNone)),
546
    ("default_iallocator", None, ht.TOr(ht.TString, ht.TNone)),
547
    ("master_netdev", None, ht.TOr(ht.TString, ht.TNone)),
548
    ("reserved_lvs", None, ht.TOr(ht.TListOf(ht.TNonEmptyString), ht.TNone)),
549
    ("hidden_os", None, _TestClusterOsList),
550
    ("blacklisted_os", None, _TestClusterOsList),
538
                              ht.TNone), None),
539
    ("candidate_pool_size", None, ht.TOr(ht.TStrictPositiveInt, ht.TNone),
540
     None),
541
    ("uid_pool", None, ht.NoType, None),
542
    ("add_uids", None, ht.NoType, None),
543
    ("remove_uids", None, ht.NoType, None),
544
    ("maintain_node_health", None, ht.TMaybeBool, None),
545
    ("prealloc_wipe_disks", None, ht.TMaybeBool, None),
546
    ("nicparams", None, ht.TMaybeDict, None),
547
    ("ndparams", None, ht.TMaybeDict, None),
548
    ("drbd_helper", None, ht.TOr(ht.TString, ht.TNone), None),
549
    ("default_iallocator", None, ht.TOr(ht.TString, ht.TNone), None),
550
    ("master_netdev", None, ht.TOr(ht.TString, ht.TNone), None),
551
    ("reserved_lvs", None, ht.TOr(ht.TListOf(ht.TNonEmptyString), ht.TNone), None),
552
    ("hidden_os", None, _TestClusterOsList, None),
553
    ("blacklisted_os", None, _TestClusterOsList, None),
551 554
    ]
552 555

  
553 556

  
......
566 569

  
567 570
  """
568 571
  OP_PARAMS = [
569
    ("what", ht.NoDefault, ht.TElemOf(constants.QR_OP_QUERY)),
570
    ("fields", ht.NoDefault, ht.TListOf(ht.TNonEmptyString)),
572
    ("what", ht.NoDefault, ht.TElemOf(constants.QR_OP_QUERY), None),
573
    ("fields", ht.NoDefault, ht.TListOf(ht.TNonEmptyString), None),
571 574
    ("filter", None, ht.TOr(ht.TNone,
572
                            ht.TListOf(ht.TOr(ht.TNonEmptyString, ht.TList)))),
575
                            ht.TListOf(ht.TOr(ht.TNonEmptyString, ht.TList))), None),
573 576
    ]
574 577

  
575 578

  
......
581 584

  
582 585
  """
583 586
  OP_PARAMS = [
584
    ("what", ht.NoDefault, ht.TElemOf(constants.QR_OP_QUERY)),
585
    ("fields", None, ht.TOr(ht.TNone, ht.TListOf(ht.TNonEmptyString))),
587
    ("what", ht.NoDefault, ht.TElemOf(constants.QR_OP_QUERY), None),
588
    ("fields", None, ht.TOr(ht.TNone, ht.TListOf(ht.TNonEmptyString)), None),
586 589
    ]
587 590

  
588 591

  
589 592
class OpOobCommand(OpCode):
590 593
  """Interact with OOB."""
591 594
  OP_PARAMS = [
592
    ("node_names", ht.EmptyList, ht.TListOf(ht.TNonEmptyString)),
593
    ("command", None, ht.TElemOf(constants.OOB_COMMANDS)),
594
    ("timeout", constants.OOB_TIMEOUT, ht.TInt),
595
    ("ignore_status", False, ht.TBool),
596
    ("force_master", False, ht.TBool),
595
    ("node_names", ht.EmptyList, ht.TListOf(ht.TNonEmptyString), None),
596
    ("command", None, ht.TElemOf(constants.OOB_COMMANDS), None),
597
    ("timeout", constants.OOB_TIMEOUT, ht.TInt, None),
598
    ("ignore_status", False, ht.TBool, None),
599
    ("force_master", False, ht.TBool, None),
597 600
    ]
598 601

  
599 602

  
......
644 647
  OP_DSC_FIELD = "node_name"
645 648
  OP_PARAMS = [
646 649
    _PNodeName,
647
    ("primary_ip", None, ht.NoType),
648
    ("secondary_ip", None, ht.TMaybeString),
649
    ("readd", False, ht.TBool),
650
    ("group", None, ht.TMaybeString),
651
    ("master_capable", None, ht.TMaybeBool),
652
    ("vm_capable", None, ht.TMaybeBool),
653
    ("ndparams", None, ht.TMaybeDict),
650
    ("primary_ip", None, ht.NoType, None),
651
    ("secondary_ip", None, ht.TMaybeString, None),
652
    ("readd", False, ht.TBool, None),
653
    ("group", None, ht.TMaybeString, None),
654
    ("master_capable", None, ht.TMaybeBool, None),
655
    ("vm_capable", None, ht.TMaybeBool, None),
656
    ("ndparams", None, ht.TMaybeDict, None),
654 657
    ]
655 658

  
656 659

  
......
658 661
  """Compute the list of nodes."""
659 662
  OP_PARAMS = [
660 663
    _POutputFields,
661
    ("names", ht.EmptyList, ht.TListOf(ht.TNonEmptyString)),
662
    ("use_locking", False, ht.TBool),
664
    ("names", ht.EmptyList, ht.TListOf(ht.TNonEmptyString), None),
665
    ("use_locking", False, ht.TBool, None),
663 666
    ]
664 667

  
665 668

  
......
667 670
  """Get list of volumes on node."""
668 671
  OP_PARAMS = [
669 672
    _POutputFields,
670
    ("nodes", ht.EmptyList, ht.TListOf(ht.TNonEmptyString)),
673
    ("nodes", ht.EmptyList, ht.TListOf(ht.TNonEmptyString), None),
671 674
    ]
672 675

  
673 676

  
......
676 679
  OP_PARAMS = [
677 680
    _POutputFields,
678 681
    _PStorageType,
679
    ("nodes", ht.EmptyList, ht.TListOf(ht.TNonEmptyString)),
680
    ("name", None, ht.TMaybeString),
682
    ("nodes", ht.EmptyList, ht.TListOf(ht.TNonEmptyString), None),
683
    ("name", None, ht.TMaybeString, None),
681 684
    ]
682 685

  
683 686

  
......
686 689
  OP_PARAMS = [
687 690
    _PNodeName,
688 691
    _PStorageType,
689
    ("name", ht.NoDefault, ht.TNonEmptyString),
690
    ("changes", ht.NoDefault, ht.TDict),
692
    ("name", ht.NoDefault, ht.TNonEmptyString, None),
693
    ("changes", ht.NoDefault, ht.TDict, None),
691 694
    ]
692 695

  
693 696

  
......
697 700
  OP_PARAMS = [
698 701
    _PNodeName,
699 702
    _PStorageType,
700
    ("name", ht.NoDefault, ht.TNonEmptyString),
701
    ("ignore_consistency", False, ht.TBool),
703
    ("name", ht.NoDefault, ht.TNonEmptyString, None),
704
    ("ignore_consistency", False, ht.TBool, None),
702 705
    ]
703 706

  
704 707

  
......
708 711
  OP_PARAMS = [
709 712
    _PNodeName,
710 713
    _PForce,
711
    ("master_candidate", None, ht.TMaybeBool),
712
    ("offline", None, ht.TMaybeBool),
713
    ("drained", None, ht.TMaybeBool),
714
    ("auto_promote", False, ht.TBool),
715
    ("master_capable", None, ht.TMaybeBool),
716
    ("vm_capable", None, ht.TMaybeBool),
717
    ("secondary_ip", None, ht.TMaybeString),
718
    ("ndparams", None, ht.TMaybeDict),
719
    ("powered", None, ht.TMaybeBool),
714
    ("master_candidate", None, ht.TMaybeBool, None),
715
    ("offline", None, ht.TMaybeBool, None),
716
    ("drained", None, ht.TMaybeBool, None),
717
    ("auto_promote", False, ht.TBool, None),
718
    ("master_capable", None, ht.TMaybeBool, None),
719
    ("vm_capable", None, ht.TMaybeBool, None),
720
    ("secondary_ip", None, ht.TMaybeString, None),
721
    ("ndparams", None, ht.TMaybeDict, None),
722
    ("powered", None, ht.TMaybeBool, None),
720 723
    ]
721 724

  
722 725

  
......
743 746
  """Compute the evacuation strategy for a list of nodes."""
744 747
  OP_DSC_FIELD = "nodes"
745 748
  OP_PARAMS = [
746
    ("nodes", ht.NoDefault, ht.TListOf(ht.TNonEmptyString)),
747
    ("remote_node", None, ht.TMaybeString),
748
    ("iallocator", None, ht.TMaybeString),
749
    ("nodes", ht.NoDefault, ht.TListOf(ht.TNonEmptyString), None),
750
    ("remote_node", None, ht.TMaybeString, None),
751
    ("iallocator", None, ht.TMaybeString, None),
749 752
    ]
750 753

  
751 754

  
......
766 769
  OP_DSC_FIELD = "instance_name"
767 770
  OP_PARAMS = [
768 771
    _PInstanceName,
769
    ("beparams", ht.EmptyDict, ht.TDict),
770
    ("disks", ht.NoDefault, ht.TListOf(ht.TDict)),
771
    ("disk_template", ht.NoDefault, _CheckDiskTemplate),
772
    ("file_driver", None, ht.TOr(ht.TNone, ht.TElemOf(constants.FILE_DRIVER))),
773
    ("file_storage_dir", None, ht.TMaybeString),
774
    ("force_variant", False, ht.TBool),
775
    ("hvparams", ht.EmptyDict, ht.TDict),
776
    ("hypervisor", None, ht.TMaybeString),
777
    ("iallocator", None, ht.TMaybeString),
778
    ("identify_defaults", False, ht.TBool),
779
    ("ip_check", True, ht.TBool),
780
    ("mode", ht.NoDefault, ht.TElemOf(constants.INSTANCE_CREATE_MODES)),
781
    ("name_check", True, ht.TBool),
782
    ("nics", ht.NoDefault, ht.TListOf(ht.TDict)),
783
    ("no_install", None, ht.TMaybeBool),
784
    ("osparams", ht.EmptyDict, ht.TDict),
785
    ("os_type", None, ht.TMaybeString),
786
    ("pnode", None, ht.TMaybeString),
787
    ("snode", None, ht.TMaybeString),
788
    ("source_handshake", None, ht.TOr(ht.TList, ht.TNone)),
789
    ("source_instance_name", None, ht.TMaybeString),
772
    ("beparams", ht.EmptyDict, ht.TDict, None),
773
    ("disks", ht.NoDefault, ht.TListOf(ht.TDict), None),
774
    ("disk_template", ht.NoDefault, _CheckDiskTemplate, None),
775
    ("file_driver", None, ht.TOr(ht.TNone, ht.TElemOf(constants.FILE_DRIVER)), None),
776
    ("file_storage_dir", None, ht.TMaybeString, None),
777
    ("force_variant", False, ht.TBool, None),
778
    ("hvparams", ht.EmptyDict, ht.TDict, None),
779
    ("hypervisor", None, ht.TMaybeString, None),
780
    ("iallocator", None, ht.TMaybeString, None),
781
    ("identify_defaults", False, ht.TBool, None),
782
    ("ip_check", True, ht.TBool, None),
783
    ("mode", ht.NoDefault, ht.TElemOf(constants.INSTANCE_CREATE_MODES), None),
784
    ("name_check", True, ht.TBool, None),
785
    ("nics", ht.NoDefault, ht.TListOf(ht.TDict), None),
786
    ("no_install", None, ht.TMaybeBool, None),
787
    ("osparams", ht.EmptyDict, ht.TDict, None),
788
    ("os_type", None, ht.TMaybeString, None),
789
    ("pnode", None, ht.TMaybeString, None),
790
    ("snode", None, ht.TMaybeString, None),
791
    ("source_handshake", None, ht.TOr(ht.TList, ht.TNone), None),
792
    ("source_instance_name", None, ht.TMaybeString, None),
790 793
    ("source_shutdown_timeout", constants.DEFAULT_SHUTDOWN_TIMEOUT,
791
     ht.TPositiveInt),
792
    ("source_x509_ca", None, ht.TMaybeString),
793
    ("src_node", None, ht.TMaybeString),
794
    ("src_path", None, ht.TMaybeString),
795
    ("start", True, ht.TBool),
796
    ("wait_for_sync", True, ht.TBool),
794
     ht.TPositiveInt, None),
795
    ("source_x509_ca", None, ht.TMaybeString, None),
796
    ("src_node", None, ht.TMaybeString, None),
797
    ("src_path", None, ht.TMaybeString, None),
798
    ("start", True, ht.TBool, None),
799
    ("wait_for_sync", True, ht.TBool, None),
797 800
    ]
798 801

  
799 802

  
......
802 805
  OP_DSC_FIELD = "instance_name"
803 806
  OP_PARAMS = [
804 807
    _PInstanceName,
805
    ("os_type", None, ht.TMaybeString),
806
    ("force_variant", False, ht.TBool),
807
    ("osparams", None, ht.TMaybeDict),
808
    ("os_type", None, ht.TMaybeString, None),
809
    ("force_variant", False, ht.TBool, None),
810
    ("osparams", None, ht.TMaybeDict, None),
808 811
    ]
809 812

  
810 813

  
......
814 817
  OP_PARAMS = [
815 818
    _PInstanceName,
816 819
    _PShutdownTimeout,
817
    ("ignore_failures", False, ht.TBool),
820
    ("ignore_failures", False, ht.TBool, None),
818 821
    ]
819 822

  
820 823

  
......
822 825
  """Rename an instance."""
823 826
  OP_PARAMS = [
824 827
    _PInstanceName,
825
    ("new_name", ht.NoDefault, ht.TNonEmptyString),
826
    ("ip_check", False, ht.TBool),
827
    ("name_check", True, ht.TBool),
828
    ("new_name", ht.NoDefault, ht.TNonEmptyString, None),
829
    ("ip_check", False, ht.TBool, None),
830
    ("name_check", True, ht.TBool, None),
828 831
    ]
829 832

  
830 833

  
......
835 838
    _PInstanceName,
836 839
    _PForce,
837 840
    _PIgnoreOfflineNodes,
838
    ("hvparams", ht.EmptyDict, ht.TDict),
839
    ("beparams", ht.EmptyDict, ht.TDict),
841
    ("hvparams", ht.EmptyDict, ht.TDict, None),
842
    ("beparams", ht.EmptyDict, ht.TDict, None),
840 843
    ]
841 844

  
842 845

  
......
846 849
  OP_PARAMS = [
847 850
    _PInstanceName,
848 851
    _PIgnoreOfflineNodes,
849
    ("timeout", constants.DEFAULT_SHUTDOWN_TIMEOUT, ht.TPositiveInt),
852
    ("timeout", constants.DEFAULT_SHUTDOWN_TIMEOUT, ht.TPositiveInt, None),
850 853
    ]
851 854

  
852 855

  
......
856 859
  OP_PARAMS = [
857 860
    _PInstanceName,
858 861
    _PShutdownTimeout,
859
    ("ignore_secondaries", False, ht.TBool),
860
    ("reboot_type", ht.NoDefault, ht.TElemOf(constants.REBOOT_TYPES)),
862
    ("ignore_secondaries", False, ht.TBool, None),
863
    ("reboot_type", ht.NoDefault, ht.TElemOf(constants.REBOOT_TYPES), None),
861 864
    ]
862 865

  
863 866

  
......
866 869
  OP_DSC_FIELD = "instance_name"
867 870
  OP_PARAMS = [
868 871
    _PInstanceName,
869
    ("mode", ht.NoDefault, ht.TElemOf(constants.REPLACE_MODES)),
870
    ("disks", ht.EmptyList, ht.TListOf(ht.TPositiveInt)),
871
    ("remote_node", None, ht.TMaybeString),
872
    ("iallocator", None, ht.TMaybeString),
873
    ("early_release", False, ht.TBool),
872
    ("mode", ht.NoDefault, ht.TElemOf(constants.REPLACE_MODES), None),
873
    ("disks", ht.EmptyList, ht.TListOf(ht.TPositiveInt), None),
874
    ("remote_node", None, ht.TMaybeString, None),
875
    ("iallocator", None, ht.TMaybeString, None),
876
    ("early_release", False, ht.TBool, None),
874 877
    ]
875 878

  
876 879

  
......
880 883
  OP_PARAMS = [
881 884
    _PInstanceName,
882 885
    _PShutdownTimeout,
883
    ("ignore_consistency", False, ht.TBool),
886
    ("ignore_consistency", False, ht.TBool, None),
884 887
    ]
885 888

  
886 889

  
......
899 902
    _PInstanceName,
900 903
    _PMigrationMode,
901 904
    _PMigrationLive,
902
    ("cleanup", False, ht.TBool),
905
    ("cleanup", False, ht.TBool, None),
903 906
    ]
904 907

  
905 908

  
......
917 920
  OP_PARAMS = [
918 921
    _PInstanceName,
919 922
    _PShutdownTimeout,
920
    ("target_node", ht.NoDefault, ht.TNonEmptyString),
923
    ("target_node", ht.NoDefault, ht.TNonEmptyString, None),
921 924
    ]
922 925

  
923 926

  
......
934 937
  OP_DSC_FIELD = "instance_name"
935 938
  OP_PARAMS = [
936 939
    _PInstanceName,
937
    ("ignore_size", False, ht.TBool),
940
    ("ignore_size", False, ht.TBool, None),
938 941
    ]
939 942

  
940 943

  
......
952 955
  OP_DSC_FIELD = "instance_name"
953 956
  OP_PARAMS = [
954 957
    _PInstanceName,
955
    ("disks", ht.EmptyList, ht.TListOf(ht.TPositiveInt)),
958
    ("disks", ht.EmptyList, ht.TListOf(ht.TPositiveInt), None),
956 959
    ]
957 960

  
958 961

  
......
960 963
  """Compute the list of instances."""
961 964
  OP_PARAMS = [
962 965
    _POutputFields,
963
    ("names", ht.EmptyList, ht.TListOf(ht.TNonEmptyString)),
964
    ("use_locking", False, ht.TBool),
966
    ("names", ht.EmptyList, ht.TListOf(ht.TNonEmptyString), None),
967
    ("use_locking", False, ht.TBool, None),
965 968
    ]
966 969

  
967 970

  
968 971
class OpInstanceQueryData(OpCode):
969 972
  """Compute the run-time status of instances."""
970 973
  OP_PARAMS = [
971
    ("instances", ht.EmptyList, ht.TListOf(ht.TNonEmptyString)),
972
    ("static", False, ht.TBool),
974
    ("instances", ht.EmptyList, ht.TListOf(ht.TNonEmptyString), None),
975
    ("static", False, ht.TBool, None),
973 976
    ]
974 977

  
975 978

  
......
979 982
  OP_PARAMS = [
980 983
    _PInstanceName,
981 984
    _PForce,
982
    ("nics", ht.EmptyList, ht.TList),
983
    ("disks", ht.EmptyList, ht.TList),
984
    ("beparams", ht.EmptyDict, ht.TDict),
985
    ("hvparams", ht.EmptyDict, ht.TDict),
986
    ("disk_template", None, ht.TOr(ht.TNone, _CheckDiskTemplate)),
987
    ("remote_node", None, ht.TMaybeString),
988
    ("os_name", None, ht.TMaybeString),
989
    ("force_variant", False, ht.TBool),
990
    ("osparams", None, ht.TMaybeDict),
985
    ("nics", ht.EmptyList, ht.TList, None),
986
    ("disks", ht.EmptyList, ht.TList, None),
987
    ("beparams", ht.EmptyDict, ht.TDict, None),
988
    ("hvparams", ht.EmptyDict, ht.TDict, None),
989
    ("disk_template", None, ht.TOr(ht.TNone, _CheckDiskTemplate), None),
990
    ("remote_node", None, ht.TMaybeString, None),
991
    ("os_name", None, ht.TMaybeString, None),
992
    ("force_variant", False, ht.TBool, None),
993
    ("osparams", None, ht.TMaybeDict, None),
991 994
    ]
992 995

  
993 996

  
......
996 999
  OP_DSC_FIELD = "instance_name"
997 1000
  OP_PARAMS = [
998 1001
    _PInstanceName,
999
    ("disk", ht.NoDefault, ht.TInt),
1000
    ("amount", ht.NoDefault, ht.TInt),
1001
    ("wait_for_sync", True, ht.TBool),
1002
    ("disk", ht.NoDefault, ht.TInt, None),
1003
    ("amount", ht.NoDefault, ht.TInt, None),
1004
    ("wait_for_sync", True, ht.TBool, None),
1002 1005
    ]
1003 1006

  
1004 1007

  
......
1009 1012
  OP_DSC_FIELD = "group_name"
1010 1013
  OP_PARAMS = [
1011 1014
    _PGroupName,
1012
    ("ndparams", None, ht.TMaybeDict),
1015
    ("ndparams", None, ht.TMaybeDict, None),
1013 1016
    ("alloc_policy", None,
1014
     ht.TOr(ht.TNone, ht.TElemOf(constants.VALID_ALLOC_POLICIES))),
1017
     ht.TOr(ht.TNone, ht.TElemOf(constants.VALID_ALLOC_POLICIES)), None),
1015 1018
    ]
1016 1019

  
1017 1020

  
......
1021 1024
  OP_PARAMS = [
1022 1025
    _PGroupName,
1023 1026
    _PForce,
1024
    ("nodes", ht.NoDefault, ht.TListOf(ht.TNonEmptyString)),
1027
    ("nodes", ht.NoDefault, ht.TListOf(ht.TNonEmptyString), None),
1025 1028
    ]
1026 1029

  
1027 1030

  
......
1029 1032
  """Compute the list of node groups."""
1030 1033
  OP_PARAMS = [
1031 1034
    _POutputFields,
1032
    ("names", ht.EmptyList, ht.TListOf(ht.TNonEmptyString)),
1035
    ("names", ht.EmptyList, ht.TListOf(ht.TNonEmptyString), None),
1033 1036
    ]
1034 1037

  
1035 1038

  
......
1038 1041
  OP_DSC_FIELD = "group_name"
1039 1042
  OP_PARAMS = [
1040 1043
    _PGroupName,
1041
    ("ndparams", None, ht.TMaybeDict),
1044
    ("ndparams", None, ht.TMaybeDict, None),
1042 1045
    ("alloc_policy", None, ht.TOr(ht.TNone,
1043
                                  ht.TElemOf(constants.VALID_ALLOC_POLICIES))),
1046
                                  ht.TElemOf(constants.VALID_ALLOC_POLICIES)), None),
1044 1047
    ]
1045 1048

  
1046 1049

  
......
1056 1059
  """Rename a node group in the cluster."""
1057 1060
  OP_DSC_FIELD = "old_name"
1058 1061
  OP_PARAMS = [
1059
    ("old_name", ht.NoDefault, ht.TNonEmptyString),
1060
    ("new_name", ht.NoDefault, ht.TNonEmptyString),
1062
    ("old_name", ht.NoDefault, ht.TNonEmptyString, None),
1063
    ("new_name", ht.NoDefault, ht.TNonEmptyString, None),
1061 1064
    ]
1062 1065

  
1063 1066

  
......
1066 1069
  """Compute the list of guest operating systems."""
1067 1070
  OP_PARAMS = [
1068 1071
    _POutputFields,
1069
    ("names", ht.EmptyList, ht.TListOf(ht.TNonEmptyString)),
1072
    ("names", ht.EmptyList, ht.TListOf(ht.TNonEmptyString), None),
1070 1073
    ]
1071 1074

  
1072 1075

  
......
1074 1077
class OpBackupQuery(OpCode):
1075 1078
  """Compute the list of exported images."""
1076 1079
  OP_PARAMS = [
1077
    ("nodes", ht.EmptyList, ht.TListOf(ht.TNonEmptyString)),
1078
    ("use_locking", False, ht.TBool),
1080
    ("nodes", ht.EmptyList, ht.TListOf(ht.TNonEmptyString), None),
1081
    ("use_locking", False, ht.TBool, None),
1079 1082
    ]
1080 1083

  
1081 1084

  
......
1089 1092
  OP_DSC_FIELD = "instance_name"
1090 1093
  OP_PARAMS = [
1091 1094
    _PInstanceName,
1092
    ("mode", ht.NoDefault, ht.TElemOf(constants.EXPORT_MODES)),
1095
    ("mode", ht.NoDefault, ht.TElemOf(constants.EXPORT_MODES), None),
1093 1096
    ]
1094 1097

  
1095 1098

  
......
1115 1118
    _PShutdownTimeout,
1116 1119
    # TODO: Rename target_node as it changes meaning for different export modes
1117 1120
    # (e.g. "destination")
1118
    ("target_node", ht.NoDefault, ht.TOr(ht.TNonEmptyString, ht.TList)),
1119
    ("shutdown", True, ht.TBool),
1120
    ("remove_instance", False, ht.TBool),
1121
    ("ignore_remove_failures", False, ht.TBool),
1122
    ("mode", constants.EXPORT_MODE_LOCAL, ht.TElemOf(constants.EXPORT_MODES)),
1123
    ("x509_key_name", None, ht.TOr(ht.TList, ht.TNone)),
1124
    ("destination_x509_ca", None, ht.TMaybeString),
1121
    ("target_node", ht.NoDefault, ht.TOr(ht.TNonEmptyString, ht.TList), None),
1122
    ("shutdown", True, ht.TBool, None),
1123
    ("remove_instance", False, ht.TBool, None),
1124
    ("ignore_remove_failures", False, ht.TBool, None),
1125
    ("mode", constants.EXPORT_MODE_LOCAL, ht.TElemOf(constants.EXPORT_MODES), None),
1126
    ("x509_key_name", None, ht.TOr(ht.TList, ht.TNone), None),
1127
    ("destination_x509_ca", None, ht.TMaybeString, None),
1125 1128
    ]
1126 1129

  
1127 1130

  
......
1140 1143
  OP_PARAMS = [
1141 1144
    _PTagKind,
1142 1145
    # Name is only meaningful for nodes and instances
1143
    ("name", ht.NoDefault, ht.TMaybeString),
1146
    ("name", ht.NoDefault, ht.TMaybeString, None),
1144 1147
    ]
1145 1148

  
1146 1149

  
......
1148 1151
  """Searches the tags in the cluster for a given pattern."""
1149 1152
  OP_DSC_FIELD = "pattern"
1150 1153
  OP_PARAMS = [
1151
    ("pattern", ht.NoDefault, ht.TNonEmptyString),
1154
    ("pattern", ht.NoDefault, ht.TNonEmptyString, None),
1152 1155
    ]
1153 1156

  
1154 1157

  
......
1158 1161
    _PTagKind,
1159 1162
    _PTags,
1160 1163
    # Name is only meaningful for nodes and instances
1161
    ("name", ht.NoDefault, ht.TMaybeString),
1164
    ("name", ht.NoDefault, ht.TMaybeString, None),
1162 1165
    ]
1163 1166

  
1164 1167

  
......
1168 1171
    _PTagKind,
1169 1172
    _PTags,
1170 1173
    # Name is only meaningful for nodes and instances
1171
    ("name", ht.NoDefault, ht.TMaybeString),
1174
    ("name", ht.NoDefault, ht.TMaybeString, None),
1172 1175
    ]
1173 1176

  
1174 1177
# Test opcodes
......
1195 1198
  """
1196 1199
  OP_DSC_FIELD = "duration"
1197 1200
  OP_PARAMS = [
1198
    ("duration", ht.NoDefault, ht.TFloat),
1199
    ("on_master", True, ht.TBool),
1200
    ("on_nodes", ht.EmptyList, ht.TListOf(ht.TNonEmptyString)),
1201
    ("repeat", 0, ht.TPositiveInt)
1201
    ("duration", ht.NoDefault, ht.TFloat, None),
1202
    ("on_master", True, ht.TBool, None),
1203
    ("on_nodes", ht.EmptyList, ht.TListOf(ht.TNonEmptyString), None),
1204
    ("repeat", 0, ht.TPositiveInt, None),
1202 1205
    ]
1203 1206

  
1204 1207

  
......
1216 1219
  OP_DSC_FIELD = "allocator"
1217 1220
  OP_PARAMS = [
1218 1221
    ("direction", ht.NoDefault,
1219
     ht.TElemOf(constants.VALID_IALLOCATOR_DIRECTIONS)),
1220
    ("mode", ht.NoDefault, ht.TElemOf(constants.VALID_IALLOCATOR_MODES)),
1221
    ("name", ht.NoDefault, ht.TNonEmptyString),
1222
     ht.TElemOf(constants.VALID_IALLOCATOR_DIRECTIONS), None),
1223
    ("mode", ht.NoDefault, ht.TElemOf(constants.VALID_IALLOCATOR_MODES), None),
1224
    ("name", ht.NoDefault, ht.TNonEmptyString, None),
1222 1225
    ("nics", ht.NoDefault, ht.TOr(ht.TNone, ht.TListOf(
1223 1226
      ht.TDictOf(ht.TElemOf(["mac", "ip", "bridge"]),
1224
               ht.TOr(ht.TNone, ht.TNonEmptyString))))),
1225
    ("disks", ht.NoDefault, ht.TOr(ht.TNone, ht.TList)),
1226
    ("hypervisor", None, ht.TMaybeString),
1227
    ("allocator", None, ht.TMaybeString),
1228
    ("tags", ht.EmptyList, ht.TListOf(ht.TNonEmptyString)),
1229
    ("mem_size", None, ht.TOr(ht.TNone, ht.TPositiveInt)),
1230
    ("vcpus", None, ht.TOr(ht.TNone, ht.TPositiveInt)),
1231
    ("os", None, ht.TMaybeString),
1232
    ("disk_template", None, ht.TMaybeString),
1233
    ("evac_nodes", None, ht.TOr(ht.TNone, ht.TListOf(ht.TNonEmptyString))),
1227
               ht.TOr(ht.TNone, ht.TNonEmptyString)))), None),
1228
    ("disks", ht.NoDefault, ht.TOr(ht.TNone, ht.TList), None),
1229
    ("hypervisor", None, ht.TMaybeString, None),
1230
    ("allocator", None, ht.TMaybeString, None),
1231
    ("tags", ht.EmptyList, ht.TListOf(ht.TNonEmptyString), None),
1232
    ("mem_size", None, ht.TOr(ht.TNone, ht.TPositiveInt), None),
1233
    ("vcpus", None, ht.TOr(ht.TNone, ht.TPositiveInt), None),
1234
    ("os", None, ht.TMaybeString, None),
1235
    ("disk_template", None, ht.TMaybeString, None),
1236
    ("evac_nodes", None, ht.TOr(ht.TNone, ht.TListOf(ht.TNonEmptyString)), None),
1234 1237
    ]
1235 1238

  
1236 1239

  
......
1239 1242

  
1240 1243
  """
1241 1244
  OP_PARAMS = [
1242
    ("notify_waitlock", False, ht.TBool),
1243
    ("notify_exec", False, ht.TBool),
1244
    ("log_messages", ht.EmptyList, ht.TListOf(ht.TString)),
1245
    ("fail", False, ht.TBool),
1245
    ("notify_waitlock", False, ht.TBool, None),
1246
    ("notify_exec", False, ht.TBool, None),
1247
    ("log_messages", ht.EmptyList, ht.TListOf(ht.TString), None),
1248
    ("fail", False, ht.TBool, None),
1246 1249
    ]
1247 1250

  
1248 1251

  
......
1251 1254

  
1252 1255
  """
1253 1256
  OP_PARAMS = [
1254
    ("result", ht.NoDefault, ht.NoType),
1255
    ("messages", ht.NoDefault, ht.NoType),
1256
    ("fail", ht.NoDefault, ht.NoType),
1257
    ("result", ht.NoDefault, ht.NoType, None),
1258
    ("messages", ht.NoDefault, ht.NoType, None),
1259
    ("fail", ht.NoDefault, ht.NoType, None),
1257 1260
    ]
1258 1261
  WITH_LU = False
1259 1262

  
b/test/ganeti.cmdlib_unittest.py
87 87

  
88 88
    class OpTest(opcodes.OpCode):
89 89
       OP_PARAMS = [
90
        ("iallocator", None, ht.NoType),
91
        ("node", None, ht.NoType),
90
        ("iallocator", None, ht.NoType, None),
91
        ("node", None, ht.NoType, None),
92 92
        ]
93 93

  
94 94
    default_iallocator = mocks.FakeConfig().GetDefaultIAllocator()
b/test/ganeti.opcodes_unittest.py
92 92
    class OpTest(opcodes.OpCode):
93 93
      OP_DSC_FIELD = "data"
94 94
      OP_PARAMS = [
95
        ("data", ht.NoDefault, ht.TString),
95
        ("data", ht.NoDefault, ht.TString, None),
96 96
        ]
97 97

  
98 98
    self.assertEqual(OpTest(data="").Summary(), "TEST()")
......
105 105
    class OpTest(opcodes.OpCode):
106 106
      OP_DSC_FIELD = "data"
107 107
      OP_PARAMS = [
108
        ("data", ht.NoDefault, ht.TList),
108
        ("data", ht.NoDefault, ht.TList, None),
109 109
        ]
110 110

  
111 111
    self.assertEqual(OpTest(data=["a", "b", "c"]).Summary(),
......
136 136
      self.assert_(hasattr(cls, "OP_PARAMS"),
137 137
                   msg="%s doesn't have OP_PARAMS" % cls.OP_ID)
138 138

  
139
      param_names = [name for (name, _, _) in cls.GetAllParams()]
139
      param_names = [name for (name, _, _, _) in cls.GetAllParams()]
140 140

  
141 141
      self.assertEqual(all_slots, param_names)
142 142

  
143 143
      # Without inheritance
144
      self.assertEqual(cls.__slots__, [name for (name, _, _) in cls.OP_PARAMS])
144
      self.assertEqual(cls.__slots__,
145
                       [name for (name, _, _, _) in cls.OP_PARAMS])
145 146

  
146 147
      # This won't work if parameters are converted to a dictionary
147 148
      duplicates = utils.FindDuplicates(param_names)
......
150 151
                            (duplicates, cls.OP_ID)))
151 152

  
152 153
      # Check parameter definitions
153
      for attr_name, aval, test in cls.GetAllParams():
154
      for attr_name, aval, test, doc in cls.GetAllParams():
154 155
        self.assert_(attr_name)
155 156
        self.assert_(test is None or test is ht.NoType or callable(test),
156 157
                     msg=("Invalid type check for %s.%s" %
157 158
                          (cls.OP_ID, attr_name)))
159
        self.assertTrue(doc is None)
158 160

  
159 161
        if callable(aval):
160 162
          self.assertFalse(callable(aval()),
......
163 165
  def testValidateNoModification(self):
164 166
    class OpTest(opcodes.OpCode):
165 167
      OP_PARAMS = [
166
        ("nodef", ht.NoDefault, ht.TMaybeString),
167
        ("wdef", "default", ht.TMaybeString),
168
        ("number", 0, ht.TInt),
169
        ("notype", None, ht.NoType),
168
        ("nodef", ht.NoDefault, ht.TMaybeString, None),
169
        ("wdef", "default", ht.TMaybeString, None),
170
        ("number", 0, ht.TInt, None),
171
        ("notype", None, ht.NoType, None),
170 172
        ]
171 173

  
172 174
    # Missing required parameter "nodef"
......
224 226
    class OpTest(opcodes.OpCode):
225 227
      OP_PARAMS = [
226 228
        # Static default value
227
        ("value1", "default", ht.TMaybeString),
229
        ("value1", "default", ht.TMaybeString, None),
228 230

  
229 231
        # Default value callback
230
        ("value2", lambda: "result", ht.TMaybeString),
232
        ("value2", lambda: "result", ht.TMaybeString, None),
231 233
        ]
232 234

  
233 235
    op = OpTest()
b/test/ganeti.rapi.baserlib_unittest.py
35 35
class TestFillOpcode(unittest.TestCase):
36 36
  class OpTest(opcodes.OpCode):
37 37
    OP_PARAMS = [
38
      ("test", None, ht.TMaybeString),
38
      ("test", None, ht.TMaybeString, None),
39 39
      ]
40 40

  
41 41
  def test(self):

Also available in: Unified diff