From ab32653d0f96921ff8a57ebf96a9dce0a2b694cf Mon Sep 17 00:00:00 2001
From: smit-gardhariya <gardhariya.smit@gmail.com>
Date: Wed, 20 Nov 2024 13:58:54 +0530
Subject: [PATCH] Add support for mariner-3.0 in dom0 kernel installer

dom0 image based on mariner 3.0 has different
parameter that need to be changed while installing kernel
under different file. Add support for it under kernel
installer transformer.

Signed-off-by: Smit Gardhariya <sgardhariya@microsoft.com>
---
 lisa/transformers/dom0_kernel_installer.py | 46 +++++++++++++++++-----
 1 file changed, 37 insertions(+), 9 deletions(-)

diff --git a/lisa/transformers/dom0_kernel_installer.py b/lisa/transformers/dom0_kernel_installer.py
index 19a63c0b48..011d1f368d 100644
--- a/lisa/transformers/dom0_kernel_installer.py
+++ b/lisa/transformers/dom0_kernel_installer.py
@@ -9,6 +9,7 @@
 
 from lisa import schema
 from lisa.node import Node
+from lisa.operating_system import CBLMariner
 from lisa.tools import Cp, Echo, Ln, Ls, Sed, Tar, Uname
 from lisa.util import field_metadata
 
@@ -80,6 +81,8 @@ def install(self) -> str:
         uname = node.tools[Uname]
         current_kernel = uname.get_linux_information().kernel_version_raw
 
+        mariner_version = int(node.os.information.version.major)
+
         # Kernel absolute path: /home/user/vmlinuz-5.15.57.1+
         # Naming convention : vmlinuz-<version>
         new_kernel = os.path.basename(kernel_image_path).split("-")[1].strip()
@@ -124,10 +127,19 @@ def install(self) -> str:
                 node.get_pure_path(f"/boot/initrd.img-{new_kernel}"),
             )
         else:
+            # Mariner 3.0 initrd
+            target = f"/boot/initramfs-{current_kernel}.img"
+            link = f"/boot/initramfs-{new_kernel}.img"
+
+            if isinstance(node.os, CBLMariner) and mariner_version == 2:
+                # Mariner 2.0 initrd
+                target = f"/boot/initrd.img-{current_kernel}"
+                link = f"/boot/initrd.img-{new_kernel}"
+
             ln = node.tools[Ln]
             ln.create_link(
-                target=f"/boot/initrd.img-{current_kernel}",
-                link=f"/boot/initrd.img-{new_kernel}",
+                target=target,
+                link=link,
             )
 
         if kernel_config_path:
@@ -148,6 +160,7 @@ def install(self) -> str:
             node,
             current_kernel,
             new_kernel,
+            mariner_version,
         )
 
         return new_kernel
@@ -185,10 +198,12 @@ def install(self) -> str:
         uname = node.tools[Uname]
         current_kernel = uname.get_linux_information().kernel_version_raw
 
+        mariner_version = int(node.os.information.version.major)
         _update_mariner_config(
             node,
             current_kernel,
             new_kernel,
+            mariner_version,
         )
 
         return new_kernel
@@ -211,22 +226,35 @@ def _update_mariner_config(
     node: Node,
     current_kernel: str,
     new_kernel: str,
+    mariner_version: int,
 ) -> None:
-    mariner_config: str = "/boot/mariner-mshv.cfg"
     sed = node.tools[Sed]
 
-    # Modify the /boot/mariner-mshv.cfg to point new kernel binary
+    # Param for Dom0 3.0 kernel installation
+    mariner_config = "/boot/grub2/grub.cfg"
+    vmlinuz_regexp = f"vmlinuz-{current_kernel}"
+    vmlinuz_replacement = f"vmlinuz-{new_kernel}"
+    initrd_regexp = f"initramfs-{current_kernel}.img"
+    initrd_replacement = f"initramfs-{new_kernel}.img"
+
+    if isinstance(node.os, CBLMariner) and mariner_version == 2:
+        # Change param for Dom0 2.0 kernel installation
+        mariner_config = "/boot/mariner-mshv.cfg"
+        initrd_regexp = f"mariner_initrd_mshv=initrd.img-{current_kernel}"
+        initrd_replacement = f"mariner_initrd_mshv=initrd.img-{new_kernel}"
+
+    # Modify file to point new kernel binary
     sed.substitute(
-        regexp=f"mariner_linux_mshv=vmlinuz-{current_kernel}",
-        replacement=f"mariner_linux_mshv=vmlinuz-{new_kernel}",
+        regexp=vmlinuz_regexp,
+        replacement=vmlinuz_replacement,
         file=mariner_config,
         sudo=True,
     )
 
-    # Modify the /boot/mariner-mshv.cfg to point new initrd binary
+    # Modify file to point new initrd binary
     sed.substitute(
-        regexp=f"mariner_initrd_mshv=initrd.img-{current_kernel}",
-        replacement=f"mariner_initrd_mshv=initrd.img-{new_kernel}",
+        regexp=initrd_regexp,
+        replacement=initrd_replacement,
         file=mariner_config,
         sudo=True,
     )