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)
}