mirror of
https://github.com/ComputerScienceHouse/proxstar.git
synced 2025-02-12 13:01:51 +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
31
app.py
31
app.py
|
@ -244,6 +244,7 @@ def create():
|
|||
limits = get_user_usage_limits(user)
|
||||
percents = get_user_usage_percent(proxmox, user, usage, limits)
|
||||
isos = get_isos(proxmox, app.config['PROXMOX_ISO_STORAGE'])
|
||||
pools = get_pools(proxmox)
|
||||
return render_template(
|
||||
'create.html',
|
||||
username=user,
|
||||
|
@ -251,7 +252,8 @@ def create():
|
|||
usage=usage,
|
||||
limits=limits,
|
||||
percents=percents,
|
||||
isos=isos)
|
||||
isos=isos,
|
||||
pools=pools)
|
||||
elif request.method == 'POST':
|
||||
name = request.form['name']
|
||||
cores = request.form['cores']
|
||||
|
@ -260,7 +262,11 @@ def create():
|
|||
iso = request.form['iso']
|
||||
if iso != 'none':
|
||||
iso = "{}:iso/{}".format(app.config['PROXMOX_ISO_STORAGE'], iso)
|
||||
usage_check = check_user_usage(proxmox, user, 0, 0, disk)
|
||||
if not rtp:
|
||||
usage_check = check_user_usage(proxmox, user, 0, 0, disk)
|
||||
else:
|
||||
usage_check = None
|
||||
user = request.form['user']
|
||||
if usage_check:
|
||||
return usage_check
|
||||
else:
|
||||
|
@ -298,27 +304,6 @@ def reset_limits(user):
|
|||
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>')
|
||||
@auth.oidc_auth
|
||||
def send_rrd(vmid, path):
|
||||
|
|
|
@ -95,8 +95,7 @@ table, th, td {
|
|||
padding-bottom: 0px;
|
||||
width: 70px;
|
||||
height: 25px;
|
||||
margin-top: 3px;
|
||||
margin-bottom: 3px;
|
||||
margin-top: 10px;
|
||||
}
|
||||
|
||||
.resource-usage {
|
||||
|
@ -115,27 +114,26 @@ table, th, td {
|
|||
padding-bottom: 10px;
|
||||
}
|
||||
|
||||
.profile {
|
||||
float: left;
|
||||
width: 35%;
|
||||
height: 60px;
|
||||
.user-img {
|
||||
border-radius: 50%;
|
||||
height: 25px;
|
||||
width: 25px;
|
||||
}
|
||||
|
||||
.profile-img {
|
||||
max-width: 100%;
|
||||
max-height: 100%;
|
||||
.user-title {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.progress {
|
||||
margin-top: 2px;
|
||||
margin-top: 5px;
|
||||
margin-bottom: 0px;
|
||||
float: right;
|
||||
width: 85%;
|
||||
width: 80%;
|
||||
height: 12px;
|
||||
}
|
||||
|
||||
.resource-bar {
|
||||
width: 60%;
|
||||
width: 100%;
|
||||
float: right;
|
||||
padding-bottom: 2px;
|
||||
}
|
||||
|
|
|
@ -1,3 +1,7 @@
|
|||
$(document).ready(function(){
|
||||
$('[data-toggle="tooltip"]').tooltip();
|
||||
});
|
||||
|
||||
$("#delete-vm").click(function(){
|
||||
const vmname = $(this).data('vmname')
|
||||
swal({
|
||||
|
@ -388,6 +392,10 @@ $("#create-vm").click(function(){
|
|||
const mem = document.getElementById('mem').value
|
||||
const disk = document.getElementById('disk').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')
|
||||
if (name && disk) {
|
||||
if (disk > max_disk) {
|
||||
|
@ -424,6 +432,9 @@ $("#create-vm").click(function(){
|
|||
data.append('mem', mem);
|
||||
data.append('disk', disk);
|
||||
data.append('iso', iso);
|
||||
if (user) {
|
||||
data.append('user', user_value);
|
||||
}
|
||||
fetch('/vm/create', {
|
||||
credentials: 'same-origin',
|
||||
method: 'post',
|
||||
|
|
|
@ -39,14 +39,6 @@
|
|||
Create VM
|
||||
</a>
|
||||
</li>
|
||||
{% if rtp %}
|
||||
<li>
|
||||
<a href="/limits">
|
||||
<span class="glyphicon glyphicon-pencil"></span>
|
||||
Usage Limits
|
||||
</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
</ul>
|
||||
<ul class="nav navbar-nav navbar-right">
|
||||
<li class="dropdown navbar-user">
|
||||
|
|
|
@ -46,6 +46,16 @@
|
|||
{% endfor %}
|
||||
</select>
|
||||
</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>
|
||||
{% endif %}
|
||||
</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 %}
|
||||
{% else %}
|
||||
{% 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-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'] }}">
|
||||
<p>{{ pool['user'] }}</p>
|
||||
{{ pool['user'] }}
|
||||
</a>
|
||||
</h3>
|
||||
</div>
|
||||
<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">
|
||||
<span class="glyphicon glyphicon-cog pull-left"></span>
|
||||
<div class="progress">
|
||||
<span class="pull-left">CPU</span>
|
||||
<div class="progress" data-toggle="tooltip" title="{{ pool['usage']['cpu'] }}/{{ pool['limits']['cpu'] }}">
|
||||
{% 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>
|
||||
{% elif pool['percents']['cpu'] <= 75 %}
|
||||
|
@ -61,8 +59,8 @@
|
|||
</div>
|
||||
</div>
|
||||
<div class="resource-bar">
|
||||
<span class="glyphicon glyphicon-tasks pull-left"></span>
|
||||
<div class="progress">
|
||||
<span class="pull-left">MEM</span>
|
||||
<div class="progress" data-toggle="tooltip" title="{{ pool['usage']['mem'] }}GB/{{ pool['limits']['mem'] }}.0GB">
|
||||
{% 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>
|
||||
{% elif pool['percents']['mem'] <= 75 %}
|
||||
|
@ -73,8 +71,8 @@
|
|||
</div>
|
||||
</div>
|
||||
<div class="resource-bar">
|
||||
<span class="glyphicon glyphicon-hdd pull-left"></span>
|
||||
<div class="progress">
|
||||
<span class="pull-left">DISK</span>
|
||||
<div class="progress" data-toggle="tooltip" title="{{ pool['usage']['disk'] }}GB/{{ pool['limits']['disk'] }}GB">
|
||||
{% 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>
|
||||
{% elif pool['percents']['disk'] <= 75 %}
|
||||
|
@ -84,6 +82,8 @@
|
|||
{% endif %}
|
||||
</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>
|
||||
|
|
|
@ -122,21 +122,6 @@
|
|||
</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>
|
||||
|
||||
|
|
Loading…
Reference in a new issue