X-Git-Url: https://code.grnet.gr/git/ganeti-local/blobdiff_plain/fdbd668da110f477eb639bfb0e41107cf78e409d..7c0d62838c47e88e7c277414b5e7e37d7ef96505:/lib/cmdlib.py diff --git a/lib/cmdlib.py b/lib/cmdlib.py index 6bddebf..5c1be18 100644 --- a/lib/cmdlib.py +++ b/lib/cmdlib.py @@ -43,6 +43,7 @@ from ganeti import objects from ganeti import opcodes from ganeti import ssconf + class LogicalUnit(object): """Logical Unit base class. @@ -510,8 +511,8 @@ class LUInitCluster(LogicalUnit): if hostname.ip.startswith("127."): raise errors.OpPrereqError("This host's IP resolves to the private" - " range (%s). Please fix DNS or /etc/hosts." % - (hostname.ip,)) + " range (%s). Please fix DNS or %s." % + (hostname.ip, constants.ETC_HOSTS)) self.clustername = clustername = utils.HostInfo(self.op.cluster_name) @@ -632,6 +633,8 @@ class LUDestroyCluster(NoHooksLU): """ master = self.sstore.GetMasterNode() + if not rpc.call_node_stop_master(master): + raise errors.OpExecError("Could not disable the master role") priv_key, pub_key, _ = ssh.GetUserFiles(constants.GANETI_RUNAS) utils.CreateBackup(priv_key) utils.CreateBackup(pub_key) @@ -972,7 +975,7 @@ class LURenameCluster(LogicalUnit): """ env = { - "OP_TARGET": self.op.sstore.GetClusterName(), + "OP_TARGET": self.sstore.GetClusterName(), "NEW_NAME": self.op.name, } mn = self.sstore.GetMasterNode() @@ -1608,7 +1611,7 @@ class LUAddNode(LogicalUnit): dist_nodes.remove(myself.name) logger.Debug("Copying hosts and known_hosts to all nodes") - for fname in ("/etc/hosts", constants.SSH_KNOWN_HOSTS_FILE): + for fname in (constants.ETC_HOSTS, constants.SSH_KNOWN_HOSTS_FILE): result = rpc.call_upload_file(dist_nodes, fname) for to_node in dist_nodes: if not result[to_node]: @@ -2315,6 +2318,11 @@ class LURenameInstance(LogicalUnit): name_info = utils.HostInfo(self.op.new_name) self.op.new_name = new_name = name_info.name + instance_list = self.cfg.GetInstanceList() + if new_name in instance_list: + raise errors.OpPrereqError("Instance '%s' is already in the cluster" % + instance_name) + if not getattr(self.op, "ignore_ip", False): command = ["fping", "-q", name_info.ip] result = utils.RunCmd(command) @@ -2418,7 +2426,7 @@ class LUQueryInstances(NoHooksLU): This checks that the fields required are valid output fields. """ - self.dynamic_fields = frozenset(["oper_state", "oper_ram"]) + self.dynamic_fields = frozenset(["oper_state", "oper_ram", "status"]) _CheckOutputFields(static=["name", "os", "pnode", "snodes", "admin_state", "admin_ram", "disk_template", "ip", "mac", "bridge", @@ -2475,6 +2483,21 @@ class LUQueryInstances(NoHooksLU): val = None else: val = bool(live_data.get(instance.name)) + elif field == "status": + if instance.primary_node in bad_nodes: + val = "ERROR_nodedown" + else: + running = bool(live_data.get(instance.name)) + if running: + if instance.status != "down": + val = "running" + else: + val = "ERROR_up" + else: + if instance.status != "down": + val = "ERROR_down" + else: + val = "ADMIN_down" elif field == "admin_ram": val = instance.memory elif field == "oper_ram": @@ -2717,6 +2740,7 @@ def _GenerateDRBD8Branch(cfg, primary, secondary, size, names, iv_name): iv_name=iv_name) return drbd_dev + def _GenerateDiskTemplate(cfg, template_name, instance_name, primary_node, secondary_nodes, disk_sz, swap_sz): @@ -2726,9 +2750,9 @@ def _GenerateDiskTemplate(cfg, template_name, #TODO: compute space requirements vgname = cfg.GetVGName() - if template_name == "diskless": + if template_name == constants.DT_DISKLESS: disks = [] - elif template_name == "plain": + elif template_name == constants.DT_PLAIN: if len(secondary_nodes) != 0: raise errors.ProgrammerError("Wrong template configuration") @@ -2740,7 +2764,7 @@ def _GenerateDiskTemplate(cfg, template_name, logical_id=(vgname, names[1]), iv_name = "sdb") disks = [sda_dev, sdb_dev] - elif template_name == "local_raid1": + elif template_name == constants.DT_LOCAL_RAID1: if len(secondary_nodes) != 0: raise errors.ProgrammerError("Wrong template configuration") @@ -3741,7 +3765,7 @@ class LUReplaceDisks(LogicalUnit): # ok, we created the new LVs, so now we know we have the needed # storage; as such, we proceed on the target node to rename # old_lv to _old, and new_lv to old_lv; note that we rename LVs - # using the assumption than logical_id == physical_id (which in + # using the assumption that logical_id == physical_id (which in # turn is the unique_id on that node) # FIXME(iustin): use a better name for the replaced LVs @@ -4013,7 +4037,7 @@ class LUQueryInstanceData(NoHooksLU): instance = self.cfg.GetInstanceInfo(self.cfg.ExpandInstanceName(name)) if instance is None: raise errors.OpPrereqError("No such instance name '%s'" % name) - self.wanted_instances.append(instance) + self.wanted_instances.append(instance) else: self.wanted_instances = [self.cfg.GetInstanceInfo(name) for name in self.cfg.GetInstanceList()] @@ -4116,7 +4140,7 @@ class LUSetInstanceParms(LogicalUnit): args['memory'] = self.mem if self.vcpus: args['vcpus'] = self.vcpus - if self.do_ip or self.do_bridge: + if self.do_ip or self.do_bridge or self.mac: if self.do_ip: ip = self.ip else: @@ -4125,7 +4149,11 @@ class LUSetInstanceParms(LogicalUnit): bridge = self.bridge else: bridge = self.instance.nics[0].bridge - args['nics'] = [(ip, bridge)] + if self.mac: + mac = self.mac + else: + mac = self.instance.nics[0].mac + args['nics'] = [(ip, bridge, mac)] env = _BuildInstanceHookEnvByObject(self.instance, override=args) nl = [self.sstore.GetMasterNode(), self.instance.primary_node] + list(self.instance.secondary_nodes) @@ -4542,3 +4570,39 @@ class LUDelTags(TagsLU): raise errors.OpRetryError("There has been a modification to the" " config file and the operation has been" " aborted. Please retry.") + +class LUTestDelay(NoHooksLU): + """Sleep for a specified amount of time. + + This LU sleeps on the master and/or nodes for a specified amoutn of + time. + + """ + _OP_REQP = ["duration", "on_master", "on_nodes"] + + def CheckPrereq(self): + """Check prerequisites. + + This checks that we have a good list of nodes and/or the duration + is valid. + + """ + + if self.op.on_nodes: + self.op.on_nodes = _GetWantedNodes(self, self.op.on_nodes) + + def Exec(self, feedback_fn): + """Do the actual sleep. + + """ + if self.op.on_master: + if not utils.TestDelay(self.op.duration): + raise errors.OpExecError("Error during master delay test") + if self.op.on_nodes: + result = rpc.call_test_delay(self.op.on_nodes, self.op.duration) + if not result: + raise errors.OpExecError("Complete failure from rpc call") + for node, node_result in result.items(): + if not node_result: + raise errors.OpExecError("Failure during rpc call to node %s," + " result: %s" % (node, node_result))