diff --git a/.files b/.files index 620cb4b..ae9ecc1 100644 Binary files a/.files and b/.files differ diff --git a/.rev b/.rev index 5ef25fa..cdd91c8 100644 --- a/.rev +++ b/.rev @@ -1255,4 +1255,12 @@ D fixes-a-template-rendering-error.patch 990580 + + 350de775a4459daa4e82cb7a4adfae59 + 3.3.3 + + dimstar_suse + + 1087750 + diff --git a/.servicemark b/.servicemark deleted file mode 100644 index 726629b..0000000 --- a/.servicemark +++ /dev/null @@ -1 +0,0 @@ -2166a19cc04ca5ad228ffb7a4c701509 diff --git a/_service b/_service index a3cfe38..f54da26 100644 --- a/_service +++ b/_service @@ -1,9 +1,10 @@ - https://github.com/cobbler/cobbler.git + https://github.com/openSUSE/cobbler.git git - 3.3.3.@TAG_OFFSET@+git.%h - v3.3.3 + @PARENT_TAG@ + v(.*) + openSUSE/factory cobbler.spec diff --git a/backport_complex_xmlrpc_objects_and_logger_spam.patch b/backport_complex_xmlrpc_objects_and_logger_spam.patch deleted file mode 100644 index 3f911ef..0000000 --- a/backport_complex_xmlrpc_objects_and_logger_spam.patch +++ /dev/null @@ -1,294 +0,0 @@ -Index: cobbler/items/item.py -IDEA additional info: -Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP -<+>UTF-8 -=================================================================== -diff --git a/cobbler/items/item.py b/cobbler/items/item.py ---- a/cobbler/items/item.py (revision 5c498dbf2af6e3782b37605a477759e1aacc16b2) -+++ b/cobbler/items/item.py (revision 7371e1eeb7b735edd22897c5aba35987f295391f) -@@ -974,7 +974,7 @@ - parent = parent.parent - # FIXME: Now get the object and check its existence - results.append(self.api.settings()) -- self.logger.info( -+ self.logger.debug( - "grab_tree found %s children (including settings) of this object", - len(results), - ) -Index: config/cobbler/logging_config.conf -IDEA additional info: -Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP -<+>UTF-8 -=================================================================== -diff --git a/config/cobbler/logging_config.conf b/config/cobbler/logging_config.conf ---- a/config/cobbler/logging_config.conf (revision 5c498dbf2af6e3782b37605a477759e1aacc16b2) -+++ b/config/cobbler/logging_config.conf (revision 7371e1eeb7b735edd22897c5aba35987f295391f) -@@ -19,7 +19,7 @@ - - [handler_stdout] - class=StreamHandler --level=WARNING -+level=INFO - formatter=stdout - args=(sys.stdout,) - -@@ -34,7 +34,7 @@ - - [handler_FileLogger] - class=FileHandler --level=DEBUG -+level=INFO - formatter=Logfile - args=('/var/log/cobbler/cobbler.log', 'a') - -Index: cobbler/items/distro.py -IDEA additional info: -Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP -<+>UTF-8 -=================================================================== -diff --git a/cobbler/items/distro.py b/cobbler/items/distro.py ---- a/cobbler/items/distro.py (revision 7371e1eeb7b735edd22897c5aba35987f295391f) -+++ b/cobbler/items/distro.py (revision e72a03db09397a5dde1b16d0d831a549e0a86bd2) -@@ -34,6 +34,8 @@ - A Cobbler distribution object - """ - -+ # Constants -+ TYPE_NAME = "distro" - COLLECTION_TYPE = "distro" - - def __init__(self, api, *args, **kwargs): -Index: cobbler/items/system.py -IDEA additional info: -Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP -<+>UTF-8 -=================================================================== -diff --git a/cobbler/items/system.py b/cobbler/items/system.py ---- a/cobbler/items/system.py (revision 7371e1eeb7b735edd22897c5aba35987f295391f) -+++ b/cobbler/items/system.py (revision e72a03db09397a5dde1b16d0d831a549e0a86bd2) -@@ -730,6 +730,8 @@ - A Cobbler system object. - """ - -+ # Constants -+ TYPE_NAME = "system" - COLLECTION_TYPE = "system" - - def __init__(self, api, *args, **kwargs): -Index: cobbler/remote.py -IDEA additional info: -Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP -<+>UTF-8 -=================================================================== -diff --git a/cobbler/remote.py b/cobbler/remote.py ---- a/cobbler/remote.py (revision 7371e1eeb7b735edd22897c5aba35987f295391f) -+++ b/cobbler/remote.py (revision e72a03db09397a5dde1b16d0d831a549e0a86bd2) -@@ -34,6 +34,7 @@ - from typing import Dict, List, Optional, Union - from xmlrpc.server import SimpleXMLRPCRequestHandler - -+from cobbler import enums - from cobbler import autoinstall_manager - from cobbler import configgen - from cobbler.items import item, package, system, image, profile, repo, mgmtclass, distro, file, menu -@@ -712,7 +713,38 @@ - .. seealso:: Logically identical to :func:`~cobbler.api.CobblerAPI.get_item_resolved_value` - """ - self._log("get_item_resolved_value(%s)" % item_uuid, attribute=attribute) -- return self.api.get_item_resolved_value(item_uuid, attribute) -+ return_value = self.api.get_item_resolved_value(item_uuid, attribute) -+ if return_value is None: -+ self._log( -+ "get_item_resolved_value(%s): returned None" % item_uuid, -+ attribute=attribute, -+ ) -+ raise ValueError( -+ 'None is not a valid value for the resolved attribute "%s". Please fix the item(s) ' -+ 'starting at uuid "%s"' % (attribute, item_uuid) -+ ) -+ elif isinstance(return_value, enums.ConvertableEnum): -+ return return_value.value -+ elif isinstance( -+ return_value, -+ (utils.DHCP, enums.NetworkInterfaceType, enums.BaudRates, item.Item), -+ ): -+ return return_value.name -+ elif isinstance(return_value, dict): -+ return self.xmlrpc_hacks(return_value) -+ -+ if not isinstance( -+ return_value, (str, int, float, bool, tuple, bytes, bytearray, dict, list) -+ ): -+ self._log( -+ "get_item_resolved_value(%s): Cannot return XML-RPC compliant type. Please add a case to convert" -+ ' type "%s" to an XML-RPC compliant type!' -+ % (item_uuid, type(return_value)) -+ ) -+ raise ValueError( -+ "Cannot return XML-RPC compliant type. See logs for more information!" -+ ) -+ return return_value - - def get_item(self, what: str, name: str, flatten=False, resolved: bool = False): - """ -Index: tests/xmlrpcapi/non_object_calls_test.py -IDEA additional info: -Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP -<+>UTF-8 -=================================================================== -diff --git a/tests/xmlrpcapi/non_object_calls_test.py b/tests/xmlrpcapi/non_object_calls_test.py ---- a/tests/xmlrpcapi/non_object_calls_test.py (revision 7371e1eeb7b735edd22897c5aba35987f295391f) -+++ b/tests/xmlrpcapi/non_object_calls_test.py (revision e72a03db09397a5dde1b16d0d831a549e0a86bd2) -@@ -4,6 +4,8 @@ - import time - import re - -+from tests.conftest import does_not_raise -+ - TEST_POWER_MANAGEMENT = True - TEST_SYSTEM = "" - -@@ -186,8 +188,26 @@ - assert match_obj - - -+@pytest.mark.parametrize( -+ "input_attribute,checked_object,expected_result,expected_exception", -+ [ -+ ("kernel_options", "system", {"a": "1", "b": "2", "d": "~"}, does_not_raise()), -+ ("arch", "distro", "x86_64", does_not_raise()), -+ ("distro", "profile", "testdistro_item_resolved_value", does_not_raise()), -+ ("profile", "system", "testprofile_item_resolved_value", does_not_raise()), -+ ], -+) - def test_get_item_resolved_value( -- remote, token, create_distro, create_profile, create_system, create_kernel_initrd -+ remote, -+ token, -+ create_distro, -+ create_profile, -+ create_system, -+ create_kernel_initrd, -+ input_attribute, -+ checked_object, -+ expected_result, -+ expected_exception, - ): - # Arrange - fk_kernel = "vmlinuz1" -@@ -203,11 +223,18 @@ - create_profile(name_profile, name_distro, "a=1 b=2 c=3 c=4 c=5 d e") - test_system_handle = create_system(name_system, name_profile) - remote.modify_system(test_system_handle, "kernel_options", "!c !e", token=token) -- test_system = remote.get_system(name_system, token=token) -- expected_result = {"a": "1", "b": "2", "d": None} -+ if checked_object == "distro": -+ test_item = remote.get_distro(name_distro, token=token) -+ elif checked_object == "profile": -+ test_item = remote.get_profile(name_profile, token=token) -+ elif checked_object == "system": -+ test_item = remote.get_system(name_system, token=token) -+ else: -+ raise ValueError("checked_object has wrong value") - - # Act -- result = remote.get_item_resolved_value(test_system.get("uid"), "kernel_options") -+ with expected_exception: -+ result = remote.get_item_resolved_value(test_item.get("uid"), input_attribute) - -- # Assert -- assert expected_result == result -+ # Assert -+ assert expected_result == result -Index: cobbler/remote.py -IDEA additional info: -Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP -<+>UTF-8 -=================================================================== -diff --git a/cobbler/remote.py b/cobbler/remote.py ---- a/cobbler/remote.py (revision cb840ce25e78aa26349e3b23065b0fdf78fbadbc) -+++ b/cobbler/remote.py (revision 8398a921c898744929afa1620efa70859d5463bb) -@@ -731,6 +731,20 @@ - ): - return return_value.name - elif isinstance(return_value, dict): -+ if ( -+ attribute == "interfaces" -+ and len(return_value) > 0 -+ and all( -+ isinstance(value, system.NetworkInterface) -+ for value in return_value.values() -+ ) -+ ): -+ interface_return_value = {} -+ for interface_name in return_value: -+ interface_return_value[interface_name] = return_value[ -+ interface_name -+ ].to_dict(resolved=True) -+ return interface_return_value - return self.xmlrpc_hacks(return_value) - - if not isinstance( -Index: tests/xmlrpcapi/non_object_calls_test.py -IDEA additional info: -Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP -<+>UTF-8 -=================================================================== -diff --git a/tests/xmlrpcapi/non_object_calls_test.py b/tests/xmlrpcapi/non_object_calls_test.py ---- a/tests/xmlrpcapi/non_object_calls_test.py (revision cb840ce25e78aa26349e3b23065b0fdf78fbadbc) -+++ b/tests/xmlrpcapi/non_object_calls_test.py (revision 8398a921c898744929afa1620efa70859d5463bb) -@@ -195,6 +195,40 @@ - ("arch", "distro", "x86_64", does_not_raise()), - ("distro", "profile", "testdistro_item_resolved_value", does_not_raise()), - ("profile", "system", "testprofile_item_resolved_value", does_not_raise()), -+ ( -+ "interfaces", -+ "system", -+ { -+ "eth0": { -+ "bonding_opts": "", -+ "bridge_opts": "", -+ "cnames": [], -+ "connected_mode": False, -+ "dhcp_tag": "", -+ "dns_name": "", -+ "if_gateway": "", -+ "interface_master": "", -+ "interface_type": "NA", -+ "ip_address": "", -+ "ipv6_address": "", -+ "ipv6_default_gateway": "", -+ "ipv6_mtu": "", -+ "ipv6_prefix": "", -+ "ipv6_secondaries": [], -+ "ipv6_static_routes": [], -+ "mac_address": "aa:bb:cc:dd:ee:ff", -+ "management": False, -+ "mtu": "", -+ "netmask": "", -+ "static": False, -+ "static_routes": [], -+ "virt_bridge": "", -+ } -+ }, -+ does_not_raise(), -+ ), -+ ("modify_interface", "system", {}, pytest.raises(ValueError)), -+ ("doesnt_exist", "system", {}, pytest.raises(AttributeError)), - ], - ) - def test_get_item_resolved_value( -@@ -223,6 +257,12 @@ - create_profile(name_profile, name_distro, "a=1 b=2 c=3 c=4 c=5 d e") - test_system_handle = create_system(name_system, name_profile) - remote.modify_system(test_system_handle, "kernel_options", "!c !e", token=token) -+ remote.modify_system( -+ test_system_handle, -+ "modify_interface", -+ {"macaddress-eth0": "aa:bb:cc:dd:ee:ff"}, -+ token=token, -+ ) - if checked_object == "distro": - test_item = remote.get_distro(name_distro, token=token) - elif checked_object == "profile": - diff --git a/backport_kernel_regex_error_message.patch b/backport_kernel_regex_error_message.patch deleted file mode 100644 index 32b7094..0000000 --- a/backport_kernel_regex_error_message.patch +++ /dev/null @@ -1,37 +0,0 @@ -Index: cobbler/items/distro.py -IDEA additional info: -Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP -<+>UTF-8 -=================================================================== -diff --git a/cobbler/items/distro.py b/cobbler/items/distro.py ---- a/cobbler/items/distro.py (revision a211328ef9d13e37b89665aefad97071ada682fb) -+++ b/cobbler/items/distro.py (revision de8bf224cef0040c3d26dd4be009fe2d87434223) -@@ -164,7 +164,10 @@ - if not isinstance(kernel, str): - raise TypeError("kernel was not of type str") - if not utils.find_kernel(kernel): -- raise ValueError("kernel not found: %s" % kernel) -+ raise ValueError( -+ "kernel not found or it does not match with allowed kernel filename pattern [%s]: %s." -+ % (utils._re_kernel.pattern, kernel) -+ ) - self._kernel = kernel - - @property -Index: cobbler/utils.py -=================================================================== -diff --git a/cobbler/utils.py b/cobbler/utils.py ---- a/cobbler/utils.py (revision a211328ef9d13e37b89665aefad97071ada682fb) -+++ b/cobbler/utils.py (revision de8bf224cef0040c3d26dd4be009fe2d87434223) -@@ -69,8 +69,8 @@ - MODULE_CACHE = {} - SIGNATURE_CACHE = {} - --_re_kernel = re.compile(r'(vmlinu[xz]|(kernel|linux(\.img)?)|pxeboot\.n12|wimboot)') --_re_initrd = re.compile(r'(initrd(.*)\.img|ramdisk\.image\.gz|boot\.sdi)') -+_re_kernel = re.compile(r'(vmlinu[xz]|(kernel|linux(\.img)?)|pxeboot\.n12|wimboot|mboot\.c32|.+\.kernel)') -+_re_initrd = re.compile(r'(initrd(.*)\.img|ramdisk\.image\.gz|boot\.sdi|imgpayld\.tgz)') - - - class DHCP(enum.Enum): - diff --git a/cobbler-3.3.3.0+git.5c498dbf.obscpio b/cobbler-3.3.3.0+git.5c498dbf.obscpio deleted file mode 120000 index 3239dde..0000000 --- a/cobbler-3.3.3.0+git.5c498dbf.obscpio +++ /dev/null @@ -1 +0,0 @@ -/ipfs/bafybeidkjmfexv6firaxpxasrme2yp2ahts77horfjnvme5kszr7n5dkde \ No newline at end of file diff --git a/cobbler-3.3.3.obscpio b/cobbler-3.3.3.obscpio new file mode 120000 index 0000000..f6f3ec5 --- /dev/null +++ b/cobbler-3.3.3.obscpio @@ -0,0 +1 @@ +/ipfs/bafybeidxrc337zv5lbzmktwegli7pyznnhhsfljeo4glgoel4xgudlog6q \ No newline at end of file diff --git a/cobbler.changes b/cobbler.changes index 64e7872..e04ec79 100644 --- a/cobbler.changes +++ b/cobbler.changes @@ -1,4 +1,44 @@ ------------------------------------------------------------------- +Wed May 17 15:40:31 UTC 2023 - Pablo Suárez Hernández + +- Fix package building with Sphinx >= 7.0.0 +- Switch packaging from patch based to Git tree based development +- All patches that are being removed in this revision are contained in + the new Git tree. +- Do generate boot menus even if no profiles or systems - only local boot +- Avoid crashing running buildiso in certain conditions. +- Fix settings migration schema to work while upgrading on existing running + Uyuni and SUSE Manager servers running with old Cobbler settings (bsc#1203478) +- Consider case of "next_server" being a hostname during migration + of Cobbler collections. +- Fix problem with "proxy_url_ext" setting being None type. +- Update v2 to v3 migration script to allow migration of collections + that contains settings from Cobbler 2. (bsc#1203478) +- Fix problem for the migration of "autoinstall" collection attribute. +- Fix failing Cobbler tests after upgrading to 3.3.3. +- Fix regression: allow empty string as interface_type value (bsc#1203478) +- Avoid possible override of existing values during migration + of collections to 3.0.0 (bsc#1206160) +- Add new "cobbler-tests-containers" subpackage which contains setup and + configuration files to run Cobbler tests in containers. +- Add missing code for previous patch file around boot_loaders migration. +- Improve Cobbler performance with item cache and threadpool (bsc#1205489) +- Skip collections that are inconsistent instead of crashing (bsc#1205749) +- Items: Fix creation of "default" NetworkInterface (bsc#1206520) +- S390X systems require their kernel options to have a linebreak at + 79 characters (bsc#1207595) +- settings-migration-v1-to-v2.sh will now handle paths with whitespace + correct +- Fix renaming Cobbler items (bsc#1204900, bsc#1209149) +- Fix cobbler buildiso so that the artifact can be booted by EFI firmware. + (bsc#1206060) +- Add input_string_*, input_boolean, input_int functiont to public API + +- Removed: + * backport_complex_xmlrpc_objects_and_logger_spam.patch + * backport_kernel_regex_error_message.patch + +------------------------------------------------------------------- Thu Jul 21 08:52:17 UTC 2022 - Enno Gotthold - Fix issue that a custom kernel with the extension ".kernel" is not diff --git a/cobbler.obsinfo b/cobbler.obsinfo index 4433f05..3866f00 100644 --- a/cobbler.obsinfo +++ b/cobbler.obsinfo @@ -1,4 +1,4 @@ name: cobbler -version: 3.3.3.0+git.5c498dbf -mtime: 1654185693 -commit: 5c498dbf2af6e3782b37605a477759e1aacc16b2 +version: 3.3.3 +mtime: 1684337086 +commit: d6c763f7d66fb7bde900720633c4caa7ee7ccb10 diff --git a/cobbler.spec b/cobbler.spec index d5681c3..64329aa 100644 --- a/cobbler.spec +++ b/cobbler.spec @@ -1,6 +1,7 @@ # # spec file for package cobbler # +# Copyright (c) 2023 SUSE LLC # Copyright (c) 2006 Michael DeHaan # # All modifications and additions to the file contributed by third parties @@ -21,6 +22,7 @@ # - Ubuntu: 18.04 # # If it doesn't build on the Open Build Service (OBS) it's a bug. +# Please submit bugfixes or comments via https://bugs.opensuse.org/ # # Force bash instead of Debian dash @@ -67,7 +69,7 @@ %define apache_group www %define apache_dir /srv/www -%define apache_webconfigdir /etc/apache2/vhosts.d +%define apache_webconfigdir /etc/apache2/conf.d %define apache_mod_wsgi apache2-mod_wsgi-python%{python3_pkgversion} %define tftpboot_dir /srv/tftpboot @@ -151,7 +153,7 @@ %endif Name: cobbler -Version: 3.3.3.0+git.5c498dbf +Version: 3.3.3 Release: 0%{?dist} Summary: Boot server configurator URL: https://cobbler.github.io/ @@ -168,11 +170,6 @@ Group: Development/System License: GPL-2.0-or-later Source: %{name}-%{version}.tar.gz -#################### -# Already merged upstream -Patch0: backport_complex_xmlrpc_objects_and_logger_spam.patch -# Already merged upstream -Patch1: backport_kernel_regex_error_message.patch BuildArch: noarch BuildRequires: git-core @@ -227,6 +224,7 @@ Requires: %{createrepo_pkg} Requires: fence-agents Requires: rsync Requires: xorriso +Requires: dosfstools %{?python_enable_dependency_generator} %if ! (%{defined python_enable_dependency_generator} || %{defined python_disable_dependency_generator}) Requires: %{py3_module_cheetah} @@ -283,10 +281,16 @@ Requires: cobbler = %{version}-%{release} %description tests Unit test files from the Cobbler project +%package tests-containers +Summary: Dockerfiles and scripts to setup testing containers +Requires: cobbler = %{version}-%{release} + +%description tests-containers +Dockerfiles and scripts to setup testing containers + %prep %setup -%autopatch -p1 %if 0%{?suse_version} # Set tftpboot location correctly for SUSE distributions @@ -310,6 +314,7 @@ sed -e "s|/var/lib/tftpboot|%{tftpboot_dir}|g" -i config/cobbler/settings.yaml [ "${TFTPROOT}" != %{tftpboot_dir} ] && echo "ERROR: TFTPROOT: ${TFTPROOT} does not match %{tftpboot_dir}" %py3_build +make man %install . distro_build_configs.sh @@ -419,6 +424,8 @@ chgrp %{apache_group} %{_sysconfdir}/cobbler/settings.yaml %config(noreplace) %{_sysconfdir}/cobbler/import_rsync_whitelist %dir %{_sysconfdir}/cobbler/iso %config(noreplace) %{_sysconfdir}/cobbler/iso/buildiso.template +%config(noreplace) %{_sysconfdir}/cobbler/iso/isolinux_menuentry.template +%config(noreplace) %{_sysconfdir}/cobbler/iso/grub_menuentry.template %config(noreplace) %{_sysconfdir}/cobbler/logging_config.conf %attr(640, root, root) %config(noreplace) %{_sysconfdir}/cobbler/modules.conf %attr(600, root, root) %config(noreplace) %{_sysconfdir}/cobbler/mongodb.conf @@ -486,6 +493,10 @@ chgrp %{apache_group} %{_sysconfdir}/cobbler/settings.yaml %dir %{_datadir}/cobbler/tests %{_datadir}/cobbler/tests/* +%files tests-containers +%dir %{_datadir}/cobbler/docker +%{_datadir}/cobbler/docker/* + %changelog * Thu Dec 19 2019 Neal Gompa - Initial rewrite of packaging