K8s测试:在方案中未注册类型v1alpha1.JivaVolume的种类。

huangapple go评论73阅读模式
英文:

K8s Test: no kind is registered for the type v1alpha1.JivaVolume in scheme

问题

在golang中,你可以通过以下步骤在k8s测试中注册CRD:

  1. 导入必要的包:
import (
	"k8s.io/client-go/kubernetes/scheme"
	"k8s.io/client-go/tools/clientcmd"
	"k8s.io/client-go/tools/clientcmd/api"
	"k8s.io/client-go/util/homedir"
)
  1. 创建一个fake client:
config := &api.Config{
	Clusters:       map[string]*api.Cluster{},
	AuthInfos:      map[string]*api.AuthInfo{},
	Contexts:       map[string]*api.Context{},
	CurrentContext: "",
}

kubeconfigPath := filepath.Join(homedir.HomeDir(), ".kube", "config")
overrides := &clientcmd.ConfigOverrides{}
loader := clientcmd.NewNonInteractiveDeferredLoadingClientConfig(
	clientcmd.NewDefaultClientConfigLoadingRules(), overrides)

rawConfig, err := loader.RawConfig()
if err != nil {
	// 处理错误
}

for clusterName, cluster := range rawConfig.Clusters {
	config.Clusters[clusterName] = cluster
}

for authName, authInfo := range rawConfig.AuthInfos {
	config.AuthInfos[authName] = authInfo
}

for contextName, context := range rawConfig.Contexts {
	config.Contexts[contextName] = context
}

config.CurrentContext = rawConfig.CurrentContext

clientConfig := clientcmd.NewDefaultClientConfig(*config, overrides)
restConfig, err := clientConfig.ClientConfig()
if err != nil {
	// 处理错误
}

clientset, err := kubernetes.NewForConfig(restConfig)
if err != nil {
	// 处理错误
}
  1. 注册CRD:
err = scheme.AddToScheme(clientset.Scheme())
if err != nil {
	// 处理错误
}

现在你可以在fake client中注册CRD了。希望对你有帮助!

英文:

How can I register CRD in the k8s Test in golang?
I am creating fake client by:

k8sfake.NewSimpleClientset(
	&jivaPV1,
	&jv1,
)}},

I know I can register CRD by apply charts in the kubernetes, But not finding a good way to do such in golang.

I was using the viaplha1.jivaVolume interface, which was throwing the error that no kind is registered for the type viaplha1.jivaVolume. Here is a short code portion where I was creating a fake Persisten volume object of type jivaVolume.

var jv1 = v1alpha1.JivaVolume{
	TypeMeta: metav1.TypeMeta{},
	ObjectMeta: metav1.ObjectMeta{
		Name:      "pvc-1",
		Namespace: "openebs",
		Labels:    map[string]string{"nodeID": "worker-node-1"},
	},
...
...

How can I register the kind in fakeClient? or How can I register CRD in fakeclient()?

答案1

得分: 3

你需要将新的控制器 API 添加到方案中,请检查以下示例代码:

import (
    "context"
    "testing"

    cachev1alpha1 "github.com/some-operatorapi/pkg/apis/cache/v1alpha1"
    "k8s.io/apimachinery/pkg/runtime"
    "sigs.k8s.io/controller-runtime/pkg/client"
    "sigs.k8s.io/controller-runtime/pkg/client/fake"
)

func TestCachedController(t *testing.T) {
    ...
    // 一个带有元数据和规范的 Cached 对象。
    cached := &cachev1alpha1.Cached{
        ObjectMeta: metav1.ObjectMeta{
            Name:      "memcached",
            Namespace: "memcached-operator",
            Labels: map[string]string{
                "label-key": "label-value",
            },
        },
    }

    // 在虚拟客户端中跟踪的对象。
    Objs := []runtime.Object{}
    Objs = append(Objs, cached)
    scheme := runtime.NewScheme()
    _ = cachev1alpha1.AddToScheme(scheme)
    cl := fake.NewClientBuilder().WithScheme(scheme).WithRuntimeObjects(Objs...).Build()

    // 使用标签过滤的方式列出 Memcached 对象
    opt := client.MatchingLabels(map[string]string{"label-key": "label-value"})
    memcachedList := &cachev1alpha1.MemcachedList{}
    err := cl.List(context.TODO(), memcachedList, opt)
    if err != nil {
        t.Fatalf("list memcached: (%v)", err)
    }
    ...
}

希望对你有帮助!

英文:

You have to add the new controller API to scheme, Please Check this sample.

import (
        "context"
        "testing"
    
        cachev1alpha1 "github.com/some-operatorapi/pkg/apis/cache/v1alpha1"
        "k8s.io/apimachinery/pkg/runtime"
        "sigs.k8s.io/controller-runtime/pkg/client"
        "sigs.k8s.io/controller-runtime/pkg/client/fake"
    )
    
    func TestCachedController(t *testing.T) {
        ...
        // A Cached object with metadata and spec.
        cached := &cachev1alpha1.Cached{
            ObjectMeta: metav1.ObjectMeta{
                Name:      "memcached",
                Namespace: "memcached-operator",
                Labels: map[string]string{
                    "label-key": "label-value",
                },
            },
        }
    
        // Objects to track in the fake client.
        Objs := []runtime.Object{}
        Objs = append(Objs, cached)
    	scheme := runtime.NewScheme()
    	_ = cachev1alpha1.AddToScheme(scheme)
    	cl:=  fake.NewClientBuilder().WithScheme(scheme).WithRuntimeObjects(Objs...).Build()
    
        // List Memcached objects filtering by labels
        opt := client.MatchingLabels(map[string]string{"label-key": "label-value"})
        memcachedList := &cachev1alpha1.MemcachedList{}
        err := cl.List(context.TODO(), memcachedList, opt)
        if err != nil {
            t.Fatalf("list memcached: (%v)", err)
        }
        ...
    }

答案2

得分: 1

我相信你们的CRD没有被应用。K8s不知道JivaVolume是什么类型。

英文:

I believe that the CRD of your kind was not applied. K8s does not know what a JivaVolume kind is.

huangapple
  • 本文由 发表于 2021年10月13日 06:58:33
  • 转载请务必保留本文链接:https://go.coder-hub.com/69547863.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定