Skip to content

tests: add a phase for testing with lots of pods, and reduce cost - #1287

Merged
kubernetes-prow[bot] merged 1 commit into
kubernetes-sigs:mainfrom
justinsb:stress-ci-tiers
Jul 27, 2026
Merged

kubernetes-prow[bot] merged 1 commit into
kubernetes-sigs:mainfrom
justinsb:stress-ci-tiers

Conversation

@justinsb

@justinsb justinsb commented Jul 26, 2026 •

Copy link
Copy Markdown
Contributor

Refactor the tests so that the periodic tests run at moderate size, and the presubmit tests are a bit cheaper. We seem to get a lot of signal even at a small number of nodes, we're identifying a lot of problems in upstream kube, and we've found a bunch of issues/configuration settings in our own code also. We'll continue to find those in the periodic tests (and can probably justify even bigger size in the periodic tests).

Also in our tests add a phase so that we can test lots of pods / behaviour with lots of pods. fill gains the ability to specify pct:80 (for example) which will fill to 80% of capacity. Then we can run additional phases, verifying e.g. the throughput we can achieve when at 80% instead of at 10%.

This lets us test at (essentially) 100% capacity - 1000 sandboxes with 10 nodes, 2000 with 20. We can investigate maxPodsPerNode and ipv6 to see what happens when we go even denser - kOps supports both. (The one I've not tested personally is swap)

Summary by CodeRabbit

  • New Features
    • Updated benchmark periodics to run the daily continuous performance scenario directly with an explicit 20-node baseline.
    • Added clearer and more consistent default stress configurations for Cilium and Kindnet, including improved phase sequencing.
    • Enhanced stress phase handling to support fill-pct and throughput-mif:<N> formats, with richer phase resolution.
  • Bug Fixes
    • Improved per-phase “requested” reporting accuracy.
    • Sanitized profiling artifact filenames for safe, consistent output.
  • Tests
    • Added unit tests covering phase parsing, kind detection, resolution behavior, and capacity ordering.

Copilot AI review requested due to automatic review settings July 26, 2026 14:12
@netlify

netlify Bot commented Jul 26, 2026 •

Copy link
Copy Markdown

✅ Deploy Preview for agent-sandbox canceled.

Name Link
🔨 Latest commit 93d46e0
🔍 Latest deploy log https://app.netlify.com/projects/agent-sandbox/deploys/6a677d84c6a1960007760ee3

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@kubernetes-prow

Copy link
Copy Markdown

[APPROVALNOTIFIER] This PR is APPROVED

This pull-request has been approved by: justinsb

The full list of commands accepted by this bot can be found here.

The pull request process is described here

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@kubernetes-prow
kubernetes-prow Bot requested review from barney-s and vicentefb July 26, 2026 14:12
@kubernetes-prow kubernetes-prow Bot added approved Indicates a PR has been approved by an approver from all required OWNERS files. cncf-cla: yes Indicates the PR's author has signed the CNCF CLA. size/L Denotes a PR that changes 100-499 lines, ignoring generated files. labels Jul 26, 2026
@coderabbitai

coderabbitai Bot commented Jul 26, 2026 •

Copy link
Copy Markdown

Review Change Stack

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

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 0bcd97d4-7497-4a9f-b35c-2cfab8c5ff56

📥 Commits

Reviewing files that changed from the base of the PR and between 98bb502 and 93d46e0.

📒 Files selected for processing (13)
  • dev/ci/periodics/benchmarks-kops-gcp-cilium
  • dev/ci/periodics/benchmarks-kops-gcp-kindnet
  • dev/ci/presubmits/benchmarks-kops-gcp-cilium
  • test/benchmarks/scenarios/benchmarks-kops-gcp/run
  • test/stress/generate-report/download_results.py
  • test/stress/main.go
  • test/stress/phase.go
  • test/stress/phaseconfig_test.go
  • test/stress/phases.go
  • test/stress/pprof.go
  • test/stress/sustained.go
  • test/stress/sustained_test.go
  • test/stress/tracker.go
🚧 Files skipped from review as they are similar to previous changes (13)
  • test/stress/sustained.go
  • dev/ci/periodics/benchmarks-kops-gcp-kindnet
  • dev/ci/presubmits/benchmarks-kops-gcp-cilium
  • dev/ci/periodics/benchmarks-kops-gcp-cilium
  • test/stress/generate-report/download_results.py
  • test/benchmarks/scenarios/benchmarks-kops-gcp/run
  • test/stress/pprof.go
  • test/stress/tracker.go
  • test/stress/phases.go
  • test/stress/sustained_test.go
  • test/stress/main.go
  • test/stress/phaseconfig_test.go
  • test/stress/phase.go

📝 Walkthrough

Walkthrough

The PR updates benchmark entrypoints, expands stress phase syntax and defaults, and refactors execution around parsed and resolved phase objects. Reporting, tracker identifiers, profiler filenames, and capacity-resolution tests now use the PhaseName-based model.

Changes

Benchmark phase execution

Layer / File(s) Summary
Benchmark entrypoints and defaults
dev/ci/periodics/*, dev/ci/presubmits/benchmarks-kops-gcp-cilium, test/benchmarks/scenarios/benchmarks-kops-gcp/run
CI scripts set CNI and sizing defaults, invoke the shared scenario directly, and expand the default phase sequence.
Phase parsing and capacity resolution
test/stress/phase.go, test/stress/phaseconfig_test.go, test/stress/sustained_test.go, test/stress/main.go
Phase parsing, validation, concrete implementations, fill resolution, capacity checks, and related tests are added or updated.
Resolved phase execution and reporting
test/stress/main.go, test/stress/phases.go, test/stress/tracker.go, test/stress/sustained.go
Execution uses resolved phase objects and PhaseName, while claims gating, sandbox operations, tracker records, and summaries follow the parsed phase list.
Profile artifact naming
test/stress/pprof.go, test/stress/generate-report/download_results.py, test/stress/phaseconfig_test.go
Profiler and download paths sanitize phase names before constructing artifact filenames.

Estimated code review effort: 4 (Complex) | ~45 minutes

Possibly related PRs

Suggested labels: lgtm, cncf-cla: yes

Suggested reviewers: barney-s, vicentefb, copilot

🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (2 warnings)

Check name Status Explanation Resolution
Description check ⚠️ Warning The description explains the goal, but it misses the required template sections for issue links and release notes. Rewrite the PR description with the required headings, add any issue references, and include a release-note block.
Docstring Coverage ⚠️ Warning Docstring coverage is 40.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed The title matches the main change: adding a new pod-density testing phase while reducing periodic test cost.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ 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.

@justinsb justinsb changed the title ci: tier the benchmark jobs; stress-test gains fill-utilN density phases WIP: ci: tier the benchmark jobs; stress-test gains fill-utilN density phases Jul 26, 2026
@kubernetes-prow kubernetes-prow Bot added the do-not-merge/work-in-progress Indicates that a PR should not merge because it is a work in progress. label Jul 26, 2026
#
# This calls the scenario directly rather than reusing the presubmit: the
# cilium presubmit is deliberately small (3 nodes — per-PR CNI signal only),
# while the daily baseline runs the full 20-node, single-control-plane

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Instead of "full" let's call it "larger"

# with the throughput curve still rising, so this job is where the next
# ceiling will show up first.
#
# NOT YET SAFE TO SCHEDULE: the full sweep needs the APF inflight raise

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Let's not add this script yet. We want to make sure we are compliant with the policy on larger runs

# This presubmit is the small leg: its job is to catch cilium-specific
# regressions (endpoint-create limits, agent client throttling, datapath
# latency — all per-node effects that show up at any scale), not to measure
# cluster-scale throughput. The kindnet presubmit keeps the scenario's

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Let's not talk about kindnet (or any other presubmits) in the cilium presubmit

# Phases are a comma-separated list of names (see test/stress/main.go):
# fill long-running background sandboxes (scale)
# fill long-running background sandboxes (fill-per-node * nodes)
# fill-utilN top the cluster up to N% total worker pod utilization

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

I think fill-pct40 would be clearer - util means utility to me, not utilization

# the etcd working set all scale with resident pods, so the near-empty
# numbers are the optimistic bound and the -full leg is the realistic one.
# Defaults below are sized for the default 20-node cluster (mif400 on top of
# 80% fill lands at ~98% of slots, which the tool warns about but allows).

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

This is confusing. I think we should describe that we fill to 10%, then we run the throughput at various in-flight configurations, then we fill to 80% and run with 400 concurrent, and that fits because 400 is 18% of 20 nodes and so we hit 98% utilization

Comment thread test/stress/main.go Outdated
// FillPerNode * worker nodes; "fill-utilN" entries top the cluster up to
// N% of worker pod capacity, counting pods already present (pre-existing
// system pods and earlier fill phases). See resolveFillCounts.
FillCounts []int `json:"fillCounts,omitempty"`

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Rather than do this, what if Phase was an interface, and we had something like this:

type Fill struct {
  Percentage float32
}
func (f *Fill) Run() error {
}
var _ Phase = &Fill{}

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🧹 Nitpick comments (1)
dev/ci/periodics/benchmarks-kops-gcp-hero (1)

39-48: 🚀 Performance & Scalability | 🔵 Trivial | ⚡ Quick win

Consider scaling --create-concurrency for the 80-node hero run.

Node count and control-plane size are scaled 4x relative to the daily periodics, but CreateConcurrency stays at main.go's default of 20 (not overridden here). The fill-util80 leg alone creates ~6,000 sandboxes; worth confirming 20 concurrent creators and the 60m timeout are sufficient at this scale, or exposing/overriding create-concurrency alongside the other sizing knobs.

🤖 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 `@dev/ci/periodics/benchmarks-kops-gcp-hero` around lines 39 - 48, Update the
80-node hero benchmark configuration alongside STRESS_NODE_COUNT,
STRESS_CONTROL_PLANE_SIZE, and STRESS_TIMEOUT to explicitly expose or override
the create-concurrency setting used by the fill phases; choose a value
appropriate for creating roughly 6,000 sandboxes within the existing 60-minute
timeout, rather than relying on main.go’s default of 20.
🤖 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.

Nitpick comments:
In `@dev/ci/periodics/benchmarks-kops-gcp-hero`:
- Around line 39-48: Update the 80-node hero benchmark configuration alongside
STRESS_NODE_COUNT, STRESS_CONTROL_PLANE_SIZE, and STRESS_TIMEOUT to explicitly
expose or override the create-concurrency setting used by the fill phases;
choose a value appropriate for creating roughly 6,000 sandboxes within the
existing 60-minute timeout, rather than relying on main.go’s default of 20.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 69905550-de6a-4ad6-9cbf-d329754e2c20

📥 Commits

Reviewing files that changed from the base of the PR and between b8b6378 and 1d9b1b6.

📒 Files selected for processing (8)
  • dev/ci/periodics/benchmarks-kops-gcp-cilium
  • dev/ci/periodics/benchmarks-kops-gcp-hero
  • dev/ci/periodics/benchmarks-kops-gcp-kindnet
  • dev/ci/presubmits/benchmarks-kops-gcp-cilium
  • test/benchmarks/scenarios/benchmarks-kops-gcp/run
  • test/stress/main.go
  • test/stress/phaseconfig_test.go
  • test/stress/phases.go

Comment thread test/stress/main.go Outdated
log.Printf("Fill phase %s: %d sandboxes (%d per worker node * %d nodes)", raw, cfg.FillCounts[i], cfg.FillPerNode, clusterInfo.Nodes)
case isFillUtil(raw):
pct, _ := fillUtilPercent(raw)
log.Printf("Fill phase %s: %d sandboxes (top up to %d%% of %d worker pod slots)", raw, cfg.FillCounts[i], pct, clusterInfo.PodCapacity)

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

I think we could move this to logic to a String() or Description() method on type Phase interface

Comment thread test/stress/main.go Outdated
}
n, err := strconv.Atoi(suffix)
digits := suffix
if i := strings.IndexFunc(suffix, func(r rune) bool { return r < '0' || r > '9' }); i >= 0 {

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Rather than complex parsing, what if we did something like this:

fill-pct:80-label:foo

In other words, hyphen separated key-value pairs, with the key and value separated by a colon. We could disallow spaces/colons in the label, I don't think that's a big loss.

Should make it more self-documenting.

Comment thread test/stress/main.go Outdated
claimsWarmResident := -1
for i, raw := range cfg.Phases {
switch {
case raw == string(PhaseFill), isFillUtil(raw):

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

This could presumably also be a method on type Phase interface

justinsb added a commit to justinsb/agent-sandbox that referenced this pull request Jul 26, 2026
… feedback)

Refactors from justinsb's review on kubernetes-sigs#1287:

- The parsed form of a --phases entry is now a Phase interface
  (Name/Validate/Resolve/Description/Requested/Run) with one struct per
  kind, replacing the string-switch pipeline (buildPhaseRuns, the
  requested() switch in buildSummary, the fill-count side tables in
  Config). Each phase carries its own sizing after Resolve, so
  Config.FillCount/FillCounts disappear; the per-phase 'requested' field
  in summary.json is unchanged. The old string type lives on as PhaseName,
  the label recorded per sandbox in records and summary.json.

- Phase arguments are hyphen-separated key:value pairs instead of
  positional digits with magic suffixes: fill-pct:80 (was fill-util80 -
  'util' read as utility, pct says percent), throughput-mif:400-label:hot.
  Labels are [a-z0-9_.] so the grammar stays unambiguous; every kind
  accepts label. Legacy throughput-mifN and bare throughput still parse,
  so existing scripts and open PR branches keep working.

- Validation moves ahead of all cluster interaction: parse errors and bad
  flag combinations (--probe-count, sustained NaN guards, ...) now fail
  before a kubeconfig is even loaded.

CI/scenario changes from the same review:

- Drop the weekly hero periodic for now - larger-run policy compliance
  needs to be confirmed first.
- The cilium presubmit comment describes only this job's purpose.
- The scenario's phase comment now walks the default list concretely:
  fill to ~10%, probe + descending mif sweep, fill-pct:80, then mif400
  again at density - 400 in flight is ~18% of a 20-node cluster, so the
  level peaks at ~98% utilization, which fits.
- Daily-periodic comment wording (larger, not full).
Copilot AI review requested due to automatic review settings July 26, 2026 14:51

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@kubernetes-prow kubernetes-prow Bot removed the size/L Denotes a PR that changes 100-499 lines, ignoring generated files. label Jul 26, 2026
@kubernetes-prow kubernetes-prow Bot added the size/XXL Denotes a PR that changes 1000+ lines, ignoring generated files. label Jul 26, 2026
@justinsb

Copy link
Copy Markdown
Contributor Author

Pushed 4656c2c addressing the review — all points taken:

  • Phase is now an interface (test/stress/phase.go): Name / Validate / Resolve / Description / Requested / Run, one struct per kind (fillPhase{pct}, throughputPhase{mif}, …). The string-switch pipeline is gone: buildPhaseRuns, the requested() switch in buildSummary, and the fill-count side tables in Config are all replaced by methods, per your three inline comments. The old string type survives as PhaseName — it's the label baked into per-sandbox records and summary.json.

  • key:value grammar: fill-pct:80, throughput-mif:400-label:pct80. pct instead of util, and labels are explicit label: arguments limited to [a-z0-9_.]. Legacy throughput-mifN and bare throughput still parse, so existing scripts and open branches (e.g. WIP: stress-test: scale the benchmark to 40 worker nodes #1276's phase lists) keep working. Bad entries now fail at flag time with a pointed message, before any cluster interaction:

    phase "fill-util80": argument "util80" is not key:value
    phase "throughput-mif:400-label:HOT": label may only contain [a-z0-9_.]
    
  • Hero periodic dropped — agreed on confirming the larger-run policy first. The job spec is one revert away when the negotiation lands.

  • Scenario comment rewritten as the concrete walkthrough: fill to ~10% → probe + descending mif sweep → fill-pct:80 (~1,760 pods) → mif400 again at density; 400 in flight ≈ 18% of a 20-node cluster, so that leg peaks at ~98% utilization — fits, with the tool's >90% warning.

  • Cilium presubmit comment now describes only its own job; "full" → "larger" in the daily-periodic comment.

One behavior note: Resolve runs in phase order, so the capacity preflight knows a mif level fits before an 80% fill but not after it, and its error names the phase where the peak lands (TestResolvePhasesCapacityOrdering covers exactly that). Tests are green, including the migrated sustained-capacity test.

Copilot AI review requested due to automatic review settings July 26, 2026 15:49

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@justinsb

Copy link
Copy Markdown
Contributor Author

Both fixed in 2f229ca:

  • Lint: reproduced locally — strings.SplitSeq (modernize) plus four unused info parameters on Resolve implementations (revive). dev/tools/lint-go is clean now.
  • pprof "Failed to fetch": good catch, and yes — it's the colon. pprof.html fetches the profile as a relative URL, and the browser parses pprof-apiserver-throughput-mif:600.pprof as scheme pprof-apiserver-throughput-mif: + path, so the fetch is rejected before any request is made (: is also an illegal filename character on Windows). Fix is at the source: fileSafePhase flattens anything outside [a-zA-Z0-9._-] to - when profile filenames are built, so the artifact is pprof-apiserver-throughput-mif-600.pprof. Phase names themselves keep the colon everywhere else (summary.json, logs, report labels). The report needs no change — it globs and links whatever is on disk — and download_results.py mirrors the mapping where it reconstructs profile names from summary.json phase names.

Comment thread dev/ci/periodics/benchmarks-kops-gcp-cilium Outdated
Comment thread dev/ci/periodics/benchmarks-kops-gcp-kindnet Outdated
@justinsb justinsb changed the title WIP: ci: tier the benchmark jobs; stress-test gains fill-utilN density phases tests: add a phase for testing with lots of pods, and reduce cost Jul 27, 2026
@kubernetes-prow kubernetes-prow Bot removed the do-not-merge/work-in-progress Indicates that a PR should not merge because it is a work in progress. label Jul 27, 2026
@justinsb

Copy link
Copy Markdown
Contributor Author

Trimmed in the latest push: both daily-periodic comment paragraphs are gone — they explained the change relative to the old delegation setup rather than describing what the job is. Each script now carries one line: daily baseline against main, 20 nodes, single control plane.

Copilot AI review requested due to automatic review settings July 27, 2026 12:52

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

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 current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@test/stress/phase.go`:
- Around line 34-61: Add Kind() PhaseName to the Phase interface in
test/stress/phase.go and implement it on every concrete phase type to return its
fixed, unlabeled base kind. In test/stress/main.go, add Kind to PhaseSummary,
populate it in buildSummary from phases[i].Kind(), and update printReport to
switch on PhaseName(ps.Kind) rather than the label-bearing ps.Name; apply these
changes at both listed sites.
🪄 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: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 9f65a2d5-f99b-4ef1-a105-852643bf60a3

📥 Commits

Reviewing files that changed from the base of the PR and between 1d9b1b6 and 0a699e0.

📒 Files selected for processing (13)
  • dev/ci/periodics/benchmarks-kops-gcp-cilium
  • dev/ci/periodics/benchmarks-kops-gcp-kindnet
  • dev/ci/presubmits/benchmarks-kops-gcp-cilium
  • test/benchmarks/scenarios/benchmarks-kops-gcp/run
  • test/stress/generate-report/download_results.py
  • test/stress/main.go
  • test/stress/phase.go
  • test/stress/phaseconfig_test.go
  • test/stress/phases.go
  • test/stress/pprof.go
  • test/stress/sustained.go
  • test/stress/sustained_test.go
  • test/stress/tracker.go
🚧 Files skipped from review as they are similar to previous changes (4)
  • dev/ci/presubmits/benchmarks-kops-gcp-cilium
  • dev/ci/periodics/benchmarks-kops-gcp-cilium
  • dev/ci/periodics/benchmarks-kops-gcp-kindnet
  • test/stress/phases.go

Comment thread test/stress/phase.go
Copilot AI review requested due to automatic review settings July 27, 2026 15:44

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

Refactor the tests so that the periodic tests run
at moderate size, and the presubmit tests are a
bit cheaper.

Also in our tests add a phase so that we can test
lots of pods / behaviour with lots of pods.

fill gains the ability to specify pct:80 (for example)
which will fill to 80% of capacity.

Then we can run additional phases, verifying
e.g. the throughput we can achieve when at 80% instead of at 10%.
Copilot AI review requested due to automatic review settings July 27, 2026 15:47

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@aditya-shantanu aditya-shantanu left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Reviewed the whole change. The Phase interface split (parse -> validate -> resolve -> run) is a clear improvement, and the order-aware capacity walk in resolvePhases (mif600 fits before fill-pct:80 but not after) is exactly right and well covered by TestResolvePhasesCapacityOrdering. I checked the artifact-name compatibility: fileSafePhase and download_results.py use the same character class, and generate_report.py discovers profiles by glob (pprof-*.pprof) without parsing names, so the ':' flattening is safe end to end. The presubmit 3-node phase list also checks out arithmetically (~95% of 330 slots at the pct80 mif50 leg, warning-but-runs as the comment says). One non-blocking nit inline.

/lgtm

Comment thread test/stress/main.go
// Kind is the phase's base kind (fill, probe, throughput, ...): Name
// carries the phase's arguments (probe-label:x), so consumers picking
// kind-specific output must use Kind, not Name.
Kind PhaseName `json:"kind,omitempty"`

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Non-blocking: generate_report.py (line ~219) still selects the probe phase with phase['name'] == 'probe', so a labeled probe entry (probe-label:x) would silently lose its kind-specific report section. Since summary.json now carries kind, a follow-up could switch the report generator to phase.get('kind', phase['name']) — fine to leave for a separate PR.

@kubernetes-prow kubernetes-prow Bot added the lgtm "Looks good to me", indicates that a PR is ready to be merged. label Jul 27, 2026
@kubernetes-prow
kubernetes-prow Bot merged commit 8a210f3 into kubernetes-sigs:main Jul 27, 2026
15 checks passed
@github-project-automation github-project-automation Bot moved this from Backlog to Done in Agent Sandbox Jul 27, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

approved Indicates a PR has been approved by an approver from all required OWNERS files. cncf-cla: yes Indicates the PR's author has signed the CNCF CLA. lgtm "Looks good to me", indicates that a PR is ready to be merged. ready-for-review size/XXL Denotes a PR that changes 1000+ lines, ignoring generated files.

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

4 participants