Просмотр исходного кода

Adds method to reconfigure cloud-init so it will retain original user credentials

Daniel Vincze 5 лет назад
Родитель
Сommit
54e8ae098b

+ 39 - 4
coriolis/osmorphing/base.py

@@ -9,10 +9,10 @@ import uuid
 
 from oslo_log import log as logging
 from six import with_metaclass
+import yaml
 
 from coriolis import exception
 from coriolis import utils
-from coriolis.osmorphing.osdetect import base as base_os_detect
 
 
 LOG = logging.getLogger(__name__)
@@ -28,7 +28,7 @@ class BaseOSMorphingTools(object, with_metaclass(abc.ABCMeta)):
 
     def __init__(
             self, conn, os_root_dir, os_root_device, hypervisor,
-            event_manager, detected_os_info):
+            event_manager, detected_os_info, osmorphing_parameters):
 
         self.check_detected_os_info_parameters(detected_os_info)
 
@@ -41,6 +41,7 @@ class BaseOSMorphingTools(object, with_metaclass(abc.ABCMeta)):
         self._event_manager = event_manager
         self._detected_os_info = detected_os_info
         self._environment = {}
+        self._osmorphing_parameters = osmorphing_parameters
 
     @abc.abstractclassmethod
     def get_required_detected_os_info_fields(cls):
@@ -119,10 +120,10 @@ class BaseLinuxOSMorphingTools(BaseOSMorphingTools):
     _packages = {}
 
     def __init__(self, conn, os_root_dir, os_root_dev, hypervisor,
-                 event_manager, detected_os_info):
+                 event_manager, detected_os_info, osmorphing_parameters):
         super(BaseLinuxOSMorphingTools, self).__init__(
             conn, os_root_dir, os_root_dev, hypervisor, event_manager,
-            detected_os_info)
+            detected_os_info, osmorphing_parameters)
         self._ssh = conn
 
     @classmethod
@@ -342,3 +343,37 @@ class BaseLinuxOSMorphingTools(BaseOSMorphingTools):
                 "touch /.autorelabel")
         except Exception as err:
             LOG.warning("Failed to set autorelabel: %r" % err)
+
+    def _configure_cloud_init_user_retention(self):
+        cloud_cfg_paths = ["/etc/cloud/cloud.cfg"]
+        cloud_cfgs_dir = "/etc/cloud/cloud.cfg.d"
+        if self._test_path(cloud_cfgs_dir):
+            for path in self._exec_cmd_chroot(
+                    'ls -1 %s' % cloud_cfgs_dir).decode().splitlines():
+                if path.endswith('.cfg'):
+                    cloud_cfg_paths.append("%s/%s" % (cloud_cfgs_dir, path))
+
+        self._event_manager.progress_update(
+            "Reconfiguring cloud-init to retain original user credentials")
+        for cloud_cfg_path in cloud_cfg_paths:
+            if not self._test_path(cloud_cfg_path):
+                LOG.warn("Could not find %s. Skipping reconfiguration." % (
+                    cloud_cfg_path))
+                continue
+
+            try:
+                self._exec_cmd_chroot(
+                    "cp %s %s.bak" % (cloud_cfg_path, cloud_cfg_path))
+
+                cloud_cfg = yaml.load(self._read_file(cloud_cfg_path),
+                                      Loader=yaml.SafeLoader)
+
+                cloud_cfg['disable_root'] = False
+                cloud_cfg['ssh_pwauth'] = True
+                cloud_cfg['users'] = None
+                new_cloud_cfg = yaml.dump(cloud_cfg)
+                self._write_file_sudo(cloud_cfg_path, new_cloud_cfg)
+            except Exception as err:
+                raise exception.CoriolisException(
+                    "Failed to reconfigure cloud-init to retain user "
+                    "credentials. Error was: %s" % str(err)) from err

+ 3 - 2
coriolis/osmorphing/manager.py

@@ -159,6 +159,7 @@ def morph_image(origin_provider, destination_provider, connection_info,
     # - automatically detect the target hypervisor type from the worker VM
     hypervisor_type = osmorphing_info.get(
         'hypervisor_type', None)
+    osmorphing_parameters = osmorphing_info.get('osmorphing_parameters', {})
 
     export_os_morphing_tools = None
     try:
@@ -171,7 +172,7 @@ def morph_image(origin_provider, destination_provider, connection_info,
                 type(origin_provider))
             export_os_morphing_tools = export_tools_cls(
                 conn, os_root_dir, os_root_dev, hypervisor_type,
-                event_manager, detected_os_info)
+                event_manager, detected_os_info, osmorphing_parameters)
             export_os_morphing_tools.set_environment(environment)
         else:
             LOG.debug(
@@ -194,7 +195,7 @@ def morph_image(origin_provider, destination_provider, connection_info,
 
     import_os_morphing_tools = import_os_morphing_tools_cls(
         conn, os_root_dir, os_root_dev, hypervisor_type,
-        event_manager, detected_os_info)
+        event_manager, detected_os_info, osmorphing_parameters)
     import_os_morphing_tools.set_environment(environment)
 
     if user_script:

+ 3 - 2
coriolis/osmorphing/redhat.py

@@ -52,10 +52,11 @@ class BaseRedHatMorphingTools(base.BaseLinuxOSMorphingTools):
             detected_os_info['release_version'], minimum=6)
 
     def __init__(self, conn, os_root_dir, os_root_dev,
-                 hypervisor, event_manager, detected_os_info):
+                 hypervisor, event_manager, detected_os_info,
+                 osmorphing_parameters):
         super(BaseRedHatMorphingTools, self).__init__(
             conn, os_root_dir, os_root_dev,
-            hypervisor, event_manager, detected_os_info)
+            hypervisor, event_manager, detected_os_info, osmorphing_parameters)
         self._enable_repos = []
 
     def disable_predictable_nic_names(self):

+ 2 - 2
coriolis/osmorphing/windows.py

@@ -86,10 +86,10 @@ class BaseWindowsMorphingTools(base.BaseOSMorphingTools):
 
     def __init__(
             self, conn, os_root_dir, os_root_device, hypervisor,
-            event_manager, detected_os_info):
+            event_manager, detected_os_info, osmorphing_parameters):
         super(BaseWindowsMorphingTools, self).__init__(
             conn, os_root_dir, os_root_device, hypervisor,
-            event_manager, detected_os_info)
+            event_manager, detected_os_info, osmorphing_parameters)
 
         self._version_number = detected_os_info['version_number']
         self._edition_id = detected_os_info['edition_id']

+ 9 - 0
coriolis/schemas/os_morphing_resources_schema.json

@@ -50,6 +50,15 @@
           "items": {
             "type": "string"
           }
+        },
+        "osmorphing_parameters": {
+          "type": "object",
+          "properties": {
+            "retain_user_credentials": {
+              "type": "boolean",
+              "default": false
+            }
+          }
         }
       },
       "required": ["os_type"],