Skip to content

Conversation

@hari-kuriakose
Copy link
Contributor

@hari-kuriakose hari-kuriakose commented Oct 23, 2025

What

Added comprehensive support for Podman (both rootless and rootful) alongside existing Docker support, enabling the Unstract platform to run with either container runtime without configuration changes for Docker users.

Key changes:

  • Universal socket mount configuration using environment variable expansion with Docker as default
  • Changed Traefik HTTP port from 80 to 8081 for rootless Podman compatibility
  • Updated frontend container to expose port 8080 internally (nginx listens on 8080)
  • Fixed worker-file-processing-v2 command structure to match other workers
  • New comprehensive documentation in docker/CONTAINER_RUNTIME.md

Why

  • Container Runtime Flexibility: Users should have the choice to run Unstract with their preferred container runtime (Docker or Podman) without platform limitations
  • Rootless Container Support: Enable secure, rootless Podman deployments for improved security posture
  • Zero-Config Docker Experience: Docker users (majority) should not need any configuration changes
  • Enterprise Requirements: Some organizations mandate Podman for container workloads due to security policies

How

Socket Configuration:

  • Default socket path: /var/run/docker.sock (Docker)
  • Podman opt-in: export DOCKER_SOCKET=${XDG_RUNTIME_DIR}/podman/podman.sock
  • Socket mount uses: ${DOCKER_SOCKET:-/var/run/docker.sock}

Port Configuration:

  • Changed Traefik HTTP port: 808081 (rootless compatibility)
  • Updated all service URLs to port 8081
  • Frontend container exposes 8080 internally

Documentation:

  • Created docker/CONTAINER_RUNTIME.md with runtime support guide
  • Updated docker/README.md with quick start for both runtimes
  • Included prerequisites, troubleshooting, and technical details

Environment Files:

  • Updated backend/sample.env: DJANGO_APP_BACKEND_URL and WEB_APP_ORIGIN_URL to port 8081
  • Updated frontend/sample.env: REACT_APP_BACKEND_URL to port 8081

Code Quality:

  • Fixed worker-file-processing-v2 to use entrypoint + command pattern (consistency with other workers)
  • Added .serena to .gitignore

Can this PR break any existing features. If yes, please list possible items. If no, please explain why.

YES - Breaking Change:

⚠️ Port Change from 80 to 8081

Impact:

  • Users accessing the platform at http://frontend.unstract.localhost (port 80) will need to update to http://frontend.unstract.localhost:8081
  • Bookmarks, scripts, integrations using port 80 will break
  • Environment variables in .env files need updating

Mitigation:

  • Clear documentation of breaking change in PR description and README
  • Sample environment files updated with new port
  • Migration guide provided in documentation

Why This Won't Break Other Features:

  • Socket configuration defaults to Docker standard (/var/run/docker.sock)
  • All internal service communication updated consistently
  • Traefik routing rules updated to match new port
  • Container discovery mechanisms unchanged
  • Worker command fix improves consistency (doesn't break functionality)

Database Migrations

N/A - No database schema changes

Env Config

Required Updates:

backend/.env:

DJANGO_APP_BACKEND_URL=http://frontend.unstract.localhost:8081
WEB_APP_ORIGIN_URL=http://frontend.unstract.localhost:8081

frontend/.env:

REACT_APP_BACKEND_URL=http://frontend.unstract.localhost:8081

Optional (Podman users only):

export DOCKER_SOCKET=${XDG_RUNTIME_DIR}/podman/podman.sock

Relevant Docs

  • docker/CONTAINER_RUNTIME.md - New comprehensive runtime support guide
  • docker/README.md - Updated with quick start instructions
  • backend/sample.env - Updated backend URLs
  • frontend/sample.env - Updated frontend backend URL

Related Issues or PRs

N/A

Dependencies Versions

  • Podman 4.0+ (for Podman users)
  • Docker 20.10+ (existing requirement)
  • podman-compose 1.0.3+ (for Podman users using compose)

Notes on Testing

Docker Testing (Default):

VERSION=dev docker compose -f docker/docker-compose.yaml up -d
curl http://frontend.unstract.localhost:8081

Podman Testing (Opt-In):

# Enable Podman socket
systemctl --user enable --now podman.socket

# Set environment variable and run
export DOCKER_SOCKET=${XDG_RUNTIME_DIR}/podman/podman.sock
VERSION=dev podman-compose -f docker/docker-compose.yaml up -d
curl http://frontend.unstract.localhost:8081

Verification Checklist:

  • Docker works with default configuration (no environment variables needed)
  • Podman rootless works with DOCKER_SOCKET environment variable
  • Traefik discovers containers correctly with both runtimes
  • Frontend accessible at port 8081
  • Runner service spawns tool containers with both socket types
  • All service URLs updated consistently to port 8081
  • worker-file-processing-v2 uses correct command structure

Screenshots

N/A - Infrastructure change, no UI modifications

Checklist

I have read and understood the Contribution Guidelines.


🤖 Generated with Claude Code

Co-Authored-By: Claude [email protected]

url and port to support rootless feat: support podman socket docs: add
container runtime details
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Oct 23, 2025

Summary by CodeRabbit

  • New Features

    • Added Docker and Podman container runtime support with comprehensive documentation.
  • Documentation

    • Added Container Runtime Support guide with socket detection, troubleshooting steps, and usage examples for both Docker and Podman workflows.
  • Chores

    • Updated frontend service port configuration to 8080 and Traefik reverse proxy to port 8081.
    • Modified backend and frontend URLs to reflect new port configuration.

Walkthrough

Reconfigures frontend to listen on 8080 and Traefik to expose HTTP on 8081, updates environment samples to reference the new frontend origin, replaces fixed Docker socket mounts with an environment-driven DOCKER_SOCKET fallback (Podman-aware), adds container runtime documentation, and adds .serena to .gitignore.

Changes

Cohort / File(s) Summary
Port config — frontend image & server
docker/dockerfiles/frontend.Dockerfile, frontend/nginx.conf
Production EXPOSE/listen changed from port 80 to 8080.
Compose — ports, socket, Traefik labels, workers
docker/docker-compose.yaml, docker/docker-compose-dev-essentials.yaml
Traefik HTTP mapping moved to 8081; frontend service now serves on 8080 (external mapping preserved as 3000:8080 in dev compose); replaced fixed /var/run/docker.sock mounts with DOCKER_SOCKET environment-driven bind (with fallback and Podman notes); Celery worker/beat entries and formatting adjusted; comments updated.
Environment samples
backend/sample.env, frontend/sample.env
Backend and frontend sample envs updated to reference http://frontend.unstract.localhost:8081 for frontend origin/backend URL variables.
Container runtime docs & README
docker/CONTAINER_RUNTIME.md, docker/README.md
Added container runtime support documentation covering Docker vs Podman socket detection, DOCKER_SOCKET override, examples, and troubleshooting; linked from Docker README with quick-start notes.
Repository ignore
.gitignore
Added comment # MCP servers and ignore pattern .serena.

Sequence Diagram(s)

sequenceDiagram
  autonumber
  participant Compose as docker-compose / podman-compose
  participant SocketDetector as DOCKER_SOCKET logic
  participant Traefik as Traefik reverse-proxy
  participant Frontend as Frontend (NGINX)
  Note over Compose,SocketDetector #D6EAF8: Startup / env evaluation
  Compose->>SocketDetector: Read DOCKER_SOCKET or default /var/run/docker.sock
  alt Podman socket present
    SocketDetector-->>Compose: Use Podman socket path
  else Default Docker socket
    SocketDetector-->>Compose: Use /var/run/docker.sock
  end
  Note over Traefik,Frontend #F9E79F: Service binding & port mapping
  Compose->>Traefik: Mount socket, set port mapping (8081 -> 80) and service label (frontend -> 8080)
  Compose->>Frontend: Start container exposing 8080
  Traefik->>Frontend: Route requests to port 8080
  Frontend->>Frontend: NGINX listens on 8080
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

  • Pay attention to socket mount changes and comments in docker/docker-compose.yaml and docker/docker-compose-dev-essentials.yaml.
  • Verify port consistency between dockerfiles/frontend.Dockerfile, frontend/nginx.conf, and compose port mappings/labels.
  • Confirm environment variable names/values in backend/sample.env and frontend/sample.env match runtime expectations.

Pre-merge checks and finishing touches

✅ Passed checks (2 passed)
Check name Status Explanation
Title Check ✅ Passed The title "feat: Add Podman rootless support alongside Docker" directly and accurately reflects the main objective of the pull request. The PR's primary feature is adding Podman support as an opt-in alternative to the existing Docker runtime, which is clearly captured in the title. The title is concise, readable, and avoids vague language. While the PR includes other changes such as port configuration updates and documentation, the core feature—enabling Podman support—is appropriately highlighted as the primary change.
Description Check ✅ Passed The pull request description is comprehensive and well-structured, containing all required sections from the repository's template. The "What" section clearly outlines key changes with bullet points, "Why" explains the rationale with four distinct points, and "How" provides detailed implementation guidance with configuration examples. Critically, the "Can this PR break any existing features" section—which the template notes is essential for admin review—is thoroughly completed with explicit acknowledgment of the breaking change (port 80 to 8081), detailed impact analysis, and mitigation strategies. Additional sections including Database Migrations, Env Config, Relevant Docs, Dependencies Versions, Notes on Testing, and Checklist are all present and appropriately detailed. The description demonstrates strong documentation practices with clear examples, testing procedures, and verification checklists.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feat/podman

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.

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: 5

📜 Review details

Configuration used: CodeRabbit 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 a219b2d and aac3bf3.

📒 Files selected for processing (9)
  • .gitignore (1 hunks)
  • backend/sample.env (2 hunks)
  • docker/CONTAINER_RUNTIME.md (1 hunks)
  • docker/README.md (1 hunks)
  • docker/docker-compose-dev-essentials.yaml (2 hunks)
  • docker/docker-compose.yaml (5 hunks)
  • docker/dockerfiles/frontend.Dockerfile (1 hunks)
  • frontend/nginx.conf (1 hunks)
  • frontend/sample.env (1 hunks)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: build
🔇 Additional comments (11)
.gitignore (1)

716-718: LGTM!

The addition of .serena to the ignore list for MCP servers is appropriate housekeeping.

backend/sample.env (2)

14-14: Verify the Django backend URL hostname.

Similar to the frontend configuration, DJANGO_APP_BACKEND_URL points to frontend.unstract.localhost:8081. This hostname seems inconsistent with a backend URL. Please verify the Traefik routing configuration.


43-43: LGTM!

The WEB_APP_ORIGIN_URL correctly points to the frontend service via port 8081.

docker/dockerfiles/frontend.Dockerfile (1)

57-57: LGTM!

Exposing port 8080 instead of 80 correctly supports rootless Podman by avoiding privileged ports (<1024). This aligns with the nginx configuration change.

frontend/nginx.conf (1)

41-41: LGTM!

Changing nginx to listen on port 8080 correctly supports rootless Podman and aligns with the Dockerfile exposure.

docker/README.md (1)

3-9: LGTM!

The addition of container runtime support documentation with quick start guidance for both Docker and Podman is helpful. The explicit mention of enabling podman.socket for Podman users is important for success.

docker/docker-compose-dev-essentials.yaml (2)

80-81: LGTM!

The port mapping change to 8081:80 correctly supports rootless Podman by avoiding privileged ports, and the comment clearly explains the rationale.


147-148: LGTM!

The reformatted RabbitMQ port comments improve readability without changing functionality.

frontend/sample.env (1)

1-1: No changes needed—backend URL configuration is correct.

The environment variable is properly configured. Traefik routes requests to frontend.unstract.localhost with path-based differentiation: /api/v1 and /deployment requests go to the backend service, while other requests go to the frontend service. The port mapping 8081:80 (host to container) is intentional for rootless Podman compatibility. The hostname is not inconsistent with the variable name—it reflects Traefik's unified routing design.

docker/docker-compose.yaml (2)

234-237: Verify the socket fallback chain fully implements the stated priority.

The socket mount uses ${DOCKER_SOCKET:-${XDG_RUNTIME_DIR:-/run/user/1000}/podman/podman.sock}, which covers priorities 1–3, but the PR objectives specify a 4th priority level for Docker's default socket. Currently, if all environment variables are unset, it falls back to the Podman socket path. Per the stated priority ($DOCKER_SOCKET → $XDG_RUNTIME_DIR/podman/podman.sock → /run/user/1000/podman/podman.sock → Docker default), the final fallback should be /var/run/docker.sock.

Consider whether this is intentional (Podman-first policy) or requires an additional fallback layer.


154-156: Frontend port mapping and Traefik configuration updates align with breaking change.

The port mapping change from 3000:80 to 3000:8080 and the corresponding Traefik server port override (line 176) correctly implement the Traefik HTTP port migration from 80 to 8081 for rootless Podman compatibility.

@hari-kuriakose
Copy link
Contributor Author

@chandrasekharan-zipstack Since there are breaking changes involved, we will need to add a release note to docker/scripts/release-notes/release_notes.json once the target release version is finalized.

Anywhere else to update?

hari-kuriakose and others added 2 commits October 23, 2025 21:51
Simplified container runtime socket configuration based on code review
feedback. Docker is now the default with Podman as an explicit opt-in.

Changes:
- Simplified socket mount from complex nested fallback to simple default
  - Before: ${DOCKER_SOCKET:-${XDG_RUNTIME_DIR:-/run/user/1000}/podman/podman.sock}
  - After: ${DOCKER_SOCKET:-/var/run/docker.sock}
- Docker works out of the box with no environment variables needed
- Podman users set: export DOCKER_SOCKET=${XDG_RUNTIME_DIR}/podman/podman.sock
- Updated CONTAINER_RUNTIME.md to reflect simplified approach
- Fixed worker-file-processing-v2 command structure to match other workers
  (entrypoint + command pattern instead of array with binary)

Benefits:
- Cleaner default configuration for majority Docker users
- Explicit opt-in for Podman users
- Addresses CodeRabbit review concerns about socket fallback logic

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <[email protected]>
@chandrasekharan-zipstack
Copy link
Contributor

@chandrasekharan-zipstack Since there are breaking changes involved, we will need to add a release note to docker/scripts/release-notes/release_notes.json once the target release version is finalized.

Anywhere else to update?

That's the only place to update. Once its up we could update the public documentation and link this README.md or maintain it there alone

labels:
- traefik.enable=true
- traefik.http.routers.frontend.rule=Host(`frontend.unstract.localhost`) && !PathPrefix(`/api/v1`, `/deployment`)
- traefik.http.services.frontend.loadbalancer.server.port=8080
Copy link
Contributor

Choose a reason for hiding this comment

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

@hari-kuriakose is this config necessary? looking at our existing backend configuration I can't see such a configuration

# The HTTP port
- "80:80"
# The HTTP port (changed to 8081 for rootless Podman compatibility)
- "8081:80"
Copy link
Contributor

Choose a reason for hiding this comment

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

@hari-kuriakose why do we need to make this change exactly?

@sonarqubecloud
Copy link

sonarqubecloud bot commented Nov 4, 2025

@github-actions
Copy link
Contributor

github-actions bot commented Nov 4, 2025

Test Results

Summary
  • Runner Tests: 11 passed, 0 failed (11 total)
  • SDK1 Tests: 66 passed, 0 failed (66 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\_max\_time\_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{TestRetryWithExponentialBackoff.test\_delay\_would\_exceed\_max\_time}}$$ $$\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\_max\_time}}$$ $$\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{66}}$$ $$\textcolor{#23d18b}{\tt{66}}$$

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