Skip to content

Grpc impl #929

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

Draft
wants to merge 5 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions cmd/registration/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import (
"open-cluster-management.io/ocm/pkg/cmd/spoke"
"open-cluster-management.io/ocm/pkg/cmd/webhook"
"open-cluster-management.io/ocm/pkg/features"
"open-cluster-management.io/ocm/pkg/server/grpc"
"open-cluster-management.io/ocm/pkg/version"
)

Expand Down Expand Up @@ -62,6 +63,7 @@ func newRegistrationCommand() *cobra.Command {
cmd.AddCommand(hub.NewRegistrationController())
cmd.AddCommand(spoke.NewRegistrationAgent())
cmd.AddCommand(webhook.NewRegistrationWebhook())
cmd.AddCommand(grpc.NewGRPCServer())

return cmd
}
8 changes: 4 additions & 4 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ require (
github.com/aws/aws-sdk-go-v2/service/eks v1.63.1
github.com/aws/aws-sdk-go-v2/service/iam v1.38.6
github.com/aws/smithy-go v1.22.2
github.com/cloudevents/sdk-go/v2 v2.15.3-0.20240911135016-682f3a9684e4
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc
github.com/evanphx/json-patch v5.9.11+incompatible
github.com/ghodss/yaml v1.0.0
Expand All @@ -25,6 +26,8 @@ require (
github.com/spf13/pflag v1.0.5
github.com/stretchr/testify v1.10.0
github.com/valyala/fasttemplate v1.2.2
golang.org/x/net v0.37.0
google.golang.org/grpc v1.67.0
gopkg.in/yaml.v2 v2.4.0
helm.sh/helm/v3 v3.17.3
k8s.io/api v0.32.3
Expand All @@ -38,7 +41,7 @@ require (
k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738
open-cluster-management.io/addon-framework v0.12.1-0.20250407131028-9d436ffc2da7
open-cluster-management.io/api v0.16.2-0.20250422072120-cadf714c3055
open-cluster-management.io/sdk-go v0.16.1-0.20250411154302-3a424961ead4
open-cluster-management.io/sdk-go v0.16.1-0.20250429023724-062f078a8395
sigs.k8s.io/cluster-inventory-api v0.0.0-20240730014211-ef0154379848
sigs.k8s.io/controller-runtime v0.20.2
sigs.k8s.io/kube-storage-version-migrator v0.0.6-0.20230721195810-5c8923c5ff96
Expand Down Expand Up @@ -74,7 +77,6 @@ require (
github.com/cespare/xxhash/v2 v2.3.0 // indirect
github.com/cloudevents/sdk-go/protocol/kafka_confluent/v2 v2.0.0-20240413090539-7fef29478991 // indirect
github.com/cloudevents/sdk-go/protocol/mqtt_paho/v2 v2.0.0-20241008145627-6bcc075b5b6c // indirect
github.com/cloudevents/sdk-go/v2 v2.15.3-0.20240911135016-682f3a9684e4 // indirect
github.com/confluentinc/confluent-kafka-go/v2 v2.3.0 // indirect
github.com/coreos/go-semver v0.3.1 // indirect
github.com/coreos/go-systemd/v22 v22.5.0 // indirect
Expand Down Expand Up @@ -154,7 +156,6 @@ require (
go.uber.org/zap v1.27.0 // indirect
golang.org/x/crypto v0.36.0 // indirect
golang.org/x/exp v0.0.0-20241217172543-b2144cdd0a67 // indirect
golang.org/x/net v0.37.0 // indirect
golang.org/x/oauth2 v0.28.0 // indirect
golang.org/x/sync v0.12.0 // indirect
golang.org/x/sys v0.32.0 // indirect
Expand All @@ -165,7 +166,6 @@ require (
gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20240826202546-f6391c0de4c7 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect
google.golang.org/grpc v1.67.0 // indirect
google.golang.org/protobuf v1.36.5 // indirect
gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect
gopkg.in/inf.v0 v0.9.1 // indirect
Expand Down
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -489,8 +489,8 @@ open-cluster-management.io/addon-framework v0.12.1-0.20250407131028-9d436ffc2da7
open-cluster-management.io/addon-framework v0.12.1-0.20250407131028-9d436ffc2da7/go.mod h1:7AEw1Sq9UEWpQGTU8zV1XPNkFRBYPbyBh8tfhISV++s=
open-cluster-management.io/api v0.16.2-0.20250422072120-cadf714c3055 h1:D2vT3nnMS/To3ptz8LLg1zfJm/pL8XIaO1g7Qbyc/5o=
open-cluster-management.io/api v0.16.2-0.20250422072120-cadf714c3055/go.mod h1:/OeqXycNBZQoe3WG6ghuWsMgsKGuMZrK8ZpsU6gWL0Y=
open-cluster-management.io/sdk-go v0.16.1-0.20250411154302-3a424961ead4 h1:PT6kDaKjDi0EaQyNzIWzYAYeK4QpBHbm+/7VPrpJEkY=
open-cluster-management.io/sdk-go v0.16.1-0.20250411154302-3a424961ead4/go.mod h1:FtOYjn5dL8e9S1gzNb8cBNsFzHJ1F3cpmCo+qrltido=
open-cluster-management.io/sdk-go v0.16.1-0.20250429023724-062f078a8395 h1:x1y0Wki8y+Q+Ytc3RbSH/IipvOtTqWkbEDTtS6zLYV8=
open-cluster-management.io/sdk-go v0.16.1-0.20250429023724-062f078a8395/go.mod h1:n89YVVoi5zm3KVpOyVMmTdD4rGOVSsykUtu7Ol3do3M=
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.0 h1:CPT0ExVicCzcpeN4baWEV2ko2Z/AsiZgEdwgcfwLgMo=
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.0/go.mod h1:Ve9uj1L+deCXFrPOk1LpFXqTg7LCFzFso6PA48q/XZw=
sigs.k8s.io/cluster-inventory-api v0.0.0-20240730014211-ef0154379848 h1:WYPi2PdQyZwZkHG648v2jQl6deyCgyjJ0fkLYgUJ618=
Expand Down
14 changes: 14 additions & 0 deletions pkg/registration/hub/manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ import (
"open-cluster-management.io/ocm/pkg/registration/register"
awsirsa "open-cluster-management.io/ocm/pkg/registration/register/aws_irsa"
"open-cluster-management.io/ocm/pkg/registration/register/csr"
"open-cluster-management.io/ocm/pkg/registration/register/grpc"
)

// HubManagerOptions holds configuration for hub manager controller
Expand All @@ -56,6 +57,8 @@ type HubManagerOptions struct {
AutoApprovedCSRUsers []string
AutoApprovedARNPatterns []string
AwsResourceTags []string
GRPCCAFile string
GRPCCAKeyFile string
}

// NewHubManagerOptions returns a HubManagerOptions
Expand Down Expand Up @@ -88,6 +91,10 @@ func (m *HubManagerOptions) AddFlags(fs *pflag.FlagSet) {
fs.StringSliceVar(&m.AutoApprovedARNPatterns, "auto-approved-arn-patterns", m.AutoApprovedARNPatterns,
"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")
fs.StringSliceVar(&m.AwsResourceTags, "aws-resource-tags", m.AwsResourceTags, "A list of tags to apply to AWS resources created through the OCM controllers")
fs.StringVar(&m.GRPCCAFile, "grpc-ca-file", m.GRPCCAFile,
"ca file to sign client cert for grpc")
fs.StringVar(&m.GRPCCAKeyFile, "grpc-key-file", m.GRPCCAKeyFile,
"ca key file to sign client cert for grpc")
m.ImportOption.AddFlags(fs)
}

Expand Down Expand Up @@ -186,6 +193,13 @@ func (m *HubManagerOptions) RunControllerManagerWithInformers(
return err
}
drivers = append(drivers, awsIRSAHubDriver)
case "grpc":
grpcHubDriver, err := grpc.NewGRPCHubDriver(
kubeClient, kubeInformers, m.GRPCCAKeyFile, m.GRPCCAFile, 720*time.Hour, controllerContext.EventRecorder)
if err != nil {
return err
}
drivers = append(drivers, grpcHubDriver)
}
}
hubDriver := register.NewAggregatedHubDriver(drivers...)
Expand Down
36 changes: 24 additions & 12 deletions pkg/registration/register/csr/csr.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,17 +9,16 @@ import (
"math/rand"
"os"
"path"
"reflect"
"strings"
"time"

"github.com/openshift/library-go/pkg/controller/factory"
"github.com/openshift/library-go/pkg/operator/events"
certificates "k8s.io/api/certificates/v1"
corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/equality"
"k8s.io/apimachinery/pkg/api/meta"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
"k8s.io/client-go/informers"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/tools/cache"
Expand Down Expand Up @@ -81,6 +80,7 @@ func (c *CSRDriver) Process(
recorder events.Recorder) (*corev1.Secret, *metav1.Condition, error) {
logger := klog.FromContext(ctx)

logger.Info("existing csr name", "csr", c.csrName)
// reconcile pending csr if exists
if len(c.csrName) > 0 {
// build a secret data map if the csr is approved
Expand Down Expand Up @@ -233,6 +233,8 @@ func (c *CSRDriver) Process(
}, err
}

logger.Info("set csr name to", "csr", createdCSRName)

c.keyData = keyData
c.csrName = createdCSRName
return nil, nil, nil
Expand Down Expand Up @@ -296,6 +298,9 @@ func (c *CSRDriver) ManagedClusterDecorator(cluster *clusterv1.ManagedCluster) *
}

func (c *CSRDriver) Fork(addonName string, secretOption register.SecretOption) register.RegisterDriver {
if len(secretOption.Signer) == 0 {
secretOption.Signer = certificates.KubeAPIServerClientSignerName
}
csrOption := &CSROption{
ObjectMeta: metav1.ObjectMeta{
GenerateName: fmt.Sprintf("addon-%s-%s-", secretOption.ClusterName, addonName),
Expand Down Expand Up @@ -349,23 +354,30 @@ func (c *CSRDriver) BuildClients(ctx context.Context, secretOption register.Secr
return nil, fmt.Errorf("failed to create CSR control: %w", err)
}

err = csrControl.Informer().AddIndexers(cache.Indexers{
err = c.SetCSRControl(csrControl, secretOption.ClusterName)
if err != nil {
return nil, fmt.Errorf("failed to set CSR control: %w", err)
}
return clients, nil
}

func (c *CSRDriver) SetCSRControl(control CSRControl, clusterName string) error {
c.csrControl = control
err := control.Informer().AddIndexers(cache.Indexers{
indexByCluster: indexByClusterFunc,
})
if err != nil {
return nil, err
return err
}

err = csrControl.Informer().AddIndexers(cache.Indexers{
err = control.Informer().AddIndexers(cache.Indexers{
indexByAddon: indexByAddonFunc,
})
if err != nil {
utilruntime.HandleError(err)
return err
}

c.csrControl = csrControl
c.haltCSRCreation = haltCSRCreationFunc(csrControl.Informer().GetIndexer(), secretOption.ClusterName)
return clients, nil
c.haltCSRCreation = haltCSRCreationFunc(control.Informer().GetIndexer(), clusterName)
return nil
}

var _ register.RegisterDriver = &CSRDriver{}
Expand Down Expand Up @@ -447,7 +459,7 @@ func shouldCreateCSR(

// b.client certificate is sensitive to the additional secret data and the data changes
if err := hasAdditionalSecretData(additionalSecretData, secret); err != nil {
recorder.Eventf("AdditonalSecretDataChanged", "The additional secret data is changed for %v. Re-create the client certificate for %s", err, controllerName)
recorder.Eventf("AdditionalSecretDataChanged", "The additional secret data is changed for %v. Re-create the client certificate for %s", err, controllerName)
return true, nil
}

Expand Down Expand Up @@ -481,7 +493,7 @@ func hasAdditionalSecretData(additionalSecretData map[string][]byte, secret *cor
return fmt.Errorf("key %q not found in secret %q", k, secret.Namespace+"/"+secret.Name)
}

if !reflect.DeepEqual(v, value) {
if !equality.Semantic.DeepEqual(v, value) {
return fmt.Errorf("key %q in secret %q does not match the expected value",
k, secret.Namespace+"/"+secret.Name)
}
Expand Down
8 changes: 8 additions & 0 deletions pkg/registration/register/factory/options.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,18 +7,21 @@ import (
"open-cluster-management.io/ocm/pkg/registration/register"
awsirsa "open-cluster-management.io/ocm/pkg/registration/register/aws_irsa"
"open-cluster-management.io/ocm/pkg/registration/register/csr"
"open-cluster-management.io/ocm/pkg/registration/register/grpc"
)

type Options struct {
RegistrationAuth string
CSROption *csr.Option
AWSISRAOption *awsirsa.AWSOption
GRPCOption *grpc.Option
}

func NewOptions() *Options {
return &Options{
CSROption: csr.NewCSROption(),
AWSISRAOption: awsirsa.NewAWSOption(),
GRPCOption: grpc.NewOptions(),
}
}

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

func (s *Options) Validate() error {
switch s.RegistrationAuth {
case helpers.AwsIrsaAuthType:
return s.AWSISRAOption.Validate()
case "grpc":
return s.GRPCOption.Validate()
default:
return s.CSROption.Validate()
}
Expand All @@ -42,6 +48,8 @@ func (s *Options) Driver(secretOption register.SecretOption) (register.RegisterD
switch s.RegistrationAuth {
case helpers.AwsIrsaAuthType:
return awsirsa.NewAWSIRSADriver(s.AWSISRAOption, secretOption), nil
case "grpc":
return grpc.NewGRPCDriver(s.GRPCOption, s.CSROption, secretOption)
default:
return csr.NewCSRDriver(s.CSROption, secretOption)
}
Expand Down
Loading
Loading