Revision bfc2002f lib/rapi/client.py
b/lib/rapi/client.py | ||
---|---|---|
45 | 45 |
REPLACE_DISK_SECONDARY = "replace_on_secondary" |
46 | 46 |
REPLACE_DISK_CHG = "replace_new_secondary" |
47 | 47 |
REPLACE_DISK_AUTO = "replace_auto" |
48 |
VALID_REPLACEMENT_MODES = frozenset([ |
|
49 |
REPLACE_DISK_PRI, |
|
50 |
REPLACE_DISK_SECONDARY, |
|
51 |
REPLACE_DISK_CHG, |
|
52 |
REPLACE_DISK_AUTO, |
|
53 |
]) |
|
54 | 48 |
VALID_NODE_ROLES = frozenset([ |
55 | 49 |
"drained", "master", "master-candidate", "offline", "regular", |
56 | 50 |
]) |
... | ... | |
79 | 73 |
self.code = code |
80 | 74 |
|
81 | 75 |
|
82 |
class InvalidReplacementMode(Error): |
|
83 |
"""Raised when an invalid disk replacement mode is attempted. |
|
84 |
|
|
85 |
""" |
|
86 |
pass |
|
87 |
|
|
88 |
|
|
89 | 76 |
class InvalidNodeRole(Error): |
90 | 77 |
"""Raised when an invalid node role is used. |
91 | 78 |
|
... | ... | |
721 | 708 |
("/%s/instances/%s/reinstall" % |
722 | 709 |
(GANETI_RAPI_VERSION, instance)), query, None) |
723 | 710 |
|
724 |
def ReplaceInstanceDisks(self, instance, disks, mode=REPLACE_DISK_AUTO, |
|
711 |
def ReplaceInstanceDisks(self, instance, disks=None, mode=REPLACE_DISK_AUTO,
|
|
725 | 712 |
remote_node=None, iallocator=None, dry_run=False): |
726 | 713 |
"""Replaces disks on an instance. |
727 | 714 |
|
728 | 715 |
@type instance: str |
729 | 716 |
@param instance: instance whose disks to replace |
730 |
@type disks: list of str
|
|
731 |
@param disks: disks to replace |
|
717 |
@type disks: list of ints
|
|
718 |
@param disks: Indexes of disks to replace
|
|
732 | 719 |
@type mode: str |
733 | 720 |
@param mode: replacement mode to use (defaults to replace_auto) |
734 | 721 |
@type remote_node: str or None |
... | ... | |
743 | 730 |
@rtype: int |
744 | 731 |
@return: job id |
745 | 732 |
|
746 |
@raises InvalidReplacementMode: If an invalid disk replacement mode is given |
|
747 |
@raises GanetiApiError: If no secondary node is given with a non-auto |
|
748 |
replacement mode is requested. |
|
749 |
|
|
750 | 733 |
""" |
751 |
if mode not in VALID_REPLACEMENT_MODES: |
|
752 |
raise InvalidReplacementMode("%s is not a valid disk replacement mode" % |
|
753 |
mode) |
|
754 |
|
|
755 | 734 |
query = [ |
756 | 735 |
("mode", mode), |
757 |
("disks", ",".join(disks)), |
|
758 | 736 |
] |
759 | 737 |
|
760 |
if mode == REPLACE_DISK_AUTO: |
|
761 |
query.append(("iallocator", iallocator)) |
|
762 |
elif mode == REPLACE_DISK_SECONDARY: |
|
763 |
if remote_node is None: |
|
764 |
raise GanetiApiError("Missing secondary node") |
|
738 |
if disks: |
|
739 |
query.append(("disks", ",".join(str(idx) for idx in disks))) |
|
740 |
|
|
741 |
if remote_node: |
|
765 | 742 |
query.append(("remote_node", remote_node)) |
766 | 743 |
|
744 |
if iallocator: |
|
745 |
query.append(("iallocator", iallocator)) |
|
746 |
|
|
767 | 747 |
if dry_run: |
768 | 748 |
query.append(("dry-run", 1)) |
769 | 749 |
|
Also available in: Unified diff