Move django-based uncloud to top-level
This commit is contained in:
parent
0560063326
commit
95d43f002f
265 changed files with 0 additions and 0 deletions
119
uncloud_vm/management/commands/vm.py
Normal file
119
uncloud_vm/management/commands/vm.py
Normal file
|
|
@ -0,0 +1,119 @@
|
|||
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 VMSnapshotProduct, VMProduct, VMHost
|
||||
from datetime import datetime
|
||||
|
||||
class Command(BaseCommand):
|
||||
help = 'Select VM Host for VMs'
|
||||
|
||||
def add_arguments(self, parser):
|
||||
parser.add_argument('--this-hostname', required=True)
|
||||
parser.add_argument('--this-cluster', required=True)
|
||||
|
||||
parser.add_argument('--create-vm-snapshots', action='store_true')
|
||||
parser.add_argument('--schedule-vms', action='store_true')
|
||||
parser.add_argument('--start-vms', action='store_true')
|
||||
|
||||
|
||||
def handle(self, *args, **options):
|
||||
for cmd in [ 'create_vm_snapshots', 'schedule_vms', 'start_vms' ]:
|
||||
if options[cmd]:
|
||||
f = getattr(self, cmd)
|
||||
f(args, options)
|
||||
|
||||
def schedule_vms(self, *args, **options):
|
||||
for pending_vm in VMProduct.objects.filter(status='PENDING'):
|
||||
cores_needed = pending_vm.cores
|
||||
ram_needed = pending_vm.ram_in_gb
|
||||
|
||||
# Database filtering
|
||||
possible_vmhosts = VMHost.objects.filter(physical_cores__gte=cores_needed)
|
||||
|
||||
# Logical filtering
|
||||
possible_vmhosts = [ vmhost for vmhost in possible_vmhosts
|
||||
if vmhost.available_cores >=cores_needed
|
||||
and vmhost.available_ram_in_gb >= ram_needed ]
|
||||
|
||||
if not possible_vmhosts:
|
||||
log.error("No suitable Host found - cannot schedule VM {}".format(pending_vm))
|
||||
continue
|
||||
|
||||
vmhost = possible_vmhosts[0]
|
||||
pending_vm.vmhost = vmhost
|
||||
pending_vm.status = 'SCHEDULED'
|
||||
pending_vm.save()
|
||||
|
||||
print("Scheduled VM {} on VMHOST {}".format(pending_vm, pending_vm.vmhost))
|
||||
|
||||
print(self)
|
||||
|
||||
def start_vms(self, *args, **options):
|
||||
vmhost = VMHost.objects.get(hostname=options['this_hostname'])
|
||||
|
||||
if not vmhost:
|
||||
raise Exception("No vmhost {} exists".format(options['vmhostname']))
|
||||
|
||||
# not active? done here
|
||||
if not vmhost.status = 'ACTIVE':
|
||||
return
|
||||
|
||||
vms_to_start = VMProduct.objects.filter(vmhost=vmhost,
|
||||
status='SCHEDULED')
|
||||
for vm in vms_to_start:
|
||||
""" run qemu:
|
||||
check if VM is not already active / qemu running
|
||||
prepare / create the Qemu arguments
|
||||
"""
|
||||
print("Starting VM {}".format(VM))
|
||||
|
||||
def check_vms(self, *args, **options):
|
||||
"""
|
||||
Check if all VMs that are supposed to run are running
|
||||
"""
|
||||
|
||||
def modify_vms(self, *args, **options):
|
||||
"""
|
||||
Check all VMs that are requested to be modified and restart them
|
||||
"""
|
||||
|
||||
def create_vm_snapshots(self, *args, **options):
|
||||
this_cluster = VMCluster(option['this_cluster'])
|
||||
|
||||
for snapshot in VMSnapshotProduct.objects.filter(status='PENDING',
|
||||
cluster=this_cluster):
|
||||
if not snapshot.extra_data:
|
||||
snapshot.extra_data = {}
|
||||
|
||||
# TODO: implement locking here
|
||||
if 'creating_hostname' in snapshot.extra_data:
|
||||
pass
|
||||
|
||||
snapshot.extra_data['creating_hostname'] = options['this_hostname']
|
||||
snapshot.extra_data['creating_start'] = str(datetime.now())
|
||||
snapshot.save()
|
||||
|
||||
# something on the line of:
|
||||
# for disk im vm.disks:
|
||||
# rbd snap create pool/image-name@snapshot name
|
||||
# snapshot.extra_data['snapshots']
|
||||
# register the snapshot names in extra_data (?)
|
||||
|
||||
print(snapshot)
|
||||
|
||||
def check_health(self, *args, **options):
|
||||
pending_vms = VMProduct.objects.filter(status='PENDING')
|
||||
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")
|
||||
Loading…
Add table
Add a link
Reference in a new issue