Skip to content

UN-3097 [FIX] Fix logs screen pagination and other issues in card-based deployment layout#1821

Merged
Deepak-Kesavan merged 4 commits intomainfrom
fix/card-layout-regressions
Mar 3, 2026
Merged

UN-3097 [FIX] Fix logs screen pagination and other issues in card-based deployment layout#1821
Deepak-Kesavan merged 4 commits intomainfrom
fix/card-layout-regressions

Conversation

@chandrasekharan-zipstack
Copy link
Copy Markdown
Contributor

@chandrasekharan-zipstack chandrasekharan-zipstack commented Mar 3, 2026

What

Why

  • Several critical bugs were reported after the card layout rollout, including a blocker preventing API deployment creation

How

  1. Unable to create API deployment (Blocker): CreateApiDeploymentModal crashed on null workflowEndpointList — added default value [] and optional chaining on .find() / .map()
  2. API/ETL endpoint cards redirecting to 404: Replaced clickable link with plain text + copy button since the endpoint URL isn't a valid app route
  3. No visual update on manual ETL sync: handleSync now updates table data immediately with the API response instead of setting a hardcoded "processing" state before the response
  4. Deployed API/ETL name not displayed in workflow page: Removed strict is_active === true filter — banner now shows for any API deployment linked to the workflow (prefers active, falls back to first)
  5. Double delete confirmation for API/ETL: Removed redundant DeleteModal — delete now triggers directly from the card's built-in confirm action
  6. Azure connector error messages: Removed redundant "Error:" prefix in Azure Cloud Storage exception messages

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. All changes are scoped to fixing regressions from UN-3154 [FEAT] Card based layout to list Pipelines and API Deployments #1769. The delete flow now relies on the card's confirm popover instead of a separate modal — functionally equivalent. The API deployment banner is now more permissive (shows for inactive deployments too), which is the correct behavior matching pipelines.

Notes on Testing

  1. Open a workflow with an existing (inactive) API deployment → banner should show the deployment name
  2. Create a new API deployment from the workflow page → should not crash
  3. Click API/ETL endpoint on card → should show text with copy button, no navigation
  4. Manually sync an ETL pipeline → status should update in UI without page reload
  5. Delete an API deployment or pipeline → should show only one confirmation

Screenshots

image

Checklist

I have read and understood the Contribution Guidelines.

- Fix null reference in CreateApiDeploymentModal (unable to create API deployment)
- Replace clickable endpoint link with copy button to prevent 404 redirects
- Add immediate table update on manual ETL sync with API response
- Remove strict is_active filter for API deployment banner visibility
- Remove redundant DeleteModal (delete now triggers directly from card)
- Cleanup Azure connector error message (remove redundant prefix)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai bot commented Mar 3, 2026

Summary by CodeRabbit

  • New Features

    • Contextual pagination labels added for clearer totals (e.g., "pipelines", "APIs").
  • Bug Fixes

    • Better handling of paginated API responses and fallback to show deployments when no active one exists.
    • Prevented runtime errors when workflow data is missing during deployment creation.
    • Pagination reset on log tab changes to ensure consistent view.
  • Changes

    • API endpoint values shown as plain text in tooltips.
    • Deletion flows for deployments and pipelines simplified to item-driven actions.

Walkthrough

Removal of modal-driven deletion in pipelines and API deployments, safer handling of possibly paginated API responses and undefined lists, UI simplifications for endpoint rendering and pagination labels, and standardized Azure error message formatting.

Changes

Cohort / File(s) Summary
Deletion Flow Refactor
frontend/src/components/deployments/api-deployment/ApiDeployment.jsx, frontend/src/components/pipelines-or-deployments/pipelines/Pipelines.jsx
Removed DeleteModal and related open state. deleteApiDeployment(item) and deletePipeline(item) now accept an item param and derive id from item (fallback to selectedRow/selectedPorD). handleDeleteDeployment(item) / handleDeletePipeline(item) updated; pagination config adds itemLabel.
Agency: paginated responses & deployment selection
frontend/src/components/agency/agency/Agency.jsx
Read apiDeployments and pipelines from *.data.results with fallback to *.data. Selection logic now prefers an active API deployment if present, otherwise uses the first deployment; DeploymentInfo constructed from the resolved apiDeployment.
Create API Deployment Modal safety
frontend/src/components/deployments/create-api-deployment-modal/CreateApiDeploymentModal.jsx
Added default workflowEndpointList = [] and optional chaining (workflowEndpointList?.find, workflowEndpointList?.map) to avoid runtime errors when the list is undefined.
Endpoint display simplification
frontend/src/components/widgets/card-grid-view/CardFieldComponents.jsx
Removed runtime URL validation and conditional link rendering; endpoint is always rendered as shortened plain text inside a tooltip.
Pagination label & propTypes
frontend/src/components/widgets/card-grid-view/CardGridView.jsx
Pagination.showTotal now uses pagination.itemLabel (fallback "items"); added itemLabel: PropTypes.string to CardGridView.propTypes.pagination.
Azure error formatting
unstract/connectors/src/unstract/connectors/filesystems/azure_cloud_storage/exceptions.py
Removed literal "Error: " prefixes and standardized code block wrapping of error content across exception branches (ClientAuthenticationError, ServiceRequestError, HttpResponseError, default).
Execution logs pagination reset
frontend/src/components/logging/execution-logs/ExecutionLogs.jsx
On tab change, navigation to logs route now also resets pagination current page to 1.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 42.86% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately summarizes the main change—fixing multiple regressions in card-based deployment layout—and is clear and specific.
Description check ✅ Passed The description is comprehensive with all required sections: What, Why, How, breaking changes assessment, testing notes, and checklist. It clearly explains the six distinct issues being fixed.

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

✨ Finishing Touches
  • 📝 Generate docstrings (stacked PR)
  • 📝 Generate docstrings (commit on current branch)
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch fix/card-layout-regressions

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.

@chandrasekharan-zipstack chandrasekharan-zipstack changed the title [FIX] Fix multiple regressions in card-based deployment layout [MISC] Fix multiple issues in card-based deployment layout Mar 3, 2026
Copy link
Copy Markdown
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.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
frontend/src/components/deployments/create-api-deployment-modal/CreateApiDeploymentModal.jsx (1)

292-292: ⚠️ Potential issue | 🟡 Minor

PropTypes mismatch: workflowEndpointList should be PropTypes.array, not PropTypes.object.

The prop is initialized as an array (useState([]) in ApiDeployment.jsx line 46), defaulted to an array on line 28, and iterated with .map() on line 265. The PropTypes declaration should reflect this.

Proposed fix
-  workflowEndpointList: PropTypes.object,
+  workflowEndpointList: PropTypes.array,
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@frontend/src/components/deployments/create-api-deployment-modal/CreateApiDeploymentModal.jsx`
at line 292, PropTypes for workflowEndpointList is incorrect: update the
CreateApiDeploymentModal.jsx PropTypes declaration for workflowEndpointList from
PropTypes.object to PropTypes.array (or PropTypes.arrayOf(PropTypes.object) if
the items are objects) so it matches the useState([]) initialization and the
.map() usage; ensure any defaultProps remain an array and run a quick search for
workflowEndpointList in CreateApiDeploymentModal to update all related prop type
expectations consistently.
🧹 Nitpick comments (1)
unstract/connectors/src/unstract/connectors/filesystems/azure_cloud_storage/exceptions.py (1)

45-45: Use explicit f-string conversion on Line 45.

Ruff RUF010 (explicit-f-string-type-conversion) applies here. Replace {str(e)} with the conversion flag {e!s} for consistency with modern f-string conventions.

Proposed fix
-        error_message += f"Error from Azure Cloud Storage. \n```\n{str(e)}\n```"
+        error_message += f"Error from Azure Cloud Storage. \n```\n{e!s}\n```"
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@unstract/connectors/src/unstract/connectors/filesystems/azure_cloud_storage/exceptions.py`
at line 45, Replace the explicit str() conversion in the f-string that builds
error_message: change the interpolation from {str(e)} to the explicit f-string
conversion {e!s} in the code that appends "Error from Azure Cloud Storage" (the
block that updates error_message using variable e); this satisfies Ruff RUF010
and keeps the message content the same while using {e!s} for correct f-string
conversion.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Outside diff comments:
In
`@frontend/src/components/deployments/create-api-deployment-modal/CreateApiDeploymentModal.jsx`:
- Line 292: PropTypes for workflowEndpointList is incorrect: update the
CreateApiDeploymentModal.jsx PropTypes declaration for workflowEndpointList from
PropTypes.object to PropTypes.array (or PropTypes.arrayOf(PropTypes.object) if
the items are objects) so it matches the useState([]) initialization and the
.map() usage; ensure any defaultProps remain an array and run a quick search for
workflowEndpointList in CreateApiDeploymentModal to update all related prop type
expectations consistently.

---

Nitpick comments:
In
`@unstract/connectors/src/unstract/connectors/filesystems/azure_cloud_storage/exceptions.py`:
- Line 45: Replace the explicit str() conversion in the f-string that builds
error_message: change the interpolation from {str(e)} to the explicit f-string
conversion {e!s} in the code that appends "Error from Azure Cloud Storage" (the
block that updates error_message using variable e); this satisfies Ruff RUF010
and keeps the message content the same while using {e!s} for correct f-string
conversion.

ℹ️ Review info

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Cache: Disabled due to Reviews > Disable Cache setting

Knowledge base: Disabled due to Reviews -> Disable Knowledge Base setting

📥 Commits

Reviewing files that changed from the base of the PR and between 1cad9b7 and 8166f11.

📒 Files selected for processing (6)
  • frontend/src/components/agency/agency/Agency.jsx
  • frontend/src/components/deployments/api-deployment/ApiDeployment.jsx
  • frontend/src/components/deployments/create-api-deployment-modal/CreateApiDeploymentModal.jsx
  • frontend/src/components/pipelines-or-deployments/pipelines/Pipelines.jsx
  • frontend/src/components/widgets/card-grid-view/CardFieldComponents.jsx
  • unstract/connectors/src/unstract/connectors/filesystems/azure_cloud_storage/exceptions.py

Use "APIs" and "pipelines" instead of generic "items" in pagination text.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Copy link
Copy Markdown
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: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@frontend/src/components/deployments/api-deployment/ApiDeployment.jsx`:
- Around line 165-169: The deleteApiDeployment handler may call
apiDeploymentsApiService.deleteApiDeployment with an undefined or empty id
(using item?.id || selectedRow.id); add a guard in deleteApiDeployment to
validate the resolved id before calling the service, e.g., compute const id =
item?.id ?? selectedRow?.id and if (!id) return early (or show a user-facing
error/toast) so apiDeploymentsApiService.deleteApiDeployment is never invoked
with an invalid id.

In `@frontend/src/components/pipelines-or-deployments/pipelines/Pipelines.jsx`:
- Around line 233-237: The deletePipeline function can compute an empty id from
item?.id || selectedPorD.id which may trigger a DELETE to an invalid endpoint;
add a guard at the top of deletePipeline (referencing deletePipeline, item,
selectedPorD, and id) that checks if id is falsy and returns early (or shows an
error/notification) before constructing requestOptions and issuing the DELETE
request to avoid sending requests with an empty id.

ℹ️ Review info

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Cache: Disabled due to Reviews > Disable Cache setting

Knowledge base: Disabled due to Reviews -> Disable Knowledge Base setting

📥 Commits

Reviewing files that changed from the base of the PR and between 8166f11 and 573c91c.

📒 Files selected for processing (3)
  • frontend/src/components/deployments/api-deployment/ApiDeployment.jsx
  • frontend/src/components/pipelines-or-deployments/pipelines/Pipelines.jsx
  • frontend/src/components/widgets/card-grid-view/CardGridView.jsx

Deepak-Kesavan and others added 2 commits March 3, 2026 17:59
Reset pagination to page 1 when switching execution log tabs to avoid
stale page state. Merge implicit f-string concatenation in Azure
exceptions to resolve SonarQube S5799.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Mar 3, 2026

Frontend Lint Report (Biome)

All checks passed! No linting or formatting issues found.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Mar 3, 2026

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
Copy Markdown

sonarqubecloud bot commented Mar 3, 2026

@chandrasekharan-zipstack chandrasekharan-zipstack changed the title [MISC] Fix multiple issues in card-based deployment layout UN-3097 [FIX] Fix logs screen pagination and other issues in card-based deployment layout Mar 3, 2026
Copy link
Copy Markdown
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

🤖 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/connectors/src/unstract/connectors/filesystems/azure_cloud_storage/exceptions.py`:
- Line 45: Replace the explicit str() call inside the f-string with Python's
conversion flag: change the interpolation from {str(e)} to {e!s} where the
exception is appended to error_message (the f-string that builds "Error from
Azure Cloud Storage..." in the exceptions module) so Ruff RUF010 is satisfied
and the same stringified exception is produced.

ℹ️ Review info

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Cache: Disabled due to Reviews > Disable Cache setting

Knowledge base: Disabled due to Reviews -> Disable Knowledge Base setting

📥 Commits

Reviewing files that changed from the base of the PR and between 573c91c and b37e744.

📒 Files selected for processing (2)
  • frontend/src/components/logging/execution-logs/ExecutionLogs.jsx
  • unstract/connectors/src/unstract/connectors/filesystems/azure_cloud_storage/exceptions.py

@Deepak-Kesavan Deepak-Kesavan merged commit 8a33c43 into main Mar 3, 2026
8 checks passed
@Deepak-Kesavan Deepak-Kesavan deleted the fix/card-layout-regressions branch March 3, 2026 14:10
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