From 44d73cc780bc1e5a5fef213c0b54536fab6c05a7 Mon Sep 17 00:00:00 2001
From: catborise <catborise@yahoo.com>
Date: Tue, 20 Nov 2018 17:07:19 +0300
Subject: [PATCH] Add ability to resize only vm memory while it is running.

---
 instances/templates/instance.html |  2 +-
 instances/views.py                |  2 +-
 vrtManager/instance.py            | 12 +++++++++++-
 3 files changed, 13 insertions(+), 3 deletions(-)

diff --git a/instances/templates/instance.html b/instances/templates/instance.html
index a20e9ff..24ad104 100644
--- a/instances/templates/instance.html
+++ b/instances/templates/instance.html
@@ -416,7 +416,7 @@
                                                         {% ifequal status 5 %}
                                                             <button type="submit" class="btn btn-lg btn-success pull-right" name="resize">{% trans "Resize" %}</button>
                                                         {% else %}
-                                                            <button class="btn btn-lg btn-success pull-right disabled">{% trans "Resize" %}</button>
+                                                            <button class="btn btn-lg btn-success pull-right disabled" name="resize">{% trans "Resize" %}</button>
                                                         {% endifequal %}
                                                     </form>
                                                 {% else %}
diff --git a/instances/views.py b/instances/views.py
index 979fd01..8e944b5 100644
--- a/instances/views.py
+++ b/instances/views.py
@@ -265,7 +265,7 @@ def instance(request, compute_id, vname):
         networks = conn.get_net_device()
 
         vcpu_range = conn.get_max_cpus()
-        memory_range = [256, 512, 768, 1024, 2048, 4096, 6144, 8192, 16384]
+        memory_range = [256, 512, 768, 1024, 2048, 3072, 4096, 6144, 8192, 16384]
         if memory not in memory_range:
             insort(memory_range, memory)
         if cur_memory not in memory_range:
diff --git a/vrtManager/instance.py b/vrtManager/instance.py
index 681e192..7c51a8b 100644
--- a/vrtManager/instance.py
+++ b/vrtManager/instance.py
@@ -1,7 +1,8 @@
 import time
 import os.path
 try:
-    from libvirt import libvirtError, VIR_DOMAIN_XML_SECURE, VIR_MIGRATE_LIVE, VIR_MIGRATE_UNSAFE
+    from libvirt import libvirtError, VIR_DOMAIN_XML_SECURE, VIR_MIGRATE_LIVE, VIR_MIGRATE_UNSAFE, VIR_DOMAIN_RUNNING, \
+        VIR_DOMAIN_AFFECT_LIVE, VIR_DOMAIN_AFFECT_CONFIG
 except:
     from libvirt import libvirtError, VIR_DOMAIN_XML_SECURE, VIR_MIGRATE_LIVE
 from vrtManager import util
@@ -614,8 +615,14 @@ class wvmInstance(wvmConnect):
         """
         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)
@@ -906,3 +913,6 @@ class wvmInstance(wvmConnect):
         new_xml = ElementTree.tostring(tree)
         self._defineXML(new_xml)
 
+    def set_memory(self, size, flags=0):
+        self.instance.setMemoryFlags(size, flags)
+