asyncjob: Provide helper to get meter wrapper

This commit is contained in:
Cole Robinson 2012-02-10 10:24:43 -05:00
parent cb777cd7d4
commit dc78c01edc
12 changed files with 67 additions and 90 deletions

View File

@ -16,7 +16,6 @@ src/virtManager/connectauth.py
src/virtManager/console.py
src/virtManager/create.py
src/virtManager/createinterface.py
src/virtManager/createmeter.py
src/virtManager/createnet.py
src/virtManager/createpool.py
src/virtManager/createvol.py

View File

@ -32,7 +32,6 @@ from virtinst import (VirtualCharDevice, VirtualDevice,
import virtManager.util as util
import virtManager.uihelpers as uihelpers
from virtManager.asyncjob import vmmAsyncJob
from virtManager.createmeter import vmmCreateMeter
from virtManager.storagebrowse import vmmStorageBrowser
from virtManager.baseclass import vmmGObjectUI
@ -1124,7 +1123,7 @@ class vmmAddHardware(vmmGObjectUI):
return
def do_file_allocate(asyncjob, disk):
meter = vmmCreateMeter(asyncjob)
meter = asyncjob.get_meter()
# If creating disk via storage API, we need to thread
# off a new connection

View File

@ -26,9 +26,60 @@ import gtk
import gobject
import libvirt
import urlgrabber
from virtManager.baseclass import vmmGObjectUI
class vmmCreateMeter(urlgrabber.progress.BaseMeter):
def __init__(self, asyncjob):
# progress meter has to run asynchronously, so pass in the
# async job to call back to with progress info
urlgrabber.progress.BaseMeter.__init__(self)
self.asyncjob = asyncjob
self.started = False
def _do_start(self, now=None):
if self.text is not None:
text = self.text
else:
text = self.basename
if self.size is None:
out = " %5sB" % (0)
self.asyncjob.pulse_pbar(out, text)
else:
out = "%3i%% %5sB" % (0, 0)
self.asyncjob.set_pbar_fraction(0, out, text)
self.started = True
def _do_update(self, amount_read, now=None):
if self.text is not None:
text = self.text
else:
text = self.basename
fread = urlgrabber.progress.format_number(amount_read)
if self.size is None:
out = " %5sB" % (fread)
self.asyncjob.pulse_pbar(out, text)
else:
frac = self.re.fraction_read()
out = "%3i%% %5sB" % (frac * 100, fread)
self.asyncjob.set_pbar_fraction(frac, out, text)
def _do_end(self, amount_read, now=None):
if self.text is not None:
text = self.text
else:
text = self.basename
fread = urlgrabber.progress.format_number(amount_read)
if self.size is None:
out = " %5sB" % (fread)
self.asyncjob.pulse_pbar(out, text)
else:
out = "%3i%% %5sB" % (100, fread)
self.asyncjob.set_pbar_done(out, text)
self.started = False
# This thin wrapper only exists so we can put debugging
# code in the run() method every now & then
class asyncJobWorker(threading.Thread):
@ -118,6 +169,7 @@ class vmmAsyncJob(vmmGObjectUI):
self.stage = self.widget("pbar-stage")
self.pbar = self.widget("pbar")
self.is_pulsing = True
self._meter = None
args = [self] + args
self.bg_thread = asyncJobWorker(callback, args)
@ -154,6 +206,11 @@ class vmmAsyncJob(vmmGObjectUI):
def get_data(self):
return self._data
def get_meter(self):
if not self._meter:
self._meter = vmmCreateMeter(self)
return self._meter
def can_cancel(self):
return bool(self.cancel_job)
@ -161,7 +218,7 @@ class vmmAsyncJob(vmmGObjectUI):
self.bg_thread = None
self.cancel_job = None
self.cancel_args = None
self._meter = None
####################
# Internal helpers #

View File

@ -25,7 +25,6 @@ import gtk
from virtManager.baseclass import vmmGObjectUI
from virtManager.asyncjob import vmmAsyncJob
from virtManager.createmeter import vmmCreateMeter
from virtManager.storagebrowse import vmmStorageBrowser
from virtManager import util
@ -823,7 +822,7 @@ class vmmCloneVM(vmmGObjectUI):
# Open a seperate connection to install on since this is async
logging.debug("Threading off connection to clone VM.")
newconn = util.dup_conn(self.conn).vmm
meter = vmmCreateMeter(asyncjob)
meter = asyncjob.get_meter()
self.clone_design.orig_connection = newconn
for d in self.clone_design.clone_virtual_disks:

View File

@ -30,7 +30,6 @@ from virtManager import util
from virtManager.mediadev import MEDIA_CDROM
from virtManager.baseclass import vmmGObjectUI
from virtManager.asyncjob import vmmAsyncJob
from virtManager.createmeter import vmmCreateMeter
from virtManager.storagebrowse import vmmStorageBrowser
from virtManager.details import vmmDetails
from virtManager.domain import vmmDomainVirtinst
@ -1924,7 +1923,7 @@ class vmmCreate(vmmGObjectUI):
self.emit("action-show-vm", self.conn.get_uri(), guest.uuid)
def do_install(self, asyncjob, guest):
meter = vmmCreateMeter(asyncjob)
meter = asyncjob.get_meter()
logging.debug("Starting background install process")

View File

@ -28,7 +28,6 @@ from virtManager import util
from virtManager import uihelpers
from virtManager.baseclass import vmmGObjectUI
from virtManager.asyncjob import vmmAsyncJob
from virtManager.createmeter import vmmCreateMeter
PAGE_TYPE = 0
PAGE_DETAILS = 1
@ -1129,7 +1128,7 @@ class vmmCreateInterface(vmmGObjectUI):
self.close()
def do_install(self, asyncjob, activate):
meter = vmmCreateMeter(asyncjob)
meter = asyncjob.get_meter()
error = None
details = None

View File

@ -1,70 +0,0 @@
#
# Copyright (C) 2006 Red Hat, Inc.
# Copyright (C) 2006 Hugh O. Brock <hbrock@redhat.com>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301 USA.
#
import urlgrabber.progress as progress
class vmmCreateMeter(progress.BaseMeter):
def __init__(self, asyncjob):
# progress meter has to run asynchronously, so pass in the
# async job to call back to with progress info
progress.BaseMeter.__init__(self)
self.asyncjob = asyncjob
self.started = False
def _do_start(self, now=None):
if self.text is not None:
text = self.text
else:
text = self.basename
if self.size is None:
out = " %5sB" % (0)
self.asyncjob.pulse_pbar(out, text)
else:
out = "%3i%% %5sB" % (0, 0)
self.asyncjob.set_pbar_fraction(0, out, text)
self.started = True
def _do_update(self, amount_read, now=None):
if self.text is not None:
text = self.text
else:
text = self.basename
fread = progress.format_number(amount_read)
if self.size is None:
out = " %5sB" % (fread)
self.asyncjob.pulse_pbar(out, text)
else:
frac = self.re.fraction_read()
out = "%3i%% %5sB" % (frac * 100, fread)
self.asyncjob.set_pbar_fraction(frac, out, text)
def _do_end(self, amount_read, now=None):
if self.text is not None:
text = self.text
else:
text = self.basename
fread = progress.format_number(amount_read)
if self.size is None:
out = " %5sB" % (fread)
self.asyncjob.pulse_pbar(out, text)
else:
out = "%3i%% %5sB" % (100, fread)
self.asyncjob.set_pbar_done(out, text)
self.started = False

View File

@ -26,7 +26,6 @@ import logging
from virtManager import util
from virtManager.baseclass import vmmGObjectUI
from virtManager.asyncjob import vmmAsyncJob
from virtManager.createmeter import vmmCreateMeter
from virtinst import Storage
@ -495,7 +494,7 @@ class vmmCreatePool(vmmGObjectUI):
# Open a seperate connection to install on since this is async
newconn = util.dup_lib_conn(self._pool.conn)
meter = vmmCreateMeter(asyncjob)
meter = asyncjob.get_meter()
self._pool.conn = newconn
logging.debug("Starting backround pool creation.")

View File

@ -25,7 +25,6 @@ import gtk
from virtManager import util
from virtManager.baseclass import vmmGObjectUI
from virtManager.asyncjob import vmmAsyncJob
from virtManager.createmeter import vmmCreateMeter
from virtinst import Storage
@ -246,7 +245,7 @@ class vmmCreateVolume(vmmGObjectUI):
newpool = newconn.storagePoolLookupByName(self.parent_pool.get_name())
self.vol.pool = newpool
meter = vmmCreateMeter(asyncjob)
meter = asyncjob.get_meter()
logging.debug("Starting backround vol creation.")
self.vol.install(meter=meter)

View File

@ -30,7 +30,6 @@ import virtinst
from virtManager import util
from virtManager.baseclass import vmmGObjectUI
from virtManager.asyncjob import vmmAsyncJob
from virtManager.createmeter import vmmCreateMeter
STORAGE_ROW_CONFIRM = 0
STORAGE_ROW_CANT_DELETE = 1
@ -160,7 +159,7 @@ class vmmDeleteDialog(vmmGObjectUI):
# Open a seperate connection to install on since this is async
logging.debug("Threading off connection to delete vol.")
newconn = util.dup_conn(self.conn).vmm
meter = vmmCreateMeter(asyncjob)
meter = asyncjob.get_meter()
for path in paths:
try:

View File

@ -35,7 +35,6 @@ from virtManager.baseclass import vmmGObject
from virtManager.clone import vmmCloneVM
from virtManager.connect import vmmConnect
from virtManager.connection import vmmConnection
from virtManager.createmeter import vmmCreateMeter
from virtManager.preferences import vmmPreferences
from virtManager.manager import vmmManager
from virtManager.migrate import vmmMigrateDialog
@ -950,7 +949,7 @@ class vmmEngine(vmmGObject):
def _save_callback(self, asyncjob, vm, file_to_save):
conn = util.dup_conn(vm.conn)
newvm = conn.get_vm(vm.get_uuid())
meter = vmmCreateMeter(asyncjob)
meter = asyncjob.get_meter()
newvm.save(file_to_save, meter=meter)

View File

@ -31,7 +31,6 @@ import libvirt
from virtManager import util
from virtManager.baseclass import vmmGObjectUI
from virtManager.asyncjob import vmmAsyncJob
from virtManager.createmeter import vmmCreateMeter
from virtManager.domain import vmmDomain
def uri_join(uri_tuple):
@ -534,7 +533,7 @@ class vmmMigrateDialog(vmmGObjectUI):
def _async_migrate(self, asyncjob,
origvm, origdconn, migrate_uri, rate, live,
secure, max_downtime):
meter = vmmCreateMeter(asyncjob)
meter = asyncjob.get_meter()
srcconn = util.dup_conn(origvm.conn)
dstconn = util.dup_conn(origdconn)