Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package python-oslo.config for 
openSUSE:Factory checked in at 2021-05-10 15:37:36
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-oslo.config (Old)
 and      /work/SRC/openSUSE:Factory/.python-oslo.config.new.2988 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-oslo.config"

Mon May 10 15:37:36 2021 rev:37 rq:889990 version:8.5.0

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-oslo.config/python-oslo.config.changes    
2021-02-02 14:26:02.203425879 +0100
+++ 
/work/SRC/openSUSE:Factory/.python-oslo.config.new.2988/python-oslo.config.changes
  2021-05-10 15:39:47.957461300 +0200
@@ -1,0 +2,20 @@
+Sun May  2 16:34:34 UTC 2021 - [email protected]
+
+- update to version 8.5.0
+  - remove lower-constraints.txt
+  - sphinxext: Add 'merge_domaindata'
+  - Update master for stable/victoria
+  - Add Python3 wallaby unit tests
+  - Adding pre-commit
+  - Convert rst to plaintext for oslo.config output
+  - Use py3 as the default runtime for tox
+  - inherit from object is not required for py3
+  - Add a new type HostDomain.
+  - Adding --check-defaults to validator
+  - Bump minimum version for PyYAML to 5.1
+  - Remove Babel from lower-constraints.txt
+  - Dropping lower constraints testing
+  - tox: Enable parallel docs builds
+  - Move zuul config file to root folder
+
+-------------------------------------------------------------------

Old:
----
  oslo.config-8.3.3.tar.gz

New:
----
  oslo.config-8.5.0.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-oslo.config.spec ++++++
--- /var/tmp/diff_new_pack.k17zzO/_old  2021-05-10 15:39:48.405459467 +0200
+++ /var/tmp/diff_new_pack.k17zzO/_new  2021-05-10 15:39:48.405459467 +0200
@@ -17,15 +17,16 @@
 
 
 Name:           python-oslo.config
-Version:        8.3.3
+Version:        8.5.0
 Release:        0
+Epoch:          0
 Summary:        OpenStack common configuration library
 License:        Apache-2.0
 Group:          Development/Languages/Python
-URL:            https://launchpad.net/oslo.config
-Source0:        
https://files.pythonhosted.org/packages/source/o/oslo.config/oslo.config-8.3.3.tar.gz
+URL:            https://docs.openstack.org/oslo.config
+Source0:        
https://files.pythonhosted.org/packages/source/o/oslo.config/oslo.config-8.5.0.tar.gz
 BuildRequires:  openstack-macros
-BuildRequires:  python3-PyYAML >= 3.12
+BuildRequires:  python3-PyYAML >= 5.1
 BuildRequires:  python3-debtcollector >= 1.2.0
 BuildRequires:  python3-fixtures
 BuildRequires:  python3-importlib-metadata
@@ -55,8 +56,7 @@
 
 %package -n python3-oslo.config
 Summary:        OpenStack common configuration library
-Group:          Development/Languages/Python
-Requires:       python3-PyYAML >= 3.12
+Requires:       python3-PyYAML >= 5.1
 Requires:       python3-debtcollector >= 1.2.0
 Requires:       python3-importlib-metadata
 Requires:       python3-netaddr >= 0.7.18
@@ -82,7 +82,6 @@
 
 %package -n python-oslo.config-doc
 Summary:        Documentation for OpenStack common configuration library
-Group:          Development/Languages/Python
 BuildRequires:  python3-Sphinx
 BuildRequires:  python3-openstackdocstheme
 BuildRequires:  python3-sphinxcontrib-apidoc
@@ -91,13 +90,13 @@
 Documentation for the oslo-config library.
 
 %prep
-%autosetup -p1 -n oslo.config-8.3.3
+%autosetup -p1 -n oslo.config-8.5.0
 %py_req_cleanup
 
 %build
 %{py3_build}
 
-PBR_VERSION=8.3.3 PYTHONPATH=. \
+PBR_VERSION=8.5.0 PYTHONPATH=. \
     %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.k17zzO/_old  2021-05-10 15:39:48.429459369 +0200
+++ /var/tmp/diff_new_pack.k17zzO/_new  2021-05-10 15:39:48.433459352 +0200
@@ -1,8 +1,8 @@
 <services>
   <service mode="disabled" name="renderspec">
-    <param 
name="input-template">https://opendev.org/openstack/rpm-packaging/raw/branch/stable/victoria/openstack/oslo.config/oslo.config.spec.j2</param>
+    <param 
name="input-template">https://opendev.org/openstack/rpm-packaging/raw/branch/stable/wallaby/openstack/oslo.config/oslo.config.spec.j2</param>
     <param name="output-name">python-oslo.config.spec</param>
-    <param 
name="requirements">https://opendev.org/openstack/oslo.config/raw/branch/stable/victoria/requirements.txt</param>
+    <param 
name="requirements">https://opendev.org/openstack/oslo.config/raw/branch/stable/wallaby/requirements.txt</param>
     <param name="changelog-email">[email protected]</param>
     <param name="changelog-provider">gh,openstack,oslo.config</param>
   </service>

++++++ oslo.config-8.3.3.tar.gz -> oslo.config-8.5.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo.config-8.3.3/.pre-commit-config.yaml 
new/oslo.config-8.5.0/.pre-commit-config.yaml
--- old/oslo.config-8.3.3/.pre-commit-config.yaml       1970-01-01 
01:00:00.000000000 +0100
+++ new/oslo.config-8.5.0/.pre-commit-config.yaml       2021-03-03 
14:41:15.000000000 +0100
@@ -0,0 +1,35 @@
+# We from the Oslo project decided to pin repos based on the
+# commit hash instead of the version tag to prevend arbitrary
+# code from running in developer's machines.  To update to a
+# newer version, run `pre-commit autoupdate` and then replace
+# the newer versions with their commit hash.
+
+default_language_version:
+  python: python3
+
+repos:
+  - repo: https://github.com/pre-commit/pre-commit-hooks
+    rev: ebc15addedad713c86ef18ae9632c88e187dd0af  # v3.1.0
+    hooks:
+      - id: trailing-whitespace
+      # Replaces or checks mixed line ending
+      - id: mixed-line-ending
+        args: ['--fix', 'lf']
+        exclude: '.*\.(svg)$'
+      # Forbid files which have a UTF-8 byte-order marker
+      - id: check-byte-order-marker
+      # Checks that non-binary executables have a proper shebang
+      - id: check-executables-have-shebangs
+      # Check for files that contain merge conflict strings.
+      - id: check-merge-conflict
+      # Check for debugger imports and py37+ breakpoint()
+      # calls in python source
+      - id: debug-statements
+      - id: check-yaml
+        files: .*\.(yaml|yml)$
+  - repo: https://gitlab.com/pycqa/flake8
+    rev: 181bb46098dddf7e2d45319ea654b4b4d58c2840 # 3.8.3
+    hooks:
+      - id: flake8
+        additional_dependencies:
+          - hacking>=3.0.1,<3.1.0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo.config-8.3.3/.zuul.d/project.yaml 
new/oslo.config-8.5.0/.zuul.d/project.yaml
--- old/oslo.config-8.3.3/.zuul.d/project.yaml  2020-11-18 18:42:30.000000000 
+0100
+++ new/oslo.config-8.5.0/.zuul.d/project.yaml  1970-01-01 01:00:00.000000000 
+0100
@@ -1,9 +0,0 @@
-- project:
-    templates:
-      - check-requirements
-      - lib-forward-testing-python3
-      - openstack-lower-constraints-jobs
-      - openstack-python3-victoria-jobs
-      - periodic-stable-jobs
-      - publish-openstack-docs-pti
-      - release-notes-jobs-python3
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo.config-8.3.3/.zuul.yaml 
new/oslo.config-8.5.0/.zuul.yaml
--- old/oslo.config-8.3.3/.zuul.yaml    1970-01-01 01:00:00.000000000 +0100
+++ new/oslo.config-8.5.0/.zuul.yaml    2021-03-03 14:41:15.000000000 +0100
@@ -0,0 +1,8 @@
+- project:
+    templates:
+      - check-requirements
+      - lib-forward-testing-python3
+      - openstack-python3-wallaby-jobs
+      - periodic-stable-jobs
+      - publish-openstack-docs-pti
+      - release-notes-jobs-python3
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo.config-8.3.3/AUTHORS 
new/oslo.config-8.5.0/AUTHORS
--- old/oslo.config-8.3.3/AUTHORS       2020-11-18 18:43:08.000000000 +0100
+++ new/oslo.config-8.5.0/AUTHORS       2021-03-03 14:42:06.000000000 +0100
@@ -40,6 +40,7 @@
 Davanum Srinivas <[email protected]>
 David Ripton <[email protected]>
 David Stanek <[email protected]>
+David Vallee Delisle <[email protected]>
 Dharini Chandrasekar <[email protected]>
 Dirk Mueller <[email protected]>
 Dolph Mathews <[email protected]>
@@ -186,6 +187,7 @@
 howardlee <[email protected]>
 huang.xiangdong <[email protected]>
 jacky06 <[email protected]>
+likui <[email protected]>
 liu-sheng <[email protected]>
 liyingjun <[email protected]>
 llg8212 <[email protected]>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo.config-8.3.3/ChangeLog 
new/oslo.config-8.5.0/ChangeLog
--- old/oslo.config-8.3.3/ChangeLog     2020-11-18 18:43:07.000000000 +0100
+++ new/oslo.config-8.5.0/ChangeLog     2021-03-03 14:42:06.000000000 +0100
@@ -1,18 +1,33 @@
 CHANGES
 =======
 
-8.3.3
+8.5.0
 -----
 
+* Bump minimum version for PyYAML to 5.1
+* remove lower-constraints.txt
+* inherit from object is not required for py3
+* Move zuul config file to root folder
+* Dropping lower constraints testing
+
+8.4.0
+-----
+
+* Adding --check-defaults to validator
+* Use py3 as the default runtime for tox
 * Add a new type HostDomain
+* Adding pre-commit
+* Add Python3 wallaby unit tests
+* Update master for stable/victoria
+* tox: Enable parallel docs builds
 * sphinxext: Add 'merge\_domaindata'
-* Update TOX\_CONSTRAINTS\_FILE for stable/victoria
-* Update .gitreview for stable/victoria
+* Remove Babel from lower-constraints.txt
 
 8.3.2
 -----
 
 * Bump bandit version
+* Convert rst to plaintext for oslo.config output
 
 8.3.1
 -----
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo.config-8.3.3/PKG-INFO 
new/oslo.config-8.5.0/PKG-INFO
--- old/oslo.config-8.3.3/PKG-INFO      2020-11-18 18:43:08.247316800 +0100
+++ new/oslo.config-8.5.0/PKG-INFO      2021-03-03 14:42:06.849606500 +0100
@@ -1,6 +1,6 @@
-Metadata-Version: 1.2
+Metadata-Version: 2.1
 Name: oslo.config
-Version: 8.3.3
+Version: 8.5.0
 Summary: Oslo Configuration API
 Home-page: https://docs.openstack.org/oslo.config/latest/
 Author: OpenStack
@@ -52,3 +52,5 @@
 Classifier: Programming Language :: Python :: 3 :: Only
 Classifier: Programming Language :: Python :: Implementation :: CPython
 Requires-Python: >=3.6
+Provides-Extra: rst_generator
+Provides-Extra: test
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo.config-8.3.3/doc/source/cli/validator.rst 
new/oslo.config-8.5.0/doc/source/cli/validator.rst
--- old/oslo.config-8.3.3/doc/source/cli/validator.rst  2020-11-18 
18:42:30.000000000 +0100
+++ new/oslo.config-8.5.0/doc/source/cli/validator.rst  2021-03-03 
14:41:15.000000000 +0100
@@ -32,7 +32,7 @@
 the option [foo]/bar added to demonstrate a failure)::
 
     $ oslo-config-validator --config-file 
/opt/stack/nova/etc/nova/nova-config-generator.conf --input-file 
/etc/nova/nova.conf
-    ERROR:root:foo/bar not found
+    ERROR:root:foo/bar is not part of the sample config
     INFO:root:Ignoring missing option "project_domain_name" from group 
"keystone_authtoken" because the group is known to have incomplete sample 
config data and thus cannot be validated properly.
     INFO:root:Ignoring missing option "project_name" from group 
"keystone_authtoken" because the group is known to have incomplete sample 
config data and thus cannot be validated properly.
     INFO:root:Ignoring missing option "user_domain_name" from group 
"keystone_authtoken" because the group is known to have incomplete sample 
config data and thus cannot be validated properly.
@@ -58,7 +58,7 @@
 the option [foo]/bar added to demonstrate a failure)::
 
     $ oslo-config-validator --opt-data config-data.yaml --input-file 
/etc/nova/nova.conf
-    ERROR:root:foo/bar not found
+    ERROR:root:foo/bar is not part of the sample config
     INFO:root:Ignoring missing option "project_domain_name" from group 
"keystone_authtoken" because the group is known to have incomplete sample 
config data and thus cannot be validated properly.
     INFO:root:Ignoring missing option "project_name" from group 
"keystone_authtoken" because the group is known to have incomplete sample 
config data and thus cannot be validated properly.
     INFO:root:Ignoring missing option "user_domain_name" from group 
"keystone_authtoken" because the group is known to have incomplete sample 
config data and thus cannot be validated properly.
@@ -66,6 +66,158 @@
     INFO:root:Ignoring missing option "username" from group 
"keystone_authtoken" because the group is known to have incomplete sample 
config data and thus cannot be validated properly.
     INFO:root:Ignoring missing option "auth_url" from group 
"keystone_authtoken" because the group is known to have incomplete sample 
config data and thus cannot be validated properly.
 
+Comparing configuration with the default configuration
+------------------------------------------------------
+
+.. note:: For most accurate results, the validation should be done using the
+          same version of the code as the system whose config file is being
+          validated.
+
+Comparing the default configuration with the current configuration can help
+operators with troubleshooting issues. Since the generator config is not always
+available in production environment, we can pass the ``--namespace`` arguments.
+In addition to the ``--namespace``, we need to pass a ``--input-file`` as well
+as the ``--check-defaults``.
+
+Some options are ignored by default but this behavior can be overridden with
+the ``--exclude-options`` list argument.
+
+Here's an example of using the validator on Nova::
+
+    $ oslo-config-validator --input-file /etc/nova/nova.conf \
+                            --check-defaults \
+                            --namespace nova.conf \
+                            --namespace oslo.log \
+                            --namespace oslo.messaging \
+                            --namespace oslo.policy \
+                            --namespace oslo.privsep \
+                            --namespace oslo.service.periodic_task \
+                            --namespace oslo.service.service \
+                            --namespace oslo.db \
+                            --namespace oslo.db.concurrency \
+                            --namespace oslo.middleware \
+                            --namespace oslo.concurrency \
+                            --namespace keystonemiddleware.auth_token \
+                            --namespace osprofiler
+    INFO:keyring.backend:Loading Gnome
+    INFO:keyring.backend:Loading Google
+    INFO:keyring.backend:Loading Windows (alt)
+    INFO:keyring.backend:Loading file
+    INFO:keyring.backend:Loading keyczar
+    INFO:keyring.backend:Loading multi
+    INFO:keyring.backend:Loading pyfs
+    WARNING:root:DEFAULT/compute_driver sample value is empty but input-file 
has libvirt.LibvirtDriver
+    WARNING:root:DEFAULT/allow_resize_to_same_host sample value is empty but 
input-file has True
+    WARNING:root:DEFAULT/default_ephemeral_format sample value is empty but 
input-file has ext4
+    WARNING:root:DEFAULT/pointer_model sample value ['usbtablet'] is not in 
['ps2mouse']
+    WARNING:root:DEFAULT/instances_path sample value ['$state_path/instances'] 
is not in ['/opt/stack/data/nova/instances']
+    WARNING:root:DEFAULT/shutdown_timeout sample value ['60'] is not in ['0']
+    INFO:root:DEFAULT/my_ip Ignoring option because it is part of the excluded 
patterns. This can be changed with the --exclude-options argument.
+    WARNING:root:DEFAULT/state_path sample value ['$pybasedir'] is not in 
['/opt/stack/data/nova']
+    INFO:root:DEFAULT/osapi_compute_listen Ignoring option because it is part 
of the excluded patterns. This can be changed with the --exclude-options 
argument.
+    WARNING:root:DEFAULT/osapi_compute_workers sample value is empty but 
input-file has 2
+    WARNING:root:DEFAULT/metadata_workers sample value is empty but input-file 
has 2
+    WARNING:root:DEFAULT/graceful_shutdown_timeout sample value ['60'] is not 
in ['5']
+    INFO:root:DEFAULT/transport_url Ignoring option because it is part of the 
excluded patterns. This can be changed with the --exclude-options argument.
+    WARNING:root:DEFAULT/debug sample value is empty but input-file has True
+    WARNING:root:DEFAULT/logging_context_format_string sample value 
['%(asctime)s.%(msecs)03d %(process)d %(levelname)s %(name)s [%(request_id)s 
%(user_identity)s] %(instance)s%(message)s'] is not in ['%(color)s%(levelname)s 
%(name)s [\x1b[01;36m%(global_request_id)s %(request_id)s 
\x1b[00;36m%(project_name)s %(user_name)s%(color)s] 
\x1b[01;35m%(instance)s%(color)s%(message)s\x1b[00m']
+    WARNING:root:DEFAULT/logging_default_format_string sample value 
['%(asctime)s.%(msecs)03d %(process)d %(levelname)s %(name)s [-] 
%(instance)s%(message)s'] is not in ['%(color)s%(levelname)s %(name)s 
[\x1b[00;36m-%(color)s] \x1b[01;35m%(instance)s%(color)s%(message)s\x1b[00m']
+    WARNING:root:DEFAULT/logging_debug_format_suffix sample value 
['%(funcName)s %(pathname)s:%(lineno)d'] is not in 
['\x1b[00;33m{{(pid=%(process)d) %(funcName)s 
%(pathname)s:%(lineno)d}}\x1b[00m']
+    WARNING:root:DEFAULT/logging_exception_prefix sample value 
['%(asctime)s.%(msecs)03d %(process)d ERROR %(name)s %(instance)s'] is not in 
['ERROR %(name)s \x1b[01;35m%(instance)s\x1b[00m']
+    WARNING:root:Group api from the sample config is not defined in input-file
+    WARNING:root:cache/backend sample value ['dogpile.cache.null'] is not in 
['dogpile.cache.memcached']
+    WARNING:root:cache/enabled sample value is empty but input-file has True
+    WARNING:root:cinder/os_region_name sample value is empty but input-file 
has RegionOne
+    WARNING:root:cinder/auth_type sample value is empty but input-file has 
password
+    INFO:root:cinder/auth_url Ignoring option because it is part of the 
excluded patterns. This can be changed with the --exclude-options argument.
+    WARNING:root:cinder/project_name sample value is empty but input-file has 
service
+    WARNING:root:cinder/project_domain_name sample value is empty but 
input-file has Default
+    INFO:root:cinder/username Ignoring option because it is part of the 
excluded patterns. This can be changed with the --exclude-options argument.
+    WARNING:root:cinder/user_domain_name sample value is empty but input-file 
has Default
+    INFO:root:cinder/password Ignoring option because it is part of the 
excluded patterns. This can be changed with the --exclude-options argument.
+    WARNING:root:Group compute from the sample config is not defined in 
input-file
+    WARNING:root:conductor/workers sample value is empty but input-file has 2
+    WARNING:root:Group console from the sample config is not defined in 
input-file
+    WARNING:root:Group consoleauth from the sample config is not defined in 
input-file
+    WARNING:root:Group cyborg from the sample config is not defined in 
input-file
+    INFO:root:api_database/connection Ignoring option because it is part of 
the excluded patterns. This can be changed with the --exclude-options argument.
+    WARNING:root:Group devices from the sample config is not defined in 
input-file
+    WARNING:root:Group ephemeral_storage_encryption from the sample config is 
not defined in input-file
+    WARNING:root:Group glance from the sample config is not defined in 
input-file
+    WARNING:root:Group guestfs from the sample config is not defined in 
input-file
+    WARNING:root:Group hyperv from the sample config is not defined in 
input-file
+    WARNING:root:Group image_cache from the sample config is not defined in 
input-file
+    WARNING:root:Group ironic from the sample config is not defined in 
input-file
+    WARNING:root:key_manager/fixed_key sample value is empty but input-file 
has bae3516cc1c0eb18b05440eba8012a4a880a2ee04d584a9c1579445e675b12defdc716ec
+    WARNING:root:key_manager/backend sample value ['barbican'] is not in 
['nova.keymgr.conf_key_mgr.ConfKeyManager']
+    WARNING:root:Group barbican from the sample config is not defined in 
input-file
+    WARNING:root:Group vault from the sample config is not defined in 
input-file
+    WARNING:root:Group keystone from the sample config is not defined in 
input-file
+    INFO:root:libvirt/live_migration_uri Ignoring option because it is part of 
the excluded patterns. This can be changed with the --exclude-options argument.
+    WARNING:root:libvirt/cpu_mode sample value is empty but input-file has none
+    WARNING:root:Group mks from the sample config is not defined in input-file
+    WARNING:root:neutron/default_floating_pool sample value ['nova'] is not in 
['public']
+    WARNING:root:neutron/service_metadata_proxy sample value is empty but 
input-file has True
+    WARNING:root:neutron/auth_type sample value is empty but input-file has 
password
+    INFO:root:neutron/auth_url Ignoring option because it is part of the 
excluded patterns. This can be changed with the --exclude-options argument.
+    WARNING:root:neutron/project_name sample value is empty but input-file has 
service
+    WARNING:root:neutron/project_domain_name sample value is empty but 
input-file has Default
+    INFO:root:neutron/username Ignoring option because it is part of the 
excluded patterns. This can be changed with the --exclude-options argument.
+    WARNING:root:neutron/user_domain_name sample value is empty but input-file 
has Default
+    INFO:root:neutron/password Ignoring option because it is part of the 
excluded patterns. This can be changed with the --exclude-options argument.
+    WARNING:root:neutron/region_name sample value is empty but input-file has 
RegionOne
+    WARNING:root:Group pci from the sample config is not defined in input-file
+    WARNING:root:placement/auth_type sample value is empty but input-file has 
password
+    INFO:root:placement/auth_url Ignoring option because it is part of the 
excluded patterns. This can be changed with the --exclude-options argument.
+    WARNING:root:placement/project_name sample value is empty but input-file 
has service
+    WARNING:root:placement/project_domain_name sample value is empty but 
input-file has Default
+    INFO:root:placement/username Ignoring option because it is part of the 
excluded patterns. This can be changed with the --exclude-options argument.
+    WARNING:root:placement/user_domain_name sample value is empty but 
input-file has Default
+    INFO:root:placement/password Ignoring option because it is part of the 
excluded patterns. This can be changed with the --exclude-options argument.
+    WARNING:root:placement/region_name sample value is empty but input-file 
has RegionOne
+    WARNING:root:Group powervm from the sample config is not defined in 
input-file
+    WARNING:root:Group quota from the sample config is not defined in 
input-file
+    WARNING:root:Group rdp from the sample config is not defined in input-file
+    WARNING:root:Group remote_debug from the sample config is not defined in 
input-file
+    WARNING:root:scheduler/workers sample value is empty but input-file has 2
+    WARNING:root:filter_scheduler/track_instance_changes sample value ['True'] 
is not in ['False']
+    WARNING:root:filter_scheduler/enabled_filters sample value 
['AvailabilityZoneFilter', 'ComputeFilter', 'ComputeCapabilitiesFilter', 
'ImagePropertiesFilter', 'ServerGroupAntiAffinityFilter', 
'ServerGroupAffinityFilter'] is not in 
['AvailabilityZoneFilter,ComputeFilter,ComputeCapabilitiesFilter,ImagePropertiesFilter,ServerGroupAntiAffinityFilter,ServerGroupAffinityFilter,SameHostFilter,DifferentHostFilter']
+    WARNING:root:Group metrics from the sample config is not defined in 
input-file
+    WARNING:root:Group serial_console from the sample config is not defined in 
input-file
+    WARNING:root:Group service_user from the sample config is not defined in 
input-file
+    WARNING:root:Group spice from the sample config is not defined in 
input-file
+    WARNING:root:upgrade_levels/compute sample value is empty but input-file 
has auto
+    WARNING:root:Group vendordata_dynamic_auth from the sample config is not 
defined in input-file
+    WARNING:root:Group vmware from the sample config is not defined in 
input-file
+    WARNING:root:Group vnc from the sample config is not defined in input-file
+    WARNING:root:Group workarounds from the sample config is not defined in 
input-file
+    WARNING:root:wsgi/api_paste_config sample value ['api-paste.ini'] is not 
in ['/etc/nova/api-paste.ini']
+    WARNING:root:Group zvm from the sample config is not defined in input-file
+    WARNING:root:oslo_concurrency/lock_path sample value is empty but 
input-file has /opt/stack/data/nova
+    WARNING:root:Group oslo_middleware from the sample config is not defined 
in input-file
+    WARNING:root:Group cors from the sample config is not defined in input-file
+    WARNING:root:Group healthcheck from the sample config is not defined in 
input-file
+    WARNING:root:Group oslo_messaging_amqp from the sample config is not 
defined in input-file
+    WARNING:root:oslo_messaging_notifications/driver sample value is empty but 
input-file has messagingv2
+    INFO:root:oslo_messaging_notifications/transport_url Ignoring option 
because it is part of the excluded patterns. This can be changed with the 
--exclude-options argument.
+    WARNING:root:Group oslo_messaging_rabbit from the sample config is not 
defined in input-file
+    WARNING:root:Group oslo_messaging_kafka from the sample config is not 
defined in input-file
+    WARNING:root:Group oslo_policy from the sample config is not defined in 
input-file
+    WARNING:root:Group privsep from the sample config is not defined in 
input-file
+    WARNING:root:Group profiler from the sample config is not defined in 
input-file
+    INFO:root:database/connection Ignoring option because it is part of the 
excluded patterns. This can be changed with the --exclude-options argument.
+    WARNING:root:keystone_authtoken/interface sample value ['internal'] is not 
in ['public']
+    WARNING:root:keystone_authtoken/cafile sample value is empty but 
input-file has /opt/stack/data/ca-bundle.pem
+    WARNING:root:keystone_authtoken/memcached_servers sample value is empty 
but input-file has localhost:11211
+    WARNING:root:keystone_authtoken/auth_type sample value is empty but 
input-file has password
+    ERROR:root:neutron/auth_strategy is not part of the sample config
+    INFO:root:Ignoring missing option "project_domain_name" from group 
"keystone_authtoken" because the group is known to have incomplete sample 
config data and thus cannot be validated properly.
+    INFO:root:Ignoring missing option "project_name" from group 
"keystone_authtoken" because the group is known to have incomplete sample 
config data and thus cannot be validated properly.
+    INFO:root:Ignoring missing option "user_domain_name" from group 
"keystone_authtoken" because the group is known to have incomplete sample 
config data and thus cannot be validated properly.
+    INFO:root:Ignoring missing option "password" from group 
"keystone_authtoken" because the group is known to have incomplete sample 
config data and thus cannot be validated properly.
+    INFO:root:Ignoring missing option "username" from group 
"keystone_authtoken" because the group is known to have incomplete sample 
config data and thus cannot be validated properly.
+    INFO:root:Ignoring missing option "auth_url" from group 
"keystone_authtoken" because the group is known to have incomplete sample 
config data and thus cannot be validated properly
+
 Handling Dynamic Groups
 -----------------------
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo.config-8.3.3/doc/source/conf.py 
new/oslo.config-8.5.0/doc/source/conf.py
--- old/oslo.config-8.3.3/doc/source/conf.py    2020-11-18 18:42:30.000000000 
+0100
+++ new/oslo.config-8.5.0/doc/source/conf.py    2021-03-03 14:41:15.000000000 
+0100
@@ -1,4 +1,17 @@
 # -*- coding: utf-8 -*-
+# Copyright (C) 2020 Red Hat, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
 
 import os
 import sys
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/oslo.config-8.3.3/doc/source/reference/configuration-files.rst 
new/oslo.config-8.5.0/doc/source/reference/configuration-files.rst
--- old/oslo.config-8.3.3/doc/source/reference/configuration-files.rst  
2020-11-18 18:42:30.000000000 +0100
+++ new/oslo.config-8.5.0/doc/source/reference/configuration-files.rst  
2021-03-03 14:41:15.000000000 +0100
@@ -7,7 +7,7 @@
 
 .. code-block:: python
 
-    class ConfigOpts(object):
+    class ConfigOpts:
 
         def __call__(self, ...):
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo.config-8.3.3/doc/source/reference/defining.rst 
new/oslo.config-8.5.0/doc/source/reference/defining.rst
--- old/oslo.config-8.3.3/doc/source/reference/defining.rst     2020-11-18 
18:42:30.000000000 +0100
+++ new/oslo.config-8.5.0/doc/source/reference/defining.rst     2021-03-03 
14:41:15.000000000 +0100
@@ -81,7 +81,7 @@
 
 .. code-block:: python
 
-    class ExtensionManager(object):
+    class ExtensionManager:
 
         enabled_apis_opt = cfg.ListOpt(...)
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo.config-8.3.3/lower-constraints.txt 
new/oslo.config-8.5.0/lower-constraints.txt
--- old/oslo.config-8.3.3/lower-constraints.txt 2020-11-18 18:42:30.000000000 
+0100
+++ new/oslo.config-8.5.0/lower-constraints.txt 1970-01-01 01:00:00.000000000 
+0100
@@ -1,79 +0,0 @@
-alabaster==0.7.10
-appdirs==1.3.0
-Babel==2.3.4
-certifi==2020.4.5.2
-chardet==3.0.4
-cliff==3.1.0
-cmd2==0.8.9
-coverage==4.0
-debtcollector==1.2.0
-doc8==0.8.1
-docutils==0.11
-dulwich==0.15.0
-entrypoints==0.3
-extras==1.0.0
-fixtures==3.0.0
-future==0.18.2
-gitdb==0.6.4
-GitPython==1.0.1
-idna==2.5
-imagesize==0.7.1
-importlib_metadata==1.7.0
-iso8601==0.1.11
-Jinja2==2.10
-keystoneauth1==3.4.0
-linecache2==1.0.0
-MarkupSafe==1.0
-mock==4.0.2
-monotonic==1.5
-mox3==0.20.0
-msgpack==1.0.0
-mypy==0.720
-mypy-extensions==0.4.3
-netaddr==0.7.18
-netifaces==0.10.9
-openstackdocstheme==1.20.0
-os-client-config==1.28.0
-oslo.context==3.1.0
-oslo.i18n==3.15.3
-oslo.log==3.36.0
-oslo.serialization==3.2.0
-oslo.utils==4.2.0
-oslotest==3.2.0
-packaging==20.4
-pbr==2.0.0
-prettytable==0.7.2
-Pygments==2.2.0
-pyinotify==0.9.6
-pyparsing==2.4.7
-pyperclip==1.8.0
-python-dateutil==2.8.1
-python-mimeparse==1.6.0
-python-subunit==1.0.0
-pytz==2013.6
-PyYAML==3.12
-reno==2.5.0
-requests==2.18.0
-requests-mock==1.5.0
-requestsexceptions==1.2.0
-restructuredtext-lint==1.3.1
-rfc3986==1.2.0
-six==1.15.0
-smmap==0.9.0
-snowballstemmer==1.2.1
-Sphinx==1.8.0
-sphinxcontrib-apidoc==0.3.0
-sphinxcontrib-websupport==1.0.1
-stestr==2.1.0
-stevedore==1.20.0
-testrepository==0.0.20
-testscenarios==0.4
-testtools==2.2.0
-traceback2==1.4.0
-typed-ast==1.4.1
-typing-extensions==3.7.4.2
-unittest2==1.1.0
-urllib3==1.21.1
-voluptuous==0.11.7
-wcwidth==0.2.4
-wrapt==1.7.0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo.config-8.3.3/oslo.config.egg-info/PKG-INFO 
new/oslo.config-8.5.0/oslo.config.egg-info/PKG-INFO
--- old/oslo.config-8.3.3/oslo.config.egg-info/PKG-INFO 2020-11-18 
18:43:08.000000000 +0100
+++ new/oslo.config-8.5.0/oslo.config.egg-info/PKG-INFO 2021-03-03 
14:42:06.000000000 +0100
@@ -1,6 +1,6 @@
-Metadata-Version: 1.2
+Metadata-Version: 2.1
 Name: oslo.config
-Version: 8.3.3
+Version: 8.5.0
 Summary: Oslo Configuration API
 Home-page: https://docs.openstack.org/oslo.config/latest/
 Author: OpenStack
@@ -52,3 +52,5 @@
 Classifier: Programming Language :: Python :: 3 :: Only
 Classifier: Programming Language :: Python :: Implementation :: CPython
 Requires-Python: >=3.6
+Provides-Extra: rst_generator
+Provides-Extra: test
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo.config-8.3.3/oslo.config.egg-info/SOURCES.txt 
new/oslo.config-8.5.0/oslo.config.egg-info/SOURCES.txt
--- old/oslo.config-8.3.3/oslo.config.egg-info/SOURCES.txt      2020-11-18 
18:43:08.000000000 +0100
+++ new/oslo.config-8.5.0/oslo.config.egg-info/SOURCES.txt      2021-03-03 
14:42:06.000000000 +0100
@@ -1,5 +1,7 @@
 .coveragerc
+.pre-commit-config.yaml
 .stestr.conf
+.zuul.yaml
 AUTHORS
 CONTRIBUTING.rst
 ChangeLog
@@ -7,13 +9,11 @@
 LICENSE
 README.rst
 bindep.txt
-lower-constraints.txt
 requirements.txt
 setup.cfg
 setup.py
 test-requirements.txt
 tox.ini
-.zuul.d/project.yaml
 doc/requirements.txt
 doc/source/conf.py
 doc/source/config-generator.conf
@@ -101,6 +101,7 @@
 releasenotes/notes/show-deprecated-reason-361a8eb31e05c97e.yaml
 releasenotes/notes/support-choice-descriptions-8b2d0c14fbd16b2a.yaml
 releasenotes/notes/support-fatal-deprecations-ea0513aa58a395ca.yaml
+releasenotes/notes/validator-check-defaults-e7b596a2fde781a8.yaml
 releasenotes/notes/validator-exclude-groups-ad2f046522a3407e.yaml
 releasenotes/source/conf.py
 releasenotes/source/index.rst
@@ -115,5 +116,6 @@
 releasenotes/source/train.rst
 releasenotes/source/unreleased.rst
 releasenotes/source/ussuri.rst
+releasenotes/source/victoria.rst
 releasenotes/source/_static/.placeholder
 releasenotes/source/_templates/.placeholder
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo.config-8.3.3/oslo.config.egg-info/pbr.json 
new/oslo.config-8.5.0/oslo.config.egg-info/pbr.json
--- old/oslo.config-8.3.3/oslo.config.egg-info/pbr.json 2020-11-18 
18:43:08.000000000 +0100
+++ new/oslo.config-8.5.0/oslo.config.egg-info/pbr.json 2021-03-03 
14:42:06.000000000 +0100
@@ -1 +1 @@
-{"git_version": "d9129d8", "is_release": true}
\ No newline at end of file
+{"git_version": "cfa2564", "is_release": true}
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo.config-8.3.3/oslo.config.egg-info/requires.txt 
new/oslo.config-8.5.0/oslo.config.egg-info/requires.txt
--- old/oslo.config-8.3.3/oslo.config.egg-info/requires.txt     2020-11-18 
18:43:08.000000000 +0100
+++ new/oslo.config-8.5.0/oslo.config.egg-info/requires.txt     2021-03-03 
14:42:06.000000000 +0100
@@ -1,4 +1,4 @@
-PyYAML>=3.12
+PyYAML>=5.1
 debtcollector>=1.2.0
 netaddr>=0.7.18
 oslo.i18n>=3.15.3
@@ -8,3 +8,21 @@
 
 [:(python_version<'3.8')]
 importlib_metadata>=1.7.0
+
+[rst_generator]
+rst2txt>=1.1.0
+sphinx!=2.1.0,>=1.8.0
+
+[test]
+bandit<1.7.0,>=1.6.0
+coverage!=4.4,>=4.0
+fixtures>=3.0.0
+hacking<3.1.0,>=3.0.1
+mypy>=0.720
+oslo.log>=3.36.0
+oslotest>=3.2.0
+pre-commit>=2.6.0
+requests_mock>=1.5.0
+stestr>=2.1.0
+testscenarios>=0.4
+testtools>=2.2.0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo.config-8.3.3/oslo_config/cfg.py 
new/oslo.config-8.5.0/oslo_config/cfg.py
--- old/oslo.config-8.3.3/oslo_config/cfg.py    2020-11-18 18:42:30.000000000 
+0100
+++ new/oslo.config-8.5.0/oslo_config/cfg.py    2021-03-03 14:41:15.000000000 
+0100
@@ -424,7 +424,7 @@
 
 
 @functools.total_ordering
-class Opt(object):
+class Opt:
 
     """Base class for all configuration options.
 
@@ -809,7 +809,7 @@
         return hash(self) < hash(another)
 
 
-class DeprecatedOpt(object):
+class DeprecatedOpt:
 
     """Represents a Deprecated option.
 
@@ -1416,7 +1416,7 @@
         return kwargs
 
 
-class OptGroup(object):
+class OptGroup:
 
     """Represents a group of opts.
 
@@ -3155,7 +3155,7 @@
             """Return the number of options and option groups."""
             return len(self._group._opts)
 
-    class SubCommandAttr(object):
+    class SubCommandAttr:
 
         """Helper class.
 
@@ -3189,7 +3189,7 @@
             except AttributeError:
                 raise NoSuchOptError(name)
 
-    class StrSubWrapper(object):
+    class StrSubWrapper:
 
         """Helper class.
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo.config-8.3.3/oslo_config/generator.py 
new/oslo.config-8.5.0/oslo_config/generator.py
--- old/oslo.config-8.3.3/oslo_config/generator.py      2020-11-18 
18:42:30.000000000 +0100
+++ new/oslo.config-8.5.0/oslo_config/generator.py      2021-03-03 
14:41:15.000000000 +0100
@@ -29,7 +29,18 @@
 import logging
 import operator
 import sys
-import textwrap
+
+try:
+    # For oslo.config[rst-generator]
+    from docutils import core as docutils_core
+    from docutils.parsers.rst import nodes as docutils_nodes
+    from docutils.parsers.rst import roles as docutils_roles
+    import rst2txt
+    from sphinx import roles as sphinx_roles
+except ImportError:
+    import textwrap
+
+    rst2txt = None
 
 try:
     # For Python 3.8 and later
@@ -53,6 +64,7 @@
     cfg.IntOpt(
         'wrap-width',
         default=70,
+        min=0,
         help='The maximum length of help lines.'),
     cfg.MultiStrOpt(
         'namespace',
@@ -162,7 +174,7 @@
     return 'unknown value'
 
 
-class _OptFormatter(object):
+class _OptFormatter:
 
     """Format configuration option descriptions to a file."""
 
@@ -173,16 +185,43 @@
         :param output_file: a writeable file object
         """
         self.output_file = output_file or sys.stdout
-        self.wrap_width = conf.wrap_width
+        self.wrap_width = conf.wrap_width or 998  # arbitrary line length
         self.minimal = conf.minimal
         self.summarize = conf.summarize
 
+        if rst2txt:
+            # register the default Sphinx roles
+            for rolename, nodeclass in sphinx_roles.generic_docroles.items():
+                generic = docutils_roles.GenericRole(rolename, nodeclass)
+                docutils_roles.register_local_role(rolename, generic)
+
+            for rolename, func in sphinx_roles.specific_docroles.items():
+                docutils_roles.register_local_role(rolename, func)
+
+            # plus our custom roles
+            for rolename in ('oslo.config:option', 'oslo.config:group'):
+                generic = docutils_roles.GenericRole(rolename,
+                                                     docutils_nodes.strong)
+                docutils_roles.register_local_role(rolename, generic)
+
     def _format_help(self, help_text):
         """Format the help for a group or option to the output file.
 
         :param help_text: The text of the help string
         """
-        if self.wrap_width is not None and self.wrap_width > 0:
+        if rst2txt:
+            help_text = docutils_core.publish_string(
+                source=help_text,
+                writer=rst2txt.Writer(),
+                settings_overrides={'wrap_width': self.wrap_width}
+            ).decode()
+
+            lines = ''
+            for line in help_text.splitlines():
+                lines += '# ' + line + '\n' if line else '#\n'
+
+            lines = [lines]
+        elif self.wrap_width > 0:
             wrapped = ""
             for line in help_text.splitlines():
                 text = "\n".join(textwrap.wrap(line, self.wrap_width,
@@ -195,6 +234,7 @@
             lines = [wrapped]
         else:
             lines = ['# ' + help_text + '\n']
+
         return lines
 
     def _get_choice_text(self, choice):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo.config-8.3.3/oslo_config/iniparser.py 
new/oslo.config-8.5.0/oslo_config/iniparser.py
--- old/oslo.config-8.3.3/oslo_config/iniparser.py      2020-11-18 
18:42:30.000000000 +0100
+++ new/oslo.config-8.5.0/oslo_config/iniparser.py      2021-03-03 
14:41:15.000000000 +0100
@@ -23,7 +23,7 @@
         return 'at line %d, %s: %r' % (self.lineno, self.msg, self.line)
 
 
-class BaseParser(object):
+class BaseParser:
     lineno = 0
     parse_exc = ParseError
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo.config-8.3.3/oslo_config/sources/__init__.py 
new/oslo.config-8.5.0/oslo_config/sources/__init__.py
--- old/oslo.config-8.3.3/oslo_config/sources/__init__.py       2020-11-18 
18:42:30.000000000 +0100
+++ new/oslo.config-8.5.0/oslo_config/sources/__init__.py       2021-03-03 
14:41:15.000000000 +0100
@@ -33,10 +33,10 @@
 _NoValue = object()
 
 
-class ConfigurationSourceDriver(object, metaclass=abc.ABCMeta):
+class ConfigurationSourceDriver(metaclass=abc.ABCMeta):
     """A backend driver option for oslo.config.
 
-    For each group name listed in **config_source** on the **DEFAULT** group,
+    For each group name listed in **config_source** in the **DEFAULT** group,
     a :class:`ConfigurationSourceDriver` is responsible for creating one new
     instance of a :class:`ConfigurationSource`. The proper driver class to be
     used is selected based on the **driver** option inside each one of the
@@ -96,7 +96,7 @@
         """
 
 
-class ConfigurationSource(object, metaclass=abc.ABCMeta):
+class ConfigurationSource(metaclass=abc.ABCMeta):
     """A configuration source option for oslo.config.
 
     A configuration source is able to fetch configuration values based on
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo.config-8.3.3/oslo_config/tests/test_cfg.py 
new/oslo.config-8.5.0/oslo_config/tests/test_cfg.py
--- old/oslo.config-8.3.3/oslo_config/tests/test_cfg.py 2020-11-18 
18:42:30.000000000 +0100
+++ new/oslo.config-8.5.0/oslo_config/tests/test_cfg.py 2021-03-03 
14:41:15.000000000 +0100
@@ -3958,7 +3958,7 @@
 
 class OptDumpingTestCase(BaseTestCase):
 
-    class FakeLogger(object):
+    class FakeLogger:
 
         def __init__(self, test_case, expected_lvl):
             self.test_case = test_case
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/oslo.config-8.3.3/oslo_config/tests/test_generator.py 
new/oslo.config-8.5.0/oslo_config/tests/test_generator.py
--- old/oslo.config-8.3.3/oslo_config/tests/test_generator.py   2020-11-18 
18:42:30.000000000 +0100
+++ new/oslo.config-8.5.0/oslo_config/tests/test_generator.py   2021-03-03 
14:41:15.000000000 +0100
@@ -405,16 +405,16 @@
 #
 
 '''   # noqa
-'# Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod '
-'tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, '
-'quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo '
-'consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse '
-'cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat '
-'non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. '
-'(string value)'
+'# Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod '  
# noqa
+'tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, 
'  # noqa
+'quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo '  # 
noqa
+'consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse '  
# noqa
+'cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat '  
# noqa
+'non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. 
'  # noqa
+'(string value)'  # noqa
 '''
 #long_help = <None>
-''')),
+''')),  # noqa
         ('long_help_with_preformatting',
          dict(opts=[('test', [(None, [opts['long_help_pre']])])],
               wrap_width=70,
@@ -1638,7 +1638,7 @@
         class FakeException(Exception):
             pass
 
-        class FakeEP(object):
+        class FakeEP:
 
             def __init__(self):
                 self.name = 'callback_is_expected'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo.config-8.3.3/oslo_config/tests/test_types.py 
new/oslo.config-8.5.0/oslo_config/tests/test_types.py
--- old/oslo.config-8.3.3/oslo_config/tests/test_types.py       2020-11-18 
18:42:30.000000000 +0100
+++ new/oslo.config-8.5.0/oslo_config/tests/test_types.py       2021-03-03 
14:41:15.000000000 +0100
@@ -37,7 +37,7 @@
         MyString()
 
 
-class TypeTestHelper(object):
+class TypeTestHelper:
     def setUp(self):
         super(TypeTestHelper, self).setUp()
         self.type_instance = self.type
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/oslo.config-8.3.3/oslo_config/tests/test_validator.py 
new/oslo.config-8.5.0/oslo_config/tests/test_validator.py
--- old/oslo.config-8.3.3/oslo_config/tests/test_validator.py   2020-11-18 
18:42:30.000000000 +0100
+++ new/oslo.config-8.5.0/oslo_config/tests/test_validator.py   2021-03-03 
14:41:15.000000000 +0100
@@ -21,13 +21,51 @@
 from oslo_config import validator
 
 
-OPT_DATA = {'options': {'foo': {'opts': [{'name': 'opt'}]},
-                        'bar': {'opts': [{'name': 'opt'}]},
-                        },
-            'deprecated_options': {'bar': [{'name': 'opt'}]}}
+OPT_DATA = {
+  "options": {
+    "foo": {
+      "opts": [
+        {
+          "name": "opt",
+          "default": 1
+        }
+      ]
+    },
+    "bar": {
+      "opts": [
+        {
+          "name": "opt",
+          "default": 2
+        },
+        {
+          "name": "foo-bar",
+          "dest": "foo_bar",
+          "default": 2
+        },
+        {
+          "name": "bar-foo",
+          "dest": "bar_foo",
+          "default": 2
+        }
+      ]
+    }
+  },
+  "deprecated_options": {
+    "bar": [
+      {
+        "name": "opt",
+        "default": 3
+      }
+    ]
+  }
+}
 VALID_CONF = """
 [foo]
-opt = value
+opt = 1
+[bar]
+opt = 3
+foo-bar = 3
+bar_foo = 3
 """
 DEPRECATED_CONF = """
 [bar]
@@ -106,5 +144,15 @@
         with mock.patch('builtins.open', m):
             self.assertEqual(0, validator._validate(self.conf))
 
+    @mock.patch('oslo_config.validator.load_opt_data')
+    def test_check_defaults(self, mock_lod):
+        mock_lod.return_value = OPT_DATA
+        self.conf_fixture.config(opt_data='mocked.yaml',
+                                 input_file='mocked.conf',
+                                 check_defaults=True)
+        m = mock.mock_open(read_data=VALID_CONF)
+        with mock.patch('builtins.open', m):
+            self.assertEqual(0, validator._validate(self.conf))
+
     def test_invalid_options(self):
         self.assertRaises(RuntimeError, validator._validate, self.conf)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo.config-8.3.3/oslo_config/types.py 
new/oslo.config-8.5.0/oslo_config/types.py
--- old/oslo.config-8.3.3/oslo_config/types.py  2020-11-18 18:42:30.000000000 
+0100
+++ new/oslo.config-8.5.0/oslo_config/types.py  2021-03-03 14:41:15.000000000 
+0100
@@ -30,7 +30,7 @@
 import rfc3986
 
 
-class ConfigType(object, metaclass=abc.ABCMeta):
+class ConfigType(metaclass=abc.ABCMeta):
 
     def __init__(self, type_name='unknown type'):
         self.type_name = type_name
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo.config-8.3.3/oslo_config/validator.py 
new/oslo.config-8.5.0/oslo_config/validator.py
--- old/oslo.config-8.3.3/oslo_config/validator.py      2020-11-18 
18:42:30.000000000 +0100
+++ new/oslo.config-8.5.0/oslo_config/validator.py      2021-03-03 
14:41:15.000000000 +0100
@@ -22,6 +22,7 @@
 """
 
 import logging
+import re
 import sys
 
 try:
@@ -36,6 +37,11 @@
 from oslo_config import cfg
 from oslo_config import generator
 
+VALIDATE_DEFAULTS_EXCLUSIONS = [
+    '.*_ur(i|l)', '.*connection', 'password', 'username', 'my_ip',
+    'host(name)?', 'glance_api_servers', 'osapi_volume_listen',
+    'osapi_compute_listen',
+]
 
 _validator_opts = [
     cfg.MultiStrOpt(
@@ -51,6 +57,16 @@
         help='Path to a YAML file containing definitions of options, as '
              'output by the config generator.'),
     cfg.BoolOpt(
+        'check-defaults',
+        default=False,
+        help='Report differences between the sample values and current '
+             'values.'),
+    cfg.ListOpt(
+        'exclude-options',
+        default=VALIDATE_DEFAULTS_EXCLUSIONS,
+        help='Exclude options matching these patterns when comparing '
+             'the current and sample configurations.'),
+    cfg.BoolOpt(
         'fatal-warnings',
         default=False,
         help='Report failure if any warnings are found.'),
@@ -86,6 +102,73 @@
     return option in name_data
 
 
+def _validate_defaults(sections, opt_data, conf):
+    """Compares the current and sample configuration and reports differences
+
+    :param section: ConfigParser instance
+    :param opt_data: machine readable data from the generator instance
+    :param conf: ConfigOpts instance
+    :returns: boolean wether or not warnings were reported
+    """
+    warnings = False
+    # Generating regex objects from ListOpt
+    exclusion_regexes = []
+    for pattern in conf.exclude_options:
+        exclusion_regexes.append(re.compile(pattern))
+    for group, opts in opt_data['options'].items():
+        if group in conf.exclude_group:
+            continue
+        if group not in sections:
+            logging.warning(
+                'Group %s from the sample config is not defined in '
+                'input-file', group)
+            continue
+        for opt in opts['opts']:
+            # We need to convert the defaults into a list to find
+            # intersections. defaults are only a list if they can
+            # be defined multiple times, but configparser only
+            # returns list
+            if not isinstance(opt['default'], list):
+                defaults = [str(opt['default'])]
+            else:
+                defaults = opt['default']
+
+            # Apparently, there's multiple naming conventions for
+            # options, 'name' is mostly with hyphens, and 'dest'
+            # is represented with underscores.
+            opt_names = set([opt['name'], opt.get('dest')])
+            if not opt_names.intersection(sections[group]):
+                continue
+            try:
+                value = sections[group][opt['name']]
+                keyname = opt['name']
+            except KeyError:
+                value = sections[group][opt.get('dest')]
+                keyname = opt.get('dest')
+
+            if any(rex.fullmatch(keyname) for rex in exclusion_regexes):
+                logging.info(
+                    '%s/%s Ignoring option because it is part of the excluded '
+                    'patterns. This can be changed with the --exclude-options '
+                    'argument', group, keyname)
+                continue
+
+            if len(value) > 1:
+                logging.info(
+                    '%s/%s defined %s times', group, keyname, len(value))
+            if not opt['default']:
+                logging.warning(
+                    '%s/%s sample value is empty but input-file has %s',
+                    group, keyname, ", ".join(value))
+                warnings = True
+            elif not frozenset(defaults).intersection(value):
+                logging.warning(
+                    '%s/%s sample value %s is not in %s',
+                    group, keyname, defaults, value)
+                warnings = True
+    return warnings
+
+
 def _validate_opt(group, option, opt_data):
     if group not in opt_data['options']:
         return False
@@ -114,12 +197,14 @@
     parser.parse()
     warnings = False
     errors = False
+    if conf.check_defaults:
+        warnings = _validate_defaults(sections, opt_data, conf)
     for section, options in sections.items():
         if section in conf.exclude_group:
             continue
         for option in options:
             if _validate_deprecated_opt(section, option, opt_data):
-                logging.warn('Deprecated opt %s/%s found', section, option)
+                logging.warning('Deprecated opt %s/%s found', section, option)
                 warnings = True
             elif not _validate_opt(section, option, opt_data):
                 if section in KNOWN_BAD_GROUPS:
@@ -129,7 +214,8 @@
                                  'cannot be validated properly.',
                                  option, section)
                     continue
-                logging.error('%s/%s not found', section, option)
+                logging.error('%s/%s is not part of the sample config',
+                              section, option)
                 errors = True
     if errors or (warnings and conf.fatal_warnings):
         return 1
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/oslo.config-8.3.3/releasenotes/notes/validator-check-defaults-e7b596a2fde781a8.yaml
 
new/oslo.config-8.5.0/releasenotes/notes/validator-check-defaults-e7b596a2fde781a8.yaml
--- 
old/oslo.config-8.3.3/releasenotes/notes/validator-check-defaults-e7b596a2fde781a8.yaml
     1970-01-01 01:00:00.000000000 +0100
+++ 
new/oslo.config-8.5.0/releasenotes/notes/validator-check-defaults-e7b596a2fde781a8.yaml
     2021-03-03 14:41:15.000000000 +0100
@@ -0,0 +1,7 @@
+---
+features:
+  - |
+    Add a ``--check-defaults`` flag to ``oslo-config-validator``. When set,
+    ``oslo-config-validator`` will compare the ``input-file`` with the sample
+    generated configuration and flag any discrepancies. It also obeys the
+    standard ``--exclude-group`` and ``--fatal-warning`` options.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo.config-8.3.3/releasenotes/source/index.rst 
new/oslo.config-8.5.0/releasenotes/source/index.rst
--- old/oslo.config-8.3.3/releasenotes/source/index.rst 2020-11-18 
18:42:30.000000000 +0100
+++ new/oslo.config-8.5.0/releasenotes/source/index.rst 2021-03-03 
14:41:15.000000000 +0100
@@ -6,6 +6,7 @@
     :maxdepth: 1
 
     unreleased
+    victoria
     ussuri
     train
     stein
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo.config-8.3.3/releasenotes/source/victoria.rst 
new/oslo.config-8.5.0/releasenotes/source/victoria.rst
--- old/oslo.config-8.3.3/releasenotes/source/victoria.rst      1970-01-01 
01:00:00.000000000 +0100
+++ new/oslo.config-8.5.0/releasenotes/source/victoria.rst      2021-03-03 
14:41:15.000000000 +0100
@@ -0,0 +1,6 @@
+=============================
+Victoria Series Release Notes
+=============================
+
+.. release-notes::
+   :branch: stable/victoria
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo.config-8.3.3/requirements.txt 
new/oslo.config-8.5.0/requirements.txt
--- old/oslo.config-8.3.3/requirements.txt      2020-11-18 18:42:30.000000000 
+0100
+++ new/oslo.config-8.5.0/requirements.txt      2021-03-03 14:41:15.000000000 
+0100
@@ -7,6 +7,6 @@
 stevedore>=1.20.0 # Apache-2.0
 oslo.i18n>=3.15.3 # Apache-2.0
 rfc3986>=1.2.0 # Apache-2.0
-PyYAML>=3.12 # MIT
+PyYAML>=5.1 # MIT
 requests>=2.18.0 # Apache-2.0
 importlib_metadata>=1.7.0;python_version<'3.8' # Apache-2.0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo.config-8.3.3/setup.cfg 
new/oslo.config-8.5.0/setup.cfg
--- old/oslo.config-8.3.3/setup.cfg     2020-11-18 18:43:08.247316800 +0100
+++ new/oslo.config-8.5.0/setup.cfg     2021-03-03 14:42:06.849606500 +0100
@@ -22,6 +22,11 @@
        Programming Language :: Python :: 3 :: Only
        Programming Language :: Python :: Implementation :: CPython
 
+[extras]
+rst-generator = 
+       rst2txt>=1.1.0 # BSD
+       sphinx>=1.8.0,!=2.1.0 # BSD
+
 [files]
 packages = 
        oslo_config
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo.config-8.3.3/test-requirements.txt 
new/oslo.config-8.5.0/test-requirements.txt
--- old/oslo.config-8.3.3/test-requirements.txt 2020-11-18 18:42:30.000000000 
+0100
+++ new/oslo.config-8.5.0/test-requirements.txt 2021-03-03 14:41:15.000000000 
+0100
@@ -25,3 +25,5 @@
 
 # Bandit security code scanner
 bandit>=1.6.0,<1.7.0 # Apache-2.0
+
+pre-commit>=2.6.0 # MIT
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo.config-8.3.3/tox.ini 
new/oslo.config-8.5.0/tox.ini
--- old/oslo.config-8.3.3/tox.ini       2020-11-18 18:42:30.000000000 +0100
+++ new/oslo.config-8.5.0/tox.ini       2021-03-03 14:41:15.000000000 +0100
@@ -1,7 +1,7 @@
 [tox]
 minversion = 3.2.0
 distribute = False
-envlist = py37,pep8
+envlist = py3,pep8
 ignore_basepython_conflict = true
 
 [testenv]
@@ -13,7 +13,7 @@
   OS_STDERR_CAPTURE={env:OS_STDERR_CAPTURE:1}
   OS_TEST_TIMEOUT={env:OS_TEST_TIMEOUT:60}
 deps =
-  
-c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/victoria}
+  
-c{env:UPPER_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master}
   -r{toxinidir}/test-requirements.txt
   -r{toxinidir}/requirements.txt
   -r{toxinidir}/doc/requirements.txt
@@ -22,16 +22,9 @@
   stestr run --suppress-attachments {posargs}
   stestr slowest
 
-[testenv:lower-constraints]
-deps =
-  -c{toxinidir}/lower-constraints.txt
-  -r{toxinidir}/test-requirements.txt
-  -r{toxinidir}/requirements.txt
-  -r{toxinidir}/doc/requirements.txt
-
 [testenv:pep8]
 commands =
-  flake8
+  pre-commit run -a
   # TODO(stephenfin): Add mypy here once it's passing
   {[testenv:bandit]commands}
 
@@ -52,11 +45,11 @@
 [testenv:docs]
 whitelist_externals = rm
 deps =
-  
-c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/victoria}
+  
-c{env:UPPER_CONSTRAINTS_FILE:https://opendev.org/openstack/requirements/raw/branch/master/upper-constraints.txt}
   -r{toxinidir}/doc/requirements.txt
 commands =
   rm -fr doc/build
-  sphinx-build -W --keep-going -b html doc/source doc/build/html {posargs}
+  sphinx-build -W --keep-going -b html -j auto doc/source doc/build/html 
{posargs}
 
 [testenv:mypy]
 commands =
@@ -72,7 +65,7 @@
 deps = {[testenv:docs]deps}
 commands =
   rm -rf releasenotes/build
-  sphinx-build -a -E -W -d releasenotes/build/doctrees --keep-going -b html 
releasenotes/source releasenotes/build/html
+  sphinx-build -W --keep-going -b html -j auto releasenotes/source 
releasenotes/build/html {posargs}
 
 [hacking]
 import_exceptions = oslo_config._i18n

Reply via email to