对于进行身份验证并返回 Kubernetes 客户端集的 client-go 函数进行单元测试。

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

Unit testing client-go function that auths and returns a k8s clientset

问题

我正在使用client-go编写最简单的函数,它只执行集群内身份验证并返回指向kubernetes.Clientset对象的指针。

  1. // getInClusterAuth 执行集群内身份验证并返回clientset
  2. func getInClusterAuth() (*kubernetes.Clientset, error) {
  3. // 创建集群内配置
  4. config, err := rest.InClusterConfig()
  5. if err != nil {
  6. return nil, err
  7. }
  8. // 创建clientset
  9. clientset, err := kubernetes.NewForConfig(config)
  10. if err != nil {
  11. return nil, err
  12. }
  13. return clientset, nil
  14. }

由于这不仅针对外部系统(k8s API服务器)运行,而且还应该在部署后从Pod内部运行,那么适当的单元测试方式是什么?

是否可以在端到端或集成测试中覆盖此情况?

英文:

I am writing the simplest fxn possible using client-go that justs performs in-cluster authentication and returns a pointer to the kubernetes.Clientset object

  1. // getInClusterAuth performs in cluster authentication and returns the clientset
  2. func getInClusterAuth() (*kubernetes.Clientset, error) {
  3. // creates the in-cluster config
  4. config, err := rest.InClusterConfig()
  5. if err != nil {
  6. return nil, err
  7. }
  8. // create the clientset
  9. clientset, err := kubernetes.NewForConfig(config)
  10. if err != nil {
  11. return nil, err
  12. }
  13. return clientset, nil
  14. }

Since this is sth that not only does it run against an external system (a k8s api server) but it is also supposed to be running from within a Pod once deployed, what is the appropriate way of unit-testing it?

Could it be that it is an acceptable practice to cover the case in e2e or integration tests?

答案1

得分: 2

你可以在单元测试中使用k8s.io/client-go/kubernetes/fake.NewSimpleClientset来模拟一个clientSet

  1. import (
  2. "context"
  3. "testing"
  4. v1 "k8s.io/api/core/v1"
  5. "k8s.io/apimachinery/pkg/api/errors"
  6. metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
  7. "k8s.io/client-go/kubernetes/fake"
  8. )
  9. func TestHelloWorld(t *testing.T) {
  10. clientset := fake.NewSimpleClientset(&v1.Pod{
  11. ObjectMeta: metav1.ObjectMeta{
  12. Name: "influxdb-v2",
  13. Namespace: "default",
  14. Annotations: map[string]string{},
  15. },
  16. }, &v1.Pod{
  17. ObjectMeta: metav1.ObjectMeta{
  18. Name: "chronograf",
  19. Namespace: "default",
  20. Annotations: map[string]string{},
  21. },
  22. })
  23. _, err := clientset.CoreV1().Pods(v1.NamespaceDefault).Get(context.Background(), "influxdb-v2", metav1.GetOptions{})
  24. if err != nil {
  25. if errors.IsNotFound(err) {
  26. t.Error(err)
  27. } else {
  28. t.Errorf("failed to get service from apiserver: %s", err)
  29. }
  30. }
  31. p := &v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "helloooooo"}}
  32. _, err = clientset.CoreV1().Pods(v1.NamespaceDefault).Create(context.Background(), p, metav1.CreateOptions{})
  33. if err != nil {
  34. t.Fatalf("error injecting pod add: %v", err)
  35. }
  36. }

这是一个示例:一个fakeclient的案例

英文:

you can use k8s.io/client-go/kubernetes/fake.NewSimpleClientset to mock a clientSet in your unit test .

  1. import (
  2. "context"
  3. "testing"
  4. v1 "k8s.io/api/core/v1"
  5. "k8s.io/apimachinery/pkg/api/errors"
  6. metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
  7. "k8s.io/client-go/kubernetes/fake"
  8. )
  9. func TestHelloWorld(t *testing.T) {
  10. clientset := fake.NewSimpleClientset(&v1.Pod{
  11. ObjectMeta: metav1.ObjectMeta{
  12. Name: "influxdb-v2",
  13. Namespace: "default",
  14. Annotations: map[string]string{},
  15. },
  16. }, &v1.Pod{
  17. ObjectMeta: metav1.ObjectMeta{
  18. Name: "chronograf",
  19. Namespace: "default",
  20. Annotations: map[string]string{},
  21. },
  22. })
  23. _, err := clientset.CoreV1().Pods(v1.NamespaceDefault).Get(context.Background(), "influxdb-v2", metav1.GetOptions{})
  24. if err != nil {
  25. if errors.IsNotFound(err) {
  26. t.Error(err)
  27. } else {
  28. t.Errorf("failed to get service from apiserver: %s", err)
  29. }
  30. }
  31. p := &v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "helloooooo"}}
  32. _, err = clientset.CoreV1().Pods(v1.NamespaceDefault).Create(context.Background(), p, metav1.CreateOptions{})
  33. if err != nil {
  34. t.Fatalf("error injecting pod add: %v", err)
  35. }
  36. }

this is a sample: a fakeclient case

huangapple
  • 本文由 发表于 2021年8月9日 07:19:33
  • 转载请务必保留本文链接:https://go.coder-hub.com/68705402.html
匿名

发表评论

匿名网友

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

确定