NO-ISSUE: Merge upstream 2026-07-30 - #516
Conversation
- Adds new webhooks for DataImages and HostFirmwareComponents - Validates URLs in DataImages, HostFirmwareComponents and BMHs - Adds common function to validate URL in webhooks Signed-off-by: Nuutti Hakala <nuutti.hakala@est.tech>
Bumps the kubernetes group with 3 updates in the / directory: [k8s.io/api](https://github.com/kubernetes/api), [k8s.io/client-go](https://github.com/kubernetes/client-go) and [k8s.io/component-base](https://github.com/kubernetes/component-base). Bumps the kubernetes group with 1 update in the /apis directory: [k8s.io/api](https://github.com/kubernetes/api). Bumps the kubernetes group with 1 update in the /test directory: [k8s.io/api](https://github.com/kubernetes/api). Updates `k8s.io/api` from 0.35.6 to 0.35.7 - [Commits](kubernetes/api@v0.35.6...v0.35.7) Updates `k8s.io/apimachinery` from 0.35.6 to 0.35.7 - [Commits](kubernetes/apimachinery@v0.35.6...v0.35.7) Updates `k8s.io/client-go` from 0.35.6 to 0.35.7 - [Changelog](https://github.com/kubernetes/client-go/blob/master/CHANGELOG.md) - [Commits](kubernetes/client-go@v0.35.6...v0.35.7) Updates `k8s.io/component-base` from 0.35.6 to 0.35.7 - [Commits](kubernetes/component-base@v0.35.6...v0.35.7) Updates `k8s.io/api` from 0.35.6 to 0.35.7 - [Commits](kubernetes/api@v0.35.6...v0.35.7) Updates `k8s.io/apimachinery` from 0.35.6 to 0.35.7 - [Commits](kubernetes/apimachinery@v0.35.6...v0.35.7) Updates `k8s.io/api` from 0.35.6 to 0.35.7 - [Commits](kubernetes/api@v0.35.6...v0.35.7) Updates `k8s.io/apimachinery` from 0.35.6 to 0.35.7 - [Commits](kubernetes/apimachinery@v0.35.6...v0.35.7) --- updated-dependencies: - dependency-name: k8s.io/api dependency-version: 0.35.7 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: kubernetes - dependency-name: k8s.io/apimachinery dependency-version: 0.35.7 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: kubernetes - dependency-name: k8s.io/client-go dependency-version: 0.35.7 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: kubernetes - dependency-name: k8s.io/component-base dependency-version: 0.35.7 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: kubernetes - dependency-name: k8s.io/api dependency-version: 0.35.7 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: kubernetes - dependency-name: k8s.io/apimachinery dependency-version: 0.35.7 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: kubernetes - dependency-name: k8s.io/api dependency-version: 0.35.7 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: kubernetes - dependency-name: k8s.io/apimachinery dependency-version: 0.35.7 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: kubernetes ... Signed-off-by: dependabot[bot] <support@github.com>
Bumps [github.com/prometheus/client_golang](https://github.com/prometheus/client_golang) from 1.23.2 to 1.24.0. - [Release notes](https://github.com/prometheus/client_golang/releases) - [Changelog](https://github.com/prometheus/client_golang/blob/v1.24.0/CHANGELOG.md) - [Commits](prometheus/client_golang@v1.23.2...v1.24.0) --- updated-dependencies: - dependency-name: github.com/prometheus/client_golang dependency-version: 1.24.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com>
…s/main/github.com/prometheus/client_golang-1.24.0 🌱 Bump github.com/prometheus/client_golang from 1.23.2 to 1.24.0
…s/main/kubernetes-04e42a2908 🌱 Bump the kubernetes group across 3 directories with 4 updates
Bumps the go_modules group with 2 updates in the / directory: [github.com/google/cel-go](https://github.com/google/cel-go) and [google.golang.org/grpc](https://github.com/grpc/grpc-go). Updates `github.com/google/cel-go` from 0.26.0 to 0.29.0 - [Release notes](https://github.com/google/cel-go/releases) - [Commits](https://github.com/google/cel-go/compare/v0.26.0...v0.29.0) Updates `google.golang.org/grpc` from 1.80.0 to 1.82.1 - [Release notes](https://github.com/grpc/grpc-go/releases) - [Commits](grpc/grpc-go@v1.80.0...v1.82.1) --- updated-dependencies: - dependency-name: github.com/google/cel-go dependency-version: 0.29.0 dependency-type: indirect - dependency-name: google.golang.org/grpc dependency-version: 1.82.1 dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com>
Signed-off-by: Dmitry Tantsur <dtantsur@protonmail.com>
…s/go_modules-6a8aee5517 🌱 Bump the go_modules group across 1 directory with 2 updates
Otherwise, cleanup may take too long, leaving the host dangling. Signed-off-by: Dmitry Tantsur <dtantsur@protonmail.com>
Signed-off-by: Nuutti Hakala <nuutti.hakala@est.tech>
…lidation ✨ Add webhooks to validate URLs
🌱 Bump go modules across two directories
🌱 e2e: disable cleaning before the test is over
It is better to create a BMC emulator instance after network interfaces are created. This is required in order to ensure the BMC emulator is created only after the network-dependent environment is ready, so startup is more reliable and provisioning can reach it consistently. Signed-off-by: Tero Kauppinen <tero.kauppinen@est.tech>
…or-creation 🌱 vbmctl: launch BMC emulator after network initialization
🌱 e2e: fall back to upstream images if artifactory is not available
This commit:
- Modifies all go.mod files to require go version 1.26.0 for go binary
compilation.
- Adjust hack scripts, Makefile and Dockerfiles to be aligned with the
new go requirement
- Align access_test to comply with the stricter character substitution
standards introduced by go 1.26
- Adds 2 new supported TLS curves:
- SecP256r1MLKEM768 (P-256 + ML-KEM-768)
- SecP384r1MLKEM1024 (P-384 + ML-KEM-1024)
Signed-off-by: Adam Rozman <adam.rozman@est.tech>
🌱 Bump minimum required go version to 1.26.0
Bumps [go.etcd.io/etcd/client/pkg/v3](https://github.com/etcd-io/etcd) from 3.6.13 to 3.7.1. - [Release notes](https://github.com/etcd-io/etcd/releases) - [Commits](etcd-io/etcd@v3.6.13...v3.7.1) --- updated-dependencies: - dependency-name: go.etcd.io/etcd/client/pkg/v3 dependency-version: 3.7.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com>
…s/main/go.etcd.io/etcd/client/pkg/v3-3.7.0 🌱 Bump go.etcd.io/etcd/client/pkg/v3 from 3.6.13 to 3.7.1
WalkthroughChangesGo 1.26 toolchains and dependencies are adopted across builds and modules. DataImage and HostFirmwareComponents validation webhooks are added and registered, with shared URL validation and manifests. CI downloads are cached with fallbacks, and selected test flows are reordered or cleaned up. Go 1.26 and admission webhook integration
Estimated code review effort: 4 (Complex) | ~45 minutes Sequence Diagram(s)sequenceDiagram
participant KubernetesAPIServer
participant DataImageWebhook
participant ValidateURL
KubernetesAPIServer->>DataImageWebhook: CREATE or UPDATE DataImage
DataImageWebhook->>ValidateURL: Validate Spec.URL
ValidateURL-->>DataImageWebhook: Return validation result
DataImageWebhook-->>KubernetesAPIServer: Return admission response
Possibly related PRs
Suggested reviewers: 🚥 Pre-merge checks | ✅ 12 | ❌ 3❌ Failed checks (3 warnings)
✅ Passed checks (12 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
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. Comment |
ecc344b to
5658a6e
Compare
|
@hroyrh: all tests passed! Full PR test history. Your PR dashboard. DetailsInstructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository. I understand the commands that are listed here. |
|
@coderabbitai review |
✅ Action performedReview finished.
|
There was a problem hiding this comment.
Actionable comments posted: 2
🧹 Nitpick comments (2)
Tiltfile (1)
64-64: 🔒 Security & Privacy | 🔵 Trivial | ⚡ Quick winUse immutable image references across development and verification workflows.
Mutable image tags can cause local builds, code generation, and module checks to use different toolchains or image contents over time.
Tiltfile#L64-L64: replacegolang:1.26with a verified immutable Go 1.26.5 reference.hack/generate.sh#L38-L38: pinquay.io/metal3-io/basic-checks:golang-1.26to a verified digest.hack/gomod.sh#L45-L45: pinquay.io/metal3-io/basic-checks:golang-1.26to the same verified digest used for module checks.🤖 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 `@Tiltfile` at line 64, Replace the mutable Go image reference in Tiltfile lines 64-64 with a verified immutable Go 1.26.5 reference. Pin quay.io/metal3-io/basic-checks:golang-1.26 in hack/generate.sh lines 38-38 and hack/gomod.sh lines 45-45 to the same verified digest, ensuring all development, generation, and module-check workflows use immutable image contents.internal/webhooks/metal3.io/v1alpha1/dataimage_webhook.go (1)
33-37: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winAlign both webhook builders with the validating-only manifests.
internal/webhooks/metal3.io/v1alpha1/dataimage_webhook.go#L33-L37: removeWithDefaulterand the no-op defaulter interface, or add a mutating webhook configuration.internal/webhooks/metal3.io/v1alpha1/hostfirmwarecomponents_webhook.go#L33-L37: apply the same fix.🤖 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 `@internal/webhooks/metal3.io/v1alpha1/dataimage_webhook.go` around lines 33 - 37, Align both webhook builders with the validating-only manifests by removing the WithDefaulter call and each corresponding no-op defaulter interface implementation in DataImage and HostFirmwareComponents. Apply the same change in internal/webhooks/metal3.io/v1alpha1/dataimage_webhook.go:33-37 and internal/webhooks/metal3.io/v1alpha1/hostfirmwarecomponents_webhook.go:33-37; do not add mutating webhook configuration.
🤖 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 `@hack/ci-e2e.sh`:
- Around line 109-136: Update cache_image and the SourceForge ISO download flow
to write into temporary files within IMAGE_DIR, moving each temporary file to
its final cache path only after wget succeeds. Ensure failed or interrupted
Artifactory and fallback downloads cannot leave partial files that satisfy the
existing -f cache checks, and apply the same atomic handling to IMAGE_FILE,
ISO_FILE, and IPA_FILE downloads.
In `@internal/webhooks/metal3.io/v1alpha1/dataimage_webhook.go`:
- Around line 49-68: Make the nil-object checks in DataImage.ValidateCreate and
DataImage.ValidateUpdate return a non-nil validation error instead of nil, nil,
rejecting missing webhook input while preserving the existing logging. Apply the
same fail-closed change to HostFirmwareComponents.ValidateCreate and
HostFirmwareComponents.ValidateUpdate in
internal/webhooks/metal3.io/v1alpha1/hostfirmwarecomponents_webhook.go (lines
54-72).
---
Nitpick comments:
In `@internal/webhooks/metal3.io/v1alpha1/dataimage_webhook.go`:
- Around line 33-37: Align both webhook builders with the validating-only
manifests by removing the WithDefaulter call and each corresponding no-op
defaulter interface implementation in DataImage and HostFirmwareComponents.
Apply the same change in
internal/webhooks/metal3.io/v1alpha1/dataimage_webhook.go:33-37 and
internal/webhooks/metal3.io/v1alpha1/hostfirmwarecomponents_webhook.go:33-37; do
not add mutating webhook configuration.
In `@Tiltfile`:
- Line 64: Replace the mutable Go image reference in Tiltfile lines 64-64 with a
verified immutable Go 1.26.5 reference. Pin
quay.io/metal3-io/basic-checks:golang-1.26 in hack/generate.sh lines 38-38 and
hack/gomod.sh lines 45-45 to the same verified digest, ensuring all development,
generation, and module-check workflows use immutable image contents.
🪄 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: Repository: openshift/coderabbit/.coderabbit.yaml
Review profile: CHILL
Plan: Pro Plus
Run ID: 93dbe0fb-f620-4f87-92ea-368d3d17aa0e
⛔ Files ignored due to path filters (329)
apis/go.sumis excluded by!**/*.sumapis/vendor/modules.txtis excluded by!**/vendor/**go.sumis excluded by!**/*.sumhack/tools/go.sumis excluded by!**/*.sumhack/tools/vendor/google.golang.org/protobuf/encoding/prototext/decode.gois excluded by!**/vendor/**hack/tools/vendor/google.golang.org/protobuf/internal/descfmt/stringer.gois excluded by!**/vendor/**hack/tools/vendor/google.golang.org/protobuf/internal/version/version.gois excluded by!**/vendor/**hack/tools/vendor/modules.txtis excluded by!**/vendor/**test/go.sumis excluded by!**/*.sumtest/vendor/google.golang.org/protobuf/encoding/protodelim/protodelim.gois excluded by!**/vendor/**test/vendor/google.golang.org/protobuf/encoding/prototext/decode.gois excluded by!**/vendor/**test/vendor/google.golang.org/protobuf/internal/descfmt/stringer.gois excluded by!**/vendor/**test/vendor/google.golang.org/protobuf/internal/version/version.gois excluded by!**/vendor/**test/vendor/k8s.io/client-go/tools/leaderelection/resourcelock/leaselock.gois excluded by!**/vendor/**test/vendor/modules.txtis excluded by!**/vendor/**vendor/github.com/antlr4-go/antlr/v4/antlrdoc.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/antlr4-go/antlr/v4/atn.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/antlr4-go/antlr/v4/atn_config.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/antlr4-go/antlr/v4/input_stream.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/antlr4-go/antlr/v4/jcollect.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/antlr4-go/antlr/v4/lexer.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/antlr4-go/antlr/v4/ll1_analyzer.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/antlr4-go/antlr/v4/mutex.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/antlr4-go/antlr/v4/mutex_nomutex.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/antlr4-go/antlr/v4/parser_atn_simulator.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/antlr4-go/antlr/v4/prediction_context.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/antlr4-go/antlr/v4/recognizer.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/antlr4-go/antlr/v4/statistics.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/antlr4-go/antlr/v4/token.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/antlr4-go/antlr/v4/utils.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/google/cel-go/cel/BUILD.bazelis excluded by!**/vendor/**,!vendor/**vendor/github.com/google/cel-go/cel/env.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/google/cel-go/cel/fieldpaths.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/google/cel-go/cel/folding.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/google/cel-go/cel/inlining.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/google/cel-go/cel/library.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/google/cel-go/cel/optimizer.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/google/cel-go/cel/options.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/google/cel-go/cel/program.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/google/cel-go/cel/prompt.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/google/cel-go/cel/templates/authoring.tmplis excluded by!**/vendor/**,!vendor/**vendor/github.com/google/cel-go/cel/validator.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/google/cel-go/checker/checker.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/google/cel-go/checker/cost.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/google/cel-go/checker/env.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/google/cel-go/checker/options.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/google/cel-go/checker/scopes.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/google/cel-go/common/ast/ast.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/google/cel-go/common/ast/conversion.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/google/cel-go/common/containers/container.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/google/cel-go/common/debug/debug.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/google/cel-go/common/decls/decls.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/google/cel-go/common/doc.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/google/cel-go/common/env/BUILD.bazelis excluded by!**/vendor/**,!vendor/**vendor/github.com/google/cel-go/common/env/env.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/google/cel-go/common/env/io.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/google/cel-go/common/functions/functions.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/google/cel-go/common/overloads/overloads.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/google/cel-go/common/runes/buffer.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/google/cel-go/common/source.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/google/cel-go/common/stdlib/standard.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/google/cel-go/common/types/BUILD.bazelis excluded by!**/vendor/**,!vendor/**vendor/github.com/google/cel-go/common/types/bool.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/google/cel-go/common/types/bytes.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/google/cel-go/common/types/double.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/google/cel-go/common/types/duration.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/google/cel-go/common/types/err.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/google/cel-go/common/types/int.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/google/cel-go/common/types/json_value.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/google/cel-go/common/types/list.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/google/cel-go/common/types/map.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/google/cel-go/common/types/null.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/google/cel-go/common/types/object.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/google/cel-go/common/types/optional.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/google/cel-go/common/types/pb/file.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/google/cel-go/common/types/pb/pb.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/google/cel-go/common/types/pb/type.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/google/cel-go/common/types/provider.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/google/cel-go/common/types/ref/provider.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/google/cel-go/common/types/string.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/google/cel-go/common/types/timestamp.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/google/cel-go/common/types/uint.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/google/cel-go/common/types/unknown.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/google/cel-go/ext/BUILD.bazelis excluded by!**/vendor/**,!vendor/**vendor/github.com/google/cel-go/ext/README.mdis excluded by!**/vendor/**,!vendor/**vendor/github.com/google/cel-go/ext/bindings.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/google/cel-go/ext/comprehensions.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/google/cel-go/ext/costs.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/google/cel-go/ext/encoders.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/google/cel-go/ext/extension_option_factory.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/google/cel-go/ext/formatting.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/google/cel-go/ext/formatting_v2.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/google/cel-go/ext/lists.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/google/cel-go/ext/native.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/google/cel-go/ext/network.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/google/cel-go/ext/regex.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/google/cel-go/ext/sets.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/google/cel-go/ext/strings.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/google/cel-go/interpreter/BUILD.bazelis excluded by!**/vendor/**,!vendor/**vendor/github.com/google/cel-go/interpreter/activation.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/google/cel-go/interpreter/attribute_patterns.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/google/cel-go/interpreter/attributes.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/google/cel-go/interpreter/decorators.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/google/cel-go/interpreter/frame.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/google/cel-go/interpreter/interpretable.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/google/cel-go/interpreter/interpreter.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/google/cel-go/interpreter/planner.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/google/cel-go/interpreter/runtimecost.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/google/cel-go/parser/helper.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/google/cel-go/parser/parser.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/google/cel-go/parser/unparser.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/client_golang/internal/github.com/golang/gddo/httputil/header/header.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/client_golang/prometheus/collectors/go_collector_go116.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/client_golang/prometheus/collectors/go_collector_latest.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/client_golang/prometheus/counter.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/client_golang/prometheus/desc.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/client_golang/prometheus/expvar_collector.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/client_golang/prometheus/gauge.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/client_golang/prometheus/go_collector_go116.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/client_golang/prometheus/go_collector_latest.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/client_golang/prometheus/histogram.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/client_golang/prometheus/internal/difflib.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/client_golang/prometheus/labels.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/client_golang/prometheus/metric.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/client_golang/prometheus/process_collector_darwin.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/client_golang/prometheus/process_collector_windows.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/client_golang/prometheus/promhttp/http.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_client.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_server.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/client_golang/prometheus/promhttp/option.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/client_golang/prometheus/registry.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/client_golang/prometheus/summary.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/client_golang/prometheus/timer.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/client_golang/prometheus/vec.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/client_golang/prometheus/wrap.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/common/expfmt/decode.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/common/expfmt/expfmt.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/common/expfmt/fuzz.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/common/expfmt/openmetrics_create.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/common/expfmt/text_create.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/common/expfmt/text_parse.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/common/model/labels.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/common/model/labelset.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/common/model/metric.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/common/model/time.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/common/model/value.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/common/model/value_float.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/common/model/value_histogram.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/procfs/.golangci.ymlis excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/procfs/Makefileis excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/procfs/Makefile.commonis excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/procfs/README.mdis excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/procfs/SECURITY.mdis excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/procfs/arp.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/procfs/buddyinfo.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/procfs/cmdline.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/procfs/cpuinfo.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/procfs/cpuinfo_armx.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/procfs/cpuinfo_loong64.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/procfs/cpuinfo_mipsx.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/procfs/cpuinfo_others.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/procfs/cpuinfo_ppcx.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/procfs/cpuinfo_riscvx.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/procfs/cpuinfo_s390x.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/procfs/cpuinfo_x86.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/procfs/crypto.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/procfs/doc.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/procfs/fs.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/procfs/fs_statfs_notype.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/procfs/fs_statfs_type.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/procfs/fscache.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/procfs/internal/fs/fs.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/procfs/internal/util/parse.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/procfs/internal/util/readfile.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/procfs/internal/util/sysreadfile.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/procfs/internal/util/sysreadfile_compat.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/procfs/internal/util/valueparser.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/procfs/ipvs.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/procfs/kernel_hung.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/procfs/kernel_random.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/procfs/loadavg.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/procfs/mdstat.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/procfs/meminfo.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/procfs/mountinfo.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/procfs/mountstats.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/procfs/net_conntrackstat.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/procfs/net_dev.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/procfs/net_dev_snmp6.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/procfs/net_ip_socket.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/procfs/net_protocols.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/procfs/net_route.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/procfs/net_sockstat.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/procfs/net_softnet.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/procfs/net_tcp.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/procfs/net_tls_stat.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/procfs/net_udp.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/procfs/net_unix.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/procfs/net_wireless.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/procfs/net_xfrm.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/procfs/netstat.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/procfs/nfnetlink_queue.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/procfs/proc.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/procfs/proc_cgroup.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/procfs/proc_cgroups.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/procfs/proc_environ.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/procfs/proc_fdinfo.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/procfs/proc_interrupts.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/procfs/proc_io.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/procfs/proc_limits.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/procfs/proc_maps.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/procfs/proc_netstat.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/procfs/proc_ns.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/procfs/proc_psi.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/procfs/proc_smaps.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/procfs/proc_snmp.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/procfs/proc_snmp6.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/procfs/proc_stat.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/procfs/proc_statm.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/procfs/proc_status.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/procfs/proc_sys.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/procfs/schedstat.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/procfs/slab.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/procfs/softirqs.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/procfs/stat.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/procfs/swaps.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/procfs/thread.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/procfs/vm.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/prometheus/procfs/zoneinfo.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/stoewer/go-strcase/.gitignoreis excluded by!**/vendor/**,!vendor/**vendor/github.com/stoewer/go-strcase/.golangci.ymlis excluded by!**/vendor/**,!vendor/**vendor/github.com/stoewer/go-strcase/LICENSEis excluded by!**/vendor/**,!vendor/**vendor/github.com/stoewer/go-strcase/README.mdis excluded by!**/vendor/**,!vendor/**vendor/github.com/stoewer/go-strcase/camel.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/stoewer/go-strcase/doc.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/stoewer/go-strcase/helper.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/stoewer/go-strcase/kebab.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/stoewer/go-strcase/snake.gois excluded by!**/vendor/**,!vendor/**vendor/go.etcd.io/etcd/client/pkg/v3/LICENSEis excluded by!**/vendor/**,!vendor/**vendor/go.etcd.io/etcd/client/pkg/v3/transport/listener.gois excluded by!**/vendor/**,!vendor/**vendor/go.etcd.io/etcd/client/pkg/v3/transport/listener_opts.gois excluded by!**/vendor/**,!vendor/**vendor/go.etcd.io/etcd/client/pkg/v3/transport/listener_tls.gois excluded by!**/vendor/**,!vendor/**vendor/go.etcd.io/etcd/client/pkg/v3/transport/timeout_transport.gois excluded by!**/vendor/**,!vendor/**vendor/go.etcd.io/etcd/client/pkg/v3/verify/verify.gois excluded by!**/vendor/**,!vendor/**vendor/golang.org/x/sys/unix/syscall_linux.gois excluded by!**/vendor/**,!vendor/**vendor/golang.org/x/sys/unix/syscall_linux_386.gois excluded by!**/vendor/**,!vendor/**vendor/golang.org/x/sys/unix/syscall_linux_amd64.gois excluded by!**/vendor/**,!vendor/**vendor/golang.org/x/sys/unix/syscall_linux_arm.gois excluded by!**/vendor/**,!vendor/**vendor/golang.org/x/sys/unix/syscall_linux_arm64.gois excluded by!**/vendor/**,!vendor/**vendor/golang.org/x/sys/unix/syscall_linux_loong64.gois excluded by!**/vendor/**,!vendor/**vendor/golang.org/x/sys/unix/syscall_linux_mips64x.gois excluded by!**/vendor/**,!vendor/**vendor/golang.org/x/sys/unix/syscall_linux_mipsx.gois excluded by!**/vendor/**,!vendor/**vendor/golang.org/x/sys/unix/syscall_linux_ppc.gois excluded by!**/vendor/**,!vendor/**vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.gois excluded by!**/vendor/**,!vendor/**vendor/golang.org/x/sys/unix/syscall_linux_riscv64.gois excluded by!**/vendor/**,!vendor/**vendor/golang.org/x/sys/unix/syscall_linux_s390x.gois excluded by!**/vendor/**,!vendor/**vendor/golang.org/x/sys/unix/syscall_linux_sparc64.gois excluded by!**/vendor/**,!vendor/**vendor/golang.org/x/sys/unix/zerrors_linux.gois excluded by!**/vendor/**,!vendor/**vendor/golang.org/x/sys/unix/zsyscall_linux.gois excluded by!**/vendor/**,!vendor/**vendor/golang.org/x/sys/unix/zsyscall_linux_386.gois excluded by!**/vendor/**,!vendor/**vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.gois excluded by!**/vendor/**,!vendor/**vendor/golang.org/x/sys/unix/zsyscall_linux_arm.gois excluded by!**/vendor/**,!vendor/**vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.gois excluded by!**/vendor/**,!vendor/**vendor/golang.org/x/sys/unix/zsyscall_linux_loong64.gois excluded by!**/vendor/**,!vendor/**vendor/golang.org/x/sys/unix/zsyscall_linux_mips.gois excluded by!**/vendor/**,!vendor/**vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.gois excluded by!**/vendor/**,!vendor/**vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.gois excluded by!**/vendor/**,!vendor/**vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.gois excluded by!**/vendor/**,!vendor/**vendor/golang.org/x/sys/unix/zsyscall_linux_ppc.gois excluded by!**/vendor/**,!vendor/**vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.gois excluded by!**/vendor/**,!vendor/**vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.gois excluded by!**/vendor/**,!vendor/**vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.gois excluded by!**/vendor/**,!vendor/**vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.gois excluded by!**/vendor/**,!vendor/**vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.gois excluded by!**/vendor/**,!vendor/**vendor/golang.org/x/sys/windows/security_windows.gois excluded by!**/vendor/**,!vendor/**vendor/golang.org/x/sys/windows/syscall_windows.gois excluded by!**/vendor/**,!vendor/**vendor/golang.org/x/sys/windows/types_windows.gois excluded by!**/vendor/**,!vendor/**vendor/golang.org/x/text/unicode/norm/forminfo.gois excluded by!**/vendor/**,!vendor/**vendor/golang.org/x/text/unicode/norm/iter.gois excluded by!**/vendor/**,!vendor/**vendor/golang.org/x/text/unicode/norm/normalize.gois excluded by!**/vendor/**,!vendor/**vendor/golang.org/x/tools/go/packages/packages.gois excluded by!**/vendor/**,!vendor/**vendor/golang.org/x/tools/internal/gcimporter/iexport.gois excluded by!**/vendor/**,!vendor/**vendor/golang.org/x/tools/internal/gcimporter/iimport.gois excluded by!**/vendor/**,!vendor/**vendor/golang.org/x/tools/internal/stdlib/deps.gois excluded by!**/vendor/**,!vendor/**vendor/golang.org/x/tools/internal/stdlib/manifest.gois excluded by!**/vendor/**,!vendor/**vendor/golang.org/x/tools/internal/typesinternal/element.gois excluded by!**/vendor/**,!vendor/**vendor/golang.org/x/tools/internal/typesinternal/types.gois excluded by!**/vendor/**,!vendor/**vendor/golang.org/x/tools/internal/typesinternal/zerovalue.gois excluded by!**/vendor/**,!vendor/**vendor/google.golang.org/grpc/balancer/balancer.gois excluded by!**/vendor/**,!vendor/**vendor/google.golang.org/grpc/balancer/pickfirst/pickfirst.gois excluded by!**/vendor/**,!vendor/**vendor/google.golang.org/grpc/clientconn.gois excluded by!**/vendor/**,!vendor/**vendor/google.golang.org/grpc/dialoptions.gois excluded by!**/vendor/**,!vendor/**vendor/google.golang.org/grpc/encoding/encoding.gois excluded by!**/vendor/**,!vendor/**vendor/google.golang.org/grpc/encoding/gzip/gzip.gois excluded by!**/vendor/**,!vendor/**vendor/google.golang.org/grpc/experimental/balancer/weight/weight.gois excluded by!**/vendor/**,!vendor/**vendor/google.golang.org/grpc/experimental/stats/metrics.gois excluded by!**/vendor/**,!vendor/**vendor/google.golang.org/grpc/health/grpc_health_v1/health_grpc.pb.gois excluded by!**/*.pb.go,!**/vendor/**,!vendor/**vendor/google.golang.org/grpc/internal/envconfig/envconfig.gois excluded by!**/vendor/**,!vendor/**vendor/google.golang.org/grpc/internal/envconfig/xds.gois excluded by!**/vendor/**,!vendor/**vendor/google.golang.org/grpc/internal/grpcutil/encode_duration.gois excluded by!**/vendor/**,!vendor/**vendor/google.golang.org/grpc/internal/mem/buffer_pool.gois excluded by!**/vendor/**,!vendor/**vendor/google.golang.org/grpc/internal/resolver/config_selector.gois excluded by!**/vendor/**,!vendor/**vendor/google.golang.org/grpc/internal/stats/labels.gois excluded by!**/vendor/**,!vendor/**vendor/google.golang.org/grpc/internal/transport/client_stream.gois excluded by!**/vendor/**,!vendor/**vendor/google.golang.org/grpc/internal/transport/controlbuf.gois excluded by!**/vendor/**,!vendor/**vendor/google.golang.org/grpc/internal/transport/flowcontrol.gois excluded by!**/vendor/**,!vendor/**vendor/google.golang.org/grpc/internal/transport/handler_server.gois excluded by!**/vendor/**,!vendor/**vendor/google.golang.org/grpc/internal/transport/http2_client.gois excluded by!**/vendor/**,!vendor/**vendor/google.golang.org/grpc/internal/transport/http2_server.gois excluded by!**/vendor/**,!vendor/**vendor/google.golang.org/grpc/internal/transport/http_util.gois excluded by!**/vendor/**,!vendor/**vendor/google.golang.org/grpc/internal/transport/internal/internal.gois excluded by!**/vendor/**,!vendor/**vendor/google.golang.org/grpc/internal/transport/readyreader/raw_conn_linux.gois excluded by!**/vendor/**,!vendor/**vendor/google.golang.org/grpc/internal/transport/readyreader/raw_conn_nonlinux.gois excluded by!**/vendor/**,!vendor/**vendor/google.golang.org/grpc/internal/transport/readyreader/ready_reader.gois excluded by!**/vendor/**,!vendor/**vendor/google.golang.org/grpc/internal/transport/transport.gois excluded by!**/vendor/**,!vendor/**vendor/google.golang.org/grpc/mem/buffer_slice.gois excluded by!**/vendor/**,!vendor/**vendor/google.golang.org/grpc/mem/buffers.gois excluded by!**/vendor/**,!vendor/**vendor/google.golang.org/grpc/rpc_util.gois excluded by!**/vendor/**,!vendor/**vendor/google.golang.org/grpc/server.gois excluded by!**/vendor/**,!vendor/**vendor/google.golang.org/grpc/stream.gois excluded by!**/vendor/**,!vendor/**vendor/google.golang.org/grpc/version.gois excluded by!**/vendor/**,!vendor/**vendor/google.golang.org/protobuf/encoding/protodelim/protodelim.gois excluded by!**/vendor/**,!vendor/**vendor/google.golang.org/protobuf/encoding/protojson/decode.gois excluded by!**/vendor/**,!vendor/**vendor/google.golang.org/protobuf/encoding/protojson/well_known_types.gois excluded by!**/vendor/**,!vendor/**vendor/google.golang.org/protobuf/encoding/prototext/decode.gois excluded by!**/vendor/**,!vendor/**vendor/google.golang.org/protobuf/internal/descfmt/stringer.gois excluded by!**/vendor/**,!vendor/**vendor/google.golang.org/protobuf/internal/version/version.gois excluded by!**/vendor/**,!vendor/**vendor/google.golang.org/protobuf/reflect/protodesc/desc_init.gois excluded by!**/vendor/**,!vendor/**vendor/k8s.io/client-go/tools/leaderelection/resourcelock/leaselock.gois excluded by!**/vendor/**,!vendor/**vendor/modules.txtis excluded by!**/vendor/**,!vendor/**
📒 Files selected for processing (28)
DockerfileDockerfile.plugin-testMakefileTiltfileapis/go.modconfig/base/webhook/manifests.yamlconfig/render/capm3.yamlgo.modhack/ci-e2e.shhack/e2e/ensure_go.shhack/generate.shhack/gomod.shhack/tools/go.modinternal/webhooks/metal3.io/v1alpha1/baremetalhost_validation.gointernal/webhooks/metal3.io/v1alpha1/baremetalhost_validation_test.gointernal/webhooks/metal3.io/v1alpha1/common_validation.gointernal/webhooks/metal3.io/v1alpha1/dataimage_validation.gointernal/webhooks/metal3.io/v1alpha1/dataimage_validation_test.gointernal/webhooks/metal3.io/v1alpha1/dataimage_webhook.gointernal/webhooks/metal3.io/v1alpha1/hostfirmwarecomponents_validation.gointernal/webhooks/metal3.io/v1alpha1/hostfirmwarecomponents_validation_test.gointernal/webhooks/metal3.io/v1alpha1/hostfirmwarecomponents_webhook.gomain.gopkg/hardwareutils/bmc/access_test.gopkg/hardwareutils/go.modtest/e2e/automated_cleaning_test.gotest/go.modtest/vbmctl/cmd/vbmctl/create.go
| cache_image() { | ||
| wget --no-verbose -P "${IMAGE_DIR}/" "$@" | ||
| } | ||
|
|
||
| ARTIFACTORY_ROOT=https://artifactory.nordix.org/artifactory | ||
|
|
||
| ## Download disk images | ||
| if [[ ! -f "${IMAGE_DIR}/${IMAGE_FILE}" ]]; then | ||
| wget --no-verbose -P "${IMAGE_DIR}/" https://artifactory.nordix.org/artifactory/metal3/images/iso/"${IMAGE_FILE}" | ||
| if ! cache_image "${ARTIFACTORY_ROOT}/metal3/images/iso/${IMAGE_FILE}"; then | ||
| cache_image https://download.cirros-cloud.net/"${CIRROS_VERSION}/${IMAGE_FILE}" | ||
| fi | ||
| fi | ||
| if [[ ! -f "${IMAGE_DIR}/${ISO_FILE}" ]]; then | ||
| wget --no-verbose -P "${IMAGE_DIR}/" https://artifactory.nordix.org/artifactory/metal3/images/sysrescue/"${ISO_FILE}" | ||
| if ! cache_image "${ARTIFACTORY_ROOT}/metal3/images/sysrescue/${ISO_FILE}"; then | ||
| wget --no-verbose -O "${IMAGE_DIR}/${ISO_FILE}" https://sourceforge.net/projects/systemrescuecd/files/sysresccd-x86/"${SYSRESCUE_VERSION}"/"${ISO_FILE}"/download | ||
| fi | ||
| fi | ||
|
|
||
| ## Download IPA (Ironic Python Agent) image | ||
| # Ironic IPA downloader is configured to use this local image in the tests. | ||
| # This saves time, especially during ironic upgrade tests and also | ||
| # gives us early failure in case there is some issue downloading it. | ||
| IPA_FILE="ipa-centos9-master.tar.gz" | ||
| IPA_BASEURI=https://artifactory.nordix.org/artifactory/openstack-remote/ironic-python-agent/dib/ | ||
| IPA_BASEURI="${ARTIFACTORY_ROOT}/openstack-remote/ironic-python-agent/dib/" | ||
| if [[ ! -f "${IMAGE_DIR}/${IPA_FILE}" ]]; then | ||
| wget --no-verbose -P "${IMAGE_DIR}/" "${IPA_BASEURI}/${IPA_FILE}" | ||
| if ! cache_image "${IPA_BASEURI}/${IPA_FILE}"; then | ||
| cache_image https://tarballs.opendev.org/openstack/ironic-python-agent/dib/"${IPA_FILE}" | ||
| fi |
There was a problem hiding this comment.
🩺 Stability & Availability | 🟠 Major | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -euo pipefail
printf 'Repository files matching ci-e2e.sh:\n'
fd -a 'ci-e2e\.sh$' . || true
printf '\nFile excerpt with line numbers:\n'
if [ -f hack/ci-e2e.sh ]; then
nl -ba hack/ci-e2e.sh | sed -n '90,150p'
fi
printf '\nSearch for IMAGE_DIR/IMAGE_FILE/ISO_FILE/IPA handling elsewhere in script:\n'
rg -n 'IMAGE_DIR|IMAGE_FILE|ISO_FILE|IPA_FILE|cache_image|wget|download' hack/ci-e2e.sh || true
printf '\nBehavioral probe: how bash -f treats zero/partial files and wget default naming:\n'
python3 - <<'PY'
import subprocess, tempfile, os
with tempfile.Traffic() as d:
pass
PY
tmp="$(mktemp -d)"
printf 'tmpdir=%s\n' "$tmp"
for path in "$tmp/empty" "$tmp/partial" "$tmp/nonexistent"; do
[ -f "$path" ] && echo "$path exists" || echo "$path missing"
[ -s "$path" ] && echo "$path non-empty" || echo "$path empty-or-missing"
if [ -f "$path" ]; then wc -c < "$path"; fi
done
rm -rf "$tmp"Repository: openshift/baremetal-operator
Length of output: 310
🏁 Script executed:
#!/bin/bash
set -euo pipefail
printf 'Repository files matching ci-e2e.sh:\n'
fd -a 'ci-e2e\.sh$' . || true
printf '\nFile excerpt with line numbers:\n'
if [ -f hack/ci-e2e.sh ]; then
nl -ba hack/ci-e2e.sh | sed -n '90,150p'
fi
printf '\nSearch for IMAGE_DIR/IMAGE_FILE/ISO_FILE/IPA handling elsewhere in script:\n'
rg -n 'IMAGE_DIR|IMAGE_FILE|ISO_FILE|IPA_FILE|cache_image|wget|download' hack/ci-e2e.sh || true
printf '\nBehavioral probe: how bash -f treats zero/partial files:\n'
tmp="$(mktemp -d)"
for path in "$tmp/empty" "$tmp/partial" "$tmp/nonexistent"; do
[ -f "$path" ] && echo "$path exists" || echo "$path missing"
[ -s "$path" ] && echo "$path non-empty" || echo "$path empty-or-missing"
if [ -f "$path" ]; then wc -c < "$path"; fi
done
rm -rf "$tmp"Repository: openshift/baremetal-operator
Length of output: 310
🏁 Script executed:
#!/bin/bash
set -euo pipefail
FILE=hack/ci-e2e.sh
printf 'File exists and size:\n'
if [ -f "$FILE" ]; then
count=$(wc -l < "$FILE")
printf '%s lines\n' "$count"
else
printf 'missing\n'
fi
printf '\nRelevant excerpts:\n'
awk 'NR>=100 && NR<=145 {printf "%6d\t%s\n", NR, $0}' "$FILE"
printf '\nSearch for relevant symbols/paths:\n'
rg -n 'cache_image|IMAGE_DIR|IMAGE_FILE|ISO_FILE|IPA_FILE|ARTIFACTORY_ROOT|sourceforge|download\.opendev\.org|sysrescc|metal3/images' "$FILE" || true
printf '\nBehavioral probe for bash [ -f ] and [ -s ]:\n'
tmp="$(mktemp -d)"
trap 'rm -rf "$tmp"' EXIT
for path in "$tmp/empty" "$tmp/partial" "$tmp/nonexistent"; do
[ -f "$path" ] && echo "$path: exists" || echo "$path: missing"
[ -s "$path" ] && echo "$path: non-empty" || echo "$path: empty-or-missing"
done
printf '\nBehavioral probe: wget default name for https path without final / download path:\n'
for url in \
'https://server/artifact' \
'https://server/articles/iso/IMAGE' \
'https://download.cirros-cloud.net/CIRROS_VERSION/IMAGE' \
'https://example/path/download'
do
python3 - "$url" <<'PY'
import urllib.parse, sys
url = sys.argv[1]
parts = urllib.parse.urlparse(url).path.rstrip('/').split('/')
print('/'.join(parts[-1:]))
PY
doneRepository: openshift/baremetal-operator
Length of output: 4705
Download artifacts to a temporary file before treating them as cached.
wget writes directly to the final cache path here, so an interrupted Artifactory or fallback download can leave a zero-byte or incomplete file that the [[ -f ... ]] checks accept as a cache hit. Download to a temporary path first, then move it into place on success; apply the same approach to the SourceForge ISO download.
🤖 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 `@hack/ci-e2e.sh` around lines 109 - 136, Update cache_image and the
SourceForge ISO download flow to write into temporary files within IMAGE_DIR,
moving each temporary file to its final cache path only after wget succeeds.
Ensure failed or interrupted Artifactory and fallback downloads cannot leave
partial files that satisfy the existing -f cache checks, and apply the same
atomic handling to IMAGE_FILE, ISO_FILE, and IPA_FILE downloads.
| func (webhook *DataImage) ValidateCreate(_ context.Context, dataimg *metal3api.DataImage) (admission.Warnings, error) { | ||
| if dataimg == nil { | ||
| dataimagelog.Error(errors.New("object is nil"), "validate create error") | ||
| return nil, nil | ||
| } | ||
|
|
||
| dataimagelog.Info("validate create", "namespace", dataimg.Namespace, "name", dataimg.Name) | ||
| return nil, kerrors.NewAggregate(webhook.validateDataImage(dataimg)) | ||
| } | ||
|
|
||
| // ValidateUpdate implements webhook.Validator so a webhook will be registered for the type. | ||
| func (webhook *DataImage) ValidateUpdate(_ context.Context, oldImg, newImg *metal3api.DataImage) (admission.Warnings, error) { | ||
| if oldImg == nil { | ||
| dataimagelog.Error(errors.New("old object is nil"), "validate update error") | ||
| return nil, nil | ||
| } | ||
|
|
||
| if newImg == nil { | ||
| dataimagelog.Error(fmt.Errorf("new object is nil for %s/%s", oldImg.Namespace, oldImg.Name), "validate update error") | ||
| return nil, nil |
There was a problem hiding this comment.
🔒 Security & Privacy | 🟠 Major | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "== files =="
git ls-files | rg 'dataimage_webhook\.go|hostfirmwarecomponents_webhook\.go$' || true
echo "== relevant snippets =="
for f in internal/webhooks/metal3.io/v1alpha1/dataimage_webhook.go internal/webhooks/metal3.io/v1alpha1/hostfirmwarecomponents_webhook.go; do
if [ -f "$f" ]; then
echo "--- $f ---"
sed -n '1,160p' "$f" | nl -ba
fi
done
echo "== imports/types/context around webhooks =="
rg -n "type DataImage|func \\(webhook \\*DataImage\\) Validate(Create|Update)|type .*Firmware.*Components|func \\(webhook \\*HostFirmwareComponents\\) Validate(Create|Update)|Validate(object|oldObject|newObject|nil)|nil" -S internal/webhooks || trueRepository: openshift/baremetal-operator
Length of output: 438
🏁 Script executed:
#!/bin/bash
set -euo pipefail
# Behavioral check for the control-flow semantics if object nil handling is removed/changed.
python3 - <<'PY'
def current_dataimage(dataimg):
errors = []
if dataimg is None:
errors.append("nil create object")
return None, None
return None, "aggregate:" + str(errors)
def current_update(oldimg, newimg):
errors = []
if oldimg is None:
errors.append("nil old object")
return None, None
if newimg is None:
errors.append(f"nil new object for {oldimg}")
return None, None
return None, "aggregate:" + str(errors)
for name, fn in [("ValidateCreate(nil)", lambda: current_dataimage(None)),
("ValidateUpdate(nil, nil)", lambda: current_update(None, None)),
("ValidateUpdate(1, nil)", lambda: current_update(1, None)),
("ValidateUpdate(1, 2)", lambda: current_update(1, 2))]:
warnings, err = fn()
print(f"{name}: warnings={warnings!r}, err={err!r}, closed={err is not None}")
PYRepository: openshift/baremetal-operator
Length of output: 420
🏁 Script executed:
#!/bin/bash
set -efo pipefail
echo "== relevant snippets =="
for f in internal/webhooks/metal3.io/v1alpha1/dataimage_webhook.go internal/webhooks/metal3.io/v1alpha1/hostfirmwarecomponents_webhook.go; do
if [ -f "$f" ]; then
echo "--- $f ---"
awk '{printf "%5d\t%s\n", NR, $0}' "$f" | sed -n '1,160p'
fi
done
echo "== webhook nil handling occurrences =="
rg -n 'Validate(Create|Update)|object is nil|old object is nil|new object is nil|return nil, nil|return nil, kerrors.NewAggregate|validate(D|H).*Components|validate.*Image' -S internal/webhooks || true
echo "== go tool availability =="
command -v go || true
go version 2>/dev/null || trueRepository: openshift/baremetal-operator
Length of output: 22261
Fail closed for nil webhook objects.
internal/webhooks/metal3.io/v1alpha1/dataimage_webhook.go#L49-L68returnsnil, nilwhenCreateorUpdateobjects are nil.internal/webhooks/metal3.io/v1alpha1/hostfirmwarecomponents_webhook.go#L54-L72does the same.
Return a non-nil validation error in these checks so nil webhook input is rejected rather than implicitly admitted.
📍 Affects 2 files
internal/webhooks/metal3.io/v1alpha1/dataimage_webhook.go#L49-L68(this comment)internal/webhooks/metal3.io/v1alpha1/hostfirmwarecomponents_webhook.go#L54-L72
🤖 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 `@internal/webhooks/metal3.io/v1alpha1/dataimage_webhook.go` around lines 49 -
68, Make the nil-object checks in DataImage.ValidateCreate and
DataImage.ValidateUpdate return a non-nil validation error instead of nil, nil,
rejecting missing webhook input while preserving the existing logging. Apply the
same fail-closed change to HostFirmwareComponents.ValidateCreate and
HostFirmwareComponents.ValidateUpdate in
internal/webhooks/metal3.io/v1alpha1/hostfirmwarecomponents_webhook.go (lines
54-72).
|
@hroyrh: This pull request explicitly references no jira issue. DetailsIn response to this:
Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the openshift-eng/jira-lifecycle-plugin repository. |
|
/approve |
|
[APPROVALNOTIFIER] This PR is APPROVED This pull-request has been approved by: elfosardo, hroyrh The full list of commands accepted by this bot can be found here. The pull request process is described here DetailsNeeds approval from an approver in each of these files:
Approvers can indicate their approval by writing |
|
/verified later @jadhaj |
|
@jadhaj: This PR has been marked to be verified later by DetailsIn response to this:
Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the openshift-eng/jira-lifecycle-plugin repository. |
|
/lgtm Who in the right mind approved inclusion of FTP and Gopher in the schema list? Oo |
Summary by CodeRabbit
New Features
Bug Fixes
Maintenance