@@ -36,8 +36,8 @@ import (
3636 clusterv1 "open-cluster-management.io/api/cluster/v1"
3737 ocmfeature "open-cluster-management.io/api/feature"
3838 operatorv1 "open-cluster-management.io/api/operator/v1"
39-
4039 "open-cluster-management.io/clusteradm/pkg/cmd/join/preflight"
40+ "open-cluster-management.io/clusteradm/pkg/config"
4141 genericclioptionsclusteradm "open-cluster-management.io/clusteradm/pkg/genericclioptions"
4242 "open-cluster-management.io/clusteradm/pkg/helpers"
4343 "open-cluster-management.io/clusteradm/pkg/helpers/klusterlet"
@@ -48,13 +48,14 @@ import (
4848 "open-cluster-management.io/clusteradm/pkg/helpers/wait"
4949 "open-cluster-management.io/clusteradm/pkg/version"
5050 "open-cluster-management.io/ocm/pkg/operator/helpers/chart"
51+ "open-cluster-management.io/sdk-go/pkg/cloudevents/generic/options/cert"
52+ sdkgrpc "open-cluster-management.io/sdk-go/pkg/cloudevents/generic/options/grpc"
5153 sdkhelpers "open-cluster-management.io/sdk-go/pkg/helpers"
5254)
5355
5456const (
55- AgentNamespacePrefix = "open-cluster-management-"
56-
57- OperatorNamesapce = "open-cluster-management"
57+ AgentNamespacePrefix = "open-cluster-management-"
58+ OperatorNamespace = "open-cluster-management"
5859 DefaultOperatorName = "klusterlet"
5960 AwsIrsaAuthentication = "awsirsa"
6061)
@@ -191,7 +192,7 @@ func (o *Options) complete(cmd *cobra.Command, args []string) (err error) {
191192 if err != nil {
192193 return err
193194 }
194- o .HubCADate = cabytes
195+ o .HubCAData = cabytes
195196 }
196197
197198 // code logic of building hub client in join process:
@@ -212,6 +213,12 @@ func (o *Options) complete(cmd *cobra.Command, args []string) (err error) {
212213 return err
213214 }
214215
216+ if o .grpcServer != "" {
217+ if err = o .getGRPCCAData (externalClientUnSecure ); err != nil {
218+ return err
219+ }
220+ }
221+
215222 // get managed cluster externalServerURL
216223 var kubeClient * kubernetes.Clientset
217224 switch o .mode {
@@ -284,6 +291,11 @@ func (o *Options) validate() error {
284291 return err
285292 }
286293
294+ err = o .setGRPCConfig ()
295+ if err != nil {
296+ return err
297+ }
298+
287299 // get ManagedKubeconfig from given file
288300 if o .mode == string (operatorv1 .InstallModeHosted ) {
289301 managedConfig , err := os .ReadFile (o .managedKubeconfigFile )
@@ -323,6 +335,10 @@ func (o *Options) validate() error {
323335 return err
324336 }
325337
338+ if o .grpcServer != "" && o .registrationAuth == AwsIrsaAuthentication {
339+ return gherrors .New ("cannot use both --grpc-server and --registration-auth=awsirsa; choose one registration method" )
340+ }
341+
326342 if (o .registrationAuth == AwsIrsaAuthentication ) && (o .hubClusterArn == "" ) {
327343 return gherrors .New ("hubClusterArn cannot be empty if registrationAuth type is awsirsa" )
328344 }
@@ -395,7 +411,7 @@ func (o *Options) applyKlusterlet(r *reader.ResourceReader, operatorClient opera
395411 o .klusterletChartConfig .NoOperator = true
396412 }
397413
398- crds , raw , err := chart .RenderKlusterletChart (o .klusterletChartConfig , OperatorNamesapce )
414+ crds , raw , err := chart .RenderKlusterletChart (o .klusterletChartConfig , OperatorNamespace )
399415 if err != nil {
400416 return err
401417 }
@@ -457,7 +473,7 @@ func checkIfRegistrationOperatorAvailable(f util.Factory) (bool, error) {
457473 return false , err
458474 }
459475
460- deploy , err := client .AppsV1 ().Deployments (OperatorNamesapce ).
476+ deploy , err := client .AppsV1 ().Deployments (OperatorNamespace ).
461477 Get (context .TODO (), DefaultOperatorName , metav1.GetOptions {})
462478 if err != nil {
463479 if errors .IsNotFound (err ) {
@@ -550,7 +566,7 @@ func waitUntilRegistrationOperatorConditionIsTrue(w io.Writer, f util.Factory, t
550566
551567 return helpers .WatchUntil (
552568 func () (watch.Interface , error ) {
553- return client .CoreV1 ().Pods (OperatorNamesapce ).
569+ return client .CoreV1 ().Pods (OperatorNamespace ).
554570 Watch (context .TODO (), metav1.ListOptions {
555571 TimeoutSeconds : & timeout ,
556572 LabelSelector : "app=klusterlet" ,
@@ -664,9 +680,9 @@ func (o *Options) createClientcmdapiv1Config(externalClientUnSecure *kubernetes.
664680 bootstrapConfig := bootstrapExternalConfigUnSecure .DeepCopy ()
665681 bootstrapConfig .Clusters [0 ].Cluster .InsecureSkipTLSVerify = false
666682 bootstrapConfig .Clusters [0 ].Cluster .Server = o .hubAPIServer
667- if o .HubCADate != nil {
683+ if o .HubCAData != nil {
668684 // directly set ca-data if --ca-file is set
669- bootstrapConfig .Clusters [0 ].Cluster .CertificateAuthorityData = o .HubCADate
685+ bootstrapConfig .Clusters [0 ].Cluster .CertificateAuthorityData = o .HubCAData
670686 } else {
671687 // get ca data from externalClientUnsecure, ca may empty(cluster-info exists with no ca data)
672688 ca , err := sdkhelpers .GetCACert (externalClientUnSecure )
@@ -713,6 +729,54 @@ func (o *Options) setKubeconfig() error {
713729 return nil
714730}
715731
732+ func (o * Options ) setGRPCConfig () error {
733+ if o .grpcServer == "" {
734+ return nil
735+ }
736+
737+ gRPCConfig := sdkgrpc.GRPCConfig {
738+ CertConfig : cert.CertConfig {
739+ CAData : cert .Bytes (o .grpcCAData ),
740+ },
741+ URL : o .grpcServer ,
742+ Token : o .token ,
743+ }
744+
745+ configStr , err := yaml .Marshal (gRPCConfig )
746+ if err != nil {
747+ return fmt .Errorf ("failed to marshal GRPC server configuration. %v" , err )
748+ }
749+
750+ o .klusterletChartConfig .GRPCConfig = string (configStr )
751+ o .klusterletChartConfig .Klusterlet .RegistrationConfiguration .RegistrationDriver = operatorv1.RegistrationDriver {
752+ AuthType : operatorv1 .GRPCAuthType ,
753+ }
754+ return nil
755+ }
756+
757+ func (o * Options ) getGRPCCAData (kubeClient kubernetes.Interface ) error {
758+ if o .grpcCAFile != "" {
759+ caData , err := os .ReadFile (o .grpcCAFile )
760+ if err != nil {
761+ return fmt .Errorf ("--grpc-ca-file %q read failed: %w" , o .grpcCAFile , err )
762+ }
763+ if len (caData ) == 0 {
764+ return fmt .Errorf ("--grpc-ca-file %q is empty" , o .grpcCAFile )
765+ }
766+ o .grpcCAData = caData
767+ return nil
768+ }
769+
770+ cm , err := kubeClient .CoreV1 ().ConfigMaps (config .HubClusterNamespace ).Get (context .TODO (),
771+ config .CABundleConfigMap , metav1.GetOptions {})
772+ if err != nil {
773+ return fmt .Errorf ("failed to get CA bundle configmap for gRPC server: %w" , err )
774+ }
775+
776+ o .grpcCAData = []byte (cm .Data ["ca-bundle.crt" ])
777+ return nil
778+ }
779+
716780func mergeCertificateData (caBundles ... []byte ) ([]byte , error ) {
717781 var all []* x509.Certificate
718782 for _ , caBundle := range caBundles {
0 commit comments