-
Notifications
You must be signed in to change notification settings - Fork 67
✨ support configure loadbalancer for grpc service #523
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
✨ support configure loadbalancer for grpc service #523
Conversation
WalkthroughUpdates Go module versions in Changes
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~20 minutes
Possibly related PRs
Suggested labels
Suggested reviewers
Pre-merge checks and finishing touches❌ Failed checks (1 inconclusive)
✅ Passed checks (2 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 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 0
🧹 Nitpick comments (1)
pkg/cmd/init/cmd.go (1)
104-104:--grpc-endpoint-typeflag wiring and defaults look goodFlag is correctly bound to
o.grpcEndpointTypewith a sensible default and clear help text. As a minor follow-up, you might later clarify in the help that--grpc-serveris required forhostnamebut optional forloadBalancer, to match the exec logic and reduce confusion.
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
⛔ Files ignored due to path filters (125)
go.sumis excluded by!**/*.sumvendor/cloud.google.com/go/compute/metadata/CHANGES.mdis excluded by!vendor/**vendor/cloud.google.com/go/compute/metadata/log.gois excluded by!vendor/**vendor/cloud.google.com/go/compute/metadata/metadata.gois excluded by!vendor/**vendor/cloud.google.com/go/compute/metadata/retry_linux.gois excluded by!vendor/**vendor/cloud.google.com/go/compute/metadata/syscheck.gois excluded by!vendor/**vendor/cloud.google.com/go/compute/metadata/syscheck_linux.gois excluded by!vendor/**vendor/cloud.google.com/go/compute/metadata/syscheck_windows.gois excluded by!vendor/**vendor/github.com/Masterminds/semver/v3/CHANGELOG.mdis excluded by!vendor/**vendor/github.com/Masterminds/semver/v3/README.mdis excluded by!vendor/**vendor/github.com/Masterminds/semver/v3/constraints.gois excluded by!vendor/**vendor/github.com/Masterminds/semver/v3/version.gois excluded by!vendor/**vendor/github.com/onsi/gomega/CHANGELOG.mdis excluded by!vendor/**vendor/github.com/onsi/gomega/gomega_dsl.gois excluded by!vendor/**vendor/github.com/onsi/gomega/internal/async_assertion.gois excluded by!vendor/**vendor/github.com/onsi/gomega/matchers/be_comparable_to_matcher.gois excluded by!vendor/**vendor/github.com/onsi/gomega/matchers/match_yaml_matcher.gois excluded by!vendor/**vendor/github.com/spf13/pflag/flag.gois excluded by!vendor/**vendor/github.com/spf13/pflag/golangflag.gois excluded by!vendor/**vendor/github.com/spf13/pflag/string_to_string.gois excluded by!vendor/**vendor/github.com/spf13/pflag/time.gois excluded by!vendor/**vendor/go.opentelemetry.io/otel/attribute/filter.gois excluded by!vendor/**vendor/go.opentelemetry.io/otel/attribute/internal/attribute.gois excluded by!vendor/**vendor/go.opentelemetry.io/otel/attribute/rawhelpers.gois excluded by!vendor/**vendor/go.opentelemetry.io/otel/attribute/value.gois excluded by!vendor/**vendor/go.opentelemetry.io/otel/internal/gen.gois excluded by!vendor/**vendor/go.opentelemetry.io/otel/internal/rawhelpers.gois excluded by!vendor/**vendor/go.opentelemetry.io/otel/semconv/v1.34.0/MIGRATION.mdis excluded by!vendor/**vendor/go.opentelemetry.io/otel/semconv/v1.34.0/README.mdis excluded by!vendor/**vendor/go.opentelemetry.io/otel/semconv/v1.34.0/attribute_group.gois excluded by!vendor/**vendor/go.opentelemetry.io/otel/semconv/v1.34.0/doc.gois excluded by!vendor/**vendor/go.opentelemetry.io/otel/semconv/v1.34.0/exception.gois excluded by!vendor/**vendor/go.opentelemetry.io/otel/semconv/v1.34.0/schema.gois excluded by!vendor/**vendor/go.opentelemetry.io/otel/trace/auto.gois excluded by!vendor/**vendor/go.opentelemetry.io/otel/trace/internal/telemetry/attr.gois excluded by!vendor/**vendor/go.opentelemetry.io/otel/trace/internal/telemetry/doc.gois excluded by!vendor/**vendor/go.opentelemetry.io/otel/trace/internal/telemetry/id.gois excluded by!vendor/**vendor/go.opentelemetry.io/otel/trace/internal/telemetry/number.gois excluded by!vendor/**vendor/go.opentelemetry.io/otel/trace/internal/telemetry/resource.gois excluded by!vendor/**vendor/go.opentelemetry.io/otel/trace/internal/telemetry/scope.gois excluded by!vendor/**vendor/go.opentelemetry.io/otel/trace/internal/telemetry/span.gois excluded by!vendor/**vendor/go.opentelemetry.io/otel/trace/internal/telemetry/status.gois excluded by!vendor/**vendor/go.opentelemetry.io/otel/trace/internal/telemetry/traces.gois excluded by!vendor/**vendor/go.opentelemetry.io/otel/trace/internal/telemetry/value.gois excluded by!vendor/**vendor/go.opentelemetry.io/otel/trace/noop.gois excluded by!vendor/**vendor/google.golang.org/genproto/googleapis/rpc/status/status.pb.gois excluded by!**/*.pb.go,!vendor/**vendor/google.golang.org/grpc/CONTRIBUTING.mdis excluded by!vendor/**vendor/google.golang.org/grpc/MAINTAINERS.mdis excluded by!vendor/**vendor/google.golang.org/grpc/README.mdis excluded by!vendor/**vendor/google.golang.org/grpc/balancer/balancer.gois excluded by!vendor/**vendor/google.golang.org/grpc/balancer/base/balancer.gois excluded by!vendor/**vendor/google.golang.org/grpc/balancer/endpointsharding/endpointsharding.gois excluded by!vendor/**vendor/google.golang.org/grpc/balancer/pickfirst/internal/internal.gois excluded by!vendor/**vendor/google.golang.org/grpc/balancer/pickfirst/pickfirst.gois excluded by!vendor/**vendor/google.golang.org/grpc/balancer/pickfirst/pickfirstleaf/pickfirstleaf.gois excluded by!vendor/**vendor/google.golang.org/grpc/balancer/roundrobin/roundrobin.gois excluded by!vendor/**vendor/google.golang.org/grpc/balancer/subconn.gois excluded by!vendor/**vendor/google.golang.org/grpc/balancer_wrapper.gois excluded by!vendor/**vendor/google.golang.org/grpc/binarylog/grpc_binarylog_v1/binarylog.pb.gois excluded by!**/*.pb.go,!vendor/**vendor/google.golang.org/grpc/clientconn.gois excluded by!vendor/**vendor/google.golang.org/grpc/codec.gois excluded by!vendor/**vendor/google.golang.org/grpc/credentials/credentials.gois excluded by!vendor/**vendor/google.golang.org/grpc/credentials/insecure/insecure.gois excluded by!vendor/**vendor/google.golang.org/grpc/credentials/tls.gois excluded by!vendor/**vendor/google.golang.org/grpc/dialoptions.gois excluded by!vendor/**vendor/google.golang.org/grpc/encoding/proto/proto.gois excluded by!vendor/**vendor/google.golang.org/grpc/experimental/stats/metricregistry.gois excluded by!vendor/**vendor/google.golang.org/grpc/experimental/stats/metrics.gois excluded by!vendor/**vendor/google.golang.org/grpc/grpclog/internal/loggerv2.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/backoff/backoff.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/balancer/gracefulswitch/gracefulswitch.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/buffer/unbounded.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/channelz/trace.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/credentials/credentials.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/envconfig/envconfig.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/envconfig/xds.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/grpcsync/callback_serializer.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/grpcsync/event.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/grpcsync/oncefunc.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/internal.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/metadata/metadata.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/proxyattributes/proxyattributes.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/resolver/delegatingresolver/delegatingresolver.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/resolver/dns/dns_resolver.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/status/status.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/transport/client_stream.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/transport/controlbuf.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/transport/flowcontrol.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/transport/handler_server.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/transport/http2_client.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/transport/http2_server.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/transport/http_util.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/transport/proxy.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/transport/server_stream.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/transport/transport.gois excluded by!vendor/**vendor/google.golang.org/grpc/mem/buffer_slice.gois excluded by!vendor/**vendor/google.golang.org/grpc/picker_wrapper.gois excluded by!vendor/**vendor/google.golang.org/grpc/preloader.gois excluded by!vendor/**vendor/google.golang.org/grpc/resolver/map.gois excluded by!vendor/**vendor/google.golang.org/grpc/resolver/resolver.gois excluded by!vendor/**vendor/google.golang.org/grpc/resolver_wrapper.gois excluded by!vendor/**vendor/google.golang.org/grpc/rpc_util.gois excluded by!vendor/**vendor/google.golang.org/grpc/server.gois excluded by!vendor/**vendor/google.golang.org/grpc/service_config.gois excluded by!vendor/**vendor/google.golang.org/grpc/stats/handlers.gois excluded by!vendor/**vendor/google.golang.org/grpc/stats/metrics.gois excluded by!vendor/**vendor/google.golang.org/grpc/stats/stats.gois excluded by!vendor/**vendor/google.golang.org/grpc/stream.gois excluded by!vendor/**vendor/google.golang.org/grpc/version.gois excluded by!vendor/**vendor/google.golang.org/protobuf/encoding/protowire/wire.gois excluded by!vendor/**vendor/google.golang.org/protobuf/internal/editiondefaults/editions_defaults.binpbis excluded by!vendor/**vendor/google.golang.org/protobuf/internal/filedesc/editions.gois excluded by!vendor/**vendor/google.golang.org/protobuf/internal/filedesc/presence.gois excluded by!vendor/**vendor/google.golang.org/protobuf/internal/genid/descriptor_gen.gois excluded by!vendor/**vendor/google.golang.org/protobuf/internal/impl/codec_message_opaque.gois excluded by!vendor/**vendor/google.golang.org/protobuf/internal/impl/message_opaque.gois excluded by!vendor/**vendor/google.golang.org/protobuf/internal/impl/presence.gois excluded by!vendor/**vendor/google.golang.org/protobuf/internal/version/version.gois excluded by!vendor/**vendor/google.golang.org/protobuf/reflect/protoreflect/source_gen.gois excluded by!vendor/**vendor/google.golang.org/protobuf/types/descriptorpb/descriptor.pb.gois excluded by!**/*.pb.go,!vendor/**vendor/modules.txtis excluded by!vendor/**vendor/open-cluster-management.io/api/operator/v1/0000_01_operator.open-cluster-management.io_clustermanagers.crd.yamlis excluded by!vendor/**vendor/open-cluster-management.io/api/operator/v1/types_clustermanager.gois excluded by!vendor/**vendor/open-cluster-management.io/api/operator/v1/zz_generated.deepcopy.gois excluded by!vendor/**vendor/open-cluster-management.io/ocm/deploy/cluster-manager/chart/cluster-manager/crds/0000_01_operator.open-cluster-management.io_clustermanagers.crd.yamlis excluded by!vendor/**
📒 Files selected for processing (4)
go.mod(5 hunks)pkg/cmd/init/cmd.go(1 hunks)pkg/cmd/init/exec.go(1 hunks)pkg/cmd/init/options.go(1 hunks)
🧰 Additional context used
🧠 Learnings (2)
📓 Common learnings
Learnt from: zhiweiyin318
Repo: open-cluster-management-io/clusteradm PR: 516
File: go.mod:34-34
Timestamp: 2025-11-05T15:25:15.187Z
Learning: In the clusteradm repository, the dependency upgrade of open-cluster-management.io/ocm to v1.1.1-0.20251105064423-d80ec55608e7 is intentional and required to support the gRPC registration feature being added.
📚 Learning: 2025-11-05T15:25:15.187Z
Learnt from: zhiweiyin318
Repo: open-cluster-management-io/clusteradm PR: 516
File: go.mod:34-34
Timestamp: 2025-11-05T15:25:15.187Z
Learning: In the clusteradm repository, the dependency upgrade of open-cluster-management.io/ocm to v1.1.1-0.20251105064423-d80ec55608e7 is intentional and required to support the gRPC registration feature being added.
Applied to files:
go.mod
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (4)
- GitHub Check: integration-test
- GitHub Check: e2e-test
- GitHub Check: verify
- GitHub Check: unit-test
🔇 Additional comments (3)
pkg/cmd/init/options.go (1)
73-74: NewgrpcEndpointTypeoption is aligned with CLI and exec usageField addition and documentation match the new flag and the switch logic in
exec.go; no issues from an options/wiring perspective.go.mod (1)
14-14: Dependency bumps look coherent with new gRPC/registration featuresThe set of version bumps (gomega, pflag, grpc,
open-cluster-management.io/apiand/ocm, OTEL, yaml v3, genproto/protobuf, etc.) looks internally consistent with the gRPC registration/endpoint work in this repo; nothing obviously concerning from the module list alone. Please ensure the full CI and integration test suites are green with these versions.Based on learnings
Also applies to: 18-19, 31-31, 34-34, 43-43, 49-49, 131-132, 137-137, 147-148
pkg/cmd/init/exec.go (1)
101-127: gRPC endpoint type handling is sound; fix minor typo and confirmloadBalancersemanticsThe new switch cleanly constructs an
EndpointExposurefor both hostname and loadBalancer types and errors on unknown types, which is good.Two small follow-ups:
- Line 105: fix the typo in the error message (
ednpoint→endpoint).- For the
loadBalancercase, decide whether--grpc-servershould ever be required. If it must be non-empty, mirror the hostname check; if it is intentionally optional and filled in by the operator, the current behavior is fine but you may want to clarify that in the flag help.Suggested typo fix:
- return fmt.Errorf("grpc server should not be empty if the grpc ednpoint type is hostname") + return fmt.Errorf("grpc server should not be empty if the grpc endpoint type is hostname")Also applies to: 132-132
826af53 to
eb2e564
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 1
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
⛔ Files ignored due to path filters (125)
go.sumis excluded by!**/*.sumvendor/cloud.google.com/go/compute/metadata/CHANGES.mdis excluded by!vendor/**vendor/cloud.google.com/go/compute/metadata/log.gois excluded by!vendor/**vendor/cloud.google.com/go/compute/metadata/metadata.gois excluded by!vendor/**vendor/cloud.google.com/go/compute/metadata/retry_linux.gois excluded by!vendor/**vendor/cloud.google.com/go/compute/metadata/syscheck.gois excluded by!vendor/**vendor/cloud.google.com/go/compute/metadata/syscheck_linux.gois excluded by!vendor/**vendor/cloud.google.com/go/compute/metadata/syscheck_windows.gois excluded by!vendor/**vendor/github.com/Masterminds/semver/v3/CHANGELOG.mdis excluded by!vendor/**vendor/github.com/Masterminds/semver/v3/README.mdis excluded by!vendor/**vendor/github.com/Masterminds/semver/v3/constraints.gois excluded by!vendor/**vendor/github.com/Masterminds/semver/v3/version.gois excluded by!vendor/**vendor/github.com/onsi/gomega/CHANGELOG.mdis excluded by!vendor/**vendor/github.com/onsi/gomega/gomega_dsl.gois excluded by!vendor/**vendor/github.com/onsi/gomega/internal/async_assertion.gois excluded by!vendor/**vendor/github.com/onsi/gomega/matchers/be_comparable_to_matcher.gois excluded by!vendor/**vendor/github.com/onsi/gomega/matchers/match_yaml_matcher.gois excluded by!vendor/**vendor/github.com/spf13/pflag/flag.gois excluded by!vendor/**vendor/github.com/spf13/pflag/golangflag.gois excluded by!vendor/**vendor/github.com/spf13/pflag/string_to_string.gois excluded by!vendor/**vendor/github.com/spf13/pflag/time.gois excluded by!vendor/**vendor/go.opentelemetry.io/otel/attribute/filter.gois excluded by!vendor/**vendor/go.opentelemetry.io/otel/attribute/internal/attribute.gois excluded by!vendor/**vendor/go.opentelemetry.io/otel/attribute/rawhelpers.gois excluded by!vendor/**vendor/go.opentelemetry.io/otel/attribute/value.gois excluded by!vendor/**vendor/go.opentelemetry.io/otel/internal/gen.gois excluded by!vendor/**vendor/go.opentelemetry.io/otel/internal/rawhelpers.gois excluded by!vendor/**vendor/go.opentelemetry.io/otel/semconv/v1.34.0/MIGRATION.mdis excluded by!vendor/**vendor/go.opentelemetry.io/otel/semconv/v1.34.0/README.mdis excluded by!vendor/**vendor/go.opentelemetry.io/otel/semconv/v1.34.0/attribute_group.gois excluded by!vendor/**vendor/go.opentelemetry.io/otel/semconv/v1.34.0/doc.gois excluded by!vendor/**vendor/go.opentelemetry.io/otel/semconv/v1.34.0/exception.gois excluded by!vendor/**vendor/go.opentelemetry.io/otel/semconv/v1.34.0/schema.gois excluded by!vendor/**vendor/go.opentelemetry.io/otel/trace/auto.gois excluded by!vendor/**vendor/go.opentelemetry.io/otel/trace/internal/telemetry/attr.gois excluded by!vendor/**vendor/go.opentelemetry.io/otel/trace/internal/telemetry/doc.gois excluded by!vendor/**vendor/go.opentelemetry.io/otel/trace/internal/telemetry/id.gois excluded by!vendor/**vendor/go.opentelemetry.io/otel/trace/internal/telemetry/number.gois excluded by!vendor/**vendor/go.opentelemetry.io/otel/trace/internal/telemetry/resource.gois excluded by!vendor/**vendor/go.opentelemetry.io/otel/trace/internal/telemetry/scope.gois excluded by!vendor/**vendor/go.opentelemetry.io/otel/trace/internal/telemetry/span.gois excluded by!vendor/**vendor/go.opentelemetry.io/otel/trace/internal/telemetry/status.gois excluded by!vendor/**vendor/go.opentelemetry.io/otel/trace/internal/telemetry/traces.gois excluded by!vendor/**vendor/go.opentelemetry.io/otel/trace/internal/telemetry/value.gois excluded by!vendor/**vendor/go.opentelemetry.io/otel/trace/noop.gois excluded by!vendor/**vendor/google.golang.org/genproto/googleapis/rpc/status/status.pb.gois excluded by!**/*.pb.go,!vendor/**vendor/google.golang.org/grpc/CONTRIBUTING.mdis excluded by!vendor/**vendor/google.golang.org/grpc/MAINTAINERS.mdis excluded by!vendor/**vendor/google.golang.org/grpc/README.mdis excluded by!vendor/**vendor/google.golang.org/grpc/balancer/balancer.gois excluded by!vendor/**vendor/google.golang.org/grpc/balancer/base/balancer.gois excluded by!vendor/**vendor/google.golang.org/grpc/balancer/endpointsharding/endpointsharding.gois excluded by!vendor/**vendor/google.golang.org/grpc/balancer/pickfirst/internal/internal.gois excluded by!vendor/**vendor/google.golang.org/grpc/balancer/pickfirst/pickfirst.gois excluded by!vendor/**vendor/google.golang.org/grpc/balancer/pickfirst/pickfirstleaf/pickfirstleaf.gois excluded by!vendor/**vendor/google.golang.org/grpc/balancer/roundrobin/roundrobin.gois excluded by!vendor/**vendor/google.golang.org/grpc/balancer/subconn.gois excluded by!vendor/**vendor/google.golang.org/grpc/balancer_wrapper.gois excluded by!vendor/**vendor/google.golang.org/grpc/binarylog/grpc_binarylog_v1/binarylog.pb.gois excluded by!**/*.pb.go,!vendor/**vendor/google.golang.org/grpc/clientconn.gois excluded by!vendor/**vendor/google.golang.org/grpc/codec.gois excluded by!vendor/**vendor/google.golang.org/grpc/credentials/credentials.gois excluded by!vendor/**vendor/google.golang.org/grpc/credentials/insecure/insecure.gois excluded by!vendor/**vendor/google.golang.org/grpc/credentials/tls.gois excluded by!vendor/**vendor/google.golang.org/grpc/dialoptions.gois excluded by!vendor/**vendor/google.golang.org/grpc/encoding/proto/proto.gois excluded by!vendor/**vendor/google.golang.org/grpc/experimental/stats/metricregistry.gois excluded by!vendor/**vendor/google.golang.org/grpc/experimental/stats/metrics.gois excluded by!vendor/**vendor/google.golang.org/grpc/grpclog/internal/loggerv2.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/backoff/backoff.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/balancer/gracefulswitch/gracefulswitch.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/buffer/unbounded.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/channelz/trace.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/credentials/credentials.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/envconfig/envconfig.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/envconfig/xds.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/grpcsync/callback_serializer.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/grpcsync/event.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/grpcsync/oncefunc.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/internal.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/metadata/metadata.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/proxyattributes/proxyattributes.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/resolver/delegatingresolver/delegatingresolver.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/resolver/dns/dns_resolver.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/status/status.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/transport/client_stream.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/transport/controlbuf.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/transport/flowcontrol.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/transport/handler_server.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/transport/http2_client.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/transport/http2_server.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/transport/http_util.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/transport/proxy.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/transport/server_stream.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/transport/transport.gois excluded by!vendor/**vendor/google.golang.org/grpc/mem/buffer_slice.gois excluded by!vendor/**vendor/google.golang.org/grpc/picker_wrapper.gois excluded by!vendor/**vendor/google.golang.org/grpc/preloader.gois excluded by!vendor/**vendor/google.golang.org/grpc/resolver/map.gois excluded by!vendor/**vendor/google.golang.org/grpc/resolver/resolver.gois excluded by!vendor/**vendor/google.golang.org/grpc/resolver_wrapper.gois excluded by!vendor/**vendor/google.golang.org/grpc/rpc_util.gois excluded by!vendor/**vendor/google.golang.org/grpc/server.gois excluded by!vendor/**vendor/google.golang.org/grpc/service_config.gois excluded by!vendor/**vendor/google.golang.org/grpc/stats/handlers.gois excluded by!vendor/**vendor/google.golang.org/grpc/stats/metrics.gois excluded by!vendor/**vendor/google.golang.org/grpc/stats/stats.gois excluded by!vendor/**vendor/google.golang.org/grpc/stream.gois excluded by!vendor/**vendor/google.golang.org/grpc/version.gois excluded by!vendor/**vendor/google.golang.org/protobuf/encoding/protowire/wire.gois excluded by!vendor/**vendor/google.golang.org/protobuf/internal/editiondefaults/editions_defaults.binpbis excluded by!vendor/**vendor/google.golang.org/protobuf/internal/filedesc/editions.gois excluded by!vendor/**vendor/google.golang.org/protobuf/internal/filedesc/presence.gois excluded by!vendor/**vendor/google.golang.org/protobuf/internal/genid/descriptor_gen.gois excluded by!vendor/**vendor/google.golang.org/protobuf/internal/impl/codec_message_opaque.gois excluded by!vendor/**vendor/google.golang.org/protobuf/internal/impl/message_opaque.gois excluded by!vendor/**vendor/google.golang.org/protobuf/internal/impl/presence.gois excluded by!vendor/**vendor/google.golang.org/protobuf/internal/version/version.gois excluded by!vendor/**vendor/google.golang.org/protobuf/reflect/protoreflect/source_gen.gois excluded by!vendor/**vendor/google.golang.org/protobuf/types/descriptorpb/descriptor.pb.gois excluded by!**/*.pb.go,!vendor/**vendor/modules.txtis excluded by!vendor/**vendor/open-cluster-management.io/api/operator/v1/0000_01_operator.open-cluster-management.io_clustermanagers.crd.yamlis excluded by!vendor/**vendor/open-cluster-management.io/api/operator/v1/types_clustermanager.gois excluded by!vendor/**vendor/open-cluster-management.io/api/operator/v1/zz_generated.deepcopy.gois excluded by!vendor/**vendor/open-cluster-management.io/ocm/deploy/cluster-manager/chart/cluster-manager/crds/0000_01_operator.open-cluster-management.io_clustermanagers.crd.yamlis excluded by!vendor/**
📒 Files selected for processing (4)
go.mod(5 hunks)pkg/cmd/init/cmd.go(1 hunks)pkg/cmd/init/exec.go(1 hunks)pkg/cmd/init/options.go(1 hunks)
🚧 Files skipped from review as they are similar to previous changes (2)
- go.mod
- pkg/cmd/init/options.go
🧰 Additional context used
🧠 Learnings (1)
📓 Common learnings
Learnt from: zhiweiyin318
Repo: open-cluster-management-io/clusteradm PR: 516
File: go.mod:34-34
Timestamp: 2025-11-05T15:25:15.187Z
Learning: In the clusteradm repository, the dependency upgrade of open-cluster-management.io/ocm to v1.1.1-0.20251105064423-d80ec55608e7 is intentional and required to support the gRPC registration feature being added.
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (3)
- GitHub Check: e2e-test
- GitHub Check: verify
- GitHub Check: unit-test
🔇 Additional comments (3)
pkg/cmd/init/cmd.go (1)
104-104: LGTM! Clear flag definition.The new
--grpc-endpoint-typeflag is well-defined with a sensible default value and clear documentation of supported types.pkg/cmd/init/exec.go (2)
114-120: Verify inconsistent validation between hostname and loadBalancer endpoint types.The code reveals asymmetric validation: the
hostnamecase (line 106) rejects emptygrpcServerwith an error, while theloadBalancercase (lines 114-120) accepts any value without validation.No tests exist for this code path, and the
operatorv1.LoadBalancerConfigdefinition could not be located to clarify intended behavior.Please confirm:
- Should
loadBalanceralso validate thatgrpcServeris non-empty?- Or is allowing empty values intentional (assuming dynamic IP assignment from the cloud provider)?
- What is the expected behavior when users specify
--grpc-endpoint-type loadBalancerwithout providing--grpc-server?
103-122: Verify thatoperatorv1.EndpointTypeHostnameandoperatorv1.EndpointTypeLoadBalancerconvert to "hostname" and "loadBalancer".The switch statement at line 103 compares
o.grpcEndpointType(a string from the CLI flag) againststring(operatorv1.EndpointTypeHostname)andstring(operatorv1.EndpointTypeLoadBalancer). The flag is documented to accept "hostname" and "loadBalancer" as values. Manually verify that these constants from the externalopen-cluster-management.io/api/operator/v1package (v1.1.1-0.20251112045944-3e1bb92b69e3) convert to the exact flag values expected by the switch statement.
Signed-off-by: Zhiwei Yin <[email protected]>
eb2e564 to
c600b2d
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 0
🧹 Nitpick comments (1)
pkg/cmd/init/exec.go (1)
103-123: Consider adding input validation in the validate() method.The switch statement relies on exact string matching with
operatorv1constants. While the default case correctly handles unknown values, it would be more user-friendly to validate the--grpc-endpoint-typeflag value earlier in thevalidate()method (similar to howregistrationDriversare validated at lines 192-196).Apply this diff to add early validation:
for _, driver := range o.registrationDrivers { if !validRegistrationDriver.Has(driver) { return fmt.Errorf("only csr,awsirsa and grpc are valid drivers") } } + + // Validate grpc endpoint type if grpc driver is enabled + if sets.New[string](o.registrationDrivers...).Has(operatorv1.GRPCAuthType) { + validEndpointTypes := sets.New[string](string(operatorv1.EndpointTypeHostname), string(operatorv1.EndpointTypeLoadBalancer)) + if !validEndpointTypes.Has(o.grpcEndpointType) { + return fmt.Errorf("grpc endpoint type must be either hostname or loadBalancer, got: %s", o.grpcEndpointType) + } + }This provides clearer error messages upfront rather than during execution.
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
⛔ Files ignored due to path filters (125)
go.sumis excluded by!**/*.sumvendor/cloud.google.com/go/compute/metadata/CHANGES.mdis excluded by!vendor/**vendor/cloud.google.com/go/compute/metadata/log.gois excluded by!vendor/**vendor/cloud.google.com/go/compute/metadata/metadata.gois excluded by!vendor/**vendor/cloud.google.com/go/compute/metadata/retry_linux.gois excluded by!vendor/**vendor/cloud.google.com/go/compute/metadata/syscheck.gois excluded by!vendor/**vendor/cloud.google.com/go/compute/metadata/syscheck_linux.gois excluded by!vendor/**vendor/cloud.google.com/go/compute/metadata/syscheck_windows.gois excluded by!vendor/**vendor/github.com/Masterminds/semver/v3/CHANGELOG.mdis excluded by!vendor/**vendor/github.com/Masterminds/semver/v3/README.mdis excluded by!vendor/**vendor/github.com/Masterminds/semver/v3/constraints.gois excluded by!vendor/**vendor/github.com/Masterminds/semver/v3/version.gois excluded by!vendor/**vendor/github.com/onsi/gomega/CHANGELOG.mdis excluded by!vendor/**vendor/github.com/onsi/gomega/gomega_dsl.gois excluded by!vendor/**vendor/github.com/onsi/gomega/internal/async_assertion.gois excluded by!vendor/**vendor/github.com/onsi/gomega/matchers/be_comparable_to_matcher.gois excluded by!vendor/**vendor/github.com/onsi/gomega/matchers/match_yaml_matcher.gois excluded by!vendor/**vendor/github.com/spf13/pflag/flag.gois excluded by!vendor/**vendor/github.com/spf13/pflag/golangflag.gois excluded by!vendor/**vendor/github.com/spf13/pflag/string_to_string.gois excluded by!vendor/**vendor/github.com/spf13/pflag/time.gois excluded by!vendor/**vendor/go.opentelemetry.io/otel/attribute/filter.gois excluded by!vendor/**vendor/go.opentelemetry.io/otel/attribute/internal/attribute.gois excluded by!vendor/**vendor/go.opentelemetry.io/otel/attribute/rawhelpers.gois excluded by!vendor/**vendor/go.opentelemetry.io/otel/attribute/value.gois excluded by!vendor/**vendor/go.opentelemetry.io/otel/internal/gen.gois excluded by!vendor/**vendor/go.opentelemetry.io/otel/internal/rawhelpers.gois excluded by!vendor/**vendor/go.opentelemetry.io/otel/semconv/v1.34.0/MIGRATION.mdis excluded by!vendor/**vendor/go.opentelemetry.io/otel/semconv/v1.34.0/README.mdis excluded by!vendor/**vendor/go.opentelemetry.io/otel/semconv/v1.34.0/attribute_group.gois excluded by!vendor/**vendor/go.opentelemetry.io/otel/semconv/v1.34.0/doc.gois excluded by!vendor/**vendor/go.opentelemetry.io/otel/semconv/v1.34.0/exception.gois excluded by!vendor/**vendor/go.opentelemetry.io/otel/semconv/v1.34.0/schema.gois excluded by!vendor/**vendor/go.opentelemetry.io/otel/trace/auto.gois excluded by!vendor/**vendor/go.opentelemetry.io/otel/trace/internal/telemetry/attr.gois excluded by!vendor/**vendor/go.opentelemetry.io/otel/trace/internal/telemetry/doc.gois excluded by!vendor/**vendor/go.opentelemetry.io/otel/trace/internal/telemetry/id.gois excluded by!vendor/**vendor/go.opentelemetry.io/otel/trace/internal/telemetry/number.gois excluded by!vendor/**vendor/go.opentelemetry.io/otel/trace/internal/telemetry/resource.gois excluded by!vendor/**vendor/go.opentelemetry.io/otel/trace/internal/telemetry/scope.gois excluded by!vendor/**vendor/go.opentelemetry.io/otel/trace/internal/telemetry/span.gois excluded by!vendor/**vendor/go.opentelemetry.io/otel/trace/internal/telemetry/status.gois excluded by!vendor/**vendor/go.opentelemetry.io/otel/trace/internal/telemetry/traces.gois excluded by!vendor/**vendor/go.opentelemetry.io/otel/trace/internal/telemetry/value.gois excluded by!vendor/**vendor/go.opentelemetry.io/otel/trace/noop.gois excluded by!vendor/**vendor/google.golang.org/genproto/googleapis/rpc/status/status.pb.gois excluded by!**/*.pb.go,!vendor/**vendor/google.golang.org/grpc/CONTRIBUTING.mdis excluded by!vendor/**vendor/google.golang.org/grpc/MAINTAINERS.mdis excluded by!vendor/**vendor/google.golang.org/grpc/README.mdis excluded by!vendor/**vendor/google.golang.org/grpc/balancer/balancer.gois excluded by!vendor/**vendor/google.golang.org/grpc/balancer/base/balancer.gois excluded by!vendor/**vendor/google.golang.org/grpc/balancer/endpointsharding/endpointsharding.gois excluded by!vendor/**vendor/google.golang.org/grpc/balancer/pickfirst/internal/internal.gois excluded by!vendor/**vendor/google.golang.org/grpc/balancer/pickfirst/pickfirst.gois excluded by!vendor/**vendor/google.golang.org/grpc/balancer/pickfirst/pickfirstleaf/pickfirstleaf.gois excluded by!vendor/**vendor/google.golang.org/grpc/balancer/roundrobin/roundrobin.gois excluded by!vendor/**vendor/google.golang.org/grpc/balancer/subconn.gois excluded by!vendor/**vendor/google.golang.org/grpc/balancer_wrapper.gois excluded by!vendor/**vendor/google.golang.org/grpc/binarylog/grpc_binarylog_v1/binarylog.pb.gois excluded by!**/*.pb.go,!vendor/**vendor/google.golang.org/grpc/clientconn.gois excluded by!vendor/**vendor/google.golang.org/grpc/codec.gois excluded by!vendor/**vendor/google.golang.org/grpc/credentials/credentials.gois excluded by!vendor/**vendor/google.golang.org/grpc/credentials/insecure/insecure.gois excluded by!vendor/**vendor/google.golang.org/grpc/credentials/tls.gois excluded by!vendor/**vendor/google.golang.org/grpc/dialoptions.gois excluded by!vendor/**vendor/google.golang.org/grpc/encoding/proto/proto.gois excluded by!vendor/**vendor/google.golang.org/grpc/experimental/stats/metricregistry.gois excluded by!vendor/**vendor/google.golang.org/grpc/experimental/stats/metrics.gois excluded by!vendor/**vendor/google.golang.org/grpc/grpclog/internal/loggerv2.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/backoff/backoff.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/balancer/gracefulswitch/gracefulswitch.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/buffer/unbounded.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/channelz/trace.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/credentials/credentials.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/envconfig/envconfig.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/envconfig/xds.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/grpcsync/callback_serializer.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/grpcsync/event.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/grpcsync/oncefunc.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/internal.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/metadata/metadata.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/proxyattributes/proxyattributes.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/resolver/delegatingresolver/delegatingresolver.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/resolver/dns/dns_resolver.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/status/status.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/transport/client_stream.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/transport/controlbuf.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/transport/flowcontrol.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/transport/handler_server.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/transport/http2_client.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/transport/http2_server.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/transport/http_util.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/transport/proxy.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/transport/server_stream.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/transport/transport.gois excluded by!vendor/**vendor/google.golang.org/grpc/mem/buffer_slice.gois excluded by!vendor/**vendor/google.golang.org/grpc/picker_wrapper.gois excluded by!vendor/**vendor/google.golang.org/grpc/preloader.gois excluded by!vendor/**vendor/google.golang.org/grpc/resolver/map.gois excluded by!vendor/**vendor/google.golang.org/grpc/resolver/resolver.gois excluded by!vendor/**vendor/google.golang.org/grpc/resolver_wrapper.gois excluded by!vendor/**vendor/google.golang.org/grpc/rpc_util.gois excluded by!vendor/**vendor/google.golang.org/grpc/server.gois excluded by!vendor/**vendor/google.golang.org/grpc/service_config.gois excluded by!vendor/**vendor/google.golang.org/grpc/stats/handlers.gois excluded by!vendor/**vendor/google.golang.org/grpc/stats/metrics.gois excluded by!vendor/**vendor/google.golang.org/grpc/stats/stats.gois excluded by!vendor/**vendor/google.golang.org/grpc/stream.gois excluded by!vendor/**vendor/google.golang.org/grpc/version.gois excluded by!vendor/**vendor/google.golang.org/protobuf/encoding/protowire/wire.gois excluded by!vendor/**vendor/google.golang.org/protobuf/internal/editiondefaults/editions_defaults.binpbis excluded by!vendor/**vendor/google.golang.org/protobuf/internal/filedesc/editions.gois excluded by!vendor/**vendor/google.golang.org/protobuf/internal/filedesc/presence.gois excluded by!vendor/**vendor/google.golang.org/protobuf/internal/genid/descriptor_gen.gois excluded by!vendor/**vendor/google.golang.org/protobuf/internal/impl/codec_message_opaque.gois excluded by!vendor/**vendor/google.golang.org/protobuf/internal/impl/message_opaque.gois excluded by!vendor/**vendor/google.golang.org/protobuf/internal/impl/presence.gois excluded by!vendor/**vendor/google.golang.org/protobuf/internal/version/version.gois excluded by!vendor/**vendor/google.golang.org/protobuf/reflect/protoreflect/source_gen.gois excluded by!vendor/**vendor/google.golang.org/protobuf/types/descriptorpb/descriptor.pb.gois excluded by!**/*.pb.go,!vendor/**vendor/modules.txtis excluded by!vendor/**vendor/open-cluster-management.io/api/operator/v1/0000_01_operator.open-cluster-management.io_clustermanagers.crd.yamlis excluded by!vendor/**vendor/open-cluster-management.io/api/operator/v1/types_clustermanager.gois excluded by!vendor/**vendor/open-cluster-management.io/api/operator/v1/zz_generated.deepcopy.gois excluded by!vendor/**vendor/open-cluster-management.io/ocm/deploy/cluster-manager/chart/cluster-manager/crds/0000_01_operator.open-cluster-management.io_clustermanagers.crd.yamlis excluded by!vendor/**
📒 Files selected for processing (4)
go.mod(5 hunks)pkg/cmd/init/cmd.go(1 hunks)pkg/cmd/init/exec.go(1 hunks)pkg/cmd/init/options.go(1 hunks)
🧰 Additional context used
🧠 Learnings (2)
📓 Common learnings
Learnt from: zhiweiyin318
Repo: open-cluster-management-io/clusteradm PR: 516
File: go.mod:34-34
Timestamp: 2025-11-05T15:25:15.187Z
Learning: In the clusteradm repository, the dependency upgrade of open-cluster-management.io/ocm to v1.1.1-0.20251105064423-d80ec55608e7 is intentional and required to support the gRPC registration feature being added.
📚 Learning: 2025-11-05T15:25:15.187Z
Learnt from: zhiweiyin318
Repo: open-cluster-management-io/clusteradm PR: 516
File: go.mod:34-34
Timestamp: 2025-11-05T15:25:15.187Z
Learning: In the clusteradm repository, the dependency upgrade of open-cluster-management.io/ocm to v1.1.1-0.20251105064423-d80ec55608e7 is intentional and required to support the gRPC registration feature being added.
Applied to files:
go.mod
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (3)
- GitHub Check: e2e-test
- GitHub Check: verify
- GitHub Check: unit-test
🔇 Additional comments (4)
pkg/cmd/init/options.go (1)
73-74: LGTM!The new field is well-documented and clearly describes the supported endpoint types.
pkg/cmd/init/cmd.go (1)
104-104: LGTM!The CLI flag is well-documented with clear help text describing the supported endpoint types. The default value "hostname" maintains backward compatibility.
go.mod (1)
19-19: Verified: gRPC v1.76.0 is safe for this codebase.All five breaking changes in v1.76.0 have been assessed:
- Go version (1.24 required): Already using 1.24.0 ✓
- Balancer interface: No custom balancers found ✓
- GRPC_EXPERIMENTAL_ENABLE_LEAST_REQUEST: Not used ✓
- grpc-timeout behavior: Not explicitly used ✓
- Client error handling: No direct dependencies detected; 31 test files provide coverage for runtime validation ✓
Additionally, security advisory review shows v1.76.0 has no known vulnerabilities; historical HIGH severity advisories (HTTP/2 Rapid Reset) were in older versions (1.56–1.58) and are not applicable.
pkg/cmd/init/exec.go (1)
114-120: Verify if LoadBalancerConfig.Host can be empty or requires validation.The code sets
LoadBalancer.Hosttoo.grpcServerwithout validation (line 118), unlike the hostname case which validates it's not empty (lines 105-106). ThegrpcServerflag has no default value, so it will be an empty string if--grpc-serveris not provided.The LoadBalancerConfig type comes from the external dependency
open-cluster-management.io/api/operator/v1. Without access to its definition, I cannot confirm whether:
- Empty Host is acceptable (e.g., for auto-discovery)
- Validation should be added to require
--grpc-serverfor this endpoint typeActions needed:
- Check the open-cluster-management.io/api repository for LoadBalancerConfig documentation
- Verify if the Host field allows empty values or requires validation
- If validation is required, add a check similar to lines 105-106 for the loadBalancer case
|
/assign @qiujian16 |
|
LGTM |
|
/approve |
|
[APPROVALNOTIFIER] This PR is APPROVED This pull-request has been approved by: qiujian16, zhiweiyin318 The full list of commands accepted by this bot can be found here. The pull request process is described here
Needs approval from an approver in each of these files:
Approvers can indicate their approval by writing |
d2eacbc
into
open-cluster-management-io:main
Summary
the cmd:
clusteradm init --registration-drivers="csr,grpc" --grpc-endpoint-type loadBalancer --bundle-version=latestRelated issue(s)
Fixes #
Summary by CodeRabbit
New Features
Chores