store ignored pools in db, check ignored pools when getting all pools

This commit is contained in:
Jordan Rodgers 2018-02-02 15:18:50 -05:00
parent 51de0b69af
commit 8fbae0a071
5 changed files with 39 additions and 26 deletions

View file

@ -78,7 +78,7 @@ def list_vms(user=None):
if user and not rtp: if user and not rtp:
return '', 403 return '', 403
elif user and rtp: elif user and rtp:
vms = get_vms_for_user(proxmox, user) vms = get_vms_for_user(proxmox, db, user)
rtp_view = user rtp_view = user
user = session['userinfo']['preferred_username'] user = session['userinfo']['preferred_username']
elif rtp: elif rtp:
@ -88,7 +88,7 @@ def list_vms(user=None):
else: else:
user = session['userinfo']['preferred_username'] user = session['userinfo']['preferred_username']
if active: if active:
vms = get_vms_for_user(proxmox, user) vms = get_vms_for_user(proxmox, db, user)
else: else:
vms = 'INACTIVE' vms = 'INACTIVE'
return render_template( return render_template(
@ -127,7 +127,7 @@ def vm_details(vmid):
rtp = 'rtp' in session['userinfo']['groups'] rtp = 'rtp' in session['userinfo']['groups']
active = 'active' in session['userinfo']['groups'] active = 'active' in session['userinfo']['groups']
proxmox = connect_proxmox() 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 = get_vm(proxmox, vmid)
vm['vmid'] = vmid vm['vmid'] = vmid
vm['config'] = get_vm_config(proxmox, vmid) vm['config'] = get_vm_config(proxmox, vmid)
@ -141,7 +141,7 @@ def vm_details(vmid):
get_ip_for_mac(starrs, interface[1])]) get_ip_for_mac(starrs, interface[1])])
vm['expire'] = get_vm_expire( vm['expire'] = get_vm_expire(
db, vmid, app.config['VM_EXPIRE_MONTHS']).strftime('%m/%d/%Y') 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) limits = get_user_usage_limits(db, user)
usage_check = check_user_usage(proxmox, db, user, usage_check = check_user_usage(proxmox, db, user,
vm['config']['cores'], vm['config']['cores'],
@ -165,7 +165,7 @@ def vm_power(vmid, action):
user = session['userinfo']['preferred_username'] user = session['userinfo']['preferred_username']
rtp = 'rtp' in session['userinfo']['groups'] rtp = 'rtp' in session['userinfo']['groups']
proxmox = connect_proxmox() 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': if action == 'start':
config = get_vm_config(proxmox, vmid) config = get_vm_config(proxmox, vmid)
usage_check = check_user_usage(proxmox, db, user, config['cores'], usage_check = check_user_usage(proxmox, db, user, config['cores'],
@ -184,7 +184,7 @@ def vm_cpu(vmid, cores):
user = session['userinfo']['preferred_username'] user = session['userinfo']['preferred_username']
rtp = 'rtp' in session['userinfo']['groups'] rtp = 'rtp' in session['userinfo']['groups']
proxmox = connect_proxmox() 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'] cur_cores = get_vm_config(proxmox, vmid)['cores']
if cores >= cur_cores: if cores >= cur_cores:
status = get_vm(proxmox, vmid)['qmpstatus'] status = get_vm(proxmox, vmid)['qmpstatus']
@ -207,7 +207,7 @@ def vm_mem(vmid, mem):
user = session['userinfo']['preferred_username'] user = session['userinfo']['preferred_username']
rtp = 'rtp' in session['userinfo']['groups'] rtp = 'rtp' in session['userinfo']['groups']
proxmox = connect_proxmox() 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 cur_mem = get_vm_config(proxmox, vmid)['memory'] // 1024
if mem >= cur_mem: if mem >= cur_mem:
status = get_vm(proxmox, vmid)['qmpstatus'] status = get_vm(proxmox, vmid)['qmpstatus']
@ -230,7 +230,7 @@ def vm_renew(vmid):
user = session['userinfo']['preferred_username'] user = session['userinfo']['preferred_username']
rtp = 'rtp' in session['userinfo']['groups'] rtp = 'rtp' in session['userinfo']['groups']
proxmox = connect_proxmox() 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']) renew_vm_expire(db, vmid, app.config['VM_EXPIRE_MONTHS'])
for interface in get_vm_interfaces(proxmox, vmid): for interface in get_vm_interfaces(proxmox, vmid):
renew_ip(starrs, get_ip_for_mac(starrs, interface[1])) renew_ip(starrs, get_ip_for_mac(starrs, interface[1]))
@ -245,7 +245,7 @@ def iso_eject(vmid):
user = session['userinfo']['preferred_username'] user = session['userinfo']['preferred_username']
rtp = 'rtp' in session['userinfo']['groups'] rtp = 'rtp' in session['userinfo']['groups']
proxmox = connect_proxmox() 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) eject_vm_iso(proxmox, vmid)
return '', 200 return '', 200
else: else:
@ -258,7 +258,7 @@ def iso_mount(vmid, iso):
user = session['userinfo']['preferred_username'] user = session['userinfo']['preferred_username']
rtp = 'rtp' in session['userinfo']['groups'] rtp = 'rtp' in session['userinfo']['groups']
proxmox = connect_proxmox() 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) iso = "{}:iso/{}".format(app.config['PROXMOX_ISO_STORAGE'], iso)
mount_vm_iso(proxmox, vmid, iso) mount_vm_iso(proxmox, vmid, iso)
return '', 200 return '', 200
@ -273,7 +273,7 @@ def delete(vmid):
rtp = 'rtp' in session['userinfo']['groups'] rtp = 'rtp' in session['userinfo']['groups']
proxmox = connect_proxmox() proxmox = connect_proxmox()
if rtp or int(vmid) in get_user_allowed_vms( 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) q.enqueue(delete_vm_task, vmid)
return '', 200 return '', 200
else: else:
@ -289,7 +289,7 @@ def create():
proxmox = connect_proxmox() proxmox = connect_proxmox()
if active: if active:
if request.method == 'GET': if request.method == 'GET':
usage = get_user_usage(proxmox, user) usage = get_user_usage(proxmox, db, user)
limits = get_user_usage_limits(db, user) limits = get_user_usage_limits(db, user)
percents = get_user_usage_percent(proxmox, user, usage, limits) percents = get_user_usage_percent(proxmox, user, usage, limits)
isos = get_isos(proxmox, app.config['PROXMOX_ISO_STORAGE']) isos = get_isos(proxmox, app.config['PROXMOX_ISO_STORAGE'])

View file

@ -2,7 +2,7 @@ import datetime
from sqlalchemy import exists from sqlalchemy import exists
from dateutil.relativedelta import relativedelta from dateutil.relativedelta import relativedelta
from proxstar.ldapdb import * 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): def get_vm_expire(db, vmid, months):
@ -124,3 +124,10 @@ def get_pool_cache(db):
pool_dict['percents'] = pool.percents pool_dict['percents'] = pool.percents
pools.append(pool_dict) pools.append(pool_dict)
return pools 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

View file

@ -35,3 +35,8 @@ class Template(Base):
id = Column(Integer, primary_key=True) id = Column(Integer, primary_key=True)
name = Column(String(32), nullable=False) name = Column(String(32), nullable=False)
desc = Column(Text) desc = Column(Text)
class Ignored_Pools(Base):
__tablename__ = 'ignored_pools'
id = Column(String(32), primary_key=True)

View file

@ -27,8 +27,8 @@ def create_user(proxmox, user):
path="/pool/{}".format(user), roles='PVEVMConsole', users=username) path="/pool/{}".format(user), roles='PVEVMConsole', users=username)
def get_vms_for_user(proxmox, user): def get_vms_for_user(proxmox, db, user):
pools = get_pools(proxmox) pools = get_pools(proxmox, db)
if user not in pools: if user not in pools:
create_user(proxmox, user) create_user(proxmox, user)
vms = proxmox.pools(user).get()['members'] vms = proxmox.pools(user).get()['members']
@ -41,12 +41,12 @@ def get_vms_for_user(proxmox, user):
def get_vms_for_rtp(proxmox, db): def get_vms_for_rtp(proxmox, db):
pools = [] pools = []
for pool in get_pools(proxmox): for pool in get_pools(proxmox, db):
pool_dict = dict() pool_dict = dict()
pool_dict['user'] = pool 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['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['limits'] = get_user_usage_limits(db, pool)
pool_dict['percents'] = get_user_usage_percent( pool_dict['percents'] = get_user_usage_percent(
proxmox, pool, pool_dict['usage'], pool_dict['limits']) proxmox, pool, pool_dict['usage'], pool_dict['limits'])
@ -54,9 +54,9 @@ def get_vms_for_rtp(proxmox, db):
return pools return pools
def get_user_allowed_vms(proxmox, user): def get_user_allowed_vms(proxmox, db, user):
allowed_vms = [] 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']) allowed_vms.append(vm['vmid'])
return allowed_vms return allowed_vms
@ -162,7 +162,7 @@ def get_user_usage(proxmox, user):
usage['disk'] = 0 usage['disk'] = 0
if is_rtp(user): if is_rtp(user):
return usage return usage
vms = get_vms_for_user(proxmox, user) vms = get_vms_for_user(proxmox, db, user)
for vm in vms: for vm in vms:
config = get_vm_config(proxmox, vm['vmid']) config = get_vm_config(proxmox, vm['vmid'])
if 'status' in vm: 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): def check_user_usage(proxmox, db, user, vm_cpu, vm_mem, vm_disk):
limits = get_user_usage_limits(db, user) 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']): if int(cur_usage['cpu']) + int(vm_cpu) > int(limits['cpu']):
return 'exceeds_cpu_limit' return 'exceeds_cpu_limit'
elif int(cur_usage['mem']) + (int(vm_mem) / 1024) > int(limits['mem']): 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): def get_user_usage_percent(proxmox, user, usage=None, limits=None):
percents = dict() percents = dict()
if not usage: if not usage:
usage = get_user_usage(proxmox, user) usage = get_user_usage(proxmox, db, user)
if not limits: if not limits:
limits = get_user_usage_limits(user) limits = get_user_usage_limits(user)
percents['cpu'] = round(usage['cpu'] / limits['cpu'] * 100) 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)) node.qemu(vmid).config.post(ide2="{},media=cdrom".format(iso))
def get_pools(proxmox): def get_pools(proxmox, db):
pools = [] pools = []
for pool in proxmox.pools.get(): for pool in proxmox.pools.get():
poolid = pool['poolid'] 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.append(poolid)
pools = sorted(pools) pools = sorted(pools)
return pools return pools

View file

@ -79,7 +79,7 @@ def process_expiring_vms_task():
pools = get_pools(proxmox) pools = get_pools(proxmox)
for pool in pools: for pool in pools:
expiring_vms = [] expiring_vms = []
vms = get_vms_for_user(proxmox, pool) vms = get_vms_for_user(proxmox, db, pool)
for vm in vms: for vm in vms:
vmid = vm['vmid'] vmid = vm['vmid']
expire = get_vm_expire(db, vmid, expire = get_vm_expire(db, vmid,