Skip to content

feat(byoo-perf): add scaffolding, translation-driven rendering, and validation#422

Open
shobham-nv wants to merge 2 commits into
mainfrom
shobham/417-byoo-perf-suite-scaffolding
Open

feat(byoo-perf): add scaffolding, translation-driven rendering, and validation#422
shobham-nv wants to merge 2 commits into
mainfrom
shobham/417-byoo-perf-suite-scaffolding

Conversation

@shobham-nv

@shobham-nv shobham-nv commented Jul 24, 2026

Copy link
Copy Markdown
Contributor

Add the BYOO collector performance-test module under src/compute-plane-services/byoo-otel-collector/perf as a standalone Go module.

  • cmd/perf CLI with render/run/cleanup and dev/baseline profiles
  • pkg/spec: synthetic container and Helm launch specs + translate config
  • pkg/render: render via icms-translate function.Translate and extract the authentic collector (container sidecar and Helm utils-pod shapes)
  • pkg/validate: render-shape gate for placement, image, resources, ports, volumes, environment, probes, and config; fails clearly on translator drift
  • unit tests for spec, render, and validate

The collector spec and config are produced entirely by the shared translation library so the suite exercises the same workload that ships in production.

TL;DR

Adds the scaffolding for a BYOO OpenTelemetry collector performance-test suite. This first slice renders the collector workload directly through the shared icms-translate library (the same code NVCA uses in production), extracts the authentic collector container, and validates its shape. Load generation and measurement land in follow-up PRs.

Additional Details

  • The suite lives in its own standalone Go module (GOWORK=off) with a replace pointing at the local icms-translate library, so it always renders exactly the workload NVCA produces rather than a hand-maintained copy.
  • pkg/render calls function.Translate for both the container-function shape (collector as a sidecar) and the Helm-function shape (collector on the utils pod with a ClusterIP Service), then extracts the real collector container plus its owning pod/service. BenchPod wraps that container with lightweight emptyDir stand-ins for co-located containers so it is deployable on k3d.
  • pkg/validate acts as a drift gate: if the translation library changes the collector's placement, image, resources, ports, volume mounts, env, probes, or config args, validation fails with a clear message before any load is run.
  • No pass/fail performance thresholds are introduced here; this PR is scaffolding + rendering + validation only.

For the Reviewer

  • Key files to look at: pkg/render/render.go (translation + extraction), pkg/validate/validate.go (drift gate), and pkg/spec/spec.go (synthetic launch specs).
  • Please confirm the synthetic launch specs in pkg/spec match how NVCA constructs container and Helm function messages.

For QA

From src/compute-plane-services/byoo-otel-collector/perf:

GOWORK=off go build ./...
GOWORK=off go vet ./...
GOWORK=off go test ./...
GOWORK=off go run ./cmd/perf render --shape=container,helm

QA Needed? No — unit-test-level change, no runtime behavior shipped to production.

Issues

Part of #416. Closes #417.

Checklist

  • I am familiar with the Contributing Guidelines.
  • I have signed off my commits for Developer Certificate of Origin (DCO) compliance.
  • New or existing tests cover these changes.
  • The documentation is up to date with these changes.

Summary by CodeRabbit

  • New Features
    • Added a performance testing CLI for BYOO OpenTelemetry collector deployments.
    • Implemented rendering and shape validation for container and Helm deployment modes.
    • Added selectable development and baseline execution profiles, plus human-readable/YAML/JSON output.
  • Documentation
    • Added a README covering the performance test suite, CLI usage/flags, default profiles, and current limitations.
  • Chores
    • Bumped the BYOO OpenTelemetry collector component version to 0.158.0.

@shobham-nv
shobham-nv requested a review from a team as a code owner July 24, 2026 12:11
@shobham-nv
shobham-nv requested a review from mikeyrcamp July 24, 2026 12:11
…alidation

Add the BYOO collector performance-test module under
src/compute-plane-services/byoo-otel-collector/perf as a standalone Go module.

- cmd/perf CLI with render/run/cleanup and dev/baseline profiles
- pkg/spec: synthetic container and Helm launch specs + translate config
- pkg/render: render via icms-translate function.Translate and extract the
  authentic collector (container sidecar and Helm utils-pod shapes)
- pkg/validate: render-shape gate for placement, image, resources, ports,
  volumes, environment, probes, and config; fails clearly on translator drift
- unit tests for spec, render, and validate

The collector spec and config are produced entirely by the shared translation
library so the suite exercises the same workload that ships in production.

Part of #416. Closes #417.

Signed-off-by: shobham <shobham@nvidia.com>
@coderabbitai

coderabbitai Bot commented Jul 24, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

This PR adds a standalone Go performance module for BYOO OpenTelemetry collector workloads, including synthetic container and Helm specifications, translation-based rendering, shape validation, execution profiles, CLI rendering, tests, documentation, and a service version bump.

Changes

BYOO performance suite

Layer / File(s) Summary
Synthetic workload specifications
src/compute-plane-services/byoo-otel-collector/perf/go.mod, src/compute-plane-services/byoo-otel-collector/perf/pkg/spec/*, src/compute-plane-services/byoo-otel-collector/perf/pkg/profile/*
Defines container and Helm launch specifications, telemetry options, deterministic environment encoding, shape-specific GPU configuration, and dev/baseline execution profiles with unit tests.
Translation and benchmark pod rendering
src/compute-plane-services/byoo-otel-collector/perf/pkg/render/*
Translates synthetic specifications, extracts collector and OTLP service objects, and builds collector-only benchmark Pods with matching volumes.
Rendered shape validation
src/compute-plane-services/byoo-otel-collector/perf/pkg/validate/*
Validates workload placement and collector images, ports, mounts, probes, resources, environment, and version-specific arguments, with positive and negative tests.
CLI entrypoint and suite documentation
src/compute-plane-services/byoo-otel-collector/perf/cmd/perf/main.go, src/compute-plane-services/byoo-otel-collector/perf/README.md, src/compute-plane-services/byoo-otel-collector/VERSION
Adds render output in summary, YAML, and JSON formats, shape and profile flags, scaffolded run/cleanup commands, usage documentation, and the version update to 0.158.0.

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

Possibly related issues

  • #416 — Covers the broader BYOO Collector performance test suite represented by this PR.
  • #418 — Covers rendering, collector extraction, image handling, and scaffolded cleanup represented here.

Suggested reviewers: mikeyrcamp

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Linked Issues check ⚠️ Warning The module covers CLI, profiles, rendering, validation, and tests, but the profile schema does not expose configurable payload sizes required by #417. Add payload-size controls to the profile/config schema and ensure the CLI and tests exercise them as required by #417.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title follows Conventional Commits and accurately summarizes the new BYOO perf scaffolding, rendering, and validation work.
Out of Scope Changes check ✅ Passed The changes stay within the new perf module and its supporting docs, tests, and versioning, with no clear unrelated code paths added.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch shobham/417-byoo-perf-suite-scaffolding

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

@shobham-nv
shobham-nv force-pushed the shobham/417-byoo-perf-suite-scaffolding branch from 72e3ac3 to 1cb0dd0 Compare July 24, 2026 12:11
The perf suite lives under src/compute-plane-services/byoo-otel-collector/,
so the version-guard CI check requires a VERSION bump alongside it.

Relates to #416. Closes #417.

Signed-off-by: shobham <shobham@nvidia.com>

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

🧹 Nitpick comments (1)
src/compute-plane-services/byoo-otel-collector/perf/pkg/spec/spec.go (1)

56-58: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Pin the remaining default images for reproducible perf runs.

DefaultCollectorImage is pinned to 0.153.1, but DefaultInferenceImage, DefaultUtilsImage, and DefaultInitImage float on :latest. For a suite whose baseline profile is meant to be a "longer, repeatable run," an untagged latest reference can silently change between runs and skew comparisons.

♻️ Pin default images
-	DefaultInferenceImage = "nvcr.io/nvidia/nvcf-perf/stub-inference:latest"
-	DefaultUtilsImage     = "nvcr.io/nvidia/nvcf-core/worker-utils:latest"
-	DefaultInitImage      = "nvcr.io/nvidia/nvcf-core/worker-init:latest"
+	DefaultInferenceImage = "nvcr.io/nvidia/nvcf-perf/stub-inference:<pinned-tag>"
+	DefaultUtilsImage     = "nvcr.io/nvidia/nvcf-core/worker-utils:<pinned-tag>"
+	DefaultInitImage      = "nvcr.io/nvidia/nvcf-core/worker-init:<pinned-tag>"
🤖 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 `@src/compute-plane-services/byoo-otel-collector/perf/pkg/spec/spec.go` around
lines 56 - 58, Pin the image references assigned to DefaultInferenceImage,
DefaultUtilsImage, and DefaultInitImage to explicit immutable version tags
instead of :latest, matching the version-pinning approach already used by
DefaultCollectorImage. Leave the existing image repositories and other defaults
unchanged.
🤖 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 `@src/compute-plane-services/byoo-otel-collector/perf/pkg/render/render.go`:
- Around line 130-156: Update BenchPod to initialize the returned corev1.Pod’s
TypeMeta with apiVersion v1 and kind Pod before populating its metadata and
spec, ensuring rendered YAML/JSON is a deployable manifest while preserving the
existing pod configuration.
- Around line 80-96: The object translation loop should reject duplicate
collector-container matches instead of silently overwriting res.Collector and
res.OwnerPod. Update the *corev1.Pod handling around CollectorContainerName to
detect when found is already true, return or propagate an error for the
duplicate, and retain the existing assignment for the first match and
missing-collector behavior.

---

Nitpick comments:
In `@src/compute-plane-services/byoo-otel-collector/perf/pkg/spec/spec.go`:
- Around line 56-58: Pin the image references assigned to DefaultInferenceImage,
DefaultUtilsImage, and DefaultInitImage to explicit immutable version tags
instead of :latest, matching the version-pinning approach already used by
DefaultCollectorImage. Leave the existing image repositories and other defaults
unchanged.
🪄 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: Enterprise

Run ID: a6458573-8cc3-4d98-9ac3-eee785444a90

📥 Commits

Reviewing files that changed from the base of the PR and between e9e0c6f and 1cb0dd0.

⛔ Files ignored due to path filters (1)
  • src/compute-plane-services/byoo-otel-collector/perf/go.sum is excluded by !**/*.sum
📒 Files selected for processing (10)
  • src/compute-plane-services/byoo-otel-collector/perf/README.md
  • src/compute-plane-services/byoo-otel-collector/perf/cmd/perf/main.go
  • src/compute-plane-services/byoo-otel-collector/perf/go.mod
  • src/compute-plane-services/byoo-otel-collector/perf/pkg/profile/profile.go
  • src/compute-plane-services/byoo-otel-collector/perf/pkg/render/render.go
  • src/compute-plane-services/byoo-otel-collector/perf/pkg/render/render_test.go
  • src/compute-plane-services/byoo-otel-collector/perf/pkg/spec/spec.go
  • src/compute-plane-services/byoo-otel-collector/perf/pkg/spec/spec_test.go
  • src/compute-plane-services/byoo-otel-collector/perf/pkg/validate/validate.go
  • src/compute-plane-services/byoo-otel-collector/perf/pkg/validate/validate_test.go

Comment on lines +80 to +96
found := false
for _, obj := range objs {
switch t := obj.(type) {
case *corev1.Pod:
for i := range t.Spec.Containers {
if t.Spec.Containers[i].Name == CollectorContainerName {
res.Collector = *t.Spec.Containers[i].DeepCopy()
res.OwnerPod = t.Name
found = true
}
}
case *corev1.Service:
if t.Name == common.ByooOTelCollectorPodNameBase {
res.Service = t.DeepCopy()
}
}
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Silent overwrite if the collector container matches more than one pod.

found only guards the "missing" case; if the translator ever emitted a container named CollectorContainerName in two different pods, res.Collector/res.OwnerPod would silently end up holding whichever pod was iterated last, with no error. Given this package's explicit purpose is catching translator drift, a duplicate match should fail loudly rather than be swallowed.

🐛 Detect duplicate collector matches
 	found := false
 	for _, obj := range objs {
 		switch t := obj.(type) {
 		case *corev1.Pod:
 			for i := range t.Spec.Containers {
 				if t.Spec.Containers[i].Name == CollectorContainerName {
+					if found {
+						return nil, fmt.Errorf("found multiple %q containers in translated %s workload", CollectorContainerName, shape)
+					}
 					res.Collector = *t.Spec.Containers[i].DeepCopy()
 					res.OwnerPod = t.Name
 					found = true
 				}
 			}
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
found := false
for _, obj := range objs {
switch t := obj.(type) {
case *corev1.Pod:
for i := range t.Spec.Containers {
if t.Spec.Containers[i].Name == CollectorContainerName {
res.Collector = *t.Spec.Containers[i].DeepCopy()
res.OwnerPod = t.Name
found = true
}
}
case *corev1.Service:
if t.Name == common.ByooOTelCollectorPodNameBase {
res.Service = t.DeepCopy()
}
}
}
found := false
for _, obj := range objs {
switch t := obj.(type) {
case *corev1.Pod:
for i := range t.Spec.Containers {
if t.Spec.Containers[i].Name == CollectorContainerName {
if found {
return nil, fmt.Errorf("found multiple %q containers in translated %s workload", CollectorContainerName, shape)
}
res.Collector = *t.Spec.Containers[i].DeepCopy()
res.OwnerPod = t.Name
found = true
}
}
case *corev1.Service:
if t.Name == common.ByooOTelCollectorPodNameBase {
res.Service = t.DeepCopy()
}
}
}
🤖 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 `@src/compute-plane-services/byoo-otel-collector/perf/pkg/render/render.go`
around lines 80 - 96, The object translation loop should reject duplicate
collector-container matches instead of silently overwriting res.Collector and
res.OwnerPod. Update the *corev1.Pod handling around CollectorContainerName to
detect when found is already true, return or propagate an error for the
duplicate, and retain the existing assignment for the first match and
missing-collector behavior.

Comment on lines +130 to +156
func (r *Result) BenchPod(namespace string) *corev1.Pod {
pod := &corev1.Pod{}
pod.Name = r.Options.ObjectNameBase + "-collector"
pod.Namespace = namespace
pod.Labels = map[string]string{
common.K8sAppNameLabelKey: common.ByooOTelCollectorPodNameBase,
"app.kubernetes.io/part-of": "byoo-perf",
common.BYOOMetricsEgressTargetLabelKey: common.BYOOMetricsEgressTargetLabelValue,
}

collector := *r.Collector.DeepCopy()
pod.Spec.Containers = []corev1.Container{collector}
pod.Spec.RestartPolicy = corev1.RestartPolicyNever

seen := map[string]bool{}
for _, vm := range collector.VolumeMounts {
if seen[vm.Name] {
continue
}
seen[vm.Name] = true
pod.Spec.Volumes = append(pod.Spec.Volumes, corev1.Volume{
Name: vm.Name,
VolumeSource: corev1.VolumeSource{EmptyDir: &corev1.EmptyDirVolumeSource{}},
})
}
return pod
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

BenchPod's output is missing apiVersion/kind, so it isn't actually a deployable manifest.

pod := &corev1.Pod{} never sets TypeMeta. Since metav1.TypeMeta fields are omitempty, the YAML/JSON printed by cmd/perf render --output yaml (see main.go printObjects) will omit apiVersion: v1 / kind: Pod entirely — kubectl apply -f on this output would fail. This is already exercised by the current milestone's render --output yaml/json flag and by the README usage example, not deferred deployment work.

🐛 Set TypeMeta on the bench pod
 func (r *Result) BenchPod(namespace string) *corev1.Pod {
-	pod := &corev1.Pod{}
+	pod := &corev1.Pod{
+		TypeMeta: metav1.TypeMeta{
+			Kind:       "Pod",
+			APIVersion: "v1",
+		},
+	}
 	pod.Name = r.Options.ObjectNameBase + "-collector"
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
func (r *Result) BenchPod(namespace string) *corev1.Pod {
pod := &corev1.Pod{}
pod.Name = r.Options.ObjectNameBase + "-collector"
pod.Namespace = namespace
pod.Labels = map[string]string{
common.K8sAppNameLabelKey: common.ByooOTelCollectorPodNameBase,
"app.kubernetes.io/part-of": "byoo-perf",
common.BYOOMetricsEgressTargetLabelKey: common.BYOOMetricsEgressTargetLabelValue,
}
collector := *r.Collector.DeepCopy()
pod.Spec.Containers = []corev1.Container{collector}
pod.Spec.RestartPolicy = corev1.RestartPolicyNever
seen := map[string]bool{}
for _, vm := range collector.VolumeMounts {
if seen[vm.Name] {
continue
}
seen[vm.Name] = true
pod.Spec.Volumes = append(pod.Spec.Volumes, corev1.Volume{
Name: vm.Name,
VolumeSource: corev1.VolumeSource{EmptyDir: &corev1.EmptyDirVolumeSource{}},
})
}
return pod
}
func (r *Result) BenchPod(namespace string) *corev1.Pod {
pod := &corev1.Pod{
TypeMeta: metav1.TypeMeta{
Kind: "Pod",
APIVersion: "v1",
},
}
pod.Name = r.Options.ObjectNameBase + "-collector"
pod.Namespace = namespace
pod.Labels = map[string]string{
common.K8sAppNameLabelKey: common.ByooOTelCollectorPodNameBase,
"app.kubernetes.io/part-of": "byoo-perf",
common.BYOOMetricsEgressTargetLabelKey: common.BYOOMetricsEgressTargetLabelValue,
}
collector := *r.Collector.DeepCopy()
pod.Spec.Containers = []corev1.Container{collector}
pod.Spec.RestartPolicy = corev1.RestartPolicyNever
seen := map[string]bool{}
for _, vm := range collector.VolumeMounts {
if seen[vm.Name] {
continue
}
seen[vm.Name] = true
pod.Spec.Volumes = append(pod.Spec.Volumes, corev1.Volume{
Name: vm.Name,
VolumeSource: corev1.VolumeSource{EmptyDir: &corev1.EmptyDirVolumeSource{}},
})
}
return pod
}
🤖 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 `@src/compute-plane-services/byoo-otel-collector/perf/pkg/render/render.go`
around lines 130 - 156, Update BenchPod to initialize the returned corev1.Pod’s
TypeMeta with apiVersion v1 and kind Pod before populating its metadata and
spec, ensuring rendered YAML/JSON is a deployable manifest while preserving the
existing pod configuration.

@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 `@src/compute-plane-services/byoo-otel-collector/VERSION`:
- Line 1: Update the VERSION value for the byoo-otel-collector to match the
collector configuration’s pinned v0.157.0 release, ensuring the VERSION file and
otel-collector-build.yaml use consistent release metadata.
🪄 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: Enterprise

Run ID: 0be78c38-5067-4968-a821-856c75aba73a

📥 Commits

Reviewing files that changed from the base of the PR and between 1cb0dd0 and c84eff8.

📒 Files selected for processing (1)
  • src/compute-plane-services/byoo-otel-collector/VERSION

@@ -1 +1 @@
0.157.0
0.158.0

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

root="src/compute-plane-services/byoo-otel-collector"
rg -n --hidden --glob '!**/.git/**' \
  '0\.157\.0|0\.158\.0|collector.*version|VERSION' "$root"

Repository: NVIDIA/nvcf

Length of output: 50368


🏁 Script executed:

#!/bin/bash
set -euo pipefail

root="src/compute-plane-services/byoo-otel-collector"

printf '\n== VERSION ==\n'
cat -n "$root/VERSION"

printf '\n== otel-collector-build.yaml version lines ==\n'
rg -n '0\.157\.0|0\.158\.0|major_minor|version' "$root/otel-collector-build.yaml" "$root/AGENTS.md" "$root/scripts/update-collector-version.sh" | sed -n '1,120p'

printf '\n== relevant release wiring ==\n'
sed -n '50,60p' "$root/AGENTS.md"
sed -n '1,40p' "$root/otel-collector-build.yaml"

Repository: NVIDIA/nvcf

Length of output: 14758


Align VERSION with the collector config

src/compute-plane-services/byoo-otel-collector/VERSION is 0.158.0, but src/compute-plane-services/byoo-otel-collector/otel-collector-build.yaml still pins v0.157.0 throughout. This drifts the release version from the collector major/minor and will produce inconsistent release metadata.

🤖 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 `@src/compute-plane-services/byoo-otel-collector/VERSION` at line 1, Update the
VERSION value for the byoo-otel-collector to match the collector configuration’s
pinned v0.157.0 release, ensuring the VERSION file and otel-collector-build.yaml
use consistent release metadata.

Source: Coding guidelines

GOWORK=off go run ./cmd/perf render --shape both

# Render one shape and print the deployable workload as YAML.
GOWORK=off go run ./cmd/perf render --shape container --output yaml

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Will this run it using kubectl against a cluster?

package main

import (
"flag"

@mikeyrcamp mikeyrcamp Jul 24, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

This CLI is fairly comprehensive with many of sub-commands. I would recommend using cobra as we were are with other CLIs

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.

byoo-perf-suite: Add scaffolding, translation-driven rendering, and validation

2 participants