Skip to content

Commit

Permalink
Merge pull request #10 from itdove/client-factory
Browse files Browse the repository at this point in the history
Remove controller-runtime
  • Loading branch information
openshift-merge-robot authored Jun 4, 2021
2 parents ea3a619 + a4f1a95 commit d6a8ab1
Show file tree
Hide file tree
Showing 9 changed files with 40 additions and 116 deletions.
8 changes: 5 additions & 3 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -55,13 +55,15 @@ clusteradm <verb> [<noun>]

## Client

- The [helpers](pkg/helpers/client.go) package contains methods to get a client. For the time being only a `sigs.k8s.io/controller-runtime/pkg/client` is used as it is the one needed for the applier, but if you would like to use another client for other goals, please add the method to create client in that package. The most important to to get the config from:
- The [main](cmd/clusteradm.go) provides a cmdutil.Factory which can be laverage to get different clients and also the *rest.Config. The factory can be passed to the cobra.Command and then save in the Options.

```Go
config, err := configFlags.ToRESTConfig()
kubeClient, err := o.factory.KubernetesClientSet()
```

as it uses also the parameters like `--server` or `--kubeconfig` to generate the client.
```Go
config, err := f.ToRESTConfig()
```

## Unit tests

Expand Down
3 changes: 2 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@ export GOPACKAGES = $(shell go list ./... | grep -v /vendor | grep -v /build |

.PHONY: clean
clean: clean-test
kind delete cluster --name ${PROJECT_NAME}-functional-test
kind delete cluster --name ${PROJECT_NAME}-functional-test-hub
kind delete cluster --name ${PROJECT_NAME}-functional-test-spoke

.PHONY: deps
deps:
Expand Down
8 changes: 7 additions & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,16 @@ require (
github.com/Masterminds/semver v1.5.0 // indirect
github.com/Masterminds/sprig v2.22.0+incompatible
github.com/ghodss/yaml v1.0.0
github.com/googleapis/gnostic v0.5.1 // indirect
github.com/hashicorp/golang-lru v0.5.4 // indirect
github.com/huandu/xstrings v1.3.2 // indirect
github.com/imdario/mergo v0.3.10 // indirect
github.com/mitchellh/copystructure v1.2.0 // indirect
github.com/onsi/ginkgo v1.14.1 // indirect
github.com/onsi/gomega v1.10.2 // indirect
github.com/openshift/library-go v0.0.0-20210521084623-7392ea9b02ca
github.com/spf13/cobra v1.1.3
google.golang.org/appengine v1.6.6 // indirect
k8s.io/api v0.21.1
k8s.io/apiextensions-apiserver v0.21.1
k8s.io/apimachinery v0.21.1
Expand All @@ -24,6 +30,6 @@ require (
k8s.io/component-base v0.21.1
k8s.io/klog v1.0.0
k8s.io/kubectl v0.21.0
k8s.io/utils v0.0.0-20210111153108-fddb29f9d009 // indirect
open-cluster-management.io/api v0.0.0-20210519100835-bb9d4652f920
sigs.k8s.io/controller-runtime v0.8.3
)
43 changes: 0 additions & 43 deletions go.sum

Large diffs are not rendered by default.

52 changes: 22 additions & 30 deletions pkg/cmd/accept/exec.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,12 @@ import (

corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/labels"
"k8s.io/client-go/kubernetes"
"open-cluster-management.io/clusteradm/pkg/helpers"

crclient "sigs.k8s.io/controller-runtime/pkg/client"

"github.com/spf13/cobra"
certificatesv1 "k8s.io/api/certificates/v1"
clusterclientset "open-cluster-management.io/api/client/cluster/clientset/versioned"
)

const (
Expand Down Expand Up @@ -48,24 +46,27 @@ func (o *Options) validate() error {
}

func (o *Options) run() error {
client, err := helpers.GetControllerRuntimeClientFromFlags(o.ConfigFlags)
kubeClient, err := o.factory.KubernetesClientSet()
if err != nil {
return err
}
restConfig, err := o.factory.ToRESTConfig()
if err != nil {
return err
}
return o.runWithClient(client)
clusterClient, err := clusterclientset.NewForConfig(restConfig)
if err != nil {
return err
}
return o.runWithClient(kubeClient, clusterClient)
}

func (o *Options) runWithClient(client crclient.Client) error {
func (o *Options) runWithClient(kubeClient *kubernetes.Clientset, clusterClient *clusterclientset.Clientset) error {
for _, clusterName := range o.values.clusters {

csrs := &certificatesv1.CertificateSigningRequestList{}
ls := labels.SelectorFromSet(labels.Set{
clusterLabel: clusterName,
})
err := client.List(context.TODO(),
csrs,
&crclient.ListOptions{
LabelSelector: ls,
csrs, err := kubeClient.CertificatesV1().CertificateSigningRequests().List(context.TODO(),
metav1.ListOptions{
LabelSelector: fmt.Sprintf("%v = %v", clusterLabel, clusterName),
})
if err != nil {
return err
Expand Down Expand Up @@ -130,24 +131,15 @@ func (o *Options) runWithClient(client crclient.Client) error {
fmt.Printf("no CSR to approve for cluster %s\n", clusterName)
}

mc := &unstructured.Unstructured{}
mc.SetKind("ManagedCluster")
mc.SetAPIVersion("cluster.open-cluster-management.io/v1")
err = client.Get(context.TODO(),
crclient.ObjectKey{
Name: clusterName,
},
mc)
mc, err := clusterClient.ClusterV1().ManagedClusters().Get(context.TODO(),
clusterName,
metav1.GetOptions{})
if err != nil {
return err
}
spec := mc.Object["spec"].(map[string]interface{})
hubAcceptsClient, ok := spec["hubAcceptsClient"]
if !ok || !hubAcceptsClient.(bool) {
patch := crclient.MergeFrom(mc.DeepCopyObject())
spec["hubAcceptsClient"] = true

err = client.Patch(context.TODO(), mc, patch)
if !mc.Spec.HubAcceptsClient {
mc.Spec.HubAcceptsClient = true
_, err = clusterClient.ClusterV1().ManagedClusters().Update(context.TODO(), mc, metav1.UpdateOptions{})
if err != nil {
return err
}
Expand Down
2 changes: 0 additions & 2 deletions pkg/cmd/join/exec.go
Original file line number Diff line number Diff line change
Expand Up @@ -174,7 +174,6 @@ func (o *Options) createKubeConfig(externalClientUnSecure *kubernetes.Clientset,
bootstrapExternalConfigUnSecure clientcmdapiv1.Config) (string, error) {
ca, err := helpers.GetCACert(externalClientUnSecure)
if err != nil {
fmt.Printf("Failed to get CA")
return "", err
}

Expand All @@ -183,7 +182,6 @@ func (o *Options) createKubeConfig(externalClientUnSecure *kubernetes.Clientset,
if errors.IsNotFound(err) {
hubAPIServerInternal = o.hubAPIServer
} else {
fmt.Printf("Failed to GetAPIServer")
return "", err
}
}
Expand Down
11 changes: 0 additions & 11 deletions pkg/cmd/version/exec.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,8 @@ package version
import (
"fmt"

crclient "sigs.k8s.io/controller-runtime/pkg/client"

"github.com/spf13/cobra"
clusteradm "open-cluster-management.io/clusteradm"
"open-cluster-management.io/clusteradm/pkg/helpers"
)

func (o *Options) complete(cmd *cobra.Command, args []string) (err error) {
Expand All @@ -20,14 +17,6 @@ func (o *Options) validate() error {
}
func (o *Options) run() (err error) {
fmt.Printf("client\t\tversion\t:%s\n", clusteradm.GetVersion())
client, err := helpers.GetControllerRuntimeClientFromFlags(o.ConfigFlags)
if err != nil {
return err
}
return o.runWithClient(client)
}

func (o *Options) runWithClient(client crclient.Client) (err error) {
discoveryClient, err := o.factory.ToDiscoveryClient()
if err != nil {
return err
Expand Down
13 changes: 4 additions & 9 deletions pkg/helpers/apply.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ func ApplyDeployment(
genericScheme.AddKnownTypes(appsv1.SchemeGroupVersion, &appsv1.Deployment{})
recorder := events.NewInMemoryRecorder(GetExampleHeader())
for _, name := range files {
deploymentBytes, err := mustTempalteAsset(name, templateName, reader, values)
deploymentBytes, err := MustTempalteAsset(name, templateName, reader, values)
if err != nil {
return err
}
Expand All @@ -68,7 +68,7 @@ func ApplyDirectly(clients *resourceapply.ClientHolder,
files ...string) error {
recorder := events.NewInMemoryRecorder(GetExampleHeader())
resourceResults := resourceapply.ApplyDirectly(clients, recorder, func(name string) ([]byte, error) {
return mustTempalteAsset(name, templateName, reader, values)
return MustTempalteAsset(name, templateName, reader, values)
}, files...)
for _, result := range resourceResults {
if result.Error != nil {
Expand All @@ -85,7 +85,7 @@ func ApplyCustomResouces(client dynamic.Interface,
values interface{},
files ...string) error {
for _, name := range files {
asset, err := mustTempalteAsset(name, templateName, reader, values)
asset, err := MustTempalteAsset(name, templateName, reader, values)
if err != nil {
return err
}
Expand All @@ -103,11 +103,6 @@ func ApplyCustomResouces(client dynamic.Interface,
if err != nil {
return err
}
// resource, err := getResource(u.GetKind())
// if err != nil {
// return err
// }
// dr := client.Resource(gvk.GroupVersion().WithResource(resource))
dr := client.Resource(mapping.Resource)
ug, err := dr.Namespace(u.GetNamespace()).Get(context.TODO(), u.GetName(), metav1.GetOptions{})
if err != nil {
Expand Down Expand Up @@ -164,7 +159,7 @@ func getTemplate(templateName string) *template.Template {
return tmpl
}

func mustTempalteAsset(name, templateName string, reader ScenarioReader, values interface{}) ([]byte, error) {
func MustTempalteAsset(name, templateName string, reader ScenarioReader, values interface{}) ([]byte, error) {
tmpl := getTemplate(templateName)
b, err := reader.Asset(name)
if err != nil {
Expand Down
16 changes: 0 additions & 16 deletions pkg/helpers/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,21 +12,8 @@ import (
"github.com/ghodss/yaml"
"k8s.io/client-go/kubernetes"
clientcmdapiv1 "k8s.io/client-go/tools/clientcmd/api/v1"

crclient "sigs.k8s.io/controller-runtime/pkg/client"

"k8s.io/cli-runtime/pkg/genericclioptions"
)

func GetControllerRuntimeClientFromFlags(configFlags *genericclioptions.ConfigFlags) (client crclient.Client, err error) {
config, err := configFlags.ToRESTConfig()
if err != nil {
return nil, err
}
config.QPS = 20
return crclient.New(config, crclient.Options{})
}

func GetAPIServer(kubeClient kubernetes.Interface) (string, error) {
config, err := getClusterInfoKubeConfig(kubeClient)
if err != nil {
Expand All @@ -50,11 +37,9 @@ func GetCACert(kubeClient kubernetes.Interface) ([]byte, error) {
cluster := clusters[0].Cluster
return cluster.CertificateAuthorityData, nil
}
fmt.Printf("Search for kube-root-ca.crt")
if errors.IsNotFound(err) {
cm, err := kubeClient.CoreV1().ConfigMaps("kube-public").Get(context.TODO(), "kube-root-ca.crt", metav1.GetOptions{})
if err != nil {
fmt.Printf("Failed to getkube-root-ca.crt")
return nil, err
}
return []byte(cm.Data["ca.crt"]), nil
Expand All @@ -65,7 +50,6 @@ func GetCACert(kubeClient kubernetes.Interface) ([]byte, error) {
func getClusterInfoKubeConfig(kubeClient kubernetes.Interface) (*clientcmdapiv1.Config, error) {
cm, err := kubeClient.CoreV1().ConfigMaps("kube-public").Get(context.TODO(), "cluster-info", metav1.GetOptions{})
if err != nil {
fmt.Printf("Error cluster-info: %s", err)
return nil, err
}
config := &clientcmdapiv1.Config{}
Expand Down

0 comments on commit d6a8ab1

Please sign in to comment.