mirror of
https://github.com/ComputerScienceHouse/proxstar.git
synced 2025-02-12 21:11:53 +00:00
moved limits to main page, remove restriction for rtp creation, allow rtp to create vm for another user
This commit is contained in:
parent
2b69443930
commit
125fd58b27
8 changed files with 51 additions and 113 deletions
29
app.py
29
app.py
|
@ -244,6 +244,7 @@ def create():
|
||||||
limits = get_user_usage_limits(user)
|
limits = get_user_usage_limits(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)
|
||||||
return render_template(
|
return render_template(
|
||||||
'create.html',
|
'create.html',
|
||||||
username=user,
|
username=user,
|
||||||
|
@ -251,7 +252,8 @@ def create():
|
||||||
usage=usage,
|
usage=usage,
|
||||||
limits=limits,
|
limits=limits,
|
||||||
percents=percents,
|
percents=percents,
|
||||||
isos=isos)
|
isos=isos,
|
||||||
|
pools=pools)
|
||||||
elif request.method == 'POST':
|
elif request.method == 'POST':
|
||||||
name = request.form['name']
|
name = request.form['name']
|
||||||
cores = request.form['cores']
|
cores = request.form['cores']
|
||||||
|
@ -260,7 +262,11 @@ def create():
|
||||||
iso = request.form['iso']
|
iso = request.form['iso']
|
||||||
if iso != 'none':
|
if iso != 'none':
|
||||||
iso = "{}:iso/{}".format(app.config['PROXMOX_ISO_STORAGE'], iso)
|
iso = "{}:iso/{}".format(app.config['PROXMOX_ISO_STORAGE'], iso)
|
||||||
|
if not rtp:
|
||||||
usage_check = check_user_usage(proxmox, user, 0, 0, disk)
|
usage_check = check_user_usage(proxmox, user, 0, 0, disk)
|
||||||
|
else:
|
||||||
|
usage_check = None
|
||||||
|
user = request.form['user']
|
||||||
if usage_check:
|
if usage_check:
|
||||||
return usage_check
|
return usage_check
|
||||||
else:
|
else:
|
||||||
|
@ -298,27 +304,6 @@ def reset_limits(user):
|
||||||
return '', 403
|
return '', 403
|
||||||
|
|
||||||
|
|
||||||
@app.route('/limits')
|
|
||||||
@auth.oidc_auth
|
|
||||||
def limits():
|
|
||||||
if 'rtp' in session['userinfo']['groups']:
|
|
||||||
user = session['userinfo']['preferred_username']
|
|
||||||
rtp = 'rtp' in session['userinfo']['groups']
|
|
||||||
proxmox = connect_proxmox()
|
|
||||||
pools = get_pools(proxmox)
|
|
||||||
pools = sorted(pools)
|
|
||||||
user_limits = []
|
|
||||||
for pool in pools:
|
|
||||||
if pool not in app.config['IGNORED_POOLS']:
|
|
||||||
limits = get_user_usage_limits(pool)
|
|
||||||
user_limits.append(
|
|
||||||
[pool, limits['cpu'], limits['mem'], limits['disk']])
|
|
||||||
return render_template(
|
|
||||||
'limits.html', username=user, rtp=rtp, user_limits=user_limits)
|
|
||||||
else:
|
|
||||||
return '', 403
|
|
||||||
|
|
||||||
|
|
||||||
@app.route('/vm/<string:vmid>/rrd/<path:path>')
|
@app.route('/vm/<string:vmid>/rrd/<path:path>')
|
||||||
@auth.oidc_auth
|
@auth.oidc_auth
|
||||||
def send_rrd(vmid, path):
|
def send_rrd(vmid, path):
|
||||||
|
|
|
@ -95,8 +95,7 @@ table, th, td {
|
||||||
padding-bottom: 0px;
|
padding-bottom: 0px;
|
||||||
width: 70px;
|
width: 70px;
|
||||||
height: 25px;
|
height: 25px;
|
||||||
margin-top: 3px;
|
margin-top: 10px;
|
||||||
margin-bottom: 3px;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.resource-usage {
|
.resource-usage {
|
||||||
|
@ -115,27 +114,26 @@ table, th, td {
|
||||||
padding-bottom: 10px;
|
padding-bottom: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.profile {
|
.user-img {
|
||||||
float: left;
|
border-radius: 50%;
|
||||||
width: 35%;
|
height: 25px;
|
||||||
height: 60px;
|
width: 25px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.profile-img {
|
.user-title {
|
||||||
max-width: 100%;
|
display: inline-block;
|
||||||
max-height: 100%;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.progress {
|
.progress {
|
||||||
margin-top: 2px;
|
margin-top: 5px;
|
||||||
margin-bottom: 0px;
|
margin-bottom: 0px;
|
||||||
float: right;
|
float: right;
|
||||||
width: 85%;
|
width: 80%;
|
||||||
height: 12px;
|
height: 12px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.resource-bar {
|
.resource-bar {
|
||||||
width: 60%;
|
width: 100%;
|
||||||
float: right;
|
float: right;
|
||||||
padding-bottom: 2px;
|
padding-bottom: 2px;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,7 @@
|
||||||
|
$(document).ready(function(){
|
||||||
|
$('[data-toggle="tooltip"]').tooltip();
|
||||||
|
});
|
||||||
|
|
||||||
$("#delete-vm").click(function(){
|
$("#delete-vm").click(function(){
|
||||||
const vmname = $(this).data('vmname')
|
const vmname = $(this).data('vmname')
|
||||||
swal({
|
swal({
|
||||||
|
@ -388,6 +392,10 @@ $("#create-vm").click(function(){
|
||||||
const mem = document.getElementById('mem').value
|
const mem = document.getElementById('mem').value
|
||||||
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')
|
||||||
|
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) {
|
||||||
|
@ -424,6 +432,9 @@ $("#create-vm").click(function(){
|
||||||
data.append('mem', mem);
|
data.append('mem', mem);
|
||||||
data.append('disk', disk);
|
data.append('disk', disk);
|
||||||
data.append('iso', iso);
|
data.append('iso', iso);
|
||||||
|
if (user) {
|
||||||
|
data.append('user', user_value);
|
||||||
|
}
|
||||||
fetch('/vm/create', {
|
fetch('/vm/create', {
|
||||||
credentials: 'same-origin',
|
credentials: 'same-origin',
|
||||||
method: 'post',
|
method: 'post',
|
||||||
|
|
|
@ -39,14 +39,6 @@
|
||||||
Create VM
|
Create VM
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
{% if rtp %}
|
|
||||||
<li>
|
|
||||||
<a href="/limits">
|
|
||||||
<span class="glyphicon glyphicon-pencil"></span>
|
|
||||||
Usage Limits
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
{% endif %}
|
|
||||||
</ul>
|
</ul>
|
||||||
<ul class="nav navbar-nav navbar-right">
|
<ul class="nav navbar-nav navbar-right">
|
||||||
<li class="dropdown navbar-user">
|
<li class="dropdown navbar-user">
|
||||||
|
|
|
@ -46,6 +46,16 @@
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
|
{% if rtp %}
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="user">User</label>
|
||||||
|
<select name="user" id="user" class="form-control">
|
||||||
|
{% for pool in pools %}
|
||||||
|
<option value="{{ pool }}">{{ pool }}</option>
|
||||||
|
{% endfor %}
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
<button class="btn btn-success" id="create-vm" name="create" data-max_disk="{{ limits['disk'] - usage['disk'] }}">CREATE</button>
|
<button class="btn btn-success" id="create-vm" name="create" data-max_disk="{{ limits['disk'] - usage['disk'] }}">CREATE</button>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -1,43 +0,0 @@
|
||||||
{% extends "base.html" %}
|
|
||||||
{% block body %}
|
|
||||||
|
|
||||||
<div class="container">
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-md-12 col-sm-12">
|
|
||||||
<div class="panel panel-default">
|
|
||||||
<div class="panel-heading">
|
|
||||||
<h3 class="panel-title">Usage Limits</h3>
|
|
||||||
</div>
|
|
||||||
<div class="panel-body">
|
|
||||||
<table class="table table-bordered table-striped usage-limit">
|
|
||||||
<thead>
|
|
||||||
<tr role="row">
|
|
||||||
<th>Username</th>
|
|
||||||
<th>CPU</th>
|
|
||||||
<th>Memory</th>
|
|
||||||
<th>Disk</th>
|
|
||||||
<th>Edit</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
{% for user_limit in user_limits %}
|
|
||||||
<tr role="row">
|
|
||||||
<td>{{ user_limit[0] }}</td>
|
|
||||||
<td>{{ user_limit[1] }}</td>
|
|
||||||
<td>{{ user_limit[2] }}</td>
|
|
||||||
<td>{{ user_limit[3] }}</td>
|
|
||||||
<td>
|
|
||||||
<button class="btn btn-info proxstar-limitbtn edit-limit" data-user="{{ user_limit[0] }}" data-cpu="{{ user_limit[1] }}" data-mem="{{ user_limit[2] }}" data-disk="{{ user_limit[3] }}">EDIT</button>
|
|
||||||
<button class="btn btn-danger proxstar-limitbtn reset-limit" data-user="{{ user_limit[0] }}">RESET</button>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
{% endfor %}
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{% endblock %}
|
|
|
@ -35,22 +35,20 @@
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
{% else %}
|
{% else %}
|
||||||
{% for pool in vms %}
|
{% for pool in vms %}
|
||||||
<div class="col-md-3 col-sm-4 col-xs-6">
|
<div class="col-md-3 col-sm-4 col-xs-12">
|
||||||
<div class="panel panel-default">
|
<div class="panel panel-default">
|
||||||
<div class="panel-heading">
|
<div class="panel-heading">
|
||||||
<h3 class="panel-title">
|
<img class="user-img pull-left" src="https://profiles.csh.rit.edu/image/{{ pool['user'] }}" title="{{ pool['user'] }}">
|
||||||
|
<h3 class="panel-title user-title">
|
||||||
<a href="/user/{{ pool['user'] }}">
|
<a href="/user/{{ pool['user'] }}">
|
||||||
<p>{{ pool['user'] }}</p>
|
{{ pool['user'] }}
|
||||||
</a>
|
</a>
|
||||||
</h3>
|
</h3>
|
||||||
</div>
|
</div>
|
||||||
<div class="panel-body">
|
<div class="panel-body">
|
||||||
<div class="profile">
|
|
||||||
<img class="profile-img" src="https://profiles.csh.rit.edu/image/{{ pool['user'] }}" title="{{ pool['user'] }}">
|
|
||||||
</div>
|
|
||||||
<div class="resource-bar">
|
<div class="resource-bar">
|
||||||
<span class="glyphicon glyphicon-cog pull-left"></span>
|
<span class="pull-left">CPU</span>
|
||||||
<div class="progress">
|
<div class="progress" data-toggle="tooltip" title="{{ pool['usage']['cpu'] }}/{{ pool['limits']['cpu'] }}">
|
||||||
{% if pool['percents']['cpu'] <= 50 %}
|
{% if pool['percents']['cpu'] <= 50 %}
|
||||||
<div class="progress-bar progress-bar-success" role="progressbar" aria-valuenow="{{ pool['percents']['cpu'] }}" aria-valuemin="0" aria-valuemax="100" style="width:{{ pool['percents']['cpu'] }}%"></div>
|
<div class="progress-bar progress-bar-success" role="progressbar" aria-valuenow="{{ pool['percents']['cpu'] }}" aria-valuemin="0" aria-valuemax="100" style="width:{{ pool['percents']['cpu'] }}%"></div>
|
||||||
{% elif pool['percents']['cpu'] <= 75 %}
|
{% elif pool['percents']['cpu'] <= 75 %}
|
||||||
|
@ -61,8 +59,8 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="resource-bar">
|
<div class="resource-bar">
|
||||||
<span class="glyphicon glyphicon-tasks pull-left"></span>
|
<span class="pull-left">MEM</span>
|
||||||
<div class="progress">
|
<div class="progress" data-toggle="tooltip" title="{{ pool['usage']['mem'] }}GB/{{ pool['limits']['mem'] }}.0GB">
|
||||||
{% if pool['percents']['mem'] <= 50 %}
|
{% if pool['percents']['mem'] <= 50 %}
|
||||||
<div class="progress-bar progress-bar-success" role="progressbar" aria-valuenow="{{ pool['percents']['mem'] }}" aria-valuemin="0" aria-valuemax="100" style="width:{{ pool['percents']['mem'] }}%"></div>
|
<div class="progress-bar progress-bar-success" role="progressbar" aria-valuenow="{{ pool['percents']['mem'] }}" aria-valuemin="0" aria-valuemax="100" style="width:{{ pool['percents']['mem'] }}%"></div>
|
||||||
{% elif pool['percents']['mem'] <= 75 %}
|
{% elif pool['percents']['mem'] <= 75 %}
|
||||||
|
@ -73,8 +71,8 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="resource-bar">
|
<div class="resource-bar">
|
||||||
<span class="glyphicon glyphicon-hdd pull-left"></span>
|
<span class="pull-left">DISK</span>
|
||||||
<div class="progress">
|
<div class="progress" data-toggle="tooltip" title="{{ pool['usage']['disk'] }}GB/{{ pool['limits']['disk'] }}GB">
|
||||||
{% if pool['percents']['disk'] <= 50 %}
|
{% if pool['percents']['disk'] <= 50 %}
|
||||||
<div class="progress-bar progress-bar-success" role="progressbar" aria-valuenow="{{ pool['percents']['disk'] }}" aria-valuemin="0" aria-valuemax="100" style="width:{{ pool['percents']['disk'] }}%"></div>
|
<div class="progress-bar progress-bar-success" role="progressbar" aria-valuenow="{{ pool['percents']['disk'] }}" aria-valuemin="0" aria-valuemax="100" style="width:{{ pool['percents']['disk'] }}%"></div>
|
||||||
{% elif pool['percents']['disk'] <= 75 %}
|
{% elif pool['percents']['disk'] <= 75 %}
|
||||||
|
@ -84,6 +82,8 @@
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<button class="btn btn-info proxstar-limitbtn edit-limit" data-user="{{ pool['user'] }}" data-cpu="{{ pool['limits']['cpu'] }}" data-mem="{{ pool['limits']['mem'] }}" data-disk="{{ pool['limits']['disk'] }}">EDIT</button>
|
||||||
|
<button class="btn btn-danger proxstar-limitbtn reset-limit" data-user="{{ pool['user'] }}">RESET</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -122,21 +122,6 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-12 col-sm-12">
|
|
||||||
<div class="panel panel-default">
|
|
||||||
<div class="panel-heading">
|
|
||||||
<h3 class="panel-title">RRD Graphs</h3>
|
|
||||||
</div>
|
|
||||||
<div class="panel-body">
|
|
||||||
<img class="rrd-graph" src="/vm/{{ vm['vmid'] }}/rrd/cpu.png">
|
|
||||||
<img class="rrd-graph" src="/vm/{{ vm['vmid'] }}/rrd/mem.png">
|
|
||||||
<img class="rrd-graph" src="/vm/{{ vm['vmid'] }}/rrd/netin.png">
|
|
||||||
<img class="rrd-graph" src="/vm/{{ vm['vmid'] }}/rrd/netout.png">
|
|
||||||
<img class="rrd-graph" src="/vm/{{ vm['vmid'] }}/rrd/diskread.png">
|
|
||||||
<img class="rrd-graph" src="/vm/{{ vm['vmid'] }}/rrd/diskwrite.png">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue