uncloud/uncloud/uncloud_vm/management/commands/vm.py

86 lines
2.9 KiB
Python

import json
import uncloud.secrets as secrets
from django.core.management.base import BaseCommand
from django.contrib.auth import get_user_model
from uncloud_vm.models import VMProduct, VMHost
class Command(BaseCommand):
help = 'Select VM Host for VMs'
def add_arguments(self, parser):
parser.add_argument('--schedule-vms', action='store_true')
parser.add_argument('--start-vms-here', action='store_true')
parser.add_argument('--check-health', action='store_true')
parser.add_argument('--vmhostname')
print(parser)
def handle(self, *args, **options):
print(args)
print(options)
if options['schedule_vms']:
self.schedule_vms(args, option)
if options['start_vms_here']:
if not options['vmhostname']:
raise Exception("Argument vmhostname is required to know which vmhost we are on")
self.start_vms(args, options)
if options['check_health']:
self.check_health(args, option)
def start_vms(self, *args, **options):
vmhost = VMHost.objects.get(status='active',
hostname=options['vmhostname'])
if not vmhost:
print("No active vmhost {} exists".format(options['vmhostname']))
return
vms_to_start = VMProduct.objects.filter(vmhost=vmhost,
status='creating')
for vm in vms_to_start:
""" run qemu:
check if VM is not already active / qemu running
prepare / create the Qemu arguments
"""
def schedule_vms(self, *args, **options)):
pending_vms = VMProduct.objects.filter(vmhost__isnull=True)
vmhosts = VMHost.objects.filter(status='active')
for vm in pending_vms:
print(vm)
found_vmhost = False
for vmhost in vmhosts:
if vmhost.available_cores >= vm.cores and vmhost.available_ram_in_gb >= vm.ram_in_gb:
vm.vmhost = vmhost
vm.status = "creating"
vm.save()
found_vmhost = True
print("Scheduled VM {} on VMHOST {}".format(vm, vmhost))
break
if not found_vmhost:
print("Error: cannot schedule VM {}, no suitable host found".format(vm))
def check_health(self, *args, **options):
pending_vms = VMProduct.objects.filter(vmhost__isnull=True)
vmhosts = VMHost.objects.filter(status='active')
# 1. Check that all active hosts reported back N seconds ago
# 2. Check that no VM is running on a dead host
# 3. Migrate VMs if necessary
# 4. Check that no VMs have been pending for longer than Y seconds
# If VM snapshots exist without a VM -> notify user (?)
print("Nothing is good, you should implement me")