Deploying a VM

Table of Contents


Introduction

We present information on how to deploy a VM with the Javascript client with concrete examples.

Example

import { DiskModel, FilterOptions, MachineModel, MachinesModel, NetworkModel } from "../src";
import { config, getClient } from "./client_loader";
import { log } from "./utils";

async function main() {
    const grid3 = await getClient();

    // create network Object
    const n = new NetworkModel();
    n.name = "dynamictest";
    n.ip_range = "10.249.0.0/16";

    // create disk Object
    const disk = new DiskModel();
    disk.name = "dynamicDisk";
    disk.size = 8;
    disk.mountpoint = "/testdisk";

    const vmQueryOptions: FilterOptions = {
        cru: 1,
        mru: 1, // GB
        sru: 1,
        availableFor: grid3.twinId,
        country: "Belgium",
    };

    // create vm node Object
    const vm = new MachineModel();
    vm.name = "testvm";
    vm.node_id = +(await grid3.capacity.filterNodes(vmQueryOptions))[0].nodeId; // TODO: allow random choice
    vm.disks = [disk];
    vm.public_ip = false;
    vm.planetary = true;
    vm.cpu = 1;
    vm.memory = 1024;
    vm.rootfs_size = 0;
    vm.flist = "https://hub.grid.tf/tf-official-apps/base:latest.flist";
    vm.entrypoint = "/sbin/zinit init";
    vm.env = {
        SSH_KEY: config.ssh_key,
    };

    // create VMs Object
    const vms = new MachinesModel();
    vms.name = "dynamicVMS";
    vms.network = n;
    vms.machines = [vm];
    vms.metadata = "{'testVMs': true}";
    vms.description = "test deploying VMs via ts grid3 client";

    // deploy vms
    const res = await grid3.machines.deploy(vms);
    log(res);

    // get the deployment
    const l = await grid3.machines.getObj(vms.name);
    log(l);

    // // delete
    // const d = await grid3.machines.delete({ name: vms.name });
    // log(d);

    await grid3.disconnect();
}

main();

Detailed Explanation

Building Network

// create network Object
const n = new NetworkModel();
n.name = "dynamictest";
n.ip_range = "10.249.0.0/16";

Here we prepare the network model that is going to be used by specifying a name to our network and the range it will be spanning over

Building the Disk Model

// create disk Object
const disk = new DiskModel();
disk.name = "dynamicDisk";
disk.size = 8;
disk.mountpoint = "/testdisk";

here we create the disk model specifying its name, size in GB and where it will be mounted eventually

Building the VM

// create vm node Object
const vm = new MachineModel();
vm.name = "testvm";
vm.node_id = +(await grid3.capacity.filterNodes(vmQueryOptions))[0].nodeId; // TODO: allow random choice
vm.disks = [disk];
vm.public_ip = false;
vm.planetary = true;
vm.cpu = 1;
vm.memory = 1024;
vm.rootfs_size = 0;
vm.flist = "https://hub.grid.tf/tf-official-apps/base:latest.flist";
vm.entrypoint = "/sbin/zinit init";
vm.env = {
    SSH_KEY: config.ssh_key,
};

Now we go to the VM model, that will be used to build our zmachine object

We need to specify its

  • name
  • node_id: where it will get deployed
  • disks: disks model collection
  • memory
  • root filesystem size
  • flist: the image it is going to start from. Check the supported flists
  • entry point: entrypoint command / script to execute
  • env: has the environment variables needed e.g sshkeys used
  • public ip: if we want to have a public ip attached to the VM
  • planetary: to enable planetary network on VM

Building VMs Collection

// create VMs Object
const vms = new MachinesModel();
vms.name = "dynamicVMS";
vms.network = n;
vms.machines = [vm];
vms.metadata = "{'testVMs': true}";
vms.description = "test deploying VMs via ts grid3 client";

Here it's quite simple we can add one or more VM to the machines property to have them deployed as part of our project

deployment

// deploy vms
const res = await grid3.machines.deploy(vms);
log(res);

Getting Deployment Information

can do so based on the name you gave to the vms collection

// get the deployment
const l = await grid3.machines.getObj(vms.name);
log(l);

Deleting a Deployment

// delete
const d = await grid3.machines.delete({ name: vms.name });
log(d);

In the underlying layer we cancel the contracts that were created on the chain and as a result all of the workloads tied to his project will get deleted.

Last change: 2024-02-28