You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@apisix.apache.org by to...@apache.org on 2021/05/12 10:53:59 UTC

[apisix-ingress-controller] branch master updated: test: add e2e test cases for server-info plugin (#406)

This is an automated email from the ASF dual-hosted git repository.

tokers pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/apisix-ingress-controller.git


The following commit(s) were added to refs/heads/master by this push:
     new f199cdb  test: add e2e test cases for server-info plugin (#406)
f199cdb is described below

commit f199cdb5f5bfe3cb5acb19dc1903b1f5f426a353
Author: Fang <37...@users.noreply.github.com>
AuthorDate: Wed May 12 18:53:51 2021 +0800

    test: add e2e test cases for server-info plugin (#406)
---
 test/e2e/plugins/server-info.go         | 44 ++++++++++++++++++++++++++++
 test/e2e/scaffold/apisix.go             |  4 +++
 test/e2e/scaffold/k8s.go                | 52 ++++++++++++++++++++++++++++-----
 test/e2e/scaffold/scaffold.go           |  9 +++---
 test/e2e/testdata/apisix-gw-config.yaml |  2 ++
 5 files changed, 99 insertions(+), 12 deletions(-)

diff --git a/test/e2e/plugins/server-info.go b/test/e2e/plugins/server-info.go
new file mode 100644
index 0000000..1598910
--- /dev/null
+++ b/test/e2e/plugins/server-info.go
@@ -0,0 +1,44 @@
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+package plugins
+
+import (
+	"github.com/apache/apisix-ingress-controller/test/e2e/scaffold"
+	"github.com/onsi/ginkgo"
+	"github.com/stretchr/testify/assert"
+)
+
+var _ = ginkgo.Describe("server-info plugin", func() {
+	opts := &scaffold.Options{
+		Name:                    "default",
+		Kubeconfig:              scaffold.GetKubeconfig(),
+		APISIXConfigPath:        "testdata/apisix-gw-config.yaml",
+		APISIXDefaultConfigPath: "testdata/apisix-gw-config-default.yaml",
+		IngressAPISIXReplicas:   1,
+		HTTPBinServicePort:      80,
+		APISIXRouteVersion:      "apisix.apache.org/v2alpha1",
+	}
+	s := scaffold.NewScaffold(opts)
+
+	ginkgo.It("enable server-info plugin", func() {
+		serverInfoKey := [...]string{"etcd_version", "up_time", "last_report_time", "id", "hostname", "version", "boot_time"}
+		serverInfo, err := s.GetServerInfo()
+		assert.Nil(ginkgo.GinkgoT(), err)
+		for _, key := range serverInfoKey {
+			_, ok := serverInfo[key]
+			assert.True(ginkgo.GinkgoT(), ok)
+		}
+	})
+})
diff --git a/test/e2e/scaffold/apisix.go b/test/e2e/scaffold/apisix.go
index 84bed8e..2bab32e 100644
--- a/test/e2e/scaffold/apisix.go
+++ b/test/e2e/scaffold/apisix.go
@@ -124,6 +124,10 @@ spec:
       port: 9100
       protocol: TCP
       targetPort: 9100
+    - name: http-control
+      port: 9090
+      protocol: TCP
+      targetPort: 9090
   type: NodePort
 `
 )
diff --git a/test/e2e/scaffold/k8s.go b/test/e2e/scaffold/k8s.go
index 6fcc05b..1c80f55 100644
--- a/test/e2e/scaffold/k8s.go
+++ b/test/e2e/scaffold/k8s.go
@@ -184,6 +184,31 @@ func (s *Scaffold) EnsureNumApisixUpstreamsCreated(desired int) error {
 	return ensureNumApisixCRDsCreated(u.String(), desired)
 }
 
+// GetServerInfo collect server info from "/v1/server_info" (Control API) exposed by server-info plugin
+func (s *Scaffold) GetServerInfo() (map[string]interface{}, error) {
+	u := url.URL{
+		Scheme: "http",
+		Host:   s.apisixControlTunnel.Endpoint(),
+		Path:   "/v1/server_info",
+	}
+	resp, err := http.Get(u.String())
+	if err != nil {
+		ginkgo.GinkgoT().Logf("failed to get response from Control API: %s", err.Error())
+		return nil, err
+	}
+	defer resp.Body.Close()
+	if resp.StatusCode != http.StatusOK {
+		ginkgo.GinkgoT().Logf("got status code %d from Control API", resp.StatusCode)
+		return nil, err
+	}
+	var ret map[string]interface{}
+	dec := json.NewDecoder(resp.Body)
+	if err := dec.Decode(&ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+}
+
 // ListApisixUpstreams list all upstreams from APISIX
 func (s *Scaffold) ListApisixUpstreams() ([]*v1.Upstream, error) {
 	u := url.URL{
@@ -286,14 +311,16 @@ func (s *Scaffold) ListApisixTls() ([]*v1.Ssl, error) {
 
 func (s *Scaffold) newAPISIXTunnels() error {
 	var (
-		adminNodePort int
-		httpNodePort  int
-		httpsNodePort int
-		adminPort     int
-		httpPort      int
-		httpsPort     int
-		tcpPort       int
-		tcpNodePort   int
+		adminNodePort   int
+		httpNodePort    int
+		httpsNodePort   int
+		tcpNodePort     int
+		controlNodePort int
+		adminPort       int
+		httpPort        int
+		httpsPort       int
+		tcpPort         int
+		controlPort     int
 	)
 	for _, port := range s.apisixService.Spec.Ports {
 		if port.Name == "http" {
@@ -308,6 +335,9 @@ func (s *Scaffold) newAPISIXTunnels() error {
 		} else if port.Name == "tcp" {
 			tcpNodePort = int(port.NodePort)
 			tcpPort = int(port.Port)
+		} else if port.Name == "http-control" {
+			controlNodePort = int(port.NodePort)
+			controlPort = int(port.Port)
 		}
 	}
 
@@ -319,6 +349,8 @@ func (s *Scaffold) newAPISIXTunnels() error {
 		httpsNodePort, httpsPort)
 	s.apisixTCPTunnel = k8s.NewTunnel(s.kubectlOptions, k8s.ResourceTypeService, "apisix-service-e2e-test",
 		tcpNodePort, tcpPort)
+	s.apisixControlTunnel = k8s.NewTunnel(s.kubectlOptions, k8s.ResourceTypeService, "apisix-service-e2e-test",
+		controlNodePort, controlPort)
 
 	if err := s.apisixAdminTunnel.ForwardPortE(s.t); err != nil {
 		return err
@@ -336,6 +368,10 @@ func (s *Scaffold) newAPISIXTunnels() error {
 		return err
 	}
 	s.addFinalizers(s.apisixTCPTunnel.Close)
+	if err := s.apisixControlTunnel.ForwardPortE(s.t); err != nil {
+		return err
+	}
+	s.addFinalizers(s.apisixControlTunnel.Close)
 	return nil
 }
 
diff --git a/test/e2e/scaffold/scaffold.go b/test/e2e/scaffold/scaffold.go
index ab63cd2..7c778b7 100644
--- a/test/e2e/scaffold/scaffold.go
+++ b/test/e2e/scaffold/scaffold.go
@@ -62,10 +62,11 @@ type Scaffold struct {
 	httpbinService    *corev1.Service
 	finializers       []func()
 
-	apisixAdminTunnel *k8s.Tunnel
-	apisixHttpTunnel  *k8s.Tunnel
-	apisixHttpsTunnel *k8s.Tunnel
-	apisixTCPTunnel   *k8s.Tunnel
+	apisixAdminTunnel   *k8s.Tunnel
+	apisixHttpTunnel    *k8s.Tunnel
+	apisixHttpsTunnel   *k8s.Tunnel
+	apisixTCPTunnel     *k8s.Tunnel
+	apisixControlTunnel *k8s.Tunnel
 
 	// Used for template rendering.
 	EtcdServiceFQDN string
diff --git a/test/e2e/testdata/apisix-gw-config.yaml b/test/e2e/testdata/apisix-gw-config.yaml
index 4225a3a..f9af36e 100644
--- a/test/e2e/testdata/apisix-gw-config.yaml
+++ b/test/e2e/testdata/apisix-gw-config.yaml
@@ -23,6 +23,7 @@ apisix:
   node_listen: 9080              # APISIX listening port
   enable_admin: true
   enable_admin_cors: true         # Admin API support CORS response headers.
+  enable_control: true
   enable_debug: false
   enable_dev_mode: false          # Sets nginx worker_processes to 1 if set to true
   enable_reuseport: true          # Enable nginx SO_REUSEPORT switch if set to true.
@@ -136,6 +137,7 @@ plugins:                          # plugin list
   - ip-restriction
   - referer-restriction
   - grpc-transcode
+  - server-info
   - serverless-pre-function
   - serverless-post-function
   - openid-connect