Don't remove master's hostname from /etc/hosts on cluster destroy.
[ganeti-local] / lib / rpc.py
index 9582abd..e3e5a73 100644 (file)
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#
 #
 
 # Copyright (C) 2006, 2007 Google Inc.
@@ -187,7 +187,7 @@ class MirrorContextFactory:
 class Client:
   """RPC Client class.
 
-  This class, given a (remote) ethod name, a list of parameters and a
+  This class, given a (remote) method name, a list of parameters and a
   list of nodes, will contact (in parallel) all nodes, and return a
   dict of results (key: node name, value: result).
 
@@ -288,7 +288,7 @@ def call_bridges_exist(node, bridges_list):
 
 
 def call_instance_start(node, instance, extra_args):
-  """Stars an instance.
+  """Starts an instance.
 
   This is a single-node call.
 
@@ -311,6 +311,18 @@ def call_instance_shutdown(node, instance):
   return c.getresult().get(node, False)
 
 
+def call_instance_reboot(node, instance, reboot_type, extra_args):
+  """Reboots an instance.
+
+  This is a single-node call.
+
+  """
+  c = Client("instance_reboot", [instance.ToDict(), reboot_type, extra_args])
+  c.connect(node)
+  c.run()
+  return c.getresult().get(node, False)
+
+
 def call_instance_os_add(node, inst, osdev, swapdev):
   """Installs an OS on the given instance.
 
@@ -373,6 +385,18 @@ def call_instance_list(node_list):
   return c.getresult()
 
 
+def call_node_tcp_ping(node, source, target, port, timeout, live_port_needed):
+  """Do a TcpPing on the remote node
+
+  This is a single-node call.
+  """
+  c = Client("node_tcp_ping", [source, target, port, timeout,
+                               live_port_needed])
+  c.connect(node)
+  c.run()
+  return c.getresult().get(node, False)
+
+
 def call_node_info(node_list, vg_name):
   """Return node information.
 
@@ -465,13 +489,13 @@ def call_version(node_list):
   return c.getresult()
 
 
-def call_blockdev_create(node, bdev, size, on_primary, info):
+def call_blockdev_create(node, bdev, size, owner, on_primary, info):
   """Request creation of a given block device.
 
   This is a single-node call.
 
   """
-  params = [bdev.ToDict(), size, on_primary, info]
+  params = [bdev.ToDict(), size, owner, on_primary, info]
   c = Client("blockdev_create", params)
   c.connect(node)
   c.run()
@@ -490,13 +514,26 @@ def call_blockdev_remove(node, bdev):
   return c.getresult().get(node, False)
 
 
-def call_blockdev_assemble(node, disk, on_primary):
+def call_blockdev_rename(node, devlist):
+  """Request rename of the given block devices.
+
+  This is a single-node call.
+
+  """
+  params = [(d.ToDict(), uid) for d, uid in devlist]
+  c = Client("blockdev_rename", params)
+  c.connect(node)
+  c.run()
+  return c.getresult().get(node, False)
+
+
+def call_blockdev_assemble(node, disk, owner, on_primary):
   """Request assembling of a given block device.
 
   This is a single-node call.
 
   """
-  params = [disk.ToDict(), on_primary]
+  params = [disk.ToDict(), owner, on_primary]
   c = Client("blockdev_assemble", params)
   c.connect(node)
   c.run()
@@ -515,27 +552,27 @@ def call_blockdev_shutdown(node, disk):
   return c.getresult().get(node, False)
 
 
-def call_blockdev_addchild(node, bdev, ndev):
-  """Request adding a new child to a (mirroring) device.
+def call_blockdev_addchildren(node, bdev, ndevs):
+  """Request adding a list of children to a (mirroring) device.
 
   This is a single-node call.
 
   """
-  params = [bdev.ToDict(), ndev.ToDict()]
-  c = Client("blockdev_addchild", params)
+  params = [bdev.ToDict(), [disk.ToDict() for disk in ndevs]]
+  c = Client("blockdev_addchildren", params)
   c.connect(node)
   c.run()
   return c.getresult().get(node, False)
 
 
-def call_blockdev_removechild(node, bdev, ndev):
-  """Request removing a new child from a (mirroring) device.
+def call_blockdev_removechildren(node, bdev, ndevs):
+  """Request removing a list of children from a (mirroring) device.
 
   This is a single-node call.
 
   """
-  params = [bdev.ToDict(), ndev.ToDict()]
-  c = Client("blockdev_removechild", params)
+  params = [bdev.ToDict(), [disk.ToDict() for disk in ndevs]]
+  c = Client("blockdev_removechildren", params)
   c.connect(node)
   c.run()
   return c.getresult().get(node, False)
@@ -601,41 +638,28 @@ def call_os_diagnose(node_list):
   result = c.getresult()
   new_result = {}
   for node_name in result:
-    nr = []
     if result[node_name]:
-      for data in result[node_name]:
-        if data:
-          if isinstance(data, dict):
-            nr.append(objects.OS.FromDict(data))
-          elif isinstance(data, tuple) and len(data) == 2:
-            nr.append(errors.InvalidOS(data[0], data[1]))
-          else:
-            raise errors.ProgrammerError("Invalid data from"
-                                         " xcserver.os_diagnose")
+      nr = [objects.OS.FromDict(oss) for oss in result[node_name]]
+    else:
+      nr = []
     new_result[node_name] = nr
   return new_result
 
 
-def call_os_get(node_list, name):
+def call_os_get(node, name):
   """Returns an OS definition.
 
-  This is a multi-node call.
+  This is a single-node call.
 
   """
   c = Client("os_get", [name])
-  c.connect_list(node_list)
+  c.connect(node)
   c.run()
-  result = c.getresult()
-  new_result = {}
-  for node_name in result:
-    data = result[node_name]
-    if isinstance(data, dict):
-      new_result[node_name] = objects.OS.FromDict(data)
-    elif isinstance(data, tuple) and len(data) == 2:
-      new_result[node_name] = errors.InvalidOS(data[0], data[1])
-    else:
-      new_result[node_name] = data
-  return new_result
+  result = c.getresult().get(node, False)
+  if isinstance(result, dict):
+    return objects.OS.FromDict(result)
+  else:
+    return result
 
 
 def call_hooks_runner(node_list, hpath, phase, env):