Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package python-castellan for 
openSUSE:Factory checked in at 2024-01-05 21:41:52
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-castellan (Old)
 and      /work/SRC/openSUSE:Factory/.python-castellan.new.28375 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-castellan"

Fri Jan  5 21:41:52 2024 rev:17 rq:1136733 version:4.3.0

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-castellan/python-castellan.changes        
2023-12-03 20:49:17.946846767 +0100
+++ 
/work/SRC/openSUSE:Factory/.python-castellan.new.28375/python-castellan.changes 
    2024-01-05 21:43:09.090093425 +0100
@@ -1,0 +2,26 @@
+Thu Jan  4 09:15:28 UTC 2024 - [email protected]
+
+- update to version 4.3.0
+  - Revert "Implement force parameter"
+  - Revert "Moves supported python runtimes from version 3.8 to 3.10"
+  - Update master for stable/zed
+  - Revert "Add secret consumers documentation and release note"
+  - Moves supported python runtimes from version 3.8 to 3.10
+  - Initial change to add secret consumers
+  - Add Python3 antelope unit tests
+  - Revert "Add secret consumers functional tests"
+  - Add force parameter functional tests
+  - Update master for stable/2023.1
+  - Implement force parameter
+  - Add support for specifying Vault KV path
+  - Add secret consumers
+  - Add secret consumers functional tests
+  - Add secret consumers documentation and release note
+  - Update TOX_CONSTRAINTS_FILE for stable/2023.2
+  - Revert "Add secret consumers"
+  - Make tests more consistent
+  - Fix tox4 error
+  - Update .gitreview for stable/2023.2
+  - Revert "Add force parameter functional tests"
+
+-------------------------------------------------------------------

Old:
----
  castellan-4.0.0.tar.gz

New:
----
  castellan-4.3.0.tar.gz

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

Other differences:
------------------
++++++ python-castellan.spec ++++++
--- /var/tmp/diff_new_pack.ervazY/_old  2024-01-05 21:43:09.674114778 +0100
+++ /var/tmp/diff_new_pack.ervazY/_new  2024-01-05 21:43:09.678114925 +0100
@@ -1,7 +1,7 @@
 #
 # spec file for package python-castellan
 #
-# Copyright (c) 2023 SUSE LLC
+# Copyright (c) 2024 SUSE LLC
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -17,13 +17,13 @@
 
 
 Name:           python-castellan
-Version:        4.0.0
+Version:        4.3.0
 Release:        0
 Summary:        Generic Key Manager interface for OpenStack
 License:        Apache-2.0
 Group:          Development/Languages/Python
 URL:            https://docs.openstack.org/castellan
-Source0:        
https://files.pythonhosted.org/packages/source/c/castellan/castellan-4.0.0.tar.gz
+Source0:        
https://files.pythonhosted.org/packages/source/c/castellan/castellan-4.3.0.tar.gz
 BuildRequires:  openstack-macros
 BuildRequires:  python3-barbicanclient >= 5.5.0
 BuildRequires:  python3-cryptography >= 2.7
@@ -74,7 +74,7 @@
 This package contains the documentation
 
 %prep
-%autosetup -p1 -n castellan-4.0.0
+%autosetup -p1 -n castellan-4.3.0
 %py_req_cleanup
 
 %build

++++++ _service ++++++
--- /var/tmp/diff_new_pack.ervazY/_old  2024-01-05 21:43:09.706115949 +0100
+++ /var/tmp/diff_new_pack.ervazY/_new  2024-01-05 21:43:09.710116095 +0100
@@ -1,13 +1,13 @@
 <services>
-  <service mode="disabled" name="renderspec">
+  <service mode="manual" name="renderspec">
     <param 
name="input-template">https://opendev.org/openstack/rpm-packaging/raw/master/openstack/castellan/castellan.spec.j2</param>
     <param name="output-name">python-castellan.spec</param>
     <param 
name="requirements">https://opendev.org/openstack/castellan/raw/master/requirements.txt</param>
     <param name="changelog-email">[email protected]</param>
     <param name="changelog-provider">gh,openstack,castellan</param>
   </service>
-  <service mode="disabled" name="download_files">
+  <service mode="manual" name="download_files">
   </service>
-  <service name="format_spec_file" mode="disabled"/>
+  <service name="format_spec_file" mode="manual"/>
 </services>
 

++++++ castellan-4.0.0.tar.gz -> castellan-4.3.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/castellan-4.0.0/.zuul.yaml 
new/castellan-4.3.0/.zuul.yaml
--- old/castellan-4.0.0/.zuul.yaml      2022-07-12 11:27:50.000000000 +0200
+++ new/castellan-4.3.0/.zuul.yaml      2023-09-22 16:47:08.000000000 +0200
@@ -1,12 +1,12 @@
 - job:
     name: castellan-functional-vault
-    parent: openstack-tox-py38
+    parent: openstack-tox-py310
     description: |
       Run tox functional-vault target
     required-projects:
       - name: openstack/castellan
     vars:
-      tox_envlist: functional-vault
+      tox_envlist: functional-vault-py310
 
 - job:
     name: castellan-functional-devstack
@@ -59,7 +59,7 @@
         - barbican-tempest-plugin-simple-crypto-castellan-src
     templates:
       - check-requirements
-      - openstack-python3-zed-jobs
+      - openstack-python3-jobs
       - periodic-stable-jobs
       - publish-openstack-docs-pti
       - release-notes-jobs-python3
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/castellan-4.0.0/AUTHORS new/castellan-4.3.0/AUTHORS
--- old/castellan-4.0.0/AUTHORS 2022-07-12 11:28:29.000000000 +0200
+++ new/castellan-4.3.0/AUTHORS 2023-09-22 16:47:32.000000000 +0200
@@ -17,13 +17,16 @@
 Doug Hellmann <[email protected]>
 Douglas Mendizábal <[email protected]>
 Douglas Mendizábal <[email protected]>
+Dr. Jens Harbott <[email protected]>
 Dung Ha <[email protected]>
 Ellen Batbouta <[email protected]>
 Elod Illes <[email protected]>
 Eric Harney <[email protected]>
 Fernando Diaz <[email protected]>
 Flavio Percoco <[email protected]>
+Ghanshyam <[email protected]>
 Ghanshyam Mann <[email protected]>
+Grzegorz Grasza <[email protected]>
 Hervé Beraud <[email protected]>
 Ian Wienand <[email protected]>
 Ivan Kolodyazhny <[email protected]>
@@ -44,6 +47,7 @@
 Lingxian Kong <[email protected]>
 Luigi Toscano <[email protected]>
 Mark Goddard <[email protected]>
+Mauricio Harley <[email protected]>
 Michael McCune <[email protected]>
 Moises Guimaraes de Medeiros <[email protected]>
 Moisés Guimarães de Medeiros <[email protected]>
@@ -55,6 +59,7 @@
 Pavlo Shchelokovskyy <[email protected]>
 Robert Clark <[email protected]>
 Sam Morrison <[email protected]>
+Scott Solkhon <[email protected]>
 Sean McGinnis <[email protected]>
 Steve Martinelli <[email protected]>
 Sungjin Yook <[email protected]>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/castellan-4.0.0/ChangeLog 
new/castellan-4.3.0/ChangeLog
--- old/castellan-4.0.0/ChangeLog       2022-07-12 11:28:29.000000000 +0200
+++ new/castellan-4.3.0/ChangeLog       2023-09-22 16:47:32.000000000 +0200
@@ -1,6 +1,39 @@
 CHANGES
 =======
 
+4.3.0
+-----
+
+* Revert "Add secret consumers"
+* Revert "Implement force parameter"
+* Revert "Add secret consumers functional tests"
+* Revert "Add force parameter functional tests"
+* Revert "Add secret consumers documentation and release note"
+* Update TOX\_CONSTRAINTS\_FILE for stable/2023.2
+* Update .gitreview for stable/2023.2
+
+4.2.0
+-----
+
+* Revert "Moves supported python runtimes from version 3.8 to 3.10"
+* Moves supported python runtimes from version 3.8 to 3.10
+* Update master for stable/2023.1
+* Add secret consumers documentation and release note
+* Add force parameter functional tests
+* Add secret consumers functional tests
+* Implement force parameter
+* Add secret consumers
+
+4.1.0
+-----
+
+* Initial change to add secret consumers
+* Add support for specifying Vault KV path
+* Fix tox4 error
+* Make tests more consistent
+* Add Python3 antelope unit tests
+* Update master for stable/zed
+
 4.0.0
 -----
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/castellan-4.0.0/PKG-INFO new/castellan-4.3.0/PKG-INFO
--- old/castellan-4.0.0/PKG-INFO        2022-07-12 11:28:29.794007300 +0200
+++ new/castellan-4.3.0/PKG-INFO        2023-09-22 16:47:32.592500000 +0200
@@ -1,6 +1,6 @@
 Metadata-Version: 1.2
 Name: castellan
-Version: 4.0.0
+Version: 4.3.0
 Summary: Generic Key Manager interface for OpenStack
 Home-page: https://docs.openstack.org/castellan/latest/
 Author: OpenStack
@@ -36,6 +36,7 @@
 Classifier: Programming Language :: Python :: 3
 Classifier: Programming Language :: Python :: 3.8
 Classifier: Programming Language :: Python :: 3.9
+Classifier: Programming Language :: Python :: 3.10
 Classifier: Programming Language :: Python :: 3 :: Only
 Classifier: Programming Language :: Python :: Implementation :: CPython
 Requires-Python: >=3.8
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/castellan-4.0.0/castellan/common/objects/key.py 
new/castellan-4.3.0/castellan/common/objects/key.py
--- old/castellan-4.0.0/castellan/common/objects/key.py 2022-07-12 
11:27:50.000000000 +0200
+++ new/castellan-4.3.0/castellan/common/objects/key.py 2023-09-22 
16:47:08.000000000 +0200
@@ -57,6 +57,7 @@
 
         dict_fields["algorithm"] = self.algorithm
         dict_fields["bit_length"] = self.bit_length
+        dict_fields["consumers"] = self.consumers
 
         return dict_fields
 
@@ -78,6 +79,7 @@
                 name=dict_fields["name"],
                 created=dict_fields["created"],
                 id=id,
+                consumers=dict_fields["consumers"]
             )
         except KeyError as e:
             raise exception.InvalidManagedObjectDictError(field=str(e))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/castellan-4.0.0/castellan/common/objects/managed_object.py 
new/castellan-4.3.0/castellan/common/objects/managed_object.py
--- old/castellan-4.0.0/castellan/common/objects/managed_object.py      
2022-07-12 11:27:50.000000000 +0200
+++ new/castellan-4.3.0/castellan/common/objects/managed_object.py      
2023-09-22 16:47:08.000000000 +0200
@@ -29,12 +29,13 @@
 class ManagedObject(object, metaclass=abc.ABCMeta):
     """Base class to represent all managed objects."""
 
-    def __init__(self, name=None, created=None, id=None):
+    def __init__(self, name=None, created=None, id=None, consumers=[]):
         """Managed Object
 
         :param name: the name of the managed object.
         :param created: the time a managed object was created.
         :param id: the ID of the object, generated after storing the object.
+        :param consumers: the list of object's consumers.
         """
         self._name = name
 
@@ -46,6 +47,7 @@
                              type(created))
 
         self._id = id
+        self._consumers = consumers
 
     @property
     def id(self):
@@ -74,6 +76,14 @@
         return self._created
 
     @property
+    def consumers(self):
+        """Returns the list of consumers for this object.
+
+        Returns the object's consumers or [] if the object does not have any.
+        """
+        return self._consumers
+
+    @property
     @abc.abstractmethod
     def format(self):
         """Returns the encoding format.
@@ -111,7 +121,8 @@
         pass
 
     @classmethod
-    def from_dict(cls, dict_fields, id=None, metadata_only=False):
+    def from_dict(cls, dict_fields, id=None, metadata_only=False,
+                  consumers=[]):
         """Returns an instance of this class based on a dict object.
 
         :param dict_fields: The dictionary containing all necessary params
@@ -119,6 +130,7 @@
         :param id: The optional param 'id' to be passed to the constructor.
         :param metadata_only: A switch to create an instance with metadata
                               only, without the secret itself.
+        :param consumers: A list with object's consumers.
         """
         try:
             value = None
@@ -134,6 +146,7 @@
                 name=dict_fields["name"],
                 created=dict_fields["created"],
                 id=id,
+                consumers=consumers
             )
         except KeyError as e:
             raise exception.InvalidManagedObjectDictError(field=str(e))
@@ -159,4 +172,5 @@
             "name": self.name,
             "created": self.created,
             "value": value,
+            "consumers": self.consumers
         }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/castellan-4.0.0/castellan/common/objects/opaque_data.py 
new/castellan-4.3.0/castellan/common/objects/opaque_data.py
--- old/castellan-4.0.0/castellan/common/objects/opaque_data.py 2022-07-12 
11:27:50.000000000 +0200
+++ new/castellan-4.3.0/castellan/common/objects/opaque_data.py 2023-09-22 
16:47:08.000000000 +0200
@@ -25,13 +25,14 @@
 class OpaqueData(managed_object.ManagedObject):
     """This class represents opaque data."""
 
-    def __init__(self, data, name=None, created=None, id=None):
+    def __init__(self, data, name=None, created=None, id=None, consumers=[]):
         """Create a new OpaqueData object.
 
         Expected type for data is a bytestring.
         """
         self._data = data
-        super().__init__(name=name, created=created, id=id)
+        super().__init__(name=name, created=created, id=id,
+                         consumers=consumers)
 
     @classmethod
     def managed_type(cls):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/castellan-4.0.0/castellan/common/objects/passphrase.py 
new/castellan-4.3.0/castellan/common/objects/passphrase.py
--- old/castellan-4.0.0/castellan/common/objects/passphrase.py  2022-07-12 
11:27:50.000000000 +0200
+++ new/castellan-4.3.0/castellan/common/objects/passphrase.py  2023-09-22 
16:47:08.000000000 +0200
@@ -25,13 +25,15 @@
 class Passphrase(managed_object.ManagedObject):
     """This class represents a passphrase."""
 
-    def __init__(self, passphrase, name=None, created=None, id=None):
+    def __init__(self, passphrase, name=None, created=None, id=None,
+                 consumers=[]):
         """Create a new Passphrase object.
 
         The expected type for the passphrase is a bytestring.
         """
         self._passphrase = passphrase
-        super().__init__(name=name, created=created, id=id)
+        super().__init__(name=name, created=created, id=id,
+                         consumers=consumers)
 
     @classmethod
     def managed_type(cls):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/castellan-4.0.0/castellan/common/objects/private_key.py 
new/castellan-4.3.0/castellan/common/objects/private_key.py
--- old/castellan-4.0.0/castellan/common/objects/private_key.py 2022-07-12 
11:27:50.000000000 +0200
+++ new/castellan-4.3.0/castellan/common/objects/private_key.py 2023-09-22 
16:47:08.000000000 +0200
@@ -26,7 +26,7 @@
     """This class represents private keys."""
 
     def __init__(self, algorithm, bit_length, key,
-                 name=None, created=None, id=None):
+                 name=None, created=None, id=None, consumers=[]):
         """Create a new PrivateKey object.
 
         The arguments specify the algorithm and bit length for the asymmetric
@@ -35,7 +35,8 @@
         self._alg = algorithm
         self._bit_length = bit_length
         self._key = key
-        super().__init__(name=name, created=created, id=id)
+        super().__init__(name=name, created=created, id=id,
+                         consumers=consumers)
 
     @classmethod
     def managed_type(cls):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/castellan-4.0.0/castellan/common/objects/public_key.py 
new/castellan-4.3.0/castellan/common/objects/public_key.py
--- old/castellan-4.0.0/castellan/common/objects/public_key.py  2022-07-12 
11:27:50.000000000 +0200
+++ new/castellan-4.3.0/castellan/common/objects/public_key.py  2023-09-22 
16:47:08.000000000 +0200
@@ -26,7 +26,7 @@
     """This class represents public keys."""
 
     def __init__(self, algorithm, bit_length, key,
-                 name=None, created=None, id=None):
+                 name=None, created=None, id=None, consumers=[]):
         """Create a new PublicKey object.
 
         The arguments specify the algorithm and bit length for the asymmetric
@@ -36,7 +36,8 @@
         self._alg = algorithm
         self._bit_length = bit_length
         self._key = key
-        super().__init__(name=name, created=created, id=id)
+        super().__init__(name=name, created=created, id=id,
+                         consumers=consumers)
 
     @classmethod
     def managed_type(cls):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/castellan-4.0.0/castellan/common/objects/symmetric_key.py 
new/castellan-4.3.0/castellan/common/objects/symmetric_key.py
--- old/castellan-4.0.0/castellan/common/objects/symmetric_key.py       
2022-07-12 11:27:50.000000000 +0200
+++ new/castellan-4.3.0/castellan/common/objects/symmetric_key.py       
2023-09-22 16:47:08.000000000 +0200
@@ -26,7 +26,7 @@
     """This class represents symmetric keys."""
 
     def __init__(self, algorithm, bit_length, key,
-                 name=None, created=None, id=None):
+                 name=None, created=None, id=None, consumers=[]):
         """Create a new SymmetricKey object.
 
         The arguments specify the algorithm and bit length for the symmetric
@@ -35,7 +35,8 @@
         self._alg = algorithm
         self._bit_length = bit_length
         self._key = key
-        super().__init__(name=name, created=created, id=id)
+        super().__init__(name=name, created=created, id=id,
+                         consumers=consumers)
 
     @classmethod
     def managed_type(cls):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/castellan-4.0.0/castellan/common/objects/x_509.py 
new/castellan-4.3.0/castellan/common/objects/x_509.py
--- old/castellan-4.0.0/castellan/common/objects/x_509.py       2022-07-12 
11:27:50.000000000 +0200
+++ new/castellan-4.3.0/castellan/common/objects/x_509.py       2023-09-22 
16:47:08.000000000 +0200
@@ -25,13 +25,14 @@
 class X509(certificate.Certificate):
     """This class represents X.509 certificates."""
 
-    def __init__(self, data, name=None, created=None, id=None):
+    def __init__(self, data, name=None, created=None, id=None, consumers=[]):
         """Create a new X509 object.
 
         The data should be in a bytestring.
         """
         self._data = data
-        super().__init__(name=name, created=created, id=id)
+        super().__init__(name=name, created=created, id=id,
+                         consumers=consumers)
 
     @classmethod
     def managed_type(cls):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/castellan-4.0.0/castellan/key_manager/vault_key_manager.py 
new/castellan-4.3.0/castellan/key_manager/vault_key_manager.py
--- old/castellan-4.0.0/castellan/key_manager/vault_key_manager.py      
2022-07-12 11:27:50.000000000 +0200
+++ new/castellan-4.3.0/castellan/key_manager/vault_key_manager.py      
2023-09-22 16:47:08.000000000 +0200
@@ -54,6 +54,9 @@
                default=_DEFAULT_MOUNTPOINT,
                help='Mountpoint of KV store in Vault to use, for example: '
                     '{}'.format(_DEFAULT_MOUNTPOINT)),
+    cfg.StrOpt('kv_path',
+               help='Path relative to root of KV store in Vault to use.'
+               ),
     cfg.IntOpt('kv_version',
                default=_DEFAULT_VERSION,
                help='Version of KV store in Vault to use, for example: '
@@ -101,6 +104,7 @@
         self._approle_token_ttl = None
         self._approle_token_issue = None
         self._kv_mountpoint = self._conf.vault.kv_mountpoint
+        self._kv_path = self._conf.vault.kv_path
         self._kv_version = self._conf.vault.kv_version
         self._vault_url = self._conf.vault.vault_url
         self._namespace = self._conf.vault.namespace
@@ -115,14 +119,14 @@
         return self._vault_url
 
     def _get_resource_url(self, key_id=None):
-        return '{}v1/{}/{}{}'.format(
+        return '{}v1/{}/{}{}{}'.format(
             self._get_url(),
             self._kv_mountpoint,
 
             '' if self._kv_version == 1 else
             'data/' if key_id else
             'metadata/',  # no key_id is for listing and 'data/' doesn't works
-
+            (self._kv_path + '/') if self._kv_path else '',
             key_id if key_id else '?list=true')
 
     @property
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/castellan-4.0.0/castellan/options.py 
new/castellan-4.3.0/castellan/options.py
--- old/castellan-4.0.0/castellan/options.py    2022-07-12 11:27:50.000000000 
+0200
+++ new/castellan-4.3.0/castellan/options.py    2023-09-22 16:47:08.000000000 
+0200
@@ -39,7 +39,7 @@
                  verify_ssl_path=None,
                  api_class=None, vault_root_token_id=None,
                  vault_approle_role_id=None, vault_approle_secret_id=None,
-                 vault_kv_mountpoint=None, vault_url=None,
+                 vault_kv_mountpoint=None, vault_kv_path=None, vault_url=None,
                  vault_ssl_ca_crt_file=None, vault_use_ssl=None,
                  vault_namespace=None,
                  barbican_endpoint_type=None,
@@ -61,6 +61,7 @@
     :param vault_approle_secret_id: Use this for the approle secret_id
                                     for vault.
     :param vault_kv_mountpoint: Mountpoint of KV store in vault to use.
+    :param vault_kv_path: Path relative to root of KV store in Vault to use.
     :param vault_url: Use this for the url for vault.
     :param vault_use_ssl: Use this to force vault driver to use ssl.
     :param vault_ssl_ca_crt_file: Use this for the CA file for vault.
@@ -124,6 +125,9 @@
         if vault_kv_mountpoint is not None:
             conf.set_default('kv_mountpoint', vault_kv_mountpoint,
                              group=vkm._VAULT_OPT_GROUP)
+        if vault_kv_path is not None:
+            conf.set_default('kv_path', vault_kv_path,
+                             group=vkm._VAULT_OPT_GROUP)
         if vault_url is not None:
             conf.set_default('vault_url', vault_url,
                              group=vkm._VAULT_OPT_GROUP)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/castellan-4.0.0/castellan/tests/functional/key_manager/test_key_manager.py 
new/castellan-4.3.0/castellan/tests/functional/key_manager/test_key_manager.py
--- 
old/castellan-4.0.0/castellan/tests/functional/key_manager/test_key_manager.py  
    2022-07-12 11:27:50.000000000 +0200
+++ 
new/castellan-4.3.0/castellan/tests/functional/key_manager/test_key_manager.py  
    2023-09-22 16:47:08.000000000 +0200
@@ -18,6 +18,7 @@
 
 These test cases should pass against any key manager.
 """
+from oslo_utils import uuidutils
 
 from castellan.common import exception
 from castellan.common.objects import opaque_data
@@ -57,13 +58,13 @@
 
 
 def _get_test_opaque_data():
-    data = bytes(b'opaque data')
+    data = bytes(uuidutils.generate_uuid(), encoding='utf-8')
     opaque_object = opaque_data.OpaqueData(data)
     return opaque_object
 
 
 def _get_test_passphrase():
-    data = bytes(b'passphrase')
+    data = bytes(uuidutils.generate_uuid(), encoding='utf-8')
     passphrase_object = passphrase.Passphrase(data)
     return passphrase_object
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/castellan-4.0.0/castellan/tests/unit/objects/test_opaque.py 
new/castellan-4.3.0/castellan/tests/unit/objects/test_opaque.py
--- old/castellan-4.0.0/castellan/tests/unit/objects/test_opaque.py     
2022-07-12 11:27:50.000000000 +0200
+++ new/castellan-4.3.0/castellan/tests/unit/objects/test_opaque.py     
2023-09-22 16:47:08.000000000 +0200
@@ -26,12 +26,16 @@
     def _create_data(self):
         return opaque_data.OpaqueData(self.data,
                                       self.name,
-                                      self.created)
+                                      self.created,
+                                      consumers=self.consumers)
 
     def setUp(self):
         self.data = bytes(b"secret opaque data")
         self.name = 'my opaque'
         self.created = 1448088699
+        self.consumers = [{'service': 'service_test',
+                           'resource_type': 'type_test',
+                           'resource_id': 'id_test'}]
         self.opaque_data = self._create_data()
 
         super(OpaqueDataTestCase, self).setUp()
@@ -55,11 +59,15 @@
     def test_get_created(self):
         self.assertEqual(self.created, self.opaque_data.created)
 
+    def test_get_consumers(self):
+        self.assertEqual(self.consumers, self.opaque_data.consumers)
+
     def test_get_created_none(self):
         created = None
         data = opaque_data.OpaqueData(self.data,
                                       self.name,
-                                      created)
+                                      created,
+                                      consumers=self.consumers)
 
         self.assertEqual(created, data.created)
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/castellan-4.0.0/castellan/tests/unit/objects/test_passphrase.py 
new/castellan-4.3.0/castellan/tests/unit/objects/test_passphrase.py
--- old/castellan-4.0.0/castellan/tests/unit/objects/test_passphrase.py 
2022-07-12 11:27:50.000000000 +0200
+++ new/castellan-4.3.0/castellan/tests/unit/objects/test_passphrase.py 
2023-09-22 16:47:08.000000000 +0200
@@ -26,12 +26,16 @@
     def _create_passphrase(self):
         return passphrase.Passphrase(self.passphrase_data,
                                      self.name,
-                                     self.created)
+                                     self.created,
+                                     consumers=self.consumers)
 
     def setUp(self):
         self.passphrase_data = bytes(b"secret passphrase")
         self.name = 'my phrase'
         self.created = 1448088699
+        self.consumers = [{'service': 'service_test',
+                           'resource_type': 'type_test',
+                           'resource_id': 'id_test'}]
         self.passphrase = self._create_passphrase()
 
         super(PassphraseTestCase, self).setUp()
@@ -55,11 +59,15 @@
     def test_get_created(self):
         self.assertEqual(self.created, self.passphrase.created)
 
+    def test_get_consumers(self):
+        self.assertEqual(self.consumers, self.passphrase.consumers)
+
     def test_get_created_none(self):
         created = None
         phrase = passphrase.Passphrase(self.passphrase_data,
                                        self.name,
-                                       created)
+                                       created,
+                                       consumers=self.consumers)
 
         self.assertEqual(created, phrase.created)
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/castellan-4.0.0/castellan/tests/unit/objects/test_private_key.py 
new/castellan-4.3.0/castellan/tests/unit/objects/test_private_key.py
--- old/castellan-4.0.0/castellan/tests/unit/objects/test_private_key.py        
2022-07-12 11:27:50.000000000 +0200
+++ new/castellan-4.3.0/castellan/tests/unit/objects/test_private_key.py        
2023-09-22 16:47:08.000000000 +0200
@@ -29,7 +29,8 @@
                                       self.bit_length,
                                       self.encoded,
                                       self.name,
-                                      self.created)
+                                      self.created,
+                                      consumers=self.consumers)
 
     def setUp(self):
         self.algorithm = 'RSA'
@@ -37,6 +38,9 @@
         self.encoded = bytes(utils.get_private_key_der())
         self.name = 'my key'
         self.created = 1448088699
+        self.consumers = [{'service': 'service_test',
+                           'resource_type': 'type_test',
+                           'resource_id': 'id_test'}]
 
         super(PrivateKeyTestCase, self).setUp()
 
@@ -69,13 +73,17 @@
     def test_get_created(self):
         self.assertEqual(self.created, self.key.created)
 
+    def test_get_consumers(self):
+        self.assertEqual(self.consumers, self.key.consumers)
+
     def test_get_created_none(self):
         created = None
         key = private_key.PrivateKey(self.algorithm,
                                      self.bit_length,
                                      self.encoded,
                                      self.name,
-                                     created)
+                                     created,
+                                     consumers=self.consumers)
 
         self.assertEqual(created, key.created)
 
@@ -88,7 +96,8 @@
 
         other_key = private_key.PrivateKey(self.algorithm,
                                            self.bit_length,
-                                           self.encoded)
+                                           self.encoded,
+                                           consumers=self.consumers)
         self.assertTrue(self.key == other_key)
         self.assertFalse(self.key is other_key)
 
@@ -100,14 +109,16 @@
         other_key = private_key.PrivateKey('DSA',
                                            self.bit_length,
                                            self.encoded,
-                                           self.name)
+                                           self.name,
+                                           consumers=self.consumers)
         self.assertTrue(self.key != other_key)
 
     def test___ne___bit_length(self):
         other_key = private_key.PrivateKey(self.algorithm,
                                            4096,
                                            self.encoded,
-                                           self.name)
+                                           self.name,
+                                           consumers=self.consumers)
         self.assertTrue(self.key != other_key)
 
     def test___ne___encoded(self):
@@ -115,9 +126,22 @@
         other_key = private_key.PrivateKey(self.algorithm,
                                            self.bit_length,
                                            different_encoded,
-                                           self.name)
+                                           self.name,
+                                           consumers=self.consumers)
         self.assertTrue(self.key != other_key)
 
+    def test___ne___consumers(self):
+        different_consumers = [{'service': 'other_service',
+                                'resource_type': 'other_type',
+                                'resource_id': 'other_id'}]
+        other_key = private_key.PrivateKey(self.algorithm,
+                                           self.bit_length,
+                                           self.encoded,
+                                           self.name,
+                                           consumers=different_consumers)
+
+        self.assertTrue(self.key is not other_key)
+
     def test_to_and_from_dict(self):
         other = objects.from_dict(self.key.to_dict())
         self.assertEqual(self.key, other)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/castellan-4.0.0/castellan/tests/unit/objects/test_public_key.py 
new/castellan-4.3.0/castellan/tests/unit/objects/test_public_key.py
--- old/castellan-4.0.0/castellan/tests/unit/objects/test_public_key.py 
2022-07-12 11:27:50.000000000 +0200
+++ new/castellan-4.3.0/castellan/tests/unit/objects/test_public_key.py 
2023-09-22 16:47:08.000000000 +0200
@@ -29,7 +29,8 @@
                                     self.bit_length,
                                     self.encoded,
                                     self.name,
-                                    self.created)
+                                    self.created,
+                                    consumers=self.consumers)
 
     def setUp(self):
         self.algorithm = 'RSA'
@@ -37,6 +38,9 @@
         self.encoded = bytes(utils.get_public_key_der())
         self.name = 'my key'
         self.created = 1448088699
+        self.consumers = [{'service': 'service_test',
+                           'resource_type': 'type_test',
+                           'resource_id': 'id_test'}]
 
         super(PublicKeyTestCase, self).setUp()
 
@@ -48,7 +52,8 @@
                                  self.bit_length,
                                  None,
                                  self.name,
-                                 self.created)
+                                 self.created,
+                                 consumers=self.consumers)
         self.assertTrue(k.is_metadata_only())
 
     def test_get_algorithm(self):
@@ -69,13 +74,17 @@
     def test_get_created(self):
         self.assertEqual(self.created, self.key.created)
 
+    def test_get_consumers(self):
+        self.assertEqual(self.consumers, self.key.consumers)
+
     def test_get_created_none(self):
         created = None
         key = public_key.PublicKey(self.algorithm,
                                    self.bit_length,
                                    self.encoded,
                                    self.name,
-                                   created)
+                                   created,
+                                   consumers=self.consumers)
 
         self.assertEqual(created, key.created)
 
@@ -88,7 +97,8 @@
 
         other_key = public_key.PublicKey(self.algorithm,
                                          self.bit_length,
-                                         self.encoded)
+                                         self.encoded,
+                                         consumers=self.consumers)
         self.assertTrue(self.key == other_key)
         self.assertFalse(self.key is other_key)
 
@@ -100,14 +110,16 @@
         other_key = public_key.PublicKey('DSA',
                                          self.bit_length,
                                          self.encoded,
-                                         self.name)
+                                         self.name,
+                                         consumers=self.consumers)
         self.assertTrue(self.key != other_key)
 
     def test___ne___bit_length(self):
         other_key = public_key.PublicKey(self.algorithm,
                                          4096,
                                          self.encoded,
-                                         self.name)
+                                         self.name,
+                                         consumers=self.consumers)
         self.assertTrue(self.key != other_key)
 
     def test___ne___encoded(self):
@@ -115,9 +127,21 @@
         other_key = public_key.PublicKey(self.algorithm,
                                          self.bit_length,
                                          different_encoded,
-                                         self.name)
+                                         self.name,
+                                         consumers=self.consumers)
         self.assertTrue(self.key != other_key)
 
+    def test___ne___consumers(self):
+        different_consumers = [{'service': 'other_service',
+                                'resource_type': 'other_type',
+                                'resource_id': 'other_id'}]
+        other_key = public_key.PublicKey(self.algorithm,
+                                         self.bit_length,
+                                         self.encoded,
+                                         self.name,
+                                         consumers=different_consumers)
+        self.assertTrue(self.key is not other_key)
+
     def test_to_and_from_dict(self):
         other = objects.from_dict(self.key.to_dict())
         self.assertEqual(self.key, other)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/castellan-4.0.0/castellan/tests/unit/objects/test_symmetric_key.py 
new/castellan-4.3.0/castellan/tests/unit/objects/test_symmetric_key.py
--- old/castellan-4.0.0/castellan/tests/unit/objects/test_symmetric_key.py      
2022-07-12 11:27:50.000000000 +0200
+++ new/castellan-4.3.0/castellan/tests/unit/objects/test_symmetric_key.py      
2023-09-22 16:47:08.000000000 +0200
@@ -28,7 +28,8 @@
                                     self.bit_length,
                                     self.encoded,
                                     self.name,
-                                    self.created)
+                                    self.created,
+                                    consumers=self.consumers)
 
     def setUp(self):
         self.algorithm = 'AES'
@@ -36,6 +37,9 @@
         self.bit_length = len(self.encoded) * 8
         self.name = 'my key'
         self.created = 1448088699
+        self.consumers = [{'service': 'service_test',
+                           'resource_type': 'type_test',
+                           'resource_id': 'id_test'}]
 
         super(SymmetricKeyTestCase, self).setUp()
 
@@ -47,7 +51,8 @@
                                  self.bit_length,
                                  None,
                                  self.name,
-                                 self.created)
+                                 self.created,
+                                 consumers=self.consumers)
         self.assertTrue(k.is_metadata_only())
 
     def test_get_format(self):
@@ -68,13 +73,17 @@
     def test_get_created(self):
         self.assertEqual(self.created, self.key.created)
 
+    def test_get_consumers(self):
+        self.assertEqual(self.consumers, self.key.consumers)
+
     def test_get_created_none(self):
         created = None
         key = sym_key.SymmetricKey(self.algorithm,
                                    self.bit_length,
                                    self.encoded,
                                    self.name,
-                                   created)
+                                   created,
+                                   consumers=self.consumers)
 
         self.assertEqual(created, key.created)
 
@@ -87,7 +96,8 @@
 
         other_key = sym_key.SymmetricKey(self.algorithm,
                                          self.bit_length,
-                                         self.encoded)
+                                         self.encoded,
+                                         consumers=self.consumers)
         self.assertTrue(self.key == other_key)
         self.assertFalse(self.key is other_key)
 
@@ -99,14 +109,16 @@
         other_key = sym_key.SymmetricKey('DES',
                                          self.bit_length,
                                          self.encoded,
-                                         self.name)
+                                         self.name,
+                                         consumers=self.consumers)
         self.assertTrue(self.key != other_key)
 
     def test___ne___bit_length(self):
         other_key = sym_key.SymmetricKey(self.algorithm,
                                          self.bit_length * 2,
                                          self.encoded,
-                                         self.name)
+                                         self.name,
+                                         consumers=self.consumers)
         self.assertTrue(self.key != other_key)
 
     def test___ne___encoded(self):
@@ -114,9 +126,21 @@
         other_key = sym_key.SymmetricKey(self.algorithm,
                                          self.bit_length,
                                          different_encoded,
-                                         self.name)
+                                         self.name,
+                                         consumers=self.consumers)
         self.assertTrue(self.key != other_key)
 
+    def test___ne___consumers(self):
+        different_consumers = [{'service': 'other_service',
+                                'resource_type': 'other_type',
+                                'resource_id': 'other_id'}]
+        other_key = sym_key.SymmetricKey(self.algorithm,
+                                         self.bit_length,
+                                         self.encoded,
+                                         self.name,
+                                         consumers=different_consumers)
+        self.assertTrue(self.key is not other_key)
+
     def test_to_and_from_dict(self):
         other = objects.from_dict(self.key.to_dict())
         self.assertEqual(self.key, other)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/castellan-4.0.0/castellan/tests/unit/objects/test_x_509.py 
new/castellan-4.3.0/castellan/tests/unit/objects/test_x_509.py
--- old/castellan-4.0.0/castellan/tests/unit/objects/test_x_509.py      
2022-07-12 11:27:50.000000000 +0200
+++ new/castellan-4.3.0/castellan/tests/unit/objects/test_x_509.py      
2023-09-22 16:47:08.000000000 +0200
@@ -27,12 +27,16 @@
     def _create_cert(self):
         return x_509.X509(self.data,
                           self.name,
-                          self.created)
+                          self.created,
+                          consumers=self.consumers)
 
     def setUp(self):
         self.data = utils.get_certificate_der()
         self.name = 'my cert'
         self.created = 1448088699
+        self.consumers = [{'service': 'service_test',
+                           'resource_type': 'type_test',
+                           'resource_id': 'id_test'}]
 
         super(X509TestCase, self).setUp()
 
@@ -55,11 +59,15 @@
     def test_get_created(self):
         self.assertEqual(self.created, self.cert.created)
 
+    def test_get_consumers(self):
+        self.assertEqual(self.consumers, self.cert.consumers)
+
     def test_get_created_none(self):
         created = None
         cert = x_509.X509(self.data,
                           self.name,
-                          created)
+                          created,
+                          consumers=self.consumers)
 
         self.assertEqual(created, cert.created)
 
@@ -82,6 +90,16 @@
         other_x509 = x_509.X509(b'\x00\x00\x00', self.name)
         self.assertTrue(self.cert != other_x509)
 
+    def test___ne___consumers(self):
+        different_consumers = [{'service': 'other_service',
+                                'resource_type': 'other_type',
+                                'resource_id': 'other_id'}]
+        other_cert = x_509.X509(self.data,
+                                self.name,
+                                self.created,
+                                consumers=different_consumers)
+        self.assertTrue(self.cert is not other_cert)
+
     def test_to_and_from_dict(self):
         other = objects.from_dict(self.cert.to_dict())
         self.assertEqual(self.cert, other)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/castellan-4.0.0/castellan.egg-info/PKG-INFO 
new/castellan-4.3.0/castellan.egg-info/PKG-INFO
--- old/castellan-4.0.0/castellan.egg-info/PKG-INFO     2022-07-12 
11:28:29.000000000 +0200
+++ new/castellan-4.3.0/castellan.egg-info/PKG-INFO     2023-09-22 
16:47:32.000000000 +0200
@@ -1,6 +1,6 @@
 Metadata-Version: 1.2
 Name: castellan
-Version: 4.0.0
+Version: 4.3.0
 Summary: Generic Key Manager interface for OpenStack
 Home-page: https://docs.openstack.org/castellan/latest/
 Author: OpenStack
@@ -36,6 +36,7 @@
 Classifier: Programming Language :: Python :: 3
 Classifier: Programming Language :: Python :: 3.8
 Classifier: Programming Language :: Python :: 3.9
+Classifier: Programming Language :: Python :: 3.10
 Classifier: Programming Language :: Python :: 3 :: Only
 Classifier: Programming Language :: Python :: Implementation :: CPython
 Requires-Python: >=3.8
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/castellan-4.0.0/castellan.egg-info/SOURCES.txt 
new/castellan-4.3.0/castellan.egg-info/SOURCES.txt
--- old/castellan-4.0.0/castellan.egg-info/SOURCES.txt  2022-07-12 
11:28:29.000000000 +0200
+++ new/castellan-4.3.0/castellan.egg-info/SOURCES.txt  2023-09-22 
16:47:32.000000000 +0200
@@ -117,6 +117,7 @@
 releasenotes/notes/vault-approle-support-5ea04daea07a152f.yaml
 releasenotes/notes/vault-kv-mountpoint-919eb547764a0c74.yaml
 releasenotes/notes/vault-namespaces-7d334e7407396df9.yaml
+releasenotes/source/2023.1.rst
 releasenotes/source/conf.py
 releasenotes/source/index.rst
 releasenotes/source/pike.rst
@@ -130,6 +131,7 @@
 releasenotes/source/wallaby.rst
 releasenotes/source/xena.rst
 releasenotes/source/yoga.rst
+releasenotes/source/zed.rst
 releasenotes/source/_static/.placeholder
 releasenotes/source/_templates/.placeholder
 tools/setup-vault-env.sh
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/castellan-4.0.0/castellan.egg-info/pbr.json 
new/castellan-4.3.0/castellan.egg-info/pbr.json
--- old/castellan-4.0.0/castellan.egg-info/pbr.json     2022-07-12 
11:28:29.000000000 +0200
+++ new/castellan-4.3.0/castellan.egg-info/pbr.json     2023-09-22 
16:47:32.000000000 +0200
@@ -1 +1 @@
-{"git_version": "73569c8", "is_release": true}
\ No newline at end of file
+{"git_version": "7033db5", "is_release": true}
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/castellan-4.0.0/releasenotes/source/2023.1.rst 
new/castellan-4.3.0/releasenotes/source/2023.1.rst
--- old/castellan-4.0.0/releasenotes/source/2023.1.rst  1970-01-01 
01:00:00.000000000 +0100
+++ new/castellan-4.3.0/releasenotes/source/2023.1.rst  2023-09-22 
16:47:08.000000000 +0200
@@ -0,0 +1,6 @@
+===========================
+2023.1 Series Release Notes
+===========================
+
+.. release-notes::
+   :branch: stable/2023.1
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/castellan-4.0.0/releasenotes/source/index.rst 
new/castellan-4.3.0/releasenotes/source/index.rst
--- old/castellan-4.0.0/releasenotes/source/index.rst   2022-07-12 
11:27:50.000000000 +0200
+++ new/castellan-4.3.0/releasenotes/source/index.rst   2023-09-22 
16:47:08.000000000 +0200
@@ -6,6 +6,8 @@
    :maxdepth: 1
 
    unreleased
+   2023.1
+   zed
    yoga
    xena
    wallaby
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/castellan-4.0.0/releasenotes/source/zed.rst 
new/castellan-4.3.0/releasenotes/source/zed.rst
--- old/castellan-4.0.0/releasenotes/source/zed.rst     1970-01-01 
01:00:00.000000000 +0100
+++ new/castellan-4.3.0/releasenotes/source/zed.rst     2023-09-22 
16:47:08.000000000 +0200
@@ -0,0 +1,6 @@
+========================
+Zed Series Release Notes
+========================
+
+.. release-notes::
+   :branch: stable/zed
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/castellan-4.0.0/setup.cfg 
new/castellan-4.3.0/setup.cfg
--- old/castellan-4.0.0/setup.cfg       2022-07-12 11:28:29.794007300 +0200
+++ new/castellan-4.3.0/setup.cfg       2023-09-22 16:47:32.592500000 +0200
@@ -17,6 +17,7 @@
        Programming Language :: Python :: 3
        Programming Language :: Python :: 3.8
        Programming Language :: Python :: 3.9
+       Programming Language :: Python :: 3.10
        Programming Language :: Python :: 3 :: Only
        Programming Language :: Python :: Implementation :: CPython
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/castellan-4.0.0/tox.ini new/castellan-4.3.0/tox.ini
--- old/castellan-4.0.0/tox.ini 2022-07-12 11:27:50.000000000 +0200
+++ new/castellan-4.3.0/tox.ini 2023-09-22 16:47:08.000000000 +0200
@@ -2,7 +2,6 @@
 minversion = 3.18.0
 envlist = py3,pep8
 ignore_basepython_conflict = True
-skipsdist = True
 
 [testenv]
 usedevelop = True
@@ -11,10 +10,10 @@
    VIRTUAL_ENV={envdir}
    OS_TEST_PATH=./castellan/tests/unit
 deps =
-       
-c{env:TOX_CONSTRAINTS_FILE:https://opendev.org/openstack/requirements/raw/branch/master/upper-constraints.txt}
+       
-c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/2023.2}
        -r{toxinidir}/requirements.txt
        -r{toxinidir}/test-requirements.txt
-commands = stestr run --slowest {posargs}
+commands = stestr run --slowest --concurrency=1 {posargs}
 
 [testenv:pep8]
 commands =
@@ -81,7 +80,7 @@
 setenv =
     VIRTUAL_ENV={envdir}
     OS_TEST_PATH=./castellan/tests/functional
-commands = stestr run --slowest {posargs}
+commands = stestr run --slowest --concurrency=1 {posargs}
 
 [testenv:functional-vault]
 passenv = HOME
@@ -90,7 +89,9 @@
     VIRTUAL_ENV={envdir}
     OS_TEST_PATH=./castellan/tests/functional
 commands =
-    {toxinidir}/tools/setup-vault-env.sh pifpaf -e VAULT_TEST run vault -- 
stestr run --slowest {posargs}
+    {toxinidir}/tools/setup-vault-env.sh pifpaf -e VAULT_TEST run vault -- 
stestr run --concurrency=1 --slowest {posargs}
+allowlist_externals =
+  {toxinidir}/tools/setup-vault-env.sh
 
 [testenv:genconfig]
 commands =

Reply via email to