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

Reply via email to