Files
kubevela/pkg/apiserver/interfaces/api/project.go
github-actions[bot] 0736e85e07 [Backport release-1.6] Feat: implement pipeline APIs (#4969)
* add context when run pipeline

Signed-off-by: Qiaozp <qiaozhongpei.qzp@alibaba-inc.com>
(cherry picked from commit 72f3ad792e)

* Feat: implement pipeline API

Signed-off-by: Qiaozp <qiaozhongpei.qzp@alibaba-inc.com>
(cherry picked from commit f560c346cc)

* Extract get log logic and implement getPipelineRunLog API

Signed-off-by: Qiaozp <qiaozhongpei.qzp@alibaba-inc.com>
(cherry picked from commit 060c6ab9e9)

* Init and delete pipeline contexts

Signed-off-by: Qiaozp <qiaozhongpei.qzp@alibaba-inc.com>
(cherry picked from commit 5e96bd3106)

* fix panic

Signed-off-by: Qiaozp <qiaozhongpei.qzp@alibaba-inc.com>
(cherry picked from commit 51072f7947)

* Allow not specifying context

Signed-off-by: Qiaozp <qiaozhongpei.qzp@alibaba-inc.com>
(cherry picked from commit 810ddcf0bd)

* change pipeline to path parameter

Signed-off-by: Qiaozp <qiaozhongpei.qzp@alibaba-inc.com>
(cherry picked from commit 3d51c0cb2d)

* Add permission check filter

Signed-off-by: Qiaozp <qiaozhongpei.qzp@alibaba-inc.com>
(cherry picked from commit 6883767430)

* project -> projects in route

Signed-off-by: Qiaozp <qiaozhongpei.qzp@alibaba-inc.com>
(cherry picked from commit 1f09f3996b)

* fix route conflict

Signed-off-by: Qiaozp <qiaozhongpei.qzp@alibaba-inc.com>
(cherry picked from commit 7eea696830)

* Add project alias

Signed-off-by: Qiaozp <qiaozhongpei.qzp@alibaba-inc.com>
(cherry picked from commit b07dd72338)

* Feat: change the list pipeline API

Signed-off-by: barnettZQG <barnett.zqg@gmail.com>
(cherry picked from commit bd804734b0)

* Feat: filter the project

Signed-off-by: barnettZQG <barnett.zqg@gmail.com>
(cherry picked from commit 82eee2cc11)

* Fix: the error of the run APi

Signed-off-by: barnettZQG <barnett.zqg@gmail.com>
(cherry picked from commit ac87bd3f1a)

* fix log pipeline run API

Signed-off-by: Qiaozp <qiaozhongpei.qzp@alibaba-inc.com>
(cherry picked from commit acde8e981e)

* Fix lint, fix the error of log api

Signed-off-by: Qiaozp <qiaozhongpei.qzp@alibaba-inc.com>
(cherry picked from commit b8373e6cde)

* fix error returning

Signed-off-by: Qiaozp <qiaozhongpei.qzp@alibaba-inc.com>
(cherry picked from commit 2e9b4792b0)

* Fix: change the lable to annotation

Signed-off-by: barnettZQG <barnett.zqg@gmail.com>
(cherry picked from commit bf08275fde)

* remove log config not found error

Signed-off-by: Qiaozp <qiaozhongpei.qzp@alibaba-inc.com>
(cherry picked from commit cdd77dfd8f)

* fix pipeline list api return no context info

Signed-off-by: Qiaozp <qiaozhongpei.qzp@alibaba-inc.com>
(cherry picked from commit cdcfa165d1)

* Fix: create the namespace

Signed-off-by: barnettZQG <barnett.zqg@gmail.com>
(cherry picked from commit b6888dd87d)

* get pipeline lastrun info

Signed-off-by: Qiaozp <qiaozhongpei.qzp@alibaba-inc.com>
(cherry picked from commit a943423d22)

* allow query single step output

Signed-off-by: Qiaozp <qiaozhongpei.qzp@alibaba-inc.com>
(cherry picked from commit e2310bbf34)

* organize code in api layer

Signed-off-by: Qiaozp <qiaozhongpei.qzp@alibaba-inc.com>
(cherry picked from commit 6fd53ed078)

* fix project filter, add context value when get pp run, extend lastRun

Signed-off-by: Qiaozp <qiaozhongpei.qzp@alibaba-inc.com>
(cherry picked from commit 861f69d555)

* fix get output and implement get input api

Signed-off-by: Qiaozp <qiaozhongpei.qzp@alibaba-inc.com>
(cherry picked from commit 61495ee70d)

* Fix: change the last run

Signed-off-by: barnettZQG <barnett.zqg@gmail.com>
(cherry picked from commit aeb842a45e)

* if query sub-step outout, return it directly

Signed-off-by: Qiaozp <qiaozhongpei.qzp@alibaba-inc.com>
(cherry picked from commit 467ba25751)

* Fix: change the run stats

Signed-off-by: barnettZQG <barnett.zqg@gmail.com>
(cherry picked from commit 7a90e7e310)

* Fix: change the output

Signed-off-by: barnettZQG <barnett.zqg@gmail.com>
(cherry picked from commit 595a871b0d)

* flatten the input/output api

Signed-off-by: Qiaozp <qiaozhongpei.qzp@alibaba-inc.com>
(cherry picked from commit efc9692354)

* more info for i/o vars

Signed-off-by: Qiaozp <qiaozhongpei.qzp@alibaba-inc.com>
(cherry picked from commit 7fe0e1109c)

* fix nested i/o struct

Signed-off-by: Qiaozp <qiaozhongpei.qzp@alibaba-inc.com>
(cherry picked from commit 201d1228bd)

* add fromStep in input api

Signed-off-by: Qiaozp <qiaozhongpei.qzp@alibaba-inc.com>
(cherry picked from commit 2400018962)

* add e2e test skeleton

Signed-off-by: Qiaozp <qiaozhongpei.qzp@alibaba-inc.com>
(cherry picked from commit f20f9a1ac6)

* add more e2e test

Signed-off-by: Qiaozp <qiaozhongpei.qzp@alibaba-inc.com>
(cherry picked from commit 98b27f886b)

* use db to store pipeline

Signed-off-by: Qiaozp <qiaozhongpei.qzp@alibaba-inc.com>
(cherry picked from commit 08962c4f2f)

* keep the last 5k lines of log

Signed-off-by: Qiaozp <qiaozhongpei.qzp@alibaba-inc.com>
(cherry picked from commit 22b352da14)

* use stern param to keep last lines of logs

Signed-off-by: Qiaozp <qiaozhongpei.qzp@alibaba-inc.com>
(cherry picked from commit 3eadbf91c8)

* filter, nil labels, spec check

Signed-off-by: Qiaozp <qiaozhongpei.qzp@alibaba-inc.com>
(cherry picked from commit bad90b3f7a)

* empty res, index, detail param

Signed-off-by: Qiaozp <qiaozhongpei.qzp@alibaba-inc.com>
(cherry picked from commit b12d889e97)

* Add e2e test

Signed-off-by: Qiaozp <qiaozhongpei.qzp@alibaba-inc.com>
(cherry picked from commit ae617a928e)

* fix e2e test and unit test

Signed-off-by: Qiaozp <qiaozhongpei.qzp@alibaba-inc.com>
(cherry picked from commit 0f4e030b84)

* add context e2e test

Signed-off-by: Qiaozp <qiaozhongpei.qzp@alibaba-inc.com>
(cherry picked from commit 88879e6e43)

* goimports

Signed-off-by: Qiaozp <qiaozhongpei.qzp@alibaba-inc.com>
(cherry picked from commit 58429978b3)

* add more test

Signed-off-by: Qiaozp <qiaozhongpei.qzp@alibaba-inc.com>
(cherry picked from commit 75760521a4)

* review

Signed-off-by: Qiaozp <qiaozhongpei.qzp@alibaba-inc.com>
(cherry picked from commit cc4c706466)

* remove optional tag in returned value, unify the imports name

Signed-off-by: Qiaozp <qiaozhongpei.qzp@alibaba-inc.com>
(cherry picked from commit 658b184aef)

* fix e2e test

Signed-off-by: Qiaozp <qiaozhongpei.qzp@alibaba-inc.com>
(cherry picked from commit a9e9c96856)

* add stop test

Signed-off-by: Qiaozp <qiaozhongpei.qzp@alibaba-inc.com>
(cherry picked from commit 58aa2e5125)

* more coverage

Signed-off-by: Qiaozp <qiaozhongpei.qzp@alibaba-inc.com>
(cherry picked from commit 01ecb51323)

* single case selct

Signed-off-by: Qiaozp <qiaozhongpei.qzp@alibaba-inc.com>
(cherry picked from commit d9e8fd0342)

* optimize log color

Signed-off-by: Qiaozp <qiaozhongpei.qzp@alibaba-inc.com>
(cherry picked from commit be9840c3cb)

* add default permission and role

Signed-off-by: Qiaozp <qiaozhongpei.qzp@alibaba-inc.com>
(cherry picked from commit cf074444ac)

* fix permission ut

Signed-off-by: Qiaozp <qiaozhongpei.qzp@alibaba-inc.com>
(cherry picked from commit 1bdcad63a2)

* change the log api implementation

Signed-off-by: Qiaozp <qiaozhongpei.qzp@alibaba-inc.com>
(cherry picked from commit 587f745430)

* add color, add container order

Signed-off-by: Qiaozp <qiaozhongpei.qzp@alibaba-inc.com>
(cherry picked from commit 6e7f187605)

* lint

Signed-off-by: Qiaozp <qiaozhongpei.qzp@alibaba-inc.com>
(cherry picked from commit 64ba029031)

* fix filter nil will cut all log

Signed-off-by: Qiaozp <qiaozhongpei.qzp@alibaba-inc.com>
(cherry picked from commit 799dfe377a)

* longer timeout and lint

Signed-off-by: Qiaozp <qiaozhongpei.qzp@alibaba-inc.com>
(cherry picked from commit 89873f1f66)

Co-authored-by: Qiaozp <qiaozhongpei.qzp@alibaba-inc.com>
Co-authored-by: barnettZQG <barnett.zqg@gmail.com>
2022-11-01 00:13:37 +08:00

858 lines
31 KiB
Go

/*
Copyright 2021 The KubeVela Authors.
Licensed 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 api
import (
restfulspec "github.com/emicklei/go-restful-openapi/v2"
"github.com/emicklei/go-restful/v3"
"github.com/oam-dev/kubevela/pkg/apiserver/domain/service"
apis "github.com/oam-dev/kubevela/pkg/apiserver/interfaces/api/dto/v1"
"github.com/oam-dev/kubevela/pkg/apiserver/utils"
"github.com/oam-dev/kubevela/pkg/apiserver/utils/bcode"
"github.com/oam-dev/kubevela/pkg/apiserver/utils/log"
"github.com/oam-dev/kubevela/pkg/config"
)
type projectAPIInterface struct {
RbacService service.RBACService `inject:""`
ProjectService service.ProjectService `inject:""`
TargetService service.TargetService `inject:""`
ConfigService service.ConfigService `inject:""`
PipelineService service.PipelineService `inject:""`
PipelineRunService service.PipelineRunService `inject:""`
ContextService service.ContextService `inject:""`
RBACService service.RBACService `inject:""`
}
// NewProjectAPIInterface new project APIInterface
func NewProjectAPIInterface() Interface {
return &projectAPIInterface{}
}
func (n *projectAPIInterface) GetWebServiceRoute() *restful.WebService {
ws := new(restful.WebService)
ws.Path(versionPrefix+"/projects").
Consumes(restful.MIME_XML, restful.MIME_JSON).
Produces(restful.MIME_JSON, restful.MIME_XML).
Doc("api for project manage")
tags := []string{"project"}
ws.Route(ws.GET("/").To(n.listprojects).
Doc("list all projects").
Metadata(restfulspec.KeyOpenAPITags, tags).
Filter(n.RbacService.CheckPerm("project", "list")).
Returns(200, "OK", apis.ListProjectResponse{}).
Writes(apis.ListProjectResponse{}))
ws.Route(ws.POST("/").To(n.createproject).
Doc("create a project").
Metadata(restfulspec.KeyOpenAPITags, tags).
Filter(n.RbacService.CheckPerm("project", "create")).
Reads(apis.CreateProjectRequest{}).
Returns(200, "OK", apis.ProjectBase{}).
Writes(apis.ProjectBase{}))
ws.Route(ws.GET("/{projectName}").To(n.detailProject).
Doc("detail a project").
Metadata(restfulspec.KeyOpenAPITags, tags).
Param(ws.PathParameter("projectName", "identifier of the project").DataType("string")).
Filter(n.RbacService.CheckPerm("project", "detail")).
Returns(200, "OK", apis.ProjectBase{}).
Writes(apis.ProjectBase{}))
ws.Route(ws.PUT("/{projectName}").To(n.updateProject).
Doc("update a project").
Metadata(restfulspec.KeyOpenAPITags, tags).
Param(ws.PathParameter("projectName", "identifier of the project").DataType("string")).
Filter(n.RbacService.CheckPerm("project", "update")).
Reads(apis.UpdateProjectRequest{}).
Returns(200, "OK", apis.ProjectBase{}).
Writes(apis.ProjectBase{}))
ws.Route(ws.DELETE("/{projectName}").To(n.deleteProject).
Doc("delete a project").
Metadata(restfulspec.KeyOpenAPITags, tags).
Param(ws.PathParameter("projectName", "identifier of the project").DataType("string")).
Filter(n.RbacService.CheckPerm("project", "delete")).
Returns(200, "OK", apis.EmptyResponse{}).
Writes(apis.EmptyResponse{}))
ws.Route(ws.GET("/{projectName}/targets").To(n.listProjectTargets).
Doc("get targets list belong to a project").
Metadata(restfulspec.KeyOpenAPITags, tags).
Param(ws.PathParameter("projectName", "identifier of the project").DataType("string")).
Filter(n.RbacService.CheckPerm("project", "detail")).
Returns(200, "OK", apis.EmptyResponse{}).
Writes(apis.EmptyResponse{}))
ws.Route(ws.POST("/{projectName}/users").To(n.createProjectUser).
Doc("add a user to a project").
Metadata(restfulspec.KeyOpenAPITags, tags).
Param(ws.PathParameter("projectName", "identifier of the project").DataType("string")).
Filter(n.RbacService.CheckPerm("project/projectUser", "create")).
Reads(apis.AddProjectUserRequest{}).
Returns(200, "OK", apis.ProjectUserBase{}).
Writes(apis.ProjectUserBase{}))
ws.Route(ws.GET("/{projectName}/users").To(n.listProjectUser).
Doc("list all users belong to a project").
Metadata(restfulspec.KeyOpenAPITags, tags).
Param(ws.PathParameter("projectName", "identifier of the project").DataType("string")).
Filter(n.RbacService.CheckPerm("project/projectUser", "list")).
Returns(200, "OK", apis.ListProjectUsersResponse{}).
Writes(apis.ListProjectUsersResponse{}))
ws.Route(ws.PUT("/{projectName}/users/{userName}").To(n.updateProjectUser).
Doc("add a user to a project").
Metadata(restfulspec.KeyOpenAPITags, tags).
Reads(apis.UpdateProjectUserRequest{}).
Param(ws.PathParameter("projectName", "identifier of the project").DataType("string")).
Param(ws.PathParameter("userName", "identifier of the project user").DataType("string")).
Filter(n.RbacService.CheckPerm("project/projectUser", "create")).
Returns(200, "OK", apis.ProjectUserBase{}).
Writes(apis.ProjectUserBase{}))
ws.Route(ws.DELETE("/{projectName}/users/{userName}").To(n.deleteProjectUser).
Doc("delete a user from a project").
Metadata(restfulspec.KeyOpenAPITags, tags).
Reads(apis.UpdateProjectUserRequest{}).
Param(ws.PathParameter("projectName", "identifier of the project").DataType("string")).
Param(ws.PathParameter("userName", "identifier of the project user").DataType("string")).
Filter(n.RbacService.CheckPerm("project/projectUser", "delete")).
Returns(200, "OK", apis.EmptyResponse{}).
Writes(apis.EmptyResponse{}))
ws.Route(ws.GET("/{projectName}/roles").To(n.listProjectRoles).
Doc("list all project level roles").
Metadata(restfulspec.KeyOpenAPITags, tags).
Param(ws.PathParameter("projectName", "identifier of the project").DataType("string")).
Filter(n.RbacService.CheckPerm("project/role", "list")).
Returns(200, "OK", apis.ListRolesResponse{}).
Writes(apis.ListRolesResponse{}))
ws.Route(ws.POST("/{projectName}/roles").To(n.createProjectRole).
Doc("create project level role").
Metadata(restfulspec.KeyOpenAPITags, tags).
Param(ws.PathParameter("projectName", "identifier of the project").DataType("string")).
Filter(n.RbacService.CheckPerm("project/role", "create")).
Returns(200, "OK", apis.RoleBase{}).
Reads(apis.CreateRoleRequest{}).
Writes(apis.RoleBase{}))
ws.Route(ws.PUT("/{projectName}/roles/{roleName}").To(n.updateProjectRole).
Doc("update project level role").
Metadata(restfulspec.KeyOpenAPITags, tags).
Param(ws.PathParameter("projectName", "identifier of the project").DataType("string")).
Param(ws.PathParameter("roleName", "identifier of the project role").DataType("string")).
Filter(n.RbacService.CheckPerm("project/role", "update")).
Reads(apis.UpdateRoleRequest{}).
Returns(200, "OK", apis.RoleBase{}).
Writes(apis.RoleBase{}))
ws.Route(ws.DELETE("/{projectName}/roles/{roleName}").To(n.deleteProjectRole).
Doc("delete project level role").
Metadata(restfulspec.KeyOpenAPITags, tags).
Param(ws.PathParameter("projectName", "identifier of the project").DataType("string")).
Param(ws.PathParameter("roleName", "identifier of the project role").DataType("string")).
Filter(n.RbacService.CheckPerm("project/role", "delete")).
Returns(200, "OK", apis.EmptyResponse{}).
Writes(apis.EmptyResponse{}))
ws.Route(ws.GET("/{projectName}/permissions").To(n.listProjectPermissions).
Doc("list all project level perm policies").
Metadata(restfulspec.KeyOpenAPITags, tags).
Param(ws.PathParameter("projectName", "identifier of the project").DataType("string")).
Filter(n.RbacService.CheckPerm("project/permission", "list")).
Returns(200, "OK", []apis.PermissionBase{}).
Writes([]apis.PermissionBase{}))
ws.Route(ws.POST("/{projectName}/permissions").To(n.createProjectPermission).
Doc("create a project level perm policy").
Metadata(restfulspec.KeyOpenAPITags, tags).
Param(ws.PathParameter("projectName", "identifier of the project").DataType("string")).
Filter(n.RbacService.CheckPerm("project/permission", "list")).
Returns(200, "OK", []apis.PermissionBase{}).
Writes([]apis.PermissionBase{}))
ws.Route(ws.DELETE("/{projectName}/permissions/{permissionName}").To(n.deleteProjectPermission).
Doc("delete a project level perm policy").
Metadata(restfulspec.KeyOpenAPITags, tags).
Param(ws.PathParameter("projectName", "identifier of the project").DataType("string")).
Param(ws.PathParameter("permissionName", "identifier of the permission").DataType("string")).
Filter(n.RbacService.CheckPerm("project/permission", "list")).
Returns(200, "OK", []apis.PermissionBase{}).
Writes([]apis.PermissionBase{}))
ws.Route(ws.GET("/{projectName}/config_templates").To(n.getConfigTemplates).
Doc("get the templates which are in a project").
Metadata(restfulspec.KeyOpenAPITags, tags).
Filter(n.RbacService.CheckPerm("project/config", "list")).
Param(ws.PathParameter("projectName", "identifier of the project").DataType("string").Required(true)).
Param(ws.QueryParameter("namespace", "the namespace of the template").DataType("string").Required(true)).
Returns(200, "OK", apis.ListConfigTemplateResponse{}).
Returns(400, "Bad Request", bcode.Bcode{}).
Writes(apis.ListConfigTemplateResponse{}))
ws.Route(ws.GET("/{projectName}/config_templates/{templateName}").To(n.getConfigTemplate).
Doc("Detail a template").
Metadata(restfulspec.KeyOpenAPITags, tags).
Filter(n.RbacService.CheckPerm("project/config", "get")).
Param(ws.PathParameter("templateName", "identifier of the config template").DataType("string")).
Param(ws.QueryParameter("namespace", "the name of the namespace").DataType("string")).
Returns(200, "OK", apis.ConfigTemplateDetail{}).
Returns(400, "Bad Request", bcode.Bcode{}).
Writes(apis.ConfigTemplateDetail{}))
ws.Route(ws.GET("/{projectName}/configs").To(n.getConfigs).
Doc("get configs which are in a project").
Metadata(restfulspec.KeyOpenAPITags, tags).
Filter(n.RbacService.CheckPerm("project/config", "list")).
Param(ws.QueryParameter("template", "the template name").DataType("string")).
Param(ws.PathParameter("projectName", "identifier of the project").DataType("string").Required(true)).
Returns(200, "OK", apis.ListConfigResponse{}).
Returns(400, "Bad Request", bcode.Bcode{}).
Writes(apis.ListConfigResponse{}))
ws.Route(ws.POST("/{projectName}/configs").To(n.createConfig).
Doc("create a config in a project").
Metadata(restfulspec.KeyOpenAPITags, tags).
Filter(n.RbacService.CheckPerm("project/config", "list")).
Param(ws.PathParameter("projectName", "identifier of the project").DataType("string").Required(true)).
Reads(apis.CreateConfigRequest{}).
Returns(200, "OK", apis.Config{}).
Returns(400, "Bad Request", bcode.Bcode{}).
Writes(apis.Config{}))
ws.Route(ws.DELETE("/{projectName}/configs/{configName}").To(n.deleteConfig).
Doc("delete a config from a project").
Metadata(restfulspec.KeyOpenAPITags, tags).
Filter(n.RbacService.CheckPerm("project/config", "list")).
Param(ws.PathParameter("projectName", "identifier of the project").DataType("string").Required(true)).
Param(ws.PathParameter("configName", "identifier of the config").DataType("string").Required(true)).
Returns(200, "OK", apis.EmptyResponse{}).
Returns(400, "Bad Request", bcode.Bcode{}).
Writes(apis.EmptyResponse{}))
ws.Route(ws.PUT("/{projectName}/configs/{configName}").To(n.updateConfig).
Doc("update a config in a project").
Metadata(restfulspec.KeyOpenAPITags, tags).
Filter(n.RbacService.CheckPerm("project/config", "list")).
Param(ws.PathParameter("projectName", "identifier of the project").DataType("string").Required(true)).
Param(ws.PathParameter("configName", "identifier of the config").DataType("string").Required(true)).
Returns(200, "OK", apis.Config{}).
Reads(apis.UpdateConfigRequest{}).
Returns(400, "Bad Request", bcode.Bcode{}).
Writes(apis.Config{}))
ws.Route(ws.GET("/{projectName}/configs/{configName}").To(n.detailConfig).
Doc("detail a config in a project").
Metadata(restfulspec.KeyOpenAPITags, tags).
Filter(n.RbacService.CheckPerm("project/config", "list")).
Param(ws.PathParameter("projectName", "identifier of the project").DataType("string").Required(true)).
Param(ws.PathParameter("configName", "identifier of the config").DataType("string").Required(true)).
Returns(200, "OK", apis.Config{}).
Reads(apis.UpdateConfigRequest{}).
Returns(400, "Bad Request", bcode.Bcode{}).
Writes(apis.Config{}))
ws.Route(ws.POST("/{projectName}/distributions").To(n.applyDistribution).
Doc("apply the distribution job of the config").
Metadata(restfulspec.KeyOpenAPITags, tags).
Filter(n.RbacService.CheckPerm("project/config", "distribute")).
Param(ws.PathParameter("projectName", "identifier of the project").DataType("string").Required(true)).
Reads(apis.CreateConfigDistributionRequest{}).
Returns(200, "OK", apis.EmptyResponse{}).
Returns(400, "Bad Request", bcode.Bcode{}).
Writes(apis.EmptyResponse{}))
ws.Route(ws.GET("/{projectName}/distributions").To(n.listDistributions).
Doc("list the distribution jobs of the config").
Metadata(restfulspec.KeyOpenAPITags, tags).
Filter(n.RbacService.CheckPerm("project/config", "distribute")).
Param(ws.PathParameter("projectName", "identifier of the project").DataType("string").Required(true)).
Returns(200, "OK", apis.ListConfigDistributionResponse{}).
Returns(400, "Bad Request", bcode.Bcode{}).
Writes(apis.ListConfigDistributionResponse{}))
ws.Route(ws.DELETE("/{projectName}/distributions/{distributionName}").To(n.deleteDistribution).
Doc("delete a distribution job of the config").
Metadata(restfulspec.KeyOpenAPITags, tags).
Filter(n.RbacService.CheckPerm("project/config", "distribute")).
Param(ws.PathParameter("projectName", "identifier of the project").DataType("string").Required(true)).
Param(ws.PathParameter("distributionName", "identifier of the distribution").DataType("string").Required(true)).
Returns(200, "OK", apis.EmptyResponse{}).
Returns(400, "Bad Request", bcode.Bcode{}).
Writes(apis.EmptyResponse{}))
ws.Route(ws.GET("/{projectName}/providers").To(n.getProviders).
Doc("get providers which are in a project").
Metadata(restfulspec.KeyOpenAPITags, tags).
Filter(n.RbacService.CheckPerm("project/provider", "list")).
Param(ws.PathParameter("projectName", "identifier of the project").DataType("string").Required(true)).
Returns(200, "OK", apis.ListTerraformProviderResponse{}).
Returns(400, "Bad Request", bcode.Bcode{}).
Writes(apis.ListTerraformProviderResponse{}))
initPipelineRoutes(ws, n)
ws.Filter(authCheckFilter)
return ws
}
func (n *projectAPIInterface) listprojects(req *restful.Request, res *restful.Response) {
page, pageSize, err := utils.ExtractPagingParams(req, minPageSize, maxPageSize)
if err != nil {
bcode.ReturnError(req, res, err)
return
}
projects, err := n.ProjectService.ListProjects(req.Request.Context(), page, pageSize)
if err != nil {
bcode.ReturnError(req, res, err)
return
}
if err := res.WriteEntity(projects); err != nil {
bcode.ReturnError(req, res, err)
return
}
}
func (n *projectAPIInterface) createproject(req *restful.Request, res *restful.Response) {
// Verify the validity of parameters
var createReq apis.CreateProjectRequest
if err := req.ReadEntity(&createReq); err != nil {
bcode.ReturnError(req, res, err)
return
}
if err := validate.Struct(&createReq); err != nil {
bcode.ReturnError(req, res, err)
return
}
// Call the domain layer code
projectBase, err := n.ProjectService.CreateProject(req.Request.Context(), createReq)
if err != nil {
log.Logger.Errorf("create project failure %s", err.Error())
bcode.ReturnError(req, res, err)
return
}
// Write back response data
if err := res.WriteEntity(projectBase); err != nil {
bcode.ReturnError(req, res, err)
return
}
}
func (n *projectAPIInterface) updateProject(req *restful.Request, res *restful.Response) {
// Verify the validity of parameters
var updateReq apis.UpdateProjectRequest
if err := req.ReadEntity(&updateReq); err != nil {
bcode.ReturnError(req, res, err)
return
}
if err := validate.Struct(&updateReq); err != nil {
bcode.ReturnError(req, res, err)
return
}
// Call the domain layer code
projectBase, err := n.ProjectService.UpdateProject(req.Request.Context(), req.PathParameter("projectName"), updateReq)
if err != nil {
log.Logger.Errorf("update project failure %s", err.Error())
bcode.ReturnError(req, res, err)
return
}
// Write back response data
if err := res.WriteEntity(projectBase); err != nil {
bcode.ReturnError(req, res, err)
return
}
}
func (n *projectAPIInterface) detailProject(req *restful.Request, res *restful.Response) {
project, err := n.ProjectService.DetailProject(req.Request.Context(), req.PathParameter("projectName"))
if err != nil {
bcode.ReturnError(req, res, err)
return
}
// Write back response data
if err := res.WriteEntity(project); err != nil {
bcode.ReturnError(req, res, err)
return
}
}
func (n *projectAPIInterface) deleteProject(req *restful.Request, res *restful.Response) {
err := n.ProjectService.DeleteProject(req.Request.Context(), req.PathParameter("projectName"))
if err != nil {
bcode.ReturnError(req, res, err)
return
}
// Write back response data
if err := res.WriteEntity(apis.EmptyResponse{}); err != nil {
bcode.ReturnError(req, res, err)
return
}
}
func (n *projectAPIInterface) listProjectTargets(req *restful.Request, res *restful.Response) {
project, err := n.ProjectService.GetProject(req.Request.Context(), req.PathParameter("projectName"))
if err != nil {
bcode.ReturnError(req, res, err)
return
}
projects, err := n.TargetService.ListTargets(req.Request.Context(), 0, 0, project.Name)
if err != nil {
bcode.ReturnError(req, res, err)
return
}
// Write back response data
if err := res.WriteEntity(projects); err != nil {
bcode.ReturnError(req, res, err)
return
}
}
func (n *projectAPIInterface) createProjectUser(req *restful.Request, res *restful.Response) {
// Verify the validity of parameters
var createReq apis.AddProjectUserRequest
if err := req.ReadEntity(&createReq); err != nil {
bcode.ReturnError(req, res, err)
return
}
if err := validate.Struct(&createReq); err != nil {
bcode.ReturnError(req, res, err)
return
}
if len(createReq.UserRoles) == 0 {
bcode.ReturnError(req, res, bcode.ErrProjectRoleCheckFailure)
return
}
// Call the domain layer code
userBase, err := n.ProjectService.AddProjectUser(req.Request.Context(), req.PathParameter("projectName"), createReq)
if err != nil {
log.Logger.Errorf("create project user failure %s", err.Error())
bcode.ReturnError(req, res, err)
return
}
// Write back response data
if err := res.WriteEntity(userBase); err != nil {
bcode.ReturnError(req, res, err)
return
}
}
func (n *projectAPIInterface) listProjectUser(req *restful.Request, res *restful.Response) {
page, pageSize, err := utils.ExtractPagingParams(req, minPageSize, maxPageSize)
if err != nil {
bcode.ReturnError(req, res, err)
return
}
// Call the domain layer code
users, err := n.ProjectService.ListProjectUser(req.Request.Context(), req.PathParameter("projectName"), page, pageSize)
if err != nil {
log.Logger.Errorf("list project users failure %s", err.Error())
bcode.ReturnError(req, res, err)
return
}
// Write back response data
if err := res.WriteEntity(users); err != nil {
bcode.ReturnError(req, res, err)
return
}
}
func (n *projectAPIInterface) updateProjectUser(req *restful.Request, res *restful.Response) {
// Verify the validity of parameters
var updateReq apis.UpdateProjectUserRequest
if err := req.ReadEntity(&updateReq); err != nil {
bcode.ReturnError(req, res, err)
return
}
if err := validate.Struct(&updateReq); err != nil {
bcode.ReturnError(req, res, err)
return
}
if len(updateReq.UserRoles) == 0 {
bcode.ReturnError(req, res, bcode.ErrProjectRoleCheckFailure)
return
}
// Call the domain layer code
userBase, err := n.ProjectService.UpdateProjectUser(req.Request.Context(), req.PathParameter("projectName"), req.PathParameter("userName"), updateReq)
if err != nil {
log.Logger.Errorf("update project user failure %s", err.Error())
bcode.ReturnError(req, res, err)
return
}
// Write back response data
if err := res.WriteEntity(userBase); err != nil {
bcode.ReturnError(req, res, err)
return
}
}
func (n *projectAPIInterface) deleteProjectUser(req *restful.Request, res *restful.Response) {
// Call the domain layer code
err := n.ProjectService.DeleteProjectUser(req.Request.Context(), req.PathParameter("projectName"), req.PathParameter("userName"))
if err != nil {
log.Logger.Errorf("delete project user failure %s", err.Error())
bcode.ReturnError(req, res, err)
return
}
// Write back response data
if err := res.WriteEntity(apis.EmptyResponse{}); err != nil {
bcode.ReturnError(req, res, err)
return
}
}
func (n *projectAPIInterface) listProjectRoles(req *restful.Request, res *restful.Response) {
if req.PathParameter("projectName") == "" {
bcode.ReturnError(req, res, bcode.ErrProjectIsNotExist)
return
}
page, pageSize, err := utils.ExtractPagingParams(req, minPageSize, maxPageSize)
if err != nil {
bcode.ReturnError(req, res, err)
return
}
roles, err := n.RbacService.ListRole(req.Request.Context(), req.PathParameter("projectName"), page, pageSize)
if err != nil {
bcode.ReturnError(req, res, err)
return
}
if err := res.WriteEntity(roles); err != nil {
bcode.ReturnError(req, res, err)
return
}
}
func (n *projectAPIInterface) createProjectRole(req *restful.Request, res *restful.Response) {
if req.PathParameter("projectName") == "" {
bcode.ReturnError(req, res, bcode.ErrProjectIsNotExist)
return
}
// Verify the validity of parameters
var createReq apis.CreateRoleRequest
if err := req.ReadEntity(&createReq); err != nil {
bcode.ReturnError(req, res, err)
return
}
if err := validate.Struct(&createReq); err != nil {
bcode.ReturnError(req, res, err)
return
}
// Call the domain layer code
projectBase, err := n.RbacService.CreateRole(req.Request.Context(), req.PathParameter("projectName"), createReq)
if err != nil {
log.Logger.Errorf("create role failure %s", err.Error())
bcode.ReturnError(req, res, err)
return
}
// Write back response data
if err := res.WriteEntity(projectBase); err != nil {
bcode.ReturnError(req, res, err)
return
}
}
func (n *projectAPIInterface) updateProjectRole(req *restful.Request, res *restful.Response) {
if req.PathParameter("projectName") == "" {
bcode.ReturnError(req, res, bcode.ErrProjectIsNotExist)
return
}
// Verify the validity of parameters
var updateReq apis.UpdateRoleRequest
if err := req.ReadEntity(&updateReq); err != nil {
bcode.ReturnError(req, res, err)
return
}
if err := validate.Struct(&updateReq); err != nil {
bcode.ReturnError(req, res, err)
return
}
// Call the domain layer code
roleBase, err := n.RbacService.UpdateRole(req.Request.Context(), req.PathParameter("projectName"), req.PathParameter("roleName"), updateReq)
if err != nil {
log.Logger.Errorf("update role failure %s", err.Error())
bcode.ReturnError(req, res, err)
return
}
// Write back response data
if err := res.WriteEntity(roleBase); err != nil {
bcode.ReturnError(req, res, err)
return
}
}
func (n *projectAPIInterface) deleteProjectRole(req *restful.Request, res *restful.Response) {
if req.PathParameter("projectName") == "" {
bcode.ReturnError(req, res, bcode.ErrProjectIsNotExist)
return
}
err := n.RbacService.DeleteRole(req.Request.Context(), req.PathParameter("projectName"), req.PathParameter("roleName"))
if err != nil {
bcode.ReturnError(req, res, err)
return
}
// Write back response data
if err := res.WriteEntity(apis.EmptyResponse{}); err != nil {
bcode.ReturnError(req, res, err)
return
}
}
func (n *projectAPIInterface) listProjectPermissions(req *restful.Request, res *restful.Response) {
if req.PathParameter("projectName") == "" {
bcode.ReturnError(req, res, bcode.ErrProjectIsNotExist)
return
}
policies, err := n.RbacService.ListPermissions(req.Request.Context(), req.PathParameter("projectName"))
if err != nil {
bcode.ReturnError(req, res, err)
return
}
if err := res.WriteEntity(policies); err != nil {
bcode.ReturnError(req, res, err)
return
}
}
func (n *projectAPIInterface) createProjectPermission(req *restful.Request, res *restful.Response) {
// Verify the validity of parameters
var createReq apis.CreatePermissionRequest
if err := req.ReadEntity(&createReq); err != nil {
bcode.ReturnError(req, res, err)
return
}
if err := validate.Struct(&createReq); err != nil {
bcode.ReturnError(req, res, err)
return
}
// Call the domain layer code
permissionBase, err := n.RbacService.CreatePermission(req.Request.Context(), req.PathParameter("projectName"), createReq)
if err != nil {
log.Logger.Errorf("create the permission failure %s", err.Error())
bcode.ReturnError(req, res, err)
return
}
// Write back response data
if err := res.WriteEntity(permissionBase); err != nil {
bcode.ReturnError(req, res, err)
return
}
}
func (n *projectAPIInterface) deleteProjectPermission(req *restful.Request, res *restful.Response) {
err := n.RbacService.DeletePermission(req.Request.Context(), req.PathParameter("projectName"), req.PathParameter("permissionName"))
if err != nil {
bcode.ReturnError(req, res, err)
return
}
// Write back response data
if err := res.WriteEntity(apis.EmptyResponse{}); err != nil {
bcode.ReturnError(req, res, err)
return
}
}
func (n *projectAPIInterface) getConfigTemplates(req *restful.Request, res *restful.Response) {
templates, err := n.ConfigService.ListTemplates(req.Request.Context(), req.PathParameter("projectName"), "project")
if err != nil {
bcode.ReturnError(req, res, err)
return
}
err = res.WriteEntity(apis.ListConfigTemplateResponse{Templates: templates})
if err != nil {
bcode.ReturnError(req, res, err)
return
}
}
func (n *projectAPIInterface) getConfigTemplate(req *restful.Request, res *restful.Response) {
t, err := n.ConfigService.GetTemplate(req.Request.Context(), config.NamespacedName{
Name: req.PathParameter("templateName"),
Namespace: req.QueryParameter("namespace"),
})
if err != nil {
bcode.ReturnError(req, res, err)
return
}
err = res.WriteEntity(t)
if err != nil {
bcode.ReturnError(req, res, err)
return
}
}
func (n *projectAPIInterface) getConfigs(req *restful.Request, res *restful.Response) {
configs, err := n.ConfigService.ListConfigs(req.Request.Context(), req.PathParameter("projectName"), req.QueryParameter("template"), false)
if err != nil {
bcode.ReturnError(req, res, err)
return
}
err = res.WriteEntity(apis.ListConfigResponse{Configs: configs})
if err != nil {
bcode.ReturnError(req, res, err)
return
}
}
func (n *projectAPIInterface) createConfig(req *restful.Request, res *restful.Response) {
// Verify the validity of parameters
var createReq apis.CreateConfigRequest
if err := req.ReadEntity(&createReq); err != nil {
bcode.ReturnError(req, res, err)
return
}
if err := validate.Struct(&createReq); err != nil {
bcode.ReturnError(req, res, err)
return
}
config, err := n.ConfigService.CreateConfig(req.Request.Context(), req.PathParameter("projectName"), createReq)
if err != nil {
bcode.ReturnError(req, res, err)
return
}
err = res.WriteEntity(config)
if err != nil {
bcode.ReturnError(req, res, err)
return
}
}
func (n *projectAPIInterface) updateConfig(req *restful.Request, res *restful.Response) {
// Verify the validity of parameters
var updateReq apis.UpdateConfigRequest
if err := req.ReadEntity(&updateReq); err != nil {
bcode.ReturnError(req, res, err)
return
}
if err := validate.Struct(&updateReq); err != nil {
bcode.ReturnError(req, res, err)
return
}
config, err := n.ConfigService.UpdateConfig(req.Request.Context(), req.PathParameter("projectName"), req.PathParameter("configName"), updateReq)
if err != nil {
bcode.ReturnError(req, res, err)
return
}
err = res.WriteEntity(config)
if err != nil {
bcode.ReturnError(req, res, err)
return
}
}
func (n *projectAPIInterface) detailConfig(req *restful.Request, res *restful.Response) {
config, err := n.ConfigService.GetConfig(req.Request.Context(),
req.PathParameter("projectName"), req.PathParameter("configName"))
if err != nil {
bcode.ReturnError(req, res, err)
return
}
err = res.WriteEntity(config)
if err != nil {
bcode.ReturnError(req, res, err)
return
}
}
func (n *projectAPIInterface) deleteConfig(req *restful.Request, res *restful.Response) {
err := n.ConfigService.DeleteConfig(req.Request.Context(), req.PathParameter("projectName"), req.PathParameter("configName"))
if err != nil {
bcode.ReturnError(req, res, err)
return
}
err = res.WriteEntity(apis.EmptyResponse{})
if err != nil {
bcode.ReturnError(req, res, err)
return
}
}
func (n *projectAPIInterface) getProviders(req *restful.Request, res *restful.Response) {
providers, err := n.ProjectService.ListTerraformProviders(req.Request.Context(), req.PathParameter("projectName"))
if err != nil {
bcode.ReturnError(req, res, err)
return
}
err = res.WriteEntity(apis.ListTerraformProviderResponse{Providers: providers})
if err != nil {
bcode.ReturnError(req, res, err)
return
}
}
func (n *projectAPIInterface) applyDistribution(req *restful.Request, res *restful.Response) {
// Verify the validity of parameters
var createReq apis.CreateConfigDistributionRequest
if err := req.ReadEntity(&createReq); err != nil {
bcode.ReturnError(req, res, err)
return
}
if err := validate.Struct(&createReq); err != nil {
bcode.ReturnError(req, res, err)
return
}
// Call the domain layer code
err := n.ConfigService.CreateConfigDistribution(req.Request.Context(), req.PathParameter("projectName"), createReq)
if err != nil {
bcode.ReturnError(req, res, err)
return
}
// Write back response data
if err := res.WriteEntity(apis.EmptyResponse{}); err != nil {
bcode.ReturnError(req, res, err)
return
}
}
func (n *projectAPIInterface) listDistributions(req *restful.Request, res *restful.Response) {
distributions, err := n.ConfigService.ListConfigDistributions(req.Request.Context(), req.PathParameter("projectName"))
if err != nil {
bcode.ReturnError(req, res, err)
return
}
err = res.WriteEntity(apis.ListConfigDistributionResponse{Distributions: distributions})
if err != nil {
bcode.ReturnError(req, res, err)
return
}
}
func (n *projectAPIInterface) deleteDistribution(req *restful.Request, res *restful.Response) {
err := n.ConfigService.DeleteConfigDistribution(req.Request.Context(), req.PathParameter("projectName"), req.PathParameter("distributionName"))
if err != nil {
bcode.ReturnError(req, res, err)
return
}
err = res.WriteEntity(apis.EmptyResponse{})
if err != nil {
bcode.ReturnError(req, res, err)
return
}
}