Skip to content

feat(local-setup): use cloud-provider-kind for local-setup#973

Merged
silvi-t merged 1 commit into
Kuadrant:mainfrom
silvi-t:local-kind-with-podman
May 18, 2026
Merged

feat(local-setup): use cloud-provider-kind for local-setup#973
silvi-t merged 1 commit into
Kuadrant:mainfrom
silvi-t:local-kind-with-podman

Conversation

@silvi-t
Copy link
Copy Markdown
Contributor

@silvi-t silvi-t commented May 11, 2026

Important

This PR modifies shared/core testsuite code that could potentially affect multiple test areas. 2 reviewers should review this PR to ensure adequate coverage.

Closes #957

Description

  • Replace MetalLB with cloud-provider-kind for LoadBalancer IP assignment in local Kind clusters
  • Support Podman for the local setup
  • Fix Envoy gateway test reliability by waiting for LoadBalancer service readiness

Changes

Local Setup

  • Replace install-metallb target with start-cloud-provider and stop-cloud-provider targets in make/dependencies.mk
  • Add CONTAINER_ENGINE variable (default: docker) to make/vars.mk
  • Pass KIND_EXPERIMENTAL_PROVIDER to kind create/delete cluster commands in make/kind.mk
  • Stop cloud-provider-kind on local-cleanup in make/local-setup.mk
  • Remove METALLB_VERSION and METALLB_TIMEOUT variables

Bug Fix

  • Add self.service.wait_for_ready() after Envoy LoadBalancer service creation in testsuite/gateway/envoy/__init__.py. Unlike MetalLB which assigns IPs synchronously, cloud-provider-kind assigns them asynchronously, so
    tests need to wait for the external IP before sending requests

Documentation

  • Update README.md prerequisites to list cloud-provider-kind instead of MetalLB
  • Add troubleshooting note for Podman users with another Docker-compatible runtime (Docker Desktop, OrbStack, etc.)
  • Replace macOS limitation warning with Docker/Podman usage instructions

Verification steps

# Full local setup with Docker (default)
make local-setup

# Verify LoadBalancer IPs are assigned
kubectl get svc -A | grep LoadBalancer

# Run tests
make smoke

# Cleanup
make local-cleanup

Summary by CodeRabbit

  • Documentation

    • Updated Quick Start for local Kind clusters with Docker vs Podman guidance, container-engine configuration and macOS compatibility notes.
  • New Features

    • Replaced MetalLB-based local LoadBalancer setup with cloud-provider-kind and added metrics-server to the startup flow.
  • Chores

    • Added start/stop cloud-provider automation and integrated it into local setup and cleanup flows.
  • Bug Fixes

    • Ensure Envoy-related LoadBalancer services are awaited until ready after deployment.

Review Change Stack

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 11, 2026

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Replaces MetalLB with cloud-provider-kind for LoadBalancer support, adds configurable CONTAINER_ENGINE (default docker), introduces start-cloud-provider/stop-cloud-provider Make targets, updates local setup/cleanup to run the cloud provider, modifies kind create/delete to use the container engine, updates README, and makes Envoy wait for Service readiness.

Changes

MetalLB to cloud-provider-kind migration

Layer / File(s) Summary
Configuration variables
make/vars.mk
Added CONTAINER_ENGINE variable (defaulting to docker); removed METALLB_VERSION and METALLB_TIMEOUT.
Kind cluster create/delete adjustments
make/kind.mk
kind-create-cluster pre-checks for existing cluster and kind create/kind delete now set KIND_EXPERIMENTAL_PROVIDER=$(CONTAINER_ENGINE).
Cloud provider lifecycle Make targets
make/dependencies.mk
Removed install-metallb; added start-cloud-provider and stop-cloud-provider targets to manage cloud-provider-kind background process with binary check, pgrep guard, OS-specific start/stop, and logging to /tmp/cloud-provider-kind.log.
Local setup orchestration
make/local-setup.mk
local-setup invokes start-cloud-provider after install-metrics-server; local-cleanup invokes stop-cloud-provider and help text updated.
Test infrastructure service readiness
testsuite/gateway/envoy/__init__.py
Envoy.commit() now waits for the Service to be ready after commit using settings["control_plane"]["slow_loadbalancers"].
Documentation updates
README.md
Prerequisites now include cloud-provider-kind; added container runtime guidance for Docker/Podman; Quick Start LoadBalancer step updated to reference cloud-provider-kind; macOS MetalLB limitation warning removed.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

  • Kuadrant/testsuite#921: Modifies make local-setup to install Prometheus with a LoadBalancer Service and derives its URL, which depends on the same LoadBalancer plumbing changed here.

Suggested labels

infrastructure, enhancement

Suggested reviewers

  • emmaaroche
  • averevki

Poem

🐰 I hopped into the Makefile light,
Swapped MetalLB for tunnels that bite,
Docker or Podman, choose your way,
cloud-provider-kind will forward the day,
Envoy waits — services wake and play.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 50.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly summarises the main objective: replacing MetalLB with cloud-provider-kind for the local setup.
Description check ✅ Passed The PR description follows the template structure with clear sections (Description, Changes, Verification) and provides comprehensive details about all modifications.
Linked Issues check ✅ Passed All coding requirements from issue #957 are met: Podman support added via CONTAINER_ENGINE variable, MetalLB replaced with cloud-provider-kind targets, kind commands pass KIND_EXPERIMENTAL_PROVIDER, local-setup orchestration updated, and testsuite wait-for-readiness logic added for LoadBalancer services.
Out of Scope Changes check ✅ Passed All changes are directly scoped to issue #957 objectives: Makefile variable/target updates for cloud-provider-kind and Podman support, Envoy test reliability fix for asynchronous IP assignment, and README documentation updates.

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

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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

@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: 3

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@make/dependencies.mk`:
- Around line 19-22: Replace the broad pkill-based management with PID-file
based management: stop using `pkill -f cloud-provider-kind` and instead check a
dedicated PID file (e.g., /tmp/cloud-provider-kind.pid), read the PID, verify
the process is `cloud-provider-kind` (or alive), send a targeted TERM/kill to
that PID, and remove the PID file if the process is gone; when starting
`cloud-provider-kind` redirect logs to /tmp/cloud-provider-kind.log, run it in
background and write its PID ($!) to /tmp/cloud-provider-kind.pid; also update
the corresponding stop/cleanup block (the other occurrence around the same rule)
to use the same PID-file logic and handle stale PID files safely.

In `@make/kind.mk`:
- Line 7: The Make target currently masks all failures by appending `|| echo
"Cluster already exists"` to the `KIND_EXPERIMENTAL_PROVIDER=$(CONTAINER_ENGINE)
kind create cluster --name $(KIND_CLUSTER_NAME)` command; instead, change the
logic to detect whether the cluster already exists and only skip creation in
that specific case (for example, run `kind get clusters` and check for
$(KIND_CLUSTER_NAME)) and otherwise run the `kind create cluster` command and
let it fail on real errors; update the invocation that uses
KIND_EXPERIMENTAL_PROVIDER/CONTAINER_ENGINE and KIND_CLUSTER_NAME so that
unexpected failures are not swallowed and the make target returns a non-zero
exit on real errors.

In `@README.md`:
- Around line 45-50: The blockquote containing the Docker/Podman guidance in
README.md has a blank line inside the quoted block (causing MD028); remove the
empty line so every quoted line begins with '>' consecutively (i.e., merge the
two blockquote paragraphs into a single continuous blockquote) and ensure the
fenced code block remains inside that blockquote without an intervening blank
'>'-less line.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 27fa4e05-c002-4b41-819f-565d07c05a24

📥 Commits

Reviewing files that changed from the base of the PR and between f9ce106 and 817c7a2.

📒 Files selected for processing (6)
  • README.md
  • make/dependencies.mk
  • make/kind.mk
  • make/local-setup.mk
  • make/vars.mk
  • testsuite/gateway/envoy/__init__.py

Comment thread make/dependencies.mk Outdated
Comment thread make/kind.mk Outdated
Comment thread README.md Outdated
@silvi-t silvi-t self-assigned this May 11, 2026
@silvi-t silvi-t force-pushed the local-kind-with-podman branch from 817c7a2 to c97a55f Compare May 11, 2026 13:04
@silvi-t silvi-t requested a review from a team May 11, 2026 13:08
Comment thread testsuite/gateway/envoy/__init__.py Outdated
@silvi-t silvi-t added this to Kuadrant May 12, 2026
@silvi-t silvi-t moved this to In Review in Kuadrant May 12, 2026
@silvi-t silvi-t force-pushed the local-kind-with-podman branch from c97a55f to a7d2a19 Compare May 13, 2026 08:10
Copy link
Copy Markdown

@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.

♻️ Duplicate comments (1)
README.md (1)

45-47: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Remove the blank blockquote line to satisfy MD028.

Line 46 breaks the blockquote sequence and triggers markdownlint (no-blanks-blockquote). Keep the blockquote continuous.

Proposed fix
 > **Docker users:** Set `CONTAINER_ENGINE=docker` when running `make local-setup`. Podman is used by default.
- 
 > **macOS container runtime:** This setup has been tested with [Podman Desktop](https://podman-desktop.io/). Other Docker-compatible runtimes (OrbStack, Docker Desktop, Rancher Desktop) may not work because `cloud-provider-kind` uses `docker ps` internally to discover Kind containers — if the Docker CLI points to a different runtime, it won't find the Podman-based Kind cluster.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@README.md` around lines 45 - 47, Remove the empty blank line that breaks the
blockquote so the two consecutive quoted lines remain a single continuous
blockquote; specifically, edit the README so the line containing "**macOS
container runtime:** This setup..." immediately follows the preceding "**Docker
users:** ..." blockquote line without an intervening blank line to satisfy MD028
(no-blanks-blockquote).
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Duplicate comments:
In `@README.md`:
- Around line 45-47: Remove the empty blank line that breaks the blockquote so
the two consecutive quoted lines remain a single continuous blockquote;
specifically, edit the README so the line containing "**macOS container
runtime:** This setup..." immediately follows the preceding "**Docker users:**
..." blockquote line without an intervening blank line to satisfy MD028
(no-blanks-blockquote).

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: ec591941-1eb1-4b78-8378-848e3be8f91f

📥 Commits

Reviewing files that changed from the base of the PR and between 817c7a2 and a7d2a19.

📒 Files selected for processing (6)
  • README.md
  • make/dependencies.mk
  • make/kind.mk
  • make/local-setup.mk
  • make/vars.mk
  • testsuite/gateway/envoy/__init__.py
🚧 Files skipped from review as they are similar to previous changes (4)
  • make/local-setup.mk
  • testsuite/gateway/envoy/init.py
  • make/vars.mk
  • make/dependencies.mk

@silvi-t silvi-t force-pushed the local-kind-with-podman branch from a7d2a19 to f289bcf Compare May 13, 2026 08:20
Comment thread README.md Outdated
@silvi-t silvi-t force-pushed the local-kind-with-podman branch from f289bcf to df8d26b Compare May 14, 2026 07:44
Copy link
Copy Markdown

@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.

♻️ Duplicate comments (1)
README.md (1)

45-47: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Markdown blockquote formatting may still need attention.

The static analysis tool continues to flag MD028 (blank line inside blockquote) at line 46, despite a past review marking this as addressed. If line 46 contains a > prefix (making it a blank line inside the blockquote), the two blockquote paragraphs should either be merged by removing line 46 entirely, or split into separate blockquotes by removing the > prefix from line 46.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@README.md` around lines 45 - 47, MD028 is triggered by a blank line that
still has a blockquote prefix between the two quoted paragraphs; fix by either
merging the paragraphs into a single blockquote (remove the extraneous blank
line with the leading ">" so "**Docker users:** Set
`CONTAINER_ENGINE=docker`..." and "**macOS container runtime:** This setup..."
are consecutive lines in the same blockquote) or split them into separate
blockquotes (remove the ">" prefix from the blank line so the blank line is not
inside a blockquote), ensuring the Markdown now has no empty ">"-prefixed line
between those two blockquote paragraphs.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Duplicate comments:
In `@README.md`:
- Around line 45-47: MD028 is triggered by a blank line that still has a
blockquote prefix between the two quoted paragraphs; fix by either merging the
paragraphs into a single blockquote (remove the extraneous blank line with the
leading ">" so "**Docker users:** Set `CONTAINER_ENGINE=docker`..." and "**macOS
container runtime:** This setup..." are consecutive lines in the same
blockquote) or split them into separate blockquotes (remove the ">" prefix from
the blank line so the blank line is not inside a blockquote), ensuring the
Markdown now has no empty ">"-prefixed line between those two blockquote
paragraphs.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 58573817-8b21-4789-ad2d-6f0468359462

📥 Commits

Reviewing files that changed from the base of the PR and between a7d2a19 and df8d26b.

📒 Files selected for processing (6)
  • README.md
  • make/dependencies.mk
  • make/kind.mk
  • make/local-setup.mk
  • make/vars.mk
  • testsuite/gateway/envoy/__init__.py
🚧 Files skipped from review as they are similar to previous changes (4)
  • make/vars.mk
  • make/local-setup.mk
  • make/kind.mk
  • make/dependencies.mk

emmaaroche
emmaaroche previously approved these changes May 14, 2026
Copy link
Copy Markdown
Contributor

@emmaaroche emmaaroche left a comment

Choose a reason for hiding this comment

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

LGTM 👍

Comment thread make/dependencies.mk Outdated
Comment thread make/vars.mk Outdated
Comment thread make/dependencies.mk Outdated
Copy link
Copy Markdown

@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

♻️ Duplicate comments (1)
README.md (1)

46-46: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Remove blank line inside blockquote to fix MD028.

The blank line between the two blockquote paragraphs triggers a Markdown linting warning (MD028). Remove it to create a continuous blockquote block.

📝 Proposed fix
 > **Podman users:** Set `CONTAINER_ENGINE=podman` when running `make local-setup`. Docker is used by default.
-
 > **macOS container runtime:** Use [Podman Desktop](https://podman-desktop.io/) or [Docker Desktop](https://www.docker.com/products/docker-desktop/) as the container runtime. Other Docker-compatible runtimes (e.g. OrbStack) may not work due to LoadBalancer networking incompatibilities with `cloud-provider-kind`.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@README.md` at line 46, Remove the empty blank line inside the blockquote so
MD028 no longer triggers: edit the README block that contains the
"<details><summary>📝 Proposed fix</summary>" section and delete the blank line
separating the two blockquote paragraphs so the blockquote becomes continuous
(merge the paragraphs into the same blockquote block).
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@make/vars.mk`:
- Line 6: The default container runtime is still set to Docker via the
CONTAINER_ENGINE variable; change its default to podman by updating the
CONTAINER_ENGINE assignment (CONTAINER_ENGINE ?= docker -> CONTAINER_ENGINE ?=
podman) so local setups default to Podman as intended; ensure any documentation
or scripts that rely on CONTAINER_ENGINE continue to work with the new default.

---

Duplicate comments:
In `@README.md`:
- Line 46: Remove the empty blank line inside the blockquote so MD028 no longer
triggers: edit the README block that contains the "<details><summary>📝 Proposed
fix</summary>" section and delete the blank line separating the two blockquote
paragraphs so the blockquote becomes continuous (merge the paragraphs into the
same blockquote block).
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 7c94eda5-6119-41e0-96be-ff8ea1e8ad3c

📥 Commits

Reviewing files that changed from the base of the PR and between df8d26b and 4b69e56.

📒 Files selected for processing (6)
  • README.md
  • make/dependencies.mk
  • make/kind.mk
  • make/local-setup.mk
  • make/vars.mk
  • testsuite/gateway/envoy/__init__.py
🚧 Files skipped from review as they are similar to previous changes (3)
  • make/kind.mk
  • make/dependencies.mk
  • make/local-setup.mk

Comment thread make/vars.mk
@silvi-t silvi-t changed the title feat(local-setup): use Podman and cloud-provider-kind for local-setup feat(local-setup): use cloud-provider-kind for local-setup May 14, 2026
@silvi-t silvi-t requested review from crstrn13 and emmaaroche May 14, 2026 15:58
Comment thread make/dependencies.mk Outdated
Signed-off-by: Silvia Tarabova <starabov@redhat.com>
@silvi-t silvi-t force-pushed the local-kind-with-podman branch from 4b69e56 to 5012a2a Compare May 18, 2026 14:55
Copy link
Copy Markdown

@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.

♻️ Duplicate comments (1)
README.md (1)

45-47: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Remove the blank line inside the blockquote (MD028).

Line 46 breaks the blockquote block and triggers markdownlint MD028.

Suggested fix
 > **Podman users:** Set `CONTAINER_ENGINE=podman` when running `make local-setup`. Docker is used by default.
-
 > **macOS container runtime:** Use [Podman Desktop](https://podman-desktop.io/) or [Docker Desktop](https://www.docker.com/products/docker-desktop/) as the container runtime. Other Docker-compatible runtimes (e.g. OrbStack) may not work due to LoadBalancer networking incompatibilities with `cloud-provider-kind`.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@README.md` around lines 45 - 47, The blockquote is broken by an empty line
between the two quoted lines; remove the blank line so the blockquote remains
continuous (i.e., join "**Podman users:** Set `CONTAINER_ENGINE=podman` when
running `make local-setup`. Docker is used by default." and "**macOS container
runtime:** Use Podman Desktop or Docker Desktop..." into the same blockquote
without an intervening blank line) to satisfy markdownlint MD028.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Duplicate comments:
In `@README.md`:
- Around line 45-47: The blockquote is broken by an empty line between the two
quoted lines; remove the blank line so the blockquote remains continuous (i.e.,
join "**Podman users:** Set `CONTAINER_ENGINE=podman` when running `make
local-setup`. Docker is used by default." and "**macOS container runtime:** Use
Podman Desktop or Docker Desktop..." into the same blockquote without an
intervening blank line) to satisfy markdownlint MD028.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: ac4db38d-ccac-429d-8e6f-4c8a6816b0a9

📥 Commits

Reviewing files that changed from the base of the PR and between 4b69e56 and 5012a2a.

📒 Files selected for processing (6)
  • README.md
  • make/dependencies.mk
  • make/kind.mk
  • make/local-setup.mk
  • make/vars.mk
  • testsuite/gateway/envoy/__init__.py
🚧 Files skipped from review as they are similar to previous changes (5)
  • make/vars.mk
  • make/local-setup.mk
  • make/kind.mk
  • make/dependencies.mk
  • testsuite/gateway/envoy/init.py

Copy link
Copy Markdown
Contributor

@crstrn13 crstrn13 left a comment

Choose a reason for hiding this comment

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

Tested on Fedora 43, works like a charm! 🎉 :shipit:

@silvi-t silvi-t merged commit 5ccaa27 into Kuadrant:main May 18, 2026
6 checks passed
@github-project-automation github-project-automation Bot moved this from In Review to Done in Kuadrant May 18, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

Replace MetalLB with cloud-provider-kind for local-setup LoadBalancer support

3 participants