Bug 2109. Fix VIM info DB update after vertical scaling, migrate and operate
[osm/RO.git] / RO-plugin / osm_ro_plugin / vimconn.py
index f526aef..66fe190 100644 (file)
@@ -123,12 +123,19 @@ class VimConnNotSupportedException(VimConnException):
 
 
 class VimConnNotImplemented(VimConnException):
-    """The method is not implemented by the connected"""
+    """The method is not implemented by the connector"""
 
     def __init__(self, message, http_code=HTTP_Not_Implemented):
         VimConnException.__init__(self, message, http_code)
 
 
+class VimConnInsufficientCredentials(VimConnException):
+    """The VIM account does not have efficient permissions to perform the requested operation."""
+
+    def __init__(self, message, http_code=HTTP_Unauthorized):
+        VimConnException.__init__(self, message, http_code)
+
+
 class VimConnector:
     """Abstract base class for all the VIM connector plugins
     These plugins must implement a VimConnector class derived from this
@@ -293,13 +300,32 @@ class VimConnector:
         userdata = None
         userdata_list = []
 
+        # For more information, check https://cloudinit.readthedocs.io/en/latest/reference/merging.html
+        # Basically, with this, we don't override the provider's cloud config
+        merge_how = yaml.safe_dump(
+            {
+                "merge_how": [
+                    {
+                        "name": "list",
+                        "settings": ["append", "recurse_dict", "recurse_list"],
+                    },
+                    {
+                        "name": "dict",
+                        "settings": ["no_replace", "recurse_list", "recurse_dict"],
+                    },
+                ]
+            },
+            indent=4,
+            default_flow_style=False,
+        )
+
         if isinstance(cloud_config, dict):
             if cloud_config.get("user-data"):
                 if isinstance(cloud_config["user-data"], str):
-                    userdata_list.append(cloud_config["user-data"])
+                    userdata_list.append(cloud_config["user-data"] + f"\n{merge_how}")
                 else:
                     for u in cloud_config["user-data"]:
-                        userdata_list.append(u)
+                        userdata_list.append(u + f"\n{merge_how}")
 
             if cloud_config.get("boot-data-drive") is not None:
                 config_drive = cloud_config["boot-data-drive"]
@@ -314,12 +340,12 @@ class VimConnector:
                 # default user
                 if cloud_config.get("key-pairs"):
                     userdata_dict["ssh-authorized-keys"] = cloud_config["key-pairs"]
-                    userdata_dict["users"] = [
-                        {
-                            "default": None,
-                            "ssh-authorized-keys": cloud_config["key-pairs"],
+                    userdata_dict["system_info"] = {
+                        "default_user": {
+                            "ssh_authorized_keys": cloud_config["key-pairs"],
                         }
-                    ]
+                    }
+                    userdata_dict["users"] = ["default"]
 
                 if cloud_config.get("users"):
                     if "users" not in userdata_dict:
@@ -358,6 +384,7 @@ class VimConnector:
                 userdata_list.append(
                     "#cloud-config\n"
                     + yaml.safe_dump(userdata_dict, indent=4, default_flow_style=False)
+                    + f"\n{merge_how}"
                 )
             userdata = self._create_mimemultipart(userdata_list)
             self.logger.debug("userdata: %s", userdata)