2023-10-13 15:30:35 +03:00
import logging
2024-12-13 14:43:27 +03:00
import time
2024-04-29 03:55:10 +03:00
from proxmoxer import ProxmoxAPI
2023-10-13 15:30:35 +03:00
logger = logging . getLogger ( __name__ )
2024-05-26 08:37:52 +03:00
logger . setLevel ( logging . INFO )
2023-10-13 15:30:35 +03:00
2024-11-01 10:07:23 +03:00
2023-10-13 15:30:35 +03:00
def create_vm (
2024-04-29 03:55:10 +03:00
proxmox : ProxmoxAPI ,
node : str | None = None ,
vmid : int | None = None ,
name : str | None = None ,
2024-11-01 10:07:23 +03:00
prefix : str = " stepchenkoas " ,
2023-10-13 15:30:35 +03:00
cores : int = 2 ,
memory : int = 2048 ,
disk_size : int = 16 ,
start : int = 1 ,
2024-04-29 03:55:10 +03:00
) - > None :
2023-10-13 15:30:35 +03:00
if node is None :
nodes = proxmox . nodes . get ( )
2024-11-01 10:07:23 +03:00
nodes = list (
filter ( lambda node : node [ " status " ] == " online " , nodes )
) # pyright: ignore
node = min ( nodes , key = lambda node : node [ " disk " ] ) [ " node " ]
2023-10-13 15:30:35 +03:00
if vmid is None :
2024-11-01 10:07:23 +03:00
vmid = proxmox . cluster . get ( " nextid " )
2023-10-13 15:30:35 +03:00
if name is None :
2024-11-01 10:07:23 +03:00
name = f " { prefix } - { vmid } "
2023-10-13 15:30:35 +03:00
proxmox . nodes ( node ) . qemu . post (
node = node ,
vmid = vmid ,
2024-11-01 10:07:23 +03:00
description = " This VM was created automatically through Proxmox VE API " ,
2023-10-13 15:30:35 +03:00
cores = cores ,
2024-11-01 10:07:23 +03:00
cpu = " host " ,
2023-10-13 15:30:35 +03:00
memory = memory ,
name = name ,
2024-11-01 10:07:23 +03:00
net0 = " virtio,bridge=vmbr0,tag=103,firewall=1 " ,
ostype = " l26 " ,
pool = " Virt_LAB " ,
# alt-server-v-10.1-rc3-x86_64.iso
sata2 = " templates:iso/alt-server-v-10.1-rc3-x86_64.iso,media=cdrom " ,
scsi0 = f " rbd-storage: { disk_size } ,discard=on " ,
scsihw = " virtio-scsi-pci " ,
2023-10-13 15:30:35 +03:00
sockets = 1 ,
start = start ,
)
2024-11-01 10:07:23 +03:00
logger . info ( " VM %s was created successfully! " , vmid )
2023-10-13 15:30:35 +03:00
def delete_vm (
2024-04-29 03:55:10 +03:00
proxmox : ProxmoxAPI ,
node : str ,
vmid : int ,
2024-12-13 14:43:27 +03:00
) - > str :
upid : str = (
proxmox . nodes ( node )
. qemu ( vmid )
. delete (
node = node ,
vmid = vmid ,
)
2023-10-13 15:30:35 +03:00
)
2024-11-01 10:07:23 +03:00
logger . info ( " VM %s was deleted successfully! " , vmid )
2024-12-13 14:43:27 +03:00
return upid
2023-10-13 15:30:35 +03:00
def clone_template (
2024-04-29 03:55:10 +03:00
proxmox : ProxmoxAPI ,
2023-10-13 15:30:35 +03:00
node : str ,
vmid : int ,
2024-04-29 03:55:10 +03:00
newid : int | None = None ,
name : str | None = None ,
2024-11-01 10:07:23 +03:00
prefix : str = " stepchenkoas " ,
2024-04-29 03:55:10 +03:00
) - > tuple [ int , str ] :
2023-10-13 15:30:35 +03:00
if newid is None :
2024-11-01 10:07:23 +03:00
newid = int ( proxmox . cluster . get ( " nextid " ) ) # pyright: ignore
2023-10-13 15:30:35 +03:00
if name is None :
2024-11-01 10:07:23 +03:00
name = f " { prefix } - { newid } "
2023-10-13 15:30:35 +03:00
assert type ( newid ) is int
assert type ( name ) is str
2024-11-01 10:07:23 +03:00
upid : str = (
proxmox . nodes ( node )
. qemu ( vmid )
. clone . post (
newid = newid ,
node = node ,
vmid = vmid ,
format = " raw " ,
full = 1 ,
name = name ,
pool = " Virt_LAB " ,
storage = " rbd-storage " ,
target = node ,
)
) # pyright: ignore
2023-10-13 15:30:35 +03:00
# TODO: check task status
logger . debug ( " UPID ' %s ' " , upid )
2024-11-01 10:07:23 +03:00
logger . info ( " Cloning of VM %s to %s was initiated successfully! " , vmid , newid )
2023-10-13 15:30:35 +03:00
return ( newid , upid )
2024-11-01 10:07:23 +03:00
2023-10-13 15:30:35 +03:00
def get_vm_ip (
2024-04-29 03:55:10 +03:00
proxmox : ProxmoxAPI ,
node : str ,
2023-10-13 15:30:35 +03:00
vmid : int ,
2024-04-29 03:55:10 +03:00
) - > str :
2024-12-13 14:43:27 +03:00
done = False
2023-10-13 15:30:35 +03:00
vm_ip_address = None
2024-12-13 14:43:27 +03:00
while not done :
try :
res : dict = (
proxmox . nodes ( node ) . qemu ( vmid ) . agent ( " network-get-interfaces " ) . get ( )
) # pyright: ignore
for net in res [ " result " ] :
if net [ " name " ] == " eth0 " or net [ " name " ] == " ens19 " :
for ip in net [ " ip-addresses " ] :
if ip [ " ip-address-type " ] == " ipv4 " :
vm_ip_address = ip [ " ip-address " ]
done = True
except KeyError :
time . sleep ( 1 )
except Exception as e :
raise RuntimeError (
f " Could not get the ip address of VM { vmid } on node { node } "
) from e
2023-10-13 15:30:35 +03:00
2024-04-29 03:51:57 +03:00
if vm_ip_address is None :
2024-12-13 14:43:27 +03:00
raise RuntimeError ( f " Could not get the ip address of VM { vmid } on node { node } " )
2024-04-29 03:51:57 +03:00
2023-10-13 15:30:35 +03:00
return vm_ip_address