initial
This commit is contained in:
79
proxmox/admin.py
Normal file
79
proxmox/admin.py
Normal file
@@ -0,0 +1,79 @@
|
||||
import logging
|
||||
|
||||
from django.contrib import admin
|
||||
from django.db.models import Q
|
||||
|
||||
from lib.decorators import readonly
|
||||
from lib.proxmox import Proxmox
|
||||
from proxmox.models import Lxc, LxcTemplate
|
||||
|
||||
|
||||
@readonly
|
||||
def sync_all_lxc_templates_from_proxmox(*args, **kwargs):
|
||||
pm = Proxmox()
|
||||
for storage in pm.storage_get(enabled=1):
|
||||
logging.debug(f'Syncing Templates from storage {storage["storage"]}')
|
||||
storage_name = storage['storage']
|
||||
for tmpl in pm.storage(f'{storage_name}/content').get(content='vztmpl'):
|
||||
try:
|
||||
logging.debug(f'Updating {tmpl["volid"]}')
|
||||
template = LxcTemplate.objects.get(volid=tmpl['volid'])
|
||||
except LxcTemplate.DoesNotExist:
|
||||
logging.debug(f'Fail - Creating {tmpl["volid"]}')
|
||||
template = LxcTemplate.objects.create(volid=tmpl['volid'])
|
||||
|
||||
template.write(**tmpl)
|
||||
|
||||
|
||||
@readonly
|
||||
def sync_all_lxc_from_proxmox(*args, **kwargs):
|
||||
from lib.proxmox import Proxmox
|
||||
pm = Proxmox()
|
||||
existing_vms = []
|
||||
for lxc_data in pm.get_all_lxc(as_dict=True, **kwargs):
|
||||
vmid = lxc_data.pop('vmid')
|
||||
try:
|
||||
lx: Lxc = Lxc.objects.get(vmid=vmid)
|
||||
logging.info(f'Updating {vmid}')
|
||||
except Lxc.DoesNotExist:
|
||||
logging.info(f'Creating {vmid}')
|
||||
lx = Lxc.objects.create(**{'vmid': vmid})
|
||||
|
||||
lx.from_proxmox(**lxc_data)
|
||||
|
||||
existing_vms.append(vmid)
|
||||
|
||||
to_delete = Lxc.objects.filter(~Q(vmid__in=existing_vms))
|
||||
if to_delete:
|
||||
logging.info(f'Deleting {[d.vmid for d in to_delete]}')
|
||||
to_delete.delete()
|
||||
|
||||
|
||||
sync_all_lxc_from_proxmox.short_description = 'Sync all LXC from Proxmox'
|
||||
|
||||
|
||||
@admin.register(Lxc)
|
||||
class LxcAdmin(admin.ModelAdmin):
|
||||
actions = [sync_all_lxc_from_proxmox, 'sync_selected_from_proxmox']
|
||||
search_fields = ('name', 'vmid', 'hostname', 'hwaddr')
|
||||
list_display = ('name', 'vmid', 'hwaddr', 'disksize', 'memory', 'cpus', 'status')
|
||||
list_filter = ('status', 'disksize',)
|
||||
|
||||
def get_readonly_fields(self, request, obj=None):
|
||||
if obj:
|
||||
return [k.name for k in obj._meta.fields if
|
||||
k.name not in ['name', 'cores', 'hwaddr', 'size', 'cpus', 'memory', 'description', 'hostname']]
|
||||
return self.readonly_fields
|
||||
|
||||
@admin.action(description='Sync selected from proxmox')
|
||||
@readonly
|
||||
def sync_selected_from_proxmox(self, request, queryset):
|
||||
for lx in queryset:
|
||||
lx.sync_from_proxmox()
|
||||
|
||||
|
||||
@admin.register(LxcTemplate)
|
||||
class LxcTemplateAdmin(admin.ModelAdmin):
|
||||
actions = [sync_all_lxc_templates_from_proxmox]
|
||||
search_fields = ('volid',)
|
||||
list_display = ('volid', 'human_size', 'content')
|
||||
Reference in New Issue
Block a user