Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package python-ironicclient for openSUSE:Factory checked in at 2022-06-19 21:11:42 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-ironicclient (Old) and /work/SRC/openSUSE:Factory/.python-ironicclient.new.1548 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-ironicclient" Sun Jun 19 21:11:42 2022 rev:23 rq:983768 version:4.8.0 Changes: -------- --- /work/SRC/openSUSE:Factory/python-ironicclient/python-ironicclient.changes 2021-05-10 15:39:35.737511309 +0200 +++ /work/SRC/openSUSE:Factory/.python-ironicclient.new.1548/python-ironicclient.changes 2022-06-19 21:11:59.442226681 +0200 @@ -1,0 +2,20 @@ +Tue Oct 26 22:02:54 UTC 2021 - cloud-de...@suse.de + +- update to version 4.8.0 + - Fix the functional tests + - Fix --fields network_data + - Fix for missing fonts in PDF jobs + - Update master for stable/wallaby + - Add lower-constraints job to current development branch + - Changed minversion in tox to 3.18.0 + - Add Python3 xena unit tests + - Make baremetal --debug actually work + - Add support for 'boot_mode' and 'secure_boot' node resource fields + - Add support for changing 'boot_mode' and 'secure_boot' states + - setup.cfg: Replace dashes with underscores + - Add missing unit tests for provision state commands + - Switch testing to Xena testing runtime + - Update project conundrum related docs + - Include BIOS registry fields in bios setting list command + +------------------------------------------------------------------- Old: ---- python-ironicclient-4.6.1.tar.gz New: ---- python-ironicclient-4.8.0.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-ironicclient.spec ++++++ --- /var/tmp/diff_new_pack.AMM1vs/_old 2022-06-19 21:11:59.878227330 +0200 +++ /var/tmp/diff_new_pack.AMM1vs/_new 2022-06-19 21:11:59.882227336 +0200 @@ -17,13 +17,13 @@ Name: python-ironicclient -Version: 4.6.1 +Version: 4.8.0 Release: 0 Summary: Python API and CLI for OpenStack Ironic License: Apache-2.0 Group: Development/Languages/Python URL: https://docs.openstack.org/python-ironicclient -Source0: https://files.pythonhosted.org/packages/source/p/python-ironicclient/python-ironicclient-4.6.1.tar.gz +Source0: https://files.pythonhosted.org/packages/source/p/python-ironicclient/python-ironicclient-4.8.0.tar.gz BuildRequires: openstack-macros BuildRequires: python3-Babel BuildRequires: python3-PyYAML >= 3.13 @@ -56,7 +56,7 @@ Requires: python3-appdirs >= 1.3.0 Requires: python3-dogpile.cache >= 0.8.0 Requires: python3-jsonschema >= 3.2.0 -Requires: python3-keystoneauth1 >= 3.4.0 +Requires: python3-keystoneauth1 >= 3.11.0 Requires: python3-openstackclient Requires: python3-osc-lib >= 2.0.0 Requires: python3-oslo.i18n @@ -88,13 +88,13 @@ This package contains auto-generated documentation. %prep -%autosetup -p1 -n python-ironicclient-4.6.1 +%autosetup -p1 -n python-ironicclient-4.8.0 %py_req_cleanup %build %{py3_build} -PBR_VERSION=4.6.1 %sphinx_build -b html doc/source doc/build/html +PBR_VERSION=4.8.0 %sphinx_build -b html doc/source doc/build/html # remove the sphinx-build leftovers rm -rf doc/build/html/.{doctrees,buildinfo} ++++++ _service ++++++ --- /var/tmp/diff_new_pack.AMM1vs/_old 2022-06-19 21:11:59.910227377 +0200 +++ /var/tmp/diff_new_pack.AMM1vs/_new 2022-06-19 21:11:59.914227384 +0200 @@ -1,8 +1,8 @@ <services> <service mode="disabled" name="renderspec"> - <param name="input-template">https://git.openstack.org/cgit/openstack/rpm-packaging/plain/openstack/python-ironicclient/python-ironicclient.spec.j2?h=stable/wallaby</param> + <param name="input-template">https://opendev.org/openstack/rpm-packaging/raw/master/openstack/python-ironicclient/python-ironicclient.spec.j2</param> <param name="output-name">python-ironicclient.spec</param> - <param name="requirements">https://opendev.org/openstack/python-ironicclient/raw/branch/stable/wallaby/requirements.txt</param> + <param name="requirements">https://opendev.org/openstack/python-ironicclient/raw/branch/stable/xena/requirements.txt</param> <param name="changelog-email">cloud-de...@suse.de</param> <param name="changelog-provider">gh,openstack,python-ironicclient</param> </service> ++++++ python-ironicclient-4.6.1.tar.gz -> python-ironicclient-4.8.0.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-ironicclient-4.6.1/AUTHORS new/python-ironicclient-4.8.0/AUTHORS --- old/python-ironicclient-4.6.1/AUTHORS 2021-03-12 18:04:50.000000000 +0100 +++ new/python-ironicclient-4.8.0/AUTHORS 2021-08-31 15:09:07.000000000 +0200 @@ -10,7 +10,9 @@ Arne Wiebalck <arne.wieba...@cern.ch> Arun S A G <s...@yahoo-inc.com> Ben Nemec <bne...@redhat.com> +Bob Fournier <bfour...@redhat.com> Brad P. Crochet <b...@redhat.com> +Cenne <cennedee+open...@protonmail.com> ChangBo Guo(gcb) <eric....@easystack.cn> Chaozhe.Chen <chaozhe.c...@easystack.cn> Charles Short <zul...@gmail.com> @@ -134,6 +136,7 @@ Vladyslav Drok <vd...@mirantis.com> Vu Cong Tuan <tua...@vn.fujitsu.com> William Stevenson <will.steven...@sap.com> +XinxinShen <shenxin...@inspur.com> Yang Hongyang <hongyang.y...@easystack.cn> Yolanda Robla <yrobl...@redhat.com> Yuiko Takada <takada-yu...@mxn.nes.nec.co.jp> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-ironicclient-4.6.1/ChangeLog new/python-ironicclient-4.8.0/ChangeLog --- old/python-ironicclient-4.6.1/ChangeLog 2021-03-12 18:04:50.000000000 +0100 +++ new/python-ironicclient-4.8.0/ChangeLog 2021-08-31 15:09:07.000000000 +0200 @@ -1,6 +1,28 @@ CHANGES ======= +4.8.0 +----- + +* Add support for changing 'boot\_mode' and 'secure\_boot' states +* Add lower-constraints job to current development branch +* Include BIOS registry fields in bios setting list command +* Fix for missing fonts in PDF jobs +* Add support for 'boot\_mode' and 'secure\_boot' node resource fields +* Changed minversion in tox to 3.18.0 +* Update project conundrum related docs +* Switch testing to Xena testing runtime + +4.7.0 +----- + +* setup.cfg: Replace dashes with underscores +* Make baremetal --debug actually work +* Fix the functional tests +* Add Python3 xena unit tests +* Update master for stable/wallaby +* Fix --fields network\_data + 4.6.1 ----- @@ -10,6 +32,7 @@ * Clearer error message when unable to parse JSON * Support YAML files wherever JSON files are accepted +* Add missing unit tests for provision state commands * Update minversion of tox * Add 'deploy steps' for provisioning API diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-ironicclient-4.6.1/PKG-INFO new/python-ironicclient-4.8.0/PKG-INFO --- old/python-ironicclient-4.6.1/PKG-INFO 2021-03-12 18:04:51.037501000 +0100 +++ new/python-ironicclient-4.8.0/PKG-INFO 2021-08-31 15:09:07.817825600 +0200 @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: python-ironicclient -Version: 4.6.1 +Version: 4.8.0 Summary: OpenStack Bare Metal Provisioning API Client Library Home-page: https://docs.openstack.org/python-ironicclient/latest/ Author: OpenStack diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-ironicclient-4.6.1/bindep.txt new/python-ironicclient-4.8.0/bindep.txt --- old/python-ironicclient-4.6.1/bindep.txt 1970-01-01 01:00:00.000000000 +0100 +++ new/python-ironicclient-4.8.0/bindep.txt 2021-08-31 15:08:24.000000000 +0200 @@ -0,0 +1,4 @@ +# install fonts missing for PDF job +# see https://bugs.launchpad.net/openstack-i18n/+bug/1935742 +tex-gyre [platform:dpkg doc] + diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-ironicclient-4.6.1/doc/source/contributor/contributing.rst new/python-ironicclient-4.8.0/doc/source/contributor/contributing.rst --- old/python-ironicclient-4.6.1/doc/source/contributor/contributing.rst 2021-03-12 18:03:56.000000000 +0100 +++ new/python-ironicclient-4.8.0/doc/source/contributor/contributing.rst 2021-08-31 15:08:24.000000000 +0200 @@ -7,9 +7,9 @@ If you're interested in contributing to the python-ironicclient project, the following will help get you started. -#openstack-ironic on Freenode IRC Network ------------------------------------------ -There is a very active chat channel at irc://freenode.net/#openstack-ironic. +#openstack-ironic on OFTC IRC Network +------------------------------------- +There is a very active chat channel at irc://irc.oftc.net/#openstack-ironic. This is usually the best place to ask questions and find your way around. IRC stands for Internet Relay Chat and it is a way to chat online in real time. You can ask a question and come back later to read the answer in the diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-ironicclient-4.6.1/ironicclient/common/http.py new/python-ironicclient-4.8.0/ironicclient/common/http.py --- old/python-ironicclient-4.6.1/ironicclient/common/http.py 2021-03-12 18:03:56.000000000 +0100 +++ new/python-ironicclient-4.8.0/ironicclient/common/http.py 2021-08-31 15:08:24.000000000 +0200 @@ -37,7 +37,7 @@ # http://specs.openstack.org/openstack/ironic-specs/specs/kilo/api-microversions.html # noqa # for full details. DEFAULT_VER = '1.9' -LAST_KNOWN_API_VERSION = 69 +LAST_KNOWN_API_VERSION = 76 LATEST_VERSION = '1.{}'.format(LAST_KNOWN_API_VERSION) LOG = logging.getLogger(__name__) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-ironicclient-4.6.1/ironicclient/osc/v1/baremetal_node.py new/python-ironicclient-4.8.0/ironicclient/osc/v1/baremetal_node.py --- old/python-ironicclient-4.6.1/ironicclient/osc/v1/baremetal_node.py 2021-03-12 18:03:56.000000000 +0100 +++ new/python-ironicclient-4.8.0/ironicclient/osc/v1/baremetal_node.py 2021-08-31 15:08:24.000000000 +0200 @@ -242,6 +242,38 @@ return zip(*sorted(info.items())) +class BootmodeSetBaremetalNode(command.Command): + """Set boot mode for baremetal node""" + + log = logging.getLogger(__name__ + ".BootmodeSetBaremetalNode") + + def get_parser(self, prog_name): + parser = super(BootmodeSetBaremetalNode, self).get_parser(prog_name) + + parser.add_argument( + 'node', + metavar='<node>', + help=_("Name or UUID of the node.") + ) + parser.add_argument( + 'boot_mode', + choices=['uefi', 'bios'], + metavar='<boot_mode>', + help=_('The boot mode to set for node (uefi/bios)') + ) + + return parser + + def take_action(self, parsed_args): + self.log.debug("take_action(%s)", parsed_args) + + baremetal_client = self.app.client_manager.baremetal + + baremetal_client.node.set_boot_mode( + parsed_args.node, + parsed_args.boot_mode) + + class CleanBaremetalNode(ProvisionStateWithWait): """Set provision state of baremetal node to 'clean'""" @@ -1086,6 +1118,50 @@ return parser +class SecurebootOnBaremetalNode(command.Command): + """Turn secure boot on""" + + log = logging.getLogger(__name__ + ".SecurebootOnBaremetalNode") + + def get_parser(self, prog_name): + parser = super(SecurebootOnBaremetalNode, self).get_parser(prog_name) + + parser.add_argument( + 'node', + metavar='<node>', + help=_("Name or UUID of the node") + ) + return parser + + def take_action(self, parsed_args): + self.log.debug("take_action(%s)", parsed_args) + + baremetal_client = self.app.client_manager.baremetal + baremetal_client.node.set_secure_boot(parsed_args.node, 'on') + + +class SecurebootOffBaremetalNode(command.Command): + """Turn secure boot off""" + + log = logging.getLogger(__name__ + ".SecurebootOffBaremetalNode") + + def get_parser(self, prog_name): + parser = super(SecurebootOffBaremetalNode, self).get_parser(prog_name) + + parser.add_argument( + 'node', + metavar='<node>', + help=_("Name or UUID of the node") + ) + return parser + + def take_action(self, parsed_args): + self.log.debug("take_action(%s)", parsed_args) + + baremetal_client = self.app.client_manager.baremetal + baremetal_client.node.set_secure_boot(parsed_args.node, 'off') + + class SetBaremetalNode(command.Command): """Set baremetal properties""" @@ -1978,15 +2054,52 @@ metavar='<node>', help=_("Name or UUID of the node") ) + display_group = parser.add_mutually_exclusive_group(required=False) + display_group.add_argument( + '--long', + default=False, + help=_("Show detailed information about the BIOS settings."), + action='store_true') + display_group.add_argument( + '--fields', + nargs='+', + dest='fields', + metavar='<field>', + action='append', + default=[], + choices=res_fields.BIOS_DETAILED_RESOURCE.fields, + help=_("One or more node fields. Only these fields will be " + "fetched from the server. Can not be used when '--long' " + "is specified.")) return parser def take_action(self, parsed_args): self.log.debug("take_action(%s)", parsed_args) labels = res_fields.BIOS_RESOURCE.labels + fields = res_fields.BIOS_RESOURCE.fields + + params = {} + if parsed_args.long: + params['detail'] = parsed_args.long + fields = res_fields.BIOS_DETAILED_RESOURCE.fields + labels = res_fields.BIOS_DETAILED_RESOURCE.labels + elif parsed_args.fields: + params['detail'] = False + fields = itertools.chain.from_iterable(parsed_args.fields) + resource = res_fields.Resource(list(fields)) + fields = resource.fields + labels = resource.labels + params['fields'] = fields + + self.log.debug("params(%s)", params) + baremetal_client = self.app.client_manager.baremetal - settings = baremetal_client.node.list_bios_settings(parsed_args.node) - return (labels, [[s['name'], s['value']] for s in settings]) + settings = baremetal_client.node.list_bios_settings(parsed_args.node, + **params) + + return (labels, + (oscutils.get_dict_properties(s, fields) for s in settings)) class BIOSSettingShowBaremetalNode(command.ShowOne): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-ironicclient-4.6.1/ironicclient/shell.py new/python-ironicclient-4.8.0/ironicclient/shell.py --- old/python-ironicclient-4.6.1/ironicclient/shell.py 2021-03-12 18:03:56.000000000 +0100 +++ new/python-ironicclient-4.8.0/ironicclient/shell.py 2021-08-31 15:08:24.000000000 +0200 @@ -19,6 +19,7 @@ import ironic_inspector_client except ImportError: ironic_inspector_client = None +import openstack from openstack import config as os_config from osc_lib import utils import pbr.version @@ -168,8 +169,25 @@ ) return parser + def _configure_ironic_logging(self): + openstack.enable_logging(debug=self.options.debug) + # NOTE(dtantsur): I wish logging.basicConfig worked.. but it does not. + for name in ('ironicclient', 'ironic_inspector_client'): + logger = logging.getLogger(name) + logger.setLevel( + logging.DEBUG if self.options.debug else logging.WARNING) + # warnings are already configured by something else, only configure + # debug logging for ironic. + if not logger.handlers and self.options.debug: + handler = logging.StreamHandler() + handler.setFormatter(logging.Formatter( + # This is the openstacksdk default value + '%(asctime)s %(levelname)s: %(name)s %(message)s')) + logger.addHandler(handler) + def initialize_app(self, argv): super(App, self).initialize_app(argv) + self._configure_ironic_logging() self.cloud_region = self.config.get_one(argparse=self.options) # Compatibility with OSC self.client_manager = ClientManager(self.cloud_region, self.options) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-ironicclient-4.6.1/ironicclient/tests/functional/osc/v1/base.py new/python-ironicclient-4.8.0/ironicclient/tests/functional/osc/v1/base.py --- old/python-ironicclient-4.6.1/ironicclient/tests/functional/osc/v1/base.py 2021-03-12 18:03:56.000000000 +0100 +++ new/python-ironicclient-4.8.0/ironicclient/tests/functional/osc/v1/base.py 2021-08-31 15:08:24.000000000 +0200 @@ -41,6 +41,18 @@ def construct_cmd(*parts): return ' '.join(str(x) for x in parts) + @staticmethod + def generate_params(argument, params): + """Generate parameters string. + + :param argument: argument + :param params: values passed with argument + """ + parts = [] + for key, value in params.items(): + parts.append('{} {}={}'.format(argument, key, value)) + return ' '.join(parts) + def assert_dict_is_subset(self, expected, actual): """Check if expected keys/values exist in actual response body. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-ironicclient-4.6.1/ironicclient/tests/unit/osc/v1/fakes.py new/python-ironicclient-4.8.0/ironicclient/tests/unit/osc/v1/fakes.py --- old/python-ironicclient-4.6.1/ironicclient/tests/unit/osc/v1/fakes.py 2021-03-12 18:03:56.000000000 +0100 +++ new/python-ironicclient-4.8.0/ironicclient/tests/unit/osc/v1/fakes.py 2021-08-31 15:08:24.000000000 +0200 @@ -152,6 +152,16 @@ BIOS_SETTINGS = [{'name': 'bios_name_1', 'value': 'bios_value_1', 'links': []}, {'name': 'bios_name_2', 'value': 'bios_value_2', 'links': []}] +BIOS_DETAILED_SETTINGS = [{'name': 'SysName', 'value': 'my-system', + 'links': [], 'attribute_type': 'String', + 'min_length': '1', 'max_length': '16'}, + {'name': 'NumCores', 'value': '10', + 'links': [], 'attribute_type': 'Integer', + 'lower_bound': '10', 'upper_bound': '20'}, + {'name': 'ProcVirtualization', 'value': 'Enabled', + 'links': [], 'attribute_type': 'Enumeration', + 'allowable_values': ['Enabled', 'Disabled']}] + baremetal_volume_connector_uuid = 'vvv-cccccc-vvvv' baremetal_volume_connector_type = 'iqn' baremetal_volume_connector_connector_id = 'iqn.2017-01.connector' diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-ironicclient-4.6.1/ironicclient/tests/unit/osc/v1/test_baremetal_node.py new/python-ironicclient-4.8.0/ironicclient/tests/unit/osc/v1/test_baremetal_node.py --- old/python-ironicclient-4.6.1/ironicclient/tests/unit/osc/v1/test_baremetal_node.py 2021-03-12 18:03:56.000000000 +0100 +++ new/python-ironicclient-4.8.0/ironicclient/tests/unit/osc/v1/test_baremetal_node.py 2021-08-31 15:08:24.000000000 +0200 @@ -15,6 +15,7 @@ # import copy +import json from unittest import mock from osc_lib.tests import utils as oscutils @@ -36,6 +37,29 @@ self.baremetal_mock.reset_mock() +class TestAbort(TestBaremetal): + def setUp(self): + super(TestAbort, self).setUp() + + # Get the command object to test + self.cmd = baremetal_node.AbortBaremetalNode(self.app, None) + + def test_abort(self): + arglist = ['node_uuid'] + verifylist = [ + ('node', 'node_uuid'), + ('provision_state', 'abort'), + ] + + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + self.cmd.take_action(parsed_args) + + self.baremetal_mock.node.set_provision_state.assert_called_once_with( + 'node_uuid', 'abort', cleansteps=None, configdrive=None, + deploysteps=None, rescue_password=None) + + class TestAdopt(TestBaremetal): def setUp(self): super(TestAdopt, self).setUp() @@ -109,6 +133,167 @@ poll_interval=2, timeout=0) +class TestClean(TestBaremetal): + def setUp(self): + super(TestClean, self).setUp() + + # Get the command object to test + self.cmd = baremetal_node.CleanBaremetalNode(self.app, None) + + def test_clean_without_steps(self): + arglist = ['node_uuid'] + verifylist = [ + ('node', 'node_uuid'), + ('provision_state', 'clean'), + ] + + self.assertRaises(oscutils.ParserException, self.check_parser, + self.cmd, arglist, verifylist) + + def test_clean_with_steps(self): + steps_dict = { + "clean_steps": [{ + "interface": "raid", + "step": "create_configuration", + "args": {"create_nonroot_volumes": False} + }, { + "interface": "deploy", + "step": "erase_devices" + }] + } + steps_json = json.dumps(steps_dict) + + arglist = ['--clean-steps', steps_json, 'node_uuid'] + verifylist = [ + ('clean_steps', steps_json), + ('provision_state', 'clean'), + ('node', 'node_uuid'), + ] + + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + self.cmd.take_action(parsed_args) + + self.baremetal_mock.node.set_provision_state.assert_called_once_with( + 'node_uuid', 'clean', cleansteps=steps_dict, configdrive=None, + deploysteps=None, rescue_password=None) + + +class TestInspect(TestBaremetal): + def setUp(self): + super(TestInspect, self).setUp() + + # Get the command object to test + self.cmd = baremetal_node.InspectBaremetalNode(self.app, None) + + def test_inspect(self): + arglist = ['node_uuid'] + verifylist = [ + ('node', 'node_uuid'), + ('provision_state', 'inspect'), + ] + + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + self.cmd.take_action(parsed_args) + + self.baremetal_mock.node.set_provision_state.assert_called_once_with( + 'node_uuid', 'inspect', cleansteps=None, configdrive=None, + deploysteps=None, rescue_password=None) + + +class TestManage(TestBaremetal): + def setUp(self): + super(TestManage, self).setUp() + + # Get the command object to test + self.cmd = baremetal_node.ManageBaremetalNode(self.app, None) + + def test_manage(self): + arglist = ['node_uuid'] + verifylist = [ + ('node', 'node_uuid'), + ('provision_state', 'manage'), + ] + + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + self.cmd.take_action(parsed_args) + + self.baremetal_mock.node.set_provision_state.assert_called_once_with( + 'node_uuid', 'manage', cleansteps=None, configdrive=None, + deploysteps=None, rescue_password=None) + + +class TestProvide(TestBaremetal): + def setUp(self): + super(TestProvide, self).setUp() + + # Get the command object to test + self.cmd = baremetal_node.ProvideBaremetalNode(self.app, None) + + def test_provide(self): + arglist = ['node_uuid'] + verifylist = [ + ('node', 'node_uuid'), + ('provision_state', 'provide'), + ] + + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + self.cmd.take_action(parsed_args) + + self.baremetal_mock.node.set_provision_state.assert_called_once_with( + 'node_uuid', 'provide', cleansteps=None, configdrive=None, + deploysteps=None, rescue_password=None) + + +class TestRebuild(TestBaremetal): + def setUp(self): + super(TestRebuild, self).setUp() + + # Get the command object to test + self.cmd = baremetal_node.RebuildBaremetalNode(self.app, None) + + def test_rebuild(self): + arglist = ['node_uuid'] + verifylist = [ + ('node', 'node_uuid'), + ('provision_state', 'rebuild'), + ] + + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + self.cmd.take_action(parsed_args) + + self.baremetal_mock.node.set_provision_state.assert_called_once_with( + 'node_uuid', 'rebuild', cleansteps=None, configdrive=None, + deploysteps=None, rescue_password=None) + + +class TestUndeploy(TestBaremetal): + def setUp(self): + super(TestUndeploy, self).setUp() + + # Get the command object to test + self.cmd = baremetal_node.UndeployBaremetalNode(self.app, None) + + def test_undeploy(self): + arglist = ['node_uuid'] + verifylist = [ + ('node', 'node_uuid'), + ('provision_state', 'deleted'), + ] + + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + self.cmd.take_action(parsed_args) + + self.baremetal_mock.node.set_provision_state.assert_called_once_with( + 'node_uuid', 'deleted', cleansteps=None, configdrive=None, + deploysteps=None, rescue_password=None) + + class TestBootdeviceSet(TestBaremetal): def setUp(self): super(TestBootdeviceSet, self).setUp() @@ -255,6 +440,69 @@ 'node_uuid') +class TestSecurebootOff(TestBaremetal): + def setUp(self): + super(TestSecurebootOff, self).setUp() + + # Get the command object to test + self.cmd = baremetal_node.SecurebootOffBaremetalNode(self.app, None) + + def test_secure_boot_off(self): + arglist = ['node_uuid'] + verifylist = [('node', 'node_uuid')] + + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + self.cmd.take_action(parsed_args) + + self.baremetal_mock.node.set_secure_boot.assert_called_once_with( + 'node_uuid', 'off') + + +class TestSecurebootOn(TestBaremetal): + def setUp(self): + super(TestSecurebootOn, self).setUp() + + # Get the command object to test + self.cmd = baremetal_node.SecurebootOnBaremetalNode(self.app, None) + + def test_console_enable(self): + arglist = ['node_uuid'] + verifylist = [('node', 'node_uuid')] + + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + self.cmd.take_action(parsed_args) + + self.baremetal_mock.node.set_secure_boot.assert_called_once_with( + 'node_uuid', 'on') + + +class TestBootmodeSet(TestBaremetal): + def setUp(self): + super(TestBootmodeSet, self).setUp() + + # Get the command object to test + self.cmd = baremetal_node.BootmodeSetBaremetalNode(self.app, None) + + def test_baremetal_boot_mode_bios(self): + arglist = ['node_uuid', + 'bios'] + verifylist = [ + ('node', 'node_uuid'), + ('boot_mode', 'bios'), + ] + + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + self.cmd.take_action(parsed_args) + + self.baremetal_mock.node.set_boot_mode.assert_called_once_with( + 'node_uuid', + 'bios' + ) + + class TestBaremetalCreate(TestBaremetal): def setUp(self): super(TestBaremetalCreate, self).setUp() @@ -635,6 +883,7 @@ 'Automated Clean', 'BIOS Interface', 'Boot Interface', + 'Boot Mode', 'Chassis UUID', 'Clean Step', 'Conductor', @@ -662,6 +911,7 @@ 'Maintenance Reason', 'Management Interface', 'Name', + 'Network Configuration', 'Network Interface', 'Owner', 'Power Interface', @@ -677,6 +927,7 @@ 'Resource Class', 'Retired', 'Retired Reason', + 'Secure Boot', 'Storage Interface', 'Target Power State', 'Target Provision State', @@ -3843,14 +4094,76 @@ parsed_args = self.check_parser(self.cmd, arglist, verifylist) - data = self.cmd.take_action(parsed_args) + columns, data = self.cmd.take_action(parsed_args) self.baremetal_mock.node.list_bios_settings.assert_called_once_with( 'node_uuid') - expected_data = (('BIOS setting name', 'BIOS setting value'), - [[s['name'], s['value']] - for s in baremetal_fakes.BIOS_SETTINGS]) - self.assertEqual(expected_data, data) + expected_columns = ('BIOS setting name', 'BIOS setting value') + self.assertEqual(expected_columns, columns) + + expected_data = ([(s['name'], s['value']) + for s in baremetal_fakes.BIOS_SETTINGS]) + self.assertEqual(tuple(expected_data), tuple(data)) + + def test_baremetal_list_bios_setting_long(self): + verifylist = [ + ('long', True), + ] + + arglist = ['node_uuid', '--long'] + verifylist = [('node', 'node_uuid'), ('long', True)] + + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + self.baremetal_mock.node.list_bios_settings.return_value = ( + baremetal_fakes.BIOS_DETAILED_SETTINGS) + + columns, data = self.cmd.take_action(parsed_args) + + kwargs = { + 'detail': True, + } + + self.baremetal_mock.node.list_bios_settings.assert_called_once_with( + 'node_uuid', **kwargs) + expected_columns = ('Name', 'Value', 'Attribute Type', + 'Allowable Values', 'Lower Bound', + 'Minimum Length', 'Maximum Length', 'Read Only', + 'Reset Required', 'Unique', 'Upper Bound') + self.assertEqual(expected_columns, columns) + + expected_data = (('SysName', 'my-system', 'String', '', '', '1', '16', + '', '', '', ''), + ('NumCores', '10', 'Integer', '', '10', '', '', '', + '', '', '20'), + ('ProcVirtualization', 'Enabled', + 'Enumeration', ['Enabled', 'Disabled'], '', '', '', + '', '', '', '')) + self.assertEqual(expected_data, tuple(data)) + + def test_baremetal_list_bios_setting_fields(self): + + arglist = ['node_uuid', '--fields', 'name', 'attribute_type'] + verifylist = [ + ('fields', [['name', 'attribute_type']]), + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + self.baremetal_mock.node.list_bios_settings.return_value = ( + baremetal_fakes.BIOS_DETAILED_SETTINGS) + + columns, data = self.cmd.take_action(parsed_args) + self.assertNotIn('Value', columns) + self.assertIn('Name', columns) + self.assertIn('Attribute Type', columns) + + kwargs = { + 'detail': False, + 'fields': ('name', 'attribute_type'), + } + + self.baremetal_mock.node.list_bios_settings.assert_called_with( + 'node_uuid', **kwargs) class TestBIOSSettingShow(TestBaremetal): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-ironicclient-4.6.1/ironicclient/tests/unit/v1/test_node.py new/python-ironicclient-4.8.0/ironicclient/tests/unit/v1/test_node.py --- old/python-ironicclient-4.6.1/ironicclient/tests/unit/v1/test_node.py 2021-03-12 18:03:56.000000000 +0100 +++ new/python-ironicclient-4.8.0/ironicclient/tests/unit/v1/test_node.py 2021-08-31 15:08:24.000000000 +0200 @@ -86,6 +86,8 @@ NODE_STATES = {"last_error": None, "power_state": "power on", + "boot_mode": "fake-efi", + "secure_boot": False, "provision_state": "active", "target_power_state": None, "target_provision_state": None} @@ -410,6 +412,13 @@ None, ), }, + '/v1/nodes/%s/states/boot_mode' % NODE1['uuid']: + { + 'PUT': ( + {}, + None, + ), + }, '/v1/nodes/%s/states/power' % NODE1['uuid']: { 'PUT': ( @@ -417,6 +426,13 @@ POWER_STATE, ), }, + '/v1/nodes/%s/states/secure_boot' % NODE1['uuid']: + { + 'PUT': ( + {}, + None, + ), + }, '/v1/nodes/%s/validate' % NODE1['uuid']: { 'GET': ( @@ -1450,6 +1466,53 @@ self.mgr.set_power_state, NODE1['uuid'], 'off', soft=False, timeout='a') + def test_node_set_boot_mode_bios(self): + target_state = 'bios' + self.mgr.set_boot_mode(NODE1['uuid'], target_state) + body = {'target': target_state} + expect = [ + ('PUT', '/v1/nodes/%s/states/boot_mode' % NODE1['uuid'], {}, body), + ] + self.assertEqual(expect, self.api.calls) + + def test_node_set_boot_mode_invalid(self): + self.assertRaises(ValueError, self.mgr.set_boot_mode, + NODE1['uuid'], 'ancient-bios') + + def test_node_set_secure_boot_bool(self): + secure_boot = self.mgr.set_secure_boot(NODE1['uuid'], True) + body = {'target': True} + expect = [ + ('PUT', '/v1/nodes/%s/states/secure_boot' % NODE1['uuid'], + {}, body), + ] + self.assertEqual(expect, self.api.calls) + self.assertIsNone(secure_boot) + + def test_node_set_secure_boot_on(self): + secure_boot = self.mgr.set_secure_boot(NODE1['uuid'], 'on') + body = {'target': True} + expect = [ + ('PUT', '/v1/nodes/%s/states/secure_boot' % NODE1['uuid'], + {}, body), + ] + self.assertEqual(expect, self.api.calls) + self.assertIsNone(secure_boot) + + def test_node_set_secure_boot_off(self): + secure_boot = self.mgr.set_secure_boot(NODE1['uuid'], 'off') + body = {'target': False} + expect = [ + ('PUT', '/v1/nodes/%s/states/secure_boot' % NODE1['uuid'], + {}, body), + ] + self.assertEqual(expect, self.api.calls) + self.assertIsNone(secure_boot) + + def test_node_set_secure_boot_bad(self): + self.assertRaises(exc.InvalidAttribute, self.mgr.set_secure_boot, + NODE1['uuid'], 'band') + def test_set_target_raid_config(self): self.mgr.set_target_raid_config( NODE1['uuid'], {'fake': 'config'}) @@ -1606,8 +1669,9 @@ ('GET', '/v1/nodes/%s/states' % NODE1['uuid'], {}, None), ] self.assertEqual(expect, self.api.calls) - expected_fields = ['last_error', 'power_state', 'provision_state', - 'target_power_state', 'target_provision_state'] + expected_fields = ['boot_mode', 'last_error', 'power_state', + 'provision_state', 'target_power_state', + 'target_provision_state', 'secure_boot'] self.assertEqual(sorted(expected_fields), sorted(states.to_dict().keys())) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-ironicclient-4.6.1/ironicclient/v1/node.py new/python-ironicclient-4.8.0/ironicclient/v1/node.py --- old/python-ironicclient-4.6.1/ironicclient/v1/node.py 2021-03-12 18:03:56.000000000 +0100 +++ new/python-ironicclient-4.8.0/ironicclient/v1/node.py 2021-08-31 15:08:24.000000000 +0200 @@ -590,6 +590,64 @@ os_ironic_api_version=os_ironic_api_version, global_request_id=global_request_id) + def set_boot_mode(self, node_id, state, + os_ironic_api_version=None, global_request_id=None): + """Sets boot mode for a node. + + :param node_id: Node identifier + :param state: One of target boot modes, 'uefi' or 'bios' + :param os_ironic_api_version: String version (e.g. "1.76") to use for + the request. If not specified, the client's default is used. + :param global_request_id: String containing global request ID header + value (in form "req-<UUID>") to use for the request. + + :raises: ValueError if boot mode is not one of 'uefi' / 'bios' + :returns: The status of the request + """ + if state not in ('uefi', 'bios'): + raise ValueError( + _("Valid boot modes are 'uefi' or 'bios'")) + + path = "%s/states/boot_mode" % node_id + target = state + body = {'target': target} + + return self.update(path, body, http_method='PUT', + os_ironic_api_version=os_ironic_api_version, + global_request_id=global_request_id) + + def set_secure_boot(self, node_id, state, + os_ironic_api_version=None, global_request_id=None): + """Set the secure boot state for the node. + + :param node_id: The UUID of the node. + :param state: the secure boot state; either a Boolean or a string + representation of a Boolean (eg, 'true', 'on', 'false', + 'off'). True to turn secure boot on; False + to turn secure boot off. + :param os_ironic_api_version: String version (e.g. "1.76") to use for + the request. If not specified, the client's default is used. + :param global_request_id: String containing global request ID header + value (in form "req-<UUID>") to use for the request. + + :raises: InvalidAttribute if state is an invalid string (that doesn't + represent a Boolean). + """ + if isinstance(state, bool): + target = state + else: + try: + target = strutils.bool_from_string(state, strict=True) + except ValueError as e: + raise exc.InvalidAttribute(_("Argument 'state': %(err)s") % + {'err': e}) + path = "%s/states/secure_boot" % node_id + body = {'target': target} + + return self.update(path, body, http_method='PUT', + os_ironic_api_version=os_ironic_api_version, + global_request_id=global_request_id) + def set_target_raid_config( self, node_ident, target_raid_config, os_ironic_api_version=None, global_request_id=None): @@ -847,8 +905,8 @@ path, os_ironic_api_version=os_ironic_api_version, global_request_id=global_request_id).get(name) - def list_bios_settings(self, node_ident, os_ironic_api_version=None, - global_request_id=None): + def list_bios_settings(self, node_ident, detail=False, fields=None, + os_ironic_api_version=None, global_request_id=None): """List all BIOS settings from a node. :param node_ident: node UUID or name. @@ -856,8 +914,23 @@ the request. If not specified, the client's default is used. :param global_request_id: String containing global request ID header value (in form "req-<UUID>") to use for the request. + :param detail: Optional, boolean whether to return detailed information + about bios settings. + :param fields: Optional, a list with a specified set of fields + of the resource to be returned. Can not be used + when 'detail' is set. + """ + if detail and fields: + raise exc.InvalidAttribute(_("Can't fetch a subset of fields " + "with 'detail' set")) + + filters = utils.common_filters(detail=detail, fields=fields) path = "%s/bios" % node_ident + + if filters: + path += '?' + '&'.join(filters) + return self._list_primitives( self._path(path), 'bios', os_ironic_api_version=os_ironic_api_version, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-ironicclient-4.6.1/ironicclient/v1/resource_fields.py new/python-ironicclient-4.8.0/ironicclient/v1/resource_fields.py --- old/python-ironicclient-4.6.1/ironicclient/v1/resource_fields.py 2021-03-12 18:03:56.000000000 +0100 +++ new/python-ironicclient-4.8.0/ironicclient/v1/resource_fields.py 2021-08-31 15:08:24.000000000 +0200 @@ -34,12 +34,13 @@ 'address': 'Address', 'alive': 'Alive', 'allocation_uuid': 'Allocation UUID', + 'allowable_values': 'Allowable Values', 'async': 'Async', + 'attribute_type': 'Attribute Type', 'automated_clean': 'Automated Clean', 'attach': 'Response is attachment', - 'bios_name': 'BIOS setting name', - 'bios_value': 'BIOS setting value', 'boot_index': 'Boot Index', + 'boot_mode': 'Boot Mode', 'candidate_nodes': 'Candidate Nodes', 'chassis_uuid': 'Chassis UUID', 'clean_step': 'Clean Step', @@ -88,9 +89,12 @@ 'internal_info': 'Internal Info', 'last_error': 'Last Error', 'lessee': 'Lessee', + 'lower_bound': 'Lower Bound', 'maintenance': 'Maintenance', 'maintenance_reason': 'Maintenance Reason', + 'max_length': 'Maximum Length', 'fault': 'Fault', + 'min_length': 'Minimum Length', 'mode': 'Mode', 'name': 'Name', 'network_data': 'Network Configuration', @@ -103,10 +107,13 @@ 'provision_state': 'Provisioning State', 'provision_updated_at': 'Provision Updated At', 'raid_config': 'Current RAID configuration', + 'read_only': 'Read Only', + 'reset_required': 'Reset Required', 'reservation': 'Reservation', 'resource_class': 'Resource Class', 'retired': 'Retired', 'retired_reason': 'Retired Reason', + 'secure_boot': 'Secure Boot', 'state': 'State', 'steps': 'Steps', 'target_power_state': 'Target Power State', @@ -116,6 +123,7 @@ 'type': 'Type', 'updated_at': 'Updated At', 'uuid': 'UUID', + 'value': 'Value', 'volume_id': 'Volume ID', 'volume_type': 'Driver Volume Type', 'local_link_connection': 'Local Link Connection', @@ -132,6 +140,8 @@ 'raid_interface': 'RAID Interface', 'rescue_interface': 'Rescue Interface', 'storage_interface': 'Storage Interface', + 'unique': 'Unique', + 'upper_bound': 'Upper Bound', 'vendor_interface': 'Vendor Interface', 'standalone_ports_supported': 'Standalone Ports Supported', 'physical_network': 'Physical Network', @@ -223,6 +233,7 @@ 'automated_clean', 'bios_interface', 'boot_interface', + 'boot_mode', 'chassis_uuid', 'clean_step', 'conductor', @@ -250,6 +261,7 @@ 'maintenance_reason', 'management_interface', 'name', + 'network_data', 'network_interface', 'owner', 'power_interface', @@ -265,6 +277,7 @@ 'resource_class', 'retired', 'retired_reason', + 'secure_boot', 'storage_interface', 'target_power_state', 'target_provision_state', @@ -376,7 +389,24 @@ ) BIOS_RESOURCE = Resource( - ['bios_name', 'bios_value'], + ['name', 'value'], + override_labels={'name': 'BIOS setting name', + 'value': 'BIOS setting value'} +) + +BIOS_DETAILED_RESOURCE = Resource( + ['name', + 'value', + 'attribute_type', + 'allowable_values', + 'lower_bound', + 'min_length', + 'max_length', + 'read_only', + 'reset_required', + 'unique', + 'upper_bound' + ], ) # Drivers diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-ironicclient-4.6.1/lower-constraints.txt new/python-ironicclient-4.8.0/lower-constraints.txt --- old/python-ironicclient-4.6.1/lower-constraints.txt 1970-01-01 01:00:00.000000000 +0100 +++ new/python-ironicclient-4.8.0/lower-constraints.txt 2021-08-31 15:08:24.000000000 +0200 @@ -0,0 +1,25 @@ +PyYAML==3.13 +appdirs==1.3.0 +cliff==2.8.0 +coverage==4.0 +ddt==1.0.1 +dogpile.cache==0.8.0 +fixtures==3.0.0 +jsonschema==3.2.0 +keystoneauth1==3.11.0 +openstacksdk==0.18.0 +osc-lib==2.0.0 +oslo.config==6.3.0 +oslo.log==3.36.0 +oslo.utils==3.33.0 +oslotest==3.2.0 +pbr==2.0.0 +python-cinderclient==7.2.1 +python-novaclient==9.0.0 +python-openstackclient==3.12.0 +requests-mock==1.2.0 +requests==2.14.2 +stestr==1.0.0 +stevedore==1.20.0 +tempest==25.0.0 +testtools==2.2.0 \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-ironicclient-4.6.1/python_ironicclient.egg-info/PKG-INFO new/python-ironicclient-4.8.0/python_ironicclient.egg-info/PKG-INFO --- old/python-ironicclient-4.6.1/python_ironicclient.egg-info/PKG-INFO 2021-03-12 18:04:50.000000000 +0100 +++ new/python-ironicclient-4.8.0/python_ironicclient.egg-info/PKG-INFO 2021-08-31 15:09:07.000000000 +0200 @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: python-ironicclient -Version: 4.6.1 +Version: 4.8.0 Summary: OpenStack Bare Metal Provisioning API Client Library Home-page: https://docs.openstack.org/python-ironicclient/latest/ Author: OpenStack diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-ironicclient-4.6.1/python_ironicclient.egg-info/SOURCES.txt new/python-ironicclient-4.8.0/python_ironicclient.egg-info/SOURCES.txt --- old/python-ironicclient-4.6.1/python_ironicclient.egg-info/SOURCES.txt 2021-03-12 18:04:50.000000000 +0100 +++ new/python-ironicclient-4.8.0/python_ironicclient.egg-info/SOURCES.txt 2021-08-31 15:09:07.000000000 +0200 @@ -5,6 +5,8 @@ ChangeLog LICENSE README.rst +bindep.txt +lower-constraints.txt requirements.txt setup.cfg setup.py @@ -144,6 +146,7 @@ releasenotes/notes/SHA1-hash-auth-token-f8dce46f854c002c.yaml releasenotes/notes/accept-valid_interfaces-3b8f5e3e362e04cd.yaml releasenotes/notes/add-allocation-owner-0c6daad4ebfea5e6.yaml +releasenotes/notes/add-bios-registry-in-list-21974873f146aff7.yaml releasenotes/notes/add-chassis_uuid-removal-possibility-5bc0bc3a7953eaa5.yaml releasenotes/notes/add-conductor-cli-233249ebc9d5a5f3.yaml releasenotes/notes/add-create-command-3df5efbbecc33276.yaml @@ -155,6 +158,8 @@ releasenotes/notes/add-network-data-node-attr-81dec9cecb7491b9.yaml releasenotes/notes/add-neutron-integration-fields-cee7596c49722de6.yaml releasenotes/notes/add-no-retired-opt-403bb5e466e4facb.yaml +releasenotes/notes/add-node-boot-mode-08ac768649a2fc93.yaml +releasenotes/notes/add-node-boot-mode-set-9746b45aa3f80fe8.yaml releasenotes/notes/add-node-description-support-6efd0882eaa0c788.yaml releasenotes/notes/add-node-lessee-c36409eb0415f75d.yaml releasenotes/notes/add-node-owner-c2dce5a6075ce2b7.yaml @@ -189,6 +194,7 @@ releasenotes/notes/conductor-group-9cfab3756aa108e4.yaml releasenotes/notes/configdrive-7bd2b67830691b2e.yaml releasenotes/notes/continue-del-next-node-8827e67e1c41a0a5.yaml +releasenotes/notes/debug-e9dd680d783fa4b6.yaml releasenotes/notes/deploy-templates-df354ce825b00430.yaml releasenotes/notes/deprecate-http-client-8d664e5ec50ec403.yaml releasenotes/notes/deprecate-ironic-cli-686b7a238ddf3e25.yaml @@ -218,6 +224,7 @@ releasenotes/notes/manual-clean-09f6b49df7d2513f.yaml releasenotes/notes/missing-session-cc11e62dc966b4e0.yaml releasenotes/notes/negative-wrap-fix-4197e91b2ecfb722.yaml +releasenotes/notes/network_data-c48b3878a5b04df5.yaml releasenotes/notes/no-automated-clean-0e437581ded44eb3.yaml releasenotes/notes/no-osc-requirement-411f25fd10f18caa.yaml releasenotes/notes/no-resource-attributeerror-d0cb327abab7dcc0.yaml @@ -298,6 +305,7 @@ releasenotes/source/unreleased.rst releasenotes/source/ussuri.rst releasenotes/source/victoria.rst +releasenotes/source/wallaby.rst releasenotes/source/_static/.placeholder releasenotes/source/_templates/.placeholder tools/__init__.py diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-ironicclient-4.6.1/python_ironicclient.egg-info/entry_points.txt new/python-ironicclient-4.8.0/python_ironicclient.egg-info/entry_points.txt --- old/python-ironicclient-4.6.1/python_ironicclient.egg-info/entry_points.txt 2021-03-12 18:04:50.000000000 +0100 +++ new/python-ironicclient-4.8.0/python_ironicclient.egg-info/entry_points.txt 2021-08-31 15:09:07.000000000 +0200 @@ -36,6 +36,7 @@ baremetal_node_bios_setting_show = ironicclient.osc.v1.baremetal_node:BIOSSettingShowBaremetalNode baremetal_node_boot_device_set = ironicclient.osc.v1.baremetal_node:BootdeviceSetBaremetalNode baremetal_node_boot_device_show = ironicclient.osc.v1.baremetal_node:BootdeviceShowBaremetalNode +baremetal_node_boot_mode_set = ironicclient.osc.v1.baremetal_node:BootmodeSetBaremetalNode baremetal_node_clean = ironicclient.osc.v1.baremetal_node:CleanBaremetalNode baremetal_node_console_disable = ironicclient.osc.v1.baremetal_node:ConsoleDisableBaremetalNode baremetal_node_console_enable = ironicclient.osc.v1.baremetal_node:ConsoleEnableBaremetalNode @@ -58,6 +59,8 @@ baremetal_node_rebuild = ironicclient.osc.v1.baremetal_node:RebuildBaremetalNode baremetal_node_remove_trait = ironicclient.osc.v1.baremetal_node:RemoveTraitBaremetalNode baremetal_node_rescue = ironicclient.osc.v1.baremetal_node:RescueBaremetalNode +baremetal_node_secure_boot_off = ironicclient.osc.v1.baremetal_node:SecurebootOffBaremetalNode +baremetal_node_secure_boot_on = ironicclient.osc.v1.baremetal_node:SecurebootOnBaremetalNode baremetal_node_set = ironicclient.osc.v1.baremetal_node:SetBaremetalNode baremetal_node_show = ironicclient.osc.v1.baremetal_node:ShowBaremetalNode baremetal_node_trait_list = ironicclient.osc.v1.baremetal_node:ListTraitsBaremetalNode diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-ironicclient-4.6.1/python_ironicclient.egg-info/pbr.json new/python-ironicclient-4.8.0/python_ironicclient.egg-info/pbr.json --- old/python-ironicclient-4.6.1/python_ironicclient.egg-info/pbr.json 2021-03-12 18:04:50.000000000 +0100 +++ new/python-ironicclient-4.8.0/python_ironicclient.egg-info/pbr.json 2021-08-31 15:09:07.000000000 +0200 @@ -1 +1 @@ -{"git_version": "59ffddd", "is_release": true} \ No newline at end of file +{"git_version": "b5df386", "is_release": true} \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-ironicclient-4.6.1/python_ironicclient.egg-info/requires.txt new/python-ironicclient-4.8.0/python_ironicclient.egg-info/requires.txt --- old/python-ironicclient-4.6.1/python_ironicclient.egg-info/requires.txt 2021-03-12 18:04:50.000000000 +0100 +++ new/python-ironicclient-4.8.0/python_ironicclient.egg-info/requires.txt 2021-08-31 15:09:07.000000000 +0200 @@ -3,7 +3,7 @@ cliff!=2.9.0,>=2.8.0 dogpile.cache>=0.8.0 jsonschema>=3.2.0 -keystoneauth1>=3.4.0 +keystoneauth1>=3.11.0 openstacksdk>=0.18.0 osc-lib>=2.0.0 oslo.utils>=3.33.0 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-ironicclient-4.6.1/releasenotes/notes/add-bios-registry-in-list-21974873f146aff7.yaml new/python-ironicclient-4.8.0/releasenotes/notes/add-bios-registry-in-list-21974873f146aff7.yaml --- old/python-ironicclient-4.6.1/releasenotes/notes/add-bios-registry-in-list-21974873f146aff7.yaml 1970-01-01 01:00:00.000000000 +0100 +++ new/python-ironicclient-4.8.0/releasenotes/notes/add-bios-registry-in-list-21974873f146aff7.yaml 2021-08-31 15:08:24.000000000 +0200 @@ -0,0 +1,8 @@ +--- +features: + - | + Adds new params to the ``baremetal node bios setting list`` command to + include support for the BIOS registry. The ``--long`` option will + retrieve and display the additonal BIOS registry fields, the ``--fields`` + option will retrieve and display selected fields. The ``baremetal node + bios setting show`` includes these fields by default with no changes. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-ironicclient-4.6.1/releasenotes/notes/add-node-boot-mode-08ac768649a2fc93.yaml new/python-ironicclient-4.8.0/releasenotes/notes/add-node-boot-mode-08ac768649a2fc93.yaml --- old/python-ironicclient-4.6.1/releasenotes/notes/add-node-boot-mode-08ac768649a2fc93.yaml 1970-01-01 01:00:00.000000000 +0100 +++ new/python-ironicclient-4.8.0/releasenotes/notes/add-node-boot-mode-08ac768649a2fc93.yaml 2021-08-31 15:08:24.000000000 +0200 @@ -0,0 +1,5 @@ +--- +features: + - | + Adds support to display node fields ``boot_mode`` and ``secure_boot`` + which are introduced in API 1.75. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-ironicclient-4.6.1/releasenotes/notes/add-node-boot-mode-set-9746b45aa3f80fe8.yaml new/python-ironicclient-4.8.0/releasenotes/notes/add-node-boot-mode-set-9746b45aa3f80fe8.yaml --- old/python-ironicclient-4.6.1/releasenotes/notes/add-node-boot-mode-set-9746b45aa3f80fe8.yaml 1970-01-01 01:00:00.000000000 +0100 +++ new/python-ironicclient-4.8.0/releasenotes/notes/add-node-boot-mode-set-9746b45aa3f80fe8.yaml 2021-08-31 15:08:24.000000000 +0200 @@ -0,0 +1,5 @@ +--- +features: + - | + Adds support for changing node states ``boot_mode`` and ``secure_boot`` + in sync with functionality introduced in API 1.76. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-ironicclient-4.6.1/releasenotes/notes/debug-e9dd680d783fa4b6.yaml new/python-ironicclient-4.8.0/releasenotes/notes/debug-e9dd680d783fa4b6.yaml --- old/python-ironicclient-4.6.1/releasenotes/notes/debug-e9dd680d783fa4b6.yaml 1970-01-01 01:00:00.000000000 +0100 +++ new/python-ironicclient-4.8.0/releasenotes/notes/debug-e9dd680d783fa4b6.yaml 2021-08-31 15:08:24.000000000 +0200 @@ -0,0 +1,5 @@ +--- +fixes: + - | + The ``--debug`` option now works correctly with the built-in ``baremetal`` + command line tool. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-ironicclient-4.6.1/releasenotes/notes/network_data-c48b3878a5b04df5.yaml new/python-ironicclient-4.8.0/releasenotes/notes/network_data-c48b3878a5b04df5.yaml --- old/python-ironicclient-4.6.1/releasenotes/notes/network_data-c48b3878a5b04df5.yaml 1970-01-01 01:00:00.000000000 +0100 +++ new/python-ironicclient-4.8.0/releasenotes/notes/network_data-c48b3878a5b04df5.yaml 2021-08-31 15:08:24.000000000 +0200 @@ -0,0 +1,4 @@ +--- +fixes: + - | + Fixes using ``network_data`` with the ``--fields`` parameter. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-ironicclient-4.6.1/releasenotes/source/index.rst new/python-ironicclient-4.8.0/releasenotes/source/index.rst --- old/python-ironicclient-4.6.1/releasenotes/source/index.rst 2021-03-12 18:03:56.000000000 +0100 +++ new/python-ironicclient-4.8.0/releasenotes/source/index.rst 2021-08-31 15:08:24.000000000 +0200 @@ -6,6 +6,7 @@ :maxdepth: 1 unreleased + wallaby victoria ussuri train diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-ironicclient-4.6.1/releasenotes/source/wallaby.rst new/python-ironicclient-4.8.0/releasenotes/source/wallaby.rst --- old/python-ironicclient-4.6.1/releasenotes/source/wallaby.rst 1970-01-01 01:00:00.000000000 +0100 +++ new/python-ironicclient-4.8.0/releasenotes/source/wallaby.rst 2021-08-31 15:08:24.000000000 +0200 @@ -0,0 +1,6 @@ +============================ +Wallaby Series Release Notes +============================ + +.. release-notes:: + :branch: stable/wallaby diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-ironicclient-4.6.1/requirements.txt new/python-ironicclient-4.8.0/requirements.txt --- old/python-ironicclient-4.6.1/requirements.txt 2021-03-12 18:03:56.000000000 +0100 +++ new/python-ironicclient-4.8.0/requirements.txt 2021-08-31 15:08:24.000000000 +0200 @@ -6,7 +6,7 @@ cliff!=2.9.0,>=2.8.0 # Apache-2.0 dogpile.cache>=0.8.0 # BSD jsonschema>=3.2.0 # MIT -keystoneauth1>=3.4.0 # Apache-2.0 +keystoneauth1>=3.11.0 # Apache-2.0 openstacksdk>=0.18.0 # Apache-2.0 osc-lib>=2.0.0 # Apache-2.0 oslo.utils>=3.33.0 # Apache-2.0 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-ironicclient-4.6.1/setup.cfg new/python-ironicclient-4.8.0/setup.cfg --- old/python-ironicclient-4.6.1/setup.cfg 2021-03-12 18:04:51.041501000 +0100 +++ new/python-ironicclient-4.8.0/setup.cfg 2021-08-31 15:09:07.817825600 +0200 @@ -1,11 +1,11 @@ [metadata] name = python-ironicclient summary = OpenStack Bare Metal Provisioning API Client Library -description-file = README.rst +description_file = README.rst author = OpenStack -author-email = openstack-disc...@lists.openstack.org -home-page = https://docs.openstack.org/python-ironicclient/latest/ -python-requires = >=3.6 +author_email = openstack-disc...@lists.openstack.org +home_page = https://docs.openstack.org/python-ironicclient/latest/ +python_requires = >=3.6 classifier = Environment :: OpenStack Intended Audience :: Information Technology @@ -61,6 +61,7 @@ baremetal_node_bios_setting_show = ironicclient.osc.v1.baremetal_node:BIOSSettingShowBaremetalNode baremetal_node_boot_device_set = ironicclient.osc.v1.baremetal_node:BootdeviceSetBaremetalNode baremetal_node_boot_device_show = ironicclient.osc.v1.baremetal_node:BootdeviceShowBaremetalNode + baremetal_node_boot_mode_set = ironicclient.osc.v1.baremetal_node:BootmodeSetBaremetalNode baremetal_node_clean = ironicclient.osc.v1.baremetal_node:CleanBaremetalNode baremetal_node_console_disable = ironicclient.osc.v1.baremetal_node:ConsoleDisableBaremetalNode baremetal_node_console_enable = ironicclient.osc.v1.baremetal_node:ConsoleEnableBaremetalNode @@ -82,6 +83,8 @@ baremetal_node_rebuild = ironicclient.osc.v1.baremetal_node:RebuildBaremetalNode baremetal_node_remove_trait = ironicclient.osc.v1.baremetal_node:RemoveTraitBaremetalNode baremetal_node_rescue = ironicclient.osc.v1.baremetal_node:RescueBaremetalNode + baremetal_node_secure_boot_on = ironicclient.osc.v1.baremetal_node:SecurebootOnBaremetalNode + baremetal_node_secure_boot_off = ironicclient.osc.v1.baremetal_node:SecurebootOffBaremetalNode baremetal_node_set = ironicclient.osc.v1.baremetal_node:SetBaremetalNode baremetal_node_show = ironicclient.osc.v1.baremetal_node:ShowBaremetalNode baremetal_node_trait_list = ironicclient.osc.v1.baremetal_node:ListTraitsBaremetalNode diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-ironicclient-4.6.1/tox.ini new/python-ironicclient-4.8.0/tox.ini --- old/python-ironicclient-4.6.1/tox.ini 2021-03-12 18:03:56.000000000 +0100 +++ new/python-ironicclient-4.8.0/tox.ini 2021-08-31 15:08:24.000000000 +0200 @@ -1,5 +1,5 @@ [tox] -minversion = 3.9.0 +minversion = 3.18.0 envlist = py3,pep8 skipsdist = True ignore_basepython_conflict=true @@ -69,7 +69,7 @@ sphinx-build -W -b html doc/source doc/build/html [testenv:pdf-docs] -whitelist_externals = make +allowlist_externals = make deps = {[testenv:docs]deps} commands = sphinx-build -W -b latex doc/source doc/build/pdf @@ -91,3 +91,9 @@ [hacking] import_exceptions = testtools.matchers, ironicclient.common.i18n + +[testenv:lower-constraints] +deps = + -c{toxinidir}/lower-constraints.txt + -r{toxinidir}/test-requirements.txt + -r{toxinidir}/requirements.txt diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-ironicclient-4.6.1/zuul.d/ironicclient-jobs.yaml new/python-ironicclient-4.8.0/zuul.d/ironicclient-jobs.yaml --- old/python-ironicclient-4.6.1/zuul.d/ironicclient-jobs.yaml 2021-03-12 18:03:56.000000000 +0100 +++ new/python-ironicclient-4.8.0/zuul.d/ironicclient-jobs.yaml 2021-08-31 15:08:24.000000000 +0200 @@ -5,7 +5,6 @@ - ^.*\.rst$ - ^doc/.*$ - ^ironicclient/locale/.*$ - - ^ironicclient/tests/.*$ - ^releasenotes/.*$ - ^setup.cfg$ - ^tools/.*$ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-ironicclient-4.6.1/zuul.d/project.yaml new/python-ironicclient-4.8.0/zuul.d/project.yaml --- old/python-ironicclient-4.6.1/zuul.d/project.yaml 2021-03-12 18:03:56.000000000 +0100 +++ new/python-ironicclient-4.8.0/zuul.d/project.yaml 2021-08-31 15:08:24.000000000 +0200 @@ -2,7 +2,8 @@ templates: - check-requirements - openstack-cover-jobs - - openstack-python3-wallaby-jobs + - openstack-lower-constraints-master-branch-jobs + - openstack-python3-xena-jobs - openstackclient-plugin-jobs - publish-openstack-docs-pti - release-notes-jobs-python3