mirror of
https://github.com/retspen/webvirtcloud
synced 2024-12-25 15:45:23 +00:00
Merge pull request #255 from catborise/master
Some Updates & Rearrange/fix
This commit is contained in:
commit
fb26a002c2
44 changed files with 3380 additions and 3223 deletions
|
@ -30,11 +30,11 @@
|
||||||
<table class="table table-striped table-hover">
|
<table class="table table-striped table-hover">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th>Username</th>
|
<th>{% trans "Username" %}</th>
|
||||||
<th>Status</th>
|
<th>{% trans "Status" %}</th>
|
||||||
<th>Staff</th>
|
<th>{% trans "Staff" %}</th>
|
||||||
<th>Superuser</th>
|
<th>{% trans "Superuser" %}</th>
|
||||||
<th>Clone</th>
|
<th>{% trans "Clone" %}</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody class="searchable">
|
<tbody class="searchable">
|
||||||
|
|
|
@ -2,7 +2,6 @@ from django.shortcuts import render
|
||||||
from django.http import HttpResponseRedirect
|
from django.http import HttpResponseRedirect
|
||||||
from django.core.urlresolvers import reverse
|
from django.core.urlresolvers import reverse
|
||||||
from django.utils.translation import ugettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
from django.contrib.auth.models import User
|
|
||||||
from django.contrib.auth.decorators import login_required
|
from django.contrib.auth.decorators import login_required
|
||||||
from accounts.models import *
|
from accounts.models import *
|
||||||
from instances.models import Instance
|
from instances.models import Instance
|
||||||
|
@ -11,7 +10,6 @@ from django.conf import settings
|
||||||
from django.core.validators import ValidationError
|
from django.core.validators import ValidationError
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
def profile(request):
|
def profile(request):
|
||||||
"""
|
"""
|
||||||
|
@ -70,6 +68,7 @@ def profile(request):
|
||||||
return HttpResponseRedirect(request.get_full_path())
|
return HttpResponseRedirect(request.get_full_path())
|
||||||
return render(request, 'profile.html', locals())
|
return render(request, 'profile.html', locals())
|
||||||
|
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
def accounts(request):
|
def accounts(request):
|
||||||
"""
|
"""
|
||||||
|
@ -154,6 +153,7 @@ def accounts(request):
|
||||||
def account(request, user_id):
|
def account(request, user_id):
|
||||||
"""
|
"""
|
||||||
:param request:
|
:param request:
|
||||||
|
:param user_id:
|
||||||
:return:
|
:return:
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
|
@ -37,7 +37,7 @@
|
||||||
<div class="panel-body">
|
<div class="panel-body">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-xs-4 col-sm-4">
|
<div class="col-xs-4 col-sm-4">
|
||||||
<p><strong>{% trans "Status:" %}</strong></p>
|
<p><strong>{% trans "Status" %}:</strong></p>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-xs-4 col-sm-6">
|
<div class="col-xs-4 col-sm-6">
|
||||||
{% if compute.status %}
|
{% if compute.status %}
|
||||||
|
@ -235,7 +235,6 @@
|
||||||
</div><!-- /.modal-content -->
|
</div><!-- /.modal-content -->
|
||||||
</div><!-- /.modal-dialog -->
|
</div><!-- /.modal-dialog -->
|
||||||
</div><!-- /.modal -->
|
</div><!-- /.modal -->
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -244,7 +243,7 @@
|
||||||
<div class="col-lg-12">
|
<div class="col-lg-12">
|
||||||
<div class="alert alert-warning alert-dismissable">
|
<div class="alert alert-warning alert-dismissable">
|
||||||
<button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
|
<button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
|
||||||
<i class="fa fa-exclamation-triangle"></i> <strong>{% trans "Warning:" %}</strong> {% trans "Hypervisor doesn't have any Computes" %}
|
<i class="fa fa-exclamation-triangle"></i> <strong>{% trans "Warning" %}:</strong> {% trans "Hypervisor doesn't have any Computes" %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
|
@ -62,9 +62,9 @@
|
||||||
</p>
|
</p>
|
||||||
<p>{{ emulator }}</p>
|
<p>{{ emulator }}</p>
|
||||||
<p>
|
<p>
|
||||||
<span class="label label-default">{% trans 'Qemu' %} </span>
|
<span class="label label-default">Qemu</span>
|
||||||
<span class="label label-primary">{{ version }}</span>
|
<span class="label label-primary">{{ version }}</span>
|
||||||
<span class="label label-default">{% trans 'Libvirt' %} </span>
|
<span class="label label-default">Libvirt</span>
|
||||||
<span class="label label-primary">{{ lib_version }}</span>
|
<span class="label label-primary">{{ lib_version }}</span>
|
||||||
</p>
|
</p>
|
||||||
<p>{{ host_memory|filesizeformat }}</p>
|
<p>{{ host_memory|filesizeformat }}</p>
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
import time
|
|
||||||
import json
|
import json
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
from django.http import HttpResponse, HttpResponseRedirect
|
from django.http import HttpResponse, HttpResponseRedirect
|
||||||
|
@ -140,6 +139,7 @@ def computes(request):
|
||||||
def overview(request, compute_id):
|
def overview(request, compute_id):
|
||||||
"""
|
"""
|
||||||
:param request:
|
:param request:
|
||||||
|
:param compute_id:
|
||||||
:return:
|
:return:
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
@ -171,6 +171,7 @@ def overview(request, compute_id):
|
||||||
def compute_graph(request, compute_id):
|
def compute_graph(request, compute_id):
|
||||||
"""
|
"""
|
||||||
:param request:
|
:param request:
|
||||||
|
:param compute_id:
|
||||||
:return:
|
:return:
|
||||||
"""
|
"""
|
||||||
compute = get_object_or_404(Compute, pk=compute_id)
|
compute = get_object_or_404(Compute, pk=compute_id)
|
||||||
|
@ -207,17 +208,16 @@ def get_compute_disk_buses(request, compute_id, disk):
|
||||||
compute.type)
|
compute.type)
|
||||||
|
|
||||||
disk_device_types = conn.get_disk_device_types()
|
disk_device_types = conn.get_disk_device_types()
|
||||||
disk_bus_types = conn.get_disk_bus_types()
|
|
||||||
|
|
||||||
if disk in disk_device_types:
|
if disk in disk_device_types:
|
||||||
if disk == 'disk':
|
if disk == 'disk':
|
||||||
data['bus'] = sorted(disk_device_types)
|
data['bus'] = sorted(disk_device_types)
|
||||||
elif disk == 'cdrom':
|
elif disk == 'cdrom':
|
||||||
data['bus'] = ['ide', 'sata', 'scsi',]
|
data['bus'] = ['ide', 'sata', 'scsi']
|
||||||
elif disk == 'floppy':
|
elif disk == 'floppy':
|
||||||
data['bus'] = ['fdc',]
|
data['bus'] = ['fdc']
|
||||||
elif disk == 'lun':
|
elif disk == 'lun':
|
||||||
data['bus'] = ['scsi',]
|
data['bus'] = ['scsi']
|
||||||
except libvirtError:
|
except libvirtError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
|
@ -120,7 +120,7 @@ def get_connection_infos(token):
|
||||||
console_host = conn.get_console_listen_addr()
|
console_host = conn.get_console_listen_addr()
|
||||||
console_port = conn.get_console_port()
|
console_port = conn.get_console_port()
|
||||||
console_socket = conn.get_console_socket()
|
console_socket = conn.get_console_socket()
|
||||||
except Exception, e:
|
except Exception as e:
|
||||||
logging.error('Fail to retrieve console connection infos for token %s : %s' % (token, e))
|
logging.error('Fail to retrieve console connection infos for token %s : %s' % (token, e))
|
||||||
raise
|
raise
|
||||||
return (connhost, connport, connuser, conntype, console_host,
|
return (connhost, connport, connuser, conntype, console_host,
|
||||||
|
|
|
@ -1,7 +1,5 @@
|
||||||
import re
|
import re
|
||||||
from django.shortcuts import render
|
from django.shortcuts import render
|
||||||
from django.http import HttpResponseRedirect
|
|
||||||
from django.core.urlresolvers import reverse
|
|
||||||
from django.contrib.auth.decorators import login_required
|
from django.contrib.auth.decorators import login_required
|
||||||
from instances.models import Instance
|
from instances.models import Instance
|
||||||
from vrtManager.instance import wvmInstance
|
from vrtManager.instance import wvmInstance
|
||||||
|
|
|
@ -17,7 +17,6 @@
|
||||||
<form class="form-horizontal" method="post" role="form">{% csrf_token %}
|
<form class="form-horizontal" method="post" role="form">{% csrf_token %}
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="col-sm-3 control-label">{% trans "Name" %}</label>
|
<label class="col-sm-3 control-label">{% trans "Name" %}</label>
|
||||||
|
|
||||||
<div class="col-sm-6">
|
<div class="col-sm-6">
|
||||||
<input type="text" name="label" class="form-control" placeholder="Micro" maxlength="20"
|
<input type="text" name="label" class="form-control" placeholder="Micro" maxlength="20"
|
||||||
required pattern="[a-zA-Z0-9]+">
|
required pattern="[a-zA-Z0-9]+">
|
||||||
|
@ -25,7 +24,6 @@
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="col-sm-3 control-label">{% trans "VCPU" %}</label>
|
<label class="col-sm-3 control-label">{% trans "VCPU" %}</label>
|
||||||
|
|
||||||
<div class="col-sm-6">
|
<div class="col-sm-6">
|
||||||
<input type="text" class="form-control" name="vcpu" value="1" maxlength="1" required
|
<input type="text" class="form-control" name="vcpu" value="1" maxlength="1" required
|
||||||
pattern="[0-9]">
|
pattern="[0-9]">
|
||||||
|
@ -33,7 +31,6 @@
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="col-sm-3 control-label">{% trans "RAM" %}</label>
|
<label class="col-sm-3 control-label">{% trans "RAM" %}</label>
|
||||||
|
|
||||||
<div class="col-sm-6">
|
<div class="col-sm-6">
|
||||||
<input type="text" class="form-control" name="memory" value="512" maxlength="5" required
|
<input type="text" class="form-control" name="memory" value="512" maxlength="5" required
|
||||||
pattern="[0-9]+">
|
pattern="[0-9]+">
|
||||||
|
@ -42,7 +39,6 @@
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="col-sm-3 control-label">{% trans "HDD" %}</label>
|
<label class="col-sm-3 control-label">{% trans "HDD" %}</label>
|
||||||
|
|
||||||
<div class="col-sm-6">
|
<div class="col-sm-6">
|
||||||
<input type="text" class="form-control" name="disk" value="10" maxlength="3" required
|
<input type="text" class="form-control" name="disk" value="10" maxlength="3" required
|
||||||
pattern="[0-9]+">
|
pattern="[0-9]+">
|
||||||
|
|
|
@ -436,7 +436,6 @@
|
||||||
</div>
|
</div>
|
||||||
<label class="col-sm-1 control-label">{% trans "MB" %}</label>
|
<label class="col-sm-1 control-label">{% trans "MB" %}</label>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="col-sm-3 control-label">{% trans "HDD" %}</label>
|
<label class="col-sm-3 control-label">{% trans "HDD" %}</label>
|
||||||
<input id="images" name="images" type="hidden" value=""/>
|
<input id="images" name="images" type="hidden" value=""/>
|
||||||
|
@ -582,8 +581,7 @@
|
||||||
</div>
|
</div>
|
||||||
<div class="clearfix"></div>
|
<div class="clearfix"></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div><!-- /Tab panes -->
|
||||||
<!-- /Tab panes -->
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
@ -607,7 +605,6 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
$(document).ready(function () {
|
$(document).ready(function () {
|
||||||
|
|
||||||
$('#image-control').multiselect({
|
$('#image-control').multiselect({
|
||||||
disableIfEmpty: true,
|
disableIfEmpty: true,
|
||||||
enableCaseInsensitiveFiltering: true,
|
enableCaseInsensitiveFiltering: true,
|
||||||
|
@ -716,7 +713,6 @@
|
||||||
|
|
||||||
function get_disk_bus_choices(compute_id, dev_idx, disk_type){
|
function get_disk_bus_choices(compute_id, dev_idx, disk_type){
|
||||||
get_diskBus_url = "/computes/" + compute_id + "/disk/" + disk_type + "/buses";
|
get_diskBus_url = "/computes/" + compute_id + "/disk/" + disk_type + "/buses";
|
||||||
|
|
||||||
$.getJSON(get_diskBus_url, function (data) {
|
$.getJSON(get_diskBus_url, function (data) {
|
||||||
$("#bus" + dev_idx).find('option').remove();
|
$("#bus" + dev_idx).find('option').remove();
|
||||||
$.each(data['bus'], function(i, item) {
|
$.each(data['bus'], function(i, item) {
|
||||||
|
|
|
@ -21,6 +21,7 @@ from logs.views import addlogmsg
|
||||||
def create_instance(request, compute_id):
|
def create_instance(request, compute_id):
|
||||||
"""
|
"""
|
||||||
:param request:
|
:param request:
|
||||||
|
:param compute_id:
|
||||||
:return:
|
:return:
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
@ -41,9 +42,6 @@ def create_instance(request, compute_id):
|
||||||
compute.password,
|
compute.password,
|
||||||
compute.type)
|
compute.type)
|
||||||
|
|
||||||
storages = sorted(conn.get_storages(only_actives=True))
|
|
||||||
networks = sorted(conn.get_networks())
|
|
||||||
nwfilters = conn.get_nwfilters()
|
|
||||||
instances = conn.get_instances()
|
instances = conn.get_instances()
|
||||||
videos = conn.get_video()
|
videos = conn.get_video()
|
||||||
cache_modes = sorted(conn.get_cache_modes().items())
|
cache_modes = sorted(conn.get_cache_modes().items())
|
||||||
|
@ -53,6 +51,9 @@ def create_instance(request, compute_id):
|
||||||
disk_devices = conn.get_disk_device_types()
|
disk_devices = conn.get_disk_device_types()
|
||||||
disk_buses = conn.get_disk_bus_types()
|
disk_buses = conn.get_disk_bus_types()
|
||||||
default_bus = INSTANCE_VOLUME_DEFAULT_BUS
|
default_bus = INSTANCE_VOLUME_DEFAULT_BUS
|
||||||
|
networks = sorted(conn.get_networks())
|
||||||
|
nwfilters = conn.get_nwfilters()
|
||||||
|
storages = sorted(conn.get_storages(only_actives=True))
|
||||||
except libvirtError as lib_err:
|
except libvirtError as lib_err:
|
||||||
error_messages.append(lib_err)
|
error_messages.append(lib_err)
|
||||||
|
|
||||||
|
@ -109,7 +110,7 @@ def create_instance(request, compute_id):
|
||||||
msg = _("A virtual machine with this name already exists")
|
msg = _("A virtual machine with this name already exists")
|
||||||
error_messages.append(msg)
|
error_messages.append(msg)
|
||||||
if Instance.objects.filter(name__exact=data['name']):
|
if Instance.objects.filter(name__exact=data['name']):
|
||||||
messages.warning(request,_("There is an instance with same name. Are you sure?"))
|
messages.warning(request, _("There is an instance with same name. Are you sure?"))
|
||||||
if not error_messages:
|
if not error_messages:
|
||||||
if data['hdd_size']:
|
if data['hdd_size']:
|
||||||
if not data['mac']:
|
if not data['mac']:
|
||||||
|
@ -148,7 +149,6 @@ def create_instance(request, compute_id):
|
||||||
else:
|
else:
|
||||||
for idx, vol in enumerate(data['images'].split(',')):
|
for idx, vol in enumerate(data['images'].split(',')):
|
||||||
try:
|
try:
|
||||||
|
|
||||||
path = conn.get_volume_path(vol)
|
path = conn.get_volume_path(vol)
|
||||||
volume = dict()
|
volume = dict()
|
||||||
volume['path'] = path
|
volume['path'] = path
|
||||||
|
@ -175,7 +175,7 @@ def create_instance(request, compute_id):
|
||||||
addlogmsg(request.user.username, create_instance.name, msg)
|
addlogmsg(request.user.username, create_instance.name, msg)
|
||||||
return HttpResponseRedirect(reverse('instance', args=[compute_id, data['name']]))
|
return HttpResponseRedirect(reverse('instance', args=[compute_id, data['name']]))
|
||||||
except libvirtError as lib_err:
|
except libvirtError as lib_err:
|
||||||
if data['hdd_size'] or volume_list.count() > 0:
|
if data['hdd_size'] or len(volume_list) > 0:
|
||||||
for vol in volume_list:
|
for vol in volume_list:
|
||||||
conn.delete_volume(vol['path'])
|
conn.delete_volume(vol['path'])
|
||||||
error_messages.append(lib_err)
|
error_messages.append(lib_err)
|
||||||
|
|
|
@ -26,7 +26,7 @@ def os_metadata_json(request, version):
|
||||||
if version == 'latest':
|
if version == 'latest':
|
||||||
ip = get_client_ip(request)
|
ip = get_client_ip(request)
|
||||||
hostname = get_hostname_by_ip(ip)
|
hostname = get_hostname_by_ip(ip)
|
||||||
response = { 'uuid': OS_UUID, 'hostname': hostname }
|
response = {'uuid': OS_UUID, 'hostname': hostname}
|
||||||
return HttpResponse(json.dumps(response))
|
return HttpResponse(json.dumps(response))
|
||||||
else:
|
else:
|
||||||
err = 'Invalid version: {}'.format(version)
|
err = 'Invalid version: {}'.format(version)
|
||||||
|
@ -70,8 +70,8 @@ def get_client_ip(request):
|
||||||
def get_hostname_by_ip(ip):
|
def get_hostname_by_ip(ip):
|
||||||
try:
|
try:
|
||||||
addrs = socket.gethostbyaddr(ip)
|
addrs = socket.gethostbyaddr(ip)
|
||||||
except Exception:
|
except:
|
||||||
addrs = [ip,]
|
addrs = [ip]
|
||||||
return addrs[0]
|
return addrs[0]
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -24,10 +24,10 @@
|
||||||
<label class="col-sm-4 control-label">{% trans "Network" %}</label>
|
<label class="col-sm-4 control-label">{% trans "Network" %}</label>
|
||||||
<div class="col-sm-6">
|
<div class="col-sm-6">
|
||||||
<select class="form-control" name="add-net-network">
|
<select class="form-control" name="add-net-network">
|
||||||
{% for c_net in compute_networks %}
|
{% for c_net in networks_host %}
|
||||||
<option value="net:{{ c_net }}">Network {{ c_net }}</option>
|
<option value="net:{{ c_net }}">Network {{ c_net }}</option>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
{% for c_iface in compute_interfaces %}
|
{% for c_iface in interfaces_host %}
|
||||||
<option value="iface:{{ c_iface }}">Interface {{ c_iface }}</option>
|
<option value="iface:{{ c_iface }}">Interface {{ c_iface }}</option>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</select>
|
</select>
|
||||||
|
@ -38,7 +38,7 @@
|
||||||
<div class="col-sm-6">
|
<div class="col-sm-6">
|
||||||
<select class="form-control" name="add-net-nwfilter">
|
<select class="form-control" name="add-net-nwfilter">
|
||||||
<option value="">{% trans "None" %}</option>
|
<option value="">{% trans "None" %}</option>
|
||||||
{% for nwfilter in compute_nwfilters %}
|
{% for nwfilter in nwfilters_host %}
|
||||||
<option value="{{ nwfilter }}">{{ nwfilter }}</option>
|
<option value="{{ nwfilter }}">{{ nwfilter }}</option>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</select>
|
</select>
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
{% load i18n %}
|
{% load i18n %}
|
||||||
{% if request.user.is_superuser %}
|
{% if request.user.is_superuser %}
|
||||||
<a href="#addvol" type="button" class="btn btn-success pull-right" data-toggle="modal" title="Add Volume">
|
<a href="#addvol" type="button" class="btn btn-success pull-right" data-toggle="modal" title="Add Volume">
|
||||||
<span class="glyphicon glyphicon-plus" aria-hidden="true"></span>
|
<span class="glyphicon glyphicon-plus" aria-hidden="true"></span>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
<!-- Modal pool -->
|
<!-- Modal pool -->
|
||||||
<div class="modal fade" id="addvol" tabindex="-1" role="dialog" aria-labelledby="addInstanceVolumeLabel" aria-hidden="true">
|
<div class="modal fade" id="addvol" tabindex="-1" role="dialog" aria-labelledby="addInstanceVolumeLabel" aria-hidden="true">
|
||||||
<div class="modal-dialog">
|
<div class="modal-dialog">
|
||||||
<div class="modal-content">
|
<div class="modal-content">
|
||||||
<div class="modal-header">
|
<div class="modal-header">
|
||||||
|
@ -28,7 +28,7 @@
|
||||||
<label class="col-sm-3 control-label">{% trans "Storage" %}</label>
|
<label class="col-sm-3 control-label">{% trans "Storage" %}</label>
|
||||||
<div class="col-sm-4">
|
<div class="col-sm-4">
|
||||||
<select name="storage" class="form-control image-format">
|
<select name="storage" class="form-control image-format">
|
||||||
{% for storage in storages %}
|
{% for storage in storages_host %}
|
||||||
<option value="{{ storage }}">{{ storage }}</option>
|
<option value="{{ storage }}">{{ storage }}</option>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</select>
|
</select>
|
||||||
|
@ -147,5 +147,5 @@
|
||||||
</div> <!-- /.modal-body -->
|
</div> <!-- /.modal-body -->
|
||||||
</div> <!-- /.modal-content -->
|
</div> <!-- /.modal-content -->
|
||||||
</div> <!-- /.modal-dialog -->
|
</div> <!-- /.modal-dialog -->
|
||||||
</div> <!-- /.modal -->
|
</div> <!-- /.modal -->
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
|
@ -48,7 +48,7 @@
|
||||||
<div class="col-lg-12">
|
<div class="col-lg-12">
|
||||||
<div class="alert alert-warning alert-dismissable">
|
<div class="alert alert-warning alert-dismissable">
|
||||||
<button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
|
<button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
|
||||||
<i class="fa fa-exclamation-triangle"></i> <strong>{% trans "Warning:" %}</strong> {% trans "You don't have any Instance" %}
|
<i class="fa fa-exclamation-triangle"></i> <strong>{% trans "Warning" %}:</strong> {% trans "You don't have any Instance" %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% else %}
|
{% else %}
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th><a href="#" id="hide_all_instances" onclick="hide_all_host_instances()">#</a> </th>
|
<th><a href="#" id="hide_all_instances" onclick="hide_all_host_instances()">#</a> </th>
|
||||||
<th>{% trans "Name" %}<br>{% trans "Description" %}</th></th>
|
<th>{% trans "Name" %}<br>{% trans "Description" %}</th>
|
||||||
<th>{% trans "User"%}</th>
|
<th>{% trans "User"%}</th>
|
||||||
<th>{% trans "Status" %}</th>
|
<th>{% trans "Status" %}</th>
|
||||||
<th>{% trans "VCPU" %}</th>
|
<th>{% trans "VCPU" %}</th>
|
||||||
|
@ -71,16 +71,16 @@
|
||||||
<span class="glyphicon glyphicon-play"></span>
|
<span class="glyphicon glyphicon-play"></span>
|
||||||
</button>
|
</button>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<button class="btn btn-sm btn-default disabled" title="{% trans "Suspend" %}">
|
<button class="btn btn-sm btn-default disabled" title="{% trans "Suspend" %}" disabled>
|
||||||
<span class="glyphicon glyphicon-pause"></span>
|
<span class="glyphicon glyphicon-pause"></span>
|
||||||
</button>
|
</button>
|
||||||
<button class="btn btn-sm btn-default disabled" title="{% trans "Power Off" %}">
|
<button class="btn btn-sm btn-default disabled" title="{% trans "Power Off" %}" disabled>
|
||||||
<span class="glyphicon glyphicon-off"></span>
|
<span class="glyphicon glyphicon-off"></span>
|
||||||
</button>
|
</button>
|
||||||
<button class="btn btn-sm btn-default disabled" title="{% trans "Power Cycle" %}">
|
<button class="btn btn-sm btn-default disabled" title="{% trans "Power Cycle" %}" disabled>
|
||||||
<span class="glyphicon glyphicon-refresh"></span>
|
<span class="glyphicon glyphicon-refresh"></span>
|
||||||
</button>
|
</button>
|
||||||
<button class="btn btn-sm btn-default disabled" title="{% trans "VNC Console" %}">
|
<button class="btn btn-sm btn-default disabled" title="{% trans "VNC Console" %}" disabled>
|
||||||
<span class="glyphicon glyphicon-eye-open"></span>
|
<span class="glyphicon glyphicon-eye-open"></span>
|
||||||
</button>
|
</button>
|
||||||
{% endifequal %}
|
{% endifequal %}
|
||||||
|
@ -88,21 +88,21 @@
|
||||||
<button class="btn btn-sm btn-default" type="submit" name="resume" title="{% trans "Resume" %}">
|
<button class="btn btn-sm btn-default" type="submit" name="resume" title="{% trans "Resume" %}">
|
||||||
<span class="glyphicon glyphicon-play"></span>
|
<span class="glyphicon glyphicon-play"></span>
|
||||||
</button>
|
</button>
|
||||||
<button class="btn btn-sm btn-default disabled" title="{% trans "Suspend" %}">
|
<button class="btn btn-sm btn-default disabled" title="{% trans "Suspend" %}" disabled>
|
||||||
<span class="glyphicon glyphicon-pause"></span>
|
<span class="glyphicon glyphicon-pause"></span>
|
||||||
</button>
|
</button>
|
||||||
<button class="btn btn-sm btn-default disabled" title="{% trans "Power Off" %}">
|
<button class="btn btn-sm btn-default" type="submit" name="powerforce" title="{% trans "Force Off" %}" onclick="return confirm('Are you sure to force it down?')">
|
||||||
<span class="glyphicon glyphicon-off"></span>
|
<span class="glyphicon glyphicon-off"></span>
|
||||||
</button>
|
</button>
|
||||||
<button class="btn btn-sm btn-default disabled" title="{% trans "Power Cycle" %}">
|
<button class="btn btn-sm btn-default disabled" title="{% trans "Power Cycle" %}" disabled>
|
||||||
<span class="glyphicon glyphicon-refresh"></span>
|
<span class="glyphicon glyphicon-refresh"></span>
|
||||||
</button>
|
</button>
|
||||||
<button class="btn btn-sm btn-default disabled" title="{% trans "VNC Console" %}">
|
<button class="btn btn-sm btn-default disabled" title="{% trans "VNC Console" %}" disabled>
|
||||||
<span class="glyphicon glyphicon-eye-open"></span>
|
<span class="glyphicon glyphicon-eye-open"></span>
|
||||||
</button>
|
</button>
|
||||||
{% endifequal %}
|
{% endifequal %}
|
||||||
{% ifequal info.status 1 %}
|
{% ifequal info.status 1 %}
|
||||||
<button class="btn btn-sm btn-default disabled" title="{% trans "Power On" %}">
|
<button class="btn btn-sm btn-default disabled" title="{% trans "Power On" %}" disabled>
|
||||||
<span class="glyphicon glyphicon-play"></span>
|
<span class="glyphicon glyphicon-play"></span>
|
||||||
</button>
|
</button>
|
||||||
<button class="btn btn-sm btn-default" type="submit" name="suspend" title="{% trans "Suspend" %}">
|
<button class="btn btn-sm btn-default" type="submit" name="suspend" title="{% trans "Suspend" %}">
|
||||||
|
@ -114,9 +114,9 @@
|
||||||
<button class="btn btn-sm btn-default" type="submit" name="powercycle" title="{% trans "Power Cycle" %}" onclick="return confirm('Are you sure?')">
|
<button class="btn btn-sm btn-default" type="submit" name="powercycle" title="{% trans "Power Cycle" %}" onclick="return confirm('Are you sure?')">
|
||||||
<span class="glyphicon glyphicon-refresh"></span>
|
<span class="glyphicon glyphicon-refresh"></span>
|
||||||
</button>
|
</button>
|
||||||
<a href="#" class="btn btn-sm btn-default" onclick='open_console("{{ host.0 }}-{{ info.uuid }}")' title="{% trans "Console" %}">
|
<button class="btn btn-sm btn-default" type="button" onclick='open_console("{{ host.0 }}-{{ info.uuid }}")' title="{% trans "Console" %}">
|
||||||
<span class="glyphicon glyphicon-eye-open"></span>
|
<span class="glyphicon glyphicon-eye-open"></span>
|
||||||
</a>
|
</button>
|
||||||
{% endifequal %}
|
{% endifequal %}
|
||||||
</form>
|
</form>
|
||||||
</td>
|
</td>
|
||||||
|
|
|
@ -2,11 +2,11 @@
|
||||||
<table class="table table-hover table-striped sortable-theme-bootstrap" data-sortable>
|
<table class="table table-hover table-striped sortable-theme-bootstrap" data-sortable>
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th>Name<br>Description</th>
|
<th>{% trans "Name" %}<br>{% trans "Description" %}</th>
|
||||||
<th>Host<br>User</th>
|
<th>{% trans "Host" %}<br>{% trans "User"%}</th>
|
||||||
<th>Status</th>
|
<th>{% trans "Status" %}</th>
|
||||||
<th>VCPU</th>
|
<th>{% trans "VCPU" %}</th>
|
||||||
<th>Memory</th>
|
<th>{% trans "Memory" %}</th>
|
||||||
<th data-sortable="false" style="width:205px;">{% trans "Actions" %}</th>
|
<th data-sortable="false" style="width:205px;">{% trans "Actions" %}</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
|
@ -23,7 +23,8 @@
|
||||||
</td>
|
</td>
|
||||||
<td>{{ info.vcpu }}</td>
|
<td>{{ info.vcpu }}</td>
|
||||||
<td>{{ info.memory|filesizeformat }}</td>
|
<td>{{ info.memory|filesizeformat }}</td>
|
||||||
<td><form action="" method="post" role="form">{% csrf_token %}
|
<td>
|
||||||
|
<form action="" method="post" role="form">{% csrf_token %}
|
||||||
<input type="hidden" name="name" value="{{ vm }}"/>
|
<input type="hidden" name="name" value="{{ vm }}"/>
|
||||||
<input type="hidden" name="compute_id" value="{{ host.0 }}"/>
|
<input type="hidden" name="compute_id" value="{{ host.0 }}"/>
|
||||||
{% ifequal info.status 5 %}
|
{% ifequal info.status 5 %}
|
||||||
|
@ -36,16 +37,16 @@
|
||||||
<span class="glyphicon glyphicon-play"></span>
|
<span class="glyphicon glyphicon-play"></span>
|
||||||
</button>
|
</button>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<button class="btn btn-sm btn-default disabled" title="{% trans "Suspend" %}">
|
<button class="btn btn-sm btn-default disabled" title="{% trans "Suspend" %}" disabled>
|
||||||
<span class="glyphicon glyphicon-pause"></span>
|
<span class="glyphicon glyphicon-pause"></span>
|
||||||
</button>
|
</button>
|
||||||
<button class="btn btn-sm btn-default disabled" title="{% trans "Power Off" %}">
|
<button class="btn btn-sm btn-default disabled" title="{% trans "Power Off" %}" disabled>
|
||||||
<span class="glyphicon glyphicon-off"></span>
|
<span class="glyphicon glyphicon-off"></span>
|
||||||
</button>
|
</button>
|
||||||
<button class="btn btn-sm btn-default disabled" title="{% trans "Power Cycle" %}">
|
<button class="btn btn-sm btn-default disabled" title="{% trans "Power Cycle" %}" disabled>
|
||||||
<span class="glyphicon glyphicon-refresh"></span>
|
<span class="glyphicon glyphicon-refresh"></span>
|
||||||
</button>
|
</button>
|
||||||
<button class="btn btn-sm btn-default disabled" title="{% trans "VNC Console" %}">
|
<button class="btn btn-sm btn-default disabled" title="{% trans "VNC Console" %}" disabled>
|
||||||
<span class="glyphicon glyphicon-eye-open"></span>
|
<span class="glyphicon glyphicon-eye-open"></span>
|
||||||
</button>
|
</button>
|
||||||
{% endifequal %}
|
{% endifequal %}
|
||||||
|
@ -53,21 +54,21 @@
|
||||||
<button class="btn btn-sm btn-default" type="submit" name="resume" title="{% trans "Resume" %}">
|
<button class="btn btn-sm btn-default" type="submit" name="resume" title="{% trans "Resume" %}">
|
||||||
<span class="glyphicon glyphicon-play"></span>
|
<span class="glyphicon glyphicon-play"></span>
|
||||||
</button>
|
</button>
|
||||||
<button class="btn btn-sm btn-default disabled" title="{% trans "Suspend" %}">
|
<button class="btn btn-sm btn-default disabled" title="{% trans "Suspend" %}" disabled>
|
||||||
<span class="glyphicon glyphicon-pause"></span>
|
<span class="glyphicon glyphicon-pause"></span>
|
||||||
</button>
|
</button>
|
||||||
<button class="btn btn-sm btn-default disabled" title="{% trans "Power Off" %}">
|
<button class="btn btn-sm btn-default" type="submit" name="powerforce" title="{% trans "Force Off" %}" onclick="return confirm('Are you sure to force it down?')">
|
||||||
<span class="glyphicon glyphicon-off"></span>
|
<span class="glyphicon glyphicon-off"></span>
|
||||||
</button>
|
</button>
|
||||||
<button class="btn btn-sm btn-default disabled" title="{% trans "Power Cycle" %}">
|
<button class="btn btn-sm btn-default disabled" title="{% trans "Power Cycle" %}" disabled>
|
||||||
<span class="glyphicon glyphicon-refresh"></span>
|
<span class="glyphicon glyphicon-refresh"></span>
|
||||||
</button>
|
</button>
|
||||||
<button class="btn btn-sm btn-default disabled" title="{% trans "VNC Console" %}">
|
<button class="btn btn-sm btn-default disabled" title="{% trans "VNC Console" %}" disabled>
|
||||||
<span class="glyphicon glyphicon-eye-open"></span>
|
<span class="glyphicon glyphicon-eye-open"></span>
|
||||||
</button>
|
</button>
|
||||||
{% endifequal %}
|
{% endifequal %}
|
||||||
{% ifequal info.status 1 %}
|
{% ifequal info.status 1 %}
|
||||||
<button class="btn btn-sm btn-default disabled" title="{% trans "Power On" %}">
|
<button class="btn btn-sm btn-default disabled" title="{% trans "Power On" %}" disabled>
|
||||||
<span class="glyphicon glyphicon-play"></span>
|
<span class="glyphicon glyphicon-play"></span>
|
||||||
</button>
|
</button>
|
||||||
<button class="btn btn-sm btn-default" type="submit" name="suspend" title="{% trans "Suspend" %}">
|
<button class="btn btn-sm btn-default" type="submit" name="suspend" title="{% trans "Suspend" %}">
|
||||||
|
@ -79,9 +80,9 @@
|
||||||
<button class="btn btn-sm btn-default" type="submit" name="powercycle" title="{% trans "Power Cycle" %}" onclick="return confirm('Are you sure?')">
|
<button class="btn btn-sm btn-default" type="submit" name="powercycle" title="{% trans "Power Cycle" %}" onclick="return confirm('Are you sure?')">
|
||||||
<span class="glyphicon glyphicon-refresh"></span>
|
<span class="glyphicon glyphicon-refresh"></span>
|
||||||
</button>
|
</button>
|
||||||
<a href="#" class="btn btn-sm btn-default" onclick='open_console("{{ host.0 }}-{{ info.uuid }}")' title="{% trans "Console" %}">
|
<button class="btn btn-sm btn-default" type="button" onclick='open_console("{{ host.0 }}-{{ info.uuid }}")' title="{% trans "Console" %}">
|
||||||
<span class="glyphicon glyphicon-eye-open"></span>
|
<span class="glyphicon glyphicon-eye-open"></span>
|
||||||
</a>
|
</button>
|
||||||
{% endifequal %}
|
{% endifequal %}
|
||||||
</form>
|
</form>
|
||||||
</td>
|
</td>
|
||||||
|
|
|
@ -48,7 +48,6 @@
|
||||||
{% include 'errors_block.html' %}
|
{% include 'errors_block.html' %}
|
||||||
{% include 'messages_block.html' %}
|
{% include 'messages_block.html' %}
|
||||||
|
|
||||||
|
|
||||||
<div class="row" id="max-width-page">
|
<div class="row" id="max-width-page">
|
||||||
<div class="col-lg-12">
|
<div class="col-lg-12">
|
||||||
<div role="tabpanel">
|
<div role="tabpanel">
|
||||||
|
@ -345,14 +344,24 @@
|
||||||
<!-- Nav tabs -->
|
<!-- Nav tabs -->
|
||||||
<ul class="nav nav-tabs" role="tablist">
|
<ul class="nav nav-tabs" role="tablist">
|
||||||
<li role="presentation" class="active">
|
<li role="presentation" class="active">
|
||||||
<a href="#resizevm" aria-controls="resizevm" role="tab" data-toggle="tab">
|
<a href="#resizevm_cpu" aria-controls="resizevm_cpu" role="tab" data-toggle="tab">
|
||||||
{% trans "Resize Instance" %}
|
{% trans "CPU" %}
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li role="presentation">
|
||||||
|
<a href="#resizevm_mem" aria-controls="resizevm_mem" role="tab" data-toggle="tab">
|
||||||
|
{% trans "Memory" %}
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li role="presentation">
|
||||||
|
<a href="#resizevm_disk" aria-controls="resizevm_disk" role="tab" data-toggle="tab">
|
||||||
|
{% trans "Disk" %}
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
<!-- Tab panes -->
|
<!-- Tab panes -->
|
||||||
<div class="tab-content">
|
<div class="tab-content">
|
||||||
<div role="tabpanel" class="tab-pane tab-pane-bordered active" id="resizevm">
|
<div role="tabpanel" class="tab-pane tab-pane-bordered active" id="resizevm_cpu">
|
||||||
{% if request.user.is_superuser or request.user.is_staff or userinstance.is_change %}
|
{% if request.user.is_superuser or request.user.is_staff or userinstance.is_change %}
|
||||||
<form class="form-horizontal" method="post" role="form">{% csrf_token %}
|
<form class="form-horizontal" method="post" role="form">{% csrf_token %}
|
||||||
<p style="font-weight:bold;">{% trans "Logical host CPUs" %} : {{ vcpu_host }}</p>
|
<p style="font-weight:bold;">{% trans "Logical host CPUs" %} : {{ vcpu_host }}</p>
|
||||||
|
@ -380,6 +389,22 @@
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
{% ifequal status 5 %}
|
||||||
|
<button type="submit" class="btn btn-lg btn-success pull-right" name="resizevm_cpu">{% trans "Resize" %}</button>
|
||||||
|
{% else %}
|
||||||
|
<button class="btn btn-lg btn-success pull-right disabled">{% trans "Resize" %}</button>
|
||||||
|
{% endifequal %}
|
||||||
|
</form>
|
||||||
|
{% else %}
|
||||||
|
{% trans "You don't have permission for resizing instance" %}
|
||||||
|
<button class="btn btn-lg btn-success pull-right disabled">{% trans "Resize" %}</button>
|
||||||
|
{% endif %}
|
||||||
|
<div class="clearfix"></div>
|
||||||
|
</div>
|
||||||
|
<div role="tabpanel" class="tab-pane tab-pane-bordered" id="resizevm_mem">
|
||||||
|
{% if request.user.is_superuser or request.user.is_staff or userinstance.is_change %}
|
||||||
|
<form class="form-horizontal" method="post" role="form">{% csrf_token %}
|
||||||
<p style="font-weight:bold;">{% trans "Total host memory:" %} {{ memory_host|filesizeformat }}</p>
|
<p style="font-weight:bold;">{% trans "Total host memory:" %} {{ memory_host|filesizeformat }}</p>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="col-sm-4 control-label" style="font-weight:normal;">{% trans "Current allocation" %} ({% trans "MB" %})</label>
|
<label class="col-sm-4 control-label" style="font-weight:normal;">{% trans "Current allocation" %} ({% trans "MB" %})</label>
|
||||||
|
@ -407,6 +432,21 @@
|
||||||
<small><input type="checkbox" class="js-custom__checkbox" /> {% trans "Custom value" %}</small>
|
<small><input type="checkbox" class="js-custom__checkbox" /> {% trans "Custom value" %}</small>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
{% ifequal status 5 %}
|
||||||
|
<button type="submit" class="btn btn-lg btn-success pull-right" name="resizevm_mem">{% trans "Resize" %}</button>
|
||||||
|
{% else %}
|
||||||
|
<button class="btn btn-lg btn-success pull-right disabled">{% trans "Resize" %}</button>
|
||||||
|
{% endifequal %}
|
||||||
|
</form>
|
||||||
|
{% else %}
|
||||||
|
{% trans "You don't have permission for resizing instance" %}
|
||||||
|
<button class="btn btn-lg btn-success pull-right disabled">{% trans "Resize" %}</button>
|
||||||
|
{% endif %}
|
||||||
|
<div class="clearfix"></div>
|
||||||
|
</div>
|
||||||
|
<div role="tabpanel" class="tab-pane tab-pane-bordered" id="resizevm_disk">
|
||||||
|
{% if request.user.is_superuser or request.user.is_staff or userinstance.is_change %}
|
||||||
|
<form class="form-horizontal" method="post" role="form">{% csrf_token %}
|
||||||
<p style="font-weight:bold;">{% trans "Disk allocation (B):" %}</p>
|
<p style="font-weight:bold;">{% trans "Disk allocation (B):" %}</p>
|
||||||
{% for disk in disks %}
|
{% for disk in disks %}
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
|
@ -417,9 +457,9 @@
|
||||||
</div>
|
</div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
{% ifequal status 5 %}
|
{% ifequal status 5 %}
|
||||||
<button type="submit" class="btn btn-lg btn-success pull-right" name="resize">{% trans "Resize" %}</button>
|
<button type="submit" class="btn btn-lg btn-success pull-right" name="resizevm_disk">{% trans "Resize" %}</button>
|
||||||
{% else %}
|
{% else %}
|
||||||
<button class="btn btn-lg btn-success pull-right disabled" name="resize">{% trans "Resize" %}</button>
|
<button class="btn btn-lg btn-success pull-right disabled">{% trans "Resize" %}</button>
|
||||||
{% endifequal %}
|
{% endifequal %}
|
||||||
</form>
|
</form>
|
||||||
{% else %}
|
{% else %}
|
||||||
|
@ -833,10 +873,10 @@
|
||||||
<input class="form-control" type="text" value="{{ network.nic }}" readonly/>
|
<input class="form-control" type="text" value="{{ network.nic }}" readonly/>
|
||||||
<label class="control-label"><em>to</em></label>
|
<label class="control-label"><em>to</em></label>
|
||||||
<select class="form-control" name="net-source-{{ forloop.counter0 }}">
|
<select class="form-control" name="net-source-{{ forloop.counter0 }}">
|
||||||
{% for c_net in compute_networks %}
|
{% for c_net in networks_host %}
|
||||||
<option value="net:{{ c_net }}" {% ifequal c_net network.nic %} selected {% endifequal %}>{% trans 'Network' %} {{ c_net }}</option>
|
<option value="net:{{ c_net }}" {% ifequal c_net network.nic %} selected {% endifequal %}>{% trans 'Network' %} {{ c_net }}</option>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
{% for c_iface in compute_interfaces %}
|
{% for c_iface in interfaces_host %}
|
||||||
<option value="iface:{{ c_iface }}" {% ifequal c_iface network.nic %} selected {% endifequal %}>{% trans 'Interface' %} {{ c_iface }}</option>
|
<option value="iface:{{ c_iface }}" {% ifequal c_iface network.nic %} selected {% endifequal %}>{% trans 'Interface' %} {{ c_iface }}</option>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</select>
|
</select>
|
||||||
|
@ -847,7 +887,7 @@
|
||||||
<label class="control-label"><em>to</em></label>
|
<label class="control-label"><em>to</em></label>
|
||||||
<select class="form-control" name="net-nwfilter-{{ forloop.counter0 }}">
|
<select class="form-control" name="net-nwfilter-{{ forloop.counter0 }}">
|
||||||
<option value="">{% trans "None" %}</option>
|
<option value="">{% trans "None" %}</option>
|
||||||
{% for c_filters in compute_nwfilters %}
|
{% for c_filters in nwfilters_host %}
|
||||||
<option value="{{ c_filters }}" {% ifequal c_filters network.filterref %} selected {% endifequal %}>{{ c_filters }}</option>
|
<option value="{{ c_filters }}" {% ifequal c_filters network.filterref %} selected {% endifequal %}>{{ c_filters }}</option>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</select>
|
</select>
|
||||||
|
@ -1501,11 +1541,11 @@
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</script>
|
</script>
|
||||||
<script>
|
<script>
|
||||||
$(document).ready(function(){
|
$(document).ready(function(){
|
||||||
$('[data-toggle="popover"]').popover({
|
$('[data-toggle="popover"]').popover({
|
||||||
placement : 'top'
|
placement : 'top'
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
<script>
|
<script>
|
||||||
function set_orderlist(obj){
|
function set_orderlist(obj){
|
||||||
|
@ -1516,7 +1556,7 @@ $(document).ready(function(){
|
||||||
});
|
});
|
||||||
obj.val(result);
|
obj.val(result);
|
||||||
}
|
}
|
||||||
$(document).ready(function () {
|
$(document).ready(function () {
|
||||||
{# Boot Order Arragements #}
|
{# Boot Order Arragements #}
|
||||||
jQuery.fn.multiselect = function() {
|
jQuery.fn.multiselect = function() {
|
||||||
$(this).each(function() {
|
$(this).each(function() {
|
||||||
|
@ -1567,7 +1607,6 @@ $(document).ready(function () {
|
||||||
});
|
});
|
||||||
set_orderlist($("#bootorder"));
|
set_orderlist($("#bootorder"));
|
||||||
});
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
<script>
|
<script>
|
||||||
|
@ -1582,7 +1621,6 @@ $(document).ready(function () {
|
||||||
<script src="{% static "js/Chart.bundle.min.js" %}"></script>
|
<script src="{% static "js/Chart.bundle.min.js" %}"></script>
|
||||||
<script>
|
<script>
|
||||||
$('#chartgraphs').on('shown.bs.tab', function (event) {
|
$('#chartgraphs').on('shown.bs.tab', function (event) {
|
||||||
|
|
||||||
var cpu_ctx = $("#cpuChart").get(0).getContext("2d");
|
var cpu_ctx = $("#cpuChart").get(0).getContext("2d");
|
||||||
var cpuChart = new Chart(cpu_ctx, {
|
var cpuChart = new Chart(cpu_ctx, {
|
||||||
type: 'line',
|
type: 'line',
|
||||||
|
@ -1803,7 +1841,6 @@ $(document).ready(function () {
|
||||||
$.getJSON('{% url 'inst_graph' compute_id vname %}', function (data) {
|
$.getJSON('{% url 'inst_graph' compute_id vname %}', function (data) {
|
||||||
|
|
||||||
cpuChart.data.labels.push(data.timeline);
|
cpuChart.data.labels.push(data.timeline);
|
||||||
|
|
||||||
cpuChart.data.datasets[0].data.push(data.cpudata);
|
cpuChart.data.datasets[0].data.push(data.cpudata);
|
||||||
if (cpuChart.data.datasets[0].data.length > 10){
|
if (cpuChart.data.datasets[0].data.length > 10){
|
||||||
cpuChart.data.labels.shift();
|
cpuChart.data.labels.shift();
|
||||||
|
@ -1812,8 +1849,6 @@ $(document).ready(function () {
|
||||||
cpuChart.update();
|
cpuChart.update();
|
||||||
|
|
||||||
memChart.data.labels.push(data.timeline);
|
memChart.data.labels.push(data.timeline);
|
||||||
|
|
||||||
|
|
||||||
memChart.options.scales.yAxes[0].ticks.max = parseInt(data.memdata.total / 1024);
|
memChart.options.scales.yAxes[0].ticks.max = parseInt(data.memdata.total / 1024);
|
||||||
memChart.options.scales.yAxes[0].ticks.stepSize = parseInt(data.memdata.total / (1024 * 5));
|
memChart.options.scales.yAxes[0].ticks.stepSize = parseInt(data.memdata.total / (1024 * 5));
|
||||||
memChart.data.datasets[0].data.push(data.memdata.used / 1024);
|
memChart.data.datasets[0].data.push(data.memdata.used / 1024);
|
||||||
|
@ -1823,7 +1858,6 @@ $(document).ready(function () {
|
||||||
}
|
}
|
||||||
memChart.update();
|
memChart.update();
|
||||||
|
|
||||||
|
|
||||||
for (let j = 0; j < data.blkdata.length; j++) {
|
for (let j = 0; j < data.blkdata.length; j++) {
|
||||||
diskChart[data.blkdata[j].dev].data.labels.push(data.timeline);
|
diskChart[data.blkdata[j].dev].data.labels.push(data.timeline);
|
||||||
|
|
||||||
|
@ -1874,7 +1908,7 @@ $(document).ready(function () {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
if (~$.inArray(hash, ['#resize'])) {
|
if (~$.inArray(hash, ['#resize', "resizevm_cpu", "resizevm_mem", "resizevm_disk"])) {
|
||||||
var btnsect = $('#navbtn>li>a');
|
var btnsect = $('#navbtn>li>a');
|
||||||
$(btnsect).each(function () {
|
$(btnsect).each(function () {
|
||||||
if ($(this).attr('href') === '#resize') {
|
if ($(this).attr('href') === '#resize') {
|
||||||
|
|
|
@ -24,7 +24,6 @@
|
||||||
</div>
|
</div>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-lg-12">
|
<div class="col-lg-12">
|
||||||
|
|
||||||
<ol class="breadcrumb">
|
<ol class="breadcrumb">
|
||||||
<li class="active">
|
<li class="active">
|
||||||
<i class="fa fa-dashboard"></i> <a href="{% url 'overview' compute.id %}">{% trans "Overview" %}</a>
|
<i class="fa fa-dashboard"></i> <a href="{% url 'overview' compute.id %}">{% trans "Overview" %}</a>
|
||||||
|
@ -51,14 +50,13 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<!-- /.row -->
|
<!-- /.row -->
|
||||||
|
|
||||||
{% include 'errors_block.html' %}
|
{% include 'errors_block.html' %}
|
||||||
<div class="row">
|
<div class="row">
|
||||||
{% if not all_host_vms %}
|
{% if not all_host_vms %}
|
||||||
<div class="col-lg-12">
|
<div class="col-lg-12">
|
||||||
<div class="alert alert-warning alert-dismissable">
|
<div class="alert alert-warning alert-dismissable">
|
||||||
<button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
|
<button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
|
||||||
<i class="fa fa-exclamation-triangle"></i> <strong>{% trans "Warning:" %}</strong> {% trans "Hypervisor doesn't have any instances" %}
|
<i class="fa fa-exclamation-triangle"></i> <strong>{% trans "Warning" %}:</strong> {% trans "Hypervisor doesn't have any instances" %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% else %}
|
{% else %}
|
||||||
|
@ -67,7 +65,7 @@
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th>{% trans 'Name' %}<br>{% trans 'Description' %}</th>
|
<th>{% trans 'Name' %}<br>{% trans 'Description' %}</th>
|
||||||
<th>{% trans 'Host' %}<br>{% trans 'User' %}</th>
|
<th>{% trans 'User' %}</th>
|
||||||
<th>{% trans 'Status' %}</th>
|
<th>{% trans 'Status' %}</th>
|
||||||
<th>{% trans 'VCPU' %}</th>
|
<th>{% trans 'VCPU' %}</th>
|
||||||
<th>{% trans 'Memory' %}</th>
|
<th>{% trans 'Memory' %}</th>
|
||||||
|
@ -79,7 +77,7 @@
|
||||||
{% for vm, info in inst.items %}
|
{% for vm, info in inst.items %}
|
||||||
<tr>
|
<tr>
|
||||||
<td><a href="{% url 'instance' host.0 vm %}">{{ vm }}</a><br><small><em>{{ info.title }}</em></small></td>
|
<td><a href="{% url 'instance' host.0 vm %}">{{ vm }}</a><br><small><em>{{ info.title }}</em></small></td>
|
||||||
<td><a href="{% url 'overview' host.0 %}">{{ host.1 }}</a><br><small><em>{% if info.userinstances.count > 0 %}{{ info.userinstances.first_user.user.username }}{% if info.userinstances.count > 1 %} (+{{ info.userinstances.count|add:"-1" }}){% endif %}{% endif %}</em></small></td>
|
<td><em>{% if info.userinstances.count > 0 %}{{ info.userinstances.first_user.user.username }}{% if info.userinstances.count > 1 %} (+{{ info.userinstances.count|add:"-1" }}){% endif %}{% endif %}</em></td>
|
||||||
<td>
|
<td>
|
||||||
{% ifequal info.status 1 %}<span class="text-success">{% trans "Active" %}</span>{% endifequal %}
|
{% ifequal info.status 1 %}<span class="text-success">{% trans "Active" %}</span>{% endifequal %}
|
||||||
{% ifequal info.status 5 %}<span class="text-danger">{% trans "Off" %}</span>{% endifequal %}
|
{% ifequal info.status 5 %}<span class="text-danger">{% trans "Off" %}</span>{% endifequal %}
|
||||||
|
@ -87,7 +85,8 @@
|
||||||
</td>
|
</td>
|
||||||
<td>{{ info.vcpu }}</td>
|
<td>{{ info.vcpu }}</td>
|
||||||
<td>{{ info.memory|filesizeformat }}</td>
|
<td>{{ info.memory|filesizeformat }}</td>
|
||||||
<td><form action="" method="post" role="form">{% csrf_token %}
|
<td>
|
||||||
|
<form action="" method="post" role="form">{% csrf_token %}
|
||||||
<input type="hidden" name="name" value="{{ vm }}"/>
|
<input type="hidden" name="name" value="{{ vm }}"/>
|
||||||
<input type="hidden" name="compute_id" value="{{ host.0 }}"/>
|
<input type="hidden" name="compute_id" value="{{ host.0 }}"/>
|
||||||
{% ifequal info.status 5 %}
|
{% ifequal info.status 5 %}
|
||||||
|
@ -100,16 +99,16 @@
|
||||||
<span class="glyphicon glyphicon-play"></span>
|
<span class="glyphicon glyphicon-play"></span>
|
||||||
</button>
|
</button>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<button class="btn btn-sm btn-default disabled" title="{% trans "Suspend" %}">
|
<button class="btn btn-sm btn-default disabled" title="{% trans "Suspend" %}" disabled>
|
||||||
<span class="glyphicon glyphicon-pause"></span>
|
<span class="glyphicon glyphicon-pause"></span>
|
||||||
</button>
|
</button>
|
||||||
<button class="btn btn-sm btn-default disabled" title="{% trans "Power Off" %}">
|
<button class="btn btn-sm btn-default disabled" title="{% trans "Power Off" %}" disabled>
|
||||||
<span class="glyphicon glyphicon-off"></span>
|
<span class="glyphicon glyphicon-off"></span>
|
||||||
</button>
|
</button>
|
||||||
<button class="btn btn-sm btn-default disabled" title="{% trans "Power Cycle" %}">
|
<button class="btn btn-sm btn-default disabled" title="{% trans "Power Cycle" %}" disabled>
|
||||||
<span class="glyphicon glyphicon-refresh"></span>
|
<span class="glyphicon glyphicon-refresh"></span>
|
||||||
</button>
|
</button>
|
||||||
<button class="btn btn-sm btn-default disabled" title="{% trans "VNC Console" %}">
|
<button class="btn btn-sm btn-default disabled" title="{% trans "VNC Console" %}" disabled>
|
||||||
<span class="glyphicon glyphicon-eye-open"></span>
|
<span class="glyphicon glyphicon-eye-open"></span>
|
||||||
</button>
|
</button>
|
||||||
{% endifequal %}
|
{% endifequal %}
|
||||||
|
@ -117,21 +116,21 @@
|
||||||
<button class="btn btn-sm btn-default" type="submit" name="resume" title="{% trans "Resume" %}">
|
<button class="btn btn-sm btn-default" type="submit" name="resume" title="{% trans "Resume" %}">
|
||||||
<span class="glyphicon glyphicon-play"></span>
|
<span class="glyphicon glyphicon-play"></span>
|
||||||
</button>
|
</button>
|
||||||
<button class="btn btn-sm btn-default disabled" title="{% trans "Suspend" %}">
|
<button class="btn btn-sm btn-default disabled" title="{% trans "Suspend" %}" disabled>
|
||||||
<span class="glyphicon glyphicon-pause"></span>
|
<span class="glyphicon glyphicon-pause"></span>
|
||||||
</button>
|
</button>
|
||||||
<button class="btn btn-sm btn-default disabled" title="{% trans "Power Off" %}">
|
<button class="btn btn-sm btn-default" type="submit" name="powerforce" title="{% trans "Force Off" %}" onclick="return confirm('Are you sure to force it down?')">
|
||||||
<span class="glyphicon glyphicon-off"></span>
|
<span class="glyphicon glyphicon-off"></span>
|
||||||
</button>
|
</button>
|
||||||
<button class="btn btn-sm btn-default disabled" title="{% trans "Power Cycle" %}">
|
<button class="btn btn-sm btn-default disabled" title="{% trans "Power Cycle" %}" disabled>
|
||||||
<span class="glyphicon glyphicon-refresh"></span>
|
<span class="glyphicon glyphicon-refresh"></span>
|
||||||
</button>
|
</button>
|
||||||
<button class="btn btn-sm btn-default disabled" title="{% trans "VNC Console" %}">
|
<button class="btn btn-sm btn-default disabled" title="{% trans "VNC Console" %}" disabled>
|
||||||
<span class="glyphicon glyphicon-eye-open"></span>
|
<span class="glyphicon glyphicon-eye-open"></span>
|
||||||
</button>
|
</button>
|
||||||
{% endifequal %}
|
{% endifequal %}
|
||||||
{% ifequal info.status 1 %}
|
{% ifequal info.status 1 %}
|
||||||
<button class="btn btn-sm btn-default disabled" title="{% trans "Power On" %}">
|
<button class="btn btn-sm btn-default disabled" title="{% trans "Power On" %}" disabled>
|
||||||
<span class="glyphicon glyphicon-play"></span>
|
<span class="glyphicon glyphicon-play"></span>
|
||||||
</button>
|
</button>
|
||||||
<button class="btn btn-sm btn-default" type="submit" name="suspend" title="{% trans "Suspend" %}">
|
<button class="btn btn-sm btn-default" type="submit" name="suspend" title="{% trans "Suspend" %}">
|
||||||
|
@ -143,9 +142,9 @@
|
||||||
<button class="btn btn-sm btn-default" type="submit" name="powercycle" title="{% trans "Power Cycle" %}" onclick="return confirm('Are you sure?')">
|
<button class="btn btn-sm btn-default" type="submit" name="powercycle" title="{% trans "Power Cycle" %}" onclick="return confirm('Are you sure?')">
|
||||||
<span class="glyphicon glyphicon-refresh"></span>
|
<span class="glyphicon glyphicon-refresh"></span>
|
||||||
</button>
|
</button>
|
||||||
<a href="#" class="btn btn-sm btn-default" onclick='open_console("{{ host.0 }}-{{ info.uuid }}")' title="{% trans "Console" %}">
|
<button class="btn btn-sm btn-default" type="button" onclick='open_console("{{ host.0 }}-{{ info.uuid }}")' title="{% trans "Console" %}">
|
||||||
<span class="glyphicon glyphicon-eye-open"></span>
|
<span class="glyphicon glyphicon-eye-open"></span>
|
||||||
</a>
|
</button>
|
||||||
{% endifequal %}
|
{% endifequal %}
|
||||||
</form>
|
</form>
|
||||||
</td>
|
</td>
|
||||||
|
|
|
@ -27,6 +27,7 @@ from logs.views import addlogmsg
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.contrib import messages
|
from django.contrib import messages
|
||||||
|
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
def index(request):
|
def index(request):
|
||||||
"""
|
"""
|
||||||
|
@ -100,11 +101,12 @@ def instances(request, compute_id):
|
||||||
def instance(request, compute_id, vname):
|
def instance(request, compute_id, vname):
|
||||||
"""
|
"""
|
||||||
:param request:
|
:param request:
|
||||||
|
:param compute_id:
|
||||||
|
:param vname:
|
||||||
:return:
|
:return:
|
||||||
"""
|
"""
|
||||||
|
|
||||||
error_messages = []
|
error_messages = []
|
||||||
# messages = []
|
|
||||||
compute = get_object_or_404(Compute, pk=compute_id)
|
compute = get_object_or_404(Compute, pk=compute_id)
|
||||||
computes = Compute.objects.all().order_by('name')
|
computes = Compute.objects.all().order_by('name')
|
||||||
computes_count = computes.count()
|
computes_count = computes.count()
|
||||||
|
@ -257,9 +259,6 @@ def instance(request, compute_id, vname):
|
||||||
compute.password,
|
compute.password,
|
||||||
compute.type,
|
compute.type,
|
||||||
vname)
|
vname)
|
||||||
compute_networks = sorted(conn.get_networks())
|
|
||||||
compute_interfaces = sorted(conn.get_ifaces())
|
|
||||||
compute_nwfilters = conn.get_nwfilters()
|
|
||||||
status = conn.get_status()
|
status = conn.get_status()
|
||||||
autostart = conn.get_autostart()
|
autostart = conn.get_autostart()
|
||||||
bootmenu = conn.get_bootmenu()
|
bootmenu = conn.get_bootmenu()
|
||||||
|
@ -271,13 +270,13 @@ def instance(request, compute_id, vname):
|
||||||
cur_memory = conn.get_cur_memory()
|
cur_memory = conn.get_cur_memory()
|
||||||
title = conn.get_title()
|
title = conn.get_title()
|
||||||
description = conn.get_description()
|
description = conn.get_description()
|
||||||
|
networks = conn.get_net_device()
|
||||||
disks = conn.get_disk_devices()
|
disks = conn.get_disk_devices()
|
||||||
media = conn.get_media_devices()
|
media = conn.get_media_devices()
|
||||||
if len(media) != 0:
|
if len(media) != 0:
|
||||||
media_iso = sorted(conn.get_iso_media())
|
media_iso = sorted(conn.get_iso_media())
|
||||||
else:
|
else:
|
||||||
media_iso = []
|
media_iso = []
|
||||||
networks = conn.get_net_device()
|
|
||||||
|
|
||||||
vcpu_range = conn.get_max_cpus()
|
vcpu_range = conn.get_max_cpus()
|
||||||
memory_range = [256, 512, 768, 1024, 2048, 3072, 4096, 6144, 8192, 16384]
|
memory_range = [256, 512, 768, 1024, 2048, 3072, 4096, 6144, 8192, 16384]
|
||||||
|
@ -285,8 +284,6 @@ def instance(request, compute_id, vname):
|
||||||
insort(memory_range, memory)
|
insort(memory_range, memory)
|
||||||
if cur_memory not in memory_range:
|
if cur_memory not in memory_range:
|
||||||
insort(memory_range, cur_memory)
|
insort(memory_range, cur_memory)
|
||||||
memory_host = conn.get_max_memory()
|
|
||||||
vcpu_host = len(vcpu_range)
|
|
||||||
telnet_port = conn.get_telnet_port()
|
telnet_port = conn.get_telnet_port()
|
||||||
console_type = conn.get_console_type()
|
console_type = conn.get_console_type()
|
||||||
console_port = conn.get_console_port()
|
console_port = conn.get_console_port()
|
||||||
|
@ -298,18 +295,16 @@ def instance(request, compute_id, vname):
|
||||||
console_passwd = conn.get_console_passwd()
|
console_passwd = conn.get_console_passwd()
|
||||||
clone_free_names = get_clone_free_names()
|
clone_free_names = get_clone_free_names()
|
||||||
user_quota_msg = check_user_quota(0, 0, 0, 0)
|
user_quota_msg = check_user_quota(0, 0, 0, 0)
|
||||||
storages = sorted(conn.get_storages())
|
|
||||||
cache_modes = sorted(conn.get_cache_modes().items())
|
cache_modes = sorted(conn.get_cache_modes().items())
|
||||||
default_cache = settings.INSTANCE_VOLUME_DEFAULT_CACHE
|
default_cache = settings.INSTANCE_VOLUME_DEFAULT_CACHE
|
||||||
default_format = settings.INSTANCE_VOLUME_DEFAULT_FORMAT
|
default_format = settings.INSTANCE_VOLUME_DEFAULT_FORMAT
|
||||||
default_owner = settings.INSTANCE_VOLUME_DEFAULT_OWNER
|
default_owner = settings.INSTANCE_VOLUME_DEFAULT_OWNER
|
||||||
formats = conn.get_image_formats()
|
formats = conn.get_image_formats()
|
||||||
|
|
||||||
busses = conn.get_disk_bus_types()
|
|
||||||
default_bus = settings.INSTANCE_VOLUME_DEFAULT_BUS
|
|
||||||
show_access_root_password = settings.SHOW_ACCESS_ROOT_PASSWORD
|
show_access_root_password = settings.SHOW_ACCESS_ROOT_PASSWORD
|
||||||
show_access_ssh_keys = settings.SHOW_ACCESS_SSH_KEYS
|
show_access_ssh_keys = settings.SHOW_ACCESS_SSH_KEYS
|
||||||
clone_instance_auto_name = settings.CLONE_INSTANCE_AUTO_NAME
|
clone_instance_auto_name = settings.CLONE_INSTANCE_AUTO_NAME
|
||||||
|
default_bus = settings.INSTANCE_VOLUME_DEFAULT_BUS
|
||||||
|
|
||||||
try:
|
try:
|
||||||
instance = Instance.objects.get(compute_id=compute_id, name=vname)
|
instance = Instance.objects.get(compute_id=compute_id, name=vname)
|
||||||
|
@ -327,6 +322,15 @@ def instance(request, compute_id, vname):
|
||||||
userinstances = UserInstance.objects.filter(instance=instance).order_by('user__username')
|
userinstances = UserInstance.objects.filter(instance=instance).order_by('user__username')
|
||||||
allow_admin_or_not_template = request.user.is_superuser or request.user.is_staff or not instance.is_template
|
allow_admin_or_not_template = request.user.is_superuser or request.user.is_staff or not instance.is_template
|
||||||
|
|
||||||
|
# Host resources
|
||||||
|
vcpu_host = len(vcpu_range)
|
||||||
|
memory_host = conn.get_max_memory()
|
||||||
|
bus_host = conn.get_disk_bus_types()
|
||||||
|
networks_host = sorted(conn.get_networks())
|
||||||
|
interfaces_host = sorted(conn.get_ifaces())
|
||||||
|
nwfilters_host = conn.get_nwfilters()
|
||||||
|
storages_host = sorted(conn.get_storages(True))
|
||||||
|
|
||||||
if request.method == 'POST':
|
if request.method == 'POST':
|
||||||
if 'poweron' in request.POST:
|
if 'poweron' in request.POST:
|
||||||
if instance.is_template:
|
if instance.is_template:
|
||||||
|
@ -460,8 +464,67 @@ def instance(request, compute_id, vname):
|
||||||
addlogmsg(request.user.username, instance.name, msg)
|
addlogmsg(request.user.username, instance.name, msg)
|
||||||
return HttpResponseRedirect(request.get_full_path() + '#resize')
|
return HttpResponseRedirect(request.get_full_path() + '#resize')
|
||||||
|
|
||||||
|
if 'resizevm_cpu' in request.POST and (
|
||||||
|
request.user.is_superuser or request.user.is_staff or userinstance.is_change):
|
||||||
|
new_vcpu = request.POST.get('vcpu', '')
|
||||||
|
new_cur_vcpu = request.POST.get('cur_vcpu', '')
|
||||||
|
|
||||||
|
quota_msg = check_user_quota(0, int(new_vcpu) - vcpu, 0, 0)
|
||||||
|
if not request.user.is_superuser and quota_msg:
|
||||||
|
msg = _("User %s quota reached, cannot resize CPU of '%s'!" % (quota_msg, instance.name))
|
||||||
|
error_messages.append(msg)
|
||||||
|
else:
|
||||||
|
cur_vcpu = new_cur_vcpu
|
||||||
|
vcpu = new_vcpu
|
||||||
|
conn.resize_cpu(cur_vcpu, vcpu)
|
||||||
|
msg = _("Resize CPU")
|
||||||
|
addlogmsg(request.user.username, instance.name, msg)
|
||||||
|
return HttpResponseRedirect(request.get_full_path() + '#resize')
|
||||||
|
|
||||||
|
if 'resizevm_mem' in request.POST and (
|
||||||
|
request.user.is_superuser or request.user.is_staff or userinstance.is_change):
|
||||||
|
new_memory = request.POST.get('memory', '')
|
||||||
|
new_memory_custom = request.POST.get('memory_custom', '')
|
||||||
|
if new_memory_custom:
|
||||||
|
new_memory = new_memory_custom
|
||||||
|
new_cur_memory = request.POST.get('cur_memory', '')
|
||||||
|
new_cur_memory_custom = request.POST.get('cur_memory_custom', '')
|
||||||
|
if new_cur_memory_custom:
|
||||||
|
new_cur_memory = new_cur_memory_custom
|
||||||
|
quota_msg = check_user_quota(0, 0, int(new_memory) - memory, 0)
|
||||||
|
if not request.user.is_superuser and quota_msg:
|
||||||
|
msg = _("User %s quota reached, cannot resize memory of '%s'!" % (quota_msg, instance.name))
|
||||||
|
error_messages.append(msg)
|
||||||
|
else:
|
||||||
|
cur_memory = new_cur_memory
|
||||||
|
memory = new_memory
|
||||||
|
conn.resize_mem(cur_memory, memory)
|
||||||
|
msg = _("Resize Memory")
|
||||||
|
addlogmsg(request.user.username, instance.name, msg)
|
||||||
|
return HttpResponseRedirect(request.get_full_path() + '#resize')
|
||||||
|
|
||||||
|
if 'resizevm_disk' in request.POST and (
|
||||||
|
request.user.is_superuser or request.user.is_staff or userinstance.is_change):
|
||||||
|
disks_new = list()
|
||||||
|
for disk in disks:
|
||||||
|
input_disk_size = filesizefstr(request.POST.get('disk_size_' + disk['dev'], ''))
|
||||||
|
if input_disk_size > disk['size'] + (64 << 20):
|
||||||
|
disk['size_new'] = input_disk_size
|
||||||
|
disks_new.append(disk)
|
||||||
|
disk_sum = sum([disk['size'] >> 30 for disk in disks_new])
|
||||||
|
disk_new_sum = sum([disk['size_new'] >> 30 for disk in disks_new])
|
||||||
|
quota_msg = check_user_quota(0, 0, 0, disk_new_sum - disk_sum)
|
||||||
|
if not request.user.is_superuser and quota_msg:
|
||||||
|
msg = _("User %s quota reached, cannot resize disks of '%s'!" % (quota_msg, instance.name))
|
||||||
|
error_messages.append(msg)
|
||||||
|
else:
|
||||||
|
conn.resize_disk(disks_new)
|
||||||
|
msg = _("Resize")
|
||||||
|
addlogmsg(request.user.username, instance.name, msg)
|
||||||
|
return HttpResponseRedirect(request.get_full_path() + '#resize')
|
||||||
|
|
||||||
if 'add_new_vol' in request.POST and allow_admin_or_not_template:
|
if 'add_new_vol' in request.POST and allow_admin_or_not_template:
|
||||||
connCreate = wvmCreate(compute.hostname,
|
conn_create = wvmCreate(compute.hostname,
|
||||||
compute.login,
|
compute.login,
|
||||||
compute.password,
|
compute.password,
|
||||||
compute.type)
|
compute.type)
|
||||||
|
@ -474,7 +537,7 @@ def instance(request, compute_id, vname):
|
||||||
cache = request.POST.get('cache', default_cache)
|
cache = request.POST.get('cache', default_cache)
|
||||||
target = get_new_disk_dev(media, disks, bus)
|
target = get_new_disk_dev(media, disks, bus)
|
||||||
|
|
||||||
path = connCreate.create_volume(storage, name, size, format, meta_prealloc, default_owner)
|
path = conn_create.create_volume(storage, name, size, format, meta_prealloc, default_owner)
|
||||||
conn.attach_disk(path, target, subdriver=format, cache=cache, targetbus=bus)
|
conn.attach_disk(path, target, subdriver=format, cache=cache, targetbus=bus)
|
||||||
msg = _('Attach new disk {} ({})'.format(name, format))
|
msg = _('Attach new disk {} ({})'.format(name, format))
|
||||||
addlogmsg(request.user.username, instance.name, msg)
|
addlogmsg(request.user.username, instance.name, msg)
|
||||||
|
@ -486,16 +549,16 @@ def instance(request, compute_id, vname):
|
||||||
bus = request.POST.get('bus', default_bus)
|
bus = request.POST.get('bus', default_bus)
|
||||||
cache = request.POST.get('cache', default_cache)
|
cache = request.POST.get('cache', default_cache)
|
||||||
|
|
||||||
connCreate = wvmStorage(compute.hostname,
|
conn_create = wvmStorage(compute.hostname,
|
||||||
compute.login,
|
compute.login,
|
||||||
compute.password,
|
compute.password,
|
||||||
compute.type,
|
compute.type,
|
||||||
storage)
|
storage)
|
||||||
|
|
||||||
format = connCreate.get_volume_type(name)
|
format = conn_create.get_volume_type(name)
|
||||||
path = connCreate.get_target_path()
|
path = conn_create.get_target_path()
|
||||||
target = get_new_disk_dev(media, disks, bus)
|
target = get_new_disk_dev(media, disks, bus)
|
||||||
source = path + "/" + name;
|
source = path + "/" + name
|
||||||
|
|
||||||
conn.attach_disk(source, target, subdriver=format, cache=cache, targetbus=bus)
|
conn.attach_disk(source, target, subdriver=format, cache=cache, targetbus=bus)
|
||||||
msg = _('Attach Existing disk: ' + target)
|
msg = _('Attach Existing disk: ' + target)
|
||||||
|
@ -504,7 +567,7 @@ def instance(request, compute_id, vname):
|
||||||
|
|
||||||
if 'delete_vol' in request.POST and allow_admin_or_not_template:
|
if 'delete_vol' in request.POST and allow_admin_or_not_template:
|
||||||
storage = request.POST.get('storage', '')
|
storage = request.POST.get('storage', '')
|
||||||
connDelete = wvmStorage(compute.hostname,
|
conn_delete = wvmStorage(compute.hostname,
|
||||||
compute.login,
|
compute.login,
|
||||||
compute.password,
|
compute.password,
|
||||||
compute.type,
|
compute.type,
|
||||||
|
@ -514,7 +577,7 @@ def instance(request, compute_id, vname):
|
||||||
name = request.POST.get('name', '')
|
name = request.POST.get('name', '')
|
||||||
|
|
||||||
conn.detach_disk(dev)
|
conn.detach_disk(dev)
|
||||||
connDelete.del_volume(name)
|
conn_delete.del_volume(name)
|
||||||
|
|
||||||
msg = _('Delete disk: ' + dev)
|
msg = _('Delete disk: ' + dev)
|
||||||
addlogmsg(request.user.username, instance.name, msg)
|
addlogmsg(request.user.username, instance.name, msg)
|
||||||
|
@ -625,8 +688,8 @@ def instance(request, compute_id, vname):
|
||||||
if bootorder:
|
if bootorder:
|
||||||
order_list = {}
|
order_list = {}
|
||||||
for idx, val in enumerate(bootorder.split(',')):
|
for idx, val in enumerate(bootorder.split(',')):
|
||||||
type, dev = val.split(':', 1)
|
dev_type, dev = val.split(':', 1)
|
||||||
order_list[idx] = {"type": type, "dev": dev}
|
order_list[idx] = {"type": dev_type, "dev": dev}
|
||||||
conn.set_bootorder(order_list)
|
conn.set_bootorder(order_list)
|
||||||
msg = _("Set boot order")
|
msg = _("Set boot order")
|
||||||
|
|
||||||
|
@ -796,7 +859,7 @@ def instance(request, compute_id, vname):
|
||||||
elif not re.match(r'^[a-zA-Z0-9-]+$', clone_data['name']):
|
elif not re.match(r'^[a-zA-Z0-9-]+$', clone_data['name']):
|
||||||
msg = _("Instance name '%s' contains invalid characters!" % clone_data['name'])
|
msg = _("Instance name '%s' contains invalid characters!" % clone_data['name'])
|
||||||
error_messages.append(msg)
|
error_messages.append(msg)
|
||||||
elif not re.match(r'^([0-9A-F]{2})(\:?[0-9A-F]{2}){5}$', clone_data['clone-net-mac-0'],
|
elif not re.match(r'^([0-9A-F]{2})(:?[0-9A-F]{2}){5}$', clone_data['clone-net-mac-0'],
|
||||||
re.IGNORECASE):
|
re.IGNORECASE):
|
||||||
msg = _("Instance mac '%s' invalid format!" % clone_data['clone-net-mac-0'])
|
msg = _("Instance mac '%s' invalid format!" % clone_data['clone-net-mac-0'])
|
||||||
error_messages.append(msg)
|
error_messages.append(msg)
|
||||||
|
@ -847,6 +910,8 @@ def instance(request, compute_id, vname):
|
||||||
def inst_status(request, compute_id, vname):
|
def inst_status(request, compute_id, vname):
|
||||||
"""
|
"""
|
||||||
:param request:
|
:param request:
|
||||||
|
:param compute_id:
|
||||||
|
:param vname:
|
||||||
:return:
|
:return:
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
@ -988,6 +1053,12 @@ def instances_actions(request):
|
||||||
conn.shutdown(name)
|
conn.shutdown(name)
|
||||||
return HttpResponseRedirect(request.get_full_path())
|
return HttpResponseRedirect(request.get_full_path())
|
||||||
|
|
||||||
|
if 'powerforce' in request.POST:
|
||||||
|
conn.force_shutdown(name)
|
||||||
|
msg = _("Force Off")
|
||||||
|
addlogmsg(request.user.username, instance.name, msg)
|
||||||
|
return HttpResponseRedirect(request.get_full_path())
|
||||||
|
|
||||||
if 'powercycle' in request.POST:
|
if 'powercycle' in request.POST:
|
||||||
msg = _("Power Cycle")
|
msg = _("Power Cycle")
|
||||||
conn.force_shutdown(name)
|
conn.force_shutdown(name)
|
||||||
|
@ -1027,7 +1098,7 @@ def instances_actions(request):
|
||||||
addlogmsg(request.user.username, instance.name, msg)
|
addlogmsg(request.user.username, instance.name, msg)
|
||||||
conn.resume(name)
|
conn.resume(name)
|
||||||
return HttpResponseRedirect(request.get_full_path())
|
return HttpResponseRedirect(request.get_full_path())
|
||||||
|
return HttpResponseRedirect(request.get_full_path())
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
def inst_graph(request, compute_id, vname):
|
def inst_graph(request, compute_id, vname):
|
||||||
|
@ -1174,7 +1245,7 @@ def _get_clone_disks(disks, vname=''):
|
||||||
def sshkeys(request, vname):
|
def sshkeys(request, vname):
|
||||||
"""
|
"""
|
||||||
:param request:
|
:param request:
|
||||||
:param vm:
|
:param vname:
|
||||||
:return:
|
:return:
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
@ -1213,7 +1284,7 @@ def delete_instance(instance, delete_disk=False):
|
||||||
print("Forcing shutdown")
|
print("Forcing shutdown")
|
||||||
conn.force_shutdown()
|
conn.force_shutdown()
|
||||||
if delete_disk:
|
if delete_disk:
|
||||||
snapshots = sorted(conn.get_snapshot(), reverse=True, key=lambda k:k['date'])
|
snapshots = sorted(conn.get_snapshot(), reverse=True, key=lambda k: k['date'])
|
||||||
for snap in snapshots:
|
for snap in snapshots:
|
||||||
print("Deleting snapshot {}".format(snap['name']))
|
print("Deleting snapshot {}".format(snap['name']))
|
||||||
conn.snapshot_delete(snap['name'])
|
conn.snapshot_delete(snap['name'])
|
||||||
|
|
|
@ -37,16 +37,16 @@
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-xs-6 col-sm-4">
|
<div class="col-xs-6 col-sm-4">
|
||||||
<p>{% trans "Interface:" %}</p>
|
<p>{% trans "Interface" %}:</p>
|
||||||
<p>{% trans "IPv4:" %} ({% ifequal ipv4 None %}None{% else %}{{ ipv4_type }}{% endifequal %})</p>
|
<p>{% trans "IPv4" %}: ({% ifequal ipv4 None %}{% trans 'None' %}{% else %}{{ ipv4_type }}{% endifequal %})</p>
|
||||||
<p>{% trans "IPv6:" %} ({% ifequal ipv6 None %}None{% else %}{{ ipv6_type }}{% endifequal %})</p>
|
<p>{% trans "IPv6" %}: ({% ifequal ipv6 None %}{% trans 'None' %}{% else %}{{ ipv6_type }}{% endifequal %})</p>
|
||||||
<p>{% trans "MAC Adress:" %}</p>
|
<p>{% trans "MAC Adress" %}:</p>
|
||||||
<p>{% trans "Interface Type:" %}</p>
|
<p>{% trans "Interface Type" %}:</p>
|
||||||
{% ifequal itype 'bridge' %}
|
{% ifequal itype 'bridge' %}
|
||||||
<p>{% trans "Bridge device" %}</p>
|
<p>{% trans "Bridge device" %}</p>
|
||||||
{% endifequal %}
|
{% endifequal %}
|
||||||
<p>{% trans "Boot Mode:" %}</p>
|
<p>{% trans "Boot Mode" %}:</p>
|
||||||
<p>{% trans "State:" %}</p>
|
<p>{% trans "State" %}:</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-xs-6 col-sm-6">
|
<div class="col-xs-6 col-sm-6">
|
||||||
<p><strong>{{ iface }}</strong></p>
|
<p><strong>{{ iface }}</strong></p>
|
||||||
|
|
|
@ -12,6 +12,7 @@ from libvirt import libvirtError
|
||||||
def interfaces(request, compute_id):
|
def interfaces(request, compute_id):
|
||||||
"""
|
"""
|
||||||
:param request:
|
:param request:
|
||||||
|
:param compute_id:
|
||||||
:return:
|
:return:
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
@ -60,6 +61,7 @@ def interfaces(request, compute_id):
|
||||||
def interface(request, compute_id, iface):
|
def interface(request, compute_id, iface):
|
||||||
"""
|
"""
|
||||||
:param request:
|
:param request:
|
||||||
|
:param iface:
|
||||||
:return:
|
:return:
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
|
@ -18,7 +18,7 @@
|
||||||
<div class="col-lg-12">
|
<div class="col-lg-12">
|
||||||
<div class="alert alert-warning alert-dismissable">
|
<div class="alert alert-warning alert-dismissable">
|
||||||
<button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
|
<button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
|
||||||
<i class="fa fa-exclamation-triangle"></i> <strong>{% trans "Warning:" %}</strong> {% trans "You don't have any Logs" %}
|
<i class="fa fa-exclamation-triangle"></i> <strong>{% trans "Warning" %}:</strong> {% trans "You don't have any Logs" %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% else %}
|
{% else %}
|
||||||
|
@ -39,8 +39,8 @@
|
||||||
<tr>
|
<tr>
|
||||||
<td>{{ log.id }}</td>
|
<td>{{ log.id }}</td>
|
||||||
<td style="width:130px;">{{ log.date|date:"M d H:i:s" }}</td>
|
<td style="width:130px;">{{ log.date|date:"M d H:i:s" }}</td>
|
||||||
<td>{{ log.user }}</a></td>
|
<td>{{ log.user }}</td>
|
||||||
<td>{{ log.instance }}</a></td>
|
<td>{{ log.instance }}</td>
|
||||||
<td>{{ log.message }}</td>
|
<td>{{ log.message }}</td>
|
||||||
</tr>
|
</tr>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
|
@ -10,7 +10,9 @@ import json
|
||||||
|
|
||||||
def addlogmsg(user, instance, message):
|
def addlogmsg(user, instance, message):
|
||||||
"""
|
"""
|
||||||
:param request:
|
:param user:
|
||||||
|
:param instance:
|
||||||
|
:param message:
|
||||||
:return:
|
:return:
|
||||||
"""
|
"""
|
||||||
add_log_msg = Logs(user=user, instance=instance, message=message)
|
add_log_msg = Logs(user=user, instance=instance, message=message)
|
||||||
|
@ -21,6 +23,7 @@ def addlogmsg(user, instance, message):
|
||||||
def showlogs(request, page=1):
|
def showlogs(request, page=1):
|
||||||
"""
|
"""
|
||||||
:param request:
|
:param request:
|
||||||
|
:param page:
|
||||||
:return:
|
:return:
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
@ -36,11 +39,12 @@ def showlogs(request, page=1):
|
||||||
|
|
||||||
return render(request, 'showlogs.html', locals())
|
return render(request, 'showlogs.html', locals())
|
||||||
|
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
def vm_logs(request, vname):
|
def vm_logs(request, vname):
|
||||||
"""
|
"""
|
||||||
:param request:
|
:param request:
|
||||||
:param vm:
|
:param vname:
|
||||||
:return:
|
:return:
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
@ -51,7 +55,7 @@ def vm_logs(request, vname):
|
||||||
logs_ = Logs.objects.filter(instance=vm.name, date__gte=vm.created).order_by('-date')
|
logs_ = Logs.objects.filter(instance=vm.name, date__gte=vm.created).order_by('-date')
|
||||||
logs = []
|
logs = []
|
||||||
for l in logs_:
|
for l in logs_:
|
||||||
log = {}
|
log = dict()
|
||||||
log['user'] = l.user
|
log['user'] = l.user
|
||||||
log['instance'] = l.instance
|
log['instance'] = l.instance
|
||||||
log['message'] = l.message
|
log['message'] = l.message
|
||||||
|
|
|
@ -39,7 +39,6 @@
|
||||||
<input type="text" class="form-control" name="mac" required pattern="[0-9\/\:]+">
|
<input type="text" class="form-control" name="mac" required pattern="[0-9\/\:]+">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="modal-footer">
|
<div class="modal-footer">
|
||||||
|
|
|
@ -41,7 +41,7 @@
|
||||||
<div class="col-lg-12">
|
<div class="col-lg-12">
|
||||||
<div class="alert alert-warning alert-dismissable">
|
<div class="alert alert-warning alert-dismissable">
|
||||||
<button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
|
<button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
|
||||||
<i class="fa fa-exclamation-triangle"></i> <strong>{% trans "Warning:" %}</strong> {% trans "Hypervisor doesn't have any Networks" %}
|
<i class="fa fa-exclamation-triangle"></i><strong>{% trans "Warning:" %}</strong> {% trans "Hypervisor doesn't have any Networks" %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% else %}
|
{% else %}
|
||||||
|
|
|
@ -15,6 +15,7 @@ from django.contrib import messages
|
||||||
def networks(request, compute_id):
|
def networks(request, compute_id):
|
||||||
"""
|
"""
|
||||||
:param request:
|
:param request:
|
||||||
|
:param compute_id:
|
||||||
:return:
|
:return:
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
@ -64,6 +65,8 @@ def networks(request, compute_id):
|
||||||
def network(request, compute_id, pool):
|
def network(request, compute_id, pool):
|
||||||
"""
|
"""
|
||||||
:param request:
|
:param request:
|
||||||
|
:param compute_id:
|
||||||
|
:param pool:
|
||||||
:return:
|
:return:
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
@ -91,6 +94,7 @@ def network(request, compute_id, pool):
|
||||||
xml = conn._XMLDesc(0)
|
xml = conn._XMLDesc(0)
|
||||||
except libvirtError as lib_err:
|
except libvirtError as lib_err:
|
||||||
error_messages.append(lib_err)
|
error_messages.append(lib_err)
|
||||||
|
return HttpResponseRedirect(reverse('networks', args=compute_id))
|
||||||
|
|
||||||
if request.method == 'POST':
|
if request.method == 'POST':
|
||||||
if 'start' in request.POST:
|
if 'start' in request.POST:
|
||||||
|
|
|
@ -35,10 +35,10 @@
|
||||||
</div>
|
</div>
|
||||||
<!-- /.row -->
|
<!-- /.row -->
|
||||||
|
|
||||||
{% include 'errors_block.html' %}
|
{% include 'errors_block.html' %}
|
||||||
{% include 'messages_block.html' %}
|
{% include 'messages_block.html' %}
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-lg-12">
|
<div class="col-lg-12">
|
||||||
|
|
||||||
<div class="pull-right">
|
<div class="pull-right">
|
||||||
|
@ -137,12 +137,12 @@
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block script %}
|
{% block script %}
|
||||||
<script src="{% static "js/sortable.min.js" %}"></script>
|
<script src="{% static "js/sortable.min.js" %}"></script>
|
||||||
<script>
|
<script>
|
||||||
$(document).ready(function () {
|
$(document).ready(function () {
|
||||||
(function ($) {
|
(function ($) {
|
||||||
$('#filter').keyup(function () {
|
$('#filter').keyup(function () {
|
||||||
|
@ -154,7 +154,7 @@
|
||||||
})
|
})
|
||||||
}(jQuery));
|
}(jQuery));
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<script src="{% static "js/ace.js" %}"></script>
|
<script src="{% static "js/ace.js" %}"></script>
|
||||||
<script>
|
<script>
|
||||||
|
|
|
@ -7,8 +7,8 @@
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
|
|
||||||
<!-- Page Heading -->
|
<!-- Page Heading -->
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-lg-12">
|
<div class="col-lg-12">
|
||||||
{% include 'create_stg_vol_block.html' %}
|
{% include 'create_stg_vol_block.html' %}
|
||||||
<h1 class="page-header">{% trans "Storage:" %} {{ pool }}</h1>
|
<h1 class="page-header">{% trans "Storage:" %} {{ pool }}</h1>
|
||||||
|
@ -36,28 +36,28 @@
|
||||||
</li>
|
</li>
|
||||||
</ol>
|
</ol>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<!-- /.row -->
|
<!-- /.row -->
|
||||||
|
|
||||||
{% include 'errors_block.html' %}
|
{% include 'errors_block.html' %}
|
||||||
{% include 'messages_block.html' %}
|
{% include 'messages_block.html' %}
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-xs-6 col-sm-6">
|
<div class="col-xs-6 col-sm-6">
|
||||||
<p>{% trans "Pool name:" %}</p>
|
<p>{% trans "Pool name" %}:</p>
|
||||||
<p>{% trans "Pool type:" %}</p>
|
<p>{% trans "Pool type" %}:</p>
|
||||||
<p>{% trans "Pool path:" %}</p>
|
<p>{% trans "Pool path" %}:</p>
|
||||||
<p>{% trans "Pool status:" %}</p>
|
<p>{% trans "Pool status" %}:</p>
|
||||||
<p>{% trans "Size:" %} ({{ size|filesizeformat }} / {{ used|filesizeformat }})</p>
|
<p>{% trans "Size" %}: ({{ size|filesizeformat }} / {{ used|filesizeformat }})</p>
|
||||||
<p>{% trans "State:" %}</p>
|
<p>{% trans "State" %}:</p>
|
||||||
<p>{% trans "Autostart:" %}</p>
|
<p>{% trans "Autostart" %}:</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-xs-6 col-sm-6">
|
<div class="col-xs-6 col-sm-6">
|
||||||
<p>{{ pool }}</p>
|
<p>{{ pool }}</p>
|
||||||
<p>{% if not type %}{% trans "None" %}{% else %}{{ type }}{% endif %}</p>
|
<p>{% if not type %}{% trans "None" %}{% else %}{{ type }}{% endif %}</p>
|
||||||
<p>{% if not path %}{% trans "None" %}{% else %}{{ path }}{% endif %}</p>
|
<p>{% if not path %}{% trans "None" %}{% else %}{{ path }}{% endif %}</p>
|
||||||
<p>{% if not status %}{% trans "None" %}{% else %}{{ status }}{% endif %}</p>
|
<p>{% if not status %}{% trans "None" %}{% else %}{{ status }}{% endif %}</p>
|
||||||
<p>{% trans "Usage:" %} {{ percent }}%</p>
|
<p>{% trans "Usage" %}: {{ percent }}%</p>
|
||||||
<p>
|
<p>
|
||||||
<form action="" method="post" role="form">{% csrf_token %}
|
<form action="" method="post" role="form">{% csrf_token %}
|
||||||
{% ifequal state 0 %}
|
{% ifequal state 0 %}
|
||||||
|
@ -82,8 +82,8 @@
|
||||||
</form>
|
</form>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-lg-12">
|
<div class="col-lg-12">
|
||||||
{% if state %}
|
{% if state %}
|
||||||
<div class="row">
|
<div class="row">
|
||||||
|
@ -187,14 +187,14 @@
|
||||||
<div class="col-lg-12">
|
<div class="col-lg-12">
|
||||||
<div class="alert alert-warning alert-dismissable">
|
<div class="alert alert-warning alert-dismissable">
|
||||||
<button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
|
<button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
|
||||||
<i class="fa fa-exclamation-triangle"></i> <strong>{% trans "Warning:" %}</strong> {% trans "Hypervisor doesn't have any Volumes" %}
|
<i class="fa fa-exclamation-triangle"></i> <strong>{% trans "Warning" %}:</strong> {% trans "Hypervisor doesn't have any Volumes" %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% include 'pleasewaitdialog.html' %}
|
{% include 'pleasewaitdialog.html' %}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
{% block script %}
|
{% block script %}
|
||||||
<script src="{% static "js/sortable.min.js" %}"></script>
|
<script src="{% static "js/sortable.min.js" %}"></script>
|
||||||
|
|
|
@ -10,10 +10,12 @@ from libvirt import libvirtError
|
||||||
from django.contrib import messages
|
from django.contrib import messages
|
||||||
import json
|
import json
|
||||||
|
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
def storages(request, compute_id):
|
def storages(request, compute_id):
|
||||||
"""
|
"""
|
||||||
:param request:
|
:param request:
|
||||||
|
:param compute_id:
|
||||||
:return:
|
:return:
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
@ -72,6 +74,8 @@ def storages(request, compute_id):
|
||||||
def storage(request, compute_id, pool):
|
def storage(request, compute_id, pool):
|
||||||
"""
|
"""
|
||||||
:param request:
|
:param request:
|
||||||
|
:param compute_id:
|
||||||
|
:param pool:
|
||||||
:return:
|
:return:
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,7 @@ Further Information might be available at:
|
||||||
https://github.com/haypo/python-ipy
|
https://github.com/haypo/python-ipy
|
||||||
"""
|
"""
|
||||||
|
|
||||||
__version__ = '0.83'
|
__version__ = '1.00'
|
||||||
|
|
||||||
import bisect
|
import bisect
|
||||||
import collections
|
import collections
|
||||||
|
@ -21,7 +21,7 @@ IPv4ranges = {
|
||||||
'00000000': 'PRIVATE', # 0/8
|
'00000000': 'PRIVATE', # 0/8
|
||||||
'00001010': 'PRIVATE', # 10/8
|
'00001010': 'PRIVATE', # 10/8
|
||||||
'0110010001': 'CARRIER_GRADE_NAT', # 100.64/10
|
'0110010001': 'CARRIER_GRADE_NAT', # 100.64/10
|
||||||
'01111111': 'PRIVATE', # 127.0/8
|
'01111111': 'LOOPBACK', # 127.0/8
|
||||||
'1': 'PUBLIC', # fall back
|
'1': 'PUBLIC', # fall back
|
||||||
'1010100111111110': 'PRIVATE', # 169.254/16
|
'1010100111111110': 'PRIVATE', # 169.254/16
|
||||||
'101011000001': 'PRIVATE', # 172.16/12
|
'101011000001': 'PRIVATE', # 172.16/12
|
||||||
|
@ -243,7 +243,7 @@ class IPint(object):
|
||||||
else:
|
else:
|
||||||
raise ValueError("can't parse")
|
raise ValueError("can't parse")
|
||||||
|
|
||||||
(self.ip, parsedVersion) = parseAddress(ip)
|
(self.ip, parsedVersion) = parseAddress(ip, ipversion)
|
||||||
if ipversion == 0:
|
if ipversion == 0:
|
||||||
ipversion = parsedVersion
|
ipversion = parsedVersion
|
||||||
if prefixlen == -1:
|
if prefixlen == -1:
|
||||||
|
@ -473,7 +473,7 @@ class IPint(object):
|
||||||
"""Return a description of the IP type ('PRIVATE', 'RESERVED', etc).
|
"""Return a description of the IP type ('PRIVATE', 'RESERVED', etc).
|
||||||
|
|
||||||
>>> print(IP('127.0.0.1').iptype())
|
>>> print(IP('127.0.0.1').iptype())
|
||||||
PRIVATE
|
LOOPBACK
|
||||||
>>> print(IP('192.168.1.1').iptype())
|
>>> print(IP('192.168.1.1').iptype())
|
||||||
PRIVATE
|
PRIVATE
|
||||||
>>> print(IP('195.185.1.2').iptype())
|
>>> print(IP('195.185.1.2').iptype())
|
||||||
|
@ -553,6 +553,9 @@ class IPint(object):
|
||||||
"""
|
"""
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
def __bool__(self):
|
||||||
|
return self.__nonzero__()
|
||||||
|
|
||||||
def __len__(self):
|
def __len__(self):
|
||||||
"""
|
"""
|
||||||
Return the length of a subnet.
|
Return the length of a subnet.
|
||||||
|
@ -757,6 +760,9 @@ class IPint(object):
|
||||||
def __lt__(self, other):
|
def __lt__(self, other):
|
||||||
return self.__cmp__(other) < 0
|
return self.__cmp__(other) < 0
|
||||||
|
|
||||||
|
def __le__(self, other):
|
||||||
|
return self.__cmp__(other) <= 0
|
||||||
|
|
||||||
def __hash__(self):
|
def __hash__(self):
|
||||||
"""Called for the key object for dictionary operations, and by
|
"""Called for the key object for dictionary operations, and by
|
||||||
the built-in function hash(). Should return a 32-bit integer
|
the built-in function hash(). Should return a 32-bit integer
|
||||||
|
@ -1328,7 +1334,7 @@ def _parseAddressIPv6(ipstr):
|
||||||
return value
|
return value
|
||||||
|
|
||||||
|
|
||||||
def parseAddress(ipstr):
|
def parseAddress(ipstr, ipversion=0):
|
||||||
"""
|
"""
|
||||||
Parse a string and return the corresponding IP address (as integer)
|
Parse a string and return the corresponding IP address (as integer)
|
||||||
and a guess of the IP version.
|
and a guess of the IP version.
|
||||||
|
@ -1397,7 +1403,7 @@ def parseAddress(ipstr):
|
||||||
# assume IPv6 in pure hexadecimal notation
|
# assume IPv6 in pure hexadecimal notation
|
||||||
return (hexval, 6)
|
return (hexval, 6)
|
||||||
|
|
||||||
elif ipstr.find('.') != -1 or (intval is not None and intval < 256):
|
elif ipstr.find('.') != -1 or (intval is not None and intval < 256 and ipversion != 6):
|
||||||
# assume IPv4 ('127' gets interpreted as '127.0.0.0')
|
# assume IPv4 ('127' gets interpreted as '127.0.0.0')
|
||||||
bytes = ipstr.split('.')
|
bytes = ipstr.split('.')
|
||||||
if len(bytes) > 4:
|
if len(bytes) > 4:
|
||||||
|
@ -1415,7 +1421,7 @@ def parseAddress(ipstr):
|
||||||
# will be interpreted as IPv4 first byte
|
# will be interpreted as IPv4 first byte
|
||||||
if intval > MAX_IPV6_ADDRESS:
|
if intval > MAX_IPV6_ADDRESS:
|
||||||
raise ValueError("IP Address can't be larger than %x: %x" % (MAX_IPV6_ADDRESS, intval))
|
raise ValueError("IP Address can't be larger than %x: %x" % (MAX_IPV6_ADDRESS, intval))
|
||||||
if intval <= MAX_IPV4_ADDRESS:
|
if intval <= MAX_IPV4_ADDRESS and ipversion != 6:
|
||||||
return (intval, 4)
|
return (intval, 4)
|
||||||
else:
|
else:
|
||||||
return (intval, 6)
|
return (intval, 6)
|
||||||
|
|
|
@ -2,7 +2,7 @@ import libvirt
|
||||||
import threading
|
import threading
|
||||||
import socket
|
import socket
|
||||||
from vrtManager import util
|
from vrtManager import util
|
||||||
from rwlock import ReadWriteLock
|
from vrtManager.rwlock import ReadWriteLock
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from libvirt import libvirtError
|
from libvirt import libvirtError
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,6 @@ import string
|
||||||
from vrtManager import util
|
from vrtManager import util
|
||||||
from vrtManager.connection import wvmConnect
|
from vrtManager.connection import wvmConnect
|
||||||
from webvirtcloud.settings import QEMU_CONSOLE_DEFAULT_TYPE
|
from webvirtcloud.settings import QEMU_CONSOLE_DEFAULT_TYPE
|
||||||
from webvirtcloud.settings import QEMU_CONSOLE_LISTEN_ADDRESSES
|
|
||||||
from webvirtcloud.settings import INSTANCE_VOLUME_DEFAULT_OWNER as default_owner
|
from webvirtcloud.settings import INSTANCE_VOLUME_DEFAULT_OWNER as default_owner
|
||||||
from webvirtcloud.settings import INSTANCE_VOLUME_DEFAULT_FORMAT
|
from webvirtcloud.settings import INSTANCE_VOLUME_DEFAULT_FORMAT
|
||||||
|
|
||||||
|
@ -39,7 +38,7 @@ class wvmCreate(wvmConnect):
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
for img in stg.listVolumes():
|
for img in stg.listVolumes():
|
||||||
if img.endswith('.iso'):
|
if img.lower().endswith('.iso'):
|
||||||
pass
|
pass
|
||||||
else:
|
else:
|
||||||
images.append(img)
|
images.append(img)
|
||||||
|
@ -107,7 +106,7 @@ class wvmCreate(wvmConnect):
|
||||||
if not pool:
|
if not pool:
|
||||||
storages = self.get_storages(only_actives=True)
|
storages = self.get_storages(only_actives=True)
|
||||||
else:
|
else:
|
||||||
storages = [pool,]
|
storages = [pool]
|
||||||
for storage in storages:
|
for storage in storages:
|
||||||
stg = self.get_storage(storage)
|
stg = self.get_storage(storage)
|
||||||
if stg.info()[0] != 0:
|
if stg.info()[0] != 0:
|
||||||
|
@ -204,7 +203,6 @@ class wvmCreate(wvmConnect):
|
||||||
hd_disk_letters = list(string.lowercase)
|
hd_disk_letters = list(string.lowercase)
|
||||||
sd_disk_letters = list(string.lowercase)
|
sd_disk_letters = list(string.lowercase)
|
||||||
add_cd = True
|
add_cd = True
|
||||||
#for image, img_type in images.items():
|
|
||||||
for volume in images:
|
for volume in images:
|
||||||
stg = self.get_storage_by_vol_path(volume['path'])
|
stg = self.get_storage_by_vol_path(volume['path'])
|
||||||
stg_type = util.get_xml_path(stg.XMLDesc(0), "/pool/@type")
|
stg_type = util.get_xml_path(stg.XMLDesc(0), "/pool/@type")
|
||||||
|
@ -283,8 +281,4 @@ class wvmCreate(wvmConnect):
|
||||||
<memballoon model='virtio'/>
|
<memballoon model='virtio'/>
|
||||||
</devices>
|
</devices>
|
||||||
</domain>""" % video
|
</domain>""" % video
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
self._defineXML(xml)
|
self._defineXML(xml)
|
||||||
|
|
|
@ -58,13 +58,13 @@ class wvmHostDetails(wvmConnect):
|
||||||
"""
|
"""
|
||||||
Function return host server information: hostname, cpu, memory, ...
|
Function return host server information: hostname, cpu, memory, ...
|
||||||
"""
|
"""
|
||||||
info = []
|
info = list()
|
||||||
info.append(self.wvm.getHostname()) # hostname
|
info.append(self.wvm.getHostname()) # hostname
|
||||||
info.append(self.wvm.getInfo()[0]) # architecture
|
info.append(self.wvm.getInfo()[0]) # architecture
|
||||||
info.append(self.wvm.getInfo()[1] * 1048576) # memory
|
info.append(self.wvm.getInfo()[1] * 1048576) # memory
|
||||||
info.append(self.wvm.getInfo()[2]) # cpu core count
|
info.append(self.wvm.getInfo()[2]) # cpu core count
|
||||||
info.append(get_xml_path(self.wvm.getSysinfo(0), func=cpu_version)) # cpu version
|
info.append(get_xml_path(self.wvm.getSysinfo(0), func=cpu_version)) # cpu version
|
||||||
info.append(self.wvm.getURI()) #uri
|
info.append(self.wvm.getURI()) # uri
|
||||||
return info
|
return info
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -237,9 +237,9 @@ class wvmInstance(wvmConnect):
|
||||||
try:
|
try:
|
||||||
net = self.get_network(network_host)
|
net = self.get_network(network_host)
|
||||||
ip = get_mac_ipaddr(net, mac_host)
|
ip = get_mac_ipaddr(net, mac_host)
|
||||||
except libvirtError as e:
|
except libvirtError:
|
||||||
ip = None
|
ip = None
|
||||||
result.append({'mac': mac_host, 'nic': network_host, 'target': target_host,'ip': ip, 'filterref': filterref_host})
|
result.append({'mac': mac_host, 'nic': network_host, 'target': target_host, 'ip': ip, 'filterref': filterref_host})
|
||||||
return result
|
return result
|
||||||
|
|
||||||
return util.get_xml_path(self._XMLDesc(0), func=networks)
|
return util.get_xml_path(self._XMLDesc(0), func=networks)
|
||||||
|
@ -322,7 +322,7 @@ class wvmInstance(wvmConnect):
|
||||||
os = tree.find('os')
|
os = tree.find('os')
|
||||||
menu = os.find("bootmenu")
|
menu = os.find("bootmenu")
|
||||||
|
|
||||||
if menu == None:
|
if menu is None:
|
||||||
bootmenu = ElementTree.fromstring("<bootmenu enable='yes'/>")
|
bootmenu = ElementTree.fromstring("<bootmenu enable='yes'/>")
|
||||||
os.append(bootmenu)
|
os.append(bootmenu)
|
||||||
menu = os.find("bootmenu")
|
menu = os.find("bootmenu")
|
||||||
|
@ -365,7 +365,7 @@ class wvmInstance(wvmConnect):
|
||||||
for dev in devices:
|
for dev in devices:
|
||||||
dev_target = dev_type = dev_device = dev_alias = None
|
dev_target = dev_type = dev_device = dev_alias = None
|
||||||
boot_dev = dev.find('boot')
|
boot_dev = dev.find('boot')
|
||||||
if boot_dev != None:
|
if boot_dev is not None:
|
||||||
idx = boot_dev.get('order')
|
idx = boot_dev.get('order')
|
||||||
dev_type = dev.get('type')
|
dev_type = dev.get('type')
|
||||||
dev_device = dev.get('device')
|
dev_device = dev.get('device')
|
||||||
|
@ -398,7 +398,7 @@ class wvmInstance(wvmConnect):
|
||||||
# Remove rest of them
|
# Remove rest of them
|
||||||
for dev in tree.find('devices'):
|
for dev in tree.find('devices'):
|
||||||
boot_dev = dev.find('boot')
|
boot_dev = dev.find('boot')
|
||||||
if boot_dev != None:
|
if boot_dev is not None:
|
||||||
dev.remove(boot_dev)
|
dev.remove(boot_dev)
|
||||||
return tree
|
return tree
|
||||||
|
|
||||||
|
@ -410,19 +410,19 @@ class wvmInstance(wvmConnect):
|
||||||
devices = tree.findall("./devices/disk[@device='disk']")
|
devices = tree.findall("./devices/disk[@device='disk']")
|
||||||
for d in devices:
|
for d in devices:
|
||||||
device = d.find("./target[@dev='{}']".format(dev['dev']))
|
device = d.find("./target[@dev='{}']".format(dev['dev']))
|
||||||
if device != None:
|
if device is not None:
|
||||||
d.append(order)
|
d.append(order)
|
||||||
elif dev['type'] == 'cdrom':
|
elif dev['type'] == 'cdrom':
|
||||||
devices = tree.findall("./devices/disk[@device='cdrom']")
|
devices = tree.findall("./devices/disk[@device='cdrom']")
|
||||||
for d in devices:
|
for d in devices:
|
||||||
device = d.find("./target[@dev='{}']".format(dev['dev']))
|
device = d.find("./target[@dev='{}']".format(dev['dev']))
|
||||||
if device != None:
|
if device is not None:
|
||||||
d.append(order)
|
d.append(order)
|
||||||
elif dev['type'] == 'network':
|
elif dev['type'] == 'network':
|
||||||
devices = tree.findall("./devices/interface[@type='network']")
|
devices = tree.findall("./devices/interface[@type='network']")
|
||||||
for d in devices:
|
for d in devices:
|
||||||
device = d.find("mac[@address='{}']".format(dev['dev']))
|
device = d.find("mac[@address='{}']".format(dev['dev']))
|
||||||
if device != None:
|
if device is not None:
|
||||||
d.append(order)
|
d.append(order)
|
||||||
else:
|
else:
|
||||||
raise Exception('Invalid Device Type for boot order')
|
raise Exception('Invalid Device Type for boot order')
|
||||||
|
@ -478,7 +478,6 @@ class wvmInstance(wvmConnect):
|
||||||
self._defineXML(xmldom)
|
self._defineXML(xmldom)
|
||||||
|
|
||||||
def attach_disk(self, source, target, sourcetype='file', device='disk', driver='qemu', subdriver='raw', cache='none', targetbus='ide'):
|
def attach_disk(self, source, target, sourcetype='file', device='disk', driver='qemu', subdriver='raw', cache='none', targetbus='ide'):
|
||||||
tree = ElementTree.fromstring(self._XMLDesc(0))
|
|
||||||
xml_disk = "<disk type='%s' device='%s'>" % (sourcetype, device)
|
xml_disk = "<disk type='%s' device='%s'>" % (sourcetype, device)
|
||||||
if device == 'cdrom':
|
if device == 'cdrom':
|
||||||
xml_disk += "<driver name='%s' type='%s'/>" % (driver, subdriver)
|
xml_disk += "<driver name='%s' type='%s'/>" % (driver, subdriver)
|
||||||
|
@ -656,7 +655,7 @@ class wvmInstance(wvmConnect):
|
||||||
return socket
|
return socket
|
||||||
|
|
||||||
def get_console_type(self):
|
def get_console_type(self):
|
||||||
console_type = util.get_xml_path(self._XMLDesc(0),"/domain/devices/graphics/@type")
|
console_type = util.get_xml_path(self._XMLDesc(0), "/domain/devices/graphics/@type")
|
||||||
return console_type
|
return console_type
|
||||||
|
|
||||||
def set_console_type(self, console_type):
|
def set_console_type(self, console_type):
|
||||||
|
@ -741,7 +740,6 @@ class wvmInstance(wvmConnect):
|
||||||
"""
|
"""
|
||||||
Function change ram and cpu on vds.
|
Function change ram and cpu on vds.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
memory = int(memory) * 1024
|
memory = int(memory) * 1024
|
||||||
cur_memory = int(cur_memory) * 1024
|
cur_memory = int(cur_memory) * 1024
|
||||||
# if dom is running change only ram
|
# if dom is running change only ram
|
||||||
|
@ -769,6 +767,58 @@ class wvmInstance(wvmConnect):
|
||||||
new_xml = ElementTree.tostring(tree)
|
new_xml = ElementTree.tostring(tree)
|
||||||
self._defineXML(new_xml)
|
self._defineXML(new_xml)
|
||||||
|
|
||||||
|
def resize_cpu(self, cur_vcpu, vcpu):
|
||||||
|
"""
|
||||||
|
Function change ram and cpu on vds.
|
||||||
|
"""
|
||||||
|
xml = self._XMLDesc(VIR_DOMAIN_XML_SECURE)
|
||||||
|
tree = ElementTree.fromstring(xml)
|
||||||
|
|
||||||
|
set_vcpu = tree.find('vcpu')
|
||||||
|
set_vcpu.text = vcpu
|
||||||
|
set_vcpu.set('current', cur_vcpu)
|
||||||
|
|
||||||
|
new_xml = ElementTree.tostring(tree)
|
||||||
|
self._defineXML(new_xml)
|
||||||
|
|
||||||
|
def resize_mem(self, cur_memory, memory):
|
||||||
|
"""
|
||||||
|
Function change ram and cpu on vds.
|
||||||
|
"""
|
||||||
|
memory = int(memory) * 1024
|
||||||
|
cur_memory = int(cur_memory) * 1024
|
||||||
|
# if dom is running change only ram
|
||||||
|
if self.get_status() == VIR_DOMAIN_RUNNING:
|
||||||
|
self.set_memory(cur_memory, VIR_DOMAIN_AFFECT_LIVE)
|
||||||
|
self.set_memory(cur_memory, VIR_DOMAIN_AFFECT_CONFIG)
|
||||||
|
return
|
||||||
|
|
||||||
|
xml = self._XMLDesc(VIR_DOMAIN_XML_SECURE)
|
||||||
|
tree = ElementTree.fromstring(xml)
|
||||||
|
|
||||||
|
set_mem = tree.find('memory')
|
||||||
|
set_mem.text = str(memory)
|
||||||
|
set_cur_mem = tree.find('currentMemory')
|
||||||
|
set_cur_mem.text = str(cur_memory)
|
||||||
|
|
||||||
|
new_xml = ElementTree.tostring(tree)
|
||||||
|
self._defineXML(new_xml)
|
||||||
|
|
||||||
|
def resize_disk(self, disks):
|
||||||
|
"""
|
||||||
|
Function change disks on vds.
|
||||||
|
"""
|
||||||
|
xml = self._XMLDesc(VIR_DOMAIN_XML_SECURE)
|
||||||
|
tree = ElementTree.fromstring(xml)
|
||||||
|
|
||||||
|
for disk in disks:
|
||||||
|
source_dev = disk['path']
|
||||||
|
vol = self.get_volume_by_path(source_dev)
|
||||||
|
vol.resize(disk['size_new'])
|
||||||
|
|
||||||
|
new_xml = ElementTree.tostring(tree)
|
||||||
|
self._defineXML(new_xml)
|
||||||
|
|
||||||
def get_iso_media(self):
|
def get_iso_media(self):
|
||||||
iso = []
|
iso = []
|
||||||
storages = self.get_storages(only_actives=True)
|
storages = self.get_storages(only_actives=True)
|
||||||
|
@ -780,7 +830,7 @@ class wvmInstance(wvmConnect):
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
for img in stg.listVolumes():
|
for img in stg.listVolumes():
|
||||||
if img.endswith('.iso'):
|
if img.lower().endswith('.iso'):
|
||||||
iso.append(img)
|
iso.append(img)
|
||||||
return iso
|
return iso
|
||||||
|
|
||||||
|
@ -956,7 +1006,6 @@ class wvmInstance(wvmConnect):
|
||||||
return bridge_name
|
return bridge_name
|
||||||
|
|
||||||
def add_network(self, mac_address, source, source_type='net', interface_type='bridge', model='virtio', nwfilter=None):
|
def add_network(self, mac_address, source, source_type='net', interface_type='bridge', model='virtio', nwfilter=None):
|
||||||
tree = ElementTree.fromstring(self._XMLDesc(0))
|
|
||||||
bridge_name = self.get_bridge_name(source, source_type)
|
bridge_name = self.get_bridge_name(source, source_type)
|
||||||
xml_interface = """
|
xml_interface = """
|
||||||
<interface type='%s'>
|
<interface type='%s'>
|
||||||
|
@ -978,7 +1027,6 @@ class wvmInstance(wvmConnect):
|
||||||
|
|
||||||
def delete_network(self, mac_address):
|
def delete_network(self, mac_address):
|
||||||
tree = ElementTree.fromstring(self._XMLDesc(0))
|
tree = ElementTree.fromstring(self._XMLDesc(0))
|
||||||
devices = tree.find('devices')
|
|
||||||
for interface in tree.findall('devices/interface'):
|
for interface in tree.findall('devices/interface'):
|
||||||
source = interface.find('mac')
|
source = interface.find('mac')
|
||||||
if source.get('address', '') == mac_address:
|
if source.get('address', '') == mac_address:
|
||||||
|
@ -1038,7 +1086,7 @@ class wvmInstance(wvmConnect):
|
||||||
option = tree.find(o)
|
option = tree.find(o)
|
||||||
option_value = options.get(o, '').strip()
|
option_value = options.get(o, '').strip()
|
||||||
if not option_value:
|
if not option_value:
|
||||||
if not option is None:
|
if option is not None:
|
||||||
tree.remove(option)
|
tree.remove(option)
|
||||||
else:
|
else:
|
||||||
if option is None:
|
if option is None:
|
||||||
|
|
|
@ -22,6 +22,7 @@ def network_size(net, dhcp=None):
|
||||||
|
|
||||||
|
|
||||||
class wvmNetworks(wvmConnect):
|
class wvmNetworks(wvmConnect):
|
||||||
|
|
||||||
def get_networks_info(self):
|
def get_networks_info(self):
|
||||||
get_networks = self.get_networks()
|
get_networks = self.get_networks()
|
||||||
networks = []
|
networks = []
|
||||||
|
@ -166,7 +167,7 @@ class wvmNetwork(wvmConnect):
|
||||||
return dhcp[1]
|
return dhcp[1]
|
||||||
|
|
||||||
def can_pxe(self):
|
def can_pxe(self):
|
||||||
xml = self.get_xml()
|
xml = self._XMLDesc(0)
|
||||||
forward = self.get_ipv4_forward()[0]
|
forward = self.get_ipv4_forward()[0]
|
||||||
if forward and forward != "nat":
|
if forward and forward != "nat":
|
||||||
return True
|
return True
|
||||||
|
@ -204,14 +205,14 @@ class wvmNetwork(wvmConnect):
|
||||||
break
|
break
|
||||||
if host is None:
|
if host is None:
|
||||||
self.update(VIR_NETWORK_UPDATE_COMMAND_ADD_LAST, VIR_NETWORK_SECTION_IP_DHCP_HOST, -1, new_xml,
|
self.update(VIR_NETWORK_UPDATE_COMMAND_ADD_LAST, VIR_NETWORK_SECTION_IP_DHCP_HOST, -1, new_xml,
|
||||||
VIR_NETWORK_UPDATE_AFFECT_LIVE|VIR_NETWORK_UPDATE_AFFECT_CONFIG)
|
VIR_NETWORK_UPDATE_AFFECT_LIVE | VIR_NETWORK_UPDATE_AFFECT_CONFIG)
|
||||||
else:
|
else:
|
||||||
# change the host
|
# change the host
|
||||||
if host.get('name') == new_host_xml.get('name') and host.get('ip') == new_host_xml.get('ip'):
|
if host.get('name') == new_host_xml.get('name') and host.get('ip') == new_host_xml.get('ip'):
|
||||||
return False
|
return False
|
||||||
else:
|
else:
|
||||||
self.update(VIR_NETWORK_UPDATE_COMMAND_MODIFY, VIR_NETWORK_SECTION_IP_DHCP_HOST, -1, new_xml,
|
self.update(VIR_NETWORK_UPDATE_COMMAND_MODIFY, VIR_NETWORK_SECTION_IP_DHCP_HOST, -1, new_xml,
|
||||||
VIR_NETWORK_UPDATE_AFFECT_LIVE|VIR_NETWORK_UPDATE_AFFECT_CONFIG)
|
VIR_NETWORK_UPDATE_AFFECT_LIVE | VIR_NETWORK_UPDATE_AFFECT_CONFIG)
|
||||||
|
|
||||||
def delete_fixed_address(self, mac):
|
def delete_fixed_address(self, mac):
|
||||||
util.validate_macaddr(mac)
|
util.validate_macaddr(mac)
|
||||||
|
@ -222,7 +223,7 @@ class wvmNetwork(wvmConnect):
|
||||||
if h.get('mac') == mac:
|
if h.get('mac') == mac:
|
||||||
new_xml = '<host mac="{}" name="{}" ip="{}"/>'.format(mac, h.get('name'), h.get('ip'))
|
new_xml = '<host mac="{}" name="{}" ip="{}"/>'.format(mac, h.get('name'), h.get('ip'))
|
||||||
self.update(VIR_NETWORK_UPDATE_COMMAND_DELETE, VIR_NETWORK_SECTION_IP_DHCP_HOST, -1, new_xml,
|
self.update(VIR_NETWORK_UPDATE_COMMAND_DELETE, VIR_NETWORK_SECTION_IP_DHCP_HOST, -1, new_xml,
|
||||||
VIR_NETWORK_UPDATE_AFFECT_LIVE|VIR_NETWORK_UPDATE_AFFECT_CONFIG)
|
VIR_NETWORK_UPDATE_AFFECT_LIVE | VIR_NETWORK_UPDATE_AFFECT_CONFIG)
|
||||||
break
|
break
|
||||||
|
|
||||||
def modify_dhcp_range(self, range_start, range_end):
|
def modify_dhcp_range(self, range_start, range_end):
|
||||||
|
|
|
@ -12,7 +12,7 @@ class wvmNWFilters(wvmConnect):
|
||||||
def create_nwfilter(self, xml):
|
def create_nwfilter(self, xml):
|
||||||
self.wvm.nwfilterDefineXML(xml)
|
self.wvm.nwfilterDefineXML(xml)
|
||||||
|
|
||||||
def clone_nwfilter(self,name, cln_name):
|
def clone_nwfilter(self, name, cln_name):
|
||||||
nwfilter = self.get_nwfilter(name)
|
nwfilter = self.get_nwfilter(name)
|
||||||
if nwfilter:
|
if nwfilter:
|
||||||
tree = ElementTree.fromstring(nwfilter.XMLDesc(0))
|
tree = ElementTree.fromstring(nwfilter.XMLDesc(0))
|
||||||
|
|
|
@ -7,11 +7,11 @@ class wvmSecrets(wvmConnect):
|
||||||
xml = """<secret ephemeral='%s' private='%s'>
|
xml = """<secret ephemeral='%s' private='%s'>
|
||||||
<usage type='%s'>""" % (ephemeral, private, secret_type)
|
<usage type='%s'>""" % (ephemeral, private, secret_type)
|
||||||
if secret_type == 'ceph':
|
if secret_type == 'ceph':
|
||||||
xml += """<name>%s</name>""" % (data)
|
xml += """<name>%s</name>""" % data
|
||||||
if secret_type == 'volume':
|
if secret_type == 'volume':
|
||||||
xml += """<volume>%s</volume>""" % (data)
|
xml += """<volume>%s</volume>""" % data
|
||||||
if secret_type == 'iscsi':
|
if secret_type == 'iscsi':
|
||||||
xml += """<target>%s</target>""" % (data)
|
xml += """<target>%s</target>""" % data
|
||||||
xml += """</usage>
|
xml += """</usage>
|
||||||
</secret>"""
|
</secret>"""
|
||||||
self.wvm.secretDefineXML(xml)
|
self.wvm.secretDefineXML(xml)
|
||||||
|
|
|
@ -110,7 +110,7 @@ def get_xpath(doc, path):
|
||||||
if ret is not None:
|
if ret is not None:
|
||||||
if type(ret) == list:
|
if type(ret) == list:
|
||||||
if len(ret) >= 1:
|
if len(ret) >= 1:
|
||||||
if hasattr(ret[0],'text'):
|
if hasattr(ret[0], 'text'):
|
||||||
result = ret[0].text
|
result = ret[0].text
|
||||||
else:
|
else:
|
||||||
result = ret[0]
|
result = ret[0]
|
||||||
|
@ -119,6 +119,7 @@ def get_xpath(doc, path):
|
||||||
|
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
|
||||||
def pretty_mem(val):
|
def pretty_mem(val):
|
||||||
val = int(val)
|
val = int(val)
|
||||||
if val > (10 * 1024 * 1024):
|
if val > (10 * 1024 * 1024):
|
||||||
|
|
Loading…
Reference in a new issue