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.ferr...@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) }