change db to postgres, fix rtp functions, change how db is connected

This commit is contained in:
Jordan Rodgers 2018-01-23 23:12:19 -05:00
parent af451f6176
commit 1d094b1e25
10 changed files with 113 additions and 113 deletions

1
.gitignore vendored
View file

@ -1,3 +1,4 @@
config.local.py config.local.py
__pycache__/* __pycache__/*
*/__pycache__/*
rrd/* rrd/*

View file

@ -2,7 +2,10 @@ from os import environ
# Proxstar # Proxstar
VM_EXPIRE_MONTHS = int(environ.get('PROXSTAR_VM_EXPIRE_MONTHS', '3')) VM_EXPIRE_MONTHS = int(environ.get('PROXSTAR_VM_EXPIRE_MONTHS', '3'))
IGNORED_POOLS = [pool.strip() for pool in environ.get('PROXSTAR_IGNORED_POOLS', '').split(',')] IGNORED_POOLS = [
pool.strip()
for pool in environ.get('PROXSTAR_IGNORED_POOLS', '').split(',')
]
# Flask # Flask
IP = environ.get('PROXSTAR_IP', '0.0.0.0') IP = environ.get('PROXSTAR_IP', '0.0.0.0')
@ -11,11 +14,17 @@ SERVER_NAME = environ.get('PROXSTAR_SERVER_NAME', 'proxstar.csh.rit.edu')
SECRET_KEY = environ.get('PROXSTAR_SECRET_KEY', '') SECRET_KEY = environ.get('PROXSTAR_SECRET_KEY', '')
# OIDC # OIDC
OIDC_ISSUER = environ.get('PROXSTAR_OIDC_ISSUER', 'https://sso.csh.rit.edu/auth/realms/csh') OIDC_ISSUER = environ.get('PROXSTAR_OIDC_ISSUER',
'https://sso.csh.rit.edu/auth/realms/csh')
OIDC_CLIENT_CONFIG = { OIDC_CLIENT_CONFIG = {
'client_id': environ.get('PROXSTAR_CLIENT_ID', 'proxstar'), 'client_id':
'client_secret': environ.get('PROXSTAR_CLIENT_SECRET', ''), environ.get('PROXSTAR_CLIENT_ID', 'proxstar'),
'post_logout_redirect_uris': [environ.get('PROXSTAR_REDIRECT_URI', 'https://proxstar.csh.rit.edu/logout')] 'client_secret':
environ.get('PROXSTAR_CLIENT_SECRET', ''),
'post_logout_redirect_uris': [
environ.get('PROXSTAR_REDIRECT_URI',
'https://proxstar.csh.rit.edu/logout')
]
} }
# Proxmox # Proxmox

View file

@ -3,6 +3,8 @@ import time
import subprocess import subprocess
from rq import Queue from rq import Queue
from redis import Redis from redis import Redis
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from werkzeug.contrib.cache import SimpleCache from werkzeug.contrib.cache import SimpleCache
from flask_pyoidc.flask_pyoidc import OIDCAuthentication from flask_pyoidc.flask_pyoidc import OIDCAuthentication
from flask import Flask, render_template, request, redirect, send_from_directory, session from flask import Flask, render_template, request, redirect, send_from_directory, session
@ -16,8 +18,11 @@ redis_conn = Redis()
q = Queue(connection=redis_conn) q = Queue(connection=redis_conn)
app = Flask(__name__) app = Flask(__name__)
if os.path.exists(os.path.join(app.config.get('ROOT_DIR', os.getcwd()), "config.local.py")): if os.path.exists(
config = os.path.join(app.config.get('ROOT_DIR', os.getcwd()), "config.local.py") os.path.join(
app.config.get('ROOT_DIR', os.getcwd()), "config.local.py")):
config = os.path.join(
app.config.get('ROOT_DIR', os.getcwd()), "config.local.py")
else: else:
config = os.path.join(app.config.get('ROOT_DIR', os.getcwd()), "config.py") config = os.path.join(app.config.get('ROOT_DIR', os.getcwd()), "config.py")
app.config.from_pyfile(config) app.config.from_pyfile(config)
@ -29,6 +34,11 @@ auth = OIDCAuthentication(
client_registration_info=app.config['OIDC_CLIENT_CONFIG']) client_registration_info=app.config['OIDC_CLIENT_CONFIG'])
cache = SimpleCache() cache = SimpleCache()
engine = create_engine(app.config['SQLALCHEMY_DATABASE_URI'])
Base.metadata.bind = engine
DBSession = sessionmaker(bind=engine)
db = DBSession()
starrs = psycopg2.connect( starrs = psycopg2.connect(
"dbname='{}' user='{}' host='{}' password='{}'".format( "dbname='{}' user='{}' host='{}' password='{}'".format(
app.config['STARRS_DB_NAME'], app.config['STARRS_DB_USER'], app.config['STARRS_DB_NAME'], app.config['STARRS_DB_USER'],
@ -39,10 +49,6 @@ starrs = psycopg2.connect(
@app.route("/user/<string:user>") @app.route("/user/<string:user>")
@auth.oidc_auth @auth.oidc_auth
def list_vms(user=None): def list_vms(user=None):
print(q.jobs)
for job_id in q.job_ids:
print(job_id)
print(q.fetch_job(job_id).result)
rtp_view = False rtp_view = False
rtp = 'rtp' in session['userinfo']['groups'] rtp = 'rtp' in session['userinfo']['groups']
active = 'active' in session['userinfo']['groups'] active = 'active' in session['userinfo']['groups']
@ -57,7 +63,7 @@ def list_vms(user=None):
user = session['userinfo']['preferred_username'] user = session['userinfo']['preferred_username']
vms = cache.get('vms') vms = cache.get('vms')
if vms is None: if vms is None:
vms = get_vms_for_rtp(proxmox) vms = get_vms_for_rtp(proxmox, db)
cache.set('vms', vms, timeout=5 * 60) cache.set('vms', vms, timeout=5 * 60)
rtp_view = True rtp_view = True
else: else:
@ -87,7 +93,6 @@ def isos():
@app.route("/hostname/<string:name>") @app.route("/hostname/<string:name>")
@auth.oidc_auth @auth.oidc_auth
def hostname(name): def hostname(name):
starrs = connect_starrs()
valid, available = check_hostname(starrs, name) valid, available = check_hostname(starrs, name)
if not valid: if not valid:
return 'invalid' return 'invalid'
@ -104,7 +109,6 @@ 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()
starrs = connect_starrs()
if 'rtp' in session['userinfo']['groups'] or int( if 'rtp' in session['userinfo']['groups'] or int(
vmid) in get_user_allowed_vms(proxmox, user): vmid) in get_user_allowed_vms(proxmox, user):
vm = get_vm(proxmox, vmid) vm = get_vm(proxmox, vmid)
@ -119,10 +123,11 @@ def vm_details(vmid):
[interface[0], [interface[0],
get_ip_for_mac(starrs, interface[1])]) get_ip_for_mac(starrs, interface[1])])
vm['expire'] = get_vm_expire( vm['expire'] = get_vm_expire(
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, user)
limits = get_user_usage_limits(user) limits = get_user_usage_limits(db, user)
usage_check = check_user_usage(proxmox, user, vm['config']['cores'], usage_check = check_user_usage(proxmox, db, user,
vm['config']['cores'],
vm['config']['memory'], 0) vm['config']['memory'], 0)
return render_template( return render_template(
'vm_details.html', 'vm_details.html',
@ -207,7 +212,6 @@ def vm_mem(vmid, mem):
def vm_renew(vmid): def vm_renew(vmid):
user = session['userinfo']['preferred_username'] user = session['userinfo']['preferred_username']
proxmox = connect_proxmox() proxmox = connect_proxmox()
starrs = connect_starrs()
if int(vmid) in get_user_allowed_vms( if int(vmid) in get_user_allowed_vms(
proxmox, user) or 'rtp' in session['userinfo']['groups']: proxmox, user) or 'rtp' in session['userinfo']['groups']:
renew_vm_expire(vmid, app.config['VM_EXPIRE_MONTHS']) renew_vm_expire(vmid, app.config['VM_EXPIRE_MONTHS'])
@ -249,9 +253,9 @@ def iso_mount(vmid, iso):
@auth.oidc_auth @auth.oidc_auth
def delete(vmid): def delete(vmid):
user = session['userinfo']['preferred_username'] user = session['userinfo']['preferred_username']
rtp = 'rtp' in session['userinfo']['groups']
proxmox = connect_proxmox() proxmox = connect_proxmox()
starrs = connect_starrs() if rtp or int(vmid) in get_user_allowed_vms(
if int(vmid) in get_user_allowed_vms(
proxmox, user) or 'rtp' in session['userinfo']['groups']: proxmox, user) or 'rtp' in session['userinfo']['groups']:
q.enqueue(delete_vm_task, vmid) q.enqueue(delete_vm_task, vmid)
return '', 200 return '', 200
@ -266,11 +270,10 @@ def create():
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()
starrs = connect_starrs()
if active: if active:
if request.method == 'GET': if request.method == 'GET':
usage = get_user_usage(proxmox, user) usage = get_user_usage(proxmox, user)
limits = get_user_usage_limits(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'])
pools = get_pools(proxmox) pools = get_pools(proxmox)

View file

@ -1,73 +1,64 @@
import datetime import datetime
from sqlalchemy import create_engine, exists from sqlalchemy import exists
from sqlalchemy.orm import sessionmaker
from dateutil.relativedelta import relativedelta from dateutil.relativedelta import relativedelta
from proxstar.ldapdb import * from proxstar.ldapdb import *
from proxstar.db_init import VM_Expiration, Usage_Limit, Base from proxstar.models import VM_Expiration, Usage_Limit, Base
engine = create_engine('sqlite:///proxstar.db')
Base.metadata.bind = engine
DBSession = sessionmaker(bind=engine)
session = DBSession()
def get_vm_expire(vmid, months): def get_vm_expire(db, vmid, months):
if session.query(exists().where(VM_Expiration.id == vmid)).scalar(): if db.query(exists().where(VM_Expiration.id == vmid)).scalar():
expire = session.query(VM_Expiration).filter( expire = db.query(VM_Expiration).filter(
VM_Expiration.id == vmid).one().expire_date VM_Expiration.id == vmid).one().expire_date
else: else:
expire = datetime.date.today() + relativedelta(months=months) expire = datetime.date.today() + relativedelta(months=months)
new_expire = VM_Expiration(id=vmid, expire_date=expire) new_expire = VM_Expiration(id=vmid, expire_date=expire)
session.add(new_expire) db.add(new_expire)
session.commit() db.commit()
return expire return expire
def renew_vm_expire(vmid, months): def renew_vm_expire(db, vmid, months):
if session.query(exists().where(VM_Expiration.id == vmid)).scalar(): if db.query(exists().where(VM_Expiration.id == vmid)).scalar():
expire = session.query(VM_Expiration).filter( expire = db.query(VM_Expiration).filter(VM_Expiration.id == vmid).one()
VM_Expiration.id == vmid).one()
new_expire = datetime.date.today() + relativedelta(months=months) new_expire = datetime.date.today() + relativedelta(months=months)
expire.expire_date = new_expire expire.expire_date = new_expire
session.commit() db.commit()
else: else:
expire = datetime.date.today() + relativedelta(months=months) expire = datetime.date.today() + relativedelta(months=months)
new_expire = VM_Expiration(id=vmid, expire_date=expire) new_expire = VM_Expiration(id=vmid, expire_date=expire)
session.add(new_expire) db.add(new_expire)
session.commit() db.commit()
def delete_vm_expire(vmid): def delete_vm_expire(db, vmid):
if session.query(exists().where(VM_Expiration.id == vmid)).scalar(): if db.query(exists().where(VM_Expiration.id == vmid)).scalar():
expire = session.query(VM_Expiration).filter( expire = db.query(VM_Expiration).filter(VM_Expiration.id == vmid).one()
VM_Expiration.id == vmid).one() db.delete(expire)
session.delete(expire) db.commit()
session.commit()
def get_expired_vms(): def get_expired_vms(db):
expired = [] expired = []
today = datetime.date.today().strftime('%Y-%m-%d') today = datetime.date.today().strftime('%Y-%m-%d')
expire = session.query(VM_Expiration).filter( expire = db.query(VM_Expiration).filter(
VM_Expiration.expire_date < today).all() VM_Expiration.expire_date < today).all()
for vm in expire: for vm in expire:
expired.append(vm.id) expired.append(vm.id)
return expired return expired
def get_user_usage_limits(user): def get_user_usage_limits(db, user):
limits = dict() limits = dict()
if is_rtp(user): if is_rtp(user):
limits['cpu'] = 1000 limits['cpu'] = 1000
limits['mem'] = 1000 limits['mem'] = 1000
limits['disk'] = 100000 limits['disk'] = 100000
elif session.query(exists().where(Usage_Limit.id == user)).scalar(): elif db.query(exists().where(Usage_Limit.id == user)).scalar():
limits['cpu'] = session.query(Usage_Limit).filter( limits['cpu'] = db.query(Usage_Limit).filter(
Usage_Limit.id == user).one().cpu Usage_Limit.id == user).one().cpu
limits['mem'] = session.query(Usage_Limit).filter( limits['mem'] = db.query(Usage_Limit).filter(
Usage_Limit.id == user).one().mem Usage_Limit.id == user).one().mem
limits['disk'] = session.query(Usage_Limit).filter( limits['disk'] = db.query(Usage_Limit).filter(
Usage_Limit.id == user).one().disk Usage_Limit.id == user).one().disk
else: else:
limits['cpu'] = 4 limits['cpu'] = 4
@ -76,23 +67,21 @@ def get_user_usage_limits(user):
return limits return limits
def set_user_usage_limits(user, cpu, mem, disk): def set_user_usage_limits(db, user, cpu, mem, disk):
if session.query(exists().where(Usage_Limit.id == user)).scalar(): if db.query(exists().where(Usage_Limit.id == user)).scalar():
limits = session.query(Usage_Limit).filter( limits = db.query(Usage_Limit).filter(Usage_Limit.id == user).one()
Usage_Limit.id == user).one()
limits.cpu = cpu limits.cpu = cpu
limits.mem = mem limits.mem = mem
limits.disk = disk limits.disk = disk
session.commit() db.commit()
else: else:
limits = Usage_Limit(id=user, cpu=cpu, mem=mem, disk=disk) limits = Usage_Limit(id=user, cpu=cpu, mem=mem, disk=disk)
session.add(limits) db.add(limits)
session.commit() db.commit()
def delete_user_usage_limits(user): def delete_user_usage_limits(db, user):
if session.query(exists().where(Usage_Limit.id == user)).scalar(): if db.query(exists().where(Usage_Limit.id == user)).scalar():
limits = session.query(Usage_Limit).filter( limits = db.query(Usage_Limit).filter(Usage_Limit.id == user).one()
Usage_Limit.id == user).one() db.delete(limits)
session.delete(limits) db.commit()
session.commit()

View file

@ -17,7 +17,7 @@ def is_rtp(user):
return rtp_group.check_member(ldap.get_member(user, uid=True)) return rtp_group.check_member(ldap.get_member(user, uid=True))
def is_active(ldap, user): def is_active(user):
ldap = connect_ldap() ldap = connect_ldap()
rtp_group = ldap.get_group('active') rtp_group = ldap.get_group('active')
return rtp_group.check_member(ldap.get_member(user, uid=True)) return rtp_group.check_member(ldap.get_member(user, uid=True))

View file

@ -1,7 +1,5 @@
from sqlalchemy import Column, ForeignKey, Integer, String, Date from sqlalchemy import Column, Integer, String, Date
from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship
from sqlalchemy import create_engine
Base = declarative_base() Base = declarative_base()
@ -18,8 +16,3 @@ class Usage_Limit(Base):
cpu = Column(Integer, nullable=False) cpu = Column(Integer, nullable=False)
mem = Column(Integer, nullable=False) mem = Column(Integer, nullable=False)
disk = Column(Integer, nullable=False) disk = Column(Integer, nullable=False)
engine = create_engine('sqlite:///proxstar.db')
Base.metadata.create_all(engine)

View file

@ -1,7 +1,5 @@
import time import time
from functools import lru_cache
from proxmoxer import ProxmoxAPI from proxmoxer import ProxmoxAPI
from flask import current_app as app
from proxstar.db import * from proxstar.db import *
from proxstar.ldapdb import * from proxstar.ldapdb import *
@ -41,7 +39,7 @@ def get_vms_for_user(proxmox, user):
return vms return vms
def get_vms_for_rtp(proxmox): def get_vms_for_rtp(proxmox, db):
pools = get_pools(proxmox) pools = get_pools(proxmox)
pool_vms = [] pool_vms = []
for pool in pools: for pool in pools:
@ -50,7 +48,7 @@ def get_vms_for_rtp(proxmox):
pool_dict['vms'] = get_vms_for_user(proxmox, pool) pool_dict['vms'] = get_vms_for_user(proxmox, 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, pool)
pool_dict['limits'] = get_user_usage_limits(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'])
pool_vms.append(pool_dict) pool_vms.append(pool_dict)
@ -177,8 +175,8 @@ def get_user_usage(proxmox, user):
return usage return usage
def check_user_usage(proxmox, 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(user) limits = get_user_usage_limits(db, user)
cur_usage = get_user_usage(proxmox, user) cur_usage = get_user_usage(proxmox, 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'
@ -203,7 +201,7 @@ def get_user_usage_percent(proxmox, user, usage=None, limits=None):
return percents return percents
def create_vm(proxmox, starrs, user, name, cores, memory, disk, iso): def create_vm(proxmox, user, name, cores, memory, disk, iso):
node = proxmox.nodes(get_node_least_mem(proxmox)) node = proxmox.nodes(get_node_least_mem(proxmox))
vmid = get_free_vmid(proxmox) vmid = get_free_vmid(proxmox)
node.qemu.create( node.qemu.create(
@ -228,7 +226,7 @@ def create_vm(proxmox, starrs, user, name, cores, memory, disk, iso):
return vmid, mac return vmid, mac
def delete_vm(proxmox, starrs, vmid): def delete_vm(proxmox, vmid):
node = proxmox.nodes(get_vm_node(proxmox, vmid)) node = proxmox.nodes(get_vm_node(proxmox, vmid))
node.qemu(vmid).delete() node.qemu(vmid).delete()

View file

@ -2,18 +2,6 @@ import psycopg2
from flask import current_app as app from flask import current_app as app
def connect_starrs():
try:
starrs = psycopg2.connect(
"dbname='{}' user='{}' host='{}' password='{}'".format(
app.config['STARRS_DB_NAME'], app.config['STARRS_DB_USER'],
app.config['STARRS_DB_HOST'], app.config['STARRS_DB_PASS']))
except:
print("Unable to connect to STARRS database.")
raise
return starrs
def get_next_ip(starrs, range_name): def get_next_ip(starrs, range_name):
c = starrs.cursor() c = starrs.cursor()
try: try:

View file

@ -393,9 +393,6 @@ $("#create-vm").click(function(){
const disk = document.getElementById('disk').value const disk = document.getElementById('disk').value
const iso = document.getElementById('iso').value const iso = document.getElementById('iso').value
const user = document.getElementById('user') const user = document.getElementById('user')
if (user) {
const user_value = user.value
}
const max_disk = $(this).data('max_disk') const max_disk = $(this).data('max_disk')
if (name && disk) { if (name && disk) {
if (disk > max_disk) { if (disk > max_disk) {
@ -433,7 +430,7 @@ $("#create-vm").click(function(){
data.append('disk', disk); data.append('disk', disk);
data.append('iso', iso); data.append('iso', iso);
if (user) { if (user) {
data.append('user', user_value); data.append('user', user.value);
} }
fetch('/vm/create', { fetch('/vm/create', {
credentials: 'same-origin', credentials: 'same-origin',
@ -640,9 +637,6 @@ $(".edit-limit").click(function(){
}) })
.then((willChange) => { .then((willChange) => {
if (willChange) { if (willChange) {
console.log($(cpu).val());
console.log($(mem).val());
console.log($(disk).val());
var data = new FormData(); var data = new FormData();
data.append('cpu', $(cpu).val()); data.append('cpu', $(cpu).val());
data.append('mem', $(mem).val()); data.append('mem', $(mem).val());

View file

@ -1,34 +1,59 @@
import os import os
from flask import Flask
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from proxstar.db import * from proxstar.db import *
from proxstar.starrs import * from proxstar.starrs import *
from proxstar.proxmox import * from proxstar.proxmox import *
from flask import Flask, current_app
app = Flask(__name__) app = Flask(__name__)
config = os.path.join(app.config.get('ROOT_DIR', os.getcwd()), "config.py") if os.path.exists(
os.path.join(
app.config.get('ROOT_DIR', os.getcwd()), "config.local.py")):
config = os.path.join(
app.config.get('ROOT_DIR', os.getcwd()), "config.local.py")
else:
config = os.path.join(app.config.get('ROOT_DIR', os.getcwd()), "config.py")
app.config.from_pyfile(config) app.config.from_pyfile(config)
def connect_db():
engine = create_engine(app.config['SQLALCHEMY_DATABASE_URI'])
Base.metadata.bind = engine
DBSession = sessionmaker(bind=engine)
db = DBSession()
return db
def connect_starrs():
starrs = psycopg2.connect(
"dbname='{}' user='{}' host='{}' password='{}'".format(
app.config['STARRS_DB_NAME'], app.config['STARRS_DB_USER'],
app.config['STARRS_DB_HOST'], app.config['STARRS_DB_PASS']))
return starrs
def create_vm_task(user, name, cores, memory, disk, iso): def create_vm_task(user, name, cores, memory, disk, iso):
with app.app_context(): with app.app_context():
proxmox = connect_proxmox() proxmox = connect_proxmox()
db = connect_db()
starrs = connect_starrs() starrs = connect_starrs()
vmid, mac = create_vm(proxmox, starrs, user, name, cores, memory, disk, vmid, mac = create_vm(proxmox, user, name, cores, memory, disk, iso)
iso)
register_starrs(starrs, name, app.config['STARRS_USER'], mac, register_starrs(starrs, name, app.config['STARRS_USER'], mac,
get_next_ip(starrs, get_next_ip(starrs,
app.config['STARRS_IP_RANGE'])[0][0]) app.config['STARRS_IP_RANGE'])[0][0])
get_vm_expire(vmid, app.config['VM_EXPIRE_MONTHS']) get_vm_expire(db, vmid, app.config['VM_EXPIRE_MONTHS'])
def delete_vm_task(vmid): def delete_vm_task(vmid):
with app.app_context(): with app.app_context():
proxmox = connect_proxmox() proxmox = connect_proxmox()
db = connect_db()
starrs = connect_starrs() starrs = connect_starrs()
vmname = get_vm_config(proxmox, vmid)['name'] vmname = get_vm_config(proxmox, vmid)['name']
delete_vm(proxmox, starrs, vmid) delete_vm(proxmox, vmid)
delete_starrs(starrs, vmname) delete_starrs(starrs, vmname)
delete_vm_expire(vmid) delete_vm_expire(db, vmid)
def process_expired_vms_task(): def process_expired_vms_task():