Hello community,
here is the log from the commit of package vm-install
checked in at Tue Sep 11 00:49:26 CEST 2007.
--------
--- vm-install/vm-install.changes 2007-09-01 01:22:08.000000000 +0200
+++ /mounts/work_src_done/STABLE/vm-install/vm-install.changes 2007-09-07 20:52:34.000000000 +0200
@@ -1,0 +2,8 @@
+Thu Sep 6 16:47:17 MDT 2007 - ccoffing@novell.com
+
+- #306964: Work around pygtk threading bug
+- #306383: Fix unreadable linuxrc screen in paravirtual SLES 9 SP4
+- rpmlint: don't need BuildRequires: python
+- rpmlint: don't remove buildroot in install section
+
+-------------------------------------------------------------------
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ vm-install.spec ++++++
--- /var/tmp/diff_new_pack.v23315/_old 2007-09-11 00:49:16.000000000 +0200
+++ /var/tmp/diff_new_pack.v23315/_new 2007-09-11 00:49:16.000000000 +0200
@@ -12,14 +12,14 @@
Name: vm-install
URL: http://developer.novell.com/wiki/index.php/Vm-install
-BuildRequires: python python-devel update-desktop-files
+BuildRequires: python-devel update-desktop-files
# For directory ownership:
BuildRequires: yast2
License: GPL v2 or later
Group: System/Emulators/PC
Autoreqprov: yes
Version: 0.2.1
-Release: 34
+Release: 39
Summary: Tool to Define a Virtual Machine and Install Its Operating System
Source0: %{name}-0.2.1.tar.bz2
BuildRoot: %{_tmppath}/%{name}-%{version}-build
@@ -55,7 +55,6 @@
%build
%install
-rm -rf $RPM_BUILD_ROOT
make install DESTDIR=$RPM_BUILD_ROOT
rm -f $RPM_BUILD_ROOT/%pysite/*.egg-info
%find_lang xen-vm-install
@@ -80,6 +79,11 @@
%{_datadir}/applications/YaST2/vm-install.desktop
%changelog
+* Thu Sep 06 2007 - ccoffing@novell.com
+- #306964: Work around pygtk threading bug
+- #306383: Fix unreadable linuxrc screen in paravirtual SLES 9 SP4
+- rpmlint: don't need BuildRequires: python
+- rpmlint: don't remove buildroot in install section
* Fri Aug 31 2007 - ccoffing@novell.com
- #305747: Fix bootstrapping of paravirtual SLES 9 SP4
- #306764: Better error message if NIC model is mistyped
++++++ vm-install-0.2.1.tar.bz2 ++++++
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/vm-install-0.2.1/ChangeLog new/vm-install-0.2.1/ChangeLog
--- old/vm-install-0.2.1/ChangeLog 2007-08-31 23:11:20.000000000 +0200
+++ new/vm-install-0.2.1/ChangeLog 2007-09-08 00:47:09.000000000 +0200
@@ -1,5 +1,7 @@
0.2.1-pre
---------
+#306964: Work around pygtk threading bug
+#306383: Linuxrc screen unreadable in paravirtualized SLES 9 SP4
#305747: Fix bootstrapping of paravirtual SLES 9 SP4
#296928: MAC was not set when creating VM from existing disk
#306764: Better error message if NIC model is mistyped
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/vm-install-0.2.1/src/vminstall/console.py new/vm-install-0.2.1/src/vminstall/console.py
--- old/vm-install-0.2.1/src/vminstall/console.py 2007-08-16 23:09:46.000000000 +0200
+++ new/vm-install-0.2.1/src/vminstall/console.py 2007-09-07 18:34:36.000000000 +0200
@@ -158,14 +158,15 @@
raise NotImplementedError
if os.environ.has_key('DISPLAY'):
vmdefaults = VMDefaults[guest.options.os_type]
- (x, y) = vmdefaults.xterm_geometry()
cmd = '/usr/bin/xterm'
- args = ['/usr/bin/xterm', '-geometry', '%dx%d' % (x, y),
- '-T', guest.options.name, '-e', 'xm', 'console', guest.uuid ]
+ args = ['/usr/bin/xterm']
+ args.extend(vmdefaults.xterm_args())
+ args.extend(['-T', guest.options.name, '-e', 'xm', 'console', guest.uuid])
log.info("Opened a console in an xterm.")
else:
cmd = '/usr/sbin/xm'
args = ['/usr/sbin/xm', 'console', guest.uuid ]
+ log.debug("Running: %s" % str(args))
if not detach:
pid = os.fork()
if pid == 0:
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/vm-install-0.2.1/src/vminstall/gtk/interface.py new/vm-install-0.2.1/src/vminstall/gtk/interface.py
--- old/vm-install-0.2.1/src/vminstall/gtk/interface.py 2007-08-28 18:21:37.000000000 +0200
+++ new/vm-install-0.2.1/src/vminstall/gtk/interface.py 2007-09-08 00:36:42.000000000 +0200
@@ -18,6 +18,7 @@
import os
import string
import sys
+import threading
from disk_widgets import *
from gjob import GJob
@@ -422,7 +423,7 @@
return False
self.current_disk_index = index
self.disk_edit_widget.set(disk.copy())
- vminstall.log.debug("Editing disk '%s'" % str(disk))
+ log.debug("Editing disk '%s'" % str(disk))
self.notebook.set_current_page(self.pages['disk'])
return True
@@ -677,7 +678,7 @@
def forward(self, ignore=None):
if self.xen_info is None:
- vminstall.log.error("The hypervisor is not running")
+ log.error("The hypervisor is not running")
self._error_box(vminstall.msg.error, vminstall.msg.exc_xen_none)
self.close()
return
@@ -690,7 +691,7 @@
self.notebook.set_current_page(self.valid_backward_pages(current_page)[0])
def close(self, ignore1=None, ignore2=None):
- vminstall.log.info("vm-install #%d is closing..." % self.key)
+ log.info("vm-install #%d is closing..." % self.key)
self.job.do_cancel(forceful=False)
self.topwin.hide()
self.topwin.destroy()
@@ -765,7 +766,7 @@
return False
self.current_nic = nic.copy()
self.current_nic_index = index
- vminstall.log.debug("Editing nic '%s'" % str(self.current_nic))
+ log.debug("Editing nic '%s'" % str(self.current_nic))
self.notebook.set_current_page(self.pages['nic_edit'])
return True
@@ -776,7 +777,7 @@
def do_network(self, widget, event):
nics = self.defaults.nics
- vminstall.log.debug("Re-loading nics table with '%s'" % map(str, nics))
+ log.debug("Re-loading nics table with '%s'" % map(str, nics))
self.nics_view.set(nics)
self.notebook.set_current_page(self.pages['nics'])
@@ -825,18 +826,32 @@
label = pbar_glade.get_widget("status")
errors = []
+ # GTK 2.11 or PyGTK 2.10 seem to suffer from a threading bug. Some
+ # windowing functions are unsafe to call from another thread, even
+ # while holding the GTK lock. Use idle callbacks instead. Novell bz
+ # #306964
+ def destroy_window(w):
+ gtk.gdk.threads_enter()
+ w.destroy()
+ gtk.gdk.threads_leave()
+ def hide_window(w):
+ gtk.gdk.threads_enter()
+ w.hide()
+ gtk.gdk.threads_leave()
def do_progress_change(src, text, fraction):
gtk.gdk.threads_enter()
+ log.debug("do_progress_change: %0.2f %s" % (fraction, text))
if text:
label.set_text(text)
if fraction >= 0.0 and fraction <= 1.0:
pbar.set_fraction(fraction)
gtk.gdk.threads_leave()
def do_progress_close(src):
+ log.debug("do_progress_close")
if pbar_win is None:
return
gtk.gdk.threads_enter()
- pbar_win.destroy()
+ gobject.idle_add(destroy_window, pbar_win)
self.topwin.set_sensitive(True)
try:
self.topwin.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.TOP_LEFT_ARROW))
@@ -844,19 +859,18 @@
pass # Parent's window may have closed
gtk.gdk.threads_leave()
def do_show_console(src, uuid):
+ log.debug("do_show_console")
if self.virtman:
domid = vminstall.console.get_domid_from_uuid(uuid)
signal = 'action-show-terminal'
if (self.defaults.graphics != 'none' and \
vminstall.console.get_vnc_port_from_domid(domid, timeout=10.0) != None):
signal = 'action-show-console'
- vminstall.log.info("%s of %s via virt-manager" % (signal, uuid))
+ log.debug("%s of %s via virt-manager" % (signal, uuid))
def poke_virt_man():
- gtk.gdk.threads_enter()
self.emit(signal, 'xen', uuid)
- pbar_win.hide()
- self.topwin.hide()
- gtk.gdk.threads_leave()
+ gobject.idle_add(hide_window, pbar_win)
+ gobject.idle_add(hide_window, self.topwin)
return False # Do not call me again
# virt-manager (and libvirt) poll. Asking virt-manager to open
# the console too soon after the VM has started will fail.
@@ -870,26 +884,38 @@
if type(wait_on_me) is str:
vminstall.console.wait_for_uuid_to_exit(wait_on_me)
elif type(wait_on_me) is int:
- pbar_win.hide()
- self.topwin.hide()
+ gobject.idle_add(hide_window, pbar_win)
+ gobject.idle_add(hide_window, self.topwin)
(pid, status) = os.waitpid(wait_on_me, 0)
- def do_show_error(src):
+ def _do_show_error(sem):
gtk.gdk.threads_enter()
+ log.debug("_do_show_error")
e = errors.pop()
- self.topwin.present()
+ log.debug("_do_show_error: error was '%s'" % str(e))
if type(e) is str:
self._error_box(vminstall.msg.error, e)
else:
self._exc_box(e)
+ sem.release()
gtk.gdk.threads_leave()
- def do_done(src):
+ def do_show_error(src):
+ log.debug("do_show_error")
+ sem = threading.Semaphore()
+ sem.acquire()
+ gobject.idle_add(_do_show_error, sem)
+ sem.acquire()
+ def _do_done():
gtk.gdk.threads_enter()
+ log.debug("_do_done: state was '%s'" % self.job.state[2])
if self.job.state[0] == self.job.FINISHED:
self.close()
else:
self.topwin.present()
gtk.gdk.threads_leave()
- vminstall.log.info("Starting VM creation job (key=%d)..." % self.key)
+ def do_done(src):
+ log.debug("do_done")
+ gobject.idle_add(_do_done)
+ log.info("Starting VM creation job (key=%d)..." % self.key)
gjob = GJob(self.job, self.defaults, errors)
gjob.connect('install-progress-change', do_progress_change)
gjob.connect('install-progress-close', do_progress_close)
@@ -1035,7 +1061,7 @@
for nic in self.options.nics:
nic.set_model(nic.get_model())
self.nics_view.set([])
- vminstall.log.debug("Retrieved nic list from nic table: '%s'" % map(str, self.options.nics))
+ log.debug("Retrieved nic list from nic table: '%s'" % map(str, self.options.nics))
elif page_num == self.pages['nic_edit']:
nic = self.current_nic
assert(nic is not None)
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/vm-install-0.2.1/src/vminstall/VMDefaults.py new/vm-install-0.2.1/src/vminstall/VMDefaults.py
--- old/vm-install-0.2.1/src/vminstall/VMDefaults.py 2007-08-28 18:18:35.000000000 +0200
+++ new/vm-install-0.2.1/src/vminstall/VMDefaults.py 2007-09-07 19:54:05.000000000 +0200
@@ -60,15 +60,17 @@
return [ XenNic() ]
def localtime(self):
return False
- def xterm_geometry(self):
- return (80, 25)
+ def xterm_args(self):
+ return ['+u8', '-fg', 'white', '-bg', 'black']
def auto_install(self):
return None
class LinuxDefaults(GenericDefaults):
- def xterm_geometry(self):
+ def xterm_args(self):
# Linux behaves much better with an 80x24 xterm.
- return (80, 24)
+ args = GenericDefaults.xterm_args(self)
+ args.extend(['-geometry', '80x24'])
+ return args
class RedHatDefaults(LinuxDefaults):
def group(self):
@@ -173,7 +175,7 @@
def name(self):
return msg.sles9
def virt_support(self):
- # SLES9 doesn't support para, but para is available as a preview
+ # SLES9 supports para starting with SP4
return ('hvm', 'xen')
def apic(self):
return True
@@ -190,7 +192,7 @@
def name(self):
return msg.nw65_older
def virt_support(self):
- return ('hvm')
+ return ('hvm')
def actions(self):
return VMNetWare()
def min_memory(self):
@@ -199,6 +201,11 @@
return 512
def localtime(self):
return True
+ def xterm_args(self):
+ # NetWare behaves much better with an 80x25 xterm.
+ args = GenericDefaults.xterm_args(self)
+ args.extend(['-geometry', '80x25'])
+ return args
def auto_install(self):
return msg.nwresponse_desc
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/vm-install-0.2.1/src/vminstall/XenGuest.py new/vm-install-0.2.1/src/vminstall/XenGuest.py
--- old/vm-install-0.2.1/src/vminstall/XenGuest.py 2007-08-31 21:41:33.000000000 +0200
+++ new/vm-install-0.2.1/src/vminstall/XenGuest.py 2007-09-07 17:40:57.000000000 +0200
@@ -76,33 +76,33 @@
else:
return s % '0'
def _get_localtime_xml(self):
- return self._get_localtime(' <localtime>%s</localtime>')
+ return self._get_localtime(' <localtime>%s</localtime>\n')
def _get_localtime_xen(self):
return self._get_localtime('localtime=%s\n')
def _get_ostype_xml(self):
- return ' <ostype>%s</ostype>' % self.options.os_type
+ return ' <ostype>%s</ostype>\n' % self.options.os_type
def _get_ostype_xen(self):
return 'ostype="%s"\n' % self.options.os_type
def getCommonXen(self):
s = ''
- s += self._get_ostype_xen()
s += self._get_name_xen()
+ s += self._get_ostype_xen()
+ s += self._get_uuid_xen()
s += self._get_memory_xen()
s += self._get_vcpus_xen()
- s += self._get_uuid_xen()
s += self._get_action_xen()
s += self._get_localtime_xen()
return s
def getCommonXml(self):
s = ''
- s += self._get_ostype_xml()
s += self._get_name_xml()
+ s += self._get_ostype_xml()
+ s += self._get_uuid_xml()
s += self._get_memory_xml()
s += self._get_vcpus_xml()
- s += self._get_uuid_xml()
s += self._get_action_xml()
s += self._get_localtime_xml()
return s
@@ -130,12 +130,12 @@
model = ""
if n.model:
model = " model='%s'" % n.model
- ret += "