Re: [Freeipa-devel] [PATCH 0122-0123] reimplementation of package version comparison code
On 01/11/2016 06:38 PM, Martin Basti wrote: On 11.01.2016 17:58, Jan Cholasta wrote: On 11.1.2016 16:29, Martin Babinsky wrote: On 01/11/2016 02:27 PM, Martin Babinsky wrote: On 01/11/2016 02:01 PM, Jan Cholasta wrote: On 11.1.2016 13:14, Martin Babinsky wrote: On 01/11/2016 07:47 AM, Jan Cholasta wrote: On 8.1.2016 18:30, Lukas Slebodnik wrote: On (08/01/16 17:56), Martin Babinsky wrote: On 01/08/2016 05:23 PM, Lukas Slebodnik wrote: On (08/01/16 16:59), Martin Babinsky wrote: Patch 0122 reimplements version checking and fixes https://fedorahosted.org/freeipa/ticket/5572 Patch 0123 contains unit test for version checking code. Thanks to Martin^1 for the idea of using CFFI for calling rpm C-API directly. -- Martin^3 Babinsky >From c7a5d8970d100d071597b4e1d7cef8a27b8cd485 Mon Sep 17 00:00:00 2001 From: Martin BabinskyDate: Fri, 8 Jan 2016 15:54:00 +0100 Subject: [PATCH 2/3] tests for package version comparison These tests will ensure that our package version handling code can correctly decide when to upgrade IPA master. https://fedorahosted.org/freeipa/ticket/5572 --- ipatests/test_ipaserver/test_version_comparsion.py | 47 ++ 1 file changed, 47 insertions(+) create mode 100644 ipatests/test_ipaserver/test_version_comparsion.py diff --git a/ipatests/test_ipaserver/test_version_comparsion.py b/ipatests/test_ipaserver/test_version_comparsion.py new file mode 100644 index ..51d069b23ba389ffce39e948cdbc7a1faaa84563 --- /dev/null +++ b/ipatests/test_ipaserver/test_version_comparsion.py @@ -0,0 +1,47 @@ +# +# Copyright (C) 2015 FreeIPA Contributors see COPYING for license +# + +""" +tests for correct RPM version comparison +""" + +from ipaplatform.tasks import tasks +import pytest + +version_strings = [ +("3.0.el6", "3.0.0.el6", "older"), +("3.0.0.el6", "3.0.0.el6_8.2", "older"), +("3.0.0-42.el6", "3.0.0.el6", "newer"), +("3.0.0-1", "3.0.0-42", "older"), +("3.0.0-42.el6", "3.3.3.fc20", "older"), +("4.2.0-15.el7", "4.2.0-15.el7_2.3", "older"), +("4.2.0-15.el7_2.3", "4.2.0-15.el7_2.3", "equal"), +("4.2.0-1.fc23", "4.2.1.fc23", "older"), +("4.2.3-alpha.fc23", "4.2.3-2.fc23", "older"), # numeric version elements have + # precedence over letters +("4.3.90.201601080923GIT55aeea7-0.fc23", "4.3.0-1.fc23", "newer") +] + + +@pytest.fixture(params=version_strings) +def versions(request): +return request.param + +class TestVersionComparsion(object): + +def test_versions(self, versions): +version_string1, version_string2, expected_comparison = versions + +ver1 = tasks.parse_ipa_version(version_string1) +ver2 = tasks.parse_ipa_version(version_string2) + +if expected_comparison == "newer": +assert ver1 > ver2 +elif expected_comparison == "older": +assert ver1 < ver2 +elif expected_comparison == "equal": +assert ver1 == ver2 +else: +raise TypeError( +"Unexpected comparison string: {}", expected_comparison) -- 2.5.0 >From 9677e1a3ca2f5837f1b779780127adf27efa81df Mon Sep 17 00:00:00 2001 From: Martin Babinsky Date: Fri, 8 Jan 2016 14:17:14 +0100 Subject: [PATCH 1/3] use FFI call to rpmvercmp function for version comparison Stop using rpm-python to compare package versions since the implicit NSS initialization upon the module import breaks NSS handling in IPA code. Call rpm-libs C-API function via CFFI instead. Big thanks to Martin Kosek for sharing the code snippet that spurred this patch. https://fedorahosted.org/freeipa/ticket/5572 --- freeipa.spec.in | 2 +- ipaplatform/redhat/tasks.py | 59 + 2 files changed, 29 insertions(+), 32 deletions(-) diff --git a/freeipa.spec.in b/freeipa.spec.in index 7e956538d0f6c24bab636579303e0c7b5eeec199..7f31d41d16b2a26b404c277595f0994a21123f80 100644 --- a/freeipa.spec.in +++ b/freeipa.spec.in @@ -214,7 +214,7 @@ Requires: python-pyasn1 Requires: dbus-python Requires: python-dns >= 1.11.1 Requires: python-kdcproxy >= 0.3 -Requires: rpm-python +Requires: rpm-devel /usr/lib64/librpm.so.7 is provided by package rpm-libs sh$ rpm -qf /usr/lib64/librpm.so.7 rpm-libs-4.13.0-0.rc1.7.fc23.x86_64 It's not very common to depend on devel packages. LS I was basically trying workaround this http://fpaste.org/308652/22677521/ rpm-libs contains librpm.so.* and cffi is smart enough to load right library with C = ffi.dlopen("rpm") This likely won't be an issue here, but in general, we should use the versioned library name to have at least some API/ABI guarantee. If for example a function we depend on changed signature between versions, we would crash *hard* when it's called. So it's enough to add "Requires: rpm-libs" but it would be almost noop because rpm-libs is everytime available od fedora/rhel :-)
Re: [Freeipa-devel] [PATCH 0122-0123] reimplementation of package version comparison code
On 01/12/2016 01:03 PM, Martin Basti wrote: On 12.01.2016 10:23, Martin Babinsky wrote: On 01/11/2016 06:38 PM, Martin Basti wrote: On 11.01.2016 17:58, Jan Cholasta wrote: On 11.1.2016 16:29, Martin Babinsky wrote: On 01/11/2016 02:27 PM, Martin Babinsky wrote: On 01/11/2016 02:01 PM, Jan Cholasta wrote: On 11.1.2016 13:14, Martin Babinsky wrote: On 01/11/2016 07:47 AM, Jan Cholasta wrote: On 8.1.2016 18:30, Lukas Slebodnik wrote: On (08/01/16 17:56), Martin Babinsky wrote: On 01/08/2016 05:23 PM, Lukas Slebodnik wrote: On (08/01/16 16:59), Martin Babinsky wrote: Patch 0122 reimplements version checking and fixes https://fedorahosted.org/freeipa/ticket/5572 Patch 0123 contains unit test for version checking code. Thanks to Martin^1 for the idea of using CFFI for calling rpm C-API directly. -- Martin^3 Babinsky >From c7a5d8970d100d071597b4e1d7cef8a27b8cd485 Mon Sep 17 00:00:00 2001 From: Martin BabinskyDate: Fri, 8 Jan 2016 15:54:00 +0100 Subject: [PATCH 2/3] tests for package version comparison These tests will ensure that our package version handling code can correctly decide when to upgrade IPA master. https://fedorahosted.org/freeipa/ticket/5572 --- ipatests/test_ipaserver/test_version_comparsion.py | 47 ++ 1 file changed, 47 insertions(+) create mode 100644 ipatests/test_ipaserver/test_version_comparsion.py diff --git a/ipatests/test_ipaserver/test_version_comparsion.py b/ipatests/test_ipaserver/test_version_comparsion.py new file mode 100644 index ..51d069b23ba389ffce39e948cdbc7a1faaa84563 --- /dev/null +++ b/ipatests/test_ipaserver/test_version_comparsion.py @@ -0,0 +1,47 @@ +# +# Copyright (C) 2015 FreeIPA Contributors see COPYING for license +# + +""" +tests for correct RPM version comparison +""" + +from ipaplatform.tasks import tasks +import pytest + +version_strings = [ +("3.0.el6", "3.0.0.el6", "older"), +("3.0.0.el6", "3.0.0.el6_8.2", "older"), +("3.0.0-42.el6", "3.0.0.el6", "newer"), +("3.0.0-1", "3.0.0-42", "older"), +("3.0.0-42.el6", "3.3.3.fc20", "older"), +("4.2.0-15.el7", "4.2.0-15.el7_2.3", "older"), +("4.2.0-15.el7_2.3", "4.2.0-15.el7_2.3", "equal"), +("4.2.0-1.fc23", "4.2.1.fc23", "older"), +("4.2.3-alpha.fc23", "4.2.3-2.fc23", "older"), # numeric version elements have + # precedence over letters + ("4.3.90.201601080923GIT55aeea7-0.fc23", "4.3.0-1.fc23", "newer") +] + + +@pytest.fixture(params=version_strings) +def versions(request): +return request.param + +class TestVersionComparsion(object): + +def test_versions(self, versions): +version_string1, version_string2, expected_comparison = versions + +ver1 = tasks.parse_ipa_version(version_string1) +ver2 = tasks.parse_ipa_version(version_string2) + +if expected_comparison == "newer": +assert ver1 > ver2 +elif expected_comparison == "older": +assert ver1 < ver2 +elif expected_comparison == "equal": +assert ver1 == ver2 +else: +raise TypeError( +"Unexpected comparison string: {}", expected_comparison) -- 2.5.0 >From 9677e1a3ca2f5837f1b779780127adf27efa81df Mon Sep 17 00:00:00 2001 From: Martin Babinsky Date: Fri, 8 Jan 2016 14:17:14 +0100 Subject: [PATCH 1/3] use FFI call to rpmvercmp function for version comparison Stop using rpm-python to compare package versions since the implicit NSS initialization upon the module import breaks NSS handling in IPA code. Call rpm-libs C-API function via CFFI instead. Big thanks to Martin Kosek for sharing the code snippet that spurred this patch. https://fedorahosted.org/freeipa/ticket/5572 --- freeipa.spec.in | 2 +- ipaplatform/redhat/tasks.py | 59 + 2 files changed, 29 insertions(+), 32 deletions(-) diff --git a/freeipa.spec.in b/freeipa.spec.in index 7e956538d0f6c24bab636579303e0c7b5eeec199..7f31d41d16b2a26b404c277595f0994a21123f80 100644 --- a/freeipa.spec.in +++ b/freeipa.spec.in @@ -214,7 +214,7 @@ Requires: python-pyasn1 Requires: dbus-python Requires: python-dns >= 1.11.1 Requires: python-kdcproxy >= 0.3 -Requires: rpm-python +Requires: rpm-devel /usr/lib64/librpm.so.7 is provided by package rpm-libs sh$ rpm -qf /usr/lib64/librpm.so.7 rpm-libs-4.13.0-0.rc1.7.fc23.x86_64 It's not very common to depend on devel packages. LS I was basically trying workaround this http://fpaste.org/308652/22677521/ rpm-libs contains librpm.so.* and cffi is smart enough to load right library with C = ffi.dlopen("rpm") This likely won't be an issue here, but in general, we should use the versioned library name to have at least some API/ABI guarantee. If for example a function we depend on changed signature between versions, we would crash *hard* when it's called. So it's enough to add "Requires: rpm-libs" but it
Re: [Freeipa-devel] [PATCH 0122-0123] reimplementation of package version comparison code
On 12.01.2016 10:23, Martin Babinsky wrote: On 01/11/2016 06:38 PM, Martin Basti wrote: On 11.01.2016 17:58, Jan Cholasta wrote: On 11.1.2016 16:29, Martin Babinsky wrote: On 01/11/2016 02:27 PM, Martin Babinsky wrote: On 01/11/2016 02:01 PM, Jan Cholasta wrote: On 11.1.2016 13:14, Martin Babinsky wrote: On 01/11/2016 07:47 AM, Jan Cholasta wrote: On 8.1.2016 18:30, Lukas Slebodnik wrote: On (08/01/16 17:56), Martin Babinsky wrote: On 01/08/2016 05:23 PM, Lukas Slebodnik wrote: On (08/01/16 16:59), Martin Babinsky wrote: Patch 0122 reimplements version checking and fixes https://fedorahosted.org/freeipa/ticket/5572 Patch 0123 contains unit test for version checking code. Thanks to Martin^1 for the idea of using CFFI for calling rpm C-API directly. -- Martin^3 Babinsky >From c7a5d8970d100d071597b4e1d7cef8a27b8cd485 Mon Sep 17 00:00:00 2001 From: Martin BabinskyDate: Fri, 8 Jan 2016 15:54:00 +0100 Subject: [PATCH 2/3] tests for package version comparison These tests will ensure that our package version handling code can correctly decide when to upgrade IPA master. https://fedorahosted.org/freeipa/ticket/5572 --- ipatests/test_ipaserver/test_version_comparsion.py | 47 ++ 1 file changed, 47 insertions(+) create mode 100644 ipatests/test_ipaserver/test_version_comparsion.py diff --git a/ipatests/test_ipaserver/test_version_comparsion.py b/ipatests/test_ipaserver/test_version_comparsion.py new file mode 100644 index ..51d069b23ba389ffce39e948cdbc7a1faaa84563 --- /dev/null +++ b/ipatests/test_ipaserver/test_version_comparsion.py @@ -0,0 +1,47 @@ +# +# Copyright (C) 2015 FreeIPA Contributors see COPYING for license +# + +""" +tests for correct RPM version comparison +""" + +from ipaplatform.tasks import tasks +import pytest + +version_strings = [ +("3.0.el6", "3.0.0.el6", "older"), +("3.0.0.el6", "3.0.0.el6_8.2", "older"), +("3.0.0-42.el6", "3.0.0.el6", "newer"), +("3.0.0-1", "3.0.0-42", "older"), +("3.0.0-42.el6", "3.3.3.fc20", "older"), +("4.2.0-15.el7", "4.2.0-15.el7_2.3", "older"), +("4.2.0-15.el7_2.3", "4.2.0-15.el7_2.3", "equal"), +("4.2.0-1.fc23", "4.2.1.fc23", "older"), +("4.2.3-alpha.fc23", "4.2.3-2.fc23", "older"), # numeric version elements have + # precedence over letters + ("4.3.90.201601080923GIT55aeea7-0.fc23", "4.3.0-1.fc23", "newer") +] + + +@pytest.fixture(params=version_strings) +def versions(request): +return request.param + +class TestVersionComparsion(object): + +def test_versions(self, versions): +version_string1, version_string2, expected_comparison = versions + +ver1 = tasks.parse_ipa_version(version_string1) +ver2 = tasks.parse_ipa_version(version_string2) + +if expected_comparison == "newer": +assert ver1 > ver2 +elif expected_comparison == "older": +assert ver1 < ver2 +elif expected_comparison == "equal": +assert ver1 == ver2 +else: +raise TypeError( +"Unexpected comparison string: {}", expected_comparison) -- 2.5.0 >From 9677e1a3ca2f5837f1b779780127adf27efa81df Mon Sep 17 00:00:00 2001 From: Martin Babinsky Date: Fri, 8 Jan 2016 14:17:14 +0100 Subject: [PATCH 1/3] use FFI call to rpmvercmp function for version comparison Stop using rpm-python to compare package versions since the implicit NSS initialization upon the module import breaks NSS handling in IPA code. Call rpm-libs C-API function via CFFI instead. Big thanks to Martin Kosek for sharing the code snippet that spurred this patch. https://fedorahosted.org/freeipa/ticket/5572 --- freeipa.spec.in | 2 +- ipaplatform/redhat/tasks.py | 59 + 2 files changed, 29 insertions(+), 32 deletions(-) diff --git a/freeipa.spec.in b/freeipa.spec.in index 7e956538d0f6c24bab636579303e0c7b5eeec199..7f31d41d16b2a26b404c277595f0994a21123f80 100644 --- a/freeipa.spec.in +++ b/freeipa.spec.in @@ -214,7 +214,7 @@ Requires: python-pyasn1 Requires: dbus-python Requires: python-dns >= 1.11.1 Requires: python-kdcproxy >= 0.3 -Requires: rpm-python +Requires: rpm-devel /usr/lib64/librpm.so.7 is provided by package rpm-libs sh$ rpm -qf /usr/lib64/librpm.so.7 rpm-libs-4.13.0-0.rc1.7.fc23.x86_64 It's not very common to depend on devel packages. LS I was basically trying workaround this http://fpaste.org/308652/22677521/ rpm-libs contains librpm.so.* and cffi is smart enough to load right library with C = ffi.dlopen("rpm") This likely won't be an issue here, but in general, we should use the versioned library name to have at least some API/ABI guarantee. If for example a function we depend on changed signature between versions, we would crash *hard* when it's called. So it's enough to add "Requires: rpm-libs" but it would be almost noop because
Re: [Freeipa-devel] [PATCH 0122-0123] reimplementation of package version comparison code
On 12.01.2016 13:14, Martin Babinsky wrote: On 01/12/2016 01:03 PM, Martin Basti wrote: On 12.01.2016 10:23, Martin Babinsky wrote: On 01/11/2016 06:38 PM, Martin Basti wrote: On 11.01.2016 17:58, Jan Cholasta wrote: On 11.1.2016 16:29, Martin Babinsky wrote: On 01/11/2016 02:27 PM, Martin Babinsky wrote: On 01/11/2016 02:01 PM, Jan Cholasta wrote: On 11.1.2016 13:14, Martin Babinsky wrote: On 01/11/2016 07:47 AM, Jan Cholasta wrote: On 8.1.2016 18:30, Lukas Slebodnik wrote: On (08/01/16 17:56), Martin Babinsky wrote: On 01/08/2016 05:23 PM, Lukas Slebodnik wrote: On (08/01/16 16:59), Martin Babinsky wrote: Patch 0122 reimplements version checking and fixes https://fedorahosted.org/freeipa/ticket/5572 Patch 0123 contains unit test for version checking code. Thanks to Martin^1 for the idea of using CFFI for calling rpm C-API directly. -- Martin^3 Babinsky >From c7a5d8970d100d071597b4e1d7cef8a27b8cd485 Mon Sep 17 00:00:00 2001 From: Martin BabinskyDate: Fri, 8 Jan 2016 15:54:00 +0100 Subject: [PATCH 2/3] tests for package version comparison These tests will ensure that our package version handling code can correctly decide when to upgrade IPA master. https://fedorahosted.org/freeipa/ticket/5572 --- ipatests/test_ipaserver/test_version_comparsion.py | 47 ++ 1 file changed, 47 insertions(+) create mode 100644 ipatests/test_ipaserver/test_version_comparsion.py diff --git a/ipatests/test_ipaserver/test_version_comparsion.py b/ipatests/test_ipaserver/test_version_comparsion.py new file mode 100644 index ..51d069b23ba389ffce39e948cdbc7a1faaa84563 --- /dev/null +++ b/ipatests/test_ipaserver/test_version_comparsion.py @@ -0,0 +1,47 @@ +# +# Copyright (C) 2015 FreeIPA Contributors see COPYING for license +# + +""" +tests for correct RPM version comparison +""" + +from ipaplatform.tasks import tasks +import pytest + +version_strings = [ +("3.0.el6", "3.0.0.el6", "older"), +("3.0.0.el6", "3.0.0.el6_8.2", "older"), +("3.0.0-42.el6", "3.0.0.el6", "newer"), +("3.0.0-1", "3.0.0-42", "older"), +("3.0.0-42.el6", "3.3.3.fc20", "older"), +("4.2.0-15.el7", "4.2.0-15.el7_2.3", "older"), +("4.2.0-15.el7_2.3", "4.2.0-15.el7_2.3", "equal"), +("4.2.0-1.fc23", "4.2.1.fc23", "older"), +("4.2.3-alpha.fc23", "4.2.3-2.fc23", "older"), # numeric version elements have + # precedence over letters + ("4.3.90.201601080923GIT55aeea7-0.fc23", "4.3.0-1.fc23", "newer") +] + + +@pytest.fixture(params=version_strings) +def versions(request): +return request.param + +class TestVersionComparsion(object): + +def test_versions(self, versions): +version_string1, version_string2, expected_comparison = versions + +ver1 = tasks.parse_ipa_version(version_string1) +ver2 = tasks.parse_ipa_version(version_string2) + +if expected_comparison == "newer": +assert ver1 > ver2 +elif expected_comparison == "older": +assert ver1 < ver2 +elif expected_comparison == "equal": +assert ver1 == ver2 +else: +raise TypeError( +"Unexpected comparison string: {}", expected_comparison) -- 2.5.0 >From 9677e1a3ca2f5837f1b779780127adf27efa81df Mon Sep 17 00:00:00 2001 From: Martin Babinsky Date: Fri, 8 Jan 2016 14:17:14 +0100 Subject: [PATCH 1/3] use FFI call to rpmvercmp function for version comparison Stop using rpm-python to compare package versions since the implicit NSS initialization upon the module import breaks NSS handling in IPA code. Call rpm-libs C-API function via CFFI instead. Big thanks to Martin Kosek for sharing the code snippet that spurred this patch. https://fedorahosted.org/freeipa/ticket/5572 --- freeipa.spec.in | 2 +- ipaplatform/redhat/tasks.py | 59 + 2 files changed, 29 insertions(+), 32 deletions(-) diff --git a/freeipa.spec.in b/freeipa.spec.in index 7e956538d0f6c24bab636579303e0c7b5eeec199..7f31d41d16b2a26b404c277595f0994a21123f80 100644 --- a/freeipa.spec.in +++ b/freeipa.spec.in @@ -214,7 +214,7 @@ Requires: python-pyasn1 Requires: dbus-python Requires: python-dns >= 1.11.1 Requires: python-kdcproxy >= 0.3 -Requires: rpm-python +Requires: rpm-devel /usr/lib64/librpm.so.7 is provided by package rpm-libs sh$ rpm -qf /usr/lib64/librpm.so.7 rpm-libs-4.13.0-0.rc1.7.fc23.x86_64 It's not very common to depend on devel packages. LS I was basically trying workaround this http://fpaste.org/308652/22677521/ rpm-libs contains librpm.so.* and cffi is smart enough to load right library with C = ffi.dlopen("rpm") This likely won't be an issue here, but in general, we should use the versioned library name to have at least some API/ABI guarantee. If for example a function we depend on changed signature between versions, we would crash *hard* when
Re: [Freeipa-devel] [PATCH 0122-0123] reimplementation of package version comparison code
On 01/11/2016 07:47 AM, Jan Cholasta wrote: On 8.1.2016 18:30, Lukas Slebodnik wrote: On (08/01/16 17:56), Martin Babinsky wrote: On 01/08/2016 05:23 PM, Lukas Slebodnik wrote: On (08/01/16 16:59), Martin Babinsky wrote: Patch 0122 reimplements version checking and fixes https://fedorahosted.org/freeipa/ticket/5572 Patch 0123 contains unit test for version checking code. Thanks to Martin^1 for the idea of using CFFI for calling rpm C-API directly. -- Martin^3 Babinsky >From c7a5d8970d100d071597b4e1d7cef8a27b8cd485 Mon Sep 17 00:00:00 2001 From: Martin BabinskyDate: Fri, 8 Jan 2016 15:54:00 +0100 Subject: [PATCH 2/3] tests for package version comparison These tests will ensure that our package version handling code can correctly decide when to upgrade IPA master. https://fedorahosted.org/freeipa/ticket/5572 --- ipatests/test_ipaserver/test_version_comparsion.py | 47 ++ 1 file changed, 47 insertions(+) create mode 100644 ipatests/test_ipaserver/test_version_comparsion.py diff --git a/ipatests/test_ipaserver/test_version_comparsion.py b/ipatests/test_ipaserver/test_version_comparsion.py new file mode 100644 index ..51d069b23ba389ffce39e948cdbc7a1faaa84563 --- /dev/null +++ b/ipatests/test_ipaserver/test_version_comparsion.py @@ -0,0 +1,47 @@ +# +# Copyright (C) 2015 FreeIPA Contributors see COPYING for license +# + +""" +tests for correct RPM version comparison +""" + +from ipaplatform.tasks import tasks +import pytest + +version_strings = [ +("3.0.el6", "3.0.0.el6", "older"), +("3.0.0.el6", "3.0.0.el6_8.2", "older"), +("3.0.0-42.el6", "3.0.0.el6", "newer"), +("3.0.0-1", "3.0.0-42", "older"), +("3.0.0-42.el6", "3.3.3.fc20", "older"), +("4.2.0-15.el7", "4.2.0-15.el7_2.3", "older"), +("4.2.0-15.el7_2.3", "4.2.0-15.el7_2.3", "equal"), +("4.2.0-1.fc23", "4.2.1.fc23", "older"), +("4.2.3-alpha.fc23", "4.2.3-2.fc23", "older"), # numeric version elements have +# precedence over letters +("4.3.90.201601080923GIT55aeea7-0.fc23", "4.3.0-1.fc23", "newer") +] + + +@pytest.fixture(params=version_strings) +def versions(request): +return request.param + +class TestVersionComparsion(object): + +def test_versions(self, versions): +version_string1, version_string2, expected_comparison = versions + +ver1 = tasks.parse_ipa_version(version_string1) +ver2 = tasks.parse_ipa_version(version_string2) + +if expected_comparison == "newer": +assert ver1 > ver2 +elif expected_comparison == "older": +assert ver1 < ver2 +elif expected_comparison == "equal": +assert ver1 == ver2 +else: +raise TypeError( +"Unexpected comparison string: {}", expected_comparison) -- 2.5.0 >From 9677e1a3ca2f5837f1b779780127adf27efa81df Mon Sep 17 00:00:00 2001 From: Martin Babinsky Date: Fri, 8 Jan 2016 14:17:14 +0100 Subject: [PATCH 1/3] use FFI call to rpmvercmp function for version comparison Stop using rpm-python to compare package versions since the implicit NSS initialization upon the module import breaks NSS handling in IPA code. Call rpm-libs C-API function via CFFI instead. Big thanks to Martin Kosek for sharing the code snippet that spurred this patch. https://fedorahosted.org/freeipa/ticket/5572 --- freeipa.spec.in | 2 +- ipaplatform/redhat/tasks.py | 59 + 2 files changed, 29 insertions(+), 32 deletions(-) diff --git a/freeipa.spec.in b/freeipa.spec.in index 7e956538d0f6c24bab636579303e0c7b5eeec199..7f31d41d16b2a26b404c277595f0994a21123f80 100644 --- a/freeipa.spec.in +++ b/freeipa.spec.in @@ -214,7 +214,7 @@ Requires: python-pyasn1 Requires: dbus-python Requires: python-dns >= 1.11.1 Requires: python-kdcproxy >= 0.3 -Requires: rpm-python +Requires: rpm-devel /usr/lib64/librpm.so.7 is provided by package rpm-libs sh$ rpm -qf /usr/lib64/librpm.so.7 rpm-libs-4.13.0-0.rc1.7.fc23.x86_64 It's not very common to depend on devel packages. LS I was basically trying workaround this http://fpaste.org/308652/22677521/ rpm-libs contains librpm.so.* and cffi is smart enough to load right library with C = ffi.dlopen("rpm") This likely won't be an issue here, but in general, we should use the versioned library name to have at least some API/ABI guarantee. If for example a function we depend on changed signature between versions, we would crash *hard* when it's called. So it's enough to add "Requires: rpm-libs" but it would be almost noop because rpm-libs is everytime available od fedora/rhel :-) "Requires: rpm-devel" add unnecessary additional runtime dependencies on pkgconfig, popt-devel librpm.so.7 belongs to rpm-libs and librpm.so to rpm-devel and I was lazy (hey it's friday) to add path to librpm.so.7 to paths and use it i LD
Re: [Freeipa-devel] [PATCH 0122-0123] reimplementation of package version comparison code
On 11.1.2016 13:14, Martin Babinsky wrote: On 01/11/2016 07:47 AM, Jan Cholasta wrote: On 8.1.2016 18:30, Lukas Slebodnik wrote: On (08/01/16 17:56), Martin Babinsky wrote: On 01/08/2016 05:23 PM, Lukas Slebodnik wrote: On (08/01/16 16:59), Martin Babinsky wrote: Patch 0122 reimplements version checking and fixes https://fedorahosted.org/freeipa/ticket/5572 Patch 0123 contains unit test for version checking code. Thanks to Martin^1 for the idea of using CFFI for calling rpm C-API directly. -- Martin^3 Babinsky >From c7a5d8970d100d071597b4e1d7cef8a27b8cd485 Mon Sep 17 00:00:00 2001 From: Martin BabinskyDate: Fri, 8 Jan 2016 15:54:00 +0100 Subject: [PATCH 2/3] tests for package version comparison These tests will ensure that our package version handling code can correctly decide when to upgrade IPA master. https://fedorahosted.org/freeipa/ticket/5572 --- ipatests/test_ipaserver/test_version_comparsion.py | 47 ++ 1 file changed, 47 insertions(+) create mode 100644 ipatests/test_ipaserver/test_version_comparsion.py diff --git a/ipatests/test_ipaserver/test_version_comparsion.py b/ipatests/test_ipaserver/test_version_comparsion.py new file mode 100644 index ..51d069b23ba389ffce39e948cdbc7a1faaa84563 --- /dev/null +++ b/ipatests/test_ipaserver/test_version_comparsion.py @@ -0,0 +1,47 @@ +# +# Copyright (C) 2015 FreeIPA Contributors see COPYING for license +# + +""" +tests for correct RPM version comparison +""" + +from ipaplatform.tasks import tasks +import pytest + +version_strings = [ +("3.0.el6", "3.0.0.el6", "older"), +("3.0.0.el6", "3.0.0.el6_8.2", "older"), +("3.0.0-42.el6", "3.0.0.el6", "newer"), +("3.0.0-1", "3.0.0-42", "older"), +("3.0.0-42.el6", "3.3.3.fc20", "older"), +("4.2.0-15.el7", "4.2.0-15.el7_2.3", "older"), +("4.2.0-15.el7_2.3", "4.2.0-15.el7_2.3", "equal"), +("4.2.0-1.fc23", "4.2.1.fc23", "older"), +("4.2.3-alpha.fc23", "4.2.3-2.fc23", "older"), # numeric version elements have +# precedence over letters +("4.3.90.201601080923GIT55aeea7-0.fc23", "4.3.0-1.fc23", "newer") +] + + +@pytest.fixture(params=version_strings) +def versions(request): +return request.param + +class TestVersionComparsion(object): + +def test_versions(self, versions): +version_string1, version_string2, expected_comparison = versions + +ver1 = tasks.parse_ipa_version(version_string1) +ver2 = tasks.parse_ipa_version(version_string2) + +if expected_comparison == "newer": +assert ver1 > ver2 +elif expected_comparison == "older": +assert ver1 < ver2 +elif expected_comparison == "equal": +assert ver1 == ver2 +else: +raise TypeError( +"Unexpected comparison string: {}", expected_comparison) -- 2.5.0 >From 9677e1a3ca2f5837f1b779780127adf27efa81df Mon Sep 17 00:00:00 2001 From: Martin Babinsky Date: Fri, 8 Jan 2016 14:17:14 +0100 Subject: [PATCH 1/3] use FFI call to rpmvercmp function for version comparison Stop using rpm-python to compare package versions since the implicit NSS initialization upon the module import breaks NSS handling in IPA code. Call rpm-libs C-API function via CFFI instead. Big thanks to Martin Kosek for sharing the code snippet that spurred this patch. https://fedorahosted.org/freeipa/ticket/5572 --- freeipa.spec.in | 2 +- ipaplatform/redhat/tasks.py | 59 + 2 files changed, 29 insertions(+), 32 deletions(-) diff --git a/freeipa.spec.in b/freeipa.spec.in index 7e956538d0f6c24bab636579303e0c7b5eeec199..7f31d41d16b2a26b404c277595f0994a21123f80 100644 --- a/freeipa.spec.in +++ b/freeipa.spec.in @@ -214,7 +214,7 @@ Requires: python-pyasn1 Requires: dbus-python Requires: python-dns >= 1.11.1 Requires: python-kdcproxy >= 0.3 -Requires: rpm-python +Requires: rpm-devel /usr/lib64/librpm.so.7 is provided by package rpm-libs sh$ rpm -qf /usr/lib64/librpm.so.7 rpm-libs-4.13.0-0.rc1.7.fc23.x86_64 It's not very common to depend on devel packages. LS I was basically trying workaround this http://fpaste.org/308652/22677521/ rpm-libs contains librpm.so.* and cffi is smart enough to load right library with C = ffi.dlopen("rpm") This likely won't be an issue here, but in general, we should use the versioned library name to have at least some API/ABI guarantee. If for example a function we depend on changed signature between versions, we would crash *hard* when it's called. So it's enough to add "Requires: rpm-libs" but it would be almost noop because rpm-libs is everytime available od fedora/rhel :-) "Requires: rpm-devel" add unnecessary additional runtime dependencies on pkgconfig, popt-devel librpm.so.7 belongs to rpm-libs and librpm.so to rpm-devel and I was lazy (hey it's friday) to add
Re: [Freeipa-devel] [PATCH 0122-0123] reimplementation of package version comparison code
On 01/11/2016 02:01 PM, Jan Cholasta wrote: On 11.1.2016 13:14, Martin Babinsky wrote: On 01/11/2016 07:47 AM, Jan Cholasta wrote: On 8.1.2016 18:30, Lukas Slebodnik wrote: On (08/01/16 17:56), Martin Babinsky wrote: On 01/08/2016 05:23 PM, Lukas Slebodnik wrote: On (08/01/16 16:59), Martin Babinsky wrote: Patch 0122 reimplements version checking and fixes https://fedorahosted.org/freeipa/ticket/5572 Patch 0123 contains unit test for version checking code. Thanks to Martin^1 for the idea of using CFFI for calling rpm C-API directly. -- Martin^3 Babinsky >From c7a5d8970d100d071597b4e1d7cef8a27b8cd485 Mon Sep 17 00:00:00 2001 From: Martin BabinskyDate: Fri, 8 Jan 2016 15:54:00 +0100 Subject: [PATCH 2/3] tests for package version comparison These tests will ensure that our package version handling code can correctly decide when to upgrade IPA master. https://fedorahosted.org/freeipa/ticket/5572 --- ipatests/test_ipaserver/test_version_comparsion.py | 47 ++ 1 file changed, 47 insertions(+) create mode 100644 ipatests/test_ipaserver/test_version_comparsion.py diff --git a/ipatests/test_ipaserver/test_version_comparsion.py b/ipatests/test_ipaserver/test_version_comparsion.py new file mode 100644 index ..51d069b23ba389ffce39e948cdbc7a1faaa84563 --- /dev/null +++ b/ipatests/test_ipaserver/test_version_comparsion.py @@ -0,0 +1,47 @@ +# +# Copyright (C) 2015 FreeIPA Contributors see COPYING for license +# + +""" +tests for correct RPM version comparison +""" + +from ipaplatform.tasks import tasks +import pytest + +version_strings = [ +("3.0.el6", "3.0.0.el6", "older"), +("3.0.0.el6", "3.0.0.el6_8.2", "older"), +("3.0.0-42.el6", "3.0.0.el6", "newer"), +("3.0.0-1", "3.0.0-42", "older"), +("3.0.0-42.el6", "3.3.3.fc20", "older"), +("4.2.0-15.el7", "4.2.0-15.el7_2.3", "older"), +("4.2.0-15.el7_2.3", "4.2.0-15.el7_2.3", "equal"), +("4.2.0-1.fc23", "4.2.1.fc23", "older"), +("4.2.3-alpha.fc23", "4.2.3-2.fc23", "older"), # numeric version elements have +# precedence over letters +("4.3.90.201601080923GIT55aeea7-0.fc23", "4.3.0-1.fc23", "newer") +] + + +@pytest.fixture(params=version_strings) +def versions(request): +return request.param + +class TestVersionComparsion(object): + +def test_versions(self, versions): +version_string1, version_string2, expected_comparison = versions + +ver1 = tasks.parse_ipa_version(version_string1) +ver2 = tasks.parse_ipa_version(version_string2) + +if expected_comparison == "newer": +assert ver1 > ver2 +elif expected_comparison == "older": +assert ver1 < ver2 +elif expected_comparison == "equal": +assert ver1 == ver2 +else: +raise TypeError( +"Unexpected comparison string: {}", expected_comparison) -- 2.5.0 >From 9677e1a3ca2f5837f1b779780127adf27efa81df Mon Sep 17 00:00:00 2001 From: Martin Babinsky Date: Fri, 8 Jan 2016 14:17:14 +0100 Subject: [PATCH 1/3] use FFI call to rpmvercmp function for version comparison Stop using rpm-python to compare package versions since the implicit NSS initialization upon the module import breaks NSS handling in IPA code. Call rpm-libs C-API function via CFFI instead. Big thanks to Martin Kosek for sharing the code snippet that spurred this patch. https://fedorahosted.org/freeipa/ticket/5572 --- freeipa.spec.in | 2 +- ipaplatform/redhat/tasks.py | 59 + 2 files changed, 29 insertions(+), 32 deletions(-) diff --git a/freeipa.spec.in b/freeipa.spec.in index 7e956538d0f6c24bab636579303e0c7b5eeec199..7f31d41d16b2a26b404c277595f0994a21123f80 100644 --- a/freeipa.spec.in +++ b/freeipa.spec.in @@ -214,7 +214,7 @@ Requires: python-pyasn1 Requires: dbus-python Requires: python-dns >= 1.11.1 Requires: python-kdcproxy >= 0.3 -Requires: rpm-python +Requires: rpm-devel /usr/lib64/librpm.so.7 is provided by package rpm-libs sh$ rpm -qf /usr/lib64/librpm.so.7 rpm-libs-4.13.0-0.rc1.7.fc23.x86_64 It's not very common to depend on devel packages. LS I was basically trying workaround this http://fpaste.org/308652/22677521/ rpm-libs contains librpm.so.* and cffi is smart enough to load right library with C = ffi.dlopen("rpm") This likely won't be an issue here, but in general, we should use the versioned library name to have at least some API/ABI guarantee. If for example a function we depend on changed signature between versions, we would crash *hard* when it's called. So it's enough to add "Requires: rpm-libs" but it would be almost noop because rpm-libs is everytime available od fedora/rhel :-) "Requires: rpm-devel" add unnecessary additional runtime dependencies on pkgconfig, popt-devel librpm.so.7 belongs to rpm-libs and librpm.so to
Re: [Freeipa-devel] [PATCH 0122-0123] reimplementation of package version comparison code
On 11.1.2016 16:29, Martin Babinsky wrote: On 01/11/2016 02:27 PM, Martin Babinsky wrote: On 01/11/2016 02:01 PM, Jan Cholasta wrote: On 11.1.2016 13:14, Martin Babinsky wrote: On 01/11/2016 07:47 AM, Jan Cholasta wrote: On 8.1.2016 18:30, Lukas Slebodnik wrote: On (08/01/16 17:56), Martin Babinsky wrote: On 01/08/2016 05:23 PM, Lukas Slebodnik wrote: On (08/01/16 16:59), Martin Babinsky wrote: Patch 0122 reimplements version checking and fixes https://fedorahosted.org/freeipa/ticket/5572 Patch 0123 contains unit test for version checking code. Thanks to Martin^1 for the idea of using CFFI for calling rpm C-API directly. -- Martin^3 Babinsky >From c7a5d8970d100d071597b4e1d7cef8a27b8cd485 Mon Sep 17 00:00:00 2001 From: Martin BabinskyDate: Fri, 8 Jan 2016 15:54:00 +0100 Subject: [PATCH 2/3] tests for package version comparison These tests will ensure that our package version handling code can correctly decide when to upgrade IPA master. https://fedorahosted.org/freeipa/ticket/5572 --- ipatests/test_ipaserver/test_version_comparsion.py | 47 ++ 1 file changed, 47 insertions(+) create mode 100644 ipatests/test_ipaserver/test_version_comparsion.py diff --git a/ipatests/test_ipaserver/test_version_comparsion.py b/ipatests/test_ipaserver/test_version_comparsion.py new file mode 100644 index ..51d069b23ba389ffce39e948cdbc7a1faaa84563 --- /dev/null +++ b/ipatests/test_ipaserver/test_version_comparsion.py @@ -0,0 +1,47 @@ +# +# Copyright (C) 2015 FreeIPA Contributors see COPYING for license +# + +""" +tests for correct RPM version comparison +""" + +from ipaplatform.tasks import tasks +import pytest + +version_strings = [ +("3.0.el6", "3.0.0.el6", "older"), +("3.0.0.el6", "3.0.0.el6_8.2", "older"), +("3.0.0-42.el6", "3.0.0.el6", "newer"), +("3.0.0-1", "3.0.0-42", "older"), +("3.0.0-42.el6", "3.3.3.fc20", "older"), +("4.2.0-15.el7", "4.2.0-15.el7_2.3", "older"), +("4.2.0-15.el7_2.3", "4.2.0-15.el7_2.3", "equal"), +("4.2.0-1.fc23", "4.2.1.fc23", "older"), +("4.2.3-alpha.fc23", "4.2.3-2.fc23", "older"), # numeric version elements have +# precedence over letters +("4.3.90.201601080923GIT55aeea7-0.fc23", "4.3.0-1.fc23", "newer") +] + + +@pytest.fixture(params=version_strings) +def versions(request): +return request.param + +class TestVersionComparsion(object): + +def test_versions(self, versions): +version_string1, version_string2, expected_comparison = versions + +ver1 = tasks.parse_ipa_version(version_string1) +ver2 = tasks.parse_ipa_version(version_string2) + +if expected_comparison == "newer": +assert ver1 > ver2 +elif expected_comparison == "older": +assert ver1 < ver2 +elif expected_comparison == "equal": +assert ver1 == ver2 +else: +raise TypeError( +"Unexpected comparison string: {}", expected_comparison) -- 2.5.0 >From 9677e1a3ca2f5837f1b779780127adf27efa81df Mon Sep 17 00:00:00 2001 From: Martin Babinsky Date: Fri, 8 Jan 2016 14:17:14 +0100 Subject: [PATCH 1/3] use FFI call to rpmvercmp function for version comparison Stop using rpm-python to compare package versions since the implicit NSS initialization upon the module import breaks NSS handling in IPA code. Call rpm-libs C-API function via CFFI instead. Big thanks to Martin Kosek for sharing the code snippet that spurred this patch. https://fedorahosted.org/freeipa/ticket/5572 --- freeipa.spec.in | 2 +- ipaplatform/redhat/tasks.py | 59 + 2 files changed, 29 insertions(+), 32 deletions(-) diff --git a/freeipa.spec.in b/freeipa.spec.in index 7e956538d0f6c24bab636579303e0c7b5eeec199..7f31d41d16b2a26b404c277595f0994a21123f80 100644 --- a/freeipa.spec.in +++ b/freeipa.spec.in @@ -214,7 +214,7 @@ Requires: python-pyasn1 Requires: dbus-python Requires: python-dns >= 1.11.1 Requires: python-kdcproxy >= 0.3 -Requires: rpm-python +Requires: rpm-devel /usr/lib64/librpm.so.7 is provided by package rpm-libs sh$ rpm -qf /usr/lib64/librpm.so.7 rpm-libs-4.13.0-0.rc1.7.fc23.x86_64 It's not very common to depend on devel packages. LS I was basically trying workaround this http://fpaste.org/308652/22677521/ rpm-libs contains librpm.so.* and cffi is smart enough to load right library with C = ffi.dlopen("rpm") This likely won't be an issue here, but in general, we should use the versioned library name to have at least some API/ABI guarantee. If for example a function we depend on changed signature between versions, we would crash *hard* when it's called. So it's enough to add "Requires: rpm-libs" but it would be almost noop because rpm-libs is everytime available od fedora/rhel :-) "Requires: rpm-devel" add unnecessary additional
Re: [Freeipa-devel] [PATCH 0122-0123] reimplementation of package version comparison code
On 01/11/2016 02:27 PM, Martin Babinsky wrote: On 01/11/2016 02:01 PM, Jan Cholasta wrote: On 11.1.2016 13:14, Martin Babinsky wrote: On 01/11/2016 07:47 AM, Jan Cholasta wrote: On 8.1.2016 18:30, Lukas Slebodnik wrote: On (08/01/16 17:56), Martin Babinsky wrote: On 01/08/2016 05:23 PM, Lukas Slebodnik wrote: On (08/01/16 16:59), Martin Babinsky wrote: Patch 0122 reimplements version checking and fixes https://fedorahosted.org/freeipa/ticket/5572 Patch 0123 contains unit test for version checking code. Thanks to Martin^1 for the idea of using CFFI for calling rpm C-API directly. -- Martin^3 Babinsky >From c7a5d8970d100d071597b4e1d7cef8a27b8cd485 Mon Sep 17 00:00:00 2001 From: Martin BabinskyDate: Fri, 8 Jan 2016 15:54:00 +0100 Subject: [PATCH 2/3] tests for package version comparison These tests will ensure that our package version handling code can correctly decide when to upgrade IPA master. https://fedorahosted.org/freeipa/ticket/5572 --- ipatests/test_ipaserver/test_version_comparsion.py | 47 ++ 1 file changed, 47 insertions(+) create mode 100644 ipatests/test_ipaserver/test_version_comparsion.py diff --git a/ipatests/test_ipaserver/test_version_comparsion.py b/ipatests/test_ipaserver/test_version_comparsion.py new file mode 100644 index ..51d069b23ba389ffce39e948cdbc7a1faaa84563 --- /dev/null +++ b/ipatests/test_ipaserver/test_version_comparsion.py @@ -0,0 +1,47 @@ +# +# Copyright (C) 2015 FreeIPA Contributors see COPYING for license +# + +""" +tests for correct RPM version comparison +""" + +from ipaplatform.tasks import tasks +import pytest + +version_strings = [ +("3.0.el6", "3.0.0.el6", "older"), +("3.0.0.el6", "3.0.0.el6_8.2", "older"), +("3.0.0-42.el6", "3.0.0.el6", "newer"), +("3.0.0-1", "3.0.0-42", "older"), +("3.0.0-42.el6", "3.3.3.fc20", "older"), +("4.2.0-15.el7", "4.2.0-15.el7_2.3", "older"), +("4.2.0-15.el7_2.3", "4.2.0-15.el7_2.3", "equal"), +("4.2.0-1.fc23", "4.2.1.fc23", "older"), +("4.2.3-alpha.fc23", "4.2.3-2.fc23", "older"), # numeric version elements have +# precedence over letters +("4.3.90.201601080923GIT55aeea7-0.fc23", "4.3.0-1.fc23", "newer") +] + + +@pytest.fixture(params=version_strings) +def versions(request): +return request.param + +class TestVersionComparsion(object): + +def test_versions(self, versions): +version_string1, version_string2, expected_comparison = versions + +ver1 = tasks.parse_ipa_version(version_string1) +ver2 = tasks.parse_ipa_version(version_string2) + +if expected_comparison == "newer": +assert ver1 > ver2 +elif expected_comparison == "older": +assert ver1 < ver2 +elif expected_comparison == "equal": +assert ver1 == ver2 +else: +raise TypeError( +"Unexpected comparison string: {}", expected_comparison) -- 2.5.0 >From 9677e1a3ca2f5837f1b779780127adf27efa81df Mon Sep 17 00:00:00 2001 From: Martin Babinsky Date: Fri, 8 Jan 2016 14:17:14 +0100 Subject: [PATCH 1/3] use FFI call to rpmvercmp function for version comparison Stop using rpm-python to compare package versions since the implicit NSS initialization upon the module import breaks NSS handling in IPA code. Call rpm-libs C-API function via CFFI instead. Big thanks to Martin Kosek for sharing the code snippet that spurred this patch. https://fedorahosted.org/freeipa/ticket/5572 --- freeipa.spec.in | 2 +- ipaplatform/redhat/tasks.py | 59 + 2 files changed, 29 insertions(+), 32 deletions(-) diff --git a/freeipa.spec.in b/freeipa.spec.in index 7e956538d0f6c24bab636579303e0c7b5eeec199..7f31d41d16b2a26b404c277595f0994a21123f80 100644 --- a/freeipa.spec.in +++ b/freeipa.spec.in @@ -214,7 +214,7 @@ Requires: python-pyasn1 Requires: dbus-python Requires: python-dns >= 1.11.1 Requires: python-kdcproxy >= 0.3 -Requires: rpm-python +Requires: rpm-devel /usr/lib64/librpm.so.7 is provided by package rpm-libs sh$ rpm -qf /usr/lib64/librpm.so.7 rpm-libs-4.13.0-0.rc1.7.fc23.x86_64 It's not very common to depend on devel packages. LS I was basically trying workaround this http://fpaste.org/308652/22677521/ rpm-libs contains librpm.so.* and cffi is smart enough to load right library with C = ffi.dlopen("rpm") This likely won't be an issue here, but in general, we should use the versioned library name to have at least some API/ABI guarantee. If for example a function we depend on changed signature between versions, we would crash *hard* when it's called. So it's enough to add "Requires: rpm-libs" but it would be almost noop because rpm-libs is everytime available od fedora/rhel :-) "Requires: rpm-devel" add unnecessary additional runtime dependencies on pkgconfig, popt-devel
Re: [Freeipa-devel] [PATCH 0122-0123] reimplementation of package version comparison code
On 11.01.2016 17:58, Jan Cholasta wrote: On 11.1.2016 16:29, Martin Babinsky wrote: On 01/11/2016 02:27 PM, Martin Babinsky wrote: On 01/11/2016 02:01 PM, Jan Cholasta wrote: On 11.1.2016 13:14, Martin Babinsky wrote: On 01/11/2016 07:47 AM, Jan Cholasta wrote: On 8.1.2016 18:30, Lukas Slebodnik wrote: On (08/01/16 17:56), Martin Babinsky wrote: On 01/08/2016 05:23 PM, Lukas Slebodnik wrote: On (08/01/16 16:59), Martin Babinsky wrote: Patch 0122 reimplements version checking and fixes https://fedorahosted.org/freeipa/ticket/5572 Patch 0123 contains unit test for version checking code. Thanks to Martin^1 for the idea of using CFFI for calling rpm C-API directly. -- Martin^3 Babinsky >From c7a5d8970d100d071597b4e1d7cef8a27b8cd485 Mon Sep 17 00:00:00 2001 From: Martin BabinskyDate: Fri, 8 Jan 2016 15:54:00 +0100 Subject: [PATCH 2/3] tests for package version comparison These tests will ensure that our package version handling code can correctly decide when to upgrade IPA master. https://fedorahosted.org/freeipa/ticket/5572 --- ipatests/test_ipaserver/test_version_comparsion.py | 47 ++ 1 file changed, 47 insertions(+) create mode 100644 ipatests/test_ipaserver/test_version_comparsion.py diff --git a/ipatests/test_ipaserver/test_version_comparsion.py b/ipatests/test_ipaserver/test_version_comparsion.py new file mode 100644 index ..51d069b23ba389ffce39e948cdbc7a1faaa84563 --- /dev/null +++ b/ipatests/test_ipaserver/test_version_comparsion.py @@ -0,0 +1,47 @@ +# +# Copyright (C) 2015 FreeIPA Contributors see COPYING for license +# + +""" +tests for correct RPM version comparison +""" + +from ipaplatform.tasks import tasks +import pytest + +version_strings = [ +("3.0.el6", "3.0.0.el6", "older"), +("3.0.0.el6", "3.0.0.el6_8.2", "older"), +("3.0.0-42.el6", "3.0.0.el6", "newer"), +("3.0.0-1", "3.0.0-42", "older"), +("3.0.0-42.el6", "3.3.3.fc20", "older"), +("4.2.0-15.el7", "4.2.0-15.el7_2.3", "older"), +("4.2.0-15.el7_2.3", "4.2.0-15.el7_2.3", "equal"), +("4.2.0-1.fc23", "4.2.1.fc23", "older"), +("4.2.3-alpha.fc23", "4.2.3-2.fc23", "older"), # numeric version elements have + # precedence over letters +("4.3.90.201601080923GIT55aeea7-0.fc23", "4.3.0-1.fc23", "newer") +] + + +@pytest.fixture(params=version_strings) +def versions(request): +return request.param + +class TestVersionComparsion(object): + +def test_versions(self, versions): +version_string1, version_string2, expected_comparison = versions + +ver1 = tasks.parse_ipa_version(version_string1) +ver2 = tasks.parse_ipa_version(version_string2) + +if expected_comparison == "newer": +assert ver1 > ver2 +elif expected_comparison == "older": +assert ver1 < ver2 +elif expected_comparison == "equal": +assert ver1 == ver2 +else: +raise TypeError( +"Unexpected comparison string: {}", expected_comparison) -- 2.5.0 >From 9677e1a3ca2f5837f1b779780127adf27efa81df Mon Sep 17 00:00:00 2001 From: Martin Babinsky Date: Fri, 8 Jan 2016 14:17:14 +0100 Subject: [PATCH 1/3] use FFI call to rpmvercmp function for version comparison Stop using rpm-python to compare package versions since the implicit NSS initialization upon the module import breaks NSS handling in IPA code. Call rpm-libs C-API function via CFFI instead. Big thanks to Martin Kosek for sharing the code snippet that spurred this patch. https://fedorahosted.org/freeipa/ticket/5572 --- freeipa.spec.in | 2 +- ipaplatform/redhat/tasks.py | 59 + 2 files changed, 29 insertions(+), 32 deletions(-) diff --git a/freeipa.spec.in b/freeipa.spec.in index 7e956538d0f6c24bab636579303e0c7b5eeec199..7f31d41d16b2a26b404c277595f0994a21123f80 100644 --- a/freeipa.spec.in +++ b/freeipa.spec.in @@ -214,7 +214,7 @@ Requires: python-pyasn1 Requires: dbus-python Requires: python-dns >= 1.11.1 Requires: python-kdcproxy >= 0.3 -Requires: rpm-python +Requires: rpm-devel /usr/lib64/librpm.so.7 is provided by package rpm-libs sh$ rpm -qf /usr/lib64/librpm.so.7 rpm-libs-4.13.0-0.rc1.7.fc23.x86_64 It's not very common to depend on devel packages. LS I was basically trying workaround this http://fpaste.org/308652/22677521/ rpm-libs contains librpm.so.* and cffi is smart enough to load right library with C = ffi.dlopen("rpm") This likely won't be an issue here, but in general, we should use the versioned library name to have at least some API/ABI guarantee. If for example a function we depend on changed signature between versions, we would crash *hard* when it's called. So it's enough to add "Requires: rpm-libs" but it would be almost noop because rpm-libs is everytime available od fedora/rhel :-) "Requires: rpm-devel" add unnecessary
Re: [Freeipa-devel] [PATCH 0122-0123] reimplementation of package version comparison code
On (08/01/16 16:59), Martin Babinsky wrote: >Patch 0122 reimplements version checking and fixes >https://fedorahosted.org/freeipa/ticket/5572 > >Patch 0123 contains unit test for version checking code. > >Thanks to Martin^1 for the idea of using CFFI for calling rpm C-API directly. > >-- >Martin^3 Babinsky >From c7a5d8970d100d071597b4e1d7cef8a27b8cd485 Mon Sep 17 00:00:00 2001 >From: Martin Babinsky>Date: Fri, 8 Jan 2016 15:54:00 +0100 >Subject: [PATCH 2/3] tests for package version comparison > >These tests will ensure that our package version handling code can correctly >decide when to upgrade IPA master. > >https://fedorahosted.org/freeipa/ticket/5572 >--- > ipatests/test_ipaserver/test_version_comparsion.py | 47 ++ > 1 file changed, 47 insertions(+) > create mode 100644 ipatests/test_ipaserver/test_version_comparsion.py > >diff --git a/ipatests/test_ipaserver/test_version_comparsion.py >b/ipatests/test_ipaserver/test_version_comparsion.py >new file mode 100644 >index >..51d069b23ba389ffce39e948cdbc7a1faaa84563 >--- /dev/null >+++ b/ipatests/test_ipaserver/test_version_comparsion.py >@@ -0,0 +1,47 @@ >+# >+# Copyright (C) 2015 FreeIPA Contributors see COPYING for license >+# >+ >+""" >+tests for correct RPM version comparison >+""" >+ >+from ipaplatform.tasks import tasks >+import pytest >+ >+version_strings = [ >+("3.0.el6", "3.0.0.el6", "older"), >+("3.0.0.el6", "3.0.0.el6_8.2", "older"), >+("3.0.0-42.el6", "3.0.0.el6", "newer"), >+("3.0.0-1", "3.0.0-42", "older"), >+("3.0.0-42.el6", "3.3.3.fc20", "older"), >+("4.2.0-15.el7", "4.2.0-15.el7_2.3", "older"), >+("4.2.0-15.el7_2.3", "4.2.0-15.el7_2.3", "equal"), >+("4.2.0-1.fc23", "4.2.1.fc23", "older"), >+("4.2.3-alpha.fc23", "4.2.3-2.fc23", "older"), # numeric version >elements have >+# precedence over letters >+("4.3.90.201601080923GIT55aeea7-0.fc23", "4.3.0-1.fc23", "newer") >+] >+ >+ >+@pytest.fixture(params=version_strings) >+def versions(request): >+return request.param >+ >+class TestVersionComparsion(object): >+ >+def test_versions(self, versions): >+version_string1, version_string2, expected_comparison = versions >+ >+ver1 = tasks.parse_ipa_version(version_string1) >+ver2 = tasks.parse_ipa_version(version_string2) >+ >+if expected_comparison == "newer": >+assert ver1 > ver2 >+elif expected_comparison == "older": >+assert ver1 < ver2 >+elif expected_comparison == "equal": >+assert ver1 == ver2 >+else: >+raise TypeError( >+"Unexpected comparison string: {}", expected_comparison) >-- >2.5.0 > >From 9677e1a3ca2f5837f1b779780127adf27efa81df Mon Sep 17 00:00:00 2001 >From: Martin Babinsky >Date: Fri, 8 Jan 2016 14:17:14 +0100 >Subject: [PATCH 1/3] use FFI call to rpmvercmp function for version comparison > >Stop using rpm-python to compare package versions since the implicit NSS >initialization upon the module import breaks NSS handling in IPA code. Call >rpm-libs C-API function via CFFI instead. > >Big thanks to Martin Kosek for sharing the code snippet >that spurred this patch. > >https://fedorahosted.org/freeipa/ticket/5572 >--- > freeipa.spec.in | 2 +- > ipaplatform/redhat/tasks.py | 59 + > 2 files changed, 29 insertions(+), 32 deletions(-) > >diff --git a/freeipa.spec.in b/freeipa.spec.in >index >7e956538d0f6c24bab636579303e0c7b5eeec199..7f31d41d16b2a26b404c277595f0994a21123f80 > 100644 >--- a/freeipa.spec.in >+++ b/freeipa.spec.in >@@ -214,7 +214,7 @@ Requires: python-pyasn1 > Requires: dbus-python > Requires: python-dns >= 1.11.1 > Requires: python-kdcproxy >= 0.3 >-Requires: rpm-python >+Requires: rpm-devel /usr/lib64/librpm.so.7 is provided by package rpm-libs sh$ rpm -qf /usr/lib64/librpm.so.7 rpm-libs-4.13.0-0.rc1.7.fc23.x86_64 It's not very common to depend on devel packages. LS -- Manage your subscription for the Freeipa-devel mailing list: https://www.redhat.com/mailman/listinfo/freeipa-devel Contribute to FreeIPA: http://www.freeipa.org/page/Contribute/Code
Re: [Freeipa-devel] [PATCH 0122-0123] reimplementation of package version comparison code
On 01/08/2016 05:23 PM, Lukas Slebodnik wrote: On (08/01/16 16:59), Martin Babinsky wrote: Patch 0122 reimplements version checking and fixes https://fedorahosted.org/freeipa/ticket/5572 Patch 0123 contains unit test for version checking code. Thanks to Martin^1 for the idea of using CFFI for calling rpm C-API directly. -- Martin^3 Babinsky From c7a5d8970d100d071597b4e1d7cef8a27b8cd485 Mon Sep 17 00:00:00 2001 From: Martin BabinskyDate: Fri, 8 Jan 2016 15:54:00 +0100 Subject: [PATCH 2/3] tests for package version comparison These tests will ensure that our package version handling code can correctly decide when to upgrade IPA master. https://fedorahosted.org/freeipa/ticket/5572 --- ipatests/test_ipaserver/test_version_comparsion.py | 47 ++ 1 file changed, 47 insertions(+) create mode 100644 ipatests/test_ipaserver/test_version_comparsion.py diff --git a/ipatests/test_ipaserver/test_version_comparsion.py b/ipatests/test_ipaserver/test_version_comparsion.py new file mode 100644 index ..51d069b23ba389ffce39e948cdbc7a1faaa84563 --- /dev/null +++ b/ipatests/test_ipaserver/test_version_comparsion.py @@ -0,0 +1,47 @@ +# +# Copyright (C) 2015 FreeIPA Contributors see COPYING for license +# + +""" +tests for correct RPM version comparison +""" + +from ipaplatform.tasks import tasks +import pytest + +version_strings = [ +("3.0.el6", "3.0.0.el6", "older"), +("3.0.0.el6", "3.0.0.el6_8.2", "older"), +("3.0.0-42.el6", "3.0.0.el6", "newer"), +("3.0.0-1", "3.0.0-42", "older"), +("3.0.0-42.el6", "3.3.3.fc20", "older"), +("4.2.0-15.el7", "4.2.0-15.el7_2.3", "older"), +("4.2.0-15.el7_2.3", "4.2.0-15.el7_2.3", "equal"), +("4.2.0-1.fc23", "4.2.1.fc23", "older"), +("4.2.3-alpha.fc23", "4.2.3-2.fc23", "older"), # numeric version elements have +# precedence over letters +("4.3.90.201601080923GIT55aeea7-0.fc23", "4.3.0-1.fc23", "newer") +] + + +@pytest.fixture(params=version_strings) +def versions(request): +return request.param + +class TestVersionComparsion(object): + +def test_versions(self, versions): +version_string1, version_string2, expected_comparison = versions + +ver1 = tasks.parse_ipa_version(version_string1) +ver2 = tasks.parse_ipa_version(version_string2) + +if expected_comparison == "newer": +assert ver1 > ver2 +elif expected_comparison == "older": +assert ver1 < ver2 +elif expected_comparison == "equal": +assert ver1 == ver2 +else: +raise TypeError( +"Unexpected comparison string: {}", expected_comparison) -- 2.5.0 From 9677e1a3ca2f5837f1b779780127adf27efa81df Mon Sep 17 00:00:00 2001 From: Martin Babinsky Date: Fri, 8 Jan 2016 14:17:14 +0100 Subject: [PATCH 1/3] use FFI call to rpmvercmp function for version comparison Stop using rpm-python to compare package versions since the implicit NSS initialization upon the module import breaks NSS handling in IPA code. Call rpm-libs C-API function via CFFI instead. Big thanks to Martin Kosek for sharing the code snippet that spurred this patch. https://fedorahosted.org/freeipa/ticket/5572 --- freeipa.spec.in | 2 +- ipaplatform/redhat/tasks.py | 59 + 2 files changed, 29 insertions(+), 32 deletions(-) diff --git a/freeipa.spec.in b/freeipa.spec.in index 7e956538d0f6c24bab636579303e0c7b5eeec199..7f31d41d16b2a26b404c277595f0994a21123f80 100644 --- a/freeipa.spec.in +++ b/freeipa.spec.in @@ -214,7 +214,7 @@ Requires: python-pyasn1 Requires: dbus-python Requires: python-dns >= 1.11.1 Requires: python-kdcproxy >= 0.3 -Requires: rpm-python +Requires: rpm-devel /usr/lib64/librpm.so.7 is provided by package rpm-libs sh$ rpm -qf /usr/lib64/librpm.so.7 rpm-libs-4.13.0-0.rc1.7.fc23.x86_64 It's not very common to depend on devel packages. LS I was basically trying workaround this http://fpaste.org/308652/22677521/ librpm.so.7 belongs to rpm-libs and librpm.so to rpm-devel and I was lazy (hey it's friday) to add path to librpm.so.7 to paths and use it i LD loader. If you think that it is not optimal I will fix it, but let's wait for some more feedback. -- Martin^3 Babinsky -- Manage your subscription for the Freeipa-devel mailing list: https://www.redhat.com/mailman/listinfo/freeipa-devel Contribute to FreeIPA: http://www.freeipa.org/page/Contribute/Code
Re: [Freeipa-devel] [PATCH 0122-0123] reimplementation of package version comparison code
On (08/01/16 17:56), Martin Babinsky wrote: >On 01/08/2016 05:23 PM, Lukas Slebodnik wrote: >>On (08/01/16 16:59), Martin Babinsky wrote: >>>Patch 0122 reimplements version checking and fixes >>>https://fedorahosted.org/freeipa/ticket/5572 >>> >>>Patch 0123 contains unit test for version checking code. >>> >>>Thanks to Martin^1 for the idea of using CFFI for calling rpm C-API directly. >>> >>>-- >>>Martin^3 Babinsky >> >>>From c7a5d8970d100d071597b4e1d7cef8a27b8cd485 Mon Sep 17 00:00:00 2001 >>>From: Martin Babinsky>>>Date: Fri, 8 Jan 2016 15:54:00 +0100 >>>Subject: [PATCH 2/3] tests for package version comparison >>> >>>These tests will ensure that our package version handling code can correctly >>>decide when to upgrade IPA master. >>> >>>https://fedorahosted.org/freeipa/ticket/5572 >>>--- >>>ipatests/test_ipaserver/test_version_comparsion.py | 47 >>>++ >>>1 file changed, 47 insertions(+) >>>create mode 100644 ipatests/test_ipaserver/test_version_comparsion.py >>> >>>diff --git a/ipatests/test_ipaserver/test_version_comparsion.py >>>b/ipatests/test_ipaserver/test_version_comparsion.py >>>new file mode 100644 >>>index >>>..51d069b23ba389ffce39e948cdbc7a1faaa84563 >>>--- /dev/null >>>+++ b/ipatests/test_ipaserver/test_version_comparsion.py >>>@@ -0,0 +1,47 @@ >>>+# >>>+# Copyright (C) 2015 FreeIPA Contributors see COPYING for license >>>+# >>>+ >>>+""" >>>+tests for correct RPM version comparison >>>+""" >>>+ >>>+from ipaplatform.tasks import tasks >>>+import pytest >>>+ >>>+version_strings = [ >>>+("3.0.el6", "3.0.0.el6", "older"), >>>+("3.0.0.el6", "3.0.0.el6_8.2", "older"), >>>+("3.0.0-42.el6", "3.0.0.el6", "newer"), >>>+("3.0.0-1", "3.0.0-42", "older"), >>>+("3.0.0-42.el6", "3.3.3.fc20", "older"), >>>+("4.2.0-15.el7", "4.2.0-15.el7_2.3", "older"), >>>+("4.2.0-15.el7_2.3", "4.2.0-15.el7_2.3", "equal"), >>>+("4.2.0-1.fc23", "4.2.1.fc23", "older"), >>>+("4.2.3-alpha.fc23", "4.2.3-2.fc23", "older"), # numeric version >>>elements have >>>+# precedence over letters >>>+("4.3.90.201601080923GIT55aeea7-0.fc23", "4.3.0-1.fc23", "newer") >>>+] >>>+ >>>+ >>>+@pytest.fixture(params=version_strings) >>>+def versions(request): >>>+return request.param >>>+ >>>+class TestVersionComparsion(object): >>>+ >>>+def test_versions(self, versions): >>>+version_string1, version_string2, expected_comparison = versions >>>+ >>>+ver1 = tasks.parse_ipa_version(version_string1) >>>+ver2 = tasks.parse_ipa_version(version_string2) >>>+ >>>+if expected_comparison == "newer": >>>+assert ver1 > ver2 >>>+elif expected_comparison == "older": >>>+assert ver1 < ver2 >>>+elif expected_comparison == "equal": >>>+assert ver1 == ver2 >>>+else: >>>+raise TypeError( >>>+"Unexpected comparison string: {}", expected_comparison) >>>-- >>>2.5.0 >>> >> >>>From 9677e1a3ca2f5837f1b779780127adf27efa81df Mon Sep 17 00:00:00 2001 >>>From: Martin Babinsky >>>Date: Fri, 8 Jan 2016 14:17:14 +0100 >>>Subject: [PATCH 1/3] use FFI call to rpmvercmp function for version >>>comparison >>> >>>Stop using rpm-python to compare package versions since the implicit NSS >>>initialization upon the module import breaks NSS handling in IPA code. Call >>>rpm-libs C-API function via CFFI instead. >>> >>>Big thanks to Martin Kosek for sharing the code snippet >>>that spurred this patch. >>> >>>https://fedorahosted.org/freeipa/ticket/5572 >>>--- >>>freeipa.spec.in | 2 +- >>>ipaplatform/redhat/tasks.py | 59 >>>+ >>>2 files changed, 29 insertions(+), 32 deletions(-) >>> >>>diff --git a/freeipa.spec.in b/freeipa.spec.in >>>index >>>7e956538d0f6c24bab636579303e0c7b5eeec199..7f31d41d16b2a26b404c277595f0994a21123f80 >>> 100644 >>>--- a/freeipa.spec.in >>>+++ b/freeipa.spec.in >>>@@ -214,7 +214,7 @@ Requires: python-pyasn1 >>>Requires: dbus-python >>>Requires: python-dns >= 1.11.1 >>>Requires: python-kdcproxy >= 0.3 >>>-Requires: rpm-python >>>+Requires: rpm-devel >>/usr/lib64/librpm.so.7 is provided by package rpm-libs >> >> >>sh$ rpm -qf /usr/lib64/librpm.so.7 >>rpm-libs-4.13.0-0.rc1.7.fc23.x86_64 >> >>It's not very common to depend on devel packages. >> >>LS >> > >I was basically trying workaround this http://fpaste.org/308652/22677521/ > rpm-libs contains librpm.so.* and cffi is smart enough to load right library with C = ffi.dlopen("rpm") So it's enough to add "Requires: rpm-libs" but it would be almost noop because rpm-libs is everytime available od fedora/rhel :-) "Requires: rpm-devel" add unnecessary additional runtime dependencies on pkgconfig, popt-devel >librpm.so.7 belongs to rpm-libs and librpm.so to rpm-devel and I was lazy >(hey it's friday) to add path to