From 8fbae0a071c144b481361118ff72cbde079f5ecd Mon Sep 17 00:00:00 2001 From: Jordan Rodgers Date: Fri, 2 Feb 2018 15:18:50 -0500 Subject: [PATCH] store ignored pools in db, check ignored pools when getting all pools --- proxstar/__init__.py | 24 ++++++++++++------------ proxstar/db.py | 9 ++++++++- proxstar/models.py | 5 +++++ proxstar/proxmox.py | 25 +++++++++++++------------ proxstar/tasks.py | 2 +- 5 files changed, 39 insertions(+), 26 deletions(-) diff --git a/proxstar/__init__.py b/proxstar/__init__.py index 1a877f5..6defcea 100644 --- a/proxstar/__init__.py +++ b/proxstar/__init__.py @@ -78,7 +78,7 @@ def list_vms(user=None): if user and not rtp: return '', 403 elif user and rtp: - vms = get_vms_for_user(proxmox, user) + vms = get_vms_for_user(proxmox, db, user) rtp_view = user user = session['userinfo']['preferred_username'] elif rtp: @@ -88,7 +88,7 @@ def list_vms(user=None): else: user = session['userinfo']['preferred_username'] if active: - vms = get_vms_for_user(proxmox, user) + vms = get_vms_for_user(proxmox, db, user) else: vms = 'INACTIVE' return render_template( @@ -127,7 +127,7 @@ def vm_details(vmid): rtp = 'rtp' in session['userinfo']['groups'] active = 'active' in session['userinfo']['groups'] proxmox = connect_proxmox() - if rtp or int(vmid) in get_user_allowed_vms(proxmox, user): + if rtp or int(vmid) in get_user_allowed_vms(proxmox, db, user): vm = get_vm(proxmox, vmid) vm['vmid'] = vmid vm['config'] = get_vm_config(proxmox, vmid) @@ -141,7 +141,7 @@ def vm_details(vmid): get_ip_for_mac(starrs, interface[1])]) vm['expire'] = get_vm_expire( db, vmid, app.config['VM_EXPIRE_MONTHS']).strftime('%m/%d/%Y') - usage = get_user_usage(proxmox, user) + usage = get_user_usage(proxmox, db, user) limits = get_user_usage_limits(db, user) usage_check = check_user_usage(proxmox, db, user, vm['config']['cores'], @@ -165,7 +165,7 @@ def vm_power(vmid, action): user = session['userinfo']['preferred_username'] rtp = 'rtp' in session['userinfo']['groups'] proxmox = connect_proxmox() - if rtp or int(vmid) in get_user_allowed_vms(proxmox, user): + if rtp or int(vmid) in get_user_allowed_vms(proxmox, db, user): if action == 'start': config = get_vm_config(proxmox, vmid) usage_check = check_user_usage(proxmox, db, user, config['cores'], @@ -184,7 +184,7 @@ def vm_cpu(vmid, cores): user = session['userinfo']['preferred_username'] rtp = 'rtp' in session['userinfo']['groups'] proxmox = connect_proxmox() - if rtp or int(vmid) in get_user_allowed_vms(proxmox, user): + if rtp or int(vmid) in get_user_allowed_vms(proxmox, db, user): cur_cores = get_vm_config(proxmox, vmid)['cores'] if cores >= cur_cores: status = get_vm(proxmox, vmid)['qmpstatus'] @@ -207,7 +207,7 @@ def vm_mem(vmid, mem): user = session['userinfo']['preferred_username'] rtp = 'rtp' in session['userinfo']['groups'] proxmox = connect_proxmox() - if rtp or int(vmid) in get_user_allowed_vms(proxmox, user): + if rtp or int(vmid) in get_user_allowed_vms(proxmox, db, user): cur_mem = get_vm_config(proxmox, vmid)['memory'] // 1024 if mem >= cur_mem: status = get_vm(proxmox, vmid)['qmpstatus'] @@ -230,7 +230,7 @@ def vm_renew(vmid): user = session['userinfo']['preferred_username'] rtp = 'rtp' in session['userinfo']['groups'] proxmox = connect_proxmox() - if rtp or int(vmid) in get_user_allowed_vms(proxmox, user): + if rtp or int(vmid) in get_user_allowed_vms(proxmox, db, user): renew_vm_expire(db, vmid, app.config['VM_EXPIRE_MONTHS']) for interface in get_vm_interfaces(proxmox, vmid): renew_ip(starrs, get_ip_for_mac(starrs, interface[1])) @@ -245,7 +245,7 @@ def iso_eject(vmid): user = session['userinfo']['preferred_username'] rtp = 'rtp' in session['userinfo']['groups'] proxmox = connect_proxmox() - if rtp or int(vmid) in get_user_allowed_vms(proxmox, user): + if rtp or int(vmid) in get_user_allowed_vms(proxmox, db, user): eject_vm_iso(proxmox, vmid) return '', 200 else: @@ -258,7 +258,7 @@ def iso_mount(vmid, iso): user = session['userinfo']['preferred_username'] rtp = 'rtp' in session['userinfo']['groups'] proxmox = connect_proxmox() - if rtp or int(vmid) in get_user_allowed_vms(proxmox, user): + if rtp or int(vmid) in get_user_allowed_vms(proxmox, db, user): iso = "{}:iso/{}".format(app.config['PROXMOX_ISO_STORAGE'], iso) mount_vm_iso(proxmox, vmid, iso) return '', 200 @@ -273,7 +273,7 @@ def delete(vmid): rtp = 'rtp' in session['userinfo']['groups'] proxmox = connect_proxmox() if rtp or int(vmid) in get_user_allowed_vms( - proxmox, user) or 'rtp' in session['userinfo']['groups']: + proxmox, db, user) or 'rtp' in session['userinfo']['groups']: q.enqueue(delete_vm_task, vmid) return '', 200 else: @@ -289,7 +289,7 @@ def create(): proxmox = connect_proxmox() if active: if request.method == 'GET': - usage = get_user_usage(proxmox, user) + usage = get_user_usage(proxmox, db, user) limits = get_user_usage_limits(db, user) percents = get_user_usage_percent(proxmox, user, usage, limits) isos = get_isos(proxmox, app.config['PROXMOX_ISO_STORAGE']) diff --git a/proxstar/db.py b/proxstar/db.py index 46c68c1..94244f8 100644 --- a/proxstar/db.py +++ b/proxstar/db.py @@ -2,7 +2,7 @@ import datetime from sqlalchemy import exists from dateutil.relativedelta import relativedelta from proxstar.ldapdb import * -from proxstar.models import VM_Expiration, Usage_Limit, Pool_Cache, Base +from proxstar.models import VM_Expiration, Usage_Limit, Pool_Cache, Ignored_Pools, Base def get_vm_expire(db, vmid, months): @@ -124,3 +124,10 @@ def get_pool_cache(db): pool_dict['percents'] = pool.percents pools.append(pool_dict) return pools + + +def get_ignored_pools(db): + ignored_pools = [] + for pool in db.query(Ignored_Pools).all(): + ignored_pools.append(pool.id) + return ignored_pools diff --git a/proxstar/models.py b/proxstar/models.py index 42238da..906176d 100644 --- a/proxstar/models.py +++ b/proxstar/models.py @@ -35,3 +35,8 @@ class Template(Base): id = Column(Integer, primary_key=True) name = Column(String(32), nullable=False) desc = Column(Text) + + +class Ignored_Pools(Base): + __tablename__ = 'ignored_pools' + id = Column(String(32), primary_key=True) diff --git a/proxstar/proxmox.py b/proxstar/proxmox.py index 6c1dd00..cbc5145 100644 --- a/proxstar/proxmox.py +++ b/proxstar/proxmox.py @@ -27,8 +27,8 @@ def create_user(proxmox, user): path="/pool/{}".format(user), roles='PVEVMConsole', users=username) -def get_vms_for_user(proxmox, user): - pools = get_pools(proxmox) +def get_vms_for_user(proxmox, db, user): + pools = get_pools(proxmox, db) if user not in pools: create_user(proxmox, user) vms = proxmox.pools(user).get()['members'] @@ -41,12 +41,12 @@ def get_vms_for_user(proxmox, user): def get_vms_for_rtp(proxmox, db): pools = [] - for pool in get_pools(proxmox): + for pool in get_pools(proxmox, db): pool_dict = dict() pool_dict['user'] = pool - pool_dict['vms'] = get_vms_for_user(proxmox, pool) + pool_dict['vms'] = get_vms_for_user(proxmox, db, pool) pool_dict['num_vms'] = len(pool_dict['vms']) - pool_dict['usage'] = get_user_usage(proxmox, pool) + pool_dict['usage'] = get_user_usage(proxmox, db, pool) pool_dict['limits'] = get_user_usage_limits(db, pool) pool_dict['percents'] = get_user_usage_percent( proxmox, pool, pool_dict['usage'], pool_dict['limits']) @@ -54,9 +54,9 @@ def get_vms_for_rtp(proxmox, db): return pools -def get_user_allowed_vms(proxmox, user): +def get_user_allowed_vms(proxmox, db, user): allowed_vms = [] - for vm in get_vms_for_user(proxmox, user): + for vm in get_vms_for_user(proxmox, db, user): allowed_vms.append(vm['vmid']) return allowed_vms @@ -162,7 +162,7 @@ def get_user_usage(proxmox, user): usage['disk'] = 0 if is_rtp(user): return usage - vms = get_vms_for_user(proxmox, user) + vms = get_vms_for_user(proxmox, db, user) for vm in vms: config = get_vm_config(proxmox, vm['vmid']) if 'status' in vm: @@ -176,7 +176,7 @@ def get_user_usage(proxmox, user): def check_user_usage(proxmox, db, user, vm_cpu, vm_mem, vm_disk): limits = get_user_usage_limits(db, user) - cur_usage = get_user_usage(proxmox, user) + cur_usage = get_user_usage(proxmox, db, user) if int(cur_usage['cpu']) + int(vm_cpu) > int(limits['cpu']): return 'exceeds_cpu_limit' elif int(cur_usage['mem']) + (int(vm_mem) / 1024) > int(limits['mem']): @@ -188,7 +188,7 @@ def check_user_usage(proxmox, db, user, vm_cpu, vm_mem, vm_disk): def get_user_usage_percent(proxmox, user, usage=None, limits=None): percents = dict() if not usage: - usage = get_user_usage(proxmox, user) + usage = get_user_usage(proxmox, db, user) if not limits: limits = get_user_usage_limits(user) percents['cpu'] = round(usage['cpu'] / limits['cpu'] * 100) @@ -273,11 +273,12 @@ def mount_vm_iso(proxmox, vmid, iso): node.qemu(vmid).config.post(ide2="{},media=cdrom".format(iso)) -def get_pools(proxmox): +def get_pools(proxmox, db): pools = [] for pool in proxmox.pools.get(): poolid = pool['poolid'] - if is_user(poolid) and poolid != 'rtp': + ignored_pools = get_ignored_pools(db) + if poolid not in ignored_pools and is_user(poolid): pools.append(poolid) pools = sorted(pools) return pools diff --git a/proxstar/tasks.py b/proxstar/tasks.py index b72444d..8522670 100644 --- a/proxstar/tasks.py +++ b/proxstar/tasks.py @@ -79,7 +79,7 @@ def process_expiring_vms_task(): pools = get_pools(proxmox) for pool in pools: expiring_vms = [] - vms = get_vms_for_user(proxmox, pool) + vms = get_vms_for_user(proxmox, db, pool) for vm in vms: vmid = vm['vmid'] expire = get_vm_expire(db, vmid,