Skip to content

Commit 7d83277

Browse files
committed
Implement grpc
Signed-off-by: Jian Qiu <[email protected]>
1 parent f9139f1 commit 7d83277

36 files changed

+2777
-24
lines changed

cmd/registration/main.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import (
1717
"open-cluster-management.io/ocm/pkg/cmd/spoke"
1818
"open-cluster-management.io/ocm/pkg/cmd/webhook"
1919
"open-cluster-management.io/ocm/pkg/features"
20+
"open-cluster-management.io/ocm/pkg/server/grpc"
2021
"open-cluster-management.io/ocm/pkg/version"
2122
)
2223

@@ -62,6 +63,7 @@ func newRegistrationCommand() *cobra.Command {
6263
cmd.AddCommand(hub.NewRegistrationController())
6364
cmd.AddCommand(spoke.NewRegistrationAgent())
6465
cmd.AddCommand(webhook.NewRegistrationWebhook())
66+
cmd.AddCommand(grpc.NewGRPCServer())
6567

6668
return cmd
6769
}

go.mod

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ require (
88
github.com/aws/aws-sdk-go-v2/service/eks v1.57.1
99
github.com/aws/aws-sdk-go-v2/service/iam v1.38.6
1010
github.com/aws/smithy-go v1.22.2
11+
github.com/cloudevents/sdk-go/v2 v2.15.3-0.20240911135016-682f3a9684e4
1112
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc
1213
github.com/evanphx/json-patch v5.9.0+incompatible
1314
github.com/ghodss/yaml v1.0.0
@@ -24,6 +25,8 @@ require (
2425
github.com/spf13/pflag v1.0.5
2526
github.com/stretchr/testify v1.10.0
2627
github.com/valyala/fasttemplate v1.2.2
28+
golang.org/x/net v0.34.0
29+
google.golang.org/grpc v1.67.0
2730
gopkg.in/yaml.v2 v2.4.0
2831
helm.sh/helm/v3 v3.16.3
2932
k8s.io/api v0.31.4
@@ -44,6 +47,8 @@ require (
4447
sigs.k8s.io/yaml v1.4.0
4548
)
4649

50+
replace open-cluster-management.io/sdk-go => github.com/qiujian16/sdk-go v0.0.0-20250401062857-2c1e3b8c9c6b
51+
4752
require (
4853
cloud.google.com/go/compute/metadata v0.5.0 // indirect
4954
dario.cat/mergo v1.0.1 // indirect
@@ -72,7 +77,6 @@ require (
7277
github.com/cespare/xxhash/v2 v2.3.0 // indirect
7378
github.com/cloudevents/sdk-go/protocol/kafka_confluent/v2 v2.0.0-20240413090539-7fef29478991 // indirect
7479
github.com/cloudevents/sdk-go/protocol/mqtt_paho/v2 v2.0.0-20241008145627-6bcc075b5b6c // indirect
75-
github.com/cloudevents/sdk-go/v2 v2.15.3-0.20240911135016-682f3a9684e4 // indirect
7680
github.com/confluentinc/confluent-kafka-go/v2 v2.3.0 // indirect
7781
github.com/coreos/go-semver v0.3.1 // indirect
7882
github.com/coreos/go-systemd/v22 v22.5.0 // indirect
@@ -156,7 +160,6 @@ require (
156160
go.uber.org/zap v1.27.0 // indirect
157161
golang.org/x/crypto v0.32.0 // indirect
158162
golang.org/x/exp v0.0.0-20241217172543-b2144cdd0a67 // indirect
159-
golang.org/x/net v0.34.0 // indirect
160163
golang.org/x/oauth2 v0.22.0 // indirect
161164
golang.org/x/sync v0.10.0 // indirect
162165
golang.org/x/sys v0.29.0 // indirect
@@ -168,7 +171,6 @@ require (
168171
google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80 // indirect
169172
google.golang.org/genproto/googleapis/api v0.0.0-20240814211410-ddb44dafa142 // indirect
170173
google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect
171-
google.golang.org/grpc v1.67.0 // indirect
172174
google.golang.org/protobuf v1.35.1 // indirect
173175
gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect
174176
gopkg.in/inf.v0 v0.9.1 // indirect

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,8 @@ github.com/prometheus/common v0.55.0 h1:KEi6DK7lXW/m7Ig5i47x0vRzuBsHuvJdi5ee6Y3G
291291
github.com/prometheus/common v0.55.0/go.mod h1:2SECS4xJG1kd8XF9IcM1gMX6510RAEL65zxzNImwdc8=
292292
github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc=
293293
github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk=
294+
github.com/qiujian16/sdk-go v0.0.0-20250401062857-2c1e3b8c9c6b h1:jpIFO9RkBWKhIGXHdPCW5bmJTyVVLlw8yYnT+CrubAE=
295+
github.com/qiujian16/sdk-go v0.0.0-20250401062857-2c1e3b8c9c6b/go.mod h1:TyOjZC5YxyM5BRNgwTmLuTbHXX6xXqzYBXllrfoVp9w=
294296
github.com/robfig/cron v1.2.0 h1:ZjScXvvxeQ63Dbyxy76Fj3AT3Ut0aKsyd2/tl3DTMuQ=
295297
github.com/robfig/cron v1.2.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k=
296298
github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=
@@ -491,8 +493,6 @@ open-cluster-management.io/addon-framework v0.12.0 h1:5j7mpyk2ij0SLUZkwWk0KkNTWt
491493
open-cluster-management.io/addon-framework v0.12.0/go.mod h1:eReMWXrEHqtilwz5wzEpUrWw9Vfz0HJCH9pi3gOTZns=
492494
open-cluster-management.io/api v0.16.1 h1:mS+4UGxHLPQd7CRM0gdFQdVaz139Lo2bkLfqSE0CDNU=
493495
open-cluster-management.io/api v0.16.1/go.mod h1:9erZEWEn4bEqh0nIX2wA7f/s3KCuFycQdBrPrRzi0QM=
494-
open-cluster-management.io/sdk-go v0.16.1-0.20250327091909-6bd6228a47ad h1:37f9TEwX/U8esBjSJvPleDM3rcFpk9NY5e2ItjO6PcQ=
495-
open-cluster-management.io/sdk-go v0.16.1-0.20250327091909-6bd6228a47ad/go.mod h1:TyOjZC5YxyM5BRNgwTmLuTbHXX6xXqzYBXllrfoVp9w=
496496
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.30.3 h1:2770sDpzrjjsAtVhSeUFseziht227YAWYHLGNM8QPwY=
497497
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.30.3/go.mod h1:Ve9uj1L+deCXFrPOk1LpFXqTg7LCFzFso6PA48q/XZw=
498498
sigs.k8s.io/cluster-inventory-api v0.0.0-20240730014211-ef0154379848 h1:WYPi2PdQyZwZkHG648v2jQl6deyCgyjJ0fkLYgUJ618=

pkg/registration/hub/manager.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ import (
4444
"open-cluster-management.io/ocm/pkg/registration/register"
4545
awsirsa "open-cluster-management.io/ocm/pkg/registration/register/aws_irsa"
4646
"open-cluster-management.io/ocm/pkg/registration/register/csr"
47+
"open-cluster-management.io/ocm/pkg/registration/register/grpc"
4748
)
4849

4950
// HubManagerOptions holds configuration for hub manager controller
@@ -56,6 +57,8 @@ type HubManagerOptions struct {
5657
AutoApprovedCSRUsers []string
5758
AutoApprovedARNPatterns []string
5859
AwsResourceTags []string
60+
GRPCCAFile string
61+
GRPCCAKeyFile string
5962
}
6063

6164
// NewHubManagerOptions returns a HubManagerOptions
@@ -88,6 +91,10 @@ func (m *HubManagerOptions) AddFlags(fs *pflag.FlagSet) {
8891
fs.StringSliceVar(&m.AutoApprovedARNPatterns, "auto-approved-arn-patterns", m.AutoApprovedARNPatterns,
8992
"A list of AWS EKS ARN patterns such that an EKS cluster will be auto approved if its ARN matches with any of the patterns")
9093
fs.StringSliceVar(&m.AwsResourceTags, "aws-resource-tags", m.AwsResourceTags, "A list of tags to apply to AWS resources created through the OCM controllers")
94+
fs.StringVar(&m.GRPCCAFile, "grpc-ca-file", m.GRPCCAFile,
95+
"ca file to sign client cert for grpc")
96+
fs.StringVar(&m.GRPCCAKeyFile, "grpc-key-file", m.GRPCCAKeyFile,
97+
"ca key file to sign client cert for grpc")
9198
m.ImportOption.AddFlags(fs)
9299
}
93100

@@ -186,6 +193,13 @@ func (m *HubManagerOptions) RunControllerManagerWithInformers(
186193
return err
187194
}
188195
drivers = append(drivers, awsIRSAHubDriver)
196+
case "grpc":
197+
grpcHubDriver, err := grpc.NewGRPCHubDriver(
198+
kubeClient, kubeInformers, m.GRPCCAKeyFile, m.GRPCCAFile, 720*time.Hour, controllerContext.EventRecorder)
199+
if err != nil {
200+
return err
201+
}
202+
drivers = append(drivers, grpcHubDriver)
189203
}
190204
}
191205
hubDriver := register.NewAggregatedHubDriver(drivers...)

pkg/registration/register/csr/certificate.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ import (
3333
// isCertificateValid return true if
3434
// 1) All certs in client certificate are not expired.
3535
// 2) At least one cert matches the given subject if specified
36-
func isCertificateValid(logger klog.Logger, certData []byte, subject *pkix.Name) (bool, error) {
36+
func IsCertificateValid(logger klog.Logger, certData []byte, subject *pkix.Name) (bool, error) {
3737
certs, err := certutil.ParseCertsPEM(certData)
3838
if err != nil {
3939
return false, fmt.Errorf("unable to parse certificate: %v", err)

pkg/registration/register/csr/certificate_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ func TestIsCertificateValid(t *testing.T) {
147147
for _, c := range cases {
148148
t.Run(c.name, func(t *testing.T) {
149149
logger, _ := ktesting.NewTestContext(t)
150-
isValid, _ := isCertificateValid(logger, c.testCert.Cert, c.subject)
150+
isValid, _ := IsCertificateValid(logger, c.testCert.Cert, c.subject)
151151
if isValid != c.isValid {
152152
t.Errorf("expected %t, but got %t", c.isValid, isValid)
153153
}

pkg/registration/register/csr/csr.go

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ import (
1818
corev1 "k8s.io/api/core/v1"
1919
"k8s.io/apimachinery/pkg/api/meta"
2020
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
21-
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
2221
"k8s.io/client-go/informers"
2322
"k8s.io/client-go/kubernetes"
2423
"k8s.io/client-go/tools/cache"
@@ -287,7 +286,7 @@ func (c *CSRDriver) IsHubKubeConfigValid(ctx context.Context, secretOption regis
287286
}
288287
}
289288

290-
return isCertificateValid(logger, certData, nil)
289+
return IsCertificateValid(logger, certData, nil)
291290
}
292291

293292
func (c *CSRDriver) ManagedClusterDecorator(cluster *clusterv1.ManagedCluster) *clusterv1.ManagedCluster {
@@ -348,23 +347,30 @@ func (c *CSRDriver) BuildClients(ctx context.Context, secretOption register.Secr
348347
return nil, fmt.Errorf("failed to create CSR control: %w", err)
349348
}
350349

351-
err = csrControl.Informer().AddIndexers(cache.Indexers{
350+
err = c.SetCSRControl(csrControl, secretOption.ClusterName)
351+
if err != nil {
352+
return nil, fmt.Errorf("failed to set CSR control: %w", err)
353+
}
354+
return clients, nil
355+
}
356+
357+
func (c *CSRDriver) SetCSRControl(control CSRControl, clusterName string) error {
358+
c.csrControl = control
359+
err := control.Informer().AddIndexers(cache.Indexers{
352360
indexByCluster: indexByClusterFunc,
353361
})
354362
if err != nil {
355-
return nil, err
363+
return err
356364
}
357365

358-
err = csrControl.Informer().AddIndexers(cache.Indexers{
366+
err = control.Informer().AddIndexers(cache.Indexers{
359367
indexByAddon: indexByAddonFunc,
360368
})
361369
if err != nil {
362-
utilruntime.HandleError(err)
370+
return err
363371
}
364-
365-
c.csrControl = csrControl
366-
c.haltCSRCreation = haltCSRCreationFunc(csrControl.Informer().GetIndexer(), secretOption.ClusterName)
367-
return clients, nil
372+
c.haltCSRCreation = haltCSRCreationFunc(control.Informer().GetIndexer(), clusterName)
373+
return nil
368374
}
369375

370376
var _ register.RegisterDriver = &CSRDriver{}
@@ -424,7 +430,7 @@ func shouldCreateCSR(
424430
additionalSecretData map[string][]byte) (bool, error) {
425431
// create a csr to request new client certificate if
426432
// a.there is no valid client certificate issued for the current cluster/agent
427-
valid, err := isCertificateValid(logger, secret.Data[TLSCertFile], subject)
433+
valid, err := IsCertificateValid(logger, secret.Data[TLSCertFile], subject)
428434
if err != nil {
429435
recorder.Eventf("CertificateValidationFailed", "Failed to validate client certificate for %s: %v", controllerName, err)
430436
return true, nil

pkg/registration/register/csr/csr_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ func TestProcess(t *testing.T) {
7575
validateActions: func(t *testing.T, hubActions []clienttesting.Action, secret *corev1.Secret) {
7676
logger, _ := ktesting.NewTestContext(t)
7777
testingcommon.AssertActions(t, hubActions, "get", "get")
78-
valid, err := isCertificateValid(logger, secret.Data[TLSCertFile], testSubject)
78+
valid, err := IsCertificateValid(logger, secret.Data[TLSCertFile], testSubject)
7979
if err != nil {
8080
t.Errorf("unexpected error: %v", err)
8181
}

pkg/registration/register/factory/options.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,21 @@ import (
77
"open-cluster-management.io/ocm/pkg/registration/register"
88
awsirsa "open-cluster-management.io/ocm/pkg/registration/register/aws_irsa"
99
"open-cluster-management.io/ocm/pkg/registration/register/csr"
10+
"open-cluster-management.io/ocm/pkg/registration/register/grpc"
1011
)
1112

1213
type Options struct {
1314
RegistrationAuth string
1415
CSROption *csr.Option
1516
AWSISRAOption *awsirsa.AWSOption
17+
GRPCOption *grpc.Option
1618
}
1719

1820
func NewOptions() *Options {
1921
return &Options{
2022
CSROption: csr.NewCSROption(),
2123
AWSISRAOption: awsirsa.NewAWSOption(),
24+
GRPCOption: grpc.NewOptions(),
2225
}
2326
}
2427

@@ -27,12 +30,15 @@ func (s *Options) AddFlags(fs *pflag.FlagSet) {
2730
"The type of authentication to use to authenticate with hub.")
2831
s.CSROption.AddFlags(fs)
2932
s.AWSISRAOption.AddFlags(fs)
33+
s.GRPCOption.AddFlags(fs)
3034
}
3135

3236
func (s *Options) Validate() error {
3337
switch s.RegistrationAuth {
3438
case helpers.AwsIrsaAuthType:
3539
return s.AWSISRAOption.Validate()
40+
case "grpc":
41+
return s.GRPCOption.Validate()
3642
default:
3743
return s.CSROption.Validate()
3844
}
@@ -42,6 +48,8 @@ func (s *Options) Driver(secretOption register.SecretOption) register.RegisterDr
4248
switch s.RegistrationAuth {
4349
case helpers.AwsIrsaAuthType:
4450
return awsirsa.NewAWSIRSADriver(s.AWSISRAOption, secretOption)
51+
case "grpc":
52+
return grpc.NewGRPCDriver(s.GRPCOption, s.CSROption, secretOption)
4553
default:
4654
return csr.NewCSRDriver(s.CSROption, secretOption)
4755
}

0 commit comments

Comments
 (0)