def BurnFailover(self): """Failover the instances.""" Log("Failing over instances") for instance in self.instances: Log("instance %s", instance, indent=1) op = opcodes.OpInstanceFailover(instance_name=instance, ignore_consistency=False) self.ExecOrQueue(instance, [op])
def FailoverNode(opts, args): """Failover all primary instance on a node. @param opts: the command line options selected by the user @type args: list @param args: should be an empty list @rtype: int @return: the desired exit code """ cl = GetClient() force = opts.force selected_fields = ["name", "pinst_list"] # these fields are static data anyway, so it doesn't matter, but # locking=True should be safer qcl = GetClient() result = qcl.QueryNodes(names=args, fields=selected_fields, use_locking=False) qcl.Close() node, pinst = result[0] if not pinst: ToStderr("No primary instances on node %s, exiting.", node) return 0 pinst = utils.NiceSort(pinst) retcode = 0 if not force and not AskUser("Fail over instance(s) %s?" % (",".join("'%s'" % name for name in pinst))): return 2 jex = JobExecutor(cl=cl, opts=opts) for iname in pinst: op = opcodes.OpInstanceFailover( instance_name=iname, ignore_consistency=opts.ignore_consistency, iallocator=opts.iallocator) jex.QueueJob(iname, op) results = jex.GetResults() bad_cnt = len([row for row in results if not row[0]]) if bad_cnt == 0: ToStdout("All %d instance(s) failed over successfully.", len(results)) else: ToStdout( "There were errors during the failover:\n" "%d error(s) out of %d instance(s).", bad_cnt, len(results)) return retcode
def _MigrateToFailover(op): """Return an equivalent failover opcode for a migrate one. If the argument is not a failover opcode, return it unchanged. """ if not isinstance(op, opcodes.OpInstanceMigrate): return op else: return opcodes.OpInstanceFailover( instance_name=op.instance_name, instance_uuid=getattr(op, "instance_uuid", None), target_node=getattr(op, "target_node", None), target_node_uuid=getattr(op, "target_node_uuid", None), ignore_ipolicy=op.ignore_ipolicy, cleanup=op.cleanup)
def setUp(self): super(TestLUInstanceFailover, self).setUp() self.snode = self.cfg.AddNewNode() hv_info = ("bootid", [{ "type": constants.ST_LVM_VG, "storage_free": 10000 }], ({"memory_free": 10000}, )) self.rpc.call_node_info.return_value = \ self.RpcResultsBuilder() \ .AddSuccessfulNode(self.master, hv_info) \ .AddSuccessfulNode(self.snode, hv_info) \ .Build() self.rpc.call_blockdev_find.return_value = \ self.RpcResultsBuilder() \ .CreateSuccessfulNodeResult(self.master, objects.BlockDevStatus()) self.rpc.call_instance_shutdown.return_value = \ self.RpcResultsBuilder() \ .CreateSuccessfulNodeResult(self.master, True) self.rpc.call_blockdev_shutdown.return_value = \ self.RpcResultsBuilder() \ .CreateSuccessfulNodeResult(self.master, True) self.rpc.call_blockdev_assemble.return_value = \ self.RpcResultsBuilder() \ .CreateSuccessfulNodeResult(self.snode, ("/dev/mock", "/var/mock", None)) self.rpc.call_instance_start.return_value = \ self.RpcResultsBuilder() \ .CreateSuccessfulNodeResult(self.snode, True) self.inst = self.cfg.AddNewInstance(disk_template=constants.DT_DRBD8, admin_state=constants.ADMINST_UP, secondary_node=self.snode) self.op = opcodes.OpInstanceFailover(instance_name=self.inst.name)