126 lines
3.5 KiB
Python
126 lines
3.5 KiB
Python
import pyone
|
||
|
||
from enum import IntEnum
|
||
from config import config, etcd_client
|
||
|
||
# How to get client secrets?
|
||
# 1. Login to OpenNebula
|
||
# 2. Go to Settings then Auth
|
||
# 3. Click on "Manage login tokens" button
|
||
# 4. Click on "Get a new token" button
|
||
|
||
one_client = pyone.OneServer(
|
||
uri='https://opennebula.ungleich.ch:2634/RPC2',
|
||
session=config['oca']['client_secrets']
|
||
)
|
||
|
||
|
||
def get_hostname_of_vm(vm_id):
|
||
host_pool = {
|
||
host.NAME: {
|
||
'name': host.NAME,
|
||
'id': host.ID,
|
||
'cluster': {
|
||
'name': host.CLUSTER,
|
||
'id': host.CLUSTER_ID
|
||
},
|
||
'vms': host.VMS.ID
|
||
}
|
||
for host in one_client.hostpool.info().HOST
|
||
}
|
||
for hostname, host in host_pool.items():
|
||
if vm_id in host['vms']:
|
||
return host
|
||
|
||
return None
|
||
|
||
|
||
def put_under_list(obj):
|
||
if not isinstance(obj, list):
|
||
return [obj]
|
||
return obj
|
||
|
||
|
||
class Snapshot:
|
||
def __init__(self, disk_id, snapshot):
|
||
self.active = bool(snapshot.ACTIVE)
|
||
self.date = snapshot.DATE
|
||
self.id = snapshot.ID
|
||
self.name = snapshot.NAME
|
||
self.size = snapshot.SIZE
|
||
self.disk_id = disk_id
|
||
|
||
def get_data(self):
|
||
return {
|
||
attr: getattr(self, attr)
|
||
for attr in dir(self)
|
||
if not attr.startswith('__') and not callable(getattr(self, attr))
|
||
}
|
||
|
||
|
||
class VM:
|
||
def __init__(self, vm):
|
||
self.name = vm.get_NAME()
|
||
self.id = vm.get_ID()
|
||
self.owner = {
|
||
'name': vm.get_UNAME(),
|
||
'id': vm.get_UID(),
|
||
}
|
||
|
||
template = vm.get_TEMPLATE()
|
||
host = get_hostname_of_vm(self.id)
|
||
|
||
self.vcpu = template.get('VCPU', None)
|
||
self.memory = template.get('MEMORY', None)
|
||
self.disks = [dict(disk) for disk in put_under_list(template.get('DISK', []))]
|
||
self.graphics = [dict(graphics) for graphics in put_under_list(template.get('GRAPHICS', []))]
|
||
self.nics = [dict(nic) for nic in put_under_list(template.get('NIC', []))]
|
||
self.status = pyone.VM_STATE(vm.get_STATE()).name.lower()
|
||
self.snapshots = []
|
||
|
||
for disk in one_client.vm.info(self.id).SNAPSHOTS:
|
||
disk_id = disk.DISK_ID
|
||
for snapshot in disk.SNAPSHOT:
|
||
self.snapshots.append(Snapshot(disk_id, snapshot).get_data())
|
||
|
||
if host:
|
||
self.host = {
|
||
'name': host['name'],
|
||
'id': host['id']
|
||
}
|
||
else:
|
||
self.host = host
|
||
|
||
def get_data(self):
|
||
return {
|
||
attr: getattr(self, attr)
|
||
for attr in dir(self)
|
||
if not attr.startswith('__') and not callable(getattr(self, attr))
|
||
}
|
||
|
||
def __repr__(self):
|
||
return str(self.get_data())
|
||
|
||
|
||
class VmFilterFlag(IntEnum):
|
||
UIDUserResources = 0 # UID User’s Resources
|
||
UserAndItsGroupsResources = -1 # Resources belonging to the user and any of his groups
|
||
AllResources = -2 # All resources
|
||
UserResources = -3 # Resources belonging to the user
|
||
UserPrimaryGroupResources = -4 # Resources belonging to the user’s primary group
|
||
|
||
|
||
def main():
|
||
VM_STATES = list(pyone.VM_STATE)
|
||
START_ID = -1 # First id whatever it is
|
||
END_ID = -1 # Last id whatever it is
|
||
|
||
for VM_STATE in VM_STATES:
|
||
vm_pool = one_client.vmpool.infoextended(VmFilterFlag.AllResources.value, START_ID, END_ID, VM_STATE)
|
||
for i, vm in enumerate(vm_pool.VM):
|
||
vm = VM(vm)
|
||
etcd_client.put('/opennebula/vm/{}'.format(vm.id), vm.get_data())
|
||
|
||
|
||
if __name__ == "__main__":
|
||
main()
|