From 2fc0f1cd2b445c1dbd5eabed1ec15bcd94138d8c Mon Sep 17 00:00:00 2001 From: Tianxin Dong Date: Wed, 17 Nov 2021 15:29:36 +0800 Subject: [PATCH] Feat: add app revision list and detail api (#2722) * Feat: add app revision list and detail api * add envName and status filter * make swagger doc * revert ui-schema --- docs/apidoc/swagger.json | 323 ++++++++++++++++-- pkg/apiserver/model/application.go | 5 + pkg/apiserver/rest/apis/v1/types.go | 23 +- pkg/apiserver/rest/usecase/application.go | 78 ++++- .../rest/usecase/application_test.go | 45 +++ pkg/apiserver/rest/usecase/workflow.go | 20 +- pkg/apiserver/rest/usecase/workflow_test.go | 1 + pkg/apiserver/rest/webservice/application.go | 54 +++ pkg/apiserver/rest/webservice/workflow.go | 4 +- 9 files changed, 499 insertions(+), 54 deletions(-) diff --git a/docs/apidoc/swagger.json b/docs/apidoc/swagger.json index 8afb9ddf0..c4cc5281b 100644 --- a/docs/apidoc/swagger.json +++ b/docs/apidoc/swagger.json @@ -1305,6 +1305,113 @@ } } }, + "/api/v1/applications/{name}/revisions": { + "get": { + "consumes": [ + "application/xml", + "application/json" + ], + "produces": [ + "application/json", + "application/xml" + ], + "tags": [ + "application" + ], + "summary": "list revisions for application", + "operationId": "listApplicationRevisions", + "parameters": [ + { + "type": "string", + "description": "identifier of the application ", + "name": "name", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "query identifier of the env", + "name": "envName", + "in": "query" + }, + { + "type": "string", + "description": "query identifier of the status", + "name": "status", + "in": "query" + }, + { + "type": "integer", + "description": "query the page number", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "query the page size number", + "name": "pageSize", + "in": "query" + } + ], + "responses": { + "200": { + "schema": { + "$ref": "#/definitions/v1.ListRevisionsResponse" + } + }, + "400": { + "schema": { + "$ref": "#/definitions/bcode.Bcode" + } + } + } + } + }, + "/api/v1/applications/{name}/revisions/{revision}": { + "get": { + "consumes": [ + "application/xml", + "application/json" + ], + "produces": [ + "application/json", + "application/xml" + ], + "tags": [ + "application" + ], + "summary": "detail revision for application", + "operationId": "detailApplicationRevision", + "parameters": [ + { + "type": "string", + "description": "identifier of the application", + "name": "name", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "identifier of the application revision", + "name": "revision", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "schema": { + "$ref": "#/definitions/v1.DetailRevisionResponse" + } + }, + "400": { + "schema": { + "$ref": "#/definitions/bcode.Bcode" + } + } + } + } + }, "/api/v1/applications/{name}/template": { "post": { "consumes": [ @@ -1857,9 +1964,9 @@ "parameters": [ { "enum": [ + "workflowstep", "component", - "trait", - "workflowstep" + "trait" ], "type": "string", "description": "query the definition type", @@ -2477,17 +2584,15 @@ }, { "type": "integer", - "description": "Query the page number.", + "description": "query the page number", "name": "page", - "in": "path", - "required": true + "in": "query" }, { "type": "integer", - "description": "Query the page size number.", + "description": "query the page size number", "name": "pageSize", - "in": "path", - "required": true + "in": "query" } ], "responses": { @@ -2744,11 +2849,11 @@ }, "common.AppRolloutStatus": { "required": [ - "upgradedReadyReplicas", "rollingState", "batchRollingState", "currentBatch", "upgradedReplicas", + "upgradedReadyReplicas", "lastTargetAppRevision" ], "properties": { @@ -3320,6 +3425,61 @@ } } }, + "model.ApplicationRevision": { + "required": [ + "createTime", + "updateTime", + "appPrimaryKey", + "version", + "status", + "reason", + "deployUser", + "note", + "triggerType", + "workflowName", + "envName" + ], + "properties": { + "appPrimaryKey": { + "type": "string" + }, + "applyAppConfig": { + "type": "string" + }, + "createTime": { + "type": "string", + "format": "date-time" + }, + "deployUser": { + "type": "string" + }, + "envName": { + "type": "string" + }, + "note": { + "type": "string" + }, + "reason": { + "type": "string" + }, + "status": { + "type": "string" + }, + "triggerType": { + "type": "string" + }, + "updateTime": { + "type": "string", + "format": "date-time" + }, + "version": { + "type": "string" + }, + "workflowName": { + "type": "string" + } + } + }, "model.ApplicationTrait": { "required": [ "alias", @@ -3778,17 +3938,26 @@ }, "v1.ApplicationDeployResponse": { "required": [ - "deployUser", - "note", - "triggerType", + "createTime", "version", "status", - "reason" + "reason", + "deployUser", + "note", + "envName", + "triggerType" ], "properties": { + "createTime": { + "type": "string", + "format": "date-time" + }, "deployUser": { "type": "string" }, + "envName": { + "type": "string" + }, "note": { "type": "string" }, @@ -3863,17 +4032,26 @@ }, "v1.ApplicationRevisionBase": { "required": [ + "createTime", "version", "status", "reason", "deployUser", "note", + "envName", "triggerType" ], "properties": { + "createTime": { + "type": "string", + "format": "date-time" + }, "deployUser": { "type": "string" }, + "envName": { + "type": "string" + }, "note": { "type": "string" }, @@ -4625,10 +4803,10 @@ }, "v1.DetailAddonResponse": { "required": [ - "version", "description", "icon", "name", + "version", "schema", "uiSchema" ], @@ -4679,13 +4857,13 @@ }, "v1.DetailApplicationResponse": { "required": [ - "icon", + "name", + "namespace", "description", "createTime", "updateTime", - "name", + "icon", "alias", - "namespace", "policies", "status", "resourceInfo", @@ -4749,20 +4927,20 @@ }, "v1.DetailClusterResponse": { "required": [ - "kubeConfigSecret", - "description", + "createTime", + "alias", "icon", + "status", + "reason", "provider", "dashboardURL", + "updateTime", + "name", "labels", - "status", + "description", "apiServerURL", "kubeConfig", - "createTime", - "updateTime", - "alias", - "reason", - "name", + "kubeConfigSecret", "resourceInfo" ], "properties": { @@ -4820,13 +4998,13 @@ }, "v1.DetailComponentResponse": { "required": [ - "createTime", - "name", - "alias", - "type", + "appPrimaryKey", "creator", + "name", + "type", + "createTime", "updateTime", - "appPrimaryKey" + "alias" ], "properties": { "alias": { @@ -4921,10 +5099,10 @@ }, "v1.DetailDeliveryTargetResponse": { "required": [ - "createTime", "updateTime", "name", - "namespace" + "namespace", + "createTime" ], "properties": { "alias": { @@ -4957,13 +5135,13 @@ }, "v1.DetailPolicyResponse": { "required": [ + "createTime", + "updateTime", "name", "type", "description", "creator", - "properties", - "createTime", - "updateTime" + "properties" ], "properties": { "createTime": { @@ -4991,12 +5169,67 @@ } } }, + "v1.DetailRevisionResponse": { + "required": [ + "triggerType", + "workflowName", + "createTime", + "appPrimaryKey", + "reason", + "deployUser", + "note", + "updateTime", + "version", + "status", + "envName" + ], + "properties": { + "appPrimaryKey": { + "type": "string" + }, + "applyAppConfig": { + "type": "string" + }, + "createTime": { + "type": "string", + "format": "date-time" + }, + "deployUser": { + "type": "string" + }, + "envName": { + "type": "string" + }, + "note": { + "type": "string" + }, + "reason": { + "type": "string" + }, + "status": { + "type": "string" + }, + "triggerType": { + "type": "string" + }, + "updateTime": { + "type": "string", + "format": "date-time" + }, + "version": { + "type": "string" + }, + "workflowName": { + "type": "string" + } + } + }, "v1.DetailWorkflowRecordResponse": { "required": [ + "terminated", "name", "namespace", "suspend", - "terminated", "deployTime", "deployUser", "note", @@ -5292,6 +5525,24 @@ } } }, + "v1.ListRevisionsResponse": { + "required": [ + "revisions", + "total" + ], + "properties": { + "revisions": { + "type": "array", + "items": { + "$ref": "#/definitions/v1.ApplicationRevisionBase" + } + }, + "total": { + "type": "integer", + "format": "int64" + } + } + }, "v1.ListWorkflowRecordsResponse": { "required": [ "records", diff --git a/pkg/apiserver/model/application.go b/pkg/apiserver/model/application.go index 32323277f..e26e47e95 100644 --- a/pkg/apiserver/model/application.go +++ b/pkg/apiserver/model/application.go @@ -216,6 +216,8 @@ type ApplicationRevision struct { // WorkflowName deploy controller by workflow WorkflowName string `json:"workflowName"` + // EnvName is the env name of this application revision + EnvName string `json:"envName"` } // TableName return custom table name @@ -249,5 +251,8 @@ func (a *ApplicationRevision) Index() map[string]string { if a.TriggerType != "" { index["triggerType"] = a.TriggerType } + if a.EnvName != "" { + index["envName"] = a.EnvName + } return index } diff --git a/pkg/apiserver/rest/apis/v1/types.go b/pkg/apiserver/rest/apis/v1/types.go index 9ea42175f..6ac439710 100644 --- a/pkg/apiserver/rest/apis/v1/types.go +++ b/pkg/apiserver/rest/apis/v1/types.go @@ -676,11 +676,24 @@ type DeliveryTargetBase struct { // ApplicationRevisionBase application revision base spec type ApplicationRevisionBase struct { - Version string `json:"version"` - Status string `json:"status"` - Reason string `json:"reason"` - DeployUser string `json:"deployUser"` - Note string `json:"note"` + CreateTime time.Time `json:"createTime"` + Version string `json:"version"` + Status string `json:"status"` + Reason string `json:"reason"` + DeployUser string `json:"deployUser"` + Note string `json:"note"` + EnvName string `json:"envName"` // SourceType the event trigger source, Web or API TriggerType string `json:"triggerType"` } + +// ListRevisionsResponse list application revisions +type ListRevisionsResponse struct { + Revisions []ApplicationRevisionBase `json:"revisions"` + Total int64 `json:"total"` +} + +// DetailRevisionResponse get application revision detail +type DetailRevisionResponse struct { + model.ApplicationRevision +} diff --git a/pkg/apiserver/rest/usecase/application.go b/pkg/apiserver/rest/usecase/application.go index 92d83e76d..ce96d9d8a 100644 --- a/pkg/apiserver/rest/usecase/application.go +++ b/pkg/apiserver/rest/usecase/application.go @@ -84,6 +84,8 @@ type ApplicationUsecase interface { CreateApplicationTrait(ctx context.Context, app *model.Application, component *model.ApplicationComponent, req apisv1.CreateApplicationTraitRequest) (*apisv1.ApplicationTrait, error) DeleteApplicationTrait(ctx context.Context, app *model.Application, component *model.ApplicationComponent, traitType string) error UpdateApplicationTrait(ctx context.Context, app *model.Application, component *model.ApplicationComponent, traitType string, req apisv1.UpdateApplicationTraitRequest) (*apisv1.ApplicationTrait, error) + ListRevisions(ctx context.Context, appName, envName, status string, page, pageSize int) (*apisv1.ListRevisionsResponse, error) + DetailRevision(ctx context.Context, appName, revisionName string) (*apisv1.DetailRevisionResponse, error) } type applicationUsecaseImpl struct { @@ -583,6 +585,11 @@ func (c *applicationUsecaseImpl) Deploy(ctx context.Context, app *model.Applicat } } + workflow, err := c.workflowUsecase.GetWorkflow(ctx, oamApp.Annotations[oam.AnnotationWorkflowName]) + if err != nil { + return nil, err + } + var appRevision = &model.ApplicationRevision{ AppPrimaryKey: app.PrimaryKey(), Version: version, @@ -593,6 +600,7 @@ func (c *applicationUsecaseImpl) Deploy(ctx context.Context, app *model.Applicat Note: req.Note, TriggerType: req.TriggerType, WorkflowName: oamApp.Annotations[oam.AnnotationWorkflowName], + EnvName: workflow.EnvName, } if err := c.ds.Add(ctx, appRevision); err != nil { @@ -636,23 +644,23 @@ func (c *applicationUsecaseImpl) Deploy(ctx context.Context, app *model.Applicat }, nil } -func (c *applicationUsecaseImpl) renderOAMApplication(ctx context.Context, appMoel *model.Application, reqWorkflowName, version string) (*v1beta1.Application, error) { +func (c *applicationUsecaseImpl) renderOAMApplication(ctx context.Context, appModel *model.Application, reqWorkflowName, version string) (*v1beta1.Application, error) { var app = &v1beta1.Application{ TypeMeta: metav1.TypeMeta{ Kind: "Application", APIVersion: "core.oam.dev/v1beta1", }, ObjectMeta: metav1.ObjectMeta{ - Name: appMoel.Name, - Namespace: appMoel.Namespace, - Labels: appMoel.Labels, + Name: appModel.Name, + Namespace: appModel.Namespace, + Labels: appModel.Labels, Annotations: map[string]string{ oam.AnnotationDeployVersion: version, }, }, } var component = model.ApplicationComponent{ - AppPrimaryKey: appMoel.PrimaryKey(), + AppPrimaryKey: appModel.PrimaryKey(), } components, err := c.ds.List(ctx, &component, &datastore.ListOptions{}) if err != nil { @@ -663,7 +671,7 @@ func (c *applicationUsecaseImpl) renderOAMApplication(ctx context.Context, appMo } var policy = model.ApplicationPolicy{ - AppPrimaryKey: appMoel.PrimaryKey(), + AppPrimaryKey: appModel.PrimaryKey(), } policies, err := c.ds.List(ctx, &policy, &datastore.ListOptions{}) if err != nil { @@ -720,7 +728,7 @@ func (c *applicationUsecaseImpl) renderOAMApplication(ctx context.Context, appMo return nil, err } } else { - workflow, err = c.workflowUsecase.GetApplicationDefaultWorkflow(ctx, appMoel) + workflow, err = c.workflowUsecase.GetApplicationDefaultWorkflow(ctx, appModel) if err != nil && !errors.Is(err, bcode.ErrWorkflowNoDefault) { return nil, err } @@ -1171,6 +1179,62 @@ func (c *applicationUsecaseImpl) UpdateApplicationTrait(ctx context.Context, app return nil, bcode.ErrTraitNotExist } +func (c *applicationUsecaseImpl) ListRevisions(ctx context.Context, appName, envName, status string, page, pageSize int) (*apisv1.ListRevisionsResponse, error) { + var revision = model.ApplicationRevision{ + AppPrimaryKey: appName, + } + if envName != "" { + revision.EnvName = envName + } + if status != "" { + revision.Status = status + } + + revisions, err := c.ds.List(ctx, &revision, &datastore.ListOptions{Page: page, PageSize: pageSize}) + if err != nil { + return nil, err + } + + resp := &apisv1.ListRevisionsResponse{ + Revisions: []apisv1.ApplicationRevisionBase{}, + } + for _, raw := range revisions { + r, ok := raw.(*model.ApplicationRevision) + if ok { + resp.Revisions = append(resp.Revisions, apisv1.ApplicationRevisionBase{ + CreateTime: r.CreateTime, + Version: r.Version, + Status: r.Status, + Reason: r.Reason, + DeployUser: r.DeployUser, + Note: r.Note, + EnvName: r.EnvName, + TriggerType: r.TriggerType, + }) + } + } + count, err := c.ds.Count(ctx, &revision) + if err != nil { + return nil, err + } + resp.Total = count + + return resp, nil +} + +func (c *applicationUsecaseImpl) DetailRevision(ctx context.Context, appName, revisionName string) (*apisv1.DetailRevisionResponse, error) { + var revision = model.ApplicationRevision{ + AppPrimaryKey: appName, + Version: revisionName, + } + if err := c.ds.Get(ctx, &revision); err != nil { + return nil, err + } + return &apisv1.DetailRevisionResponse{ + ApplicationRevision: revision, + }, nil +} + func createEnvBind(envBind apisv1.EnvBinding) v1alpha1.EnvConfig { placement := v1alpha1.EnvPlacement{} var componentSelector *v1alpha1.EnvSelector diff --git a/pkg/apiserver/rest/usecase/application_test.go b/pkg/apiserver/rest/usecase/application_test.go index 64e7502ff..91548b388 100644 --- a/pkg/apiserver/rest/usecase/application_test.go +++ b/pkg/apiserver/rest/usecase/application_test.go @@ -18,6 +18,7 @@ package usecase import ( "context" + "fmt" "io/ioutil" "strings" @@ -516,4 +517,48 @@ var _ = Describe("Test application usecase function", func() { Expect(err).Should(BeNil()) Expect(cmp.Diff(len(policies), 0)).Should(BeEmpty()) }) + + It("Test ListRevisions function", func() { + for i := 0; i < 3; i++ { + appModel := &model.ApplicationRevision{ + AppPrimaryKey: "test-app", + Version: fmt.Sprintf("%d", i), + EnvName: fmt.Sprintf("env-%d", i), + Status: model.RevisionStatusRunning, + } + if i == 0 { + appModel.Status = model.RevisionStatusTerminated + } + err := workflowUsecase.createTestApplicationRevision(context.TODO(), appModel) + Expect(err).Should(BeNil()) + } + revisions, err := appUsecase.ListRevisions(context.TODO(), "test-app", "", "", 0, 10) + Expect(err).Should(BeNil()) + Expect(revisions.Total).Should(Equal(int64(3))) + + revisions, err = appUsecase.ListRevisions(context.TODO(), "test-app", "env-0", "", 0, 10) + Expect(err).Should(BeNil()) + Expect(revisions.Total).Should(Equal(int64(1))) + + revisions, err = appUsecase.ListRevisions(context.TODO(), "test-app", "", "terminated", 0, 10) + Expect(err).Should(BeNil()) + Expect(revisions.Total).Should(Equal(int64(1))) + + revisions, err = appUsecase.ListRevisions(context.TODO(), "test-app", "env-1", "terminated", 0, 10) + Expect(err).Should(BeNil()) + Expect(revisions.Total).Should(Equal(int64(0))) + }) + + It("Test DetailRevisions function", func() { + err := workflowUsecase.createTestApplicationRevision(context.TODO(), &model.ApplicationRevision{ + AppPrimaryKey: "test-app", + Version: "123", + DeployUser: "test-user", + }) + Expect(err).Should(BeNil()) + revision, err := appUsecase.DetailRevision(context.TODO(), "test-app", "123") + Expect(err).Should(BeNil()) + Expect(revision.Version).Should(Equal("123")) + Expect(revision.DeployUser).Should(Equal("test-user")) + }) }) diff --git a/pkg/apiserver/rest/usecase/workflow.go b/pkg/apiserver/rest/usecase/workflow.go index 63ef8febd..37dc4e27e 100644 --- a/pkg/apiserver/rest/usecase/workflow.go +++ b/pkg/apiserver/rest/usecase/workflow.go @@ -311,12 +311,27 @@ func (w *workflowUsecaseImpl) SyncWorkflowRecord(ctx context.Context) error { continue } + if app.Annotations == nil { + klog.ErrorS(err, "empty application annotation", "controller revision name", cr.Name) + continue + } + + if _, ok := app.Annotations[oam.AnnotationWorkflowName]; !ok { + klog.ErrorS(err, "missing application workflow name", "controller revision name", cr.Name) + continue + } + revisionName, ok := app.Annotations[oam.AnnotationDeployVersion] + if !ok { + klog.ErrorS(err, "failed to get application revision name", "controller revision name", cr.Name) + continue + } + if err := w.createWorkflowRecord(ctx, app, strings.TrimPrefix(cr.Name, "record-")); err != nil && !errors.Is(err, datastore.ErrRecordExist) { klog.ErrorS(err, "failed to create workflow record", "controller revision name", cr.Name) continue } - err = w.updateRecordApplicationRevisionStatus(ctx, app.Name, strings.TrimPrefix(cr.Name, fmt.Sprintf("record-%s-", app.Name)), app.Status.Workflow.Terminated) + err = w.updateRecordApplicationRevisionStatus(ctx, app.Name, revisionName, app.Status.Workflow.Terminated) if err != nil && !errors.Is(err, datastore.ErrRecordNotExist) { klog.ErrorS(err, "failed to update deploy event status", "controller revision name", cr.Name) continue @@ -354,9 +369,6 @@ func (w *workflowUsecaseImpl) updateRecordApplicationRevisionStatus(ctx context. } func (w *workflowUsecaseImpl) createWorkflowRecord(ctx context.Context, app *v1beta1.Application, revisionName string) error { - if app.Annotations == nil || app.Annotations[oam.AnnotationWorkflowName] == "" { - return fmt.Errorf("missing workflow name") - } status := app.Status.Workflow return w.ds.Add(ctx, &model.WorkflowRecord{ diff --git a/pkg/apiserver/rest/usecase/workflow_test.go b/pkg/apiserver/rest/usecase/workflow_test.go index 76cefc920..37f35d7e6 100644 --- a/pkg/apiserver/rest/usecase/workflow_test.go +++ b/pkg/apiserver/rest/usecase/workflow_test.go @@ -170,6 +170,7 @@ kind: Application metadata: annotations: app.oam.dev/workflowName: test-workflow-name + app.oam.dev/deployVersion: "1234" name: test namespace: default spec: diff --git a/pkg/apiserver/rest/webservice/application.go b/pkg/apiserver/rest/webservice/application.go index 6a36ffba9..b2d706618 100644 --- a/pkg/apiserver/rest/webservice/application.go +++ b/pkg/apiserver/rest/webservice/application.go @@ -26,6 +26,7 @@ import ( "github.com/oam-dev/kubevela/pkg/apiserver/model" apis "github.com/oam-dev/kubevela/pkg/apiserver/rest/apis/v1" "github.com/oam-dev/kubevela/pkg/apiserver/rest/usecase" + "github.com/oam-dev/kubevela/pkg/apiserver/rest/utils" "github.com/oam-dev/kubevela/pkg/apiserver/rest/utils/bcode" ) @@ -269,6 +270,29 @@ func (c *applicationWebService) GetWebService() *restful.WebService { Returns(200, "", apis.ApplicationTrait{}). Returns(400, "", bcode.Bcode{}). Writes(apis.EmptyResponse{})) + + ws.Route(ws.GET("/{name}/revisions").To(c.listApplicationRevisions). + Doc("list revisions for application"). + Filter(c.appCheckFilter). + Param(ws.PathParameter("name", "identifier of the application ").DataType("string")). + Param(ws.QueryParameter("envName", "query identifier of the env").DataType("string")). + Param(ws.QueryParameter("status", "query identifier of the status").DataType("string")). + Param(ws.QueryParameter("page", "query the page number").DataType("integer")). + Param(ws.QueryParameter("pageSize", "query the page size number").DataType("integer")). + Metadata(restfulspec.KeyOpenAPITags, tags). + Returns(200, "", apis.ListRevisionsResponse{}). + Returns(400, "", bcode.Bcode{}). + Writes(apis.ListRevisionsResponse{})) + + ws.Route(ws.GET("/{name}/revisions/{revision}").To(c.detailApplicationRevision). + Doc("detail revision for application"). + Filter(c.appCheckFilter). + Param(ws.PathParameter("name", "identifier of the application").DataType("string")). + Param(ws.PathParameter("revision", "identifier of the application revision").DataType("string")). + Metadata(restfulspec.KeyOpenAPITags, tags). + Returns(200, "", apis.DetailRevisionResponse{}). + Returns(400, "", bcode.Bcode{}). + Writes(apis.DetailRevisionResponse{})) return ws } @@ -695,3 +719,33 @@ func (c *applicationWebService) getApplicationStatus(req *restful.Request, res * return } } + +func (c *applicationWebService) listApplicationRevisions(req *restful.Request, res *restful.Response) { + page, pageSize, err := utils.ExtractPagingParams(req, minPageSize, maxPageSize) + if err != nil { + bcode.ReturnError(req, res, err) + return + } + + revisions, err := c.applicationUsecase.ListRevisions(req.Request.Context(), req.PathParameter("name"), req.QueryParameter("envName"), req.QueryParameter("status"), page, pageSize) + if err != nil { + bcode.ReturnError(req, res, err) + return + } + if err := res.WriteEntity(revisions); err != nil { + bcode.ReturnError(req, res, err) + return + } +} + +func (c *applicationWebService) detailApplicationRevision(req *restful.Request, res *restful.Response) { + detail, err := c.applicationUsecase.DetailRevision(req.Request.Context(), req.PathParameter("name"), req.PathParameter("revision")) + if err != nil { + bcode.ReturnError(req, res, err) + return + } + if err := res.WriteEntity(detail); err != nil { + bcode.ReturnError(req, res, err) + return + } +} diff --git a/pkg/apiserver/rest/webservice/workflow.go b/pkg/apiserver/rest/webservice/workflow.go index 9e84d35af..8ccbecd83 100644 --- a/pkg/apiserver/rest/webservice/workflow.go +++ b/pkg/apiserver/rest/webservice/workflow.go @@ -99,8 +99,8 @@ func (w *workflowWebService) GetWebService() *restful.WebService { Param(ws.PathParameter("name", "identifier of the workflow").DataType("string")). Metadata(restfulspec.KeyOpenAPITags, tags). Filter(w.workflowCheckFilter). - Param(ws.PathParameter("page", "Query the page number.").DataType("integer")). - Param(ws.PathParameter("pageSize", "Query the page size number.").DataType("integer")). + Param(ws.QueryParameter("page", "query the page number").DataType("integer")). + Param(ws.QueryParameter("pageSize", "query the page size number").DataType("integer")). Returns(200, "", apis.ListWorkflowRecordsResponse{}). Writes(apis.ListWorkflowRecordsResponse{}).Do(returns200, returns500))