Compare commits
2 commits
7fc619e619
...
b7ad9ce9ce
Author | SHA1 | Date | |
---|---|---|---|
b7ad9ce9ce | |||
48dfe86391 |
1 changed files with 64 additions and 16 deletions
|
@ -16,6 +16,7 @@ def _load_nb_objects(_nb_api: pynetbox.api) -> dict:
|
||||||
'ip_addresses': {},
|
'ip_addresses': {},
|
||||||
'vlans': {},
|
'vlans': {},
|
||||||
'disks': {},
|
'disks': {},
|
||||||
|
'tags': {},
|
||||||
}
|
}
|
||||||
|
|
||||||
# Load NetBox devices
|
# Load NetBox devices
|
||||||
|
@ -56,6 +57,31 @@ def _load_nb_objects(_nb_api: pynetbox.api) -> dict:
|
||||||
|
|
||||||
_nb_objects['disks'][_nb_disk.virtual_machine.id][_nb_disk.name] = _nb_disk
|
_nb_objects['disks'][_nb_disk.virtual_machine.id][_nb_disk.name] = _nb_disk
|
||||||
|
|
||||||
|
# Load NetBox tags
|
||||||
|
for _nb_tag in _nb_api.extras.tags.all():
|
||||||
|
_nb_objects['tags'][_nb_tag.name] = _nb_tag
|
||||||
|
|
||||||
|
return _nb_objects
|
||||||
|
|
||||||
|
|
||||||
|
def _process_pve_tags(
|
||||||
|
_pve_api: ProxmoxAPI,
|
||||||
|
_nb_api: pynetbox.api,
|
||||||
|
_nb_objects: dict,
|
||||||
|
) -> dict:
|
||||||
|
# TODO: First tags
|
||||||
|
|
||||||
|
# Then pool (we treat them as tags)
|
||||||
|
for _pve_pool in _pve_api.pools.get():
|
||||||
|
_tag_name = f'Pool/{_pve_pool["poolid"]}'
|
||||||
|
_nb_tag = _nb_objects['tags'].get(_tag_name)
|
||||||
|
if _nb_tag is None:
|
||||||
|
_nb_tag = _nb_api.extras.tags.create(
|
||||||
|
name=_tag_name,
|
||||||
|
slug=f'pool-{_pve_pool["poolid"]}'.lower(),
|
||||||
|
description=f'Proxmox pool {_pve_pool["poolid"]}',
|
||||||
|
)
|
||||||
|
|
||||||
return _nb_objects
|
return _nb_objects
|
||||||
|
|
||||||
|
|
||||||
|
@ -63,14 +89,15 @@ def _process_pve_virtual_machine(
|
||||||
_pve_api: ProxmoxAPI,
|
_pve_api: ProxmoxAPI,
|
||||||
_nb_api: pynetbox.api,
|
_nb_api: pynetbox.api,
|
||||||
_nb_objects: dict,
|
_nb_objects: dict,
|
||||||
_pve_node: dict,
|
_nb_device: any,
|
||||||
|
_pve_tags: [str],
|
||||||
_pve_virtual_machine: dict
|
_pve_virtual_machine: dict
|
||||||
) -> dict:
|
) -> dict:
|
||||||
pve_virtual_machine_config = _pve_api.nodes(_pve_node['node']).qemu(_pve_virtual_machine['vmid']).config.get()
|
pve_virtual_machine_config = _pve_api.nodes(_nb_device.name).qemu(_pve_virtual_machine['vmid']).config.get()
|
||||||
|
|
||||||
try:
|
try:
|
||||||
pve_virtual_machine_agent_interfaces = _pve_api \
|
pve_virtual_machine_agent_interfaces = _pve_api \
|
||||||
.nodes(_pve_node['node']) \
|
.nodes(_nb_device.name) \
|
||||||
.qemu(_pve_virtual_machine['vmid']) \
|
.qemu(_pve_virtual_machine['vmid']) \
|
||||||
.agent('network-get-interfaces') \
|
.agent('network-get-interfaces') \
|
||||||
.get()
|
.get()
|
||||||
|
@ -82,35 +109,29 @@ def _process_pve_virtual_machine(
|
||||||
for result in pve_virtual_machine_agent_interfaces['result']:
|
for result in pve_virtual_machine_agent_interfaces['result']:
|
||||||
pve_virtual_machine_ip_addresses[result['name']] = result['ip-addresses']
|
pve_virtual_machine_ip_addresses[result['name']] = result['ip-addresses']
|
||||||
|
|
||||||
# This script does not create the hardware devices.
|
|
||||||
nb_device = _nb_objects['devices'].get(_pve_node['node'].lower())
|
|
||||||
if nb_device is None:
|
|
||||||
print(f'The device {_pve_node["node"]} is not created on NetBox. Exiting.')
|
|
||||||
sys.exit(1)
|
|
||||||
else:
|
|
||||||
pass
|
|
||||||
|
|
||||||
# Create the virtual machine if it exists, update it otherwise
|
# Create the virtual machine if it exists, update it otherwise
|
||||||
nb_virtual_machine = _nb_objects['virtual_machines'].get(str(_pve_virtual_machine['vmid']))
|
nb_virtual_machine = _nb_objects['virtual_machines'].get(str(_pve_virtual_machine['vmid']))
|
||||||
if nb_virtual_machine is None:
|
if nb_virtual_machine is None:
|
||||||
nb_virtual_machine = _nb_api.virtualization.virtual_machines.create(
|
nb_virtual_machine = _nb_api.virtualization.virtual_machines.create(
|
||||||
serial=_pve_virtual_machine['vmid'],
|
serial=_pve_virtual_machine['vmid'],
|
||||||
name=_pve_virtual_machine['name'],
|
name=_pve_virtual_machine['name'],
|
||||||
site=nb_device.site.id,
|
site=_nb_device.site.id,
|
||||||
cluster=1, # TODO
|
cluster=1, # TODO
|
||||||
device=nb_device.id,
|
device=_nb_device.id,
|
||||||
vcpus=pve_virtual_machine_config['cores'],
|
vcpus=pve_virtual_machine_config['cores'],
|
||||||
memory=int(pve_virtual_machine_config['memory']),
|
memory=int(pve_virtual_machine_config['memory']),
|
||||||
status='active' if _pve_virtual_machine['status'] == 'running' else 'offline',
|
status='active' if _pve_virtual_machine['status'] == 'running' else 'offline',
|
||||||
|
tags=list(map(lambda _pve_tag_name: _nb_objects['tags'][_pve_tag_name], _pve_tags))
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
nb_virtual_machine.name = _pve_virtual_machine['name']
|
nb_virtual_machine.name = _pve_virtual_machine['name']
|
||||||
nb_virtual_machine.site = nb_device.site.id
|
nb_virtual_machine.site = _nb_device.site.id
|
||||||
nb_virtual_machine.cluster = 1
|
nb_virtual_machine.cluster = 1
|
||||||
nb_virtual_machine.device = nb_device.id
|
nb_virtual_machine.device = _nb_device.id
|
||||||
nb_virtual_machine.vcpus = pve_virtual_machine_config['cores']
|
nb_virtual_machine.vcpus = pve_virtual_machine_config['cores']
|
||||||
nb_virtual_machine.memory = int(pve_virtual_machine_config['memory'])
|
nb_virtual_machine.memory = int(pve_virtual_machine_config['memory'])
|
||||||
nb_virtual_machine.status = 'active' if _pve_virtual_machine['status'] == 'running' else 'offline'
|
nb_virtual_machine.status = 'active' if _pve_virtual_machine['status'] == 'running' else 'offline'
|
||||||
|
nb_virtual_machine.tags = list(map(lambda _pve_tag_name: _nb_objects['tags'][_pve_tag_name], _pve_tags))
|
||||||
nb_virtual_machine.save()
|
nb_virtual_machine.save()
|
||||||
|
|
||||||
# Handle the VM network interfaces
|
# Handle the VM network interfaces
|
||||||
|
@ -364,15 +385,42 @@ def main():
|
||||||
# Load NetBox objects
|
# Load NetBox objects
|
||||||
nb_objects = _load_nb_objects(nb_api)
|
nb_objects = _load_nb_objects(nb_api)
|
||||||
|
|
||||||
|
# Process Proxmox tags
|
||||||
|
_process_pve_tags(
|
||||||
|
pve_api,
|
||||||
|
nb_api,
|
||||||
|
nb_objects,
|
||||||
|
)
|
||||||
|
|
||||||
|
# Fetch VM tags from Proxmox
|
||||||
|
pve_vm_tags = {}
|
||||||
|
for pve_vm_resource in pve_api.cluster.resources.get(type='vm'):
|
||||||
|
pve_vm_tags[pve_vm_resource['vmid']] = []
|
||||||
|
|
||||||
|
pve_vm_tags[pve_vm_resource['vmid']].append(f'Pool/{pve_vm_resource["pool"]}')
|
||||||
|
|
||||||
|
if 'tags' in pve_vm_resource:
|
||||||
|
pass # TODO: pve_vm_tags[pve_vm_resource['vmid']].append(pve_vm_resource['tags'])
|
||||||
|
|
||||||
# Process Proxmox nodes
|
# Process Proxmox nodes
|
||||||
for pve_node in pve_api.nodes.get():
|
for pve_node in pve_api.nodes.get():
|
||||||
|
# This script does not create the hardware devices.
|
||||||
|
nb_device = nb_objects['devices'].get(pve_node['node'].lower())
|
||||||
|
if nb_device is None:
|
||||||
|
print(f'The device {pve_node["node"]} is not created on NetBox. Exiting.')
|
||||||
|
sys.exit(1)
|
||||||
|
else:
|
||||||
|
nb_device.status = 'active' if pve_node['status'] == 'online' else 'offline'
|
||||||
|
nb_device.save()
|
||||||
|
|
||||||
# Process Proxmox virtual machines per node
|
# Process Proxmox virtual machines per node
|
||||||
for pve_virtual_machine in pve_api.nodes(pve_node['node']).qemu.get():
|
for pve_virtual_machine in pve_api.nodes(pve_node['node']).qemu.get():
|
||||||
_process_pve_virtual_machine(
|
_process_pve_virtual_machine(
|
||||||
pve_api,
|
pve_api,
|
||||||
nb_api,
|
nb_api,
|
||||||
nb_objects,
|
nb_objects,
|
||||||
pve_node,
|
nb_device,
|
||||||
|
pve_vm_tags.get(pve_virtual_machine['vmid'], []),
|
||||||
pve_virtual_machine,
|
pve_virtual_machine,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue