VirtualMachine: Implement virtual machines using KubeVirt

Auto adds new VM into given user's Tailscale network

Change-Id: I16847a0b9eacc17b0e794d3b4913eb1d80a93f0a
diff --git a/charts/virtual-machine/Chart.yaml b/charts/virtual-machine/Chart.yaml
new file mode 100644
index 0000000..3f9d5b6
--- /dev/null
+++ b/charts/virtual-machine/Chart.yaml
@@ -0,0 +1,6 @@
+apiVersion: v2
+name: virtual-machine
+description: A Helm chart for virtual-machine
+type: application
+version: 0.0.1
+appVersion: "0.0.1"
diff --git a/charts/virtual-machine/templates/data-volume.yaml b/charts/virtual-machine/templates/data-volume.yaml
new file mode 100644
index 0000000..f9d1890
--- /dev/null
+++ b/charts/virtual-machine/templates/data-volume.yaml
@@ -0,0 +1,14 @@
+apiVersion: cdi.kubevirt.io/v1beta1
+kind: DataVolume
+metadata:
+  name: dv-{{ .Values.name }}
+spec:
+  source:
+    http:
+      url: {{ .Values.disk.source }}
+  pvc:
+    accessModes:
+      - ReadWriteOnce
+    resources:
+      requests:
+        storage: {{ .Values.disk.size }}
diff --git a/charts/virtual-machine/templates/service-code-server.yaml b/charts/virtual-machine/templates/service-code-server.yaml
new file mode 100644
index 0000000..3be8855
--- /dev/null
+++ b/charts/virtual-machine/templates/service-code-server.yaml
@@ -0,0 +1,14 @@
+# TODO(gio): enable
+# apiVersion: v1
+# kind: Service
+# metadata:
+#   name: {{ .Values.name }}-code-server
+# spec:
+#   type: ClusterIP
+#   selector:
+#     app: {{ .Values.name }}
+#   ports:
+#   - name: http
+#     port: 80
+#     targetPort: 8080 # TODO(gio): add to values.yaml
+#     protocol: TCP
diff --git a/charts/virtual-machine/templates/vm.yaml b/charts/virtual-machine/templates/vm.yaml
new file mode 100644
index 0000000..d66da80
--- /dev/null
+++ b/charts/virtual-machine/templates/vm.yaml
@@ -0,0 +1,49 @@
+apiVersion: kubevirt.io/v1
+kind: VirtualMachine
+metadata:
+  labels:
+    kubevirt.io/os: linux
+  name: {{ .Values.name }}
+spec:
+  running: true
+  template:
+    metadata:
+      creationTimestamp: null
+      labels:
+        kubevirt.io/domain: debian
+        app: {{ .Values.name }}
+    spec:
+      domain:
+        cpu:
+          cores: {{ .Values.cpuCores }}
+        resources:
+          limits:
+            memory: {{ .Values.memory }}
+        devices:
+          interfaces:
+            - name: default
+              masquerade: {}
+              ports:
+                {{- range .Values.ports }}
+                - port: {{ . }}
+                {{- end }}
+          disks:
+            - name: disk0
+              disk:
+                bus: virtio
+            - name: cloudinitdisk
+              disk:
+                bus: virtio
+                readonly: true
+      networks:
+        - name: default
+          pod: {}
+      volumes:
+        - name: disk0
+          persistentVolumeClaim:
+            claimName: dv-{{ .Values.name }}
+        - name: cloudinitdisk
+          cloudInitNoCloud:
+            userData: |
+              #cloud-config
+              {{- toYaml .Values.cloudInit.userData | nindent 14 }}
diff --git a/charts/virtual-machine/values.yaml b/charts/virtual-machine/values.yaml
new file mode 100644
index 0000000..6c8b642
--- /dev/null
+++ b/charts/virtual-machine/values.yaml
@@ -0,0 +1,9 @@
+name: ""
+cpuCores: 1
+memory: "1Gi"
+disk:
+  source: "https://cloud.debian.org/images/cloud/bookworm-backports/latest/debian-12-backports-generic-amd64.qcow2"
+  size: 64Gi
+ports: []
+cloudInit:
+  userData: {}