From ea5e9cfead2c872fe548eae880c94fdaee3a6b96 Mon Sep 17 00:00:00 2001 From: catborise Date: Fri, 19 Oct 2018 16:14:33 +0300 Subject: [PATCH] Add 'Adding, deleting and detaching disk volumes' to instances --- instances/templates/add_instance_volume.html | 2 +- instances/templates/instance.html | 152 ++++++++----------- instances/views.py | 33 +++- vrtManager/instance.py | 28 +++- 4 files changed, 123 insertions(+), 92 deletions(-) diff --git a/instances/templates/add_instance_volume.html b/instances/templates/add_instance_volume.html index ef7cb48..fb3ce22 100644 --- a/instances/templates/add_instance_volume.html +++ b/instances/templates/add_instance_volume.html @@ -1,5 +1,5 @@ {% load i18n %} -{% if request.user.is_superuser and status == 5 %} +{% if request.user.is_superuser %} diff --git a/instances/templates/instance.html b/instances/templates/instance.html index 2628fe2..ecc410b 100644 --- a/instances/templates/instance.html +++ b/instances/templates/instance.html @@ -342,11 +342,6 @@ {% trans "Resize Instance" %} -
  • - - {% trans "Add New Volume" %} - -
  • @@ -428,81 +423,7 @@ {% endif %}
    -
    - {% if request.user.is_superuser or userinstance.is_change %} -
    {% csrf_token %} -

    {% trans "Volume parameters" %}

    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    - -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    - {% ifequal status 5 %} - - {% else %} - - {% endifequal %} -
    - {% else %} - {% trans "You don't have permission for resizing instance" %} - - {% endif %} -
    -
    + @@ -607,6 +528,11 @@ {% trans "Media" %} +
  • + + {% trans "Disk" %} + +
  • {% if request.user.is_superuser %}
  • @@ -614,6 +540,7 @@
  • {% endif %} + {% if request.user.is_superuser or userinstance.is_vnc %}
  • @@ -702,6 +629,64 @@ {% endfor %}
    +
    +

    + {% trans "Instance Volumes" %} + {% include 'add_instance_volume.html' %} +

    + +
    + + + + + + + + + + + + + {% for disk in disks %} + + + + + + + + + + + {% endfor %} + +
    {% trans "Device" %}{% trans "Format" %}{% trans "Used" %}{% trans "Capacity" %}{% trans "Bus" %}{% trans "Storage" %}{% trans "Source" %}{% trans "Action" %}
    {{ disk.dev }}
    {{ disk.target }}
    {{ disk.format }}{{ disk.used | filesizeformat}}{{ disk.size | filesizeformat }}{{ disk.bus }}{{ disk.storage }}{{ disk.path }} +
    {% csrf_token %} + + + {% ifequal status 5 %} + + + {% else %} + + + {% endifequal %} +
    +
    +
    +
    +
    + + {% if request.user.is_superuser %}

    {% trans "Autostart your instance when host server is power on" %}

    @@ -884,9 +869,6 @@
    {% endfor %} - - -
    @@ -950,7 +932,7 @@ {% ifequal disk.format 'qcow2' %} - +
    @@ -1561,7 +1543,7 @@ } }); } - if (~$.inArray(hash, ['#media', '#network', '#clone', '#autostart', '#xmledit', '#vncsettings', '#migrate', '#options', '#users'])) { + if (~$.inArray(hash, ['#media', "#disks", '#network', '#clone', '#autostart', '#xmledit', '#vncsettings', '#migrate', '#options', '#users'])) { var btnsect = $('#navbtn>li>a'); $(btnsect).each(function () { if ($(this).attr('href') === '#settings') { diff --git a/instances/views.py b/instances/views.py index 375d63c..4f90d85 100644 --- a/instances/views.py +++ b/instances/views.py @@ -342,7 +342,7 @@ def instance(request, compute_id, vname): if request.POST.get('delete_disk', ''): for snap in snapshots: conn.snapshot_delete(snap['name']) - conn.delete_disk() + conn.delete_all_disks() conn.delete() instance = Instance.objects.get(compute_id=compute_id, name=vname) @@ -457,7 +457,34 @@ def instance(request, compute_id, vname): conn.attach_disk(path, target, subdriver=format, cache=cache, targetbus=bus) msg = _('Attach new disk') addlogmsg(request.user.username, instance.name, msg) - return HttpResponseRedirect(request.get_full_path() + '#resize') + return HttpResponseRedirect(request.get_full_path() + '#disks') + + if 'delvolume' in request.POST and (request.user.is_superuser or userinstance.is_change): + connDelete = wvmCreate(compute.hostname, + compute.login, + compute.password, + compute.type) + dev = request.POST.get('dev', '') + path = request.POST.get('path', '') + + conn.detach_disk(dev, path) + connDelete.delete_volume(path) + + msg = _('Delete disk') + addlogmsg(request.user.username, instance.name, msg) + return HttpResponseRedirect(request.get_full_path() + '#disks') + + if 'detachvolume' in request.POST and (request.user.is_superuser or userinstance.is_change): + connDelete = wvmCreate(compute.hostname, + compute.login, + compute.password, + compute.type) + dev = request.POST.get('dev', '') + path = request.POST.get('path', '') + conn.detach_disk(dev, path) + msg = _('Detach disk') + addlogmsg(request.user.username, instance.name, msg) + return HttpResponseRedirect(request.get_full_path() + '#disks') if 'umount_iso' in request.POST: image = request.POST.get('path', '') @@ -1154,7 +1181,7 @@ def delete_instance(instance, delete_disk=False): print("Deleting snapshot {}".format(snap['name'])) conn.snapshot_delete(snap['name']) print("Deleting disks") - conn.delete_disk() + conn.delete_all_disks() conn.delete() instance.delete() diff --git a/vrtManager/instance.py b/vrtManager/instance.py index b5f3f16..6c05c3c 100644 --- a/vrtManager/instance.py +++ b/vrtManager/instance.py @@ -259,6 +259,7 @@ class wvmInstance(wvmConnect): if device == 'disk': try: dev = disk.xpath('target/@dev')[0] + bus = disk.xpath('target/@bus')[0] src_fl = disk.xpath('source/@file|source/@dev|source/@name|source/@volume')[0] try: disk_format = disk.xpath('driver/@type')[0] @@ -267,7 +268,9 @@ class wvmInstance(wvmConnect): try: vol = self.get_volume_by_path(src_fl) volume = vol.name() + disk_size = vol.info()[1] + used_size = vol.info()[2] stg = vol.storagePoolLookupByVolume() storage = stg.name() except libvirtError: @@ -276,8 +279,8 @@ class wvmInstance(wvmConnect): pass finally: result.append( - {'dev': dev, 'image': volume, 'storage': storage, 'path': src_fl, - 'format': disk_format, 'size': disk_size}) + {'dev': dev, 'bus': bus, 'image': volume, 'storage': storage, 'path': src_fl, + 'format': disk_format, 'size': disk_size, 'used': used_size}) return result return util.get_xml_path(self._XMLDesc(0), func=disks) @@ -376,6 +379,25 @@ class wvmInstance(wvmConnect): xmldom = ElementTree.tostring(tree) self._defineXML(xmldom) + def detach_disk(self, dev, image): + tree = ElementTree.fromstring(self._XMLDesc(0)) + + for disk in tree.findall("./devices/disk[@device='disk']"): + source = disk.find("source") + target = disk.find("target") + if source.get("file") == image and target.get("dev") == dev: + devices = tree.find('devices') + devices.remove(disk) + + if self.get_status() == 1: + xml_disk = ElementTree.tostring(disk) + yyy = self.instance.detachDevice(xml_disk) + xmldom = self._XMLDesc(VIR_DOMAIN_XML_SECURE) + if self.get_status() == 5: + xmldom = ElementTree.tostring(tree) + break + self._defineXML(xmldom) + def cpu_usage(self): cpu_usage = {} if self.get_status() == 1: @@ -628,7 +650,7 @@ class wvmInstance(wvmConnect): iso.append(img) return iso - def delete_disk(self): + def delete_all_disks(self): disks = self.get_disk_device() for disk in disks: vol = self.get_volume_by_path(disk.get('path'))