# Create a VM for the Controller

In this document, I show how to provition an Ubuntu 20.04.5 Server virtual machine instance for a CHI controller node. Make sure the VM gets at least 32GB RAM and 40GB storage with 8 CPUs.

1. Install necessary packages and perform checks

   ```
   $ sudo apt install cpu-checker
   $ sudo apt update
   $ sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virtinst
   $ sudo adduser 'expeca' libvirt
   $ sudo adduser 'expeca' kvm
   $ virsh list --all
   $ sudo systemctl status libvirtd

   ```
2. Download OS image

   ```
   $ cd /var/lib/libvirt/boot/
   $ sudo wget https://releases.ubuntu.com/focal/ubuntu-20.04.5-live-server-amd64.iso
   ```
3. Create the network bridges

   Assume `eno8303` interface is reserved for management purposes. Interfaces `ens1f0` and `ens1f1` will be used for Openstack's internal and public networks respectively. Therefore, 3 bridges are needed for a VM: ssh, private network, and public network. Replace the contents of `/etc/netplan/00-installer-config.yaml` with the following

   ```
   network:
     ethernets:
       eno8303:
         dhcp4: false
         dhcp6: false
       ens1f0:
         dhcp4: false
         dhcp6: false
       ens1f1:
         dhcp4: false
         dhcp6: false
     version: 2

     bridges:
       mgmt-br:
         interfaces: [eno8303]
         addresses: [10.10.2.3/16]
         gateway4: 10.10.1.1
         nameservers:
           search:
           - expeca
           addresses:
           - 10.10.1.1
       internal-br:
         interfaces: [ens1f0]
         addresses: [10.20.111.10/23]
       public-br:
         interfaces: [ens1f1]
         addresses: [10.0.87.10/24]
   ```

   and apply the configuration using `sudo netplan generate && sudo netplan apply`
4. Install the virtual machine

   ```
   $ virt-install \
   --name edge-vm1 \
   --ram 32000 \
   --disk path=/var/lib/libvirt/images/vm1.img,size=40 \
   --vcpus 8 \
   --os-variant ubuntu20.04 \
   --network bridge=mgmt-br \
   --network bridge=public-br \
   --network bridge=internal-br \
   --graphics none \
   --console pty,target_type=serial \
   --location /var/lib/libvirt/boot/ubuntu-20.04.5-live-server-amd64.iso,kernel=casper/vmlinuz,initrd=casper/initrd \
   --extra-args 'console=ttyS0,115200n8 serial'
   ```

   During installation

   ```
   partitioning: Use entire disk
   machine-name: edge-vm1
   username: expeca
   pass: expeca
   packages: install openssh-server
   ```

   If encountered `[FAILED] Failed unmounting /cdrom.` just press CTRL+C and continue.

   Once the VM is up and running, the mgmt network interface must be setup to enable ssh access.
5. Configure the VM to autostart again after host reboot

   ```
   $ sudo virsh autostart <vm_name>

   ```

* How to completely remove a VM

  ```
  $ virsh destroy <vm_name>
  $ virsh snapshot-delete <vm_name> <snapshot_name>
  $ virsh undefine <vm_name> --remove-all-storage
  $ sudo rm /var/lib/libvirt/images/vm1.img
  ```
* How to take a snapshot

  ```
  $ virsh snapshot-create-as --domain edge-vm1 \
  --name "edge_controller_clean" \
  --description "Network interfaces ready to start chi-in-a-box"
  ```
* How to revert back to a snapshot

  ```
  virsh snapshot-revert edge-vm1 edge_controller_clean
  ```
* How to fix the VM's clock after reverting

  ```
  sudo hwclock --hctosys
  ```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://kth-expeca.gitbook.io/testbedconfig/miscellaneous/create-controller-vm.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
