moved limits to main page, remove restriction for rtp creation, allow rtp to create vm for another user

This commit is contained in:
Jordan Rodgers 2017-12-13 23:08:45 -05:00
parent 2b69443930
commit 125fd58b27
8 changed files with 51 additions and 113 deletions

29
app.py
View file

@ -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):

View file

@ -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;
} }

View file

@ -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',

View file

@ -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">

View file

@ -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>

View file

@ -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 %}

View file

@ -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>

View file

@ -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>