You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by nf...@apache.org on 2019/01/07 14:25:41 UTC

[camel-k] 04/13: Fix #237: fix cache and runtime conversion

This is an automated email from the ASF dual-hosted git repository.

nferraro pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel-k.git

commit 660d559a79d767f2c52319c0eff0e31abbb0edae
Author: nferraro <ni...@gmail.com>
AuthorDate: Fri Jan 4 14:56:21 2019 +0100

    Fix #237: fix cache and runtime conversion
---
 pkg/client/client.go          | 52 ++++++++++++++++++++++++++++++++++---------
 pkg/cmd/root.go               |  2 +-
 pkg/install/cluster.go        |  2 +-
 pkg/install/common.go         |  2 +-
 pkg/install/operator.go       |  2 +-
 pkg/util/kubernetes/loader.go | 12 +++++-----
 test/testing_env.go           |  2 +-
 7 files changed, 54 insertions(+), 20 deletions(-)

diff --git a/pkg/client/client.go b/pkg/client/client.go
index 026e26b..756ac28 100644
--- a/pkg/client/client.go
+++ b/pkg/client/client.go
@@ -19,20 +19,20 @@ package client
 
 import (
 	"github.com/apache/camel-k/pkg/apis"
+	"github.com/operator-framework/operator-sdk/pkg/k8sutil"
+	"github.com/pkg/errors"
 	"io/ioutil"
+	"k8s.io/apimachinery/pkg/runtime"
 	"k8s.io/apimachinery/pkg/runtime/schema"
+	"k8s.io/client-go/kubernetes"
 	"k8s.io/client-go/tools/clientcmd"
+	clientcmdapi "k8s.io/client-go/tools/clientcmd/api"
+	clientcmdlatest "k8s.io/client-go/tools/clientcmd/api/latest"
 	"os"
 	"os/user"
 	"path/filepath"
-	"sigs.k8s.io/controller-runtime/pkg/client/config"
-
-	"github.com/operator-framework/operator-sdk/pkg/k8sutil"
-	"github.com/pkg/errors"
-	"k8s.io/client-go/kubernetes"
-	clientcmdapi "k8s.io/client-go/tools/clientcmd/api"
-	clientcmdlatest "k8s.io/client-go/tools/clientcmd/api/latest"
 	controller "sigs.k8s.io/controller-runtime/pkg/client"
+	"sigs.k8s.io/controller-runtime/pkg/client/config"
 	"sigs.k8s.io/controller-runtime/pkg/manager"
 )
 
@@ -40,6 +40,7 @@ import (
 type Client interface {
 	controller.Client
 	kubernetes.Interface
+	GetScheme() *runtime.Scheme
 }
 
 // Injectable identifies objects that can receive a Client
@@ -50,24 +51,54 @@ type Injectable interface {
 type defaultClient struct {
 	controller.Client
 	kubernetes.Interface
+	scheme *runtime.Scheme
+}
+
+func (c *defaultClient) GetScheme() *runtime.Scheme {
+	return c.scheme
 }
 
 // NewOutOfClusterClient creates a new k8s client that can be used from outside the cluster
-func NewOutOfClusterClient(kubeconfig string, namespace string) (Client, error) {
+func NewOutOfClusterClient(kubeconfig string) (Client, error) {
 	initialize(kubeconfig)
 	// Get a config to talk to the apiserver
 	cfg, err := config.GetConfig()
 	if err != nil {
 		return nil, err
 	}
+
+	options := manager.Options{
+		LeaderElection: false,
+	}
+
 	// Create a new Cmd to provide shared dependencies and start components
-	mgr, err := manager.New(cfg, manager.Options{Namespace: namespace})
+	mgr, err := manager.New(cfg, options)
 
 	// Setup Scheme for all resources
 	if err := apis.AddToScheme(mgr.GetScheme()); err != nil {
 		return nil, err
 	}
-	return FromManager(mgr)
+
+	var clientset kubernetes.Interface
+	if clientset, err = kubernetes.NewForConfig(mgr.GetConfig()); err != nil {
+		return nil, err
+	}
+
+	// Create a new client to avoid using cache (enabled by default on operator-sdk client)
+	clientOptions := controller.Options{
+		Scheme: mgr.GetScheme(),
+		Mapper: mgr.GetRESTMapper(),
+	}
+	dynClient, err := controller.New(cfg, clientOptions)
+	if err != nil {
+		return nil, err
+	}
+
+	return &defaultClient{
+		Client:    dynClient,
+		Interface: clientset,
+		scheme:    clientOptions.Scheme,
+	}, nil
 }
 
 // FromManager creates a new k8s client from a manager object
@@ -80,6 +111,7 @@ func FromManager(manager manager.Manager) (Client, error) {
 	return &defaultClient{
 		Client:    manager.GetClient(),
 		Interface: clientset,
+		scheme:    manager.GetScheme(),
 	}, nil
 }
 
diff --git a/pkg/cmd/root.go b/pkg/cmd/root.go
index 933a8b8..584489e 100644
--- a/pkg/cmd/root.go
+++ b/pkg/cmd/root.go
@@ -86,6 +86,6 @@ func (command *RootCmdOptions) GetCmdClient() (client.Client, error) {
 		return command._client, nil
 	}
 	var err error
-	command._client, err = client.NewOutOfClusterClient(command.KubeConfig, command.Namespace)
+	command._client, err = client.NewOutOfClusterClient(command.KubeConfig)
 	return command._client, err
 }
diff --git a/pkg/install/cluster.go b/pkg/install/cluster.go
index 66f00d5..4c78f5c 100644
--- a/pkg/install/cluster.go
+++ b/pkg/install/cluster.go
@@ -151,7 +151,7 @@ func IsClusterRoleInstalled(ctx context.Context, c client.Client, ) (bool, error
 }
 
 func installClusterRole(ctx context.Context, c client.Client, collection *kubernetes.Collection) error {
-	obj, err := kubernetes.LoadRawResourceFromYaml(deploy.Resources["user-cluster-role.yaml"])
+	obj, err := kubernetes.LoadResourceFromYaml(c.GetScheme(), deploy.Resources["user-cluster-role.yaml"])
 	if err != nil {
 		return err
 	}
diff --git a/pkg/install/common.go b/pkg/install/common.go
index d1f35a8..fe18638 100644
--- a/pkg/install/common.go
+++ b/pkg/install/common.go
@@ -50,7 +50,7 @@ func Resource(ctx context.Context, c client.Client, namespace string, name strin
 
 // ResourceOrCollect --
 func ResourceOrCollect(ctx context.Context, c client.Client, namespace string, collection *kubernetes.Collection, name string) error {
-	obj, err := kubernetes.LoadRawResourceFromYaml(deploy.Resources[name])
+	obj, err := kubernetes.LoadResourceFromYaml(c.GetScheme(), deploy.Resources[name])
 	if err != nil {
 		return err
 	}
diff --git a/pkg/install/operator.go b/pkg/install/operator.go
index 6417c37..1c7f871 100644
--- a/pkg/install/operator.go
+++ b/pkg/install/operator.go
@@ -107,7 +107,7 @@ func PlatformOrCollect(ctx context.Context, c client.Client, namespace string, r
 	if err != nil {
 		return nil, err
 	}
-	platformObject, err := kubernetes.LoadRawResourceFromYaml(deploy.Resources["platform-cr.yaml"])
+	platformObject, err := kubernetes.LoadResourceFromYaml(c.GetScheme(), deploy.Resources["platform-cr.yaml"])
 	if err != nil {
 		return nil, err
 	}
diff --git a/pkg/util/kubernetes/loader.go b/pkg/util/kubernetes/loader.go
index cd30fa2..fb6b909 100644
--- a/pkg/util/kubernetes/loader.go
+++ b/pkg/util/kubernetes/loader.go
@@ -19,12 +19,14 @@ package kubernetes
 
 import (
 	"encoding/json"
+	"fmt"
 	"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
 	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/runtime/serializer"
 	"k8s.io/apimachinery/pkg/util/yaml"
 )
 
-/*// LoadResourceFromYaml loads a k8s resource from a yaml definition
+// LoadResourceFromYaml loads a k8s resource from a yaml definition
 func LoadResourceFromYaml(scheme *runtime.Scheme, data string) (runtime.Object, error) {
 	source := []byte(data)
 	jsonSource, err := yaml.ToJSON(source)
@@ -37,7 +39,7 @@ func LoadResourceFromYaml(scheme *runtime.Scheme, data string) (runtime.Object,
 		return nil, err
 	}
 	return RuntimeObjectFromUnstructured(scheme, &u)
-}*/
+}
 
 // LoadRawResourceFromYaml loads a k8s resource from a yaml definition without making assumptions on the underlying type
 func LoadRawResourceFromYaml(data string) (runtime.Object, error) {
@@ -55,10 +57,10 @@ func LoadRawResourceFromYaml(data string) (runtime.Object, error) {
 	}, nil
 }
 
-/*// RuntimeObjectFromUnstructured converts an unstructured to a runtime object
+// RuntimeObjectFromUnstructured converts an unstructured to a runtime object
 func RuntimeObjectFromUnstructured(scheme *runtime.Scheme, u *unstructured.Unstructured) (runtime.Object, error) {
 	gvk := u.GroupVersionKind()
-	codecs      := serializer.NewCodecFactory(scheme)
+	codecs := serializer.NewCodecFactory(scheme)
 	decoder := codecs.UniversalDecoder(gvk.GroupVersion())
 
 	b, err := u.MarshalJSON()
@@ -70,4 +72,4 @@ func RuntimeObjectFromUnstructured(scheme *runtime.Scheme, u *unstructured.Unstr
 		return nil, fmt.Errorf("failed to decode json data with gvk(%v): %v", gvk.String(), err)
 	}
 	return ro, nil
-}*/
\ No newline at end of file
+}
diff --git a/test/testing_env.go b/test/testing_env.go
index 5218590..3d393ed 100644
--- a/test/testing_env.go
+++ b/test/testing_env.go
@@ -41,7 +41,7 @@ var testClient client.Client
 func init() {
 	testContext = context.TODO()
 	var err error
-	testClient, err = client.NewOutOfClusterClient("", getTargetNamespace())
+	testClient, err = client.NewOutOfClusterClient("")
 	if err != nil {
 		panic(err)
 	}