OSDN Git Service

------ BUGFIX ------
authorTaizo ITO <taizo@karesansui-project.info>
Thu, 22 Apr 2010 08:09:23 +0000 (17:09 +0900)
committerTaizo ITO <taizo@karesansui-project.info>
Thu, 22 Apr 2010 08:09:23 +0000 (17:09 +0900)
------ BUGZILLA ------
bug#

------ TRAC ------
ticket#

------ IMPROVEMENT ------
Supported new libvirt snapshot implement.

------ CREATE ------

------ COMMENT ------

karesansui/gadget/guestby1currentsnapshot.py
karesansui/gadget/guestby1snapshot.py
karesansui/gadget/guestby1snapshotby1.py
karesansui/templates/default/guestby1snapshot/guestby1snapshot.input
karesansui/templates/default/guestby1snapshot/guestby1snapshot.part
karesansui/templates/default/guestby1snapshotby1/guestby1snapshotby1.part

index fab8203..4529f37 100644 (file)
@@ -19,7 +19,8 @@ import karesansui
 from karesansui.lib.rest import Rest, auth
 from karesansui.lib.const import VIRT_COMMAND_APPLY_SNAPSHOT
 from karesansui.lib.utils import is_param, is_int
-from karesansui.lib.virt.virt import KaresansuiVirtException, KaresansuiVirtConnection
+
+from karesansui.lib.virt.snapshot import KaresansuiVirtSnapshot
 
 from karesansui.db.access.snapshot import findby1, is_findby1_guestby1
 from karesansui.db.access._2pysilhouette import save_job_collaboration
@@ -46,12 +47,24 @@ class GuestBy1CurrentSnapshot(Rest):
 
         snapshot = findby1(self.orm, snapshot_id)
 
-        kvc = KaresansuiVirtConnection()
+        kvs = KaresansuiVirtSnapshot(readonly=False)
+        #import pdb; pdb.set_trace()
+        snapshot_list = []
         try:
-            domname = kvc.uuid_to_domname(snapshot.machine.uniq_key)
-            if not domname: return web.conflict(web.ctx.path)
+            domname = kvs.kvc.uuid_to_domname(snapshot.machine.uniq_key)
+            if not domname: return web.notfound()
+            self.view.is_creatable = kvs.isSupportedDomain(domname)
+            try:
+                snapshot_list = kvs.listNames(domname)[domname]
+            except:
+                pass
+
         finally:
-            kvc.close()
+            kvs.finish()
+
+        if not snapshot.name in snapshot_list:
+            self.logger.error(_("The specified snapshot does not exist. - %s") % snapshot.name)
+            return web.notfound()
 
         action_cmd = dict2command(
             "%s/%s" % (karesansui.config['application.bin.dir'],
index b27b377..4b42c1c 100644 (file)
@@ -21,8 +21,7 @@ from karesansui.lib.const import \
      VIRT_COMMAND_TAKE_SNAPSHOT, \
      NOTE_TITLE_MIN_LENGTH, NOTE_TITLE_MAX_LENGTH,\
      VIRT_XML_CONFIG_DIR, VIRT_DOMAINS_DIR
-from karesansui.lib.utils import getfilesize_str, \
-     uniq_filename, is_param, get_filesize_MB
+from karesansui.lib.utils import is_param
 from karesansui.lib.checker import Checker, \
      CHECK_EMPTY, CHECK_VALID, CHECK_MIN, CHECK_MAX, \
      CHECK_LENGTH, CHECK_ONLYSPACE
@@ -34,8 +33,7 @@ from karesansui.db.access.snapshot import new as new_snapshot, \
 from karesansui.db.access._2pysilhouette import save_job_collaboration
 from karesansui.db.access.machine2jobgroup import new as m2j_new
 
-from karesansui.lib.virt.virt import KaresansuiVirtConnection
-from karesansui.lib.virt.config import ConfigParam
+from karesansui.lib.virt.snapshot import KaresansuiVirtSnapshot
 
 from pysilhouette.command import dict2command
 from karesansui.db.model._2pysilhouette import Job, JobGroup
@@ -79,47 +77,40 @@ class GuestBy1Snapshot(Rest):
         if guest_id is None: return web.notfound()
 
         guest = findbyguest1(self.orm, guest_id)
-        
-        kvc = KaresansuiVirtConnection()
+
+        kvs = KaresansuiVirtSnapshot(readonly=False)
+        #import pdb; pdb.set_trace()
         try:
-            domname = kvc.uuid_to_domname(guest.uniq_key)
+            domname = kvs.kvc.uuid_to_domname(guest.uniq_key)
             if not domname: return web.notfound()
-            virt = kvc.search_kvg_guests(domname)[0]
-            self.view.is_creatable = virt.is_takable_snapshot()
-            snapshot_list = kvc.list_snapshot(domname)
-        finally:
-            kvc.close()
+            self.view.is_creatable = kvs.isSupportedDomain(domname)
+            try:
+                snapshot_list = kvs.listNames(domname)[domname]
+            except:
+                pass
 
-        param = ConfigParam(kvc.get_domain_name())
-        xml_file = "%s/%s.xml" % (VIRT_XML_CONFIG_DIR, kvc.get_domain_name())
-        if not os.path.exists(xml_file):
-            return web.notfound()
-        param.load_xml_config(xml_file)
-        current_snapshot = param.get_current_snapshot()
+            current_snapshot = kvs.getCurrentSnapshotName(domname)
 
+        finally:
+            kvs.finish()
+
+        #import pdb; pdb.set_trace()
         snapshots = []
         if snapshot_list:
             snapshot_list.sort(reverse = True)
             for snapshot in snapshot_list:
-                filepath = "%s/%s/snapshot/%s" % (VIRT_DOMAINS_DIR,domname,snapshot,)
-                if os.path.isfile(filepath) is False:
-                    self.logger.error("The specified snapshot file does not exist. - %s/%s" % filepath)
-                    return web.internalerror()
-
                 model = findbyname(self.orm, snapshot)
                 if model is None:
                     continue
 
-                if not current_snapshot:
-                    self.logger.info('Still not finished creating the snapshot.')
-                    return web.notfound()
-
-                current = snapshot in current_snapshot
+                current = False
+                if snapshot == current_snapshot:
+                    current = True
 
                 snapshots.append((snapshot,
                                   model,
                                   domname,
-                                  get_filesize_MB(getfilesize_str(filepath)),
+                                  None,
                                   current
                                   ))
 
@@ -138,21 +129,21 @@ class GuestBy1Snapshot(Rest):
         
         guest = findbyguest1(self.orm, guest_id)
 
-        name = uniq_filename()
-
-        notebook = new_notebook(self.input.title, self.input.value)
-        snapshot = new_snapshot(guest, name, self.me, self.me, notebook)
-        save_snapshot(self.orm, snapshot)
-        kvc = KaresansuiVirtConnection()
+        kvs = KaresansuiVirtSnapshot(readonly=False)
         try:
-            domname = kvc.uuid_to_domname(guest.uniq_key)
+            domname = kvs.kvc.uuid_to_domname(guest.uniq_key)
             if not domname: return web.conflict(web.ctx.path)
         finally:
-            kvc.close()
+            kvs.finish()
+
+        id = int(time.time())
+        notebook = new_notebook(self.input.title, self.input.value)
+        snapshot = new_snapshot(guest, id, self.me, self.me, notebook)
+        save_snapshot(self.orm, snapshot)
 
         options = {}
         options['name'] = domname
-        options['id'] = name
+        options['id'] = id
 
         _cmd = dict2command(
             "%s/%s" % (karesansui.config['application.bin.dir'], VIRT_COMMAND_TAKE_SNAPSHOT),
index a73c64d..2a43d86 100644 (file)
@@ -21,13 +21,14 @@ from karesansui.lib.const import VIRT_DOMAINS_DIR, \
      ID_MIN_LENGTH, ID_MAX_LENGTH, \
      NOTE_TITLE_MIN_LENGTH, NOTE_TITLE_MAX_LENGTH
 
-from karesansui.lib.utils import getfilesize_str, is_param, get_filesize_MB, json_dumps
-from karesansui.lib.virt.virt import KaresansuiVirtConnection
+from karesansui.lib.utils import is_param, json_dumps
+from karesansui.lib.virt.snapshot import KaresansuiVirtSnapshot
 
 from karesansui.lib.checker import Checker, \
     CHECK_EMPTY, CHECK_VALID, CHECK_MIN, CHECK_MAX, \
     CHECK_LENGTH, CHECK_ONLYSPACE
 
+from karesansui.db.access.machine import findbyguest1
 from karesansui.db.access.snapshot import findby1, logical_delete
 from karesansui.db.access._2pysilhouette import save_job_collaboration
 from karesansui.db.access.machine2jobgroup import new as m2j_new
@@ -92,38 +93,47 @@ class GuestBy1SnapshotBy1(Rest):
         (host_id, guest_id) = self.chk_guestby1(param)
         if guest_id is None: return web.notfound()
         
-        snapshot_id = param[2]        
+        snapshot_id = param[2]
         if not validates_param_id(self, snapshot_id):
             return web.notfound(self.view.alert)
 
         snapshot = findby1(self.orm, snapshot_id)
         if not snapshot:
             return web.notfound()
-        
-        kvc = KaresansuiVirtConnection()
+
+        kvs = KaresansuiVirtSnapshot(readonly=False)
+        #import pdb; pdb.set_trace()
+        snapshot_list = []
         try:
-            domname = kvc.uuid_to_domname(snapshot.machine.uniq_key)
-            if not domname: return web.conflict(web.ctx.path)
+            domname = kvs.kvc.uuid_to_domname(snapshot.machine.uniq_key)
+            if not domname: return web.notfound()
+            self.view.is_creatable = kvs.isSupportedDomain(domname)
+            try:
+                snapshot_list = kvs.listNames(domname)[domname]
+            except:
+                pass
+
+            current_snapshot = kvs.getCurrentSnapshotName(domname)
+
         finally:
-            kvc.close()
-            
-        filepath = "%s/%s/snapshot/%s" % (VIRT_DOMAINS_DIR, domname, snapshot.name)
-        if os.path.isfile(filepath) is False:
-            self.logger.error("The specified snapshot file does not exist. - %s" % filepath)
-            return False
+            kvs.finish()
+
+        if not snapshot.name in snapshot_list:
+            self.logger.error(_("The specified snapshot does not exist. - %s") % snapshot.name)
+            return web.notfound()
 
         if self.__template__["media"] == 'json':
             self.view.snapshot = json_dumps((
                 snapshot.get_json(self.me.languages),
-                get_filesize_MB(getfilesize_str(filepath)),
+                None,
                 VIRT_DOMAINS_DIR
                 ))
         else:
             self.view.snapshot = (snapshot,
                                   domname,
-                                  get_filesize_MB(getfilesize_str(filepath)),
+                                  None,
                                   VIRT_DOMAINS_DIR,
-                                  filepath)
+                                  None)
         return True
 
     @auth
@@ -160,12 +170,26 @@ class GuestBy1SnapshotBy1(Rest):
         if not snapshot:
             return web.notfound()
 
-        kvc = KaresansuiVirtConnection()
+        kvs = KaresansuiVirtSnapshot(readonly=False)
+        #import pdb; pdb.set_trace()
+        snapshot_list = []
         try:
-            domname = kvc.uuid_to_domname(snapshot.machine.uniq_key)
-            if not domname: return web.conflict(web.ctx.path)
+            domname = kvs.kvc.uuid_to_domname(snapshot.machine.uniq_key)
+            if not domname: return web.notfound()
+            self.view.is_creatable = kvs.isSupportedDomain(domname)
+            try:
+                snapshot_list = kvs.listNames(domname)[domname]
+            except:
+                pass
+
+            current_snapshot = kvs.getCurrentSnapshotName(domname)
+
         finally:
-            kvc.close()
+            kvs.finish()
+
+        if not snapshot.name in snapshot_list:
+            self.logger.error(_("The specified snapshot does not exist. - %s") % snapshot.name)
+            return web.notfound()
 
         # delete
         action_cmd = dict2command(
index 3a5eb64..3511ca7 100644 (file)
@@ -40,6 +40,8 @@ $(document).ready(function(){
 // -->
 </script>
 
+% if is_creatable is True:
+
 <div id="snapshot_setting">
     <form method="post" action="" id="snapshot_form" name="snapshot_form">
         <div class="grayout-head">
@@ -69,3 +71,8 @@ $(document).ready(function(){
         </div>
     </form>
 </div>
+
+% else:
+${_('Snapshot is not supported in this disk image format.')}
+% endif
+
index fcb4819..3471107 100644 (file)
@@ -179,7 +179,7 @@ tool_invalid("#add_snapshot");
                                                 <th/>
                                                 <th>${_('ID')}</th>
                                                 <th>${_('Title')}</th>
-                                                <th>${_('Size')} MB</th>
+                                                <th>${_('Name')}</th>
                                                 <th>${_('Modified User')}</th>
                                                 <th>${_('Modified')}</th>
                                           </tr>
@@ -198,7 +198,8 @@ tool_invalid("#add_snapshot");
     %else:
                                                <td>${_('No title')} </td>
     %endif
-                                                <td>${snapshot[3] | h}</td>
+
+                                                <td>${snapshot[1].name | h}</td>
                                                 <td>${snapshot[1].created_user.nickname | h}</td>
                                                 <td>${snapshot[1].created | h}</td>
                                             </tr>
index 2e0e6cb..09495b2 100644 (file)
             <td>
                 <table cellspacing="0" class="border detail-sub-contents">
                     <tr>
-                        <td>${_('File Name')}</td>
+                        <td>${_('Name')}</td>
                         <td class="detail-separator"><img alt="" src="/karesansui/v1/static/images/table-space.gif"/></td>
                         <td><pre>${snapshot[0].name | h}</pre></td>
                     </tr>
                     <tr>
-                        <td>${_('File Size (MB)')}</td>
-                        <td class="detail-separator"><img alt="" src="/karesansui/v1/static/images/table-space.gif"/></td>
-                        <td><pre>${snapshot[2] | h}</pre></td>
-                    </tr>
-                    <tr>
-                        <td>${_('Real File Path')}</td>
-                        <td class="detail-separator"><img alt="" src="/karesansui/v1/static/images/table-space.gif"/></td>
-                        <td><pre>${snapshot[4] | h}</pre></td>
-                    </tr>
-                    <tr>
                         <td>${_('Guest Name')}</td>
                         <td class="detail-separator"><img alt="" src="/karesansui/v1/static/images/table-space.gif"/></td>
                         <td><pre>${snapshot[0].machine.name | h}</pre></td>