From 9e13078334005ec3516f2cac1e837e3ae2aecc94 Mon Sep 17 00:00:00 2001 From: zzxwill Date: Wed, 19 Aug 2020 22:30:32 +0800 Subject: [PATCH] Implement listing WorkloadDefinitions API implemented the API to list workloaddefinitions with the workloadtype name and all its parameters --- e2e/apiserver/apiserver_test.go | 24 +++++++++++++++++++++++- pkg/server/apis/types.go | 8 ++++++++ pkg/server/handler/workloadHandler.go | 14 ++++++++++++++ 3 files changed, 45 insertions(+), 1 deletion(-) diff --git a/e2e/apiserver/apiserver_test.go b/e2e/apiserver/apiserver_test.go index ac7914eb2..f32a7a20f 100644 --- a/e2e/apiserver/apiserver_test.go +++ b/e2e/apiserver/apiserver_test.go @@ -53,6 +53,9 @@ var notExistedEnvMeta = types.EnvMeta{ Namespace: "env-e2e-api-NOT-EXISTED-JUST-FOR-TEST", } +var containerizedWorkloadType = "containerized" +var deploymentWorkloadType = "deployment" + var _ = ginkgo.Describe("API Env", func() { //API Env e2e.APIEnvInitContext("post /envs/", envHelloMeta) @@ -99,6 +102,7 @@ var _ = ginkgo.Describe("API Env", func() { gomega.Expect(err).NotTo(gomega.HaveOccurred()) var r apis.Response err = json.Unmarshal(result, &r) + gomega.Expect(err).NotTo(gomega.HaveOccurred()) gomega.Expect(http.StatusOK).To(gomega.Equal(r.Code)) //TODO(zzxwill) Need to compare r.Data with envMeta }) @@ -137,11 +141,12 @@ var _ = ginkgo.Describe("API Env", func() { gomega.Expect(r.Data.(string)).To(gomega.ContainSubstring(expectedContent)) }) }) + }) var _ = ginkgo.Describe("API Workload", func() { - ginkgo.Context("Post /workloads/", func() { + ginkgo.Context("Workloads", func() { ginkgo.It("run workload", func() { data, err := json.Marshal(&workloadRunBody) gomega.Expect(err).NotTo(gomega.HaveOccurred()) @@ -171,5 +176,22 @@ var _ = ginkgo.Describe("API Workload", func() { output := fmt.Sprintf("required flag(s) \"image\" not set") gomega.Expect(r.Data.(string)).To(gomega.ContainSubstring(output)) }) + + ginkgo.It("should list all WorkloadDefinitions", func() { + resp, err := http.Get(util.URL("/workloads/")) + gomega.Expect(err).NotTo(gomega.HaveOccurred()) + defer resp.Body.Close() + result, err := ioutil.ReadAll(resp.Body) + gomega.Expect(err).NotTo(gomega.HaveOccurred()) + var r apis.Response + err = json.Unmarshal(result, &r) + gomega.Expect(http.StatusOK).To(gomega.Equal(r.Code)) + var data = r.Data.([]interface{}) + for _, i := range data { + var workloadDefinition = i.(map[string]interface{}) + gomega.Expect(err).NotTo(gomega.HaveOccurred()) + gomega.Expect([]string{containerizedWorkloadType, deploymentWorkloadType}).To(gomega.Or(gomega.ContainElement(workloadDefinition["name"]))) + } + }) }) }) diff --git a/pkg/server/apis/types.go b/pkg/server/apis/types.go index 85c0574ac..92cb1e7d3 100644 --- a/pkg/server/apis/types.go +++ b/pkg/server/apis/types.go @@ -1,6 +1,7 @@ package apis import ( + "github.com/cloud-native-application/rudrx/api/types" "k8s.io/apimachinery/pkg/runtime" ) @@ -20,6 +21,7 @@ type Response struct { Code int `json:"code"` Data interface{} `json:"data"` } + type WorkloadFlag struct { Name string `json:"name"` Value string `json:"value"` @@ -32,3 +34,9 @@ type WorkloadRunBody struct { Flags []WorkloadFlag `json:"flags"` Staging bool `json:"staging"` } + +type Capability struct { + Name string `json:"name"` + Parameters []types.Parameter `json:"parameters,omitempty"` + AppliesTo []string `json:"appliesTo,omitempty"` +} diff --git a/pkg/server/handler/workloadHandler.go b/pkg/server/handler/workloadHandler.go index ac24d4123..578116f03 100644 --- a/pkg/server/handler/workloadHandler.go +++ b/pkg/server/handler/workloadHandler.go @@ -57,6 +57,20 @@ func GetWorkload(c *gin.Context) { } func ListWorkload(c *gin.Context) { + var workloadDefinitionList []apis.Capability + workloads, err := plugins.LoadInstalledCapabilityWithType(types.TypeWorkload) + if err != nil { + util.HandleError(c, util.StatusInternalServerError, err) + return + } + for _, w := range workloads { + workloadDefinitionList = append(workloadDefinitionList, apis.Capability{ + Name: w.Name, + Parameters: w.Parameters, + AppliesTo: w.AppliesTo, + }) + } + util.AssembleResponse(c, workloadDefinitionList, err) } func DeleteWorkload(c *gin.Context) {