Skip to content

UN-2297 [FEAT] Support AWS S3 storage authentication via IRSA#1852

Open
kirtimanmishrazipstack wants to merge 17 commits intomainfrom
UN-2297-Support-AWS-S3-storage-IAM
Open

UN-2297 [FEAT] Support AWS S3 storage authentication via IRSA#1852
kirtimanmishrazipstack wants to merge 17 commits intomainfrom
UN-2297-Support-AWS-S3-storage-IAM

Conversation

@kirtimanmishrazipstack
Copy link
Contributor

@kirtimanmishrazipstack kirtimanmishrazipstack commented Mar 12, 2026

What

  • Updated SDK file storage helper to support AWS IAM Roles for Service Accounts (IRSA) when connecting to S3
  • Strips empty string credentials so boto3's default credential chain (IRSA) can take over
  • Moves region_name into client_kwargs for s3fs compatibility
  • Switched to lazy % formatting in logging functions

Why

  • When running on EKS with IRSA, boto3 should use the default credential chain instead of explicit access key / secret key. However, if empty string values are passed for these credentials, boto3 treats them as explicit (but invalid) credentials and skips the default chain entirely. This change allows IRSA-based authentication to work seamlessly.

How

  • In unstract/sdk1/src/unstract/sdk1/file_storage/helper.py:
    • For S3/Minio providers, strip any storage config values that are empty strings before passing to fsspec.filesystem(). This lets boto3 fall through to the default credential chain (e.g., IRSA, instance profile).
    • Move region_name from a top-level kwarg into client_kwargs, which is where s3fs expects it.
    • Replace f-string logging with lazy % formatting.

Can this PR break any existing features. If yes, please list possible items. If no, please explain why. (PS: Admins do not merge the PR without this section filled)

  • No. Existing S3 connections that pass explicit non-empty credentials are unaffected — only empty string values are stripped. The region_name move into client_kwargs is the correct s3fs API usage and does not change behavior for existing configurations.

Database Migrations

  • None

Env Config

  • No new env vars required. IRSA authentication is configured at the Kubernetes / IAM level, not via application env vars.

Relevant Docs

Related Issues or PRs

Dependencies Versions

  • No dependency changes

Notes on Testing

  • Verified uploading a document in prompt-studio. Exporting as a tool and running ETL

Screenshots

  • Showing screenshot of uploading a pdf in prompt-studio
5

Checklist

I have read and understood the Contribution Guidelines.

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Mar 12, 2026

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 127cb86a-6612-4cbc-8780-31cfbb6cc08d

📥 Commits

Reviewing files that changed from the base of the PR and between ca8168d and c1bfd27.

📒 Files selected for processing (1)
  • unstract/sdk1/src/unstract/sdk1/file_storage/helper.py
🚧 Files skipped from review as they are similar to previous changes (1)
  • unstract/sdk1/src/unstract/sdk1/file_storage/helper.py

Summary by CodeRabbit

Bug Fixes

  • Improved S3 and MINIO file storage configuration handling with enhanced parameter validation and region configuration management.

Chores

  • Updated logging formatting in file storage initialization for consistency and maintainability.

Walkthrough

Changed FileStorageHelper.file_storage_init signature to accept **storage_config: object, added preprocessing for S3/MINIO configs (strip empty/whitespace strings; move region_name into client_kwargs), and converted log calls from f-strings to parameterized formatting; existing exception behavior is preserved.

Changes

Cohort / File(s) Summary
File Storage Helper
unstract/sdk1/src/unstract/sdk1/file_storage/helper.py
Adjusted file_storage_init signature to **storage_config: object; for S3/MINIO providers, drop empty/whitespace string entries and relocate region_name into client_kwargs (ensuring it's a dict); replaced f-string logs with parameterized logger.debug/error messages; preserved exception handling and re-raising via FileStorageError.

Sequence Diagram(s)

(omitted)

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately summarizes the main change: adding AWS S3 storage authentication support via IRSA, which is the primary focus of the PR.
Description check ✅ Passed The PR description is comprehensive and well-structured, covering all major template sections including What, Why, How, breaking changes assessment, env config, testing notes, and related issues.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch UN-2297-Support-AWS-S3-storage-IAM
📝 Coding Plan
  • Generate coding plan for human review comments

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@kirtimanmishrazipstack kirtimanmishrazipstack changed the title UN-2297 [FEAT] Access s3 buckets using IAM role UN-2297 [FEAT] Support AWS S3 storage authentication via IRSA Mar 12, 2026
@kirtimanmishrazipstack kirtimanmishrazipstack marked this pull request as ready for review March 18, 2026 15:56
@greptile-apps
Copy link
Contributor

greptile-apps bot commented Mar 18, 2026

Greptile Summary

This PR adds support for AWS IAM Roles for Service Accounts (IRSA) authentication when connecting to S3/Minio storage, enabling credential-chain-based auth (e.g. on EKS) without requiring explicit access key/secret pairs.

Key changes:

  • Strips top-level storage_config entries whose value is an empty or whitespace-only string before calling fsspec.filesystem(), allowing boto3 to fall through to its default credential chain (IRSA, instance profile, etc.) instead of treating empty strings as explicit—but invalid—credentials.
  • Moves region_name from a top-level fsspec kwarg into client_kwargs, which is where s3fs actually expects it; includes a guard to handle a non-dict client_kwargs value defensively.
  • Fixes a pre-existing bug in local_file_system_init where the error log mistakenly referenced FileStorageProvider.GCS.value instead of FileStorageProvider.LOCAL.value.
  • Converts all f-string log calls to lazy %-style formatting.
  • Adds a tests/file_storage/__init__.py to create the test package directory, but no unit tests covering the new behaviour are included.

Confidence Score: 4/5

  • Safe to merge with minor caveats — existing non-empty credentials are unaffected, and the IRSA path is additive.
  • The change is well-scoped and the described behaviour (stripping empty-string credentials, migrating region_name into client_kwargs) is correct for the stated goal. The pre-existing GCS log bug is now also fixed. The main gaps are: no automated tests for the new logic, and a minor if region_name: truthiness guard that should be is not None for clarity. Neither is a blocking runtime issue for the primary use-case.
  • No files require special attention beyond the missing test coverage in unstract/sdk1/tests/file_storage/.

Important Files Changed

Filename Overview
unstract/sdk1/src/unstract/sdk1/file_storage/helper.py Core logic change: strips empty-string credentials before calling fsspec, moves region_name into client_kwargs, fixes the pre-existing local-FS error-log bug, and converts f-string logging to lazy %-style. Logic is sound; minor style concern around the if region_name: truthiness guard.
unstract/sdk1/tests/file_storage/init.py Empty file that creates the test package directory; no actual test cases for the new IRSA credential-stripping or region_name migration behaviour were added.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A[file_storage_init called] --> B{provider?}
    B -- LOCAL --> C[Set auto_mkdir=True]
    B -- MINIO --> D[Set protocol = S3]
    B -- S3 / MINIO --> E[Strip empty-string values\nfrom storage_config]
    C --> F[fsspec.filesystem]
    D --> E
    E --> G{region_name\nin config?}
    G -- Yes --> H[Pop region_name\nfrom storage_config]
    H --> I[Merge into client_kwargs]
    I --> F
    G -- No --> F
    F --> J{Success?}
    J -- Yes --> K[Return AbstractFileSystem]
    J -- KeyError --> L[Log error + raise FileStorageError]
    J -- Exception --> L
Loading
Prompt To Fix All With AI
This is a comment left during a code review.
Path: unstract/sdk1/tests/file_storage/__init__.py
Line: 1

Comment:
**No tests added for new IRSA logic**

The `__init__.py` was added to create the test package structure, but no actual test cases were written for the new IRSA-related behaviour. The key paths that would benefit from test coverage are:

- Empty-string credential values are stripped before calling `fsspec.filesystem()` (e.g. passing `key=""` results in `key` being absent from the final kwargs).
- `region_name` is moved from the top-level kwargs into `client_kwargs` for both `S3` and `MINIO` providers.
- A caller that passes no `region_name` at all does not get a `client_kwargs` entry injected.
- A caller that already provides `client_kwargs` without a `region_name` key has it merged correctly.

Given that this change directly affects credential-chain resolution on production EKS clusters, having at least a lightweight unit-test suite here would make the behaviour explicit and prevent regressions.

How can I resolve this? If you propose a fix, please make it concise.

---

This is a comment left during a code review.
Path: unstract/sdk1/src/unstract/sdk1/file_storage/helper.py
Line: 45-46

Comment:
**`region_name` falsy check skips valid non-empty values**

Line 46 uses a truthiness check (`if region_name:`) rather than an explicit `is not None` guard:

```python
region_name = storage_config.pop("region_name", None)
if region_name:   # <-- falsy check
```

There are two subtle consequences:

1. **Empty string after stripping**`region_name=""` would already have been removed by the dict comprehension above, so `pop` returns `None`, and the guard correctly skips. This path is fine.
2. **Caller explicitly passes `region_name=None`**`pop` returns `None`; the falsy check skips moving it into `client_kwargs`. The key is also gone from `storage_config` (because `pop` removed it). The net effect is that an explicitly-passed `None` is silently discarded rather than forwarded to `fsspec`, which could mask caller mistakes.

More importantly, using `is not None` makes the intent unambiguous:

```suggestion
                region_name = storage_config.pop("region_name", None)
                if region_name is not None:
```

How can I resolve this? If you propose a fix, please make it concise.

Last reviewed commit: "Merge branch 'UN-229..."

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (1)
unstract/sdk1/src/unstract/sdk1/file_storage/helper.py (1)

13-14: Type annotation object for **kwargs values is overly broad.

With **kwargs syntax, the annotation describes the type of each value, not the dict itself. Using object is less precise than Any. Since this is variadic keyword arguments and you're calling dict methods like .update(), .items(), .pop() on storage_config, the correct annotation would be **storage_config: Any.

Suggested fix
+from typing import Any
+
 class FileStorageHelper:
     `@staticmethod`
     def file_storage_init(
-        provider: FileStorageProvider, **storage_config: object
+        provider: FileStorageProvider, **storage_config: Any
     ) -> AbstractFileSystem:
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@unstract/sdk1/src/unstract/sdk1/file_storage/helper.py` around lines 13 - 14,
The type annotation for the variadic kwargs in function file_storage_init is too
broad (object) and should be changed to Any to reflect that each value can be
any type and since the function calls dict methods like storage_config.update(),
storage_config.items(), and storage_config.pop(); update the signature to def
file_storage_init(provider: FileStorageProvider, **storage_config: Any) and
import Any from typing to match actual usage.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@unstract/sdk1/src/unstract/sdk1/file_storage/helper.py`:
- Around line 82-86: The error log inside local_file_system_init incorrectly
references FileStorageProvider.GCS.value; update the logger.error call used in
local_file_system_init to reference the correct provider
(FileStorageProvider.LOCAL.value) and preserve the existing error variable (e)
and message formatting so failures initializing the LOCAL file system are logged
accurately.

---

Nitpick comments:
In `@unstract/sdk1/src/unstract/sdk1/file_storage/helper.py`:
- Around line 13-14: The type annotation for the variadic kwargs in function
file_storage_init is too broad (object) and should be changed to Any to reflect
that each value can be any type and since the function calls dict methods like
storage_config.update(), storage_config.items(), and storage_config.pop();
update the signature to def file_storage_init(provider: FileStorageProvider,
**storage_config: Any) and import Any from typing to match actual usage.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 2ca84777-daed-4bd5-914a-ffe004b75c0d

📥 Commits

Reviewing files that changed from the base of the PR and between 41137d8 and ca8168d.

📒 Files selected for processing (2)
  • unstract/sdk1/src/unstract/sdk1/file_storage/helper.py
  • unstract/sdk1/tests/file_storage/__init__.py

…ack/unstract into UN-2297-Support-AWS-S3-storage-IAM
@github-actions
Copy link
Contributor

Test Results

Summary
  • Runner Tests: 11 passed, 0 failed (11 total)
  • SDK1 Tests: 63 passed, 0 failed (63 total)

Runner Tests - Full Report
filepath function $$\textcolor{#23d18b}{\tt{passed}}$$ SUBTOTAL
$$\textcolor{#23d18b}{\tt{runner/src/unstract/runner/clients/test\_docker.py}}$$ $$\textcolor{#23d18b}{\tt{test\_logs}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{runner/src/unstract/runner/clients/test\_docker.py}}$$ $$\textcolor{#23d18b}{\tt{test\_cleanup}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{runner/src/unstract/runner/clients/test\_docker.py}}$$ $$\textcolor{#23d18b}{\tt{test\_cleanup\_skip}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{runner/src/unstract/runner/clients/test\_docker.py}}$$ $$\textcolor{#23d18b}{\tt{test\_client\_init}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{runner/src/unstract/runner/clients/test\_docker.py}}$$ $$\textcolor{#23d18b}{\tt{test\_get\_image\_exists}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{runner/src/unstract/runner/clients/test\_docker.py}}$$ $$\textcolor{#23d18b}{\tt{test\_get\_image}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{runner/src/unstract/runner/clients/test\_docker.py}}$$ $$\textcolor{#23d18b}{\tt{test\_get\_container\_run\_config}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{runner/src/unstract/runner/clients/test\_docker.py}}$$ $$\textcolor{#23d18b}{\tt{test\_get\_container\_run\_config\_without\_mount}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{runner/src/unstract/runner/clients/test\_docker.py}}$$ $$\textcolor{#23d18b}{\tt{test\_run\_container}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{runner/src/unstract/runner/clients/test\_docker.py}}$$ $$\textcolor{#23d18b}{\tt{test\_get\_image\_for\_sidecar}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{runner/src/unstract/runner/clients/test\_docker.py}}$$ $$\textcolor{#23d18b}{\tt{test\_sidecar\_container}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{TOTAL}}$$ $$\textcolor{#23d18b}{\tt{11}}$$ $$\textcolor{#23d18b}{\tt{11}}$$
SDK1 Tests - Full Report
filepath function $$\textcolor{#23d18b}{\tt{passed}}$$ SUBTOTAL
$$\textcolor{#23d18b}{\tt{tests/test\_platform.py}}$$ $$\textcolor{#23d18b}{\tt{TestPlatformHelperRetry.test\_success\_on\_first\_attempt}}$$ $$\textcolor{#23d18b}{\tt{2}}$$ $$\textcolor{#23d18b}{\tt{2}}$$
$$\textcolor{#23d18b}{\tt{tests/test\_platform.py}}$$ $$\textcolor{#23d18b}{\tt{TestPlatformHelperRetry.test\_retry\_on\_connection\_error}}$$ $$\textcolor{#23d18b}{\tt{2}}$$ $$\textcolor{#23d18b}{\tt{2}}$$
$$\textcolor{#23d18b}{\tt{tests/test\_platform.py}}$$ $$\textcolor{#23d18b}{\tt{TestPlatformHelperRetry.test\_non\_retryable\_http\_error}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/test\_platform.py}}$$ $$\textcolor{#23d18b}{\tt{TestPlatformHelperRetry.test\_retryable\_http\_errors}}$$ $$\textcolor{#23d18b}{\tt{3}}$$ $$\textcolor{#23d18b}{\tt{3}}$$
$$\textcolor{#23d18b}{\tt{tests/test\_platform.py}}$$ $$\textcolor{#23d18b}{\tt{TestPlatformHelperRetry.test\_post\_method\_retry}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/test\_platform.py}}$$ $$\textcolor{#23d18b}{\tt{TestPlatformHelperRetry.test\_retry\_logging}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/test\_prompt.py}}$$ $$\textcolor{#23d18b}{\tt{TestPromptToolRetry.test\_success\_on\_first\_attempt}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/test\_prompt.py}}$$ $$\textcolor{#23d18b}{\tt{TestPromptToolRetry.test\_retry\_on\_errors}}$$ $$\textcolor{#23d18b}{\tt{2}}$$ $$\textcolor{#23d18b}{\tt{2}}$$
$$\textcolor{#23d18b}{\tt{tests/test\_prompt.py}}$$ $$\textcolor{#23d18b}{\tt{TestPromptToolRetry.test\_wrapper\_methods\_retry}}$$ $$\textcolor{#23d18b}{\tt{4}}$$ $$\textcolor{#23d18b}{\tt{4}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestIsRetryableError.test\_connection\_error\_is\_retryable}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestIsRetryableError.test\_timeout\_is\_retryable}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestIsRetryableError.test\_http\_error\_retryable\_status\_codes}}$$ $$\textcolor{#23d18b}{\tt{3}}$$ $$\textcolor{#23d18b}{\tt{3}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestIsRetryableError.test\_http\_error\_non\_retryable\_status\_codes}}$$ $$\textcolor{#23d18b}{\tt{5}}$$ $$\textcolor{#23d18b}{\tt{5}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestIsRetryableError.test\_http\_error\_without\_response}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestIsRetryableError.test\_os\_error\_retryable\_errno}}$$ $$\textcolor{#23d18b}{\tt{5}}$$ $$\textcolor{#23d18b}{\tt{5}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestIsRetryableError.test\_os\_error\_non\_retryable\_errno}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestIsRetryableError.test\_other\_exception\_not\_retryable}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestCalculateDelay.test\_exponential\_backoff\_without\_jitter}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestCalculateDelay.test\_exponential\_backoff\_with\_jitter}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestCalculateDelay.test\_max\_delay\_cap}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestCalculateDelay.test\_max\_delay\_cap\_with\_jitter}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestRetryWithExponentialBackoff.test\_successful\_call\_first\_attempt}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestRetryWithExponentialBackoff.test\_retry\_after\_transient\_failure}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestRetryWithExponentialBackoff.test\_max\_retries\_exceeded}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestRetryWithExponentialBackoff.test\_retry\_with\_custom\_predicate}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestRetryWithExponentialBackoff.test\_no\_retry\_with\_predicate\_false}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestRetryWithExponentialBackoff.test\_exception\_not\_in\_tuple\_not\_retried}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestCreateRetryDecorator.test\_default\_configuration}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestCreateRetryDecorator.test\_environment\_variable\_configuration}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestCreateRetryDecorator.test\_invalid\_max\_retries}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestCreateRetryDecorator.test\_invalid\_base\_delay}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestCreateRetryDecorator.test\_invalid\_multiplier}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestCreateRetryDecorator.test\_jitter\_values}}$$ $$\textcolor{#23d18b}{\tt{2}}$$ $$\textcolor{#23d18b}{\tt{2}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestCreateRetryDecorator.test\_custom\_exceptions\_only}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestCreateRetryDecorator.test\_custom\_predicate\_only}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestCreateRetryDecorator.test\_both\_exceptions\_and\_predicate}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestCreateRetryDecorator.test\_exceptions\_match\_but\_predicate\_false}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestPreconfiguredDecorators.test\_retry\_platform\_service\_call\_exists}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestPreconfiguredDecorators.test\_retry\_prompt\_service\_call\_exists}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestPreconfiguredDecorators.test\_platform\_service\_decorator\_retries\_on\_connection\_error}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestPreconfiguredDecorators.test\_prompt\_service\_decorator\_retries\_on\_timeout}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestRetryLogging.test\_warning\_logged\_on\_retry}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestRetryLogging.test\_info\_logged\_on\_success\_after\_retry}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestRetryLogging.test\_exception\_logged\_on\_giving\_up}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{TOTAL}}$$ $$\textcolor{#23d18b}{\tt{63}}$$ $$\textcolor{#23d18b}{\tt{63}}$$

@sonarqubecloud
Copy link

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants