74 lines
		
	
	
	
		
			2.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			74 lines
		
	
	
	
		
			2.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
import json
 | 
						|
 | 
						|
import uncloud.secrets as secrets
 | 
						|
 | 
						|
from xmlrpc.client import ServerProxy as RPCClient
 | 
						|
 | 
						|
from django.core.management.base import BaseCommand
 | 
						|
from xmltodict import parse
 | 
						|
from enum import IntEnum
 | 
						|
from opennebula.models import VM as VMModel
 | 
						|
from uncloud_vm.models import VMHost
 | 
						|
from django_auth_ldap.backend import LDAPBackend
 | 
						|
 | 
						|
 | 
						|
class HostStates(IntEnum):
 | 
						|
    """
 | 
						|
    The following flags are copied from
 | 
						|
    https://docs.opennebula.org/5.8/integration/system_interfaces/api.html#schemas-for-host
 | 
						|
    """
 | 
						|
    INIT = 0  # Initial state for enabled hosts
 | 
						|
    MONITORING_MONITORED = 1  # Monitoring the host (from monitored)
 | 
						|
    MONITORED = 2  # The host has been successfully monitored
 | 
						|
    ERROR = 3  # An error ocurrer while monitoring the host
 | 
						|
    DISABLED = 4  # The host is disabled
 | 
						|
    MONITORING_ERROR = 5  # Monitoring the host (from error)
 | 
						|
    MONITORING_INIT = 6  # Monitoring the host (from init)
 | 
						|
    MONITORING_DISABLED = 7  # Monitoring the host (from disabled)
 | 
						|
    OFFLINE = 8  # The host is totally offline
 | 
						|
 | 
						|
 | 
						|
class Command(BaseCommand):
 | 
						|
    help = 'Syncronize Host information from OpenNebula'
 | 
						|
 | 
						|
    def add_arguments(self, parser):
 | 
						|
        pass
 | 
						|
 | 
						|
    def handle(self, *args, **options):
 | 
						|
        with RPCClient(secrets.OPENNEBULA_URL) as rpc_client:
 | 
						|
            success, response, *_ = rpc_client.one.hostpool.info(secrets.OPENNEBULA_USER_PASS)
 | 
						|
            if success:
 | 
						|
                response = json.loads(json.dumps(parse(response)))
 | 
						|
                host_pool = response.get('HOST_POOL', {}).get('HOST', {})
 | 
						|
                for host in host_pool:
 | 
						|
                    host_share = host.get('HOST_SHARE', {})
 | 
						|
 | 
						|
                    host_name = host.get('NAME')
 | 
						|
                    state = int(host.get('STATE', HostStates.OFFLINE.value))
 | 
						|
 | 
						|
                    if state == HostStates.MONITORED:
 | 
						|
                        status = 'active'
 | 
						|
                    elif state == HostStates.DISABLED:
 | 
						|
                        status = 'disabled'
 | 
						|
                    else:
 | 
						|
                        status = 'unusable'
 | 
						|
 | 
						|
                    usable_cores = host_share.get('TOTAL_CPU')
 | 
						|
                    usable_ram_in_kb = int(host_share.get('TOTAL_MEM', 0))
 | 
						|
                    usable_ram_in_gb = int(usable_ram_in_kb / 2 ** 20)
 | 
						|
 | 
						|
                    # vms cannot be created like this -- Nico, 2020-03-17
 | 
						|
                    # vms = host.get('VMS', {}) or {}
 | 
						|
                    # vms = vms.get('ID', []) or []
 | 
						|
                    # vms = ','.join(vms)
 | 
						|
 | 
						|
                    VMHost.objects.update_or_create(
 | 
						|
                        hostname=host_name,
 | 
						|
                        defaults={
 | 
						|
                            'usable_cores': usable_cores,
 | 
						|
                            'usable_ram_in_gb': usable_ram_in_gb,
 | 
						|
                            'status': status
 | 
						|
                        }
 | 
						|
                    )
 | 
						|
            else:
 | 
						|
                print(response)
 |