From d0c9ee0d1f225235597acd10002cbea7b2417757 Mon Sep 17 00:00:00 2001 From: Haim Schneider <104054548+haimsch@users.noreply.github.com> Date: Mon, 25 Aug 2025 09:49:27 +0300 Subject: [PATCH 1/2] Revert "Revert "Add retrieved_at field (#94)" (#95)" This reverts commit 55ddab04da54e5f6e6f731a6e8c0d60be90df886. --- ibm_secrets_manager_sdk/secrets_manager_v2.py | 251 +++++++++++++++++- test/unit/test_secrets_manager_v2.py | 51 ++-- 2 files changed, 280 insertions(+), 22 deletions(-) diff --git a/ibm_secrets_manager_sdk/secrets_manager_v2.py b/ibm_secrets_manager_sdk/secrets_manager_v2.py index bb1e07a..fece0a7 100644 --- a/ibm_secrets_manager_sdk/secrets_manager_v2.py +++ b/ibm_secrets_manager_sdk/secrets_manager_v2.py @@ -14,7 +14,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -# IBM OpenAPI SDK Code Generator Version: 3.104.0-b4a47c49-20250418-184351 +# IBM OpenAPI SDK Code Generator Version: 3.107.0-b68ebf7a-20250811-145645 """ With IBM Cloud® Secrets Manager, you can create, lease, and centrally manage secrets that @@ -80,7 +80,7 @@ def construct_service_url( :param str instance_id: (optional) The Secrets Manager Instance ID assigned by the service provider (default 'provide-here-your-smgr-instanceuuid') - :param str region: (optional) The region where you provisioned your Secrets Manager Instance. Available values: us-south, us-east, au-syd, jp-osa, jp-tok, eu-de, eu-gb, eu-es, ca-tor, br-sao + :param str region: (optional) The region where you provisioned your Secrets Manager Instance. Available values: us-south, us-east, au-syd, jp-osa, jp-tok, eu-de, eu-gb, eu-es, ca-tor, ca-mon, br-sao (default 'us-south') :return: The formatted URL with all variable placeholders replaced by values. :rtype: str @@ -442,8 +442,8 @@ def list_secrets( `..?limit=25`. :param str sort: (optional) Sort a collection of secrets by the specified field in ascending order. To sort in descending order use the `-` character - **Available values:** id | created_at | updated_at | expiration_date | - secret_type | name + **Available values:** id | created_at | updated_at | retrieved_at | + expiration_date | secret_type | name **Usage:** To sort a list of secrets by their creation date, use `../secrets?sort=created_at`. :param str search: (optional) Obtain a collection of secrets that contain @@ -9183,6 +9183,9 @@ class ArbitrarySecret(Secret): that created the secret. :param datetime created_at: The date when the resource was created. The date format follows `RFC 3339`. + :param datetime retrieved_at: (optional) The date when the data of the secret + was last retrieved. The date format follows RFC 3339. Epoch date if there is no + record of secret data retrieval. :param str crn: A CRN that uniquely identifies an IBM Cloud resource. :param dict custom_metadata: (optional) The secret metadata that a user can customize. @@ -9233,6 +9236,7 @@ def __init__( updated_at: datetime, versions_total: int, *, + retrieved_at: Optional[datetime] = None, custom_metadata: Optional[dict] = None, description: Optional[str] = None, downloaded: Optional[bool] = None, @@ -9261,6 +9265,9 @@ def __init__( :param datetime updated_at: The date when a resource was modified. The date format follows `RFC 3339`. :param int versions_total: The number of versions of your secret. + :param datetime retrieved_at: (optional) The date when the data of the + secret was last retrieved. The date format follows RFC 3339. Epoch date if + there is no record of secret data retrieval. :param dict custom_metadata: (optional) The secret metadata that a user can customize. :param str description: (optional) An extended description of your secret. @@ -9277,6 +9284,7 @@ def __init__( # pylint: disable=super-init-not-called self.created_by = created_by self.created_at = created_at + self.retrieved_at = retrieved_at self.crn = crn self.custom_metadata = custom_metadata self.description = description @@ -9307,6 +9315,8 @@ def from_dict(cls, _dict: Dict) -> 'ArbitrarySecret': args['created_at'] = string_to_datetime(created_at) else: raise ValueError('Required property \'created_at\' not present in ArbitrarySecret JSON') + if (retrieved_at := _dict.get('retrieved_at')) is not None: + args['retrieved_at'] = string_to_datetime(retrieved_at) if (crn := _dict.get('crn')) is not None: args['crn'] = crn else: @@ -9367,6 +9377,8 @@ def to_dict(self) -> Dict: _dict['created_by'] = self.created_by if hasattr(self, 'created_at') and self.created_at is not None: _dict['created_at'] = datetime_to_string(self.created_at) + if hasattr(self, 'retrieved_at') and self.retrieved_at is not None: + _dict['retrieved_at'] = datetime_to_string(self.retrieved_at) if hasattr(self, 'crn') and self.crn is not None: _dict['crn'] = self.crn if hasattr(self, 'custom_metadata') and self.custom_metadata is not None: @@ -9459,6 +9471,9 @@ class ArbitrarySecretMetadata(SecretMetadata): that created the secret. :param datetime created_at: The date when the resource was created. The date format follows `RFC 3339`. + :param datetime retrieved_at: (optional) The date when the data of the secret + was last retrieved. The date format follows RFC 3339. Epoch date if there is no + record of secret data retrieval. :param str crn: A CRN that uniquely identifies an IBM Cloud resource. :param dict custom_metadata: (optional) The secret metadata that a user can customize. @@ -9507,6 +9522,7 @@ def __init__( updated_at: datetime, versions_total: int, *, + retrieved_at: Optional[datetime] = None, custom_metadata: Optional[dict] = None, description: Optional[str] = None, downloaded: Optional[bool] = None, @@ -9534,6 +9550,9 @@ def __init__( :param datetime updated_at: The date when a resource was modified. The date format follows `RFC 3339`. :param int versions_total: The number of versions of your secret. + :param datetime retrieved_at: (optional) The date when the data of the + secret was last retrieved. The date format follows RFC 3339. Epoch date if + there is no record of secret data retrieval. :param dict custom_metadata: (optional) The secret metadata that a user can customize. :param str description: (optional) An extended description of your secret. @@ -9548,6 +9567,7 @@ def __init__( # pylint: disable=super-init-not-called self.created_by = created_by self.created_at = created_at + self.retrieved_at = retrieved_at self.crn = crn self.custom_metadata = custom_metadata self.description = description @@ -9577,6 +9597,8 @@ def from_dict(cls, _dict: Dict) -> 'ArbitrarySecretMetadata': args['created_at'] = string_to_datetime(created_at) else: raise ValueError('Required property \'created_at\' not present in ArbitrarySecretMetadata JSON') + if (retrieved_at := _dict.get('retrieved_at')) is not None: + args['retrieved_at'] = string_to_datetime(retrieved_at) if (crn := _dict.get('crn')) is not None: args['crn'] = crn else: @@ -9635,6 +9657,8 @@ def to_dict(self) -> Dict: _dict['created_by'] = self.created_by if hasattr(self, 'created_at') and self.created_at is not None: _dict['created_at'] = datetime_to_string(self.created_at) + if hasattr(self, 'retrieved_at') and self.retrieved_at is not None: + _dict['retrieved_at'] = datetime_to_string(self.retrieved_at) if hasattr(self, 'crn') and self.crn is not None: _dict['crn'] = self.crn if hasattr(self, 'custom_metadata') and self.custom_metadata is not None: @@ -10534,6 +10558,12 @@ def __ne__(self, other: 'ArbitrarySecretVersionPrototype') -> bool: class CommonRotationPolicy(RotationPolicy): """ This field indicates whether Secrets Manager rotates your secrets automatically. + Rotation interval cannot exceed the assiged TTL value. + Custom Credentials: Minimum 6 hours, Maximum 3 months. + Service Credentials: Minimum 1 day, Maximum 3 months. + IAM Credentials: Minimum 1 day, Maximum 3 months. + Private certificate: Minimum 1 day, Maximum 24 months. + User credentials: Minimum 1 day, Maximum 24 months. :param bool auto_rotate: This field indicates whether Secrets Manager rotates your secret automatically. @@ -10622,6 +10652,7 @@ class UnitEnum(str, Enum): DAY = 'day' MONTH = 'month' + HOUR = 'hour' @@ -11330,6 +11361,9 @@ class CustomCredentialsSecret(Secret): that created the secret. :param datetime created_at: The date when the resource was created. The date format follows `RFC 3339`. + :param datetime retrieved_at: (optional) The date when the data of the secret + was last retrieved. The date format follows RFC 3339. Epoch date if there is no + record of secret data retrieval. :param str crn: A CRN that uniquely identifies an IBM Cloud resource. :param dict custom_metadata: (optional) The secret metadata that a user can customize. @@ -11391,6 +11425,8 @@ class CustomCredentialsSecret(Secret): :param str processing_task_id: (optional) A Secret Manager task identifier. :param int queued_task_count: (optional) Number of queued tasks for this secret. :param str last_failed_task_id: (optional) A Secret Manager task identifier. + :param bool last_rotation_failed: (optional) Indicates if the last rotation + (automatic or manual) for the secret failed. :param str configuration: The name of the custom credentials configuration. :param dict parameters: (optional) The fields that can be passed to and from the custom credentials engine. Allowed types are 'string', 'integer' and 'boolean'. @@ -11411,6 +11447,7 @@ def __init__( configuration: str, credentials_content: dict, *, + retrieved_at: Optional[datetime] = None, custom_metadata: Optional[dict] = None, description: Optional[str] = None, downloaded: Optional[bool] = None, @@ -11428,6 +11465,7 @@ def __init__( processing_task_id: Optional[str] = None, queued_task_count: Optional[int] = None, last_failed_task_id: Optional[str] = None, + last_rotation_failed: Optional[bool] = None, parameters: Optional[dict] = None, ) -> None: """ @@ -11450,6 +11488,9 @@ def __init__( :param dict credentials_content: The fields that can be passed to and from the custom credentials engine. Allowed types are 'string', 'integer' and 'boolean'. + :param datetime retrieved_at: (optional) The date when the data of the + secret was last retrieved. The date format follows RFC 3339. Epoch date if + there is no record of secret data retrieval. :param dict custom_metadata: (optional) The secret metadata that a user can customize. :param str description: (optional) An extended description of your secret. @@ -11487,6 +11528,7 @@ def __init__( # pylint: disable=super-init-not-called self.created_by = created_by self.created_at = created_at + self.retrieved_at = retrieved_at self.crn = crn self.custom_metadata = custom_metadata self.description = description @@ -11510,6 +11552,7 @@ def __init__( self.processing_task_id = processing_task_id self.queued_task_count = queued_task_count self.last_failed_task_id = last_failed_task_id + self.last_rotation_failed = last_rotation_failed self.configuration = configuration self.parameters = parameters self.credentials_content = credentials_content @@ -11526,6 +11569,8 @@ def from_dict(cls, _dict: Dict) -> 'CustomCredentialsSecret': args['created_at'] = string_to_datetime(created_at) else: raise ValueError('Required property \'created_at\' not present in CustomCredentialsSecret JSON') + if (retrieved_at := _dict.get('retrieved_at')) is not None: + args['retrieved_at'] = string_to_datetime(retrieved_at) if (crn := _dict.get('crn')) is not None: args['crn'] = crn else: @@ -11584,6 +11629,8 @@ def from_dict(cls, _dict: Dict) -> 'CustomCredentialsSecret': args['queued_task_count'] = queued_task_count if (last_failed_task_id := _dict.get('last_failed_task_id')) is not None: args['last_failed_task_id'] = last_failed_task_id + if (last_rotation_failed := _dict.get('last_rotation_failed')) is not None: + args['last_rotation_failed'] = last_rotation_failed if (configuration := _dict.get('configuration')) is not None: args['configuration'] = configuration else: @@ -11608,6 +11655,8 @@ def to_dict(self) -> Dict: _dict['created_by'] = self.created_by if hasattr(self, 'created_at') and self.created_at is not None: _dict['created_at'] = datetime_to_string(self.created_at) + if hasattr(self, 'retrieved_at') and self.retrieved_at is not None: + _dict['retrieved_at'] = datetime_to_string(self.retrieved_at) if hasattr(self, 'crn') and self.crn is not None: _dict['crn'] = self.crn if hasattr(self, 'custom_metadata') and self.custom_metadata is not None: @@ -11657,6 +11706,8 @@ def to_dict(self) -> Dict: _dict['queued_task_count'] = getattr(self, 'queued_task_count') if hasattr(self, 'last_failed_task_id') and self.last_failed_task_id is not None: _dict['last_failed_task_id'] = self.last_failed_task_id + if hasattr(self, 'last_rotation_failed') and getattr(self, 'last_rotation_failed') is not None: + _dict['last_rotation_failed'] = getattr(self, 'last_rotation_failed') if hasattr(self, 'configuration') and self.configuration is not None: _dict['configuration'] = self.configuration if hasattr(self, 'parameters') and self.parameters is not None: @@ -11721,6 +11772,9 @@ class CustomCredentialsSecretMetadata(SecretMetadata): that created the secret. :param datetime created_at: The date when the resource was created. The date format follows `RFC 3339`. + :param datetime retrieved_at: (optional) The date when the data of the secret + was last retrieved. The date format follows RFC 3339. Epoch date if there is no + record of secret data retrieval. :param str crn: A CRN that uniquely identifies an IBM Cloud resource. :param dict custom_metadata: (optional) The secret metadata that a user can customize. @@ -11782,6 +11836,8 @@ class CustomCredentialsSecretMetadata(SecretMetadata): :param str processing_task_id: (optional) A Secret Manager task identifier. :param int queued_task_count: (optional) Number of queued tasks for this secret. :param str last_failed_task_id: (optional) A Secret Manager task identifier. + :param bool last_rotation_failed: (optional) Indicates if the last rotation + (automatic or manual) for the secret failed. :param str configuration: The name of the custom credentials configuration. :param dict parameters: (optional) The fields that can be passed to and from the custom credentials engine. Allowed types are 'string', 'integer' and 'boolean'. @@ -11799,6 +11855,7 @@ def __init__( versions_total: int, configuration: str, *, + retrieved_at: Optional[datetime] = None, custom_metadata: Optional[dict] = None, description: Optional[str] = None, downloaded: Optional[bool] = None, @@ -11816,6 +11873,7 @@ def __init__( processing_task_id: Optional[str] = None, queued_task_count: Optional[int] = None, last_failed_task_id: Optional[str] = None, + last_rotation_failed: Optional[bool] = None, parameters: Optional[dict] = None, ) -> None: """ @@ -11835,6 +11893,9 @@ def __init__( format follows `RFC 3339`. :param int versions_total: The number of versions of your secret. :param str configuration: The name of the custom credentials configuration. + :param datetime retrieved_at: (optional) The date when the data of the + secret was last retrieved. The date format follows RFC 3339. Epoch date if + there is no record of secret data retrieval. :param dict custom_metadata: (optional) The secret metadata that a user can customize. :param str description: (optional) An extended description of your secret. @@ -11872,6 +11933,7 @@ def __init__( # pylint: disable=super-init-not-called self.created_by = created_by self.created_at = created_at + self.retrieved_at = retrieved_at self.crn = crn self.custom_metadata = custom_metadata self.description = description @@ -11895,6 +11957,7 @@ def __init__( self.processing_task_id = processing_task_id self.queued_task_count = queued_task_count self.last_failed_task_id = last_failed_task_id + self.last_rotation_failed = last_rotation_failed self.configuration = configuration self.parameters = parameters @@ -11910,6 +11973,8 @@ def from_dict(cls, _dict: Dict) -> 'CustomCredentialsSecretMetadata': args['created_at'] = string_to_datetime(created_at) else: raise ValueError('Required property \'created_at\' not present in CustomCredentialsSecretMetadata JSON') + if (retrieved_at := _dict.get('retrieved_at')) is not None: + args['retrieved_at'] = string_to_datetime(retrieved_at) if (crn := _dict.get('crn')) is not None: args['crn'] = crn else: @@ -11968,6 +12033,8 @@ def from_dict(cls, _dict: Dict) -> 'CustomCredentialsSecretMetadata': args['queued_task_count'] = queued_task_count if (last_failed_task_id := _dict.get('last_failed_task_id')) is not None: args['last_failed_task_id'] = last_failed_task_id + if (last_rotation_failed := _dict.get('last_rotation_failed')) is not None: + args['last_rotation_failed'] = last_rotation_failed if (configuration := _dict.get('configuration')) is not None: args['configuration'] = configuration else: @@ -11988,6 +12055,8 @@ def to_dict(self) -> Dict: _dict['created_by'] = self.created_by if hasattr(self, 'created_at') and self.created_at is not None: _dict['created_at'] = datetime_to_string(self.created_at) + if hasattr(self, 'retrieved_at') and self.retrieved_at is not None: + _dict['retrieved_at'] = datetime_to_string(self.retrieved_at) if hasattr(self, 'crn') and self.crn is not None: _dict['crn'] = self.crn if hasattr(self, 'custom_metadata') and self.custom_metadata is not None: @@ -12037,6 +12106,8 @@ def to_dict(self) -> Dict: _dict['queued_task_count'] = getattr(self, 'queued_task_count') if hasattr(self, 'last_failed_task_id') and self.last_failed_task_id is not None: _dict['last_failed_task_id'] = self.last_failed_task_id + if hasattr(self, 'last_rotation_failed') and getattr(self, 'last_rotation_failed') is not None: + _dict['last_rotation_failed'] = getattr(self, 'last_rotation_failed') if hasattr(self, 'configuration') and self.configuration is not None: _dict['configuration'] = self.configuration if hasattr(self, 'parameters') and self.parameters is not None: @@ -13598,6 +13669,9 @@ class IAMCredentialsSecret(Secret): that created the secret. :param datetime created_at: The date when the resource was created. The date format follows `RFC 3339`. + :param datetime retrieved_at: (optional) The date when the data of the secret + was last retrieved. The date format follows RFC 3339. Epoch date if there is no + record of secret data retrieval. :param str crn: A CRN that uniquely identifies an IBM Cloud resource. :param dict custom_metadata: (optional) The secret metadata that a user can customize. @@ -13701,6 +13775,7 @@ def __init__( ttl: str, reuse_api_key: bool, *, + retrieved_at: Optional[datetime] = None, custom_metadata: Optional[dict] = None, description: Optional[str] = None, downloaded: Optional[bool] = None, @@ -13753,6 +13828,9 @@ def __init__( If it is set to `true`, the service reuses the current credentials. If it is set to `false`, a new service ID and API key are generated each time that the secret is read or accessed. + :param datetime retrieved_at: (optional) The date when the data of the + secret was last retrieved. The date format follows RFC 3339. Epoch date if + there is no record of secret data retrieval. :param dict custom_metadata: (optional) The secret metadata that a user can customize. :param str description: (optional) An extended description of your secret. @@ -13787,6 +13865,7 @@ def __init__( # pylint: disable=super-init-not-called self.created_by = created_by self.created_at = created_at + self.retrieved_at = retrieved_at self.crn = crn self.custom_metadata = custom_metadata self.description = description @@ -13826,6 +13905,8 @@ def from_dict(cls, _dict: Dict) -> 'IAMCredentialsSecret': args['created_at'] = string_to_datetime(created_at) else: raise ValueError('Required property \'created_at\' not present in IAMCredentialsSecret JSON') + if (retrieved_at := _dict.get('retrieved_at')) is not None: + args['retrieved_at'] = string_to_datetime(retrieved_at) if (crn := _dict.get('crn')) is not None: args['crn'] = crn else: @@ -13908,6 +13989,8 @@ def to_dict(self) -> Dict: _dict['created_by'] = self.created_by if hasattr(self, 'created_at') and self.created_at is not None: _dict['created_at'] = datetime_to_string(self.created_at) + if hasattr(self, 'retrieved_at') and self.retrieved_at is not None: + _dict['retrieved_at'] = datetime_to_string(self.retrieved_at) if hasattr(self, 'crn') and self.crn is not None: _dict['crn'] = self.crn if hasattr(self, 'custom_metadata') and self.custom_metadata is not None: @@ -14021,6 +14104,9 @@ class IAMCredentialsSecretMetadata(SecretMetadata): that created the secret. :param datetime created_at: The date when the resource was created. The date format follows `RFC 3339`. + :param datetime retrieved_at: (optional) The date when the data of the secret + was last retrieved. The date format follows RFC 3339. Epoch date if there is no + record of secret data retrieval. :param str crn: A CRN that uniquely identifies an IBM Cloud resource. :param dict custom_metadata: (optional) The secret metadata that a user can customize. @@ -14119,6 +14205,7 @@ def __init__( ttl: str, reuse_api_key: bool, *, + retrieved_at: Optional[datetime] = None, custom_metadata: Optional[dict] = None, description: Optional[str] = None, downloaded: Optional[bool] = None, @@ -14170,6 +14257,9 @@ def __init__( If it is set to `true`, the service reuses the current credentials. If it is set to `false`, a new service ID and API key are generated each time that the secret is read or accessed. + :param datetime retrieved_at: (optional) The date when the data of the + secret was last retrieved. The date format follows RFC 3339. Epoch date if + there is no record of secret data retrieval. :param dict custom_metadata: (optional) The secret metadata that a user can customize. :param str description: (optional) An extended description of your secret. @@ -14204,6 +14294,7 @@ def __init__( # pylint: disable=super-init-not-called self.created_by = created_by self.created_at = created_at + self.retrieved_at = retrieved_at self.crn = crn self.custom_metadata = custom_metadata self.description = description @@ -14242,6 +14333,8 @@ def from_dict(cls, _dict: Dict) -> 'IAMCredentialsSecretMetadata': args['created_at'] = string_to_datetime(created_at) else: raise ValueError('Required property \'created_at\' not present in IAMCredentialsSecretMetadata JSON') + if (retrieved_at := _dict.get('retrieved_at')) is not None: + args['retrieved_at'] = string_to_datetime(retrieved_at) if (crn := _dict.get('crn')) is not None: args['crn'] = crn else: @@ -14322,6 +14415,8 @@ def to_dict(self) -> Dict: _dict['created_by'] = self.created_by if hasattr(self, 'created_at') and self.created_at is not None: _dict['created_at'] = datetime_to_string(self.created_at) + if hasattr(self, 'retrieved_at') and self.retrieved_at is not None: + _dict['retrieved_at'] = datetime_to_string(self.retrieved_at) if hasattr(self, 'crn') and self.crn is not None: _dict['crn'] = self.crn if hasattr(self, 'custom_metadata') and self.custom_metadata is not None: @@ -15511,6 +15606,9 @@ class ImportedCertificate(Secret): that created the secret. :param datetime created_at: The date when the resource was created. The date format follows `RFC 3339`. + :param datetime retrieved_at: (optional) The date when the data of the secret + was last retrieved. The date format follows RFC 3339. Epoch date if there is no + record of secret data retrieval. :param str crn: A CRN that uniquely identifies an IBM Cloud resource. :param dict custom_metadata: (optional) The secret metadata that a user can customize. @@ -15591,6 +15689,7 @@ def __init__( updated_at: datetime, versions_total: int, *, + retrieved_at: Optional[datetime] = None, custom_metadata: Optional[dict] = None, description: Optional[str] = None, downloaded: Optional[bool] = None, @@ -15632,6 +15731,9 @@ def __init__( :param datetime updated_at: The date when a resource was modified. The date format follows `RFC 3339`. :param int versions_total: The number of versions of your secret. + :param datetime retrieved_at: (optional) The date when the data of the + secret was last retrieved. The date format follows RFC 3339. Epoch date if + there is no record of secret data retrieval. :param dict custom_metadata: (optional) The secret metadata that a user can customize. :param str description: (optional) An extended description of your secret. @@ -15675,6 +15777,7 @@ def __init__( # pylint: disable=super-init-not-called self.created_by = created_by self.created_at = created_at + self.retrieved_at = retrieved_at self.crn = crn self.custom_metadata = custom_metadata self.description = description @@ -15718,6 +15821,8 @@ def from_dict(cls, _dict: Dict) -> 'ImportedCertificate': args['created_at'] = string_to_datetime(created_at) else: raise ValueError('Required property \'created_at\' not present in ImportedCertificate JSON') + if (retrieved_at := _dict.get('retrieved_at')) is not None: + args['retrieved_at'] = string_to_datetime(retrieved_at) if (crn := _dict.get('crn')) is not None: args['crn'] = crn else: @@ -15804,6 +15909,8 @@ def to_dict(self) -> Dict: _dict['created_by'] = self.created_by if hasattr(self, 'created_at') and self.created_at is not None: _dict['created_at'] = datetime_to_string(self.created_at) + if hasattr(self, 'retrieved_at') and self.retrieved_at is not None: + _dict['retrieved_at'] = datetime_to_string(self.retrieved_at) if hasattr(self, 'crn') and self.crn is not None: _dict['crn'] = self.crn if hasattr(self, 'custom_metadata') and self.custom_metadata is not None: @@ -15928,6 +16035,9 @@ class ImportedCertificateMetadata(SecretMetadata): that created the secret. :param datetime created_at: The date when the resource was created. The date format follows `RFC 3339`. + :param datetime retrieved_at: (optional) The date when the data of the secret + was last retrieved. The date format follows RFC 3339. Epoch date if there is no + record of secret data retrieval. :param str crn: A CRN that uniquely identifies an IBM Cloud resource. :param dict custom_metadata: (optional) The secret metadata that a user can customize. @@ -15999,6 +16109,7 @@ def __init__( updated_at: datetime, versions_total: int, *, + retrieved_at: Optional[datetime] = None, custom_metadata: Optional[dict] = None, description: Optional[str] = None, downloaded: Optional[bool] = None, @@ -16036,6 +16147,9 @@ def __init__( :param datetime updated_at: The date when a resource was modified. The date format follows `RFC 3339`. :param int versions_total: The number of versions of your secret. + :param datetime retrieved_at: (optional) The date when the data of the + secret was last retrieved. The date format follows RFC 3339. Epoch date if + there is no record of secret data retrieval. :param dict custom_metadata: (optional) The secret metadata that a user can customize. :param str description: (optional) An extended description of your secret. @@ -16070,6 +16184,7 @@ def __init__( # pylint: disable=super-init-not-called self.created_by = created_by self.created_at = created_at + self.retrieved_at = retrieved_at self.crn = crn self.custom_metadata = custom_metadata self.description = description @@ -16109,6 +16224,8 @@ def from_dict(cls, _dict: Dict) -> 'ImportedCertificateMetadata': args['created_at'] = string_to_datetime(created_at) else: raise ValueError('Required property \'created_at\' not present in ImportedCertificateMetadata JSON') + if (retrieved_at := _dict.get('retrieved_at')) is not None: + args['retrieved_at'] = string_to_datetime(retrieved_at) if (crn := _dict.get('crn')) is not None: args['crn'] = crn else: @@ -16187,6 +16304,8 @@ def to_dict(self) -> Dict: _dict['created_by'] = self.created_by if hasattr(self, 'created_at') and self.created_at is not None: _dict['created_at'] = datetime_to_string(self.created_at) + if hasattr(self, 'retrieved_at') and self.retrieved_at is not None: + _dict['retrieved_at'] = datetime_to_string(self.retrieved_at) if hasattr(self, 'crn') and self.crn is not None: _dict['crn'] = self.crn if hasattr(self, 'custom_metadata') and self.custom_metadata is not None: @@ -17253,6 +17372,9 @@ class KVSecret(Secret): that created the secret. :param datetime created_at: The date when the resource was created. The date format follows `RFC 3339`. + :param datetime retrieved_at: (optional) The date when the data of the secret + was last retrieved. The date format follows RFC 3339. Epoch date if there is no + record of secret data retrieval. :param str crn: A CRN that uniquely identifies an IBM Cloud resource. :param dict custom_metadata: (optional) The secret metadata that a user can customize. @@ -17299,6 +17421,7 @@ def __init__( versions_total: int, data: dict, *, + retrieved_at: Optional[datetime] = None, custom_metadata: Optional[dict] = None, description: Optional[str] = None, downloaded: Optional[bool] = None, @@ -17326,6 +17449,9 @@ def __init__( format follows `RFC 3339`. :param int versions_total: The number of versions of your secret. :param dict data: The payload data of a key-value secret. + :param datetime retrieved_at: (optional) The date when the data of the + secret was last retrieved. The date format follows RFC 3339. Epoch date if + there is no record of secret data retrieval. :param dict custom_metadata: (optional) The secret metadata that a user can customize. :param str description: (optional) An extended description of your secret. @@ -17340,6 +17466,7 @@ def __init__( # pylint: disable=super-init-not-called self.created_by = created_by self.created_at = created_at + self.retrieved_at = retrieved_at self.crn = crn self.custom_metadata = custom_metadata self.description = description @@ -17369,6 +17496,8 @@ def from_dict(cls, _dict: Dict) -> 'KVSecret': args['created_at'] = string_to_datetime(created_at) else: raise ValueError('Required property \'created_at\' not present in KVSecret JSON') + if (retrieved_at := _dict.get('retrieved_at')) is not None: + args['retrieved_at'] = string_to_datetime(retrieved_at) if (crn := _dict.get('crn')) is not None: args['crn'] = crn else: @@ -17429,6 +17558,8 @@ def to_dict(self) -> Dict: _dict['created_by'] = self.created_by if hasattr(self, 'created_at') and self.created_at is not None: _dict['created_at'] = datetime_to_string(self.created_at) + if hasattr(self, 'retrieved_at') and self.retrieved_at is not None: + _dict['retrieved_at'] = datetime_to_string(self.retrieved_at) if hasattr(self, 'crn') and self.crn is not None: _dict['crn'] = self.crn if hasattr(self, 'custom_metadata') and self.custom_metadata is not None: @@ -17519,6 +17650,9 @@ class KVSecretMetadata(SecretMetadata): that created the secret. :param datetime created_at: The date when the resource was created. The date format follows `RFC 3339`. + :param datetime retrieved_at: (optional) The date when the data of the secret + was last retrieved. The date format follows RFC 3339. Epoch date if there is no + record of secret data retrieval. :param str crn: A CRN that uniquely identifies an IBM Cloud resource. :param dict custom_metadata: (optional) The secret metadata that a user can customize. @@ -17563,6 +17697,7 @@ def __init__( updated_at: datetime, versions_total: int, *, + retrieved_at: Optional[datetime] = None, custom_metadata: Optional[dict] = None, description: Optional[str] = None, downloaded: Optional[bool] = None, @@ -17589,6 +17724,9 @@ def __init__( :param datetime updated_at: The date when a resource was modified. The date format follows `RFC 3339`. :param int versions_total: The number of versions of your secret. + :param datetime retrieved_at: (optional) The date when the data of the + secret was last retrieved. The date format follows RFC 3339. Epoch date if + there is no record of secret data retrieval. :param dict custom_metadata: (optional) The secret metadata that a user can customize. :param str description: (optional) An extended description of your secret. @@ -17603,6 +17741,7 @@ def __init__( # pylint: disable=super-init-not-called self.created_by = created_by self.created_at = created_at + self.retrieved_at = retrieved_at self.crn = crn self.custom_metadata = custom_metadata self.description = description @@ -17631,6 +17770,8 @@ def from_dict(cls, _dict: Dict) -> 'KVSecretMetadata': args['created_at'] = string_to_datetime(created_at) else: raise ValueError('Required property \'created_at\' not present in KVSecretMetadata JSON') + if (retrieved_at := _dict.get('retrieved_at')) is not None: + args['retrieved_at'] = string_to_datetime(retrieved_at) if (crn := _dict.get('crn')) is not None: args['crn'] = crn else: @@ -17687,6 +17828,8 @@ def to_dict(self) -> Dict: _dict['created_by'] = self.created_by if hasattr(self, 'created_at') and self.created_at is not None: _dict['created_at'] = datetime_to_string(self.created_at) + if hasattr(self, 'retrieved_at') and self.retrieved_at is not None: + _dict['retrieved_at'] = datetime_to_string(self.retrieved_at) if hasattr(self, 'crn') and self.crn is not None: _dict['crn'] = self.crn if hasattr(self, 'custom_metadata') and self.custom_metadata is not None: @@ -18563,6 +18706,9 @@ class PrivateCertificate(Secret): that created the secret. :param datetime created_at: The date when the resource was created. The date format follows `RFC 3339`. + :param datetime retrieved_at: (optional) The date when the data of the secret + was last retrieved. The date format follows RFC 3339. Epoch date if there is no + record of secret data retrieval. :param str crn: A CRN that uniquely identifies an IBM Cloud resource. :param dict custom_metadata: (optional) The secret metadata that a user can customize. @@ -18660,6 +18806,7 @@ def __init__( certificate: str, private_key: str, *, + retrieved_at: Optional[datetime] = None, custom_metadata: Optional[dict] = None, description: Optional[str] = None, downloaded: Optional[bool] = None, @@ -18713,6 +18860,9 @@ def __init__( :param str private_key: The PEM-encoded private key that is associated with the certificate. The data must be formatted on a single line with embedded newline characters. + :param datetime retrieved_at: (optional) The date when the data of the + secret was last retrieved. The date format follows RFC 3339. Epoch date if + there is no record of secret data retrieval. :param dict custom_metadata: (optional) The secret metadata that a user can customize. :param str description: (optional) An extended description of your secret. @@ -18734,6 +18884,7 @@ def __init__( # pylint: disable=super-init-not-called self.created_by = created_by self.created_at = created_at + self.retrieved_at = retrieved_at self.crn = crn self.custom_metadata = custom_metadata self.description = description @@ -18780,6 +18931,8 @@ def from_dict(cls, _dict: Dict) -> 'PrivateCertificate': args['created_at'] = string_to_datetime(created_at) else: raise ValueError('Required property \'created_at\' not present in PrivateCertificate JSON') + if (retrieved_at := _dict.get('retrieved_at')) is not None: + args['retrieved_at'] = string_to_datetime(retrieved_at) if (crn := _dict.get('crn')) is not None: args['crn'] = crn else: @@ -18888,6 +19041,8 @@ def to_dict(self) -> Dict: _dict['created_by'] = self.created_by if hasattr(self, 'created_at') and self.created_at is not None: _dict['created_at'] = datetime_to_string(self.created_at) + if hasattr(self, 'retrieved_at') and self.retrieved_at is not None: + _dict['retrieved_at'] = datetime_to_string(self.retrieved_at) if hasattr(self, 'crn') and self.crn is not None: _dict['crn'] = self.crn if hasattr(self, 'custom_metadata') and self.custom_metadata is not None: @@ -26416,6 +26571,9 @@ class PrivateCertificateMetadata(SecretMetadata): that created the secret. :param datetime created_at: The date when the resource was created. The date format follows `RFC 3339`. + :param datetime retrieved_at: (optional) The date when the data of the secret + was last retrieved. The date format follows RFC 3339. Epoch date if there is no + record of secret data retrieval. :param str crn: A CRN that uniquely identifies an IBM Cloud resource. :param dict custom_metadata: (optional) The secret metadata that a user can customize. @@ -26502,6 +26660,7 @@ def __init__( serial_number: str, validity: 'CertificateValidity', *, + retrieved_at: Optional[datetime] = None, custom_metadata: Optional[dict] = None, description: Optional[str] = None, downloaded: Optional[bool] = None, @@ -26548,6 +26707,9 @@ def __init__( certificate by the issuing certificate authority. :param CertificateValidity validity: The date and time that the certificate validity period begins and ends. + :param datetime retrieved_at: (optional) The date when the data of the + secret was last retrieved. The date format follows RFC 3339. Epoch date if + there is no record of secret data retrieval. :param dict custom_metadata: (optional) The secret metadata that a user can customize. :param str description: (optional) An extended description of your secret. @@ -26569,6 +26731,7 @@ def __init__( # pylint: disable=super-init-not-called self.created_by = created_by self.created_at = created_at + self.retrieved_at = retrieved_at self.crn = crn self.custom_metadata = custom_metadata self.description = description @@ -26611,6 +26774,8 @@ def from_dict(cls, _dict: Dict) -> 'PrivateCertificateMetadata': args['created_at'] = string_to_datetime(created_at) else: raise ValueError('Required property \'created_at\' not present in PrivateCertificateMetadata JSON') + if (retrieved_at := _dict.get('retrieved_at')) is not None: + args['retrieved_at'] = string_to_datetime(retrieved_at) if (crn := _dict.get('crn')) is not None: args['crn'] = crn else: @@ -26707,6 +26872,8 @@ def to_dict(self) -> Dict: _dict['created_by'] = self.created_by if hasattr(self, 'created_at') and self.created_at is not None: _dict['created_at'] = datetime_to_string(self.created_at) + if hasattr(self, 'retrieved_at') and self.retrieved_at is not None: + _dict['retrieved_at'] = datetime_to_string(self.retrieved_at) if hasattr(self, 'crn') and self.crn is not None: _dict['crn'] = self.crn if hasattr(self, 'custom_metadata') and self.custom_metadata is not None: @@ -28020,6 +28187,9 @@ class PublicCertificate(Secret): that created the secret. :param datetime created_at: The date when the resource was created. The date format follows `RFC 3339`. + :param datetime retrieved_at: (optional) The date when the data of the secret + was last retrieved. The date format follows RFC 3339. Epoch date if there is no + record of secret data retrieval. :param str crn: A CRN that uniquely identifies an IBM Cloud resource. :param dict custom_metadata: (optional) The secret metadata that a user can customize. @@ -28108,6 +28278,7 @@ def __init__( key_algorithm: str, rotation: 'RotationPolicy', *, + retrieved_at: Optional[datetime] = None, custom_metadata: Optional[dict] = None, description: Optional[str] = None, downloaded: Optional[bool] = None, @@ -28160,6 +28331,9 @@ def __init__( Manager rotates your secrets automatically. Supported secret types: username_password, private_cert, public_cert, iam_credentials, custom_credentials. + :param datetime retrieved_at: (optional) The date when the data of the + secret was last retrieved. The date format follows RFC 3339. Epoch date if + there is no record of secret data retrieval. :param dict custom_metadata: (optional) The secret metadata that a user can customize. :param str description: (optional) An extended description of your secret. @@ -28196,6 +28370,7 @@ def __init__( # pylint: disable=super-init-not-called self.created_by = created_by self.created_at = created_at + self.retrieved_at = retrieved_at self.crn = crn self.custom_metadata = custom_metadata self.description = description @@ -28240,6 +28415,8 @@ def from_dict(cls, _dict: Dict) -> 'PublicCertificate': args['created_at'] = string_to_datetime(created_at) else: raise ValueError('Required property \'created_at\' not present in PublicCertificate JSON') + if (retrieved_at := _dict.get('retrieved_at')) is not None: + args['retrieved_at'] = string_to_datetime(retrieved_at) if (crn := _dict.get('crn')) is not None: args['crn'] = crn else: @@ -28332,6 +28509,8 @@ def to_dict(self) -> Dict: _dict['created_by'] = self.created_by if hasattr(self, 'created_at') and self.created_at is not None: _dict['created_at'] = datetime_to_string(self.created_at) + if hasattr(self, 'retrieved_at') and self.retrieved_at is not None: + _dict['retrieved_at'] = datetime_to_string(self.retrieved_at) if hasattr(self, 'crn') and self.crn is not None: _dict['crn'] = self.crn if hasattr(self, 'custom_metadata') and self.custom_metadata is not None: @@ -30517,6 +30696,9 @@ class PublicCertificateMetadata(SecretMetadata): that created the secret. :param datetime created_at: The date when the resource was created. The date format follows `RFC 3339`. + :param datetime retrieved_at: (optional) The date when the data of the secret + was last retrieved. The date format follows RFC 3339. Epoch date if there is no + record of secret data retrieval. :param str crn: A CRN that uniquely identifies an IBM Cloud resource. :param dict custom_metadata: (optional) The secret metadata that a user can customize. @@ -30597,6 +30779,7 @@ def __init__( key_algorithm: str, rotation: 'RotationPolicy', *, + retrieved_at: Optional[datetime] = None, custom_metadata: Optional[dict] = None, description: Optional[str] = None, downloaded: Optional[bool] = None, @@ -30646,6 +30829,9 @@ def __init__( Manager rotates your secrets automatically. Supported secret types: username_password, private_cert, public_cert, iam_credentials, custom_credentials. + :param datetime retrieved_at: (optional) The date when the data of the + secret was last retrieved. The date format follows RFC 3339. Epoch date if + there is no record of secret data retrieval. :param dict custom_metadata: (optional) The secret metadata that a user can customize. :param str description: (optional) An extended description of your secret. @@ -30674,6 +30860,7 @@ def __init__( # pylint: disable=super-init-not-called self.created_by = created_by self.created_at = created_at + self.retrieved_at = retrieved_at self.crn = crn self.custom_metadata = custom_metadata self.description = description @@ -30715,6 +30902,8 @@ def from_dict(cls, _dict: Dict) -> 'PublicCertificateMetadata': args['created_at'] = string_to_datetime(created_at) else: raise ValueError('Required property \'created_at\' not present in PublicCertificateMetadata JSON') + if (retrieved_at := _dict.get('retrieved_at')) is not None: + args['retrieved_at'] = string_to_datetime(retrieved_at) if (crn := _dict.get('crn')) is not None: args['crn'] = crn else: @@ -30801,6 +30990,8 @@ def to_dict(self) -> Dict: _dict['created_by'] = self.created_by if hasattr(self, 'created_at') and self.created_at is not None: _dict['created_at'] = datetime_to_string(self.created_at) + if hasattr(self, 'retrieved_at') and self.retrieved_at is not None: + _dict['retrieved_at'] = datetime_to_string(self.retrieved_at) if hasattr(self, 'crn') and self.crn is not None: _dict['crn'] = self.crn if hasattr(self, 'custom_metadata') and self.custom_metadata is not None: @@ -32207,6 +32398,9 @@ class ServiceCredentialsSecret(Secret): that created the secret. :param datetime created_at: The date when the resource was created. The date format follows `RFC 3339`. + :param datetime retrieved_at: (optional) The date when the data of the secret + was last retrieved. The date format follows RFC 3339. Epoch date if there is no + record of secret data retrieval. :param str crn: A CRN that uniquely identifies an IBM Cloud resource. :param dict custom_metadata: (optional) The secret metadata that a user can customize. @@ -32282,6 +32476,7 @@ def __init__( source_service: 'ServiceCredentialsSecretSourceServiceRO', credentials: 'ServiceCredentialsSecretCredentials', *, + retrieved_at: Optional[datetime] = None, custom_metadata: Optional[dict] = None, description: Optional[str] = None, downloaded: Optional[bool] = None, @@ -32317,6 +32512,9 @@ def __init__( instance. :param ServiceCredentialsSecretCredentials credentials: The properties of the service credentials secret payload. + :param datetime retrieved_at: (optional) The date when the data of the + secret was last retrieved. The date format follows RFC 3339. Epoch date if + there is no record of secret data retrieval. :param dict custom_metadata: (optional) The secret metadata that a user can customize. :param str description: (optional) An extended description of your secret. @@ -32348,6 +32546,7 @@ def __init__( # pylint: disable=super-init-not-called self.created_by = created_by self.created_at = created_at + self.retrieved_at = retrieved_at self.crn = crn self.custom_metadata = custom_metadata self.description = description @@ -32382,6 +32581,8 @@ def from_dict(cls, _dict: Dict) -> 'ServiceCredentialsSecret': args['created_at'] = string_to_datetime(created_at) else: raise ValueError('Required property \'created_at\' not present in ServiceCredentialsSecret JSON') + if (retrieved_at := _dict.get('retrieved_at')) is not None: + args['retrieved_at'] = string_to_datetime(retrieved_at) if (crn := _dict.get('crn')) is not None: args['crn'] = crn else: @@ -32454,6 +32655,8 @@ def to_dict(self) -> Dict: _dict['created_by'] = self.created_by if hasattr(self, 'created_at') and self.created_at is not None: _dict['created_at'] = datetime_to_string(self.created_at) + if hasattr(self, 'retrieved_at') and self.retrieved_at is not None: + _dict['retrieved_at'] = datetime_to_string(self.retrieved_at) if hasattr(self, 'crn') and self.crn is not None: _dict['crn'] = self.crn if hasattr(self, 'custom_metadata') and self.custom_metadata is not None: @@ -32563,6 +32766,9 @@ class ServiceCredentialsSecretMetadata(SecretMetadata): that created the secret. :param datetime created_at: The date when the resource was created. The date format follows `RFC 3339`. + :param datetime retrieved_at: (optional) The date when the data of the secret + was last retrieved. The date format follows RFC 3339. Epoch date if there is no + record of secret data retrieval. :param str crn: A CRN that uniquely identifies an IBM Cloud resource. :param dict custom_metadata: (optional) The secret metadata that a user can customize. @@ -32635,6 +32841,7 @@ def __init__( versions_total: int, source_service: 'ServiceCredentialsSecretSourceServiceRO', *, + retrieved_at: Optional[datetime] = None, custom_metadata: Optional[dict] = None, description: Optional[str] = None, downloaded: Optional[bool] = None, @@ -32668,6 +32875,9 @@ def __init__( :param ServiceCredentialsSecretSourceServiceRO source_service: The properties of the resource key that was created for this source service instance. + :param datetime retrieved_at: (optional) The date when the data of the + secret was last retrieved. The date format follows RFC 3339. Epoch date if + there is no record of secret data retrieval. :param dict custom_metadata: (optional) The secret metadata that a user can customize. :param str description: (optional) An extended description of your secret. @@ -32699,6 +32909,7 @@ def __init__( # pylint: disable=super-init-not-called self.created_by = created_by self.created_at = created_at + self.retrieved_at = retrieved_at self.crn = crn self.custom_metadata = custom_metadata self.description = description @@ -32732,6 +32943,8 @@ def from_dict(cls, _dict: Dict) -> 'ServiceCredentialsSecretMetadata': args['created_at'] = string_to_datetime(created_at) else: raise ValueError('Required property \'created_at\' not present in ServiceCredentialsSecretMetadata JSON') + if (retrieved_at := _dict.get('retrieved_at')) is not None: + args['retrieved_at'] = string_to_datetime(retrieved_at) if (crn := _dict.get('crn')) is not None: args['crn'] = crn else: @@ -32800,6 +33013,8 @@ def to_dict(self) -> Dict: _dict['created_by'] = self.created_by if hasattr(self, 'created_at') and self.created_at is not None: _dict['created_at'] = datetime_to_string(self.created_at) + if hasattr(self, 'retrieved_at') and self.retrieved_at is not None: + _dict['retrieved_at'] = datetime_to_string(self.retrieved_at) if hasattr(self, 'crn') and self.crn is not None: _dict['crn'] = self.crn if hasattr(self, 'custom_metadata') and self.custom_metadata is not None: @@ -33816,6 +34031,9 @@ class UsernamePasswordSecret(Secret): that created the secret. :param datetime created_at: The date when the resource was created. The date format follows `RFC 3339`. + :param datetime retrieved_at: (optional) The date when the data of the secret + was last retrieved. The date format follows RFC 3339. Epoch date if there is no + record of secret data retrieval. :param str crn: A CRN that uniquely identifies an IBM Cloud resource. :param dict custom_metadata: (optional) The secret metadata that a user can customize. @@ -33881,6 +34099,7 @@ def __init__( username: str, password: str, *, + retrieved_at: Optional[datetime] = None, custom_metadata: Optional[dict] = None, description: Optional[str] = None, downloaded: Optional[bool] = None, @@ -33918,6 +34137,9 @@ def __init__( `username_password` secret. :param str password: The password that is assigned to an `username_password` secret. + :param datetime retrieved_at: (optional) The date when the data of the + secret was last retrieved. The date format follows RFC 3339. Epoch date if + there is no record of secret data retrieval. :param dict custom_metadata: (optional) The secret metadata that a user can customize. :param str description: (optional) An extended description of your secret. @@ -33934,6 +34156,7 @@ def __init__( # pylint: disable=super-init-not-called self.created_by = created_by self.created_at = created_at + self.retrieved_at = retrieved_at self.crn = crn self.custom_metadata = custom_metadata self.description = description @@ -33968,6 +34191,8 @@ def from_dict(cls, _dict: Dict) -> 'UsernamePasswordSecret': args['created_at'] = string_to_datetime(created_at) else: raise ValueError('Required property \'created_at\' not present in UsernamePasswordSecret JSON') + if (retrieved_at := _dict.get('retrieved_at')) is not None: + args['retrieved_at'] = string_to_datetime(retrieved_at) if (crn := _dict.get('crn')) is not None: args['crn'] = crn else: @@ -34042,6 +34267,8 @@ def to_dict(self) -> Dict: _dict['created_by'] = self.created_by if hasattr(self, 'created_at') and self.created_at is not None: _dict['created_at'] = datetime_to_string(self.created_at) + if hasattr(self, 'retrieved_at') and self.retrieved_at is not None: + _dict['retrieved_at'] = datetime_to_string(self.retrieved_at) if hasattr(self, 'crn') and self.crn is not None: _dict['crn'] = self.crn if hasattr(self, 'custom_metadata') and self.custom_metadata is not None: @@ -34148,6 +34375,9 @@ class UsernamePasswordSecretMetadata(SecretMetadata): that created the secret. :param datetime created_at: The date when the resource was created. The date format follows `RFC 3339`. + :param datetime retrieved_at: (optional) The date when the data of the secret + was last retrieved. The date format follows RFC 3339. Epoch date if there is no + record of secret data retrieval. :param str crn: A CRN that uniquely identifies an IBM Cloud resource. :param dict custom_metadata: (optional) The secret metadata that a user can customize. @@ -34207,6 +34437,7 @@ def __init__( versions_total: int, rotation: 'RotationPolicy', *, + retrieved_at: Optional[datetime] = None, custom_metadata: Optional[dict] = None, description: Optional[str] = None, downloaded: Optional[bool] = None, @@ -34240,6 +34471,9 @@ def __init__( Manager rotates your secrets automatically. Supported secret types: username_password, private_cert, public_cert, iam_credentials, custom_credentials. + :param datetime retrieved_at: (optional) The date when the data of the + secret was last retrieved. The date format follows RFC 3339. Epoch date if + there is no record of secret data retrieval. :param dict custom_metadata: (optional) The secret metadata that a user can customize. :param str description: (optional) An extended description of your secret. @@ -34256,6 +34490,7 @@ def __init__( # pylint: disable=super-init-not-called self.created_by = created_by self.created_at = created_at + self.retrieved_at = retrieved_at self.crn = crn self.custom_metadata = custom_metadata self.description = description @@ -34288,6 +34523,8 @@ def from_dict(cls, _dict: Dict) -> 'UsernamePasswordSecretMetadata': args['created_at'] = string_to_datetime(created_at) else: raise ValueError('Required property \'created_at\' not present in UsernamePasswordSecretMetadata JSON') + if (retrieved_at := _dict.get('retrieved_at')) is not None: + args['retrieved_at'] = string_to_datetime(retrieved_at) if (crn := _dict.get('crn')) is not None: args['crn'] = crn else: @@ -34354,6 +34591,8 @@ def to_dict(self) -> Dict: _dict['created_by'] = self.created_by if hasattr(self, 'created_at') and self.created_at is not None: _dict['created_at'] = datetime_to_string(self.created_at) + if hasattr(self, 'retrieved_at') and self.retrieved_at is not None: + _dict['retrieved_at'] = datetime_to_string(self.retrieved_at) if hasattr(self, 'crn') and self.crn is not None: _dict['crn'] = self.crn if hasattr(self, 'custom_metadata') and self.custom_metadata is not None: @@ -35385,8 +35624,8 @@ def __init__( `..?limit=25`. :param str sort: (optional) Sort a collection of secrets by the specified field in ascending order. To sort in descending order use the `-` character - **Available values:** id | created_at | updated_at | expiration_date | - secret_type | name + **Available values:** id | created_at | updated_at | retrieved_at | + expiration_date | secret_type | name **Usage:** To sort a list of secrets by their creation date, use `../secrets?sort=created_at`. :param str search: (optional) Obtain a collection of secrets that contain diff --git a/test/unit/test_secrets_manager_v2.py b/test/unit/test_secrets_manager_v2.py index c85e7f7..0eea423 100644 --- a/test/unit/test_secrets_manager_v2.py +++ b/test/unit/test_secrets_manager_v2.py @@ -530,7 +530,7 @@ def test_create_secret_all_params(self): """ # Set up mock url = preprocess_url('/api/v2/secrets') - mock_response = '{"created_by": "iam-ServiceId-e4a2f0a4-3c76-4bef-b1f2-fbeae11c0f21", "created_at": "2022-04-12T23:20:50.520Z", "crn": "crn", "custom_metadata": {"anyKey": "anyValue"}, "description": "Extended description for this secret.", "downloaded": true, "id": "b49ad24d-81d4-5ebc-b9b9-b0937d1c84d5", "labels": ["my-label"], "locks_total": 0, "name": "my-secret", "secret_group_id": "default", "secret_type": "arbitrary", "state": 0, "state_description": "active", "updated_at": "2022-04-12T23:20:50.520Z", "versions_total": 0, "referenced_by": ["my-example-engine-config"], "expiration_date": "2033-04-12T23:20:50.520Z", "payload": "secret-credentials"}' + mock_response = '{"created_by": "iam-ServiceId-e4a2f0a4-3c76-4bef-b1f2-fbeae11c0f21", "created_at": "2022-04-12T23:20:50.520Z", "retrieved_at": "2025-04-12T23:20:50.520Z", "crn": "crn", "custom_metadata": {"anyKey": "anyValue"}, "description": "Extended description for this secret.", "downloaded": true, "id": "b49ad24d-81d4-5ebc-b9b9-b0937d1c84d5", "labels": ["my-label"], "locks_total": 0, "name": "my-secret", "secret_group_id": "default", "secret_type": "arbitrary", "state": 0, "state_description": "active", "updated_at": "2022-04-12T23:20:50.520Z", "versions_total": 0, "referenced_by": ["my-example-engine-config"], "expiration_date": "2033-04-12T23:20:50.520Z", "payload": "secret-credentials"}' responses.add( responses.POST, url, @@ -583,7 +583,7 @@ def test_create_secret_value_error(self): """ # Set up mock url = preprocess_url('/api/v2/secrets') - mock_response = '{"created_by": "iam-ServiceId-e4a2f0a4-3c76-4bef-b1f2-fbeae11c0f21", "created_at": "2022-04-12T23:20:50.520Z", "crn": "crn", "custom_metadata": {"anyKey": "anyValue"}, "description": "Extended description for this secret.", "downloaded": true, "id": "b49ad24d-81d4-5ebc-b9b9-b0937d1c84d5", "labels": ["my-label"], "locks_total": 0, "name": "my-secret", "secret_group_id": "default", "secret_type": "arbitrary", "state": 0, "state_description": "active", "updated_at": "2022-04-12T23:20:50.520Z", "versions_total": 0, "referenced_by": ["my-example-engine-config"], "expiration_date": "2033-04-12T23:20:50.520Z", "payload": "secret-credentials"}' + mock_response = '{"created_by": "iam-ServiceId-e4a2f0a4-3c76-4bef-b1f2-fbeae11c0f21", "created_at": "2022-04-12T23:20:50.520Z", "retrieved_at": "2025-04-12T23:20:50.520Z", "crn": "crn", "custom_metadata": {"anyKey": "anyValue"}, "description": "Extended description for this secret.", "downloaded": true, "id": "b49ad24d-81d4-5ebc-b9b9-b0937d1c84d5", "labels": ["my-label"], "locks_total": 0, "name": "my-secret", "secret_group_id": "default", "secret_type": "arbitrary", "state": 0, "state_description": "active", "updated_at": "2022-04-12T23:20:50.520Z", "versions_total": 0, "referenced_by": ["my-example-engine-config"], "expiration_date": "2033-04-12T23:20:50.520Z", "payload": "secret-credentials"}' responses.add( responses.POST, url, @@ -638,7 +638,7 @@ def test_list_secrets_all_params(self): """ # Set up mock url = preprocess_url('/api/v2/secrets') - mock_response = '{"total_count": 0, "limit": 25, "offset": 25, "first": {"href": "href"}, "next": {"href": "href"}, "previous": {"href": "href"}, "last": {"href": "href"}, "secrets": [{"created_by": "iam-ServiceId-e4a2f0a4-3c76-4bef-b1f2-fbeae11c0f21", "created_at": "2022-04-12T23:20:50.520Z", "crn": "crn", "custom_metadata": {"anyKey": "anyValue"}, "description": "Extended description for this secret.", "downloaded": true, "id": "b49ad24d-81d4-5ebc-b9b9-b0937d1c84d5", "labels": ["my-label"], "locks_total": 0, "name": "my-secret", "secret_group_id": "default", "secret_type": "arbitrary", "state": 0, "state_description": "active", "updated_at": "2022-04-12T23:20:50.520Z", "versions_total": 0, "referenced_by": ["my-example-engine-config"], "expiration_date": "2033-04-12T23:20:50.520Z"}]}' + mock_response = '{"total_count": 0, "limit": 25, "offset": 25, "first": {"href": "href"}, "next": {"href": "href"}, "previous": {"href": "href"}, "last": {"href": "href"}, "secrets": [{"created_by": "iam-ServiceId-e4a2f0a4-3c76-4bef-b1f2-fbeae11c0f21", "created_at": "2022-04-12T23:20:50.520Z", "retrieved_at": "2025-04-12T23:20:50.520Z", "crn": "crn", "custom_metadata": {"anyKey": "anyValue"}, "description": "Extended description for this secret.", "downloaded": true, "id": "b49ad24d-81d4-5ebc-b9b9-b0937d1c84d5", "labels": ["my-label"], "locks_total": 0, "name": "my-secret", "secret_group_id": "default", "secret_type": "arbitrary", "state": 0, "state_description": "active", "updated_at": "2022-04-12T23:20:50.520Z", "versions_total": 0, "referenced_by": ["my-example-engine-config"], "expiration_date": "2033-04-12T23:20:50.520Z"}]}' responses.add( responses.GET, url, @@ -698,7 +698,7 @@ def test_list_secrets_required_params(self): """ # Set up mock url = preprocess_url('/api/v2/secrets') - mock_response = '{"total_count": 0, "limit": 25, "offset": 25, "first": {"href": "href"}, "next": {"href": "href"}, "previous": {"href": "href"}, "last": {"href": "href"}, "secrets": [{"created_by": "iam-ServiceId-e4a2f0a4-3c76-4bef-b1f2-fbeae11c0f21", "created_at": "2022-04-12T23:20:50.520Z", "crn": "crn", "custom_metadata": {"anyKey": "anyValue"}, "description": "Extended description for this secret.", "downloaded": true, "id": "b49ad24d-81d4-5ebc-b9b9-b0937d1c84d5", "labels": ["my-label"], "locks_total": 0, "name": "my-secret", "secret_group_id": "default", "secret_type": "arbitrary", "state": 0, "state_description": "active", "updated_at": "2022-04-12T23:20:50.520Z", "versions_total": 0, "referenced_by": ["my-example-engine-config"], "expiration_date": "2033-04-12T23:20:50.520Z"}]}' + mock_response = '{"total_count": 0, "limit": 25, "offset": 25, "first": {"href": "href"}, "next": {"href": "href"}, "previous": {"href": "href"}, "last": {"href": "href"}, "secrets": [{"created_by": "iam-ServiceId-e4a2f0a4-3c76-4bef-b1f2-fbeae11c0f21", "created_at": "2022-04-12T23:20:50.520Z", "retrieved_at": "2025-04-12T23:20:50.520Z", "crn": "crn", "custom_metadata": {"anyKey": "anyValue"}, "description": "Extended description for this secret.", "downloaded": true, "id": "b49ad24d-81d4-5ebc-b9b9-b0937d1c84d5", "labels": ["my-label"], "locks_total": 0, "name": "my-secret", "secret_group_id": "default", "secret_type": "arbitrary", "state": 0, "state_description": "active", "updated_at": "2022-04-12T23:20:50.520Z", "versions_total": 0, "referenced_by": ["my-example-engine-config"], "expiration_date": "2033-04-12T23:20:50.520Z"}]}' responses.add( responses.GET, url, @@ -730,8 +730,8 @@ def test_list_secrets_with_pager_get_next(self): """ # Set up a two-page mock response url = preprocess_url('/api/v2/secrets') - mock_response1 = '{"next":{"href":"https://myhost.com/somePath?offset=1"},"total_count":2,"limit":1,"secrets":[{"created_by":"iam-ServiceId-e4a2f0a4-3c76-4bef-b1f2-fbeae11c0f21","created_at":"2022-04-12T23:20:50.520Z","crn":"crn","custom_metadata":{"anyKey":"anyValue"},"description":"Extended description for this secret.","downloaded":true,"id":"b49ad24d-81d4-5ebc-b9b9-b0937d1c84d5","labels":["my-label"],"locks_total":0,"name":"my-secret","secret_group_id":"default","secret_type":"arbitrary","state":0,"state_description":"active","updated_at":"2022-04-12T23:20:50.520Z","versions_total":0,"referenced_by":["my-example-engine-config"],"expiration_date":"2033-04-12T23:20:50.520Z"}]}' - mock_response2 = '{"total_count":2,"limit":1,"secrets":[{"created_by":"iam-ServiceId-e4a2f0a4-3c76-4bef-b1f2-fbeae11c0f21","created_at":"2022-04-12T23:20:50.520Z","crn":"crn","custom_metadata":{"anyKey":"anyValue"},"description":"Extended description for this secret.","downloaded":true,"id":"b49ad24d-81d4-5ebc-b9b9-b0937d1c84d5","labels":["my-label"],"locks_total":0,"name":"my-secret","secret_group_id":"default","secret_type":"arbitrary","state":0,"state_description":"active","updated_at":"2022-04-12T23:20:50.520Z","versions_total":0,"referenced_by":["my-example-engine-config"],"expiration_date":"2033-04-12T23:20:50.520Z"}]}' + mock_response1 = '{"next":{"href":"https://myhost.com/somePath?offset=1"},"total_count":2,"limit":1,"secrets":[{"created_by":"iam-ServiceId-e4a2f0a4-3c76-4bef-b1f2-fbeae11c0f21","created_at":"2022-04-12T23:20:50.520Z","retrieved_at":"2025-04-12T23:20:50.520Z","crn":"crn","custom_metadata":{"anyKey":"anyValue"},"description":"Extended description for this secret.","downloaded":true,"id":"b49ad24d-81d4-5ebc-b9b9-b0937d1c84d5","labels":["my-label"],"locks_total":0,"name":"my-secret","secret_group_id":"default","secret_type":"arbitrary","state":0,"state_description":"active","updated_at":"2022-04-12T23:20:50.520Z","versions_total":0,"referenced_by":["my-example-engine-config"],"expiration_date":"2033-04-12T23:20:50.520Z"}]}' + mock_response2 = '{"total_count":2,"limit":1,"secrets":[{"created_by":"iam-ServiceId-e4a2f0a4-3c76-4bef-b1f2-fbeae11c0f21","created_at":"2022-04-12T23:20:50.520Z","retrieved_at":"2025-04-12T23:20:50.520Z","crn":"crn","custom_metadata":{"anyKey":"anyValue"},"description":"Extended description for this secret.","downloaded":true,"id":"b49ad24d-81d4-5ebc-b9b9-b0937d1c84d5","labels":["my-label"],"locks_total":0,"name":"my-secret","secret_group_id":"default","secret_type":"arbitrary","state":0,"state_description":"active","updated_at":"2022-04-12T23:20:50.520Z","versions_total":0,"referenced_by":["my-example-engine-config"],"expiration_date":"2033-04-12T23:20:50.520Z"}]}' responses.add( responses.GET, url, @@ -771,8 +771,8 @@ def test_list_secrets_with_pager_get_all(self): """ # Set up a two-page mock response url = preprocess_url('/api/v2/secrets') - mock_response1 = '{"next":{"href":"https://myhost.com/somePath?offset=1"},"total_count":2,"limit":1,"secrets":[{"created_by":"iam-ServiceId-e4a2f0a4-3c76-4bef-b1f2-fbeae11c0f21","created_at":"2022-04-12T23:20:50.520Z","crn":"crn","custom_metadata":{"anyKey":"anyValue"},"description":"Extended description for this secret.","downloaded":true,"id":"b49ad24d-81d4-5ebc-b9b9-b0937d1c84d5","labels":["my-label"],"locks_total":0,"name":"my-secret","secret_group_id":"default","secret_type":"arbitrary","state":0,"state_description":"active","updated_at":"2022-04-12T23:20:50.520Z","versions_total":0,"referenced_by":["my-example-engine-config"],"expiration_date":"2033-04-12T23:20:50.520Z"}]}' - mock_response2 = '{"total_count":2,"limit":1,"secrets":[{"created_by":"iam-ServiceId-e4a2f0a4-3c76-4bef-b1f2-fbeae11c0f21","created_at":"2022-04-12T23:20:50.520Z","crn":"crn","custom_metadata":{"anyKey":"anyValue"},"description":"Extended description for this secret.","downloaded":true,"id":"b49ad24d-81d4-5ebc-b9b9-b0937d1c84d5","labels":["my-label"],"locks_total":0,"name":"my-secret","secret_group_id":"default","secret_type":"arbitrary","state":0,"state_description":"active","updated_at":"2022-04-12T23:20:50.520Z","versions_total":0,"referenced_by":["my-example-engine-config"],"expiration_date":"2033-04-12T23:20:50.520Z"}]}' + mock_response1 = '{"next":{"href":"https://myhost.com/somePath?offset=1"},"total_count":2,"limit":1,"secrets":[{"created_by":"iam-ServiceId-e4a2f0a4-3c76-4bef-b1f2-fbeae11c0f21","created_at":"2022-04-12T23:20:50.520Z","retrieved_at":"2025-04-12T23:20:50.520Z","crn":"crn","custom_metadata":{"anyKey":"anyValue"},"description":"Extended description for this secret.","downloaded":true,"id":"b49ad24d-81d4-5ebc-b9b9-b0937d1c84d5","labels":["my-label"],"locks_total":0,"name":"my-secret","secret_group_id":"default","secret_type":"arbitrary","state":0,"state_description":"active","updated_at":"2022-04-12T23:20:50.520Z","versions_total":0,"referenced_by":["my-example-engine-config"],"expiration_date":"2033-04-12T23:20:50.520Z"}]}' + mock_response2 = '{"total_count":2,"limit":1,"secrets":[{"created_by":"iam-ServiceId-e4a2f0a4-3c76-4bef-b1f2-fbeae11c0f21","created_at":"2022-04-12T23:20:50.520Z","retrieved_at":"2025-04-12T23:20:50.520Z","crn":"crn","custom_metadata":{"anyKey":"anyValue"},"description":"Extended description for this secret.","downloaded":true,"id":"b49ad24d-81d4-5ebc-b9b9-b0937d1c84d5","labels":["my-label"],"locks_total":0,"name":"my-secret","secret_group_id":"default","secret_type":"arbitrary","state":0,"state_description":"active","updated_at":"2022-04-12T23:20:50.520Z","versions_total":0,"referenced_by":["my-example-engine-config"],"expiration_date":"2033-04-12T23:20:50.520Z"}]}' responses.add( responses.GET, url, @@ -815,7 +815,7 @@ def test_get_secret_all_params(self): """ # Set up mock url = preprocess_url('/api/v2/secrets/0b5571f7-21e6-42b7-91c5-3f5ac9793a46') - mock_response = '{"created_by": "iam-ServiceId-e4a2f0a4-3c76-4bef-b1f2-fbeae11c0f21", "created_at": "2022-04-12T23:20:50.520Z", "crn": "crn", "custom_metadata": {"anyKey": "anyValue"}, "description": "Extended description for this secret.", "downloaded": true, "id": "b49ad24d-81d4-5ebc-b9b9-b0937d1c84d5", "labels": ["my-label"], "locks_total": 0, "name": "my-secret", "secret_group_id": "default", "secret_type": "arbitrary", "state": 0, "state_description": "active", "updated_at": "2022-04-12T23:20:50.520Z", "versions_total": 0, "referenced_by": ["my-example-engine-config"], "expiration_date": "2033-04-12T23:20:50.520Z", "payload": "secret-credentials"}' + mock_response = '{"created_by": "iam-ServiceId-e4a2f0a4-3c76-4bef-b1f2-fbeae11c0f21", "created_at": "2022-04-12T23:20:50.520Z", "retrieved_at": "2025-04-12T23:20:50.520Z", "crn": "crn", "custom_metadata": {"anyKey": "anyValue"}, "description": "Extended description for this secret.", "downloaded": true, "id": "b49ad24d-81d4-5ebc-b9b9-b0937d1c84d5", "labels": ["my-label"], "locks_total": 0, "name": "my-secret", "secret_group_id": "default", "secret_type": "arbitrary", "state": 0, "state_description": "active", "updated_at": "2022-04-12T23:20:50.520Z", "versions_total": 0, "referenced_by": ["my-example-engine-config"], "expiration_date": "2033-04-12T23:20:50.520Z", "payload": "secret-credentials"}' responses.add( responses.GET, url, @@ -853,7 +853,7 @@ def test_get_secret_value_error(self): """ # Set up mock url = preprocess_url('/api/v2/secrets/0b5571f7-21e6-42b7-91c5-3f5ac9793a46') - mock_response = '{"created_by": "iam-ServiceId-e4a2f0a4-3c76-4bef-b1f2-fbeae11c0f21", "created_at": "2022-04-12T23:20:50.520Z", "crn": "crn", "custom_metadata": {"anyKey": "anyValue"}, "description": "Extended description for this secret.", "downloaded": true, "id": "b49ad24d-81d4-5ebc-b9b9-b0937d1c84d5", "labels": ["my-label"], "locks_total": 0, "name": "my-secret", "secret_group_id": "default", "secret_type": "arbitrary", "state": 0, "state_description": "active", "updated_at": "2022-04-12T23:20:50.520Z", "versions_total": 0, "referenced_by": ["my-example-engine-config"], "expiration_date": "2033-04-12T23:20:50.520Z", "payload": "secret-credentials"}' + mock_response = '{"created_by": "iam-ServiceId-e4a2f0a4-3c76-4bef-b1f2-fbeae11c0f21", "created_at": "2022-04-12T23:20:50.520Z", "retrieved_at": "2025-04-12T23:20:50.520Z", "crn": "crn", "custom_metadata": {"anyKey": "anyValue"}, "description": "Extended description for this secret.", "downloaded": true, "id": "b49ad24d-81d4-5ebc-b9b9-b0937d1c84d5", "labels": ["my-label"], "locks_total": 0, "name": "my-secret", "secret_group_id": "default", "secret_type": "arbitrary", "state": 0, "state_description": "active", "updated_at": "2022-04-12T23:20:50.520Z", "versions_total": 0, "referenced_by": ["my-example-engine-config"], "expiration_date": "2033-04-12T23:20:50.520Z", "payload": "secret-credentials"}' responses.add( responses.GET, url, @@ -1012,7 +1012,7 @@ def test_get_secret_metadata_all_params(self): """ # Set up mock url = preprocess_url('/api/v2/secrets/0b5571f7-21e6-42b7-91c5-3f5ac9793a46/metadata') - mock_response = '{"created_by": "iam-ServiceId-e4a2f0a4-3c76-4bef-b1f2-fbeae11c0f21", "created_at": "2022-04-12T23:20:50.520Z", "crn": "crn", "custom_metadata": {"anyKey": "anyValue"}, "description": "Extended description for this secret.", "downloaded": true, "id": "b49ad24d-81d4-5ebc-b9b9-b0937d1c84d5", "labels": ["my-label"], "locks_total": 0, "name": "my-secret", "secret_group_id": "default", "secret_type": "arbitrary", "state": 0, "state_description": "active", "updated_at": "2022-04-12T23:20:50.520Z", "versions_total": 0, "referenced_by": ["my-example-engine-config"], "expiration_date": "2033-04-12T23:20:50.520Z"}' + mock_response = '{"created_by": "iam-ServiceId-e4a2f0a4-3c76-4bef-b1f2-fbeae11c0f21", "created_at": "2022-04-12T23:20:50.520Z", "retrieved_at": "2025-04-12T23:20:50.520Z", "crn": "crn", "custom_metadata": {"anyKey": "anyValue"}, "description": "Extended description for this secret.", "downloaded": true, "id": "b49ad24d-81d4-5ebc-b9b9-b0937d1c84d5", "labels": ["my-label"], "locks_total": 0, "name": "my-secret", "secret_group_id": "default", "secret_type": "arbitrary", "state": 0, "state_description": "active", "updated_at": "2022-04-12T23:20:50.520Z", "versions_total": 0, "referenced_by": ["my-example-engine-config"], "expiration_date": "2033-04-12T23:20:50.520Z"}' responses.add( responses.GET, url, @@ -1050,7 +1050,7 @@ def test_get_secret_metadata_value_error(self): """ # Set up mock url = preprocess_url('/api/v2/secrets/0b5571f7-21e6-42b7-91c5-3f5ac9793a46/metadata') - mock_response = '{"created_by": "iam-ServiceId-e4a2f0a4-3c76-4bef-b1f2-fbeae11c0f21", "created_at": "2022-04-12T23:20:50.520Z", "crn": "crn", "custom_metadata": {"anyKey": "anyValue"}, "description": "Extended description for this secret.", "downloaded": true, "id": "b49ad24d-81d4-5ebc-b9b9-b0937d1c84d5", "labels": ["my-label"], "locks_total": 0, "name": "my-secret", "secret_group_id": "default", "secret_type": "arbitrary", "state": 0, "state_description": "active", "updated_at": "2022-04-12T23:20:50.520Z", "versions_total": 0, "referenced_by": ["my-example-engine-config"], "expiration_date": "2033-04-12T23:20:50.520Z"}' + mock_response = '{"created_by": "iam-ServiceId-e4a2f0a4-3c76-4bef-b1f2-fbeae11c0f21", "created_at": "2022-04-12T23:20:50.520Z", "retrieved_at": "2025-04-12T23:20:50.520Z", "crn": "crn", "custom_metadata": {"anyKey": "anyValue"}, "description": "Extended description for this secret.", "downloaded": true, "id": "b49ad24d-81d4-5ebc-b9b9-b0937d1c84d5", "labels": ["my-label"], "locks_total": 0, "name": "my-secret", "secret_group_id": "default", "secret_type": "arbitrary", "state": 0, "state_description": "active", "updated_at": "2022-04-12T23:20:50.520Z", "versions_total": 0, "referenced_by": ["my-example-engine-config"], "expiration_date": "2033-04-12T23:20:50.520Z"}' responses.add( responses.GET, url, @@ -1093,7 +1093,7 @@ def test_update_secret_metadata_all_params(self): """ # Set up mock url = preprocess_url('/api/v2/secrets/0b5571f7-21e6-42b7-91c5-3f5ac9793a46/metadata') - mock_response = '{"created_by": "iam-ServiceId-e4a2f0a4-3c76-4bef-b1f2-fbeae11c0f21", "created_at": "2022-04-12T23:20:50.520Z", "crn": "crn", "custom_metadata": {"anyKey": "anyValue"}, "description": "Extended description for this secret.", "downloaded": true, "id": "b49ad24d-81d4-5ebc-b9b9-b0937d1c84d5", "labels": ["my-label"], "locks_total": 0, "name": "my-secret", "secret_group_id": "default", "secret_type": "arbitrary", "state": 0, "state_description": "active", "updated_at": "2022-04-12T23:20:50.520Z", "versions_total": 0, "referenced_by": ["my-example-engine-config"], "expiration_date": "2033-04-12T23:20:50.520Z"}' + mock_response = '{"created_by": "iam-ServiceId-e4a2f0a4-3c76-4bef-b1f2-fbeae11c0f21", "created_at": "2022-04-12T23:20:50.520Z", "retrieved_at": "2025-04-12T23:20:50.520Z", "crn": "crn", "custom_metadata": {"anyKey": "anyValue"}, "description": "Extended description for this secret.", "downloaded": true, "id": "b49ad24d-81d4-5ebc-b9b9-b0937d1c84d5", "labels": ["my-label"], "locks_total": 0, "name": "my-secret", "secret_group_id": "default", "secret_type": "arbitrary", "state": 0, "state_description": "active", "updated_at": "2022-04-12T23:20:50.520Z", "versions_total": 0, "referenced_by": ["my-example-engine-config"], "expiration_date": "2033-04-12T23:20:50.520Z"}' responses.add( responses.PATCH, url, @@ -1144,7 +1144,7 @@ def test_update_secret_metadata_value_error(self): """ # Set up mock url = preprocess_url('/api/v2/secrets/0b5571f7-21e6-42b7-91c5-3f5ac9793a46/metadata') - mock_response = '{"created_by": "iam-ServiceId-e4a2f0a4-3c76-4bef-b1f2-fbeae11c0f21", "created_at": "2022-04-12T23:20:50.520Z", "crn": "crn", "custom_metadata": {"anyKey": "anyValue"}, "description": "Extended description for this secret.", "downloaded": true, "id": "b49ad24d-81d4-5ebc-b9b9-b0937d1c84d5", "labels": ["my-label"], "locks_total": 0, "name": "my-secret", "secret_group_id": "default", "secret_type": "arbitrary", "state": 0, "state_description": "active", "updated_at": "2022-04-12T23:20:50.520Z", "versions_total": 0, "referenced_by": ["my-example-engine-config"], "expiration_date": "2033-04-12T23:20:50.520Z"}' + mock_response = '{"created_by": "iam-ServiceId-e4a2f0a4-3c76-4bef-b1f2-fbeae11c0f21", "created_at": "2022-04-12T23:20:50.520Z", "retrieved_at": "2025-04-12T23:20:50.520Z", "crn": "crn", "custom_metadata": {"anyKey": "anyValue"}, "description": "Extended description for this secret.", "downloaded": true, "id": "b49ad24d-81d4-5ebc-b9b9-b0937d1c84d5", "labels": ["my-label"], "locks_total": 0, "name": "my-secret", "secret_group_id": "default", "secret_type": "arbitrary", "state": 0, "state_description": "active", "updated_at": "2022-04-12T23:20:50.520Z", "versions_total": 0, "referenced_by": ["my-example-engine-config"], "expiration_date": "2033-04-12T23:20:50.520Z"}' responses.add( responses.PATCH, url, @@ -1293,7 +1293,7 @@ def test_get_secret_by_name_type_all_params(self): """ # Set up mock url = preprocess_url('/api/v2/secret_groups/default/secret_types/arbitrary/secrets/my-secret') - mock_response = '{"created_by": "iam-ServiceId-e4a2f0a4-3c76-4bef-b1f2-fbeae11c0f21", "created_at": "2022-04-12T23:20:50.520Z", "crn": "crn", "custom_metadata": {"anyKey": "anyValue"}, "description": "Extended description for this secret.", "downloaded": true, "id": "b49ad24d-81d4-5ebc-b9b9-b0937d1c84d5", "labels": ["my-label"], "locks_total": 0, "name": "my-secret", "secret_group_id": "default", "secret_type": "arbitrary", "state": 0, "state_description": "active", "updated_at": "2022-04-12T23:20:50.520Z", "versions_total": 0, "referenced_by": ["my-example-engine-config"], "expiration_date": "2033-04-12T23:20:50.520Z", "payload": "secret-credentials"}' + mock_response = '{"created_by": "iam-ServiceId-e4a2f0a4-3c76-4bef-b1f2-fbeae11c0f21", "created_at": "2022-04-12T23:20:50.520Z", "retrieved_at": "2025-04-12T23:20:50.520Z", "crn": "crn", "custom_metadata": {"anyKey": "anyValue"}, "description": "Extended description for this secret.", "downloaded": true, "id": "b49ad24d-81d4-5ebc-b9b9-b0937d1c84d5", "labels": ["my-label"], "locks_total": 0, "name": "my-secret", "secret_group_id": "default", "secret_type": "arbitrary", "state": 0, "state_description": "active", "updated_at": "2022-04-12T23:20:50.520Z", "versions_total": 0, "referenced_by": ["my-example-engine-config"], "expiration_date": "2033-04-12T23:20:50.520Z", "payload": "secret-credentials"}' responses.add( responses.GET, url, @@ -1335,7 +1335,7 @@ def test_get_secret_by_name_type_value_error(self): """ # Set up mock url = preprocess_url('/api/v2/secret_groups/default/secret_types/arbitrary/secrets/my-secret') - mock_response = '{"created_by": "iam-ServiceId-e4a2f0a4-3c76-4bef-b1f2-fbeae11c0f21", "created_at": "2022-04-12T23:20:50.520Z", "crn": "crn", "custom_metadata": {"anyKey": "anyValue"}, "description": "Extended description for this secret.", "downloaded": true, "id": "b49ad24d-81d4-5ebc-b9b9-b0937d1c84d5", "labels": ["my-label"], "locks_total": 0, "name": "my-secret", "secret_group_id": "default", "secret_type": "arbitrary", "state": 0, "state_description": "active", "updated_at": "2022-04-12T23:20:50.520Z", "versions_total": 0, "referenced_by": ["my-example-engine-config"], "expiration_date": "2033-04-12T23:20:50.520Z", "payload": "secret-credentials"}' + mock_response = '{"created_by": "iam-ServiceId-e4a2f0a4-3c76-4bef-b1f2-fbeae11c0f21", "created_at": "2022-04-12T23:20:50.520Z", "retrieved_at": "2025-04-12T23:20:50.520Z", "crn": "crn", "custom_metadata": {"anyKey": "anyValue"}, "description": "Extended description for this secret.", "downloaded": true, "id": "b49ad24d-81d4-5ebc-b9b9-b0937d1c84d5", "labels": ["my-label"], "locks_total": 0, "name": "my-secret", "secret_group_id": "default", "secret_type": "arbitrary", "state": 0, "state_description": "active", "updated_at": "2022-04-12T23:20:50.520Z", "versions_total": 0, "referenced_by": ["my-example-engine-config"], "expiration_date": "2033-04-12T23:20:50.520Z", "payload": "secret-credentials"}' responses.add( responses.GET, url, @@ -5820,6 +5820,7 @@ def test_secret_metadata_paginated_collection_serialization(self): secret_metadata_model = {} # ArbitrarySecretMetadata secret_metadata_model['created_by'] = 'iam-ServiceId-e4a2f0a4-3c76-4bef-b1f2-fbeae11c0f21' secret_metadata_model['created_at'] = '2022-04-12T23:20:50.520000Z' + secret_metadata_model['retrieved_at'] = '2025-04-12T23:20:50.520000Z' secret_metadata_model['crn'] = 'testString' secret_metadata_model['custom_metadata'] = {'key': 'value'} secret_metadata_model['description'] = 'Extended description for this secret.' @@ -6631,6 +6632,7 @@ def test_arbitrary_secret_serialization(self): arbitrary_secret_model_json = {} arbitrary_secret_model_json['created_by'] = 'iam-ServiceId-e4a2f0a4-3c76-4bef-b1f2-fbeae11c0f21' arbitrary_secret_model_json['created_at'] = '2022-04-12T23:20:50.520000Z' + arbitrary_secret_model_json['retrieved_at'] = '2025-04-12T23:20:50.520000Z' arbitrary_secret_model_json['crn'] = 'testString' arbitrary_secret_model_json['custom_metadata'] = {'key': 'value'} arbitrary_secret_model_json['description'] = 'Extended description for this secret.' @@ -6672,6 +6674,7 @@ def test_arbitrary_secret_metadata_serialization(self): arbitrary_secret_metadata_model_json = {} arbitrary_secret_metadata_model_json['created_by'] = 'iam-ServiceId-e4a2f0a4-3c76-4bef-b1f2-fbeae11c0f21' arbitrary_secret_metadata_model_json['created_at'] = '2022-04-12T23:20:50.520000Z' + arbitrary_secret_metadata_model_json['retrieved_at'] = '2025-04-12T23:20:50.520000Z' arbitrary_secret_metadata_model_json['crn'] = 'testString' arbitrary_secret_metadata_model_json['custom_metadata'] = {'key': 'value'} arbitrary_secret_metadata_model_json['description'] = 'Extended description for this secret.' @@ -7125,6 +7128,7 @@ def test_custom_credentials_secret_serialization(self): custom_credentials_secret_model_json = {} custom_credentials_secret_model_json['created_by'] = 'iam-ServiceId-e4a2f0a4-3c76-4bef-b1f2-fbeae11c0f21' custom_credentials_secret_model_json['created_at'] = '2022-04-12T23:20:50.520000Z' + custom_credentials_secret_model_json['retrieved_at'] = '2025-04-12T23:20:50.520000Z' custom_credentials_secret_model_json['crn'] = 'testString' custom_credentials_secret_model_json['custom_metadata'] = {'key': 'value'} custom_credentials_secret_model_json['description'] = 'Extended description for this secret.' @@ -7179,6 +7183,7 @@ def test_custom_credentials_secret_metadata_serialization(self): custom_credentials_secret_metadata_model_json = {} custom_credentials_secret_metadata_model_json['created_by'] = 'iam-ServiceId-e4a2f0a4-3c76-4bef-b1f2-fbeae11c0f21' custom_credentials_secret_metadata_model_json['created_at'] = '2022-04-12T23:20:50.520000Z' + custom_credentials_secret_metadata_model_json['retrieved_at'] = '2025-04-12T23:20:50.520000Z' custom_credentials_secret_metadata_model_json['crn'] = 'testString' custom_credentials_secret_metadata_model_json['custom_metadata'] = {'key': 'value'} custom_credentials_secret_metadata_model_json['description'] = 'Extended description for this secret.' @@ -7570,6 +7575,7 @@ def test_iam_credentials_secret_serialization(self): iam_credentials_secret_model_json = {} iam_credentials_secret_model_json['created_by'] = 'iam-ServiceId-e4a2f0a4-3c76-4bef-b1f2-fbeae11c0f21' iam_credentials_secret_model_json['created_at'] = '2022-04-12T23:20:50.520000Z' + iam_credentials_secret_model_json['retrieved_at'] = '2025-04-12T23:20:50.520000Z' iam_credentials_secret_model_json['crn'] = 'testString' iam_credentials_secret_model_json['custom_metadata'] = {'key': 'value'} iam_credentials_secret_model_json['description'] = 'Extended description for this secret.' @@ -7623,6 +7629,7 @@ def test_iam_credentials_secret_metadata_serialization(self): iam_credentials_secret_metadata_model_json = {} iam_credentials_secret_metadata_model_json['created_by'] = 'iam-ServiceId-e4a2f0a4-3c76-4bef-b1f2-fbeae11c0f21' iam_credentials_secret_metadata_model_json['created_at'] = '2022-04-12T23:20:50.520000Z' + iam_credentials_secret_metadata_model_json['retrieved_at'] = '2025-04-12T23:20:50.520000Z' iam_credentials_secret_metadata_model_json['crn'] = 'testString' iam_credentials_secret_metadata_model_json['custom_metadata'] = {'key': 'value'} iam_credentials_secret_metadata_model_json['description'] = 'Extended description for this secret.' @@ -7939,6 +7946,7 @@ def test_imported_certificate_serialization(self): imported_certificate_model_json = {} imported_certificate_model_json['created_by'] = 'iam-ServiceId-e4a2f0a4-3c76-4bef-b1f2-fbeae11c0f21' imported_certificate_model_json['created_at'] = '2022-04-12T23:20:50.520000Z' + imported_certificate_model_json['retrieved_at'] = '2025-04-12T23:20:50.520000Z' imported_certificate_model_json['crn'] = 'testString' imported_certificate_model_json['custom_metadata'] = {'key': 'value'} imported_certificate_model_json['description'] = 'Extended description for this secret.' @@ -8028,6 +8036,7 @@ def test_imported_certificate_metadata_serialization(self): imported_certificate_metadata_model_json = {} imported_certificate_metadata_model_json['created_by'] = 'iam-ServiceId-e4a2f0a4-3c76-4bef-b1f2-fbeae11c0f21' imported_certificate_metadata_model_json['created_at'] = '2022-04-12T23:20:50.520000Z' + imported_certificate_metadata_model_json['retrieved_at'] = '2025-04-12T23:20:50.520000Z' imported_certificate_metadata_model_json['crn'] = 'testString' imported_certificate_metadata_model_json['custom_metadata'] = {'key': 'value'} imported_certificate_metadata_model_json['description'] = 'Extended description for this secret.' @@ -8343,6 +8352,7 @@ def test_kv_secret_serialization(self): kv_secret_model_json = {} kv_secret_model_json['created_by'] = 'iam-ServiceId-e4a2f0a4-3c76-4bef-b1f2-fbeae11c0f21' kv_secret_model_json['created_at'] = '2022-04-12T23:20:50.520000Z' + kv_secret_model_json['retrieved_at'] = '2025-04-12T23:20:50.520000Z' kv_secret_model_json['crn'] = 'testString' kv_secret_model_json['custom_metadata'] = {'key': 'value'} kv_secret_model_json['description'] = 'Extended description for this secret.' @@ -8384,6 +8394,7 @@ def test_kv_secret_metadata_serialization(self): kv_secret_metadata_model_json = {} kv_secret_metadata_model_json['created_by'] = 'iam-ServiceId-e4a2f0a4-3c76-4bef-b1f2-fbeae11c0f21' kv_secret_metadata_model_json['created_at'] = '2022-04-12T23:20:50.520000Z' + kv_secret_metadata_model_json['retrieved_at'] = '2025-04-12T23:20:50.520000Z' kv_secret_metadata_model_json['crn'] = 'testString' kv_secret_metadata_model_json['custom_metadata'] = {'key': 'value'} kv_secret_metadata_model_json['description'] = 'Extended description for this secret.' @@ -8616,6 +8627,7 @@ def test_private_certificate_serialization(self): private_certificate_model_json = {} private_certificate_model_json['created_by'] = 'iam-ServiceId-e4a2f0a4-3c76-4bef-b1f2-fbeae11c0f21' private_certificate_model_json['created_at'] = '2022-04-12T23:20:50.520000Z' + private_certificate_model_json['retrieved_at'] = '2025-04-12T23:20:50.520000Z' private_certificate_model_json['crn'] = 'testString' private_certificate_model_json['custom_metadata'] = {'key': 'value'} private_certificate_model_json['description'] = 'Extended description for this secret.' @@ -10021,6 +10033,7 @@ def test_private_certificate_metadata_serialization(self): private_certificate_metadata_model_json = {} private_certificate_metadata_model_json['created_by'] = 'iam-ServiceId-e4a2f0a4-3c76-4bef-b1f2-fbeae11c0f21' private_certificate_metadata_model_json['created_at'] = '2022-04-12T23:20:50.520000Z' + private_certificate_metadata_model_json['retrieved_at'] = '2025-04-12T23:20:50.520000Z' private_certificate_metadata_model_json['crn'] = 'testString' private_certificate_metadata_model_json['custom_metadata'] = {'key': 'value'} private_certificate_metadata_model_json['description'] = 'Extended description for this secret.' @@ -10364,6 +10377,7 @@ def test_public_certificate_serialization(self): public_certificate_model_json = {} public_certificate_model_json['created_by'] = 'iam-ServiceId-e4a2f0a4-3c76-4bef-b1f2-fbeae11c0f21' public_certificate_model_json['created_at'] = '2022-04-12T23:20:50.520000Z' + public_certificate_model_json['retrieved_at'] = '2025-04-12T23:20:50.520000Z' public_certificate_model_json['crn'] = 'testString' public_certificate_model_json['custom_metadata'] = {'key': 'value'} public_certificate_model_json['description'] = 'Extended description for this secret.' @@ -10899,6 +10913,7 @@ def test_public_certificate_metadata_serialization(self): public_certificate_metadata_model_json = {} public_certificate_metadata_model_json['created_by'] = 'iam-ServiceId-e4a2f0a4-3c76-4bef-b1f2-fbeae11c0f21' public_certificate_metadata_model_json['created_at'] = '2022-04-12T23:20:50.520000Z' + public_certificate_metadata_model_json['retrieved_at'] = '2025-04-12T23:20:50.520000Z' public_certificate_metadata_model_json['crn'] = 'testString' public_certificate_metadata_model_json['custom_metadata'] = {'key': 'value'} public_certificate_metadata_model_json['description'] = 'Extended description for this secret.' @@ -11347,6 +11362,7 @@ def test_service_credentials_secret_serialization(self): service_credentials_secret_model_json = {} service_credentials_secret_model_json['created_by'] = 'iam-ServiceId-e4a2f0a4-3c76-4bef-b1f2-fbeae11c0f21' service_credentials_secret_model_json['created_at'] = '2022-04-12T23:20:50.520000Z' + service_credentials_secret_model_json['retrieved_at'] = '2025-04-12T23:20:50.520000Z' service_credentials_secret_model_json['crn'] = 'testString' service_credentials_secret_model_json['custom_metadata'] = {'key': 'value'} service_credentials_secret_model_json['description'] = 'Extended description for this secret.' @@ -11428,6 +11444,7 @@ def test_service_credentials_secret_metadata_serialization(self): service_credentials_secret_metadata_model_json = {} service_credentials_secret_metadata_model_json['created_by'] = 'iam-ServiceId-e4a2f0a4-3c76-4bef-b1f2-fbeae11c0f21' service_credentials_secret_metadata_model_json['created_at'] = '2022-04-12T23:20:50.520000Z' + service_credentials_secret_metadata_model_json['retrieved_at'] = '2025-04-12T23:20:50.520000Z' service_credentials_secret_metadata_model_json['crn'] = 'testString' service_credentials_secret_metadata_model_json['custom_metadata'] = {'key': 'value'} service_credentials_secret_metadata_model_json['description'] = 'Extended description for this secret.' @@ -11710,6 +11727,7 @@ def test_username_password_secret_serialization(self): username_password_secret_model_json = {} username_password_secret_model_json['created_by'] = 'iam-ServiceId-e4a2f0a4-3c76-4bef-b1f2-fbeae11c0f21' username_password_secret_model_json['created_at'] = '2022-04-12T23:20:50.520000Z' + username_password_secret_model_json['retrieved_at'] = '2025-04-12T23:20:50.520000Z' username_password_secret_model_json['crn'] = 'testString' username_password_secret_model_json['custom_metadata'] = {'key': 'value'} username_password_secret_model_json['description'] = 'Extended description for this secret.' @@ -11767,6 +11785,7 @@ def test_username_password_secret_metadata_serialization(self): username_password_secret_metadata_model_json = {} username_password_secret_metadata_model_json['created_by'] = 'iam-ServiceId-e4a2f0a4-3c76-4bef-b1f2-fbeae11c0f21' username_password_secret_metadata_model_json['created_at'] = '2022-04-12T23:20:50.520000Z' + username_password_secret_metadata_model_json['retrieved_at'] = '2025-04-12T23:20:50.520000Z' username_password_secret_metadata_model_json['crn'] = 'testString' username_password_secret_metadata_model_json['custom_metadata'] = {'key': 'value'} username_password_secret_metadata_model_json['description'] = 'Extended description for this secret.' From d2ed033660083644560fec7d5a0b3f6cb06f71fd Mon Sep 17 00:00:00 2001 From: Yuval Dekel <51964607+ydekel6@users.noreply.github.com> Date: Mon, 25 Aug 2025 10:31:41 +0300 Subject: [PATCH 2/2] patch: bump release version --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index cbe5e15..d51ed96 100644 --- a/README.md +++ b/README.md @@ -67,7 +67,7 @@ To learn more about IAM authenticators and how to use them in your Python applic ### Basic usage - Use the `set_service_url` method to set the endpoint URL that is specific to your Secrets Manager service instance. To - find your endpoint URL, you can copy it from the **Endpoints** page in the Secrets Manager UI. + find your endpoint URL; you can copy it from the **Endpoints** page in the Secrets Manager UI. #### Examples