Note: This is a public test instance of Red Hat Bugzilla. The data contained within is a snapshot of the live data so any changes you make will not be reflected in the production Bugzilla. Email is disabled so feel free to test any aspect of the site that you want. File any problems you find or give feedback at bugzilla.redhat.com.

Bug 847473

Summary: Fix mock kernel version comparison
Product: [Fedora] Fedora Reporter: Mike Miller <mtmiller>
Component: mockAssignee: Clark Williams <williams>
Status: CLOSED CURRENTRELEASE QA Contact: Fedora Extras Quality Assurance <extras-qa>
Severity: low Docs Contact:
Priority: unspecified    
Version: rawhideCC: mebrown, tmz, williams
Target Milestone: ---   
Target Release: ---   
Hardware: All   
OS: Linux   
Whiteboard:
Fixed In Version: Doc Type: Bug Fix
Doc Text:
Story Points: ---
Clone Of: Environment:
Last Closed: 2012-11-15 02:32:47 UTC Type: Bug
Regression: --- Mount Type: ---
Documentation: --- CRM:
Verified Versions: Category: ---
oVirt Team: --- RHEL 7.3 requirements from Atomic Host:
Cloudforms Team: --- Target Upstream Version:
Embargoed:

Description Mike Miller 2012-08-11 20:58:42 UTC
Description of problem:

Mock's comparison of kernel versions fails when the version has less than 3 version components (e.g. 3.4).

Version-Release number of selected component (if applicable):

git master

How reproducible:

Must be running a kernel with a version that has only 1 dot in it.

Steps to Reproduce:

python <<EOF
import mockbuild.util
print(mockbuild.util.cmpKernelEVR("3.4", "2.6.9"))
EOF
  
Actual results:

Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
  File "<peak.util.decorators.rewrap wrapping mockbuild.util.cmpKernelEVR at 0x013DEB90>", line 3, in cmpKernelEVR
  File "mockbuild/trace_decorator.py", line 70, in trace
    result = func(*args, **kw)
  File "mockbuild/util.py", line 154, in cmpKernelEVR
    return rpmUtils.miscutils.compareEVR(evr1, evr2)
  File "/usr/lib/python2.7/dist-packages/rpmUtils/miscutils.py", line 36, in compareEVR
    def compareEVR((e1, v1, r1), (e2, v2, r2)):
ValueError: need more than 2 values to unpack


Expected results:

1

Additional info:

The following patch fixes the problem by calling the proper yum function, compareVerOnly, since this is just a version comparison, not an RPM EVR comparison. I also renamed the function to cmpKernelVer, although that can be backed out in the name of API compatibility.


From c8dd2363bda2d4ebe2bf6425c06ae9d1626f18df Mon Sep 17 00:00:00 2001
From: Mike Miller <mtmiller>
Date: Sat, 11 Aug 2012 16:35:41 -0400
Subject: [PATCH] Rename cmpKernelEVR->cmpKernelVer and fix comparison

Use rpmUtils.miscutils.compareVerOnly to correctly compare kernel
version strings.
---
 py/mockbuild/backend.py |    4 ++--
 py/mockbuild/mounts.py  |    2 +-
 py/mockbuild/util.py    |    6 ++----
 3 files changed, 5 insertions(+), 7 deletions(-)

diff --git a/py/mockbuild/backend.py b/py/mockbuild/backend.py
index 809244c..31bd790 100644
--- a/py/mockbuild/backend.py
+++ b/py/mockbuild/backend.py
@@ -458,12 +458,12 @@ class Root(object):
         os.chown(self.makeChrootPath('dev/ptmx'), pwd.getpwnam('root')[2], grp.getgrnam('tty')[2])
 
         # symlink /dev/fd in the chroot for everything except RHEL4
-        if mockbuild.util.cmpKernelEVR(kver, '2.6.9') > 0:
+        if mockbuild.util.cmpKernelVer(kver, '2.6.9') > 0:
             os.symlink("/proc/self/fd",   self.makeChrootPath("dev/fd"))
 
         os.umask(prevMask)
 
-        if mockbuild.util.cmpKernelEVR(kver, '2.6.29') >= 0:
+        if mockbuild.util.cmpKernelVer(kver, '2.6.29') >= 0:
             os.unlink(self.makeChrootPath('/dev/ptmx'))
             os.symlink("pts/ptmx", self.makeChrootPath('/dev/ptmx'))
         self.finish("device setup")
diff --git a/py/mockbuild/mounts.py b/py/mockbuild/mounts.py
index 0feae1f..a676a17 100644
--- a/py/mockbuild/mounts.py
+++ b/py/mockbuild/mounts.py
@@ -114,7 +114,7 @@ class Mounts(object):
                         FileSystemMountPoint(filetype='tmpfs', device='mock_chroot_shmfs', path=rootObj.makeChrootPath('/dev/shm')),
                       ]
         opts = 'gid=%d,mode=0620,ptmxmode=0666' % grp.getgrnam('tty').gr_gid
-        if mockbuild.util.cmpKernelEVR(os.uname()[2], '2.6.29') >= 0:
+        if mockbuild.util.cmpKernelVer(os.uname()[2], '2.6.29') >= 0:
             opts += ',newinstance'
         self.mounts.append(FileSystemMountPoint(filetype='devpts', device='mock_chroot_devpts', path=rootObj.makeChrootPath('/dev/pts'), options=opts))
 
diff --git a/py/mockbuild/util.py b/py/mockbuild/util.py
index 95d69c1..62da296 100644
--- a/py/mockbuild/util.py
+++ b/py/mockbuild/util.py
@@ -147,11 +147,9 @@ def getNEVRA(hdr):
     return (name, epoch, ver, rel, arch)
 
 decorate(traceLog())
-def cmpKernelEVR(str1, str2):
+def cmpKernelVer(str1, str2):
     'compare two kernel version strings and return -1, 0, 1 for less, equal, greater'
-    evr1 = str1.split('.', 2)
-    evr2 = str2.split('.', 2)
-    return rpmUtils.miscutils.compareEVR(evr1, evr2)
+    return rpmUtils.miscutils.compareVerOnly(str1, str2)
 
 decorate(traceLog())
 def getAddtlReqs(hdr, conf):
-- 
1.7.10.4

Comment 1 Clark Williams 2012-08-14 20:26:43 UTC
patch applied to git tree, queued for next release. 

Thanks.

Comment 2 Fedora Update System 2012-09-14 15:27:13 UTC
mock-1.1.27-2.el6 has been submitted as an update for Fedora EPEL 6.
https://admin.fedoraproject.org/updates/mock-1.1.27-2.el6

Comment 3 Fedora Update System 2012-09-14 15:28:23 UTC
mock-1.1.27-2.fc16 has been submitted as an update for Fedora 16.
https://admin.fedoraproject.org/updates/mock-1.1.27-2.fc16

Comment 4 Fedora Update System 2012-09-14 15:29:18 UTC
mock-1.0.35-1.el5 has been submitted as an update for Fedora EPEL 5.
https://admin.fedoraproject.org/updates/mock-1.0.35-1.el5

Comment 5 Fedora Update System 2012-09-14 15:30:20 UTC
mock-1.1.27-2.fc17 has been submitted as an update for Fedora 17.
https://admin.fedoraproject.org/updates/mock-1.1.27-2.fc17

Comment 6 Fedora Update System 2012-09-16 18:29:21 UTC
Package mock-1.1.27-2.el6:
* should fix your issue,
* was pushed to the Fedora EPEL 6 testing repository,
* should be available at your local mirror within two days.
Update it with:
# su -c 'yum update --enablerepo=epel-testing mock-1.1.27-2.el6'
as soon as you are able to.
Please go to the following url:
https://admin.fedoraproject.org/updates/FEDORA-EPEL-2012-12915/mock-1.1.27-2.el6
then log in and leave karma (feedback).

Comment 7 Todd Zullinger 2012-09-19 15:39:28 UTC
It seems like yum is too old on el6 to support compareVerOnly.  Am I missing something?

[build@build1 ~]$ rpm -q redhat-release-server mock
redhat-release-server-6Server-6.3.0.3.el6.x86_64
mock-1.1.27-2.el6.noarch

[build@build1 ~]$ mock -r fedora-17-i386 init
INFO: mock.py version 1.1.27 starting...
ERROR: 'module' object has no attribute 'compareVerOnly'
Traceback (most recent call last):
  File "/usr/sbin/mock", line 920, in <module>
    main(retParams)
  File "/usr/sbin/mock", line 744, in main
    chroot = mockbuild.backend.Root(config_opts, uidManager)
  File "<peak.util.decorators.rewrap wrapping mockbuild.backend.__init__ at 0x01482758>", line 3, in __init__
    def __init__(self, config, uidManager): return __decorated(self, config, uidManager)
  File "/usr/lib/python2.6/site-packages/mockbuild/trace_decorator.py", line 70, in trace
    result = func(*args, **kw)
  File "/usr/lib/python2.6/site-packages/mockbuild/backend.py", line 114, in __init__
    self.mounts = mockbuild.mounts.Mounts(self)
  File "<peak.util.decorators.rewrap wrapping mockbuild.mounts.__init__ at 0x01489578>", line 3, in __init__
    def __init__(self, rootObj): return __decorated(self, rootObj)
  File "/usr/lib/python2.6/site-packages/mockbuild/trace_decorator.py", line 70, in trace
    result = func(*args, **kw)
  File "/usr/lib/python2.6/site-packages/mockbuild/mounts.py", line 117, in __init__
    if mockbuild.util.cmpKernelVer(os.uname()[2], '2.6.29') >= 0:
  File "<peak.util.decorators.rewrap wrapping mockbuild.util.cmpKernelVer at 0x0147B050>", line 3, in cmpKernelVer
    def cmpKernelVer(str1, str2): return __decorated(str1, str2)
  File "/usr/lib/python2.6/site-packages/mockbuild/trace_decorator.py", line 70, in trace
    result = func(*args, **kw)
  File "/usr/lib/python2.6/site-packages/mockbuild/util.py", line 156, in cmpKernelVer
    return rpmUtils.miscutils.compareVerOnly(str1, str2)
AttributeError: 'module' object has no attribute 'compareVerOnly'

Comment 8 Mike Miller 2012-09-20 12:06:27 UTC
This is true, this fix is not appropriate for EL5 or EL6 as applied currently.

It looks like you are keeping EL6 in sync with Fedora so I assume you would rather have a consistent fix for all and not branch EL6 and back out this change, right?

Here's another patch against the current state of the sources to make it backwards compatible. I have tested this applied to the current mock on both EL5 and EL6.


From 680204c663c74386c9b491d69e0943f3cdd2370e Mon Sep 17 00:00:00 2001
From: Mike Miller <mtmiller>
Date: Thu, 20 Sep 2012 07:37:59 -0400
Subject: [PATCH] Fix cmpKernelVer to be backwards compatible

Replace compareVerOnly with its equivalent for systems without the
latest yum. This can be reverted once everyone is on yum >= 3.4.2.
---
 py/mockbuild/util.py |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/py/mockbuild/util.py b/py/mockbuild/util.py
index 14d043c..143a4eb 100644
--- a/py/mockbuild/util.py
+++ b/py/mockbuild/util.py
@@ -153,7 +153,7 @@ def getNEVRA(hdr):
 decorate(traceLog())
 def cmpKernelVer(str1, str2):
     'compare two kernel version strings and return -1, 0, 1 for less, equal, greater'
-    return rpmUtils.miscutils.compareVerOnly(str1, str2)
+    return rpmUtils.miscutils.compareEVR(('', str1, ''), ('', str2, ''))
 
 decorate(traceLog())
 def getAddtlReqs(hdr, conf):
-- 
1.7.10.4

Comment 9 Clark Williams 2012-09-21 15:07:05 UTC
How about something like this:

diff --git a/py/mockbuild/util.py b/py/mockbuild/util.py
index 14d043c..2fd88ba 100644
--- a/py/mockbuild/util.py
+++ b/py/mockbuild/util.py
@@ -153,7 +153,10 @@ def getNEVRA(hdr):
 decorate(traceLog())
 def cmpKernelVer(str1, str2):
     'compare two kernel version strings and return -1, 0, 1 for less, equal, greater'
-    return rpmUtils.miscutils.compareVerOnly(str1, str2)
+    try:
+        return rpmUtils.miscutils.compareVerOnly(str1, str2)
+    except AttributeError, e:
+        return rpmUtils.miscutils.compareEVR(str1, str2)
 
basically try to use the new compareVerOnly and if it's missing, drop back to compareEVR?

Comment 10 Mike Miller 2012-09-21 19:20:34 UTC
Yep, that is the right way to do it, except we still need to fix the call to compareEVR like I had posted in the previous comment. This form is taken from the definition of compareVerOnly in yum. This way the two calls are functionally identical.

diff --git a/py/mockbuild/util.py b/py/mockbuild/util.py
index 14d043c..73e2f63 100644
--- a/py/mockbuild/util.py
+++ b/py/mockbuild/util.py
@@ -153,7 +153,10 @@ def getNEVRA(hdr):
 decorate(traceLog())
 def cmpKernelVer(str1, str2):
     'compare two kernel version strings and return -1, 0, 1 for less, equal, greater'
-    return rpmUtils.miscutils.compareVerOnly(str1, str2)
+    try:
+        return rpmUtils.miscutils.compareVerOnly(str1, str2)
+    except AttributeError, e:
+        return rpmUtils.miscutils.compareEVR(('', str1, ''), ('', str2, ''))
 
 decorate(traceLog())
 def getAddtlReqs(hdr, conf):

Comment 11 Clark Williams 2012-09-24 17:18:07 UTC
ok, running the above form of compareEVR through the regression tests now.

Comment 12 Fedora Update System 2012-11-01 21:09:21 UTC
mock-1.1.28-1.el6 has been submitted as an update for Fedora EPEL 6.
https://admin.fedoraproject.org/updates/mock-1.1.28-1.el6

Comment 13 Fedora Update System 2012-11-01 21:10:43 UTC
mock-1.1.28-1.fc18 has been submitted as an update for Fedora 18.
https://admin.fedoraproject.org/updates/mock-1.1.28-1.fc18

Comment 14 Fedora Update System 2012-11-01 21:11:54 UTC
mock-1.0.36-1.el5 has been submitted as an update for Fedora EPEL 5.
https://admin.fedoraproject.org/updates/mock-1.0.36-1.el5

Comment 15 Fedora Update System 2012-11-01 21:13:01 UTC
mock-1.1.28-1.fc17 has been submitted as an update for Fedora 17.
https://admin.fedoraproject.org/updates/mock-1.1.28-1.fc17

Comment 16 Fedora Update System 2012-11-01 21:14:09 UTC
mock-1.1.28-1.fc16 has been submitted as an update for Fedora 16.
https://admin.fedoraproject.org/updates/mock-1.1.28-1.fc16

Comment 17 Fedora Update System 2012-11-15 02:32:49 UTC
mock-1.1.28-1.fc17 has been pushed to the Fedora 17 stable repository.  If problems still persist, please make note of it in this bug report.

Comment 18 Fedora Update System 2012-11-15 02:35:06 UTC
mock-1.1.28-1.fc16 has been pushed to the Fedora 16 stable repository.  If problems still persist, please make note of it in this bug report.

Comment 19 Fedora Update System 2012-11-20 19:37:25 UTC
mock-1.0.36-1.el5 has been pushed to the Fedora EPEL 5 stable repository.  If problems still persist, please make note of it in this bug report.