skip cpu and mem check for vm creation, verify disk size before attempting to create vm

This commit is contained in:
Jordan Rodgers 2017-12-11 18:58:16 -05:00
parent 05e08fb92d
commit 2b155903fd
4 changed files with 66 additions and 82 deletions

4
app.py
View file

@ -211,7 +211,6 @@ def create():
if request.method == 'GET': if request.method == 'GET':
usage = get_user_usage(proxmox, 'proxstar') usage = get_user_usage(proxmox, 'proxstar')
limits = get_user_usage_limits(user) limits = get_user_usage_limits(user)
full_limits = check_user_limit(proxmox, user, usage, limits)
percents = get_user_usage_percent(proxmox, usage, limits) percents = get_user_usage_percent(proxmox, usage, limits)
isos = get_isos(proxmox, app.config['PROXMOX_ISO_STORAGE']) isos = get_isos(proxmox, app.config['PROXMOX_ISO_STORAGE'])
return render_template( return render_template(
@ -219,7 +218,6 @@ def create():
username='com6056', username='com6056',
usage=usage, usage=usage,
limits=limits, limits=limits,
full_limits=full_limits,
percents=percents, percents=percents,
isos=isos) isos=isos)
elif request.method == 'POST': elif request.method == 'POST':
@ -230,7 +228,7 @@ 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)
usage_check = check_user_usage(proxmox, user, cores, memory, disk) usage_check = check_user_usage(proxmox, user, 0, 0, disk)
if usage_check: if usage_check:
return usage_check return usage_check
else: else:

View file

@ -137,21 +137,6 @@ def get_user_usage(proxmox, user):
return usage return usage
def check_user_limit(proxmox, user, usage=None, limits=None):
full_limits = []
if not usage:
usage = get_user_usage(proxmox, user)
if not limits:
limits = get_user_usage_limits(user)
if usage['cpu'] >= limits['cpu']:
full_limits.append('CPU')
if usage['mem'] >= limits['mem']:
full_limits.append('Memory')
if usage['disk'] >= limits['disk']:
full_limits.append('Disk')
return full_limits
def check_user_usage(proxmox, user, vm_cpu, vm_mem, vm_disk): def check_user_usage(proxmox, user, vm_cpu, vm_mem, vm_disk):
limits = get_user_usage_limits(user) limits = get_user_usage_limits(user)
cur_usage = get_user_usage(proxmox, user) cur_usage = get_user_usage(proxmox, user)

View file

@ -388,62 +388,67 @@ $("#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 max_disk = $(this).data('max_disk')
if (name && disk) { if (name && disk) {
fetch(`/proxstar/hostname/${name}`, { if (disk > max_disk) {
credentials: 'same-origin', swal("Uh oh...", `You do not have enough disk resources available! Please lower the VM disk size to ${max_disk} GB or lower.`, "error");
}).then((response) => { } else {
return response.text() fetch(`/proxstar/hostname/${name}`, {
}).then((text) => { credentials: 'same-origin',
if (text == 'ok') { }).then((response) => {
var loader = document.createElement('div'); return response.text()
loader.setAttribute('class', 'loader'); }).then((text) => {
var info = document.createElement('span'); if (text == 'ok') {
info.innerHTML = `Cores: ${cores}<br>Memory: ${mem/1024} GB<br>Disk: ${disk} GB<br>ISO: ${iso}`, var loader = document.createElement('div');
swal({ loader.setAttribute('class', 'loader');
title: `Are you sure you want to create ${name}?`, var info = document.createElement('span');
content: info, info.innerHTML = `Cores: ${cores}<br>Memory: ${mem/1024} GB<br>Disk: ${disk} GB<br>ISO: ${iso}`,
icon: "info", swal({
buttons: { title: `Are you sure you want to create ${name}?`,
cancel: true, content: info,
create: { icon: "info",
text: "Create", buttons: {
closeModal: false, cancel: true,
className: "swal-button", create: {
text: "Create",
closeModal: false,
className: "swal-button",
}
} }
} })
}) .then((willCreate) => {
.then((willCreate) => { if (willCreate) {
if (willCreate) { var data = new FormData();
var data = new FormData(); data.append('name', name);
data.append('name', name); data.append('cores', cores);
data.append('cores', cores); data.append('mem', mem);
data.append('mem', mem); data.append('disk', disk);
data.append('disk', disk); data.append('iso', iso);
data.append('iso', iso); fetch('/proxstar/vm/create', {
fetch('/proxstar/vm/create', { credentials: 'same-origin',
credentials: 'same-origin', method: 'post',
method: 'post', body: data
body: data }).then((response) => {
}).then((response) => { return response.text()
return response.text() }).then((vmid) => {
}).then((vmid) => { window.location = `/proxstar/vm/${vmid}`;
window.location = `/proxstar/vm/${vmid}`; });
}); }
} });
}); } else if (text == 'invalid') {
} else if (text == 'invalid') { swal("Uh oh...", `That name is not a valid name! Please try another name.`, "error");
swal("Uh oh...", `That name is not a valid name! Please try another name.`, "error"); } else if (text == 'taken') {
} else if (text == 'taken') { swal("Uh oh...", `That name is not available! Please try another name.`, "error");
swal("Uh oh...", `That name is not available! Please try another name.`, "error"); }
} }).catch(err => {
}).catch(err => { if (err) {
if (err) { swal("Uh oh...", `Unable to verify name! Please try again later.`, "error");
swal("Uh oh...", `Unable to verify name. Please try again later.`, "error"); } else {
} else { swal.stopLoading();
swal.stopLoading(); swal.close();
swal.close(); }
} });
}); }
} else if (!name && !disk) { } else if (!name && !disk) {
swal("Uh oh...", `You must enter a name and disk size for your VM!`, "error"); swal("Uh oh...", `You must enter a name and disk size for your VM!`, "error");
} else if (!name) { } else if (!name) {

View file

@ -9,12 +9,8 @@
<h3 class="panel-title">Create VM</h3> <h3 class="panel-title">Create VM</h3>
</div> </div>
<div class="panel-body"> <div class="panel-body">
{% if full_limits %} {% if limits['disk'] - usage['disk'] <= 0 %}
<p>You have reached your limit for the following resources:</p> <p>Before you can create any more VMs, you must first delete existing VMs until you have enough disk resources available.</p>
{% for limit in full_limits %}
<p><strong>{{ limit }}</strong></p>
{% endfor %}
<p>Before you can create any more VMs, you must first either power off (CPU/Memory) or delete (Disk) existing VMs until you have enough resources available.</p>
{% else %} {% else %}
<div class="form-group"> <div class="form-group">
<label for="name">VM Name</label> <label for="name">VM Name</label>
@ -23,7 +19,7 @@
<div class="form-group"> <div class="form-group">
<label for="cores">Cores</label> <label for="cores">Cores</label>
<select name="cores" id="cores" class="form-control"> <select name="cores" id="cores" class="form-control">
{% for i in range(1, limits['cpu'] - usage['cpu'] + 1) %} {% for i in range(1, limits['cpu'] + 1) %}
<option value="{{ i }}">{{ i }}</option> <option value="{{ i }}">{{ i }}</option>
{% endfor %} {% endfor %}
</select> </select>
@ -31,14 +27,14 @@
<div class="form-group"> <div class="form-group">
<label for="mem">Memory</label> <label for="mem">Memory</label>
<select name="mem" id="mem" class="form-control"> <select name="mem" id="mem" class="form-control">
{% for i in range(1, limits['mem'] - usage['mem'] + 1) %} {% for i in range(1, limits['mem'] + 1) %}
<option value="{{ i * 1024 }}">{{ i }}GB</option> <option value="{{ i * 1024 }}">{{ i }}GB</option>
{% endfor %} {% endfor %}
</select> </select>
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="disk">Disk</label> <label for="disk">Disk</label>
<input type="text" name="disk" id="disk" class="form-control"> <input type="number" name="disk" id="disk" class="form-control" min="1" max="{{ limits['disk'] - usage['disk'] }}">
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="iso">ISO</label> <label for="iso">ISO</label>
@ -49,7 +45,7 @@
{% endfor %} {% endfor %}
</select> </select>
</div> </div>
<button class="btn btn-success" id="create-vm" name="create">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>
</div> </div>