Files
herolib/lib/mycelium/grid3/deployer2_sort/vm.v
2025-12-02 10:17:45 +01:00

98 lines
2.6 KiB
V

module deployer2
import json
import log
import incubaid.herolib.builder
import incubaid.herolib.mycelium.grid3.models
struct VMSpecs {
deployment_name string
name string
nodeid u32
pub_sshkeys []string
flist string // if any, if used then ostype not used
size u32 // size of the rootfs disk in bytes
compute_capacity models.ComputeCapacity
ostype OSType
}
enum OSType {
ubuntu_22_04
ubuntu_24_04
arch
alpine
}
struct VMDeployed {
name string
nodeid u32
guid string
yggdrasil_ip string
mycelium_ip string
}
pub fn (vm VMDeployed) builder_node() !&builder.Node {
mut factory := builder.new()!
return factory.node_new(
ipaddr: vm.mycelium_ip
)!
}
// only connect to yggdrasil and mycelium
fn (mut deployer Deployer) vm_deploy(args_ VMSpecs) !VMDeployed {
mut args := args_
if args.pub_sshkeys.len == 0 {
return error('at least one ssh key needed to deploy vm')
}
// deploymentstate_db.set(args.deployment_name,"vm_${args.name}",json.encode(VMDeployed))!
_ := models.VM{
name: 'vm1'
env_vars: {
'SSH_KEY': 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDTwULSsUubOq3VPWL6cdrDvexDmjfznGydFPyaNcn7gAL9lRxwFbCDPMj7MbhNSpxxHV2+/iJPQOTVJu4oc1N7bPP3gBCnF51rPrhTpGCt5pBbTzeyNweanhedkKDsCO2mIEh/92Od5Hg512dX4j7Zw6ipRWYSaepapfyoRnNSriW/s3DH/uewezVtL5EuypMdfNngV/u2KZYWoeiwhrY/yEUykQVUwDysW/xUJNP5o+KSTAvNSJatr3FbuCFuCjBSvageOLHePTeUwu6qjqe+Xs4piF1ByO/6cOJ8bt5Vcx0bAtI8/MPApplUU/JWevsPNApvnA/ntffI+u8DCwgP'
}
}
mut env_vars := {
'SSH_KEY': args.pub_sshkeys[0]
}
// QUESTION: how to implement multiple ssh keys
for i, key in args.pub_sshkeys[0..] {
env_vars['SSH_KEY${i}'] = key
}
machine := models.Zmachine{
flist: args.flist
size: args.size
compute_capacity: args.compute_capacity
env: env_vars
}
mut deployment := models.new_deployment(
// twin_id:
workloads: [machine.to_workload()]
metadata: models.DeploymentData{
name: args.deployment_name
}
)
contract_id := deployer.deploy(args.nodeid, mut deployment, args.name, 0)!
deployed := deployer.get_deployment(contract_id, args.nodeid)!
if deployed.workloads.len < 1 {
panic('deployment should have at least one workload for vm')
}
vm_workload := deployed.workloads[0]
zmachine := json.decode(models.Zmachine, vm_workload.data)!
mycelium_ip := zmachine.network.mycelium or { panic('deployed vm must have mycelium ip') }
vm_deployed := VMDeployed{
name: vm_workload.name
nodeid: args.nodeid
guid: vm_workload.name
// yggdrasil_ip: zmachine.network.
mycelium_ip: '${mycelium_ip.network}${mycelium_ip.hex_seed}'
}
return vm_deployed
}