Add packer scripts to build mosk image

Automate steps with building image for virtual mosk deployments.

Related-Prod: PRODX-35395
Change-Id: Ideff56310d153ceb034899f2efd8995f930e65d9
diff --git a/mosk-images/Makefile b/mosk-images/Makefile
new file mode 100644
index 0000000..9ca4013
--- /dev/null
+++ b/mosk-images/Makefile
@@ -0,0 +1,12 @@
+.PHONY: build cloud-config
+default: cloud-config build
+
+all: cloud-config build
+
+build:
+	./build_image.sh
+
+clean:
+	rm -rf config-drive/cloudata.iso
+	rm -rf images
+	rm -rf packer_images_cache
diff --git a/mosk-images/build_image.sh b/mosk-images/build_image.sh
new file mode 100755
index 0000000..10450a8
--- /dev/null
+++ b/mosk-images/build_image.sh
@@ -0,0 +1,18 @@
+#!/bin/bash
+set -ex
+
+export ENVIRONMENT=${ENVIRONMENT:-'mosk-23.3'}
+
+source env/${ENVIRONMENT}.sh
+export VM_NAME=${VM_NAME:-"${ENVIRONMENT}-amd64-$(date +"%Y%m%d%H%M%S").qcow2"}
+
+export PACKER_LOG=1
+export PACKER_IMAGES_CACHE="./packer_images_cache"
+mkdir -p "${PACKER_IMAGES_CACHE}"
+
+PACKER_BINARY=${PACKER_BINARY:-"$(which packer)"}
+
+
+./config_drive.sh
+
+$PACKER_BINARY build -on-error=abort template.json
diff --git a/mosk-images/config-drive/meta-data b/mosk-images/config-drive/meta-data
new file mode 100644
index 0000000..d819e91
--- /dev/null
+++ b/mosk-images/config-drive/meta-data
@@ -0,0 +1 @@
+hostname: mosk
diff --git a/mosk-images/config-drive/user-data b/mosk-images/config-drive/user-data
new file mode 100644
index 0000000..28d97fd
--- /dev/null
+++ b/mosk-images/config-drive/user-data
@@ -0,0 +1,13 @@
+#cloud-config
+debug: True
+ssh_pwauth: True
+disable_root: false
+chpasswd:
+  list: |
+    root:r00tme
+  expire: False
+output: {all: '| tee -a /var/log/cloud-init-output.log'}
+runcmd:
+  - sed -i'.orig' -e's/\#PermitRootLogin.*/PermitRootLogin yes/g' -e's/PasswordAuthentication.*/PasswordAuthentication yes/g' /etc/ssh/sshd_config
+  - service sshd restart
+  - sed -i'.orig' -e's/PasswordAuthentication yes/PasswordAuthentication no/g' /etc/ssh/sshd_config
diff --git a/mosk-images/config_drive.sh b/mosk-images/config_drive.sh
new file mode 100755
index 0000000..9596b21
--- /dev/null
+++ b/mosk-images/config_drive.sh
@@ -0,0 +1,3 @@
+#!/bin/bash
+[ -f config-drive/cloudata.iso ] && rm -v config-drive/cloudata.iso
+mkisofs -o config-drive/cloudata.iso -V cidata -r -J --quiet config-drive
diff --git a/mosk-images/env/23.3.sh b/mosk-images/env/23.3.sh
new file mode 100644
index 0000000..7ac544d
--- /dev/null
+++ b/mosk-images/env/23.3.sh
@@ -0,0 +1,3 @@
+export IMAGE_BASE_URL="https://cloud-images.ubuntu.com/focal/20230915/focal-server-cloudimg-amd64.img"
+export IMAGE_MD5_URL="https://cloud-images.ubuntu.com/focal/20230915/MD5SUMS"
+export KERNEL_VERSION=${KERNEL_VERSION:-'5.15.0-83-generic'}
diff --git a/mosk-images/scripts/apt.sh b/mosk-images/scripts/apt.sh
new file mode 100644
index 0000000..11d52ec
--- /dev/null
+++ b/mosk-images/scripts/apt.sh
@@ -0,0 +1,9 @@
+set -ex
+
+apt update
+
+DEBIAN_FRONTEND=noninteractive apt install -y \
+    linux-headers-${KERNEL_VERSION} \
+    linux-image-${KERNEL_VERSION}
+
+echo "Kernel is installed."
diff --git a/mosk-images/scripts/cleanup.sh b/mosk-images/scripts/cleanup.sh
new file mode 100644
index 0000000..9c2c2df
--- /dev/null
+++ b/mosk-images/scripts/cleanup.sh
@@ -0,0 +1,3 @@
+set -ex
+
+echo -n "" > /etc/machine-id
diff --git a/mosk-images/template.json b/mosk-images/template.json
new file mode 100644
index 0000000..6df1ee9
--- /dev/null
+++ b/mosk-images/template.json
@@ -0,0 +1,62 @@
+{
+  "variables": {
+    "user": "root",
+    "password": "r00tme",
+    "disk_size": "2500M",
+    "images_cache": "{{ env `PACKER_IMAGES_CACHE` }}",
+    "image_base_url": "{{ env `IMAGE_BASE_URL` }}",
+    "image_md5_url": "{{ env `IMAGE_MD5_URL` }}",
+    "vm_name": "{{ env `VM_NAME` }}"
+  },
+  "provisioners": [
+    {
+      "type": "shell",
+      "scripts": [
+         "scripts/apt.sh",
+	 "scripts/cleanup.sh"
+      ]
+    }
+  ],
+  "builders": [
+    {
+      "type": "qemu",
+      "qemuargs": [
+        [
+          "-m",
+          "8096M"
+        ],
+        [
+          "-smp",
+          "4"
+        ],
+        [
+          "-cdrom",
+          "config-drive/cloudata.iso"
+        ],
+        ["-device", "virtio-net,netdev=user.0"],
+        ["-object","rng-random,id=objrng0,filename=/dev/urandom"],
+        ["-device", "virtio-rng-pci,rng=objrng0,id=rng0,bus=pci.0,addr=0x10" ]
+      ],
+      "vm_name": "{{user `vm_name`}}",
+      "output_directory": "images",
+      "disk_compression": true,
+      "disk_size": "{{ user `disk_size`}}",
+      "format": "qcow2",
+      "iso_url": "{{ user `image_base_url`}}",
+      "iso_checksum": "file:{{ user `image_md5_url`}}",
+      "iso_target_path": "{{ user `images_cache`}}",
+      "disk_image": true,
+      "accelerator": "kvm",
+      "headless": true,
+      "ssh_username": "{{user `user`}}",
+      "ssh_password": "{{user `password`}}",
+      "ssh_host_port_min": 7000,
+      "ssh_host_port_max": 7050,
+      "vnc_port_max": "5956",
+      "vnc_port_min": "5956",
+      "shutdown_command": "shutdown -P now",
+      "boot_wait": "10s",
+      "ssh_wait_timeout": "360s"
+    }
+  ]
+}