test(contrib): add unit test for contrib/registry/k8s (#2166)
* test(contrib): add unit test for contrib/registry/k8s * test(contrib): add unit test for contrib/registry/k8s Co-authored-by: rogerogers <rogers@rogerogers.com>pull/2168/head
parent
08fccfcb66
commit
2525e81e55
@ -0,0 +1,186 @@ |
|||||||
|
package kuberegistry |
||||||
|
|
||||||
|
import ( |
||||||
|
"context" |
||||||
|
"os" |
||||||
|
"path/filepath" |
||||||
|
"testing" |
||||||
|
"time" |
||||||
|
|
||||||
|
"github.com/go-kratos/kratos/v2/registry" |
||||||
|
|
||||||
|
appsv1 "k8s.io/api/apps/v1" |
||||||
|
apiv1 "k8s.io/api/core/v1" |
||||||
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" |
||||||
|
"k8s.io/client-go/kubernetes" |
||||||
|
"k8s.io/client-go/rest" |
||||||
|
"k8s.io/client-go/tools/clientcmd" |
||||||
|
"k8s.io/client-go/util/homedir" |
||||||
|
) |
||||||
|
|
||||||
|
const ( |
||||||
|
namespace = "default" |
||||||
|
deployName = "hello-deployment" |
||||||
|
podName = "hello" |
||||||
|
) |
||||||
|
|
||||||
|
var deployment = appsv1.Deployment{ |
||||||
|
ObjectMeta: metav1.ObjectMeta{ |
||||||
|
Name: deployName, |
||||||
|
}, |
||||||
|
Spec: appsv1.DeploymentSpec{ |
||||||
|
Replicas: int32Ptr(1), |
||||||
|
Selector: &metav1.LabelSelector{ |
||||||
|
MatchLabels: map[string]string{ |
||||||
|
"app": podName, |
||||||
|
}, |
||||||
|
}, |
||||||
|
Template: apiv1.PodTemplateSpec{ |
||||||
|
ObjectMeta: metav1.ObjectMeta{ |
||||||
|
Labels: map[string]string{ |
||||||
|
"app": podName, |
||||||
|
}, |
||||||
|
}, |
||||||
|
Spec: apiv1.PodSpec{ |
||||||
|
Containers: []apiv1.Container{ |
||||||
|
{ |
||||||
|
Name: "nginx", |
||||||
|
Image: "nginx:alpine", |
||||||
|
Ports: []apiv1.ContainerPort{ |
||||||
|
{ |
||||||
|
Name: "http", |
||||||
|
Protocol: apiv1.ProtocolTCP, |
||||||
|
ContainerPort: 80, |
||||||
|
}, |
||||||
|
}, |
||||||
|
Command: []string{ |
||||||
|
"nginx", |
||||||
|
"-g", |
||||||
|
"daemon off;", |
||||||
|
}, |
||||||
|
}, |
||||||
|
}, |
||||||
|
}, |
||||||
|
}, |
||||||
|
}, |
||||||
|
} |
||||||
|
|
||||||
|
func getClientSet() (*kubernetes.Clientset, error) { |
||||||
|
restConfig, err := rest.InClusterConfig() |
||||||
|
home := homedir.HomeDir() |
||||||
|
|
||||||
|
if err != nil { |
||||||
|
kubeconfig := filepath.Join(home, ".kube", "config") |
||||||
|
restConfig, err = clientcmd.BuildConfigFromFlags("", kubeconfig) |
||||||
|
if err != nil { |
||||||
|
return nil, err |
||||||
|
} |
||||||
|
} |
||||||
|
clientSet, err := kubernetes.NewForConfig(restConfig) |
||||||
|
if err != nil { |
||||||
|
return nil, err |
||||||
|
} |
||||||
|
return clientSet, nil |
||||||
|
} |
||||||
|
|
||||||
|
func int32Ptr(i int32) *int32 { return &i } |
||||||
|
|
||||||
|
func TestSetEnv(t *testing.T) { |
||||||
|
os.Setenv("HOSTNAME", podName) |
||||||
|
if os.Getenv("HOSTNAME") != podName { |
||||||
|
t.Fatal("error") |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
func TestRegistry(t *testing.T) { |
||||||
|
currentNamespace = "default" |
||||||
|
|
||||||
|
clientSet, err := getClientSet() |
||||||
|
if err != nil { |
||||||
|
t.Fatal(err) |
||||||
|
} |
||||||
|
|
||||||
|
r := NewRegistry(clientSet) |
||||||
|
r.Start() |
||||||
|
|
||||||
|
svrHello := ®istry.ServiceInstance{ |
||||||
|
ID: "1", |
||||||
|
Name: "hello", |
||||||
|
Version: "v1.0.0", |
||||||
|
Endpoints: []string{"http://127.0.0.1:80"}, |
||||||
|
} |
||||||
|
_, err = clientSet.AppsV1().Deployments(namespace).Create(context.Background(), &deployment, metav1.CreateOptions{}) |
||||||
|
|
||||||
|
if err != nil { |
||||||
|
t.Fatal(err) |
||||||
|
} |
||||||
|
|
||||||
|
watch, err := r.Watch(context.Background(), svrHello.Name) |
||||||
|
if err != nil { |
||||||
|
t.Fatal(err) |
||||||
|
} |
||||||
|
|
||||||
|
defer func() { |
||||||
|
_ = watch.Stop() |
||||||
|
}() |
||||||
|
|
||||||
|
go func() { |
||||||
|
for { |
||||||
|
res, err1 := watch.Next() |
||||||
|
if err1 != nil { |
||||||
|
return |
||||||
|
} |
||||||
|
t.Logf("watch: %d", len(res)) |
||||||
|
for _, r := range res { |
||||||
|
t.Logf("next: %+v", r) |
||||||
|
} |
||||||
|
} |
||||||
|
}() |
||||||
|
time.Sleep(time.Second) |
||||||
|
|
||||||
|
pod, err := clientSet.CoreV1().Pods(namespace).List(context.Background(), metav1.ListOptions{ |
||||||
|
LabelSelector: "app=hello", |
||||||
|
}) |
||||||
|
if err != nil { |
||||||
|
t.Fatal(err) |
||||||
|
} |
||||||
|
|
||||||
|
if len(pod.Items) < 1 { |
||||||
|
t.Fatal("fetch resource error") |
||||||
|
} |
||||||
|
|
||||||
|
os.Setenv("HOSTNAME", pod.Items[0].Name) |
||||||
|
|
||||||
|
// Alway remember delete test resource
|
||||||
|
defer func() { |
||||||
|
_ = clientSet.AppsV1().Deployments(namespace).Delete(context.Background(), deployName, metav1.DeleteOptions{}) |
||||||
|
}() |
||||||
|
|
||||||
|
if err = r.Register(context.Background(), svrHello); err != nil { |
||||||
|
t.Fatal(err) |
||||||
|
} |
||||||
|
time.Sleep(time.Second) |
||||||
|
|
||||||
|
res, err := r.GetService(context.Background(), svrHello.Name) |
||||||
|
if err != nil { |
||||||
|
t.Fatal(err) |
||||||
|
} |
||||||
|
|
||||||
|
if len(res) != 1 && res[0].Name != svrHello.Name { |
||||||
|
t.Fatal(err) |
||||||
|
} |
||||||
|
|
||||||
|
if err1 := r.Deregister(context.Background(), svrHello); err1 != nil { |
||||||
|
t.Fatal(err1) |
||||||
|
} |
||||||
|
|
||||||
|
time.Sleep(time.Second) |
||||||
|
|
||||||
|
res, err = r.GetService(context.Background(), svrHello.Name) |
||||||
|
if err != nil { |
||||||
|
t.Fatal(err) |
||||||
|
} |
||||||
|
if len(res) != 0 { |
||||||
|
t.Fatal("not expected empty") |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue