From 29c88880e226028bcf3387cd954e0da6d4b64c31 Mon Sep 17 00:00:00 2001 From: "scott.wang" <scottwangsxll@gmail.com> Date: Fri, 13 Mar 2020 15:59:17 +0800 Subject: [PATCH] Add ut for registry/kubernetes --- registry/etcdv3/registry_test.go | 4 +- registry/kubernetes/listener.go | 18 +- registry/kubernetes/listener_test.go | 220 ++++++++++++++++++- registry/kubernetes/registry.go | 21 ++ registry/kubernetes/registry_test.go | 77 ++++++- remoting/kubernetes/client.go | 10 +- remoting/kubernetes/client_test.go | 307 +-------------------------- 7 files changed, 332 insertions(+), 325 deletions(-) diff --git a/registry/etcdv3/registry_test.go b/registry/etcdv3/registry_test.go index 6e26a8f3f..dc4e38297 100644 --- a/registry/etcdv3/registry_test.go +++ b/registry/etcdv3/registry_test.go @@ -98,7 +98,7 @@ func (suite *RegistryTestSuite) TestSubscribe() { assert.Regexp(t, ".*ServiceEvent{Action{add}.*", serviceEvent.String()) } -func (suite *RegistryTestSuite) TestConsumerDestory() { +func (suite *RegistryTestSuite) TestConsumerDestroy() { t := suite.T() url, _ := common.NewURL("dubbo://127.0.0.1:20000/com.ikurento.user.UserProvider", common.WithParamsValue(constant.CLUSTER_KEY, "mock"), common.WithMethods([]string{"GetUser", "AddUser"})) @@ -117,7 +117,7 @@ func (suite *RegistryTestSuite) TestConsumerDestory() { } -func (suite *RegistryTestSuite) TestProviderDestory() { +func (suite *RegistryTestSuite) TestProviderDestroy() { t := suite.T() reg := initRegistry(t) diff --git a/registry/kubernetes/listener.go b/registry/kubernetes/listener.go index 7c59a3630..1f4f2ed21 100644 --- a/registry/kubernetes/listener.go +++ b/registry/kubernetes/listener.go @@ -38,6 +38,7 @@ type dataListener struct { listener config_center.ConfigurationListener } +// NewRegistryDataListener ... func NewRegistryDataListener(listener config_center.ConfigurationListener) *dataListener { return &dataListener{listener: listener, interestedURL: []*common.URL{}} } @@ -48,12 +49,7 @@ func (l *dataListener) AddInterestedURL(url *common.URL) { func (l *dataListener) DataChange(eventType remoting.Event) bool { - index := strings.Index(eventType.Path, "/providers/") - if index == -1 { - logger.Warn("Listen with no url, event.path={%v}", eventType.Path) - return false - } - url := eventType.Path[index+len("/providers/"):] + url := eventType.Path[strings.Index(eventType.Path, "/providers/")+len("/providers/"):] serviceURL, err := common.NewURL(url) if err != nil { logger.Warnf("Listen NewURL(r{%s}) = error{%v}", eventType.Path, err) @@ -81,11 +77,13 @@ type configurationListener struct { events chan *config_center.ConfigChangeEvent } +// NewConfigurationListener for listening the event of kubernetes. func NewConfigurationListener(reg *kubernetesRegistry) *configurationListener { // add a new waiter - reg.wg.Add(1) + reg.WaitGroup().Add(1) return &configurationListener{registry: reg, events: make(chan *config_center.ConfigChangeEvent, 32)} } + func (l *configurationListener) Process(configType *config_center.ConfigChangeEvent) { l.events <- configType } @@ -93,7 +91,7 @@ func (l *configurationListener) Process(configType *config_center.ConfigChangeEv func (l *configurationListener) Next() (*registry.ServiceEvent, error) { for { select { - case <-l.registry.done: + case <-l.registry.Done(): logger.Warnf("listener's kubernetes client connection is broken, so kubernetes event listener exit now.") return nil, perrors.New("listener stopped") @@ -101,7 +99,7 @@ func (l *configurationListener) Next() (*registry.ServiceEvent, error) { logger.Infof("got kubernetes event %#v", e) if e.ConfigType == remoting.EventTypeDel { select { - case <-l.registry.done: + case <-l.registry.Done(): logger.Warnf("update @result{%s}. But its connection to registry is invalid", e.Value) default: } @@ -112,5 +110,5 @@ func (l *configurationListener) Next() (*registry.ServiceEvent, error) { } } func (l *configurationListener) Close() { - l.registry.wg.Done() + l.registry.WaitGroup().Done() } diff --git a/registry/kubernetes/listener_test.go b/registry/kubernetes/listener_test.go index 152f2adf9..16bbbf8c7 100644 --- a/registry/kubernetes/listener_test.go +++ b/registry/kubernetes/listener_test.go @@ -18,19 +18,159 @@ package kubernetes import ( + "encoding/json" + "os" + "strconv" "testing" ) import ( "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/suite" + "k8s.io/api/core/v1" + "k8s.io/client-go/kubernetes" + "k8s.io/client-go/kubernetes/fake" ) import ( "github.com/apache/dubbo-go/common" + "github.com/apache/dubbo-go/common/constant" "github.com/apache/dubbo-go/config_center" "github.com/apache/dubbo-go/remoting" ) +var clientPodJsonData = `{ + "apiVersion": "v1", + "kind": "Pod", + "metadata": { + "annotations": { + "dubbo.io/annotation": "W3siayI6Ii9kdWJibyIsInYiOiIifSx7ImsiOiIvZHViYm8vY29tLmlrdXJlbnRvLnVzZXIuVXNlclByb3ZpZGVyIiwidiI6IiJ9LHsiayI6Ii9kdWJiby9jb20uaWt1cmVudG8udXNlci5Vc2VyUHJvdmlkZXIvY29uc3VtZXJzIiwidiI6IiJ9LHsiayI6Ii9kdWJibyIsInYiOiIifSx7ImsiOiIvZHViYm8vY29tLmlrdXJlbnRvLnVzZXIuVXNlclByb3ZpZGVyIiwidiI6IiJ9LHsiayI6Ii9kdWJiby9jb20uaWt1cmVudG8udXNlci5Vc2VyUHJvdmlkZXIvcHJvdmlkZXJzIiwidiI6IiJ9LHsiayI6Ii9kdWJiby9jb20uaWt1cmVudG8udXNlci5Vc2VyUHJvdmlkZXIvY29uc3VtZXJzL2NvbnN1bWVyJTNBJTJGJTJGMTcyLjE3LjAuOCUyRlVzZXJQcm92aWRlciUzRmNhdGVnb3J5JTNEY29uc3VtZXJzJTI2ZHViYm8lM0RkdWJib2dvLWNvbnN1bWVyLTIuNi4wJTI2cHJvdG9jb2wlM0RkdWJibyIsInYiOiIifV0=" + }, + "creationTimestamp": "2020-03-13T03:38:57Z", + "labels": { + "dubbo.io/label": "dubbo.io-value" + }, + "name": "client", + "namespace": "default", + "resourceVersion": "2449700", + "selfLink": "/api/v1/namespaces/default/pods/client", + "uid": "3ec394f5-dcc6-49c3-8061-57b4b2b41344" + }, + "spec": { + "containers": [ + { + "env": [ + { + "name": "NAMESPACE", + "valueFrom": { + "fieldRef": { + "apiVersion": "v1", + "fieldPath": "metadata.namespace" + } + } + } + ], + "image": "registry.cn-hangzhou.aliyuncs.com/scottwang/dubbogo-client", + "imagePullPolicy": "Always", + "name": "client", + "resources": {}, + "terminationMessagePath": "/dev/termination-log", + "terminationMessagePolicy": "File", + "volumeMounts": [ + { + "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount", + "name": "dubbo-sa-token-l2lzh", + "readOnly": true + } + ] + } + ], + "dnsPolicy": "ClusterFirst", + "enableServiceLinks": true, + "nodeName": "minikube", + "priority": 0, + "restartPolicy": "Never", + "schedulerName": "default-scheduler", + "securityContext": {}, + "serviceAccount": "dubbo-sa", + "serviceAccountName": "dubbo-sa", + "terminationGracePeriodSeconds": 30, + "tolerations": [ + { + "effect": "NoExecute", + "key": "node.kubernetes.io/not-ready", + "operator": "Exists", + "tolerationSeconds": 300 + }, + { + "effect": "NoExecute", + "key": "node.kubernetes.io/unreachable", + "operator": "Exists", + "tolerationSeconds": 300 + } + ], + "volumes": [ + { + "name": "dubbo-sa-token-l2lzh", + "secret": { + "defaultMode": 420, + "secretName": "dubbo-sa-token-l2lzh" + } + } + ] + }, + "status": { + "conditions": [ + { + "lastProbeTime": null, + "lastTransitionTime": "2020-03-13T03:38:57Z", + "status": "True", + "type": "Initialized" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-03-13T03:40:18Z", + "status": "True", + "type": "Ready" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-03-13T03:40:18Z", + "status": "True", + "type": "ContainersReady" + }, + { + "lastProbeTime": null, + "lastTransitionTime": "2020-03-13T03:38:57Z", + "status": "True", + "type": "PodScheduled" + } + ], + "containerStatuses": [ + { + "containerID": "docker://2870d6abc19ca7fe22ca635ebcfac5d48c6d5550a659bafd74fb48104f6dfe3c", + "image": "registry.cn-hangzhou.aliyuncs.com/scottwang/dubbogo-client:latest", + "imageID": "docker-pullable://registry.cn-hangzhou.aliyuncs.com/scottwang/dubbogo-client@sha256:1f075131f708a0d400339e81549d7c4d4ed917ab0b6bd38ef458dd06ad25a559", + "lastState": {}, + "name": "client", + "ready": true, + "restartCount": 0, + "state": { + "running": { + "startedAt": "2020-03-13T03:40:17Z" + } + } + } + ], + "hostIP": "10.0.2.15", + "phase": "Running", + "podIP": "172.17.0.8", + "qosClass": "BestEffort", + "startTime": "2020-03-13T03:38:57Z" + } +} +` + func Test_DataChange(t *testing.T) { listener := NewRegistryDataListener(&MockDataListener{}) url, _ := common.NewURL("jsonrpc%3A%2F%2F127.0.0.1%3A20001%2Fcom.ikurento.user.UserProvider%3Fanyhost%3Dtrue%26app.version%3D0.0.1%26application%3DBDTService%26category%3Dproviders%26cluster%3Dfailover%26dubbo%3Ddubbo-provider-golang-2.6.0%26environment%3Ddev%26group%3D%26interface%3Dcom.ikurento.user.UserProvider%26ip%3D10.32.20.124%26loadbalance%3Drandom%26methods.GetUser.loadbalance%3Drandom%26methods.GetUser.retries%3D1%26methods.GetUser.weight%3D0%26module%3Ddubbogo%2Buser-info%2Bserver%26name%3DBDTService%26organization%3Dikurento.com%26owner%3DZX%26pid%3D74500%26retries%3D0%26service.filter%3Decho%26side%3Dprovider%26timestamp%3D1560155407%26version%3D%26warmup%3D100") @@ -39,8 +179,84 @@ func Test_DataChange(t *testing.T) { assert.Equal(t, true, int) } -type MockDataListener struct { +type MockDataListener struct{} + +func (*MockDataListener) Process(configType *config_center.ConfigChangeEvent) {} + +type KubernetesRegistryTestSuite struct { + suite.Suite + + currentPod v1.Pod + + registry *kubernetesRegistry +} + +func (s *KubernetesRegistryTestSuite) SetupTest() { + + t := s.T() + var err error + + regurl, err := common.NewURL("registry://127.0.0.1:443", common.WithParamsValue(constant.ROLE_KEY, strconv.Itoa(common.PROVIDER))) + if err != nil { + t.Fatal(err) + } + + mock, err := newMockKubernetesRegistry(®url, s.currentPod.GetNamespace(), func() (kubernetes.Interface, error) { + + out := fake.NewSimpleClientset() + + // mock current pod + if _, err := out.CoreV1().Pods(s.currentPod.GetNamespace()).Create(&s.currentPod); err != nil { + t.Fatal(err) + } + return out, nil + }) + if err != nil { + t.Fatal(err) + } + + s.registry = mock.(*kubernetesRegistry) +} + +func (s *KubernetesRegistryTestSuite) SetupSuite() { + + t := s.T() + + const ( + // kubernetes inject the var + podNameKey = "HOSTNAME" + nameSpaceKey = "NAMESPACE" + ) + + // 1. install test data + if err := json.Unmarshal([]byte(clientPodJsonData), &s.currentPod); err != nil { + t.Fatal(err) + } + + // 2. set downward-api inject env + if err := os.Setenv(podNameKey, s.currentPod.GetName()); err != nil { + t.Fatal(err) + } + if err := os.Setenv(nameSpaceKey, s.currentPod.GetNamespace()); err != nil { + t.Fatal(err) + } +} + +// stop etcd server +func (s *KubernetesRegistryTestSuite) TearDownSuite() {} + +func (s *KubernetesRegistryTestSuite) TestDataChange() { + + t := s.T() + + listener := NewRegistryDataListener(&MockDataListener{}) + url, _ := common.NewURL("jsonrpc%3A%2F%2F127.0.0.1%3A20001%2Fcom.ikurento.user.UserProvider%3Fanyhost%3Dtrue%26app.version%3D0.0.1%26application%3DBDTService%26category%3Dproviders%26cluster%3Dfailover%26dubbo%3Ddubbo-provider-golang-2.6.0%26environment%3Ddev%26group%3D%26interface%3Dcom.ikurento.user.UserProvider%26ip%3D10.32.20.124%26loadbalance%3Drandom%26methods.GetUser.loadbalance%3Drandom%26methods.GetUser.retries%3D1%26methods.GetUser.weight%3D0%26module%3Ddubbogo%2Buser-info%2Bserver%26name%3DBDTService%26organization%3Dikurento.com%26owner%3DZX%26pid%3D74500%26retries%3D0%26service.filter%3Decho%26side%3Dprovider%26timestamp%3D1560155407%26version%3D%26warmup%3D100") + listener.AddInterestedURL(&url) + if !listener.DataChange(remoting.Event{Path: "/dubbo/com.ikurento.user.UserProvider/providers/jsonrpc%3A%2F%2F127.0.0.1%3A20001%2Fcom.ikurento.user.UserProvider%3Fanyhost%3Dtrue%26app.version%3D0.0.1%26application%3DBDTService%26category%3Dproviders%26cluster%3Dfailover%26dubbo%3Ddubbo-provider-golang-2.6.0%26environment%3Ddev%26group%3D%26interface%3Dcom.ikurento.user.UserProvider%26ip%3D10.32.20.124%26loadbalance%3Drandom%26methods.GetUser.loadbalance%3Drandom%26methods.GetUser.retries%3D1%26methods.GetUser.weight%3D0%26module%3Ddubbogo%2Buser-info%2Bserver%26name%3DBDTService%26organization%3Dikurento.com%26owner%3DZX%26pid%3D74500%26retries%3D0%26service.filter%3Decho%26side%3Dprovider%26timestamp%3D1560155407%26version%3D%26warmup%3D100"}) { + t.Fatal("data change not ok") + } } -func (*MockDataListener) Process(configType *config_center.ConfigChangeEvent) { +func TestKubernetesRegistrySuite(t *testing.T) { + suite.Run(t, &KubernetesRegistryTestSuite{}) } diff --git a/registry/kubernetes/registry.go b/registry/kubernetes/registry.go index c68f0963a..8ebe68829 100644 --- a/registry/kubernetes/registry.go +++ b/registry/kubernetes/registry.go @@ -28,6 +28,7 @@ import ( import ( "github.com/dubbogo/gost/net" perrors "github.com/pkg/errors" + k8s "k8s.io/client-go/kubernetes" ) import ( @@ -160,3 +161,23 @@ func newKubernetesRegistry(url *common.URL) (registry.Registry, error) { return r, nil } + +func newMockKubernetesRegistry(url *common.URL, namespace string, clientGeneratorFunc func() (k8s.Interface, error)) ( + registry.Registry, + error, +) { + + var err error + + r := &kubernetesRegistry{} + + r.InitBaseRegistry(url, r) + r.client, err = kubernetes.NewMockClient(namespace, clientGeneratorFunc) + if err != nil { + return nil, perrors.WithMessage(err, "new mock client") + } + r.WaitGroup().Add(1) //zk client start successful, then wg +1 + go kubernetes.HandleClientRestart(r) + r.InitListeners() + return r, nil +} diff --git a/registry/kubernetes/registry_test.go b/registry/kubernetes/registry_test.go index 134217f3c..2bd744d92 100644 --- a/registry/kubernetes/registry_test.go +++ b/registry/kubernetes/registry_test.go @@ -18,19 +18,86 @@ package kubernetes import ( - "testing" + "time" ) -func Test_Register(t *testing.T) { +import ( + "github.com/stretchr/testify/assert" +) + +import ( + "github.com/apache/dubbo-go/common" + "github.com/apache/dubbo-go/common/constant" +) + +func (s *KubernetesRegistryTestSuite) TestRegister() { + t := s.T() + + url, _ := common.NewURL("dubbo://127.0.0.1:20000/com.ikurento.user.UserProvider", common.WithParamsValue(constant.CLUSTER_KEY, "mock"), common.WithMethods([]string{"GetUser", "AddUser"})) + + err := s.registry.Register(url) + assert.NoError(t, err) + _, _, err = s.registry.client.GetChildren("/dubbo/com.ikurento.user.UserProvider/providers") + if err != nil { + t.Fatal(err) + } } -func Test_Subscribe(t *testing.T) { +func (s *KubernetesRegistryTestSuite) TestSubscribe() { + + t := s.T() + + url, _ := common.NewURL("dubbo://127.0.0.1:20000/com.ikurento.user.UserProvider", common.WithParamsValue(constant.CLUSTER_KEY, "mock"), common.WithMethods([]string{"GetUser", "AddUser"})) + + listener, err := s.registry.DoSubscribe(&url) + if err != nil { + t.Fatal(err) + } + + go func() { + err := s.registry.Register(url) + if err != nil { + t.Fatal(err) + } + }() + + serviceEvent, err := listener.Next() + if err != nil { + t.Fatal(err) + } + + t.Logf("got event %s", serviceEvent) } -func Test_ConsumerDestory(t *testing.T) { +func (s *KubernetesRegistryTestSuite) TestConsumerDestroy() { + + t := s.T() + url, _ := common.NewURL("dubbo://127.0.0.1:20000/com.ikurento.user.UserProvider", common.WithParamsValue(constant.CLUSTER_KEY, "mock"), common.WithMethods([]string{"GetUser", "AddUser"})) + + _, err := s.registry.DoSubscribe(&url) + if err != nil { + t.Fatal(err) + } + + //listener.Close() + time.Sleep(1e9) + s.registry.Destroy() + + assert.Equal(t, false, s.registry.IsAvailable()) } -func Test_ProviderDestory(t *testing.T) { +func (s *KubernetesRegistryTestSuite) TestProviderDestroy() { + + t := s.T() + + url, _ := common.NewURL("dubbo://127.0.0.1:20000/com.ikurento.user.UserProvider", common.WithParamsValue(constant.CLUSTER_KEY, "mock"), common.WithMethods([]string{"GetUser", "AddUser"})) + err := s.registry.Register(url) + assert.NoError(t, err) + + //listener.Close() + time.Sleep(1e9) + s.registry.Destroy() + assert.Equal(t, false, s.registry.IsAvailable()) } diff --git a/remoting/kubernetes/client.go b/remoting/kubernetes/client.go index dd1c0a391..5bf577662 100644 --- a/remoting/kubernetes/client.go +++ b/remoting/kubernetes/client.go @@ -105,8 +105,14 @@ func getCurrentNameSpace() (string, error) { return v, nil } -// new mock client -// new a client for test +// NewMockClient +// export for registry package test +func NewMockClient(namespace string, mockClientGenerator func() (kubernetes.Interface, error)) (*Client, error) { + return newMockClient(namespace, mockClientGenerator) +} + +// newMockClient +// new a client for test func newMockClient(namespace string, mockClientGenerator func() (kubernetes.Interface, error)) (*Client, error) { rawClient, err := mockClientGenerator() diff --git a/remoting/kubernetes/client_test.go b/remoting/kubernetes/client_test.go index ffd354040..846745bb6 100644 --- a/remoting/kubernetes/client_test.go +++ b/remoting/kubernetes/client_test.go @@ -27,7 +27,6 @@ import ( ) import ( - "github.com/pkg/errors" "github.com/stretchr/testify/suite" v1 "k8s.io/api/core/v1" "k8s.io/client-go/kubernetes" @@ -194,303 +193,11 @@ var clientPodJsonData = `{ } ` -var server1PodJsonData = `{ - "apiVersion": "v1", - "kind": "Pod", - "metadata": { - "annotations": { - "dubbo.io/annotation": "W3siayI6Ii9kdWJibyIsInYiOiIifSx7ImsiOiIvZHViYm8vY29tLmlrdXJlbnRvLnVzZXIuVXNlclByb3ZpZGVyIiwidiI6IiJ9LHsiayI6Ii9kdWJiby9jb20uaWt1cmVudG8udXNlci5Vc2VyUHJvdmlkZXIvcHJvdmlkZXJzIiwidiI6IiJ9LHsiayI6Ii9kdWJiby9jb20uaWt1cmVudG8udXNlci5Vc2VyUHJvdmlkZXIvcHJvdmlkZXJzL2R1YmJvJTNBJTJGJTJGMTcyLjE3LjAuNyUzQTIwMDAwJTJGVXNlclByb3ZpZGVyJTNGYWNjZXNzbG9nJTNEJTI2YW55aG9zdCUzRHRydWUlMjZhcHAudmVyc2lvbiUzRDAuMC4xJTI2YXBwbGljYXRpb24lM0RCRFRTZXJ2aWNlJTI2YmVhbi5uYW1lJTNEVXNlclByb3ZpZGVyJTI2Y2F0ZWdvcnklM0Rwcm92aWRlcnMlMjZjbHVzdGVyJTNEZmFpbG92ZXIlMjZkdWJibyUzRGR1YmJvLXByb3ZpZGVyLWdvbGFuZy0yLjYuMCUyNmVudmlyb25tZW50JTNEZGV2JTI2ZXhlY3V0ZS5saW1pdCUzRCUyNmV4ZWN1dGUubGltaXQucmVqZWN0ZWQuaGFuZGxlciUzRCUyNmdyb3VwJTNEJTI2aW50ZXJmYWNlJTNEY29tLmlrdXJlbnRvLnVzZXIuVXNlclByb3ZpZGVyJTI2aXAlM0QxNzIuMTcuMC43JTI2bG9hZGJhbGFuY2UlM0RyYW5kb20lMjZtZXRob2RzLkdldFVzZXIubG9hZGJhbGFuY2UlM0RyYW5kb20lMjZtZXRob2RzLkdldFVzZXIucmV0cmllcyUzRDElMjZtZXRob2RzLkdldFVzZXIudHBzLmxpbWl0LmludGVydmFsJTNEJTI2bWV0aG9kcy5HZXRVc2VyLnRwcy5saW1pdC5yYXRlJTNEJTI2bWV0aG9kcy5HZXRVc2VyLnRwcy5saW1pdC5zdHJhdGVneSUzRCUyNm1ldGhvZHMuR2V0VXNlci53ZWlnaHQlM0QwJTI2bW9kdWxlJTNEZHViYm9nbyUyQnVzZXItaW5mbyUyQnNlcnZlciUyNm5hbWUlM0RCRFRTZXJ2aWNlJTI2b3JnYW5pemF0aW9uJTNEaWt1cmVudG8uY29tJTI2b3duZXIlM0RaWCUyNnBpZCUzRDEwJTI2cmVnaXN0cnkucm9sZSUzRDMlMjZyZXRyaWVzJTNEJTI2c2VydmljZS5maWx0ZXIlM0RlY2hvJTI1MkN0b2tlbiUyNTJDYWNjZXNzbG9nJTI1MkN0cHMlMjUyQ2V4ZWN1dGUlMjZzaWRlJTNEcHJvdmlkZXIlMjZ0aW1lc3RhbXAlM0QxNTg0MDcwODEwJTI2dHBzLmxpbWl0LmludGVydmFsJTNEJTI2dHBzLmxpbWl0LnJhdGUlM0QlMjZ0cHMubGltaXQucmVqZWN0ZWQuaGFuZGxlciUzRCUyNnRwcy5saW1pdC5zdHJhdGVneSUzRCUyNnRwcy5saW1pdGVyJTNEJTI2dmVyc2lvbiUzRCUyNndhcm11cCUzRDEwMCIsInYiOiIifV0=" - }, - "creationTimestamp": "2020-03-13T03:38:57Z", - "generateName": "server-5b8f9f85c6-", - "labels": { - "dubbo.io/label": "dubbo.io-value", - "pod-template-hash": "5b8f9f85c6", - "role": "server" - }, - "name": "server-5b8f9f85c6-2w5rq", - "namespace": "default", - "ownerReferences": [ - { - "apiVersion": "apps/v1", - "blockOwnerDeletion": true, - "controller": true, - "kind": "ReplicaSet", - "name": "server-5b8f9f85c6", - "uid": "65e9d2b0-f286-4b21-ac31-260f1412556b" - } - ], - "resourceVersion": "2449678", - "selfLink": "/api/v1/namespaces/default/pods/server-5b8f9f85c6-2w5rq", - "uid": "ae7497c7-396d-40c5-b53e-5720a696e4ee" - }, - "spec": { - "containers": [ - { - "env": [ - { - "name": "NAMESPACE", - "valueFrom": { - "fieldRef": { - "apiVersion": "v1", - "fieldPath": "metadata.namespace" - } - } - } - ], - "image": "registry.cn-hangzhou.aliyuncs.com/scottwang/dubbogo-server", - "imagePullPolicy": "Always", - "name": "server", - "resources": {}, - "terminationMessagePath": "/dev/termination-log", - "terminationMessagePolicy": "File", - "volumeMounts": [ - { - "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount", - "name": "dubbo-sa-token-l2lzh", - "readOnly": true - } - ] - } - ], - "dnsPolicy": "ClusterFirst", - "enableServiceLinks": true, - "nodeName": "minikube", - "priority": 0, - "restartPolicy": "Always", - "schedulerName": "default-scheduler", - "securityContext": {}, - "serviceAccount": "dubbo-sa", - "serviceAccountName": "dubbo-sa", - "terminationGracePeriodSeconds": 30, - "tolerations": [ - { - "effect": "NoExecute", - "key": "node.kubernetes.io/not-ready", - "operator": "Exists", - "tolerationSeconds": 300 - }, - { - "effect": "NoExecute", - "key": "node.kubernetes.io/unreachable", - "operator": "Exists", - "tolerationSeconds": 300 - } - ], - "volumes": [ - { - "name": "dubbo-sa-token-l2lzh", - "secret": { - "defaultMode": 420, - "secretName": "dubbo-sa-token-l2lzh" - } - } - ] - }, - "status": { - "conditions": [ - { - "lastProbeTime": null, - "lastTransitionTime": "2020-03-13T03:38:57Z", - "status": "True", - "type": "Initialized" - }, - { - "lastProbeTime": null, - "lastTransitionTime": "2020-03-13T03:40:10Z", - "status": "True", - "type": "Ready" - }, - { - "lastProbeTime": null, - "lastTransitionTime": "2020-03-13T03:40:10Z", - "status": "True", - "type": "ContainersReady" - }, - { - "lastProbeTime": null, - "lastTransitionTime": "2020-03-13T03:38:57Z", - "status": "True", - "type": "PodScheduled" - } - ], - "containerStatuses": [ - { - "containerID": "docker://88144bc6eabf783c0954c2e078a7270c8a0246d6f8af081dfcc0956e8c3cd2de", - "image": "registry.cn-hangzhou.aliyuncs.com/scottwang/dubbogo-server:latest", - "imageID": "docker-pullable://registry.cn-hangzhou.aliyuncs.com/scottwang/dubbogo-server@sha256:60654ddba3a16ca3de52c8e30650a4c1d8b2ed8f8542af489b7a5a459e46fe6b", - "lastState": {}, - "name": "server", - "ready": true, - "restartCount": 0, - "state": { - "running": { - "startedAt": "2020-03-13T03:40:10Z" - } - } - } - ], - "hostIP": "10.0.2.15", - "phase": "Running", - "podIP": "172.17.0.7", - "qosClass": "BestEffort", - "startTime": "2020-03-13T03:38:57Z" - } -} -` - -var server2PodJsonData = `{ - "apiVersion": "v1", - "kind": "Pod", - "metadata": { - "annotations": { - "dubbo.io/annotation": "W3siayI6Ii9kdWJibyIsInYiOiIifSx7ImsiOiIvZHViYm8vY29tLmlrdXJlbnRvLnVzZXIuVXNlclByb3ZpZGVyIiwidiI6IiJ9LHsiayI6Ii9kdWJiby9jb20uaWt1cmVudG8udXNlci5Vc2VyUHJvdmlkZXIvcHJvdmlkZXJzIiwidiI6IiJ9LHsiayI6Ii9kdWJiby9jb20uaWt1cmVudG8udXNlci5Vc2VyUHJvdmlkZXIvcHJvdmlkZXJzL2R1YmJvJTNBJTJGJTJGMTcyLjE3LjAuNiUzQTIwMDAwJTJGVXNlclByb3ZpZGVyJTNGYWNjZXNzbG9nJTNEJTI2YW55aG9zdCUzRHRydWUlMjZhcHAudmVyc2lvbiUzRDAuMC4xJTI2YXBwbGljYXRpb24lM0RCRFRTZXJ2aWNlJTI2YmVhbi5uYW1lJTNEVXNlclByb3ZpZGVyJTI2Y2F0ZWdvcnklM0Rwcm92aWRlcnMlMjZjbHVzdGVyJTNEZmFpbG92ZXIlMjZkdWJibyUzRGR1YmJvLXByb3ZpZGVyLWdvbGFuZy0yLjYuMCUyNmVudmlyb25tZW50JTNEZGV2JTI2ZXhlY3V0ZS5saW1pdCUzRCUyNmV4ZWN1dGUubGltaXQucmVqZWN0ZWQuaGFuZGxlciUzRCUyNmdyb3VwJTNEJTI2aW50ZXJmYWNlJTNEY29tLmlrdXJlbnRvLnVzZXIuVXNlclByb3ZpZGVyJTI2aXAlM0QxNzIuMTcuMC42JTI2bG9hZGJhbGFuY2UlM0RyYW5kb20lMjZtZXRob2RzLkdldFVzZXIubG9hZGJhbGFuY2UlM0RyYW5kb20lMjZtZXRob2RzLkdldFVzZXIucmV0cmllcyUzRDElMjZtZXRob2RzLkdldFVzZXIudHBzLmxpbWl0LmludGVydmFsJTNEJTI2bWV0aG9kcy5HZXRVc2VyLnRwcy5saW1pdC5yYXRlJTNEJTI2bWV0aG9kcy5HZXRVc2VyLnRwcy5saW1pdC5zdHJhdGVneSUzRCUyNm1ldGhvZHMuR2V0VXNlci53ZWlnaHQlM0QwJTI2bW9kdWxlJTNEZHViYm9nbyUyQnVzZXItaW5mbyUyQnNlcnZlciUyNm5hbWUlM0RCRFRTZXJ2aWNlJTI2b3JnYW5pemF0aW9uJTNEaWt1cmVudG8uY29tJTI2b3duZXIlM0RaWCUyNnBpZCUzRDEwJTI2cmVnaXN0cnkucm9sZSUzRDMlMjZyZXRyaWVzJTNEJTI2c2VydmljZS5maWx0ZXIlM0RlY2hvJTI1MkN0b2tlbiUyNTJDYWNjZXNzbG9nJTI1MkN0cHMlMjUyQ2V4ZWN1dGUlMjZzaWRlJTNEcHJvdmlkZXIlMjZ0aW1lc3RhbXAlM0QxNTg0MDcwODA5JTI2dHBzLmxpbWl0LmludGVydmFsJTNEJTI2dHBzLmxpbWl0LnJhdGUlM0QlMjZ0cHMubGltaXQucmVqZWN0ZWQuaGFuZGxlciUzRCUyNnRwcy5saW1pdC5zdHJhdGVneSUzRCUyNnRwcy5saW1pdGVyJTNEJTI2dmVyc2lvbiUzRCUyNndhcm11cCUzRDEwMCIsInYiOiIifV0=" - }, - "creationTimestamp": "2020-03-13T03:38:57Z", - "generateName": "server-5b8f9f85c6-", - "labels": { - "dubbo.io/label": "dubbo.io-value", - "pod-template-hash": "5b8f9f85c6", - "role": "server" - }, - "name": "server-5b8f9f85c6-xk5md", - "namespace": "default", - "ownerReferences": [ - { - "apiVersion": "apps/v1", - "blockOwnerDeletion": true, - "controller": true, - "kind": "ReplicaSet", - "name": "server-5b8f9f85c6", - "uid": "65e9d2b0-f286-4b21-ac31-260f1412556b" - } - ], - "resourceVersion": "2449667", - "selfLink": "/api/v1/namespaces/default/pods/server-5b8f9f85c6-xk5md", - "uid": "9e59e164-6620-473b-a983-472ebc1120e9" - }, - "spec": { - "containers": [ - { - "env": [ - { - "name": "NAMESPACE", - "valueFrom": { - "fieldRef": { - "apiVersion": "v1", - "fieldPath": "metadata.namespace" - } - } - } - ], - "image": "registry.cn-hangzhou.aliyuncs.com/scottwang/dubbogo-server", - "imagePullPolicy": "Always", - "name": "server", - "resources": {}, - "terminationMessagePath": "/dev/termination-log", - "terminationMessagePolicy": "File", - "volumeMounts": [ - { - "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount", - "name": "dubbo-sa-token-l2lzh", - "readOnly": true - } - ] - } - ], - "dnsPolicy": "ClusterFirst", - "enableServiceLinks": true, - "nodeName": "minikube", - "priority": 0, - "restartPolicy": "Always", - "schedulerName": "default-scheduler", - "securityContext": {}, - "serviceAccount": "dubbo-sa", - "serviceAccountName": "dubbo-sa", - "terminationGracePeriodSeconds": 30, - "tolerations": [ - { - "effect": "NoExecute", - "key": "node.kubernetes.io/not-ready", - "operator": "Exists", - "tolerationSeconds": 300 - }, - { - "effect": "NoExecute", - "key": "node.kubernetes.io/unreachable", - "operator": "Exists", - "tolerationSeconds": 300 - } - ], - "volumes": [ - { - "name": "dubbo-sa-token-l2lzh", - "secret": { - "defaultMode": 420, - "secretName": "dubbo-sa-token-l2lzh" - } - } - ] - }, - "status": { - "conditions": [ - { - "lastProbeTime": null, - "lastTransitionTime": "2020-03-13T03:38:57Z", - "status": "True", - "type": "Initialized" - }, - { - "lastProbeTime": null, - "lastTransitionTime": "2020-03-13T03:40:09Z", - "status": "True", - "type": "Ready" - }, - { - "lastProbeTime": null, - "lastTransitionTime": "2020-03-13T03:40:09Z", - "status": "True", - "type": "ContainersReady" - }, - { - "lastProbeTime": null, - "lastTransitionTime": "2020-03-13T03:38:57Z", - "status": "True", - "type": "PodScheduled" - } - ], - "containerStatuses": [ - { - "containerID": "docker://442dc055392cc720b6a6eb0bc4105f13ea86e63cbdced5c83f15463bc61add76", - "image": "registry.cn-hangzhou.aliyuncs.com/scottwang/dubbogo-server:latest", - "imageID": "docker-pullable://registry.cn-hangzhou.aliyuncs.com/scottwang/dubbogo-server@sha256:60654ddba3a16ca3de52c8e30650a4c1d8b2ed8f8542af489b7a5a459e46fe6b", - "lastState": {}, - "name": "server", - "ready": true, - "restartCount": 0, - "state": { - "running": { - "startedAt": "2020-03-13T03:40:09Z" - } - } - } - ], - "hostIP": "10.0.2.15", - "phase": "Running", - "podIP": "172.17.0.6", - "qosClass": "BestEffort", - "startTime": "2020-03-13T03:38:57Z" - } -}` - type KubernetesClientTestSuite struct { suite.Suite - client *Client - - currentPod v1.Pod - fakeServerPod1 v1.Pod - fakeServerPod2 v1.Pod + client *Client + currentPod v1.Pod } func (s *KubernetesClientTestSuite) SetupSuite() { @@ -501,12 +208,6 @@ func (s *KubernetesClientTestSuite) SetupSuite() { if err := json.Unmarshal([]byte(clientPodJsonData), &s.currentPod); err != nil { t.Fatal(err) } - if err := json.Unmarshal([]byte(server1PodJsonData), &s.fakeServerPod1); err != nil { - t.Fatal(err) - } - if err := json.Unmarshal([]byte(server2PodJsonData), &s.fakeServerPod2); err != nil { - t.Fatal(err) - } // 2. set downward-api inject env if err := os.Setenv(podNameKey, s.currentPod.GetName()); err != nil { @@ -519,8 +220,6 @@ func (s *KubernetesClientTestSuite) SetupSuite() { func (s *KubernetesClientTestSuite) TearDownSuite() { s.client.Close() - os.Unsetenv(podNameKey) - os.Unsetenv(nameSpaceKey) } func (s *KubernetesClientTestSuite) SetupTest() { @@ -533,7 +232,7 @@ func (s *KubernetesClientTestSuite) SetupTest() { // mock current pod if _, err := out.CoreV1().Pods(s.currentPod.GetNamespace()).Create(&s.currentPod); err != nil { - return nil, errors.WithMessage(err, "mock current pod ") + t.Fatal(err) } return out, nil }) -- GitLab