Explorar el Código

Make writer key serialization/deserialization more robust.

Nashwan Azhari hace 6 años
padre
commit
4aa9815c59

+ 20 - 7
coriolis/providers/backup_writers.py

@@ -93,6 +93,24 @@ def _disable_lvm2_lvmetad(ssh):
             ssh, "sudo vgchange -an", get_pty=True)
 
 
+def _check_deserialize_key(key):
+    res = None
+    if isinstance(key, paramiko.RSAKey):
+        LOG.trace("Key is already in the proper format.")
+        res = key
+    elif type(key) is str:
+        LOG.trace("Deserializing PEM-encoded private key.")
+        res = utils.deserialize_key(
+            key, CONF.serialization.temp_keypair_password)
+    else:
+        raise exception.CoriolisException(
+            "Private key must be either a PEM-encoded string or "
+            "a paramiko.RSAKey instance. Got type '%s'." % (
+                type(key)))
+
+    return res
+
+
 class BackupWritersFactory(object):
 
     def __init__(self, writer_connection_info, volumes_info):
@@ -431,11 +449,7 @@ class SSHBackupWriter(BaseBackupWriter):
                 "Either pkey or password are required")
 
         if pkey:
-            if type(pkey) is not str:
-                raise exception.CoriolisException(
-                    "pkey must be a PEM encoded RSA private key")
-            pkey = utils.deserialize_key(
-                pkey, CONF.serialization.temp_keypair_password)
+            pkey = _check_deserialize_key(pkey)
 
         return cls(ip, port, username, pkey, password, volumes_info)
 
@@ -729,8 +743,7 @@ class HTTPBackupWriterBoostrapper(object):
             raise exception.CoriolisException(
                 "Either password or pkey are required")
         if self._pkey:
-            self._pkey = utils.deserialize_key(
-                self._pkey, CONF.serialization.temp_keypair_password)
+            self._pkey = _check_deserialize_key(self._pkey)
         self._ssh = self._connect_ssh()
 
     @utils.retry_on_error(sleep_seconds=30)

+ 2 - 0
coriolis/tasks/osmorphing_tasks.py

@@ -105,6 +105,8 @@ class DeployOSMorphingResourcesTask(base.TaskRunner):
                 "Target provider '%s' did NOT return any "
                 "'osmorphing_connection_info'." % (
                     destination["type"]))
+        osmorphing_connection_info = base.marshal_migr_conn_info(
+            osmorphing_connection_info)
 
         os_morphing_info = import_info.get("osmorphing_info", {})
         if not os_morphing_info:

+ 13 - 2
coriolis/tasks/replica_tasks.py

@@ -385,8 +385,19 @@ class DeployReplicaTargetResourcesTask(base.TaskRunner):
                     migr_connection_info, None).get_writer()
             except Exception as err:
                 LOG.warn(
-                    "Seemingly invalid connection info. Replica will likely "
-                    "fail during disk Replication. Error is: %s" % str(err))
+                    "Seemingly invalid backup writer conn info. Replica will "
+                    "likely fail during disk Replication. Error is: %s" % (
+                        str(err)))
+
+            if migr_connection_info:
+                migr_connection_info = base.marshal_migr_conn_info(
+                    migr_connection_info)
+                schemas.validate_value(
+                    migr_connection_info,
+                    schemas.CORIOLIS_DISK_SYNC_RESOURCES_CONN_INFO_SCHEMA,
+                    # NOTE: we avoid raising so that the cleanup task
+                    # can [try] to deal with the temporary resources.
+                    raise_on_error=False)
         else:
             LOG.warn(
                 "Replica target provider for '%s' did NOT return any "