From d6b96fee5a2277f269fcaf5e326fe9d3bcd7c175 Mon Sep 17 00:00:00 2001 From: wyike Date: Mon, 11 Apr 2022 17:46:46 +0800 Subject: [PATCH] Fix: add e2e apiserver test for addon (#3607) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * add e2e apiserver test for addon Signed-off-by: 楚岳 delete comment Signed-off-by: 楚岳 fix * fix test Signed-off-by: 楚岳 * close the reponse body Signed-off-by: 楚岳 * cover list enabled addon Signed-off-by: 楚岳 fix e2e test Signed-off-by: 楚岳 fix test Signed-off-by: 楚岳 fix test * fix test Signed-off-by: 楚岳 --- makefiles/e2e.mk | 1 + pkg/apiserver/rest/webservice/addon.go | 2 +- test/e2e-apiserver-test/addon_test.go | 222 +++++++++++++++++-------- test/e2e-apiserver-test/suite_test.go | 1 - 4 files changed, 152 insertions(+), 74 deletions(-) diff --git a/makefiles/e2e.mk b/makefiles/e2e.mk index 1d85a38d6..8d1aa2ef7 100644 --- a/makefiles/e2e.mk +++ b/makefiles/e2e.mk @@ -48,6 +48,7 @@ ADDONSERVER = $(shell pgrep vela_addon_mock_server) e2e-apiserver-test: pkill vela_addon_mock_server || true go run ./e2e/addon/mock/vela_addon_mock_server.go & + sleep 15 go test -v -coverpkg=./... -coverprofile=/tmp/e2e_apiserver_test.out ./test/e2e-apiserver-test @$(OK) tests pass diff --git a/pkg/apiserver/rest/webservice/addon.go b/pkg/apiserver/rest/webservice/addon.go index b4fe6cf9d..6090435eb 100644 --- a/pkg/apiserver/rest/webservice/addon.go +++ b/pkg/apiserver/rest/webservice/addon.go @@ -296,7 +296,7 @@ func (s *enabledAddonWebService) GetWebService() *restful.WebService { Filter(s.rbacUsecase.CheckPerm("addon", "list")). Param(ws.QueryParameter("registry", "filter addons from given registry").DataType("string")). Param(ws.QueryParameter("query", "Fuzzy search based on name and description.").DataType("string")). - Returns(200, "OK", apis.ListAddonResponse{}). + Returns(200, "OK", apis.ListEnabledAddonResponse{}). Returns(400, "Bad Request", bcode.Bcode{}). Writes(apis.ListAddonResponse{})) diff --git a/test/e2e-apiserver-test/addon_test.go b/test/e2e-apiserver-test/addon_test.go index e9309b9ef..acc725382 100644 --- a/test/e2e-apiserver-test/addon_test.go +++ b/test/e2e-apiserver-test/addon_test.go @@ -17,92 +17,170 @@ limitations under the License. package e2e_apiserver_test import ( - "encoding/json" + "fmt" "time" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" - "github.com/pkg/errors" "github.com/oam-dev/kubevela/pkg/addon" - apis "github.com/oam-dev/kubevela/pkg/apiserver/rest/apis/v1" + apisv1 "github.com/oam-dev/kubevela/pkg/apiserver/rest/apis/v1" ) var _ = Describe("Test addon rest api", func() { - registryName := "test-addon-registry" - createReq := apis.CreateAddonRegistryRequest{ - Name: registryName, - Oss: &addon.OSSAddonSource{ - Endpoint: "https://oss-cn-hangzhou.aliyuncs.com", - Bucket: "fake-kubevela-addons", - }, - } - It("should add and delete a registry, list addons from default registry", func() { - defer GinkgoRecover() - By("add registry") - createRes := post("/addon_registries", createReq) - var rmeta apis.AddonRegistry - Expect(decodeResponseBody(createRes, &rmeta)).Should(Succeed()) - Expect(rmeta.Name).Should(Equal(createReq.Name)) - Expect(rmeta.Git).Should(Equal(createReq.Git)) - Expect(rmeta.OSS).Should(Equal(createReq.Oss)) + Describe("addon registry apiServer test", func() { + It("list addon registry", func() { + resp := get("/addon_registries") + defer resp.Body.Close() + var addonRegistry apisv1.ListAddonRegistryResponse + Expect(decodeResponseBody(resp, &addonRegistry)).Should(Succeed()) + Expect(len(addonRegistry.Registries)).Should(BeEquivalentTo(1)) + }) - deleteRes := delete("/addon_registries/" + createReq.Name) - Expect(decodeResponseBody(deleteRes, nil)).Should(Succeed()) - }) - - It("list addons", func() { - DefaultRegistry := "KubeVela" - listRes := get("/addons/") - var lres apis.ListAddonResponse - Expect(decodeResponseBody(listRes, &lres)).Should(Succeed()) - Expect(lres.Addons).ShouldNot(BeZero()) - Expect(lres.Addons[0].RegistryName).To(Equal(DefaultRegistry)) - - By("get addon detail") - detailRes := get("/addons/terraform-alibaba") - var dres apis.DetailAddonResponse - Expect(decodeResponseBody(detailRes, &dres)).Should(Succeed()) - Expect(dres.Meta).ShouldNot(BeNil()) - Expect(dres.UISchema).ShouldNot(BeNil()) - Expect(dres.APISchema).ShouldNot(BeNil()) - Expect(dres.RegistryName).Should(Equal(DefaultRegistry)) - }) - - PIt("should enable and disable an addon", func() { - defer GinkgoRecover() - req := apis.EnableAddonRequest{ - Args: map[string]interface{}{ - "example": "test-args", - }, - } - testAddon := "example" - res := post("/addons/"+testAddon+"/enable", req) - var statusRes apis.AddonStatusResponse - Expect(decodeResponseBody(res, &statusRes)).Should(Succeed()) - Expect(statusRes.Phase).Should(Equal(apis.AddonPhaseEnabling)) - - // Wait for addon enabled - - period := 30 * time.Second - timeout := 2 * time.Minute - Eventually(func() error { - res = get("/addons/" + testAddon + "/status") - defer res.Body.Close() - err := json.NewDecoder(res.Body).Decode(&statusRes) - Expect(err).Should(BeNil()) - if statusRes.Phase == apis.AddonPhaseEnabled { - return nil + It("add addon registry", func() { + req := apisv1.CreateAddonRegistryRequest{ + Name: "test-registry", + Git: &addon.GitAddonSource{ + URL: "github.com/test-path", + }, } - return errors.New("not ready") - }, timeout, period).Should(BeNil()) + res := post("/addon_registries", req) + defer res.Body.Close() + var registry apisv1.AddonRegistry + Expect(decodeResponseBody(res, ®istry)).Should(Succeed()) + Expect(registry.Git).ShouldNot(BeNil()) + Expect(registry.Git.URL).Should(BeEquivalentTo("github.com/test-path")) - res = post("/addons/"+testAddon+"/disable", req) - Expect(decodeResponseBody(res, &statusRes)).Should(Succeed()) + resp := get("/addon_registries") + var addonRegistry apisv1.ListAddonRegistryResponse + Expect(decodeResponseBody(resp, &addonRegistry)).Should(Succeed()) + Expect(len(addonRegistry.Registries)).Should(BeEquivalentTo(2)) + }) + + It("update an addon registry", func() { + req := apisv1.UpdateAddonRegistryRequest{ + Git: &addon.GitAddonSource{ + URL: "github.com/another-path", + }, + } + res := put("/addon_registries"+"/test-registry", req) + defer res.Body.Close() + var registry apisv1.AddonRegistry + Expect(decodeResponseBody(res, ®istry)).Should(Succeed()) + Expect(registry.Git).ShouldNot(BeNil()) + Expect(registry.Git.URL).Should(BeEquivalentTo("github.com/another-path")) + + resp := get("/addon_registries") + var addonRegistry apisv1.ListAddonRegistryResponse + Expect(decodeResponseBody(resp, &addonRegistry)).Should(Succeed()) + Expect(len(addonRegistry.Registries)).Should(BeEquivalentTo(2)) + Expect(addonRegistry.Registries[1].Git.URL).Should(BeEquivalentTo("github.com/another-path")) + }) + + It("delete an addon registry", func() { + res := delete("/addon_registries" + "/test-registry") + defer res.Body.Close() + var registry apisv1.AddonRegistry + Expect(decodeResponseBody(res, ®istry)).Should(Succeed()) + }) }) - It("should delete test registry", func() { - defer GinkgoRecover() + Describe("addon apiServer test", func() { + It("list addons", func() { + res := get("/addons") + defer res.Body.Close() + var addons apisv1.ListAddonResponse + Expect(decodeResponseBody(res, &addons)).Should(Succeed()) + Expect(len(addons.Addons)).ShouldNot(BeEquivalentTo(0)) + }) + + It("get addon detail", func() { + res := get("/addons/fluxcd") + defer res.Body.Close() + var addon apisv1.DetailAddonResponse + Expect(decodeResponseBody(res, &addon)).Should(Succeed()) + Expect(addon.Name).Should(BeEquivalentTo("fluxcd")) + }) + + It("enable addon ", func() { + req := apisv1.EnableAddonRequest{ + Args: map[string]interface{}{ + "testkey": "testvalue", + }, + } + res := post("/addons/fluxcd/enable", req) + defer res.Body.Close() + var addon apisv1.AddonStatusResponse + Expect(decodeResponseBody(res, &addon)).Should(Succeed()) + Expect(addon.Name).Should(BeEquivalentTo("fluxcd")) + Expect(len(addon.Args)).Should(BeEquivalentTo(1)) + Expect(addon.Args["testkey"]).Should(BeEquivalentTo("testvalue")) + }) + + It("addon status", func() { + res := get("/addons/fluxcd/status") + defer res.Body.Close() + var addonStatus apisv1.AddonStatusResponse + Expect(decodeResponseBody(res, &addonStatus)).Should(Succeed()) + Expect(addonStatus.Name).Should(BeEquivalentTo("fluxcd")) + Expect(len(addonStatus.Args)).Should(BeEquivalentTo(1)) + Expect(addonStatus.Args["testkey"]).Should(BeEquivalentTo("testvalue")) + }) + + It("not enabled addon status", func() { + res := get("/addons/example/status") + defer res.Body.Close() + var addonStatus apisv1.AddonStatusResponse + Expect(decodeResponseBody(res, &addonStatus)).Should(Succeed()) + Expect(addonStatus.Name).Should(BeEquivalentTo("example")) + Expect(addonStatus.Phase).Should(BeEquivalentTo("disabled")) + }) + + It("update addon ", func() { + req := apisv1.EnableAddonRequest{ + Args: map[string]interface{}{ + "testkey": "new-testvalue", + }, + } + res := put("/addons/fluxcd/update", req) + defer res.Body.Close() + var addonStatus apisv1.AddonStatusResponse + Expect(decodeResponseBody(res, &addonStatus)).Should(Succeed()) + Expect(addonStatus.Name).Should(BeEquivalentTo("fluxcd")) + Expect(len(addonStatus.Args)).Should(BeEquivalentTo(1)) + Expect(addonStatus.Args["testkey"]).Should(BeEquivalentTo("new-testvalue")) + + status := get("/addons/fluxcd/status") + var newaddonStatus apisv1.AddonStatusResponse + Expect(decodeResponseBody(status, &newaddonStatus)).Should(Succeed()) + Expect(newaddonStatus.Name).Should(BeEquivalentTo("fluxcd")) + Expect(len(newaddonStatus.Args)).Should(BeEquivalentTo(1)) + Expect(newaddonStatus.Args["testkey"]).Should(BeEquivalentTo("new-testvalue")) + }) + + It("list enabled addon", func() { + Eventually(func() error { + res := get("/enabled_addon/") + defer res.Body.Close() + var addonList apisv1.ListEnabledAddonResponse + err := decodeResponseBody(res, &addonList) + if err != nil { + return err + } + if len(addonList.EnabledAddons) == 0 { + return fmt.Errorf("error number") + } + return nil + }, 30*time.Second, 300*time.Millisecond).Should(BeNil()) + }) + + It("disable addon ", func() { + res := post("/addons/fluxcd/disable", nil) + defer res.Body.Close() + var addonStatus apisv1.AddonStatusResponse + Expect(decodeResponseBody(res, &addonStatus)).Should(Succeed()) + Expect(addonStatus.Name).Should(BeEquivalentTo("fluxcd")) + }) }) }) diff --git a/test/e2e-apiserver-test/suite_test.go b/test/e2e-apiserver-test/suite_test.go index d0b26d9a6..f236fcbea 100644 --- a/test/e2e-apiserver-test/suite_test.go +++ b/test/e2e-apiserver-test/suite_test.go @@ -200,7 +200,6 @@ func delete(path string) *http.Response { req.Header.Add("Authorization", token) response, err := client.Do(req) Expect(err).Should(BeNil()) - defer response.Body.Close() return response }