英文:
K8s Test: no kind is registered for the type v1alpha1.JivaVolume in scheme
问题
在golang中,你可以通过以下步骤在k8s测试中注册CRD:
- 导入必要的包:
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"
)
- 创建一个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 {
// 处理错误
}
- 注册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.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论