From ba5619c2eaa7a8c0f874a9689ccc0380791bc8de Mon Sep 17 00:00:00 2001
From: Michael Hanselmann <hansmi@google.com>
Date: Thu, 25 Nov 2010 18:21:40 +0100
Subject: [PATCH] Use IPv6 for import/export

Signed-off-by: Michael Hanselmann <hansmi@google.com>
Reviewed-by: Iustin Pop <iustin@google.com>
---
 lib/cmdlib.py           |  9 +++++----
 lib/masterd/instance.py | 24 +++++++++++++++++++-----
 2 files changed, 24 insertions(+), 9 deletions(-)

diff --git a/lib/cmdlib.py b/lib/cmdlib.py
index 2ebf5fa94..1fd50ef77 100644
--- a/lib/cmdlib.py
+++ b/lib/cmdlib.py
@@ -7802,9 +7802,11 @@ class LUCreateInstance(LogicalUnit):
         connect_timeout = constants.RIE_CONNECT_TIMEOUT
         timeouts = masterd.instance.ImportExportTimeouts(connect_timeout)
 
-        disk_results = masterd.instance.RemoteImport(self, feedback_fn, iobj,
-                                                     self.source_x509_ca,
-                                                     self._cds, timeouts)
+        assert iobj.primary_node == self.pnode.name
+        disk_results = \
+          masterd.instance.RemoteImport(self, feedback_fn, iobj, self.pnode,
+                                        self.source_x509_ca,
+                                        self._cds, timeouts)
         if not compat.all(disk_results):
           # TODO: Should the instance still be started, even if some disks
           # failed to import (valid for local imports, too)?
@@ -9551,7 +9553,6 @@ class LUSetInstanceParams(LogicalUnit):
         self.LogWarning("Could not remove metadata for disk %d on node %s,"
                         " continuing anyway: %s", idx, pnode, msg)
 
-
   def Exec(self, feedback_fn):
     """Modifies an instance.
 
diff --git a/lib/masterd/instance.py b/lib/masterd/instance.py
index e2577c11f..f09763956 100644
--- a/lib/masterd/instance.py
+++ b/lib/masterd/instance.py
@@ -1270,9 +1270,12 @@ class ExportInstanceHelper:
     try:
       for idx, (dev, (host, port, magic)) in enumerate(zip(instance.disks,
                                                            disk_info)):
+        # Decide whether to use IPv6
+        ipv6 = netutils.IP6Address.IsValid(host)
+
         opts = objects.ImportExportOptions(key_name=key_name,
                                            ca_pem=dest_ca_pem,
-                                           magic=magic)
+                                           magic=magic, ipv6=ipv6)
 
         self._feedback_fn("Sending disk %s to %s:%s" % (idx, host, port))
         finished_fn = compat.partial(self._TransferFinished, idx)
@@ -1404,13 +1407,16 @@ class _RemoteImportCb(ImportExportCbBase):
     self._dresults[idx] = bool(ie.success)
 
 
-def RemoteImport(lu, feedback_fn, instance, source_x509_ca, cds, timeouts):
+def RemoteImport(lu, feedback_fn, instance, pnode, source_x509_ca,
+                 cds, timeouts):
   """Imports an instance from another cluster.
 
   @param lu: Logical unit instance
   @param feedback_fn: Feedback function
   @type instance: L{objects.Instance}
   @param instance: Instance object
+  @type pnode: L{objects.Node}
+  @param pnode: Primary node of instance as an object
   @type source_x509_ca: OpenSSL.crypto.X509
   @param source_x509_ca: Import source's X509 CA
   @type cds: string
@@ -1424,6 +1430,9 @@ def RemoteImport(lu, feedback_fn, instance, source_x509_ca, cds, timeouts):
 
   magic_base = utils.GenerateSecret(6)
 
+  # Decide whether to use IPv6
+  ipv6 = netutils.IP6Address.IsValid(pnode.primary_ip)
+
   # Create crypto key
   result = lu.rpc.call_x509_cert_create(instance.primary_node,
                                         constants.RIE_CERT_VALIDITY)
@@ -1440,7 +1449,7 @@ def RemoteImport(lu, feedback_fn, instance, source_x509_ca, cds, timeouts):
       utils.SignX509Certificate(x509_cert, cds, utils.GenerateSecret(8))
 
     cbs = _RemoteImportCb(feedback_fn, cds, signed_x509_cert_pem,
-                          len(instance.disks), instance.primary_node)
+                          len(instance.disks), pnode.primary_ip)
 
     ieloop = ImportExportLoop(lu)
     try:
@@ -1450,7 +1459,7 @@ def RemoteImport(lu, feedback_fn, instance, source_x509_ca, cds, timeouts):
         # Import daemon options
         opts = objects.ImportExportOptions(key_name=x509_key_name,
                                            ca_pem=source_ca_pem,
-                                           magic=magic)
+                                           magic=magic, ipv6=ipv6)
 
         ieloop.Add(DiskImport(lu, instance.primary_node, opts, instance,
                               constants.IEIO_SCRIPT, (dev, idx),
@@ -1554,7 +1563,12 @@ def CheckRemoteExportDiskInfo(cds, disk_index, disk_info):
   if not utils.VerifySha1Hmac(cds, msg, hmac_digest, salt=hmac_salt):
     raise errors.GenericError("HMAC is wrong")
 
-  return (netutils.Hostname.GetNormalizedName(host),
+  if netutils.IP6Address.IsValid(host) or netutils.IP4Address.IsValid(host):
+    destination = host
+  else:
+    destination = netutils.Hostname.GetNormalizedName(host)
+
+  return (destination,
           utils.ValidateServiceName(port),
           magic)
 
-- 
GitLab