X-Git-Url: https://code.grnet.gr/git/ganeti-local/blobdiff_plain/207774131724caaf0849450a19fbb207cf5655f4..a5229439a0908a071d13dc8c1e9099e171e896bd:/lib/opcodes.py diff --git a/lib/opcodes.py b/lib/opcodes.py index 4de40ba..9fea1a1 100644 --- a/lib/opcodes.py +++ b/lib/opcodes.py @@ -144,14 +144,9 @@ class OpCode(BaseOpCode): raise ValueError("Invalid data to LoadOpcode, missing OP_ID") op_id = data["OP_ID"] op_class = None - for item in globals().values(): - if (isinstance(item, type) and - issubclass(item, cls) and - hasattr(item, "OP_ID") and - getattr(item, "OP_ID") == op_id): - op_class = item - break - if op_class is None: + if op_id in OP_MAPPING: + op_class = OP_MAPPING[op_id] + else: raise ValueError("Invalid data to LoadOpCode: OP_ID %s unsupported" % op_id) op = op_class() @@ -175,6 +170,17 @@ class OpCode(BaseOpCode): # cluster opcodes +class OpPostInitCluster(OpCode): + """Post cluster initialization. + + This opcode does not touch the cluster at all. Its purpose is to run hooks + after the cluster has been initialized. + + """ + OP_ID = "OP_CLUSTER_POST_INIT" + __slots__ = OpCode.__slots__ + [] + + class OpDestroyCluster(OpCode): """Destroy the cluster. @@ -203,7 +209,8 @@ class OpVerifyCluster(OpCode): """ OP_ID = "OP_CLUSTER_VERIFY" - __slots__ = OpCode.__slots__ + ["skip_checks"] + __slots__ = OpCode.__slots__ + ["skip_checks", "verbose", "error_codes", + "debug_simulate_errors"] class OpVerifyDisks(OpCode): @@ -231,6 +238,26 @@ class OpVerifyDisks(OpCode): __slots__ = OpCode.__slots__ + [] +class OpRepairDiskSizes(OpCode): + """Verify the disk sizes of the instances and fixes configuration + mimatches. + + Parameters: optional instances list, in case we want to restrict the + checks to only a subset of the instances. + + Result: a list of tuples, (instance, disk, new-size) for changed + configurations. + + In normal operation, the list should be empty. + + @type instances: list + @ivar instances: the list of instances to check, or empty for all instances + + """ + OP_ID = "OP_CLUSTER_REPAIR_DISK_SIZES" + __slots__ = ["instances"] + + class OpQueryConfigValues(OpCode): """Query cluster configuration values.""" OP_ID = "OP_CLUSTER_CONFIG_QUERY" @@ -333,6 +360,39 @@ class OpQueryNodeVolumes(OpCode): __slots__ = OpCode.__slots__ + ["nodes", "output_fields"] +class OpQueryNodeStorage(OpCode): + """Get information on storage for node(s).""" + OP_ID = "OP_NODE_QUERY_STORAGE" + __slots__ = OpCode.__slots__ + [ + "nodes", + "storage_type", + "name", + "output_fields", + ] + + +class OpModifyNodeStorage(OpCode): + """""" + OP_ID = "OP_NODE_MODIFY_STORAGE" + __slots__ = OpCode.__slots__ + [ + "node_name", + "storage_type", + "name", + "changes", + ] + + +class OpRepairNodeStorage(OpCode): + """Repairs the volume group on a node.""" + OP_ID = "OP_REPAIR_NODE_STORAGE" + OP_DSC_FIELD = "node_name" + __slots__ = OpCode.__slots__ + [ + "node_name", + "storage_type", + "name", + ] + + class OpSetNodeParams(OpCode): """Change the parameters of a node.""" OP_ID = "OP_NODE_SET_PARAMS" @@ -355,6 +415,26 @@ class OpPowercycleNode(OpCode): "force", ] + +class OpEvacuateNode(OpCode): + """Relocate secondary instances from a node.""" + OP_ID = "OP_NODE_EVACUATE" + OP_DSC_FIELD = "node_name" + __slots__ = OpCode.__slots__ + [ + "node_name", "remote_node", "iallocator", + ] + + +class OpMigrateNode(OpCode): + """Migrate all instances from a node.""" + OP_ID = "OP_NODE_MIGRATE" + OP_DSC_FIELD = "node_name" + __slots__ = OpCode.__slots__ + [ + "node_name", + "live", + ] + + # instance opcodes class OpCreateInstance(OpCode): @@ -451,6 +531,21 @@ class OpMigrateInstance(OpCode): __slots__ = OpCode.__slots__ + ["instance_name", "live", "cleanup"] +class OpMoveInstance(OpCode): + """Move an instance. + + This move (with shutting down an instance and data copying) to an + arbitrary node. + + @ivar instance_name: the name of the instance + @ivar target_node: the destination node + + """ + OP_ID = "OP_INSTANCE_MOVE" + OP_DSC_FIELD = "instance_name" + __slots__ = OpCode.__slots__ + ["instance_name", "target_node"] + + class OpConnectConsole(OpCode): """Connect to an instance's console.""" OP_ID = "OP_INSTANCE_CONSOLE" @@ -462,7 +557,7 @@ class OpActivateInstanceDisks(OpCode): """Activate an instance's disks.""" OP_ID = "OP_INSTANCE_ACTIVATE_DISKS" OP_DSC_FIELD = "instance_name" - __slots__ = OpCode.__slots__ + ["instance_name"] + __slots__ = OpCode.__slots__ + ["instance_name", "ignore_size"] class OpDeactivateInstanceDisks(OpCode): @@ -472,6 +567,13 @@ class OpDeactivateInstanceDisks(OpCode): __slots__ = OpCode.__slots__ + ["instance_name"] +class OpRecreateInstanceDisks(OpCode): + """Deactivate an instance's disks.""" + OP_ID = "OP_INSTANCE_RECREATE_DISKS" + OP_DSC_FIELD = "instance_name" + __slots__ = OpCode.__slots__ + ["instance_name", "disks"] + + class OpQueryInstances(OpCode): """Compute the list of instances.""" OP_ID = "OP_INSTANCE_QUERY" @@ -604,3 +706,8 @@ class OpTestAllocator(OpCode): "mem_size", "disks", "disk_template", "os", "tags", "nics", "vcpus", "hypervisor", ] + + +OP_MAPPING = dict([(v.OP_ID, v) for v in globals().values() + if (isinstance(v, type) and issubclass(v, OpCode) and + hasattr(v, "OP_ID"))])