X-Git-Url: https://code.grnet.gr/git/ganeti-local/blobdiff_plain/8e29563fca5baf493b0c2fd107f1db14fe35193d..69750d444a602b7643858086fd3f80e1fc604948:/lib/rpc.py diff --git a/lib/rpc.py b/lib/rpc.py index 37e8c4e..f64848b 100644 --- a/lib/rpc.py +++ b/lib/rpc.py @@ -44,6 +44,7 @@ from ganeti import serializer from ganeti import constants from ganeti import errors from ganeti import netutils +from ganeti import ssconf # pylint has a bug here, doesn't see this import import ganeti.http.client # pylint: disable-msg=W0611 @@ -257,6 +258,35 @@ class RpcResult(object): raise ec(*args) # pylint: disable-msg=W0142 +def _AddressLookup(node_list, + ssc=ssconf.SimpleStore, + nslookup_fn=netutils.Hostname.GetIP): + """Return addresses for given node names. + + @type node_list: list + @param node_list: List of node names + @type ssc: class + @param ssc: SimpleStore class that is used to obtain node->ip mappings + @type nslookup_fn: callable + @param nslookup_fn: function use to do NS lookup + @rtype: list of addresses and/or None's + @returns: List of corresponding addresses, if found + + """ + ss = ssc() + iplist = ss.GetNodePrimaryIPList() + family = ss.GetPrimaryIPFamily() + addresses = [] + ipmap = dict(entry.split() for entry in iplist) + for node in node_list: + address = ipmap.get(node) + if address is None: + address = nslookup_fn(node, family=family) + addresses.append(address) + + return addresses + + class Client: """RPC Client class. @@ -269,13 +299,14 @@ class Client: cause bugs. """ - def __init__(self, procedure, body, port): + def __init__(self, procedure, body, port, address_lookup_fn=_AddressLookup): assert procedure in _TIMEOUTS, ("New RPC call not declared in the" " timeouts table") self.procedure = procedure self.body = body self.port = port self._request = {} + self._address_lookup_fn = address_lookup_fn def ConnectList(self, node_list, address_list=None, read_timeout=None): """Add a list of nodes to the target nodes. @@ -286,15 +317,16 @@ class Client: @keyword address_list: either None or a list with node addresses, which must have the same length as the node list @type read_timeout: int - @param read_timeout: overwrites the default read timeout for the - given operation + @param read_timeout: overwrites default timeout for operation """ if address_list is None: - address_list = [None for _ in node_list] - else: - assert len(node_list) == len(address_list), \ - "Name and address lists should have the same length" + # Always use IP address instead of node name + address_list = self._address_lookup_fn(node_list) + + assert len(node_list) == len(address_list), \ + "Name and address lists must have the same length" + for node, address in zip(node_list, address_list): self.ConnectNode(node, address, read_timeout=read_timeout) @@ -304,11 +336,16 @@ class Client: @type name: str @param name: the node name @type address: str - @keyword address: the node address, if known + @param address: the node address, if known + @type read_timeout: int + @param read_timeout: overwrites default timeout for operation """ if address is None: - address = name + # Always use IP address instead of node name + address = self._address_lookup_fn([name])[0] + + assert(address is not None) if read_timeout is None: read_timeout = _TIMEOUTS[self.procedure] @@ -838,14 +875,20 @@ class RpcRunner(object): [vg_name, hypervisor_type]) @_RpcTimeout(_TMO_NORMAL) - def call_node_add(self, node, dsa, dsapub, rsa, rsapub, ssh, sshpub): - """Add a node to the cluster. + def call_etc_hosts_modify(self, node, mode, name, ip): + """Modify hosts file with name - This is a single-node call. + @type node: string + @param node: The node to call + @type mode: string + @param mode: The mode to operate. Currently "add" or "remove" + @type name: string + @param name: The host name to be modified + @type ip: string + @param ip: The ip of the entry (just valid if mode is "add") """ - return self._SingleNodeCall(node, "node_add", - [dsa, dsapub, rsa, rsapub, ssh, sshpub]) + return self._SingleNodeCall(node, "etc_hosts_modify", [mode, name, ip]) @_RpcTimeout(_TMO_NORMAL) def call_node_verify(self, node_list, checkdict, cluster_name):