From 945cc311d9c48a186869c5a555b75eeff3c11227 Mon Sep 17 00:00:00 2001 From: lou Date: Wed, 13 Oct 2021 15:12:33 +0800 Subject: [PATCH 001/405] add list projects in picket Signed-off-by: lou --- .../picket/client/aslan/client.go | 41 +++++++++++++ .../picket/client/aslan/project.go | 19 ++++++ .../picket/client/opa/evaluate.go | 17 ++++-- pkg/microservice/picket/client/opa/input.go | 23 +++++++ .../core/evaluation/service/evaluate.go | 60 ++++++------------ .../picket/core/filter/handler/project.go | 15 +++++ .../picket/core/filter/handler/router.go | 30 +++++++++ .../picket/core/filter/service/project.go | 61 +++++++++++++++++++ pkg/microservice/picket/server/rest/router.go | 2 + .../core/service/bundle/exemption_urls.go | 4 ++ .../bundle/resource_endpoint_mapping.go | 4 ++ pkg/tool/httpclient/request_options.go | 7 +++ 12 files changed, 235 insertions(+), 48 deletions(-) create mode 100644 pkg/microservice/picket/client/aslan/client.go create mode 100644 pkg/microservice/picket/client/aslan/project.go create mode 100644 pkg/microservice/picket/client/opa/input.go create mode 100644 pkg/microservice/picket/core/filter/handler/project.go create mode 100644 pkg/microservice/picket/core/filter/handler/router.go create mode 100644 pkg/microservice/picket/core/filter/service/project.go diff --git a/pkg/microservice/picket/client/aslan/client.go b/pkg/microservice/picket/client/aslan/client.go new file mode 100644 index 000000000..42302493d --- /dev/null +++ b/pkg/microservice/picket/client/aslan/client.go @@ -0,0 +1,41 @@ +/* +Copyright 2021 The KodeRover 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 aslan + +import ( + "github.com/koderover/zadig/pkg/config" + "github.com/koderover/zadig/pkg/tool/httpclient" +) + +type Client struct { + *httpclient.Client + + host string +} + +func New() *Client { + host := config.AslanServiceAddress() + + c := httpclient.New( + httpclient.SetHostURL(host + "/api"), + ) + + return &Client{ + Client: c, + host: host, + } +} diff --git a/pkg/microservice/picket/client/aslan/project.go b/pkg/microservice/picket/client/aslan/project.go new file mode 100644 index 000000000..80e677578 --- /dev/null +++ b/pkg/microservice/picket/client/aslan/project.go @@ -0,0 +1,19 @@ +package aslan + +import ( + "net/http" + "net/url" + + "github.com/koderover/zadig/pkg/tool/httpclient" +) + +func (c *Client) ListProjects(header http.Header, qs url.Values) ([]byte, error) { + url := "/project/projects" + + res, err := c.Get(url, httpclient.SetHeadersFromHTTPHeader(header), httpclient.SetQueryParamsFromValues(qs)) + if err != nil { + return nil, err + } + + return res.Body(), nil +} diff --git a/pkg/microservice/picket/client/opa/evaluate.go b/pkg/microservice/picket/client/opa/evaluate.go index f5920ae62..d0fb31f96 100644 --- a/pkg/microservice/picket/client/opa/evaluate.go +++ b/pkg/microservice/picket/client/opa/evaluate.go @@ -7,20 +7,27 @@ import ( "github.com/koderover/zadig/pkg/tool/httpclient" ) +type InputGenerator func() (*Input, error) + // Evaluate evaluates the query with the given input and return a json response which has a field called "result" -func (c *Client) Evaluate(query string, input interface{}) ([]byte, error) { +func (c *Client) Evaluate(query string, result interface{}, ig InputGenerator) error { + input, err := ig() + if err != nil { + return err + } + url := "v1/data" - req := struct{ + req := struct { Input interface{} `json:"input"` }{ Input: input, } queryURL := fmt.Sprintf("%s/%s", url, strings.ReplaceAll(query, ".", "/")) - res, err := c.Post(queryURL, httpclient.SetBody(req)) + _, err = c.Post(queryURL, httpclient.SetBody(req), httpclient.SetResult(result)) if err != nil { - return nil, err + return err } - return res.Body(), nil + return nil } diff --git a/pkg/microservice/picket/client/opa/input.go b/pkg/microservice/picket/client/opa/input.go new file mode 100644 index 000000000..df28516dc --- /dev/null +++ b/pkg/microservice/picket/client/opa/input.go @@ -0,0 +1,23 @@ +package opa + +type Input struct { + ParsedQuery *ParseQuery `json:"parsed_query"` + ParsedPath []string `json:"parsed_path"` + Attributes *Attributes `json:"attributes"` +} +type ParseQuery struct { + ProjectName []string `json:"projectName"` +} + +type Attributes struct { + Request *Request `json:"request"` +} + +type Request struct { + HTTP *HTTPSpec `json:"http"` +} + +type HTTPSpec struct { + Method string `json:"method"` + Headers map[string]string `json:"headers"` +} diff --git a/pkg/microservice/picket/core/evaluation/service/evaluate.go b/pkg/microservice/picket/core/evaluation/service/evaluate.go index 4de488cb8..867e059e6 100644 --- a/pkg/microservice/picket/core/evaluation/service/evaluate.go +++ b/pkg/microservice/picket/core/evaluation/service/evaluate.go @@ -17,66 +17,36 @@ limitations under the License. package service import ( - "encoding/json" "net/http" "strings" "go.uber.org/zap" "github.com/koderover/zadig/pkg/microservice/picket/client/opa" + "github.com/koderover/zadig/pkg/setting" ) -type input struct { - ParsedQuery parseQuery `json:"parsed_query"` - ParsedPath []string `json:"parsed_path"` - Attributes attributes `json:"attributes"` -} -type parseQuery struct { - ProjectName []string `json:"projectName"` -} - -type attributes struct { - Request request `json:"request"` -} - -type request struct { - Http HTTP `json:"http"` -} - -type HTTP struct { - Method string `json:"method"` - Headers map[string]string `json:"headers"` -} - -type opaRes struct { +type evaluateResult struct { Result bool `json:"result"` } func Evaluate(header http.Header, projectName string, grantsReq []GrantReq, logger *zap.SugaredLogger) ([]GrantRes, error) { - // 拼接参数,请求opa - authorization := header.Get("authorization") - opaHeaders := map[string]string{} - opaHeaders["authorization"] = authorization var grantsRes []GrantRes opaClient := opa.NewDefault() // 对于每一个action+endpoint 都去请求opa for _, v := range grantsReq { parsedPath := strings.Split(strings.Trim(v.EndPoint, "/"), "/") - input := generateOPAInput(projectName, parsedPath, v.Method, opaHeaders) - res, err := opaClient.Evaluate("rbac.allow", input) + res := &evaluateResult{} + err := opaClient.Evaluate( + "rbac.allow", res, + func() (*opa.Input, error) { return generateOPAInput(header, projectName, v.Method, parsedPath), nil }) if err != nil { logger.Errorf("opa evaluate endpoint: %v method: %v err: %s", v.EndPoint, v.Method, err) grantsRes = append(grantsRes, GrantRes{v, false}) continue } - var opaR opaRes - if err := json.Unmarshal(res, &opaR); err != nil { - logger.Errorf("opa res Unmarshal err %s", err) - grantsRes = append(grantsRes, GrantRes{v, false}) - continue - } - grantsRes = append(grantsRes, GrantRes{v, opaR.Result}) + grantsRes = append(grantsRes, GrantRes{v, res.Result}) } return grantsRes, nil } @@ -91,16 +61,20 @@ type GrantRes struct { Allow bool `json:"allow"` } -func generateOPAInput(projectName string, parsedPath []string, method string, head map[string]string) input { - return input{ - ParsedQuery: parseQuery{ +func generateOPAInput(header http.Header, projectName, method string, parsedPath []string) *opa.Input { + authorization := header.Get(strings.ToLower(setting.AuthorizationHeader)) + headers := map[string]string{} + headers[strings.ToLower(setting.AuthorizationHeader)] = authorization + + return &opa.Input{ + ParsedQuery: &opa.ParseQuery{ ProjectName: []string{projectName}, }, ParsedPath: parsedPath, - Attributes: attributes{ - Request: request{Http: HTTP{ + Attributes: &opa.Attributes{ + Request: &opa.Request{HTTP: &opa.HTTPSpec{ Method: method, - Headers: head, + Headers: headers, }}, }, } diff --git a/pkg/microservice/picket/core/filter/handler/project.go b/pkg/microservice/picket/core/filter/handler/project.go new file mode 100644 index 000000000..a4f38ab7d --- /dev/null +++ b/pkg/microservice/picket/core/filter/handler/project.go @@ -0,0 +1,15 @@ +package handler + +import ( + "github.com/gin-gonic/gin" + + "github.com/koderover/zadig/pkg/microservice/picket/core/filter/service" + internalhandler "github.com/koderover/zadig/pkg/shared/handler" +) + +func ListProjects(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + + ctx.Resp, ctx.Err = service.ListProjects(c.Request.Header, c.Request.URL.Query(), ctx.Logger) +} diff --git a/pkg/microservice/picket/core/filter/handler/router.go b/pkg/microservice/picket/core/filter/handler/router.go new file mode 100644 index 000000000..715ca28a9 --- /dev/null +++ b/pkg/microservice/picket/core/filter/handler/router.go @@ -0,0 +1,30 @@ +/* +Copyright 2021 The KodeRover 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 handler + +import ( + "github.com/gin-gonic/gin" +) + +type Router struct{} + +func (*Router) Inject(router *gin.RouterGroup) { + roles := router.Group("projects") + { + roles.GET("", ListProjects) + } +} diff --git a/pkg/microservice/picket/core/filter/service/project.go b/pkg/microservice/picket/core/filter/service/project.go new file mode 100644 index 000000000..e267487e7 --- /dev/null +++ b/pkg/microservice/picket/core/filter/service/project.go @@ -0,0 +1,61 @@ +package service + +import ( + "net/http" + "net/url" + "strings" + + "go.uber.org/zap" + + "github.com/koderover/zadig/pkg/microservice/picket/client/aslan" + "github.com/koderover/zadig/pkg/microservice/picket/client/opa" + "github.com/koderover/zadig/pkg/setting" +) + +type allowedProjectsData struct { + Result []string `json:"result"` +} + +func ListProjects(header http.Header, qs url.Values, logger *zap.SugaredLogger) ([]byte, error) { + names, err := getAllowedProjects(header, logger) + if err != nil { + logger.Errorf("Failed to get allowed project names, err: %s", err) + return nil, err + } + + for _, name := range names { + qs.Add("names", name) + } + + aslanClient := aslan.New() + + return aslanClient.ListProjects(header, qs) +} + +func getAllowedProjects(headers http.Header, logger *zap.SugaredLogger) ([]string, error) { + res := &allowedProjectsData{} + + opaClient := opa.NewDefault() + err := opaClient.Evaluate("rbac.user_projects", res, func() (*opa.Input, error) { return generateOPAInput(headers), nil }) + if err != nil { + logger.Errorf("opa evaluation failed, err: %s", err) + return nil, err + } + + return res.Result, nil + +} + +func generateOPAInput(header http.Header) *opa.Input { + authorization := header.Get(strings.ToLower(setting.AuthorizationHeader)) + headers := map[string]string{} + headers[strings.ToLower(setting.AuthorizationHeader)] = authorization + + return &opa.Input{ + Attributes: &opa.Attributes{ + Request: &opa.Request{HTTP: &opa.HTTPSpec{ + Headers: headers, + }}, + }, + } +} diff --git a/pkg/microservice/picket/server/rest/router.go b/pkg/microservice/picket/server/rest/router.go index 6eece402f..3253c5d48 100644 --- a/pkg/microservice/picket/server/rest/router.go +++ b/pkg/microservice/picket/server/rest/router.go @@ -20,11 +20,13 @@ import ( "github.com/gin-gonic/gin" evaluationhandler "github.com/koderover/zadig/pkg/microservice/picket/core/evaluation/handler" + filterhandler "github.com/koderover/zadig/pkg/microservice/picket/core/filter/handler" ) func (s *engine) injectRouterGroup(router *gin.RouterGroup) { for _, r := range []injector{ new(evaluationhandler.Router), + new(filterhandler.Router), } { r.Inject(router.Group("/api/v1")) } diff --git a/pkg/microservice/policy/core/service/bundle/exemption_urls.go b/pkg/microservice/policy/core/service/bundle/exemption_urls.go index 62d041a48..e3d7b0add 100644 --- a/pkg/microservice/policy/core/service/bundle/exemption_urls.go +++ b/pkg/microservice/policy/core/service/bundle/exemption_urls.go @@ -1,5 +1,9 @@ package bundle +// TODO: Policy Service should not care about the policy details of a certain service, instead, a service which wants +// to be managed by the Policy Service should register its rules to the Policy Service so that the Policy Service knows +// how to make a decision without being aware of the detailed rules. + type exemptionURLs struct { Global rules `json:"global"` // global urls are only controlled by AuthN, and it is visible for all users Namespaced rules `json:"namespaced"` // global urls are only controlled by AuthN, and it is visible for users under certain projects diff --git a/pkg/microservice/policy/core/service/bundle/resource_endpoint_mapping.go b/pkg/microservice/policy/core/service/bundle/resource_endpoint_mapping.go index 2b328dd46..02eee3980 100644 --- a/pkg/microservice/policy/core/service/bundle/resource_endpoint_mapping.go +++ b/pkg/microservice/policy/core/service/bundle/resource_endpoint_mapping.go @@ -1,5 +1,9 @@ package bundle +// TODO: Policy Service should not care about the policy details of a certain service, instead, a service which wants +// to be managed by the Policy Service should register its rules to the Policy Service so that the Policy Service knows +// how to make a decision without being aware of the detailed rules. + var mappings = map[string]map[string][]*rule{ "Workflow": workflowMapping, } diff --git a/pkg/tool/httpclient/request_options.go b/pkg/tool/httpclient/request_options.go index dde8bfd67..afc192792 100644 --- a/pkg/tool/httpclient/request_options.go +++ b/pkg/tool/httpclient/request_options.go @@ -17,6 +17,7 @@ limitations under the License. package httpclient import ( + "net/http" "net/url" "github.com/go-resty/resty/v2" @@ -42,6 +43,12 @@ func SetHeader(header, value string) RequestFunc { } } +func SetHeadersFromHTTPHeader(header http.Header) RequestFunc { + return func(r *resty.Request) { + r.Header = header + } +} + func SetQueryParamsFromValues(params url.Values) RequestFunc { return func(r *resty.Request) { r.SetQueryParamsFromValues(params) -- Gitee From 6fa5f22b279c012ad48998025b07643ee5e1ffa2 Mon Sep 17 00:00:00 2001 From: mouuii <49775493+mouuii@users.noreply.github.com> Date: Wed, 13 Oct 2021 16:04:05 +0800 Subject: [PATCH 002/405] authv2 list project (#373) * list project Signed-off-by: mouuii * list project Signed-off-by: mouuii * list project Signed-off-by: mouuii * list project Signed-off-by: mouuii * code review Signed-off-by: mouuii Co-authored-by: mouuii --- .../repository/mongodb/template/product.go | 36 +++------ .../aslan/core/project/handler/project.go | 8 +- .../aslan/core/project/service/project.go | 75 +++++++++++++------ 3 files changed, 70 insertions(+), 49 deletions(-) diff --git a/pkg/microservice/aslan/core/common/repository/mongodb/template/product.go b/pkg/microservice/aslan/core/common/repository/mongodb/template/product.go index 9e330693a..a9e7cd8f6 100644 --- a/pkg/microservice/aslan/core/common/repository/mongodb/template/product.go +++ b/pkg/microservice/aslan/core/common/repository/mongodb/template/product.go @@ -71,47 +71,35 @@ func (c *ProductColl) FindProjectName(project string) (*template.Product, error) return resp, err } -func (c *ProductColl) List() ([]*template.Product, error) { - var resp []*template.Product - - cursor, err := c.Collection.Find(context.TODO(), bson.M{}) +func (c *ProductColl) ListProjectsByNames(projects []string) ([]*template.Product, error) { + resp := make([]*template.Product, 0) + ctx := context.TODO() + query := bson.M{"project_name": bson.M{"$in": projects}} + cursor, err := c.Collection.Find(ctx, query) if err != nil { return nil, err } - err = cursor.All(context.TODO(), &resp) + + err = cursor.All(ctx, &resp) if err != nil { return nil, err } - return resp, nil } -func (c *ProductColl) ListNames() ([]string, error) { - var res []struct { - ProductName string `bson:"product_name"` - } - - opts := options.Find() - projection := bson.D{ - {"product_name", 1}, - } - opts.SetProjection(projection) +func (c *ProductColl) List() ([]*template.Product, error) { + var resp []*template.Product - cursor, err := c.Collection.Find(context.TODO(), bson.M{}, opts) + cursor, err := c.Collection.Find(context.TODO(), bson.M{}) if err != nil { return nil, err } - err = cursor.All(context.TODO(), &res) + err = cursor.All(context.TODO(), &resp) if err != nil { return nil, err } - var names []string - for _, r := range res { - names = append(names, r.ProductName) - } - - return names, nil + return resp, nil } type ProductListOpt struct { diff --git a/pkg/microservice/aslan/core/project/handler/project.go b/pkg/microservice/aslan/core/project/handler/project.go index 32bb3949e..d3a3769f0 100644 --- a/pkg/microservice/aslan/core/project/handler/project.go +++ b/pkg/microservice/aslan/core/project/handler/project.go @@ -25,8 +25,9 @@ import ( ) type projectListArgs struct { - IgnoreNoEnvs bool `json:"ignoreNoEnvs" form:"ignoreNoEnvs"` - Verbosity string `json:"verbosity" form:"verbosity"` + IgnoreNoEnvs bool `json:"ignoreNoEnvs" form:"ignoreNoEnvs"` + Verbosity string `json:"verbosity" form:"verbosity"` + Names []string `json:"names" form:"names"` } func ListProjects(c *gin.Context) { @@ -38,9 +39,8 @@ func ListProjects(c *gin.Context) { ctx.Err = e.ErrInvalidParam.AddDesc(err.Error()) return } - ctx.Resp, ctx.Err = projectservice.ListProjects( - &projectservice.ProjectListOptions{IgnoreNoEnvs: args.IgnoreNoEnvs, Verbosity: projectservice.QueryVerbosity(args.Verbosity)}, + &projectservice.ProjectListOptions{IgnoreNoEnvs: args.IgnoreNoEnvs, Verbosity: projectservice.QueryVerbosity(args.Verbosity), Projects: args.Names}, ctx.Logger, ) } diff --git a/pkg/microservice/aslan/core/project/service/project.go b/pkg/microservice/aslan/core/project/service/project.go index 7da39d954..0d8e51136 100644 --- a/pkg/microservice/aslan/core/project/service/project.go +++ b/pkg/microservice/aslan/core/project/service/project.go @@ -17,13 +17,11 @@ limitations under the License. package service import ( - "fmt" - "go.uber.org/zap" "k8s.io/apimachinery/pkg/util/sets" "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/mongodb" - templaterepo "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/mongodb/template" + "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/mongodb/template" ) type QueryVerbosity string @@ -37,10 +35,13 @@ const ( type ProjectListOptions struct { IgnoreNoEnvs bool Verbosity QueryVerbosity + Projects []string } type ProjectDetailedRepresentation struct { *ProjectBriefRepresentation + Alias string + Desc string } type ProjectBriefRepresentation struct { @@ -55,7 +56,7 @@ type ProjectMinimalRepresentation struct { func ListProjects(opts *ProjectListOptions, logger *zap.SugaredLogger) (interface{}, error) { switch opts.Verbosity { case VerbosityDetailed: - return nil, fmt.Errorf("not Implemented") + return listDetailedProjectInfos(opts, logger) case VerbosityBrief: return listBriefProjectInfos(opts, logger) case VerbosityMinimal: @@ -65,15 +66,55 @@ func ListProjects(opts *ProjectListOptions, logger *zap.SugaredLogger) (interfac } } -func listBriefProjectInfos(opts *ProjectListOptions, logger *zap.SugaredLogger) ([]*ProjectBriefRepresentation, error) { - var res []*ProjectBriefRepresentation +func listDetailedProjectInfos(opts *ProjectListOptions, logger *zap.SugaredLogger) (res []*ProjectDetailedRepresentation, err error) { + nameWithEnvs, err := mongodb.NewProductColl().ListProjects() + if err != nil { + logger.Errorf("Failed to list projects, err: %s", err) + return nil, err + } - names, err := templaterepo.NewProductColl().ListNames() + nameSet := sets.NewString() + for _, name := range opts.Projects { + nameSet.Insert(name) + } + + nameWithEnvsSet := sets.NewString() + for _, nameWithEnv := range nameWithEnvs { + // nameWithEnvs may contain projects which are already deleted. + if !nameSet.Has(nameWithEnv.ProjectName) { + continue + } + res = append(res, &ProjectDetailedRepresentation{ + ProjectBriefRepresentation: &ProjectBriefRepresentation{ + ProjectMinimalRepresentation: &ProjectMinimalRepresentation{Name: nameWithEnv.ProjectName}, + Envs: nameWithEnv.Envs, + }, + }) + nameWithEnvsSet.Insert(nameWithEnv.ProjectName) + } + + projects, err := template.NewProductColl().ListProjectsByNames(opts.Projects) if err != nil { - logger.Errorf("Failed to list project names, err: %s", err) return nil, err } + if !opts.IgnoreNoEnvs { + for _, project := range projects { + if !nameWithEnvsSet.Has(project.ProjectName) { + res = append(res, &ProjectDetailedRepresentation{ + ProjectBriefRepresentation: &ProjectBriefRepresentation{ + ProjectMinimalRepresentation: &ProjectMinimalRepresentation{Name: project.ProjectName}, + }, + Alias: project.ProductName, + Desc: project.Description, + }) + } + } + } + return res, nil +} + +func listBriefProjectInfos(opts *ProjectListOptions, logger *zap.SugaredLogger) (res []*ProjectBriefRepresentation, err error) { nameWithEnvs, err := mongodb.NewProductColl().ListProjects() if err != nil { logger.Errorf("Failed to list projects, err: %s", err) @@ -81,7 +122,7 @@ func listBriefProjectInfos(opts *ProjectListOptions, logger *zap.SugaredLogger) } nameSet := sets.NewString() - for _, name := range names { + for _, name := range opts.Projects { nameSet.Insert(name) } @@ -99,7 +140,7 @@ func listBriefProjectInfos(opts *ProjectListOptions, logger *zap.SugaredLogger) } if !opts.IgnoreNoEnvs { - for _, name := range names { + for _, name := range opts.Projects { if !nameWithEnvsSet.Has(name) { res = append(res, &ProjectBriefRepresentation{ ProjectMinimalRepresentation: &ProjectMinimalRepresentation{Name: name}, @@ -111,17 +152,9 @@ func listBriefProjectInfos(opts *ProjectListOptions, logger *zap.SugaredLogger) return res, nil } -func listMinimalProjectInfos(opts *ProjectListOptions, logger *zap.SugaredLogger) ([]*ProjectMinimalRepresentation, error) { - var res []*ProjectMinimalRepresentation - - names, err := templaterepo.NewProductColl().ListNames() - if err != nil { - logger.Errorf("Failed to list project names, err: %s", err) - return nil, err - } - +func listMinimalProjectInfos(opts *ProjectListOptions, logger *zap.SugaredLogger) (res []*ProjectMinimalRepresentation, err error) { if !opts.IgnoreNoEnvs { - for _, name := range names { + for _, name := range opts.Projects { res = append(res, &ProjectMinimalRepresentation{Name: name}) } @@ -129,7 +162,7 @@ func listMinimalProjectInfos(opts *ProjectListOptions, logger *zap.SugaredLogger } nameSet := sets.NewString() - for _, name := range names { + for _, name := range opts.Projects { nameSet.Insert(name) } -- Gitee From 99270e46401a823b4b149dffc6657be08f68dd0d Mon Sep 17 00:00:00 2001 From: Guang Jiong Lou <7991675+27149chen@users.noreply.github.com> Date: Wed, 13 Oct 2021 18:25:23 +0800 Subject: [PATCH 003/405] fix policy (#378) * fix policy Signed-off-by: lou * add more comments Signed-off-by: lou * update user_projects Signed-off-by: lou * typo Signed-off-by: lou --- .../policy/core/service/bundle/opa_bundle.go | 37 +++++++-- .../core/service/bundle/rego/authz.rego | 48 ++++++++---- .../bundle/rego/test_data/bindings/data.json | 76 ++++++++++++++++--- 3 files changed, 129 insertions(+), 32 deletions(-) diff --git a/pkg/microservice/policy/core/service/bundle/opa_bundle.go b/pkg/microservice/policy/core/service/bundle/opa_bundle.go index ca22f71f9..bdaed41ec 100644 --- a/pkg/microservice/policy/core/service/bundle/opa_bundle.go +++ b/pkg/microservice/policy/core/service/bundle/opa_bundle.go @@ -88,7 +88,12 @@ type rule struct { type roleBinding struct { User string `json:"user"` - RoleRefs roleRefs `json:"role_refs"` + Bindings bindings `json:"bindings"` +} + +type binding struct { + Namespace string `json:"namespace"` + RoleRefs roleRefs `json:"role_refs"` } type roleRef struct { @@ -164,6 +169,14 @@ func (o roles) Less(i, j int) bool { return o[i].Namespace < o[j].Namespace } +type bindings []*binding + +func (o bindings) Len() int { return len(o) } +func (o bindings) Swap(i, j int) { o[i], o[j] = o[j], o[i] } +func (o bindings) Less(i, j int) bool { + return o[i].Namespace < o[j].Namespace +} + type roleRefs []*roleRef func (o roleRefs) Len() int { return len(o) } @@ -256,22 +269,30 @@ func generateOPARoles(roles []*models.Role) *opaRoles { return data } -func generateOPARoleBindings(bindings []*models.RoleBinding) *opaRoleBindings { +func generateOPARoleBindings(rbs []*models.RoleBinding) *opaRoleBindings { data := &opaRoleBindings{} - userRoleMap := make(map[string][]*roleRef) + userRoleMap := make(map[string]map[string][]*roleRef) - for _, rb := range bindings { + for _, rb := range rbs { for _, s := range rb.Subjects { if s.Kind == models.UserKind { - userRoleMap[s.Name] = append(userRoleMap[s.Name], &roleRef{Name: rb.RoleRef.Name, Namespace: rb.RoleRef.Namespace}) + if _, ok := userRoleMap[s.Name]; !ok { + userRoleMap[s.Name] = make(map[string][]*roleRef) + } + userRoleMap[s.Name][rb.Namespace] = append(userRoleMap[s.Name][rb.Namespace], &roleRef{Name: rb.RoleRef.Name, Namespace: rb.RoleRef.Namespace}) } } } - for k, v := range userRoleMap { - sort.Sort(roleRefs(v)) - data.RoleBindings = append(data.RoleBindings, &roleBinding{User: k, RoleRefs: v}) + for u, nb := range userRoleMap { + var bindingsData []*binding + for n, b := range nb { + sort.Sort(roleRefs(b)) + bindingsData = append(bindingsData, &binding{Namespace: n, RoleRefs: b}) + } + sort.Sort(bindings(bindingsData)) + data.RoleBindings = append(data.RoleBindings, &roleBinding{User: u, Bindings: bindingsData}) } sort.Sort(data.RoleBindings) diff --git a/pkg/microservice/policy/core/service/bundle/rego/authz.rego b/pkg/microservice/policy/core/service/bundle/rego/authz.rego index b3119d416..6f58574de 100644 --- a/pkg/microservice/policy/core/service/bundle/rego/authz.rego +++ b/pkg/microservice/policy/core/service/bundle/rego/authz.rego @@ -2,6 +2,14 @@ package rbac import input.attributes.request.http as http_request +# Policy rule definitions in rbac style which is consumed by OPA server. +# you can use it to: +# 1. decide if a request is allowed by querying: rbac.allow +# 2. get all accessible proejcts for an authenticated user by querying: rbac.user_projects +# 3. check if a user is system admin by querying: rbac.user_is_admin +# 4. check if a user is project admin by querying: rbac.user_is_project_admin + + # By default, deny requests. default allow = false @@ -71,22 +79,40 @@ projcet_name := pn { pn := input.parsed_query.projectName[0] } -roles[role] { +# get all projects which are visible by current user +user_projects[project] { some i data.bindings.role_bindings[i].user == claims.name - role_refs := data.bindings.role_bindings[i].role_refs - role := role_refs[_] + project := data.bindings.role_bindings[i].bindings[_].namespace +} + +# get all projects which are visible by all users (the user name is "*") +user_projects[project] { + some i + data.bindings.role_bindings[i].user == "*" + project := data.bindings.role_bindings[i].bindings[_].namespace } -# only global roles and roles under the given project are allowed. +# if user is system admin, return all projects +user_projects[project] { + user_is_admin + project := data.bindings.role_bindings[_].bindings[_].namespace +} + +# only roles under the given project are allowed allewed_roles[role_ref] { - role_ref := roles[_] - role_ref.namespace == "" + some i + data.bindings.role_bindings[i].user == claims.name + data.bindings.role_bindings[i].bindings[j].namespace == projcet_name + role_ref := data.bindings.role_bindings[i].bindings[j].role_refs[_] } +# if the proejct is visible by all users (the user name is "*"), the bound roles are also allowed allewed_roles[role_ref] { - role_ref := roles[_] - role_ref.namespace == projcet_name + some i + data.bindings.role_bindings[i].user == "*" + project := data.bindings.role_bindings[i].bindings[_].namespace == projcet_name + role_ref := data.bindings.role_bindings[i].bindings[j].role_refs[_] } user_is_granted[grant] { @@ -99,12 +125,6 @@ user_is_granted[grant] { grant := data.roles.roles[i].rules[_] } -# get all projects which are visible by current user -user_projects[project] { - project := roles[_].namespace - project != "" -} - claims := payload { # TODO: Verify the signature on the Bearer token. The certificate can be # hardcoded into the policy, and it could also be loaded via data or diff --git a/pkg/microservice/policy/core/service/bundle/rego/test_data/bindings/data.json b/pkg/microservice/policy/core/service/bundle/rego/test_data/bindings/data.json index 0512dd84f..36187c9c6 100644 --- a/pkg/microservice/policy/core/service/bundle/rego/test_data/bindings/data.json +++ b/pkg/microservice/policy/core/service/bundle/rego/test_data/bindings/data.json @@ -2,24 +2,80 @@ "role_bindings": [ { "user": "alice", - "role_refs": [ + "bindings": [ { - "name": "reader1", - "namespace": "project1" + "namespace": "project1", + "role_refs": [ + { + "name": "reader1", + "namespace": "project1" + }, + { + "name": "reader2", + "namespace": "" + } + ] }, { - "name": "reader", - "namespace": "project2" + "namespace": "project2", + "role_refs": [ + { + "name": "reader", + "namespace": "project2" + }, + { + "name": "reader3", + "namespace": "project2" + } + ] + } + ] + }, + { + "user": "*", + "bindings": [ + { + "namespace": "project3", + "role_refs": [ + { + "name": "view", + "namespace": "" + } + ] }, { - "name": "reader3", - "namespace": "project2" + "namespace": "project1", + "role_refs": [ + { + "name": "view", + "namespace": "" + } + ] + } + ] + }, + { + "user": "bob", + "bindings": [ + { + "namespace": "project4", + "role_refs": [ + { + "name": "view", + "namespace": "" + } + ] }, { - "name": "reader2", - "namespace": "" + "namespace": "project5", + "role_refs": [ + { + "name": "view", + "namespace": "" + } + ] } ] } ] -} \ No newline at end of file +} -- Gitee From cf3bbd462ac2ed89155846cf6f3325b4eb03dde6 Mon Sep 17 00:00:00 2001 From: mouuii Date: Wed, 13 Oct 2021 19:33:16 +0800 Subject: [PATCH 004/405] refactor list workflows Signed-off-by: mouuii --- .../common/repository/mongodb/workflow.go | 19 +++++++ .../aslan/core/workflow/handler/router.go | 2 +- .../aslan/core/workflow/handler/workflow.go | 4 +- .../workflow/service/workflow/workflow.go | 50 ++----------------- 4 files changed, 26 insertions(+), 49 deletions(-) diff --git a/pkg/microservice/aslan/core/common/repository/mongodb/workflow.go b/pkg/microservice/aslan/core/common/repository/mongodb/workflow.go index 4f482802b..c7bbc880d 100644 --- a/pkg/microservice/aslan/core/common/repository/mongodb/workflow.go +++ b/pkg/microservice/aslan/core/common/repository/mongodb/workflow.go @@ -172,3 +172,22 @@ func (c *WorkflowColl) ListWithScheduleEnabled() ([]*models.Workflow, error) { return resp, nil } + +func (c *WorkflowColl) ListWorkflowsByProjects(projects []string) ([]*models.Workflow, error) { + resp := make([]*models.Workflow, 0) + query := bson.M{"product_tmpl_name": bson.M{ + "$in": projects, + }} + + cursor, err := c.Collection.Find(context.TODO(), query) + if err != nil { + return nil, err + } + + err = cursor.All(context.TODO(), &resp) + if err != nil { + return nil, err + } + + return resp, nil +} diff --git a/pkg/microservice/aslan/core/workflow/handler/router.go b/pkg/microservice/aslan/core/workflow/handler/router.go index fa511c593..c006c918e 100644 --- a/pkg/microservice/aslan/core/workflow/handler/router.go +++ b/pkg/microservice/aslan/core/workflow/handler/router.go @@ -108,7 +108,7 @@ func (*Router) Inject(router *gin.RouterGroup) { workflow.POST("", GetWorkflowProductName, gin2.IsHavePermission([]string{permission.WorkflowCreateUUID}, permission.ContextKeyType), gin2.UpdateOperationLogStatus, CreateWorkflow) workflow.PUT("", GetWorkflowProductName, gin2.IsHavePermission([]string{permission.WorkflowUpdateUUID}, permission.ContextKeyType), gin2.UpdateOperationLogStatus, UpdateWorkflow) workflow.GET("", ListWorkflows) - workflow.GET("/testName/:testName", ListAllWorkflows) + workflow.GET("/testName/:testName", ListTestWorkflows) workflow.GET("/find/:name", FindWorkflow) workflow.DELETE("/:name", GetProductNameByWorkflow, gin2.IsHavePermission([]string{permission.WorkflowDeleteUUID}, permission.ContextKeyType), gin2.UpdateOperationLogStatus, DeleteWorkflow) workflow.GET("/preset/:productName", PreSetWorkflow) diff --git a/pkg/microservice/aslan/core/workflow/handler/workflow.go b/pkg/microservice/aslan/core/workflow/handler/workflow.go index 729fcf3f3..2c67cda40 100644 --- a/pkg/microservice/aslan/core/workflow/handler/workflow.go +++ b/pkg/microservice/aslan/core/workflow/handler/workflow.go @@ -121,11 +121,11 @@ func ListWorkflows(c *gin.Context) { ctx.Resp, ctx.Err = workflow.ListWorkflows(c.Query("type"), ctx.User.ID, ctx.Logger) } -func ListAllWorkflows(c *gin.Context) { +func ListTestWorkflows(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - ctx.Resp, ctx.Err = workflow.ListAllWorkflows(c.Param("testName"), ctx.User.ID, ctx.User.IsSuperUser, ctx.Logger) + ctx.Resp, ctx.Err = workflow.ListAllWorkflows(c.Param("testName"), ctx.User.ID, c.QueryArray("projects"), ctx.Logger) } // FindWorkflow find a workflow diff --git a/pkg/microservice/aslan/core/workflow/service/workflow/workflow.go b/pkg/microservice/aslan/core/workflow/service/workflow/workflow.go index ec44581e7..d88a06315 100644 --- a/pkg/microservice/aslan/core/workflow/service/workflow/workflow.go +++ b/pkg/microservice/aslan/core/workflow/service/workflow/workflow.go @@ -33,10 +33,8 @@ import ( commonservice "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service" "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/webhook" "github.com/koderover/zadig/pkg/setting" - "github.com/koderover/zadig/pkg/shared/poetry" e "github.com/koderover/zadig/pkg/tool/errors" "github.com/koderover/zadig/pkg/types" - "github.com/koderover/zadig/pkg/types/permission" ) var mut sync.Mutex @@ -490,51 +488,11 @@ func findWorkflowStat(workflow *commonmodels.Workflow, workflowStats []*commonmo return 0, 0, 0 } -func ListAllWorkflows(testName string, userID int, superUser bool, log *zap.SugaredLogger) ([]*commonmodels.Workflow, error) { - allWorkflows := make([]*commonmodels.Workflow, 0) - workflows := make([]*commonmodels.Workflow, 0) - var err error - if superUser { - allWorkflows, err = commonrepo.NewWorkflowColl().List(&commonrepo.ListWorkflowOption{}) - if err != nil { - log.Errorf("Workflow.List error: %v", err) - return allWorkflows, e.ErrListWorkflow.AddDesc(err.Error()) - } - } else { - poetryCtl := poetry.New(config.PoetryAPIServer(), config.PoetryAPIRootKey()) - productNameMap, err := poetryCtl.GetUserProject(userID, log) - if err != nil { - log.Errorf("ListAllWorkflows GetUserProject error: %v", err) - return nil, fmt.Errorf("ListAllWorkflows GetUserProject error: %v", err) - } - productNames := make([]string, 0) - for productName, roleIDs := range productNameMap { - roleID := roleIDs[0] - if roleID == setting.RoleOwnerID { - productNames = append(productNames, productName) - } else { - uuids, err := poetryCtl.GetUserPermissionUUIDs(roleID, productName, log) - if err != nil { - log.Errorf("ListAllWorkflows GetUserPermissionUUIDs error: %v", err) - return nil, fmt.Errorf("ListAllWorkflows GetUserPermissionUUIDs error: %v", err) - } - - ids := sets.NewString(uuids...) - if ids.Has(permission.WorkflowUpdateUUID) { - productNames = append(productNames, productName) - } - } - } - for _, productName := range productNames { - tempWorkflows, err := commonrepo.NewWorkflowColl().List(&commonrepo.ListWorkflowOption{ProductName: productName}) - if err != nil { - log.Errorf("ListAllWorkflows Workflow.List error: %v", err) - return nil, fmt.Errorf("ListAllWorkflows Workflow.List error: %v", err) - } - allWorkflows = append(allWorkflows, tempWorkflows...) - } +func ListAllWorkflows(testName string, userID int, projects []string, log *zap.SugaredLogger) (workflows []*commonmodels.Workflow, err error) { + allWorkflows, err := commonrepo.NewWorkflowColl().ListWorkflowsByProjects(projects) + if err != nil { + return nil, err } - for _, workflow := range allWorkflows { if workflow.TestStage != nil { testNames := sets.NewString(workflow.TestStage.TestNames...) -- Gitee From 2e1c4c9ccbe4bd3e4fe52554ad8e4cdcdbea743a Mon Sep 17 00:00:00 2001 From: mouuii Date: Wed, 13 Oct 2021 20:10:01 +0800 Subject: [PATCH 005/405] refactor list workflows Signed-off-by: mouuii --- .../picket/client/aslan/workflow.go | 19 ++++++++++++++ .../picket/core/filter/handler/router.go | 4 +++ .../picket/core/filter/handler/workflow.go | 15 +++++++++++ .../picket/core/filter/service/workflow.go | 25 +++++++++++++++++++ 4 files changed, 63 insertions(+) create mode 100644 pkg/microservice/picket/client/aslan/workflow.go create mode 100644 pkg/microservice/picket/core/filter/handler/workflow.go create mode 100644 pkg/microservice/picket/core/filter/service/workflow.go diff --git a/pkg/microservice/picket/client/aslan/workflow.go b/pkg/microservice/picket/client/aslan/workflow.go new file mode 100644 index 000000000..9b16631fb --- /dev/null +++ b/pkg/microservice/picket/client/aslan/workflow.go @@ -0,0 +1,19 @@ +package aslan + +import ( + "net/http" + "net/url" + + "github.com/koderover/zadig/pkg/tool/httpclient" +) + +func (c *Client) ListTestProjects(testName string, header http.Header, qs url.Values) ([]byte, error) { + url := "/workflow/workflow/testName/" + testName + + res, err := c.Get(url, httpclient.SetHeadersFromHTTPHeader(header), httpclient.SetQueryParamsFromValues(qs)) + if err != nil { + return nil, err + } + + return res.Body(), nil +} diff --git a/pkg/microservice/picket/core/filter/handler/router.go b/pkg/microservice/picket/core/filter/handler/router.go index 715ca28a9..9e8aea853 100644 --- a/pkg/microservice/picket/core/filter/handler/router.go +++ b/pkg/microservice/picket/core/filter/handler/router.go @@ -27,4 +27,8 @@ func (*Router) Inject(router *gin.RouterGroup) { { roles.GET("", ListProjects) } + workflows := router.Group("workflows") + { + workflows.GET("testName/:testName", ListTestWorkflows) + } } diff --git a/pkg/microservice/picket/core/filter/handler/workflow.go b/pkg/microservice/picket/core/filter/handler/workflow.go new file mode 100644 index 000000000..2a93f9774 --- /dev/null +++ b/pkg/microservice/picket/core/filter/handler/workflow.go @@ -0,0 +1,15 @@ +package handler + +import ( + "github.com/gin-gonic/gin" + + "github.com/koderover/zadig/pkg/microservice/picket/core/filter/service" + internalhandler "github.com/koderover/zadig/pkg/shared/handler" +) + +func ListTestWorkflows(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + testName := c.Param("testName") + ctx.Resp, ctx.Err = service.ListTestWorkflows(testName, c.Request.Header, c.Request.URL.Query(), ctx.Logger) +} diff --git a/pkg/microservice/picket/core/filter/service/workflow.go b/pkg/microservice/picket/core/filter/service/workflow.go new file mode 100644 index 000000000..78a7a1851 --- /dev/null +++ b/pkg/microservice/picket/core/filter/service/workflow.go @@ -0,0 +1,25 @@ +package service + +import ( + "net/http" + "net/url" + + "github.com/koderover/zadig/pkg/microservice/picket/client/aslan" + "go.uber.org/zap" +) + +func ListTestWorkflows(testName string, header http.Header, qs url.Values, logger *zap.SugaredLogger) ([]byte, error) { + names, err := getAllowedProjects(header, logger) + if err != nil { + logger.Errorf("Failed to get allowed project names, err: %s", err) + return nil, err + } + + for _, name := range names { + qs.Add("projects", name) + } + + aslanClient := aslan.New() + + return aslanClient.ListTestProjects(testName, header, qs) +} -- Gitee From e7979e35446c1131c9167c1f5295561a53030ef0 Mon Sep 17 00:00:00 2001 From: mouuii Date: Wed, 13 Oct 2021 20:21:13 +0800 Subject: [PATCH 006/405] refactor list workflows Signed-off-by: mouuii --- pkg/microservice/aslan/core/project/handler/router.go | 2 ++ pkg/microservice/aslan/core/workflow/handler/router.go | 1 + 2 files changed, 3 insertions(+) diff --git a/pkg/microservice/aslan/core/project/handler/router.go b/pkg/microservice/aslan/core/project/handler/router.go index 8a5031626..3a364b4f3 100644 --- a/pkg/microservice/aslan/core/project/handler/router.go +++ b/pkg/microservice/aslan/core/project/handler/router.go @@ -42,6 +42,7 @@ func (*Router) Inject(router *gin.RouterGroup) { { product.GET("/:name", GetProductTemplate) product.GET("/:name/services", GetProductTemplateServices) + // replace by picket product.GET("", ListProductTemplate) product.GET("/:name/searching-rules", GetCustomMatchRules) product.PUT("/:name/searching-rules", gin2.StoreProductName, gin2.IsHavePermission([]string{permission.SuperUserUUID}, permission.ContextKeyType), gin2.UpdateOperationLogStatus, CreateOrUpdateMatchRules) @@ -65,6 +66,7 @@ func (*Router) Inject(router *gin.RouterGroup) { project := router.Group("projects") { + // request by picket project.GET("", ListProjects) } } diff --git a/pkg/microservice/aslan/core/workflow/handler/router.go b/pkg/microservice/aslan/core/workflow/handler/router.go index c006c918e..9f267b73b 100644 --- a/pkg/microservice/aslan/core/workflow/handler/router.go +++ b/pkg/microservice/aslan/core/workflow/handler/router.go @@ -108,6 +108,7 @@ func (*Router) Inject(router *gin.RouterGroup) { workflow.POST("", GetWorkflowProductName, gin2.IsHavePermission([]string{permission.WorkflowCreateUUID}, permission.ContextKeyType), gin2.UpdateOperationLogStatus, CreateWorkflow) workflow.PUT("", GetWorkflowProductName, gin2.IsHavePermission([]string{permission.WorkflowUpdateUUID}, permission.ContextKeyType), gin2.UpdateOperationLogStatus, UpdateWorkflow) workflow.GET("", ListWorkflows) + // request by picket workflow.GET("/testName/:testName", ListTestWorkflows) workflow.GET("/find/:name", FindWorkflow) workflow.DELETE("/:name", GetProductNameByWorkflow, gin2.IsHavePermission([]string{permission.WorkflowDeleteUUID}, permission.ContextKeyType), gin2.UpdateOperationLogStatus, DeleteWorkflow) -- Gitee From 802dcad25343837bbc299c1dbe61034810b2b852 Mon Sep 17 00:00:00 2001 From: mouuii Date: Thu, 14 Oct 2021 14:38:06 +0800 Subject: [PATCH 007/405] rename listallworkflows Signed-off-by: mouuii --- pkg/microservice/aslan/core/workflow/handler/workflow.go | 2 +- .../aslan/core/workflow/service/workflow/workflow.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/microservice/aslan/core/workflow/handler/workflow.go b/pkg/microservice/aslan/core/workflow/handler/workflow.go index 2c67cda40..e74339282 100644 --- a/pkg/microservice/aslan/core/workflow/handler/workflow.go +++ b/pkg/microservice/aslan/core/workflow/handler/workflow.go @@ -125,7 +125,7 @@ func ListTestWorkflows(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - ctx.Resp, ctx.Err = workflow.ListAllWorkflows(c.Param("testName"), ctx.User.ID, c.QueryArray("projects"), ctx.Logger) + ctx.Resp, ctx.Err = workflow.ListTestWorkflows(c.Param("testName"), ctx.User.ID, c.QueryArray("projects"), ctx.Logger) } // FindWorkflow find a workflow diff --git a/pkg/microservice/aslan/core/workflow/service/workflow/workflow.go b/pkg/microservice/aslan/core/workflow/service/workflow/workflow.go index d88a06315..3a143e59e 100644 --- a/pkg/microservice/aslan/core/workflow/service/workflow/workflow.go +++ b/pkg/microservice/aslan/core/workflow/service/workflow/workflow.go @@ -488,7 +488,7 @@ func findWorkflowStat(workflow *commonmodels.Workflow, workflowStats []*commonmo return 0, 0, 0 } -func ListAllWorkflows(testName string, userID int, projects []string, log *zap.SugaredLogger) (workflows []*commonmodels.Workflow, err error) { +func ListTestWorkflows(testName string, userID int, projects []string, log *zap.SugaredLogger) (workflows []*commonmodels.Workflow, err error) { allWorkflows, err := commonrepo.NewWorkflowColl().ListWorkflowsByProjects(projects) if err != nil { return nil, err -- Gitee From f920542a5bea8914280262a7c0a74481fd9e980d Mon Sep 17 00:00:00 2001 From: lou Date: Thu, 14 Oct 2021 14:44:37 +0800 Subject: [PATCH 008/405] add global rolebinding & add new policy user_visible_projects and user_allowed_projects Signed-off-by: lou --- .../policy/core/handler/role_binding.go | 13 ++++ .../policy/core/handler/router.go | 5 ++ .../core/service/bundle/rego/authz.rego | 59 ++++++++++++++----- .../bundle/rego/test_data/bindings/data.json | 9 +++ .../bundle/rego/test_data/roles/data.json | 10 ++++ .../policy/core/service/role_binding.go | 5 -- 6 files changed, 81 insertions(+), 20 deletions(-) diff --git a/pkg/microservice/policy/core/handler/role_binding.go b/pkg/microservice/policy/core/handler/role_binding.go index 33b73e8fc..5ceca3008 100644 --- a/pkg/microservice/policy/core/handler/role_binding.go +++ b/pkg/microservice/policy/core/handler/role_binding.go @@ -42,3 +42,16 @@ func CreateRoleBinding(c *gin.Context) { ctx.Err = service.CreateRoleBinding(projectName, args, ctx.Logger) } + +func CreateGlobalRoleBinding(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + + args := &service.RoleBinding{} + if err := c.ShouldBindJSON(args); err != nil { + ctx.Err = err + return + } + + ctx.Err = service.CreateRoleBinding("", args, ctx.Logger) +} diff --git a/pkg/microservice/policy/core/handler/router.go b/pkg/microservice/policy/core/handler/router.go index 32cd3db6c..89799a37b 100644 --- a/pkg/microservice/policy/core/handler/router.go +++ b/pkg/microservice/policy/core/handler/router.go @@ -38,6 +38,11 @@ func (*Router) Inject(router *gin.RouterGroup) { roleBindings.POST("", CreateRoleBinding) } + globalRoleBindings := router.Group("global-rolebindings") + { + globalRoleBindings.POST("", CreateGlobalRoleBinding) + } + bundles := router.Group("bundles") { bundles.GET("/:name", DownloadBundle) diff --git a/pkg/microservice/policy/core/service/bundle/rego/authz.rego b/pkg/microservice/policy/core/service/bundle/rego/authz.rego index 6f58574de..8cf176495 100644 --- a/pkg/microservice/policy/core/service/bundle/rego/authz.rego +++ b/pkg/microservice/policy/core/service/bundle/rego/authz.rego @@ -5,9 +5,10 @@ import input.attributes.request.http as http_request # Policy rule definitions in rbac style which is consumed by OPA server. # you can use it to: # 1. decide if a request is allowed by querying: rbac.allow -# 2. get all accessible proejcts for an authenticated user by querying: rbac.user_projects -# 3. check if a user is system admin by querying: rbac.user_is_admin -# 4. check if a user is project admin by querying: rbac.user_is_project_admin +# 2. get all visible projects for an authenticated user by querying: rbac.user_visible_projects +# 3. get all allowed projects for a certain action(method+endpoint) for an authenticated user by querying: rbac.user_allowed_projects +# 4. check if a user is system admin by querying: rbac.user_is_admin +# 5. check if a user is project admin by querying: rbac.user_is_project_admin # By default, deny requests. @@ -45,7 +46,7 @@ allow { user_is_admin { some role - allewed_roles[role] + all_roles[role] role.name == "admin" role.namespace == "" @@ -53,10 +54,10 @@ user_is_admin { user_is_project_admin { some role - allewed_roles[role] + allowed_roles[role] role.name == "admin" - role.namespace == projcet_name + role.namespace == project_name } url_is_public { @@ -72,10 +73,10 @@ url_is_exempted { url_is_exempted { data.exemptions.namespaced[_].method == http_request.method glob.match(trim(data.exemptions.namespaced[_].endpoint, "/"), ["/"], concat("/", input.parsed_path)) - user_projects[_] == projcet_name + user_projects[_] == project_name } -projcet_name := pn { +project_name := pn { pn := input.parsed_query.projectName[0] } @@ -93,31 +94,59 @@ user_projects[project] { project := data.bindings.role_bindings[i].bindings[_].namespace } +# all projects which are allowed by current user +user_allowed_projects[project] { + some project + user_projects[project] + not user_is_admin + allow with project_name as project +} + # if user is system admin, return all projects -user_projects[project] { +user_allowed_projects[project] { + project := "*" user_is_admin - project := data.bindings.role_bindings[_].bindings[_].namespace +} + +# all projects which are visible by current user +user_visible_projects[project] { + some project + user_projects[project] + not user_is_admin +} + +# if user is system admin, return all projects +user_visible_projects[project] { + project := "*" + user_is_admin +} + + +all_roles[role_ref] { + some i + data.bindings.role_bindings[i].user == claims.name + role_ref := data.bindings.role_bindings[i].bindings[j].role_refs[_] } # only roles under the given project are allowed -allewed_roles[role_ref] { +allowed_roles[role_ref] { some i data.bindings.role_bindings[i].user == claims.name - data.bindings.role_bindings[i].bindings[j].namespace == projcet_name + data.bindings.role_bindings[i].bindings[j].namespace == project_name role_ref := data.bindings.role_bindings[i].bindings[j].role_refs[_] } # if the proejct is visible by all users (the user name is "*"), the bound roles are also allowed -allewed_roles[role_ref] { +allowed_roles[role_ref] { some i data.bindings.role_bindings[i].user == "*" - project := data.bindings.role_bindings[i].bindings[_].namespace == projcet_name + project := data.bindings.role_bindings[i].bindings[_].namespace == project_name role_ref := data.bindings.role_bindings[i].bindings[j].role_refs[_] } user_is_granted[grant] { some role_ref - allewed_roles[role_ref] + allowed_roles[role_ref] some i data.roles.roles[i].name == role_ref.name diff --git a/pkg/microservice/policy/core/service/bundle/rego/test_data/bindings/data.json b/pkg/microservice/policy/core/service/bundle/rego/test_data/bindings/data.json index 36187c9c6..fb99ca388 100644 --- a/pkg/microservice/policy/core/service/bundle/rego/test_data/bindings/data.json +++ b/pkg/microservice/policy/core/service/bundle/rego/test_data/bindings/data.json @@ -3,6 +3,15 @@ { "user": "alice", "bindings": [ + { + "namespace": "", + "role_refs": [ + { + "name": "admin", + "namespace": "" + } + ] + }, { "namespace": "project1", "role_refs": [ diff --git a/pkg/microservice/policy/core/service/bundle/rego/test_data/roles/data.json b/pkg/microservice/policy/core/service/bundle/rego/test_data/roles/data.json index 68ce3d2fb..d86936b5e 100644 --- a/pkg/microservice/policy/core/service/bundle/rego/test_data/roles/data.json +++ b/pkg/microservice/policy/core/service/bundle/rego/test_data/roles/data.json @@ -70,6 +70,16 @@ } ] }, + { + "name": "view", + "namespace": "project3", + "rules": [ + { + "method": "GET", + "endpoint": "/api/articles" + } + ] + }, { "name": "reader2", "namespace": "project1", diff --git a/pkg/microservice/policy/core/service/role_binding.go b/pkg/microservice/policy/core/service/role_binding.go index 8300729c5..a7cd5339e 100644 --- a/pkg/microservice/policy/core/service/role_binding.go +++ b/pkg/microservice/policy/core/service/role_binding.go @@ -33,11 +33,6 @@ type RoleBinding struct { } func CreateRoleBinding(ns string, rb *RoleBinding, logger *zap.SugaredLogger) error { - if ns == "" { - logger.Errorf("Namespace is empty") - return fmt.Errorf("empty namespace") - } - nsRole := ns if rb.Global { nsRole = "" -- Gitee From 6595ca2de74a5b52855422c83cb1dd5d6bf0bf4e Mon Sep 17 00:00:00 2001 From: mouuii Date: Thu, 14 Oct 2021 14:47:07 +0800 Subject: [PATCH 009/405] remove workflow has permission Signed-off-by: mouuii --- .../service/workflow/workflow_task.go | 94 +------------------ 1 file changed, 1 insertion(+), 93 deletions(-) diff --git a/pkg/microservice/aslan/core/workflow/service/workflow/workflow_task.go b/pkg/microservice/aslan/core/workflow/service/workflow/workflow_task.go index ddb3b4f2d..1983ba6b9 100644 --- a/pkg/microservice/aslan/core/workflow/service/workflow/workflow_task.go +++ b/pkg/microservice/aslan/core/workflow/service/workflow/workflow_task.go @@ -28,7 +28,6 @@ import ( "go.mongodb.org/mongo-driver/mongo" "go.uber.org/zap" - "k8s.io/apimachinery/pkg/util/sets" configbase "github.com/koderover/zadig/pkg/config" "github.com/koderover/zadig/pkg/microservice/aslan/config" @@ -45,7 +44,6 @@ import ( e "github.com/koderover/zadig/pkg/tool/errors" "github.com/koderover/zadig/pkg/tool/log" "github.com/koderover/zadig/pkg/types" - "github.com/koderover/zadig/pkg/types/permission" "github.com/koderover/zadig/pkg/util" ) @@ -250,7 +248,7 @@ func EnsureBuildResp(mb *commonmodels.Build) { func ListBuildDetail(name, targets string, log *zap.SugaredLogger) ([]*commonmodels.Build, error) { opt := &commonrepo.BuildListOption{ - Name: name, + Name: name, } if len(strings.TrimSpace(targets)) != 0 { @@ -440,11 +438,6 @@ func CreateWorkflowTask(args *commonmodels.WorkflowTaskArgs, taskCreator string, } args.IsParallel = workflow.IsParallel - if !HasPermission(workflow.ProductTmplName, workflow.EnvName, args, userID, superUser, log) { - log.Warnf("该工作流[%s]绑定的环境您没有权限,用户[%s]不能执行该工作流!", workflow.Name, taskCreator) - return nil, e.ErrCreateTask.AddDesc("该工作流绑定的环境您没有更新环境或者环境管理权限,不能执行该工作流!") - } - var env *commonmodels.Product if args.Namespace != "" { // 处理namespace,避免开头或者结尾出现多余的逗号 @@ -854,86 +847,6 @@ func AddDataToArgs(args *commonmodels.WorkflowTaskArgs, log *zap.SugaredLogger) return nil } -func HasPermission(productName, envName string, args *commonmodels.WorkflowTaskArgs, userID int, superUser bool, log *zap.SugaredLogger) bool { - //排除触发器触发和工作流没有绑定环境的情况 - if userID == permission.AnonymousUserID || envName == "" { - return true - } - // 只有测试任务的情况 - if len(args.Target) == 0 && len(args.Tests) > 0 { - return true - } - //权限判断 - if superUser { - return true - } - poetryClient := poetry.New(config.PoetryAPIServer(), config.PoetryAPIRootKey()) - productNameMap, err := poetryClient.GetUserProject(userID, log) - if err != nil { - log.Errorf("Collection.Product.List GetUserProject error: %v", err) - return false - } - //判断环境是类生产环境还是测试环境 - isProd := false - opt := &commonrepo.ProductFindOptions{Name: productName, EnvName: envName} - prod, _ := commonrepo.NewProductColl().Find(opt) - if prod != nil && prod.ClusterID != "" { - if cluster, _ := commonrepo.NewK8SClusterColl().Get(prod.ClusterID); cluster != nil { - isProd = cluster.Production - } - } - for _, roleID := range productNameMap[productName] { - if roleID == poetry.ProjectOwner { - return true - } - if envRolePermissions, _ := poetryClient.ListEnvRolePermission(productName, envName, roleID, log); len(envRolePermissions) > 0 { - for _, envRolePermission := range envRolePermissions { - if envRolePermission.PermissionUUID == permission.TestEnvManageUUID { - return true - } - } - } else { - if !isProd { - if poetryClient.HasOperatePermission(productName, permission.TestUpdateEnvUUID, userID, superUser, log) { - return true - } - if poetryClient.HasOperatePermission(productName, permission.TestEnvManageUUID, userID, superUser, log) { - return true - } - - envRolePermissions, _ := poetryClient.ListEnvRolePermission(productName, envName, 0, log) - for _, envRolePermission := range envRolePermissions { - if envRolePermission.PermissionUUID == permission.TestEnvManageUUID { - return true - } - } - } else { - if poetryClient.HasOperatePermission(productName, permission.ProdEnvManageUUID, userID, superUser, log) { - return true - } - - envRolePermissions, _ := poetryClient.ListEnvRolePermission(productName, envName, 0, log) - for _, envRolePermission := range envRolePermissions { - if envRolePermission.PermissionUUID == permission.ProdEnvManageUUID { - return true - } - } - } - } - } - // 如果该项目设置过all-users,判断all-users的权限 - productRole, _ := poetryClient.ListRoles(productName, log) - if productRole != nil { - permissionUUIDs, _ := poetryClient.GetUserPermissionUUIDs(productRole.ID, productName, log) - if isProd && sets.NewString(permissionUUIDs...).Has(permission.ProdEnvManageUUID) { - return true - } else if !isProd && sets.NewString(permissionUUIDs...).Has(permission.TestEnvManageUUID) { - return true - } - } - return false -} - func dealWithNamespace(args *commonmodels.WorkflowTaskArgs) { args.Namespace = strings.TrimPrefix(args.Namespace, ",") args.Namespace = strings.TrimSuffix(args.Namespace, ",") @@ -1313,11 +1226,6 @@ func CreateArtifactWorkflowTask(args *commonmodels.WorkflowTaskArgs, taskCreator return nil, e.ErrFindWorkflow.AddDesc(err.Error()) } - if !HasPermission(workflow.ProductTmplName, workflow.EnvName, args, userID, superUser, log) { - log.Warnf("该工作流[%s]绑定的环境您没有权限,用户[%s]不能执行该工作流!", workflow.Name, taskCreator) - return nil, e.ErrCreateTask.AddDesc("该工作流绑定的环境您没有更新环境或者环境管理权限,不能执行该工作流") - } - var env *commonmodels.Product if args.Namespace != "" { // 查找要部署的环境 -- Gitee From 7e8bd9470ca53fdfea4970e05b82184ad9e9c412 Mon Sep 17 00:00:00 2001 From: mouuii Date: Thu, 14 Oct 2021 14:50:34 +0800 Subject: [PATCH 010/405] remove user k8s config verb limit, now to * Signed-off-by: mouuii --- pkg/microservice/aslan/core/setting/service/user.go | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/pkg/microservice/aslan/core/setting/service/user.go b/pkg/microservice/aslan/core/setting/service/user.go index 45ef8f90c..269ff39b6 100644 --- a/pkg/microservice/aslan/core/setting/service/user.go +++ b/pkg/microservice/aslan/core/setting/service/user.go @@ -45,7 +45,6 @@ import ( krkubeclient "github.com/koderover/zadig/pkg/tool/kube/client" "github.com/koderover/zadig/pkg/tool/kube/getter" "github.com/koderover/zadig/pkg/tool/kube/updater" - "github.com/koderover/zadig/pkg/types/permission" ) type kubeCfgTmplArgs struct { @@ -237,12 +236,8 @@ func ensureServiceAccount(namespace, username string, log *zap.SugaredLogger) er } func ensureUserRole(namespace, username, productName string, userID int, superUser bool, log *zap.SugaredLogger) error { - poetryClient := poetry.New(config.PoetryAPIServer(), config.PoetryAPIRootKey()) roleName := fmt.Sprintf("%s-role", username) - verbs := []string{"get", "list", "watch"} - if poetryClient.HasOperatePermission(productName, permission.TestEnvManageUUID, userID, superUser, log) { - verbs = []string{"*"} - } + verbs := []string{"*"} role := &rbacv1beta1.Role{ ObjectMeta: metav1.ObjectMeta{ Name: roleName, -- Gitee From 1b4a6100ba99acc32742c76137d8227dd40c9d51 Mon Sep 17 00:00:00 2001 From: mouuii Date: Thu, 14 Oct 2021 14:54:01 +0800 Subject: [PATCH 011/405] delete contributor permission Signed-off-by: mouuii --- .../aslan/core/project/service/product.go | 36 ----------- pkg/shared/poetry/user.go | 61 ------------------- 2 files changed, 97 deletions(-) diff --git a/pkg/microservice/aslan/core/project/service/product.go b/pkg/microservice/aslan/core/project/service/product.go index 36ee1b2ae..ca67b4f28 100644 --- a/pkg/microservice/aslan/core/project/service/product.go +++ b/pkg/microservice/aslan/core/project/service/product.go @@ -41,7 +41,6 @@ import ( "github.com/koderover/zadig/pkg/shared/poetry" e "github.com/koderover/zadig/pkg/tool/errors" "github.com/koderover/zadig/pkg/tool/log" - "github.com/koderover/zadig/pkg/types/permission" ) type CustomParseDataArgs struct { @@ -533,23 +532,6 @@ func DeleteProductTemplate(userName, productName, requestID string, log *zap.Sug } func ForkProduct(userID int, username, requestID string, args *template.ForkProject, log *zap.SugaredLogger) error { - poetryClient := poetry.New(config.PoetryAPIServer(), config.PoetryAPIRootKey()) - // first check if the product have contributor role, if not, create one - if !poetryClient.ContributorRoleExist(args.ProductName, log) { - err := poetryClient.CreateContributorRole(args.ProductName, log) - if err != nil { - log.Errorf("Cannot create contributor role for product: %s, the error is: %v", args.ProductName, err) - return e.ErrForkProduct.AddDesc(err.Error()) - } - } - - // Give contributor role to this user - // first look for roleID - roleID := poetryClient.GetContributorRoleID(args.ProductName, log) - if roleID < 0 { - log.Errorf("Failed to get contributor Role ID from poetry client") - return e.ErrForkProduct.AddDesc("Failed to get contributor Role ID from poetry client") - } prodTmpl, err := templaterepo.NewProductColl().Find(args.ProductName) if err != nil { @@ -622,24 +604,6 @@ func ForkProduct(userID int, username, requestID string, args *template.ForkProj return e.ErrForkProduct.AddDesc(errMsg) } - userList, _ := poetryClient.ListPermissionUsers(args.ProductName, roleID, poetry.ProjectType, log) - newUserList := append(userList, userID) - err = poetryClient.UpdateUserRole(roleID, poetry.ProjectType, args.ProductName, newUserList, log) - if err != nil { - log.Errorf("Failed to update user role, the error is: %v", err) - return e.ErrForkProduct.AddDesc(fmt.Sprintf("Failed to update user role, the error is: %v", err)) - } - - err = poetryClient.CreateUserEnvPermission(&poetry.UserEnvPermission{ - UserID: userID, - ProductName: args.ProductName, - EnvName: args.EnvName, - PermissionUUIDs: []string{permission.TestEnvListUUID, permission.TestEnvManageUUID}, - }) - if err != nil { - return e.ErrForkProduct.AddDesc(fmt.Sprintf("Failed to create env permission for user: %s", username)) - } - workflowPreset, err := workflowservice.PreSetWorkflow(args.ProductName, log) if err != nil { errMsg := fmt.Sprintf("Failed to get workflow preset info, the error is: %+v", err) diff --git a/pkg/shared/poetry/user.go b/pkg/shared/poetry/user.go index db5d53536..6885299fb 100644 --- a/pkg/shared/poetry/user.go +++ b/pkg/shared/poetry/user.go @@ -20,13 +20,11 @@ import ( "fmt" "strconv" "strings" - "time" "go.uber.org/zap" "github.com/koderover/zadig/pkg/setting" "github.com/koderover/zadig/pkg/tool/httpclient" - "github.com/koderover/zadig/pkg/types/permission" ) //roleType @@ -288,65 +286,6 @@ func (c *Client) ListProductPermissionUsers(productName, permissionID string, lo return resp, nil } -func (c *Client) CreateContributorRole(product string, log *zap.SugaredLogger) error { - // create role first - url := "/directory/roles" - req := &Role{ - IsDisabled: false, - Name: setting.RoleContributor, - ProductName: product, - RoleType: ProjectType, - UpdateBy: setting.SystemUser, - UpdateAt: time.Now().Unix(), - } - - r := &Role{} - _, err := c.Post(url, httpclient.SetBody(req), httpclient.SetResult(r)) - if err != nil { - log.Errorf("CreateContributorRole failed, error: %v", err) - return err - } - - // 然后创建role product - roleProductURL := "/directory/roleProduct" - roleProductReq := RoleProduct{ - RoleID: r.ID, - ProductName: product, - } - - _, err = c.Post(roleProductURL, httpclient.SetBody(roleProductReq)) - if err != nil { - log.Errorf("CreateContributorRole failed, error: %v", err) - return err - } - permissionList := []string{ - permission.WorkflowTaskUUID, - permission.WorkflowListUUID, - permission.TestEnvDeleteUUID, - permission.TestEnvManageUUID, - permission.TestEnvListUUID, - permission.TestUpdateEnvUUID, - permission.BuildListUUID, - permission.TestListUUID, - permission.ServiceTemplateListUUID, - } - permissionReq := RolePermissionReq{ - RoleID: r.ID, - RoleType: r.RoleType, - PermissionUUID: permissionList, - ProductName: product, - } - rolePermissionURL := "/directory/rolePermission" - - _, err = c.Post(rolePermissionURL, httpclient.SetBody(permissionReq)) - if err != nil { - log.Errorf("CreateContributorRole failed, error: %v", err) - return err - } - - return nil -} - // ListRoles 根据项目里面的角色名称获取对应的角色ID func (c *Client) ListRoles(productName string, log *zap.SugaredLogger) (*Role, error) { url := "/directory/roles" -- Gitee From cf6b971d14bb5af1b538c39f35fc8bc6bd34dedc Mon Sep 17 00:00:00 2001 From: mouuii Date: Thu, 14 Oct 2021 18:09:03 +0800 Subject: [PATCH 012/405] refactor code Signed-off-by: mouuii --- pkg/microservice/aslan/core/project/handler/router.go | 2 -- pkg/microservice/aslan/core/workflow/handler/router.go | 1 - pkg/microservice/picket/client/aslan/workflow.go | 5 +++-- pkg/microservice/picket/core/filter/service/workflow.go | 5 +++-- 4 files changed, 6 insertions(+), 7 deletions(-) diff --git a/pkg/microservice/aslan/core/project/handler/router.go b/pkg/microservice/aslan/core/project/handler/router.go index 3a364b4f3..8a5031626 100644 --- a/pkg/microservice/aslan/core/project/handler/router.go +++ b/pkg/microservice/aslan/core/project/handler/router.go @@ -42,7 +42,6 @@ func (*Router) Inject(router *gin.RouterGroup) { { product.GET("/:name", GetProductTemplate) product.GET("/:name/services", GetProductTemplateServices) - // replace by picket product.GET("", ListProductTemplate) product.GET("/:name/searching-rules", GetCustomMatchRules) product.PUT("/:name/searching-rules", gin2.StoreProductName, gin2.IsHavePermission([]string{permission.SuperUserUUID}, permission.ContextKeyType), gin2.UpdateOperationLogStatus, CreateOrUpdateMatchRules) @@ -66,7 +65,6 @@ func (*Router) Inject(router *gin.RouterGroup) { project := router.Group("projects") { - // request by picket project.GET("", ListProjects) } } diff --git a/pkg/microservice/aslan/core/workflow/handler/router.go b/pkg/microservice/aslan/core/workflow/handler/router.go index 9f267b73b..c006c918e 100644 --- a/pkg/microservice/aslan/core/workflow/handler/router.go +++ b/pkg/microservice/aslan/core/workflow/handler/router.go @@ -108,7 +108,6 @@ func (*Router) Inject(router *gin.RouterGroup) { workflow.POST("", GetWorkflowProductName, gin2.IsHavePermission([]string{permission.WorkflowCreateUUID}, permission.ContextKeyType), gin2.UpdateOperationLogStatus, CreateWorkflow) workflow.PUT("", GetWorkflowProductName, gin2.IsHavePermission([]string{permission.WorkflowUpdateUUID}, permission.ContextKeyType), gin2.UpdateOperationLogStatus, UpdateWorkflow) workflow.GET("", ListWorkflows) - // request by picket workflow.GET("/testName/:testName", ListTestWorkflows) workflow.GET("/find/:name", FindWorkflow) workflow.DELETE("/:name", GetProductNameByWorkflow, gin2.IsHavePermission([]string{permission.WorkflowDeleteUUID}, permission.ContextKeyType), gin2.UpdateOperationLogStatus, DeleteWorkflow) diff --git a/pkg/microservice/picket/client/aslan/workflow.go b/pkg/microservice/picket/client/aslan/workflow.go index 9b16631fb..f4ebc8c19 100644 --- a/pkg/microservice/picket/client/aslan/workflow.go +++ b/pkg/microservice/picket/client/aslan/workflow.go @@ -1,14 +1,15 @@ package aslan import ( + "fmt" "net/http" "net/url" "github.com/koderover/zadig/pkg/tool/httpclient" ) -func (c *Client) ListTestProjects(testName string, header http.Header, qs url.Values) ([]byte, error) { - url := "/workflow/workflow/testName/" + testName +func (c *Client) ListTestWorkflows(testName string, header http.Header, qs url.Values) ([]byte, error) { + url := fmt.Sprintf("/workflow/workflow/testName/%s", testName) res, err := c.Get(url, httpclient.SetHeadersFromHTTPHeader(header), httpclient.SetQueryParamsFromValues(qs)) if err != nil { diff --git a/pkg/microservice/picket/core/filter/service/workflow.go b/pkg/microservice/picket/core/filter/service/workflow.go index 78a7a1851..2f426173b 100644 --- a/pkg/microservice/picket/core/filter/service/workflow.go +++ b/pkg/microservice/picket/core/filter/service/workflow.go @@ -4,8 +4,9 @@ import ( "net/http" "net/url" - "github.com/koderover/zadig/pkg/microservice/picket/client/aslan" "go.uber.org/zap" + + "github.com/koderover/zadig/pkg/microservice/picket/client/aslan" ) func ListTestWorkflows(testName string, header http.Header, qs url.Values, logger *zap.SugaredLogger) ([]byte, error) { @@ -21,5 +22,5 @@ func ListTestWorkflows(testName string, header http.Header, qs url.Values, logge aslanClient := aslan.New() - return aslanClient.ListTestProjects(testName, header, qs) + return aslanClient.ListTestWorkflows(testName, header, qs) } -- Gitee From 57379599068c28ef4c9e89a0542e8a6b99772b90 Mon Sep 17 00:00:00 2001 From: lou Date: Thu, 14 Oct 2021 19:32:22 +0800 Subject: [PATCH 013/405] improve list projects api Signed-off-by: lou --- .../core/common/repository/mongodb/product.go | 13 +- .../repository/mongodb/template/product.go | 53 ++++- .../aslan/core/project/handler/product.go | 13 -- .../aslan/core/project/handler/project.go | 9 +- .../aslan/core/project/handler/router.go | 1 - .../aslan/core/project/service/product.go | 203 ------------------ .../aslan/core/project/service/project.go | 161 ++++++++------ 7 files changed, 158 insertions(+), 295 deletions(-) diff --git a/pkg/microservice/aslan/core/common/repository/mongodb/product.go b/pkg/microservice/aslan/core/common/repository/mongodb/product.go index 564fdc796..a71f42431 100644 --- a/pkg/microservice/aslan/core/common/repository/mongodb/product.go +++ b/pkg/microservice/aslan/core/common/repository/mongodb/product.go @@ -180,10 +180,15 @@ func (c *ProductColl) List(opt *ProductListOptions) ([]*models.Product, error) { return ret, nil } -func (c *ProductColl) ListProjects() ([]*projectEnvs, error) { +func (c *ProductColl) ListProjectsInNames(names []string) ([]*projectEnvs, error) { var res []*projectEnvs - pipeline := []bson.M{ - { + var pipeline []bson.M + if len(names) > 0 { + pipeline = append(pipeline, bson.M{"$match": bson.M{"product_name": bson.M{"$in": names}}}) + } + + pipeline = append(pipeline, + bson.M{ "$group": bson.M{ "_id": bson.M{ "product_name": "$product_name", @@ -192,7 +197,7 @@ func (c *ProductColl) ListProjects() ([]*projectEnvs, error) { "envs": bson.M{"$push": "$env_name"}, }, }, - } + ) cursor, err := c.Aggregate(context.TODO(), pipeline) if err != nil { diff --git a/pkg/microservice/aslan/core/common/repository/mongodb/template/product.go b/pkg/microservice/aslan/core/common/repository/mongodb/template/product.go index a9e7cd8f6..5f620e25c 100644 --- a/pkg/microservice/aslan/core/common/repository/mongodb/template/product.go +++ b/pkg/microservice/aslan/core/common/repository/mongodb/template/product.go @@ -31,6 +31,12 @@ import ( mongotool "github.com/koderover/zadig/pkg/tool/mongo" ) +type ProjectInfo struct { + Name string `bson:"product_name"` + Alias string `bson:"project_name"` + Desc string `bson:"description"` +} + type ProductColl struct { *mongo.Collection @@ -71,20 +77,53 @@ func (c *ProductColl) FindProjectName(project string) (*template.Product, error) return resp, err } -func (c *ProductColl) ListProjectsByNames(projects []string) ([]*template.Product, error) { - resp := make([]*template.Product, 0) - ctx := context.TODO() - query := bson.M{"project_name": bson.M{"$in": projects}} - cursor, err := c.Collection.Find(ctx, query) +func (c *ProductColl) ListNames(inNames []string) ([]string, error) { + res, err := c.ListProjects(inNames, bson.D{ + {"product_name", 1}, + }) + if err != nil { + return nil, err + } + + var names []string + for _, r := range res { + names = append(names, r.Name) + } + + return names, nil +} + +func (c *ProductColl) ListProjectBriefs(inNames []string) ([]*ProjectInfo, error) { + return c.ListProjects(inNames, bson.D{ + {"product_name", 1}, + {"project_name", 1}, + {"description", 1}, + }) +} + +func (c *ProductColl) ListProjects(inNames []string, projection bson.D) ([]*ProjectInfo, error) { + opts := options.Find() + filter := bson.M{} + if len(inNames) > 0 { + filter["product_name"] = bson.M{"$in": inNames} + } + + if len(projection) > 0 { + opts.SetProjection(projection) + } + + cursor, err := c.Collection.Find(context.TODO(), filter, opts) if err != nil { return nil, err } - err = cursor.All(ctx, &resp) + var res []*ProjectInfo + err = cursor.All(context.TODO(), &res) if err != nil { return nil, err } - return resp, nil + + return res, nil } func (c *ProductColl) List() ([]*template.Product, error) { diff --git a/pkg/microservice/aslan/core/project/handler/product.go b/pkg/microservice/aslan/core/project/handler/product.go index b119ffb71..ddd8ee3b5 100644 --- a/pkg/microservice/aslan/core/project/handler/product.go +++ b/pkg/microservice/aslan/core/project/handler/product.go @@ -47,19 +47,6 @@ func GetProductTemplateServices(c *gin.Context) { ctx.Resp, ctx.Err = projectservice.GetProductTemplateServices(productTemplatName, ctx.Logger) } -//ListProductTemplate 产品分页信息 -func ListProductTemplate(c *gin.Context) { - ctx := internalhandler.NewContext(c) - defer func() { internalhandler.JSONResponse(c, ctx) }() - - productType := c.DefaultQuery("productType", "normal") - if productType != "openSource" { - ctx.Resp, ctx.Err = projectservice.ListProductTemplate(ctx.User.ID, ctx.User.IsSuperUser, ctx.Logger) - return - } - ctx.Resp, ctx.Err = projectservice.ListOpenSourceProduct(ctx.Logger) -} - func CreateProductTemplate(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() diff --git a/pkg/microservice/aslan/core/project/handler/project.go b/pkg/microservice/aslan/core/project/handler/project.go index d3a3769f0..f7836262e 100644 --- a/pkg/microservice/aslan/core/project/handler/project.go +++ b/pkg/microservice/aslan/core/project/handler/project.go @@ -39,8 +39,15 @@ func ListProjects(c *gin.Context) { ctx.Err = e.ErrInvalidParam.AddDesc(err.Error()) return } + + productType := c.DefaultQuery("productType", "normal") + if productType == "openSource" { + ctx.Resp, ctx.Err = projectservice.ListOpenSourceProduct(ctx.Logger) + return + } + ctx.Resp, ctx.Err = projectservice.ListProjects( - &projectservice.ProjectListOptions{IgnoreNoEnvs: args.IgnoreNoEnvs, Verbosity: projectservice.QueryVerbosity(args.Verbosity), Projects: args.Names}, + &projectservice.ProjectListOptions{IgnoreNoEnvs: args.IgnoreNoEnvs, Verbosity: projectservice.QueryVerbosity(args.Verbosity), Names: args.Names}, ctx.Logger, ) } diff --git a/pkg/microservice/aslan/core/project/handler/router.go b/pkg/microservice/aslan/core/project/handler/router.go index 8a5031626..3af33b42d 100644 --- a/pkg/microservice/aslan/core/project/handler/router.go +++ b/pkg/microservice/aslan/core/project/handler/router.go @@ -42,7 +42,6 @@ func (*Router) Inject(router *gin.RouterGroup) { { product.GET("/:name", GetProductTemplate) product.GET("/:name/services", GetProductTemplateServices) - product.GET("", ListProductTemplate) product.GET("/:name/searching-rules", GetCustomMatchRules) product.PUT("/:name/searching-rules", gin2.StoreProductName, gin2.IsHavePermission([]string{permission.SuperUserUUID}, permission.ContextKeyType), gin2.UpdateOperationLogStatus, CreateOrUpdateMatchRules) product.POST("", gin2.StoreProductName, gin2.IsHavePermission([]string{permission.SuperUserUUID}, permission.ContextKeyType), gin2.UpdateOperationLogStatus, CreateProductTemplate) diff --git a/pkg/microservice/aslan/core/project/service/product.go b/pkg/microservice/aslan/core/project/service/product.go index 36ee1b2ae..6af53ef5f 100644 --- a/pkg/microservice/aslan/core/project/service/product.go +++ b/pkg/microservice/aslan/core/project/service/product.go @@ -20,7 +20,6 @@ import ( "fmt" "strconv" "strings" - "sync" "github.com/hashicorp/go-multierror" "github.com/pkg/errors" @@ -74,208 +73,6 @@ func GetProductTemplateServices(productName string, log *zap.SugaredLogger) (*te return resp, nil } -// ListProductTemplate 列出产品模板分页 -func ListProductTemplate(userID int, superUser bool, log *zap.SugaredLogger) ([]*template.Product, error) { - var ( - err error - errorList = &multierror.Error{} - resp = make([]*template.Product, 0) - tmpls = make([]*template.Product, 0) - productTmpls = make([]*template.Product, 0) - productNameMap = make(map[string][]int64) - productMap = make(map[string]*template.Product) - wg sync.WaitGroup - mu sync.Mutex - maxRoutineNum = 20 // 协程池最大协程数量 - ch = make(chan int, maxRoutineNum) // 控制协程数量 - ) - - poetryCtl := poetry.New(config.PoetryAPIServer(), config.PoetryAPIRootKey()) - - tmpls, err = templaterepo.NewProductColl().List() - if err != nil { - log.Errorf("ProfuctTmpl.List error: %v", err) - return resp, e.ErrListProducts.AddDesc(err.Error()) - } - - for _, product := range tmpls { - if superUser { - product.Role = setting.RoleAdmin - product.PermissionUUIDs = []string{} - product.ShowProject = true - continue - } - productMap[product.ProductName] = product - } - - if !superUser { - productNameMap, err = poetryCtl.GetUserProject(userID, log) - if err != nil { - log.Errorf("ProfuctTmpl.List GetUserProject error: %v", err) - return resp, e.ErrListProducts.AddDesc(err.Error()) - } - - // 优先处理客户有明确关联关系的项目 - for productName, roleIDs := range productNameMap { - wg.Add(1) - ch <- 1 - // 临时复制range获取的数据,避免重复操作最后一条数据 - tmpProductName := productName - tmpRoleIDs := roleIDs - - go func(tmpProductName string, tmpRoleIDs []int64) { - defer func() { - <-ch - wg.Done() - }() - - roleID := tmpRoleIDs[0] - product, err := templaterepo.NewProductColl().Find(tmpProductName) - if err != nil { - errorList = multierror.Append(errorList, err) - log.Errorf("ProfuctTmpl.List error: %v", err) - return - } - uuids, err := poetryCtl.GetUserPermissionUUIDs(roleID, tmpProductName, log) - if err != nil { - errorList = multierror.Append(errorList, err) - log.Errorf("ProfuctTmpl.List GetUserPermissionUUIDs error: %v", err) - return - } - if roleID == setting.RoleOwnerID { - product.Role = setting.RoleOwner - product.PermissionUUIDs = []string{} - } else { - product.Role = setting.RoleUser - product.PermissionUUIDs = uuids - } - product.ShowProject = true - mu.Lock() - productTmpls = append(productTmpls, product) - delete(productMap, tmpProductName) - mu.Unlock() - }(tmpProductName, tmpRoleIDs) - } - - wg.Wait() - if errorList.ErrorOrNil() != nil { - return resp, errorList - } - - // 增加项目里面设置过all-users的权限处理 - for _, product := range productMap { - wg.Add(1) - ch <- 1 - // 临时复制range获取的数据,避免重复操作最后一条数据 - tmpProduct := product - - go func(tmpProduct *template.Product) { - defer func() { - <-ch - wg.Done() - }() - - productRole, _ := poetryCtl.ListRoles(tmpProduct.ProductName, log) - if productRole != nil { - uuids, err := poetryCtl.GetUserPermissionUUIDs(productRole.ID, tmpProduct.ProductName, log) - if err != nil { - errorList = multierror.Append(errorList, err) - log.Errorf("ProfuctTmpl.List GetUserPermissionUUIDs error: %v", err) - return - } - - tmpProduct.Role = setting.RoleUser - tmpProduct.PermissionUUIDs = uuids - tmpProduct.ShowProject = true - mu.Lock() - productTmpls = append(productTmpls, tmpProduct) - delete(productMap, tmpProduct.ProductName) - mu.Unlock() - } - }(tmpProduct) - } - wg.Wait() - if errorList.ErrorOrNil() != nil { - return resp, errorList - } - - // 最后处理剩余的项目 - for _, product := range productMap { - wg.Add(1) - ch <- 1 - // 临时复制range获取的数据,避免重复操作最后一条数据 - tmpProduct := product - - go func(tmpProduct *template.Product) { - defer func() { - <-ch - wg.Done() - }() - - var uuids []string - uuids, err = poetryCtl.GetUserPermissionUUIDs(setting.RoleUserID, "", log) - if err != nil { - errorList = multierror.Append(errorList, err) - log.Errorf("ProfuctTmpl.List GetUserPermissionUUIDs error: %v", err) - return - } - tmpProduct.Role = setting.RoleUser - tmpProduct.PermissionUUIDs = uuids - tmpProduct.ShowProject = false - mu.Lock() - productTmpls = append(productTmpls, tmpProduct) - mu.Unlock() - }(tmpProduct) - } - wg.Wait() - if errorList.ErrorOrNil() != nil { - return resp, errorList - } - // 先清空tmpls中的管理员角色数据后,再插入普通用户角色的数据 - tmpls = make([]*template.Product, 0) - tmpls = append(tmpls, productTmpls...) - } - - err = FillProductTemplateVars(tmpls, log) - if err != nil { - return resp, err - } - - for _, tmpl := range tmpls { - wg.Add(1) - ch <- 1 - - go func(tmpTmpl *template.Product) { - defer func() { - <-ch - wg.Done() - }() - - tmpTmpl.TotalServiceNum, err = commonrepo.NewServiceColl().Count(tmpTmpl.ProductName) - if err != nil { - errorList = multierror.Append(errorList, err) - return - } - - tmpTmpl.TotalEnvNum, err = commonrepo.NewProductColl().Count(tmpTmpl.ProductName) - if err != nil { - errorList = multierror.Append(errorList, err) - return - } - - mu.Lock() - resp = append(resp, tmpTmpl) - mu.Unlock() - }(tmpl) - } - wg.Wait() - if errorList.ErrorOrNil() != nil { - return resp, errorList - } - - return resp, nil -} - func ListOpenSourceProduct(log *zap.SugaredLogger) ([]*template.Product, error) { opt := &templaterepo.ProductListOpt{ IsOpensource: "true", diff --git a/pkg/microservice/aslan/core/project/service/project.go b/pkg/microservice/aslan/core/project/service/project.go index 0d8e51136..ac5ed373b 100644 --- a/pkg/microservice/aslan/core/project/service/project.go +++ b/pkg/microservice/aslan/core/project/service/project.go @@ -21,7 +21,7 @@ import ( "k8s.io/apimachinery/pkg/util/sets" "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/mongodb" - "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/mongodb/template" + templaterepo "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/mongodb/template" ) type QueryVerbosity string @@ -30,18 +30,20 @@ const ( VerbosityDetailed QueryVerbosity = "detailed" // all information VerbosityBrief QueryVerbosity = "brief" // short information or a summary VerbosityMinimal QueryVerbosity = "minimal" // very little information, usually only a resource identifier + + allProjects = "*" ) type ProjectListOptions struct { IgnoreNoEnvs bool Verbosity QueryVerbosity - Projects []string + Names []string } type ProjectDetailedRepresentation struct { *ProjectBriefRepresentation - Alias string - Desc string + Alias string `json:"alias"` + Desc string `json:"desc"` } type ProjectBriefRepresentation struct { @@ -53,6 +55,14 @@ type ProjectMinimalRepresentation struct { Name string `json:"name"` } +func (o *ProjectListOptions) InNames() []string { + if len(o.Names) == 0 || (len(o.Names) == 1 && o.Names[0] == allProjects) { + return []string{} + } + + return o.Names +} + func ListProjects(opts *ProjectListOptions, logger *zap.SugaredLogger) (interface{}, error) { switch opts.Verbosity { case VerbosityDetailed: @@ -66,95 +76,82 @@ func ListProjects(opts *ProjectListOptions, logger *zap.SugaredLogger) (interfac } } -func listDetailedProjectInfos(opts *ProjectListOptions, logger *zap.SugaredLogger) (res []*ProjectDetailedRepresentation, err error) { - nameWithEnvs, err := mongodb.NewProductColl().ListProjects() +func listDetailedProjectInfos(opts *ProjectListOptions, logger *zap.SugaredLogger) ([]*ProjectDetailedRepresentation, error) { + var res []*ProjectDetailedRepresentation + + nameSet, nameMap, err := getProjects(opts) if err != nil { logger.Errorf("Failed to list projects, err: %s", err) return nil, err } - nameSet := sets.NewString() - for _, name := range opts.Projects { - nameSet.Insert(name) + nameWithEnvSet, nameWithEnvMap, err := getProjectsWithEnvs(opts) + if err != nil { + logger.Errorf("Failed to list projects, err: %s", err) + return nil, err } - nameWithEnvsSet := sets.NewString() - for _, nameWithEnv := range nameWithEnvs { - // nameWithEnvs may contain projects which are already deleted. - if !nameSet.Has(nameWithEnv.ProjectName) { - continue - } + desiredSet := nameSet + if opts.IgnoreNoEnvs { + desiredSet = nameSet.Intersection(nameWithEnvSet) + } + + for name := range desiredSet { + info := nameMap[name] res = append(res, &ProjectDetailedRepresentation{ ProjectBriefRepresentation: &ProjectBriefRepresentation{ - ProjectMinimalRepresentation: &ProjectMinimalRepresentation{Name: nameWithEnv.ProjectName}, - Envs: nameWithEnv.Envs, + ProjectMinimalRepresentation: &ProjectMinimalRepresentation{Name: name}, + Envs: nameWithEnvMap[name], }, + Alias: info.Alias, + Desc: info.Desc, }) - nameWithEnvsSet.Insert(nameWithEnv.ProjectName) } - projects, err := template.NewProductColl().ListProjectsByNames(opts.Projects) + return res, nil +} + +func listBriefProjectInfos(opts *ProjectListOptions, logger *zap.SugaredLogger) ([]*ProjectBriefRepresentation, error) { + var res []*ProjectBriefRepresentation + + nameSet, _, err := getProjects(opts) if err != nil { + logger.Errorf("Failed to list projects, err: %s", err) return nil, err } - if !opts.IgnoreNoEnvs { - for _, project := range projects { - if !nameWithEnvsSet.Has(project.ProjectName) { - res = append(res, &ProjectDetailedRepresentation{ - ProjectBriefRepresentation: &ProjectBriefRepresentation{ - ProjectMinimalRepresentation: &ProjectMinimalRepresentation{Name: project.ProjectName}, - }, - Alias: project.ProductName, - Desc: project.Description, - }) - } - } - } - - return res, nil -} -func listBriefProjectInfos(opts *ProjectListOptions, logger *zap.SugaredLogger) (res []*ProjectBriefRepresentation, err error) { - nameWithEnvs, err := mongodb.NewProductColl().ListProjects() + nameWithEnvSet, nameWithEnvMap, err := getProjectsWithEnvs(opts) if err != nil { logger.Errorf("Failed to list projects, err: %s", err) return nil, err } - nameSet := sets.NewString() - for _, name := range opts.Projects { - nameSet.Insert(name) + desiredSet := nameSet + if opts.IgnoreNoEnvs { + desiredSet = nameSet.Intersection(nameWithEnvSet) } - nameWithEnvsSet := sets.NewString() - for _, nameWithEnv := range nameWithEnvs { - // nameWithEnvs may contain projects which are already deleted. - if !nameSet.Has(nameWithEnv.ProjectName) { - continue - } + for name := range desiredSet { res = append(res, &ProjectBriefRepresentation{ - ProjectMinimalRepresentation: &ProjectMinimalRepresentation{Name: nameWithEnv.ProjectName}, - Envs: nameWithEnv.Envs, + ProjectMinimalRepresentation: &ProjectMinimalRepresentation{Name: name}, + Envs: nameWithEnvMap[name], }) - nameWithEnvsSet.Insert(nameWithEnv.ProjectName) - } - - if !opts.IgnoreNoEnvs { - for _, name := range opts.Projects { - if !nameWithEnvsSet.Has(name) { - res = append(res, &ProjectBriefRepresentation{ - ProjectMinimalRepresentation: &ProjectMinimalRepresentation{Name: name}, - }) - } - } } return res, nil } -func listMinimalProjectInfos(opts *ProjectListOptions, logger *zap.SugaredLogger) (res []*ProjectMinimalRepresentation, err error) { +func listMinimalProjectInfos(opts *ProjectListOptions, logger *zap.SugaredLogger) ([]*ProjectMinimalRepresentation, error) { + var res []*ProjectMinimalRepresentation + + names, err := templaterepo.NewProductColl().ListNames(opts.InNames()) + if err != nil { + logger.Errorf("Failed to list project names, err: %s", err) + return nil, err + } + if !opts.IgnoreNoEnvs { - for _, name := range opts.Projects { + for _, name := range names { res = append(res, &ProjectMinimalRepresentation{Name: name}) } @@ -162,23 +159,55 @@ func listMinimalProjectInfos(opts *ProjectListOptions, logger *zap.SugaredLogger } nameSet := sets.NewString() - for _, name := range opts.Projects { + for _, name := range names { nameSet.Insert(name) } - nameWithEnvs, err := mongodb.NewProductColl().ListProjects() + nameWithEnvSet, _, err := getProjectsWithEnvs(opts) if err != nil { logger.Errorf("Failed to list projects, err: %s", err) return nil, err } - for _, nameWithEnv := range nameWithEnvs { + for name := range nameWithEnvSet { // nameWithEnvs may contain projects which are already deleted. - if !nameSet.Has(nameWithEnv.ProjectName) { + if !nameSet.Has(name) { continue } - res = append(res, &ProjectMinimalRepresentation{Name: nameWithEnv.ProjectName}) + res = append(res, &ProjectMinimalRepresentation{Name: name}) } return res, nil } + +func getProjectsWithEnvs(opts *ProjectListOptions) (sets.String, map[string][]string, error) { + nameWithEnvs, err := mongodb.NewProductColl().ListProjectsInNames(opts.InNames()) + if err != nil { + return nil, nil, err + } + + nameSet := sets.NewString() + nameMap := make(map[string][]string) + for _, nameWithEnv := range nameWithEnvs { + nameSet.Insert(nameWithEnv.ProjectName) + nameMap[nameWithEnv.ProjectName] = nameWithEnv.Envs + } + + return nameSet, nameMap, nil +} + +func getProjects(opts *ProjectListOptions) (sets.String, map[string]*templaterepo.ProjectInfo, error) { + res, err := templaterepo.NewProductColl().ListProjectBriefs(opts.InNames()) + if err != nil { + return nil, nil, err + } + + nameSet := sets.NewString() + nameMap := make(map[string]*templaterepo.ProjectInfo) + for _, r := range res { + nameSet.Insert(r.Name) + nameMap[r.Name] = r + } + + return nameSet, nameMap, nil +} -- Gitee From 9dae5a77d1286bca1e72d536505511283a6e2456 Mon Sep 17 00:00:00 2001 From: lou Date: Thu, 14 Oct 2021 21:18:07 +0800 Subject: [PATCH 014/405] update after review Signed-off-by: lou --- .../core/common/repository/mongodb/template/product.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pkg/microservice/aslan/core/common/repository/mongodb/template/product.go b/pkg/microservice/aslan/core/common/repository/mongodb/template/product.go index 5f620e25c..948f4283f 100644 --- a/pkg/microservice/aslan/core/common/repository/mongodb/template/product.go +++ b/pkg/microservice/aslan/core/common/repository/mongodb/template/product.go @@ -78,7 +78,7 @@ func (c *ProductColl) FindProjectName(project string) (*template.Product, error) } func (c *ProductColl) ListNames(inNames []string) ([]string, error) { - res, err := c.ListProjects(inNames, bson.D{ + res, err := c.listProjects(inNames, bson.D{ {"product_name", 1}, }) if err != nil { @@ -94,14 +94,14 @@ func (c *ProductColl) ListNames(inNames []string) ([]string, error) { } func (c *ProductColl) ListProjectBriefs(inNames []string) ([]*ProjectInfo, error) { - return c.ListProjects(inNames, bson.D{ + return c.listProjects(inNames, bson.D{ {"product_name", 1}, {"project_name", 1}, {"description", 1}, }) } -func (c *ProductColl) ListProjects(inNames []string, projection bson.D) ([]*ProjectInfo, error) { +func (c *ProductColl) listProjects(inNames []string, projection bson.D) ([]*ProjectInfo, error) { opts := options.Find() filter := bson.M{} if len(inNames) > 0 { -- Gitee From c6e1d3fb3ea4a248ae0c375ed29960058a3d5e3f Mon Sep 17 00:00:00 2001 From: lou Date: Thu, 14 Oct 2021 21:37:34 +0800 Subject: [PATCH 015/405] remove auth Signed-off-by: lou --- .../aslan/core/build/handler/router.go | 2 - .../aslan/core/code/handler/router.go | 2 - .../aslan/core/common/handler/token.go | 42 ---------- .../aslan/core/cron/handler/router.go | 3 - .../aslan/core/delivery/handler/router.go | 1 - .../aslan/core/environment/handler/router.go | 2 - .../aslan/core/log/handler/router.go | 4 - .../aslan/core/multicluster/handler/router.go | 2 - .../aslan/core/project/handler/router.go | 2 - .../aslan/core/service/handler/router.go | 3 +- .../aslan/core/setting/handler/router.go | 4 - .../aslan/core/system/handler/router.go | 2 - .../core/templatestore/handler/router.go | 5 -- .../aslan/core/workflow/handler/router.go | 2 - .../core/workflow/testing/handler/router.go | 2 - pkg/microservice/aslan/server/rest/router.go | 17 +--- pkg/middleware/gin/auth.go | 84 ------------------- 17 files changed, 2 insertions(+), 177 deletions(-) delete mode 100644 pkg/microservice/aslan/core/common/handler/token.go delete mode 100644 pkg/middleware/gin/auth.go diff --git a/pkg/microservice/aslan/core/build/handler/router.go b/pkg/microservice/aslan/core/build/handler/router.go index f55bd25c1..1e6af9d8a 100644 --- a/pkg/microservice/aslan/core/build/handler/router.go +++ b/pkg/microservice/aslan/core/build/handler/router.go @@ -26,8 +26,6 @@ import ( type Router struct{} func (*Router) Inject(router *gin.RouterGroup) { - router.Use(gin2.Auth()) - build := router.Group("build") { build.GET("/:name", FindBuildModule) diff --git a/pkg/microservice/aslan/core/code/handler/router.go b/pkg/microservice/aslan/core/code/handler/router.go index 6b0a22f81..99ac66caf 100644 --- a/pkg/microservice/aslan/core/code/handler/router.go +++ b/pkg/microservice/aslan/core/code/handler/router.go @@ -26,8 +26,6 @@ import ( type Router struct{} func (*Router) Inject(router *gin.RouterGroup) { - router.Use(gin2.Auth()) - codehost := router.Group("codehost") { codehost.GET("", GetCodeHostList) diff --git a/pkg/microservice/aslan/core/common/handler/token.go b/pkg/microservice/aslan/core/common/handler/token.go deleted file mode 100644 index 7fee3260b..000000000 --- a/pkg/microservice/aslan/core/common/handler/token.go +++ /dev/null @@ -1,42 +0,0 @@ -/* -Copyright 2021 The KodeRover 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 handler - -import ( - "net/http" - "strings" - - "github.com/gin-gonic/gin" - - "github.com/koderover/zadig/pkg/setting" -) - -func GetToken(c *gin.Context) { - authorization := c.Request.Header.Get(setting.AuthorizationHeader) - if authorization != "" { - if strings.HasPrefix(authorization, setting.UserAPIKey+" ") { - token := strings.Split(authorization, " ")[1] - c.JSON(http.StatusOK, gin.H{"token": token}) - return - } - } else if token, err := c.Cookie("TOKEN"); err == nil { - c.JSON(http.StatusOK, gin.H{"token": token}) - return - } - - c.JSON(http.StatusBadRequest, gin.H{"message": "illegal request"}) -} diff --git a/pkg/microservice/aslan/core/cron/handler/router.go b/pkg/microservice/aslan/core/cron/handler/router.go index 9d06de008..29bb3f483 100644 --- a/pkg/microservice/aslan/core/cron/handler/router.go +++ b/pkg/microservice/aslan/core/cron/handler/router.go @@ -18,14 +18,11 @@ package handler import ( "github.com/gin-gonic/gin" - - gin2 "github.com/koderover/zadig/pkg/middleware/gin" ) type Router struct{} func (*Router) Inject(router *gin.RouterGroup) { - router.Use(gin2.Auth()) // --------------------------------------------------------------------------------------- // 定时任务管理接口 diff --git a/pkg/microservice/aslan/core/delivery/handler/router.go b/pkg/microservice/aslan/core/delivery/handler/router.go index cb6b92e50..25b9641c2 100644 --- a/pkg/microservice/aslan/core/delivery/handler/router.go +++ b/pkg/microservice/aslan/core/delivery/handler/router.go @@ -26,7 +26,6 @@ import ( type Router struct{} func (*Router) Inject(router *gin.RouterGroup) { - router.Use(gin2.Auth()) deliveryArtifact := router.Group("artifacts") { diff --git a/pkg/microservice/aslan/core/environment/handler/router.go b/pkg/microservice/aslan/core/environment/handler/router.go index a1d89054e..b0056e6d9 100644 --- a/pkg/microservice/aslan/core/environment/handler/router.go +++ b/pkg/microservice/aslan/core/environment/handler/router.go @@ -26,8 +26,6 @@ import ( type Router struct{} func (*Router) Inject(router *gin.RouterGroup) { - router.Use(gin2.Auth()) - // --------------------------------------------------------------------------------------- // Kube配置管理接口 ConfigMap // --------------------------------------------------------------------------------------- diff --git a/pkg/microservice/aslan/core/log/handler/router.go b/pkg/microservice/aslan/core/log/handler/router.go index 03bda9721..2fcfcb088 100644 --- a/pkg/microservice/aslan/core/log/handler/router.go +++ b/pkg/microservice/aslan/core/log/handler/router.go @@ -18,15 +18,11 @@ package handler import ( "github.com/gin-gonic/gin" - - gin2 "github.com/koderover/zadig/pkg/middleware/gin" ) type Router struct{} func (*Router) Inject(router *gin.RouterGroup) { - router.Use(gin2.Auth()) - { router.GET("/pods/:name", GetContainerLogs) } diff --git a/pkg/microservice/aslan/core/multicluster/handler/router.go b/pkg/microservice/aslan/core/multicluster/handler/router.go index fc4ba7370..ddfc60acc 100644 --- a/pkg/microservice/aslan/core/multicluster/handler/router.go +++ b/pkg/microservice/aslan/core/multicluster/handler/router.go @@ -31,8 +31,6 @@ func (*Router) Inject(router *gin.RouterGroup) { Agent.GET("/:id/agent.yaml", GetClusterYaml("/api/hub")) } - router.Use(gin2.Auth()) - Cluster := router.Group("clusters") { Cluster.GET("", ListClusters) diff --git a/pkg/microservice/aslan/core/project/handler/router.go b/pkg/microservice/aslan/core/project/handler/router.go index 3af33b42d..f1d907123 100644 --- a/pkg/microservice/aslan/core/project/handler/router.go +++ b/pkg/microservice/aslan/core/project/handler/router.go @@ -26,8 +26,6 @@ import ( type Router struct{} func (*Router) Inject(router *gin.RouterGroup) { - router.Use(gin2.Auth()) - // 查看自定义变量是否被引用 render := router.Group("renders") { diff --git a/pkg/microservice/aslan/core/service/handler/router.go b/pkg/microservice/aslan/core/service/handler/router.go index 461d2e0b0..9bfbd2ade 100644 --- a/pkg/microservice/aslan/core/service/handler/router.go +++ b/pkg/microservice/aslan/core/service/handler/router.go @@ -18,6 +18,7 @@ package handler import ( "github.com/gin-gonic/gin" + gin2 "github.com/koderover/zadig/pkg/middleware/gin" "github.com/koderover/zadig/pkg/types/permission" ) @@ -25,8 +26,6 @@ import ( type Router struct{} func (*Router) Inject(router *gin.RouterGroup) { - router.Use(gin2.Auth()) - harbor := router.Group("harbor") { harbor.GET("/project", ListHarborProjects) diff --git a/pkg/microservice/aslan/core/setting/handler/router.go b/pkg/microservice/aslan/core/setting/handler/router.go index 2b4eef2e9..1148a6084 100644 --- a/pkg/microservice/aslan/core/setting/handler/router.go +++ b/pkg/microservice/aslan/core/setting/handler/router.go @@ -18,15 +18,11 @@ package handler import ( "github.com/gin-gonic/gin" - - gin2 "github.com/koderover/zadig/pkg/middleware/gin" ) type Router struct{} func (*Router) Inject(router *gin.RouterGroup) { - router.Use(gin2.Auth()) - user := router.Group("user") { user.GET("/kube/config", GetUserKubeConfig) diff --git a/pkg/microservice/aslan/core/system/handler/router.go b/pkg/microservice/aslan/core/system/handler/router.go index f85abb7d3..83a497193 100644 --- a/pkg/microservice/aslan/core/system/handler/router.go +++ b/pkg/microservice/aslan/core/system/handler/router.go @@ -30,8 +30,6 @@ func (*Router) Inject(router *gin.RouterGroup) { proxy.GET("/config", GetProxyConfig) } - router.Use(gin2.Auth()) - // --------------------------------------------------------------------------------------- // 安装脚本管理接口 // --------------------------------------------------------------------------------------- diff --git a/pkg/microservice/aslan/core/templatestore/handler/router.go b/pkg/microservice/aslan/core/templatestore/handler/router.go index 120a55ff2..3dea48db4 100644 --- a/pkg/microservice/aslan/core/templatestore/handler/router.go +++ b/pkg/microservice/aslan/core/templatestore/handler/router.go @@ -18,16 +18,11 @@ package handler import ( "github.com/gin-gonic/gin" - - ginmiddleware "github.com/koderover/zadig/pkg/middleware/gin" ) type Router struct{} func (*Router) Inject(router *gin.RouterGroup) { - - router.Use(ginmiddleware.Auth()) - // --------------------------------------------------------------------------------------- // chart templates // --------------------------------------------------------------------------------------- diff --git a/pkg/microservice/aslan/core/workflow/handler/router.go b/pkg/microservice/aslan/core/workflow/handler/router.go index c006c918e..20467e5c3 100644 --- a/pkg/microservice/aslan/core/workflow/handler/router.go +++ b/pkg/microservice/aslan/core/workflow/handler/router.go @@ -34,8 +34,6 @@ func (*Router) Inject(router *gin.RouterGroup) { webhook.POST("", ProcessWebHook) } - router.Use(gin2.Auth()) - build := router.Group("build") { build.GET("/:name/:version/to/subtasks", BuildModuleToSubTasks) diff --git a/pkg/microservice/aslan/core/workflow/testing/handler/router.go b/pkg/microservice/aslan/core/workflow/testing/handler/router.go index e0701d22c..48f4e4c03 100644 --- a/pkg/microservice/aslan/core/workflow/testing/handler/router.go +++ b/pkg/microservice/aslan/core/workflow/testing/handler/router.go @@ -32,8 +32,6 @@ func (*Router) Inject(router *gin.RouterGroup) { testReport.GET("", GetHTMLTestReport) } - router.Use(gin2.Auth()) - // --------------------------------------------------------------------------------------- // 系统测试接口 // --------------------------------------------------------------------------------------- diff --git a/pkg/microservice/aslan/server/rest/router.go b/pkg/microservice/aslan/server/rest/router.go index 1339a6f96..989cfd364 100644 --- a/pkg/microservice/aslan/server/rest/router.go +++ b/pkg/microservice/aslan/server/rest/router.go @@ -17,8 +17,6 @@ limitations under the License. package rest import ( - "github.com/gin-contrib/sessions" - "github.com/gin-contrib/sessions/cookie" "github.com/gin-gonic/gin" swaggerfiles "github.com/swaggo/files" ginswagger "github.com/swaggo/gin-swagger" @@ -38,7 +36,6 @@ import ( templatehandler "github.com/koderover/zadig/pkg/microservice/aslan/core/templatestore/handler" workflowhandler "github.com/koderover/zadig/pkg/microservice/aslan/core/workflow/handler" testinghandler "github.com/koderover/zadig/pkg/microservice/aslan/core/workflow/testing/handler" - gin2 "github.com/koderover/zadig/pkg/middleware/gin" // Note: have to load docs for swagger to work. See https://blog.csdn.net/weixin_43249914/article/details/103035711 _ "github.com/koderover/zadig/pkg/microservice/aslan/server/rest/doc" @@ -54,14 +51,6 @@ import ( // @license.url http://www.apache.org/licenses/LICENSE-2.0.html // @BasePath /api/aslan func (s *engine) injectRouterGroup(router *gin.RouterGroup) { - store := cookie.NewStore([]byte("C12f4d5957k345e9g6e86c117e1bfu5kndjevf8u")) - cookieOption := sessions.Options{ - Path: "/", - HttpOnly: true, - } - store.Options(cookieOption) - router.Use(sessions.Sessions("ASLAN", store)) - Auth := gin2.Auth() // --------------------------------------------------------------------------------------- // 对外公共接口 // --------------------------------------------------------------------------------------- @@ -77,12 +66,8 @@ func (s *engine) injectRouterGroup(router *gin.RouterGroup) { // no auth required, should not be exposed via poetry-api-proxy or will fail router.GET("/api/hub/connect", multiclusterhandler.ClusterConnectFromAgent) - router.GET("/api/kodespace/downloadUrl", Auth, commonhandler.GetToolDownloadURL) + router.GET("/api/kodespace/downloadUrl", commonhandler.GetToolDownloadURL) - jwt := router.Group("/api/token", Auth) - { - jwt.GET("", commonhandler.GetToken) - } for name, r := range map[string]injector{ "/api/project": new(projecthandler.Router), "/api/code": new(codehosthandler.Router), diff --git a/pkg/middleware/gin/auth.go b/pkg/middleware/gin/auth.go deleted file mode 100644 index 515781639..000000000 --- a/pkg/middleware/gin/auth.go +++ /dev/null @@ -1,84 +0,0 @@ -/* -Copyright 2021 The KodeRover 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 gin - -import ( - "net/http" - "strings" - - "github.com/gin-gonic/gin" - - "github.com/koderover/zadig/pkg/config" - "github.com/koderover/zadig/pkg/setting" - "github.com/koderover/zadig/pkg/shared/poetry" - "github.com/koderover/zadig/pkg/tool/log" -) - -// Auth 返回会判断 Session 的中间件 -func Auth() gin.HandlerFunc { - return func(c *gin.Context) { - authorization := c.Request.Header.Get(setting.AuthorizationHeader) - if authorization != "" { - if strings.Contains(authorization, setting.RootAPIKey) { - token := strings.Split(authorization, " ") - if len(token) == 2 && token[1] == config.PoetryAPIRootKey() { - c.Set(setting.SessionUsername, "fake-user") - c.Set(setting.SessionUser, &poetry.UserInfo{Name: "fake-user", IsSuperUser: true, IsAdmin: true, OrganizationID: 1}) - c.Next() - return - } - } - if strings.Contains(authorization, setting.TIMERAPIKEY) { - token := strings.Split(authorization, " ") - if len(token) == 2 && token[1] == config.PoetryAPIRootKey() { - c.Set(setting.SessionUsername, "timer") - c.Set(setting.SessionUser, &poetry.UserInfo{Name: "timer", IsSuperUser: true, IsAdmin: true, OrganizationID: 1}) - c.Next() - return - } - } - if strings.Contains(authorization, setting.UserAPIKey) { - token := strings.Split(authorization, " ") - if len(token) == 2 { - userInfo, err := poetry.GetUserDetailByToken(config.PoetryServiceAddress(), token[1]) - if err != nil { - log.Errorf("get user detail err :%v", err) - c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"message": "get user detail error"}) - return - } - c.Set(setting.SessionUsername, userInfo.Name) - c.Set(setting.SessionUser, userInfo) - c.Next() - return - } - } - } else if token, err := c.Cookie("TOKEN"); err == nil { - userInfo, err := poetry.GetUserDetailByToken(config.PoetryServiceAddress(), token) - if err != nil { - log.Errorf("get user detail err :%v", err) - c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"message": "get user detail error"}) - return - } - c.Set(setting.SessionUsername, userInfo.Name) - c.Set(setting.SessionUser, userInfo) - c.Next() - return - } - - c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"message": "auth failed"}) - } -} -- Gitee From e06cd2139f35cf5155e3cf6de06a44bccd02d579 Mon Sep 17 00:00:00 2001 From: lou Date: Fri, 15 Oct 2021 10:18:08 +0800 Subject: [PATCH 016/405] fix privilege escalation Signed-off-by: lou --- pkg/microservice/policy/core/handler/role_binding.go | 6 ++++-- pkg/microservice/policy/core/handler/router.go | 4 ++-- pkg/microservice/policy/core/service/bundle/rego/authz.rego | 2 +- pkg/microservice/policy/core/service/role_binding.go | 2 ++ 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/pkg/microservice/policy/core/handler/role_binding.go b/pkg/microservice/policy/core/handler/role_binding.go index 5ceca3008..4fe586573 100644 --- a/pkg/microservice/policy/core/handler/role_binding.go +++ b/pkg/microservice/policy/core/handler/role_binding.go @@ -43,7 +43,7 @@ func CreateRoleBinding(c *gin.Context) { ctx.Err = service.CreateRoleBinding(projectName, args, ctx.Logger) } -func CreateGlobalRoleBinding(c *gin.Context) { +func CreateSystemRoleBinding(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() @@ -53,5 +53,7 @@ func CreateGlobalRoleBinding(c *gin.Context) { return } - ctx.Err = service.CreateRoleBinding("", args, ctx.Logger) + args.Global = false + + ctx.Err = service.CreateRoleBinding(service.SystemScope, args, ctx.Logger) } diff --git a/pkg/microservice/policy/core/handler/router.go b/pkg/microservice/policy/core/handler/router.go index 89799a37b..1ee47aa58 100644 --- a/pkg/microservice/policy/core/handler/router.go +++ b/pkg/microservice/policy/core/handler/router.go @@ -38,9 +38,9 @@ func (*Router) Inject(router *gin.RouterGroup) { roleBindings.POST("", CreateRoleBinding) } - globalRoleBindings := router.Group("global-rolebindings") + systemRoleBindings := router.Group("system-rolebindings") { - globalRoleBindings.POST("", CreateGlobalRoleBinding) + systemRoleBindings.POST("", CreateSystemRoleBinding) } bundles := router.Group("bundles") diff --git a/pkg/microservice/policy/core/service/bundle/rego/authz.rego b/pkg/microservice/policy/core/service/bundle/rego/authz.rego index 8cf176495..2ea88dca1 100644 --- a/pkg/microservice/policy/core/service/bundle/rego/authz.rego +++ b/pkg/microservice/policy/core/service/bundle/rego/authz.rego @@ -49,7 +49,7 @@ user_is_admin { all_roles[role] role.name == "admin" - role.namespace == "" + role.namespace == "*" } user_is_project_admin { diff --git a/pkg/microservice/policy/core/service/role_binding.go b/pkg/microservice/policy/core/service/role_binding.go index a7cd5339e..21d11f4a5 100644 --- a/pkg/microservice/policy/core/service/role_binding.go +++ b/pkg/microservice/policy/core/service/role_binding.go @@ -32,6 +32,8 @@ type RoleBinding struct { Global bool `json:"global"` } +const SystemScope = "*" + func CreateRoleBinding(ns string, rb *RoleBinding, logger *zap.SugaredLogger) error { nsRole := ns if rb.Global { -- Gitee From 10ef4d0b8e4ae442369bd5bb3d72705e6dbd0754 Mon Sep 17 00:00:00 2001 From: lou Date: Fri, 15 Oct 2021 11:51:18 +0800 Subject: [PATCH 017/405] add registered urls Signed-off-by: lou --- .../core/service/bundle/exemption_urls.go | 1 + .../policy/core/service/bundle/opa_bundle.go | 42 +++++-------------- .../core/service/bundle/rego/authz.rego | 9 ++++ .../rego/test_data/exemptions/data.json | 6 +++ .../bundle/resource_endpoint_mapping.go | 2 +- 5 files changed, 28 insertions(+), 32 deletions(-) diff --git a/pkg/microservice/policy/core/service/bundle/exemption_urls.go b/pkg/microservice/policy/core/service/bundle/exemption_urls.go index e3d7b0add..06b471907 100644 --- a/pkg/microservice/policy/core/service/bundle/exemption_urls.go +++ b/pkg/microservice/policy/core/service/bundle/exemption_urls.go @@ -8,6 +8,7 @@ type exemptionURLs struct { Global rules `json:"global"` // global urls are only controlled by AuthN, and it is visible for all users Namespaced rules `json:"namespaced"` // global urls are only controlled by AuthN, and it is visible for users under certain projects Public rules `json:"public"` // public urls are not controlled by AuthN and AuthZ + Registered rules `json:"registered"` // registered urls are the entire list of urls which are controlled by AuthZ, which means that if an url is not in this list, it is not controlled by AuthZ } type policyRule struct { diff --git a/pkg/microservice/policy/core/service/bundle/opa_bundle.go b/pkg/microservice/policy/core/service/bundle/opa_bundle.go index bdaed41ec..97118273e 100644 --- a/pkg/microservice/policy/core/service/bundle/opa_bundle.go +++ b/pkg/microservice/policy/core/service/bundle/opa_bundle.go @@ -196,36 +196,6 @@ func (o roleBindings) Less(i, j int) bool { return o[i].User < o[j].User } -func generateOPAResourceRoles(roles []*models.Role) *opaRoles { - data := &opaRoles{} - - for _, ro := range roles { - opaRole := &role{Name: ro.Name, Namespace: ro.Namespace} - for _, r := range ro.Rules { - if len(r.Verbs) == 1 && r.Verbs[0] == models.MethodAll { - r.Verbs = AllActions - } - for _, res := range r.Resources { - if mapping, ok := mappings[res]; !ok { - continue - } else { - for _, v := range r.Verbs { - opaRole.Rules = append(opaRole.Rules, mapping[v]...) - } - } - - } - } - - sort.Sort(opaRole.Rules) - data.Roles = append(data.Roles, opaRole) - } - - sort.Sort(data.Roles) - - return data -} - func generateOPARoles(roles []*models.Role) *opaRoles { data := &opaRoles{} @@ -237,7 +207,7 @@ func generateOPARoles(roles []*models.Role) *opaRoles { r.Verbs = AllActions } for _, res := range r.Resources { - if mapping, ok := mappings[res]; !ok { + if mapping, ok := resourceActionMappings[res]; !ok { continue } else { for _, v := range r.Verbs { @@ -341,6 +311,16 @@ func generateOPAExemptionURLs() *exemptionURLs { sort.Sort(data.Public) + for _, resourceMappings := range resourceActionMappings { + for _, rs := range resourceMappings { + for _, r := range rs { + data.Registered = append(data.Registered, r) + } + } + } + + sort.Sort(data.Registered) + return data } diff --git a/pkg/microservice/policy/core/service/bundle/rego/authz.rego b/pkg/microservice/policy/core/service/bundle/rego/authz.rego index 2ea88dca1..79686a41f 100644 --- a/pkg/microservice/policy/core/service/bundle/rego/authz.rego +++ b/pkg/microservice/policy/core/service/bundle/rego/authz.rego @@ -76,6 +76,15 @@ url_is_exempted { user_projects[_] == project_name } +url_is_exempted { + not url_is_registered +} + +url_is_registered { + data.exemptions.registered[_].method == http_request.method + glob.match(trim(data.exemptions.registered[_].endpoint, "/"), ["/"], concat("/", input.parsed_path)) +} + project_name := pn { pn := input.parsed_query.projectName[0] } diff --git a/pkg/microservice/policy/core/service/bundle/rego/test_data/exemptions/data.json b/pkg/microservice/policy/core/service/bundle/rego/test_data/exemptions/data.json index 866aa9797..271edede6 100644 --- a/pkg/microservice/policy/core/service/bundle/rego/test_data/exemptions/data.json +++ b/pkg/microservice/policy/core/service/bundle/rego/test_data/exemptions/data.json @@ -16,5 +16,11 @@ "method": "POST", "endpoint": "/api/aslan/webhook" } + ], + "registered": [ + { + "method": "GET", + "endpoint": "/api/articles" + } ] } diff --git a/pkg/microservice/policy/core/service/bundle/resource_endpoint_mapping.go b/pkg/microservice/policy/core/service/bundle/resource_endpoint_mapping.go index 02eee3980..8a44c46bd 100644 --- a/pkg/microservice/policy/core/service/bundle/resource_endpoint_mapping.go +++ b/pkg/microservice/policy/core/service/bundle/resource_endpoint_mapping.go @@ -4,7 +4,7 @@ package bundle // to be managed by the Policy Service should register its rules to the Policy Service so that the Policy Service knows // how to make a decision without being aware of the detailed rules. -var mappings = map[string]map[string][]*rule{ +var resourceActionMappings = map[string]map[string][]*rule{ "Workflow": workflowMapping, } -- Gitee From b353727535d941299e79e5a7ef382e1f9451dc93 Mon Sep 17 00:00:00 2001 From: lou Date: Fri, 15 Oct 2021 21:33:09 +0800 Subject: [PATCH 018/405] add policy registration apis Signed-off-by: lou --- .../core/handler/policy_registration.go | 29 ++++++ .../policy/core/handler/router.go | 7 ++ .../policy/core/repository/models/policy.go | 40 +++++++++ .../policy/core/repository/models/role.go | 14 +-- .../repository/mongodb/policy_registration.go | 88 ++++++++++++++++++ .../policy/core/service/bundle/opa_bundle.go | 54 +++++------ .../bundle/resource_endpoint_mapping.go | 70 ++++++++++++--- .../core/service/policy_registration.go | 89 +++++++++++++++++++ pkg/microservice/policy/core/service/role.go | 8 +- 9 files changed, 340 insertions(+), 59 deletions(-) create mode 100644 pkg/microservice/policy/core/handler/policy_registration.go create mode 100644 pkg/microservice/policy/core/repository/models/policy.go create mode 100644 pkg/microservice/policy/core/repository/mongodb/policy_registration.go create mode 100644 pkg/microservice/policy/core/service/policy_registration.go diff --git a/pkg/microservice/policy/core/handler/policy_registration.go b/pkg/microservice/policy/core/handler/policy_registration.go new file mode 100644 index 000000000..c8983244f --- /dev/null +++ b/pkg/microservice/policy/core/handler/policy_registration.go @@ -0,0 +1,29 @@ +package handler + +import ( + "github.com/gin-gonic/gin" + + "github.com/koderover/zadig/pkg/microservice/policy/core/service" + internalhandler "github.com/koderover/zadig/pkg/shared/handler" +) + +func CreateOrUpdatePolicyRegistration(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + + args := &service.Policy{} + if err := c.ShouldBindJSON(args); err != nil { + ctx.Err = err + return + } + args.Resource = c.Param("resourceName") + + ctx.Err = service.CreateOrUpdatePolicyRegistration(args, ctx.Logger) +} + +func GetPolicyRegistrationDefinitions(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + + ctx.Resp, ctx.Err = service.GetPolicyRegistrationDefinitions(ctx.Logger) +} diff --git a/pkg/microservice/policy/core/handler/router.go b/pkg/microservice/policy/core/handler/router.go index 1ee47aa58..3fcd58a25 100644 --- a/pkg/microservice/policy/core/handler/router.go +++ b/pkg/microservice/policy/core/handler/router.go @@ -47,4 +47,11 @@ func (*Router) Inject(router *gin.RouterGroup) { { bundles.GET("/:name", DownloadBundle) } + + policyRegistrations := router.Group("policies") + { + policyRegistrations.PUT("/:resourceName", CreateOrUpdatePolicyRegistration) + policyRegistrations.GET("", GetPolicyRegistrationDefinitions) + } + } diff --git a/pkg/microservice/policy/core/repository/models/policy.go b/pkg/microservice/policy/core/repository/models/policy.go new file mode 100644 index 000000000..6797f8fec --- /dev/null +++ b/pkg/microservice/policy/core/repository/models/policy.go @@ -0,0 +1,40 @@ +/* +Copyright 2021 The KodeRover 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 models + +type Policy struct { + Resource string `bson:"resource" json:"resource"` + Alias string `bson:"alias" json:"alias"` + Description string `bson:"description" json:"description"` + Rules []*PolicyRule `bson:"rules" json:"rules"` +} + +type PolicyRule struct { + Action string `bson:"action" json:"action"` + Alias string `bson:"alias" json:"alias"` + Description string `bson:"description" json:"description"` + Rules []*ActionRule `bson:"rules" json:"rules"` +} + +type ActionRule struct { + Method string `bson:"method" json:"method"` + Endpoint string `bson:"endpoint" json:"endpoint"` +} + +func (Policy) TableName() string { + return "policy" +} diff --git a/pkg/microservice/policy/core/repository/models/role.go b/pkg/microservice/policy/core/repository/models/role.go index a49233a16..60279b11b 100644 --- a/pkg/microservice/policy/core/repository/models/role.go +++ b/pkg/microservice/policy/core/repository/models/role.go @@ -24,16 +24,16 @@ const ( // Role is a namespaced or cluster scoped, logical grouping of PolicyRules that can be referenced as a unit by a RoleBinding. // for a cluster scoped Role, namespace is empty. type Role struct { - Name string `bson:"name" json:"name"` - Namespace string `bson:"namespace" json:"namespace"` - Rules []*PolicyRule `bson:"rules" json:"rules"` - Kind string `bson:"kind" json:"kind"` + Name string `bson:"name" json:"name"` + Namespace string `bson:"namespace" json:"namespace"` + Rules []*Rule `bson:"rules" json:"rules"` + Kind string `bson:"kind" json:"kind"` } -// PolicyRule holds information that describes a policy rule, but does not contain information +// Rule holds information that describes a policy rule, but does not contain information // about whom the rule applies to. // If Kind is "resource", verbs are resource actions, while resources are resource names -type PolicyRule struct { +type Rule struct { // Verbs is a list of http methods or resource actions that apply to ALL the Resources contained in this rule. '*' represents all methods. Verbs []string `bson:"verbs" json:"verbs"` @@ -42,5 +42,5 @@ type PolicyRule struct { } func (Role) TableName() string { - return "policy_role" + return "role" } diff --git a/pkg/microservice/policy/core/repository/mongodb/policy_registration.go b/pkg/microservice/policy/core/repository/mongodb/policy_registration.go new file mode 100644 index 000000000..344486d06 --- /dev/null +++ b/pkg/microservice/policy/core/repository/mongodb/policy_registration.go @@ -0,0 +1,88 @@ +/* +Copyright 2021 The KodeRover 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 mongodb + +import ( + "context" + "fmt" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" + + "github.com/koderover/zadig/pkg/config" + "github.com/koderover/zadig/pkg/microservice/policy/core/repository/models" + mongotool "github.com/koderover/zadig/pkg/tool/mongo" +) + +type PolicyColl struct { + *mongo.Collection + + coll string +} + +func NewPolicyColl() *PolicyColl { + name := models.Policy{}.TableName() + return &PolicyColl{ + Collection: mongotool.Database(config.MongoDatabase()).Collection(name), + coll: name, + } +} + +func (c *PolicyColl) GetCollectionName() string { + return c.coll +} + +func (c *PolicyColl) EnsureIndex(ctx context.Context) error { + mod := mongo.IndexModel{ + Keys: bson.M{"resource": 1}, + Options: options.Index().SetUnique(true), + } + + _, err := c.Indexes().CreateOne(ctx, mod) + + return err +} + +func (c *PolicyColl) List() ([]*models.Policy, error) { + var res []*models.Policy + + ctx := context.Background() + cursor, err := c.Collection.Find(ctx, bson.M{}) + if err != nil { + return nil, err + } + + err = cursor.All(ctx, &res) + if err != nil { + return nil, err + } + + return res, nil +} + +func (c *PolicyColl) UpdateOrCreate(obj *models.Policy) error { + if obj == nil { + return fmt.Errorf("nil object") + } + + query := bson.M{"resource": obj.Resource} + opts := options.Replace().SetUpsert(true) + _, err := c.ReplaceOne(context.TODO(), query, obj, opts) + + return err +} diff --git a/pkg/microservice/policy/core/service/bundle/opa_bundle.go b/pkg/microservice/policy/core/service/bundle/opa_bundle.go index 97118273e..2eb7431ee 100644 --- a/pkg/microservice/policy/core/service/bundle/opa_bundle.go +++ b/pkg/microservice/policy/core/service/bundle/opa_bundle.go @@ -41,24 +41,14 @@ const ( ) const ( - MethodView = "VIEW" - MethodGet = http.MethodGet - MethodPost = http.MethodPost - MethodPut = http.MethodPut - MethodPatch = http.MethodPatch - MethodDelete = http.MethodDelete - ActionCreate = "create" - ActionDelete = "delete" - ActionDeleteCollection = "deletecollection" - ActionGet = "get" - ActionList = "list" - ActionPatch = "patch" - ActionUpdate = "update" - ActionWatch = "watch" + MethodGet = http.MethodGet + MethodPost = http.MethodPost + MethodPut = http.MethodPut + MethodPatch = http.MethodPatch + MethodDelete = http.MethodDelete ) var AllMethods = []string{MethodGet, MethodPost, MethodPut, MethodPatch, MethodDelete} -var AllActions = []string{ActionCreate, ActionDelete, ActionDeleteCollection, ActionGet, ActionList, ActionPatch, ActionUpdate, ActionWatch} var cacheFS afero.Fs @@ -196,25 +186,16 @@ func (o roleBindings) Less(i, j int) bool { return o[i].User < o[j].User } -func generateOPARoles(roles []*models.Role) *opaRoles { +func generateOPARoles(roles []*models.Role, policies []*models.Policy) *opaRoles { data := &opaRoles{} + resourceMappings := getResourceActionMappings(policies) for _, ro := range roles { opaRole := &role{Name: ro.Name, Namespace: ro.Namespace} if ro.Kind == models.KindResource { for _, r := range ro.Rules { - if len(r.Verbs) == 1 && r.Verbs[0] == models.MethodAll { - r.Verbs = AllActions - } for _, res := range r.Resources { - if mapping, ok := resourceActionMappings[res]; !ok { - continue - } else { - for _, v := range r.Verbs { - opaRole.Rules = append(opaRole.Rules, mapping[v]...) - } - } - + opaRole.Rules = append(opaRole.Rules, resourceMappings.GetRules(res, r.Verbs)...) } } } else { @@ -270,7 +251,7 @@ func generateOPARoleBindings(rbs []*models.RoleBinding) *opaRoleBindings { return data } -func generateOPAExemptionURLs() *exemptionURLs { +func generateOPAExemptionURLs(policies []*models.Policy) *exemptionURLs { data := &exemptionURLs{} for _, r := range globalURLs { @@ -311,7 +292,8 @@ func generateOPAExemptionURLs() *exemptionURLs { sort.Sort(data.Public) - for _, resourceMappings := range resourceActionMappings { + resourceMappings := getResourceActionMappings(policies) + for _, resourceMappings := range resourceMappings { for _, rs := range resourceMappings { for _, r := range rs { data.Registered = append(data.Registered, r) @@ -339,21 +321,25 @@ func GenerateOPABundle() error { log.Info("Generating OPA bundle") defer log.Info("OPA bundle is generated") - roles, err := mongodb.NewRoleColl().List() + rs, err := mongodb.NewRoleColl().List() if err != nil { log.Errorf("Failed to list roles, err: %s", err) } - bindings, err := mongodb.NewRoleBindingColl().List() + bs, err := mongodb.NewRoleBindingColl().List() if err != nil { log.Errorf("Failed to list roleBindings, err: %s", err) } + ps, err := mongodb.NewPolicyColl().List() + if err != nil { + log.Errorf("Failed to list policies, err: %s", err) + } data := &opaData{ {data: generateOPAManifest(), path: manifestPath}, {data: generateOPAPolicy(), path: policyPath}, - {data: generateOPARoles(roles), path: rolesPath}, - {data: generateOPARoleBindings(bindings), path: rolebindingsPath}, - {data: generateOPAExemptionURLs(), path: exemptionPath}, + {data: generateOPARoles(rs, ps), path: rolesPath}, + {data: generateOPARoleBindings(bs), path: rolebindingsPath}, + {data: generateOPAExemptionURLs(ps), path: exemptionPath}, } return data.save() diff --git a/pkg/microservice/policy/core/service/bundle/resource_endpoint_mapping.go b/pkg/microservice/policy/core/service/bundle/resource_endpoint_mapping.go index 8a44c46bd..def928aa0 100644 --- a/pkg/microservice/policy/core/service/bundle/resource_endpoint_mapping.go +++ b/pkg/microservice/policy/core/service/bundle/resource_endpoint_mapping.go @@ -1,20 +1,62 @@ package bundle -// TODO: Policy Service should not care about the policy details of a certain service, instead, a service which wants -// to be managed by the Policy Service should register its rules to the Policy Service so that the Policy Service knows -// how to make a decision without being aware of the detailed rules. +import ( + "k8s.io/apimachinery/pkg/util/sets" -var resourceActionMappings = map[string]map[string][]*rule{ - "Workflow": workflowMapping, + "github.com/koderover/zadig/pkg/microservice/policy/core/repository/models" +) + +type resourceActionMappings map[string]map[string][]*rule + +func (m resourceActionMappings) GetRules(resource string, actions []string) []*rule { + mappings, ok := m[resource] + if !ok { + return nil + } + + all := false + if len(actions) == 1 && actions[0] == models.MethodAll { + all = true + } + actionSet := sets.NewString(actions...) + var res []*rule + for action, r := range mappings { + if all || actionSet.Has(action) { + res = append(res, r...) + } + } + + return res } -var workflowMapping = map[string][]*rule{ - ActionCreate: { - {Method: MethodPost, Endpoint: "/api/aslan/workflow/workflow"}, - {Method: MethodPost, Endpoint: "/api/aslan/workflow/v2/pipelines"}, - }, - ActionDelete: { - {Method: MethodPost, Endpoint: "/api/aslan/workflow/workflow/?*"}, - {Method: MethodPost, Endpoint: "/api/aslan/workflow/v2/pipelines/?*"}, - }, +//var resourceActionMappings = map[string]map[string][]*rule{ +// "Workflow": workflowMapping, +//} +// +//var workflowMapping = map[string][]*rule{ +// ActionCreate: { +// {Method: MethodPost, Endpoint: "/api/aslan/workflow/workflow"}, +// {Method: MethodPost, Endpoint: "/api/aslan/workflow/v2/pipelines"}, +// }, +// ActionDelete: { +// {Method: MethodPost, Endpoint: "/api/aslan/workflow/workflow/?*"}, +// {Method: MethodPost, Endpoint: "/api/aslan/workflow/v2/pipelines/?*"}, +// }, +//} + +func getResourceActionMappings(policies []*models.Policy) resourceActionMappings { + data := make(resourceActionMappings) + for _, p := range policies { + if _, ok := data[p.Resource]; !ok { + data[p.Resource] = make(map[string][]*rule) + } + + for _, r := range p.Rules { + for _, ar := range r.Rules { + data[p.Resource][r.Action] = append(data[p.Resource][r.Action], &rule{Method: ar.Method, Endpoint: ar.Endpoint}) + } + } + } + + return data } diff --git a/pkg/microservice/policy/core/service/policy_registration.go b/pkg/microservice/policy/core/service/policy_registration.go new file mode 100644 index 000000000..f940b1154 --- /dev/null +++ b/pkg/microservice/policy/core/service/policy_registration.go @@ -0,0 +1,89 @@ +package service + +import ( + "go.uber.org/zap" + + "github.com/koderover/zadig/pkg/microservice/policy/core/repository/models" + "github.com/koderover/zadig/pkg/microservice/policy/core/repository/mongodb" +) + +type Policy struct { + Resource string `json:"resource"` + Alias string `json:"alias"` + Description string `json:"description"` + Rules []*PolicyRule `json:"rules"` +} + +type PolicyRule struct { + Action string `json:"action"` + Alias string `json:"alias"` + Description string `json:"description"` + Rules []*ActionRule `json:"rules"` +} + +type ActionRule struct { + Method string `json:"method"` + Endpoint string `json:"endpoint"` +} + +type PolicyDefinition struct { + Resource string `json:"resource"` + Alias string `json:"alias"` + Description string `json:"description"` + Rules []*PolicyRuleDefinition `json:"rules"` +} + +type PolicyRuleDefinition struct { + Action string `json:"action"` + Alias string `json:"alias"` + Description string `json:"description"` +} + +func CreateOrUpdatePolicyRegistration(p *Policy, _ *zap.SugaredLogger) error { + obj := &models.Policy{ + Resource: p.Resource, + Alias: p.Alias, + Description: p.Description, + } + + for _, r := range p.Rules { + rule := &models.PolicyRule{ + Action: r.Action, + Alias: r.Alias, + Description: r.Description, + } + for _, ar := range r.Rules { + rule.Rules = append(rule.Rules, &models.ActionRule{Method: ar.Method, Endpoint: ar.Endpoint}) + } + obj.Rules = append(obj.Rules, rule) + } + + return mongodb.NewPolicyColl().UpdateOrCreate(obj) +} + +func GetPolicyRegistrationDefinitions(_ *zap.SugaredLogger) ([]*PolicyDefinition, error) { + policies, err := mongodb.NewPolicyColl().List() + if err != nil { + return nil, err + } + + var res []*PolicyDefinition + for _, p := range policies { + pd := &PolicyDefinition{ + Resource: p.Resource, + Alias: p.Alias, + Description: p.Description, + } + for _, r := range p.Rules { + pd.Rules = append(pd.Rules, &PolicyRuleDefinition{ + Action: r.Action, + Alias: r.Alias, + Description: r.Description, + }) + } + + res = append(res, pd) + } + + return res, nil +} diff --git a/pkg/microservice/policy/core/service/role.go b/pkg/microservice/policy/core/service/role.go index 2e330ebe4..fb7b69ad0 100644 --- a/pkg/microservice/policy/core/service/role.go +++ b/pkg/microservice/policy/core/service/role.go @@ -24,11 +24,11 @@ import ( ) type Role struct { - Name string `json:"name"` - Rules []*PolicyRule `json:"rules"` + Name string `json:"name"` + Rules []*Rule `json:"rules"` } -type PolicyRule struct { +type Rule struct { Verbs []string `json:"verbs"` Resources []string `json:"resources"` } @@ -40,7 +40,7 @@ func CreateRole(ns string, role *Role, _ *zap.SugaredLogger) error { } for _, r := range role.Rules { - obj.Rules = append(obj.Rules, &models.PolicyRule{ + obj.Rules = append(obj.Rules, &models.Rule{ Verbs: r.Verbs, Resources: r.Resources, }) -- Gitee From 3e0d74562a9f3bbc6f3a29c1ef2785b55b5e3d48 Mon Sep 17 00:00:00 2001 From: mouuii Date: Mon, 18 Oct 2021 18:00:16 +0800 Subject: [PATCH 019/405] list env Signed-off-by: mouuii --- .../core/environment/handler/environment.go | 11 +++++++ .../aslan/core/environment/handler/router.go | 2 +- .../core/environment/service/environment.go | 32 +++++++++++++++++++ 3 files changed, 44 insertions(+), 1 deletion(-) diff --git a/pkg/microservice/aslan/core/environment/handler/environment.go b/pkg/microservice/aslan/core/environment/handler/environment.go index 18a493e9d..291faed06 100644 --- a/pkg/microservice/aslan/core/environment/handler/environment.go +++ b/pkg/microservice/aslan/core/environment/handler/environment.go @@ -75,6 +75,17 @@ func ListProducts(c *gin.Context) { ctx.Resp, ctx.Err = service.ListProducts(c.Query("productName"), c.Query("envType"), ctx.User.Name, ctx.User.ID, ctx.User.IsSuperUser, ctx.Logger) } +func ListProductsV3(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + projectName := c.Query("projectName") + if projectName == "" { + ctx.Err = e.ErrInvalidParam + return + } + ctx.Resp, ctx.Err = service.ListProductsV3(c.Query("productName"), ctx.User.Name, ctx.User.ID, ctx.User.IsSuperUser, ctx.Logger) +} + func AutoCreateProduct(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() diff --git a/pkg/microservice/aslan/core/environment/handler/router.go b/pkg/microservice/aslan/core/environment/handler/router.go index b0056e6d9..162038f51 100644 --- a/pkg/microservice/aslan/core/environment/handler/router.go +++ b/pkg/microservice/aslan/core/environment/handler/router.go @@ -94,7 +94,7 @@ func (*Router) Inject(router *gin.RouterGroup) { // --------------------------------------------------------------------------------------- environments := router.Group("environments") { - environments.GET("", ListProducts) + environments.GET("", ListProductsV3) environments.POST("/:productName/auto", gin2.IsHavePermission([]string{permission.TestEnvCreateUUID}, permission.ParamType), AutoCreateProduct) environments.PUT("/:productName/autoUpdate", gin2.IsHavePermission([]string{permission.TestEnvManageUUID, permission.ProdEnvManageUUID}, permission.ParamType), gin2.UpdateOperationLogStatus, AutoUpdateProduct) environments.POST("", gin2.StoreProductName, gin2.IsHavePermission([]string{permission.TestEnvCreateUUID, permission.ProdEnvCreateUUID}, permission.ContextKeyType), gin2.UpdateOperationLogStatus, CreateProduct) diff --git a/pkg/microservice/aslan/core/environment/service/environment.go b/pkg/microservice/aslan/core/environment/service/environment.go index 7931ff5e7..7fb6a716c 100644 --- a/pkg/microservice/aslan/core/environment/service/environment.go +++ b/pkg/microservice/aslan/core/environment/service/environment.go @@ -148,6 +148,38 @@ func UpdateProductPublic(productName string, args *ProductParams, log *zap.Sugar return nil } +func ListProductsV3(productNameParam string, userName string, log *zap.SugaredLogger) (resp []*ProductResp, err error) { + products, err := commonrepo.NewProductColl().List(&commonrepo.ProductListOptions{Name: productNameParam}) + if err != nil { + log.Errorf("[%s] Collections.Product.List error: %v", userName, err) + return resp, e.ErrListEnvs.AddDesc(err.Error()) + } + + for _, prod := range products { + product := &ProductResp{ + ID: prod.ID.Hex(), + ProductName: prod.ProductName, + EnvName: prod.EnvName, + Namespace: prod.Namespace, + Vars: prod.Vars[:], + IsPublic: prod.IsPublic, + ClusterID: prod.ClusterID, + UpdateTime: prod.UpdateTime, + UpdateBy: prod.UpdateBy, + RecycleDay: prod.RecycleDay, + Render: prod.Render, + Source: prod.Source, + } + err = FillProductVars(products, log) + if err != nil { + return resp, err + } + resp = append(resp, product) + } + sort.SliceStable(resp, func(i, j int) bool { return resp[i].ProductName < resp[j].ProductName }) + return nil, nil +} + func ListProducts(productNameParam, envType string, userName string, userID int, superUser bool, log *zap.SugaredLogger) ([]*ProductResp, error) { var ( err error -- Gitee From 1c2209cd5065bf7ea4806dd2ad606d132b60eb07 Mon Sep 17 00:00:00 2001 From: mouuii Date: Mon, 18 Oct 2021 18:02:57 +0800 Subject: [PATCH 020/405] list env Signed-off-by: mouuii --- pkg/microservice/aslan/core/environment/handler/environment.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/microservice/aslan/core/environment/handler/environment.go b/pkg/microservice/aslan/core/environment/handler/environment.go index 291faed06..412d981fc 100644 --- a/pkg/microservice/aslan/core/environment/handler/environment.go +++ b/pkg/microservice/aslan/core/environment/handler/environment.go @@ -83,7 +83,7 @@ func ListProductsV3(c *gin.Context) { ctx.Err = e.ErrInvalidParam return } - ctx.Resp, ctx.Err = service.ListProductsV3(c.Query("productName"), ctx.User.Name, ctx.User.ID, ctx.User.IsSuperUser, ctx.Logger) + ctx.Resp, ctx.Err = service.ListProductsV3(c.Query("productName"), ctx.User.Name, ctx.Logger) } func AutoCreateProduct(c *gin.Context) { -- Gitee From 1aed3a7993f44b047149093edc1af61612ceeb68 Mon Sep 17 00:00:00 2001 From: lou Date: Mon, 18 Oct 2021 19:27:32 +0800 Subject: [PATCH 021/405] add register example --- pkg/config/config.go | 9 ++++ pkg/microservice/aslan/core/service.go | 22 +++++++++ .../aslan/core/workflow/handler/router.go | 32 +++++++++++++ .../core/service/bundle/exemption_urls.go | 8 ++++ .../policy/core/service/bundle/opa_bundle.go | 10 ++++ pkg/setting/types.go | 5 ++ pkg/shared/client/policy/client.go | 47 +++++++++++++++++++ pkg/shared/client/policy/policy.go | 34 ++++++++++++++ 8 files changed, 167 insertions(+) create mode 100644 pkg/shared/client/policy/client.go create mode 100644 pkg/shared/client/policy/policy.go diff --git a/pkg/config/config.go b/pkg/config/config.go index 69855b835..36aed9665 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -168,6 +168,15 @@ func OPAServiceAddress() string { return GetServiceAddress(s.Name, s.Port) } +func PolicyServiceInfo() *setting.ServiceInfo { + return GetServiceByCode(setting.Policy) +} + +func PolicyServiceAddress() string { + s := PolicyServiceInfo() + return GetServiceAddress(s.Name, s.Port) +} + func GetServiceAddress(name string, port int32) string { return fmt.Sprintf("http://%s:%d", name, port) } diff --git a/pkg/microservice/aslan/core/service.go b/pkg/microservice/aslan/core/service.go index b6c26bf74..460a1fdb6 100644 --- a/pkg/microservice/aslan/core/service.go +++ b/pkg/microservice/aslan/core/service.go @@ -33,8 +33,10 @@ import ( environmentservice "github.com/koderover/zadig/pkg/microservice/aslan/core/environment/service" systemrepo "github.com/koderover/zadig/pkg/microservice/aslan/core/system/repository/mongodb" systemservice "github.com/koderover/zadig/pkg/microservice/aslan/core/system/service" + workflowhandler "github.com/koderover/zadig/pkg/microservice/aslan/core/workflow/handler" workflowservice "github.com/koderover/zadig/pkg/microservice/aslan/core/workflow/service/workflow" "github.com/koderover/zadig/pkg/setting" + "github.com/koderover/zadig/pkg/shared/client/policy" "github.com/koderover/zadig/pkg/tool/log" mongotool "github.com/koderover/zadig/pkg/tool/mongo" ) @@ -43,6 +45,10 @@ const ( webhookController = iota ) +type policyGetter interface { + Policies() *policy.Policy +} + type Controller interface { Run(workers int, stopCh <-chan struct{}) } @@ -67,6 +73,20 @@ func StartControllers(stopCh <-chan struct{}) { wg.Wait() } +func registerPolicies() { + policyClient := policy.New() + + for _, r := range []policyGetter{ + new(workflowhandler.Router), + } { + err := policyClient.CreateOrUpdatePolicy(r.Policies()) + if err != nil { + // should not have happened here + log.DPanic(err) + } + } +} + func Start(ctx context.Context) { log.Init(&log.Config{ Level: commonconfig.LogLevel(), @@ -87,6 +107,8 @@ func Start(ctx context.Context) { environmentservice.ResetProductsStatus() + registerPolicies() + go StartControllers(ctx.Done()) } diff --git a/pkg/microservice/aslan/core/workflow/handler/router.go b/pkg/microservice/aslan/core/workflow/handler/router.go index 20467e5c3..b1b1afe79 100644 --- a/pkg/microservice/aslan/core/workflow/handler/router.go +++ b/pkg/microservice/aslan/core/workflow/handler/router.go @@ -17,14 +17,46 @@ limitations under the License. package handler import ( + "encoding/json" + "github.com/gin-gonic/gin" gin2 "github.com/koderover/zadig/pkg/middleware/gin" + "github.com/koderover/zadig/pkg/shared/client/policy" + "github.com/koderover/zadig/pkg/tool/log" "github.com/koderover/zadig/pkg/types/permission" ) type Router struct{} +var policies = ` +{ + "resource": "Workflow", + "alias": "工作流", + "description": "", + "rules": [{ + "action": "get_workflow", + "alias": "查看工作流", + "description": "", + "rules": [{ + "method": "GET", + "endpoint": "api/aslan/workflow/workflow" + }] + }] +} +` + +func (*Router) Policies() *policy.Policy { + res := &policy.Policy{} + err := json.Unmarshal([]byte(policies), res) + if err != nil { + // should not have happened here + log.DPanic(err) + } + + return res +} + func (*Router) Inject(router *gin.RouterGroup) { // --------------------------------------------------------------------------------------- // 对外公共接口 diff --git a/pkg/microservice/policy/core/service/bundle/exemption_urls.go b/pkg/microservice/policy/core/service/bundle/exemption_urls.go index 06b471907..84d419a21 100644 --- a/pkg/microservice/policy/core/service/bundle/exemption_urls.go +++ b/pkg/microservice/policy/core/service/bundle/exemption_urls.go @@ -48,3 +48,11 @@ var publicURLs = []*policyRule{ Endpoints: []string{"api/aslan/kodespace/downloadUrl"}, }, } + +// actions which are allowed for system admins only. +var adminURLs = []*policyRule{ + { + Methods: []string{"POST"}, + Endpoints: []string{"api/aslan/cluster/clusters"}, + }, +} diff --git a/pkg/microservice/policy/core/service/bundle/opa_bundle.go b/pkg/microservice/policy/core/service/bundle/opa_bundle.go index 2eb7431ee..3089d1c61 100644 --- a/pkg/microservice/policy/core/service/bundle/opa_bundle.go +++ b/pkg/microservice/policy/core/service/bundle/opa_bundle.go @@ -300,6 +300,16 @@ func generateOPAExemptionURLs(policies []*models.Policy) *exemptionURLs { } } } + for _, r := range adminURLs { + if len(r.Methods) == 1 && r.Methods[0] == models.MethodAll { + r.Methods = AllMethods + } + for _, method := range r.Methods { + for _, endpoint := range r.Endpoints { + data.Registered = append(data.Registered, &rule{Method: method, Endpoint: endpoint}) + } + } + } sort.Sort(data.Registered) diff --git a/pkg/setting/types.go b/pkg/setting/types.go index dd56e0cff..dd1f1315a 100644 --- a/pkg/setting/types.go +++ b/pkg/setting/types.go @@ -47,6 +47,7 @@ const ( WarpDrive // 10 Minio // 11 OPA // 12 + Policy // 13 ) type ServiceInfo struct { @@ -103,4 +104,8 @@ var Services = map[int]*ServiceInfo{ Name: "opa", Port: 8181, }, + Policy: { + Name: "policy", + Port: 80, + }, } diff --git a/pkg/shared/client/policy/client.go b/pkg/shared/client/policy/client.go new file mode 100644 index 000000000..7406675b9 --- /dev/null +++ b/pkg/shared/client/policy/client.go @@ -0,0 +1,47 @@ +/* +Copyright 2021 The KodeRover 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 policy + +import ( + "time" + + "github.com/koderover/zadig/pkg/config" + "github.com/koderover/zadig/pkg/tool/httpclient" +) + +const retryInterval = 200 * time.Millisecond + +type Client struct { + *httpclient.Client + + host string +} + +func New() *Client { + host := config.PolicyServiceAddress() + + c := httpclient.New( + httpclient.SetHostURL(host+"/api/v1"), + httpclient.SetRetryCount(100), + httpclient.SetRetryWaitTime(retryInterval), + ) + + return &Client{ + Client: c, + host: host, + } +} diff --git a/pkg/shared/client/policy/policy.go b/pkg/shared/client/policy/policy.go new file mode 100644 index 000000000..3faba0b13 --- /dev/null +++ b/pkg/shared/client/policy/policy.go @@ -0,0 +1,34 @@ +package policy + +import ( + "fmt" + + "github.com/koderover/zadig/pkg/tool/httpclient" +) + +type Policy struct { + Resource string `json:"resource"` + Alias string `json:"alias"` + Description string `json:"description"` + Rules []*Rule `json:"rules"` +} + +type Rule struct { + Action string `json:"action"` + Alias string `json:"alias"` + Description string `json:"description"` + Rules []*ActionRule `json:"rules"` +} + +type ActionRule struct { + Method string `json:"method"` + Endpoint string `json:"endpoint"` +} + +func (c *Client) CreateOrUpdatePolicy(p *Policy) error { + url := fmt.Sprintf("/policies/%s", p.Resource) + + _, err := c.Put(url, httpclient.SetBody(p)) + + return err +} -- Gitee From e320757775b27e1363bcc65a3e8bc79daddf9709 Mon Sep 17 00:00:00 2001 From: mouuii Date: Mon, 18 Oct 2021 19:45:10 +0800 Subject: [PATCH 022/405] list projects Signed-off-by: mouuii --- .../picket/core/filter/service/project.go | 13 +++--- .../picket/core/filter/service/workflow.go | 42 ++++++++++++++++++- 2 files changed, 48 insertions(+), 7 deletions(-) diff --git a/pkg/microservice/picket/core/filter/service/project.go b/pkg/microservice/picket/core/filter/service/project.go index e267487e7..134a6294a 100644 --- a/pkg/microservice/picket/core/filter/service/project.go +++ b/pkg/microservice/picket/core/filter/service/project.go @@ -17,7 +17,7 @@ type allowedProjectsData struct { } func ListProjects(header http.Header, qs url.Values, logger *zap.SugaredLogger) ([]byte, error) { - names, err := getAllowedProjects(header, logger) + names, err := getVisibleProjects(header, logger) if err != nil { logger.Errorf("Failed to get allowed project names, err: %s", err) return nil, err @@ -32,30 +32,31 @@ func ListProjects(header http.Header, qs url.Values, logger *zap.SugaredLogger) return aslanClient.ListProjects(header, qs) } -func getAllowedProjects(headers http.Header, logger *zap.SugaredLogger) ([]string, error) { +func getVisibleProjects(headers http.Header, logger *zap.SugaredLogger) ([]string, error) { res := &allowedProjectsData{} - opaClient := opa.NewDefault() - err := opaClient.Evaluate("rbac.user_projects", res, func() (*opa.Input, error) { return generateOPAInput(headers), nil }) + err := opaClient.Evaluate("rbac.user_visible_projects", res, func() (*opa.Input, error) { return generateOPAInput(headers, "", ""), nil }) if err != nil { logger.Errorf("opa evaluation failed, err: %s", err) return nil, err } return res.Result, nil - } -func generateOPAInput(header http.Header) *opa.Input { +func generateOPAInput(header http.Header, method string, endpoint string) *opa.Input { authorization := header.Get(strings.ToLower(setting.AuthorizationHeader)) headers := map[string]string{} + parsedPath := strings.Split(strings.Trim(endpoint, "/"), "/") headers[strings.ToLower(setting.AuthorizationHeader)] = authorization return &opa.Input{ Attributes: &opa.Attributes{ Request: &opa.Request{HTTP: &opa.HTTPSpec{ Headers: headers, + Method: method, }}, }, + ParsedPath: parsedPath, } } diff --git a/pkg/microservice/picket/core/filter/service/workflow.go b/pkg/microservice/picket/core/filter/service/workflow.go index 2f426173b..3c2de3103 100644 --- a/pkg/microservice/picket/core/filter/service/workflow.go +++ b/pkg/microservice/picket/core/filter/service/workflow.go @@ -5,12 +5,18 @@ import ( "net/url" "go.uber.org/zap" + "k8s.io/apimachinery/pkg/util/sets" "github.com/koderover/zadig/pkg/microservice/picket/client/aslan" + "github.com/koderover/zadig/pkg/microservice/picket/client/opa" ) func ListTestWorkflows(testName string, header http.Header, qs url.Values, logger *zap.SugaredLogger) ([]byte, error) { - names, err := getAllowedProjects(header, logger) + rules := []*rule{{ + method: "/api/aslan/workflow/workflow", + endpoint: "PUT", + }} + names, err := getAllowedProjectsWithUpdateWorkflowsPermission(header, rules, logger) if err != nil { logger.Errorf("Failed to get allowed project names, err: %s", err) return nil, err @@ -24,3 +30,37 @@ func ListTestWorkflows(testName string, header http.Header, qs url.Values, logge return aslanClient.ListTestWorkflows(testName, header, qs) } + +type rule struct { + method string + endpoint string +} + +func getAllowedProjectsWithUpdateWorkflowsPermission(headers http.Header, rules []*rule, logger *zap.SugaredLogger) (projects []string, err error) { + resps := [][]string{} + for _, v := range rules { + res := &allowedProjectsData{} + opaClient := opa.NewDefault() + err := opaClient.Evaluate("rbac.user_allowed_projects", res, func() (*opa.Input, error) { + return generateOPAInput(headers, v.method, v.endpoint), nil + }) + if err != nil { + logger.Errorf("opa evaluation failed, err: %s", err) + return nil, err + } + resps = append(resps, res.Result) + } + return intersect(resps), nil +} + +func intersect(s [][]string) []string { + tmp := sets.String{} + for i, v := range s { + t := sets.NewString(v...) + if i == 0 { + tmp = t + } + tmp = t.Intersection(tmp) + } + return tmp.List() +} -- Gitee From 88f1f10b14c07c4e27007021a515a1eca03dc6ab Mon Sep 17 00:00:00 2001 From: mouuii Date: Mon, 18 Oct 2021 19:53:36 +0800 Subject: [PATCH 023/405] list projects Signed-off-by: mouuii --- .../picket/core/filter/service/workflow.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pkg/microservice/picket/core/filter/service/workflow.go b/pkg/microservice/picket/core/filter/service/workflow.go index 3c2de3103..c05c62607 100644 --- a/pkg/microservice/picket/core/filter/service/workflow.go +++ b/pkg/microservice/picket/core/filter/service/workflow.go @@ -54,12 +54,12 @@ func getAllowedProjectsWithUpdateWorkflowsPermission(headers http.Header, rules } func intersect(s [][]string) []string { - tmp := sets.String{} - for i, v := range s { + if len(s) == 0 { + return nil + } + tmp := sets.NewString(s[0]...) + for _, v := range s[1:] { t := sets.NewString(v...) - if i == 0 { - tmp = t - } tmp = t.Intersection(tmp) } return tmp.List() -- Gitee From 79ebeb475289a94b9a65cf577febd388c2dab2c3 Mon Sep 17 00:00:00 2001 From: mouuii Date: Mon, 18 Oct 2021 20:02:48 +0800 Subject: [PATCH 024/405] list env Signed-off-by: mouuii --- pkg/microservice/picket/client/aslan/env.go | 19 ++++++++ .../picket/core/filter/handler/env.go | 15 ++++++ .../picket/core/filter/handler/router.go | 4 ++ .../picket/core/filter/service/env.go | 46 +++++++++++++++++++ 4 files changed, 84 insertions(+) create mode 100644 pkg/microservice/picket/client/aslan/env.go create mode 100644 pkg/microservice/picket/core/filter/handler/env.go create mode 100644 pkg/microservice/picket/core/filter/service/env.go diff --git a/pkg/microservice/picket/client/aslan/env.go b/pkg/microservice/picket/client/aslan/env.go new file mode 100644 index 000000000..6927e4d3a --- /dev/null +++ b/pkg/microservice/picket/client/aslan/env.go @@ -0,0 +1,19 @@ +package aslan + +import ( + "net/http" + "net/url" + + "github.com/koderover/zadig/pkg/tool/httpclient" +) + +func (c *Client) ListEnvs(header http.Header, qs url.Values) ([]byte, error) { + url := "/environment/environments" + + res, err := c.Get(url, httpclient.SetHeadersFromHTTPHeader(header), httpclient.SetQueryParamsFromValues(qs)) + if err != nil { + return nil, err + } + + return res.Body(), nil +} diff --git a/pkg/microservice/picket/core/filter/handler/env.go b/pkg/microservice/picket/core/filter/handler/env.go new file mode 100644 index 000000000..d650b2ecc --- /dev/null +++ b/pkg/microservice/picket/core/filter/handler/env.go @@ -0,0 +1,15 @@ +package handler + +import ( + "github.com/gin-gonic/gin" + + "github.com/koderover/zadig/pkg/microservice/picket/core/filter/service" + internalhandler "github.com/koderover/zadig/pkg/shared/handler" +) + +func ListEnvs(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + + ctx.Resp, ctx.Err = service.ListEnvs(c.Request.Header, c.Request.URL.Query(), ctx.Logger) +} diff --git a/pkg/microservice/picket/core/filter/handler/router.go b/pkg/microservice/picket/core/filter/handler/router.go index 9e8aea853..51ca67c76 100644 --- a/pkg/microservice/picket/core/filter/handler/router.go +++ b/pkg/microservice/picket/core/filter/handler/router.go @@ -31,4 +31,8 @@ func (*Router) Inject(router *gin.RouterGroup) { { workflows.GET("testName/:testName", ListTestWorkflows) } + envs := router.Group("environments") + { + envs.GET("", ListEnvs) + } } diff --git a/pkg/microservice/picket/core/filter/service/env.go b/pkg/microservice/picket/core/filter/service/env.go new file mode 100644 index 000000000..1acdc9637 --- /dev/null +++ b/pkg/microservice/picket/core/filter/service/env.go @@ -0,0 +1,46 @@ +package service + +import ( + "errors" + "net/http" + "net/url" + + "github.com/koderover/zadig/pkg/microservice/picket/client/opa" + + "go.uber.org/zap" + + "github.com/koderover/zadig/pkg/microservice/picket/client/aslan" +) + +func ListEnvs(header http.Header, qs url.Values, logger *zap.SugaredLogger) ([]byte, error) { + allow, err := opaAllow(header, logger) + if err != nil { + logger.Errorf("Failed to get allowed project names, err: %s", err) + return nil, err + } + if !allow { + return nil, errors.New("have no list env permission") + } + aslanClient := aslan.New() + + return aslanClient.ListProjects(header, qs) +} + +func opaAllow(headers http.Header, logger *zap.SugaredLogger) (bool, error) { + res := &opaAllowResp{} + + opaClient := opa.NewDefault() + err := opaClient.Evaluate("rbac.allow", res, func() (*opa.Input, error) { + return generateOPAInput(headers, "GET", "api/aslan/environment/enviromments"), nil + }) + if err != nil { + logger.Errorf("opa evaluation failed, err: %s", err) + return false, err + } + + return res.Result, nil +} + +type opaAllowResp struct { + Result bool `json:"result"` +} -- Gitee From afc9c0bb7c7aca0d0a0bd66a5f1eb01acd17bb20 Mon Sep 17 00:00:00 2001 From: mouuii Date: Mon, 18 Oct 2021 20:10:11 +0800 Subject: [PATCH 025/405] list env Signed-off-by: mouuii --- .../aslan/core/environment/service/environment.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/pkg/microservice/aslan/core/environment/service/environment.go b/pkg/microservice/aslan/core/environment/service/environment.go index 7fb6a716c..4868d97a8 100644 --- a/pkg/microservice/aslan/core/environment/service/environment.go +++ b/pkg/microservice/aslan/core/environment/service/environment.go @@ -170,6 +170,12 @@ func ListProductsV3(productNameParam string, userName string, log *zap.SugaredLo Render: prod.Render, Source: prod.Source, } + if product.ClusterID != "" { + cluster, _ := commonrepo.NewK8SClusterColl().Get(product.ClusterID) + if cluster != nil && cluster.Production { + product.IsProd = true + } + } err = FillProductVars(products, log) if err != nil { return resp, err -- Gitee From 1fa0b59b4936377292da7aa476f6e2f6165a180a Mon Sep 17 00:00:00 2001 From: mouuii Date: Mon, 18 Oct 2021 20:11:18 +0800 Subject: [PATCH 026/405] list env Signed-off-by: mouuii --- pkg/microservice/picket/core/filter/service/env.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/microservice/picket/core/filter/service/env.go b/pkg/microservice/picket/core/filter/service/env.go index 1acdc9637..605883233 100644 --- a/pkg/microservice/picket/core/filter/service/env.go +++ b/pkg/microservice/picket/core/filter/service/env.go @@ -13,7 +13,7 @@ import ( ) func ListEnvs(header http.Header, qs url.Values, logger *zap.SugaredLogger) ([]byte, error) { - allow, err := opaAllow(header, logger) + allow, err := opaAllowEnvList(header, logger) if err != nil { logger.Errorf("Failed to get allowed project names, err: %s", err) return nil, err @@ -26,7 +26,7 @@ func ListEnvs(header http.Header, qs url.Values, logger *zap.SugaredLogger) ([]b return aslanClient.ListProjects(header, qs) } -func opaAllow(headers http.Header, logger *zap.SugaredLogger) (bool, error) { +func opaAllowEnvList(headers http.Header, logger *zap.SugaredLogger) (bool, error) { res := &opaAllowResp{} opaClient := opa.NewDefault() -- Gitee From 061c50330a58839550a7278ade80e6a381ad19c0 Mon Sep 17 00:00:00 2001 From: mouuii Date: Mon, 18 Oct 2021 20:17:46 +0800 Subject: [PATCH 027/405] list env Signed-off-by: mouuii --- pkg/microservice/picket/core/filter/service/env.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/microservice/picket/core/filter/service/env.go b/pkg/microservice/picket/core/filter/service/env.go index 605883233..ca1dce32d 100644 --- a/pkg/microservice/picket/core/filter/service/env.go +++ b/pkg/microservice/picket/core/filter/service/env.go @@ -23,7 +23,7 @@ func ListEnvs(header http.Header, qs url.Values, logger *zap.SugaredLogger) ([]b } aslanClient := aslan.New() - return aslanClient.ListProjects(header, qs) + return aslanClient.ListEnvs(header, qs) } func opaAllowEnvList(headers http.Header, logger *zap.SugaredLogger) (bool, error) { -- Gitee From 360094f03339d4649786160a49ecb8fbf58afbe7 Mon Sep 17 00:00:00 2001 From: mouuii Date: Mon, 18 Oct 2021 20:43:54 +0800 Subject: [PATCH 028/405] list env Signed-off-by: mouuii --- .../core/environment/handler/environment.go | 25 +- .../core/environment/service/environment.go | 342 +----------------- .../picket/core/filter/service/env.go | 3 +- 3 files changed, 3 insertions(+), 367 deletions(-) diff --git a/pkg/microservice/aslan/core/environment/handler/environment.go b/pkg/microservice/aslan/core/environment/handler/environment.go index 412d981fc..3557ab3cf 100644 --- a/pkg/microservice/aslan/core/environment/handler/environment.go +++ b/pkg/microservice/aslan/core/environment/handler/environment.go @@ -52,29 +52,6 @@ type NamespaceResource struct { Ingresses []resource.Ingress `json:"ingresses"` } -// ListProducts list all product information -// Args: projectName, which is formerly known as productName, is the primary key of the project in our system -func ListProducts(c *gin.Context) { - ctx := internalhandler.NewContext(c) - defer func() { internalhandler.JSONResponse(c, ctx) }() - - if c.Query("projectName") != "" { - isProduction := c.Query("production") - var envFilter string - switch isProduction { - case "true": - envFilter = setting.ProdENV - case "false": - envFilter = setting.TestENV - default: - envFilter = isProduction - } - ctx.Resp, ctx.Err = service.ListProductsV2(c.Query("projectName"), envFilter, ctx.User.Name, ctx.User.ID, ctx.User.IsSuperUser, ctx.Logger) - return - } - ctx.Resp, ctx.Err = service.ListProducts(c.Query("productName"), c.Query("envType"), ctx.User.Name, ctx.User.ID, ctx.User.IsSuperUser, ctx.Logger) -} - func ListProductsV3(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() @@ -83,7 +60,7 @@ func ListProductsV3(c *gin.Context) { ctx.Err = e.ErrInvalidParam return } - ctx.Resp, ctx.Err = service.ListProductsV3(c.Query("productName"), ctx.User.Name, ctx.Logger) + ctx.Resp, ctx.Err = service.ListProducts(c.Query("productName"), ctx.User.Name, ctx.Logger) } func AutoCreateProduct(c *gin.Context) { diff --git a/pkg/microservice/aslan/core/environment/service/environment.go b/pkg/microservice/aslan/core/environment/service/environment.go index 4868d97a8..dbcbcd175 100644 --- a/pkg/microservice/aslan/core/environment/service/environment.go +++ b/pkg/microservice/aslan/core/environment/service/environment.go @@ -59,7 +59,6 @@ import ( "github.com/koderover/zadig/pkg/tool/kube/getter" "github.com/koderover/zadig/pkg/tool/kube/serializer" "github.com/koderover/zadig/pkg/tool/kube/updater" - "github.com/koderover/zadig/pkg/types/permission" "github.com/koderover/zadig/pkg/util" "github.com/koderover/zadig/pkg/util/converter" "github.com/koderover/zadig/pkg/util/fs" @@ -148,7 +147,7 @@ func UpdateProductPublic(productName string, args *ProductParams, log *zap.Sugar return nil } -func ListProductsV3(productNameParam string, userName string, log *zap.SugaredLogger) (resp []*ProductResp, err error) { +func ListProducts(productNameParam string, userName string, log *zap.SugaredLogger) (resp []*ProductResp, err error) { products, err := commonrepo.NewProductColl().List(&commonrepo.ProductListOptions{Name: productNameParam}) if err != nil { log.Errorf("[%s] Collections.Product.List error: %v", userName, err) @@ -186,181 +185,6 @@ func ListProductsV3(productNameParam string, userName string, log *zap.SugaredLo return nil, nil } -func ListProducts(productNameParam, envType string, userName string, userID int, superUser bool, log *zap.SugaredLogger) ([]*ProductResp, error) { - var ( - err error - testResp []*ProductResp - prodResp []*ProductResp - products = make([]*commonmodels.Product, 0) - productNameMap map[string][]int64 - productNamespaces = sets.NewString() - ) - resp := make([]*ProductResp, 0) - - poetryCtl := poetry.New(config.PoetryAPIServer(), config.PoetryAPIRootKey()) - - // 获取所有产品 - if superUser { - products, err = commonrepo.NewProductColl().List(&commonrepo.ProductListOptions{Name: productNameParam}) - if err != nil { - log.Errorf("[%s] Collections.Product.List error: %v", userName, err) - return resp, e.ErrListEnvs.AddDesc(err.Error()) - } - } else { - //项目下所有公开环境 - publicProducts, err := commonrepo.NewProductColl().List(&commonrepo.ProductListOptions{IsPublic: true}) - if err != nil { - log.Errorf("Collection.Product.List List product error: %v", err) - return resp, e.ErrListProducts.AddDesc(err.Error()) - } - for _, publicProduct := range publicProducts { - if productNameParam == "" { - products = append(products, publicProduct) - productNamespaces.Insert(publicProduct.Namespace) - } else if publicProduct.ProductName == productNameParam { - products = append(products, publicProduct) - productNamespaces.Insert(publicProduct.Namespace) - } - } - - productNameMap, err = poetryCtl.GetUserProject(userID, log) - if err != nil { - log.Errorf("Collection.Product.List GetUserProject error: %v", err) - return resp, e.ErrListProducts.AddDesc(err.Error()) - } - for productName, roleIDs := range productNameMap { - //用户关联角色所关联的环境 - for _, roleID := range roleIDs { - if roleID == setting.RoleOwnerID { - tmpProducts, err := commonrepo.NewProductColl().List(&commonrepo.ProductListOptions{Name: productName}) - if err != nil { - log.Errorf("Collection.Product.List Find product error: %v", err) - return resp, e.ErrListProducts.AddDesc(err.Error()) - } - for _, product := range tmpProducts { - if productNameParam == "" { - if !productNamespaces.Has(product.Namespace) { - products = append(products, product) - } - } else if product.ProductName == productNameParam { - if !productNamespaces.Has(product.Namespace) { - products = append(products, product) - } - } - } - } else { - productMap := make(map[string]int) - // 先列出环境-用户授权 - userEnvPermissionList, err := poetryCtl.GetUserEnvPermission(userID, log) - if err != nil { - log.Errorf("failed to get user env permission, err: %v", err) - return resp, err - } - for _, userEnvPermission := range userEnvPermissionList { - product, err := commonrepo.NewProductColl().Find(&commonrepo.ProductFindOptions{Name: productName, EnvName: userEnvPermission.EnvName}) - if err != nil { - log.Errorf("Collection.Product.List Find product error: %v", err) - continue - } - if productNameParam == "" { - if !productNamespaces.Has(product.Namespace) && userEnvPermission.PermissionUUID == permission.TestEnvListUUID { - products = append(products, product) - productNamespaces = productNamespaces.Insert(product.Namespace) - productMap[product.EnvName] = 1 - } - } else if product.ProductName == productNameParam { - if !productNamespaces.Has(product.Namespace) && userEnvPermission.PermissionUUID == permission.TestEnvManageUUID { - products = append(products, product) - productNamespaces = productNamespaces.Insert(product.Namespace) - productMap[product.EnvName] = 1 - } - } - } - // 再获取环境-角色授权 - roleEnvPermissions, err := poetryCtl.ListEnvRolePermission(productName, "", roleID, log) - if err != nil { - log.Errorf("Collection.Product.List ListRoleEnvs error: %v", err) - return resp, e.ErrListProducts.AddDesc(err.Error()) - } - for _, roleEnvPermission := range roleEnvPermissions { - product, err := commonrepo.NewProductColl().Find(&commonrepo.ProductFindOptions{Name: productName, EnvName: roleEnvPermission.EnvName}) - if err != nil { - log.Errorf("Collection.Product.List Find product error: %v", err) - continue - } - if productNameParam == "" { - if !productNamespaces.Has(product.Namespace) && roleEnvPermission.PermissionUUID == permission.TestEnvListUUID { - products = append(products, product) - productNamespaces.Insert(product.Namespace) - } - } else if product.ProductName == productNameParam { - if !productNamespaces.Has(product.Namespace) && roleEnvPermission.PermissionUUID == permission.TestEnvManageUUID { - products = append(products, product) - productNamespaces.Insert(product.Namespace) - } - } - } - } - } - } - } - - err = FillProductVars(products, log) - if err != nil { - return resp, err - } - - for _, prod := range products { - product := &ProductResp{ - ID: prod.ID.Hex(), - ProductName: prod.ProductName, - EnvName: prod.EnvName, - Namespace: prod.Namespace, - Vars: prod.Vars[:], - IsPublic: prod.IsPublic, - ClusterID: prod.ClusterID, - UpdateTime: prod.UpdateTime, - UpdateBy: prod.UpdateBy, - RecycleDay: prod.RecycleDay, - Render: prod.Render, - Source: prod.Source, - } - - if prod.ClusterID != "" { - cluster, _ := commonrepo.NewK8SClusterColl().Get(prod.ClusterID) - if cluster != nil && cluster.Production { - product.IsProd = true - operatorPerm := poetryCtl.HasOperatePermission(prod.ProductName, permission.ProdEnvManageUUID, userID, superUser, log) - viewPerm := poetryCtl.HasOperatePermission(prod.ProductName, permission.ProdEnvListUUID, userID, superUser, log) - if envType == "" && (operatorPerm || viewPerm) { - prodResp = append(prodResp, product) - } else if envType == setting.ProdENV { - prodResp = append(prodResp, product) - } - } else if cluster != nil && !cluster.Production { - product.IsProd = false - testResp = append(testResp, product) - } - } else { - product.IsProd = false - testResp = append(testResp, product) - } - } - switch envType { - case setting.ProdENV: - resp = append(resp, prodResp...) - case setting.TestENV: - resp = append(resp, testResp...) - default: - resp = append(resp, prodResp...) - resp = append(resp, testResp...) - } - - sort.SliceStable(resp, func(i, j int) bool { return resp[i].ProductName < resp[j].ProductName }) - - return resp, nil -} - type ListProductsRespV2 struct { ClusterName string `json:"clusterName"` Production bool `json:"production"` @@ -369,170 +193,6 @@ type ListProductsRespV2 struct { Source string `json:"source"` } -// Args: projectName, which is formerly known as productName, is the primary key of the project in our system -func ListProductsV2(projectName, envFilter string, userName string, userID int, superUser bool, log *zap.SugaredLogger) ([]*ListProductsRespV2, error) { - var ( - err error - testResp []*ListProductsRespV2 - prodResp []*ListProductsRespV2 - products = make([]*commonmodels.Product, 0) - productNameMap map[string][]int64 - productNamespaces = sets.NewString() - ) - ret := make([]*ListProductsRespV2, 0) - - poetryCtl := poetry.New(config.PoetryAPIServer(), config.PoetryAPIRootKey()) - - // 获取所有产品 - if superUser { - products, err = commonrepo.NewProductColl().List(&commonrepo.ProductListOptions{Name: projectName}) - if err != nil { - log.Errorf("[%s] Collections.Product.List error: %v", userName, err) - return ret, e.ErrListEnvs.AddDesc(err.Error()) - } - } else { - //项目下所有公开环境 - publicProducts, err := commonrepo.NewProductColl().List(&commonrepo.ProductListOptions{IsPublic: true}) - if err != nil { - log.Errorf("Collection.Product.List List product error: %v", err) - return ret, e.ErrListProducts.AddDesc(err.Error()) - } - for _, publicProduct := range publicProducts { - if projectName == "" { - products = append(products, publicProduct) - productNamespaces.Insert(publicProduct.Namespace) - } else if publicProduct.ProductName == projectName { - products = append(products, publicProduct) - productNamespaces.Insert(publicProduct.Namespace) - } - } - - productNameMap, err = poetryCtl.GetUserProject(userID, log) - if err != nil { - log.Errorf("Collection.Product.List GetUserProject error: %v", err) - return ret, e.ErrListProducts.AddDesc(err.Error()) - } - for productName, roleIDs := range productNameMap { - //用户关联角色所关联的环境 - for _, roleID := range roleIDs { - if roleID == setting.RoleOwnerID { - tmpProducts, err := commonrepo.NewProductColl().List(&commonrepo.ProductListOptions{Name: productName}) - if err != nil { - log.Errorf("Collection.Product.List Find product error: %v", err) - return ret, e.ErrListProducts.AddDesc(err.Error()) - } - for _, product := range tmpProducts { - if projectName == "" { - if !productNamespaces.Has(product.Namespace) { - products = append(products, product) - } - } else if product.ProductName == projectName { - if !productNamespaces.Has(product.Namespace) { - products = append(products, product) - } - } - } - } else { - productMap := make(map[string]int) - // 先列出环境-用户授权 - userEnvPermissionList, err := poetryCtl.GetUserEnvPermission(userID, log) - if err != nil { - log.Errorf("failed to get user env permission, err: %v", err) - return ret, err - } - for _, userEnvPermission := range userEnvPermissionList { - product, err := commonrepo.NewProductColl().Find(&commonrepo.ProductFindOptions{Name: productName, EnvName: userEnvPermission.EnvName}) - if err != nil { - log.Errorf("Collection.Product.List Find product error: %v", err) - continue - } - if projectName == "" { - if !productNamespaces.Has(product.Namespace) && userEnvPermission.PermissionUUID == permission.TestEnvListUUID { - products = append(products, product) - productNamespaces = productNamespaces.Insert(product.Namespace) - productMap[product.EnvName] = 1 - } - } else if product.ProductName == projectName { - if !productNamespaces.Has(product.Namespace) && userEnvPermission.PermissionUUID == permission.TestEnvManageUUID { - products = append(products, product) - productNamespaces = productNamespaces.Insert(product.Namespace) - productMap[product.EnvName] = 1 - } - } - } - // 再获取环境-角色授权 - roleEnvPermissions, err := poetryCtl.ListEnvRolePermission(productName, "", roleID, log) - if err != nil { - log.Errorf("Collection.Product.List ListRoleEnvs error: %v", err) - return ret, e.ErrListProducts.AddDesc(err.Error()) - } - for _, roleEnvPermission := range roleEnvPermissions { - product, err := commonrepo.NewProductColl().Find(&commonrepo.ProductFindOptions{Name: productName, EnvName: roleEnvPermission.EnvName}) - if err != nil { - log.Errorf("Collection.Product.List Find product error: %v", err) - continue - } - if projectName == "" { - if !productNamespaces.Has(product.Namespace) && roleEnvPermission.PermissionUUID == permission.TestEnvListUUID { - products = append(products, product) - productNamespaces.Insert(product.Namespace) - } - } else if product.ProductName == projectName { - if !productNamespaces.Has(product.Namespace) && roleEnvPermission.PermissionUUID == permission.TestEnvManageUUID { - products = append(products, product) - productNamespaces.Insert(product.Namespace) - } - } - } - } - } - } - } - - for _, product := range products { - item := &ListProductsRespV2{ - Name: product.EnvName, - ProjectName: product.ProductName, - Source: product.Source, - } - if product.ClusterID != "" { - cluster, _ := commonrepo.NewK8SClusterColl().Get(product.ClusterID) - if cluster != nil && cluster.Production { - item.Production = true - item.ClusterName = cluster.Name - operatorPerm := poetryCtl.HasOperatePermission(product.ProductName, permission.ProdEnvManageUUID, userID, superUser, log) - viewPerm := poetryCtl.HasOperatePermission(product.ProductName, permission.ProdEnvListUUID, userID, superUser, log) - if envFilter == "" && (operatorPerm || viewPerm) { - prodResp = append(prodResp, item) - } else if envFilter == setting.ProdENV { - prodResp = append(prodResp, item) - } - } else if cluster != nil && !cluster.Production { - item.Production = false - item.ClusterName = cluster.Name - testResp = append(testResp, item) - } - } else { - item.Production = false - testResp = append(testResp, item) - } - } - - switch envFilter { - case setting.ProdENV: - ret = append(ret, prodResp...) - case setting.TestENV: - ret = append(ret, testResp...) - default: - ret = append(ret, prodResp...) - ret = append(ret, testResp...) - } - - sort.SliceStable(ret, func(i, j int) bool { return ret[i].ProjectName < ret[j].ProjectName }) - - return ret, nil -} - func FillProductVars(products []*commonmodels.Product, log *zap.SugaredLogger) error { for _, product := range products { if product.Source == setting.SourceFromExternal || product.Source == setting.SourceFromHelm { diff --git a/pkg/microservice/picket/core/filter/service/env.go b/pkg/microservice/picket/core/filter/service/env.go index ca1dce32d..47c35999a 100644 --- a/pkg/microservice/picket/core/filter/service/env.go +++ b/pkg/microservice/picket/core/filter/service/env.go @@ -5,11 +5,10 @@ import ( "net/http" "net/url" - "github.com/koderover/zadig/pkg/microservice/picket/client/opa" - "go.uber.org/zap" "github.com/koderover/zadig/pkg/microservice/picket/client/aslan" + "github.com/koderover/zadig/pkg/microservice/picket/client/opa" ) func ListEnvs(header http.Header, qs url.Values, logger *zap.SugaredLogger) ([]byte, error) { -- Gitee From 31aa29b0295c94df0392c97112a35933b35347c2 Mon Sep 17 00:00:00 2001 From: mouuii Date: Mon, 18 Oct 2021 20:44:48 +0800 Subject: [PATCH 029/405] list env Signed-off-by: mouuii --- pkg/microservice/aslan/core/environment/handler/environment.go | 2 +- pkg/microservice/aslan/core/environment/handler/router.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/microservice/aslan/core/environment/handler/environment.go b/pkg/microservice/aslan/core/environment/handler/environment.go index 3557ab3cf..38b3a7082 100644 --- a/pkg/microservice/aslan/core/environment/handler/environment.go +++ b/pkg/microservice/aslan/core/environment/handler/environment.go @@ -52,7 +52,7 @@ type NamespaceResource struct { Ingresses []resource.Ingress `json:"ingresses"` } -func ListProductsV3(c *gin.Context) { +func ListProducts(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() projectName := c.Query("projectName") diff --git a/pkg/microservice/aslan/core/environment/handler/router.go b/pkg/microservice/aslan/core/environment/handler/router.go index 162038f51..b0056e6d9 100644 --- a/pkg/microservice/aslan/core/environment/handler/router.go +++ b/pkg/microservice/aslan/core/environment/handler/router.go @@ -94,7 +94,7 @@ func (*Router) Inject(router *gin.RouterGroup) { // --------------------------------------------------------------------------------------- environments := router.Group("environments") { - environments.GET("", ListProductsV3) + environments.GET("", ListProducts) environments.POST("/:productName/auto", gin2.IsHavePermission([]string{permission.TestEnvCreateUUID}, permission.ParamType), AutoCreateProduct) environments.PUT("/:productName/autoUpdate", gin2.IsHavePermission([]string{permission.TestEnvManageUUID, permission.ProdEnvManageUUID}, permission.ParamType), gin2.UpdateOperationLogStatus, AutoUpdateProduct) environments.POST("", gin2.StoreProductName, gin2.IsHavePermission([]string{permission.TestEnvCreateUUID, permission.ProdEnvCreateUUID}, permission.ContextKeyType), gin2.UpdateOperationLogStatus, CreateProduct) -- Gitee From 9ce13947cfb861c339d8f73dd5340ce5601de487 Mon Sep 17 00:00:00 2001 From: mouuii Date: Mon, 18 Oct 2021 21:12:03 +0800 Subject: [PATCH 030/405] remove resv2 Signed-off-by: mouuii --- .../aslan/core/environment/service/environment.go | 8 -------- 1 file changed, 8 deletions(-) diff --git a/pkg/microservice/aslan/core/environment/service/environment.go b/pkg/microservice/aslan/core/environment/service/environment.go index dbcbcd175..ee898dcc0 100644 --- a/pkg/microservice/aslan/core/environment/service/environment.go +++ b/pkg/microservice/aslan/core/environment/service/environment.go @@ -185,14 +185,6 @@ func ListProducts(productNameParam string, userName string, log *zap.SugaredLogg return nil, nil } -type ListProductsRespV2 struct { - ClusterName string `json:"clusterName"` - Production bool `json:"production"` - Name string `json:"name"` - ProjectName string `json:"projectName"` - Source string `json:"source"` -} - func FillProductVars(products []*commonmodels.Product, log *zap.SugaredLogger) error { for _, product := range products { if product.Source == setting.SourceFromExternal || product.Source == setting.SourceFromHelm { -- Gitee From 252e1f26e1c46dd0fe4e91f60c076f7c2b138419 Mon Sep 17 00:00:00 2001 From: mouuii Date: Mon, 18 Oct 2021 21:20:15 +0800 Subject: [PATCH 031/405] delete env Signed-off-by: mouuii --- pkg/microservice/picket/client/aslan/env.go | 19 ------------------- .../picket/core/filter/handler/env.go | 15 --------------- .../picket/core/filter/handler/router.go | 4 ---- 3 files changed, 38 deletions(-) delete mode 100644 pkg/microservice/picket/client/aslan/env.go delete mode 100644 pkg/microservice/picket/core/filter/handler/env.go diff --git a/pkg/microservice/picket/client/aslan/env.go b/pkg/microservice/picket/client/aslan/env.go deleted file mode 100644 index 6927e4d3a..000000000 --- a/pkg/microservice/picket/client/aslan/env.go +++ /dev/null @@ -1,19 +0,0 @@ -package aslan - -import ( - "net/http" - "net/url" - - "github.com/koderover/zadig/pkg/tool/httpclient" -) - -func (c *Client) ListEnvs(header http.Header, qs url.Values) ([]byte, error) { - url := "/environment/environments" - - res, err := c.Get(url, httpclient.SetHeadersFromHTTPHeader(header), httpclient.SetQueryParamsFromValues(qs)) - if err != nil { - return nil, err - } - - return res.Body(), nil -} diff --git a/pkg/microservice/picket/core/filter/handler/env.go b/pkg/microservice/picket/core/filter/handler/env.go deleted file mode 100644 index d650b2ecc..000000000 --- a/pkg/microservice/picket/core/filter/handler/env.go +++ /dev/null @@ -1,15 +0,0 @@ -package handler - -import ( - "github.com/gin-gonic/gin" - - "github.com/koderover/zadig/pkg/microservice/picket/core/filter/service" - internalhandler "github.com/koderover/zadig/pkg/shared/handler" -) - -func ListEnvs(c *gin.Context) { - ctx := internalhandler.NewContext(c) - defer func() { internalhandler.JSONResponse(c, ctx) }() - - ctx.Resp, ctx.Err = service.ListEnvs(c.Request.Header, c.Request.URL.Query(), ctx.Logger) -} diff --git a/pkg/microservice/picket/core/filter/handler/router.go b/pkg/microservice/picket/core/filter/handler/router.go index 51ca67c76..9e8aea853 100644 --- a/pkg/microservice/picket/core/filter/handler/router.go +++ b/pkg/microservice/picket/core/filter/handler/router.go @@ -31,8 +31,4 @@ func (*Router) Inject(router *gin.RouterGroup) { { workflows.GET("testName/:testName", ListTestWorkflows) } - envs := router.Group("environments") - { - envs.GET("", ListEnvs) - } } -- Gitee From 64a1b0cc0f1789479c9a313598d9248d078ced63 Mon Sep 17 00:00:00 2001 From: mouuii Date: Mon, 18 Oct 2021 21:21:04 +0800 Subject: [PATCH 032/405] delete env Signed-off-by: mouuii --- .../picket/core/filter/service/env.go | 45 ------------------- 1 file changed, 45 deletions(-) delete mode 100644 pkg/microservice/picket/core/filter/service/env.go diff --git a/pkg/microservice/picket/core/filter/service/env.go b/pkg/microservice/picket/core/filter/service/env.go deleted file mode 100644 index 47c35999a..000000000 --- a/pkg/microservice/picket/core/filter/service/env.go +++ /dev/null @@ -1,45 +0,0 @@ -package service - -import ( - "errors" - "net/http" - "net/url" - - "go.uber.org/zap" - - "github.com/koderover/zadig/pkg/microservice/picket/client/aslan" - "github.com/koderover/zadig/pkg/microservice/picket/client/opa" -) - -func ListEnvs(header http.Header, qs url.Values, logger *zap.SugaredLogger) ([]byte, error) { - allow, err := opaAllowEnvList(header, logger) - if err != nil { - logger.Errorf("Failed to get allowed project names, err: %s", err) - return nil, err - } - if !allow { - return nil, errors.New("have no list env permission") - } - aslanClient := aslan.New() - - return aslanClient.ListEnvs(header, qs) -} - -func opaAllowEnvList(headers http.Header, logger *zap.SugaredLogger) (bool, error) { - res := &opaAllowResp{} - - opaClient := opa.NewDefault() - err := opaClient.Evaluate("rbac.allow", res, func() (*opa.Input, error) { - return generateOPAInput(headers, "GET", "api/aslan/environment/enviromments"), nil - }) - if err != nil { - logger.Errorf("opa evaluation failed, err: %s", err) - return false, err - } - - return res.Result, nil -} - -type opaAllowResp struct { - Result bool `json:"result"` -} -- Gitee From 802dc08df786ad089cb9a9bc292805b385c7a844 Mon Sep 17 00:00:00 2001 From: mouuii Date: Mon, 18 Oct 2021 21:43:49 +0800 Subject: [PATCH 033/405] delete env Signed-off-by: mouuii --- .../aslan/core/project/service/product.go | 12 ++++++++++++ pkg/shared/client/policy/policy.go | 13 +++++++++++++ 2 files changed, 25 insertions(+) diff --git a/pkg/microservice/aslan/core/project/service/product.go b/pkg/microservice/aslan/core/project/service/product.go index 40fca5d97..73819973d 100644 --- a/pkg/microservice/aslan/core/project/service/product.go +++ b/pkg/microservice/aslan/core/project/service/product.go @@ -37,6 +37,7 @@ import ( environmentservice "github.com/koderover/zadig/pkg/microservice/aslan/core/environment/service" workflowservice "github.com/koderover/zadig/pkg/microservice/aslan/core/workflow/service/workflow" "github.com/koderover/zadig/pkg/setting" + "github.com/koderover/zadig/pkg/shared/client/policy" "github.com/koderover/zadig/pkg/shared/poetry" e "github.com/koderover/zadig/pkg/tool/errors" "github.com/koderover/zadig/pkg/tool/log" @@ -330,6 +331,17 @@ func DeleteProductTemplate(userName, productName, requestID string, log *zap.Sug func ForkProduct(userID int, username, requestID string, args *template.ForkProject, log *zap.SugaredLogger) error { + policyClient := policy.New() + err := policyClient.RoleBinding(args.ProductName, policy.RoleBinding{ + Name: args.ProductName, + User: username, + Role: "Contributor", + Global: true, + }) + if err != nil { + log.Error("rolebinding error") + return e.ErrForkProduct + } prodTmpl, err := templaterepo.NewProductColl().Find(args.ProductName) if err != nil { errMsg := fmt.Sprintf("[ProductTmpl.Find] %s error: %v", args.ProductName, err) diff --git a/pkg/shared/client/policy/policy.go b/pkg/shared/client/policy/policy.go index 3faba0b13..c868d905d 100644 --- a/pkg/shared/client/policy/policy.go +++ b/pkg/shared/client/policy/policy.go @@ -32,3 +32,16 @@ func (c *Client) CreateOrUpdatePolicy(p *Policy) error { return err } + +type RoleBinding struct { + Name string + User string + Role string + Global bool +} + +func (c *Client) RoleBinding(projectName string, roleBinding RoleBinding) error { + url := fmt.Sprintf("/rolebindings?projectName=%s", projectName) + _, err := c.Post(url, httpclient.SetBody(roleBinding)) + return err +} -- Gitee From 1c19fefe1b2e061dd2b91dd9fb2160ce6d0c3931 Mon Sep 17 00:00:00 2001 From: mouuii Date: Tue, 19 Oct 2021 09:55:38 +0800 Subject: [PATCH 034/405] fork product Signed-off-by: mouuii --- pkg/microservice/aslan/core/project/service/product.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/microservice/aslan/core/project/service/product.go b/pkg/microservice/aslan/core/project/service/product.go index 73819973d..f7bb69900 100644 --- a/pkg/microservice/aslan/core/project/service/product.go +++ b/pkg/microservice/aslan/core/project/service/product.go @@ -333,7 +333,7 @@ func ForkProduct(userID int, username, requestID string, args *template.ForkProj policyClient := policy.New() err := policyClient.RoleBinding(args.ProductName, policy.RoleBinding{ - Name: args.ProductName, + Name: fmt.Sprintf("%s-%s", args.ProductName, username), User: username, Role: "Contributor", Global: true, -- Gitee From 61f5f6ffe1f071edefae9b0dcdea404d456c98eb Mon Sep 17 00:00:00 2001 From: mouuii Date: Tue, 19 Oct 2021 10:11:45 +0800 Subject: [PATCH 035/405] fork product Signed-off-by: mouuii --- .../aslan/core/environment/service/environment.go | 2 +- pkg/microservice/aslan/core/project/service/product.go | 4 ++-- pkg/setting/consts.go | 6 ++++++ pkg/shared/client/policy/policy.go | 5 +++-- 4 files changed, 12 insertions(+), 5 deletions(-) diff --git a/pkg/microservice/aslan/core/environment/service/environment.go b/pkg/microservice/aslan/core/environment/service/environment.go index ee898dcc0..2af4b5390 100644 --- a/pkg/microservice/aslan/core/environment/service/environment.go +++ b/pkg/microservice/aslan/core/environment/service/environment.go @@ -182,7 +182,7 @@ func ListProducts(productNameParam string, userName string, log *zap.SugaredLogg resp = append(resp, product) } sort.SliceStable(resp, func(i, j int) bool { return resp[i].ProductName < resp[j].ProductName }) - return nil, nil + return resp, nil } func FillProductVars(products []*commonmodels.Product, log *zap.SugaredLogger) error { diff --git a/pkg/microservice/aslan/core/project/service/product.go b/pkg/microservice/aslan/core/project/service/product.go index f7bb69900..cae442034 100644 --- a/pkg/microservice/aslan/core/project/service/product.go +++ b/pkg/microservice/aslan/core/project/service/product.go @@ -332,10 +332,10 @@ func DeleteProductTemplate(userName, productName, requestID string, log *zap.Sug func ForkProduct(userID int, username, requestID string, args *template.ForkProject, log *zap.SugaredLogger) error { policyClient := policy.New() - err := policyClient.RoleBinding(args.ProductName, policy.RoleBinding{ + err := policyClient.CreateRoleBinding(args.ProductName, &policy.RoleBinding{ Name: fmt.Sprintf("%s-%s", args.ProductName, username), User: username, - Role: "Contributor", + Role: setting.Contributor, Global: true, }) if err != nil { diff --git a/pkg/setting/consts.go b/pkg/setting/consts.go index 95ca280b3..0dfa6e852 100644 --- a/pkg/setting/consts.go +++ b/pkg/setting/consts.go @@ -484,3 +484,9 @@ const ( ) const ChartTemplatesPath = "charts" + +type RoleType string + +const ( + Contributor RoleType = "Contributor" +) diff --git a/pkg/shared/client/policy/policy.go b/pkg/shared/client/policy/policy.go index c868d905d..0a89b0ed5 100644 --- a/pkg/shared/client/policy/policy.go +++ b/pkg/shared/client/policy/policy.go @@ -3,6 +3,7 @@ package policy import ( "fmt" + "github.com/koderover/zadig/pkg/setting" "github.com/koderover/zadig/pkg/tool/httpclient" ) @@ -36,11 +37,11 @@ func (c *Client) CreateOrUpdatePolicy(p *Policy) error { type RoleBinding struct { Name string User string - Role string + Role setting.RoleType Global bool } -func (c *Client) RoleBinding(projectName string, roleBinding RoleBinding) error { +func (c *Client) CreateRoleBinding(projectName string, roleBinding *RoleBinding) error { url := fmt.Sprintf("/rolebindings?projectName=%s", projectName) _, err := c.Post(url, httpclient.SetBody(roleBinding)) return err -- Gitee From 736d83f1258d89ebc81a53f76669181d6f701733 Mon Sep 17 00:00:00 2001 From: mouuii Date: Tue, 19 Oct 2021 10:19:02 +0800 Subject: [PATCH 036/405] fork product Signed-off-by: mouuii --- .../aslan/core/project/service/product.go | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/pkg/microservice/aslan/core/project/service/product.go b/pkg/microservice/aslan/core/project/service/product.go index cae442034..fa322b7c9 100644 --- a/pkg/microservice/aslan/core/project/service/product.go +++ b/pkg/microservice/aslan/core/project/service/product.go @@ -331,17 +331,6 @@ func DeleteProductTemplate(userName, productName, requestID string, log *zap.Sug func ForkProduct(userID int, username, requestID string, args *template.ForkProject, log *zap.SugaredLogger) error { - policyClient := policy.New() - err := policyClient.CreateRoleBinding(args.ProductName, &policy.RoleBinding{ - Name: fmt.Sprintf("%s-%s", args.ProductName, username), - User: username, - Role: setting.Contributor, - Global: true, - }) - if err != nil { - log.Error("rolebinding error") - return e.ErrForkProduct - } prodTmpl, err := templaterepo.NewProductColl().Find(args.ProductName) if err != nil { errMsg := fmt.Sprintf("[ProductTmpl.Find] %s error: %v", args.ProductName, err) @@ -453,6 +442,17 @@ func ForkProduct(userID int, username, requestID string, args *template.ForkProj CreateBy: username, UpdateBy: username, } + policyClient := policy.New() + err = policyClient.CreateRoleBinding(args.ProductName, &policy.RoleBinding{ + Name: fmt.Sprintf("%s-%s", args.ProductName, username), + User: username, + Role: setting.Contributor, + Global: true, + }) + if err != nil { + log.Error("rolebinding error") + return e.ErrForkProduct + } return workflowservice.CreateWorkflow(workflowArgs, log) } -- Gitee From 4808d0c6610df4005c2ed7b5cdd0f013da18d3a0 Mon Sep 17 00:00:00 2001 From: mouuii Date: Tue, 19 Oct 2021 10:31:23 +0800 Subject: [PATCH 037/405] fork product Signed-off-by: mouuii --- .../core/common/repository/mongodb/product.go | 24 +++++++++++-------- .../core/common/service/template_product.go | 2 +- .../core/environment/service/environment.go | 4 +--- 3 files changed, 16 insertions(+), 14 deletions(-) diff --git a/pkg/microservice/aslan/core/common/repository/mongodb/product.go b/pkg/microservice/aslan/core/common/repository/mongodb/product.go index a71f42431..3611104dd 100644 --- a/pkg/microservice/aslan/core/common/repository/mongodb/product.go +++ b/pkg/microservice/aslan/core/common/repository/mongodb/product.go @@ -39,15 +39,16 @@ type ProductFindOptions struct { // ClusterId is a primitive.ObjectID{}.Hex() type ProductListOptions struct { - EnvName string - Name string - IsPublic bool - ClusterID string - IsSort bool - ExcludeStatus string - ExcludeSource string - Source string - InProjects []string + EnvName string + Name string + IsPublic bool + ClusterID string + IsSortByUpdateTime bool + IsSortByProductName bool + ExcludeStatus string + ExcludeSource string + Source string + InProjects []string } type projectEnvs struct { @@ -164,9 +165,12 @@ func (c *ProductColl) List(opt *ProductListOptions) ([]*models.Product, error) { ctx := context.Background() opts := options.Find() - if opt.IsSort { + if opt.IsSortByUpdateTime { opts.SetSort(bson.D{{"update_time", -1}}) } + if opt.IsSortByProductName { + opts.SetSort(bson.D{{"product_name", 1}}) + } cursor, err := c.Collection.Find(ctx, query, opts) if err != nil { return nil, err diff --git a/pkg/microservice/aslan/core/common/service/template_product.go b/pkg/microservice/aslan/core/common/service/template_product.go index 94dd0dc59..2523538f2 100644 --- a/pkg/microservice/aslan/core/common/service/template_product.go +++ b/pkg/microservice/aslan/core/common/service/template_product.go @@ -101,7 +101,7 @@ func GetProductTemplate(productName string, log *zap.SugaredLogger) (*template.P return resp, fmt.Errorf("Testing.List err : %v", err) } - totalEnvs, err := commonrepo.NewProductColl().List(&commonrepo.ProductListOptions{Name: productName, IsSort: true}) + totalEnvs, err := commonrepo.NewProductColl().List(&commonrepo.ProductListOptions{Name: productName, IsSortByUpdateTime: true}) if err != nil { return resp, fmt.Errorf("Product.List err : %v", err) } diff --git a/pkg/microservice/aslan/core/environment/service/environment.go b/pkg/microservice/aslan/core/environment/service/environment.go index 2af4b5390..30c25cc60 100644 --- a/pkg/microservice/aslan/core/environment/service/environment.go +++ b/pkg/microservice/aslan/core/environment/service/environment.go @@ -22,7 +22,6 @@ import ( "fmt" "path/filepath" "regexp" - "sort" "strings" "sync" "time" @@ -148,7 +147,7 @@ func UpdateProductPublic(productName string, args *ProductParams, log *zap.Sugar } func ListProducts(productNameParam string, userName string, log *zap.SugaredLogger) (resp []*ProductResp, err error) { - products, err := commonrepo.NewProductColl().List(&commonrepo.ProductListOptions{Name: productNameParam}) + products, err := commonrepo.NewProductColl().List(&commonrepo.ProductListOptions{Name: productNameParam, IsSortByProductName: true}) if err != nil { log.Errorf("[%s] Collections.Product.List error: %v", userName, err) return resp, e.ErrListEnvs.AddDesc(err.Error()) @@ -181,7 +180,6 @@ func ListProducts(productNameParam string, userName string, log *zap.SugaredLogg } resp = append(resp, product) } - sort.SliceStable(resp, func(i, j int) bool { return resp[i].ProductName < resp[j].ProductName }) return resp, nil } -- Gitee From f6e7126bfef5fe4c4abfb28c6d9c413ee8c296b0 Mon Sep 17 00:00:00 2001 From: mouuii Date: Tue, 19 Oct 2021 14:47:47 +0800 Subject: [PATCH 038/405] patch service Signed-off-by: mouuii --- .../repository/mongodb/template/product.go | 20 ++++++++++++++++ .../aslan/core/project/handler/product.go | 24 +++++++++++++++++++ .../aslan/core/project/handler/router.go | 1 + .../aslan/core/project/service/product.go | 8 +++++++ 4 files changed, 53 insertions(+) diff --git a/pkg/microservice/aslan/core/common/repository/mongodb/template/product.go b/pkg/microservice/aslan/core/common/repository/mongodb/template/product.go index 948f4283f..e45dde4b5 100644 --- a/pkg/microservice/aslan/core/common/repository/mongodb/template/product.go +++ b/pkg/microservice/aslan/core/common/repository/mongodb/template/product.go @@ -209,6 +209,26 @@ func (c *ProductColl) Create(args *template.Product) error { return err } +// Update UpdateChoreographyService +func (c *ProductColl) UpdateChoreographyService(productName string, args *template.Product) error { + // avoid panic issue + if args == nil { + return errors.New("nil ProductTmpl") + } + + args.ProjectName = strings.TrimSpace(args.ProjectName) + + query := bson.M{"product_name": productName} + change := bson.M{"$set": bson.M{ + "services": args.Services, + "update_time": time.Now().Unix(), + "update_by": args.UpdateBy, + }} + + _, err := c.UpdateOne(context.TODO(), query, change) + return err +} + // Update existing ProductTmpl func (c *ProductColl) Update(productName string, args *template.Product) error { // avoid panic issue diff --git a/pkg/microservice/aslan/core/project/handler/product.go b/pkg/microservice/aslan/core/project/handler/product.go index ddd8ee3b5..b91b2a4f2 100644 --- a/pkg/microservice/aslan/core/project/handler/product.go +++ b/pkg/microservice/aslan/core/project/handler/product.go @@ -133,6 +133,30 @@ func UpdateProject(c *gin.Context) { ctx.Err = projectservice.UpdateProject(productName, args, ctx.Logger) } +func UpdateChoreographyService(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + + args := new(template.Product) + data, err := c.GetRawData() + if err != nil { + log.Errorf("UpdateChoreographyService c.GetRawData() err : %v", err) + } + if err = json.Unmarshal(data, args); err != nil { + log.Errorf("UpdateChoreographyService json.Unmarshal err : %v", err) + } + internalhandler.InsertOperationLog(c, ctx.Username, args.ProductName, "更新", "项目管理-项目服务编排", args.ProductName, string(data), ctx.Logger) + c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(data)) + + if err := c.BindJSON(args); err != nil { + ctx.Err = e.ErrInvalidParam.AddDesc("invalid ProductTmpl json args") + return + } + + args.UpdateBy = ctx.Username + ctx.Err = projectservice.UpdateChoreographyService(c.Param("name"), args, ctx.Logger) +} + func DeleteProductTemplate(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() diff --git a/pkg/microservice/aslan/core/project/handler/router.go b/pkg/microservice/aslan/core/project/handler/router.go index f1d907123..c1badd254 100644 --- a/pkg/microservice/aslan/core/project/handler/router.go +++ b/pkg/microservice/aslan/core/project/handler/router.go @@ -47,6 +47,7 @@ func (*Router) Inject(router *gin.RouterGroup) { product.PUT("/:name/:status", gin2.IsHavePermission([]string{permission.ServiceTemplateEditUUID}, permission.ParamType), gin2.UpdateOperationLogStatus, UpdateProductTmplStatus) product.PUT("", gin2.StoreProductName, gin2.IsHavePermission([]string{permission.SuperUserUUID}, permission.ContextKeyType), gin2.UpdateOperationLogStatus, UpdateProject) product.DELETE("/:name", gin2.IsHavePermission([]string{permission.SuperUserUUID}, permission.ParamType), gin2.UpdateOperationLogStatus, DeleteProductTemplate) + product.PATCH("/:name", UpdateChoreographyService) } openSource := router.Group("opensource") diff --git a/pkg/microservice/aslan/core/project/service/product.go b/pkg/microservice/aslan/core/project/service/product.go index fa322b7c9..22bc82324 100644 --- a/pkg/microservice/aslan/core/project/service/product.go +++ b/pkg/microservice/aslan/core/project/service/product.go @@ -126,6 +126,14 @@ func CreateProductTemplate(args *template.Product, log *zap.SugaredLogger) (err return } +func UpdateChoreographyService(name string, args *template.Product, log *zap.SugaredLogger) (err error) { + if err = templaterepo.NewProductColl().UpdateChoreographyService(name, args); err != nil { + log.Errorf("UpdateChoreographyService error: %v", err) + return e.ErrUpdateProduct + } + return nil +} + // UpdateProductTemplate 更新产品模板 func UpdateProductTemplate(name string, args *template.Product, log *zap.SugaredLogger) (err error) { kvs := args.Vars -- Gitee From 1162bf8396d8b61a2745c2663df2bcca9ea90239 Mon Sep 17 00:00:00 2001 From: mouuii Date: Tue, 19 Oct 2021 15:17:26 +0800 Subject: [PATCH 039/405] patch service Signed-off-by: mouuii --- .../repository/mongodb/template/product.go | 12 +++------ .../aslan/core/project/handler/product.go | 26 +++++++++---------- .../aslan/core/project/handler/router.go | 2 +- .../aslan/core/project/service/product.go | 4 +-- 4 files changed, 19 insertions(+), 25 deletions(-) diff --git a/pkg/microservice/aslan/core/common/repository/mongodb/template/product.go b/pkg/microservice/aslan/core/common/repository/mongodb/template/product.go index e45dde4b5..c9db30fda 100644 --- a/pkg/microservice/aslan/core/common/repository/mongodb/template/product.go +++ b/pkg/microservice/aslan/core/common/repository/mongodb/template/product.go @@ -210,19 +210,13 @@ func (c *ProductColl) Create(args *template.Product) error { } // Update UpdateChoreographyService -func (c *ProductColl) UpdateChoreographyService(productName string, args *template.Product) error { - // avoid panic issue - if args == nil { - return errors.New("nil ProductTmpl") - } - - args.ProjectName = strings.TrimSpace(args.ProjectName) +func (c *ProductColl) UpdateOrchestrationService(productName string, services [][]string, updateBy string) error { query := bson.M{"product_name": productName} change := bson.M{"$set": bson.M{ - "services": args.Services, + "services": services, "update_time": time.Now().Unix(), - "update_by": args.UpdateBy, + "update_by": updateBy, }} _, err := c.UpdateOne(context.TODO(), query, change) diff --git a/pkg/microservice/aslan/core/project/handler/product.go b/pkg/microservice/aslan/core/project/handler/product.go index b91b2a4f2..49fcdf8a8 100644 --- a/pkg/microservice/aslan/core/project/handler/product.go +++ b/pkg/microservice/aslan/core/project/handler/product.go @@ -133,28 +133,28 @@ func UpdateProject(c *gin.Context) { ctx.Err = projectservice.UpdateProject(productName, args, ctx.Logger) } -func UpdateChoreographyService(c *gin.Context) { +type UpdateOrchestrationServiceReq struct { + Services [][]string `json:"services"` +} + +func UpdateOrchestrationService(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - args := new(template.Product) - data, err := c.GetRawData() - if err != nil { - log.Errorf("UpdateChoreographyService c.GetRawData() err : %v", err) - } - if err = json.Unmarshal(data, args); err != nil { - log.Errorf("UpdateChoreographyService json.Unmarshal err : %v", err) + projectName := c.Param("name") + if projectName == "" { + ctx.Err = e.ErrInvalidParam + return } - internalhandler.InsertOperationLog(c, ctx.Username, args.ProductName, "更新", "项目管理-项目服务编排", args.ProductName, string(data), ctx.Logger) - c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(data)) + internalhandler.InsertOperationLog(c, ctx.Username, projectName, "更新", "项目管理-项目服务编排", projectName, "", ctx.Logger) + args := new(UpdateOrchestrationServiceReq) if err := c.BindJSON(args); err != nil { - ctx.Err = e.ErrInvalidParam.AddDesc("invalid ProductTmpl json args") + ctx.Err = e.ErrInvalidParam.AddDesc("invalid UpdateOrchestrationServiceReq json args") return } - args.UpdateBy = ctx.Username - ctx.Err = projectservice.UpdateChoreographyService(c.Param("name"), args, ctx.Logger) + ctx.Err = projectservice.UpdateOrchestrationService(projectName, args.Services, ctx.Username, ctx.Logger) } func DeleteProductTemplate(c *gin.Context) { diff --git a/pkg/microservice/aslan/core/project/handler/router.go b/pkg/microservice/aslan/core/project/handler/router.go index c1badd254..fd57329e8 100644 --- a/pkg/microservice/aslan/core/project/handler/router.go +++ b/pkg/microservice/aslan/core/project/handler/router.go @@ -47,7 +47,7 @@ func (*Router) Inject(router *gin.RouterGroup) { product.PUT("/:name/:status", gin2.IsHavePermission([]string{permission.ServiceTemplateEditUUID}, permission.ParamType), gin2.UpdateOperationLogStatus, UpdateProductTmplStatus) product.PUT("", gin2.StoreProductName, gin2.IsHavePermission([]string{permission.SuperUserUUID}, permission.ContextKeyType), gin2.UpdateOperationLogStatus, UpdateProject) product.DELETE("/:name", gin2.IsHavePermission([]string{permission.SuperUserUUID}, permission.ParamType), gin2.UpdateOperationLogStatus, DeleteProductTemplate) - product.PATCH("/:name", UpdateChoreographyService) + product.PATCH("/:name", UpdateOrchestrationService) } openSource := router.Group("opensource") diff --git a/pkg/microservice/aslan/core/project/service/product.go b/pkg/microservice/aslan/core/project/service/product.go index 22bc82324..2eecdc710 100644 --- a/pkg/microservice/aslan/core/project/service/product.go +++ b/pkg/microservice/aslan/core/project/service/product.go @@ -126,8 +126,8 @@ func CreateProductTemplate(args *template.Product, log *zap.SugaredLogger) (err return } -func UpdateChoreographyService(name string, args *template.Product, log *zap.SugaredLogger) (err error) { - if err = templaterepo.NewProductColl().UpdateChoreographyService(name, args); err != nil { +func UpdateOrchestrationService(name string, services [][]string, updateBy string, log *zap.SugaredLogger) (err error) { + if err = templaterepo.NewProductColl().UpdateOrchestrationService(name, services, updateBy); err != nil { log.Errorf("UpdateChoreographyService error: %v", err) return e.ErrUpdateProduct } -- Gitee From 6baf7b23e8e5be57519010b343c29fb13e8d8192 Mon Sep 17 00:00:00 2001 From: mouuii Date: Tue, 19 Oct 2021 15:19:23 +0800 Subject: [PATCH 040/405] patch service Signed-off-by: mouuii --- .../aslan/core/common/repository/mongodb/template/product.go | 1 - 1 file changed, 1 deletion(-) diff --git a/pkg/microservice/aslan/core/common/repository/mongodb/template/product.go b/pkg/microservice/aslan/core/common/repository/mongodb/template/product.go index c9db30fda..580f63f4e 100644 --- a/pkg/microservice/aslan/core/common/repository/mongodb/template/product.go +++ b/pkg/microservice/aslan/core/common/repository/mongodb/template/product.go @@ -209,7 +209,6 @@ func (c *ProductColl) Create(args *template.Product) error { return err } -// Update UpdateChoreographyService func (c *ProductColl) UpdateOrchestrationService(productName string, services [][]string, updateBy string) error { query := bson.M{"product_name": productName} -- Gitee From 7496ef7878d92dbc7fbed4d6749a892d19dcb692 Mon Sep 17 00:00:00 2001 From: mouuii Date: Tue, 19 Oct 2021 15:55:07 +0800 Subject: [PATCH 041/405] patch service Signed-off-by: mouuii --- .../aslan/core/common/repository/mongodb/template/product.go | 2 +- pkg/microservice/aslan/core/project/handler/product.go | 4 ++-- pkg/microservice/aslan/core/project/service/product.go | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pkg/microservice/aslan/core/common/repository/mongodb/template/product.go b/pkg/microservice/aslan/core/common/repository/mongodb/template/product.go index 580f63f4e..a533511f7 100644 --- a/pkg/microservice/aslan/core/common/repository/mongodb/template/product.go +++ b/pkg/microservice/aslan/core/common/repository/mongodb/template/product.go @@ -209,7 +209,7 @@ func (c *ProductColl) Create(args *template.Product) error { return err } -func (c *ProductColl) UpdateOrchestrationService(productName string, services [][]string, updateBy string) error { +func (c *ProductColl) UpdateServiceOrchestration(productName string, services [][]string, updateBy string) error { query := bson.M{"product_name": productName} change := bson.M{"$set": bson.M{ diff --git a/pkg/microservice/aslan/core/project/handler/product.go b/pkg/microservice/aslan/core/project/handler/product.go index 49fcdf8a8..1c11a0d1e 100644 --- a/pkg/microservice/aslan/core/project/handler/product.go +++ b/pkg/microservice/aslan/core/project/handler/product.go @@ -137,7 +137,7 @@ type UpdateOrchestrationServiceReq struct { Services [][]string `json:"services"` } -func UpdateOrchestrationService(c *gin.Context) { +func UpdateServiceOrchestration(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() @@ -154,7 +154,7 @@ func UpdateOrchestrationService(c *gin.Context) { return } - ctx.Err = projectservice.UpdateOrchestrationService(projectName, args.Services, ctx.Username, ctx.Logger) + ctx.Err = projectservice.UpdateServiceOrchestration(projectName, args.Services, ctx.Username, ctx.Logger) } func DeleteProductTemplate(c *gin.Context) { diff --git a/pkg/microservice/aslan/core/project/service/product.go b/pkg/microservice/aslan/core/project/service/product.go index 2eecdc710..4004cadf9 100644 --- a/pkg/microservice/aslan/core/project/service/product.go +++ b/pkg/microservice/aslan/core/project/service/product.go @@ -126,8 +126,8 @@ func CreateProductTemplate(args *template.Product, log *zap.SugaredLogger) (err return } -func UpdateOrchestrationService(name string, services [][]string, updateBy string, log *zap.SugaredLogger) (err error) { - if err = templaterepo.NewProductColl().UpdateOrchestrationService(name, services, updateBy); err != nil { +func UpdateServiceOrchestration(name string, services [][]string, updateBy string, log *zap.SugaredLogger) (err error) { + if err = templaterepo.NewProductColl().UpdateServiceOrchestration(name, services, updateBy); err != nil { log.Errorf("UpdateChoreographyService error: %v", err) return e.ErrUpdateProduct } -- Gitee From 1fe8bfa06683cc507b8b6b7d5f8a13bcf3501d8e Mon Sep 17 00:00:00 2001 From: lou Date: Tue, 19 Oct 2021 16:44:19 +0800 Subject: [PATCH 042/405] trivial Signed-off-by: lou --- pkg/microservice/policy/core/handler/router.go | 6 +++++- pkg/microservice/policy/core/service.go | 1 + 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/pkg/microservice/policy/core/handler/router.go b/pkg/microservice/policy/core/handler/router.go index 3fcd58a25..19769fd14 100644 --- a/pkg/microservice/policy/core/handler/router.go +++ b/pkg/microservice/policy/core/handler/router.go @@ -51,7 +51,11 @@ func (*Router) Inject(router *gin.RouterGroup) { policyRegistrations := router.Group("policies") { policyRegistrations.PUT("/:resourceName", CreateOrUpdatePolicyRegistration) - policyRegistrations.GET("", GetPolicyRegistrationDefinitions) + } + + policyDefinitions := router.Group("policy-definitions") + { + policyDefinitions.GET("", GetPolicyRegistrationDefinitions) } } diff --git a/pkg/microservice/policy/core/service.go b/pkg/microservice/policy/core/service.go index 4fc79dce8..3576ee08a 100644 --- a/pkg/microservice/policy/core/service.go +++ b/pkg/microservice/policy/core/service.go @@ -90,6 +90,7 @@ func initDatabase(ctx context.Context) { for _, r := range []indexer{ mongodb.NewRoleColl(), mongodb.NewRoleBindingColl(), + mongodb.NewPolicyColl(), } { wg.Add(1) go func(r indexer) { -- Gitee From 70fbb4cec89a953a88d3f6f28e6b85c17686f59e Mon Sep 17 00:00:00 2001 From: mouuii Date: Tue, 19 Oct 2021 16:54:06 +0800 Subject: [PATCH 043/405] patch service Signed-off-by: mouuii --- pkg/microservice/aslan/core/project/service/product.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/microservice/aslan/core/project/service/product.go b/pkg/microservice/aslan/core/project/service/product.go index 4004cadf9..8ee30f869 100644 --- a/pkg/microservice/aslan/core/project/service/product.go +++ b/pkg/microservice/aslan/core/project/service/product.go @@ -129,7 +129,7 @@ func CreateProductTemplate(args *template.Product, log *zap.SugaredLogger) (err func UpdateServiceOrchestration(name string, services [][]string, updateBy string, log *zap.SugaredLogger) (err error) { if err = templaterepo.NewProductColl().UpdateServiceOrchestration(name, services, updateBy); err != nil { log.Errorf("UpdateChoreographyService error: %v", err) - return e.ErrUpdateProduct + return e.ErrUpdateProduct.AddErr(err) } return nil } -- Gitee From 6b1f498b2c29bde32c2a410799ba515c492d2a7c Mon Sep 17 00:00:00 2001 From: mouuii Date: Tue, 19 Oct 2021 17:56:40 +0800 Subject: [PATCH 044/405] roles policy service Signed-off-by: mouuii --- pkg/microservice/policy/core/handler/role.go | 33 +++++++++++++++++++ .../policy/core/handler/router.go | 4 +++ .../policy/core/repository/mongodb/role.go | 17 ++++++++-- pkg/microservice/policy/core/service/role.go | 30 +++++++++++++++++ 4 files changed, 82 insertions(+), 2 deletions(-) diff --git a/pkg/microservice/policy/core/handler/role.go b/pkg/microservice/policy/core/handler/role.go index 25d513440..e96bdec7f 100644 --- a/pkg/microservice/policy/core/handler/role.go +++ b/pkg/microservice/policy/core/handler/role.go @@ -43,6 +43,19 @@ func CreateRole(c *gin.Context) { ctx.Err = service.CreateRole(projectName, args, ctx.Logger) } +func ListRole(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + + projectName := c.Query("projectName") + if projectName == "" { + ctx.Err = e.ErrInvalidParam.AddDesc("args projectName can't be empty") + return + } + ctx.Resp, ctx.Err = service.ListRole(projectName) + return +} + func CreateGlobalRole(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() @@ -55,3 +68,23 @@ func CreateGlobalRole(c *gin.Context) { ctx.Err = service.CreateRole("", args, ctx.Logger) } + +func ListGlobalRole(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + + ctx.Resp, ctx.Err = service.ListGlobalRole(ctx.Logger) + return +} + +func DeleteRole(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + name := c.Param("name") + if name == "" { + ctx.Err = e.ErrInvalidParam.AddDesc("args name can't be empty") + return + } + ctx.Err = service.DeleteGlobalRole(c.Param("name"), ctx.Logger) + return +} diff --git a/pkg/microservice/policy/core/handler/router.go b/pkg/microservice/policy/core/handler/router.go index 3fcd58a25..e49800d41 100644 --- a/pkg/microservice/policy/core/handler/router.go +++ b/pkg/microservice/policy/core/handler/router.go @@ -26,11 +26,15 @@ func (*Router) Inject(router *gin.RouterGroup) { roles := router.Group("roles") { roles.POST("", CreateRole) + roles.GET("", ListRole) + roles.DELETE("/:name", DeleteRole) } globalRoles := router.Group("global-roles") { globalRoles.POST("", CreateGlobalRole) + globalRoles.GET("", ListGlobalRole) + globalRoles.DELETE("/:name", DeleteRole) } roleBindings := router.Group("rolebindings") diff --git a/pkg/microservice/policy/core/repository/mongodb/role.go b/pkg/microservice/policy/core/repository/mongodb/role.go index da8595c9c..060d2c796 100644 --- a/pkg/microservice/policy/core/repository/mongodb/role.go +++ b/pkg/microservice/policy/core/repository/mongodb/role.go @@ -77,11 +77,18 @@ func (c *RoleColl) Get(ns, name string) (*models.Role, bool, error) { return res, true, nil } -func (c *RoleColl) List() ([]*models.Role, error) { +type ListOpt struct { + ProjectSpace string +} + +func (c *RoleColl) List(projectName string) ([]*models.Role, error) { var res []*models.Role ctx := context.Background() - cursor, err := c.Collection.Find(ctx, bson.M{}) + query := bson.M{} + query["namespace"] = projectName + + cursor, err := c.Collection.Find(ctx, query) if err != nil { return nil, err } @@ -103,3 +110,9 @@ func (c *RoleColl) Create(obj *models.Role) error { return err } + +func (c *RoleColl) Delete(name string) error { + query := bson.M{"name": name} + _, err := c.DeleteOne(context.TODO(), query) + return err +} diff --git a/pkg/microservice/policy/core/service/role.go b/pkg/microservice/policy/core/service/role.go index fb7b69ad0..e71ecf63c 100644 --- a/pkg/microservice/policy/core/service/role.go +++ b/pkg/microservice/policy/core/service/role.go @@ -48,3 +48,33 @@ func CreateRole(ns string, role *Role, _ *zap.SugaredLogger) error { return mongodb.NewRoleColl().Create(obj) } + +func ListRole(projectName string) (roles []*Role, err error) { + projectRoles, err := mongodb.NewRoleColl().List(projectName) + if err != nil { + return nil, err + } + for _, v := range projectRoles { + roles = append(roles, &Role{ + Name: v.Name, + }) + } + return roles, nil +} + +func ListGlobalRole(_ *zap.SugaredLogger) (roles []*Role, err error) { + globalRoles, err := mongodb.NewRoleColl().List("") + if err != nil { + return nil, err + } + for _, v := range globalRoles { + roles = append(roles, &Role{ + Name: v.Name, + }) + } + return roles, nil +} + +func DeleteGlobalRole(name string, _ *zap.SugaredLogger) (err error) { + return mongodb.NewRoleColl().Delete(name) +} -- Gitee From 091325f0ba70978ce1a33fcadedf6549728c13a9 Mon Sep 17 00:00:00 2001 From: mouuii Date: Tue, 19 Oct 2021 17:58:26 +0800 Subject: [PATCH 045/405] roles policy service Signed-off-by: mouuii --- pkg/microservice/policy/core/repository/mongodb/role.go | 4 ---- 1 file changed, 4 deletions(-) diff --git a/pkg/microservice/policy/core/repository/mongodb/role.go b/pkg/microservice/policy/core/repository/mongodb/role.go index 060d2c796..339acf2bb 100644 --- a/pkg/microservice/policy/core/repository/mongodb/role.go +++ b/pkg/microservice/policy/core/repository/mongodb/role.go @@ -77,10 +77,6 @@ func (c *RoleColl) Get(ns, name string) (*models.Role, bool, error) { return res, true, nil } -type ListOpt struct { - ProjectSpace string -} - func (c *RoleColl) List(projectName string) ([]*models.Role, error) { var res []*models.Role -- Gitee From 716c738b0bcaf91cd936d187a9090c6adb542944 Mon Sep 17 00:00:00 2001 From: lou Date: Tue, 19 Oct 2021 18:39:05 +0800 Subject: [PATCH 046/405] remove permission Signed-off-by: lou --- .../aslan/core/build/handler/router.go | 9 +- .../aslan/core/code/handler/router.go | 3 +- .../aslan/core/delivery/handler/router.go | 3 +- .../aslan/core/environment/handler/router.go | 49 +++-- .../aslan/core/multicluster/handler/router.go | 12 +- .../aslan/core/project/handler/router.go | 13 +- .../aslan/core/service/handler/router.go | 15 +- .../aslan/core/system/handler/router.go | 74 +++---- .../aslan/core/workflow/handler/router.go | 29 ++- .../core/workflow/testing/handler/router.go | 7 +- pkg/microservice/podexec/core/service/auth.go | 150 -------------- pkg/microservice/podexec/server/server.go | 2 - pkg/middleware/gin/permission.go | 190 ------------------ pkg/types/permission/permission.go | 48 +---- 14 files changed, 104 insertions(+), 500 deletions(-) delete mode 100644 pkg/microservice/podexec/core/service/auth.go delete mode 100644 pkg/middleware/gin/permission.go diff --git a/pkg/microservice/aslan/core/build/handler/router.go b/pkg/microservice/aslan/core/build/handler/router.go index 1e6af9d8a..090d6516e 100644 --- a/pkg/microservice/aslan/core/build/handler/router.go +++ b/pkg/microservice/aslan/core/build/handler/router.go @@ -20,7 +20,6 @@ import ( "github.com/gin-gonic/gin" gin2 "github.com/koderover/zadig/pkg/middleware/gin" - "github.com/koderover/zadig/pkg/types/permission" ) type Router struct{} @@ -30,10 +29,10 @@ func (*Router) Inject(router *gin.RouterGroup) { { build.GET("/:name", FindBuildModule) build.GET("", ListBuildModules) - build.POST("", gin2.StoreProductName, gin2.IsHavePermission([]string{permission.BuildManageUUID}, permission.ContextKeyType), gin2.UpdateOperationLogStatus, CreateBuildModule) - build.PUT("", gin2.StoreProductName, gin2.IsHavePermission([]string{permission.BuildManageUUID}, permission.ContextKeyType), gin2.UpdateOperationLogStatus, UpdateBuildModule) - build.DELETE("", gin2.IsHavePermission([]string{permission.BuildDeleteUUID}, permission.QueryType), gin2.UpdateOperationLogStatus, DeleteBuildModule) - build.POST("/targets", gin2.IsHavePermission([]string{permission.BuildManageUUID}, permission.QueryType), gin2.UpdateOperationLogStatus, UpdateBuildTargets) + build.POST("", gin2.StoreProductName, gin2.UpdateOperationLogStatus, CreateBuildModule) + build.PUT("", gin2.StoreProductName, gin2.UpdateOperationLogStatus, UpdateBuildModule) + build.DELETE("", gin2.UpdateOperationLogStatus, DeleteBuildModule) + build.POST("/targets", gin2.UpdateOperationLogStatus, UpdateBuildTargets) } target := router.Group("targets") diff --git a/pkg/microservice/aslan/core/code/handler/router.go b/pkg/microservice/aslan/core/code/handler/router.go index 99ac66caf..6d6ee4a77 100644 --- a/pkg/microservice/aslan/core/code/handler/router.go +++ b/pkg/microservice/aslan/core/code/handler/router.go @@ -20,7 +20,6 @@ import ( "github.com/gin-gonic/gin" gin2 "github.com/koderover/zadig/pkg/middleware/gin" - "github.com/koderover/zadig/pkg/types/permission" ) type Router struct{} @@ -42,7 +41,7 @@ func (*Router) Inject(router *gin.RouterGroup) { // --------------------------------------------------------------------------------------- workspace := router.Group("workspace") { - workspace.DELETE("", GetProductNameByWorkspacePipeline, gin2.IsHavePermission([]string{permission.WorkflowUpdateUUID}, permission.ContextKeyType), gin2.UpdateOperationLogStatus, CleanWorkspace) + workspace.DELETE("", GetProductNameByWorkspacePipeline, gin2.UpdateOperationLogStatus, CleanWorkspace) workspace.GET("/file", GetWorkspaceFile) workspace.GET("/git/:codehostId/:repoName/:branchName/:remoteName", GetGitRepoInfo) diff --git a/pkg/microservice/aslan/core/delivery/handler/router.go b/pkg/microservice/aslan/core/delivery/handler/router.go index 25b9641c2..362ce68c5 100644 --- a/pkg/microservice/aslan/core/delivery/handler/router.go +++ b/pkg/microservice/aslan/core/delivery/handler/router.go @@ -20,7 +20,6 @@ import ( "github.com/gin-gonic/gin" gin2 "github.com/koderover/zadig/pkg/middleware/gin" - "github.com/koderover/zadig/pkg/types/permission" ) type Router struct{} @@ -46,7 +45,7 @@ func (*Router) Inject(router *gin.RouterGroup) { { deliveryRelease.GET("/:id", GetDeliveryVersion) deliveryRelease.GET("", ListDeliveryVersion) - deliveryRelease.DELETE("/:id", GetProductNameByDelivery, gin2.IsHavePermission([]string{permission.ReleaseDeleteUUID}, permission.ContextKeyType), gin2.UpdateOperationLogStatus, DeleteDeliveryVersion) + deliveryRelease.DELETE("/:id", GetProductNameByDelivery, gin2.UpdateOperationLogStatus, DeleteDeliveryVersion) } deliveryPackage := router.Group("packages") diff --git a/pkg/microservice/aslan/core/environment/handler/router.go b/pkg/microservice/aslan/core/environment/handler/router.go index b0056e6d9..d2ffbbf15 100644 --- a/pkg/microservice/aslan/core/environment/handler/router.go +++ b/pkg/microservice/aslan/core/environment/handler/router.go @@ -20,7 +20,6 @@ import ( "github.com/gin-gonic/gin" gin2 "github.com/koderover/zadig/pkg/middleware/gin" - "github.com/koderover/zadig/pkg/types/permission" ) type Router struct{} @@ -32,8 +31,8 @@ func (*Router) Inject(router *gin.RouterGroup) { configmaps := router.Group("configmaps") { configmaps.GET("", ListConfigMaps) - configmaps.PUT("", gin2.StoreProductName, gin2.IsHavePermission([]string{permission.TestEnvManageUUID, permission.ProdEnvManageUUID}, permission.ContextKeyType), gin2.UpdateOperationLogStatus, UpdateConfigMap) - configmaps.POST("", gin2.StoreProductName, gin2.IsHavePermission([]string{permission.TestEnvManageUUID, permission.ProdEnvManageUUID}, permission.ContextKeyType), gin2.UpdateOperationLogStatus, RollBackConfigMap) + configmaps.PUT("", gin2.StoreProductName, gin2.UpdateOperationLogStatus, UpdateConfigMap) + configmaps.POST("", gin2.StoreProductName, gin2.UpdateOperationLogStatus, RollBackConfigMap) } // --------------------------------------------------------------------------------------- @@ -58,7 +57,7 @@ func (*Router) Inject(router *gin.RouterGroup) { // --------------------------------------------------------------------------------------- export := router.Group("export") { - export.GET("/service", gin2.IsHavePermission([]string{permission.TestEnvManageUUID, permission.ProdEnvManageUUID}, permission.QueryType), ExportYaml) + export.GET("/service", ExportYaml) // export.GET("/pipelines/:name", ExportBuildYaml) } @@ -67,8 +66,8 @@ func (*Router) Inject(router *gin.RouterGroup) { // --------------------------------------------------------------------------------------- image := router.Group("image") { - image.POST("/deployment", gin2.StoreProductName, gin2.IsHavePermission([]string{permission.TestEnvManageUUID, permission.ProdEnvManageUUID, permission.TestUpdateEnvUUID}, permission.ContextKeyType), gin2.UpdateOperationLogStatus, UpdateDeploymentContainerImage) - image.POST("/statefulset", gin2.StoreProductName, gin2.IsHavePermission([]string{permission.TestEnvManageUUID, permission.ProdEnvManageUUID, permission.TestUpdateEnvUUID}, permission.ContextKeyType), gin2.UpdateOperationLogStatus, UpdateStatefulSetContainerImage) + image.POST("/deployment", gin2.UpdateOperationLogStatus, UpdateDeploymentContainerImage) + image.POST("/statefulset", gin2.UpdateOperationLogStatus, UpdateStatefulSetContainerImage) } // 查询环境创建时的服务和变量信息 @@ -84,7 +83,7 @@ func (*Router) Inject(router *gin.RouterGroup) { kube.GET("/events", ListKubeEvents) kube.POST("/pods", ListServicePods) - kube.DELETE("/pods/:podName", gin2.IsHavePermission([]string{permission.TestEnvManageUUID, permission.ProdEnvManageUUID, permission.TestUpdateEnvUUID}, permission.QueryType), gin2.UpdateOperationLogStatus, DeletePod) + kube.DELETE("/pods/:podName", gin2.UpdateOperationLogStatus, DeletePod) kube.GET("/pods/:podName/events", ListPodEvents) kube.GET("/workloads", ListWorkloads) } @@ -95,43 +94,43 @@ func (*Router) Inject(router *gin.RouterGroup) { environments := router.Group("environments") { environments.GET("", ListProducts) - environments.POST("/:productName/auto", gin2.IsHavePermission([]string{permission.TestEnvCreateUUID}, permission.ParamType), AutoCreateProduct) - environments.PUT("/:productName/autoUpdate", gin2.IsHavePermission([]string{permission.TestEnvManageUUID, permission.ProdEnvManageUUID}, permission.ParamType), gin2.UpdateOperationLogStatus, AutoUpdateProduct) - environments.POST("", gin2.StoreProductName, gin2.IsHavePermission([]string{permission.TestEnvCreateUUID, permission.ProdEnvCreateUUID}, permission.ContextKeyType), gin2.UpdateOperationLogStatus, CreateProduct) + environments.POST("/:productName/auto", AutoCreateProduct) + environments.PUT("/:productName/autoUpdate", gin2.UpdateOperationLogStatus, AutoUpdateProduct) + environments.POST("", gin2.StoreProductName, gin2.UpdateOperationLogStatus, CreateProduct) - environments.POST("/:productName/helm", gin2.StoreProductName, gin2.IsHavePermission([]string{permission.TestEnvCreateUUID, permission.ProdEnvCreateUUID}, permission.ContextKeyType), gin2.UpdateOperationLogStatus, CreateHelmProduct) - environments.PUT("/:productName/multiHelmEnv", gin2.StoreProductName, gin2.IsHavePermission([]string{permission.TestEnvCreateUUID, permission.ProdEnvCreateUUID}, permission.ContextKeyType), gin2.UpdateOperationLogStatus, UpdateMultiHelmEnv) + environments.POST("/:productName/helm", gin2.StoreProductName, gin2.UpdateOperationLogStatus, CreateHelmProduct) + environments.PUT("/:productName/multiHelmEnv", gin2.StoreProductName, gin2.UpdateOperationLogStatus, UpdateMultiHelmEnv) - environments.POST("/:productName", gin2.IsHavePermission([]string{permission.TestEnvManageUUID, permission.ProdEnvManageUUID}, permission.ParamType), gin2.UpdateOperationLogStatus, UpdateProduct) - environments.PUT("/:productName/envRecycle", gin2.IsHavePermission([]string{permission.TestEnvManageUUID}, permission.ParamType), gin2.UpdateOperationLogStatus, UpdateProductRecycleDay) - environments.PUT("/:productName/renderchart", gin2.IsHavePermission([]string{permission.TestEnvManageUUID}, permission.ParamType), gin2.UpdateOperationLogStatus, UpdateHelmProductRenderCharts) + environments.POST("/:productName", gin2.UpdateOperationLogStatus, UpdateProduct) + environments.PUT("/:productName/envRecycle", gin2.UpdateOperationLogStatus, UpdateProductRecycleDay) + environments.PUT("/:productName/renderchart", gin2.UpdateOperationLogStatus, UpdateHelmProductRenderCharts) environments.GET("/:productName/helmChartVersions", GetHelmChartVersions) - environments.PUT("/:productName", gin2.IsHavePermission([]string{permission.TestEnvShareUUID}, permission.ParamType), gin2.UpdateOperationLogStatus, EnvShare) + environments.PUT("/:productName", gin2.UpdateOperationLogStatus, EnvShare) environments.GET("/:productName", GetProduct) environments.GET("/:productName/productInfo", GetProductInfo) environments.GET("/:productName/ingressInfo", GetProductIngress) environments.GET("/:productName/helmRenderCharts", ListRenderCharts) - environments.DELETE("/:productName", gin2.IsHavePermission([]string{permission.TestEnvDeleteUUID, permission.ProdEnvDeleteUUID}, permission.ParamType), gin2.UpdateOperationLogStatus, DeleteProduct) + environments.DELETE("/:productName", gin2.UpdateOperationLogStatus, DeleteProduct) environments.GET("/:productName/groups", ListGroups) environments.GET("/:productName/workloads", ListWorkloadsInEnv) environments.GET("/:productName/services/:serviceName", GetService) - environments.PUT("/:productName/services/:serviceName/:serviceType", gin2.IsHavePermission([]string{permission.TestEnvManageUUID, permission.ProdEnvManageUUID}, permission.ParamType), gin2.UpdateOperationLogStatus, UpdateService) - environments.POST("/:productName/services/:serviceName/restart", gin2.IsHavePermission([]string{permission.TestEnvManageUUID, permission.ProdEnvManageUUID}, permission.ParamType), gin2.UpdateOperationLogStatus, RestartService) - environments.POST("/:productName/services/:serviceName/restartNew", gin2.IsHavePermission([]string{permission.TestEnvManageUUID, permission.ProdEnvManageUUID, permission.TestUpdateEnvUUID}, permission.ParamType), gin2.UpdateOperationLogStatus, RestartNewService) - environments.POST("/:productName/services/:serviceName/scale/:number", gin2.IsHavePermission([]string{permission.TestEnvManageUUID, permission.ProdEnvManageUUID}, permission.ParamType), gin2.UpdateOperationLogStatus, ScaleService) - environments.POST("/:productName/services/:serviceName/scaleNew/:number", gin2.IsHavePermission([]string{permission.TestEnvManageUUID, permission.ProdEnvManageUUID}, permission.ParamType), gin2.UpdateOperationLogStatus, ScaleNewService) + environments.PUT("/:productName/services/:serviceName/:serviceType", gin2.UpdateOperationLogStatus, UpdateService) + environments.POST("/:productName/services/:serviceName/restart", gin2.UpdateOperationLogStatus, RestartService) + environments.POST("/:productName/services/:serviceName/restartNew", gin2.UpdateOperationLogStatus, RestartNewService) + environments.POST("/:productName/services/:serviceName/scale/:number", gin2.UpdateOperationLogStatus, ScaleService) + environments.POST("/:productName/services/:serviceName/scaleNew/:number", gin2.UpdateOperationLogStatus, ScaleNewService) environments.GET("/:productName/services/:serviceName/containers/:container/namespaces/:namespace", GetServiceContainer) environments.GET("/estimated-renderchart", GetEstimatedRenderCharts) // need to be deprecated - environments.PUT("/:productName/helmEnv", gin2.IsHavePermission([]string{permission.TestEnvManageUUID}, permission.ParamType), gin2.UpdateOperationLogStatus, UpdateHelmProduct) - environments.PUT("/:productName/helmEnvVariable", gin2.IsHavePermission([]string{permission.TestEnvManageUUID}, permission.ParamType), gin2.UpdateOperationLogStatus, UpdateHelmProductVariable) - environments.PUT("/:productName/updateMultiEnv", gin2.IsHavePermission([]string{permission.TestEnvManageUUID}, permission.ParamType), gin2.UpdateOperationLogStatus, UpdateMultiHelmProduct) + environments.PUT("/:productName/helmEnv", gin2.UpdateOperationLogStatus, UpdateHelmProduct) + environments.PUT("/:productName/helmEnvVariable", gin2.UpdateOperationLogStatus, UpdateHelmProductVariable) + environments.PUT("/:productName/updateMultiEnv", gin2.UpdateOperationLogStatus, UpdateMultiHelmProduct) } // --------------------------------------------------------------------------------------- diff --git a/pkg/microservice/aslan/core/multicluster/handler/router.go b/pkg/microservice/aslan/core/multicluster/handler/router.go index ddfc60acc..7d03a0a4e 100644 --- a/pkg/microservice/aslan/core/multicluster/handler/router.go +++ b/pkg/microservice/aslan/core/multicluster/handler/router.go @@ -18,8 +18,6 @@ package handler import ( "github.com/gin-gonic/gin" - - gin2 "github.com/koderover/zadig/pkg/middleware/gin" ) type Router struct{} @@ -36,10 +34,10 @@ func (*Router) Inject(router *gin.RouterGroup) { Cluster.GET("", ListClusters) Cluster.GET("/:id", GetCluster) - Cluster.POST("", gin2.RequireSuperAdminAuth, CreateCluster) - Cluster.PUT("/:id", gin2.RequireSuperAdminAuth, UpdateCluster) - Cluster.DELETE("/:id", gin2.RequireSuperAdminAuth, DeleteCluster) - Cluster.PUT("/:id/disconnect", gin2.RequireSuperAdminAuth, DisconnectCluster) - Cluster.PUT("/:id/reconnect", gin2.RequireSuperAdminAuth, ReconnectCluster) + Cluster.POST("", CreateCluster) + Cluster.PUT("/:id", UpdateCluster) + Cluster.DELETE("/:id", DeleteCluster) + Cluster.PUT("/:id/disconnect", DisconnectCluster) + Cluster.PUT("/:id/reconnect", ReconnectCluster) } } diff --git a/pkg/microservice/aslan/core/project/handler/router.go b/pkg/microservice/aslan/core/project/handler/router.go index f1d907123..2744410ac 100644 --- a/pkg/microservice/aslan/core/project/handler/router.go +++ b/pkg/microservice/aslan/core/project/handler/router.go @@ -20,7 +20,6 @@ import ( "github.com/gin-gonic/gin" gin2 "github.com/koderover/zadig/pkg/middleware/gin" - "github.com/koderover/zadig/pkg/types/permission" ) type Router struct{} @@ -41,12 +40,12 @@ func (*Router) Inject(router *gin.RouterGroup) { product.GET("/:name", GetProductTemplate) product.GET("/:name/services", GetProductTemplateServices) product.GET("/:name/searching-rules", GetCustomMatchRules) - product.PUT("/:name/searching-rules", gin2.StoreProductName, gin2.IsHavePermission([]string{permission.SuperUserUUID}, permission.ContextKeyType), gin2.UpdateOperationLogStatus, CreateOrUpdateMatchRules) - product.POST("", gin2.StoreProductName, gin2.IsHavePermission([]string{permission.SuperUserUUID}, permission.ContextKeyType), gin2.UpdateOperationLogStatus, CreateProductTemplate) - product.PUT("/:name", gin2.IsHavePermission([]string{permission.ServiceTemplateEditUUID}, permission.ParamType), gin2.UpdateOperationLogStatus, UpdateProductTemplate) - product.PUT("/:name/:status", gin2.IsHavePermission([]string{permission.ServiceTemplateEditUUID}, permission.ParamType), gin2.UpdateOperationLogStatus, UpdateProductTmplStatus) - product.PUT("", gin2.StoreProductName, gin2.IsHavePermission([]string{permission.SuperUserUUID}, permission.ContextKeyType), gin2.UpdateOperationLogStatus, UpdateProject) - product.DELETE("/:name", gin2.IsHavePermission([]string{permission.SuperUserUUID}, permission.ParamType), gin2.UpdateOperationLogStatus, DeleteProductTemplate) + product.PUT("/:name/searching-rules", gin2.StoreProductName, gin2.UpdateOperationLogStatus, CreateOrUpdateMatchRules) + product.POST("", gin2.StoreProductName, gin2.UpdateOperationLogStatus, CreateProductTemplate) + product.PUT("/:name", gin2.UpdateOperationLogStatus, UpdateProductTemplate) + product.PUT("/:name/:status", gin2.UpdateOperationLogStatus, UpdateProductTmplStatus) + product.PUT("", gin2.StoreProductName, gin2.UpdateOperationLogStatus, UpdateProject) + product.DELETE("/:name", gin2.UpdateOperationLogStatus, DeleteProductTemplate) } openSource := router.Group("opensource") diff --git a/pkg/microservice/aslan/core/service/handler/router.go b/pkg/microservice/aslan/core/service/handler/router.go index 9bfbd2ade..3fabc8e8e 100644 --- a/pkg/microservice/aslan/core/service/handler/router.go +++ b/pkg/microservice/aslan/core/service/handler/router.go @@ -20,7 +20,6 @@ import ( "github.com/gin-gonic/gin" gin2 "github.com/koderover/zadig/pkg/middleware/gin" - "github.com/koderover/zadig/pkg/types/permission" ) type Router struct{} @@ -40,8 +39,8 @@ func (*Router) Inject(router *gin.RouterGroup) { helm.GET("/:productName/:serviceName/serviceModule", GetHelmServiceModule) helm.GET("/:productName/:serviceName/filePath", GetFilePath) helm.GET("/:productName/:serviceName/fileContent", GetFileContent) - helm.POST("/services", gin2.IsHavePermission([]string{permission.ServiceTemplateManageUUID}, permission.ParamType), CreateOrUpdateHelmService) - helm.PUT("/:productName", gin2.IsHavePermission([]string{permission.ServiceTemplateManageUUID}, permission.ParamType), UpdateHelmService) + helm.POST("/services", CreateOrUpdateHelmService) + helm.PUT("/:productName", UpdateHelmService) } k8s := router.Group("services") @@ -49,10 +48,10 @@ func (*Router) Inject(router *gin.RouterGroup) { k8s.GET("", ListServiceTemplate) k8s.GET("/:name/:type", GetServiceTemplate) k8s.GET("/:name", GetServiceTemplateOption) - k8s.POST("", GetServiceTemplateProductName, gin2.IsHavePermission([]string{permission.ServiceTemplateManageUUID}, permission.ContextKeyType), gin2.UpdateOperationLogStatus, CreateServiceTemplate) - k8s.PUT("", GetServiceTemplateObjectProductName, gin2.IsHavePermission([]string{permission.ServiceTemplateManageUUID}, permission.ContextKeyType), gin2.UpdateOperationLogStatus, UpdateServiceTemplate) + k8s.POST("", GetServiceTemplateProductName, gin2.UpdateOperationLogStatus, CreateServiceTemplate) + k8s.PUT("", GetServiceTemplateObjectProductName, gin2.UpdateOperationLogStatus, UpdateServiceTemplate) k8s.PUT("/yaml/validator", YamlValidator) - k8s.DELETE("/:name/:type", gin2.IsHavePermission([]string{permission.ServiceTemplateDeleteUUID}, permission.QueryType), gin2.UpdateOperationLogStatus, DeleteServiceTemplate) + k8s.DELETE("/:name/:type", gin2.UpdateOperationLogStatus, DeleteServiceTemplate) k8s.GET("/:name/:type/ports", ListServicePort) } @@ -77,7 +76,7 @@ func (*Router) Inject(router *gin.RouterGroup) { pm := router.Group("pm") { - pm.POST("/:productName", gin2.IsHavePermission([]string{permission.ServiceTemplateManageUUID}, permission.ParamType), gin2.UpdateOperationLogStatus, CreatePMService) - pm.PUT("/:productName", gin2.IsHavePermission([]string{permission.ServiceTemplateManageUUID}, permission.ParamType), gin2.UpdateOperationLogStatus, UpdatePmServiceTemplate) + pm.POST("/:productName", gin2.UpdateOperationLogStatus, CreatePMService) + pm.PUT("/:productName", gin2.UpdateOperationLogStatus, UpdatePmServiceTemplate) } } diff --git a/pkg/microservice/aslan/core/system/handler/router.go b/pkg/microservice/aslan/core/system/handler/router.go index 83a497193..f0175bbc6 100644 --- a/pkg/microservice/aslan/core/system/handler/router.go +++ b/pkg/microservice/aslan/core/system/handler/router.go @@ -35,11 +35,11 @@ func (*Router) Inject(router *gin.RouterGroup) { // --------------------------------------------------------------------------------------- install := router.Group("install") { - install.POST("", gin2.RequireSuperAdminAuth, gin2.UpdateOperationLogStatus, CreateInstall) - install.PUT("", gin2.RequireSuperAdminAuth, gin2.UpdateOperationLogStatus, UpdateInstall) + install.POST("", gin2.UpdateOperationLogStatus, CreateInstall) + install.PUT("", gin2.UpdateOperationLogStatus, UpdateInstall) install.GET("/:name/:version", GetInstall) install.GET("", ListInstalls) - install.PUT("/delete", gin2.RequireSuperAdminAuth, gin2.UpdateOperationLogStatus, DeleteInstall) + install.PUT("/delete", gin2.UpdateOperationLogStatus, DeleteInstall) } // --------------------------------------------------------------------------------------- @@ -49,9 +49,9 @@ func (*Router) Inject(router *gin.RouterGroup) { { proxyManage.GET("", ListProxies) proxyManage.GET("/:id", GetProxy) - proxyManage.POST("", gin2.RequireSuperAdminAuth, gin2.UpdateOperationLogStatus, CreateProxy) - proxyManage.PUT("/:id", gin2.RequireSuperAdminAuth, gin2.UpdateOperationLogStatus, UpdateProxy) - proxyManage.DELETE("/:id", gin2.RequireSuperAdminAuth, gin2.UpdateOperationLogStatus, DeleteProxy) + proxyManage.POST("", gin2.UpdateOperationLogStatus, CreateProxy) + proxyManage.PUT("/:id", gin2.UpdateOperationLogStatus, UpdateProxy) + proxyManage.DELETE("/:id", gin2.UpdateOperationLogStatus, DeleteProxy) proxyManage.POST("/connectionTest", TestConnection) } @@ -61,11 +61,11 @@ func (*Router) Inject(router *gin.RouterGroup) { registry.GET("", ListRegistries) // 获取默认的镜像仓库配置,用于kodespace CLI调用 registry.GET("/namespaces/default", GetDefaultRegistryNamespace) - registry.GET("/namespaces", gin2.RequireSuperAdminAuth, ListRegistryNamespaces) - registry.POST("/namespaces", gin2.RequireSuperAdminAuth, gin2.UpdateOperationLogStatus, CreateRegistryNamespace) - registry.PUT("/namespaces/:id", gin2.RequireSuperAdminAuth, gin2.UpdateOperationLogStatus, UpdateRegistryNamespace) + registry.GET("/namespaces", ListRegistryNamespaces) + registry.POST("/namespaces", gin2.UpdateOperationLogStatus, CreateRegistryNamespace) + registry.PUT("/namespaces/:id", gin2.UpdateOperationLogStatus, UpdateRegistryNamespace) - registry.DELETE("/namespaces/:id", gin2.RequireSuperAdminAuth, gin2.UpdateOperationLogStatus, DeleteRegistryNamespace) + registry.DELETE("/namespaces/:id", gin2.UpdateOperationLogStatus, DeleteRegistryNamespace) registry.GET("/release/repos", ListAllRepos) registry.POST("/images", ListImages) registry.GET("/images/repos/:name", ListRepoImages) @@ -74,10 +74,10 @@ func (*Router) Inject(router *gin.RouterGroup) { s3storage := router.Group("s3storage") { s3storage.GET("", ListS3Storage) - s3storage.POST("", gin2.RequireSuperAdminAuth, gin2.UpdateOperationLogStatus, CreateS3Storage) + s3storage.POST("", gin2.UpdateOperationLogStatus, CreateS3Storage) s3storage.GET("/:id", GetS3Storage) - s3storage.PUT("/:id", gin2.RequireSuperAdminAuth, gin2.UpdateOperationLogStatus, UpdateS3Storage) - s3storage.DELETE("/:id", gin2.RequireSuperAdminAuth, gin2.UpdateOperationLogStatus, DeleteS3Storage) + s3storage.PUT("/:id", gin2.UpdateOperationLogStatus, UpdateS3Storage) + s3storage.DELETE("/:id", gin2.UpdateOperationLogStatus, DeleteS3Storage) } //系统清理缓存 @@ -93,8 +93,8 @@ func (*Router) Inject(router *gin.RouterGroup) { github := router.Group("githubApp") { github.GET("", GetGithubApp) - github.POST("", gin2.RequireSuperAdminAuth, CreateGithubApp) - github.DELETE("/:id", gin2.RequireSuperAdminAuth, DeleteGithubApp) + github.POST("", CreateGithubApp) + github.DELETE("/:id", DeleteGithubApp) } // --------------------------------------------------------------------------------------- @@ -102,13 +102,13 @@ func (*Router) Inject(router *gin.RouterGroup) { // --------------------------------------------------------------------------------------- jenkins := router.Group("jenkins") { - jenkins.POST("/integration", gin2.RequireSuperAdminAuth, CreateJenkinsIntegration) + jenkins.POST("/integration", CreateJenkinsIntegration) jenkins.GET("/integration", ListJenkinsIntegration) - jenkins.PUT("/integration/:id", gin2.RequireSuperAdminAuth, UpdateJenkinsIntegration) - jenkins.DELETE("/integration/:id", gin2.RequireSuperAdminAuth, DeleteJenkinsIntegration) - jenkins.POST("/user/connection", gin2.RequireSuperAdminAuth, TestJenkinsConnection) - jenkins.GET("/jobNames", gin2.RequireSuperAdminAuth, ListJobNames) - jenkins.GET("/buildArgs/:jobName", gin2.RequireSuperAdminAuth, ListJobBuildArgs) + jenkins.PUT("/integration/:id", UpdateJenkinsIntegration) + jenkins.DELETE("/integration/:id", DeleteJenkinsIntegration) + jenkins.POST("/user/connection", TestJenkinsConnection) + jenkins.GET("/jobNames", ListJobNames) + jenkins.GET("/buildArgs/:jobName", ListJobBuildArgs) } //系统配额 @@ -128,9 +128,9 @@ func (*Router) Inject(router *gin.RouterGroup) { { basicImages.GET("", ListBasicImages) basicImages.GET("/:id", GetBasicImage) - basicImages.POST("", gin2.RequireSuperAdminAuth, gin2.UpdateOperationLogStatus, CreateBasicImage) - basicImages.PUT("/:id", gin2.RequireSuperAdminAuth, gin2.UpdateOperationLogStatus, UpdateBasicImage) - basicImages.DELETE("/:id", gin2.RequireSuperAdminAuth, gin2.UpdateOperationLogStatus, DeleteBasicImage) + basicImages.POST("", gin2.UpdateOperationLogStatus, CreateBasicImage) + basicImages.PUT("/:id", gin2.UpdateOperationLogStatus, UpdateBasicImage) + basicImages.DELETE("/:id", gin2.UpdateOperationLogStatus, DeleteBasicImage) } // --------------------------------------------------------------------------------------- @@ -139,9 +139,9 @@ func (*Router) Inject(router *gin.RouterGroup) { integration := router.Group("helm") { integration.GET("", ListHelmRepos) - integration.POST("", gin2.RequireSuperAdminAuth, CreateHelmRepo) - integration.PUT("/:id", gin2.RequireSuperAdminAuth, UpdateHelmRepo) - integration.DELETE("/:id", gin2.RequireSuperAdminAuth, DeleteHelmRepo) + integration.POST("", CreateHelmRepo) + integration.PUT("/:id", UpdateHelmRepo) + integration.DELETE("/:id", DeleteHelmRepo) } // --------------------------------------------------------------------------------------- @@ -151,9 +151,9 @@ func (*Router) Inject(router *gin.RouterGroup) { { privateKey.GET("", ListPrivateKeys) privateKey.GET("/:id", GetPrivateKey) - privateKey.POST("", gin2.RequireSuperAdminAuth, gin2.UpdateOperationLogStatus, CreatePrivateKey) - privateKey.PUT("/:id", gin2.RequireSuperAdminAuth, gin2.UpdateOperationLogStatus, UpdatePrivateKey) - privateKey.DELETE("/:id", gin2.RequireSuperAdminAuth, gin2.UpdateOperationLogStatus, DeletePrivateKey) + privateKey.POST("", gin2.UpdateOperationLogStatus, CreatePrivateKey) + privateKey.PUT("/:id", gin2.UpdateOperationLogStatus, UpdatePrivateKey) + privateKey.DELETE("/:id", gin2.UpdateOperationLogStatus, DeletePrivateKey) } notification := router.Group("notification") @@ -169,18 +169,18 @@ func (*Router) Inject(router *gin.RouterGroup) { announcement := router.Group("announcement") { - announcement.POST("", gin2.RequireSuperAdminAuth, CreateAnnouncement) - announcement.PUT("/update", gin2.RequireSuperAdminAuth, UpdateAnnouncement) - announcement.GET("/all", gin2.RequireSuperAdminAuth, PullAllAnnouncement) + announcement.POST("", CreateAnnouncement) + announcement.PUT("/update", UpdateAnnouncement) + announcement.GET("/all", PullAllAnnouncement) announcement.GET("", PullNotifyAnnouncement) - announcement.DELETE("/:id", gin2.RequireSuperAdminAuth, DeleteAnnouncement) + announcement.DELETE("/:id", DeleteAnnouncement) } operation := router.Group("operation") { - operation.GET("", gin2.RequireSuperAdminAuth, GetOperationLogs) - operation.POST("", gin2.RequireSuperAdminAuth, AddSystemOperationLog) - operation.PUT("/:id", gin2.RequireSuperAdminAuth, UpdateOperationLog) + operation.GET("", GetOperationLogs) + operation.POST("", AddSystemOperationLog) + operation.PUT("/:id", UpdateOperationLog) } } diff --git a/pkg/microservice/aslan/core/workflow/handler/router.go b/pkg/microservice/aslan/core/workflow/handler/router.go index b1b1afe79..25b9bd66d 100644 --- a/pkg/microservice/aslan/core/workflow/handler/router.go +++ b/pkg/microservice/aslan/core/workflow/handler/router.go @@ -24,7 +24,6 @@ import ( gin2 "github.com/koderover/zadig/pkg/middleware/gin" "github.com/koderover/zadig/pkg/shared/client/policy" "github.com/koderover/zadig/pkg/tool/log" - "github.com/koderover/zadig/pkg/types/permission" ) type Router struct{} @@ -89,10 +88,10 @@ func (*Router) Inject(router *gin.RouterGroup) { { pipeline.GET("", ListPipelines) pipeline.GET("/:name", GetPipeline) - pipeline.POST("", GetPipelineProductName, gin2.IsHavePermission([]string{permission.WorkflowCreateUUID}, permission.ContextKeyType), gin2.UpdateOperationLogStatus, UpsertPipeline) - pipeline.POST("/old/:old/new/:new", GetProductNameByPipeline, gin2.IsHavePermission([]string{permission.WorkflowCreateUUID}, permission.ContextKeyType), gin2.UpdateOperationLogStatus, CopyPipeline) - pipeline.PUT("/rename/:old/:new", GetProductNameByPipeline, gin2.IsHavePermission([]string{permission.WorkflowUpdateUUID}, permission.ContextKeyType), gin2.UpdateOperationLogStatus, RenamePipeline) - pipeline.DELETE("/:name", GetProductNameByPipeline, gin2.IsHavePermission([]string{permission.WorkflowDeleteUUID}, permission.ContextKeyType), gin2.UpdateOperationLogStatus, DeletePipeline) + pipeline.POST("", GetPipelineProductName, gin2.UpdateOperationLogStatus, UpsertPipeline) + pipeline.POST("/old/:old/new/:new", GetProductNameByPipeline, gin2.UpdateOperationLogStatus, CopyPipeline) + pipeline.PUT("/rename/:old/:new", GetProductNameByPipeline, gin2.UpdateOperationLogStatus, RenamePipeline) + pipeline.DELETE("/:name", GetProductNameByPipeline, gin2.UpdateOperationLogStatus, DeletePipeline) } // --------------------------------------------------------------------------------------- @@ -109,11 +108,11 @@ func (*Router) Inject(router *gin.RouterGroup) { // --------------------------------------------------------------------------------------- taskV2 := router.Group("v2/tasks") { - taskV2.POST("", GetProductNameByPipelineTask, gin2.IsHavePermission([]string{permission.WorkflowTaskUUID}, permission.ContextKeyType), gin2.UpdateOperationLogStatus, CreatePipelineTask) + taskV2.POST("", GetProductNameByPipelineTask, gin2.UpdateOperationLogStatus, CreatePipelineTask) taskV2.GET("/max/:max/start/:start/pipelines/:name", ListPipelineTasksResult) taskV2.GET("/id/:id/pipelines/:name", GetPipelineTask) - taskV2.POST("/id/:id/pipelines/:name/restart", GetProductNameByPipeline, gin2.IsHavePermission([]string{permission.WorkflowTaskUUID}, permission.ContextKeyType), gin2.UpdateOperationLogStatus, RestartPipelineTask) - taskV2.DELETE("/id/:id/pipelines/:name", GetProductNameByPipeline, gin2.IsHavePermission([]string{permission.WorkflowTaskUUID}, permission.ContextKeyType), gin2.UpdateOperationLogStatus, CancelTaskV2) + taskV2.POST("/id/:id/pipelines/:name/restart", GetProductNameByPipeline, gin2.UpdateOperationLogStatus, RestartPipelineTask) + taskV2.DELETE("/id/:id/pipelines/:name", GetProductNameByPipeline, gin2.UpdateOperationLogStatus, CancelTaskV2) taskV2.GET("/pipelines/:name/products", ListPipelineUpdatableProductNames) taskV2.GET("/file", GetPackageFile) taskV2.GET("/workflow/:pipelineName/taskId/:taskId", GetArtifactFile) @@ -135,12 +134,12 @@ func (*Router) Inject(router *gin.RouterGroup) { workflow := router.Group("workflow") { workflow.POST("/:productName/auto", AutoCreateWorkflow) - workflow.POST("", GetWorkflowProductName, gin2.IsHavePermission([]string{permission.WorkflowCreateUUID}, permission.ContextKeyType), gin2.UpdateOperationLogStatus, CreateWorkflow) - workflow.PUT("", GetWorkflowProductName, gin2.IsHavePermission([]string{permission.WorkflowUpdateUUID}, permission.ContextKeyType), gin2.UpdateOperationLogStatus, UpdateWorkflow) + workflow.POST("", GetWorkflowProductName, gin2.UpdateOperationLogStatus, CreateWorkflow) + workflow.PUT("", GetWorkflowProductName, gin2.UpdateOperationLogStatus, UpdateWorkflow) workflow.GET("", ListWorkflows) workflow.GET("/testName/:testName", ListTestWorkflows) workflow.GET("/find/:name", FindWorkflow) - workflow.DELETE("/:name", GetProductNameByWorkflow, gin2.IsHavePermission([]string{permission.WorkflowDeleteUUID}, permission.ContextKeyType), gin2.UpdateOperationLogStatus, DeleteWorkflow) + workflow.DELETE("/:name", GetProductNameByWorkflow, gin2.UpdateOperationLogStatus, DeleteWorkflow) workflow.GET("/preset/:productName", PreSetWorkflow) workflow.PUT("/old/:old/new/:new", CopyWorkflow) @@ -154,12 +153,12 @@ func (*Router) Inject(router *gin.RouterGroup) { //todo 修改权限的uuid workflowtask.GET("/targets/:productName/:namespace", GetWorkflowArgs) workflowtask.GET("/preset/:namespace/:workflowName", PresetWorkflowArgs) - workflowtask.POST("", GetWorkflowTaskProductName, gin2.IsHavePermission([]string{permission.WorkflowTaskUUID}, permission.ContextKeyType), gin2.UpdateOperationLogStatus, CreateWorkflowTask) - workflowtask.PUT("", GetWorkflowTaskProductName, gin2.IsHavePermission([]string{permission.WorkflowTaskUUID}, permission.ContextKeyType), gin2.UpdateOperationLogStatus, CreateArtifactWorkflowTask) + workflowtask.POST("", GetWorkflowTaskProductName, gin2.UpdateOperationLogStatus, CreateWorkflowTask) + workflowtask.PUT("", GetWorkflowTaskProductName, gin2.UpdateOperationLogStatus, CreateArtifactWorkflowTask) workflowtask.GET("/max/:max/start/:start/pipelines/:name", ListWorkflowTasksResult) workflowtask.GET("/id/:id/pipelines/:name", GetWorkflowTask) - workflowtask.POST("/id/:id/pipelines/:name/restart", GetWorkflowTaskProductNameByTask, gin2.IsHavePermission([]string{permission.WorkflowTaskUUID}, permission.ContextKeyType), gin2.UpdateOperationLogStatus, RestartWorkflowTask) - workflowtask.DELETE("/id/:id/pipelines/:name", GetWorkflowTaskProductNameByTask, gin2.IsHavePermission([]string{permission.WorkflowTaskUUID}, permission.ContextKeyType), gin2.UpdateOperationLogStatus, CancelWorkflowTaskV2) + workflowtask.POST("/id/:id/pipelines/:name/restart", GetWorkflowTaskProductNameByTask, gin2.UpdateOperationLogStatus, RestartWorkflowTask) + workflowtask.DELETE("/id/:id/pipelines/:name", GetWorkflowTaskProductNameByTask, gin2.UpdateOperationLogStatus, CancelWorkflowTaskV2) } serviceTask := router.Group("servicetask") diff --git a/pkg/microservice/aslan/core/workflow/testing/handler/router.go b/pkg/microservice/aslan/core/workflow/testing/handler/router.go index 48f4e4c03..ccc942936 100644 --- a/pkg/microservice/aslan/core/workflow/testing/handler/router.go +++ b/pkg/microservice/aslan/core/workflow/testing/handler/router.go @@ -20,7 +20,6 @@ import ( "github.com/gin-gonic/gin" gin2 "github.com/koderover/zadig/pkg/middleware/gin" - "github.com/koderover/zadig/pkg/types/permission" ) type Router struct{} @@ -47,11 +46,11 @@ func (*Router) Inject(router *gin.RouterGroup) { // --------------------------------------------------------------------------------------- tester := router.Group("test") { - tester.POST("", GetTestProductName, gin2.IsHavePermission([]string{permission.TestManageUUID}, permission.ContextKeyType), gin2.UpdateOperationLogStatus, CreateTestModule) - tester.PUT("", GetTestProductName, gin2.IsHavePermission([]string{permission.TestManageUUID}, permission.ContextKeyType), gin2.UpdateOperationLogStatus, UpdateTestModule) + tester.POST("", GetTestProductName, gin2.UpdateOperationLogStatus, CreateTestModule) + tester.PUT("", GetTestProductName, gin2.UpdateOperationLogStatus, UpdateTestModule) tester.GET("", ListTestModules) tester.GET("/:name", GetTestModule) - tester.DELETE("/:name", gin2.IsHavePermission([]string{permission.TestDeleteUUID}, permission.QueryType), gin2.UpdateOperationLogStatus, DeleteTestModule) + tester.DELETE("/:name", gin2.UpdateOperationLogStatus, DeleteTestModule) } testStat := router.Group("teststat") diff --git a/pkg/microservice/podexec/core/service/auth.go b/pkg/microservice/podexec/core/service/auth.go deleted file mode 100644 index e45b87fef..000000000 --- a/pkg/microservice/podexec/core/service/auth.go +++ /dev/null @@ -1,150 +0,0 @@ -/* -Copyright 2021 The KodeRover 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 service - -import ( - "encoding/json" - "net/http" - "strconv" - "strings" - - "github.com/gorilla/mux" - "go.uber.org/zap" - "k8s.io/apimachinery/pkg/util/sets" - - configbase "github.com/koderover/zadig/pkg/config" - "github.com/koderover/zadig/pkg/microservice/podexec/config" - "github.com/koderover/zadig/pkg/setting" - "github.com/koderover/zadig/pkg/shared/poetry" - "github.com/koderover/zadig/pkg/tool/log" - "github.com/koderover/zadig/pkg/types/permission" -) - -func AuthMiddleware(next http.Handler) http.Handler { - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - url := r.URL.Path - if strings.Contains("/api/health/", url) { - next.ServeHTTP(w, r) - return - } - - authorization := r.Header.Get(setting.AuthorizationHeader) - if authorization != "" { - if strings.Contains(authorization, setting.RootAPIKey) { - token := strings.Split(authorization, " ") - if len(token) == 2 && token[1] == config.PoetryAPIRootKey() { - next.ServeHTTP(w, r) - } - return - } - - if strings.Contains(authorization, setting.UserAPIKey) { - token := strings.Split(authorization, " ") - if len(token) == 2 { - //根据token获取用户 - userInfo, err := poetry.GetUserDetailByToken(configbase.PoetryServiceAddress(), token[1]) - if err != nil { - w.WriteHeader(http.StatusUnauthorized) - _ = json.NewEncoder(w).Encode(&EndpointResponse{ResultCode: http.StatusUnauthorized, ErrorMsg: "auth failed"}) - return - } - - r.Header.Set("userId", strconv.Itoa(userInfo.ID)) - r.Header.Set("isSuperUser", strconv.FormatBool(userInfo.IsSuperUser)) - next.ServeHTTP(w, r) - } - return - } - } else if token, err := r.Cookie("TOKEN"); err == nil { - userInfo, err := poetry.GetUserDetailByToken(configbase.PoetryServiceAddress(), token.Value) - if err != nil { - log.Errorf("PoetryRequest err:%v", err) - w.WriteHeader(http.StatusUnauthorized) - _ = json.NewEncoder(w).Encode(&EndpointResponse{ResultCode: http.StatusUnauthorized, ErrorMsg: "auth failed"}) - return - } - - r.Header.Set("userId", strconv.Itoa(userInfo.ID)) - r.Header.Set("isSuperUser", strconv.FormatBool(userInfo.IsSuperUser)) - next.ServeHTTP(w, r) - } - }) -} - -func PermissionMiddleware(next http.Handler) http.Handler { - logger := log.SugaredLogger() - - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - url := r.URL.Path - if strings.Contains("/api/health/", url) { - next.ServeHTTP(w, r) - return - } - pathParams := mux.Vars(r) - productName := pathParams["productName"] - userIDStr := r.Header.Get("userId") - isSuperUserStr := r.Header.Get("isSuperUser") - isSuperUser, parseErr := strconv.ParseBool(isSuperUserStr) - if isSuperUser { - next.ServeHTTP(w, r) - return - } - userID, atoiErr := strconv.Atoi(userIDStr) - if parseErr != nil || atoiErr != nil { - w.WriteHeader(http.StatusForbidden) - _ = json.NewEncoder(w).Encode(&EndpointResponse{ResultCode: http.StatusForbidden, ErrorMsg: "forbidden!"}) - return - } - - queryList := r.URL.Query() - clusterID := queryList.Get("clusterId") - if clusterID == "" { - isHaveTestEnvManagePermission := PoetryRequestPermission(userID, permission.TestEnvManageUUID, productName, logger) - if isHaveTestEnvManagePermission { - next.ServeHTTP(w, r) - return - } - } else { - isHaveProdEnvManagePermission := PoetryRequestPermission(userID, permission.ProdEnvManageUUID, productName, logger) - if isHaveProdEnvManagePermission { - next.ServeHTTP(w, r) - return - } - } - - w.WriteHeader(http.StatusForbidden) - _ = json.NewEncoder(w).Encode(&EndpointResponse{ResultCode: http.StatusForbidden, ErrorMsg: "forbidden!"}) - }) -} - -func PoetryRequestPermission(userID int, permissionUUID, productName string, logger *zap.SugaredLogger) bool { - poetryClient := poetry.New(configbase.PoetryServiceAddress(), config.PoetryAPIRootKey()) - if poetryClient.HasOperatePermission(productName, permissionUUID, userID, false, logger) { - return true - } - - uuids, err := poetryClient.GetUserPermissionUUIDs(setting.RoleUserID, "", logger) - if err != nil { - log.Errorf("GetUserPermissionUUIDs error: %v", err) - return false - } - if sets.NewString(uuids...).Has(permissionUUID) { - return true - } - - return false -} diff --git a/pkg/microservice/podexec/server/server.go b/pkg/microservice/podexec/server/server.go index 55f12b929..09eb0fdad 100644 --- a/pkg/microservice/podexec/server/server.go +++ b/pkg/microservice/podexec/server/server.go @@ -43,8 +43,6 @@ func Serve(ctx context.Context) error { _ = json.NewEncoder(w).Encode(map[string]string{"message": "success"}) }) router.HandleFunc("/api/{productName}/{namespace}/{podName}/{containerName}/podExec", service.ServeWs) - router.Use(service.AuthMiddleware) - router.Use(service.PermissionMiddleware) server := &http.Server{ Addr: "0.0.0.0:27000", diff --git a/pkg/middleware/gin/permission.go b/pkg/middleware/gin/permission.go deleted file mode 100644 index 8f5a690c4..000000000 --- a/pkg/middleware/gin/permission.go +++ /dev/null @@ -1,190 +0,0 @@ -/* -Copyright 2021 The KodeRover 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 gin - -import ( - "fmt" - "net/http" - - "github.com/gin-gonic/gin" - "k8s.io/apimachinery/pkg/util/sets" - - "github.com/koderover/zadig/pkg/config" - "github.com/koderover/zadig/pkg/setting" - "github.com/koderover/zadig/pkg/shared/poetry" - "github.com/koderover/zadig/pkg/types/permission" - "github.com/koderover/zadig/pkg/util/ginzap" -) - -// RequireSuperAdminAuth require super user role -func RequireSuperAdminAuth(c *gin.Context) { - log := ginzap.WithContext(c).Sugar() - username := c.GetString(setting.SessionUsername) - user, err := authUser(username, c) - if err != nil { - log.Errorf("authUser(%s) failed, %v", username, err) - c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"message": "Authentication failed."}) - return - } - if user.IsSuperUser { - c.Next() - return - } - c.AbortWithStatusJSON(http.StatusForbidden, gin.H{"message": "Require super user permission"}) -} - -//判断用户是否有某个权限 -func IsHavePermission(permissionUUIDs []string, paramType int) gin.HandlerFunc { - return func(c *gin.Context) { - log := ginzap.WithContext(c).Sugar() - username := c.GetString(setting.SessionUsername) - user, err := authUser(username, c) - if err != nil { - log.Errorf("authUser(%s) failed, %v", username, err) - c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"message": "Authentication failed."}) - return - } - - if user.IsSuperUser { - c.Next() - return - } - - var productName string - poetryClient := poetry.New(config.PoetryServiceAddress(), config.PoetryAPIRootKey()) - - if paramType == permission.ParamType { - productName = c.Param("name") - if productName == "" { - productName = c.Param("productName") - } - } else if paramType == permission.QueryType { - productName = c.Query("productName") - if productName == "" { - productName = c.Query("productTmpl") - } - } else if paramType == permission.ContextKeyType { - productName = c.GetString("productName") - } - - if productName == "" { - log.Errorf("productName is null") - c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"message": "Authentication failed."}) - return - } - - //其他权限 - permissionUUID := "" - if len(permissionUUIDs) == 1 { - permissionUUID = permissionUUIDs[0] - } else if len(permissionUUIDs) == 2 || len(permissionUUIDs) == 3 { - envType := c.Query("envType") - switch envType { - case setting.ProdENV: - permissionUUID = permissionUUIDs[1] - default: - permissionUUID = permissionUUIDs[0] - } - } - - //判断用户是否有操作的权限uuid - if rolePermissionMap, err := poetryClient.GetUserPermissionUUIDMap(productName, permissionUUID, user.ID, log); err == nil { - if rolePermissionMap["isContain"] { - c.Next() - return - } - } else { - c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"message": "Authentication failed."}) - return - } - - //判断用户是否有环境授权权限uuid - if roleEnvPermissions, err := poetryClient.ListEnvRolePermission(productName, "", 0, log); err == nil { - for _, roleEnvPermission := range roleEnvPermissions { - if roleEnvPermission.PermissionUUID == permissionUUID { - c.Next() - return - } - } - } else { - c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"message": "Authentication failed."}) - return - } - - if len(permissionUUIDs) == 3 { - permissionUUID = permissionUUIDs[2] - if rolePermissionMap, err := poetryClient.GetUserPermissionUUIDMap(productName, permissionUUID, user.ID, log); err == nil { - if rolePermissionMap["isContain"] { - c.Next() - return - } - } else { - c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"message": "Authentication failed."}) - return - } - } - - // 判断项目里面是否有all-users设置,以及该有的权限 - productRole, _ := poetryClient.ListRoles(productName, log) - if productRole != nil { - uuids, err := poetryClient.GetUserPermissionUUIDs(productRole.ID, productName, log) - if err != nil { - log.Errorf("GetUserPermissionUUIDs error: %v", err) - c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"message": "Authentication failed."}) - return - } - if sets.NewString(uuids...).Has(permissionUUID) { - c.Next() - return - } - } - - //判断普通用户的默认权限是否包含 - uuids, err := poetryClient.GetUserPermissionUUIDs(setting.RoleUserID, "", log) - if err != nil { - log.Errorf("GetUserPermissionUUIDs error: %v", err) - c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"message": "Authentication failed."}) - return - } - if sets.NewString(uuids...).Has(permissionUUID) { - c.Next() - return - } - - c.AbortWithStatusJSON(http.StatusForbidden, gin.H{"message": "对不起,您没有权限访问!"}) - } -} - -func authUser(username interface{}, c *gin.Context) (*permission.User, error) { - - username, ok := username.(string) - if !ok || username == "" { - return nil, fmt.Errorf("empty user id") - } - - userInfo, isExist := c.Get(setting.SessionUser) - user := new(poetry.UserInfo) - if isExist { - user = userInfo.(*poetry.UserInfo) - } - //说明用户可能已经删除 - if user.Name == "" { - return nil, fmt.Errorf("user %s has been disabled", username) - } - - return poetry.ConvertUserInfo(user), nil -} diff --git a/pkg/types/permission/permission.go b/pkg/types/permission/permission.go index abbbfaf7a..b80b724b9 100644 --- a/pkg/types/permission/permission.go +++ b/pkg/types/permission/permission.go @@ -17,50 +17,6 @@ limitations under the License. package permission const ( - SuperUserUUID = "00000" //超级用户权限 - //产品工作流相关 - WorkflowTaskUUID = "30001" //产品工作流(执行任务、重启任务、取消任务) - WorkflowUpdateUUID = "30002" //产品工作流(更新) - WorkflowCreateUUID = "30003" //产品工作流(创建) - WorkflowDeleteUUID = "30004" //产品工作流(删除) - WorkflowListUUID = "30005" //产品工作流(查看) - WorkflowDeliveryUUID = "30006" //产品工作流(添加交付) - - //集成环境(测试环境) - TestEnvCreateUUID = "40001" //创建环境 - TestEnvDeleteUUID = "40002" //删除环境 - TestEnvManageUUID = "40003" //环境管理(环境更新、单服务更新、服务伸缩、服务重启、configmap更新、configmap回滚、重启实例、yaml导出) - TestEnvListUUID = "40004" //环境查看 - TestEnvShareUUID = "40005" //环境授权 - TestUpdateEnvUUID = "40010" //更新环境 - - //集成环境(生产环境) - ProdEnvListUUID = "40006" //环境查看 - ProdEnvCreateUUID = "40007" //创建环境 - ProdEnvManageUUID = "40008" //环境管理(环境更新、单服务更新、服务伸缩、服务重启、configMap更新、configMap回滚、重启实例、yaml导出) - ProdEnvDeleteUUID = "40009" //删除环境 - - //原项目管理相关 - //构建管理 - BuildDeleteUUID = "50007" //删除构建配置 - BuildManageUUID = "50008" //构建配置管理(创建构建、修改构建、修改服务组件) - BuildListUUID = "50019" //构建配置查看 - - //服务管理 - ServiceTemplateEditUUID = "50022" //修改服务编排 - ServiceTemplateManageUUID = "50023" //服务模板管理(创建服务模板、修改服务模板) - ServiceTemplateDeleteUUID = "50024" //删除服务模板 - ServiceTemplateListUUID = "50025" //查看服务模板 - - //测试管理 - TestDeleteUUID = "50010" //删除测试 - TestManageUUID = "50011" //测试管理(创建测试、修改测试) - TestListUUID = "50020" //查看测试 - - //交付中心 - ReleaseDeleteUUID = "70001" //交付中心删除版本 - - ParamType = 1 - QueryType = 2 - ContextKeyType = 3 + WorkflowUpdateUUID = "30002" //产品工作流(更新) + TestManageUUID = "50011" //测试管理(创建测试、修改测试) ) -- Gitee From ec00c105d9eaa21727d26213984c506fb84f7132 Mon Sep 17 00:00:00 2001 From: mouuii Date: Tue, 19 Oct 2021 18:40:24 +0800 Subject: [PATCH 047/405] roles policy service Signed-off-by: mouuii --- pkg/microservice/policy/core/handler/role.go | 7 ++++++- pkg/microservice/policy/core/repository/mongodb/role.go | 5 ++++- pkg/microservice/policy/core/service/bundle/opa_bundle.go | 2 +- pkg/microservice/policy/core/service/role.go | 6 +++++- 4 files changed, 16 insertions(+), 4 deletions(-) diff --git a/pkg/microservice/policy/core/handler/role.go b/pkg/microservice/policy/core/handler/role.go index e96bdec7f..64c927d1d 100644 --- a/pkg/microservice/policy/core/handler/role.go +++ b/pkg/microservice/policy/core/handler/role.go @@ -85,6 +85,11 @@ func DeleteRole(c *gin.Context) { ctx.Err = e.ErrInvalidParam.AddDesc("args name can't be empty") return } - ctx.Err = service.DeleteGlobalRole(c.Param("name"), ctx.Logger) + projectName := c.Query("projectName") + if name == "" { + ctx.Err = e.ErrInvalidParam.AddDesc("args projectName can't be empty") + return + } + ctx.Err = service.DeleteRole(name, projectName, ctx.Logger) return } diff --git a/pkg/microservice/policy/core/repository/mongodb/role.go b/pkg/microservice/policy/core/repository/mongodb/role.go index 339acf2bb..48c9db650 100644 --- a/pkg/microservice/policy/core/repository/mongodb/role.go +++ b/pkg/microservice/policy/core/repository/mongodb/role.go @@ -107,8 +107,11 @@ func (c *RoleColl) Create(obj *models.Role) error { return err } -func (c *RoleColl) Delete(name string) error { +func (c *RoleColl) Delete(name string, projectName string) error { query := bson.M{"name": name} + if projectName != "" { + query["namespace"] = projectName + } _, err := c.DeleteOne(context.TODO(), query) return err } diff --git a/pkg/microservice/policy/core/service/bundle/opa_bundle.go b/pkg/microservice/policy/core/service/bundle/opa_bundle.go index 3089d1c61..d78387391 100644 --- a/pkg/microservice/policy/core/service/bundle/opa_bundle.go +++ b/pkg/microservice/policy/core/service/bundle/opa_bundle.go @@ -331,7 +331,7 @@ func GenerateOPABundle() error { log.Info("Generating OPA bundle") defer log.Info("OPA bundle is generated") - rs, err := mongodb.NewRoleColl().List() + rs, err := mongodb.NewRoleColl().List("") if err != nil { log.Errorf("Failed to list roles, err: %s", err) } diff --git a/pkg/microservice/policy/core/service/role.go b/pkg/microservice/policy/core/service/role.go index e71ecf63c..2d3625eb6 100644 --- a/pkg/microservice/policy/core/service/role.go +++ b/pkg/microservice/policy/core/service/role.go @@ -76,5 +76,9 @@ func ListGlobalRole(_ *zap.SugaredLogger) (roles []*Role, err error) { } func DeleteGlobalRole(name string, _ *zap.SugaredLogger) (err error) { - return mongodb.NewRoleColl().Delete(name) + return mongodb.NewRoleColl().Delete(name, "") +} + +func DeleteRole(name string, projectName string, _ *zap.SugaredLogger) (err error) { + return mongodb.NewRoleColl().Delete(name, projectName) } -- Gitee From 92c6c8ec34a808a8c76b1d1985ae195636d7ff02 Mon Sep 17 00:00:00 2001 From: mouuii Date: Tue, 19 Oct 2021 18:54:37 +0800 Subject: [PATCH 048/405] roles policy service Signed-off-by: mouuii --- pkg/microservice/policy/core/handler/role.go | 8 +++---- .../policy/core/handler/router.go | 4 ++-- .../policy/core/repository/mongodb/role.go | 2 +- pkg/microservice/policy/core/service/role.go | 21 ++----------------- 4 files changed, 9 insertions(+), 26 deletions(-) diff --git a/pkg/microservice/policy/core/handler/role.go b/pkg/microservice/policy/core/handler/role.go index 64c927d1d..0a330720e 100644 --- a/pkg/microservice/policy/core/handler/role.go +++ b/pkg/microservice/policy/core/handler/role.go @@ -43,7 +43,7 @@ func CreateRole(c *gin.Context) { ctx.Err = service.CreateRole(projectName, args, ctx.Logger) } -func ListRole(c *gin.Context) { +func ListRoles(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() @@ -52,7 +52,7 @@ func ListRole(c *gin.Context) { ctx.Err = e.ErrInvalidParam.AddDesc("args projectName can't be empty") return } - ctx.Resp, ctx.Err = service.ListRole(projectName) + ctx.Resp, ctx.Err = service.ListRoles(projectName) return } @@ -69,11 +69,11 @@ func CreateGlobalRole(c *gin.Context) { ctx.Err = service.CreateRole("", args, ctx.Logger) } -func ListGlobalRole(c *gin.Context) { +func ListGlobalRoles(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - ctx.Resp, ctx.Err = service.ListGlobalRole(ctx.Logger) + ctx.Resp, ctx.Err = service.ListRoles("") return } diff --git a/pkg/microservice/policy/core/handler/router.go b/pkg/microservice/policy/core/handler/router.go index e49800d41..75d74555d 100644 --- a/pkg/microservice/policy/core/handler/router.go +++ b/pkg/microservice/policy/core/handler/router.go @@ -26,14 +26,14 @@ func (*Router) Inject(router *gin.RouterGroup) { roles := router.Group("roles") { roles.POST("", CreateRole) - roles.GET("", ListRole) + roles.GET("", ListRoles) roles.DELETE("/:name", DeleteRole) } globalRoles := router.Group("global-roles") { globalRoles.POST("", CreateGlobalRole) - globalRoles.GET("", ListGlobalRole) + globalRoles.GET("", ListGlobalRoles) globalRoles.DELETE("/:name", DeleteRole) } diff --git a/pkg/microservice/policy/core/repository/mongodb/role.go b/pkg/microservice/policy/core/repository/mongodb/role.go index 48c9db650..aeb448cb1 100644 --- a/pkg/microservice/policy/core/repository/mongodb/role.go +++ b/pkg/microservice/policy/core/repository/mongodb/role.go @@ -107,7 +107,7 @@ func (c *RoleColl) Create(obj *models.Role) error { return err } -func (c *RoleColl) Delete(name string, projectName string) error { +func (c *RoleColl) DeleteBy(name string, projectName string) error { query := bson.M{"name": name} if projectName != "" { query["namespace"] = projectName diff --git a/pkg/microservice/policy/core/service/role.go b/pkg/microservice/policy/core/service/role.go index 2d3625eb6..b55c85e57 100644 --- a/pkg/microservice/policy/core/service/role.go +++ b/pkg/microservice/policy/core/service/role.go @@ -25,7 +25,7 @@ import ( type Role struct { Name string `json:"name"` - Rules []*Rule `json:"rules"` + Rules []*Rule `json:"rules,omitempty"` } type Rule struct { @@ -49,7 +49,7 @@ func CreateRole(ns string, role *Role, _ *zap.SugaredLogger) error { return mongodb.NewRoleColl().Create(obj) } -func ListRole(projectName string) (roles []*Role, err error) { +func ListRoles(projectName string) (roles []*Role, err error) { projectRoles, err := mongodb.NewRoleColl().List(projectName) if err != nil { return nil, err @@ -62,23 +62,6 @@ func ListRole(projectName string) (roles []*Role, err error) { return roles, nil } -func ListGlobalRole(_ *zap.SugaredLogger) (roles []*Role, err error) { - globalRoles, err := mongodb.NewRoleColl().List("") - if err != nil { - return nil, err - } - for _, v := range globalRoles { - roles = append(roles, &Role{ - Name: v.Name, - }) - } - return roles, nil -} - -func DeleteGlobalRole(name string, _ *zap.SugaredLogger) (err error) { - return mongodb.NewRoleColl().Delete(name, "") -} - func DeleteRole(name string, projectName string, _ *zap.SugaredLogger) (err error) { return mongodb.NewRoleColl().Delete(name, projectName) } -- Gitee From 76cc998ad651e9ab101e94daff6883de96faf298 Mon Sep 17 00:00:00 2001 From: mouuii Date: Tue, 19 Oct 2021 18:56:29 +0800 Subject: [PATCH 049/405] roles policy service Signed-off-by: mouuii --- pkg/microservice/policy/core/handler/role.go | 4 ++-- pkg/microservice/policy/core/service/role.go | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pkg/microservice/policy/core/handler/role.go b/pkg/microservice/policy/core/handler/role.go index 0a330720e..4f2bd3231 100644 --- a/pkg/microservice/policy/core/handler/role.go +++ b/pkg/microservice/policy/core/handler/role.go @@ -52,7 +52,7 @@ func ListRoles(c *gin.Context) { ctx.Err = e.ErrInvalidParam.AddDesc("args projectName can't be empty") return } - ctx.Resp, ctx.Err = service.ListRoles(projectName) + ctx.Resp, ctx.Err = service.ListRoles(projectName, ctx.Logger) return } @@ -73,7 +73,7 @@ func ListGlobalRoles(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - ctx.Resp, ctx.Err = service.ListRoles("") + ctx.Resp, ctx.Err = service.ListRoles("", ctx.Logger) return } diff --git a/pkg/microservice/policy/core/service/role.go b/pkg/microservice/policy/core/service/role.go index b55c85e57..5eadea354 100644 --- a/pkg/microservice/policy/core/service/role.go +++ b/pkg/microservice/policy/core/service/role.go @@ -49,7 +49,7 @@ func CreateRole(ns string, role *Role, _ *zap.SugaredLogger) error { return mongodb.NewRoleColl().Create(obj) } -func ListRoles(projectName string) (roles []*Role, err error) { +func ListRoles(projectName string, _ *zap.SugaredLogger) (roles []*Role, err error) { projectRoles, err := mongodb.NewRoleColl().List(projectName) if err != nil { return nil, err @@ -63,5 +63,5 @@ func ListRoles(projectName string) (roles []*Role, err error) { } func DeleteRole(name string, projectName string, _ *zap.SugaredLogger) (err error) { - return mongodb.NewRoleColl().Delete(name, projectName) + return mongodb.NewRoleColl().DeleteBy(name, projectName) } -- Gitee From 3f1f68b68ffc1008bbcf835521fa39842c63faab Mon Sep 17 00:00:00 2001 From: mouuii Date: Tue, 19 Oct 2021 19:13:13 +0800 Subject: [PATCH 050/405] roles policy service Signed-off-by: mouuii --- .../policy/core/repository/mongodb/role.go | 20 +++++++++++++++++-- .../policy/core/service/bundle/opa_bundle.go | 2 +- pkg/microservice/policy/core/service/role.go | 2 +- 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/pkg/microservice/policy/core/repository/mongodb/role.go b/pkg/microservice/policy/core/repository/mongodb/role.go index aeb448cb1..1e57e22c7 100644 --- a/pkg/microservice/policy/core/repository/mongodb/role.go +++ b/pkg/microservice/policy/core/repository/mongodb/role.go @@ -77,7 +77,24 @@ func (c *RoleColl) Get(ns, name string) (*models.Role, bool, error) { return res, true, nil } -func (c *RoleColl) List(projectName string) ([]*models.Role, error) { +func (c *RoleColl) List() ([]*models.Role, error) { + var res []*models.Role + + ctx := context.Background() + + cursor, err := c.Collection.Find(ctx, bson.M{}) + if err != nil { + return nil, err + } + + err = cursor.All(ctx, &res) + if err != nil { + return nil, err + } + return res, nil +} + +func (c *RoleColl) ListBy(projectName string) ([]*models.Role, error) { var res []*models.Role ctx := context.Background() @@ -93,7 +110,6 @@ func (c *RoleColl) List(projectName string) ([]*models.Role, error) { if err != nil { return nil, err } - return res, nil } diff --git a/pkg/microservice/policy/core/service/bundle/opa_bundle.go b/pkg/microservice/policy/core/service/bundle/opa_bundle.go index d78387391..3089d1c61 100644 --- a/pkg/microservice/policy/core/service/bundle/opa_bundle.go +++ b/pkg/microservice/policy/core/service/bundle/opa_bundle.go @@ -331,7 +331,7 @@ func GenerateOPABundle() error { log.Info("Generating OPA bundle") defer log.Info("OPA bundle is generated") - rs, err := mongodb.NewRoleColl().List("") + rs, err := mongodb.NewRoleColl().List() if err != nil { log.Errorf("Failed to list roles, err: %s", err) } diff --git a/pkg/microservice/policy/core/service/role.go b/pkg/microservice/policy/core/service/role.go index 5eadea354..fb3e42a45 100644 --- a/pkg/microservice/policy/core/service/role.go +++ b/pkg/microservice/policy/core/service/role.go @@ -50,7 +50,7 @@ func CreateRole(ns string, role *Role, _ *zap.SugaredLogger) error { } func ListRoles(projectName string, _ *zap.SugaredLogger) (roles []*Role, err error) { - projectRoles, err := mongodb.NewRoleColl().List(projectName) + projectRoles, err := mongodb.NewRoleColl().ListBy(projectName) if err != nil { return nil, err } -- Gitee From 7db96b6faf5bbdc73766e448b4c2ecf80ec9c94a Mon Sep 17 00:00:00 2001 From: mouuii Date: Tue, 19 Oct 2021 19:17:42 +0800 Subject: [PATCH 051/405] roles policy service Signed-off-by: mouuii --- pkg/microservice/policy/core/handler/role.go | 4 ---- pkg/microservice/policy/core/repository/mongodb/role.go | 6 ++---- pkg/microservice/policy/core/service/role.go | 2 +- 3 files changed, 3 insertions(+), 9 deletions(-) diff --git a/pkg/microservice/policy/core/handler/role.go b/pkg/microservice/policy/core/handler/role.go index 4f2bd3231..a8fad57f2 100644 --- a/pkg/microservice/policy/core/handler/role.go +++ b/pkg/microservice/policy/core/handler/role.go @@ -81,10 +81,6 @@ func DeleteRole(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() name := c.Param("name") - if name == "" { - ctx.Err = e.ErrInvalidParam.AddDesc("args name can't be empty") - return - } projectName := c.Query("projectName") if name == "" { ctx.Err = e.ErrInvalidParam.AddDesc("args projectName can't be empty") diff --git a/pkg/microservice/policy/core/repository/mongodb/role.go b/pkg/microservice/policy/core/repository/mongodb/role.go index 1e57e22c7..28ff780d7 100644 --- a/pkg/microservice/policy/core/repository/mongodb/role.go +++ b/pkg/microservice/policy/core/repository/mongodb/role.go @@ -123,11 +123,9 @@ func (c *RoleColl) Create(obj *models.Role) error { return err } -func (c *RoleColl) DeleteBy(name string, projectName string) error { +func (c *RoleColl) Delete(name string, projectName string) error { query := bson.M{"name": name} - if projectName != "" { - query["namespace"] = projectName - } + query["namespace"] = projectName _, err := c.DeleteOne(context.TODO(), query) return err } diff --git a/pkg/microservice/policy/core/service/role.go b/pkg/microservice/policy/core/service/role.go index fb3e42a45..72a974575 100644 --- a/pkg/microservice/policy/core/service/role.go +++ b/pkg/microservice/policy/core/service/role.go @@ -63,5 +63,5 @@ func ListRoles(projectName string, _ *zap.SugaredLogger) (roles []*Role, err err } func DeleteRole(name string, projectName string, _ *zap.SugaredLogger) (err error) { - return mongodb.NewRoleColl().DeleteBy(name, projectName) + return mongodb.NewRoleColl().Delete(name, projectName) } -- Gitee From b7c5e39523e07ed9df188e513d886759a73bc053 Mon Sep 17 00:00:00 2001 From: mouuii Date: Tue, 19 Oct 2021 19:32:04 +0800 Subject: [PATCH 052/405] roles policy service Signed-off-by: mouuii --- pkg/microservice/policy/core/repository/mongodb/role.go | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/pkg/microservice/policy/core/repository/mongodb/role.go b/pkg/microservice/policy/core/repository/mongodb/role.go index 28ff780d7..a8130617c 100644 --- a/pkg/microservice/policy/core/repository/mongodb/role.go +++ b/pkg/microservice/policy/core/repository/mongodb/role.go @@ -98,8 +98,7 @@ func (c *RoleColl) ListBy(projectName string) ([]*models.Role, error) { var res []*models.Role ctx := context.Background() - query := bson.M{} - query["namespace"] = projectName + query := bson.M{"namespace": projectName} cursor, err := c.Collection.Find(ctx, query) if err != nil { @@ -124,8 +123,7 @@ func (c *RoleColl) Create(obj *models.Role) error { } func (c *RoleColl) Delete(name string, projectName string) error { - query := bson.M{"name": name} - query["namespace"] = projectName + query := bson.M{"name": name, "namespace": projectName} _, err := c.DeleteOne(context.TODO(), query) return err } -- Gitee From ad5f7804c402e8f3bed790bf1845bac669fb687f Mon Sep 17 00:00:00 2001 From: mouuii Date: Tue, 19 Oct 2021 19:35:18 +0800 Subject: [PATCH 053/405] roles policy service Signed-off-by: mouuii --- pkg/microservice/policy/core/handler/role.go | 4 ---- 1 file changed, 4 deletions(-) diff --git a/pkg/microservice/policy/core/handler/role.go b/pkg/microservice/policy/core/handler/role.go index a8fad57f2..d202a15c6 100644 --- a/pkg/microservice/policy/core/handler/role.go +++ b/pkg/microservice/policy/core/handler/role.go @@ -82,10 +82,6 @@ func DeleteRole(c *gin.Context) { defer func() { internalhandler.JSONResponse(c, ctx) }() name := c.Param("name") projectName := c.Query("projectName") - if name == "" { - ctx.Err = e.ErrInvalidParam.AddDesc("args projectName can't be empty") - return - } ctx.Err = service.DeleteRole(name, projectName, ctx.Logger) return } -- Gitee From 01a69357291d7553e3a5fb71eb494843ddc9d14d Mon Sep 17 00:00:00 2001 From: lou Date: Tue, 19 Oct 2021 20:05:19 +0800 Subject: [PATCH 054/405] remove auth check Signed-off-by: lou --- pkg/microservice/aslan/config/config.go | 4 -- .../core/common/service/collie/client.go | 9 +--- .../aslan/core/common/service/git/hook.go | 2 +- .../aslan/core/common/service/product.go | 2 +- .../core/common/service/template_product.go | 6 +-- .../aslan/core/common/service/utils.go | 2 +- .../core/environment/service/environment.go | 2 +- .../aslan/core/environment/service/product.go | 2 +- .../core/environment/service/revision.go | 2 +- .../aslan/core/project/service/product.go | 10 ++--- .../aslan/core/setting/service/user.go | 2 +- .../aslan/core/system/service/capacity.go | 2 +- .../workflow/service/workflow/nsq_handlers.go | 4 +- .../service/workflow/pipeline_controller.go | 2 +- .../service/workflow/pipeline_task.go | 2 +- .../service/workflow/workflow_task.go | 2 +- pkg/microservice/cron/config/config.go | 8 ---- .../cron/core/service/client/caller.go | 4 +- .../cron/core/service/client/client.go | 4 +- .../cron/core/service/client/collie_client.go | 9 +--- .../cron/core/service/client/cronjob.go | 4 +- .../cron/core/service/client/env.go | 6 --- .../cron/core/service/client/operation.go | 2 - .../cron/core/service/client/pipeline.go | 2 - .../cron/core/service/client/sonar.go | 4 -- .../cron/core/service/client/testing.go | 2 - .../cron/core/service/client/workflow.go | 2 - .../cron/core/service/client/workflow_test.go | 42 ------------------ .../core/service/scheduler/cronjob_handler.go | 5 --- .../cron/core/service/scheduler/scheduler.go | 6 +-- .../core/service/taskplugin/build.go | 2 +- .../core/service/taskplugin/deploy.go | 2 - .../warpdrive/core/service/taskplugin/jira.go | 2 +- .../core/service/taskplugin/security.go | 3 -- pkg/middleware/gin/audit_log.go | 2 +- pkg/setting/consts.go | 3 -- pkg/shared/client/aslan/client.go | 19 +++----- pkg/shared/client/aslanx/client.go | 9 +--- pkg/shared/codehost/codehost.go | 2 +- pkg/shared/handler/base.go | 2 +- pkg/shared/poetry/auth.go | 43 ------------------- pkg/shared/poetry/client.go | 9 +--- pkg/shared/poetry/jira.go | 4 +- 43 files changed, 49 insertions(+), 208 deletions(-) delete mode 100644 pkg/microservice/cron/core/service/client/workflow_test.go delete mode 100644 pkg/shared/poetry/auth.go diff --git a/pkg/microservice/aslan/config/config.go b/pkg/microservice/aslan/config/config.go index d27203b63..d9243f8ce 100644 --- a/pkg/microservice/aslan/config/config.go +++ b/pkg/microservice/aslan/config/config.go @@ -78,10 +78,6 @@ func PoetryAPIServer() string { return configbase.PoetryServiceAddress() } -func PoetryAPIRootKey() string { - return viper.GetString(setting.ENVPoetryAPIRootKey) -} - func CollieAPIAddress() string { return configbase.CollieServiceAddress() } diff --git a/pkg/microservice/aslan/core/common/service/collie/client.go b/pkg/microservice/aslan/core/common/service/collie/client.go index a2b94c6a0..05c9beaff 100644 --- a/pkg/microservice/aslan/core/common/service/collie/client.go +++ b/pkg/microservice/aslan/core/common/service/collie/client.go @@ -17,27 +17,22 @@ limitations under the License. package collie import ( - "github.com/koderover/zadig/pkg/setting" "github.com/koderover/zadig/pkg/tool/httpclient" ) type Client struct { *httpclient.Client - host string - token string + host string } -func New(host, token string) *Client { +func New(host string) *Client { c := httpclient.New( - httpclient.SetAuthScheme(setting.RootAPIKey), - httpclient.SetAuthToken(token), httpclient.SetHostURL(host), ) return &Client{ Client: c, host: host, - token: token, } } diff --git a/pkg/microservice/aslan/core/common/service/git/hook.go b/pkg/microservice/aslan/core/common/service/git/hook.go index dcff7666c..6450ef316 100644 --- a/pkg/microservice/aslan/core/common/service/git/hook.go +++ b/pkg/microservice/aslan/core/common/service/git/hook.go @@ -29,7 +29,7 @@ var secret string func GetHookSecret() string { once.Do(func() { - poetryClient := poetry.New(config.PoetryAPIServer(), config.PoetryAPIRootKey()) + poetryClient := poetry.New(config.PoetryAPIServer()) org, err := poetryClient.GetOrganization(poetry.DefaultOrganization) if err != nil { log.Errorf("failed to find default organization: %v", err) diff --git a/pkg/microservice/aslan/core/common/service/product.go b/pkg/microservice/aslan/core/common/service/product.go index c80b56372..8028e2685 100644 --- a/pkg/microservice/aslan/core/common/service/product.go +++ b/pkg/microservice/aslan/core/common/service/product.go @@ -72,7 +72,7 @@ func DeleteProduct(username, envName, productName, requestID string, log *zap.Su log.Infof("[%s] delete product %s", username, productInfo.Namespace) LogProductStats(username, setting.DeleteProductEvent, productName, requestID, eventStart, log) - poetryClient := poetry.New(config.PoetryAPIServer(), config.PoetryAPIRootKey()) + poetryClient := poetry.New(config.PoetryAPIServer()) switch productInfo.Source { case setting.SourceFromHelm: diff --git a/pkg/microservice/aslan/core/common/service/template_product.go b/pkg/microservice/aslan/core/common/service/template_product.go index 2523538f2..bb4b46715 100644 --- a/pkg/microservice/aslan/core/common/service/template_product.go +++ b/pkg/microservice/aslan/core/common/service/template_product.go @@ -60,7 +60,7 @@ func GetProductTemplate(productName string, log *zap.SugaredLogger) (*template.P if strings.Contains(features, string(config.FreestyleType)) { // CI场景onboarding流程处于第二步时,需要返回ci工作流id,用于前端跳转 collieAPIAddress := config.CollieAPIAddress() - cl := collie.New(collieAPIAddress, config.PoetryAPIRootKey()) + cl := collie.New(collieAPIAddress) if resp.ProductFeature != nil && resp.ProductFeature.DevelopHabit == "yaml" && resp.OnboardingStatus == setting.OnboardingStatusSecond && collieAPIAddress != "" { ciPipelines, err := cl.ListCIPipelines(productName, log) if err != nil { @@ -118,7 +118,7 @@ func GetProductTemplate(productName string, log *zap.SugaredLogger) (*template.P if strings.Contains(features, string(config.FreestyleType)) { collieAPIAddress := config.CollieAPIAddress() - cl := collie.New(collieAPIAddress, config.PoetryAPIRootKey()) + cl := collie.New(collieAPIAddress) totalFreeStyles, err = cl.ListCIPipelines(productName, log) if err != nil { log.Errorf("GetProductTemplate freestyle.List err : %v", err) @@ -169,7 +169,7 @@ func GetFeatures(log *zap.SugaredLogger) (string, error) { featuresByteKey := []byte("features") featuresByteValue, err := cache.Get(featuresByteKey) if err != nil { - poetryCtl := poetry.New(config.PoetryAPIServer(), config.PoetryAPIRootKey()) + poetryCtl := poetry.New(config.PoetryAPIServer()) fs, err := poetryCtl.ListFeatures() if err != nil { return "", err diff --git a/pkg/microservice/aslan/core/common/service/utils.go b/pkg/microservice/aslan/core/common/service/utils.go index 742826e89..0c659c8b1 100644 --- a/pkg/microservice/aslan/core/common/service/utils.go +++ b/pkg/microservice/aslan/core/common/service/utils.go @@ -76,7 +76,7 @@ func SendFailedTaskMessage(username, productName, name, requestID string, workfl } // 如果是timer创建的任务,通知需要发送给该项目下有编辑工作流权限的用户 - poetryClient := poetry.New(config.PoetryAPIServer(), config.PoetryAPIRootKey()) + poetryClient := poetry.New(config.PoetryAPIServer()) users, _ := poetryClient.ListProductPermissionUsers(productName, perm, log) for _, user := range users { SendMessage(user, title, content, requestID, log) diff --git a/pkg/microservice/aslan/core/environment/service/environment.go b/pkg/microservice/aslan/core/environment/service/environment.go index 30c25cc60..f8f87b97b 100644 --- a/pkg/microservice/aslan/core/environment/service/environment.go +++ b/pkg/microservice/aslan/core/environment/service/environment.go @@ -127,7 +127,7 @@ func UpdateProductPublic(productName string, args *ProductParams, log *zap.Sugar return fmt.Errorf("UpdateProductPublic error: %v", err) } - poetryCtl := poetry.New(config.PoetryAPIServer(), config.PoetryAPIRootKey()) + poetryCtl := poetry.New(config.PoetryAPIServer()) if !args.IsPublic { //把公开设置成不公开 _, err := poetryCtl.AddEnvRolePermission(productName, args.EnvName, args.PermissionUUIDs, args.RoleID, log) if err != nil { diff --git a/pkg/microservice/aslan/core/environment/service/product.go b/pkg/microservice/aslan/core/environment/service/product.go index 52909896e..f4bee00c4 100644 --- a/pkg/microservice/aslan/core/environment/service/product.go +++ b/pkg/microservice/aslan/core/environment/service/product.go @@ -74,7 +74,7 @@ func CleanProductCronJob(requestID string, log *zap.SugaredLogger) { } } - poetryClient := poetry.New(config.PoetryAPIServer(), config.PoetryAPIRootKey()) + poetryClient := poetry.New(config.PoetryAPIServer()) users, _ := poetryClient.ListProductPermissionUsers("", "", log) for _, user := range users { commonservice.SendMessage(user, title, content, requestID, log) diff --git a/pkg/microservice/aslan/core/environment/service/revision.go b/pkg/microservice/aslan/core/environment/service/revision.go index e17cc768e..a75fb92f2 100644 --- a/pkg/microservice/aslan/core/environment/service/revision.go +++ b/pkg/microservice/aslan/core/environment/service/revision.go @@ -58,7 +58,7 @@ func ListProductsRevision(productName, envName string, userID int, superUser boo productNamespaces.Insert(publicProduct.Namespace) } - poetryCtl := poetry.New(config.PoetryAPIServer(), config.PoetryAPIRootKey()) + poetryCtl := poetry.New(config.PoetryAPIServer()) productNameMap, err = poetryCtl.GetUserProject(userID, log) if err != nil { log.Errorf("Collection.Product.List GetUserProject error: %v", err) diff --git a/pkg/microservice/aslan/core/project/service/product.go b/pkg/microservice/aslan/core/project/service/product.go index 8ee30f869..b4b9ab7a4 100644 --- a/pkg/microservice/aslan/core/project/service/product.go +++ b/pkg/microservice/aslan/core/project/service/product.go @@ -206,7 +206,7 @@ func UpdateProductTmplStatus(productName, onboardingStatus string, log *zap.Suga // UpdateProject 更新项目 func UpdateProject(name string, args *template.Product, log *zap.SugaredLogger) (err error) { - poetryCtl := poetry.New(config.PoetryAPIServer(), config.PoetryAPIRootKey()) + poetryCtl := poetry.New(config.PoetryAPIServer()) //创建团建和项目之间的关系 _, err = poetryCtl.AddProductTeam(args.ProductName, args.TeamID, args.UserIDs, log) @@ -242,7 +242,7 @@ func DeleteProductTemplate(userName, productName, requestID string, log *zap.Sug } } - poetryCtl := poetry.New(config.PoetryAPIServer(), config.PoetryAPIRootKey()) + poetryCtl := poetry.New(config.PoetryAPIServer()) //删除项目团队信息 if err = poetryCtl.DeleteProductTeam(productName, log); err != nil { @@ -284,7 +284,7 @@ func DeleteProductTemplate(userName, productName, requestID string, log *zap.Sug log.Errorf("DeleteProductTemplate productName %s getFeatures err: %v", productName, err) } if strings.Contains(features, string(config.FreestyleType)) { - collieClient := collie.New(config.CollieAPIAddress(), config.PoetryAPIRootKey()) + collieClient := collie.New(config.CollieAPIAddress()) if err = collieClient.DeleteCIPipelines(productName, log); err != nil { log.Errorf("DeleteProductTemplate Delete productName %s freestyle pipeline err: %v", productName, err) } @@ -466,7 +466,7 @@ func ForkProduct(userID int, username, requestID string, args *template.ForkProj } func UnForkProduct(userID int, username, productName, workflowName, envName, requestID string, log *zap.SugaredLogger) error { - poetryClient := poetry.New(config.PoetryAPIServer(), config.PoetryAPIRootKey()) + poetryClient := poetry.New(config.PoetryAPIServer()) if userEnvPermissions, _ := poetryClient.ListUserEnvPermission(productName, userID, log); len(userEnvPermissions) > 0 { if err := poetryClient.DeleteUserEnvPermission(productName, username, userID, log); err != nil { return e.ErrUnForkProduct.AddDesc(fmt.Sprintf("Failed to delete env permission for userID: %d, env: %s, productName: %s, the error is: %+v", userID, username, productName, err)) @@ -626,7 +626,7 @@ func ListTemplatesHierachy(userName string, userID int, superUser bool, log *zap return nil, e.ErrListProducts.AddDesc(err.Error()) } } else { - productNameMap, err := poetry.New(config.PoetryAPIServer(), config.PoetryAPIRootKey()).GetUserProject(userID, log) + productNameMap, err := poetry.New(config.PoetryAPIServer()).GetUserProject(userID, log) if err != nil { log.Errorf("ProfuctTmpl.List GetUserProject error: %v", err) return resp, e.ErrListProducts.AddDesc(err.Error()) diff --git a/pkg/microservice/aslan/core/setting/service/user.go b/pkg/microservice/aslan/core/setting/service/user.go index 269ff39b6..03ba10c33 100644 --- a/pkg/microservice/aslan/core/setting/service/user.go +++ b/pkg/microservice/aslan/core/setting/service/user.go @@ -88,7 +88,7 @@ func GetUserKubeConfig(userName string, userID int, superUser bool, log *zap.Sug productEnvs = append(productEnvs, publicProduct) namespaceSet.Insert(publicProduct.Namespace) } - poetryClient := poetry.New(config.PoetryAPIServer(), config.PoetryAPIRootKey()) + poetryClient := poetry.New(config.PoetryAPIServer()) productNameMap, err = poetryClient.GetUserProject(userID, log) if err != nil { log.Errorf("GetUserKubeConfig Collection.Product.List GetUserProject error: %v", err) diff --git a/pkg/microservice/aslan/core/system/service/capacity.go b/pkg/microservice/aslan/core/system/service/capacity.go index fba668bfc..79c1a3dd2 100644 --- a/pkg/microservice/aslan/core/system/service/capacity.go +++ b/pkg/microservice/aslan/core/system/service/capacity.go @@ -180,7 +180,7 @@ func sendSyscapNotify(handleErr error, totalCleanTasks *int) { IsRead: false, } - poetryClient := poetry.New(config.PoetryAPIServer(), config.PoetryAPIRootKey()) + poetryClient := poetry.New(config.PoetryAPIServer()) users, _ := poetryClient.ListProductPermissionUsers("", "", log.SugaredLogger()) for _, user := range users { notifyInfo.Receiver = user diff --git a/pkg/microservice/aslan/core/workflow/service/workflow/nsq_handlers.go b/pkg/microservice/aslan/core/workflow/service/workflow/nsq_handlers.go index 03b5b0a7f..0da283c87 100644 --- a/pkg/microservice/aslan/core/workflow/service/workflow/nsq_handlers.go +++ b/pkg/microservice/aslan/core/workflow/service/workflow/nsq_handlers.go @@ -69,7 +69,7 @@ type TaskAckHandler struct { log *zap.SugaredLogger } -func NewTaskAckHandler(poetryServer, poetryRootKey string, maxInFlight int, log *zap.SugaredLogger) *TaskAckHandler { +func NewTaskAckHandler(poetryServer string, maxInFlight int, log *zap.SugaredLogger) *TaskAckHandler { return &TaskAckHandler{ queue: NewPipelineQueue(log), ptColl: commonrepo.NewTaskColl(), @@ -79,7 +79,7 @@ func NewTaskAckHandler(poetryServer, poetryRootKey string, maxInFlight int, log deliveryArtifactColl: commonrepo.NewDeliveryArtifactColl(), deliveryActivityColl: commonrepo.NewDeliveryActivityColl(), TestTaskStatColl: commonrepo.NewTestTaskStatColl(), - PoetryClient: poetry.New(poetryServer, poetryRootKey), + PoetryClient: poetry.New(poetryServer), messages: make(chan *nsq.Message, maxInFlight*10), log: log, } diff --git a/pkg/microservice/aslan/core/workflow/service/workflow/pipeline_controller.go b/pkg/microservice/aslan/core/workflow/service/workflow/pipeline_controller.go index 7329538d8..f4c4cb969 100644 --- a/pkg/microservice/aslan/core/workflow/service/workflow/pipeline_controller.go +++ b/pkg/microservice/aslan/core/workflow/service/workflow/pipeline_controller.go @@ -43,7 +43,7 @@ func SubScribeNSQ() error { // init ack consumer ackConfig := nsqservice.Config() ackConfig.MaxInFlight = 50 - ackHandler := NewTaskAckHandler(config.PoetryAPIServer(), config.PoetryAPIRootKey(), ackConfig.MaxInFlight, logger) + ackHandler := NewTaskAckHandler(config.PoetryAPIServer(), ackConfig.MaxInFlight, logger) err := nsqservice.SubScribe(setting.TopicAck, "ack", 1, ackConfig, ackHandler) if err != nil { logger.Errorf("ack subscription failed, the error is: %v", err) diff --git a/pkg/microservice/aslan/core/workflow/service/workflow/pipeline_task.go b/pkg/microservice/aslan/core/workflow/service/workflow/pipeline_task.go index 63cbc48dd..7bf36d19f 100644 --- a/pkg/microservice/aslan/core/workflow/service/workflow/pipeline_task.go +++ b/pkg/microservice/aslan/core/workflow/service/workflow/pipeline_task.go @@ -163,7 +163,7 @@ func CreatePipelineTask(args *commonmodels.TaskArgs, log *zap.SugaredLogger) (*C } } - jiraInfo, _ := poetry.GetJiraInfo(config.PoetryAPIServer(), config.PoetryAPIRootKey()) + jiraInfo, _ := poetry.GetJiraInfo(config.PoetryAPIServer()) if jiraInfo != nil { jiraTask, err := AddPipelineJiraSubTask(pipeline, log) if err != nil { diff --git a/pkg/microservice/aslan/core/workflow/service/workflow/workflow_task.go b/pkg/microservice/aslan/core/workflow/service/workflow/workflow_task.go index 1983ba6b9..d6a4744a8 100644 --- a/pkg/microservice/aslan/core/workflow/service/workflow/workflow_task.go +++ b/pkg/microservice/aslan/core/workflow/service/workflow/workflow_task.go @@ -569,7 +569,7 @@ func CreateWorkflowTask(args *commonmodels.WorkflowTaskArgs, taskCreator string, subTasks = append(subTasks, distributeTasks...) } - jiraInfo, _ := poetry.GetJiraInfo(config.PoetryAPIServer(), config.PoetryAPIRootKey()) + jiraInfo, _ := poetry.GetJiraInfo(config.PoetryAPIServer()) if jiraInfo != nil { jiraTask, err := AddJiraSubTask("", target.Name, target.ServiceName, args.ProductTmplName, log) if err != nil { diff --git a/pkg/microservice/cron/config/config.go b/pkg/microservice/cron/config/config.go index b044a6333..95f8c0805 100644 --- a/pkg/microservice/cron/config/config.go +++ b/pkg/microservice/cron/config/config.go @@ -25,18 +25,10 @@ import ( "github.com/koderover/zadig/pkg/setting" ) -func RootToken() string { - return viper.GetString(setting.ENVRootToken) -} - func CollieAPI() string { return configbase.CollieServiceAddress() } -func CollieToken() string { - return RootToken() -} - func NsqLookupAddrs() []string { return strings.Split(viper.GetString(setting.ENVNsqLookupAddrs), ",") } diff --git a/pkg/microservice/cron/core/service/client/caller.go b/pkg/microservice/cron/core/service/client/caller.go index dca82f379..2f144cd14 100644 --- a/pkg/microservice/cron/core/service/client/caller.go +++ b/pkg/microservice/cron/core/service/client/caller.go @@ -24,8 +24,6 @@ import ( "net/http" "go.uber.org/zap" - - "github.com/koderover/zadig/pkg/setting" ) func (c *Client) ScheduleCall(api string, args interface{}, log *zap.SugaredLogger) error { @@ -41,7 +39,7 @@ func (c *Client) ScheduleCall(api string, args interface{}, log *zap.SugaredLogg log.Errorf("create post request error : %v", err) return err } - request.Header.Set("Authorization", fmt.Sprintf("%s %s", setting.TIMERAPIKEY, c.Token)) + var resp *http.Response resp, err = c.Conn.Do(request) if err == nil { diff --git a/pkg/microservice/cron/core/service/client/client.go b/pkg/microservice/cron/core/service/client/client.go index 7d41290cf..ab416baaf 100644 --- a/pkg/microservice/cron/core/service/client/client.go +++ b/pkg/microservice/cron/core/service/client/client.go @@ -23,17 +23,15 @@ import ( type Client struct { APIBase string - Token string Conn *http.Client } // NewAslanClient is to get aslan client func -func NewAslanClient(host, token string) *Client { +func NewAslanClient(host string) *Client { jar, _ := cookiejar.New(nil) c := &Client{ APIBase: host, - Token: token, Conn: &http.Client{Transport: http.DefaultTransport, Jar: jar}, } diff --git a/pkg/microservice/cron/core/service/client/collie_client.go b/pkg/microservice/cron/core/service/client/collie_client.go index 413a8151d..dbf6a1182 100644 --- a/pkg/microservice/cron/core/service/client/collie_client.go +++ b/pkg/microservice/cron/core/service/client/collie_client.go @@ -17,27 +17,22 @@ limitations under the License. package client import ( - "github.com/koderover/zadig/pkg/setting" "github.com/koderover/zadig/pkg/tool/httpclient" ) type CollieClient struct { *httpclient.Client - host string - token string + host string } -func NewCollieClient(host, token string) *CollieClient { +func NewCollieClient(host string) *CollieClient { c := httpclient.New( - httpclient.SetAuthScheme(setting.RootAPIKey), - httpclient.SetAuthToken(token), httpclient.SetHostURL(host), ) return &CollieClient{ Client: c, host: host, - token: token, } } diff --git a/pkg/microservice/cron/core/service/client/cronjob.go b/pkg/microservice/cron/core/service/client/cronjob.go index 2509b2f50..c1c727cf0 100644 --- a/pkg/microservice/cron/core/service/client/cronjob.go +++ b/pkg/microservice/cron/core/service/client/cronjob.go @@ -29,7 +29,6 @@ import ( "go.uber.org/zap" "github.com/koderover/zadig/pkg/microservice/cron/core/service" - "github.com/koderover/zadig/pkg/setting" "github.com/koderover/zadig/pkg/tool/rsa" ) @@ -169,7 +168,7 @@ func (c *Client) sendRequest(url string) error { if err != nil { return err } - request.Header.Set("Authorization", fmt.Sprintf("%s %s", setting.TIMERAPIKEY, c.Token)) + resp, err := c.Conn.Do(request) if err == nil { defer func() { _ = resp.Body.Close() }() @@ -183,7 +182,6 @@ func (c *Client) sendPostRequest(url string, body io.Reader, log *zap.SugaredLog log.Errorf("create post request error : %v", err) return "", err } - request.Header.Set("Authorization", fmt.Sprintf("%s %s", setting.TIMERAPIKEY, c.Token)) var resp *http.Response resp, err = c.Conn.Do(request) if err != nil { diff --git a/pkg/microservice/cron/core/service/client/env.go b/pkg/microservice/cron/core/service/client/env.go index 468b0190c..b50274e0e 100644 --- a/pkg/microservice/cron/core/service/client/env.go +++ b/pkg/microservice/cron/core/service/client/env.go @@ -27,7 +27,6 @@ import ( "go.uber.org/zap" "github.com/koderover/zadig/pkg/microservice/cron/core/service" - "github.com/koderover/zadig/pkg/setting" ) func (c *Client) ListEnvs(log *zap.SugaredLogger) ([]*service.ProductRevision, error) { @@ -44,7 +43,6 @@ func (c *Client) ListEnvs(log *zap.SugaredLogger) ([]*service.ProductRevision, e return nil, err } - request.Header.Set("Authorization", fmt.Sprintf("%s %s", setting.RootAPIKey, c.Token)) var ret *http.Response if ret, err = c.Conn.Do(request); err == nil { defer func() { _ = ret.Body.Close() }() @@ -71,7 +69,6 @@ func (c *Client) GetEnvService(productName, envName string, log *zap.SugaredLogg return nil, err } - request.Header.Set("Authorization", fmt.Sprintf("%s %s", setting.RootAPIKey, c.Token)) var ret *http.Response if ret, err = c.Conn.Do(request); err == nil { defer func() { _ = ret.Body.Close() }() @@ -99,7 +96,6 @@ func (c *Client) GetService(serviceName, productName, serviceType string, revisi return nil, err } - request.Header.Set("Authorization", fmt.Sprintf("%s %s", setting.RootAPIKey, c.Token)) var ret *http.Response if ret, err = c.Conn.Do(request); err == nil { defer func() { _ = ret.Body.Close() }() @@ -129,7 +125,6 @@ func (c *Client) UpdateService(args *service.ServiceTmplObject, log *zap.Sugared return err } - request.Header.Set("Authorization", fmt.Sprintf("%s %s", setting.RootAPIKey, c.Token)) var ret *http.Response if ret, err = c.Conn.Do(request); err == nil { defer func() { _ = ret.Body.Close() }() @@ -154,7 +149,6 @@ func (c *Client) GetHostInfo(hostID string, log *zap.SugaredLogger) (*service.Pr return nil, err } - request.Header.Set("Authorization", fmt.Sprintf("%s %s", setting.RootAPIKey, c.Token)) var ret *http.Response if ret, err = c.Conn.Do(request); err == nil { defer func() { _ = ret.Body.Close() }() diff --git a/pkg/microservice/cron/core/service/client/operation.go b/pkg/microservice/cron/core/service/client/operation.go index d7f1b4840..94f2db1bd 100644 --- a/pkg/microservice/cron/core/service/client/operation.go +++ b/pkg/microservice/cron/core/service/client/operation.go @@ -26,7 +26,6 @@ import ( "go.uber.org/zap" "github.com/koderover/zadig/pkg/microservice/cron/core/service" - "github.com/koderover/zadig/pkg/setting" ) func (c *Client) GetWebHookUser(log *zap.SugaredLogger) (*service.DomainWebHookUser, error) { @@ -42,7 +41,6 @@ func (c *Client) GetWebHookUser(log *zap.SugaredLogger) (*service.DomainWebHookU return domainWebHookUser, err } - request.Header.Set("Authorization", fmt.Sprintf("%s %s", setting.RootAPIKey, c.Token)) var ret *http.Response if ret, err = c.Conn.Do(request); err == nil { defer func() { _ = ret.Body.Close() }() diff --git a/pkg/microservice/cron/core/service/client/pipeline.go b/pkg/microservice/cron/core/service/client/pipeline.go index dacbe0bab..0d1aba96a 100644 --- a/pkg/microservice/cron/core/service/client/pipeline.go +++ b/pkg/microservice/cron/core/service/client/pipeline.go @@ -26,7 +26,6 @@ import ( "go.uber.org/zap" "github.com/koderover/zadig/pkg/microservice/cron/core/service" - "github.com/koderover/zadig/pkg/setting" ) func (c *Client) ListPipelines(log *zap.SugaredLogger) ([]*service.Pipeline, error) { @@ -40,7 +39,6 @@ func (c *Client) ListPipelines(log *zap.SugaredLogger) ([]*service.Pipeline, err return nil, err } - request.Header.Set("Authorization", fmt.Sprintf("%s %s", setting.RootAPIKey, c.Token)) var ret *http.Response if ret, err = c.Conn.Do(request); err == nil { defer func() { _ = ret.Body.Close() }() diff --git a/pkg/microservice/cron/core/service/client/sonar.go b/pkg/microservice/cron/core/service/client/sonar.go index d97e98843..4b50f102f 100644 --- a/pkg/microservice/cron/core/service/client/sonar.go +++ b/pkg/microservice/cron/core/service/client/sonar.go @@ -24,7 +24,6 @@ import ( "go.uber.org/zap" configbase "github.com/koderover/zadig/pkg/config" - "github.com/koderover/zadig/pkg/setting" ) func (c *Client) InitPullSonarStatScheduler(log *zap.SugaredLogger) error { @@ -45,7 +44,6 @@ func (c *Client) InitPullSonarTestsMeasure(log *zap.SugaredLogger) error { log.Errorf("create post request error : %v", err) return err } - request.Header.Set("Authorization", fmt.Sprintf("%s %s", setting.RootAPIKey, c.Token)) var resp *http.Response resp, err = c.Conn.Do(request) @@ -76,7 +74,6 @@ func (c *Client) InitPullSonarDeliveryMeasure(log *zap.SugaredLogger) error { log.Errorf("create post request error : %v", err) return err } - request.Header.Set("Authorization", fmt.Sprintf("%s %s", setting.RootAPIKey, c.Token)) var resp *http.Response resp, err = c.Conn.Do(request) @@ -107,7 +104,6 @@ func (c *Client) InitPullSonarRepos(log *zap.SugaredLogger) error { log.Errorf("create post request error : %v", err) return err } - request.Header.Set("Authorization", fmt.Sprintf("%s %s", setting.RootAPIKey, c.Token)) var resp *http.Response resp, err = c.Conn.Do(request) diff --git a/pkg/microservice/cron/core/service/client/testing.go b/pkg/microservice/cron/core/service/client/testing.go index bb7e50d9e..4154a0108 100644 --- a/pkg/microservice/cron/core/service/client/testing.go +++ b/pkg/microservice/cron/core/service/client/testing.go @@ -26,7 +26,6 @@ import ( "go.uber.org/zap" "github.com/koderover/zadig/pkg/microservice/cron/core/service" - "github.com/koderover/zadig/pkg/setting" ) func (c *Client) ListTests(log *zap.SugaredLogger) ([]*service.TestingOpt, error) { @@ -39,7 +38,6 @@ func (c *Client) ListTests(log *zap.SugaredLogger) ([]*service.TestingOpt, error return nil, err } - request.Header.Set("Authorization", fmt.Sprintf("%s %s", setting.RootAPIKey, c.Token)) var ret *http.Response ret, err = c.Conn.Do(request) diff --git a/pkg/microservice/cron/core/service/client/workflow.go b/pkg/microservice/cron/core/service/client/workflow.go index 894a0687a..6884d9f5b 100644 --- a/pkg/microservice/cron/core/service/client/workflow.go +++ b/pkg/microservice/cron/core/service/client/workflow.go @@ -26,7 +26,6 @@ import ( "go.uber.org/zap" "github.com/koderover/zadig/pkg/microservice/cron/core/service" - "github.com/koderover/zadig/pkg/setting" ) // ListWorkflows ... @@ -71,6 +70,5 @@ func (c *Client) genListWorkFlowReq(log *zap.SugaredLogger) (*http.Request, erro return nil, err } - request.Header.Set(setting.AuthorizationHeader, fmt.Sprintf("%s %s", setting.RootAPIKey, c.Token)) return request, nil } diff --git a/pkg/microservice/cron/core/service/client/workflow_test.go b/pkg/microservice/cron/core/service/client/workflow_test.go deleted file mode 100644 index 434dfc7a9..000000000 --- a/pkg/microservice/cron/core/service/client/workflow_test.go +++ /dev/null @@ -1,42 +0,0 @@ -/* -Copyright 2021 The KodeRover 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 client - -import ( - "fmt" - "testing" - - "github.com/stretchr/testify/assert" - - "github.com/koderover/zadig/pkg/setting" - "github.com/koderover/zadig/pkg/tool/log" -) - -const ( - testAPIHost = "os.koderover.com" - testAPIToken = "token" -) - -func TestGenListWorkFlowReq(t *testing.T) { - client := NewAslanClient( - testAPIHost, - testAPIToken, - ) - req, _ := client.genListWorkFlowReq(log.NopSugaredLogger()) - assert.Equal(t, fmt.Sprintf("%s/workflow/workflow", testAPIHost), req.URL.Path) - assert.Equal(t, fmt.Sprintf("%s %s", setting.RootAPIKey, testAPIToken), req.Header.Get(setting.AuthorizationHeader)) -} diff --git a/pkg/microservice/cron/core/service/scheduler/cronjob_handler.go b/pkg/microservice/cron/core/service/scheduler/cronjob_handler.go index a3a678fc8..284489745 100644 --- a/pkg/microservice/cron/core/service/scheduler/cronjob_handler.go +++ b/pkg/microservice/cron/core/service/scheduler/cronjob_handler.go @@ -69,14 +69,10 @@ func InitExistedCronjob(client *client.Client, scheduler *cronlib.CronSchduler) failsafeJobList []*service.Cronjob ) listAPI := fmt.Sprintf("%s/cron/cronjob", client.APIBase) - header := http.Header{} - header.Set("Authorization", fmt.Sprintf("%s %s", setting.TIMERAPIKEY, client.Token)) // failsafe function: get enabled workflow and register them failsafeAPI := fmt.Sprintf("%s/cron/cronjob/failsafe", client.APIBase) cl := httpclient.New( - httpclient.SetAuthScheme(setting.TIMERAPIKEY), - httpclient.SetAuthToken(client.Token), httpclient.SetRetryCount(100), httpclient.SetRetryWaitTime(PullInterval), ) @@ -304,7 +300,6 @@ func (h *CronjobHandler) stopCronjob(name, ptype string) error { var jobList []*service.Cronjob listAPI := fmt.Sprintf("%s/cron/cronjob/type/%s/name/%s", h.aslanCli.APIBase, ptype, name) header := http.Header{} - header.Set("Authorization", fmt.Sprintf("%s %s", setting.TIMERAPIKEY, h.aslanCli.Token)) resp, err := util.SendRequest(listAPI, "GET", header, nil) if err != nil { log.Errorf("Failed to get job list, the error is: %v, reconsuming", err) diff --git a/pkg/microservice/cron/core/service/scheduler/scheduler.go b/pkg/microservice/cron/core/service/scheduler/scheduler.go index 5ab7e0464..5f45ae44b 100644 --- a/pkg/microservice/cron/core/service/scheduler/scheduler.go +++ b/pkg/microservice/cron/core/service/scheduler/scheduler.go @@ -83,8 +83,8 @@ const ( func NewCronClient() *CronClient { nsqLookupAddrs := config.NsqLookupAddrs() - aslanCli := client.NewAslanClient(fmt.Sprintf("%s/api", configbase.AslanServiceAddress()), config.RootToken()) - collieCli := client.NewCollieClient(config.CollieAPI(), config.CollieToken()) + aslanCli := client.NewAslanClient(fmt.Sprintf("%s/api", configbase.AslanServiceAddress())) + collieCli := client.NewCollieClient(config.CollieAPI()) //初始化nsq config := nsq.NewConfig() // 注意 WD_POD_NAME 必须使用 Downward API 配置环境变量 @@ -160,7 +160,7 @@ func (c *CronClient) Init() { } func getFeatures() (string, error) { - cl := poetry.New(configbase.PoetryServiceAddress(), config.RootToken()) + cl := poetry.New(configbase.PoetryServiceAddress()) fs, err := cl.ListFeatures() if err != nil { return "", err diff --git a/pkg/microservice/warpdrive/core/service/taskplugin/build.go b/pkg/microservice/warpdrive/core/service/taskplugin/build.go index e9f614f9a..1867fd455 100644 --- a/pkg/microservice/warpdrive/core/service/taskplugin/build.go +++ b/pkg/microservice/warpdrive/core/service/taskplugin/build.go @@ -162,7 +162,7 @@ func (p *BuildTaskPlugin) Run(ctx context.Context, pipelineTask *task.Task, pipe Installs: p.Task.InstallCtx, } - poetryClient := poetry.New(configbase.PoetryServiceAddress(), config.PoetryAPIRootKey()) + poetryClient := poetry.New(configbase.PoetryServiceAddress()) if fs, err := poetryClient.ListFeatures(); err == nil { pipelineTask.Features = fs } diff --git a/pkg/microservice/warpdrive/core/service/taskplugin/deploy.go b/pkg/microservice/warpdrive/core/service/taskplugin/deploy.go index 529ad8e33..6fcad93ff 100644 --- a/pkg/microservice/warpdrive/core/service/taskplugin/deploy.go +++ b/pkg/microservice/warpdrive/core/service/taskplugin/deploy.go @@ -58,8 +58,6 @@ func InitializeDeployTaskPlugin(taskType config.TaskType) TaskPlugin { kubeClient: krkubeclient.Client(), restConfig: krkubeclient.RESTConfig(), httpClient: httpclient.New( - httpclient.SetAuthScheme(setting.RootAPIKey), - httpclient.SetAuthToken(config.PoetryAPIRootKey()), httpclient.SetHostURL(configbase.AslanServiceAddress()), ), } diff --git a/pkg/microservice/warpdrive/core/service/taskplugin/jira.go b/pkg/microservice/warpdrive/core/service/taskplugin/jira.go index f544f50e4..892100fd0 100644 --- a/pkg/microservice/warpdrive/core/service/taskplugin/jira.go +++ b/pkg/microservice/warpdrive/core/service/taskplugin/jira.go @@ -340,7 +340,7 @@ func (p *JiraPlugin) SetEndTime() { func (p *JiraPlugin) getJiraIssue(pipelineTask *task.Task, key string) (*task.JiraIssue, error) { jiraIssue := new(task.JiraIssue) - poetryClient := poetry.New(configbase.PoetryServiceAddress(), config.PoetryAPIRootKey()) + poetryClient := poetry.New(configbase.PoetryServiceAddress()) jiraInfo, err := poetryClient.GetJiraInfo() if err != nil { return nil, fmt.Errorf("getJiraInfo [%s] error: %v", key, err) diff --git a/pkg/microservice/warpdrive/core/service/taskplugin/security.go b/pkg/microservice/warpdrive/core/service/taskplugin/security.go index 43ac5a4ff..b03ab81ac 100644 --- a/pkg/microservice/warpdrive/core/service/taskplugin/security.go +++ b/pkg/microservice/warpdrive/core/service/taskplugin/security.go @@ -29,7 +29,6 @@ import ( "github.com/koderover/zadig/pkg/microservice/warpdrive/config" "github.com/koderover/zadig/pkg/microservice/warpdrive/core/service/types" "github.com/koderover/zadig/pkg/microservice/warpdrive/core/service/types/task" - "github.com/koderover/zadig/pkg/setting" "github.com/koderover/zadig/pkg/tool/httpclient" ) @@ -39,8 +38,6 @@ func InitializeSecurityPlugin(taskType config.TaskType) TaskPlugin { Name: taskType, errorChan: make(chan error, 1), httpClient: httpclient.New( - httpclient.SetAuthScheme(setting.RootAPIKey), - httpclient.SetAuthToken(config.PoetryAPIRootKey()), httpclient.SetHostURL(configbase.AslanServiceAddress()), ), } diff --git a/pkg/middleware/gin/audit_log.go b/pkg/middleware/gin/audit_log.go index d4c79a4a0..e3c1a6c0c 100644 --- a/pkg/middleware/gin/audit_log.go +++ b/pkg/middleware/gin/audit_log.go @@ -31,7 +31,7 @@ func UpdateOperationLogStatus(c *gin.Context) { if c.GetString("operationLogID") == "" { return } - err := aslan.New(config.AslanServiceAddress(), config.PoetryAPIRootKey()).UpdateAuditLog(c.GetString("operationLogID"), c.Writer.Status(), log) + err := aslan.New(config.AslanServiceAddress()).UpdateAuditLog(c.GetString("operationLogID"), c.Writer.Status(), log) if err != nil { log.Errorf("UpdateOperation err:%v", err) } diff --git a/pkg/setting/consts.go b/pkg/setting/consts.go index 0dfa6e852..3d79e2cd6 100644 --- a/pkg/setting/consts.go +++ b/pkg/setting/consts.go @@ -248,9 +248,6 @@ const ( const ( SessionUsername = "Username" SessionUser = "User" - UserAPIKey = "X-API-KEY" - RootAPIKey = "X-ROOT-API-KEY" - TIMERAPIKEY = "X-TIMER-API-KEY" AuthorizationHeader = "Authorization" ) diff --git a/pkg/shared/client/aslan/client.go b/pkg/shared/client/aslan/client.go index c34553ca0..ab453625b 100644 --- a/pkg/shared/client/aslan/client.go +++ b/pkg/shared/client/aslan/client.go @@ -17,43 +17,38 @@ limitations under the License. package aslan import ( - "github.com/koderover/zadig/pkg/setting" "github.com/koderover/zadig/pkg/tool/httpclient" ) type Client struct { *httpclient.Client - host string - token string + host string + token string external bool } -func New(host, token string) *Client { +func New(host string) *Client { c := httpclient.New( - httpclient.SetAuthScheme(setting.RootAPIKey), - httpclient.SetAuthToken(token), - httpclient.SetHostURL(host+"/api"), + httpclient.SetHostURL(host + "/api"), ) return &Client{ Client: c, host: host, - token: token, } } func NewExternal(host, token string) *Client { c := httpclient.New( - httpclient.SetAuthScheme(setting.UserAPIKey), httpclient.SetAuthToken(token), httpclient.SetHostURL(host+"/api/aslan"), ) return &Client{ - Client: c, - host: host, - token: token, + Client: c, + host: host, + token: token, external: true, } } diff --git a/pkg/shared/client/aslanx/client.go b/pkg/shared/client/aslanx/client.go index 05caf54c1..040894627 100644 --- a/pkg/shared/client/aslanx/client.go +++ b/pkg/shared/client/aslanx/client.go @@ -17,27 +17,22 @@ limitations under the License. package aslanx import ( - "github.com/koderover/zadig/pkg/setting" "github.com/koderover/zadig/pkg/tool/httpclient" ) type Client struct { *httpclient.Client - host string - token string + host string } -func New(host, token string) *Client { +func New(host string) *Client { c := httpclient.New( - httpclient.SetAuthScheme(setting.RootAPIKey), - httpclient.SetAuthToken(token), httpclient.SetHostURL(host), ) return &Client{ Client: c, host: host, - token: token, } } diff --git a/pkg/shared/codehost/codehost.go b/pkg/shared/codehost/codehost.go index 67b8d5f75..a266fd4a2 100644 --- a/pkg/shared/codehost/codehost.go +++ b/pkg/shared/codehost/codehost.go @@ -63,7 +63,7 @@ type Detail struct { } func GetCodeHostList() ([]*poetry.CodeHost, error) { - poetryClient := poetry.New(config.PoetryServiceAddress(), config.PoetryAPIRootKey()) + poetryClient := poetry.New(config.PoetryServiceAddress()) return poetryClient.ListCodeHosts() } diff --git a/pkg/shared/handler/base.go b/pkg/shared/handler/base.go index c59719d52..26aff5803 100644 --- a/pkg/shared/handler/base.go +++ b/pkg/shared/handler/base.go @@ -78,7 +78,7 @@ func JSONResponse(c *gin.Context, ctx *Context) { // InsertOperationLog 插入操作日志 func InsertOperationLog(c *gin.Context, username, productName, method, function, detail, requestBody string, logger *zap.SugaredLogger) { - operationLogID, err := aslan.New(config.AslanServiceAddress(), config.PoetryAPIRootKey()).AddAuditLog(username, productName, method, function, detail, requestBody, logger) + operationLogID, err := aslan.New(config.AslanServiceAddress()).AddAuditLog(username, productName, method, function, detail, requestBody, logger) if err != nil { logger.Errorf("InsertOperation err:%v", err) } diff --git a/pkg/shared/poetry/auth.go b/pkg/shared/poetry/auth.go deleted file mode 100644 index 201659581..000000000 --- a/pkg/shared/poetry/auth.go +++ /dev/null @@ -1,43 +0,0 @@ -/* -Copyright 2021 The KodeRover 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 poetry - -import ( - "fmt" - - "github.com/koderover/zadig/pkg/setting" - "github.com/koderover/zadig/pkg/tool/httpclient" -) - -type userView struct { - User *UserInfo `json:"info"` -} - -func GetUserDetailByToken(poetryHost, token string) (*UserInfo, error) { - url := "/directory/user/detail" - - cl := httpclient.New(httpclient.SetHostURL(poetryHost)) - - //根据token获取用户 - userViewInfo := &userView{} - _, err := cl.Get(url, httpclient.SetHeader(setting.AuthorizationHeader, fmt.Sprintf("%s %s", setting.UserAPIKey, token)), httpclient.SetResult(userViewInfo)) - if err != nil { - return nil, err - } - - return userViewInfo.User, nil -} diff --git a/pkg/shared/poetry/client.go b/pkg/shared/poetry/client.go index 323db52ac..47f93d43e 100644 --- a/pkg/shared/poetry/client.go +++ b/pkg/shared/poetry/client.go @@ -17,7 +17,6 @@ limitations under the License. package poetry import ( - "github.com/koderover/zadig/pkg/setting" "github.com/koderover/zadig/pkg/tool/httpclient" ) @@ -30,20 +29,16 @@ const ( type Client struct { *httpclient.Client - host string - token string + host string } -func New(host, token string) *Client { +func New(host string) *Client { c := httpclient.New( - httpclient.SetAuthScheme(setting.RootAPIKey), - httpclient.SetAuthToken(token), httpclient.SetHostURL(host), ) return &Client{ Client: c, host: host, - token: token, } } diff --git a/pkg/shared/poetry/jira.go b/pkg/shared/poetry/jira.go index 88fd8d723..8cb131779 100644 --- a/pkg/shared/poetry/jira.go +++ b/pkg/shared/poetry/jira.go @@ -42,7 +42,7 @@ func (c *Client) GetJiraInfo() (*JiraInfo, error) { return jira, nil } -func GetJiraInfo(host, token string) (*JiraInfo, error) { - c := New(host, token) +func GetJiraInfo(host string) (*JiraInfo, error) { + c := New(host) return c.GetJiraInfo() } -- Gitee From cfd654dbc92781cfc102d31736c6437799ad5700 Mon Sep 17 00:00:00 2001 From: mouuii Date: Tue, 19 Oct 2021 21:01:28 +0800 Subject: [PATCH 055/405] rolebings Signed-off-by: mouuii --- .../policy/core/handler/role_binding.go | 34 +++++++++++++++++++ .../policy/core/handler/router.go | 3 ++ .../core/repository/mongodb/role_binding.go | 11 ++++-- .../policy/core/service/role_binding.go | 18 ++++++++++ 4 files changed, 64 insertions(+), 2 deletions(-) diff --git a/pkg/microservice/policy/core/handler/role_binding.go b/pkg/microservice/policy/core/handler/role_binding.go index 4fe586573..2efd30816 100644 --- a/pkg/microservice/policy/core/handler/role_binding.go +++ b/pkg/microservice/policy/core/handler/role_binding.go @@ -43,6 +43,33 @@ func CreateRoleBinding(c *gin.Context) { ctx.Err = service.CreateRoleBinding(projectName, args, ctx.Logger) } +func ListRoleBindings(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + + projectName := c.Query("projectName") + if projectName == "" { + ctx.Err = e.ErrInvalidParam.AddDesc("projectName is empty") + return + } + + ctx.Resp, ctx.Err = service.ListRoleBindings(projectName, ctx.Logger) +} + +func DeleteRoleBinding(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + + name := c.Param("name") + projectName := c.Query("projectName") + if projectName == "" { + ctx.Err = e.ErrInvalidParam.AddDesc("projectName is empty") + return + } + + ctx.Err = service.DeleteRoleBinding(name, projectName, ctx.Logger) +} + func CreateSystemRoleBinding(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() @@ -57,3 +84,10 @@ func CreateSystemRoleBinding(c *gin.Context) { ctx.Err = service.CreateRoleBinding(service.SystemScope, args, ctx.Logger) } + +func ListSystemRoleBindings(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + + ctx.Resp, ctx.Err = service.ListRoleBindings(service.SystemScope, ctx.Logger) +} diff --git a/pkg/microservice/policy/core/handler/router.go b/pkg/microservice/policy/core/handler/router.go index 65828241c..6f6c1ad72 100644 --- a/pkg/microservice/policy/core/handler/router.go +++ b/pkg/microservice/policy/core/handler/router.go @@ -40,11 +40,14 @@ func (*Router) Inject(router *gin.RouterGroup) { roleBindings := router.Group("rolebindings") { roleBindings.POST("", CreateRoleBinding) + roleBindings.GET("", ListRoleBindings) + roleBindings.DELETE("/:name", DeleteRoleBinding) } systemRoleBindings := router.Group("system-rolebindings") { systemRoleBindings.POST("", CreateSystemRoleBinding) + systemRoleBindings.GET("", ListSystemRoleBindings) } bundles := router.Group("bundles") diff --git a/pkg/microservice/policy/core/repository/mongodb/role_binding.go b/pkg/microservice/policy/core/repository/mongodb/role_binding.go index 570d53f6b..de48f68e2 100644 --- a/pkg/microservice/policy/core/repository/mongodb/role_binding.go +++ b/pkg/microservice/policy/core/repository/mongodb/role_binding.go @@ -61,11 +61,12 @@ func (c *RoleBindingColl) EnsureIndex(ctx context.Context) error { return err } -func (c *RoleBindingColl) List() ([]*models.RoleBinding, error) { +func (c *RoleBindingColl) List(projectName string) ([]*models.RoleBinding, error) { var res []*models.RoleBinding ctx := context.Background() - cursor, err := c.Collection.Find(ctx, bson.M{}) + query := bson.M{"namespace": projectName} + cursor, err := c.Collection.Find(ctx, query) if err != nil { return nil, err } @@ -78,6 +79,12 @@ func (c *RoleBindingColl) List() ([]*models.RoleBinding, error) { return res, nil } +func (c *RoleBindingColl) Delete(name string, projectName string) error { + query := bson.M{"name": name, "namespace": projectName} + _, err := c.DeleteOne(context.TODO(), query) + return err +} + func (c *RoleBindingColl) Create(obj *models.RoleBinding) error { if obj == nil { return fmt.Errorf("nil object") diff --git a/pkg/microservice/policy/core/service/role_binding.go b/pkg/microservice/policy/core/service/role_binding.go index 21d11f4a5..49474ba4a 100644 --- a/pkg/microservice/policy/core/service/role_binding.go +++ b/pkg/microservice/policy/core/service/role_binding.go @@ -60,3 +60,21 @@ func CreateRoleBinding(ns string, rb *RoleBinding, logger *zap.SugaredLogger) er return mongodb.NewRoleBindingColl().Create(obj) } + +func ListRoleBindings(ns string, logger *zap.SugaredLogger) (roleBindings []*RoleBinding, err error) { + modelRoleBindings, err := mongodb.NewRoleBindingColl().List(ns) + if err != nil { + return nil, err + } + for _, v := range modelRoleBindings { + roleBindings = append(roleBindings, &RoleBinding{ + Name: v.Name, + Role: v.RoleRef.Name, + }) + } + return +} + +func DeleteRoleBinding(name string, projectName string, logger *zap.SugaredLogger) error { + return mongodb.NewRoleBindingColl().Delete(name, projectName) +} -- Gitee From fde7feec4ce3450928ca927cc7fae1810a2b270b Mon Sep 17 00:00:00 2001 From: mouuii Date: Tue, 19 Oct 2021 21:03:02 +0800 Subject: [PATCH 056/405] rolebings Signed-off-by: mouuii --- pkg/microservice/policy/core/handler/role_binding.go | 8 ++++++++ pkg/microservice/policy/core/handler/router.go | 1 + 2 files changed, 9 insertions(+) diff --git a/pkg/microservice/policy/core/handler/role_binding.go b/pkg/microservice/policy/core/handler/role_binding.go index 2efd30816..525621e78 100644 --- a/pkg/microservice/policy/core/handler/role_binding.go +++ b/pkg/microservice/policy/core/handler/role_binding.go @@ -70,6 +70,14 @@ func DeleteRoleBinding(c *gin.Context) { ctx.Err = service.DeleteRoleBinding(name, projectName, ctx.Logger) } +func DeleteSystemRoleBinding(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + + name := c.Param("name") + ctx.Err = service.DeleteRoleBinding(name, service.SystemScope, ctx.Logger) +} + func CreateSystemRoleBinding(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() diff --git a/pkg/microservice/policy/core/handler/router.go b/pkg/microservice/policy/core/handler/router.go index 6f6c1ad72..72133fbb7 100644 --- a/pkg/microservice/policy/core/handler/router.go +++ b/pkg/microservice/policy/core/handler/router.go @@ -48,6 +48,7 @@ func (*Router) Inject(router *gin.RouterGroup) { { systemRoleBindings.POST("", CreateSystemRoleBinding) systemRoleBindings.GET("", ListSystemRoleBindings) + systemRoleBindings.DELETE("/:name", DeleteSystemRoleBinding) } bundles := router.Group("bundles") -- Gitee From 6c869eb9f433d486bbf75f1c09f78d769641ee1f Mon Sep 17 00:00:00 2001 From: mouuii Date: Tue, 19 Oct 2021 21:11:27 +0800 Subject: [PATCH 057/405] rolebings Signed-off-by: mouuii --- .../policy/core/service/role_binding.go | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/pkg/microservice/policy/core/service/role_binding.go b/pkg/microservice/policy/core/service/role_binding.go index 49474ba4a..98794cfdd 100644 --- a/pkg/microservice/policy/core/service/role_binding.go +++ b/pkg/microservice/policy/core/service/role_binding.go @@ -32,6 +32,13 @@ type RoleBinding struct { Global bool `json:"global"` } +type RoleBindingResp struct { + Name string + Namespace string + Subjects []string + Role string +} + const SystemScope = "*" func CreateRoleBinding(ns string, rb *RoleBinding, logger *zap.SugaredLogger) error { @@ -61,15 +68,20 @@ func CreateRoleBinding(ns string, rb *RoleBinding, logger *zap.SugaredLogger) er return mongodb.NewRoleBindingColl().Create(obj) } -func ListRoleBindings(ns string, logger *zap.SugaredLogger) (roleBindings []*RoleBinding, err error) { +func ListRoleBindings(ns string, logger *zap.SugaredLogger) (roleBindings []*RoleBindingResp, err error) { modelRoleBindings, err := mongodb.NewRoleBindingColl().List(ns) if err != nil { return nil, err } for _, v := range modelRoleBindings { - roleBindings = append(roleBindings, &RoleBinding{ - Name: v.Name, - Role: v.RoleRef.Name, + users := []string{} + for _, vv := range v.Subjects { + users = append(users, vv.Name) + } + roleBindings = append(roleBindings, &RoleBindingResp{ + Name: v.Name, + Role: v.RoleRef.Name, + Subjects: users, }) } return -- Gitee From 6cbc0c67694fcca571a1738581a73f6091f9eb69 Mon Sep 17 00:00:00 2001 From: mouuii Date: Tue, 19 Oct 2021 21:15:28 +0800 Subject: [PATCH 058/405] rolebings Signed-off-by: mouuii --- .../policy/core/service/role_binding.go | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/pkg/microservice/policy/core/service/role_binding.go b/pkg/microservice/policy/core/service/role_binding.go index 98794cfdd..4b560fb76 100644 --- a/pkg/microservice/policy/core/service/role_binding.go +++ b/pkg/microservice/policy/core/service/role_binding.go @@ -32,13 +32,6 @@ type RoleBinding struct { Global bool `json:"global"` } -type RoleBindingResp struct { - Name string - Namespace string - Subjects []string - Role string -} - const SystemScope = "*" func CreateRoleBinding(ns string, rb *RoleBinding, logger *zap.SugaredLogger) error { @@ -68,7 +61,7 @@ func CreateRoleBinding(ns string, rb *RoleBinding, logger *zap.SugaredLogger) er return mongodb.NewRoleBindingColl().Create(obj) } -func ListRoleBindings(ns string, logger *zap.SugaredLogger) (roleBindings []*RoleBindingResp, err error) { +func ListRoleBindings(ns string, logger *zap.SugaredLogger) (roleBindings []*RoleBinding, err error) { modelRoleBindings, err := mongodb.NewRoleBindingColl().List(ns) if err != nil { return nil, err @@ -78,10 +71,11 @@ func ListRoleBindings(ns string, logger *zap.SugaredLogger) (roleBindings []*Rol for _, vv := range v.Subjects { users = append(users, vv.Name) } - roleBindings = append(roleBindings, &RoleBindingResp{ - Name: v.Name, - Role: v.RoleRef.Name, - Subjects: users, + roleBindings = append(roleBindings, &RoleBinding{ + Name: v.Name, + Role: v.RoleRef.Name, + User: v.Subjects[0].Name, + Global: (v.Namespace == ""), }) } return -- Gitee From ad8d5d59e0123de1d2e907912d5b247d8fc1376d Mon Sep 17 00:00:00 2001 From: mouuii Date: Tue, 19 Oct 2021 21:21:11 +0800 Subject: [PATCH 059/405] rolebings Signed-off-by: mouuii --- .../core/repository/mongodb/role_binding.go | 19 ++++++++++++++++++- .../policy/core/service/role_binding.go | 2 +- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/pkg/microservice/policy/core/repository/mongodb/role_binding.go b/pkg/microservice/policy/core/repository/mongodb/role_binding.go index de48f68e2..dec621945 100644 --- a/pkg/microservice/policy/core/repository/mongodb/role_binding.go +++ b/pkg/microservice/policy/core/repository/mongodb/role_binding.go @@ -61,7 +61,24 @@ func (c *RoleBindingColl) EnsureIndex(ctx context.Context) error { return err } -func (c *RoleBindingColl) List(projectName string) ([]*models.RoleBinding, error) { +func (c *RoleBindingColl) List() ([]*models.RoleBinding, error) { + var res []*models.RoleBinding + + ctx := context.Background() + cursor, err := c.Collection.Find(ctx, bson.M{}) + if err != nil { + return nil, err + } + + err = cursor.All(ctx, &res) + if err != nil { + return nil, err + } + + return res, nil +} + +func (c *RoleBindingColl) ListBy(projectName string) ([]*models.RoleBinding, error) { var res []*models.RoleBinding ctx := context.Background() diff --git a/pkg/microservice/policy/core/service/role_binding.go b/pkg/microservice/policy/core/service/role_binding.go index 4b560fb76..dd9e3bb7b 100644 --- a/pkg/microservice/policy/core/service/role_binding.go +++ b/pkg/microservice/policy/core/service/role_binding.go @@ -62,7 +62,7 @@ func CreateRoleBinding(ns string, rb *RoleBinding, logger *zap.SugaredLogger) er } func ListRoleBindings(ns string, logger *zap.SugaredLogger) (roleBindings []*RoleBinding, err error) { - modelRoleBindings, err := mongodb.NewRoleBindingColl().List(ns) + modelRoleBindings, err := mongodb.NewRoleBindingColl().ListBy(ns) if err != nil { return nil, err } -- Gitee From 76ad65d05e7eebfc6cb3f8071829cd9513b53db0 Mon Sep 17 00:00:00 2001 From: mouuii Date: Wed, 20 Oct 2021 11:31:28 +0800 Subject: [PATCH 060/405] public Signed-off-by: mouuii --- pkg/microservice/policy/core/handler/role.go | 4 ++-- pkg/microservice/policy/core/handler/router.go | 8 ++++---- pkg/microservice/policy/core/service/role.go | 2 ++ 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/pkg/microservice/policy/core/handler/role.go b/pkg/microservice/policy/core/handler/role.go index d202a15c6..008e581c2 100644 --- a/pkg/microservice/policy/core/handler/role.go +++ b/pkg/microservice/policy/core/handler/role.go @@ -56,7 +56,7 @@ func ListRoles(c *gin.Context) { return } -func CreateGlobalRole(c *gin.Context) { +func CreatePublicRole(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() @@ -69,7 +69,7 @@ func CreateGlobalRole(c *gin.Context) { ctx.Err = service.CreateRole("", args, ctx.Logger) } -func ListGlobalRoles(c *gin.Context) { +func ListPublicRoles(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() diff --git a/pkg/microservice/policy/core/handler/router.go b/pkg/microservice/policy/core/handler/router.go index 72133fbb7..6abf653cf 100644 --- a/pkg/microservice/policy/core/handler/router.go +++ b/pkg/microservice/policy/core/handler/router.go @@ -30,11 +30,11 @@ func (*Router) Inject(router *gin.RouterGroup) { roles.DELETE("/:name", DeleteRole) } - globalRoles := router.Group("global-roles") + PublicRoles := router.Group("public-roles") { - globalRoles.POST("", CreateGlobalRole) - globalRoles.GET("", ListGlobalRoles) - globalRoles.DELETE("/:name", DeleteRole) + PublicRoles.POST("", CreatePublicRole) + PublicRoles.GET("", ListPublicRoles) + PublicRoles.DELETE("/:name", DeleteRole) } roleBindings := router.Group("rolebindings") diff --git a/pkg/microservice/policy/core/service/role.go b/pkg/microservice/policy/core/service/role.go index 72a974575..f6d493d2f 100644 --- a/pkg/microservice/policy/core/service/role.go +++ b/pkg/microservice/policy/core/service/role.go @@ -25,6 +25,7 @@ import ( type Role struct { Name string `json:"name"` + Kind string `json:"name"` Rules []*Rule `json:"rules,omitempty"` } @@ -37,6 +38,7 @@ func CreateRole(ns string, role *Role, _ *zap.SugaredLogger) error { obj := &models.Role{ Name: role.Name, Namespace: ns, + Kind: role.Kind, } for _, r := range role.Rules { -- Gitee From 4dce1220e8982fbff583ef5ea51d7fa7edb0fc0e Mon Sep 17 00:00:00 2001 From: mouuii Date: Wed, 20 Oct 2021 11:47:34 +0800 Subject: [PATCH 061/405] system role Signed-off-by: mouuii --- pkg/microservice/policy/core/handler/role.go | 29 +++++++++++++++++++ .../policy/core/handler/router.go | 7 +++++ 2 files changed, 36 insertions(+) diff --git a/pkg/microservice/policy/core/handler/role.go b/pkg/microservice/policy/core/handler/role.go index 008e581c2..6bdd5655d 100644 --- a/pkg/microservice/policy/core/handler/role.go +++ b/pkg/microservice/policy/core/handler/role.go @@ -85,3 +85,32 @@ func DeleteRole(c *gin.Context) { ctx.Err = service.DeleteRole(name, projectName, ctx.Logger) return } + +func CreateSystemRole(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + + args := &service.Role{} + if err := c.ShouldBindJSON(args); err != nil { + ctx.Err = err + return + } + + ctx.Err = service.CreateRole("*", args, ctx.Logger) +} + +func ListSystemRoles(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + + ctx.Resp, ctx.Err = service.ListRoles("*", ctx.Logger) + return +} + +func DeleteSystemRole(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + name := c.Param("name") + ctx.Err = service.DeleteRole(name, "*", ctx.Logger) + return +} diff --git a/pkg/microservice/policy/core/handler/router.go b/pkg/microservice/policy/core/handler/router.go index 6abf653cf..ee52f0659 100644 --- a/pkg/microservice/policy/core/handler/router.go +++ b/pkg/microservice/policy/core/handler/router.go @@ -37,6 +37,13 @@ func (*Router) Inject(router *gin.RouterGroup) { PublicRoles.DELETE("/:name", DeleteRole) } + SystemRoles := router.Group("system-roles") + { + SystemRoles.POST("", CreateSystemRole) + SystemRoles.GET("", ListSystemRoles) + SystemRoles.DELETE("/:name", DeleteSystemRole) + } + roleBindings := router.Group("rolebindings") { roleBindings.POST("", CreateRoleBinding) -- Gitee From ac871de7e27a5fbcb0a873f27481fe848ad55015 Mon Sep 17 00:00:00 2001 From: lou Date: Wed, 20 Oct 2021 14:52:21 +0800 Subject: [PATCH 062/405] remove user in handler Signed-off-by: lou --- go.mod | 2 +- go.sum | 24 +-- .../aslan/core/build/handler/build.go | 12 +- .../aslan/core/code/handler/workspace.go | 8 +- .../repository/models/favorite_pipeline.go | 2 +- .../repository/models/task/release_image.go | 9 -- .../repository/mongodb/favorite_pipeline.go | 4 +- .../aslan/core/common/service/pipeline.go | 2 +- .../aslan/core/delivery/handler/product.go | 2 +- .../aslan/core/delivery/handler/version.go | 2 +- .../core/environment/handler/configmap.go | 8 +- .../core/environment/handler/environment.go | 52 +++--- .../aslan/core/environment/handler/image.go | 27 +--- .../aslan/core/environment/handler/kube.go | 2 +- .../core/environment/handler/renderset.go | 4 +- .../core/environment/handler/revision.go | 2 +- .../aslan/core/environment/handler/service.go | 12 +- .../core/environment/service/configmap.go | 11 +- .../core/environment/service/environment.go | 149 +----------------- .../core/environment/service/revision.go | 4 +- .../core/multicluster/handler/clusters.go | 8 +- .../aslan/core/project/handler/product.go | 30 ++-- .../aslan/core/project/handler/render.go | 27 +--- .../aslan/core/project/service/product.go | 14 +- .../aslan/core/service/handler/helm.go | 4 +- .../aslan/core/service/handler/loader.go | 2 +- .../aslan/core/service/handler/service.go | 24 +-- .../aslan/core/setting/handler/user.go | 2 +- .../aslan/core/setting/service/user.go | 9 +- .../aslan/core/system/handler/announcement.go | 10 +- .../aslan/core/system/handler/basic_images.go | 10 +- .../aslan/core/system/handler/helm.go | 4 +- .../aslan/core/system/handler/install.go | 10 +- .../aslan/core/system/handler/jenkins.go | 4 +- .../aslan/core/system/handler/notify.go | 14 +- .../aslan/core/system/handler/private_key.go | 10 +- .../aslan/core/system/handler/proxy.go | 10 +- .../aslan/core/system/handler/registry.go | 10 +- .../aslan/core/system/handler/s3.go | 12 +- .../workflow/handler/favorate_pipeline.go | 10 +- .../aslan/core/workflow/handler/pipeline.go | 16 +- .../core/workflow/handler/pipeline_status.go | 2 +- .../core/workflow/handler/pipeline_task.go | 18 +-- .../aslan/core/workflow/handler/sse.go | 12 +- .../aslan/core/workflow/handler/workflow.go | 18 +-- .../core/workflow/handler/workflow_task.go | 22 +-- .../service/webhook/codehub_workflow_task.go | 3 +- .../service/webhook/gerrit_workflow_task.go | 3 +- .../service/webhook/github_workflow_task.go | 3 +- .../service/webhook/gitlab_workflow_task.go | 5 +- .../core/workflow/service/webhook/ilyshin.go | 3 +- .../workflow/service/workflow/pipeline.go | 2 +- .../service/workflow/pipeline_status.go | 2 +- .../workflow/service/workflow/workflow.go | 4 +- .../service/workflow/workflow_task.go | 4 +- .../workflow/testing/handler/test_task.go | 14 +- .../core/workflow/testing/handler/testing.go | 10 +- pkg/setting/consts.go | 2 - pkg/shared/handler/base.go | 58 +++++-- pkg/shared/poetry/types.go | 23 --- pkg/types/permission/user.go | 40 ----- 61 files changed, 280 insertions(+), 546 deletions(-) delete mode 100644 pkg/types/permission/user.go diff --git a/go.mod b/go.mod index 28512627c..111b18db0 100644 --- a/go.mod +++ b/go.mod @@ -22,11 +22,11 @@ require ( github.com/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7 // indirect github.com/dsnet/compress v0.0.1 // indirect github.com/garyburd/redigo v1.6.2 // indirect - github.com/gin-contrib/sessions v0.0.3 github.com/gin-contrib/sse v0.1.0 github.com/gin-gonic/gin v1.7.2 github.com/go-resty/resty/v2 v2.6.0 github.com/gofrs/uuid v4.0.0+incompatible // indirect + github.com/golang-jwt/jwt v3.2.2+incompatible github.com/google/go-github/v35 v35.3.0 github.com/google/uuid v1.2.0 github.com/gorilla/handlers v1.5.1 // indirect diff --git a/go.sum b/go.sum index 08ed6a88b..8ba24eb1c 100644 --- a/go.sum +++ b/go.sum @@ -121,11 +121,8 @@ github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= github.com/bndr/gojenkins v1.1.0 h1:TWyJI6ST1qDAfH33DQb3G4mD8KkrBfyfSUoZBHQAvPI= github.com/bndr/gojenkins v1.1.0/go.mod h1:QeskxN9F/Csz0XV/01IC8y37CapKKWvOHa0UHLLX1fM= -github.com/boj/redistore v0.0.0-20180917114910-cd5dcc76aeff/go.mod h1:+RTT1BOk5P97fT2CiHkbFQwkK3mjsFAP6zCYV2aXtjw= -github.com/bradfitz/gomemcache v0.0.0-20190329173943-551aad21a668/go.mod h1:H0wQNHz2YrLsuXOZozoeDmnHXkNCRmMW0gwFWDfEZDA= github.com/bradleyfalzon/ghinstallation v1.1.1 h1:pmBXkxgM1WeF8QYvDLT5kuQiHMcmf+X015GI0KM/E3I= github.com/bradleyfalzon/ghinstallation v1.1.1/go.mod h1:vyCmHTciHx/uuyN82Zc3rXN3X2KTK8nUTCrTMwAhcug= -github.com/bradleypeabody/gorilla-sessions-memcache v0.0.0-20181103040241-659414f458e1/go.mod h1:dkChI7Tbtx7H1Tj7TqGSZMOeGpMP5gLHtjroHd4agiI= github.com/bshuster-repo/logrus-logstash-hook v1.0.0 h1:e+C0SB5R1pu//O4MQ3f9cFuPGoOVeF2fE4Og9otCc70= github.com/bshuster-repo/logrus-logstash-hook v1.0.0/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= github.com/bugsnag/bugsnag-go v2.1.0+incompatible h1:SuqsBHDutts2rZh4swHEWTexxi0F/JZ/6j1rR9BFe7I= @@ -259,15 +256,12 @@ github.com/garyburd/redigo v1.6.2/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05 github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gin-contrib/gzip v0.0.1 h1:ezvKOL6jH+jlzdHNE4h9h8q8uMpDQjyl0NN0Jd7jozc= github.com/gin-contrib/gzip v0.0.1/go.mod h1:fGBJBCdt6qCZuCAOwWuFhBB4OOq9EFqlo5dEaFhhu5w= -github.com/gin-contrib/sessions v0.0.3 h1:PoBXki+44XdJdlgDqDrY5nDVe3Wk7wDV/UCOuLP6fBI= -github.com/gin-contrib/sessions v0.0.3/go.mod h1:8C/J6cad3Il1mWYYgtw0w+hqasmpvy25mPkXdOgeB9I= github.com/gin-contrib/sse v0.0.0-20170109093832-22d885f9ecc7/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= github.com/gin-gonic/gin v1.3.0/go.mod h1:7cKuhb5qV2ggCFctp2fJQ+ErvciLZrIeoOSOm6mUr7Y= github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM= -github.com/gin-gonic/gin v1.5.0/go.mod h1:Nd6IXA8m5kNZdNEHMBd93KT+mdY3+bewLgRvmCsR2Do= github.com/gin-gonic/gin v1.7.2 h1:Tg03T9yM2xa8j6I3Z3oqLaQRSmKvxPd6g/2HJ6zICFA= github.com/gin-gonic/gin v1.7.2/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY= github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= @@ -339,10 +333,8 @@ github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2K github.com/go-openapi/validate v0.19.8/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85nY1c2z52x1Gk4= github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A= github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/go-playground/locales v0.12.1/go.mod h1:IUMDtCfWo/w/mtMfIE/IG2K+Ey3ygWanZIBtBW0W2TM= github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q= github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= -github.com/go-playground/universal-translator v0.16.0/go.mod h1:1AnU7NaIRDWWzGEKwgtJRd2xk99HeFyHw3yid4rvQIY= github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no= github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= github.com/go-playground/validator/v10 v10.4.1 h1:pH2c5ADXtd66mxoE0Zm9SUhxE20r7aM3F26W0hOn+GE= @@ -403,6 +395,8 @@ github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zV github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= +github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -437,7 +431,6 @@ github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8l github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golangplus/testing v0.0.0-20180327235837-af21d9c3145e/go.mod h1:0AA//k/eakGydO4jKRoRL2j92ZKSzTgj9tclaCrvXHk= -github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= @@ -480,18 +473,12 @@ github.com/googleapis/gnostic v0.4.1 h1:DLJCy1n/vrD4HPjOvYcT8aYQXpPIzoRZONaYwyyc github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/context v1.1.1 h1:AWwleXJkX/nhcU9bZSnZoi3h/qGYqQAGhq6zZe/aQW8= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.3 h1:gnP5JzjVOuiZD07fKKToCAOjS0yOpj/qPETTXCCS6hw= github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/securecookie v1.1.1 h1:miw7JPhV+b/lAHSXz4qd/nN9jRiAFV5FwjeKyCS8BvQ= -github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= -github.com/gorilla/sessions v1.1.1/go.mod h1:8KCfur6+4Mqcc6S0FEfKuN15Vl5MgXW92AE8ovaJD0w= -github.com/gorilla/sessions v1.1.3 h1:uXoZdcdA5XdXF3QzuSlheVRUvjl+1rKY7zBXL68L9RU= -github.com/gorilla/sessions v1.1.3/go.mod h1:8KCfur6+4Mqcc6S0FEfKuN15Vl5MgXW92AE8ovaJD0w= github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= @@ -590,7 +577,6 @@ github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 h1:iQTw/8FWTuc7uia github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8= github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4= github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= -github.com/kidstuff/mongostore v0.0.0-20181113001930-e650cd85ee4b/go.mod h1:g2nVr8KZVXJSS97Jo8pJ0jgq29P6H7dG0oplUA86MQw= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= @@ -615,7 +601,6 @@ github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 h1:SOEGU9fKiNWd/HOJuq github.com/lann/builder v0.0.0-20180802200727-47ae307949d0/go.mod h1:dXGbAdH5GtBTC4WfIxhKZfyBF/HBFgRZSWwZ9g/He9o= github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 h1:P6pPBnrTSX3DEVR4fDembhRWSsG5rVo6hYhAB/ADZrk= github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0/go.mod h1:vmVJ0l/dxyfGW6FmdpVm2joNMFikkuWg0EoCKLGUMNw= -github.com/leodido/go-urn v1.1.0/go.mod h1:+cyI34gQWZcE1eQU7NVgKkkzdXDQHr1dBMtdAPozLkw= github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= @@ -645,7 +630,6 @@ github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNx github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-oci8 v0.0.7/go.mod h1:wjDx6Xm9q7dFtHJvIlrI99JytznLw5wQ4R+9mNXJwGI= @@ -662,7 +646,6 @@ github.com/mattomatic/dijkstra v0.0.0-20130617153013-6f6d134eb237/go.mod h1:UOnL github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/memcachier/mc v2.0.1+incompatible/go.mod h1:7bkvFE61leUBvXz+yxsOnGBQSZpBSPIMUQSmmSHvuXc= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= @@ -826,7 +809,6 @@ github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4O github.com/prometheus/procfs v0.6.0 h1:mxy4L2jP6qMonqmq+aTtOx1ifVWUgG/TAmntgbh3xv4= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/quasoft/memstore v0.0.0-20180925164028-84a050167438/go.mod h1:wTPjTepVu7uJBYgZ0SdWHQlIas582j6cn2jgk4DDdlg= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rfyiamcool/cronlib v1.0.0 h1:PNTF7pgtbL7TedrqnC6syhHwj4d1bCKxH3XmPqqgxvg= github.com/rfyiamcool/cronlib v1.0.0/go.mod h1:i7AVVUhM/kkNcC/Ayq0XOmyCJCcqa/FlflyYQMm5QWE= @@ -1161,7 +1143,6 @@ golang.org/x/sys v0.0.0-20190610200419-93c9922d18ae/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1375,7 +1356,6 @@ gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMy gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= -gopkg.in/go-playground/validator.v9 v9.29.1/go.mod h1:+c9/zcJMFNgbLvly1L1V+PpxWdVbfP1avr/N00E2vyQ= gopkg.in/gorp.v1 v1.7.2 h1:j3DWlAyGVv8whO7AcIWznQ2Yj7yJkn34B8s63GViAAw= gopkg.in/gorp.v1 v1.7.2/go.mod h1:Wo3h+DBQZIxATwftsglhdD/62zRFPhGhTiu5jUJmCaw= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= diff --git a/pkg/microservice/aslan/core/build/handler/build.go b/pkg/microservice/aslan/core/build/handler/build.go index 5cf11416c..9ae546063 100644 --- a/pkg/microservice/aslan/core/build/handler/build.go +++ b/pkg/microservice/aslan/core/build/handler/build.go @@ -56,7 +56,7 @@ func CreateBuildModule(c *gin.Context) { if err = json.Unmarshal(data, args); err != nil { log.Errorf("CreateBuildModule json.Unmarshal err : %v", err) } - internalhandler.InsertOperationLog(c, ctx.Username, args.ProductName, "新增", "项目管理-构建", args.Name, string(data), ctx.Logger) + internalhandler.InsertOperationLog(c, ctx.UserName, args.ProductName, "新增", "项目管理-构建", args.Name, string(data), ctx.Logger) c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(data)) err = c.BindJSON(args) @@ -65,7 +65,7 @@ func CreateBuildModule(c *gin.Context) { return } - ctx.Err = buildservice.CreateBuild(ctx.Username, args, ctx.Logger) + ctx.Err = buildservice.CreateBuild(ctx.UserName, args, ctx.Logger) } func UpdateBuildModule(c *gin.Context) { @@ -80,7 +80,7 @@ func UpdateBuildModule(c *gin.Context) { if err = json.Unmarshal(data, args); err != nil { log.Errorf("UpdateBuildModule json.Unmarshal err : %v", err) } - internalhandler.InsertOperationLog(c, ctx.Username, args.ProductName, "更新", "项目管理-构建", args.Name, string(data), ctx.Logger) + internalhandler.InsertOperationLog(c, ctx.UserName, args.ProductName, "更新", "项目管理-构建", args.Name, string(data), ctx.Logger) c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(data)) err = c.BindJSON(args) @@ -88,7 +88,7 @@ func UpdateBuildModule(c *gin.Context) { ctx.Err = e.ErrInvalidParam.AddDesc("invalid Build args") return } - ctx.Err = buildservice.UpdateBuild(ctx.Username, args, ctx.Logger) + ctx.Err = buildservice.UpdateBuild(ctx.UserName, args, ctx.Logger) } func DeleteBuildModule(c *gin.Context) { @@ -97,7 +97,7 @@ func DeleteBuildModule(c *gin.Context) { name := c.Query("name") productName := c.Query("productName") - internalhandler.InsertOperationLog(c, ctx.Username, productName, "删除", "项目管理-构建", name, "", ctx.Logger) + internalhandler.InsertOperationLog(c, ctx.UserName, productName, "删除", "项目管理-构建", name, "", ctx.Logger) if name == "" { ctx.Err = e.ErrInvalidParam.AddDesc("empty Name") @@ -126,7 +126,7 @@ func UpdateBuildTargets(c *gin.Context) { ctx.Err = e.ErrInvalidParam.AddErr(err) return } - internalhandler.InsertOperationLog(c, ctx.Username, c.Query("productName"), "更新", "项目管理-服务组件", args.Name, string(data), ctx.Logger) + internalhandler.InsertOperationLog(c, ctx.UserName, c.Query("productName"), "更新", "项目管理-服务组件", args.Name, string(data), ctx.Logger) c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(data)) if err := c.BindJSON(args); err != nil { diff --git a/pkg/microservice/aslan/core/code/handler/workspace.go b/pkg/microservice/aslan/core/code/handler/workspace.go index ae46b2e08..1d980ace8 100644 --- a/pkg/microservice/aslan/core/code/handler/workspace.go +++ b/pkg/microservice/aslan/core/code/handler/workspace.go @@ -31,7 +31,7 @@ import ( func GetProductNameByWorkspacePipeline(c *gin.Context) { ctx := internalhandler.NewContext(c) - pipeline, err := commonservice.GetPipelineInfo(ctx.User.ID, c.Query("pipelineName"), ctx.Logger) + pipeline, err := commonservice.GetPipelineInfo(c.Query("pipelineName"), ctx.Logger) if err != nil { log.Errorf("GetProductNameByWorkspacePipeline err : %v", err) return @@ -43,13 +43,13 @@ func GetProductNameByWorkspacePipeline(c *gin.Context) { func CleanWorkspace(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - internalhandler.InsertOperationLog(c, ctx.Username, c.GetString("productName"), "清理", "单服务工作流-工作目录", c.Query("pipelineName"), "", ctx.Logger) + internalhandler.InsertOperationLog(c, ctx.UserName, c.GetString("productName"), "清理", "单服务工作流-工作目录", c.Query("pipelineName"), "", ctx.Logger) name := c.Query("pipelineName") if name == "" { ctx.Err = e.ErrInvalidParam.AddDesc("empty pipeline name") return } - ctx.Err = service.CleanWorkspace(ctx.Username, name, ctx.Logger) + ctx.Err = service.CleanWorkspace(ctx.UserName, name, ctx.Logger) } func GetWorkspaceFile(c *gin.Context) { @@ -69,7 +69,7 @@ func GetWorkspaceFile(c *gin.Context) { return } - fileRealPath, err := service.GetWorkspaceFilePath(ctx.Username, name, file, ctx.Logger) + fileRealPath, err := service.GetWorkspaceFilePath(ctx.UserName, name, file, ctx.Logger) if err != nil { c.JSON(e.ErrorMessage(err)) c.Abort() diff --git a/pkg/microservice/aslan/core/common/repository/models/favorite_pipeline.go b/pkg/microservice/aslan/core/common/repository/models/favorite_pipeline.go index 5e1ab74ef..b0bca8b79 100644 --- a/pkg/microservice/aslan/core/common/repository/models/favorite_pipeline.go +++ b/pkg/microservice/aslan/core/common/repository/models/favorite_pipeline.go @@ -20,7 +20,7 @@ import "go.mongodb.org/mongo-driver/bson/primitive" type Favorite struct { ID primitive.ObjectID `bson:"_id,omitempty" json:"id,omitempty"` - UserID int `bson:"user_id" json:"user_id"` + UserID string `bson:"user_id" json:"user_id"` ProductName string `bson:"product_name" json:"product_name"` Name string `bson:"name" json:"name"` Type string `bson:"type" json:"type"` diff --git a/pkg/microservice/aslan/core/common/repository/models/task/release_image.go b/pkg/microservice/aslan/core/common/repository/models/task/release_image.go index c697c08b6..e113a715e 100644 --- a/pkg/microservice/aslan/core/common/repository/models/task/release_image.go +++ b/pkg/microservice/aslan/core/common/repository/models/task/release_image.go @@ -23,15 +23,6 @@ import ( "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/models" ) -//type RepoImage struct { -// RepoID string `json:"repo_id" bson:"repo_id"` -// Name string `json:"name" bson:"name" yaml:"name"` -// Username string `json:"-" yaml:"username"` -// Password string `json:"-" yaml:"password"` -// Host string `json:"host" yaml:"host"` -// Namespace string `json:"namespace" yaml:"namespace"` -//} - type ReleaseImageItem struct { RepoID string `bson:"id" json:"id"` Image string `bson:"image" json:"image"` diff --git a/pkg/microservice/aslan/core/common/repository/mongodb/favorite_pipeline.go b/pkg/microservice/aslan/core/common/repository/mongodb/favorite_pipeline.go index fb20f1347..54e747df6 100644 --- a/pkg/microservice/aslan/core/common/repository/mongodb/favorite_pipeline.go +++ b/pkg/microservice/aslan/core/common/repository/mongodb/favorite_pipeline.go @@ -31,7 +31,7 @@ import ( ) type FavoriteArgs struct { - UserID int + UserID string ProductName string Name string Type string @@ -99,7 +99,7 @@ func (c *FavoriteColl) List(args *FavoriteArgs) ([]*models.Favorite, error) { return resp, err } -func (c *FavoriteColl) Find(userID int, name, Type string) (*models.Favorite, error) { +func (c *FavoriteColl) Find(userID, name, Type string) (*models.Favorite, error) { resp := new(models.Favorite) query := bson.M{"user_id": userID, "name": name} if Type != "" { diff --git a/pkg/microservice/aslan/core/common/service/pipeline.go b/pkg/microservice/aslan/core/common/service/pipeline.go index 3fc47b6c1..dd7b9e154 100644 --- a/pkg/microservice/aslan/core/common/service/pipeline.go +++ b/pkg/microservice/aslan/core/common/service/pipeline.go @@ -111,7 +111,7 @@ func DeletePipeline(pipelineName, requestID string, isDeletingProductTmpl bool, return nil } -func GetPipelineInfo(userID int, pipelineName string, log *zap.SugaredLogger) (*commonmodels.Pipeline, error) { +func GetPipelineInfo(pipelineName string, log *zap.SugaredLogger) (*commonmodels.Pipeline, error) { resp, err := mongodb.NewPipelineColl().Find(&mongodb.PipelineFindOption{Name: pipelineName}) if err != nil { log.Error(err) diff --git a/pkg/microservice/aslan/core/delivery/handler/product.go b/pkg/microservice/aslan/core/delivery/handler/product.go index 59eb70b2c..ccdf392aa 100644 --- a/pkg/microservice/aslan/core/delivery/handler/product.go +++ b/pkg/microservice/aslan/core/delivery/handler/product.go @@ -49,5 +49,5 @@ func GetProductByDeliveryInfo(c *gin.Context) { return } - ctx.Resp, ctx.Err = deliveryservice.GetProductByDeliveryInfo(ctx.Username, releaseID, ctx.Logger) + ctx.Resp, ctx.Err = deliveryservice.GetProductByDeliveryInfo(ctx.UserName, releaseID, ctx.Logger) } diff --git a/pkg/microservice/aslan/core/delivery/handler/version.go b/pkg/microservice/aslan/core/delivery/handler/version.go index 28e26ff0e..6fa620215 100644 --- a/pkg/microservice/aslan/core/delivery/handler/version.go +++ b/pkg/microservice/aslan/core/delivery/handler/version.go @@ -343,7 +343,7 @@ func ListPackagesVersion(c *gin.Context) { func DeleteDeliveryVersion(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - internalhandler.InsertOperationLog(c, ctx.Username, c.GetString("productName"), "删除", "版本交付", fmt.Sprintf("主键ID:%s", c.Param("id")), "", ctx.Logger) + internalhandler.InsertOperationLog(c, ctx.UserName, c.GetString("productName"), "删除", "版本交付", fmt.Sprintf("主键ID:%s", c.Param("id")), "", ctx.Logger) //params validate ID := c.Param("id") diff --git a/pkg/microservice/aslan/core/environment/handler/configmap.go b/pkg/microservice/aslan/core/environment/handler/configmap.go index 644e74b5c..976997320 100644 --- a/pkg/microservice/aslan/core/environment/handler/configmap.go +++ b/pkg/microservice/aslan/core/environment/handler/configmap.go @@ -55,7 +55,7 @@ func UpdateConfigMap(c *gin.Context) { if err = json.Unmarshal(data, args); err != nil { log.Errorf("UpdateConfigMap json.Unmarshal err : %v", err) } - internalhandler.InsertOperationLog(c, ctx.Username, args.ProductName, "更新", "集成环境-服务-configMap", fmt.Sprintf("环境名称:%s,服务名称:%s", args.EnvName, args.ServiceName), string(data), ctx.Logger) + internalhandler.InsertOperationLog(c, ctx.UserName, args.ProductName, "更新", "集成环境-服务-configMap", fmt.Sprintf("环境名称:%s,服务名称:%s", args.EnvName, args.ServiceName), string(data), ctx.Logger) c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(data)) if err := c.BindJSON(args); err != nil { @@ -74,7 +74,7 @@ func UpdateConfigMap(c *gin.Context) { // return //} - ctx.Err = service.UpdateConfigMap(args.EnvName, args, ctx.User.Name, ctx.User.ID, ctx.Logger) + ctx.Err = service.UpdateConfigMap(args.EnvName, args, ctx.UserName, ctx.UserID, ctx.Logger) } func RollBackConfigMap(c *gin.Context) { @@ -89,7 +89,7 @@ func RollBackConfigMap(c *gin.Context) { if err = json.Unmarshal(data, args); err != nil { log.Errorf("RollBackConfigMap json.Unmarshal err : %v", err) } - internalhandler.InsertOperationLog(c, ctx.Username, args.ProductName, "回滚", "集成环境-服务-configMap", fmt.Sprintf("环境名称:%s,服务名称:%s", args.EnvName, args.ServiceName), string(data), ctx.Logger) + internalhandler.InsertOperationLog(c, ctx.UserName, args.ProductName, "回滚", "集成环境-服务-configMap", fmt.Sprintf("环境名称:%s,服务名称:%s", args.EnvName, args.ServiceName), string(data), ctx.Logger) c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(data)) if err := c.BindJSON(args); err != nil { @@ -102,5 +102,5 @@ func RollBackConfigMap(c *gin.Context) { return } - ctx.Err = service.RollBackConfigMap(args.EnvName, args, ctx.User.Name, ctx.User.ID, ctx.Logger) + ctx.Err = service.RollBackConfigMap(args.EnvName, args, ctx.UserName, ctx.UserID, ctx.Logger) } diff --git a/pkg/microservice/aslan/core/environment/handler/environment.go b/pkg/microservice/aslan/core/environment/handler/environment.go index 38b3a7082..47051cef2 100644 --- a/pkg/microservice/aslan/core/environment/handler/environment.go +++ b/pkg/microservice/aslan/core/environment/handler/environment.go @@ -60,7 +60,7 @@ func ListProducts(c *gin.Context) { ctx.Err = e.ErrInvalidParam return } - ctx.Resp, ctx.Err = service.ListProducts(c.Query("productName"), ctx.User.Name, ctx.Logger) + ctx.Resp, ctx.Err = service.ListProducts(c.Query("productName"), ctx.UserName, ctx.Logger) } func AutoCreateProduct(c *gin.Context) { @@ -82,7 +82,7 @@ func AutoUpdateProduct(c *gin.Context) { if err = json.Unmarshal(data, args); err != nil { log.Errorf("AutoUpdateProduct json.Unmarshal err : %v", err) } - internalhandler.InsertOperationLog(c, ctx.Username, c.Param("productName"), "自动更新", "集成环境", strings.Join(args.EnvNames, ","), string(data), ctx.Logger) + internalhandler.InsertOperationLog(c, ctx.UserName, c.Param("productName"), "自动更新", "集成环境", strings.Join(args.EnvNames, ","), string(data), ctx.Logger) c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(data)) if err := c.BindJSON(args); err != nil { @@ -92,7 +92,7 @@ func AutoUpdateProduct(c *gin.Context) { } force, _ := strconv.ParseBool(c.Query("force")) - ctx.Resp, ctx.Err = service.AutoUpdateProduct(args.EnvNames, c.Param("productName"), ctx.User.ID, ctx.User.IsSuperUser, ctx.RequestID, force, ctx.Logger) + ctx.Resp, ctx.Err = service.AutoUpdateProduct(args.EnvNames, c.Param("productName"), ctx.UserID, false, ctx.RequestID, force, ctx.Logger) } func CreateHelmProduct(c *gin.Context) { @@ -119,10 +119,10 @@ func CreateHelmProduct(c *gin.Context) { return } - internalhandler.InsertOperationLog(c, ctx.Username, args.ProductName, "新增", "集成环境", args.EnvName, string(data), ctx.Logger) + internalhandler.InsertOperationLog(c, ctx.UserName, args.ProductName, "新增", "集成环境", args.EnvName, string(data), ctx.Logger) ctx.Err = service.CreateHelmProduct( - ctx.Username, ctx.RequestID, args, ctx.Logger, + ctx.UserName, ctx.RequestID, args, ctx.Logger, ) } @@ -138,7 +138,7 @@ func CreateProduct(c *gin.Context) { if err = json.Unmarshal(data, args); err != nil { log.Errorf("CreateProduct json.Unmarshal err : %v", err) } - internalhandler.InsertOperationLog(c, ctx.Username, args.ProductName, "新增", "集成环境", args.EnvName, string(data), ctx.Logger) + internalhandler.InsertOperationLog(c, ctx.UserName, args.ProductName, "新增", "集成环境", args.EnvName, string(data), ctx.Logger) c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(data)) if err := c.BindJSON(args); err != nil { @@ -151,9 +151,9 @@ func CreateProduct(c *gin.Context) { return } - args.UpdateBy = ctx.Username + args.UpdateBy = ctx.UserName ctx.Err = service.CreateProduct( - ctx.Username, ctx.RequestID, args, ctx.Logger, + ctx.UserName, ctx.RequestID, args, ctx.Logger, ) } @@ -172,7 +172,7 @@ func UpdateProduct(c *gin.Context) { if err = json.Unmarshal(data, args); err != nil { log.Errorf("UpdateProduct json.Unmarshal err : %v", err) } - internalhandler.InsertOperationLog(c, ctx.Username, productName, "更新", "集成环境", envName, string(data), ctx.Logger) + internalhandler.InsertOperationLog(c, ctx.UserName, productName, "更新", "集成环境", envName, string(data), ctx.Logger) c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(data)) if err := c.BindJSON(args); err != nil { @@ -182,7 +182,7 @@ func UpdateProduct(c *gin.Context) { force, _ := strconv.ParseBool(c.Query("force")) // update product asynchronously - ctx.Err = service.UpdateProductV2(envName, productName, ctx.Username, ctx.RequestID, force, args.Vars, ctx.Logger) + ctx.Err = service.UpdateProductV2(envName, productName, ctx.UserName, ctx.RequestID, force, args.Vars, ctx.Logger) if ctx.Err != nil { ctx.Logger.Errorf("failed to update product %s %s: %v", envName, productName, ctx.Err) } @@ -196,7 +196,7 @@ func UpdateProductRecycleDay(c *gin.Context) { productName := c.Param("productName") recycleDayStr := c.Query("recycleDay") - internalhandler.InsertOperationLog(c, ctx.Username, productName, "更新", "集成环境-环境回收", envName, "", ctx.Logger) + internalhandler.InsertOperationLog(c, ctx.UserName, productName, "更新", "集成环境-环境回收", envName, "", ctx.Logger) var ( recycleDay int @@ -223,7 +223,7 @@ func UpdateHelmProduct(c *gin.Context) { updateType := c.Query("updateType") productName := c.Param("productName") - ctx.Err = service.UpdateHelmProduct(productName, envName, updateType, ctx.Username, ctx.RequestID, nil, ctx.Logger) + ctx.Err = service.UpdateHelmProduct(productName, envName, updateType, ctx.UserName, ctx.RequestID, nil, ctx.Logger) if ctx.Err != nil { ctx.Logger.Errorf("failed to update product %s %s: %v", envName, productName, ctx.Err) } @@ -253,9 +253,9 @@ func UpdateHelmProductRenderCharts(c *gin.Context) { if err = json.Unmarshal(data, arg); err != nil { log.Errorf("UpdateHelmProductVariable json.Unmarshal err : %v", err) } - internalhandler.InsertOperationLog(c, ctx.Username, c.Param("productName"), "更新", "更新环境变量", "", string(data), ctx.Logger) + internalhandler.InsertOperationLog(c, ctx.UserName, c.Param("productName"), "更新", "更新环境变量", "", string(data), ctx.Logger) - ctx.Err = service.UpdateHelmProductRenderCharts(productName, envName, ctx.Username, ctx.RequestID, arg.ChartValues, ctx.Logger) + ctx.Err = service.UpdateHelmProductRenderCharts(productName, envName, ctx.UserName, ctx.RequestID, arg.ChartValues, ctx.Logger) if ctx.Err != nil { ctx.Logger.Errorf("failed to update product Variable %s %s: %v", envName, productName, ctx.Err) } @@ -276,7 +276,7 @@ func UpdateHelmProductVariable(c *gin.Context) { if err = json.Unmarshal(data, args); err != nil { log.Errorf("UpdateHelmProductVariable json.Unmarshal err : %v", err) } - internalhandler.InsertOperationLog(c, ctx.Username, c.Param("productName"), "更新", "helm集成环境变量", "", string(data), ctx.Logger) + internalhandler.InsertOperationLog(c, ctx.UserName, c.Param("productName"), "更新", "helm集成环境变量", "", string(data), ctx.Logger) c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(data)) if err := c.BindJSON(args); err != nil { @@ -285,7 +285,7 @@ func UpdateHelmProductVariable(c *gin.Context) { return } - ctx.Err = service.UpdateHelmProductVariable(productName, envName, ctx.Username, ctx.RequestID, args.ChartInfos, args.ChartInfos, ctx.Logger) + ctx.Err = service.UpdateHelmProductVariable(productName, envName, ctx.UserName, ctx.RequestID, args.ChartInfos, args.ChartInfos, ctx.Logger) if ctx.Err != nil { ctx.Logger.Errorf("failed to update product Variable %s %s: %v", envName, productName, ctx.Err) } @@ -310,10 +310,10 @@ func UpdateMultiHelmEnv(c *gin.Context) { } args.ProductName = c.Param("productName") - internalhandler.InsertOperationLog(c, ctx.Username, args.ProductName, "更新", "集成环境", strings.Join(args.EnvNames, ","), string(data), ctx.Logger) + internalhandler.InsertOperationLog(c, ctx.UserName, args.ProductName, "更新", "集成环境", strings.Join(args.EnvNames, ","), string(data), ctx.Logger) ctx.Resp, ctx.Err = service.UpdateMultipleHelmEnv( - ctx.Username, ctx.RequestID, ctx.User.ID, ctx.User.IsSuperUser, args, ctx.Logger, + ctx.RequestID, ctx.UserID, false, args, ctx.Logger, ) } @@ -329,7 +329,7 @@ func UpdateMultiHelmProduct(c *gin.Context) { if err = json.Unmarshal(data, args); err != nil { log.Errorf("UpdateMultiHelmProduct json.Unmarshal err : %v", err) } - internalhandler.InsertOperationLog(c, ctx.Username, c.Param("productName"), "更新helm环境", "集成环境", strings.Join(args.EnvNames, ","), string(data), ctx.Logger) + internalhandler.InsertOperationLog(c, ctx.UserName, c.Param("productName"), "更新helm环境", "集成环境", strings.Join(args.EnvNames, ","), string(data), ctx.Logger) c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(data)) if err := c.BindJSON(args); err != nil { @@ -338,7 +338,7 @@ func UpdateMultiHelmProduct(c *gin.Context) { return } - ctx.Resp = service.UpdateMultiHelmProduct(args.EnvNames, args.UpdateType, c.Param("productName"), ctx.User.ID, ctx.User.IsSuperUser, ctx.RequestID, ctx.Logger) + ctx.Resp = service.UpdateMultiHelmProduct(args.EnvNames, args.UpdateType, c.Param("productName"), ctx.UserID, false, ctx.RequestID, ctx.Logger) } func GetProduct(c *gin.Context) { @@ -348,7 +348,7 @@ func GetProduct(c *gin.Context) { envName := c.Query("envName") productName := c.Param("productName") - ctx.Resp, ctx.Err = service.GetProduct(ctx.Username, envName, productName, ctx.Logger) + ctx.Resp, ctx.Err = service.GetProduct(ctx.UserName, envName, productName, ctx.Logger) } func GetProductInfo(c *gin.Context) { @@ -358,7 +358,7 @@ func GetProductInfo(c *gin.Context) { envName := c.Query("envName") productName := c.Param("productName") - ctx.Resp, ctx.Err = service.GetProductInfo(ctx.Username, envName, productName, ctx.Logger) + ctx.Resp, ctx.Err = service.GetProductInfo(ctx.UserName, envName, productName, ctx.Logger) } func GetProductIngress(c *gin.Context) { @@ -366,7 +366,7 @@ func GetProductIngress(c *gin.Context) { defer func() { internalhandler.JSONResponse(c, ctx) }() productName := c.Param("productName") - ctx.Resp, ctx.Err = service.GetProductIngress(ctx.Username, productName, ctx.Logger) + ctx.Resp, ctx.Err = service.GetProductIngress(ctx.UserName, productName, ctx.Logger) } func ListRenderCharts(c *gin.Context) { @@ -420,8 +420,8 @@ func DeleteProduct(c *gin.Context) { defer func() { internalhandler.JSONResponse(c, ctx) }() envName := c.Query("envName") - internalhandler.InsertOperationLog(c, ctx.Username, c.Param("productName"), "删除", "集成环境", envName, "", ctx.Logger) - ctx.Err = commonservice.DeleteProduct(ctx.Username, envName, c.Param("productName"), ctx.RequestID, ctx.Logger) + internalhandler.InsertOperationLog(c, ctx.UserName, c.Param("productName"), "删除", "集成环境", envName, "", ctx.Logger) + ctx.Err = commonservice.DeleteProduct(ctx.UserName, envName, c.Param("productName"), ctx.RequestID, ctx.Logger) } func EnvShare(c *gin.Context) { @@ -437,7 +437,7 @@ func EnvShare(c *gin.Context) { if err = json.Unmarshal(data, args); err != nil { log.Errorf("CreateProduct json.Unmarshal err : %v", err) } - internalhandler.InsertOperationLog(c, ctx.Username, productName, "更新", "集成环境-环境授权", args.EnvName, string(data), ctx.Logger) + internalhandler.InsertOperationLog(c, ctx.UserName, productName, "更新", "集成环境-环境授权", args.EnvName, string(data), ctx.Logger) c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(data)) if productName == "" { diff --git a/pkg/microservice/aslan/core/environment/handler/image.go b/pkg/microservice/aslan/core/environment/handler/image.go index d6703188a..45315376c 100644 --- a/pkg/microservice/aslan/core/environment/handler/image.go +++ b/pkg/microservice/aslan/core/environment/handler/image.go @@ -49,7 +49,7 @@ func UpdateStatefulSetContainerImage(c *gin.Context) { } internalhandler.InsertOperationLog( - c, ctx.Username, args.ProductName, + c, ctx.UserName, args.ProductName, "更新", "集成环境-服务镜像", fmt.Sprintf("环境名称:%s,服务名称:%s,StatefulSet:%s", args.EnvName, args.ServiceName, args.Name), string(data), ctx.Logger) @@ -80,7 +80,7 @@ func UpdateDeploymentContainerImage(c *gin.Context) { } internalhandler.InsertOperationLog( - c, ctx.Username, args.ProductName, + c, ctx.UserName, args.ProductName, "更新", "集成环境-服务镜像", fmt.Sprintf("环境名称:%s,服务名称:%s,Deployment:%s", args.EnvName, args.ServiceName, args.Name), string(data), ctx.Logger) @@ -94,26 +94,3 @@ func UpdateDeploymentContainerImage(c *gin.Context) { ctx.Err = service.UpdateContainerImage(ctx.RequestID, args, ctx.Logger) } - -//func UpdateContainerImage(c *gin.Context) { -// ctx := internalhandler.NewContext(c) -// defer func() { internalhandler.JSONResponse(c, ctx) }() -// -// args := new(service.UpdateContainerImageArgs) -// data, err := c.GetRawData() -// if err != nil { -// log.Errorf("UpdateContainerImage c.GetRawData() err : %v", err) -// } -// if err = json.Unmarshal(data, args); err != nil { -// log.Errorf("UpdateContainerImage json.Unmarshal err : %v", err) -// } -// internalhandler.InsertOperationLog(c, ctx.Username, args.ProductName, "更新", "集成环境-服务镜像", fmt.Sprintf("环境名称:%s,服务名称:%s", args.EnvName, args.ServiceName), fmt.Sprintf("%s,%s", permission.TestEnvManageUUID, permission.ProdEnvManageUUID), string(data), ctx.Logger) -// c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(data)) -// -// if err := c.BindJSON(args); err != nil { -// ctx.Err = e.ErrInvalidParam.AddDesc(err.Error()) -// return -// } -// -// ctx.Err = service.CtrlMgr.UpdateContainerImage(args.EnvName, args.ProductName, args, ctx.Logger) -//} diff --git a/pkg/microservice/aslan/core/environment/handler/kube.go b/pkg/microservice/aslan/core/environment/handler/kube.go index c35ea7bbf..af5bfcc0a 100644 --- a/pkg/microservice/aslan/core/environment/handler/kube.go +++ b/pkg/microservice/aslan/core/environment/handler/kube.go @@ -83,7 +83,7 @@ func DeletePod(c *gin.Context) { envName := c.Query("envName") productName := c.Query("productName") - internalhandler.InsertOperationLog(c, ctx.Username, c.Query("productName"), "重启", "集成环境-服务实例", fmt.Sprintf("环境名称:%s,pod名称:%s", c.Query("envName"), c.Param("podName")), "", ctx.Logger) + internalhandler.InsertOperationLog(c, ctx.UserName, c.Query("productName"), "重启", "集成环境-服务实例", fmt.Sprintf("环境名称:%s,pod名称:%s", c.Query("envName"), c.Param("podName")), "", ctx.Logger) ctx.Err = service.DeletePod(envName, productName, podName, ctx.Logger) } diff --git a/pkg/microservice/aslan/core/environment/handler/renderset.go b/pkg/microservice/aslan/core/environment/handler/renderset.go index 7ede1b442..b7b6e6e85 100644 --- a/pkg/microservice/aslan/core/environment/handler/renderset.go +++ b/pkg/microservice/aslan/core/environment/handler/renderset.go @@ -69,7 +69,7 @@ func CreateOrUpdateRenderChart(c *gin.Context) { log.Errorf("CreateOrUpdateRenderChart json.Unmarshal err : %v", err) ctx.Err = e.ErrInvalidParam.AddDesc(err.Error()) } - internalhandler.InsertOperationLog(c, ctx.Username, c.Param("productName"), "新增", "环境变量", c.Query("envName"), string(data), ctx.Logger) + internalhandler.InsertOperationLog(c, ctx.UserName, c.Param("productName"), "新增", "环境变量", c.Query("envName"), string(data), ctx.Logger) - ctx.Err = service.CreateOrUpdateChartValues(c.Query("productName"), c.Query("envName"), args, ctx.Username, ctx.RequestID, ctx.Logger) + ctx.Err = service.CreateOrUpdateChartValues(c.Query("productName"), c.Query("envName"), args, ctx.UserName, ctx.RequestID, ctx.Logger) } diff --git a/pkg/microservice/aslan/core/environment/handler/revision.go b/pkg/microservice/aslan/core/environment/handler/revision.go index 77ed70d34..f35be2c09 100644 --- a/pkg/microservice/aslan/core/environment/handler/revision.go +++ b/pkg/microservice/aslan/core/environment/handler/revision.go @@ -32,5 +32,5 @@ func ListProductsRevision(c *gin.Context) { ctx.Resp, ctx.Err = service.ListProductsRevisionByFacility(c.Query("basicFacility"), ctx.Logger) return } - ctx.Resp, ctx.Err = service.ListProductsRevision(c.Query("productName"), c.Query("envName"), ctx.User.ID, ctx.User.IsSuperUser, ctx.Logger) + ctx.Resp, ctx.Err = service.ListProductsRevision(c.Query("productName"), c.Query("envName"), ctx.UserID, false, ctx.Logger) } diff --git a/pkg/microservice/aslan/core/environment/handler/service.go b/pkg/microservice/aslan/core/environment/handler/service.go index 6c5cffd87..3405c7c05 100644 --- a/pkg/microservice/aslan/core/environment/handler/service.go +++ b/pkg/microservice/aslan/core/environment/handler/service.go @@ -49,14 +49,14 @@ func RestartService(c *gin.Context) { ServiceName: c.Param("serviceName"), } - internalhandler.InsertOperationLog(c, ctx.Username, c.Param("productName"), "重启", "集成环境-服务", fmt.Sprintf("环境名称:%s,服务名称:%s", c.Query("envName"), c.Param("serviceName")), "", ctx.Logger) + internalhandler.InsertOperationLog(c, ctx.UserName, c.Param("productName"), "重启", "集成环境-服务", fmt.Sprintf("环境名称:%s,服务名称:%s", c.Query("envName"), c.Param("serviceName")), "", ctx.Logger) ctx.Err = service.RestartService(args.EnvName, args, ctx.Logger) } func UpdateService(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - internalhandler.InsertOperationLog(c, ctx.Username, c.Param("productName"), "更新", "集成环境-单服务", fmt.Sprintf("环境名称:%s,服务名称:%s", c.Query("envName"), c.Param("serviceName")), "", ctx.Logger) + internalhandler.InsertOperationLog(c, ctx.UserName, c.Param("productName"), "更新", "集成环境-单服务", fmt.Sprintf("环境名称:%s,服务名称:%s", c.Query("envName"), c.Param("serviceName")), "", ctx.Logger) svcRev := new(service.SvcRevision) if err := c.BindJSON(svcRev); err != nil { @@ -70,7 +70,7 @@ func UpdateService(c *gin.Context) { ServiceName: c.Param("serviceName"), ServiceType: c.Param("serviceType"), ServiceRev: svcRev, - UpdateBy: ctx.Username, + UpdateBy: ctx.UserName, } ctx.Err = service.UpdateService(args, ctx.Logger) @@ -89,7 +89,7 @@ func RestartNewService(c *gin.Context) { } internalhandler.InsertOperationLog( - c, ctx.Username, + c, ctx.UserName, c.Param("productName"), "重启", "集成环境-服务", @@ -116,7 +116,7 @@ func ScaleNewService(c *gin.Context) { name := c.Query("name") internalhandler.InsertOperationLog( - c, ctx.Username, + c, ctx.UserName, c.Param("productName"), "伸缩", "集成环境-服务", @@ -142,7 +142,7 @@ func ScaleNewService(c *gin.Context) { func ScaleService(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - internalhandler.InsertOperationLog(c, ctx.Username, c.Param("productName"), "伸缩", "集成环境-服务", fmt.Sprintf("环境名称:%s,服务名称:%s", c.Query("envName"), c.Param("serviceName")), "", ctx.Logger) + internalhandler.InsertOperationLog(c, ctx.UserName, c.Param("productName"), "伸缩", "集成环境-服务", fmt.Sprintf("环境名称:%s,服务名称:%s", c.Query("envName"), c.Param("serviceName")), "", ctx.Logger) number, err := strconv.Atoi(c.Param("number")) if err != nil { diff --git a/pkg/microservice/aslan/core/environment/service/configmap.go b/pkg/microservice/aslan/core/environment/service/configmap.go index 045d23381..bbb634c57 100644 --- a/pkg/microservice/aslan/core/environment/service/configmap.go +++ b/pkg/microservice/aslan/core/environment/service/configmap.go @@ -19,7 +19,6 @@ package service import ( "fmt" "sort" - "strconv" "strings" "time" @@ -146,7 +145,7 @@ func ListConfigMaps(args *ListConfigMapArgs, log *zap.SugaredLogger) ([]*configM return res, nil } -func UpdateConfigMap(envName string, args *UpdateConfigMapArgs, userName string, userID int, log *zap.SugaredLogger) error { +func UpdateConfigMap(envName string, args *UpdateConfigMapArgs, userName, userID string, log *zap.SugaredLogger) error { product, err := commonrepo.NewProductColl().Find(&commonrepo.ProductFindOptions{ Name: args.ProductName, EnvName: args.EnvName, @@ -191,7 +190,7 @@ func UpdateConfigMap(envName string, args *UpdateConfigMapArgs, userName string, cfg.Data = args.Data // 记录修改configmap的用户 cfg.Labels[setting.UpdateBy] = kube.MakeSafeLabelValue(userName) - cfg.Labels[setting.UpdateByID] = fmt.Sprintf("%d", userID) + cfg.Labels[setting.UpdateByID] = userID cfg.Labels[setting.UpdateTime] = time.Now().Format("20060102150405") cfg.Labels[setting.DirtyLabel] = setting.LabelValueTrue @@ -200,7 +199,7 @@ func UpdateConfigMap(envName string, args *UpdateConfigMapArgs, userName string, as = make(map[string]string) } as[setting.ModifiedByAnnotation] = userName - as[setting.EditorIDAnnotation] = strconv.Itoa(userID) + as[setting.EditorIDAnnotation] = userID as[setting.LastUpdateTimeAnnotation] = util.FormatTime(time.Now()) cfg.SetAnnotations(as) @@ -223,7 +222,7 @@ func UpdateConfigMap(envName string, args *UpdateConfigMapArgs, userName string, return nil } -func RollBackConfigMap(envName string, args *RollBackConfigMapArgs, userName string, userID int, log *zap.SugaredLogger) error { +func RollBackConfigMap(envName string, args *RollBackConfigMapArgs, userName, userID string, log *zap.SugaredLogger) error { product, err := commonrepo.NewProductColl().Find(&commonrepo.ProductFindOptions{ Name: args.ProductName, EnvName: args.EnvName, @@ -260,7 +259,7 @@ func RollBackConfigMap(envName string, args *RollBackConfigMapArgs, userName str destinSrc.Data = srcCfg.Data destinSrc.Labels[setting.UpdateBy] = kube.MakeSafeLabelValue(userName) - destinSrc.Labels[setting.UpdateByID] = fmt.Sprintf("%d", userID) + destinSrc.Labels[setting.UpdateByID] = userID destinSrc.Labels[setting.UpdateTime] = time.Now().Format("20060102150405") // 回滚时显示回滚版本的时间 if updateTime, ok := srcCfg.Labels[setting.UpdateTime]; ok { diff --git a/pkg/microservice/aslan/core/environment/service/environment.go b/pkg/microservice/aslan/core/environment/service/environment.go index f8f87b97b..4f00fed95 100644 --- a/pkg/microservice/aslan/core/environment/service/environment.go +++ b/pkg/microservice/aslan/core/environment/service/environment.go @@ -234,7 +234,7 @@ func AutoCreateProduct(productName, envType, requestID string, log *zap.SugaredL var mutexAutoUpdate sync.RWMutex -func AutoUpdateProduct(envNames []string, productName string, userID int, superUser bool, requestID string, force bool, log *zap.SugaredLogger) ([]*EnvStatus, error) { +func AutoUpdateProduct(envNames []string, productName, userID string, superUser bool, requestID string, force bool, log *zap.SugaredLogger) ([]*EnvStatus, error) { mutexAutoUpdate.Lock() defer func() { mutexAutoUpdate.Unlock() @@ -952,7 +952,7 @@ func updateHelmProductVariable(productResp *commonmodels.Product, oldRenderVersi var mutexUpdateMultiHelm sync.RWMutex -func UpdateMultipleHelmEnv(userName, requestID string, userID int, superUser bool, args *UpdateMultiHelmProductArg, log *zap.SugaredLogger) ([]*EnvStatus, error) { +func UpdateMultipleHelmEnv(requestID, userID string, superUser bool, args *UpdateMultiHelmProductArg, log *zap.SugaredLogger) ([]*EnvStatus, error) { mutexUpdateMultiHelm.Lock() defer func() { mutexUpdateMultiHelm.Unlock() @@ -1040,7 +1040,7 @@ func UpdateMultipleHelmEnv(userName, requestID string, userID int, superUser boo } // UpdateMultiHelmProduct TODO need to be deprecated -func UpdateMultiHelmProduct(envNames []string, updateType, productName string, userID int, superUser bool, requestID string, log *zap.SugaredLogger) []*EnvStatus { +func UpdateMultiHelmProduct(envNames []string, updateType, productName, userID string, superUser bool, requestID string, log *zap.SugaredLogger) []*EnvStatus { mutexUpdateMultiHelm.Lock() defer func() { mutexUpdateMultiHelm.Unlock() @@ -1373,149 +1373,6 @@ func getProjectType(productName string) string { return projectType } -// createGroup create or update services in service group -//func createGroup(envName, productName, username string, group []*commonmodels.ProductService, renderSet *commonmodels.RenderSet, kubeClient client.Client, log *zap.SugaredLogger) error { -// log.Infof("[Namespace:%s][Product:%s] createGroup", envName, productName) -// updatableServiceNameList := make([]string, 0) -// -// // 异步创建无依赖的服务 -// errList := &multierror.Error{ -// ErrorFormat: func(es []error) string { -// points := make([]string, len(es)) -// for i, err := range es { -// points[i] = fmt.Sprintf("%v", err) -// } -// -// return strings.Join(points, "\n") -// }, -// } -// -// opt := &commonrepo.ProductFindOptions{Name: productName, EnvName: envName} -// prod, err := commonrepo.NewProductColl().Find(opt) -// if err != nil { -// errList = multierror.Append(errList, err) -// } -// -// var wg sync.WaitGroup -// var lock sync.Mutex -// var resources []*unstructured.Unstructured -// -// for i := range group { -// if group[i].Type == setting.K8SDeployType { -// // 只有在service有Pod的时候,才需要等待pod running或者等待pod succeed -// // 比如在group中,如果service下仅有configmap/service/ingress这些yaml的时候,不需要waitServicesRunning -// wg.Add(1) -// updatableServiceNameList = append(updatableServiceNameList, group[i].ServiceName) -// go func(svc *commonmodels.ProductService) { -// defer wg.Done() -// items, err := upsertService(false, prod, svc, nil, renderSet, kubeClient, log) -// if err != nil { -// lock.Lock() -// switch e := err.(type) { -// case *multierror.Error: -// errList = multierror.Append(errList, e.Errors...) -// default: -// errList = multierror.Append(errList, e) -// } -// lock.Unlock() -// } -// -// // concurrent array append -// lock.Lock() -// resources = append(resources, items...) -// lock.Unlock() -// }(group[i]) -// } else if group[i].Type == setting.PMDeployType { -// //更新非k8s服务 -// if len(group[i].EnvConfigs) > 0 { -// serviceTempl, err := commonservice.GetServiceTemplate(group[i].ServiceName, setting.PMDeployType, productName, setting.ProductStatusDeleting, group[i].Revision, log) -// if err != nil { -// errList = multierror.Append(errList, err) -// } -// if serviceTempl != nil { -// oldEnvConfigs := serviceTempl.EnvConfigs -// for _, currentEnvConfig := range group[i].EnvConfigs { -// envConfig := &commonmodels.EnvConfig{ -// EnvName: currentEnvConfig.EnvName, -// HostIDs: currentEnvConfig.HostIDs, -// } -// oldEnvConfigs = append(oldEnvConfigs, envConfig) -// } -// -// args := &commonservice.ServiceTmplBuildObject{ -// ServiceTmplObject: &commonservice.ServiceTmplObject{ -// ProductName: serviceTempl.ProductName, -// ServiceName: serviceTempl.ServiceName, -// Visibility: serviceTempl.Visibility, -// Revision: serviceTempl.Revision, -// Type: serviceTempl.Type, -// Username: username, -// HealthChecks: serviceTempl.HealthChecks, -// EnvConfigs: oldEnvConfigs, -// EnvStatuses: []*commonmodels.EnvStatus{}, -// From: "createEnv", -// }, -// Build: &commonmodels.Build{Name: serviceTempl.BuildName}, -// } -// -// if err := commonservice.UpdatePmServiceTemplate(username, args, log); err != nil { -// errList = multierror.Append(errList, err) -// } -// } -// } -// var latestRevision int64 = group[i].Revision -// // 获取最新版本的服务 -// if latestServiceTempl, _ := commonservice.GetServiceTemplate(group[i].ServiceName, setting.PMDeployType, productName, setting.ProductStatusDeleting, 0, log); latestServiceTempl != nil { -// latestRevision = latestServiceTempl.Revision -// } -// // 更新环境 -// if latestRevision > group[i].Revision { -// // 更新产品服务 -// for _, serviceGroup := range prod.Services { -// for j, service := range serviceGroup { -// if service.ServiceName == group[i].ServiceName && service.Type == setting.PMDeployType { -// serviceGroup[j].Revision = latestRevision -// } -// } -// } -// if err := commonrepo.NewProductColl().Update(prod); err != nil { -// log.Errorf("[%s][%s] Product.Update error: %v", envName, productName, err) -// errList = multierror.Append(errList, err) -// } -// } -// if _, err = commonservice.CreateServiceTask(&commonmodels.ServiceTaskArgs{ -// ProductName: productName, -// ServiceName: group[i].ServiceName, -// Revision: latestRevision, -// EnvNames: []string{envName}, -// ServiceTaskCreator: username, -// }, log); err != nil { -// errList = multierror.Append(errList, err) -// } -// } -// } -// -// wg.Wait() -// -// // 如果创建依赖服务组有返回错误, 停止等待 -// if err := errList.ErrorOrNil(); err != nil { -// return err -// } -// -// if err := waitResourceRunning(kubeClient, prod.Namespace, resources, config.ServiceStartTimeout(), log); err != nil { -// log.Errorf( -// "service group %s/%+v doesn't start in %d seconds: %v", -// prod.Namespace, -// updatableServiceNameList, config.ServiceStartTimeout(), err) -// -// err = e.ErrUpdateEnv.AddErr( -// errors.Errorf(e.StartPodTimeout+"\n %s", "["+strings.Join(updatableServiceNameList, "], [")+"]")) -// return err -// } -// -// return nil -//} - // upsertService 创建或者更新服务, 更新服务之前先创建服务需要的配置 func upsertService(isUpdate bool, env *commonmodels.Product, service *commonmodels.ProductService, prevSvc *commonmodels.ProductService, diff --git a/pkg/microservice/aslan/core/environment/service/revision.go b/pkg/microservice/aslan/core/environment/service/revision.go index a75fb92f2..5ac15c614 100644 --- a/pkg/microservice/aslan/core/environment/service/revision.go +++ b/pkg/microservice/aslan/core/environment/service/revision.go @@ -32,7 +32,7 @@ import ( e "github.com/koderover/zadig/pkg/tool/errors" ) -func ListProductsRevision(productName, envName string, userID int, superUser bool, log *zap.SugaredLogger) ([]*ProductRevision, error) { +func ListProductsRevision(productName, envName, userID string, superUser bool, log *zap.SugaredLogger) ([]*ProductRevision, error) { var ( err error prodRevs = make([]*ProductRevision, 0) @@ -59,7 +59,7 @@ func ListProductsRevision(productName, envName string, userID int, superUser boo } poetryCtl := poetry.New(config.PoetryAPIServer()) - productNameMap, err = poetryCtl.GetUserProject(userID, log) + productNameMap, err = poetryCtl.GetUserProject(1, log) if err != nil { log.Errorf("Collection.Product.List GetUserProject error: %v", err) return prodRevs, e.ErrListProducts.AddDesc(err.Error()) diff --git a/pkg/microservice/aslan/core/multicluster/handler/clusters.go b/pkg/microservice/aslan/core/multicluster/handler/clusters.go index c421e307e..d84ea096d 100644 --- a/pkg/microservice/aslan/core/multicluster/handler/clusters.go +++ b/pkg/microservice/aslan/core/multicluster/handler/clusters.go @@ -60,7 +60,7 @@ func CreateCluster(c *gin.Context) { } args.CreatedAt = time.Now().Unix() - args.CreatedBy = ctx.Username + args.CreatedBy = ctx.UserName ctx.Resp, ctx.Err = service.CreateCluster(args, ctx.Logger) } @@ -87,21 +87,21 @@ func DeleteCluster(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - ctx.Err = service.DeleteCluster(ctx.Username, c.Param("id"), ctx.Logger) + ctx.Err = service.DeleteCluster(ctx.UserName, c.Param("id"), ctx.Logger) } func DisconnectCluster(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - ctx.Err = service.DisconnectCluster(ctx.Username, c.Param("id"), ctx.Logger) + ctx.Err = service.DisconnectCluster(ctx.UserName, c.Param("id"), ctx.Logger) } func ReconnectCluster(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - ctx.Err = service.ReconnectCluster(ctx.Username, c.Param("id"), ctx.Logger) + ctx.Err = service.ReconnectCluster(ctx.UserName, c.Param("id"), ctx.Logger) } func ClusterConnectFromAgent(c *gin.Context) { diff --git a/pkg/microservice/aslan/core/project/handler/product.go b/pkg/microservice/aslan/core/project/handler/product.go index 1c11a0d1e..1a1eb7775 100644 --- a/pkg/microservice/aslan/core/project/handler/product.go +++ b/pkg/microservice/aslan/core/project/handler/product.go @@ -59,14 +59,14 @@ func CreateProductTemplate(c *gin.Context) { if err = json.Unmarshal(data, args); err != nil { log.Errorf("CreateProductTemplate json.Unmarshal err : %v", err) } - internalhandler.InsertOperationLog(c, ctx.Username, args.ProductName, "新增", "项目管理-项目", args.ProductName, string(data), ctx.Logger) + internalhandler.InsertOperationLog(c, ctx.UserName, args.ProductName, "新增", "项目管理-项目", args.ProductName, string(data), ctx.Logger) c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(data)) if err := c.BindJSON(args); err != nil { ctx.Err = e.ErrInvalidParam.AddDesc("invalid ProductTmpl json args") return } - args.UpdateBy = ctx.Username + args.UpdateBy = ctx.UserName ctx.Err = projectservice.CreateProductTemplate(args, ctx.Logger) } @@ -83,7 +83,7 @@ func UpdateProductTemplate(c *gin.Context) { if err = json.Unmarshal(data, args); err != nil { log.Errorf("UpdateProductTemplate json.Unmarshal err : %v", err) } - internalhandler.InsertOperationLog(c, ctx.Username, args.ProductName, "更新", "项目管理-项目环境模板或变量", args.ProductName, string(data), ctx.Logger) + internalhandler.InsertOperationLog(c, ctx.UserName, args.ProductName, "更新", "项目管理-项目环境模板或变量", args.ProductName, string(data), ctx.Logger) c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(data)) if err := c.BindJSON(args); err != nil { @@ -91,7 +91,7 @@ func UpdateProductTemplate(c *gin.Context) { return } - args.UpdateBy = ctx.Username + args.UpdateBy = ctx.UserName ctx.Err = projectservice.UpdateProductTemplate(c.Param("name"), args, ctx.Logger) } @@ -117,14 +117,14 @@ func UpdateProject(c *gin.Context) { if err = json.Unmarshal(data, args); err != nil { log.Errorf("UpdateProject json.Unmarshal err : %v", err) } - internalhandler.InsertOperationLog(c, ctx.Username, args.ProductName, "更新", "项目管理-项目", args.ProductName, string(data), ctx.Logger) + internalhandler.InsertOperationLog(c, ctx.UserName, args.ProductName, "更新", "项目管理-项目", args.ProductName, string(data), ctx.Logger) c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(data)) if err := c.BindJSON(args); err != nil { ctx.Err = e.ErrInvalidParam.AddDesc("invalid ProductTmpl json args") return } - args.UpdateBy = ctx.Username + args.UpdateBy = ctx.UserName productName := c.Query("productName") if productName == "" { ctx.Err = e.ErrInvalidParam.AddDesc("productName can't be empty") @@ -146,7 +146,7 @@ func UpdateServiceOrchestration(c *gin.Context) { ctx.Err = e.ErrInvalidParam return } - internalhandler.InsertOperationLog(c, ctx.Username, projectName, "更新", "项目管理-项目服务编排", projectName, "", ctx.Logger) + internalhandler.InsertOperationLog(c, ctx.UserName, projectName, "更新", "项目管理-项目服务编排", projectName, "", ctx.Logger) args := new(UpdateOrchestrationServiceReq) if err := c.BindJSON(args); err != nil { @@ -154,22 +154,22 @@ func UpdateServiceOrchestration(c *gin.Context) { return } - ctx.Err = projectservice.UpdateServiceOrchestration(projectName, args.Services, ctx.Username, ctx.Logger) + ctx.Err = projectservice.UpdateServiceOrchestration(projectName, args.Services, ctx.UserName, ctx.Logger) } func DeleteProductTemplate(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - internalhandler.InsertOperationLog(c, ctx.Username, c.Param("name"), "删除", "项目管理-项目", c.Param("name"), "", ctx.Logger) - ctx.Err = projectservice.DeleteProductTemplate(ctx.Username, c.Param("name"), ctx.RequestID, ctx.Logger) + internalhandler.InsertOperationLog(c, ctx.UserName, c.Param("name"), "删除", "项目管理-项目", c.Param("name"), "", ctx.Logger) + ctx.Err = projectservice.DeleteProductTemplate(ctx.UserName, c.Param("name"), ctx.RequestID, ctx.Logger) } func ListTemplatesHierachy(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - ctx.Resp, ctx.Err = projectservice.ListTemplatesHierachy(ctx.User.Name, ctx.User.ID, ctx.User.IsSuperUser, ctx.Logger) + ctx.Resp, ctx.Err = projectservice.ListTemplatesHierachy(ctx.UserName, ctx.UserID, false, ctx.Logger) } func ForkProduct(c *gin.Context) { @@ -182,14 +182,14 @@ func ForkProduct(c *gin.Context) { return } args.ProductName = c.Param("productName") - ctx.Err = projectservice.ForkProduct(ctx.User.ID, ctx.Username, ctx.RequestID, args, ctx.Logger) + ctx.Err = projectservice.ForkProduct(ctx.UserName, ctx.RequestID, args, ctx.Logger) } func UnForkProduct(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - ctx.Err = projectservice.UnForkProduct(ctx.User.ID, ctx.Username, c.Param("productName"), c.Query("workflowName"), c.Query("envName"), ctx.RequestID, ctx.Logger) + ctx.Err = projectservice.UnForkProduct(ctx.UserID, ctx.UserName, c.Param("productName"), c.Query("workflowName"), c.Query("envName"), ctx.RequestID, ctx.Logger) } func GetCustomMatchRules(c *gin.Context) { @@ -213,7 +213,7 @@ func CreateOrUpdateMatchRules(c *gin.Context) { return } - internalhandler.InsertOperationLog(c, ctx.Username, c.Param("name"), "更新", "工程管理-项目", c.Param("name"), "", ctx.Logger) + internalhandler.InsertOperationLog(c, ctx.UserName, c.Param("name"), "更新", "工程管理-项目", c.Param("name"), "", ctx.Logger) args := new(projectservice.CustomParseDataArgs) data, err := c.GetRawData() @@ -228,5 +228,5 @@ func CreateOrUpdateMatchRules(c *gin.Context) { return } - ctx.Err = projectservice.UpdateCustomMatchRules(c.Param("name"), ctx.Username, args.Rules) + ctx.Err = projectservice.UpdateCustomMatchRules(c.Param("name"), ctx.UserName, args.Rules) } diff --git a/pkg/microservice/aslan/core/project/handler/render.go b/pkg/microservice/aslan/core/project/handler/render.go index 86f259fd9..0061ae339 100644 --- a/pkg/microservice/aslan/core/project/handler/render.go +++ b/pkg/microservice/aslan/core/project/handler/render.go @@ -60,31 +60,6 @@ func GetRenderSetInfo(c *gin.Context) { ctx.Resp, ctx.Err = service.GetRenderSetInfo(c.Param("name"), revision) } -//func ValidateRenderSet(c *gin.Context) { -// ctx := internalhandler.NewContext(c) -// defer func() { internalhandler.JSONResponse(c, ctx) }() -// _, ctx.Err = projectservice.ValidateRenderSet(c.Param("productName"), c.Param("renderName"), "", ctx.Logger) -//} -// -//func RelateRender(c *gin.Context) { -// ctx := internalhandler.NewContext(c) -// defer func() { internalhandler.JSONResponse(c, ctx) }() -// ctx.Err = projectservice.RelateRender(c.Param("productName"), c.Param("renderName"), ctx.Logger) -//} -// -//func CreateRenderSet(c *gin.Context) { -// ctx := internalhandler.NewContext(c) -// defer func() { internalhandler.JSONResponse(c, ctx) }() -// -// args := new(models.RenderSet) -// ctx.Err = c.BindJSON(args) -// if ctx.Err != nil { -// return -// } -// args.UpdateBy = ctx.Username -// ctx.Err = projectservice.CreateRenderSet(args, ctx.Logger) -//} - func UpdateRenderSet(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() @@ -94,6 +69,6 @@ func UpdateRenderSet(c *gin.Context) { if ctx.Err != nil { return } - args.UpdateBy = ctx.Username + args.UpdateBy = ctx.UserName ctx.Err = service.UpdateRenderSet(args, ctx.Logger) } diff --git a/pkg/microservice/aslan/core/project/service/product.go b/pkg/microservice/aslan/core/project/service/product.go index 2adb3bccc..7c867f321 100644 --- a/pkg/microservice/aslan/core/project/service/product.go +++ b/pkg/microservice/aslan/core/project/service/product.go @@ -414,7 +414,7 @@ func DeleteProductTemplate(userName, productName, requestID string, log *zap.Sug return nil } -func ForkProduct(userID int, username, requestID string, args *template.ForkProject, log *zap.SugaredLogger) error { +func ForkProduct(username, requestID string, args *template.ForkProject, log *zap.SugaredLogger) error { prodTmpl, err := templaterepo.NewProductColl().Find(args.ProductName) if err != nil { @@ -542,10 +542,10 @@ func ForkProduct(userID int, username, requestID string, args *template.ForkProj return workflowservice.CreateWorkflow(workflowArgs, log) } -func UnForkProduct(userID int, username, productName, workflowName, envName, requestID string, log *zap.SugaredLogger) error { +func UnForkProduct(userID string, username, productName, workflowName, envName, requestID string, log *zap.SugaredLogger) error { poetryClient := poetry.New(config.PoetryAPIServer()) - if userEnvPermissions, _ := poetryClient.ListUserEnvPermission(productName, userID, log); len(userEnvPermissions) > 0 { - if err := poetryClient.DeleteUserEnvPermission(productName, username, userID, log); err != nil { + if userEnvPermissions, _ := poetryClient.ListUserEnvPermission(productName, 1, log); len(userEnvPermissions) > 0 { + if err := poetryClient.DeleteUserEnvPermission(productName, username, 1, log); err != nil { return e.ErrUnForkProduct.AddDesc(fmt.Sprintf("Failed to delete env permission for userID: %d, env: %s, productName: %s, the error is: %+v", userID, username, productName, err)) } } @@ -559,7 +559,7 @@ func UnForkProduct(userID int, username, productName, workflowName, envName, req } if roleID := poetryClient.GetContributorRoleID(productName, log); roleID > 0 { - err := poetryClient.DeleteUserRole(roleID, poetry.ProjectType, userID, productName, log) + err := poetryClient.DeleteUserRole(roleID, poetry.ProjectType, 1, productName, log) if err != nil { log.Errorf("Failed to Delete user from role candidate, the error is: %v", err) return e.ErrUnForkProduct.AddDesc(err.Error()) @@ -689,7 +689,7 @@ type ContainerInfo struct { Label string `bson:"label" json:"label"` } -func ListTemplatesHierachy(userName string, userID int, superUser bool, log *zap.SugaredLogger) ([]*ProductInfo, error) { +func ListTemplatesHierachy(userName, userID string, superUser bool, log *zap.SugaredLogger) ([]*ProductInfo, error) { var ( err error resp = make([]*ProductInfo, 0) @@ -703,7 +703,7 @@ func ListTemplatesHierachy(userName string, userID int, superUser bool, log *zap return nil, e.ErrListProducts.AddDesc(err.Error()) } } else { - productNameMap, err := poetry.New(config.PoetryAPIServer()).GetUserProject(userID, log) + productNameMap, err := poetry.New(config.PoetryAPIServer()).GetUserProject(1, log) if err != nil { log.Errorf("ProfuctTmpl.List GetUserProject error: %v", err) return resp, e.ErrListProducts.AddDesc(err.Error()) diff --git a/pkg/microservice/aslan/core/service/handler/helm.go b/pkg/microservice/aslan/core/service/handler/helm.go index d36fed1a5..c57b789b1 100644 --- a/pkg/microservice/aslan/core/service/handler/helm.go +++ b/pkg/microservice/aslan/core/service/handler/helm.go @@ -64,7 +64,7 @@ func CreateOrUpdateHelmService(c *gin.Context) { ctx.Err = e.ErrInvalidParam.AddDesc("invalid HelmService json args") return } - args.CreatedBy = ctx.Username + args.CreatedBy = ctx.UserName ctx.Err = svcservice.CreateOrUpdateHelmService(c.Query("productName"), args, ctx.Logger) } @@ -78,7 +78,7 @@ func UpdateHelmService(c *gin.Context) { ctx.Err = e.ErrInvalidParam.AddDesc("invalid HelmServiceArgs json args") return } - args.CreateBy = ctx.Username + args.CreateBy = ctx.UserName args.ProductName = c.Param("productName") ctx.Err = svcservice.UpdateHelmService(args, ctx.Logger) diff --git a/pkg/microservice/aslan/core/service/handler/loader.go b/pkg/microservice/aslan/core/service/handler/loader.go index 7a9e6406a..00b5675f7 100644 --- a/pkg/microservice/aslan/core/service/handler/loader.go +++ b/pkg/microservice/aslan/core/service/handler/loader.go @@ -85,7 +85,7 @@ func LoadServiceTemplate(c *gin.Context) { remoteName := c.Query("remoteName") repoOwner := c.Query("repoOwner") - ctx.Err = svcservice.LoadServiceFromCodeHost(ctx.Username, codehostID, repoOwner, repoName, repoUUID, branchName, remoteName, args, ctx.Logger) + ctx.Err = svcservice.LoadServiceFromCodeHost(ctx.UserName, codehostID, repoOwner, repoName, repoUUID, branchName, remoteName, args, ctx.Logger) } // ValidateServiceUpdate ... diff --git a/pkg/microservice/aslan/core/service/handler/service.go b/pkg/microservice/aslan/core/service/handler/service.go index 683f74aa9..cfbd66803 100644 --- a/pkg/microservice/aslan/core/service/handler/service.go +++ b/pkg/microservice/aslan/core/service/handler/service.go @@ -82,16 +82,16 @@ func CreateServiceTemplate(c *gin.Context) { if err = json.Unmarshal(data, args); err != nil { log.Errorf("CreateServiceTemplate json.Unmarshal err : %v", err) } - internalhandler.InsertOperationLog(c, ctx.Username, args.ProductName, "新增", "项目管理-服务", fmt.Sprintf("服务名称:%s,版本号:%d", args.ServiceName, args.Revision), string(data), ctx.Logger) + internalhandler.InsertOperationLog(c, ctx.UserName, args.ProductName, "新增", "项目管理-服务", fmt.Sprintf("服务名称:%s,版本号:%d", args.ServiceName, args.Revision), string(data), ctx.Logger) c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(data)) if err := c.BindJSON(args); err != nil { ctx.Err = e.ErrInvalidParam.AddDesc("invalid ServiceTmpl json args") return } - args.CreateBy = ctx.Username + args.CreateBy = ctx.UserName - ctx.Resp, ctx.Err = svcservice.CreateServiceTemplate(ctx.Username, args, ctx.Logger) + ctx.Resp, ctx.Err = svcservice.CreateServiceTemplate(ctx.UserName, args, ctx.Logger) } func UpdateServiceTemplate(c *gin.Context) { @@ -107,10 +107,10 @@ func UpdateServiceTemplate(c *gin.Context) { log.Errorf("UpdateServiceTemplate json.Unmarshal err : %v", err) } if args.Username != "system" { - internalhandler.InsertOperationLog(c, ctx.Username, args.ProductName, "更新", "项目管理-服务", fmt.Sprintf("服务名称:%s,版本号:%d", args.ServiceName, args.Revision), "", ctx.Logger) + internalhandler.InsertOperationLog(c, ctx.UserName, args.ProductName, "更新", "项目管理-服务", fmt.Sprintf("服务名称:%s,版本号:%d", args.ServiceName, args.Revision), "", ctx.Logger) } c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(data)) - args.Username = ctx.Username + args.Username = ctx.UserName ctx.Err = svcservice.UpdateServiceTemplate(args) } @@ -139,7 +139,7 @@ func DeleteServiceTemplate(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - internalhandler.InsertOperationLog(c, ctx.Username, c.Query("productName"), "删除", "项目管理-服务", c.Param("name"), "", ctx.Logger) + internalhandler.InsertOperationLog(c, ctx.UserName, c.Query("productName"), "删除", "项目管理-服务", c.Param("name"), "", ctx.Logger) ctx.Err = svcservice.DeleteServiceTemplate(c.Param("name"), c.Param("type"), c.Query("productName"), c.DefaultQuery("isEnvTemplate", "true"), c.DefaultQuery("visibility", "public"), ctx.Logger) } @@ -178,7 +178,7 @@ func UpdateWorkloads(c *gin.Context) { ctx.Err = e.ErrInvalidParam return } - ctx.Err = service.UpdateWorkloads(c, ctx.RequestID, ctx.Username, product, env, *args, ctx.Logger) + ctx.Err = service.UpdateWorkloads(c, ctx.RequestID, ctx.UserName, product, env, *args, ctx.Logger) } func CreateK8sWorkloads(c *gin.Context) { @@ -190,7 +190,7 @@ func CreateK8sWorkloads(c *gin.Context) { ctx.Err = e.ErrInvalidParam.AddDesc("invalid K8sWorkloadsArgs args") return } - ctx.Err = svcservice.CreateK8sWorkLoads(c, ctx.RequestID, ctx.Username, args.ProductName, args.WorkLoads, args.ClusterID, args.Namespace, args.EnvName, ctx.Logger) + ctx.Err = svcservice.CreateK8sWorkLoads(c, ctx.RequestID, ctx.UserName, args.ProductName, args.WorkLoads, args.ClusterID, args.Namespace, args.EnvName, ctx.Logger) } func ListAvailablePublicServices(c *gin.Context) { @@ -243,7 +243,7 @@ func CreatePMService(c *gin.Context) { if err = json.Unmarshal(data, args); err != nil { log.Errorf("CreatePMService json.Unmarshal err : %v", err) } - internalhandler.InsertOperationLog(c, ctx.Username, c.Param("productName"), "新增", "项目管理-物理机部署服务", fmt.Sprintf("服务名称:%s,版本号:%d", args.ServiceTmplObject.ServiceName, args.ServiceTmplObject.Revision), string(data), ctx.Logger) + internalhandler.InsertOperationLog(c, ctx.UserName, c.Param("productName"), "新增", "项目管理-物理机部署服务", fmt.Sprintf("服务名称:%s,版本号:%d", args.ServiceTmplObject.ServiceName, args.ServiceTmplObject.Revision), string(data), ctx.Logger) c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(data)) if err := c.BindJSON(args); err != nil { @@ -280,7 +280,7 @@ func CreatePMService(c *gin.Context) { } } - ctx.Err = svcservice.CreatePMService(ctx.Username, args, ctx.Logger) + ctx.Err = svcservice.CreatePMService(ctx.UserName, args, ctx.Logger) } func UpdatePmServiceTemplate(c *gin.Context) { @@ -295,7 +295,7 @@ func UpdatePmServiceTemplate(c *gin.Context) { if err = json.Unmarshal(data, args); err != nil { log.Errorf("UpdatePmServiceTemplate json.Unmarshal err : %v", err) } - internalhandler.InsertOperationLog(c, ctx.Username, c.Param("productName"), "更新", "项目管理-主机服务", fmt.Sprintf("服务名称:%s,版本号:%d", args.ServiceTmplObject.ServiceName, args.ServiceTmplObject.Revision), "", ctx.Logger) + internalhandler.InsertOperationLog(c, ctx.UserName, c.Param("productName"), "更新", "项目管理-主机服务", fmt.Sprintf("服务名称:%s,版本号:%d", args.ServiceTmplObject.ServiceName, args.ServiceTmplObject.Revision), "", ctx.Logger) c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(data)) for _, heathCheck := range args.ServiceTmplObject.HealthChecks { @@ -322,5 +322,5 @@ func UpdatePmServiceTemplate(c *gin.Context) { } } } - ctx.Err = commonservice.UpdatePmServiceTemplate(ctx.Username, args, ctx.Logger) + ctx.Err = commonservice.UpdatePmServiceTemplate(ctx.UserName, args, ctx.Logger) } diff --git a/pkg/microservice/aslan/core/setting/handler/user.go b/pkg/microservice/aslan/core/setting/handler/user.go index c453d691a..bdaf0f481 100644 --- a/pkg/microservice/aslan/core/setting/handler/user.go +++ b/pkg/microservice/aslan/core/setting/handler/user.go @@ -27,5 +27,5 @@ func GetUserKubeConfig(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - ctx.Resp, ctx.Err = settingservice.GetUserKubeConfig(ctx.User.Name, ctx.User.ID, ctx.User.IsSuperUser, ctx.Logger) + ctx.Resp, ctx.Err = settingservice.GetUserKubeConfig(ctx.UserName, ctx.UserID, false, ctx.Logger) } diff --git a/pkg/microservice/aslan/core/setting/service/user.go b/pkg/microservice/aslan/core/setting/service/user.go index 03ba10c33..a2d19e0eb 100644 --- a/pkg/microservice/aslan/core/setting/service/user.go +++ b/pkg/microservice/aslan/core/setting/service/user.go @@ -57,7 +57,7 @@ type kubeCfgTmplArgs struct { ClientKeyBase64 string } -func GetUserKubeConfig(userName string, userID int, superUser bool, log *zap.SugaredLogger) (string, error) { +func GetUserKubeConfig(userName, userID string, superUser bool, log *zap.SugaredLogger) (string, error) { username := strings.ToLower(userName) username = config.NameSpaceRegex.ReplaceAllString(username, "-") var ( @@ -89,7 +89,7 @@ func GetUserKubeConfig(userName string, userID int, superUser bool, log *zap.Sug namespaceSet.Insert(publicProduct.Namespace) } poetryClient := poetry.New(config.PoetryAPIServer()) - productNameMap, err = poetryClient.GetUserProject(userID, log) + productNameMap, err = poetryClient.GetUserProject(1, log) if err != nil { log.Errorf("GetUserKubeConfig Collection.Product.List GetUserProject error: %v", err) return "", e.ErrListProducts.AddDesc(err.Error()) @@ -138,7 +138,6 @@ func GetUserKubeConfig(userName string, userID int, superUser bool, log *zap.Sug ) for _, productEnv := range productEnvs { namespace := productEnv.Namespace - productName := productEnv.ProductName if _, found, err := getter.GetNamespace(namespace, krkubeclient.Client()); err != nil || !found { log.Error(err) @@ -152,7 +151,7 @@ func GetUserKubeConfig(userName string, userID int, superUser bool, log *zap.Sug wg.Done() <-pool }() - if err := ensureUserRole(namespace, username, productName, userID, superUser, log); err != nil { + if err := ensureUserRole(namespace, username, log); err != nil { log.Error(err) errList = multierror.Append(errList, err) } @@ -235,7 +234,7 @@ func ensureServiceAccount(namespace, username string, log *zap.SugaredLogger) er return nil } -func ensureUserRole(namespace, username, productName string, userID int, superUser bool, log *zap.SugaredLogger) error { +func ensureUserRole(namespace, username string, _ *zap.SugaredLogger) error { roleName := fmt.Sprintf("%s-role", username) verbs := []string{"*"} role := &rbacv1beta1.Role{ diff --git a/pkg/microservice/aslan/core/system/handler/announcement.go b/pkg/microservice/aslan/core/system/handler/announcement.go index 739b84cab..30227aa79 100644 --- a/pkg/microservice/aslan/core/system/handler/announcement.go +++ b/pkg/microservice/aslan/core/system/handler/announcement.go @@ -35,7 +35,7 @@ func CreateAnnouncement(c *gin.Context) { ctx.Err = e.ErrInvalidParam.AddDesc("invalid notify args") return } - ctx.Err = service.CreateAnnouncement(ctx.Username, args, ctx.Logger) + ctx.Err = service.CreateAnnouncement(ctx.UserName, args, ctx.Logger) } func UpdateAnnouncement(c *gin.Context) { @@ -48,21 +48,21 @@ func UpdateAnnouncement(c *gin.Context) { ctx.Err = e.ErrInvalidParam.AddDesc("invalid notify args") return } - ctx.Err = service.UpdateAnnouncement(ctx.Username, args.ID.Hex(), args, ctx.Logger) + ctx.Err = service.UpdateAnnouncement(ctx.UserName, args.ID.Hex(), args, ctx.Logger) } func PullAllAnnouncement(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - ctx.Resp, ctx.Err = service.PullAllAnnouncement(ctx.Username, ctx.Logger) + ctx.Resp, ctx.Err = service.PullAllAnnouncement(ctx.UserName, ctx.Logger) } func PullNotifyAnnouncement(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - ctx.Resp, ctx.Err = service.PullNotifyAnnouncement(ctx.Username, ctx.Logger) + ctx.Resp, ctx.Err = service.PullNotifyAnnouncement(ctx.UserName, ctx.Logger) } func DeleteAnnouncement(c *gin.Context) { @@ -71,5 +71,5 @@ func DeleteAnnouncement(c *gin.Context) { ID := c.Param("id") - ctx.Err = service.DeleteAnnouncement(ctx.Username, ID, ctx.Logger) + ctx.Err = service.DeleteAnnouncement(ctx.UserName, ID, ctx.Logger) } diff --git a/pkg/microservice/aslan/core/system/handler/basic_images.go b/pkg/microservice/aslan/core/system/handler/basic_images.go index 5e4a7ebfe..be11a6701 100644 --- a/pkg/microservice/aslan/core/system/handler/basic_images.go +++ b/pkg/microservice/aslan/core/system/handler/basic_images.go @@ -58,7 +58,7 @@ func CreateBasicImage(c *gin.Context) { if err = json.Unmarshal(data, args); err != nil { log.Errorf("CreateBasicImage json.Unmarshal err : %v", err) } - internalhandler.InsertOperationLog(c, ctx.Username, "", "新增", "基础镜像", fmt.Sprintf("label:%s", args.Label), string(data), ctx.Logger) + internalhandler.InsertOperationLog(c, ctx.UserName, "", "新增", "基础镜像", fmt.Sprintf("label:%s", args.Label), string(data), ctx.Logger) c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(data)) @@ -66,7 +66,7 @@ func CreateBasicImage(c *gin.Context) { ctx.Err = e.ErrInvalidParam.AddDesc("invalid BasicImage args") return } - args.UpdateBy = ctx.Username + args.UpdateBy = ctx.UserName ctx.Err = service.CreateBasicImage(args, ctx.Logger) } @@ -83,7 +83,7 @@ func UpdateBasicImage(c *gin.Context) { if err = json.Unmarshal(data, args); err != nil { log.Errorf("UpdateBasicImage json.Unmarshal err : %v", err) } - internalhandler.InsertOperationLog(c, ctx.Username, "", "更新", "基础镜像", fmt.Sprintf("id:%s", args.ID), string(data), ctx.Logger) + internalhandler.InsertOperationLog(c, ctx.UserName, "", "更新", "基础镜像", fmt.Sprintf("id:%s", args.ID), string(data), ctx.Logger) c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(data)) @@ -91,7 +91,7 @@ func UpdateBasicImage(c *gin.Context) { ctx.Err = e.ErrInvalidParam.AddDesc("invalid BasicImage args") return } - args.UpdateBy = ctx.Username + args.UpdateBy = ctx.UserName ctx.Err = service.UpdateBasicImage(c.Param("id"), args, ctx.Logger) } @@ -100,7 +100,7 @@ func DeleteBasicImage(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - internalhandler.InsertOperationLog(c, ctx.Username, "", "删除", "基础镜像", fmt.Sprintf("id:%s", c.Param("id")), "", ctx.Logger) + internalhandler.InsertOperationLog(c, ctx.UserName, "", "删除", "基础镜像", fmt.Sprintf("id:%s", c.Param("id")), "", ctx.Logger) ctx.Err = service.DeleteBasicImage(c.Param("id"), ctx.Logger) } diff --git a/pkg/microservice/aslan/core/system/handler/helm.go b/pkg/microservice/aslan/core/system/handler/helm.go index 928791483..31a84a53d 100644 --- a/pkg/microservice/aslan/core/system/handler/helm.go +++ b/pkg/microservice/aslan/core/system/handler/helm.go @@ -44,7 +44,7 @@ func CreateHelmRepo(c *gin.Context) { ctx.Err = e.ErrInvalidParam.AddDesc("invalid helmRepo json args") return } - args.UpdateBy = ctx.Username + args.UpdateBy = ctx.UserName if _, err := url.Parse(args.URL); err != nil { ctx.Err = e.ErrInvalidParam.AddDesc("invalid url") return @@ -61,7 +61,7 @@ func UpdateHelmRepo(c *gin.Context) { ctx.Err = e.ErrInvalidParam.AddDesc("invalid helmRepo json args") return } - args.UpdateBy = ctx.Username + args.UpdateBy = ctx.UserName ctx.Err = service.UpdateHelmRepo(c.Param("id"), args, ctx.Logger) } diff --git a/pkg/microservice/aslan/core/system/handler/install.go b/pkg/microservice/aslan/core/system/handler/install.go index f2347d9fe..35532d162 100644 --- a/pkg/microservice/aslan/core/system/handler/install.go +++ b/pkg/microservice/aslan/core/system/handler/install.go @@ -44,14 +44,14 @@ func CreateInstall(c *gin.Context) { if err = json.Unmarshal(data, args); err != nil { log.Errorf("CreateInstall json.Unmarshal err : %v", err) } - internalhandler.InsertOperationLog(c, ctx.Username, "", "新增", "系统设置-应用设置", fmt.Sprintf("应用名称:%s,应用版本:%s", args.Name, args.Version), string(data), ctx.Logger) + internalhandler.InsertOperationLog(c, ctx.UserName, "", "新增", "系统设置-应用设置", fmt.Sprintf("应用名称:%s,应用版本:%s", args.Name, args.Version), string(data), ctx.Logger) c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(data)) if err := c.ShouldBindWith(&args, binding.JSON); err != nil { ctx.Err = e.ErrInvalidParam.AddDesc("invalid Install args") return } - args.UpdateBy = ctx.Username + args.UpdateBy = ctx.UserName ctx.Err = service.CreateInstall(args, ctx.Logger) } @@ -68,14 +68,14 @@ func UpdateInstall(c *gin.Context) { if err = json.Unmarshal(data, args); err != nil { log.Errorf("UpdateInstall json.Unmarshal err : %v", err) } - internalhandler.InsertOperationLog(c, ctx.Username, "", "更新", "系统设置-应用设置", fmt.Sprintf("应用名称:%s,应用版本:%s", args.Name, args.Version), string(data), ctx.Logger) + internalhandler.InsertOperationLog(c, ctx.UserName, "", "更新", "系统设置-应用设置", fmt.Sprintf("应用名称:%s,应用版本:%s", args.Name, args.Version), string(data), ctx.Logger) c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(data)) if err := c.ShouldBindWith(&args, binding.JSON); err != nil { ctx.Err = e.ErrInvalidParam.AddDesc("invalid Install args") return } - args.UpdateBy = ctx.Username + args.UpdateBy = ctx.UserName name := args.Name version := args.Version if name == "" || version == "" { @@ -116,7 +116,7 @@ func DeleteInstall(c *gin.Context) { if err = json.Unmarshal(data, args); err != nil { log.Errorf("DeleteInstall json.Unmarshal err : %v", err) } - internalhandler.InsertOperationLog(c, ctx.Username, "", "删除", "系统设置-应用设置", fmt.Sprintf("应用名称:%s,应用版本:%s", args.Name, args.Version), string(data), ctx.Logger) + internalhandler.InsertOperationLog(c, ctx.UserName, "", "删除", "系统设置-应用设置", fmt.Sprintf("应用名称:%s,应用版本:%s", args.Name, args.Version), string(data), ctx.Logger) c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(data)) if err := c.ShouldBindWith(&args, binding.JSON); err != nil { diff --git a/pkg/microservice/aslan/core/system/handler/jenkins.go b/pkg/microservice/aslan/core/system/handler/jenkins.go index 20e796219..3f0620816 100644 --- a/pkg/microservice/aslan/core/system/handler/jenkins.go +++ b/pkg/microservice/aslan/core/system/handler/jenkins.go @@ -36,7 +36,7 @@ func CreateJenkinsIntegration(c *gin.Context) { ctx.Err = e.ErrInvalidParam.AddDesc("invalid jenkinsIntegration json args") return } - args.UpdateBy = ctx.Username + args.UpdateBy = ctx.UserName if _, err := url.Parse(args.URL); err != nil { ctx.Err = e.ErrInvalidParam.AddDesc("invalid url") return @@ -60,7 +60,7 @@ func UpdateJenkinsIntegration(c *gin.Context) { ctx.Err = e.ErrInvalidParam.AddDesc("invalid jenkinsIntegration json args") return } - args.UpdateBy = ctx.Username + args.UpdateBy = ctx.UserName ctx.Err = service.UpdateJenkinsIntegration(c.Param("id"), args, ctx.Logger) } diff --git a/pkg/microservice/aslan/core/system/handler/notify.go b/pkg/microservice/aslan/core/system/handler/notify.go index 5093cea28..f654e8a19 100644 --- a/pkg/microservice/aslan/core/system/handler/notify.go +++ b/pkg/microservice/aslan/core/system/handler/notify.go @@ -31,7 +31,7 @@ func PullNotify(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - ctx.Resp, ctx.Err = service.PullNotify(ctx.Username, ctx.Logger) + ctx.Resp, ctx.Err = service.PullNotify(ctx.UserName, ctx.Logger) } type readNotificationsArgs struct { @@ -48,7 +48,7 @@ func ReadNotify(c *gin.Context) { ctx.Err = e.ErrInvalidParam.AddDesc("invalid readnotificationsargs") return } - ctx.Err = service.ReadNotify(ctx.Username, args.IDs, ctx.Logger) + ctx.Err = service.ReadNotify(ctx.UserName, args.IDs, ctx.Logger) } type deleteNotificationsArgs struct { @@ -65,7 +65,7 @@ func DeleteNotifies(c *gin.Context) { ctx.Err = e.ErrInvalidParam.AddDesc("invalid args") return } - ctx.Err = service.DeleteNotifies(ctx.Username, args.IDs, ctx.Logger) + ctx.Err = service.DeleteNotifies(ctx.UserName, args.IDs, ctx.Logger) } func UpsertSubscription(c *gin.Context) { @@ -78,7 +78,7 @@ func UpsertSubscription(c *gin.Context) { ctx.Err = e.ErrInvalidParam.AddDesc("invalid subscription args") return } - ctx.Err = service.UpsertSubscription(ctx.Username, args, ctx.Logger) + ctx.Err = service.UpsertSubscription(ctx.UserName, args, ctx.Logger) } func UpdateSubscribe(c *gin.Context) { @@ -96,7 +96,7 @@ func UpdateSubscribe(c *gin.Context) { ctx.Err = e.ErrInvalidParam.AddDesc("invalid notification type") return } - ctx.Err = service.UpdateSubscribe(ctx.Username, notifytype, args, ctx.Logger) + ctx.Err = service.UpdateSubscribe(ctx.UserName, notifytype, args, ctx.Logger) } func Unsubscribe(c *gin.Context) { @@ -107,12 +107,12 @@ func Unsubscribe(c *gin.Context) { ctx.Err = e.ErrInvalidParam.AddDesc("invalid notification type") return } - ctx.Err = service.Unsubscribe(ctx.Username, notifytype, ctx.Logger) + ctx.Err = service.Unsubscribe(ctx.UserName, notifytype, ctx.Logger) } func ListSubscriptions(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - ctx.Resp, ctx.Err = service.ListSubscriptions(ctx.Username, ctx.Logger) + ctx.Resp, ctx.Err = service.ListSubscriptions(ctx.UserName, ctx.Logger) } diff --git a/pkg/microservice/aslan/core/system/handler/private_key.go b/pkg/microservice/aslan/core/system/handler/private_key.go index f2b32a184..93377b129 100644 --- a/pkg/microservice/aslan/core/system/handler/private_key.go +++ b/pkg/microservice/aslan/core/system/handler/private_key.go @@ -58,7 +58,7 @@ func CreatePrivateKey(c *gin.Context) { if err = json.Unmarshal(data, args); err != nil { log.Errorf("CreatePrivateKey json.Unmarshal err : %v", err) } - internalhandler.InsertOperationLog(c, ctx.Username, "", "新增", "资源管理-主机管理", fmt.Sprintf("hostName:%s ip:%s", args.Name, args.IP), string(data), ctx.Logger) + internalhandler.InsertOperationLog(c, ctx.UserName, "", "新增", "资源管理-主机管理", fmt.Sprintf("hostName:%s ip:%s", args.Name, args.IP), string(data), ctx.Logger) c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(data)) @@ -66,7 +66,7 @@ func CreatePrivateKey(c *gin.Context) { ctx.Err = e.ErrInvalidParam.AddDesc("invalid PrivateKey args") return } - args.UpdateBy = ctx.Username + args.UpdateBy = ctx.UserName ctx.Err = service.CreatePrivateKey(args, ctx.Logger) } @@ -83,7 +83,7 @@ func UpdatePrivateKey(c *gin.Context) { if err = json.Unmarshal(data, args); err != nil { log.Errorf("UpdatePrivateKey json.Unmarshal err : %v", err) } - internalhandler.InsertOperationLog(c, ctx.Username, "", "更新", "资源管理-主机管理", fmt.Sprintf("hostName:%s ip:%s", args.Name, args.IP), string(data), ctx.Logger) + internalhandler.InsertOperationLog(c, ctx.UserName, "", "更新", "资源管理-主机管理", fmt.Sprintf("hostName:%s ip:%s", args.Name, args.IP), string(data), ctx.Logger) c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(data)) @@ -91,7 +91,7 @@ func UpdatePrivateKey(c *gin.Context) { ctx.Err = e.ErrInvalidParam.AddDesc("invalid PrivateKey args") return } - args.UpdateBy = ctx.Username + args.UpdateBy = ctx.UserName ctx.Err = service.UpdatePrivateKey(c.Param("id"), args, ctx.Logger) } @@ -100,6 +100,6 @@ func DeletePrivateKey(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - internalhandler.InsertOperationLog(c, ctx.Username, "", "删除", "资源管理-主机管理", fmt.Sprintf("id:%s", c.Param("id")), "", ctx.Logger) + internalhandler.InsertOperationLog(c, ctx.UserName, "", "删除", "资源管理-主机管理", fmt.Sprintf("id:%s", c.Param("id")), "", ctx.Logger) ctx.Err = service.DeletePrivateKey(c.Param("id"), ctx.Logger) } diff --git a/pkg/microservice/aslan/core/system/handler/proxy.go b/pkg/microservice/aslan/core/system/handler/proxy.go index 2f0ed2602..896bca8b1 100644 --- a/pkg/microservice/aslan/core/system/handler/proxy.go +++ b/pkg/microservice/aslan/core/system/handler/proxy.go @@ -69,7 +69,7 @@ func CreateProxy(c *gin.Context) { if err = json.Unmarshal(data, args); err != nil { log.Errorf("CreateProxy json.Unmarshal err : %v", err) } - internalhandler.InsertOperationLog(c, ctx.Username, "", "新增", "代理", fmt.Sprintf("server:%s:%d", args.Address, args.Port), string(data), ctx.Logger) + internalhandler.InsertOperationLog(c, ctx.UserName, "", "新增", "代理", fmt.Sprintf("server:%s:%d", args.Address, args.Port), string(data), ctx.Logger) c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(data)) @@ -77,7 +77,7 @@ func CreateProxy(c *gin.Context) { ctx.Err = e.ErrInvalidParam.AddDesc("invalid proxy args") return } - args.UpdateBy = ctx.Username + args.UpdateBy = ctx.UserName ctx.Err = service.CreateProxy(args, ctx.Logger) } @@ -94,7 +94,7 @@ func UpdateProxy(c *gin.Context) { if err = json.Unmarshal(data, args); err != nil { log.Errorf("UpdateProxy json.Unmarshal err : %v", err) } - internalhandler.InsertOperationLog(c, ctx.Username, "", "更新", "代理", fmt.Sprintf("id:%s", args.ID), string(data), ctx.Logger) + internalhandler.InsertOperationLog(c, ctx.UserName, "", "更新", "代理", fmt.Sprintf("id:%s", args.ID), string(data), ctx.Logger) c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(data)) @@ -102,7 +102,7 @@ func UpdateProxy(c *gin.Context) { ctx.Err = e.ErrInvalidParam.AddDesc("invalid proxy args") return } - args.UpdateBy = ctx.Username + args.UpdateBy = ctx.UserName ctx.Err = service.UpdateProxy(c.Param("id"), args, ctx.Logger) } @@ -111,7 +111,7 @@ func DeleteProxy(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - internalhandler.InsertOperationLog(c, ctx.Username, "", "删除", "代理", fmt.Sprintf("id:%s", c.Param("id")), "", ctx.Logger) + internalhandler.InsertOperationLog(c, ctx.UserName, "", "删除", "代理", fmt.Sprintf("id:%s", c.Param("id")), "", ctx.Logger) ctx.Err = service.DeleteProxy(c.Param("id"), ctx.Logger) } diff --git a/pkg/microservice/aslan/core/system/handler/registry.go b/pkg/microservice/aslan/core/system/handler/registry.go index 61e7f23bf..7a419d0cb 100644 --- a/pkg/microservice/aslan/core/system/handler/registry.go +++ b/pkg/microservice/aslan/core/system/handler/registry.go @@ -79,7 +79,7 @@ func CreateRegistryNamespace(c *gin.Context) { if err = json.Unmarshal(data, args); err != nil { log.Errorf("CreateRegistryNamespace json.Unmarshal err : %v", err) } - internalhandler.InsertOperationLog(c, ctx.Username, "", "新增", "系统设置-Registry", fmt.Sprintf("提供商:%s,Namespace:%s", args.RegProvider, args.Namespace), string(data), ctx.Logger) + internalhandler.InsertOperationLog(c, ctx.UserName, "", "新增", "系统设置-Registry", fmt.Sprintf("提供商:%s,Namespace:%s", args.RegProvider, args.Namespace), string(data), ctx.Logger) c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(data)) if err := c.BindJSON(args); err != nil { @@ -92,7 +92,7 @@ func CreateRegistryNamespace(c *gin.Context) { return } - ctx.Err = service.CreateRegistryNamespace(ctx.Username, args, ctx.Logger) + ctx.Err = service.CreateRegistryNamespace(ctx.UserName, args, ctx.Logger) } func UpdateRegistryNamespace(c *gin.Context) { @@ -107,7 +107,7 @@ func UpdateRegistryNamespace(c *gin.Context) { if err = json.Unmarshal(data, args); err != nil { log.Errorf("UpdateRegistryNamespace json.Unmarshal err : %v", err) } - internalhandler.InsertOperationLog(c, ctx.Username, "", "更新", "系统设置-Registry", fmt.Sprintf("提供商:%s,Namespace:%s", args.RegProvider, args.Namespace), string(data), ctx.Logger) + internalhandler.InsertOperationLog(c, ctx.UserName, "", "更新", "系统设置-Registry", fmt.Sprintf("提供商:%s,Namespace:%s", args.RegProvider, args.Namespace), string(data), ctx.Logger) c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(data)) if err := c.BindJSON(args); err != nil { @@ -120,14 +120,14 @@ func UpdateRegistryNamespace(c *gin.Context) { return } - ctx.Err = service.UpdateRegistryNamespace(ctx.Username, c.Param("id"), args, ctx.Logger) + ctx.Err = service.UpdateRegistryNamespace(ctx.UserName, c.Param("id"), args, ctx.Logger) } func DeleteRegistryNamespace(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - internalhandler.InsertOperationLog(c, ctx.Username, "", "删除", "系统设置-Registry", fmt.Sprintf("registry ID:%s", c.Param("id")), "", ctx.Logger) + internalhandler.InsertOperationLog(c, ctx.UserName, "", "删除", "系统设置-Registry", fmt.Sprintf("registry ID:%s", c.Param("id")), "", ctx.Logger) ctx.Err = service.DeleteRegistryNamespace(c.Param("id"), ctx.Logger) } diff --git a/pkg/microservice/aslan/core/system/handler/s3.go b/pkg/microservice/aslan/core/system/handler/s3.go index 8c2c57323..f7f0aa2d0 100644 --- a/pkg/microservice/aslan/core/system/handler/s3.go +++ b/pkg/microservice/aslan/core/system/handler/s3.go @@ -51,7 +51,7 @@ func CreateS3Storage(c *gin.Context) { if err = json.Unmarshal(data, args); err != nil { log.Errorf("CreateS3Storage json.Unmarshal err : %v", err) } - internalhandler.InsertOperationLog(c, ctx.Username, "", "新增", "系统设置-对象存储", fmt.Sprintf("地址:%s", c.GetString("s3StorageEndpoint")), string(data), ctx.Logger) + internalhandler.InsertOperationLog(c, ctx.UserName, "", "新增", "系统设置-对象存储", fmt.Sprintf("地址:%s", c.GetString("s3StorageEndpoint")), string(data), ctx.Logger) c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(data)) if err := c.BindJSON(args); err != nil { @@ -67,7 +67,7 @@ func CreateS3Storage(c *gin.Context) { return } - ctx.Err = service.CreateS3Storage(ctx.Username, args, ctx.Logger) + ctx.Err = service.CreateS3Storage(ctx.UserName, args, ctx.Logger) } func GetS3Storage(c *gin.Context) { @@ -89,7 +89,7 @@ func UpdateS3Storage(c *gin.Context) { if err = json.Unmarshal(data, args); err != nil { log.Errorf("UpdateS3Storage json.Unmarshal err : %v", err) } - internalhandler.InsertOperationLog(c, ctx.Username, "", "更新", "系统设置-对象存储", fmt.Sprintf("地址:%s", c.GetString("s3StorageEndpoint")), string(data), ctx.Logger) + internalhandler.InsertOperationLog(c, ctx.UserName, "", "更新", "系统设置-对象存储", fmt.Sprintf("地址:%s", c.GetString("s3StorageEndpoint")), string(data), ctx.Logger) c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(data)) if err := c.BindJSON(args); err != nil { @@ -106,14 +106,14 @@ func UpdateS3Storage(c *gin.Context) { } id := c.Param("id") - ctx.Err = service.UpdateS3Storage(ctx.Username, id, args, ctx.Logger) + ctx.Err = service.UpdateS3Storage(ctx.UserName, id, args, ctx.Logger) } func DeleteS3Storage(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - internalhandler.InsertOperationLog(c, ctx.Username, "", "删除", "系统设置-对象存储", fmt.Sprintf("s3Storage ID:%s", c.Param("id")), "", ctx.Logger) + internalhandler.InsertOperationLog(c, ctx.UserName, "", "删除", "系统设置-对象存储", fmt.Sprintf("s3Storage ID:%s", c.Param("id")), "", ctx.Logger) - ctx.Err = service.DeleteS3Storage(ctx.Username, c.Param("id"), ctx.Logger) + ctx.Err = service.DeleteS3Storage(ctx.UserName, c.Param("id"), ctx.Logger) } diff --git a/pkg/microservice/aslan/core/workflow/handler/favorate_pipeline.go b/pkg/microservice/aslan/core/workflow/handler/favorate_pipeline.go index bbc4dc59b..f4d5a4c25 100644 --- a/pkg/microservice/aslan/core/workflow/handler/favorate_pipeline.go +++ b/pkg/microservice/aslan/core/workflow/handler/favorate_pipeline.go @@ -41,7 +41,7 @@ func ListFavoritePipelines(c *gin.Context) { ctx.Err = e.ErrInvalidParam.AddDesc("type can't be empty!") return } - ctx.Resp, ctx.Err = workflow.ListFavoritePipelines(&commonrepo.FavoriteArgs{UserID: ctx.User.ID, ProductName: productName, Type: workflowType}) + ctx.Resp, ctx.Err = workflow.ListFavoritePipelines(&commonrepo.FavoriteArgs{UserID: ctx.UserID, ProductName: productName, Type: workflowType}) } func DeleteFavoritePipeline(c *gin.Context) { @@ -55,8 +55,8 @@ func DeleteFavoritePipeline(c *gin.Context) { ctx.Err = e.ErrInvalidParam.AddDesc("productName or name or type can't be empty!") return } - internalhandler.InsertOperationLog(c, ctx.Username, productName, "删除", "收藏工作流", workflowName, "", ctx.Logger) - ctx.Err = workflow.DeleteFavoritePipeline(&commonrepo.FavoriteArgs{UserID: ctx.User.ID, ProductName: productName, Type: workflowType, Name: workflowName}) + internalhandler.InsertOperationLog(c, ctx.UserName, productName, "删除", "收藏工作流", workflowName, "", ctx.Logger) + ctx.Err = workflow.DeleteFavoritePipeline(&commonrepo.FavoriteArgs{UserID: ctx.UserID, ProductName: productName, Type: workflowType, Name: workflowName}) } func CreateFavoritePipeline(c *gin.Context) { @@ -71,14 +71,14 @@ func CreateFavoritePipeline(c *gin.Context) { if err = json.Unmarshal(data, args); err != nil { log.Errorf("CreateFavoritePipeline json.Unmarshal err : %v", err) } - internalhandler.InsertOperationLog(c, ctx.Username, args.ProductName, "新增", "收藏工作流", args.Name, string(data), ctx.Logger) + internalhandler.InsertOperationLog(c, ctx.UserName, args.ProductName, "新增", "收藏工作流", args.Name, string(data), ctx.Logger) c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(data)) if err := c.BindJSON(args); err != nil { ctx.Err = e.ErrInvalidParam.AddDesc("invalid Favorite json args") return } - args.UserID = ctx.User.ID + args.UserID = ctx.UserID ctx.Err = workflow.CreateFavoritePipeline(args, ctx.Logger) } diff --git a/pkg/microservice/aslan/core/workflow/handler/pipeline.go b/pkg/microservice/aslan/core/workflow/handler/pipeline.go index cf79ec3e9..ca3279631 100644 --- a/pkg/microservice/aslan/core/workflow/handler/pipeline.go +++ b/pkg/microservice/aslan/core/workflow/handler/pipeline.go @@ -54,7 +54,7 @@ func GetProductNameByPipeline(c *gin.Context) { if pipelineName == "" { pipelineName = c.Param("name") } - pipeline, err := workflow.GetPipeline(ctx.User.ID, pipelineName, ctx.Logger) + pipeline, err := workflow.GetPipeline(ctx.UserID, pipelineName, ctx.Logger) if err != nil { log.Errorf("GetProductNameByPipeline err : %v", err) return @@ -85,7 +85,7 @@ func GetPipeline(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - ctx.Resp, ctx.Err = workflow.GetPipeline(ctx.User.ID, c.Param("name"), ctx.Logger) + ctx.Resp, ctx.Err = workflow.GetPipeline(ctx.UserID, c.Param("name"), ctx.Logger) } // UpsertPipeline create a new pipeline @@ -101,7 +101,7 @@ func UpsertPipeline(c *gin.Context) { if err = json.Unmarshal(data, args); err != nil { log.Errorf("UpsertPipeline json.Unmarshal err : %v", err) } - internalhandler.InsertOperationLog(c, ctx.Username, args.ProductName, "新增", "单服务-工作流", args.Name, string(data), ctx.Logger) + internalhandler.InsertOperationLog(c, ctx.UserName, args.ProductName, "新增", "单服务-工作流", args.Name, string(data), ctx.Logger) c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(data)) if err := c.BindJSON(args); err != nil || len(args.Name) == 0 { @@ -109,7 +109,7 @@ func UpsertPipeline(c *gin.Context) { ctx.Err = e.ErrInvalidParam.AddDesc(fmt.Sprintf("invalid pipeline json args: %v", err)) return } - args.UpdateBy = ctx.Username + args.UpdateBy = ctx.UserName ctx.Err = workflow.UpsertPipeline(args, ctx.Logger) } @@ -118,8 +118,8 @@ func CopyPipeline(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - internalhandler.InsertOperationLog(c, ctx.Username, c.GetString("productName"), "复制", "单服务-工作流", fmt.Sprintf("old:%s,new:%s", c.Param("old"), c.Param("new")), "", ctx.Logger) - ctx.Err = workflow.CopyPipeline(c.Param("old"), c.Param("new"), ctx.Username, ctx.Logger) + internalhandler.InsertOperationLog(c, ctx.UserName, c.GetString("productName"), "复制", "单服务-工作流", fmt.Sprintf("old:%s,new:%s", c.Param("old"), c.Param("new")), "", ctx.Logger) + ctx.Err = workflow.CopyPipeline(c.Param("old"), c.Param("new"), ctx.UserName, ctx.Logger) } // RenamePipeline rename pipeline @@ -127,7 +127,7 @@ func RenamePipeline(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - internalhandler.InsertOperationLog(c, ctx.Username, c.GetString("productName"), "修改", "单服务-工作流", fmt.Sprintf("old:%s,new:%s", c.Param("old"), c.Param("new")), "", ctx.Logger) + internalhandler.InsertOperationLog(c, ctx.UserName, c.GetString("productName"), "修改", "单服务-工作流", fmt.Sprintf("old:%s,new:%s", c.Param("old"), c.Param("new")), "", ctx.Logger) ctx.Err = workflow.RenamePipeline(c.Param("old"), c.Param("new"), ctx.Logger) } @@ -136,6 +136,6 @@ func DeletePipeline(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - internalhandler.InsertOperationLog(c, ctx.Username, c.GetString("productName"), "删除", "单服务-工作流", c.Param("name"), "", ctx.Logger) + internalhandler.InsertOperationLog(c, ctx.UserName, c.GetString("productName"), "删除", "单服务-工作流", c.Param("name"), "", ctx.Logger) ctx.Err = commonservice.DeletePipeline(c.Param("name"), ctx.RequestID, false, ctx.Logger) } diff --git a/pkg/microservice/aslan/core/workflow/handler/pipeline_status.go b/pkg/microservice/aslan/core/workflow/handler/pipeline_status.go index be25decbe..a171d0e0d 100644 --- a/pkg/microservice/aslan/core/workflow/handler/pipeline_status.go +++ b/pkg/microservice/aslan/core/workflow/handler/pipeline_status.go @@ -28,7 +28,7 @@ func ListPipelinesPreview(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - ctx.Resp, ctx.Err = workflow.ListPipelinesPreview(ctx.User.ID, ctx.Logger) + ctx.Resp, ctx.Err = workflow.ListPipelinesPreview(ctx.UserID, ctx.Logger) } // find task by commitId diff --git a/pkg/microservice/aslan/core/workflow/handler/pipeline_task.go b/pkg/microservice/aslan/core/workflow/handler/pipeline_task.go index 40b5f9dc6..476b84120 100644 --- a/pkg/microservice/aslan/core/workflow/handler/pipeline_task.go +++ b/pkg/microservice/aslan/core/workflow/handler/pipeline_task.go @@ -47,7 +47,7 @@ func GetProductNameByPipelineTask(c *gin.Context) { return } - pipeline, err := workflow.GetPipeline(ctx.User.ID, args.PipelineName, ctx.Logger) + pipeline, err := workflow.GetPipeline(ctx.UserID, args.PipelineName, ctx.Logger) if err != nil { log.Errorf("GetProductNameByPipelineTask err : %v", err) return @@ -70,7 +70,7 @@ func CreatePipelineTask(c *gin.Context) { if err = json.Unmarshal(data, args); err != nil { log.Errorf("CreatePipelineTask json.Unmarshal err : %v", err) } - internalhandler.InsertOperationLog(c, ctx.Username, c.GetString("productName"), "新增", "单服务-工作流task", args.PipelineName, string(data), ctx.Logger) + internalhandler.InsertOperationLog(c, ctx.UserName, c.GetString("productName"), "新增", "单服务-工作流task", args.PipelineName, string(data), ctx.Logger) c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(data)) if err := c.BindJSON(args); err != nil { @@ -78,7 +78,7 @@ func CreatePipelineTask(c *gin.Context) { return } if args.TaskCreator == "" { - args.TaskCreator = ctx.Username + args.TaskCreator = ctx.UserName } args.ReqID = ctx.RequestID @@ -86,7 +86,7 @@ func CreatePipelineTask(c *gin.Context) { // 发送通知 if ctx.Err != nil { - commonservice.SendFailedTaskMessage(ctx.Username, args.ProductName, args.PipelineName, ctx.RequestID, config.SingleType, ctx.Err, ctx.Logger) + commonservice.SendFailedTaskMessage(ctx.UserName, args.ProductName, args.PipelineName, ctx.RequestID, config.SingleType, ctx.Err, ctx.Logger) } } @@ -125,7 +125,7 @@ func GetPipelineTask(c *gin.Context) { func RestartPipelineTask(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - internalhandler.InsertOperationLog(c, ctx.Username, c.GetString("productName"), "重启", "单服务-工作流task", c.Param("name"), "", ctx.Logger) + internalhandler.InsertOperationLog(c, ctx.UserName, c.GetString("productName"), "重启", "单服务-工作流task", c.Param("name"), "", ctx.Logger) taskID, err := strconv.ParseInt(c.Param("id"), 10, 64) if err != nil { @@ -133,20 +133,20 @@ func RestartPipelineTask(c *gin.Context) { return } - ctx.Err = workflow.RestartPipelineTaskV2(ctx.Username, taskID, c.Param("name"), config.SingleType, ctx.Logger) + ctx.Err = workflow.RestartPipelineTaskV2(ctx.UserName, taskID, c.Param("name"), config.SingleType, ctx.Logger) } func CancelTaskV2(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - internalhandler.InsertOperationLog(c, ctx.Username, c.GetString("productName"), "取消", "单服务-工作流task", c.Param("name"), "", ctx.Logger) + internalhandler.InsertOperationLog(c, ctx.UserName, c.GetString("productName"), "取消", "单服务-工作流task", c.Param("name"), "", ctx.Logger) taskID, err := strconv.ParseInt(c.Param("id"), 10, 64) if err != nil { ctx.Err = e.ErrInvalidParam.AddDesc("invalid task id") return } - ctx.Err = commonservice.CancelTaskV2(ctx.Username, c.Param("name"), taskID, config.SingleType, ctx.RequestID, ctx.Logger) + ctx.Err = commonservice.CancelTaskV2(ctx.UserName, c.Param("name"), taskID, config.SingleType, ctx.RequestID, ctx.Logger) } // ListPipelineUpdatableProductNames 启动任务时检查部署环境 @@ -154,7 +154,7 @@ func ListPipelineUpdatableProductNames(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - ctx.Resp, ctx.Err = workflow.ListPipelineUpdatableProductNames(ctx.Username, c.Param("name"), ctx.Logger) + ctx.Resp, ctx.Err = workflow.ListPipelineUpdatableProductNames(ctx.UserName, c.Param("name"), ctx.Logger) } func GetPackageFile(c *gin.Context) { diff --git a/pkg/microservice/aslan/core/workflow/handler/sse.go b/pkg/microservice/aslan/core/workflow/handler/sse.go index a83214fa9..3ba90e70a 100644 --- a/pkg/microservice/aslan/core/workflow/handler/sse.go +++ b/pkg/microservice/aslan/core/workflow/handler/sse.go @@ -46,14 +46,14 @@ func GetPipelineTaskSSE(c *gin.Context) { err := wait.PollImmediateUntil(time.Second, func() (bool, error) { res, err := workflow.GetPipelineTaskV2(taskID, c.Param("name"), config.SingleType, ctx.Logger) if err != nil { - ctx.Logger.Errorf("[%s] GetPipelineTaskSSE error: %v", ctx.Username, err) + ctx.Logger.Errorf("[%s] GetPipelineTaskSSE error: %v", ctx.UserName, err) return false, err } msgChan <- res if time.Since(startTime).Minutes() == float64(60) { - ctx.Logger.Warnf("[%s] Query GetPipelineTaskSSE API over 60 minutes", ctx.Username) + ctx.Logger.Warnf("[%s] Query GetPipelineTaskSSE API over 60 minutes", ctx.UserName) } return false, nil @@ -74,7 +74,7 @@ func RunningPipelineTasksSSE(c *gin.Context) { msgChan <- workflow.RunningPipelineTasks() if time.Since(startTime).Minutes() == float64(60) { - ctx.Logger.Warnf("[%s] Query RunningPipelineTasksSSE API over 60 minutes", ctx.Username) + ctx.Logger.Warnf("[%s] Query RunningPipelineTasksSSE API over 60 minutes", ctx.UserName) } }, time.Second) }, ctx.Logger) @@ -89,7 +89,7 @@ func PendingPipelineTasksSSE(c *gin.Context) { msgChan <- workflow.PendingPipelineTasks() if time.Since(startTime).Minutes() == float64(60) { - ctx.Logger.Warnf("[%s] Query PendingPipelineTasksSSE API over 60 minutes", ctx.Username) + ctx.Logger.Warnf("[%s] Query PendingPipelineTasksSSE API over 60 minutes", ctx.UserName) } }, time.Second) }, ctx.Logger) @@ -116,14 +116,14 @@ func GetWorkflowTaskSSE(c *gin.Context) { err := wait.PollImmediateUntil(time.Second, func() (bool, error) { res, err := workflow.GetPipelineTaskV2(taskID, c.Param("name"), workflowTypeString, ctx.Logger) if err != nil { - ctx.Logger.Errorf("[%s] GetPipelineTaskSSE error: %v", ctx.Username, err) + ctx.Logger.Errorf("[%s] GetPipelineTaskSSE error: %v", ctx.UserName, err) return false, err } msgChan <- res if time.Since(startTime).Minutes() == float64(60) { - ctx.Logger.Warnf("[%s] Query GetPipelineTaskSSE API over 60 minutes", ctx.Username) + ctx.Logger.Warnf("[%s] Query GetPipelineTaskSSE API over 60 minutes", ctx.UserName) } return false, nil diff --git a/pkg/microservice/aslan/core/workflow/handler/workflow.go b/pkg/microservice/aslan/core/workflow/handler/workflow.go index e74339282..724265f21 100644 --- a/pkg/microservice/aslan/core/workflow/handler/workflow.go +++ b/pkg/microservice/aslan/core/workflow/handler/workflow.go @@ -78,15 +78,15 @@ func CreateWorkflow(c *gin.Context) { if err = json.Unmarshal(data, args); err != nil { log.Errorf("CreateWorkflow json.Unmarshal err : %v", err) } - internalhandler.InsertOperationLog(c, ctx.Username, args.ProductTmplName, "新增", "工作流", args.Name, string(data), ctx.Logger) + internalhandler.InsertOperationLog(c, ctx.UserName, args.ProductTmplName, "新增", "工作流", args.Name, string(data), ctx.Logger) c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(data)) if err := c.ShouldBindWith(&args, binding.JSON); err != nil { ctx.Err = e.ErrInvalidParam.AddDesc(err.Error()) return } - args.UpdateBy = ctx.Username - args.CreateBy = ctx.Username + args.UpdateBy = ctx.UserName + args.CreateBy = ctx.UserName ctx.Err = workflow.CreateWorkflow(args, ctx.Logger) } @@ -103,14 +103,14 @@ func UpdateWorkflow(c *gin.Context) { if err = json.Unmarshal(data, args); err != nil { log.Errorf("UpdateWorkflow json.Unmarshal err : %v", err) } - internalhandler.InsertOperationLog(c, ctx.Username, args.ProductTmplName, "更新", "工作流", args.Name, string(data), ctx.Logger) + internalhandler.InsertOperationLog(c, ctx.UserName, args.ProductTmplName, "更新", "工作流", args.Name, string(data), ctx.Logger) c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(data)) if err := c.ShouldBindWith(&args, binding.JSON); err != nil { ctx.Err = e.ErrInvalidParam.AddDesc(err.Error()) return } - args.UpdateBy = ctx.Username + args.UpdateBy = ctx.UserName ctx.Err = workflow.UpdateWorkflow(args, ctx.Logger) } @@ -118,14 +118,14 @@ func ListWorkflows(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - ctx.Resp, ctx.Err = workflow.ListWorkflows(c.Query("type"), ctx.User.ID, ctx.Logger) + ctx.Resp, ctx.Err = workflow.ListWorkflows(c.Query("type"), ctx.UserID, ctx.Logger) } func ListTestWorkflows(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - ctx.Resp, ctx.Err = workflow.ListTestWorkflows(c.Param("testName"), ctx.User.ID, c.QueryArray("projects"), ctx.Logger) + ctx.Resp, ctx.Err = workflow.ListTestWorkflows(c.Param("testName"), c.QueryArray("projects"), ctx.Logger) } // FindWorkflow find a workflow @@ -140,7 +140,7 @@ func DeleteWorkflow(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - internalhandler.InsertOperationLog(c, ctx.Username, c.GetString("productName"), "删除", "工作流", c.Param("name"), "", ctx.Logger) + internalhandler.InsertOperationLog(c, ctx.UserName, c.GetString("productName"), "删除", "工作流", c.Param("name"), "", ctx.Logger) ctx.Err = commonservice.DeleteWorkflow(c.Param("name"), ctx.RequestID, false, ctx.Logger) } @@ -155,5 +155,5 @@ func CopyWorkflow(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - ctx.Err = workflow.CopyWorkflow(c.Param("old"), c.Param("new"), ctx.Username, ctx.Logger) + ctx.Err = workflow.CopyWorkflow(c.Param("old"), c.Param("new"), ctx.UserName, ctx.Logger) } diff --git a/pkg/microservice/aslan/core/workflow/handler/workflow_task.go b/pkg/microservice/aslan/core/workflow/handler/workflow_task.go index 4ec372617..bb3bb8515 100644 --- a/pkg/microservice/aslan/core/workflow/handler/workflow_task.go +++ b/pkg/microservice/aslan/core/workflow/handler/workflow_task.go @@ -97,7 +97,7 @@ func CreateWorkflowTask(c *gin.Context) { if err = json.Unmarshal(data, args); err != nil { log.Errorf("CreateWorkflowTask json.Unmarshal err : %v", err) } - internalhandler.InsertOperationLog(c, ctx.Username, args.ProductTmplName, "新增", "工作流-task", args.WorkflowName, string(data), ctx.Logger) + internalhandler.InsertOperationLog(c, ctx.UserName, args.ProductTmplName, "新增", "工作流-task", args.WorkflowName, string(data), ctx.Logger) c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(data)) if err := c.ShouldBindWith(&args, binding.JSON); err != nil { @@ -106,14 +106,14 @@ func CreateWorkflowTask(c *gin.Context) { } if args.WorklowTaskCreator != setting.CronTaskCreator && args.WorklowTaskCreator != setting.WebhookTaskCreator { - args.WorklowTaskCreator = ctx.Username + args.WorklowTaskCreator = ctx.UserName } - ctx.Resp, ctx.Err = workflow.CreateWorkflowTask(args, args.WorklowTaskCreator, ctx.User.ID, ctx.User.IsSuperUser, ctx.Logger) + ctx.Resp, ctx.Err = workflow.CreateWorkflowTask(args, args.WorklowTaskCreator, ctx.Logger) // 发送通知 if ctx.Err != nil { - commonservice.SendFailedTaskMessage(ctx.Username, args.ProductTmplName, args.WorkflowName, ctx.RequestID, config.WorkflowType, ctx.Err, ctx.Logger) + commonservice.SendFailedTaskMessage(ctx.UserName, args.ProductTmplName, args.WorkflowName, ctx.RequestID, config.WorkflowType, ctx.Err, ctx.Logger) } } @@ -130,7 +130,7 @@ func CreateArtifactWorkflowTask(c *gin.Context) { if err = json.Unmarshal(data, args); err != nil { log.Errorf("CreateArtifactWorkflowTask json.Unmarshal err : %v", err) } - internalhandler.InsertOperationLog(c, ctx.Username, args.ProductTmplName, "新增", "工作流-task", args.WorkflowName, string(data), ctx.Logger) + internalhandler.InsertOperationLog(c, ctx.UserName, args.ProductTmplName, "新增", "工作流-task", args.WorkflowName, string(data), ctx.Logger) c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(data)) if err := c.ShouldBindWith(&args, binding.JSON); err != nil { @@ -139,10 +139,10 @@ func CreateArtifactWorkflowTask(c *gin.Context) { } if args.WorklowTaskCreator != setting.CronTaskCreator && args.WorklowTaskCreator != setting.WebhookTaskCreator { - args.WorklowTaskCreator = ctx.Username + args.WorklowTaskCreator = ctx.UserName } - ctx.Resp, ctx.Err = workflow.CreateArtifactWorkflowTask(args, args.WorklowTaskCreator, ctx.User.ID, ctx.User.IsSuperUser, ctx.Logger) + ctx.Resp, ctx.Err = workflow.CreateArtifactWorkflowTask(args, args.WorklowTaskCreator, ctx.Logger) } // ListWorkflowTasksResult workflowtask分页信息 @@ -188,7 +188,7 @@ func GetWorkflowTask(c *gin.Context) { func RestartWorkflowTask(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - internalhandler.InsertOperationLog(c, ctx.Username, c.GetString("productName"), "重启", "工作流-task", c.Param("name"), "", ctx.Logger) + internalhandler.InsertOperationLog(c, ctx.UserName, c.GetString("productName"), "重启", "工作流-task", c.Param("name"), "", ctx.Logger) taskID, err := strconv.ParseInt(c.Param("id"), 10, 64) if err != nil { @@ -196,18 +196,18 @@ func RestartWorkflowTask(c *gin.Context) { return } - ctx.Err = workflow.RestartPipelineTaskV2(ctx.Username, taskID, c.Param("name"), config.WorkflowType, ctx.Logger) + ctx.Err = workflow.RestartPipelineTaskV2(ctx.UserName, taskID, c.Param("name"), config.WorkflowType, ctx.Logger) } func CancelWorkflowTaskV2(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - internalhandler.InsertOperationLog(c, ctx.Username, c.GetString("productName"), "取消", "工作流-task", c.Param("name"), "", ctx.Logger) + internalhandler.InsertOperationLog(c, ctx.UserName, c.GetString("productName"), "取消", "工作流-task", c.Param("name"), "", ctx.Logger) taskID, err := strconv.ParseInt(c.Param("id"), 10, 64) if err != nil { ctx.Err = e.ErrInvalidParam.AddDesc("invalid task id") return } - ctx.Err = commonservice.CancelTaskV2(ctx.Username, c.Param("name"), taskID, config.WorkflowType, ctx.RequestID, ctx.Logger) + ctx.Err = commonservice.CancelTaskV2(ctx.UserName, c.Param("name"), taskID, config.WorkflowType, ctx.RequestID, ctx.Logger) } diff --git a/pkg/microservice/aslan/core/workflow/service/webhook/codehub_workflow_task.go b/pkg/microservice/aslan/core/workflow/service/webhook/codehub_workflow_task.go index 9a0eda6dd..7b9ea253e 100644 --- a/pkg/microservice/aslan/core/workflow/service/webhook/codehub_workflow_task.go +++ b/pkg/microservice/aslan/core/workflow/service/webhook/codehub_workflow_task.go @@ -30,7 +30,6 @@ import ( "github.com/koderover/zadig/pkg/setting" "github.com/koderover/zadig/pkg/tool/codehub" "github.com/koderover/zadig/pkg/types" - "github.com/koderover/zadig/pkg/types/permission" ) type codehubMergeEventMatcher struct { @@ -200,7 +199,7 @@ func TriggerWorkflowByCodehubEvent(event interface{}, baseURI, requestID string, args.RepoOwner = item.MainRepo.RepoOwner args.RepoName = item.MainRepo.RepoName // 3. create task with args - if resp, err := workflowservice.CreateWorkflowTask(args, setting.WebhookTaskCreator, permission.AnonymousUserID, false, log); err != nil { + if resp, err := workflowservice.CreateWorkflowTask(args, setting.WebhookTaskCreator, log); err != nil { log.Errorf("failed to create workflow task when receive push event %v due to %v ", event, err) mErr = multierror.Append(mErr, err) } else { diff --git a/pkg/microservice/aslan/core/workflow/service/webhook/gerrit_workflow_task.go b/pkg/microservice/aslan/core/workflow/service/webhook/gerrit_workflow_task.go index 7bbf9e292..c83e09c83 100644 --- a/pkg/microservice/aslan/core/workflow/service/webhook/gerrit_workflow_task.go +++ b/pkg/microservice/aslan/core/workflow/service/webhook/gerrit_workflow_task.go @@ -37,7 +37,6 @@ import ( "github.com/koderover/zadig/pkg/shared/codehost" "github.com/koderover/zadig/pkg/tool/gerrit" "github.com/koderover/zadig/pkg/types" - "github.com/koderover/zadig/pkg/types/permission" ) type patchsetCreatedEvent struct { @@ -382,7 +381,7 @@ func TriggerWorkflowByGerritEvent(event *gerritTypeEvent, body []byte, uri, base workflowArgs.RepoOwner = item.MainRepo.RepoOwner workflowArgs.RepoName = item.MainRepo.RepoName - if resp, err := workflowservice.CreateWorkflowTask(workflowArgs, setting.WebhookTaskCreator, permission.AnonymousUserID, false, log); err != nil { + if resp, err := workflowservice.CreateWorkflowTask(workflowArgs, setting.WebhookTaskCreator, log); err != nil { log.Errorf("TriggerWorkflowByGerritEvent failed to create workflow task when receive push event %v due to %v ", event, err) errorList = multierror.Append(errorList, err) } else { diff --git a/pkg/microservice/aslan/core/workflow/service/webhook/github_workflow_task.go b/pkg/microservice/aslan/core/workflow/service/webhook/github_workflow_task.go index a90c906fe..dcefdc6cd 100644 --- a/pkg/microservice/aslan/core/workflow/service/webhook/github_workflow_task.go +++ b/pkg/microservice/aslan/core/workflow/service/webhook/github_workflow_task.go @@ -34,7 +34,6 @@ import ( "github.com/koderover/zadig/pkg/setting" "github.com/koderover/zadig/pkg/shared/codehost" "github.com/koderover/zadig/pkg/types" - "github.com/koderover/zadig/pkg/types/permission" ) const SplitSymbol = "&" @@ -298,7 +297,7 @@ func TriggerWorkflowByGithubEvent(event interface{}, baseURI, deliveryID, reques args.HookPayload = hookPayload // 3. create task with args - if resp, err := workflowservice.CreateWorkflowTask(args, setting.WebhookTaskCreator, permission.AnonymousUserID, false, log); err != nil { + if resp, err := workflowservice.CreateWorkflowTask(args, setting.WebhookTaskCreator, log); err != nil { log.Errorf("failed to create workflow task when receive push event due to %v ", err) mErr = multierror.Append(mErr, err) } else { diff --git a/pkg/microservice/aslan/core/workflow/service/webhook/gitlab_workflow_task.go b/pkg/microservice/aslan/core/workflow/service/webhook/gitlab_workflow_task.go index a58c4f5c1..3b7a1f4c6 100644 --- a/pkg/microservice/aslan/core/workflow/service/webhook/gitlab_workflow_task.go +++ b/pkg/microservice/aslan/core/workflow/service/webhook/gitlab_workflow_task.go @@ -40,7 +40,6 @@ import ( gitlabtool "github.com/koderover/zadig/pkg/tool/git/gitlab" "github.com/koderover/zadig/pkg/tool/log" "github.com/koderover/zadig/pkg/types" - "github.com/koderover/zadig/pkg/types/permission" "github.com/koderover/zadig/pkg/util" ) @@ -275,7 +274,7 @@ func TriggerWorkflowByGitlabEvent(event interface{}, baseURI, requestID string, args.RepoName = item.MainRepo.RepoName // 3. create task with args if item.WorkflowArgs.BaseNamespace == "" { - if resp, err := workflowservice.CreateWorkflowTask(args, setting.WebhookTaskCreator, permission.AnonymousUserID, false, log); err != nil { + if resp, err := workflowservice.CreateWorkflowTask(args, setting.WebhookTaskCreator, log); err != nil { log.Errorf("failed to create workflow task when receive push event %v due to %v ", event, err) mErr = multierror.Append(mErr, err) // 单独创建一条通知,展示任务创建失败的错误信息 @@ -447,7 +446,7 @@ func CreateEnvAndTaskByPR(workflowArgs *commonmodels.WorkflowTaskArgs, prID int, } workflowArgs.Namespace = envName - taskResp, err := workflowservice.CreateWorkflowTask(workflowArgs, setting.WebhookTaskCreator, permission.AnonymousUserID, false, log) + taskResp, err := workflowservice.CreateWorkflowTask(workflowArgs, setting.WebhookTaskCreator, log) if err != nil { return fmt.Errorf("CreateEnvAndTaskByPR CreateWorkflowTask err:%v ", err) } diff --git a/pkg/microservice/aslan/core/workflow/service/webhook/ilyshin.go b/pkg/microservice/aslan/core/workflow/service/webhook/ilyshin.go index 491d15142..22fde0919 100644 --- a/pkg/microservice/aslan/core/workflow/service/webhook/ilyshin.go +++ b/pkg/microservice/aslan/core/workflow/service/webhook/ilyshin.go @@ -36,7 +36,6 @@ import ( "github.com/koderover/zadig/pkg/shared/codehost" e "github.com/koderover/zadig/pkg/tool/errors" "github.com/koderover/zadig/pkg/tool/ilyshin" - "github.com/koderover/zadig/pkg/types/permission" ) func ProcessIlyshinHook(payload []byte, req *http.Request, requestID string, log *zap.SugaredLogger) error { @@ -268,7 +267,7 @@ func TriggerWorkflowByIlyshinEvent(event interface{}, baseURI, requestID string, args.RepoOwner = item.MainRepo.RepoOwner args.RepoName = item.MainRepo.RepoName // 3. create task with args - if _, err := workflowservice.CreateWorkflowTask(args, setting.WebhookTaskCreator, permission.AnonymousUserID, false, log); err != nil { + if _, err := workflowservice.CreateWorkflowTask(args, setting.WebhookTaskCreator, log); err != nil { log.Errorf("failed to create workflow task when receive push event %v due to %s ", event, err) mErr = multierror.Append(mErr, err) } else { diff --git a/pkg/microservice/aslan/core/workflow/service/workflow/pipeline.go b/pkg/microservice/aslan/core/workflow/service/workflow/pipeline.go index 345edc271..8ba33b4a1 100644 --- a/pkg/microservice/aslan/core/workflow/service/workflow/pipeline.go +++ b/pkg/microservice/aslan/core/workflow/service/workflow/pipeline.go @@ -42,7 +42,7 @@ func ListPipelines(log *zap.SugaredLogger) ([]*commonmodels.Pipeline, error) { return resp, nil } -func GetPipeline(userID int, pipelineName string, log *zap.SugaredLogger) (*commonmodels.Pipeline, error) { +func GetPipeline(userID, pipelineName string, log *zap.SugaredLogger) (*commonmodels.Pipeline, error) { resp, err := commonrepo.NewPipelineColl().Find(&commonrepo.PipelineFindOption{Name: pipelineName}) if err != nil { log.Error(err) diff --git a/pkg/microservice/aslan/core/workflow/service/workflow/pipeline_status.go b/pkg/microservice/aslan/core/workflow/service/workflow/pipeline_status.go index 3f50ddafd..3d468e7e6 100644 --- a/pkg/microservice/aslan/core/workflow/service/workflow/pipeline_status.go +++ b/pkg/microservice/aslan/core/workflow/service/workflow/pipeline_status.go @@ -50,7 +50,7 @@ type PipelinePreview struct { TotalSuccess int `bson:"-" json:"total_success"` } -func ListPipelinesPreview(userID int, log *zap.SugaredLogger) ([]*PipelinePreview, error) { +func ListPipelinesPreview(userID string, log *zap.SugaredLogger) ([]*PipelinePreview, error) { resp := make([]*PipelinePreview, 0) pipelineList, err := commonrepo.NewPipelineColl().List(&commonrepo.PipelineListOption{}) diff --git a/pkg/microservice/aslan/core/workflow/service/workflow/workflow.go b/pkg/microservice/aslan/core/workflow/service/workflow/workflow.go index 3a143e59e..bf65a5bba 100644 --- a/pkg/microservice/aslan/core/workflow/service/workflow/workflow.go +++ b/pkg/microservice/aslan/core/workflow/service/workflow/workflow.go @@ -422,7 +422,7 @@ func validateWorkflowHookNames(w *commonmodels.Workflow) error { return validateHookNames(names) } -func ListWorkflows(queryType string, userID int, log *zap.SugaredLogger) ([]*commonmodels.Workflow, error) { +func ListWorkflows(queryType, userID string, log *zap.SugaredLogger) ([]*commonmodels.Workflow, error) { workflows, err := commonrepo.NewWorkflowColl().List(&commonrepo.ListWorkflowOption{}) if err != nil { log.Errorf("Workflow.List error: %v", err) @@ -488,7 +488,7 @@ func findWorkflowStat(workflow *commonmodels.Workflow, workflowStats []*commonmo return 0, 0, 0 } -func ListTestWorkflows(testName string, userID int, projects []string, log *zap.SugaredLogger) (workflows []*commonmodels.Workflow, err error) { +func ListTestWorkflows(testName string, projects []string, log *zap.SugaredLogger) (workflows []*commonmodels.Workflow, err error) { allWorkflows, err := commonrepo.NewWorkflowColl().ListWorkflowsByProjects(projects) if err != nil { return nil, err diff --git a/pkg/microservice/aslan/core/workflow/service/workflow/workflow_task.go b/pkg/microservice/aslan/core/workflow/service/workflow/workflow_task.go index 033257df6..f94144fb0 100644 --- a/pkg/microservice/aslan/core/workflow/service/workflow/workflow_task.go +++ b/pkg/microservice/aslan/core/workflow/service/workflow/workflow_task.go @@ -410,7 +410,7 @@ func PresetWorkflowArgs(namespace, workflowName string, log *zap.SugaredLogger) return resp, nil } -func CreateWorkflowTask(args *commonmodels.WorkflowTaskArgs, taskCreator string, userID int, superUser bool, log *zap.SugaredLogger) (*CreateTaskResp, error) { +func CreateWorkflowTask(args *commonmodels.WorkflowTaskArgs, taskCreator string, log *zap.SugaredLogger) (*CreateTaskResp, error) { if args == nil { return nil, fmt.Errorf("args should not be nil") } @@ -1211,7 +1211,7 @@ func testArgsToSubtask(args *commonmodels.WorkflowTaskArgs, pt *task.Task, log * return resp, nil } -func CreateArtifactWorkflowTask(args *commonmodels.WorkflowTaskArgs, taskCreator string, userID int, superUser bool, log *zap.SugaredLogger) (*CreateTaskResp, error) { +func CreateArtifactWorkflowTask(args *commonmodels.WorkflowTaskArgs, taskCreator string, log *zap.SugaredLogger) (*CreateTaskResp, error) { if args == nil { return nil, fmt.Errorf("args should not be nil") } diff --git a/pkg/microservice/aslan/core/workflow/testing/handler/test_task.go b/pkg/microservice/aslan/core/workflow/testing/handler/test_task.go index 80ebf4911..099cebcf9 100644 --- a/pkg/microservice/aslan/core/workflow/testing/handler/test_task.go +++ b/pkg/microservice/aslan/core/workflow/testing/handler/test_task.go @@ -49,7 +49,7 @@ func CreateTestTask(c *gin.Context) { if err = json.Unmarshal(data, args); err != nil { log.Errorf("CreateTestTask json.Unmarshal err : %v", err) } - internalhandler.InsertOperationLog(c, ctx.Username, args.ProductName, "新增", "测试-task", fmt.Sprintf("%s-%s", args.TestName, "job"), string(data), ctx.Logger) + internalhandler.InsertOperationLog(c, ctx.UserName, args.ProductName, "新增", "测试-task", fmt.Sprintf("%s-%s", args.TestName, "job"), string(data), ctx.Logger) c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(data)) if err := c.ShouldBindWith(&args, binding.JSON); err != nil { @@ -58,13 +58,13 @@ func CreateTestTask(c *gin.Context) { } if args.TestTaskCreator != setting.CronTaskCreator && args.TestTaskCreator != setting.WebhookTaskCreator { - args.TestTaskCreator = ctx.Username + args.TestTaskCreator = ctx.UserName } ctx.Resp, ctx.Err = service.CreateTestTask(args, ctx.Logger) // 发送通知 if ctx.Err != nil { - commonservice.SendFailedTaskMessage(ctx.Username, args.ProductName, args.TestName, ctx.RequestID, config.TestType, ctx.Err, ctx.Logger) + commonservice.SendFailedTaskMessage(ctx.UserName, args.ProductName, args.TestName, ctx.RequestID, config.TestType, ctx.Err, ctx.Logger) } } @@ -72,7 +72,7 @@ func RestartTestTask(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - internalhandler.InsertOperationLog(c, ctx.Username, c.Param("productName"), "重启", "测试任务", c.Param("name"), "", ctx.Logger) + internalhandler.InsertOperationLog(c, ctx.UserName, c.Param("productName"), "重启", "测试任务", c.Param("name"), "", ctx.Logger) taskID, err := strconv.ParseInt(c.Param("id"), 10, 64) if err != nil { @@ -80,18 +80,18 @@ func RestartTestTask(c *gin.Context) { return } - ctx.Err = workflowservice.RestartPipelineTaskV2(ctx.Username, taskID, c.Param("name"), config.TestType, ctx.Logger) + ctx.Err = workflowservice.RestartPipelineTaskV2(ctx.UserName, taskID, c.Param("name"), config.TestType, ctx.Logger) } func CancelTestTaskV2(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - internalhandler.InsertOperationLog(c, ctx.Username, c.Param("productName"), "取消", "测试任务", c.Param("name"), "", ctx.Logger) + internalhandler.InsertOperationLog(c, ctx.UserName, c.Param("productName"), "取消", "测试任务", c.Param("name"), "", ctx.Logger) taskID, err := strconv.ParseInt(c.Param("id"), 10, 64) if err != nil { ctx.Err = e.ErrInvalidParam.AddDesc("invalid task id") return } - ctx.Err = commonservice.CancelTaskV2(ctx.Username, c.Param("name"), taskID, config.TestType, ctx.RequestID, ctx.Logger) + ctx.Err = commonservice.CancelTaskV2(ctx.UserName, c.Param("name"), taskID, config.TestType, ctx.RequestID, ctx.Logger) } diff --git a/pkg/microservice/aslan/core/workflow/testing/handler/testing.go b/pkg/microservice/aslan/core/workflow/testing/handler/testing.go index 24c35774d..7b70976d1 100644 --- a/pkg/microservice/aslan/core/workflow/testing/handler/testing.go +++ b/pkg/microservice/aslan/core/workflow/testing/handler/testing.go @@ -59,7 +59,7 @@ func CreateTestModule(c *gin.Context) { if err = json.Unmarshal(data, args); err != nil { log.Errorf("CreateTestModule json.Unmarshal err : %v", err) } - internalhandler.InsertOperationLog(c, ctx.Username, args.ProductName, "新增", "项目管理-测试", args.Name, string(data), ctx.Logger) + internalhandler.InsertOperationLog(c, ctx.UserName, args.ProductName, "新增", "项目管理-测试", args.Name, string(data), ctx.Logger) c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(data)) err = c.BindJSON(args) @@ -68,7 +68,7 @@ func CreateTestModule(c *gin.Context) { return } - ctx.Err = service.CreateTesting(ctx.Username, args, ctx.Logger) + ctx.Err = service.CreateTesting(ctx.UserName, args, ctx.Logger) } func UpdateTestModule(c *gin.Context) { @@ -83,7 +83,7 @@ func UpdateTestModule(c *gin.Context) { if err = json.Unmarshal(data, args); err != nil { log.Errorf("UpdateTestModule json.Unmarshal err : %v", err) } - internalhandler.InsertOperationLog(c, ctx.Username, args.ProductName, "更新", "项目管理-测试", args.Name, string(data), ctx.Logger) + internalhandler.InsertOperationLog(c, ctx.UserName, args.ProductName, "更新", "项目管理-测试", args.Name, string(data), ctx.Logger) c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(data)) err = c.BindJSON(args) @@ -92,7 +92,7 @@ func UpdateTestModule(c *gin.Context) { return } - ctx.Err = service.UpdateTesting(ctx.Username, args, ctx.Logger) + ctx.Err = service.UpdateTesting(ctx.UserName, args, ctx.Logger) } func ListTestModules(c *gin.Context) { @@ -119,7 +119,7 @@ func DeleteTestModule(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - internalhandler.InsertOperationLog(c, ctx.Username, c.Query("productName"), "删除", "项目管理-测试", c.Param("name"), "", ctx.Logger) + internalhandler.InsertOperationLog(c, ctx.UserName, c.Query("productName"), "删除", "项目管理-测试", c.Param("name"), "", ctx.Logger) name := c.Param("name") if name == "" { diff --git a/pkg/setting/consts.go b/pkg/setting/consts.go index 3d79e2cd6..24b3b28d1 100644 --- a/pkg/setting/consts.go +++ b/pkg/setting/consts.go @@ -246,8 +246,6 @@ const ( ) const ( - SessionUsername = "Username" - SessionUser = "User" AuthorizationHeader = "Authorization" ) diff --git a/pkg/shared/handler/base.go b/pkg/shared/handler/base.go index 26aff5803..001400a61 100644 --- a/pkg/shared/handler/base.go +++ b/pkg/shared/handler/base.go @@ -17,7 +17,11 @@ limitations under the License. package handler import ( + "encoding/base64" + "encoding/json" + "fmt" "reflect" + "strings" "github.com/gin-gonic/gin" "go.uber.org/zap" @@ -25,8 +29,6 @@ import ( "github.com/koderover/zadig/pkg/config" "github.com/koderover/zadig/pkg/setting" "github.com/koderover/zadig/pkg/shared/client/aslan" - "github.com/koderover/zadig/pkg/shared/poetry" - "github.com/koderover/zadig/pkg/types/permission" "github.com/koderover/zadig/pkg/util/ginzap" ) @@ -35,32 +37,56 @@ type Context struct { Logger *zap.SugaredLogger Err error Resp interface{} - Username string - User *permission.User + UserName string + UserID string RequestID string } +type jwtClaims struct { + Name string `json:"name"` + UID string `json:"uid"` +} + func NewContext(c *gin.Context) *Context { + logger := ginzap.WithContext(c).Sugar() + var claims jwtClaims + + token := c.GetHeader(setting.AuthorizationHeader) + if len(token) > 0 { + var err error + claims, err = getUserFromJWT(token) + if err != nil { + logger.Warnf("Failed to get user from token, err: %s", err) + } + } + return &Context{ - Username: currentUsername(c), - User: currentUser(c), + UserName: claims.Name, + UserID: claims.UID, Logger: ginzap.WithContext(c).Sugar(), RequestID: c.GetString(setting.RequestID), } } -// CurrentUser return current session user -func currentUser(c *gin.Context) *permission.User { - userInfo, isExist := c.Get(setting.SessionUser) - user, ok := userInfo.(*poetry.UserInfo) - if isExist && ok { - return poetry.ConvertUserInfo(user) +func getUserFromJWT(token string) (jwtClaims, error) { + cs := jwtClaims{} + + parts := strings.Split(token, ".") + if len(parts) != 3 { + return cs, fmt.Errorf("compact JWS format must have three parts") + } + + payload, err := base64.RawURLEncoding.DecodeString(parts[1]) + if err != nil { + return cs, err + } + + err = json.Unmarshal(payload, &cs) + if err != nil { + return cs, err } - return permission.AnonymousUser -} -func currentUsername(c *gin.Context) (username string) { - return c.GetString(setting.SessionUsername) + return cs, nil } func JSONResponse(c *gin.Context, ctx *Context) { diff --git a/pkg/shared/poetry/types.go b/pkg/shared/poetry/types.go index 3434f5004..7d33b3a46 100644 --- a/pkg/shared/poetry/types.go +++ b/pkg/shared/poetry/types.go @@ -16,8 +16,6 @@ limitations under the License. package poetry -import "github.com/koderover/zadig/pkg/types/permission" - const ( ProjectOwner = 3 ) @@ -57,24 +55,3 @@ type EnvRolePermission struct { PermissionUUID string `json:"permissionUUID"` RoleName string `json:"roleName"` } - -func ConvertUserInfo(userInfo *UserInfo) *permission.User { - if userInfo == nil { - return nil - } - user := new(permission.User) - user.ID = userInfo.ID - user.Name = userInfo.Name - user.Email = userInfo.Email - user.Password = userInfo.Password - user.Phone = userInfo.Phone - user.IsAdmin = userInfo.IsAdmin - user.IsSuperUser = userInfo.IsSuperUser - user.IsTeamLeader = userInfo.IsTeamLeader - user.OrganizationID = userInfo.OrganizationID - user.Directory = userInfo.Directory - user.LastLoginAt = userInfo.LastLoginAt - user.CreatedAt = userInfo.CreatedAt - user.UpdatedAt = userInfo.UpdatedAt - return user -} diff --git a/pkg/types/permission/user.go b/pkg/types/permission/user.go deleted file mode 100644 index 24b3b5f6a..000000000 --- a/pkg/types/permission/user.go +++ /dev/null @@ -1,40 +0,0 @@ -/* -Copyright 2021 The KodeRover 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 permission - -const ( - AnonymousUserID = 0 - AnonymousUserName = "Anonymous" -) - -type User struct { - ID int `json:"id"` - Name string `json:"name"` - Email string `json:"email"` - Password string `json:"password"` - Phone string `json:"phone"` - IsAdmin bool `json:"isAdmin"` - IsSuperUser bool `json:"isSuperUser"` - IsTeamLeader bool `json:"isTeamLeader"` - OrganizationID int `json:"organization_id"` - Directory string `json:"directory"` - LastLoginAt int64 `json:"lastLogin"` - CreatedAt int64 `json:"created_at"` - UpdatedAt int64 `json:"updated_at"` -} - -var AnonymousUser = &User{ID: AnonymousUserID, Name: AnonymousUserName} -- Gitee From fdf5f1d84e868d9f5d3e8faf3848e4b640efa349 Mon Sep 17 00:00:00 2001 From: lou Date: Wed, 20 Oct 2021 15:00:53 +0800 Subject: [PATCH 063/405] fix go.mod Signed-off-by: lou --- go.mod | 1 - go.sum | 2 -- 2 files changed, 3 deletions(-) diff --git a/go.mod b/go.mod index 111b18db0..76bc8f274 100644 --- a/go.mod +++ b/go.mod @@ -26,7 +26,6 @@ require ( github.com/gin-gonic/gin v1.7.2 github.com/go-resty/resty/v2 v2.6.0 github.com/gofrs/uuid v4.0.0+incompatible // indirect - github.com/golang-jwt/jwt v3.2.2+incompatible github.com/google/go-github/v35 v35.3.0 github.com/google/uuid v1.2.0 github.com/gorilla/handlers v1.5.1 // indirect diff --git a/go.sum b/go.sum index 8ba24eb1c..bc09eeb7c 100644 --- a/go.sum +++ b/go.sum @@ -395,8 +395,6 @@ github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zV github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= -github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -- Gitee From 9fb6c8bdcc09d15d7f468677954fd87deae6a3c7 Mon Sep 17 00:00:00 2001 From: mouuii Date: Wed, 20 Oct 2021 16:10:42 +0800 Subject: [PATCH 064/405] code refactor Signed-off-by: mouuii --- pkg/microservice/policy/core/handler/role.go | 8 ++++++++ pkg/microservice/policy/core/handler/router.go | 16 ++++++++-------- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/pkg/microservice/policy/core/handler/role.go b/pkg/microservice/policy/core/handler/role.go index 6bdd5655d..c5589a51c 100644 --- a/pkg/microservice/policy/core/handler/role.go +++ b/pkg/microservice/policy/core/handler/role.go @@ -86,6 +86,14 @@ func DeleteRole(c *gin.Context) { return } +func DeletePublicRole(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + name := c.Param("name") + ctx.Err = service.DeleteRole(name, "", ctx.Logger) + return +} + func CreateSystemRole(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() diff --git a/pkg/microservice/policy/core/handler/router.go b/pkg/microservice/policy/core/handler/router.go index ee52f0659..9508bccea 100644 --- a/pkg/microservice/policy/core/handler/router.go +++ b/pkg/microservice/policy/core/handler/router.go @@ -30,18 +30,18 @@ func (*Router) Inject(router *gin.RouterGroup) { roles.DELETE("/:name", DeleteRole) } - PublicRoles := router.Group("public-roles") + publicRoles := router.Group("public-roles") { - PublicRoles.POST("", CreatePublicRole) - PublicRoles.GET("", ListPublicRoles) - PublicRoles.DELETE("/:name", DeleteRole) + publicRoles.POST("", CreatePublicRole) + publicRoles.GET("", ListPublicRoles) + publicRoles.DELETE("/:name", DeletePublicRole) } - SystemRoles := router.Group("system-roles") + systemRoles := router.Group("system-roles") { - SystemRoles.POST("", CreateSystemRole) - SystemRoles.GET("", ListSystemRoles) - SystemRoles.DELETE("/:name", DeleteSystemRole) + systemRoles.POST("", CreateSystemRole) + systemRoles.GET("", ListSystemRoles) + systemRoles.DELETE("/:name", DeleteSystemRole) } roleBindings := router.Group("rolebindings") -- Gitee From cd9972fdece02344ded8f905f26564ff24861d31 Mon Sep 17 00:00:00 2001 From: lou Date: Wed, 20 Oct 2021 16:32:47 +0800 Subject: [PATCH 065/405] add user filter Signed-off-by: lou --- pkg/microservice/policy/core/handler/role_binding.go | 4 ++-- .../policy/core/repository/mongodb/role_binding.go | 7 ++++++- pkg/microservice/policy/core/service/role_binding.go | 11 ++++------- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/pkg/microservice/policy/core/handler/role_binding.go b/pkg/microservice/policy/core/handler/role_binding.go index 525621e78..874437422 100644 --- a/pkg/microservice/policy/core/handler/role_binding.go +++ b/pkg/microservice/policy/core/handler/role_binding.go @@ -53,7 +53,7 @@ func ListRoleBindings(c *gin.Context) { return } - ctx.Resp, ctx.Err = service.ListRoleBindings(projectName, ctx.Logger) + ctx.Resp, ctx.Err = service.ListRoleBindings(projectName, c.Query("user"), ctx.Logger) } func DeleteRoleBinding(c *gin.Context) { @@ -97,5 +97,5 @@ func ListSystemRoleBindings(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - ctx.Resp, ctx.Err = service.ListRoleBindings(service.SystemScope, ctx.Logger) + ctx.Resp, ctx.Err = service.ListRoleBindings(service.SystemScope, c.Query("user"), ctx.Logger) } diff --git a/pkg/microservice/policy/core/repository/mongodb/role_binding.go b/pkg/microservice/policy/core/repository/mongodb/role_binding.go index dec621945..722050fe8 100644 --- a/pkg/microservice/policy/core/repository/mongodb/role_binding.go +++ b/pkg/microservice/policy/core/repository/mongodb/role_binding.go @@ -78,11 +78,16 @@ func (c *RoleBindingColl) List() ([]*models.RoleBinding, error) { return res, nil } -func (c *RoleBindingColl) ListBy(projectName string) ([]*models.RoleBinding, error) { +func (c *RoleBindingColl) ListBy(projectName, user string) ([]*models.RoleBinding, error) { var res []*models.RoleBinding ctx := context.Background() query := bson.M{"namespace": projectName} + if user != "" { + query["subjects.name"] = user + query["subjects.kind"] = models.UserKind + } + cursor, err := c.Collection.Find(ctx, query) if err != nil { return nil, err diff --git a/pkg/microservice/policy/core/service/role_binding.go b/pkg/microservice/policy/core/service/role_binding.go index dd9e3bb7b..c89adb9a8 100644 --- a/pkg/microservice/policy/core/service/role_binding.go +++ b/pkg/microservice/policy/core/service/role_binding.go @@ -61,21 +61,18 @@ func CreateRoleBinding(ns string, rb *RoleBinding, logger *zap.SugaredLogger) er return mongodb.NewRoleBindingColl().Create(obj) } -func ListRoleBindings(ns string, logger *zap.SugaredLogger) (roleBindings []*RoleBinding, err error) { - modelRoleBindings, err := mongodb.NewRoleBindingColl().ListBy(ns) +func ListRoleBindings(ns, user string, _ *zap.SugaredLogger) (roleBindings []*RoleBinding, err error) { + modelRoleBindings, err := mongodb.NewRoleBindingColl().ListBy(ns, user) if err != nil { return nil, err } + for _, v := range modelRoleBindings { - users := []string{} - for _, vv := range v.Subjects { - users = append(users, vv.Name) - } roleBindings = append(roleBindings, &RoleBinding{ Name: v.Name, Role: v.RoleRef.Name, User: v.Subjects[0].Name, - Global: (v.Namespace == ""), + Global: v.Namespace == "", }) } return -- Gitee From 2ab773bae7a0fe8078019c5bc7dc56ba6b5425f3 Mon Sep 17 00:00:00 2001 From: lou Date: Wed, 20 Oct 2021 17:20:39 +0800 Subject: [PATCH 066/405] remove poetry calls Signed-off-by: lou --- .../aslan/core/common/service/product.go | 19 --- .../core/environment/handler/environment.go | 2 +- .../aslan/core/environment/handler/router.go | 2 +- .../core/environment/service/environment.go | 51 +++--- .../aslan/core/project/service/product.go | 15 -- pkg/shared/poetry/actions.go | 156 ------------------ pkg/shared/poetry/permission.go | 36 ---- pkg/shared/poetry/team.go | 61 ------- pkg/shared/poetry/token.go | 36 ---- pkg/shared/poetry/types.go | 57 ------- 10 files changed, 27 insertions(+), 408 deletions(-) delete mode 100644 pkg/shared/poetry/actions.go delete mode 100644 pkg/shared/poetry/permission.go delete mode 100644 pkg/shared/poetry/team.go delete mode 100644 pkg/shared/poetry/token.go delete mode 100644 pkg/shared/poetry/types.go diff --git a/pkg/microservice/aslan/core/common/service/product.go b/pkg/microservice/aslan/core/common/service/product.go index 8028e2685..a62713d36 100644 --- a/pkg/microservice/aslan/core/common/service/product.go +++ b/pkg/microservice/aslan/core/common/service/product.go @@ -26,7 +26,6 @@ import ( "k8s.io/apimachinery/pkg/labels" "sigs.k8s.io/controller-runtime/pkg/client" - "github.com/koderover/zadig/pkg/microservice/aslan/config" "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/models" commonmodels "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/models" "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/mongodb" @@ -34,7 +33,6 @@ import ( "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/mongodb/template" "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/kube" "github.com/koderover/zadig/pkg/setting" - "github.com/koderover/zadig/pkg/shared/poetry" e "github.com/koderover/zadig/pkg/tool/errors" helmtool "github.com/koderover/zadig/pkg/tool/helmclient" "github.com/koderover/zadig/pkg/tool/kube/updater" @@ -72,8 +70,6 @@ func DeleteProduct(username, envName, productName, requestID string, log *zap.Su log.Infof("[%s] delete product %s", username, productInfo.Namespace) LogProductStats(username, setting.DeleteProductEvent, productName, requestID, eventStart, log) - poetryClient := poetry.New(config.PoetryAPIServer()) - switch productInfo.Source { case setting.SourceFromHelm: err = mongodb.NewProductColl().Delete(envName, productName) @@ -81,11 +77,6 @@ func DeleteProduct(username, envName, productName, requestID string, log *zap.Su log.Errorf("Product.Delete error: %v", err) } - _, err = poetryClient.DeleteEnvRolePermission(productName, envName, log) - if err != nil { - log.Errorf("DeleteEnvRole error: %v", err) - } - go func() { var err error defer func() { @@ -133,11 +124,6 @@ func DeleteProduct(username, envName, productName, requestID string, log *zap.Su log.Errorf("Product.Delete error: %v", err) } - _, err = poetryClient.DeleteEnvRolePermission(productName, envName, log) - if err != nil { - log.Errorf("DeleteEnvRole error: %v", err) - } - // 删除workload数据 tempProduct, err := template.NewProductColl().Find(productName) if err != nil { @@ -208,11 +194,6 @@ func DeleteProduct(username, envName, productName, requestID string, log *zap.Su if err != nil { log.Errorf("Product.Delete error: %v", err) } - - _, err = poetryClient.DeleteEnvRolePermission(productName, envName, log) - if err != nil { - log.Errorf("DeleteEnvRole error: %v", err) - } }() } return nil diff --git a/pkg/microservice/aslan/core/environment/handler/environment.go b/pkg/microservice/aslan/core/environment/handler/environment.go index 47051cef2..c146c8a8c 100644 --- a/pkg/microservice/aslan/core/environment/handler/environment.go +++ b/pkg/microservice/aslan/core/environment/handler/environment.go @@ -455,7 +455,7 @@ func EnvShare(c *gin.Context) { return } - ctx.Err = service.UpdateProductPublic(productName, args, ctx.Logger) + //ctx.Err = service.UpdateProductPublic(productName, args, ctx.Logger) } func ListGroups(c *gin.Context) { diff --git a/pkg/microservice/aslan/core/environment/handler/router.go b/pkg/microservice/aslan/core/environment/handler/router.go index d2ffbbf15..d68c536a7 100644 --- a/pkg/microservice/aslan/core/environment/handler/router.go +++ b/pkg/microservice/aslan/core/environment/handler/router.go @@ -106,7 +106,7 @@ func (*Router) Inject(router *gin.RouterGroup) { environments.PUT("/:productName/renderchart", gin2.UpdateOperationLogStatus, UpdateHelmProductRenderCharts) environments.GET("/:productName/helmChartVersions", GetHelmChartVersions) - environments.PUT("/:productName", gin2.UpdateOperationLogStatus, EnvShare) + //environments.PUT("/:productName", gin2.UpdateOperationLogStatus, EnvShare) environments.GET("/:productName", GetProduct) environments.GET("/:productName/productInfo", GetProductInfo) diff --git a/pkg/microservice/aslan/core/environment/service/environment.go b/pkg/microservice/aslan/core/environment/service/environment.go index 4f00fed95..224502454 100644 --- a/pkg/microservice/aslan/core/environment/service/environment.go +++ b/pkg/microservice/aslan/core/environment/service/environment.go @@ -52,7 +52,6 @@ import ( "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/kube" "github.com/koderover/zadig/pkg/setting" "github.com/koderover/zadig/pkg/shared/kube/wrapper" - "github.com/koderover/zadig/pkg/shared/poetry" e "github.com/koderover/zadig/pkg/tool/errors" helmtool "github.com/koderover/zadig/pkg/tool/helmclient" "github.com/koderover/zadig/pkg/tool/kube/getter" @@ -120,31 +119,31 @@ type UpdateMultiHelmProductArg struct { ReplacePolicy string `json:"replacePolicy"` // TODO logic not implemented } -func UpdateProductPublic(productName string, args *ProductParams, log *zap.SugaredLogger) error { - err := commonrepo.NewProductColl().UpdateIsPublic(args.EnvName, productName, args.IsPublic) - if err != nil { - log.Errorf("UpdateProductPublic error: %v", err) - return fmt.Errorf("UpdateProductPublic error: %v", err) - } - - poetryCtl := poetry.New(config.PoetryAPIServer()) - if !args.IsPublic { //把公开设置成不公开 - _, err := poetryCtl.AddEnvRolePermission(productName, args.EnvName, args.PermissionUUIDs, args.RoleID, log) - if err != nil { - log.Errorf("UpdateProductPublic AddEnvRole error: %v", err) - return fmt.Errorf("UpdateProductPublic AddEnvRole error: %v", err) - } - return nil - } - //把不公开设成公开 删除原来环境绑定的角色 - _, err = poetryCtl.DeleteEnvRolePermission(productName, args.EnvName, log) - if err != nil { - log.Errorf("UpdateProductPublic DeleteEnvRole error: %v", err) - return fmt.Errorf("UpdateProductPublic DeleteEnvRole error: %v", err) - } - - return nil -} +//func UpdateProductPublic(productName string, args *ProductParams, log *zap.SugaredLogger) error { +// err := commonrepo.NewProductColl().UpdateIsPublic(args.EnvName, productName, args.IsPublic) +// if err != nil { +// log.Errorf("UpdateProductPublic error: %v", err) +// return fmt.Errorf("UpdateProductPublic error: %v", err) +// } +// +// poetryCtl := poetry.New(config.PoetryAPIServer()) +// if !args.IsPublic { //把公开设置成不公开 +// _, err := poetryCtl.AddEnvRolePermission(productName, args.EnvName, args.PermissionUUIDs, args.RoleID, log) +// if err != nil { +// log.Errorf("UpdateProductPublic AddEnvRole error: %v", err) +// return fmt.Errorf("UpdateProductPublic AddEnvRole error: %v", err) +// } +// return nil +// } +// //把不公开设成公开 删除原来环境绑定的角色 +// _, err = poetryCtl.DeleteEnvRolePermission(productName, args.EnvName, log) +// if err != nil { +// log.Errorf("UpdateProductPublic DeleteEnvRole error: %v", err) +// return fmt.Errorf("UpdateProductPublic DeleteEnvRole error: %v", err) +// } +// +// return nil +//} func ListProducts(productNameParam string, userName string, log *zap.SugaredLogger) (resp []*ProductResp, err error) { products, err := commonrepo.NewProductColl().List(&commonrepo.ProductListOptions{Name: productNameParam, IsSortByProductName: true}) diff --git a/pkg/microservice/aslan/core/project/service/product.go b/pkg/microservice/aslan/core/project/service/product.go index 7c867f321..21e45e261 100644 --- a/pkg/microservice/aslan/core/project/service/product.go +++ b/pkg/microservice/aslan/core/project/service/product.go @@ -212,13 +212,6 @@ func UpdateProject(name string, args *template.Product, log *zap.SugaredLogger) if err != nil { return e.ErrInvalidParam.AddDesc(err.Error()) } - poetryCtl := poetry.New(config.PoetryAPIServer()) - //创建团建和项目之间的关系 - _, err = poetryCtl.AddProductTeam(args.ProductName, args.TeamID, args.UserIDs, log) - if err != nil { - log.Errorf("Project.Create AddProductTeam error: %v", err) - return e.ErrUpdateProduct.AddDesc(err.Error()) - } err = templaterepo.NewProductColl().Update(name, args) if err != nil { @@ -319,14 +312,6 @@ func DeleteProductTemplate(userName, productName, requestID string, log *zap.Sug } } - poetryCtl := poetry.New(config.PoetryAPIServer()) - - //删除项目团队信息 - if err = poetryCtl.DeleteProductTeam(productName, log); err != nil { - log.Errorf("productTeam.Delete error: %v", err) - return e.ErrDeleteProduct - } - envs, _ := commonrepo.NewProductColl().List(&commonrepo.ProductListOptions{Name: productName}) for _, env := range envs { if err = commonrepo.NewProductColl().UpdateStatus(env.EnvName, productName, setting.ProductStatusDeleting); err != nil { diff --git a/pkg/shared/poetry/actions.go b/pkg/shared/poetry/actions.go deleted file mode 100644 index bca860415..000000000 --- a/pkg/shared/poetry/actions.go +++ /dev/null @@ -1,156 +0,0 @@ -/* -Copyright 2021 The KodeRover 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 poetry - -import ( - "fmt" - "strconv" - - "go.uber.org/zap" - - e "github.com/koderover/zadig/pkg/tool/errors" - "github.com/koderover/zadig/pkg/tool/httpclient" -) - -func (c *Client) AddEnvRolePermission(productName, envName string, permissionUUIDs []string, roleID int, log *zap.SugaredLogger) (int, error) { - url := "/directory/roleEnv" - req := map[string]interface{}{ - "productName": productName, - "envName": envName, - "permissionUUIDs": permissionUUIDs, - "roleId": roleID, - } - - rm := &ResponseMessage{} - _, err := c.Post(url, httpclient.SetBody(req), httpclient.SetResult(rm)) - if err != nil { - log.Errorf("AddEnvRolePermission error: %v", err) - return 0, e.ErrListUsers.AddDesc(err.Error()) - } - - if rm.ResultCode == 0 { - return 1, nil - } - - return 0, e.ErrListUsers.AddDesc(fmt.Sprintf("ResultCode: %d", rm.ResultCode)) -} - -func (c *Client) DeleteEnvRolePermission(productName, envName string, log *zap.SugaredLogger) (int, error) { - url := "/directory/roleEnv" - qs := map[string]string{ - "productName": productName, - "envName": envName, - } - - rm := &ResponseMessage{} - _, err := c.Delete(url, httpclient.SetQueryParams(qs), httpclient.SetResult(rm)) - if err != nil { - log.Errorf("DeleteEnvRolePermission error: %v", err) - return 0, e.ErrListUsers.AddDesc(err.Error()) - } - - if rm.ResultCode == 0 { - return 1, nil - } - return 0, e.ErrListUsers.AddDesc(fmt.Sprintf("ResultCode: %d", rm.ResultCode)) -} - -func (c *Client) ListEnvRolePermission(productName, envName string, roleID int64, log *zap.SugaredLogger) ([]*EnvRolePermission, error) { - url := "/directory/roleEnv" - qs := map[string]string{ - "productName": productName, - "envName": envName, - "roleId": strconv.Itoa(int(roleID)), - } - - res := make([]*EnvRolePermission, 0) - _, err := c.Get(url, httpclient.SetQueryParams(qs), httpclient.SetResult(&res)) - if err != nil { - log.Errorf("GetEnvRolePermission error: %v", err) - return res, e.ErrListUsers.AddDesc(err.Error()) - } - - return res, nil -} - -func (c *Client) AddProductTeam(productName string, teamID int, userIDs []int, log *zap.SugaredLogger) (int, error) { - url := "/directory/teamProduct" - req := map[string]interface{}{ - "productName": productName, - "teamId": teamID, - "userIds": userIDs, - } - - rm := &ResponseMessage{} - _, err := c.Post(url, httpclient.SetBody(req), httpclient.SetResult(rm)) - if err != nil { - log.Errorf("AddProductTeam error: %v", err) - return 0, e.ErrCreateProductTeam.AddDesc(err.Error()) - } - - if rm.ResultCode == 0 { - return 1, nil - } - return 0, e.ErrCreateProductTeam.AddDesc(fmt.Sprintf("ResultCode: %d", rm.ResultCode)) -} - -func (c *Client) DeleteProductTeam(productName string, log *zap.SugaredLogger) error { - url := "/directory/teamProduct" - - rm := &ResponseMessage{} - _, err := c.Delete(url, httpclient.SetQueryParam("productName", productName), httpclient.SetResult(rm)) - if err != nil { - log.Errorf("DeleteProductTeam error: %v", err) - return e.ErrDeleteProductTeam.AddDesc(err.Error()) - } - if rm.ResultCode == 0 { - return nil - } - return e.ErrDeleteProductTeam.AddDesc(fmt.Sprintf("ResultCode: %d", rm.ResultCode)) -} - -func (c *Client) HasOperatePermission(productName, permissionUUID string, userID int, isSuperUser bool, log *zap.SugaredLogger) bool { - if isSuperUser { - return true - } - - res, err := c.GetUserPermissionUUIDMap(productName, permissionUUID, userID, log) - if err != nil { - return false - } - - return res["isContain"] -} - -func (c *Client) GetUserPermissionUUIDMap(productName, permissionUUID string, userID int, log *zap.SugaredLogger) (map[string]bool, error) { - url := "/directory/userPermissionRelation" - qs := map[string]string{ - "productName": productName, - "userId": strconv.Itoa(userID), - "permissionUUID": permissionUUID, - "permissionType": "2", - } - - res := make(map[string]bool) - _, err := c.Get(url, httpclient.SetQueryParams(qs), httpclient.SetResult(&res)) - if err != nil { - log.Errorf("GetUserPermissionUUIDMap error: %v", err) - return nil, err - } - - return res, nil -} diff --git a/pkg/shared/poetry/permission.go b/pkg/shared/poetry/permission.go deleted file mode 100644 index c0f1d0793..000000000 --- a/pkg/shared/poetry/permission.go +++ /dev/null @@ -1,36 +0,0 @@ -/* -Copyright 2021 The KodeRover 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 poetry - -import ( - "github.com/koderover/zadig/pkg/tool/httpclient" -) - -type UserEnvPermission struct { - UserID int `json:"userId"` - ProductName string `json:"productName"` - EnvName string `json:"envName"` - PermissionUUIDs []string `json:"permissionUUIDs"` -} - -func (c *Client) CreateUserEnvPermission(p *UserEnvPermission) error { - url := "/directory/userEnvPermission" - _, err := c.Post(url, httpclient.SetBody(p)) - - return err - -} diff --git a/pkg/shared/poetry/team.go b/pkg/shared/poetry/team.go deleted file mode 100644 index 4b7d096d3..000000000 --- a/pkg/shared/poetry/team.go +++ /dev/null @@ -1,61 +0,0 @@ -/* -Copyright 2021 The KodeRover 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 poetry - -import ( - "fmt" - - "go.uber.org/zap" - - "github.com/koderover/zadig/pkg/tool/httpclient" -) - -type Team struct { - ID int `json:"id"` - OrgID int `json:"orgId"` - Name string `json:"name"` - Desc string `json:"desc"` - IsTeamLeader bool `json:"isTeamLeader"` - Users []*UserInfo `json:"leaders"` - CreatedAt int64 `json:"created_at"` - UpdatedAt int64 `json:"updated_at"` -} - -func (c *Client) ListTeams(orgID int, log *zap.SugaredLogger) ([]*Team, error) { - url := "/directory/teamss/search" - resp := make([]*Team, 0) - _, err := c.Get(url, httpclient.SetQueryParam("orgId", fmt.Sprintf("%d", orgID)), httpclient.SetResult(&resp)) - - if err != nil { - log.Errorf("ListTeams error: %v", err) - return nil, err - } - - return resp, nil -} - -func (c *Client) GetTeam(teamID int) (*Team, error) { - url := fmt.Sprintf("/directory/teams/%d", teamID) - resp := new(Team) - _, err := c.Get(url, httpclient.SetResult(&resp)) - - if err != nil { - return nil, err - } - - return resp, nil -} diff --git a/pkg/shared/poetry/token.go b/pkg/shared/poetry/token.go deleted file mode 100644 index bf31b540f..000000000 --- a/pkg/shared/poetry/token.go +++ /dev/null @@ -1,36 +0,0 @@ -/* -Copyright 2021 The KodeRover 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 poetry - -import "github.com/koderover/zadig/pkg/tool/httpclient" - -type signature struct { - Token string `json:"token"` - Username string `json:"username"` -} - -func (c *Client) SignatureCheck(username, token string) error { - url := "/directory/token/check" - - s := &signature{Username: username, Token: token} - _, err := c.Post(url, httpclient.SetBody(s)) - if err != nil { - return err - } - - return nil -} diff --git a/pkg/shared/poetry/types.go b/pkg/shared/poetry/types.go deleted file mode 100644 index 7d33b3a46..000000000 --- a/pkg/shared/poetry/types.go +++ /dev/null @@ -1,57 +0,0 @@ -/* -Copyright 2021 The KodeRover 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 poetry - -const ( - ProjectOwner = 3 -) - -type User interface { - GetName() string - GetEmail() string - GetPhone() string -} - -type UserInfo struct { - ID int `json:"id"` - Name string `json:"name"` - Email string `json:"email"` - Password string `json:"password"` - Phone string `json:"phone"` - IsAdmin bool `json:"isAdmin"` - IsSuperUser bool `json:"isSuperUser"` - IsTeamLeader bool `json:"isTeamLeader"` - OrganizationID int `json:"organization_id"` - Directory string `json:"directory"` - LastLoginAt int64 `json:"lastLogin"` - CreatedAt int64 `json:"created_at"` - UpdatedAt int64 `json:"updated_at"` -} - -type ResponseMessage struct { - ResultCode int `json:"resultCode"` - ErrorMsg string `json:"errorMsg"` -} - -type EnvRolePermission struct { - ID int64 `json:"id"` - ProductName string `json:"productName"` - EnvName string `json:"envName"` - RoleID int64 `json:"roleId"` - PermissionUUID string `json:"permissionUUID"` - RoleName string `json:"roleName"` -} -- Gitee From 901bb5e383b013193db4180987fe6944670d9781 Mon Sep 17 00:00:00 2001 From: mouuii Date: Wed, 20 Oct 2021 18:49:01 +0800 Subject: [PATCH 067/405] remove superuser Signed-off-by: mouuii --- .../core/environment/handler/revision.go | 2 +- .../core/environment/service/environment.go | 12 +-- .../core/environment/service/revision.go | 69 +---------------- .../aslan/core/project/handler/product.go | 2 +- .../aslan/core/project/service/product.go | 47 +++--------- .../aslan/core/setting/handler/user.go | 2 +- .../aslan/core/setting/service/user.go | 75 +++---------------- pkg/setting/consts.go | 3 +- pkg/shared/client/policy/policy.go | 6 ++ 9 files changed, 41 insertions(+), 177 deletions(-) diff --git a/pkg/microservice/aslan/core/environment/handler/revision.go b/pkg/microservice/aslan/core/environment/handler/revision.go index f35be2c09..e27eb50b6 100644 --- a/pkg/microservice/aslan/core/environment/handler/revision.go +++ b/pkg/microservice/aslan/core/environment/handler/revision.go @@ -32,5 +32,5 @@ func ListProductsRevision(c *gin.Context) { ctx.Resp, ctx.Err = service.ListProductsRevisionByFacility(c.Query("basicFacility"), ctx.Logger) return } - ctx.Resp, ctx.Err = service.ListProductsRevision(c.Query("productName"), c.Query("envName"), ctx.UserID, false, ctx.Logger) + ctx.Resp, ctx.Err = service.ListProductsRevision(c.Query("productName"), c.Query("envName"), ctx.Logger) } diff --git a/pkg/microservice/aslan/core/environment/service/environment.go b/pkg/microservice/aslan/core/environment/service/environment.go index 4f00fed95..e026ec5f3 100644 --- a/pkg/microservice/aslan/core/environment/service/environment.go +++ b/pkg/microservice/aslan/core/environment/service/environment.go @@ -234,7 +234,7 @@ func AutoCreateProduct(productName, envType, requestID string, log *zap.SugaredL var mutexAutoUpdate sync.RWMutex -func AutoUpdateProduct(envNames []string, productName, userID string, superUser bool, requestID string, force bool, log *zap.SugaredLogger) ([]*EnvStatus, error) { +func AutoUpdateProduct(envNames []string, productName, requestID string, force bool, log *zap.SugaredLogger) ([]*EnvStatus, error) { mutexAutoUpdate.Lock() defer func() { mutexAutoUpdate.Unlock() @@ -271,7 +271,7 @@ func AutoUpdateProduct(envNames []string, productName, userID string, superUser } } - productsRevison, err := ListProductsRevision(productName, "", userID, superUser, log) + productsRevison, err := ListProductsRevision(productName, "", log) if err != nil { log.Errorf("AutoUpdateProduct ListProductsRevision err:%v", err) return envStatuses, err @@ -952,7 +952,7 @@ func updateHelmProductVariable(productResp *commonmodels.Product, oldRenderVersi var mutexUpdateMultiHelm sync.RWMutex -func UpdateMultipleHelmEnv(requestID, userID string, superUser bool, args *UpdateMultiHelmProductArg, log *zap.SugaredLogger) ([]*EnvStatus, error) { +func UpdateMultipleHelmEnv(requestID string, args *UpdateMultiHelmProductArg, log *zap.SugaredLogger) ([]*EnvStatus, error) { mutexUpdateMultiHelm.Lock() defer func() { mutexUpdateMultiHelm.Unlock() @@ -961,7 +961,7 @@ func UpdateMultipleHelmEnv(requestID, userID string, superUser bool, args *Updat envNames, productName := args.EnvNames, args.ProductName envStatuses := make([]*EnvStatus, 0) - productsRevision, err := ListProductsRevision(productName, "", userID, superUser, log) + productsRevision, err := ListProductsRevision(productName, "", log) if err != nil { log.Errorf("UpdateMultiHelmProduct ListProductsRevision err:%v", err) return envStatuses, err @@ -1040,14 +1040,14 @@ func UpdateMultipleHelmEnv(requestID, userID string, superUser bool, args *Updat } // UpdateMultiHelmProduct TODO need to be deprecated -func UpdateMultiHelmProduct(envNames []string, updateType, productName, userID string, superUser bool, requestID string, log *zap.SugaredLogger) []*EnvStatus { +func UpdateMultiHelmProduct(envNames []string, updateType, productName string, requestID string, log *zap.SugaredLogger) []*EnvStatus { mutexUpdateMultiHelm.Lock() defer func() { mutexUpdateMultiHelm.Unlock() }() envStatuses := make([]*EnvStatus, 0) - productsRevison, err := ListProductsRevision(productName, "", userID, superUser, log) + productsRevison, err := ListProductsRevision(productName, "", log) if err != nil { log.Errorf("UpdateMultiHelmProduct ListProductsRevision err:%v", err) return envStatuses diff --git a/pkg/microservice/aslan/core/environment/service/revision.go b/pkg/microservice/aslan/core/environment/service/revision.go index 5ac15c614..ffa22b27b 100644 --- a/pkg/microservice/aslan/core/environment/service/revision.go +++ b/pkg/microservice/aslan/core/environment/service/revision.go @@ -20,82 +20,17 @@ import ( "fmt" "go.uber.org/zap" - "k8s.io/apimachinery/pkg/util/sets" - "github.com/koderover/zadig/pkg/microservice/aslan/config" commonmodels "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/models" commonrepo "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/mongodb" templaterepo "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/mongodb/template" commonservice "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service" "github.com/koderover/zadig/pkg/setting" - "github.com/koderover/zadig/pkg/shared/poetry" e "github.com/koderover/zadig/pkg/tool/errors" ) -func ListProductsRevision(productName, envName, userID string, superUser bool, log *zap.SugaredLogger) ([]*ProductRevision, error) { - var ( - err error - prodRevs = make([]*ProductRevision, 0) - products = make([]*commonmodels.Product, 0) - productNameMap map[string][]int64 - productNamespaces = sets.NewString() - ) - if superUser { - products, err = commonrepo.NewProductColl().List(&commonrepo.ProductListOptions{ExcludeStatus: setting.ProductStatusDeleting, Name: productName, EnvName: envName}) - if err != nil { - log.Errorf("Collection.Product.List error: %v", err) - return prodRevs, e.ErrListProducts.AddDesc(err.Error()) - } - } else { - //项目下所有公开环境 - publicProducts, err := commonrepo.NewProductColl().List(&commonrepo.ProductListOptions{IsPublic: true, ExcludeStatus: setting.ProductStatusDeleting, Name: productName, EnvName: envName}) - if err != nil { - log.Errorf("Collection.Product.List List product error: %v", err) - return prodRevs, e.ErrListProducts.AddDesc(err.Error()) - } - for _, publicProduct := range publicProducts { - products = append(products, publicProduct) - productNamespaces.Insert(publicProduct.Namespace) - } - - poetryCtl := poetry.New(config.PoetryAPIServer()) - productNameMap, err = poetryCtl.GetUserProject(1, log) - if err != nil { - log.Errorf("Collection.Product.List GetUserProject error: %v", err) - return prodRevs, e.ErrListProducts.AddDesc(err.Error()) - } - for productName, roleIDs := range productNameMap { - //用户关联角色所关联的环境 - for _, roleID := range roleIDs { - if roleID == setting.RoleOwnerID { - tmpProducts, err := commonrepo.NewProductColl().List(&commonrepo.ProductListOptions{ExcludeStatus: setting.ProductStatusDeleting, Name: productName, EnvName: envName}) - if err != nil { - log.Errorf("Collection.Product.List Find product error: %v", err) - return prodRevs, e.ErrListProducts.AddDesc(err.Error()) - } - for _, product := range tmpProducts { - if !productNamespaces.Has(product.Namespace) { - products = append(products, product) - } - } - } else { - roleEnvs, err := poetryCtl.ListRoleEnvs(productName, envName, roleID, log) - if err != nil { - log.Errorf("Collection.Product.List ListRoleEnvs error: %v", err) - return prodRevs, e.ErrListProducts.AddDesc(err.Error()) - } - for _, roleEnv := range roleEnvs { - product, err := commonrepo.NewProductColl().Find(&commonrepo.ProductFindOptions{Name: productName, EnvName: roleEnv.EnvName}) - if err != nil { - log.Errorf("Collection.Product.List Find product error: %v", err) - return prodRevs, e.ErrListProducts.AddDesc(err.Error()) - } - products = append(products, product) - } - } - } - } - } +func ListProductsRevision(productName, envName string, log *zap.SugaredLogger) (prodRevs []*ProductRevision, err error) { + products, err := commonrepo.NewProductColl().List(&commonrepo.ProductListOptions{Name: productName, IsSortByProductName: true, EnvName: envName}) // 获取所有服务模板最新模板信息 allServiceTmpls, err := commonrepo.NewServiceColl().ListAllRevisions() diff --git a/pkg/microservice/aslan/core/project/handler/product.go b/pkg/microservice/aslan/core/project/handler/product.go index 1a1eb7775..1f78b1b4f 100644 --- a/pkg/microservice/aslan/core/project/handler/product.go +++ b/pkg/microservice/aslan/core/project/handler/product.go @@ -169,7 +169,7 @@ func ListTemplatesHierachy(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - ctx.Resp, ctx.Err = projectservice.ListTemplatesHierachy(ctx.UserName, ctx.UserID, false, ctx.Logger) + ctx.Resp, ctx.Err = projectservice.ListTemplatesHierachy(ctx.UserName, ctx.Logger) } func ForkProduct(c *gin.Context) { diff --git a/pkg/microservice/aslan/core/project/service/product.go b/pkg/microservice/aslan/core/project/service/product.go index 7c867f321..c704db82f 100644 --- a/pkg/microservice/aslan/core/project/service/product.go +++ b/pkg/microservice/aslan/core/project/service/product.go @@ -529,7 +529,7 @@ func ForkProduct(username, requestID string, args *template.ForkProject, log *za } policyClient := policy.New() err = policyClient.CreateRoleBinding(args.ProductName, &policy.RoleBinding{ - Name: fmt.Sprintf("%s-%s", args.ProductName, username), + Name: fmt.Sprintf(setting.ContributorRoleBindingFmt, args.ProductName, username), User: username, Role: setting.Contributor, Global: true, @@ -543,13 +543,6 @@ func ForkProduct(username, requestID string, args *template.ForkProject, log *za } func UnForkProduct(userID string, username, productName, workflowName, envName, requestID string, log *zap.SugaredLogger) error { - poetryClient := poetry.New(config.PoetryAPIServer()) - if userEnvPermissions, _ := poetryClient.ListUserEnvPermission(productName, 1, log); len(userEnvPermissions) > 0 { - if err := poetryClient.DeleteUserEnvPermission(productName, username, 1, log); err != nil { - return e.ErrUnForkProduct.AddDesc(fmt.Sprintf("Failed to delete env permission for userID: %d, env: %s, productName: %s, the error is: %+v", userID, username, productName, err)) - } - } - if _, err := workflowservice.FindWorkflow(workflowName, log); err == nil { err = commonservice.DeleteWorkflow(workflowName, requestID, false, log) if err != nil { @@ -558,14 +551,12 @@ func UnForkProduct(userID string, username, productName, workflowName, envName, } } - if roleID := poetryClient.GetContributorRoleID(productName, log); roleID > 0 { - err := poetryClient.DeleteUserRole(roleID, poetry.ProjectType, 1, productName, log) - if err != nil { - log.Errorf("Failed to Delete user from role candidate, the error is: %v", err) - return e.ErrUnForkProduct.AddDesc(err.Error()) - } + policyClient := policy.New() + err := policyClient.DeleteRoleBinding(fmt.Sprintf(setting.ContributorRoleBindingFmt, productName, username), productName) + if err != nil { + log.Error("rolebinding delete error") + return e.ErrForkProduct } - if err := commonservice.DeleteProduct(username, envName, productName, requestID, log); err != nil { _, messageMap := e.ErrorMessage(err) if description, ok := messageMap["description"]; ok { @@ -689,33 +680,17 @@ type ContainerInfo struct { Label string `bson:"label" json:"label"` } -func ListTemplatesHierachy(userName, userID string, superUser bool, log *zap.SugaredLogger) ([]*ProductInfo, error) { +func ListTemplatesHierachy(userName string, log *zap.SugaredLogger) ([]*ProductInfo, error) { var ( err error resp = make([]*ProductInfo, 0) productTmpls = make([]*template.Product, 0) ) - if superUser { - productTmpls, err = templaterepo.NewProductColl().List() - if err != nil { - log.Errorf("[%s] ProductTmpl.List error: %v", userName, err) - return nil, e.ErrListProducts.AddDesc(err.Error()) - } - } else { - productNameMap, err := poetry.New(config.PoetryAPIServer()).GetUserProject(1, log) - if err != nil { - log.Errorf("ProfuctTmpl.List GetUserProject error: %v", err) - return resp, e.ErrListProducts.AddDesc(err.Error()) - } - for productName := range productNameMap { - product, err := templaterepo.NewProductColl().Find(productName) - if err != nil { - log.Errorf("ProfuctTmpl.List error: %v", err) - return resp, e.ErrListProducts.AddDesc(err.Error()) - } - productTmpls = append(productTmpls, product) - } + productTmpls, err = templaterepo.NewProductColl().List() + if err != nil { + log.Errorf("[%s] ProductTmpl.List error: %v", userName, err) + return nil, e.ErrListProducts.AddDesc(err.Error()) } for _, productTmpl := range productTmpls { diff --git a/pkg/microservice/aslan/core/setting/handler/user.go b/pkg/microservice/aslan/core/setting/handler/user.go index bdaf0f481..0dc66b84a 100644 --- a/pkg/microservice/aslan/core/setting/handler/user.go +++ b/pkg/microservice/aslan/core/setting/handler/user.go @@ -27,5 +27,5 @@ func GetUserKubeConfig(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - ctx.Resp, ctx.Err = settingservice.GetUserKubeConfig(ctx.UserName, ctx.UserID, false, ctx.Logger) + ctx.Resp, ctx.Err = settingservice.GetUserKubeConfig(ctx.UserName, ctx.Logger) } diff --git a/pkg/microservice/aslan/core/setting/service/user.go b/pkg/microservice/aslan/core/setting/service/user.go index a2d19e0eb..11eea83a6 100644 --- a/pkg/microservice/aslan/core/setting/service/user.go +++ b/pkg/microservice/aslan/core/setting/service/user.go @@ -40,7 +40,6 @@ import ( commonrepo "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/mongodb" "github.com/koderover/zadig/pkg/setting" "github.com/koderover/zadig/pkg/shared/kube/wrapper" - "github.com/koderover/zadig/pkg/shared/poetry" e "github.com/koderover/zadig/pkg/tool/errors" krkubeclient "github.com/koderover/zadig/pkg/tool/kube/client" "github.com/koderover/zadig/pkg/tool/kube/getter" @@ -57,75 +56,23 @@ type kubeCfgTmplArgs struct { ClientKeyBase64 string } -func GetUserKubeConfig(userName, userID string, superUser bool, log *zap.SugaredLogger) (string, error) { +func GetUserKubeConfig(userName string, log *zap.SugaredLogger) (string, error) { username := strings.ToLower(userName) username = config.NameSpaceRegex.ReplaceAllString(username, "-") var ( - err error - productEnvs = make([]*commonmodels.Product, 0) - productNameMap map[string][]int64 + err error + productEnvs = make([]*commonmodels.Product, 0) ) - if superUser { - productEnvs, err = commonrepo.NewProductColl().List(&commonrepo.ProductListOptions{}) - if err != nil { - log.Errorf("GetUserKubeConfig Collection.Product.List error: %v", err) - return "", e.ErrListProducts.AddDesc(err.Error()) - } - // 只管理同集群的资源,且排除状态为Terminating的namespace - productEnvs = filterProductWithoutExternalCluster(productEnvs) - } else { - //项目下所有公开环境 - publicProducts, err := commonrepo.NewProductColl().List(&commonrepo.ProductListOptions{IsPublic: true}) - if err != nil { - log.Errorf("GetUserKubeConfig Collection.Product.List List product error: %v", err) - return "", e.ErrListProducts.AddDesc(err.Error()) - } - // 只管理同集群的资源,且排除状态为Terminating的namespace - filterPublicProductEnvs := filterProductWithoutExternalCluster(publicProducts) - namespaceSet := sets.NewString() - for _, publicProduct := range filterPublicProductEnvs { - productEnvs = append(productEnvs, publicProduct) - namespaceSet.Insert(publicProduct.Namespace) - } - poetryClient := poetry.New(config.PoetryAPIServer()) - productNameMap, err = poetryClient.GetUserProject(1, log) - if err != nil { - log.Errorf("GetUserKubeConfig Collection.Product.List GetUserProject error: %v", err) - return "", e.ErrListProducts.AddDesc(err.Error()) - } - for productName, roleIDs := range productNameMap { - //用户关联角色所关联的环境 - for _, roleID := range roleIDs { - if roleID == setting.RoleOwnerID { - tmpProducts, err := commonrepo.NewProductColl().List(&commonrepo.ProductListOptions{Name: productName}) - if err != nil { - log.Errorf("GetUserKubeConfig Collection.Product.List product error: %v", err) - return "", e.ErrListProducts.AddDesc(err.Error()) - } - for _, product := range tmpProducts { - if !namespaceSet.Has(product.Namespace) { - productEnvs = append(productEnvs, product) - } - } - } else { - roleEnvs, err := poetryClient.ListRoleEnvs(productName, "", roleID, log) - if err != nil { - log.Errorf("GetUserKubeConfig Collection.Product.List ListRoleEnvs error: %v", err) - return "", e.ErrListProducts.AddDesc(err.Error()) - } - for _, roleEnv := range roleEnvs { - product, err := commonrepo.NewProductColl().Find(&commonrepo.ProductFindOptions{Name: productName, EnvName: roleEnv.EnvName}) - if err != nil { - log.Errorf("GetUserKubeConfig Collection.Product.List Find product error: %v", err) - return "", e.ErrListProducts.AddDesc(err.Error()) - } - productEnvs = append(productEnvs, product) - } - } - } - } + productEnvs, err = commonrepo.NewProductColl().List(&commonrepo.ProductListOptions{}) + if err != nil { + log.Errorf("GetUserKubeConfig Collection.Product.List error: %v", err) + return "", e.ErrListProducts.AddDesc(err.Error()) } + + // 只管理同集群的资源,且排除状态为Terminating的namespace + productEnvs = filterProductWithoutExternalCluster(productEnvs) + saNamespace := config.Namespace() if err := ensureServiceAccount(saNamespace, username, log); err != nil { return "", err diff --git a/pkg/setting/consts.go b/pkg/setting/consts.go index 24b3b28d1..bc1457a1d 100644 --- a/pkg/setting/consts.go +++ b/pkg/setting/consts.go @@ -483,5 +483,6 @@ const ChartTemplatesPath = "charts" type RoleType string const ( - Contributor RoleType = "Contributor" + Contributor RoleType = "Contributor" + ContributorRoleBindingFmt string = "contributor-project:%s-user:%s" ) diff --git a/pkg/shared/client/policy/policy.go b/pkg/shared/client/policy/policy.go index 0a89b0ed5..10f01e743 100644 --- a/pkg/shared/client/policy/policy.go +++ b/pkg/shared/client/policy/policy.go @@ -46,3 +46,9 @@ func (c *Client) CreateRoleBinding(projectName string, roleBinding *RoleBinding) _, err := c.Post(url, httpclient.SetBody(roleBinding)) return err } + +func (c *Client) DeleteRoleBinding(name string, projectName string) error { + url := fmt.Sprintf("/rolebindings/%s?projectName=%s", name, projectName) + _, err := c.Delete(url) + return err +} -- Gitee From 2dfd8280f5b9c0eab044685ae0a53318180afff7 Mon Sep 17 00:00:00 2001 From: mouuii Date: Wed, 20 Oct 2021 19:15:30 +0800 Subject: [PATCH 068/405] exemption_urls Signed-off-by: mouuii --- .../core/service/bundle/exemption_urls.go | 124 ++++++++++++++++++ 1 file changed, 124 insertions(+) diff --git a/pkg/microservice/policy/core/service/bundle/exemption_urls.go b/pkg/microservice/policy/core/service/bundle/exemption_urls.go index 84d419a21..51c57ffb9 100644 --- a/pkg/microservice/policy/core/service/bundle/exemption_urls.go +++ b/pkg/microservice/policy/core/service/bundle/exemption_urls.go @@ -55,4 +55,128 @@ var adminURLs = []*policyRule{ Methods: []string{"POST"}, Endpoints: []string{"api/aslan/cluster/clusters"}, }, + { + Methods: []string{"PUT", "DELETE"}, + Endpoints: []string{"api/aslan/cluster/clusters/?*"}, + }, + { + Methods: []string{"POST", "PUT"}, + Endpoints: []string{"api/aslan/project/products"}, + }, + { + Methods: []string{"DELETE"}, + Endpoints: []string{"api/aslan/project/products/?*"}, + }, + { + Methods: []string{"PUT"}, + Endpoints: []string{"api/aslan/cluster/clusters/?*/disconnect"}, + }, + { + Methods: []string{"PUT"}, + Endpoints: []string{"api/aslan/cluster/clusters/?*/reconnect"}, + }, + { + Methods: []string{"POST", "PUT"}, + Endpoints: []string{"api/aslan/system/install"}, + }, + { + Methods: []string{"PUT"}, + Endpoints: []string{"api/aslan/system/install/delete"}, + }, + { + Methods: []string{"POST"}, + Endpoints: []string{"api/aslan/system/proxyManage"}, + }, + { + Methods: []string{"PUT", "DELETE"}, + Endpoints: []string{"api/aslan/system/proxyManage/?*"}, + }, + { + Methods: []string{"GET", "POST"}, + Endpoints: []string{"api/aslan/system/registry/namespaces"}, + }, + { + Methods: []string{"PUT", "DELETE"}, + Endpoints: []string{"api/aslan/system/registry/namespaces/?*"}, + }, + { + Methods: []string{"POST"}, + Endpoints: []string{"api/aslan/system/s3storage"}, + }, + { + Methods: []string{"PUT", "DELETE"}, + Endpoints: []string{"api/aslan/system/s3storage/?*"}, + }, + { + Methods: []string{"POST"}, + Endpoints: []string{"api/aslan/system/githubApp"}, + }, + { + Methods: []string{"DELETE"}, + Endpoints: []string{"api/aslan/system/githubApp/?*"}, + }, + { + Methods: []string{"POST"}, + Endpoints: []string{"api/aslan/system/jenkins/integration"}, + }, + { + Methods: []string{"PUT", "DELETE"}, + Endpoints: []string{"api/aslan/system/jenkins/integration/?*"}, + }, + { + Methods: []string{"POST"}, + Endpoints: []string{"api/aslan/system/jenkins/integration/user/connection"}, + }, + { + Methods: []string{"POST"}, + Endpoints: []string{"api/aslan/system/basicImages"}, + }, + { + Methods: []string{"PUT", "DELETE"}, + Endpoints: []string{"api/aslan/system/basicImages/?*"}, + }, + { + Methods: []string{"POST"}, + Endpoints: []string{"api/aslan/system/helm"}, + }, + { + Methods: []string{"PUT", "DELETE"}, + Endpoints: []string{"api/aslan/system/helm/?*"}, + }, + { + Methods: []string{"POST"}, + Endpoints: []string{"api/aslan/system/privateKey"}, + }, + { + Methods: []string{"PUT", "DELETE"}, + Endpoints: []string{"api/aslan/system/privateKey/?*"}, + }, + { + Methods: []string{"POST"}, + Endpoints: []string{"api/aslan/system/announcement"}, + }, + { + Methods: []string{"PUT"}, + Endpoints: []string{"api/aslan/system/announcement/update"}, + }, + { + Methods: []string{"GET"}, + Endpoints: []string{"api/aslan/system/announcement/all"}, + }, + { + Methods: []string{"DELETE"}, + Endpoints: []string{"api/aslan/system/announcement/?*"}, + }, + { + Methods: []string{"GET", "POST"}, + Endpoints: []string{"api/aslan/system/operation"}, + }, + { + Methods: []string{"PUT"}, + Endpoints: []string{"api/aslan/system/operation/?*"}, + }, + { + Methods: []string{"GET"}, + Endpoints: []string{"api/aslan/system/proxy/config"}, + }, } -- Gitee From ffd8fea6f007c22274748ff43cbd0eb0657e8858 Mon Sep 17 00:00:00 2001 From: mouuii Date: Wed, 20 Oct 2021 19:19:21 +0800 Subject: [PATCH 069/405] build Signed-off-by: mouuii --- .../aslan/core/environment/handler/environment.go | 6 +++--- pkg/microservice/aslan/core/project/service/product.go | 1 - 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/pkg/microservice/aslan/core/environment/handler/environment.go b/pkg/microservice/aslan/core/environment/handler/environment.go index c146c8a8c..49aa26682 100644 --- a/pkg/microservice/aslan/core/environment/handler/environment.go +++ b/pkg/microservice/aslan/core/environment/handler/environment.go @@ -92,7 +92,7 @@ func AutoUpdateProduct(c *gin.Context) { } force, _ := strconv.ParseBool(c.Query("force")) - ctx.Resp, ctx.Err = service.AutoUpdateProduct(args.EnvNames, c.Param("productName"), ctx.UserID, false, ctx.RequestID, force, ctx.Logger) + ctx.Resp, ctx.Err = service.AutoUpdateProduct(args.EnvNames, c.Param("productName"), ctx.RequestID, force, ctx.Logger) } func CreateHelmProduct(c *gin.Context) { @@ -313,7 +313,7 @@ func UpdateMultiHelmEnv(c *gin.Context) { internalhandler.InsertOperationLog(c, ctx.UserName, args.ProductName, "更新", "集成环境", strings.Join(args.EnvNames, ","), string(data), ctx.Logger) ctx.Resp, ctx.Err = service.UpdateMultipleHelmEnv( - ctx.RequestID, ctx.UserID, false, args, ctx.Logger, + ctx.RequestID, args, ctx.Logger, ) } @@ -338,7 +338,7 @@ func UpdateMultiHelmProduct(c *gin.Context) { return } - ctx.Resp = service.UpdateMultiHelmProduct(args.EnvNames, args.UpdateType, c.Param("productName"), ctx.UserID, false, ctx.RequestID, ctx.Logger) + ctx.Resp = service.UpdateMultiHelmProduct(args.EnvNames, args.UpdateType, c.Param("productName"), ctx.RequestID, ctx.Logger) } func GetProduct(c *gin.Context) { diff --git a/pkg/microservice/aslan/core/project/service/product.go b/pkg/microservice/aslan/core/project/service/product.go index 232e32831..ee01dfe0b 100644 --- a/pkg/microservice/aslan/core/project/service/product.go +++ b/pkg/microservice/aslan/core/project/service/product.go @@ -40,7 +40,6 @@ import ( workflowservice "github.com/koderover/zadig/pkg/microservice/aslan/core/workflow/service/workflow" "github.com/koderover/zadig/pkg/setting" "github.com/koderover/zadig/pkg/shared/client/policy" - "github.com/koderover/zadig/pkg/shared/poetry" e "github.com/koderover/zadig/pkg/tool/errors" "github.com/koderover/zadig/pkg/tool/log" ) -- Gitee From 7ab861e5bd42cc0d56305b1969df5054e8d3ddf2 Mon Sep 17 00:00:00 2001 From: lou Date: Wed, 20 Oct 2021 20:47:56 +0800 Subject: [PATCH 070/405] add policy Signed-off-by: lou --- .../aslan/core/workflow/handler/policy.yaml | 10 ++++++ .../workflow/handler/policy_definitions.go | 24 ++++++++++++++ .../aslan/core/workflow/handler/router.go | 32 ------------------- .../policy/core/service/bundle/opa_policy.go | 2 -- 4 files changed, 34 insertions(+), 34 deletions(-) create mode 100644 pkg/microservice/aslan/core/workflow/handler/policy.yaml create mode 100644 pkg/microservice/aslan/core/workflow/handler/policy_definitions.go diff --git a/pkg/microservice/aslan/core/workflow/handler/policy.yaml b/pkg/microservice/aslan/core/workflow/handler/policy.yaml new file mode 100644 index 000000000..6a086c35a --- /dev/null +++ b/pkg/microservice/aslan/core/workflow/handler/policy.yaml @@ -0,0 +1,10 @@ +resource: Workflow +alias: "工作流" +description: "" +rules: + - action: get_workflow + alias: "查看工作流" + description: "" + rules: + - method: GET + endpoint: "api/aslan/workflow/workflow" diff --git a/pkg/microservice/aslan/core/workflow/handler/policy_definitions.go b/pkg/microservice/aslan/core/workflow/handler/policy_definitions.go new file mode 100644 index 000000000..a434ba1dd --- /dev/null +++ b/pkg/microservice/aslan/core/workflow/handler/policy_definitions.go @@ -0,0 +1,24 @@ +package handler + +import ( + _ "embed" + + "sigs.k8s.io/yaml" + + "github.com/koderover/zadig/pkg/shared/client/policy" + "github.com/koderover/zadig/pkg/tool/log" +) + +//go:embed policy.yaml +var policyDefinitions []byte + +func (*Router) Policies() *policy.Policy { + res := &policy.Policy{} + err := yaml.Unmarshal(policyDefinitions, res) + if err != nil { + // should not have happened here + log.DPanic(err) + } + + return res +} diff --git a/pkg/microservice/aslan/core/workflow/handler/router.go b/pkg/microservice/aslan/core/workflow/handler/router.go index 25b9bd66d..091767d45 100644 --- a/pkg/microservice/aslan/core/workflow/handler/router.go +++ b/pkg/microservice/aslan/core/workflow/handler/router.go @@ -17,45 +17,13 @@ limitations under the License. package handler import ( - "encoding/json" - "github.com/gin-gonic/gin" gin2 "github.com/koderover/zadig/pkg/middleware/gin" - "github.com/koderover/zadig/pkg/shared/client/policy" - "github.com/koderover/zadig/pkg/tool/log" ) type Router struct{} -var policies = ` -{ - "resource": "Workflow", - "alias": "工作流", - "description": "", - "rules": [{ - "action": "get_workflow", - "alias": "查看工作流", - "description": "", - "rules": [{ - "method": "GET", - "endpoint": "api/aslan/workflow/workflow" - }] - }] -} -` - -func (*Router) Policies() *policy.Policy { - res := &policy.Policy{} - err := json.Unmarshal([]byte(policies), res) - if err != nil { - // should not have happened here - log.DPanic(err) - } - - return res -} - func (*Router) Inject(router *gin.RouterGroup) { // --------------------------------------------------------------------------------------- // 对外公共接口 diff --git a/pkg/microservice/policy/core/service/bundle/opa_policy.go b/pkg/microservice/policy/core/service/bundle/opa_policy.go index 33af2e180..8b1cd4e3c 100644 --- a/pkg/microservice/policy/core/service/bundle/opa_policy.go +++ b/pkg/microservice/policy/core/service/bundle/opa_policy.go @@ -18,8 +18,6 @@ package bundle import ( _ "embed" - - _ "github.com/koderover/zadig/pkg/util/testing" ) //go:embed rego/authz.rego -- Gitee From 844fcb253fc7de27e201eeabfc79f22906bc8640 Mon Sep 17 00:00:00 2001 From: mouuii Date: Wed, 20 Oct 2021 21:13:26 +0800 Subject: [PATCH 071/405] api Signed-off-by: mouuii --- .../aslan/core/workflow/handler/policy.yaml | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/pkg/microservice/aslan/core/workflow/handler/policy.yaml b/pkg/microservice/aslan/core/workflow/handler/policy.yaml index 6a086c35a..b7d2aa5f5 100644 --- a/pkg/microservice/aslan/core/workflow/handler/policy.yaml +++ b/pkg/microservice/aslan/core/workflow/handler/policy.yaml @@ -8,3 +8,23 @@ rules: rules: - method: GET endpoint: "api/aslan/workflow/workflow" + - method: GET + endpoint: "/api/aslan/workflow/workflow/find/?*" + - method: GET + endpoint: "/api/aslan/workflow/workflowtask/max/?*/start/?*/pipelines/?*" + - method: GET + endpoint: "/api/aslan/workflow/workflowtask/id/?*/pipelines/?*" + - method: GET + endpoint: "/api/aslan/workflow/sse/workflows/id/?*/pipelines/?*" + - method: GET + endpoint: "/api/aslan/logs/sse/workflow/build/?*/?*/?*/?*" + - method: GET + endpoint: "/api/aslan/logs/log/workflow/?*/tasks/?*/service/?*" + - method: GET + endpoint: "/api/aslan/logs/log/workflow/:name/tasks/:taskid/tests/test/service/:serviceName" + - method: GET + endpoint: "/api/aslan/logs/log/workflow/:name/tasks/:taskid/tests/test/service/:testName" + - method: GET + endpoint: "/api/aslan/testing/itreport/workflow/:workflowName/id/:taskid/names/:workflowName-:taskid-test/service/:testName" + - method: GET + endpoint: "/api/aslan/testing/itreport/workflow/:workflowName/id/:taskid/names/:workflowName-:taskid-test/service/:testName" -- Gitee From e3fd7e8a667625285ace1fc878bf8d7b436a02d2 Mon Sep 17 00:00:00 2001 From: lou Date: Wed, 20 Oct 2021 21:17:23 +0800 Subject: [PATCH 072/405] add public urls Signed-off-by: lou --- .../core/service/bundle/exemption_urls.go | 26 ++++++++++++------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/pkg/microservice/policy/core/service/bundle/exemption_urls.go b/pkg/microservice/policy/core/service/bundle/exemption_urls.go index 51c57ffb9..11ee4884c 100644 --- a/pkg/microservice/policy/core/service/bundle/exemption_urls.go +++ b/pkg/microservice/policy/core/service/bundle/exemption_urls.go @@ -45,20 +45,20 @@ var publicURLs = []*policyRule{ }, { Methods: []string{"GET"}, - Endpoints: []string{"api/aslan/kodespace/downloadUrl"}, + Endpoints: []string{"api/aslan/testing/report"}, }, -} - -// actions which are allowed for system admins only. -var adminURLs = []*policyRule{ { - Methods: []string{"POST"}, - Endpoints: []string{"api/aslan/cluster/clusters"}, + Methods: []string{"GET"}, + Endpoints: []string{"api/aslan/cluster/agent/?*/agent.yaml"}, }, { - Methods: []string{"PUT", "DELETE"}, - Endpoints: []string{"api/aslan/cluster/clusters/?*"}, + Methods: []string{"GET"}, + Endpoints: []string{"api/podexec/health"}, }, +} + +// actions which are allowed for admins only. +var adminURLs = []*policyRule{ { Methods: []string{"POST", "PUT"}, Endpoints: []string{"api/aslan/project/products"}, @@ -67,6 +67,14 @@ var adminURLs = []*policyRule{ Methods: []string{"DELETE"}, Endpoints: []string{"api/aslan/project/products/?*"}, }, + { + Methods: []string{"POST"}, + Endpoints: []string{"api/aslan/cluster/clusters"}, + }, + { + Methods: []string{"PUT", "DELETE"}, + Endpoints: []string{"api/aslan/cluster/clusters/?*"}, + }, { Methods: []string{"PUT"}, Endpoints: []string{"api/aslan/cluster/clusters/?*/disconnect"}, -- Gitee From afc4ccca4f1217e1220203a3b356708d77467583 Mon Sep 17 00:00:00 2001 From: lou Date: Wed, 20 Oct 2021 21:57:50 +0800 Subject: [PATCH 073/405] remove poetry calls Signed-off-by: lou --- .../aslan/core/common/service/utils.go | 19 +- .../aslan/core/environment/service/product.go | 17 +- .../aslan/core/system/service/capacity.go | 26 +- pkg/shared/poetry/user.go | 357 ------------------ pkg/types/permission/permission.go | 22 -- 5 files changed, 26 insertions(+), 415 deletions(-) delete mode 100644 pkg/shared/poetry/user.go delete mode 100644 pkg/types/permission/permission.go diff --git a/pkg/microservice/aslan/core/common/service/utils.go b/pkg/microservice/aslan/core/common/service/utils.go index 0c659c8b1..010bdc95b 100644 --- a/pkg/microservice/aslan/core/common/service/utils.go +++ b/pkg/microservice/aslan/core/common/service/utils.go @@ -28,9 +28,7 @@ import ( "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/models" "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/notify" "github.com/koderover/zadig/pkg/setting" - "github.com/koderover/zadig/pkg/shared/poetry" e "github.com/koderover/zadig/pkg/tool/errors" - "github.com/koderover/zadig/pkg/types/permission" ) func SendMessage(sender, title, content, requestID string, log *zap.SugaredLogger) { @@ -54,11 +52,6 @@ func SendMessage(sender, title, content, requestID string, log *zap.SugaredLogge func SendFailedTaskMessage(username, productName, name, requestID string, workflowType config.PipelineType, err error, log *zap.SugaredLogger) { title := "创建工作流任务失败" - perm := permission.WorkflowUpdateUUID - if workflowType == config.TestType { - title = "创建测试任务失败" - perm = permission.TestManageUUID - } errStr := err.Error() _, messageMap := e.ErrorMessage(err) @@ -75,12 +68,12 @@ func SendFailedTaskMessage(username, productName, name, requestID string, workfl return } - // 如果是timer创建的任务,通知需要发送给该项目下有编辑工作流权限的用户 - poetryClient := poetry.New(config.PoetryAPIServer()) - users, _ := poetryClient.ListProductPermissionUsers(productName, perm, log) - for _, user := range users { - SendMessage(user, title, content, requestID, log) - } + //// 如果是timer创建的任务,通知需要发送给该项目下有编辑工作流权限的用户 + //poetryClient := poetry.New(config.PoetryAPIServer()) + //users, _ := poetryClient.ListProductPermissionUsers(productName, perm, log) + //for _, user := range users { + // SendMessage(user, title, content, requestID, log) + //} } func SendErrorMessage(sender, title, requestID string, err error, log *zap.SugaredLogger) { diff --git a/pkg/microservice/aslan/core/environment/service/product.go b/pkg/microservice/aslan/core/environment/service/product.go index f4bee00c4..c04f3cdfe 100644 --- a/pkg/microservice/aslan/core/environment/service/product.go +++ b/pkg/microservice/aslan/core/environment/service/product.go @@ -31,7 +31,6 @@ import ( commonservice "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service" "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/kube" "github.com/koderover/zadig/pkg/setting" - "github.com/koderover/zadig/pkg/shared/poetry" e "github.com/koderover/zadig/pkg/tool/errors" "github.com/koderover/zadig/pkg/tool/log" ) @@ -61,24 +60,24 @@ func CleanProductCronJob(requestID string, log *zap.SugaredLogger) { } if time.Now().Unix()-product.UpdateTime > int64(60*60*24*product.RecycleDay) { - title := "系统清理产品信息" - content := fmt.Sprintf("环境 [%s] 已经连续%d天没有使用, 系统已自动删除该环境, 如有需要请重新创建。", product.EnvName, product.RecycleDay) + //title := "系统清理产品信息" + //content := fmt.Sprintf("环境 [%s] 已经连续%d天没有使用, 系统已自动删除该环境, 如有需要请重新创建。", product.EnvName, product.RecycleDay) if err := commonservice.DeleteProduct("robot", product.EnvName, product.ProductName, requestID, log); err != nil { log.Errorf("[%s][P:%s] delete product error: %v", product.EnvName, product.ProductName, err) // 如果有错误,重试删除 if err := commonservice.DeleteProduct("robot", product.EnvName, product.ProductName, requestID, log); err != nil { - content = fmt.Sprintf("系统自动清理环境 [%s] 失败,请手动删除环境。", product.ProductName) + //content = fmt.Sprintf("系统自动清理环境 [%s] 失败,请手动删除环境。", product.ProductName) log.Errorf("[%s][P:%s] retry delete product error: %v", product.EnvName, product.ProductName, err) } } - poetryClient := poetry.New(config.PoetryAPIServer()) - users, _ := poetryClient.ListProductPermissionUsers("", "", log) - for _, user := range users { - commonservice.SendMessage(user, title, content, requestID, log) - } + //poetryClient := poetry.New(config.PoetryAPIServer()) + //users, _ := poetryClient.ListProductPermissionUsers("", "", log) + //for _, user := range users { + // commonservice.SendMessage(user, title, content, requestID, log) + //} log.Warnf("[%s] product %s deleted", product.EnvName, product.ProductName) } diff --git a/pkg/microservice/aslan/core/system/service/capacity.go b/pkg/microservice/aslan/core/system/service/capacity.go index 79c1a3dd2..378589787 100644 --- a/pkg/microservice/aslan/core/system/service/capacity.go +++ b/pkg/microservice/aslan/core/system/service/capacity.go @@ -25,10 +25,8 @@ import ( commonmodels "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/models" "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/models/task" commonrepo "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/mongodb" - "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/notify" "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/s3" "github.com/koderover/zadig/pkg/setting" - "github.com/koderover/zadig/pkg/shared/poetry" "github.com/koderover/zadig/pkg/tool/log" s3tool "github.com/koderover/zadig/pkg/tool/s3" "github.com/koderover/zadig/pkg/util" @@ -173,19 +171,19 @@ func sendSyscapNotify(handleErr error, totalCleanTasks *int) { content.Content = fmt.Sprintf("清理时间: %s, 状态: 失败, 内容: %v", now, handleErr) } - notifyInfo := &commonmodels.Notify{ - Type: config.Message, - Content: content, - CreateTime: time.Now().Unix(), - IsRead: false, - } + //notifyInfo := &commonmodels.Notify{ + // Type: config.Message, + // Content: content, + // CreateTime: time.Now().Unix(), + // IsRead: false, + //} - poetryClient := poetry.New(config.PoetryAPIServer()) - users, _ := poetryClient.ListProductPermissionUsers("", "", log.SugaredLogger()) - for _, user := range users { - notifyInfo.Receiver = user - notify.NewNotifyClient().CreateNotify(user, notifyInfo) - } + //poetryClient := poetry.New(config.PoetryAPIServer()) + //users, _ := poetryClient.ListProductPermissionUsers("", "", log.SugaredLogger()) + //for _, user := range users { + // notifyInfo.Receiver = user + // notify.NewNotifyClient().CreateNotify(user, notifyInfo) + //} } func handleWorkflowTaskRetentionCenter(strategy *commonmodels.CapacityStrategy, dryRun bool) error { diff --git a/pkg/shared/poetry/user.go b/pkg/shared/poetry/user.go deleted file mode 100644 index 6885299fb..000000000 --- a/pkg/shared/poetry/user.go +++ /dev/null @@ -1,357 +0,0 @@ -/* -Copyright 2021 The KodeRover 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 poetry - -import ( - "fmt" - "strconv" - "strings" - - "go.uber.org/zap" - - "github.com/koderover/zadig/pkg/setting" - "github.com/koderover/zadig/pkg/tool/httpclient" -) - -//roleType -const ( - ProjectType = 2 - AllUsersRoleName = "all-users" -) - -type UserRole struct { - RoleID int64 `json:"roleId"` - UserID int `json:"userId"` - ProductName string `json:"productName"` -} - -type RoleProduct struct { - RoleID int64 `json:"roleId"` - ProductName string `json:"productName"` - Role Role `json:"role"` -} - -type UpdateUserRoleReq struct { - ProductName string `json:"productName"` - RoleID int64 `json:"roleId"` - RoleType int `json:"roleType"` - UserIDList []int `json:"userIds"` -} - -type RolePermission struct { - RoleID int64 `json:"roleId"` - PermissionUUID string `json:"permissionUUID"` -} - -type RoleEnv struct { - RoleID int `json:"roleId"` - EnvName string `json:"envName"` - ProductName string `json:"productName"` -} - -type RolePermissionReq struct { - RoleID int64 `json:"roleId"` - PermissionUUID []string `json:"permissionUUIDs"` - RoleType int `json:"roleType"` - ProductName string `json:"productName"` -} - -type Role struct { - ID int64 `json:"id"` - IsDisabled bool `json:"isDisabled"` - Name string `json:"name"` - ProductName string `json:"productName"` - RoleType int `json:"roleType"` - UpdateBy string `json:"updateBy"` - UpdateAt int64 `json:"updatedAt"` -} - -type UserEnv struct { - ProductName string `json:"productName"` - EnvName string `json:"envName"` - UserID int `json:"userId"` - PermissionUUID string `json:"permissionUUID"` -} - -func (c *Client) ListUserRoles(userID, roleType int, log *zap.SugaredLogger) ([]*UserRole, error) { - url := "/directory/roleUser" - - ur := make([]*UserRole, 0) - _, err := c.Get(url, httpclient.SetResult(&ur), httpclient.SetQueryParam("roleType", strconv.Itoa(roleType)), httpclient.SetQueryParam("userId", strconv.Itoa(userID))) - if err != nil { - log.Errorf("ListUserRoles error: %v", err) - return nil, err - } - - return ur, nil -} - -func (c *Client) ListPermissionUsers(productName string, roleID int64, roleType int, log *zap.SugaredLogger) ([]int, error) { - url := "/directory/roleUser" - qs := map[string]string{ - "productName": productName, - "roleType": strconv.Itoa(roleType), - "roleId": strconv.Itoa(int(roleID)), - } - - ur := make([]*UserRole, 0) - _, err := c.Get(url, httpclient.SetResult(&ur), httpclient.SetQueryParams(qs)) - if err != nil { - log.Errorf("ListPermissionUsers error: %v", err) - return nil, err - } - - var ret []int - for _, userRole := range ur { - ret = append(ret, userRole.UserID) - } - return ret, nil -} - -func (c *Client) UpdateUserRole(roleID int64, roleType int, productName string, userIDList []int, log *zap.SugaredLogger) error { - url := "/directory/roleUser" - req := &UpdateUserRoleReq{ - ProductName: productName, - RoleID: roleID, - RoleType: roleType, - UserIDList: userIDList, - } - - _, err := c.Post(url, httpclient.SetBody(req)) - if err != nil { - log.Errorf("UpdateUserRole failed, error: %v", err) - return err - } - - return nil -} - -func (c *Client) DeleteUserRole(roleID int64, roleType, userID int, productName string, log *zap.SugaredLogger) error { - url := "/directory/roleUser" - qs := map[string]string{ - "productName": productName, - "roleType": strconv.Itoa(roleType), - "roleId": strconv.Itoa(int(roleID)), - "userId": strconv.Itoa(userID), - } - - _, err := c.Delete(url, httpclient.SetQueryParams(qs)) - if err != nil { - log.Errorf("DeleteUserRole error: %v", err) - return err - } - return nil -} - -func (c *Client) ListRoleProjects(roleID int64, log *zap.SugaredLogger) ([]*RoleProduct, error) { - url := "/directory/roleProduct" - - rp := make([]*RoleProduct, 0) - _, err := c.Get(url, httpclient.SetResult(&rp), httpclient.SetQueryParam("roleId", strconv.Itoa(int(roleID)))) - if err != nil { - log.Errorf("ListRoleProjects error: %v", err) - return nil, err - } - - return rp, nil -} - -func (c *Client) ContributorRoleExist(productName string, log *zap.SugaredLogger) bool { - url := "/directory/roleProduct" - - rp := make([]*RoleProduct, 0) - _, err := c.Get(url, httpclient.SetResult(&rp), httpclient.SetQueryParam("productName", productName)) - if err != nil { - log.Errorf("Failed to list role project, error: %v", err) - return false - } - - for _, roleProduct := range rp { - if roleProduct.Role.Name == setting.RoleContributor { - return true - } - } - return false -} - -func (c *Client) GetContributorRoleID(productName string, log *zap.SugaredLogger) int64 { - url := "/directory/roleProduct" - - rp := make([]*RoleProduct, 0) - _, err := c.Get(url, httpclient.SetResult(&rp), httpclient.SetQueryParam("productName", productName)) - if err != nil { - log.Errorf("Failed to list role project, sendRequest error: %v", err) - return -1 - } - - for _, roleProduct := range rp { - if roleProduct.Role.Name == setting.RoleContributor { - return roleProduct.RoleID - } - } - return -1 -} - -func (c *Client) ListRolePermissions(roleID int64, roleType int, productName string, log *zap.SugaredLogger) ([]*RolePermission, error) { - url := "/directory/rolePermission" - qs := map[string]string{ - "productName": productName, - "roleType": strconv.Itoa(roleType), - "roleId": strconv.Itoa(int(roleID)), - } - - rp := make([]*RolePermission, 0) - _, err := c.Get(url, httpclient.SetResult(&rp), httpclient.SetQueryParams(qs)) - if err != nil { - log.Errorf("ListRolePermissions error: %v", err) - return nil, err - } - - return rp, nil -} - -func (c *Client) ListRoleEnvs(productName, envName string, roleID int64, log *zap.SugaredLogger) ([]*RoleEnv, error) { - url := "/directory/roleEnv" - qs := map[string]string{ - "productName": productName, - "envName": envName, - "roleId": strconv.Itoa(int(roleID)), - } - - re := make([]*RoleEnv, 0) - _, err := c.Get(url, httpclient.SetResult(&re), httpclient.SetQueryParams(qs)) - if err != nil { - log.Errorf("ListRoleEnvs error: %v", err) - return nil, err - } - - return re, nil -} - -func (c *Client) GetUserProject(userID int, log *zap.SugaredLogger) (map[string][]int64, error) { - productNameMap := make(map[string][]int64) - userRoles, err := c.ListUserRoles(userID, ProjectType, log) - if err != nil { - log.Errorf("GetUserProject ListUserRoles error: %v", err) - return productNameMap, fmt.Errorf("GetUserProject ListUserRoles error: %v", err) - } - for _, userRole := range userRoles { - productNameMap[userRole.ProductName] = append(productNameMap[userRole.ProductName], userRole.RoleID) - } - return productNameMap, nil -} - -func (c *Client) GetUserPermissionUUIDs(roleID int64, productName string, log *zap.SugaredLogger) ([]string, error) { - permissionUUIDs := make([]string, 0) - rolePermissions, err := c.ListRolePermissions(roleID, ProjectType, productName, log) - if err != nil { - log.Errorf("GetUserPermission ListRolePermissions error: %v", err) - return []string{}, fmt.Errorf("GetUserPermission ListRolePermissions error: %v", err) - } - for _, rolePermission := range rolePermissions { - permissionUUIDs = append(permissionUUIDs, rolePermission.PermissionUUID) - } - return permissionUUIDs, nil -} - -// ListProductPermissionUsers productName和permissionId为空时只返回所有管理员用户,不为空则返回所有管理员用户和有该权限的普通用户 -func (c *Client) ListProductPermissionUsers(productName, permissionID string, log *zap.SugaredLogger) ([]string, error) { - url := "/directory/productUser" - qs := map[string]string{ - "productName": productName, - "permissionId": permissionID, - } - - resp := make([]string, 0) - _, err := c.Get(url, httpclient.SetResult(&resp), httpclient.SetQueryParams(qs)) - if err != nil { - log.Errorf("ListProductPermissionUsers error: %v", err) - return nil, err - } - - return resp, nil -} - -// ListRoles 根据项目里面的角色名称获取对应的角色ID -func (c *Client) ListRoles(productName string, log *zap.SugaredLogger) (*Role, error) { - url := "/directory/roles" - qs := map[string]string{ - "name": AllUsersRoleName, - "productName": productName, - "roleType": strconv.Itoa(ProjectType), - } - - resp := make([]*Role, 0) - _, err := c.Get(url, httpclient.SetResult(&resp), httpclient.SetQueryParams(qs)) - if err != nil { - log.Errorf("ListRoles error: %v", err) - return nil, err - } - - if len(resp) == 0 { - return nil, fmt.Errorf("ListRoles Not Found") - } - - return resp[0], nil -} - -func (c *Client) ListUserEnvPermission(productName string, userID int, log *zap.SugaredLogger) ([]*UserEnv, error) { - url := "/directory/userEnvPermission" - qs := map[string]string{ - "productName": productName, - "userId": strconv.Itoa(userID), - } - - resp := make([]*UserEnv, 0) - _, err := c.Get(url, httpclient.SetResult(&resp), httpclient.SetQueryParams(qs)) - if err != nil { - log.Errorf("ListUserEnvPermission error: %v", err) - return nil, err - } - - return resp, nil -} - -func (c *Client) DeleteUserEnvPermission(productName, username string, userID int, log *zap.SugaredLogger) error { - url := "/directory/userEnvPermission" - qs := map[string]string{ - "productName": productName, - "envName": strings.ToLower(username), - "userId": strconv.Itoa(userID), - } - - _, err := c.Delete(url, httpclient.SetQueryParams(qs)) - if err != nil { - log.Errorf("DeleteUserEnvPermission error: %v", err) - return err - } - - return nil -} - -func (c *Client) GetUserEnvPermission(userID int, log *zap.SugaredLogger) ([]*UserEnv, error) { - url := "/directory/userEnvPermission" - - resp := make([]*UserEnv, 0) - _, err := c.Get(url, httpclient.SetResult(&resp), httpclient.SetQueryParam("userId", strconv.Itoa(userID))) - if err != nil { - log.Errorf("UserEnvPermission request error: %v", err) - return nil, err - } - - return resp, nil -} diff --git a/pkg/types/permission/permission.go b/pkg/types/permission/permission.go deleted file mode 100644 index b80b724b9..000000000 --- a/pkg/types/permission/permission.go +++ /dev/null @@ -1,22 +0,0 @@ -/* -Copyright 2021 The KodeRover 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 permission - -const ( - WorkflowUpdateUUID = "30002" //产品工作流(更新) - TestManageUUID = "50011" //测试管理(创建测试、修改测试) -) -- Gitee From 456d70ff7d6f3a568ef97646a96bb1677b7697ef Mon Sep 17 00:00:00 2001 From: lou Date: Thu, 21 Oct 2021 11:00:38 +0800 Subject: [PATCH 074/405] add more fields Signed-off-by: lou --- .../common/repository/mongodb/template/product.go | 12 +++++++++--- .../aslan/core/project/service/project.go | 14 ++++++++++---- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/pkg/microservice/aslan/core/common/repository/mongodb/template/product.go b/pkg/microservice/aslan/core/common/repository/mongodb/template/product.go index 295703d0e..a4312f184 100644 --- a/pkg/microservice/aslan/core/common/repository/mongodb/template/product.go +++ b/pkg/microservice/aslan/core/common/repository/mongodb/template/product.go @@ -32,9 +32,12 @@ import ( ) type ProjectInfo struct { - Name string `bson:"product_name"` - Alias string `bson:"project_name"` - Desc string `bson:"description"` + Name string `bson:"product_name"` + Alias string `bson:"project_name"` + Desc string `bson:"description"` + UpdatedAt int64 `bson:"update_time"` + UpdatedBy string `bson:"update_by"` + OnboardStatus int `bson:"onboarding_status"` } type ProductColl struct { @@ -98,6 +101,9 @@ func (c *ProductColl) ListProjectBriefs(inNames []string) ([]*ProjectInfo, error {"product_name", 1}, {"project_name", 1}, {"description", 1}, + {"update_time", 1}, + {"update_by", 1}, + {"onboarding_status", 1}, }) } diff --git a/pkg/microservice/aslan/core/project/service/project.go b/pkg/microservice/aslan/core/project/service/project.go index ac5ed373b..ea99a0b0d 100644 --- a/pkg/microservice/aslan/core/project/service/project.go +++ b/pkg/microservice/aslan/core/project/service/project.go @@ -42,8 +42,11 @@ type ProjectListOptions struct { type ProjectDetailedRepresentation struct { *ProjectBriefRepresentation - Alias string `json:"alias"` - Desc string `json:"desc"` + Alias string `json:"alias"` + Desc string `json:"desc"` + UpdatedAt int64 `bson:"updatedAt"` + UpdatedBy string `bson:"updatedBy"` + Onboard bool `bson:"onboard"` } type ProjectBriefRepresentation struct { @@ -103,8 +106,11 @@ func listDetailedProjectInfos(opts *ProjectListOptions, logger *zap.SugaredLogge ProjectMinimalRepresentation: &ProjectMinimalRepresentation{Name: name}, Envs: nameWithEnvMap[name], }, - Alias: info.Alias, - Desc: info.Desc, + Alias: info.Alias, + Desc: info.Desc, + UpdatedAt: info.UpdatedAt, + UpdatedBy: info.UpdatedBy, + Onboard: info.OnboardStatus != 0, }) } -- Gitee From 8c893deeee88e1bdba502e9c9abba940d9a79602 Mon Sep 17 00:00:00 2001 From: lou Date: Thu, 21 Oct 2021 11:16:03 +0800 Subject: [PATCH 075/405] typo Signed-off-by: lou --- pkg/microservice/aslan/core/project/service/project.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pkg/microservice/aslan/core/project/service/project.go b/pkg/microservice/aslan/core/project/service/project.go index ea99a0b0d..046e45e2f 100644 --- a/pkg/microservice/aslan/core/project/service/project.go +++ b/pkg/microservice/aslan/core/project/service/project.go @@ -44,9 +44,9 @@ type ProjectDetailedRepresentation struct { *ProjectBriefRepresentation Alias string `json:"alias"` Desc string `json:"desc"` - UpdatedAt int64 `bson:"updatedAt"` - UpdatedBy string `bson:"updatedBy"` - Onboard bool `bson:"onboard"` + UpdatedAt int64 `json:"updatedAt"` + UpdatedBy string `json:"updatedBy"` + Onboard bool `json:"onboard"` } type ProjectBriefRepresentation struct { -- Gitee From 4b9be89ca73c76ade2f5952fa11b96ee783efde2 Mon Sep 17 00:00:00 2001 From: mouuii Date: Thu, 21 Oct 2021 11:43:02 +0800 Subject: [PATCH 076/405] add environment handler Signed-off-by: mouuii --- .../core/environment/handler/policy.yaml | 88 +++++++++++++++++++ .../environment/handler/policy_definitions.go | 24 +++++ pkg/microservice/aslan/core/service.go | 2 + .../aslan/core/workflow/handler/policy.yaml | 40 +++++++-- 4 files changed, 149 insertions(+), 5 deletions(-) create mode 100644 pkg/microservice/aslan/core/environment/handler/policy.yaml create mode 100644 pkg/microservice/aslan/core/environment/handler/policy_definitions.go diff --git a/pkg/microservice/aslan/core/environment/handler/policy.yaml b/pkg/microservice/aslan/core/environment/handler/policy.yaml new file mode 100644 index 000000000..e716e26a1 --- /dev/null +++ b/pkg/microservice/aslan/core/environment/handler/policy.yaml @@ -0,0 +1,88 @@ +resource: Environment +alias: "集成环境" +description: "" +rules: + - action: get_environment + alias: "查看环境" + description: "" + rules: + - method: GET + endpoint: "/api/aslan/environment/environments" + - method: GET + endpoint: "/api/aslan/environment/environments/?*" + - method: GET + endpoint: "/api/aslan/environment/revision/products" + - method: GET + endpoint: "/api/aslan/environment/environments/?*/groups" + - method: GET + endpoint: "/api/aslan/environment/environments/?*/services/?*" + - method: GET + endpoint: "/api/aslan/environment/kube/workloads" + - method: GET + endpoint: "/api/aslan/service/workloads" + - action: create_environment + alias: "新建环境" + description: "" + rules: + - method: POST + endpoint: "/api/aslan/environment/environments" + - method: POST + endpoint: "/api/aslan/environment/environments/?*/helm" + - method: POST + endpoint: "/api/aslan/service/workloads" + - action: config_environment + alias: "配置环境" + description: "" + rules: + - method: PUT + endpoint: "/api/aslan/environment/environments/?*/autoUpdate" + - method: POST + endpoint: "/api/aslan/environment/environments/?*" + - method: PUT + endpoint: "/api/aslan/environment/environments/?*/envRecycle" + - method: PUT + endpoint: "/api/aslan/environment/environments/?*/renderchart" + - method: PUT + endpoint: "/api/aslan/environment/environments/?*/multiHelmEnv" + - method: PUT + endpoint: "/api/aslan/service/workloads" + - action: update_environment + alias: "更新环境" + description: "" + rules: + - method: POST + endpoint: "/api/aslan/environment/image/deployment" + - method: POST + endpoint: "/api/aslan/environment/image/statefulset" + - method: DELETE + endpoint: "/api/aslan/environment/kube/pods/?*" + - method: POST + endpoint: "/api/aslan/environment/environments/?*/services/?*/restartNew" + - method: PUT + endpoint: "/api/aslan/environment/configmaps" + - method: POST + endpoint: "/api/aslan/environment/configmaps" + - method: GET + endpoint: "/api/aslan/environment/export/service" + - method: GET + endpoint: "/api/aslan/environment/kube/pods/?*/events" + - method: GET + endpoint: "/api/aslan/environment/export/service" + - method: GET + endpoint: "/api/aslan/logs/sse/pods/?*/containers/?*" + - method: PUT + endpoint: "/api/aslan/environment/environments/?*/services/?*/:?*" + - method: POST + endpoint: "/api/aslan/environment/environments/?*/services/?*/restartNew" + - method: POST + endpoint: "/api/aslan/environment/environments/?*/services/?*/scale/?*" + - method: POST + endpoint: "/api/aslan/environment/environments/?*/services/?*/scaleNew/?*" + - method: PUT + endpoint: " /api/podexec/?*/?*/?*/?*/podExec" + - action: delete_environment + alias: "删除环境" + description: "" + rules: + - method: DELETE + endpoint: "/api/aslan/environment/environments/?*" \ No newline at end of file diff --git a/pkg/microservice/aslan/core/environment/handler/policy_definitions.go b/pkg/microservice/aslan/core/environment/handler/policy_definitions.go new file mode 100644 index 000000000..a434ba1dd --- /dev/null +++ b/pkg/microservice/aslan/core/environment/handler/policy_definitions.go @@ -0,0 +1,24 @@ +package handler + +import ( + _ "embed" + + "sigs.k8s.io/yaml" + + "github.com/koderover/zadig/pkg/shared/client/policy" + "github.com/koderover/zadig/pkg/tool/log" +) + +//go:embed policy.yaml +var policyDefinitions []byte + +func (*Router) Policies() *policy.Policy { + res := &policy.Policy{} + err := yaml.Unmarshal(policyDefinitions, res) + if err != nil { + // should not have happened here + log.DPanic(err) + } + + return res +} diff --git a/pkg/microservice/aslan/core/service.go b/pkg/microservice/aslan/core/service.go index 460a1fdb6..176bb1d22 100644 --- a/pkg/microservice/aslan/core/service.go +++ b/pkg/microservice/aslan/core/service.go @@ -30,6 +30,7 @@ import ( "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/mongodb/template" "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/nsq" "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/webhook" + environmenthandler "github.com/koderover/zadig/pkg/microservice/aslan/core/environment/handler" environmentservice "github.com/koderover/zadig/pkg/microservice/aslan/core/environment/service" systemrepo "github.com/koderover/zadig/pkg/microservice/aslan/core/system/repository/mongodb" systemservice "github.com/koderover/zadig/pkg/microservice/aslan/core/system/service" @@ -78,6 +79,7 @@ func registerPolicies() { for _, r := range []policyGetter{ new(workflowhandler.Router), + new(environmenthandler.Router), } { err := policyClient.CreateOrUpdatePolicy(r.Policies()) if err != nil { diff --git a/pkg/microservice/aslan/core/workflow/handler/policy.yaml b/pkg/microservice/aslan/core/workflow/handler/policy.yaml index b7d2aa5f5..d81583774 100644 --- a/pkg/microservice/aslan/core/workflow/handler/policy.yaml +++ b/pkg/microservice/aslan/core/workflow/handler/policy.yaml @@ -21,10 +21,40 @@ rules: - method: GET endpoint: "/api/aslan/logs/log/workflow/?*/tasks/?*/service/?*" - method: GET - endpoint: "/api/aslan/logs/log/workflow/:name/tasks/:taskid/tests/test/service/:serviceName" + endpoint: "/api/aslan/logs/log/workflow/?*/tasks/?*/tests/test/service/?*" - method: GET - endpoint: "/api/aslan/logs/log/workflow/:name/tasks/:taskid/tests/test/service/:testName" + endpoint: "/api/aslan/logs/log/workflow/?*/tasks/?*/tests/test/service/?*" - method: GET - endpoint: "/api/aslan/testing/itreport/workflow/:workflowName/id/:taskid/names/:workflowName-:taskid-test/service/:testName" - - method: GET - endpoint: "/api/aslan/testing/itreport/workflow/:workflowName/id/:taskid/names/:workflowName-:taskid-test/service/:testName" + endpoint: "/api/aslan/testing/itreport/workflow/?*/id/?*/names/?*/service/?*" + - action: edit_workflow + alias: "编辑工作流" + description: "" + rules: + - method: PUT + endpoint: "api/aslan/workflow/workflow" + - action: create_workflow + alias: "新建工作流" + description: "" + rules: + - method: POST + endpoint: "api/aslan/workflow/workflow" + - method: PUT + endpoint: "/api/aslan/workflow/workflow/old/?*/new/?*" + - action: delete_workflow + alias: "删除工作流" + description: "" + rules: + - method: DELETE + endpoint: "/api/aslan/workflow/workflow/?*" + - action: run_workflow + alias: "执行工作流" + description: "" + rules: + - method: POST + endpoint: "/api/aslan/workflow/workflow/?*" + - method: PUT + endpoint: "/api/aslan/workflow/workflowtask" + - method: POST + endpoint: "/api/aslan/workflow/workflowtask/id/?*/pipelines/?*/restart" + - method: DELETE + endpoint: "/api/aslan/workflow/workflowtask/id/?*/pipelines/?*" \ No newline at end of file -- Gitee From 060b94b6e91af1ef72c9be1c1dd1af6ff568f0c0 Mon Sep 17 00:00:00 2001 From: lou Date: Thu, 21 Oct 2021 14:24:16 +0800 Subject: [PATCH 077/405] fix list envs Signed-off-by: lou --- pkg/microservice/aslan/core/environment/handler/environment.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/microservice/aslan/core/environment/handler/environment.go b/pkg/microservice/aslan/core/environment/handler/environment.go index 49aa26682..187c4e118 100644 --- a/pkg/microservice/aslan/core/environment/handler/environment.go +++ b/pkg/microservice/aslan/core/environment/handler/environment.go @@ -60,7 +60,7 @@ func ListProducts(c *gin.Context) { ctx.Err = e.ErrInvalidParam return } - ctx.Resp, ctx.Err = service.ListProducts(c.Query("productName"), ctx.UserName, ctx.Logger) + ctx.Resp, ctx.Err = service.ListProducts(c.Query("projectName"), ctx.UserName, ctx.Logger) } func AutoCreateProduct(c *gin.Context) { -- Gitee From cd2fa55a2663bd3943b700db9e702d033e8bd447 Mon Sep 17 00:00:00 2001 From: lou Date: Thu, 21 Oct 2021 14:44:48 +0800 Subject: [PATCH 078/405] rename project qs Signed-off-by: lou --- .../aslan/core/build/handler/build.go | 10 ++-- .../aslan/core/build/handler/router.go | 4 +- .../aslan/core/build/handler/target.go | 2 +- .../aslan/core/delivery/handler/version.go | 6 +-- .../core/environment/handler/configmap.go | 2 +- .../core/environment/handler/environment.go | 2 +- .../aslan/core/environment/handler/export.go | 2 +- .../aslan/core/environment/handler/kube.go | 8 ++-- .../core/environment/handler/renderset.go | 8 ++-- .../core/environment/handler/revision.go | 2 +- .../aslan/core/environment/handler/router.go | 10 ++-- .../aslan/core/log/handler/log.go | 2 +- .../aslan/core/log/handler/sse.go | 4 +- .../aslan/core/project/handler/product.go | 2 +- .../aslan/core/project/handler/router.go | 6 +-- .../aslan/core/service/handler/helm.go | 2 +- .../aslan/core/service/handler/service.go | 18 +++---- .../aslan/core/system/handler/operation.go | 2 +- .../aslan/core/workflow/handler/build.go | 2 +- .../workflow/handler/favorate_pipeline.go | 2 +- .../workflow/testing/handler/test_detail.go | 2 +- .../core/workflow/testing/handler/testing.go | 8 ++-- pkg/middleware/gin/product_name.go | 47 ------------------- 23 files changed, 53 insertions(+), 100 deletions(-) delete mode 100644 pkg/middleware/gin/product_name.go diff --git a/pkg/microservice/aslan/core/build/handler/build.go b/pkg/microservice/aslan/core/build/handler/build.go index 9ae546063..b335d85f4 100644 --- a/pkg/microservice/aslan/core/build/handler/build.go +++ b/pkg/microservice/aslan/core/build/handler/build.go @@ -34,14 +34,14 @@ func FindBuildModule(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - ctx.Resp, ctx.Err = buildservice.FindBuild(c.Param("name"), c.Query("productName"), ctx.Logger) + ctx.Resp, ctx.Err = buildservice.FindBuild(c.Param("name"), c.Query("projectName"), ctx.Logger) } func ListBuildModules(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - ctx.Resp, ctx.Err = buildservice.ListBuild(c.Query("name"), c.Query("targets"), c.Query("productName"), ctx.Logger) + ctx.Resp, ctx.Err = buildservice.ListBuild(c.Query("name"), c.Query("targets"), c.Query("projectName"), ctx.Logger) } func CreateBuildModule(c *gin.Context) { @@ -96,7 +96,7 @@ func DeleteBuildModule(c *gin.Context) { defer func() { internalhandler.JSONResponse(c, ctx) }() name := c.Query("name") - productName := c.Query("productName") + productName := c.Query("projectName") internalhandler.InsertOperationLog(c, ctx.UserName, productName, "删除", "项目管理-构建", name, "", ctx.Logger) if name == "" { @@ -126,7 +126,7 @@ func UpdateBuildTargets(c *gin.Context) { ctx.Err = e.ErrInvalidParam.AddErr(err) return } - internalhandler.InsertOperationLog(c, ctx.UserName, c.Query("productName"), "更新", "项目管理-服务组件", args.Name, string(data), ctx.Logger) + internalhandler.InsertOperationLog(c, ctx.UserName, c.Query("projectName"), "更新", "项目管理-服务组件", args.Name, string(data), ctx.Logger) c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(data)) if err := c.BindJSON(args); err != nil { @@ -134,5 +134,5 @@ func UpdateBuildTargets(c *gin.Context) { return } - ctx.Err = buildservice.UpdateBuildTargets(args.Name, c.Query("productName"), args.Targets, ctx.Logger) + ctx.Err = buildservice.UpdateBuildTargets(args.Name, c.Query("projectName"), args.Targets, ctx.Logger) } diff --git a/pkg/microservice/aslan/core/build/handler/router.go b/pkg/microservice/aslan/core/build/handler/router.go index 090d6516e..44811e7d3 100644 --- a/pkg/microservice/aslan/core/build/handler/router.go +++ b/pkg/microservice/aslan/core/build/handler/router.go @@ -29,8 +29,8 @@ func (*Router) Inject(router *gin.RouterGroup) { { build.GET("/:name", FindBuildModule) build.GET("", ListBuildModules) - build.POST("", gin2.StoreProductName, gin2.UpdateOperationLogStatus, CreateBuildModule) - build.PUT("", gin2.StoreProductName, gin2.UpdateOperationLogStatus, UpdateBuildModule) + build.POST("", gin2.UpdateOperationLogStatus, CreateBuildModule) + build.PUT("", gin2.UpdateOperationLogStatus, UpdateBuildModule) build.DELETE("", gin2.UpdateOperationLogStatus, DeleteBuildModule) build.POST("/targets", gin2.UpdateOperationLogStatus, UpdateBuildTargets) } diff --git a/pkg/microservice/aslan/core/build/handler/target.go b/pkg/microservice/aslan/core/build/handler/target.go index 71f5e1600..2978c4020 100644 --- a/pkg/microservice/aslan/core/build/handler/target.go +++ b/pkg/microservice/aslan/core/build/handler/target.go @@ -27,7 +27,7 @@ func ListDeployTarget(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - ctx.Resp, ctx.Err = buildservice.ListDeployTarget(c.Query("productName"), ctx.Logger) + ctx.Resp, ctx.Err = buildservice.ListDeployTarget(c.Query("projectName"), ctx.Logger) } func ListBuildModulesForProduct(c *gin.Context) { diff --git a/pkg/microservice/aslan/core/delivery/handler/version.go b/pkg/microservice/aslan/core/delivery/handler/version.go index 6fa620215..920e2e526 100644 --- a/pkg/microservice/aslan/core/delivery/handler/version.go +++ b/pkg/microservice/aslan/core/delivery/handler/version.go @@ -144,7 +144,7 @@ func ListDeliveryVersion(c *gin.Context) { version := new(commonrepo.DeliveryVersionArgs) version.OrgID = orgID - version.ProductName = c.Query("productName") + version.ProductName = c.Query("projectName") version.WorkflowName = c.Query("workflowName") version.TaskID = taskID version.PerPage = perPage @@ -295,7 +295,7 @@ func ListPackagesVersion(c *gin.Context) { } version := &commonrepo.DeliveryVersionArgs{ OrgID: orgID, - ProductName: c.Query("productName"), + ProductName: c.Query("projectName"), } deliveryVersions, err := deliveryservice.FindDeliveryVersion(version, ctx.Logger) if err != nil { @@ -382,7 +382,7 @@ func ListDeliveryServiceNames(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - productName := c.Query("productName") + productName := c.Query("projectName") orgIDStr := c.Query("orgId") orgID, err := strconv.Atoi(orgIDStr) if err != nil { diff --git a/pkg/microservice/aslan/core/environment/handler/configmap.go b/pkg/microservice/aslan/core/environment/handler/configmap.go index 976997320..bb75e30fa 100644 --- a/pkg/microservice/aslan/core/environment/handler/configmap.go +++ b/pkg/microservice/aslan/core/environment/handler/configmap.go @@ -36,7 +36,7 @@ func ListConfigMaps(c *gin.Context) { args := &service.ListConfigMapArgs{ EnvName: c.Query("envName"), - ProductName: c.Query("productName"), + ProductName: c.Query("projectName"), ServiceName: c.Query("serviceName"), } diff --git a/pkg/microservice/aslan/core/environment/handler/environment.go b/pkg/microservice/aslan/core/environment/handler/environment.go index 187c4e118..696575153 100644 --- a/pkg/microservice/aslan/core/environment/handler/environment.go +++ b/pkg/microservice/aslan/core/environment/handler/environment.go @@ -399,7 +399,7 @@ func GetEstimatedRenderCharts(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - productName := c.Query("productName") + productName := c.Query("projectName") if productName == "" { ctx.Err = e.ErrInvalidParam.AddDesc("productName can't be empty!") } diff --git a/pkg/microservice/aslan/core/environment/handler/export.go b/pkg/microservice/aslan/core/environment/handler/export.go index 6f0a9917c..7419254fc 100644 --- a/pkg/microservice/aslan/core/environment/handler/export.go +++ b/pkg/microservice/aslan/core/environment/handler/export.go @@ -29,7 +29,7 @@ func ExportYaml(c *gin.Context) { serviceName := c.Query("serviceName") envName := c.Query("envName") - productName := c.Query("productName") + productName := c.Query("projectName") ctx.Resp = service.ExportYaml(envName, productName, serviceName, ctx.Logger) } diff --git a/pkg/microservice/aslan/core/environment/handler/kube.go b/pkg/microservice/aslan/core/environment/handler/kube.go index af5bfcc0a..1e4c0c481 100644 --- a/pkg/microservice/aslan/core/environment/handler/kube.go +++ b/pkg/microservice/aslan/core/environment/handler/kube.go @@ -38,7 +38,7 @@ func ListKubeEvents(c *gin.Context) { defer func() { internalhandler.JSONResponse(c, ctx) }() envName := c.Query("envName") - productName := c.Query("productName") + productName := c.Query("projectName") name := c.Query("name") rtype := c.Query("type") @@ -81,9 +81,9 @@ func DeletePod(c *gin.Context) { podName := c.Param("podName") envName := c.Query("envName") - productName := c.Query("productName") + productName := c.Query("projectName") - internalhandler.InsertOperationLog(c, ctx.UserName, c.Query("productName"), "重启", "集成环境-服务实例", fmt.Sprintf("环境名称:%s,pod名称:%s", c.Query("envName"), c.Param("podName")), "", ctx.Logger) + internalhandler.InsertOperationLog(c, ctx.UserName, c.Query("projectName"), "重启", "集成环境-服务实例", fmt.Sprintf("环境名称:%s,pod名称:%s", c.Query("envName"), c.Param("podName")), "", ctx.Logger) ctx.Err = service.DeletePod(envName, productName, podName, ctx.Logger) } @@ -92,7 +92,7 @@ func ListPodEvents(c *gin.Context) { defer func() { internalhandler.JSONResponse(c, ctx) }() envName := c.Query("envName") - productName := c.Query("productName") + productName := c.Query("projectName") podName := c.Param("podName") ctx.Resp, ctx.Err = service.ListPodEvents(envName, productName, podName, ctx.Logger) diff --git a/pkg/microservice/aslan/core/environment/handler/renderset.go b/pkg/microservice/aslan/core/environment/handler/renderset.go index b7b6e6e85..851f03327 100644 --- a/pkg/microservice/aslan/core/environment/handler/renderset.go +++ b/pkg/microservice/aslan/core/environment/handler/renderset.go @@ -32,7 +32,7 @@ func GetServiceRenderCharts(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - if c.Query("productName") == "" { + if c.Query("projectName") == "" { ctx.Err = e.ErrInvalidParam.AddDesc("productName can not be null!") return } @@ -42,14 +42,14 @@ func GetServiceRenderCharts(c *gin.Context) { return } - ctx.Resp, ctx.Err = service.GetRenderCharts(c.Query("productName"), c.Query("envName"), c.Query("serviceName"), ctx.Logger) + ctx.Resp, ctx.Err = service.GetRenderCharts(c.Query("projectName"), c.Query("envName"), c.Query("serviceName"), ctx.Logger) } func CreateOrUpdateRenderChart(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - if c.Query("productName") == "" { + if c.Query("projectName") == "" { ctx.Err = e.ErrInvalidParam.AddDesc("productName can not be null!") return } @@ -71,5 +71,5 @@ func CreateOrUpdateRenderChart(c *gin.Context) { } internalhandler.InsertOperationLog(c, ctx.UserName, c.Param("productName"), "新增", "环境变量", c.Query("envName"), string(data), ctx.Logger) - ctx.Err = service.CreateOrUpdateChartValues(c.Query("productName"), c.Query("envName"), args, ctx.UserName, ctx.RequestID, ctx.Logger) + ctx.Err = service.CreateOrUpdateChartValues(c.Query("projectName"), c.Query("envName"), args, ctx.UserName, ctx.RequestID, ctx.Logger) } diff --git a/pkg/microservice/aslan/core/environment/handler/revision.go b/pkg/microservice/aslan/core/environment/handler/revision.go index e27eb50b6..fa35d6898 100644 --- a/pkg/microservice/aslan/core/environment/handler/revision.go +++ b/pkg/microservice/aslan/core/environment/handler/revision.go @@ -32,5 +32,5 @@ func ListProductsRevision(c *gin.Context) { ctx.Resp, ctx.Err = service.ListProductsRevisionByFacility(c.Query("basicFacility"), ctx.Logger) return } - ctx.Resp, ctx.Err = service.ListProductsRevision(c.Query("productName"), c.Query("envName"), ctx.Logger) + ctx.Resp, ctx.Err = service.ListProductsRevision(c.Query("projectName"), c.Query("envName"), ctx.Logger) } diff --git a/pkg/microservice/aslan/core/environment/handler/router.go b/pkg/microservice/aslan/core/environment/handler/router.go index d68c536a7..5005916b6 100644 --- a/pkg/microservice/aslan/core/environment/handler/router.go +++ b/pkg/microservice/aslan/core/environment/handler/router.go @@ -31,8 +31,8 @@ func (*Router) Inject(router *gin.RouterGroup) { configmaps := router.Group("configmaps") { configmaps.GET("", ListConfigMaps) - configmaps.PUT("", gin2.StoreProductName, gin2.UpdateOperationLogStatus, UpdateConfigMap) - configmaps.POST("", gin2.StoreProductName, gin2.UpdateOperationLogStatus, RollBackConfigMap) + configmaps.PUT("", gin2.UpdateOperationLogStatus, UpdateConfigMap) + configmaps.POST("", gin2.UpdateOperationLogStatus, RollBackConfigMap) } // --------------------------------------------------------------------------------------- @@ -96,10 +96,10 @@ func (*Router) Inject(router *gin.RouterGroup) { environments.GET("", ListProducts) environments.POST("/:productName/auto", AutoCreateProduct) environments.PUT("/:productName/autoUpdate", gin2.UpdateOperationLogStatus, AutoUpdateProduct) - environments.POST("", gin2.StoreProductName, gin2.UpdateOperationLogStatus, CreateProduct) + environments.POST("", gin2.UpdateOperationLogStatus, CreateProduct) - environments.POST("/:productName/helm", gin2.StoreProductName, gin2.UpdateOperationLogStatus, CreateHelmProduct) - environments.PUT("/:productName/multiHelmEnv", gin2.StoreProductName, gin2.UpdateOperationLogStatus, UpdateMultiHelmEnv) + environments.POST("/:productName/helm", gin2.UpdateOperationLogStatus, CreateHelmProduct) + environments.PUT("/:productName/multiHelmEnv", gin2.UpdateOperationLogStatus, UpdateMultiHelmEnv) environments.POST("/:productName", gin2.UpdateOperationLogStatus, UpdateProduct) environments.PUT("/:productName/envRecycle", gin2.UpdateOperationLogStatus, UpdateProductRecycleDay) diff --git a/pkg/microservice/aslan/core/log/handler/log.go b/pkg/microservice/aslan/core/log/handler/log.go index 6627420d3..648d85880 100644 --- a/pkg/microservice/aslan/core/log/handler/log.go +++ b/pkg/microservice/aslan/core/log/handler/log.go @@ -94,7 +94,7 @@ func GetContainerLogs(c *gin.Context) { podName := c.Param("name") containerName := c.Query("container") envName := c.Query("envName") - productName := c.Query("productName") + productName := c.Query("projectName") tailLines, err := strconv.ParseInt(c.Query("tailLines"), 10, 64) if err != nil { diff --git a/pkg/microservice/aslan/core/log/handler/sse.go b/pkg/microservice/aslan/core/log/handler/sse.go index 7293d4360..2ac7c8326 100644 --- a/pkg/microservice/aslan/core/log/handler/sse.go +++ b/pkg/microservice/aslan/core/log/handler/sse.go @@ -39,7 +39,7 @@ func GetContainerLogsSSE(c *gin.Context) { } envName := c.Query("envName") - productName := c.Query("productName") + productName := c.Query("projectName") internalhandler.Stream(c, func(ctx context.Context, streamChan chan interface{}) { logservice.ContainerLogStream(ctx, streamChan, envName, productName, c.Param("podName"), c.Param("containerName"), true, tails, logger) @@ -102,7 +102,7 @@ func GetWorkflowBuildJobContainerLogsSSE(c *gin.Context) { ServiceName: c.Param("serviceName"), PipelineType: string(config.WorkflowType), EnvName: c.Query("envName"), - ProductName: c.Query("productName"), + ProductName: c.Query("projectName"), } internalhandler.Stream(c, func(ctx1 context.Context, streamChan chan interface{}) { diff --git a/pkg/microservice/aslan/core/project/handler/product.go b/pkg/microservice/aslan/core/project/handler/product.go index 1f78b1b4f..dee7e863b 100644 --- a/pkg/microservice/aslan/core/project/handler/product.go +++ b/pkg/microservice/aslan/core/project/handler/product.go @@ -125,7 +125,7 @@ func UpdateProject(c *gin.Context) { return } args.UpdateBy = ctx.UserName - productName := c.Query("productName") + productName := c.Query("projectName") if productName == "" { ctx.Err = e.ErrInvalidParam.AddDesc("productName can't be empty") return diff --git a/pkg/microservice/aslan/core/project/handler/router.go b/pkg/microservice/aslan/core/project/handler/router.go index bc9bdc53d..d0131340c 100644 --- a/pkg/microservice/aslan/core/project/handler/router.go +++ b/pkg/microservice/aslan/core/project/handler/router.go @@ -40,11 +40,11 @@ func (*Router) Inject(router *gin.RouterGroup) { product.GET("/:name", GetProductTemplate) product.GET("/:name/services", GetProductTemplateServices) product.GET("/:name/searching-rules", GetCustomMatchRules) - product.PUT("/:name/searching-rules", gin2.StoreProductName, gin2.UpdateOperationLogStatus, CreateOrUpdateMatchRules) - product.POST("", gin2.StoreProductName, gin2.UpdateOperationLogStatus, CreateProductTemplate) + product.PUT("/:name/searching-rules", gin2.UpdateOperationLogStatus, CreateOrUpdateMatchRules) + product.POST("", gin2.UpdateOperationLogStatus, CreateProductTemplate) product.PUT("/:name", gin2.UpdateOperationLogStatus, UpdateProductTemplate) product.PUT("/:name/:status", gin2.UpdateOperationLogStatus, UpdateProductTmplStatus) - product.PUT("", gin2.StoreProductName, gin2.UpdateOperationLogStatus, UpdateProject) + product.PUT("", gin2.UpdateOperationLogStatus, UpdateProject) product.DELETE("/:name", gin2.UpdateOperationLogStatus, DeleteProductTemplate) product.PATCH("/:name", UpdateServiceOrchestration) } diff --git a/pkg/microservice/aslan/core/service/handler/helm.go b/pkg/microservice/aslan/core/service/handler/helm.go index c57b789b1..0ce5f006e 100644 --- a/pkg/microservice/aslan/core/service/handler/helm.go +++ b/pkg/microservice/aslan/core/service/handler/helm.go @@ -66,7 +66,7 @@ func CreateOrUpdateHelmService(c *gin.Context) { } args.CreatedBy = ctx.UserName - ctx.Err = svcservice.CreateOrUpdateHelmService(c.Query("productName"), args, ctx.Logger) + ctx.Err = svcservice.CreateOrUpdateHelmService(c.Query("projectName"), args, ctx.Logger) } func UpdateHelmService(c *gin.Context) { diff --git a/pkg/microservice/aslan/core/service/handler/service.go b/pkg/microservice/aslan/core/service/handler/service.go index cfbd66803..cf7475516 100644 --- a/pkg/microservice/aslan/core/service/handler/service.go +++ b/pkg/microservice/aslan/core/service/handler/service.go @@ -39,13 +39,13 @@ func ListServiceTemplate(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - ctx.Resp, ctx.Err = commonservice.ListServiceTemplate(c.Query("productName"), ctx.Logger) + ctx.Resp, ctx.Err = commonservice.ListServiceTemplate(c.Query("projectName"), ctx.Logger) } func ListWorkloadTemplate(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - ctx.Resp, ctx.Err = commonservice.ListWorkloadTemplate(c.Query("productName"), c.Query("env"), ctx.Logger) + ctx.Resp, ctx.Err = commonservice.ListWorkloadTemplate(c.Query("projectName"), c.Query("env"), ctx.Logger) } func GetServiceTemplate(c *gin.Context) { @@ -56,7 +56,7 @@ func GetServiceTemplate(c *gin.Context) { ctx.Err = e.ErrInvalidParam.AddDesc("invalid revision number") return } - ctx.Resp, ctx.Err = commonservice.GetServiceTemplate(c.Param("name"), c.Param("type"), c.Query("productName"), setting.ProductStatusDeleting, revision, ctx.Logger) + ctx.Resp, ctx.Err = commonservice.GetServiceTemplate(c.Param("name"), c.Param("type"), c.Query("projectName"), setting.ProductStatusDeleting, revision, ctx.Logger) } func GetServiceTemplateOption(c *gin.Context) { @@ -67,7 +67,7 @@ func GetServiceTemplateOption(c *gin.Context) { ctx.Err = e.ErrInvalidParam.AddDesc("invalid revision number") return } - ctx.Resp, ctx.Err = svcservice.GetServiceTemplateOption(c.Param("name"), c.Query("productName"), revision, ctx.Logger) + ctx.Resp, ctx.Err = svcservice.GetServiceTemplateOption(c.Param("name"), c.Query("projectName"), revision, ctx.Logger) } func CreateServiceTemplate(c *gin.Context) { @@ -139,9 +139,9 @@ func DeleteServiceTemplate(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - internalhandler.InsertOperationLog(c, ctx.UserName, c.Query("productName"), "删除", "项目管理-服务", c.Param("name"), "", ctx.Logger) + internalhandler.InsertOperationLog(c, ctx.UserName, c.Query("projectName"), "删除", "项目管理-服务", c.Param("name"), "", ctx.Logger) - ctx.Err = svcservice.DeleteServiceTemplate(c.Param("name"), c.Param("type"), c.Query("productName"), c.DefaultQuery("isEnvTemplate", "true"), c.DefaultQuery("visibility", "public"), ctx.Logger) + ctx.Err = svcservice.DeleteServiceTemplate(c.Param("name"), c.Param("type"), c.Query("projectName"), c.DefaultQuery("isEnvTemplate", "true"), c.DefaultQuery("visibility", "public"), ctx.Logger) } func ListServicePort(c *gin.Context) { @@ -152,7 +152,7 @@ func ListServicePort(c *gin.Context) { ctx.Err = e.ErrInvalidParam.AddDesc("invalid revision number") return } - ctx.Resp, ctx.Err = svcservice.ListServicePort(c.Param("name"), c.Param("type"), c.Query("productName"), setting.ProductStatusDeleting, revision, ctx.Logger) + ctx.Resp, ctx.Err = svcservice.ListServicePort(c.Param("name"), c.Param("type"), c.Query("projectName"), setting.ProductStatusDeleting, revision, ctx.Logger) } type K8sWorkloadsArgs struct { @@ -172,7 +172,7 @@ func UpdateWorkloads(c *gin.Context) { ctx.Err = e.ErrInvalidParam.AddDesc("invalid UpdateWorkloadsArgs") return } - product := c.Query("productName") + product := c.Query("projectName") env := c.Query("env") if product == "" || env == "" { ctx.Err = e.ErrInvalidParam @@ -197,7 +197,7 @@ func ListAvailablePublicServices(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - ctx.Resp, ctx.Err = svcservice.ListAvailablePublicServices(c.Query("productName"), ctx.Logger) + ctx.Resp, ctx.Err = svcservice.ListAvailablePublicServices(c.Query("projectName"), ctx.Logger) } func GetServiceTemplateProductName(c *gin.Context) { diff --git a/pkg/microservice/aslan/core/system/handler/operation.go b/pkg/microservice/aslan/core/system/handler/operation.go index d4d97b775..10547c2dd 100644 --- a/pkg/microservice/aslan/core/system/handler/operation.go +++ b/pkg/microservice/aslan/core/system/handler/operation.go @@ -51,7 +51,7 @@ func GetOperationLogs(c *gin.Context) { args := &service.OperationLogArgs{ Username: c.Query("username"), - ProductName: c.Query("product_name"), + ProductName: c.Query("projectName"), Function: c.Query("function"), Status: status, PerPage: perPage, diff --git a/pkg/microservice/aslan/core/workflow/handler/build.go b/pkg/microservice/aslan/core/workflow/handler/build.go index c3c2b7f6a..2fed933db 100644 --- a/pkg/microservice/aslan/core/workflow/handler/build.go +++ b/pkg/microservice/aslan/core/workflow/handler/build.go @@ -27,7 +27,7 @@ func BuildModuleToSubTasks(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - resp, err := workflow.BuildModuleToSubTasks(c.Param("name"), "", "", c.Query("productName"), nil, nil, ctx.Logger) + resp, err := workflow.BuildModuleToSubTasks(c.Param("name"), "", "", c.Query("projectName"), nil, nil, ctx.Logger) if err != nil { ctx.Err = err return diff --git a/pkg/microservice/aslan/core/workflow/handler/favorate_pipeline.go b/pkg/microservice/aslan/core/workflow/handler/favorate_pipeline.go index f4d5a4c25..0574ffd50 100644 --- a/pkg/microservice/aslan/core/workflow/handler/favorate_pipeline.go +++ b/pkg/microservice/aslan/core/workflow/handler/favorate_pipeline.go @@ -35,7 +35,7 @@ func ListFavoritePipelines(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - productName := c.Query("productName") + productName := c.Query("projectName") workflowType := c.Query("type") if workflowType == "" { ctx.Err = e.ErrInvalidParam.AddDesc("type can't be empty!") diff --git a/pkg/microservice/aslan/core/workflow/testing/handler/test_detail.go b/pkg/microservice/aslan/core/workflow/testing/handler/test_detail.go index 02295c3e8..492db2a97 100644 --- a/pkg/microservice/aslan/core/workflow/testing/handler/test_detail.go +++ b/pkg/microservice/aslan/core/workflow/testing/handler/test_detail.go @@ -27,5 +27,5 @@ func ListDetailTestModules(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - ctx.Resp, ctx.Err = service.ListTestingDetails(c.Query("productName"), ctx.Logger) + ctx.Resp, ctx.Err = service.ListTestingDetails(c.Query("projectName"), ctx.Logger) } diff --git a/pkg/microservice/aslan/core/workflow/testing/handler/testing.go b/pkg/microservice/aslan/core/workflow/testing/handler/testing.go index 7b70976d1..33837f805 100644 --- a/pkg/microservice/aslan/core/workflow/testing/handler/testing.go +++ b/pkg/microservice/aslan/core/workflow/testing/handler/testing.go @@ -99,7 +99,7 @@ func ListTestModules(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - ctx.Resp, ctx.Err = service.ListTestingOpt(c.Query("productName"), c.Query("testType"), ctx.Logger) + ctx.Resp, ctx.Err = service.ListTestingOpt(c.Query("projectName"), c.Query("testType"), ctx.Logger) } func GetTestModule(c *gin.Context) { @@ -112,14 +112,14 @@ func GetTestModule(c *gin.Context) { ctx.Err = e.ErrInvalidParam.AddDesc("empty Name") return } - ctx.Resp, ctx.Err = service.GetTesting(name, c.Query("productName"), ctx.Logger) + ctx.Resp, ctx.Err = service.GetTesting(name, c.Query("projectName"), ctx.Logger) } func DeleteTestModule(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - internalhandler.InsertOperationLog(c, ctx.UserName, c.Query("productName"), "删除", "项目管理-测试", c.Param("name"), "", ctx.Logger) + internalhandler.InsertOperationLog(c, ctx.UserName, c.Query("projectName"), "删除", "项目管理-测试", c.Param("name"), "", ctx.Logger) name := c.Param("name") if name == "" { @@ -127,7 +127,7 @@ func DeleteTestModule(c *gin.Context) { return } - ctx.Err = service.DeleteTestModule(name, c.Query("productName"), ctx.RequestID, ctx.Logger) + ctx.Err = service.DeleteTestModule(name, c.Query("projectName"), ctx.RequestID, ctx.Logger) } func GetHTMLTestReport(c *gin.Context) { diff --git a/pkg/middleware/gin/product_name.go b/pkg/middleware/gin/product_name.go deleted file mode 100644 index d66bff404..000000000 --- a/pkg/middleware/gin/product_name.go +++ /dev/null @@ -1,47 +0,0 @@ -/* -Copyright 2021 The KodeRover 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 gin - -import ( - "bytes" - "encoding/json" - "io/ioutil" - - "github.com/gin-gonic/gin" - - "github.com/koderover/zadig/pkg/tool/log" -) - -type productName struct { - ProductName string `json:"product_name"` -} - -func StoreProductName(c *gin.Context) { - pn := &productName{} - data, err := c.GetRawData() - if err != nil { - log.Errorf("c.GetRawData() err : %v", err) - return - } - if err = json.Unmarshal(data, pn); err != nil { - log.Errorf("json.Unmarshal err : %v", err) - return - } - c.Set("productName", pn.ProductName) - c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(data)) - c.Next() -} -- Gitee From c2f6408a8a4e470805cd3f7e8982f23a6f2a6e41 Mon Sep 17 00:00:00 2001 From: mouuii Date: Thu, 21 Oct 2021 14:52:01 +0800 Subject: [PATCH 079/405] add service handler Signed-off-by: mouuii --- pkg/microservice/aslan/core/service.go | 2 + .../aslan/core/service/handler/policy.yaml | 92 +++++++++++++++++++ .../service/handler/policy_definitions.go | 24 +++++ 3 files changed, 118 insertions(+) create mode 100644 pkg/microservice/aslan/core/service/handler/policy.yaml create mode 100644 pkg/microservice/aslan/core/service/handler/policy_definitions.go diff --git a/pkg/microservice/aslan/core/service.go b/pkg/microservice/aslan/core/service.go index 176bb1d22..d42799ceb 100644 --- a/pkg/microservice/aslan/core/service.go +++ b/pkg/microservice/aslan/core/service.go @@ -32,6 +32,7 @@ import ( "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/webhook" environmenthandler "github.com/koderover/zadig/pkg/microservice/aslan/core/environment/handler" environmentservice "github.com/koderover/zadig/pkg/microservice/aslan/core/environment/service" + servicehandler "github.com/koderover/zadig/pkg/microservice/aslan/core/service/handler" systemrepo "github.com/koderover/zadig/pkg/microservice/aslan/core/system/repository/mongodb" systemservice "github.com/koderover/zadig/pkg/microservice/aslan/core/system/service" workflowhandler "github.com/koderover/zadig/pkg/microservice/aslan/core/workflow/handler" @@ -80,6 +81,7 @@ func registerPolicies() { for _, r := range []policyGetter{ new(workflowhandler.Router), new(environmenthandler.Router), + new(servicehandler.Router), } { err := policyClient.CreateOrUpdatePolicy(r.Policies()) if err != nil { diff --git a/pkg/microservice/aslan/core/service/handler/policy.yaml b/pkg/microservice/aslan/core/service/handler/policy.yaml new file mode 100644 index 000000000..31ce7a5fe --- /dev/null +++ b/pkg/microservice/aslan/core/service/handler/policy.yaml @@ -0,0 +1,92 @@ +resource: Service +alias: "服务" +description: "" +rules: + - action: get_service + alias: "查看服务" + description: "" + rules: + - method: GET + endpoint: "/api/aslan/service/services" + - method: GET + endpoint: "/api/aslan/service/services/?*/k8s" + - method: GET + endpoint: "/api/aslan/project/products/?*/services" + - method: GET + endpoint: "/api/aslan/service/services/?*" + - method: GET + endpoint: "/api/aslan/service/name" + - method: GET + endpoint: "/api/aslan/project/products/?*/searching-rules" + - method: GET + endpoint: "/api/aslan/service/helm/?*/?*/filePath" + - method: GET + endpoint: "/api/aslan/service/helm/?*/?*/fileContent" + - method: GET + endpoint: "/api/aslan/service/helm/?*/?*/serviceModule" + - action: edit_service + alias: "编辑服务" + description: "" + rules: + - method: POST + endpoint: "/api/aslan/service/helm/services" + - method: POST + endpoint: "/api/aslan/service/helm/?*" + - method: PUT + endpoint: "/api/aslan/service/services" + - method: PUT + endpoint: " /api/aslan/service/services/yaml/validator" + - method: PUT + endpoint: "/api/aslan/service/pm/?*" + - method: PUT + endpoint: "/api/aslan/project/products/?*" + - method: PATCH + endpoint: "/api/aslan/project/products/?*" + - method: PUT + endpoint: "/api/aslan/project/products/?*/searching-rules" + - action: create_service + alias: "新建服务" + description: "" + rules: + - method: POST + endpoint: "/api/aslan/service/pm/?*" + - method: POST + endpoint: "/api/aslan/service/services" + - action: delete_service + alias: "删除服务" + description: "" + rules: + - method: DELETE + endpoint: "/api/aslan/service/services/?*/?*" + - method: DELETE + endpoint: "/api/aslan/service/services/?*/pm" + - action: get_build + alias: "查看构建配置" + description: "" + rules: + - method: GET + endpoint: "/api/aslan/build/build" + - method: GET + endpoint: "/api/aslan/build/build/?*" + - method: GET + endpoint: "/api/aslan/build/targets" + - action: create_build + alias: "创建构建配置" + description: "" + rules: + - method: POST + endpoint: "/api/aslan/build/build" + - action: edit_build + alias: "编辑构建配置" + description: "" + rules: + - method: PUT + endpoint: "/api/aslan/build/build" + - method: POST + endpoint: "/api/aslan/build/targets" + - action: delete_build + alias: "删除构建配置" + description: "" + rules: + - method: DELETE + endpoint: "/api/aslan/build/build" \ No newline at end of file diff --git a/pkg/microservice/aslan/core/service/handler/policy_definitions.go b/pkg/microservice/aslan/core/service/handler/policy_definitions.go new file mode 100644 index 000000000..a434ba1dd --- /dev/null +++ b/pkg/microservice/aslan/core/service/handler/policy_definitions.go @@ -0,0 +1,24 @@ +package handler + +import ( + _ "embed" + + "sigs.k8s.io/yaml" + + "github.com/koderover/zadig/pkg/shared/client/policy" + "github.com/koderover/zadig/pkg/tool/log" +) + +//go:embed policy.yaml +var policyDefinitions []byte + +func (*Router) Policies() *policy.Policy { + res := &policy.Policy{} + err := yaml.Unmarshal(policyDefinitions, res) + if err != nil { + // should not have happened here + log.DPanic(err) + } + + return res +} -- Gitee From 69a4e3833ff9bfbde520efeac9e2de2cc4ab4250 Mon Sep 17 00:00:00 2001 From: mouuii Date: Thu, 21 Oct 2021 15:06:00 +0800 Subject: [PATCH 080/405] add delivery handler Signed-off-by: mouuii --- .../aslan/core/delivery/handler/policy.yaml | 16 +++++++++ .../delivery/handler/policy_definitions.go | 24 +++++++++++++ pkg/microservice/aslan/core/service.go | 4 +++ .../core/workflow/testing/handler/policy.yaml | 34 +++++++++++++++++++ .../testing/handler/policy_definitions.go | 24 +++++++++++++ 5 files changed, 102 insertions(+) create mode 100644 pkg/microservice/aslan/core/delivery/handler/policy.yaml create mode 100644 pkg/microservice/aslan/core/delivery/handler/policy_definitions.go create mode 100644 pkg/microservice/aslan/core/workflow/testing/handler/policy.yaml create mode 100644 pkg/microservice/aslan/core/workflow/testing/handler/policy_definitions.go diff --git a/pkg/microservice/aslan/core/delivery/handler/policy.yaml b/pkg/microservice/aslan/core/delivery/handler/policy.yaml new file mode 100644 index 000000000..b6d2a5b6c --- /dev/null +++ b/pkg/microservice/aslan/core/delivery/handler/policy.yaml @@ -0,0 +1,16 @@ +resource: Delivery +alias: "交付" +description: "" +rules: + - action: get_delivery + alias: "查看版本" + description: "" + rules: + - method: GET + endpoint: "/api/aslan/delivery/releases" + - action: delete_delivery + alias: "删除版本" + description: "" + rules: + - method: DELETE + endpoint: "/api/aslan/delivery/releases/?*" \ No newline at end of file diff --git a/pkg/microservice/aslan/core/delivery/handler/policy_definitions.go b/pkg/microservice/aslan/core/delivery/handler/policy_definitions.go new file mode 100644 index 000000000..a434ba1dd --- /dev/null +++ b/pkg/microservice/aslan/core/delivery/handler/policy_definitions.go @@ -0,0 +1,24 @@ +package handler + +import ( + _ "embed" + + "sigs.k8s.io/yaml" + + "github.com/koderover/zadig/pkg/shared/client/policy" + "github.com/koderover/zadig/pkg/tool/log" +) + +//go:embed policy.yaml +var policyDefinitions []byte + +func (*Router) Policies() *policy.Policy { + res := &policy.Policy{} + err := yaml.Unmarshal(policyDefinitions, res) + if err != nil { + // should not have happened here + log.DPanic(err) + } + + return res +} diff --git a/pkg/microservice/aslan/core/service.go b/pkg/microservice/aslan/core/service.go index d42799ceb..a99f21bc6 100644 --- a/pkg/microservice/aslan/core/service.go +++ b/pkg/microservice/aslan/core/service.go @@ -30,6 +30,7 @@ import ( "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/mongodb/template" "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/nsq" "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/webhook" + deliveryhandler "github.com/koderover/zadig/pkg/microservice/aslan/core/delivery/handler" environmenthandler "github.com/koderover/zadig/pkg/microservice/aslan/core/environment/handler" environmentservice "github.com/koderover/zadig/pkg/microservice/aslan/core/environment/service" servicehandler "github.com/koderover/zadig/pkg/microservice/aslan/core/service/handler" @@ -37,6 +38,7 @@ import ( systemservice "github.com/koderover/zadig/pkg/microservice/aslan/core/system/service" workflowhandler "github.com/koderover/zadig/pkg/microservice/aslan/core/workflow/handler" workflowservice "github.com/koderover/zadig/pkg/microservice/aslan/core/workflow/service/workflow" + testinghandler "github.com/koderover/zadig/pkg/microservice/aslan/core/workflow/testing/handler" "github.com/koderover/zadig/pkg/setting" "github.com/koderover/zadig/pkg/shared/client/policy" "github.com/koderover/zadig/pkg/tool/log" @@ -82,6 +84,8 @@ func registerPolicies() { new(workflowhandler.Router), new(environmenthandler.Router), new(servicehandler.Router), + new(testinghandler.Router), + new(deliveryhandler.Router), } { err := policyClient.CreateOrUpdatePolicy(r.Policies()) if err != nil { diff --git a/pkg/microservice/aslan/core/workflow/testing/handler/policy.yaml b/pkg/microservice/aslan/core/workflow/testing/handler/policy.yaml new file mode 100644 index 000000000..b74792628 --- /dev/null +++ b/pkg/microservice/aslan/core/workflow/testing/handler/policy.yaml @@ -0,0 +1,34 @@ +resource: Test +alias: "测试" +description: "" +rules: + - action: get_test + alias: "查看测试" + description: "" + rules: + - method: GET + endpoint: "/api/aslan/testing/test" + - method: GET + endpoint: "/api/aslan/testing/test/?*" + - method: GET + endpoint: "/api/aslan/testing/testdetail" + - method: GET + endpoint: "/api/aslan/workflow/workflow/testName/?*" + - action: edit_test + alias: "编辑测试" + description: "" + rules: + - method: PUT + endpoint: "/api/aslan/testing/test" + - action: delete_test + alias: "删除测试" + description: "" + rules: + - method: DELETE + endpoint: "/api/aslan/testing/test/?*" + - action: create_test + alias: "新建测试" + description: "" + rules: + - method: POST + endpoint: "/api/aslan/testing/test" diff --git a/pkg/microservice/aslan/core/workflow/testing/handler/policy_definitions.go b/pkg/microservice/aslan/core/workflow/testing/handler/policy_definitions.go new file mode 100644 index 000000000..a434ba1dd --- /dev/null +++ b/pkg/microservice/aslan/core/workflow/testing/handler/policy_definitions.go @@ -0,0 +1,24 @@ +package handler + +import ( + _ "embed" + + "sigs.k8s.io/yaml" + + "github.com/koderover/zadig/pkg/shared/client/policy" + "github.com/koderover/zadig/pkg/tool/log" +) + +//go:embed policy.yaml +var policyDefinitions []byte + +func (*Router) Policies() *policy.Policy { + res := &policy.Policy{} + err := yaml.Unmarshal(policyDefinitions, res) + if err != nil { + // should not have happened here + log.DPanic(err) + } + + return res +} -- Gitee From 89757967e7efe3c1e6bcf25da448aa076f1606a7 Mon Sep 17 00:00:00 2001 From: mouuii Date: Thu, 21 Oct 2021 15:55:15 +0800 Subject: [PATCH 081/405] rename Signed-off-by: mouuii --- .../aslan/core/delivery/handler/policy.yaml | 2 +- .../aslan/core/environment/handler/policy.yaml | 10 +++++----- .../aslan/core/service/handler/policy.yaml | 4 ++-- .../aslan/core/workflow/handler/policy.yaml | 2 ++ .../aslan/core/workflow/testing/handler/policy.yaml | 2 +- 5 files changed, 11 insertions(+), 9 deletions(-) diff --git a/pkg/microservice/aslan/core/delivery/handler/policy.yaml b/pkg/microservice/aslan/core/delivery/handler/policy.yaml index b6d2a5b6c..38084a4f4 100644 --- a/pkg/microservice/aslan/core/delivery/handler/policy.yaml +++ b/pkg/microservice/aslan/core/delivery/handler/policy.yaml @@ -1,5 +1,5 @@ resource: Delivery -alias: "交付" +alias: "交付中心" description: "" rules: - action: get_delivery diff --git a/pkg/microservice/aslan/core/environment/handler/policy.yaml b/pkg/microservice/aslan/core/environment/handler/policy.yaml index e716e26a1..4247adc81 100644 --- a/pkg/microservice/aslan/core/environment/handler/policy.yaml +++ b/pkg/microservice/aslan/core/environment/handler/policy.yaml @@ -3,7 +3,7 @@ alias: "集成环境" description: "" rules: - action: get_environment - alias: "查看环境" + alias: "查看集成环境" description: "" rules: - method: GET @@ -21,7 +21,7 @@ rules: - method: GET endpoint: "/api/aslan/service/workloads" - action: create_environment - alias: "新建环境" + alias: "新建集成环境" description: "" rules: - method: POST @@ -31,7 +31,7 @@ rules: - method: POST endpoint: "/api/aslan/service/workloads" - action: config_environment - alias: "配置环境" + alias: "配置集成环境" description: "" rules: - method: PUT @@ -47,7 +47,7 @@ rules: - method: PUT endpoint: "/api/aslan/service/workloads" - action: update_environment - alias: "更新环境" + alias: "管理服务实例" description: "" rules: - method: POST @@ -81,7 +81,7 @@ rules: - method: PUT endpoint: " /api/podexec/?*/?*/?*/?*/podExec" - action: delete_environment - alias: "删除环境" + alias: "删除集成环境" description: "" rules: - method: DELETE diff --git a/pkg/microservice/aslan/core/service/handler/policy.yaml b/pkg/microservice/aslan/core/service/handler/policy.yaml index 31ce7a5fe..8e4a722a6 100644 --- a/pkg/microservice/aslan/core/service/handler/policy.yaml +++ b/pkg/microservice/aslan/core/service/handler/policy.yaml @@ -1,5 +1,5 @@ resource: Service -alias: "服务" +alias: "项目配置" description: "" rules: - action: get_service @@ -71,7 +71,7 @@ rules: - method: GET endpoint: "/api/aslan/build/targets" - action: create_build - alias: "创建构建配置" + alias: "新建构建配置" description: "" rules: - method: POST diff --git a/pkg/microservice/aslan/core/workflow/handler/policy.yaml b/pkg/microservice/aslan/core/workflow/handler/policy.yaml index d81583774..19a4de91e 100644 --- a/pkg/microservice/aslan/core/workflow/handler/policy.yaml +++ b/pkg/microservice/aslan/core/workflow/handler/policy.yaml @@ -20,6 +20,8 @@ rules: endpoint: "/api/aslan/logs/sse/workflow/build/?*/?*/?*/?*" - method: GET endpoint: "/api/aslan/logs/log/workflow/?*/tasks/?*/service/?*" + - method: GET + endpoint: "/api/aslan/logs/sse/workflow/test/?*/?*/?*/?*/?*" - method: GET endpoint: "/api/aslan/logs/log/workflow/?*/tasks/?*/tests/test/service/?*" - method: GET diff --git a/pkg/microservice/aslan/core/workflow/testing/handler/policy.yaml b/pkg/microservice/aslan/core/workflow/testing/handler/policy.yaml index b74792628..320fcdeda 100644 --- a/pkg/microservice/aslan/core/workflow/testing/handler/policy.yaml +++ b/pkg/microservice/aslan/core/workflow/testing/handler/policy.yaml @@ -1,5 +1,5 @@ resource: Test -alias: "测试" +alias: "质量管理" description: "" rules: - action: get_test -- Gitee From 8a6ba7fb5b2253a786d22e79d9f1053312707046 Mon Sep 17 00:00:00 2001 From: mouuii Date: Thu, 21 Oct 2021 15:59:01 +0800 Subject: [PATCH 082/405] rename Signed-off-by: mouuii --- .../aslan/core/{service => project}/handler/policy.yaml | 0 .../core/{service => project}/handler/policy_definitions.go | 0 pkg/microservice/aslan/core/service.go | 4 ++-- 3 files changed, 2 insertions(+), 2 deletions(-) rename pkg/microservice/aslan/core/{service => project}/handler/policy.yaml (100%) rename pkg/microservice/aslan/core/{service => project}/handler/policy_definitions.go (100%) diff --git a/pkg/microservice/aslan/core/service/handler/policy.yaml b/pkg/microservice/aslan/core/project/handler/policy.yaml similarity index 100% rename from pkg/microservice/aslan/core/service/handler/policy.yaml rename to pkg/microservice/aslan/core/project/handler/policy.yaml diff --git a/pkg/microservice/aslan/core/service/handler/policy_definitions.go b/pkg/microservice/aslan/core/project/handler/policy_definitions.go similarity index 100% rename from pkg/microservice/aslan/core/service/handler/policy_definitions.go rename to pkg/microservice/aslan/core/project/handler/policy_definitions.go diff --git a/pkg/microservice/aslan/core/service.go b/pkg/microservice/aslan/core/service.go index a99f21bc6..5ef918f49 100644 --- a/pkg/microservice/aslan/core/service.go +++ b/pkg/microservice/aslan/core/service.go @@ -33,7 +33,7 @@ import ( deliveryhandler "github.com/koderover/zadig/pkg/microservice/aslan/core/delivery/handler" environmenthandler "github.com/koderover/zadig/pkg/microservice/aslan/core/environment/handler" environmentservice "github.com/koderover/zadig/pkg/microservice/aslan/core/environment/service" - servicehandler "github.com/koderover/zadig/pkg/microservice/aslan/core/service/handler" + projecthandler "github.com/koderover/zadig/pkg/microservice/aslan/core/project/handler" systemrepo "github.com/koderover/zadig/pkg/microservice/aslan/core/system/repository/mongodb" systemservice "github.com/koderover/zadig/pkg/microservice/aslan/core/system/service" workflowhandler "github.com/koderover/zadig/pkg/microservice/aslan/core/workflow/handler" @@ -83,7 +83,7 @@ func registerPolicies() { for _, r := range []policyGetter{ new(workflowhandler.Router), new(environmenthandler.Router), - new(servicehandler.Router), + new(projecthandler.Router), new(testinghandler.Router), new(deliveryhandler.Router), } { -- Gitee From 20eb4084490795405b3155407522d6616b68bad1 Mon Sep 17 00:00:00 2001 From: mouuii Date: Thu, 21 Oct 2021 16:09:12 +0800 Subject: [PATCH 083/405] rename Signed-off-by: mouuii --- pkg/microservice/aslan/core/environment/handler/policy.yaml | 2 +- pkg/microservice/aslan/core/workflow/handler/policy.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/microservice/aslan/core/environment/handler/policy.yaml b/pkg/microservice/aslan/core/environment/handler/policy.yaml index 4247adc81..b86fe1dda 100644 --- a/pkg/microservice/aslan/core/environment/handler/policy.yaml +++ b/pkg/microservice/aslan/core/environment/handler/policy.yaml @@ -71,7 +71,7 @@ rules: - method: GET endpoint: "/api/aslan/logs/sse/pods/?*/containers/?*" - method: PUT - endpoint: "/api/aslan/environment/environments/?*/services/?*/:?*" + endpoint: "/api/aslan/environment/environments/?*/services/?*/?*" - method: POST endpoint: "/api/aslan/environment/environments/?*/services/?*/restartNew" - method: POST diff --git a/pkg/microservice/aslan/core/workflow/handler/policy.yaml b/pkg/microservice/aslan/core/workflow/handler/policy.yaml index 19a4de91e..6a488c637 100644 --- a/pkg/microservice/aslan/core/workflow/handler/policy.yaml +++ b/pkg/microservice/aslan/core/workflow/handler/policy.yaml @@ -53,7 +53,7 @@ rules: description: "" rules: - method: POST - endpoint: "/api/aslan/workflow/workflow/?*" + endpoint: "/api/aslan/workflow/workflowtask" - method: PUT endpoint: "/api/aslan/workflow/workflowtask" - method: POST -- Gitee From 10a087d63426c94afd01e2e750a2ca56a3863d3a Mon Sep 17 00:00:00 2001 From: mouuii Date: Thu, 21 Oct 2021 16:10:26 +0800 Subject: [PATCH 084/405] rename Signed-off-by: mouuii --- pkg/microservice/aslan/core/environment/handler/policy.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/microservice/aslan/core/environment/handler/policy.yaml b/pkg/microservice/aslan/core/environment/handler/policy.yaml index b86fe1dda..1fe633c7b 100644 --- a/pkg/microservice/aslan/core/environment/handler/policy.yaml +++ b/pkg/microservice/aslan/core/environment/handler/policy.yaml @@ -46,7 +46,7 @@ rules: endpoint: "/api/aslan/environment/environments/?*/multiHelmEnv" - method: PUT endpoint: "/api/aslan/service/workloads" - - action: update_environment + - action: manage_environment alias: "管理服务实例" description: "" rules: -- Gitee From ea24cec64401ab807156d5209cb819f2bd430dee Mon Sep 17 00:00:00 2001 From: mouuii Date: Fri, 22 Oct 2021 11:59:41 +0800 Subject: [PATCH 085/405] edit role Signed-off-by: mouuii --- pkg/microservice/policy/core/handler/role.go | 19 ++++++++++++ .../policy/core/handler/router.go | 1 + .../policy/core/repository/mongodb/role.go | 29 +++++++++++++++++++ pkg/microservice/policy/core/service/role.go | 17 +++++++++++ 4 files changed, 66 insertions(+) diff --git a/pkg/microservice/policy/core/handler/role.go b/pkg/microservice/policy/core/handler/role.go index c5589a51c..dd7e1de2b 100644 --- a/pkg/microservice/policy/core/handler/role.go +++ b/pkg/microservice/policy/core/handler/role.go @@ -43,6 +43,25 @@ func CreateRole(c *gin.Context) { ctx.Err = service.CreateRole(projectName, args, ctx.Logger) } +func UpdateRole(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + + args := &service.Role{} + if err := c.ShouldBindJSON(args); err != nil { + ctx.Err = err + return + } + + projectName := c.Query("projectName") + if projectName == "" { + ctx.Err = e.ErrInvalidParam.AddDesc("projectName is empty") + return + } + + ctx.Err = service.UpdateRole(projectName, args, ctx.Logger) +} + func ListRoles(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() diff --git a/pkg/microservice/policy/core/handler/router.go b/pkg/microservice/policy/core/handler/router.go index 9508bccea..6a15a00f6 100644 --- a/pkg/microservice/policy/core/handler/router.go +++ b/pkg/microservice/policy/core/handler/router.go @@ -26,6 +26,7 @@ func (*Router) Inject(router *gin.RouterGroup) { roles := router.Group("roles") { roles.POST("", CreateRole) + roles.PUT("", UpdateRole) roles.GET("", ListRoles) roles.DELETE("/:name", DeleteRole) } diff --git a/pkg/microservice/policy/core/repository/mongodb/role.go b/pkg/microservice/policy/core/repository/mongodb/role.go index a8130617c..f67e3106e 100644 --- a/pkg/microservice/policy/core/repository/mongodb/role.go +++ b/pkg/microservice/policy/core/repository/mongodb/role.go @@ -18,6 +18,7 @@ package mongodb import ( "context" + "errors" "fmt" "go.mongodb.org/mongo-driver/bson" @@ -127,3 +128,31 @@ func (c *RoleColl) Delete(name string, projectName string) error { _, err := c.DeleteOne(context.TODO(), query) return err } + +func (c *RoleColl) UpdateProjectRole(obj *models.Role) error { + // avoid panic issue + if obj == nil { + return errors.New("nil Role") + } + + query := bson.M{"name": obj.Name, "namespace": obj.Namespace} + change := bson.M{"$set": bson.M{ + "rules": obj.Rules, + }} + _, err := c.UpdateOne(context.TODO(), query, change) + return err +} + +func (c *RoleColl) UpdatePublicRole(obj *models.Role) error { + // avoid panic issue + if obj == nil { + return errors.New("nil Role") + } + + query := bson.M{"name": obj.Name, "namespace": ""} + change := bson.M{"$set": bson.M{ + "rules": obj.Rules, + }} + _, err := c.UpdateOne(context.TODO(), query, change) + return err +} diff --git a/pkg/microservice/policy/core/service/role.go b/pkg/microservice/policy/core/service/role.go index f6d493d2f..fd71688a0 100644 --- a/pkg/microservice/policy/core/service/role.go +++ b/pkg/microservice/policy/core/service/role.go @@ -51,6 +51,23 @@ func CreateRole(ns string, role *Role, _ *zap.SugaredLogger) error { return mongodb.NewRoleColl().Create(obj) } +func UpdateRole(ns string, role *Role, _ *zap.SugaredLogger) error { + obj := &models.Role{ + Name: role.Name, + Namespace: ns, + Kind: role.Kind, + } + + for _, r := range role.Rules { + obj.Rules = append(obj.Rules, &models.Rule{ + Verbs: r.Verbs, + Resources: r.Resources, + }) + } + + return mongodb.NewRoleColl().UpdateProjectRole(obj) +} + func ListRoles(projectName string, _ *zap.SugaredLogger) (roles []*Role, err error) { projectRoles, err := mongodb.NewRoleColl().ListBy(projectName) if err != nil { -- Gitee From 968d3cf1db2a8cc7a704101cc41808d41c0a4255 Mon Sep 17 00:00:00 2001 From: mouuii Date: Fri, 22 Oct 2021 12:01:27 +0800 Subject: [PATCH 086/405] edit role Signed-off-by: mouuii --- pkg/microservice/policy/core/handler/role.go | 13 +++++++++++++ pkg/microservice/policy/core/handler/router.go | 1 + pkg/microservice/policy/core/service/role.go | 16 ++++++++++++++++ 3 files changed, 30 insertions(+) diff --git a/pkg/microservice/policy/core/handler/role.go b/pkg/microservice/policy/core/handler/role.go index dd7e1de2b..919686eaa 100644 --- a/pkg/microservice/policy/core/handler/role.go +++ b/pkg/microservice/policy/core/handler/role.go @@ -62,6 +62,19 @@ func UpdateRole(c *gin.Context) { ctx.Err = service.UpdateRole(projectName, args, ctx.Logger) } +func UpdatePublicRole(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + + args := &service.Role{} + if err := c.ShouldBindJSON(args); err != nil { + ctx.Err = err + return + } + + ctx.Err = service.UpdatePublicRole(args, ctx.Logger) +} + func ListRoles(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() diff --git a/pkg/microservice/policy/core/handler/router.go b/pkg/microservice/policy/core/handler/router.go index 6a15a00f6..4a585e126 100644 --- a/pkg/microservice/policy/core/handler/router.go +++ b/pkg/microservice/policy/core/handler/router.go @@ -35,6 +35,7 @@ func (*Router) Inject(router *gin.RouterGroup) { { publicRoles.POST("", CreatePublicRole) publicRoles.GET("", ListPublicRoles) + publicRoles.PUT("", UpdatePublicRole) publicRoles.DELETE("/:name", DeletePublicRole) } diff --git a/pkg/microservice/policy/core/service/role.go b/pkg/microservice/policy/core/service/role.go index fd71688a0..461110dc7 100644 --- a/pkg/microservice/policy/core/service/role.go +++ b/pkg/microservice/policy/core/service/role.go @@ -68,6 +68,22 @@ func UpdateRole(ns string, role *Role, _ *zap.SugaredLogger) error { return mongodb.NewRoleColl().UpdateProjectRole(obj) } +func UpdatePublicRole(role *Role, _ *zap.SugaredLogger) error { + obj := &models.Role{ + Name: role.Name, + Kind: role.Kind, + } + + for _, r := range role.Rules { + obj.Rules = append(obj.Rules, &models.Rule{ + Verbs: r.Verbs, + Resources: r.Resources, + }) + } + + return mongodb.NewRoleColl().UpdatePublicRole(obj) +} + func ListRoles(projectName string, _ *zap.SugaredLogger) (roles []*Role, err error) { projectRoles, err := mongodb.NewRoleColl().ListBy(projectName) if err != nil { -- Gitee From 050e7402ed4c39b10adb3ce7e5107afc80e73fb2 Mon Sep 17 00:00:00 2001 From: mouuii Date: Fri, 22 Oct 2021 14:05:01 +0800 Subject: [PATCH 087/405] edit role Signed-off-by: mouuii --- pkg/microservice/policy/core/handler/role.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pkg/microservice/policy/core/handler/role.go b/pkg/microservice/policy/core/handler/role.go index 919686eaa..ca33ac64d 100644 --- a/pkg/microservice/policy/core/handler/role.go +++ b/pkg/microservice/policy/core/handler/role.go @@ -58,6 +58,8 @@ func UpdateRole(c *gin.Context) { ctx.Err = e.ErrInvalidParam.AddDesc("projectName is empty") return } + name := c.Param("name") + args.Name = name ctx.Err = service.UpdateRole(projectName, args, ctx.Logger) } @@ -71,7 +73,8 @@ func UpdatePublicRole(c *gin.Context) { ctx.Err = err return } - + name := c.Param("name") + args.Name = name ctx.Err = service.UpdatePublicRole(args, ctx.Logger) } -- Gitee From 6fe1ad4d1fd36d9b9c6cdca68998fc2ec9860a1b Mon Sep 17 00:00:00 2001 From: mouuii Date: Fri, 22 Oct 2021 14:18:40 +0800 Subject: [PATCH 088/405] edit role Signed-off-by: mouuii --- pkg/microservice/policy/core/handler/role.go | 2 +- .../policy/core/handler/router.go | 4 ++-- pkg/microservice/policy/core/service/role.go | 20 +++---------------- 3 files changed, 6 insertions(+), 20 deletions(-) diff --git a/pkg/microservice/policy/core/handler/role.go b/pkg/microservice/policy/core/handler/role.go index ca33ac64d..86bcb70b1 100644 --- a/pkg/microservice/policy/core/handler/role.go +++ b/pkg/microservice/policy/core/handler/role.go @@ -75,7 +75,7 @@ func UpdatePublicRole(c *gin.Context) { } name := c.Param("name") args.Name = name - ctx.Err = service.UpdatePublicRole(args, ctx.Logger) + ctx.Err = service.UpdateRole("", args, ctx.Logger) } func ListRoles(c *gin.Context) { diff --git a/pkg/microservice/policy/core/handler/router.go b/pkg/microservice/policy/core/handler/router.go index 4a585e126..15ec12894 100644 --- a/pkg/microservice/policy/core/handler/router.go +++ b/pkg/microservice/policy/core/handler/router.go @@ -26,7 +26,7 @@ func (*Router) Inject(router *gin.RouterGroup) { roles := router.Group("roles") { roles.POST("", CreateRole) - roles.PUT("", UpdateRole) + roles.PUT(":/name", UpdateRole) roles.GET("", ListRoles) roles.DELETE("/:name", DeleteRole) } @@ -35,7 +35,7 @@ func (*Router) Inject(router *gin.RouterGroup) { { publicRoles.POST("", CreatePublicRole) publicRoles.GET("", ListPublicRoles) - publicRoles.PUT("", UpdatePublicRole) + publicRoles.PUT("/:name", UpdatePublicRole) publicRoles.DELETE("/:name", DeletePublicRole) } diff --git a/pkg/microservice/policy/core/service/role.go b/pkg/microservice/policy/core/service/role.go index 461110dc7..aed0722be 100644 --- a/pkg/microservice/policy/core/service/role.go +++ b/pkg/microservice/policy/core/service/role.go @@ -64,24 +64,10 @@ func UpdateRole(ns string, role *Role, _ *zap.SugaredLogger) error { Resources: r.Resources, }) } - - return mongodb.NewRoleColl().UpdateProjectRole(obj) -} - -func UpdatePublicRole(role *Role, _ *zap.SugaredLogger) error { - obj := &models.Role{ - Name: role.Name, - Kind: role.Kind, - } - - for _, r := range role.Rules { - obj.Rules = append(obj.Rules, &models.Rule{ - Verbs: r.Verbs, - Resources: r.Resources, - }) + if ns == "" { + return mongodb.NewRoleColl().UpdatePublicRole(obj) } - - return mongodb.NewRoleColl().UpdatePublicRole(obj) + return mongodb.NewRoleColl().UpdateProjectRole(obj) } func ListRoles(projectName string, _ *zap.SugaredLogger) (roles []*Role, err error) { -- Gitee From 33a7c2f70e65a3ea4804b2753e409e7e8e05f1c9 Mon Sep 17 00:00:00 2001 From: mouuii Date: Fri, 22 Oct 2021 14:25:26 +0800 Subject: [PATCH 089/405] edit role Signed-off-by: mouuii --- .../policy/core/repository/mongodb/role.go | 16 +--------------- pkg/microservice/policy/core/service/role.go | 5 +---- 2 files changed, 2 insertions(+), 19 deletions(-) diff --git a/pkg/microservice/policy/core/repository/mongodb/role.go b/pkg/microservice/policy/core/repository/mongodb/role.go index f67e3106e..5ecff4502 100644 --- a/pkg/microservice/policy/core/repository/mongodb/role.go +++ b/pkg/microservice/policy/core/repository/mongodb/role.go @@ -129,7 +129,7 @@ func (c *RoleColl) Delete(name string, projectName string) error { return err } -func (c *RoleColl) UpdateProjectRole(obj *models.Role) error { +func (c *RoleColl) UpdateRole(obj *models.Role) error { // avoid panic issue if obj == nil { return errors.New("nil Role") @@ -142,17 +142,3 @@ func (c *RoleColl) UpdateProjectRole(obj *models.Role) error { _, err := c.UpdateOne(context.TODO(), query, change) return err } - -func (c *RoleColl) UpdatePublicRole(obj *models.Role) error { - // avoid panic issue - if obj == nil { - return errors.New("nil Role") - } - - query := bson.M{"name": obj.Name, "namespace": ""} - change := bson.M{"$set": bson.M{ - "rules": obj.Rules, - }} - _, err := c.UpdateOne(context.TODO(), query, change) - return err -} diff --git a/pkg/microservice/policy/core/service/role.go b/pkg/microservice/policy/core/service/role.go index aed0722be..c55742479 100644 --- a/pkg/microservice/policy/core/service/role.go +++ b/pkg/microservice/policy/core/service/role.go @@ -64,10 +64,7 @@ func UpdateRole(ns string, role *Role, _ *zap.SugaredLogger) error { Resources: r.Resources, }) } - if ns == "" { - return mongodb.NewRoleColl().UpdatePublicRole(obj) - } - return mongodb.NewRoleColl().UpdateProjectRole(obj) + return mongodb.NewRoleColl().UpdateRole(obj) } func ListRoles(projectName string, _ *zap.SugaredLogger) (roles []*Role, err error) { -- Gitee From aed52b0cc027e7dd4d504c995cd8f5e7ad232598 Mon Sep 17 00:00:00 2001 From: lou Date: Fri, 22 Oct 2021 15:31:44 +0800 Subject: [PATCH 090/405] add config service Signed-off-by: lou --- Makefile | 2 +- cmd/systemconfig/main.go | 38 ++++++ docker/service/config.Dockerfile | 11 ++ go.mod | 6 + go.sum | 18 ++- pkg/microservice/policy/server/rest/router.go | 6 +- .../systemconfig/config/config.go | 23 ++++ .../systemconfig/config/consts.go | 8 ++ .../systemconfig/core/handler/connector.go | 72 +++++++++++ .../systemconfig/core/handler/router.go | 34 +++++ .../core/repository/models/connector.go | 37 ++++++ .../core/repository/orm/connector.go | 82 ++++++++++++ pkg/microservice/systemconfig/core/service.go | 39 ++++++ .../systemconfig/core/service/connector.go | 117 ++++++++++++++++++ .../systemconfig/core/service/types.go | 61 +++++++++ .../systemconfig/server/rest/router.go | 35 ++++++ .../systemconfig/server/rest/server.go | 76 ++++++++++++ .../systemconfig/server/server.go | 60 +++++++++ pkg/tool/gorm/client.go | 72 +++++++++++ 19 files changed, 792 insertions(+), 5 deletions(-) create mode 100644 cmd/systemconfig/main.go create mode 100644 docker/service/config.Dockerfile create mode 100644 pkg/microservice/systemconfig/config/config.go create mode 100644 pkg/microservice/systemconfig/config/consts.go create mode 100644 pkg/microservice/systemconfig/core/handler/connector.go create mode 100644 pkg/microservice/systemconfig/core/handler/router.go create mode 100644 pkg/microservice/systemconfig/core/repository/models/connector.go create mode 100644 pkg/microservice/systemconfig/core/repository/orm/connector.go create mode 100644 pkg/microservice/systemconfig/core/service.go create mode 100644 pkg/microservice/systemconfig/core/service/connector.go create mode 100644 pkg/microservice/systemconfig/core/service/types.go create mode 100644 pkg/microservice/systemconfig/server/rest/router.go create mode 100644 pkg/microservice/systemconfig/server/rest/server.go create mode 100644 pkg/microservice/systemconfig/server/server.go create mode 100644 pkg/tool/gorm/client.go diff --git a/Makefile b/Makefile index d46ca9fbc..24bf08269 100644 --- a/Makefile +++ b/Makefile @@ -4,7 +4,7 @@ IMAGE_REPOSITORY = ccr.ccs.tencentyun.com/koderover-rc VERSION ?= $(shell date +'%Y%m%d%H%M%S') -TARGETS = aslan cron hub-agent hub-server jenkins-plugin podexec predator-plugin resource-server ua warpdrive policy picket +TARGETS = aslan cron hub-agent hub-server jenkins-plugin podexec predator-plugin resource-server ua warpdrive policy picket config REAPER_OS= focal xenial bionic ALL_IMAGES=$(TARGETS:=.image) diff --git a/cmd/systemconfig/main.go b/cmd/systemconfig/main.go new file mode 100644 index 000000000..90b61cc3f --- /dev/null +++ b/cmd/systemconfig/main.go @@ -0,0 +1,38 @@ +/* +Copyright 2021 The KodeRover 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 main + +import ( + "context" + "log" + "os/signal" + "syscall" + + "github.com/koderover/zadig/pkg/microservice/systemconfig/server" +) + +func main() { + ctx, stop := signal.NotifyContext(context.Background(), syscall.SIGTERM, syscall.SIGINT) + go func() { + <-ctx.Done() + stop() + }() + + if err := server.Serve(ctx); err != nil { + log.Fatal(err) + } +} diff --git a/docker/service/config.Dockerfile b/docker/service/config.Dockerfile new file mode 100644 index 000000000..83a3f2ffd --- /dev/null +++ b/docker/service/config.Dockerfile @@ -0,0 +1,11 @@ +#golang.Dockerfile + +RUN go build -v -o /config ./cmd/systemconfig/main.go + +#alpine.Dockerfile + +WORKDIR /app + +COPY --from=build /config . + +ENTRYPOINT ["/app/config"] diff --git a/go.mod b/go.mod index 76bc8f274..ad4bc1c2e 100644 --- a/go.mod +++ b/go.mod @@ -16,6 +16,7 @@ require ( github.com/bugsnag/panicwrap v1.3.1 // indirect github.com/cenkalti/backoff/v3 v3.0.0 github.com/coocood/freecache v1.1.0 + github.com/dexidp/dex v2.13.0+incompatible github.com/docker/distribution v2.7.1+incompatible github.com/docker/docker v17.12.0-ce-rc1.0.20200618181300-9dc6525e6118+incompatible github.com/docker/go-connections v0.4.0 @@ -38,6 +39,7 @@ require ( github.com/jasonlvhit/gocron v0.0.0-20171226191223-3c914c8681c3 github.com/jinzhu/now v1.1.2 github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 // indirect + github.com/kylelemons/godebug v1.1.0 // indirect github.com/mittwald/go-helm-client v0.8.0 github.com/nsqio/go-nsq v1.0.7 github.com/nwaples/rardecode v1.0.0 // indirect @@ -68,9 +70,13 @@ require ( golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d golang.org/x/sync v0.0.0-20210220032951-036812b2e83c golang.org/x/tools v0.1.5 // indirect + gopkg.in/asn1-ber.v1 v1.0.0-20181015200546-f715ec2f112d // indirect + gopkg.in/ldap.v2 v2.5.1 // indirect gopkg.in/mholt/archiver.v3 v3.1.1 gopkg.in/natefinch/lumberjack.v2 v2.0.0 gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b + gorm.io/driver/mysql v1.1.2 + gorm.io/gorm v1.21.16 helm.sh/helm/v3 v3.6.2 k8s.io/api v0.22.1 k8s.io/apimachinery v0.22.1 diff --git a/go.sum b/go.sum index bc09eeb7c..e8ae4d705 100644 --- a/go.sum +++ b/go.sum @@ -193,6 +193,8 @@ github.com/daviddengcn/go-colortext v0.0.0-20160507010035-511bcaf42ccd/go.mod h1 github.com/deislabs/oras v0.11.1 h1:oo2J/3vXdcti8cjFi8ghMOkx0OacONxHC8dhJ17NdJ0= github.com/deislabs/oras v0.11.1/go.mod h1:39lCtf8Q6WDC7ul9cnyWXONNzKvabEKk+AX+L0ImnQk= github.com/denisenkom/go-mssqldb v0.0.0-20191001013358-cfbb681360f0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= +github.com/dexidp/dex v2.13.0+incompatible h1:EQPpzCi51omkwBe0KYpRGaV3rk6CVvjcqeMGCe3Q00w= +github.com/dexidp/dex v2.13.0+incompatible/go.mod h1:cRGkPWqKhDD1FMCICe2JbYDdVR2xGLa38F6iuH/jNAs= github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= @@ -343,8 +345,9 @@ github.com/go-resty/resty/v2 v2.6.0 h1:joIR5PNLM2EFqqESUjCMGXrWmXNHEU9CEiK813oKY github.com/go-resty/resty/v2 v2.6.0/go.mod h1:PwvJS6hvaPkjtjNg9ph+VrSD92bi5Zq73w/BIH7cC3Q= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= -github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= +github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= @@ -544,6 +547,8 @@ github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod github.com/jasonlvhit/gocron v0.0.0-20171226191223-3c914c8681c3 h1:s2ARkZWJfkyjrUi8Dj0mMbc1inxeOnIrO9zc3oQX8iU= github.com/jasonlvhit/gocron v0.0.0-20171226191223-3c914c8681c3/go.mod h1:rwi/esz/h+4oWLhbWWK7f6dtmgLzxeZhnwGr7MCsTNk= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= +github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= github.com/jinzhu/now v1.1.2 h1:eVKgfIdy9b6zbWBMgFpfDPoAMifwSZagU9HmEU6zgiI= github.com/jinzhu/now v1.1.2/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= @@ -595,6 +600,8 @@ github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 h1:SOEGU9fKiNWd/HOJuq6+3iTQz8KNCLtVX6idSoTLdUw= github.com/lann/builder v0.0.0-20180802200727-47ae307949d0/go.mod h1:dXGbAdH5GtBTC4WfIxhKZfyBF/HBFgRZSWwZ9g/He9o= github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 h1:P6pPBnrTSX3DEVR4fDembhRWSsG5rVo6hYhAB/ADZrk= @@ -1343,6 +1350,8 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0 google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/asn1-ber.v1 v1.0.0-20181015200546-f715ec2f112d h1:TxyelI5cVkbREznMhfzycHdkp5cLA7DpE+GKjSslYhM= +gopkg.in/asn1-ber.v1 v1.0.0-20181015200546-f715ec2f112d/go.mod h1:cuepJuh7vyXfUyUwEgHQXw849cJrilpS5NeIjOWESAw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -1360,6 +1369,8 @@ gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ldap.v2 v2.5.1 h1:wiu0okdNfjlBzg6UWvd1Hn8Y+Ux17/u/4nlk4CQr6tU= +gopkg.in/ldap.v2 v2.5.1/go.mod h1:oI0cpe/D7HRtBQl8aTg+ZmzFUAvu4lsv3eLXMLGFxWk= gopkg.in/mholt/archiver.v3 v3.1.1 h1:sLb5X5fPPc9oU6YatdC+vbY46irElT3kPR0wOS7bjR4= gopkg.in/mholt/archiver.v3 v3.1.1/go.mod h1:EwJV1tr6GQdNZ5IFFVakh0aYAjGLVjqvFVL/b8ZVdMw= gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= @@ -1383,6 +1394,11 @@ gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gorm.io/driver/mysql v1.1.2 h1:OofcyE2lga734MxwcCW9uB4mWNXMr50uaGRVwQL2B0M= +gorm.io/driver/mysql v1.1.2/go.mod h1:4P/X9vSc3WTrhTLZ259cpFd6xKNYiSSdSZngkSBGIMM= +gorm.io/gorm v1.21.12/go.mod h1:F+OptMscr0P2F2qU97WT1WimdH9GaQPoDW7AYd5i2Y0= +gorm.io/gorm v1.21.16 h1:YBIQLtP5PLfZQz59qfrq7xbrK7KWQ+JsXXCH/THlMqs= +gorm.io/gorm v1.21.16/go.mod h1:F+OptMscr0P2F2qU97WT1WimdH9GaQPoDW7AYd5i2Y0= gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= diff --git a/pkg/microservice/policy/server/rest/router.go b/pkg/microservice/policy/server/rest/router.go index 2115e654f..d9fb530c9 100644 --- a/pkg/microservice/policy/server/rest/router.go +++ b/pkg/microservice/policy/server/rest/router.go @@ -23,10 +23,10 @@ import ( ) func (s *engine) injectRouterGroup(router *gin.RouterGroup) { - for name, r := range map[string]injector{ - "/api/v1": new(handler.Router), + for _, r := range []injector{ + new(handler.Router), } { - r.Inject(router.Group(name)) + r.Inject(router.Group("/api/v1")) } } diff --git a/pkg/microservice/systemconfig/config/config.go b/pkg/microservice/systemconfig/config/config.go new file mode 100644 index 000000000..821936f8e --- /dev/null +++ b/pkg/microservice/systemconfig/config/config.go @@ -0,0 +1,23 @@ +package config + +import ( + "github.com/spf13/viper" + + _ "github.com/koderover/zadig/pkg/config" +) + +func DexMysqlDB() string { + return viper.GetString(ENVDexMysqlDB) +} + +func DexMysqlHost() string { + return viper.GetString(ENVDexMysqlHost) +} + +func DexMysqlUser() string { + return viper.GetString(ENVDexMysqlUser) +} + +func DexMysqlPassword() string { + return viper.GetString(ENVDexMysqlPassword) +} diff --git a/pkg/microservice/systemconfig/config/consts.go b/pkg/microservice/systemconfig/config/consts.go new file mode 100644 index 000000000..23453c577 --- /dev/null +++ b/pkg/microservice/systemconfig/config/consts.go @@ -0,0 +1,8 @@ +package config + +const ( + ENVDexMysqlDB = "DEX_MYSQL_DB" + ENVDexMysqlHost = "DEX_MYSQL_HOST" + ENVDexMysqlUser = "DEX_MYSQL_USER" + ENVDexMysqlPassword = "DEX_MYSQL_PASSWORD" +) diff --git a/pkg/microservice/systemconfig/core/handler/connector.go b/pkg/microservice/systemconfig/core/handler/connector.go new file mode 100644 index 000000000..95e475db0 --- /dev/null +++ b/pkg/microservice/systemconfig/core/handler/connector.go @@ -0,0 +1,72 @@ +/* +Copyright 2021 The KodeRover 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 handler + +import ( + "github.com/gin-gonic/gin" + + "github.com/koderover/zadig/pkg/microservice/systemconfig/core/service" + internalhandler "github.com/koderover/zadig/pkg/shared/handler" +) + +func CreateConnector(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + + args := &service.Connector{} + if err := c.ShouldBindJSON(args); err != nil { + ctx.Err = err + return + } + + ctx.Err = service.CreateConnector(args, ctx.Logger) +} + +func ListConnectors(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + + ctx.Resp, ctx.Err = service.ListConnectors(ctx.Logger) +} + +func DeleteConnector(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + + ctx.Err = service.DeleteConnector(c.Param("id"), ctx.Logger) +} + +func GetConnector(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + + ctx.Resp, ctx.Err = service.GetConnector(c.Param("id"), ctx.Logger) +} + +func UpdateConnector(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + + args := &service.Connector{} + if err := c.ShouldBindJSON(args); err != nil { + ctx.Err = err + return + } + args.ID = c.Param("id") + + ctx.Err = service.UpdateConnector(args, ctx.Logger) +} diff --git a/pkg/microservice/systemconfig/core/handler/router.go b/pkg/microservice/systemconfig/core/handler/router.go new file mode 100644 index 000000000..b59de3824 --- /dev/null +++ b/pkg/microservice/systemconfig/core/handler/router.go @@ -0,0 +1,34 @@ +/* +Copyright 2021 The KodeRover 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 handler + +import ( + "github.com/gin-gonic/gin" +) + +type Router struct{} + +func (*Router) Inject(router *gin.RouterGroup) { + roles := router.Group("connectors") + { + roles.POST("", CreateConnector) + roles.GET("", ListConnectors) + roles.GET("/:id", GetConnector) + roles.PUT("/:id", UpdateConnector) + roles.DELETE("/:id", DeleteConnector) + } +} diff --git a/pkg/microservice/systemconfig/core/repository/models/connector.go b/pkg/microservice/systemconfig/core/repository/models/connector.go new file mode 100644 index 000000000..42706039a --- /dev/null +++ b/pkg/microservice/systemconfig/core/repository/models/connector.go @@ -0,0 +1,37 @@ +/* +Copyright 2021 The KodeRover 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 models + +import "strconv" + +type Connector struct { + ID string `json:"id"` + Type string `json:"type"` + Name string `json:"name"` + ResourceVersion string `json:"resource_version"` + Config string `json:"config"` +} + +func (m *Connector) IncreaseResourceVersion() { + rv, _ := strconv.Atoi(m.ResourceVersion) + m.ResourceVersion = strconv.Itoa(rv + 1) +} + +// TableName sets the insert table name for this struct type +func (Connector) TableName() string { + return "connector" +} diff --git a/pkg/microservice/systemconfig/core/repository/orm/connector.go b/pkg/microservice/systemconfig/core/repository/orm/connector.go new file mode 100644 index 000000000..67de3de4f --- /dev/null +++ b/pkg/microservice/systemconfig/core/repository/orm/connector.go @@ -0,0 +1,82 @@ +/* +Copyright 2021 The KodeRover 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 orm + +import ( + "gorm.io/gorm" + + "github.com/koderover/zadig/pkg/microservice/systemconfig/core/repository/models" + gormtool "github.com/koderover/zadig/pkg/tool/gorm" +) + +type ConnectorColl struct { + *gorm.DB + + coll string +} + +func NewConnectorColl() *ConnectorColl { + name := models.Connector{}.TableName() + return &ConnectorColl{ + DB: gormtool.DB(), + coll: name, + } +} + +func (c *ConnectorColl) GetCollectionName() string { + return c.coll +} + +func (c *ConnectorColl) List() ([]*models.Connector, error) { + var res []*models.Connector + result := c.Find(&res) + + return res, result.Error +} + +func (c *ConnectorColl) Get(id string) (*models.Connector, error) { + res := &models.Connector{} + result := c.First(&res, id) + + return res, result.Error +} + +func (c *ConnectorColl) Create(obj *models.Connector) error { + obj.ResourceVersion = "1" + result := c.DB.Create(obj) + + return result.Error +} + +func (c *ConnectorColl) Update(obj *models.Connector) error { + current, err := c.Get(obj.ID) + if err != nil { + return err + } + + obj.ResourceVersion = current.ResourceVersion + obj.IncreaseResourceVersion() + result := c.DB.Save(obj) + + return result.Error +} + +func (c *ConnectorColl) Delete(id string) error { + result := c.DB.Delete(&models.Connector{}, id) + + return result.Error +} diff --git a/pkg/microservice/systemconfig/core/service.go b/pkg/microservice/systemconfig/core/service.go new file mode 100644 index 000000000..fae2df931 --- /dev/null +++ b/pkg/microservice/systemconfig/core/service.go @@ -0,0 +1,39 @@ +/* +Copyright 2021 The KodeRover 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 core + +import ( + "context" + + "github.com/koderover/zadig/pkg/config" + "github.com/koderover/zadig/pkg/setting" + gormtool "github.com/koderover/zadig/pkg/tool/gorm" + "github.com/koderover/zadig/pkg/tool/log" +) + +func Start(_ context.Context) { + log.Init(&log.Config{ + Level: config.LogLevel(), + Filename: config.LogFile(), + SendToFile: config.SendLogToFile(), + Development: config.Mode() != setting.ReleaseMode, + }) +} + +func Stop(_ context.Context) { + gormtool.Close() +} diff --git a/pkg/microservice/systemconfig/core/service/connector.go b/pkg/microservice/systemconfig/core/service/connector.go new file mode 100644 index 000000000..03e3be1e5 --- /dev/null +++ b/pkg/microservice/systemconfig/core/service/connector.go @@ -0,0 +1,117 @@ +/* +Copyright 2021 The KodeRover 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 service + +import ( + "encoding/json" + + "go.uber.org/zap" + + "github.com/koderover/zadig/pkg/microservice/systemconfig/core/repository/models" + "github.com/koderover/zadig/pkg/microservice/systemconfig/core/repository/orm" +) + +func ListConnectors(logger *zap.SugaredLogger) ([]*Connector, error) { + cs, err := orm.NewConnectorColl().List() + if err != nil { + logger.Errorf("Failed to list connectors, err: %s", err) + return nil, err + } + + var res []*Connector + for _, c := range cs { + cf := make(map[string]interface{}) + err = json.Unmarshal([]byte(c.Config), cf) + if err != nil { + logger.Warnf("Failed to unmarshal config, err: %s", err) + continue + } + res = append(res, &Connector{ + ConnectorBase: ConnectorBase{ + Type: ConnectorType(c.Type), + }, + ID: c.ID, + Name: c.Name, + Config: cf, + }) + } + + return res, nil +} + +func GetConnector(id string, logger *zap.SugaredLogger) (*Connector, error) { + c, err := orm.NewConnectorColl().Get(id) + if err != nil { + logger.Errorf("Failed to get connector %s, err: %s", id, err) + return nil, err + } + + cf := make(map[string]interface{}) + err = json.Unmarshal([]byte(c.Config), cf) + if err != nil { + logger.Warnf("Failed to unmarshal config, err: %s", err) + + } + + return &Connector{ + ConnectorBase: ConnectorBase{ + Type: ConnectorType(c.Type), + }, + ID: c.ID, + Name: c.Name, + Config: cf, + }, nil + +} + +func DeleteConnector(id string, _ *zap.SugaredLogger) error { + return orm.NewConnectorColl().Delete(id) +} + +func CreateConnector(ct *Connector, logger *zap.SugaredLogger) error { + cf, err := json.Marshal(ct.Config) + if err != nil { + logger.Errorf("Failed to marshal config, err: %s", err) + return err + } + + obj := &models.Connector{ + ID: ct.ID, + Name: ct.Name, + Type: string(ct.Type), + Config: string(cf), + } + + return orm.NewConnectorColl().Create(obj) +} + +func UpdateConnector(ct *Connector, logger *zap.SugaredLogger) error { + cf, err := json.Marshal(ct.Config) + if err != nil { + logger.Errorf("Failed to marshal config, err: %s", err) + return err + } + + obj := &models.Connector{ + ID: ct.ID, + Name: ct.Name, + Type: string(ct.Type), + Config: string(cf), + } + + return orm.NewConnectorColl().Update(obj) +} diff --git a/pkg/microservice/systemconfig/core/service/types.go b/pkg/microservice/systemconfig/core/service/types.go new file mode 100644 index 000000000..dd87a95f8 --- /dev/null +++ b/pkg/microservice/systemconfig/core/service/types.go @@ -0,0 +1,61 @@ +/* +Copyright 2021 The KodeRover 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 service + +import ( + "encoding/json" + + "github.com/dexidp/dex/connector/github" + "github.com/dexidp/dex/connector/ldap" +) + +type ConnectorType string + +const ( + TypeLDAP ConnectorType = "ldap" + TypeGitHub ConnectorType = "github" +) + +type Connector struct { + ConnectorBase + + ID string `json:"id"` + Name string `json:"name"` + Config interface{} `json:"config"` +} + +type ConnectorBase struct { + Type ConnectorType `json:"type"` +} + +func (c *Connector) UnmarshalJSON(data []byte) error { + cb := &ConnectorBase{} + if err := json.Unmarshal(data, cb); err != nil { + return err + } + + switch cb.Type { + case TypeLDAP: + c.Config = &ldap.Config{} + case TypeGitHub: + c.Config = &github.Config{} + } + + type tmp Connector + + return json.Unmarshal(data, (*tmp)(c)) +} diff --git a/pkg/microservice/systemconfig/server/rest/router.go b/pkg/microservice/systemconfig/server/rest/router.go new file mode 100644 index 000000000..c043ab8e1 --- /dev/null +++ b/pkg/microservice/systemconfig/server/rest/router.go @@ -0,0 +1,35 @@ +/* +Copyright 2021 The KodeRover 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 rest + +import ( + "github.com/gin-gonic/gin" + + "github.com/koderover/zadig/pkg/microservice/systemconfig/core/handler" +) + +func (s *engine) injectRouterGroup(router *gin.RouterGroup) { + for _, r := range []injector{ + new(handler.Router), + } { + r.Inject(router.Group("/api/v1")) + } +} + +type injector interface { + Inject(router *gin.RouterGroup) +} diff --git a/pkg/microservice/systemconfig/server/rest/server.go b/pkg/microservice/systemconfig/server/rest/server.go new file mode 100644 index 000000000..18843b0a5 --- /dev/null +++ b/pkg/microservice/systemconfig/server/rest/server.go @@ -0,0 +1,76 @@ +/* +Copyright 2021 The KodeRover 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 rest + +import ( + "net/http" + + "github.com/gin-gonic/gin" + + "github.com/koderover/zadig/pkg/config" + ginmiddleware "github.com/koderover/zadig/pkg/middleware/gin" + "github.com/koderover/zadig/pkg/tool/log" +) + +type engine struct { + *gin.Engine + + mode string +} + +func NewEngine() *engine { + s := &engine{mode: config.Mode()} + + gin.SetMode(s.mode) + + s.injectMiddlewares() + s.injectRouters() + + return s +} + +func (s *engine) injectMiddlewares() { + g := gin.New() + defer func() { + s.Engine = g + }() + + if s.mode == gin.TestMode { + return + } + g.Use(ginmiddleware.Response()) + g.Use(ginmiddleware.RequestID()) + g.Use(ginmiddleware.RequestLog(log.NewFileLogger(config.RequestLogFile()))) + g.Use(gin.Recovery()) +} + +func (s *engine) injectRouters() { + g := s.Engine + + g.NoRoute(func(c *gin.Context) { + c.String(http.StatusNotFound, "Invalid path: %s", c.Request.URL.Path) + }) + g.HandleMethodNotAllowed = true + g.NoMethod(func(c *gin.Context) { + c.String(http.StatusMethodNotAllowed, "Method not allowed: %s %s", c.Request.Method, c.Request.URL.Path) + }) + + apiRouters := g.Group("") + s.injectRouterGroup(apiRouters) + + s.Engine = g +} diff --git a/pkg/microservice/systemconfig/server/server.go b/pkg/microservice/systemconfig/server/server.go new file mode 100644 index 000000000..cd8efc7a5 --- /dev/null +++ b/pkg/microservice/systemconfig/server/server.go @@ -0,0 +1,60 @@ +/* +Copyright 2021 The KodeRover 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 server + +import ( + "context" + "net/http" + "time" + + "github.com/koderover/zadig/pkg/microservice/systemconfig/core" + "github.com/koderover/zadig/pkg/microservice/systemconfig/server/rest" + "github.com/koderover/zadig/pkg/tool/log" +) + +func Serve(ctx context.Context) error { + core.Start(ctx) + defer core.Stop(ctx) + + log.Info("Start system config service") + + engine := rest.NewEngine() + server := &http.Server{Addr: ":80", Handler: engine} + + stopChan := make(chan struct{}) + go func() { + defer close(stopChan) + + <-ctx.Done() + + ctx, cancel := context.WithTimeout(context.TODO(), 5*time.Second) + defer cancel() + + if err := server.Shutdown(ctx); err != nil { + log.Errorf("Failed to stop server, error: %s", err) + } + }() + + if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed { + log.Errorf("Failed to start http server, error: %s", err) + return err + } + + <-stopChan + + return nil +} diff --git a/pkg/tool/gorm/client.go b/pkg/tool/gorm/client.go new file mode 100644 index 000000000..f9ca8c03e --- /dev/null +++ b/pkg/tool/gorm/client.go @@ -0,0 +1,72 @@ +package gorm + +import ( + "fmt" + "sync" + + "gorm.io/driver/mysql" + "gorm.io/gorm" + + "github.com/koderover/zadig/pkg/microservice/systemconfig/config" + "github.com/koderover/zadig/pkg/tool/log" +) + +type Database int + +const ( + Dex Database = iota + 1 +) + +var connections = make(map[Database]*gorm.DB, 1) +var once sync.Once + +func SetExternalConnection(conn *gorm.DB) { + once.Do(func() { + connections[Dex] = conn + }) +} + +func getConnection(db Database) *gorm.DB { + once.Do(func() { + connections[Dex] = initDex() + }) + + return connections[db] +} + +func initDex() *gorm.DB { + return openDB( + config.DexMysqlUser(), + config.DexMysqlPassword(), + config.DexMysqlHost(), + config.DexMysqlDB(), + ) +} + +func DB(db ...Database) *gorm.DB { + if len(db) == 0 { + return getConnection(Dex) + } + return getConnection(db[0]) +} + +func Close() { + //for _, conn := range connections { + // conn.Close() + //} +} + +func openDB(username, password, host, db string) *gorm.DB { + + // refer https://github.com/go-sql-driver/mysql#dsn-data-source-name for details + dsn := fmt.Sprintf( + "%s:%s@tcp(%s)/%s?charset=utf8mb4&parseTime=True&loc=Local", + username, password, host, db, + ) + conn, err := gorm.Open(mysql.Open(dsn), &gorm.Config{}) + if err != nil { + log.Panicf("Can not open db %s, err: %s", db, err) + } + + return conn +} -- Gitee From 9a8a5b5f764f200d47f8661beaf5c783ae536c28 Mon Sep 17 00:00:00 2001 From: lou Date: Fri, 22 Oct 2021 16:55:12 +0800 Subject: [PATCH 091/405] improve db connection Signed-off-by: lou --- .../core/repository/orm/connector.go | 3 +- pkg/microservice/systemconfig/core/service.go | 24 +++++++-- pkg/tool/gorm/client.go | 54 +++++-------------- 3 files changed, 35 insertions(+), 46 deletions(-) diff --git a/pkg/microservice/systemconfig/core/repository/orm/connector.go b/pkg/microservice/systemconfig/core/repository/orm/connector.go index 67de3de4f..a51b858de 100644 --- a/pkg/microservice/systemconfig/core/repository/orm/connector.go +++ b/pkg/microservice/systemconfig/core/repository/orm/connector.go @@ -19,6 +19,7 @@ package orm import ( "gorm.io/gorm" + "github.com/koderover/zadig/pkg/microservice/systemconfig/config" "github.com/koderover/zadig/pkg/microservice/systemconfig/core/repository/models" gormtool "github.com/koderover/zadig/pkg/tool/gorm" ) @@ -32,7 +33,7 @@ type ConnectorColl struct { func NewConnectorColl() *ConnectorColl { name := models.Connector{}.TableName() return &ConnectorColl{ - DB: gormtool.DB(), + DB: gormtool.DB(config.DexMysqlDB()), coll: name, } } diff --git a/pkg/microservice/systemconfig/core/service.go b/pkg/microservice/systemconfig/core/service.go index fae2df931..a2e7b91aa 100644 --- a/pkg/microservice/systemconfig/core/service.go +++ b/pkg/microservice/systemconfig/core/service.go @@ -19,7 +19,8 @@ package core import ( "context" - "github.com/koderover/zadig/pkg/config" + configbase "github.com/koderover/zadig/pkg/config" + "github.com/koderover/zadig/pkg/microservice/systemconfig/config" "github.com/koderover/zadig/pkg/setting" gormtool "github.com/koderover/zadig/pkg/tool/gorm" "github.com/koderover/zadig/pkg/tool/log" @@ -27,11 +28,24 @@ import ( func Start(_ context.Context) { log.Init(&log.Config{ - Level: config.LogLevel(), - Filename: config.LogFile(), - SendToFile: config.SendLogToFile(), - Development: config.Mode() != setting.ReleaseMode, + Level: configbase.LogLevel(), + Filename: configbase.LogFile(), + SendToFile: configbase.SendLogToFile(), + Development: configbase.Mode() != setting.ReleaseMode, }) + + initDatabase() +} + +func initDatabase() { + err := gormtool.Open(config.DexMysqlUser(), + config.DexMysqlPassword(), + config.DexMysqlHost(), + config.DexMysqlDB(), + ) + if err != nil { + log.Panicf("Failed to open database %s", config.DexMysqlDB()) + } } func Stop(_ context.Context) { diff --git a/pkg/tool/gorm/client.go b/pkg/tool/gorm/client.go index f9ca8c03e..aea8c5b7b 100644 --- a/pkg/tool/gorm/client.go +++ b/pkg/tool/gorm/client.go @@ -2,52 +2,30 @@ package gorm import ( "fmt" - "sync" "gorm.io/driver/mysql" "gorm.io/gorm" - - "github.com/koderover/zadig/pkg/microservice/systemconfig/config" - "github.com/koderover/zadig/pkg/tool/log" -) - -type Database int - -const ( - Dex Database = iota + 1 ) -var connections = make(map[Database]*gorm.DB, 1) -var once sync.Once +var connections = make(map[string]*gorm.DB) -func SetExternalConnection(conn *gorm.DB) { - once.Do(func() { - connections[Dex] = conn - }) +func getConnection(db string) *gorm.DB { + return connections[db] } -func getConnection(db Database) *gorm.DB { - once.Do(func() { - connections[Dex] = initDex() - }) +func Open(username, password, host, db string) error { + conn, err := openDB(username, password, host, db) + if err != nil { + return err + } - return connections[db] -} + connections[db] = conn -func initDex() *gorm.DB { - return openDB( - config.DexMysqlUser(), - config.DexMysqlPassword(), - config.DexMysqlHost(), - config.DexMysqlDB(), - ) + return nil } -func DB(db ...Database) *gorm.DB { - if len(db) == 0 { - return getConnection(Dex) - } - return getConnection(db[0]) +func DB(db string) *gorm.DB { + return getConnection(db) } func Close() { @@ -56,17 +34,13 @@ func Close() { //} } -func openDB(username, password, host, db string) *gorm.DB { +func openDB(username, password, host, db string) (*gorm.DB, error) { // refer https://github.com/go-sql-driver/mysql#dsn-data-source-name for details dsn := fmt.Sprintf( "%s:%s@tcp(%s)/%s?charset=utf8mb4&parseTime=True&loc=Local", username, password, host, db, ) - conn, err := gorm.Open(mysql.Open(dsn), &gorm.Config{}) - if err != nil { - log.Panicf("Can not open db %s, err: %s", db, err) - } - return conn + return gorm.Open(mysql.Open(dsn), &gorm.Config{}) } -- Gitee From 9145fa27ec3e29f34479e85cb197cc7f460b6693 Mon Sep 17 00:00:00 2001 From: mouuii Date: Fri, 22 Oct 2021 17:37:27 +0800 Subject: [PATCH 092/405] add kind Signed-off-by: mouuii --- pkg/microservice/policy/core/repository/models/role.go | 3 ++- .../policy/core/service/bundle/opa_bundle.go | 9 ++++----- pkg/microservice/policy/core/service/role.go | 2 -- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/pkg/microservice/policy/core/repository/models/role.go b/pkg/microservice/policy/core/repository/models/role.go index 60279b11b..2813821b8 100644 --- a/pkg/microservice/policy/core/repository/models/role.go +++ b/pkg/microservice/policy/core/repository/models/role.go @@ -27,7 +27,7 @@ type Role struct { Name string `bson:"name" json:"name"` Namespace string `bson:"namespace" json:"namespace"` Rules []*Rule `bson:"rules" json:"rules"` - Kind string `bson:"kind" json:"kind"` + //Kind string `bson:"kind" json:"kind"` } // Rule holds information that describes a policy rule, but does not contain information @@ -39,6 +39,7 @@ type Rule struct { // Resources is a list of resources this rule applies to. '*' represents all resources. Resources []string `bson:"resources" json:"resources"` + Kind string `bson:"verbs" json:"verbs"` } func (Role) TableName() string { diff --git a/pkg/microservice/policy/core/service/bundle/opa_bundle.go b/pkg/microservice/policy/core/service/bundle/opa_bundle.go index 3089d1c61..bf032b8e1 100644 --- a/pkg/microservice/policy/core/service/bundle/opa_bundle.go +++ b/pkg/microservice/policy/core/service/bundle/opa_bundle.go @@ -192,14 +192,12 @@ func generateOPARoles(roles []*models.Role, policies []*models.Policy) *opaRoles for _, ro := range roles { opaRole := &role{Name: ro.Name, Namespace: ro.Namespace} - if ro.Kind == models.KindResource { - for _, r := range ro.Rules { + for _, r := range ro.Rules { + if r.Kind == models.KindResource { for _, res := range r.Resources { opaRole.Rules = append(opaRole.Rules, resourceMappings.GetRules(res, r.Verbs)...) } - } - } else { - for _, r := range ro.Rules { + } else { if len(r.Verbs) == 1 && r.Verbs[0] == models.MethodAll { r.Verbs = AllMethods } @@ -209,6 +207,7 @@ func generateOPARoles(roles []*models.Role, policies []*models.Policy) *opaRoles } } } + } sort.Sort(opaRole.Rules) diff --git a/pkg/microservice/policy/core/service/role.go b/pkg/microservice/policy/core/service/role.go index c55742479..861dcc8f9 100644 --- a/pkg/microservice/policy/core/service/role.go +++ b/pkg/microservice/policy/core/service/role.go @@ -38,7 +38,6 @@ func CreateRole(ns string, role *Role, _ *zap.SugaredLogger) error { obj := &models.Role{ Name: role.Name, Namespace: ns, - Kind: role.Kind, } for _, r := range role.Rules { @@ -55,7 +54,6 @@ func UpdateRole(ns string, role *Role, _ *zap.SugaredLogger) error { obj := &models.Role{ Name: role.Name, Namespace: ns, - Kind: role.Kind, } for _, r := range role.Rules { -- Gitee From fe1b461306d45cd4fb47b20a8aa4b5e7527f6810 Mon Sep 17 00:00:00 2001 From: mouuii Date: Fri, 22 Oct 2021 17:54:11 +0800 Subject: [PATCH 093/405] add kind Signed-off-by: mouuii --- pkg/microservice/policy/core/repository/models/role.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/pkg/microservice/policy/core/repository/models/role.go b/pkg/microservice/policy/core/repository/models/role.go index 2813821b8..30910828c 100644 --- a/pkg/microservice/policy/core/repository/models/role.go +++ b/pkg/microservice/policy/core/repository/models/role.go @@ -27,7 +27,6 @@ type Role struct { Name string `bson:"name" json:"name"` Namespace string `bson:"namespace" json:"namespace"` Rules []*Rule `bson:"rules" json:"rules"` - //Kind string `bson:"kind" json:"kind"` } // Rule holds information that describes a policy rule, but does not contain information @@ -35,11 +34,11 @@ type Role struct { // If Kind is "resource", verbs are resource actions, while resources are resource names type Rule struct { // Verbs is a list of http methods or resource actions that apply to ALL the Resources contained in this rule. '*' represents all methods. - Verbs []string `bson:"verbs" json:"verbs"` + Verbs []string `bson:"verbs" json:"verbs"` // Resources is a list of resources this rule applies to. '*' represents all resources. Resources []string `bson:"resources" json:"resources"` - Kind string `bson:"verbs" json:"verbs"` + Kind string `bson:"verbs" json:"verbs"` } func (Role) TableName() string { -- Gitee From 735c994e54aec0211f70c01c31a87132f7e32913 Mon Sep 17 00:00:00 2001 From: mouuii Date: Fri, 22 Oct 2021 18:54:40 +0800 Subject: [PATCH 094/405] add kind Signed-off-by: mouuii --- pkg/microservice/policy/core/service/role.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pkg/microservice/policy/core/service/role.go b/pkg/microservice/policy/core/service/role.go index 861dcc8f9..bf238143f 100644 --- a/pkg/microservice/policy/core/service/role.go +++ b/pkg/microservice/policy/core/service/role.go @@ -32,6 +32,7 @@ type Role struct { type Rule struct { Verbs []string `json:"verbs"` Resources []string `json:"resources"` + Kind string `json:"kind"` } func CreateRole(ns string, role *Role, _ *zap.SugaredLogger) error { @@ -43,6 +44,7 @@ func CreateRole(ns string, role *Role, _ *zap.SugaredLogger) error { for _, r := range role.Rules { obj.Rules = append(obj.Rules, &models.Rule{ Verbs: r.Verbs, + Kind: r.Kind, Resources: r.Resources, }) } @@ -59,6 +61,7 @@ func UpdateRole(ns string, role *Role, _ *zap.SugaredLogger) error { for _, r := range role.Rules { obj.Rules = append(obj.Rules, &models.Rule{ Verbs: r.Verbs, + Kind: r.Kind, Resources: r.Resources, }) } -- Gitee From 5c8bcae7907628b095d57a3b9996992e99b85e14 Mon Sep 17 00:00:00 2001 From: mouuii Date: Mon, 25 Oct 2021 11:08:33 +0800 Subject: [PATCH 095/405] router bugfix Signed-off-by: mouuii --- pkg/microservice/policy/core/handler/router.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/microservice/policy/core/handler/router.go b/pkg/microservice/policy/core/handler/router.go index 15ec12894..145d956ba 100644 --- a/pkg/microservice/policy/core/handler/router.go +++ b/pkg/microservice/policy/core/handler/router.go @@ -26,7 +26,7 @@ func (*Router) Inject(router *gin.RouterGroup) { roles := router.Group("roles") { roles.POST("", CreateRole) - roles.PUT(":/name", UpdateRole) + roles.PUT("/:name", UpdateRole) roles.GET("", ListRoles) roles.DELETE("/:name", DeleteRole) } -- Gitee From 69a200cd6fee4a200700157793de6a8c0c2b3cdd Mon Sep 17 00:00:00 2001 From: mouuii Date: Mon, 25 Oct 2021 11:15:44 +0800 Subject: [PATCH 096/405] bson bug Signed-off-by: mouuii --- pkg/microservice/policy/core/repository/models/role.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/microservice/policy/core/repository/models/role.go b/pkg/microservice/policy/core/repository/models/role.go index 30910828c..63c510346 100644 --- a/pkg/microservice/policy/core/repository/models/role.go +++ b/pkg/microservice/policy/core/repository/models/role.go @@ -38,7 +38,7 @@ type Rule struct { // Resources is a list of resources this rule applies to. '*' represents all resources. Resources []string `bson:"resources" json:"resources"` - Kind string `bson:"verbs" json:"verbs"` + Kind string `bson:"kind" json:"kind"` } func (Role) TableName() string { -- Gitee From 06fd7af04bcfd985769164382e71a8fc93d9953f Mon Sep 17 00:00:00 2001 From: mouuii Date: Mon, 25 Oct 2021 11:55:03 +0800 Subject: [PATCH 097/405] remove kind Signed-off-by: mouuii --- pkg/microservice/policy/core/service/role.go | 1 - 1 file changed, 1 deletion(-) diff --git a/pkg/microservice/policy/core/service/role.go b/pkg/microservice/policy/core/service/role.go index bf238143f..8c40f0ae6 100644 --- a/pkg/microservice/policy/core/service/role.go +++ b/pkg/microservice/policy/core/service/role.go @@ -25,7 +25,6 @@ import ( type Role struct { Name string `json:"name"` - Kind string `json:"name"` Rules []*Rule `json:"rules,omitempty"` } -- Gitee From 40cc85c576082d9dc74f3af01593a07133f2e0e4 Mon Sep 17 00:00:00 2001 From: mouuii Date: Mon, 25 Oct 2021 14:10:33 +0800 Subject: [PATCH 098/405] remove poetry client Signed-off-by: mouuii --- .../aslan/core/common/service/git/hook.go | 18 ++++---- pkg/shared/poetry/org.go | 46 ------------------- 2 files changed, 10 insertions(+), 54 deletions(-) delete mode 100644 pkg/shared/poetry/org.go diff --git a/pkg/microservice/aslan/core/common/service/git/hook.go b/pkg/microservice/aslan/core/common/service/git/hook.go index 6450ef316..a40b49d84 100644 --- a/pkg/microservice/aslan/core/common/service/git/hook.go +++ b/pkg/microservice/aslan/core/common/service/git/hook.go @@ -19,9 +19,7 @@ package git import ( "sync" - "github.com/koderover/zadig/pkg/microservice/aslan/config" - "github.com/koderover/zadig/pkg/shared/poetry" - "github.com/koderover/zadig/pkg/tool/log" + "github.com/koderover/zadig/pkg/tool/crypto" ) var once sync.Once @@ -29,13 +27,17 @@ var secret string func GetHookSecret() string { once.Do(func() { - poetryClient := poetry.New(config.PoetryAPIServer()) - org, err := poetryClient.GetOrganization(poetry.DefaultOrganization) + //poetryClient := poetry.New(config.PoetryAPIServer()) + //org, err := poetryClient.GetOrganization(poetry.DefaultOrganization) + //if err != nil { + // log.Errorf("failed to find default organization: %v", err) + // secret = "--impossible-token--" + //} + token, err := crypto.AesEncrypt("hook") if err != nil { - log.Errorf("failed to find default organization: %v", err) - secret = "--impossible-token--" + panic("Failed to get token") } - secret = org.Token + secret = token }) return secret diff --git a/pkg/shared/poetry/org.go b/pkg/shared/poetry/org.go deleted file mode 100644 index 463a7c07e..000000000 --- a/pkg/shared/poetry/org.go +++ /dev/null @@ -1,46 +0,0 @@ -/* -Copyright 2021 The KodeRover 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 poetry - -import ( - "fmt" - - "github.com/koderover/zadig/pkg/tool/httpclient" -) - -const ( - DefaultOrganization = iota + 1 -) - -type Organization struct { - ID int `json:"id"` - Name string `json:"name"` - Token string `json:"orgToken"` - Website string `json:"website"` -} - -func (c *Client) GetOrganization(orgID int) (*Organization, error) { - url := fmt.Sprintf("/directory/organization/%d", orgID) - - org := &Organization{} - _, err := c.Get(url, httpclient.SetResult(org)) - if err != nil { - return nil, err - } - - return org, nil -} -- Gitee From 69d568a91d780821da1162d776fe38a9f2d6cca3 Mon Sep 17 00:00:00 2001 From: mouuii Date: Mon, 25 Oct 2021 14:12:05 +0800 Subject: [PATCH 099/405] remove poetry client Signed-off-by: mouuii --- pkg/microservice/aslan/core/common/service/git/hook.go | 6 ------ 1 file changed, 6 deletions(-) diff --git a/pkg/microservice/aslan/core/common/service/git/hook.go b/pkg/microservice/aslan/core/common/service/git/hook.go index a40b49d84..f716d9a6d 100644 --- a/pkg/microservice/aslan/core/common/service/git/hook.go +++ b/pkg/microservice/aslan/core/common/service/git/hook.go @@ -27,12 +27,6 @@ var secret string func GetHookSecret() string { once.Do(func() { - //poetryClient := poetry.New(config.PoetryAPIServer()) - //org, err := poetryClient.GetOrganization(poetry.DefaultOrganization) - //if err != nil { - // log.Errorf("failed to find default organization: %v", err) - // secret = "--impossible-token--" - //} token, err := crypto.AesEncrypt("hook") if err != nil { panic("Failed to get token") -- Gitee From b2dfae52ecdfd1cd4541f224cbc07a98cc935051 Mon Sep 17 00:00:00 2001 From: lou Date: Mon, 25 Oct 2021 14:51:46 +0800 Subject: [PATCH 100/405] add more supported types Signed-off-by: lou --- go.mod | 17 +- go.sum | 268 ++++++++++++++++-- .../core/service/bundle/exemption_urls.go | 24 ++ .../systemconfig/core/service/types.go | 28 +- 4 files changed, 297 insertions(+), 40 deletions(-) diff --git a/go.mod b/go.mod index ad4bc1c2e..e92c2ab0e 100644 --- a/go.mod +++ b/go.mod @@ -16,7 +16,7 @@ require ( github.com/bugsnag/panicwrap v1.3.1 // indirect github.com/cenkalti/backoff/v3 v3.0.0 github.com/coocood/freecache v1.1.0 - github.com/dexidp/dex v2.13.0+incompatible + github.com/dexidp/dex v0.0.0-20210802203454-3fac2ab6bc3b github.com/docker/distribution v2.7.1+incompatible github.com/docker/docker v17.12.0-ce-rc1.0.20200618181300-9dc6525e6118+incompatible github.com/docker/go-connections v0.4.0 @@ -29,8 +29,7 @@ require ( github.com/gofrs/uuid v4.0.0+incompatible // indirect github.com/google/go-github/v35 v35.3.0 github.com/google/uuid v1.2.0 - github.com/gorilla/handlers v1.5.1 // indirect - github.com/gorilla/mux v1.7.3 + github.com/gorilla/mux v1.8.0 github.com/gorilla/websocket v1.4.2 github.com/gotestyourself/gotestyourself v2.2.0+incompatible // indirect github.com/gregjones/httpcache v0.0.0-20181110185634-c63ab54fda8f @@ -39,7 +38,6 @@ require ( github.com/jasonlvhit/gocron v0.0.0-20171226191223-3c914c8681c3 github.com/jinzhu/now v1.1.2 github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 // indirect - github.com/kylelemons/godebug v1.1.0 // indirect github.com/mittwald/go-helm-client v0.8.0 github.com/nsqio/go-nsq v1.0.7 github.com/nwaples/rardecode v1.0.0 // indirect @@ -52,8 +50,8 @@ require ( github.com/rfyiamcool/cronlib v1.0.0 github.com/satori/go.uuid v1.2.0 github.com/sirupsen/logrus v1.8.1 - github.com/spf13/cobra v1.1.3 - github.com/spf13/viper v1.7.0 + github.com/spf13/cobra v1.2.1 + github.com/spf13/viper v1.8.1 github.com/stevvooe/resumable v0.0.0-20180830230917-22b14a53ba50 // indirect github.com/stretchr/testify v1.7.0 github.com/swaggo/files v0.0.0-20190704085106-630677cd5c14 @@ -66,12 +64,9 @@ require ( github.com/yvasiyarov/newrelic_platform_go v0.0.0-20160601141957-9c099fbc30e9 // indirect go.mongodb.org/mongo-driver v1.5.0 go.uber.org/zap v1.19.0 - golang.org/x/net v0.0.0-20210428140749-89ef3d95e781 - golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d + golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420 + golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914 golang.org/x/sync v0.0.0-20210220032951-036812b2e83c - golang.org/x/tools v0.1.5 // indirect - gopkg.in/asn1-ber.v1 v1.0.0-20181015200546-f715ec2f112d // indirect - gopkg.in/ldap.v2 v2.5.1 // indirect gopkg.in/mholt/archiver.v3 v3.1.1 gopkg.in/natefinch/lumberjack.v2 v2.0.0 gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b diff --git a/go.sum b/go.sum index e8ae4d705..cd347990b 100644 --- a/go.sum +++ b/go.sum @@ -10,21 +10,42 @@ cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6T cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= +cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= +cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= +cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= +cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= +cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= +cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= +cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= +cloud.google.com/go v0.88.0 h1:MZ2cf9Elnv1wqccq8ooKO2MqHQLc+ChCp/+QWObCpxg= +cloud.google.com/go v0.88.0/go.mod h1:dnKwfYbP9hQhefiUvpbcAyoGSHUrOxR20JVElLiUvEY= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= +cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= +cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= +cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +entgo.io/ent v0.8.0/go.mod h1:KNjsukat/NJi6zJh1utwRadsbGOZsBbAZNDxkW7tMCc= github.com/27149chen/afero v1.6.2 h1:WRPUOreB90qGRQs8fxXcvi0srBPHy2octiJme7C7XCA= github.com/27149chen/afero v1.6.2/go.mod h1:68wFWsZwQPvguVWn5di+KCOLI0KQtSRve2mPFVg6VWY= +github.com/AppsFlyer/go-sundheit v0.4.0/go.mod h1:iZ8zWMS7idcvmqewf5mEymWWgoOiG/0WD4+aeh+heX4= github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= github.com/Azure/go-ansiterm v0.0.0-20210608223527-2377c96fe795/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= @@ -36,6 +57,8 @@ github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSY github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= +github.com/Azure/go-ntlmssp v0.0.0-20200615164410-66371956d46c h1:/IBSNwUN8+eKzUzbJPqhK839ygXJ82sde8x3ogr6R28= +github.com/Azure/go-ntlmssp v0.0.0-20200615164410-66371956d46c/go.mod h1:chxPXzSsl7ZWRAuOIE23GDNzjWuZquvFlgA8xmpunjU= github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= @@ -46,6 +69,8 @@ github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd h1:sjQovDkwrZp github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd/go.mod h1:64YHyfSL2R96J44Nlwm39UHepQbyR5q10x7iYa1ks2E= github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= +github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= +github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= github.com/Masterminds/semver/v3 v3.1.1 h1:hLg3sBzpNErnxhQtUy/mmLR2I9foDujNK030IGemrRc= github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= github.com/Masterminds/sprig/v3 v3.2.2 h1:17jRggJu518dr3QaafizSXOjKYp94wKfABxUmyxvxX8= @@ -106,6 +131,7 @@ github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN github.com/aws/aws-sdk-go v1.34.28 h1:sscPpn/Ns3i0F4HPEWAVcwdIRaZZCuL7llJ2/60yPIk= github.com/aws/aws-sdk-go v1.34.28/go.mod h1:H7NKnBqNVzoTJpGfLrQkkD+ytBA93eiDYi/+8rV9s48= github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= +github.com/beevik/etree v1.1.0/go.mod h1:r8Aw8JqVegEf0w2fDnATrX9VpkMcyFeM0FhwO62wh+A= github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= @@ -115,6 +141,7 @@ github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= +github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= @@ -147,7 +174,9 @@ github.com/cilium/ebpf v0.0.0-20200110133405-4032b1d8aae3/go.mod h1:MA5e5Lr8slmE github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/containerd/cgroups v0.0.0-20200531161412-0dbf7f05ba59 h1:qWj4qVYZ95vLWwqyNJCQg7rDsG5wPdze0UaPolH7DUk= @@ -169,12 +198,16 @@ github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkE github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= +github.com/coreos/go-oidc v2.1.0+incompatible h1:sdJrfw8akMnCuUlaZU3tE/uYXFgfqom8DBE9so9EBsM= github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= +github.com/coreos/go-oidc/v3 v3.0.0 h1:/mAA0XMgYJw2Uqm7WKGCsKnjitE/+A0FFbOmiRJm7LQ= +github.com/coreos/go-oidc/v3 v3.0.0/go.mod h1:rEJ/idjfUyfkBit1eI1fvyr+64/g9dcKpAm8MJMesvo= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= +github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= @@ -193,8 +226,9 @@ github.com/daviddengcn/go-colortext v0.0.0-20160507010035-511bcaf42ccd/go.mod h1 github.com/deislabs/oras v0.11.1 h1:oo2J/3vXdcti8cjFi8ghMOkx0OacONxHC8dhJ17NdJ0= github.com/deislabs/oras v0.11.1/go.mod h1:39lCtf8Q6WDC7ul9cnyWXONNzKvabEKk+AX+L0ImnQk= github.com/denisenkom/go-mssqldb v0.0.0-20191001013358-cfbb681360f0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= -github.com/dexidp/dex v2.13.0+incompatible h1:EQPpzCi51omkwBe0KYpRGaV3rk6CVvjcqeMGCe3Q00w= -github.com/dexidp/dex v2.13.0+incompatible/go.mod h1:cRGkPWqKhDD1FMCICe2JbYDdVR2xGLa38F6iuH/jNAs= +github.com/dexidp/dex v0.0.0-20210802203454-3fac2ab6bc3b h1:ovHbNjGAQsGEs67tYU6C6ex2D2shDkeZ7pPprx58f2k= +github.com/dexidp/dex v0.0.0-20210802203454-3fac2ab6bc3b/go.mod h1:g64CEwk9b4oLTREOu8mFkjTkDUvyxzWGqhnPwQlfrq8= +github.com/dexidp/dex/api/v2 v2.0.0/go.mod h1:k5arBJT1QYvpsEY3sEd0NXJp3hKWKuUUfzJ3BlcqPdM= github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= @@ -231,8 +265,10 @@ github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4s github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ= github.com/evanphx/json-patch v4.5.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= @@ -244,9 +280,11 @@ github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d/go.mod h1:ZZM github.com/fatih/camelcase v1.0.0/go.mod h1:yN2Sb0lFhZJUdVvtELVWefmrXpuZESvPmqwoZc+/fpc= github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/felixge/httpsnoop v1.0.1 h1:lvB5Jl89CsZtGIWuTcDM1E/vkVs49/Ml7JJe07l8SPQ= github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/felixge/httpsnoop v1.0.2 h1:+nS9g82KMXccJ/wp0zyRW9ZBHFETmMGtkk+2CTTrW4o= +github.com/felixge/httpsnoop v1.0.2/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= +github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= @@ -268,6 +306,9 @@ github.com/gin-gonic/gin v1.7.2 h1:Tg03T9yM2xa8j6I3Z3oqLaQRSmKvxPd6g/2HJ6zICFA= github.com/gin-gonic/gin v1.7.2/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY= github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= +github.com/go-asn1-ber/asn1-ber v1.5.1 h1:pDbRAunXzIUXfx4CB2QJFv5IuPiuoW+sWvr/Us009o8= +github.com/go-asn1-ber/asn1-ber v1.5.1/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0= +github.com/go-bindata/go-bindata v1.0.1-0.20190711162640-ee3c2418e368/go.mod h1:7xCgX1lzlrXPHkfvn3EhumqHkmSlzt8at9q7v0ax19c= github.com/go-errors/errors v1.0.1 h1:LUHzmkK3GUKUrL/1gfBUxAHzcev3apQlezX/+O7ma6w= github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= @@ -277,6 +318,8 @@ github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2 github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= +github.com/go-ldap/ldap/v3 v3.3.0 h1:lwx+SJpgOHd8tG6SumBQZXCmNX51zM8B1cfxJ5gv4tQ= +github.com/go-ldap/ldap/v3 v3.3.0/go.mod h1:iYS1MdmrmceOJ1QOTnRXrIs7i3kloqtmGQjRvjKpyMg= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= @@ -294,6 +337,7 @@ github.com/go-openapi/analysis v0.19.5/go.mod h1:hkEAkxagaIvIP7VTn8ygJNkd4kAYON2 github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= github.com/go-openapi/errors v0.18.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= +github.com/go-openapi/inflect v0.19.0/go.mod h1:lHpZVlpIQqLyKwJ4N+YSc9hchQy/i12fJykb83CRBH4= github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= github.com/go-openapi/jsonpointer v0.18.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= @@ -346,6 +390,7 @@ github.com/go-resty/resty/v2 v2.6.0/go.mod h1:PwvJS6hvaPkjtjNg9ph+VrSD92bi5Zq73w github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-sql-driver/mysql v1.5.1-0.20200311113236-681ffa848bae/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= @@ -387,6 +432,7 @@ github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY9 github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godror/godror v0.13.3/go.mod h1:2ouUT4kdhUBk7TAkHWD4SN0CdI0pgEQbo8FVHhbSKWg= github.com/gofrs/flock v0.8.0/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPhW6m+TnJw= @@ -411,12 +457,16 @@ github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfb github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= @@ -426,11 +476,13 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.3 h1:fHPg5GQYlCeLIPB9BZqMVR5nR9A+IM5zcgeTdjMYmLA= +github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golangplus/testing v0.0.0-20180327235837-af21d9c3145e/go.mod h1:0AA//k/eakGydO4jKRoRL2j92ZKSzTgj9tclaCrvXHk= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= @@ -439,8 +491,11 @@ github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5a github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= @@ -455,11 +510,22 @@ github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/ github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210715191844-86eeefc3e471/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= @@ -469,6 +535,7 @@ github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ github.com/google/uuid v1.2.0 h1:qJYtXnJRWmpe7m/3XlyhrsLrEURqHRM2kxzoxXqyUDs= github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5 h1:sjZBwGj9Jlw33ImPtvFviGYvseOtDM7hkSKB7+Tv3SM= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gnostic v0.4.1 h1:DLJCy1n/vrD4HPjOvYcT8aYQXpPIzoRZONaYwyycI+I= github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= @@ -478,8 +545,9 @@ github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51 github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.7.3 h1:gnP5JzjVOuiZD07fKKToCAOjS0yOpj/qPETTXCCS6hw= github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= +github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= @@ -537,6 +605,7 @@ github.com/huaweicloud/huaweicloud-sdk-go-v3 v0.0.50 h1:nQ1QIkLxAoFsYyjvpQH3gVIy github.com/huaweicloud/huaweicloud-sdk-go-v3 v0.0.50/go.mod h1:Pp3sd2tx3j9qC7Ij6jGh5phZwTrI+/HUBK90f3Cn2CI= github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= @@ -547,6 +616,7 @@ github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod github.com/jasonlvhit/gocron v0.0.0-20171226191223-3c914c8681c3 h1:s2ARkZWJfkyjrUi8Dj0mMbc1inxeOnIrO9zc3oQX8iU= github.com/jasonlvhit/gocron v0.0.0-20171226191223-3c914c8681c3/go.mod h1:rwi/esz/h+4oWLhbWWK7f6dtmgLzxeZhnwGr7MCsTNk= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4= github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= github.com/jinzhu/now v1.1.2 h1:eVKgfIdy9b6zbWBMgFpfDPoAMifwSZagU9HmEU6zgiI= @@ -561,6 +631,7 @@ github.com/jmoiron/sqlx v1.3.1/go.mod h1:2BljVx/86SuTyjE+aPYlHCTNvZrnJXghYGpNiXL github.com/joho/godotenv v1.3.0 h1:Zjp+RcGpHhGlrMbJzXTrZZPrWj+1vfm90La1wgB6Bhc= github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/jonboulle/clockwork v0.2.0/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= @@ -609,8 +680,9 @@ github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0/go.mod h1:vmVJ0l/dxyfGW6Fm github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.10.0 h1:Zx5DJFEYQXio93kgXnQ09fXNiUKsqv4OUEu2UtGcB1E= github.com/lib/pq v1.10.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lib/pq v1.10.2 h1:AqzbZs4ZoCBp+GtejcpCpcxM3zlSMx29dXbUSeVtJb8= +github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de h1:9TO3cAIGXtEhnIaL+V+BEER86oLrvS+kWobKpbJuye0= github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= @@ -618,8 +690,9 @@ github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0U github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.5 h1:b6kJs+EmPFMYGkow9GiUyCyOvIwYetYJ3fSaWak/Gls= +github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= @@ -629,6 +702,7 @@ github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7 github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE= github.com/markbates/pkger v0.17.1/go.mod h1:0JoVlrol20BSywW79rN3kdFFsE5xYM+rSCQDXbLhiuI= github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0= +github.com/mattermost/xml-roundtrip-validator v0.1.0/go.mod h1:qccnGMcpgwcNaBnxqpJpWWUiPNr5H3O8eDgGV9gT5To= github.com/mattn/go-colorable v0.0.9 h1:UVL0vNpWh04HeJXV0KLcaT7r06gOH2l4OW6ddYRUIY4= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= @@ -640,12 +714,14 @@ github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Ky github.com/mattn/go-oci8 v0.0.7/go.mod h1:wjDx6Xm9q7dFtHJvIlrI99JytznLw5wQ4R+9mNXJwGI= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.7 h1:Ei8KR0497xHyKJPAv59M1dkC+rOZCMBJ+t3fZ+twI54= github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= +github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-shellwords v1.0.11/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= github.com/mattn/go-sqlite3 v1.12.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= -github.com/mattn/go-sqlite3 v1.14.6 h1:dNPt6NO46WmLVt2DLNpwczCmdV5boIZ6g/tlDrlRUbg= github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= +github.com/mattn/go-sqlite3 v1.14.8 h1:gDp86IdQsN/xWjIEmr9MF6o9mpksUgh0fu+9ByFxzIU= +github.com/mattn/go-sqlite3 v1.14.8/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/mattomatic/dijkstra v0.0.0-20130617153013-6f6d134eb237 h1:acuCHBjzG7MFTugvx3buC4m5rLDLaKC9J8C9jtlraRc= github.com/mattomatic/dijkstra v0.0.0-20130617153013-6f6d134eb237/go.mod h1:UOnLAUmVG5paym8pD3C4B9BQylUDC2vXFJJpT7JrlEA= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= @@ -664,8 +740,9 @@ github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUb github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag= +github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/mitchellh/reflectwalk v1.0.1 h1:FVzMWA5RllMAKIdUSC8mdWo3XtwoecrH79BY70sEEpE= github.com/mitchellh/reflectwalk v1.0.1/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= @@ -710,11 +787,13 @@ github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= +github.com/oklog/run v1.1.0/go.mod h1:sVPdnTZT1zYwAJeCMu2Th4T21pA3FPOQRfWjQlk7DVU= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/olekukonko/tablewriter v0.0.1/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/olekukonko/tablewriter v0.0.2/go.mod h1:rSAaSIOAGT9odnlyGlUfAJaoc5w2fSBUmeGDbRWPxyQ= github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= +github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= @@ -760,8 +839,9 @@ github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIw github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml v1.7.0 h1:7utD74fnzVc/cpcyy8sjrlFr5vYpypUixARcHIMIGuI= github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE= +github.com/pelletier/go-toml v1.9.3 h1:zeC5b1GviRUyKYd6OJPvBU/mcVDVoL1OhT17FCt5dSQ= +github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= @@ -827,6 +907,7 @@ github.com/rogpeppe/go-internal v1.4.0 h1:LUa41nrWTQNGhzdsZ5lTnkwbNjj6rXTdazA1cS github.com/rogpeppe/go-internal v1.4.0/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rubenv/sql-migrate v0.0.0-20200616145509-8d140a17f351 h1:HXr/qUllAWv9riaI4zh2eXWKmCSDqVS/XH1MRHLKRwk= github.com/rubenv/sql-migrate v0.0.0-20200616145509-8d140a17f351/go.mod h1:DCgfY80j8GYL7MLEfvcpSFvjD0L5yZq/aZUJmhZklyg= +github.com/russellhaering/goxmldsig v1.1.0/go.mod h1:QK8GhXPB3+AfuCrfo0oRISa9NfzeCpWmxeGnqEpDF9o= github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= @@ -858,8 +939,9 @@ github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJ github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72 h1:qLC7fQah7D6K1B0ujays3HV9gkFtllcxhzImRR7ArPQ= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.2.2 h1:5jhuqJyZCZf2JRofRvN/nIFgIWNzPa3/Vz8mYylgbWc= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +github.com/spf13/afero v1.6.0 h1:xoax2sJ2DT8S8xA2paPFjDCScCNeWsg75VG0DLRreiY= +github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.3.1 h1:nFm6S0SMdyzrzcmThSipiEubIDy8WEXKNZ0UOgiRpng= github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= @@ -868,10 +950,12 @@ github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3 github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= -github.com/spf13/cobra v1.1.3 h1:xghbfqPkxzxP3C/f3n5DdpAbdKLj4ZE4BWQI362l53M= github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= -github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk= +github.com/spf13/cobra v1.2.1 h1:+KmjbUw1hriSNMF55oPrkZcb27aECyrj8V2ytv7kWDw= +github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= +github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.1-0.20171106142849-4c012f6dcd95/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= @@ -880,8 +964,9 @@ github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= -github.com/spf13/viper v1.7.0 h1:xVKxvI7ouOI5I+U9s2eeiUfMaWBVoXA3AWskkrqK0VM= github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= +github.com/spf13/viper v1.8.1 h1:Kq1fyeebqsBfbjZj4EL7gj2IO0mMaiyjYUWcUsl2O44= +github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= github.com/stevvooe/resumable v0.0.0-20180830230917-22b14a53ba50 h1:4bT0pPowCpQImewr+BjzfUKcuFW+KVyB8d1OF3b6oTI= github.com/stevvooe/resumable v0.0.0-20180830230917-22b14a53ba50/go.mod h1:1pdIZTAHUz+HDKDVZ++5xg/duPlhKAIzw9qy42CWYp4= github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= @@ -947,7 +1032,9 @@ github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca/go.mod h1:ce1O1j6Ut github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA= github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yvasiyarov/go-metrics v0.0.0-20150112132944-c25f46c4b940 h1:p7OofyZ509h8DmPLh8Hn+EIIZm/xYhdZHJ9GnXHdr6U= @@ -963,6 +1050,10 @@ go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg= +go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= +go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= +go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= +go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= go.mongodb.org/mongo-driver v1.1.2/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= @@ -973,8 +1064,11 @@ go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3 h1:8sGtKOrtQqkN1bp2AtX+misvLIlOmsEsNd+9NIcPEm8= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= +go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= +go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4= go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= @@ -1022,11 +1116,13 @@ golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200414173820-0848c9571904/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83 h1:/ZScEX8SfEmUGRHs0gxpqteO5nfNW6axyZbBdw9A12g= golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2 h1:It14KIkyBFYkHkwZ7k45minvA9aorojkyjGk9KJ5B/w= +golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -1049,6 +1145,7 @@ golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= @@ -1060,6 +1157,8 @@ golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.1-0.20200828183125-ce943fd02449/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1083,6 +1182,7 @@ golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR golang.org/x/net v0.0.0-20190611141213-3f473d35a33a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -1094,22 +1194,43 @@ golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200505041828-1ed23360d12c/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210224082022-3d97a244fca7/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210428140749-89ef3d95e781 h1:DzZ89McO9/gWPsQXS/FVKAlG02ZjaQ6AlZRBimEYOd0= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= +golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420 h1:a8jGStKg0XqKDlKqjLrXn0ioF5MH36pT7Z0BRTqLhbk= +golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181106182150-f42d05182288/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d h1:TzXSXBo42m9gQenoE3b9BGiEpg5IG2JkU5FkPIawgtw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914 h1:3B43BWw0xEBsLZ/NO1VALz6fppU3481pik+2Ksv45z8= +golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1117,6 +1238,8 @@ golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= @@ -1171,21 +1294,37 @@ golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200831180312-196b9ba8737a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210817190340-bfb29a6856f2 h1:c8PlLMqBbOHoqtjteWm5/kbe6rNY2pbRfbIMVnepueo= golang.org/x/sys v0.0.0-20210817190340-bfb29a6856f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= @@ -1257,14 +1396,31 @@ golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapK golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5 h1:ouewzE6p+/VEB31YYnTbEJdi8pFqKp4P4n85vwo3DHA= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1284,7 +1440,24 @@ google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsb google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= +google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= +google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= +google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= +google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= +google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= +google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= +google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= +google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= +google.golang.org/api v0.52.0 h1:m5FLEd6dp5CU1F0tMWyqDi2XjchviIz8ntzOSz7w8As= +google.golang.org/api v0.52.0/go.mod h1:Him/adpjt0sxtkWViy0b6xyKW/SD71CwdJ7HqJo7SrU= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -1292,6 +1465,7 @@ google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7 google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= @@ -1312,12 +1486,38 @@ google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvx google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c h1:wtujag7C+4D6KMoulW9YauvK2lgdvCMS260jsqqBXr0= +google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= +google.golang.org/genproto v0.0.0-20210721163202-f1cecdd8b78a/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210722135532-667f2b7c528f h1:YORWxaStkWBnWgELOHTmDrqNlFXuVGEbhwbB5iK94bQ= +google.golang.org/genproto v0.0.0-20210722135532-667f2b7c528f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= @@ -1331,11 +1531,23 @@ google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQ google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= +google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0 h1:/9BgsAsa5nWe26HqOlvlgJnqBuktYOLCgjCPqsa56W0= +google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.39.0 h1:Klz8I9kdtkIN6EpHHUOMLCYhTn/2WAe5a0s1hcBkdTI= +google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -1347,11 +1559,10 @@ google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpAD google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/asn1-ber.v1 v1.0.0-20181015200546-f715ec2f112d h1:TxyelI5cVkbREznMhfzycHdkp5cLA7DpE+GKjSslYhM= -gopkg.in/asn1-ber.v1 v1.0.0-20181015200546-f715ec2f112d/go.mod h1:cuepJuh7vyXfUyUwEgHQXw849cJrilpS5NeIjOWESAw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -1367,16 +1578,18 @@ gopkg.in/gorp.v1 v1.7.2 h1:j3DWlAyGVv8whO7AcIWznQ2Yj7yJkn34B8s63GViAAw= gopkg.in/gorp.v1 v1.7.2/go.mod h1:Wo3h+DBQZIxATwftsglhdD/62zRFPhGhTiu5jUJmCaw= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ldap.v2 v2.5.1 h1:wiu0okdNfjlBzg6UWvd1Hn8Y+Ux17/u/4nlk4CQr6tU= -gopkg.in/ldap.v2 v2.5.1/go.mod h1:oI0cpe/D7HRtBQl8aTg+ZmzFUAvu4lsv3eLXMLGFxWk= +gopkg.in/ini.v1 v1.62.0 h1:duBzk771uxoUuOlyRLkHsygud9+5lrlGjdFBb4mSKDU= +gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/mholt/archiver.v3 v3.1.1 h1:sLb5X5fPPc9oU6YatdC+vbY46irElT3kPR0wOS7bjR4= gopkg.in/mholt/archiver.v3 v3.1.1/go.mod h1:EwJV1tr6GQdNZ5IFFVakh0aYAjGLVjqvFVL/b8ZVdMw= gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/square/go-jose.v2 v2.6.0 h1:NGk74WTnPKBNUhNzQX7PYcTLUjoq7mzKk2OKbvwk2iI= +gopkg.in/square/go-jose.v2 v2.6.0/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= @@ -1413,6 +1626,7 @@ honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= k8s.io/api v0.21.0 h1:gu5iGF4V6tfVCQ/R+8Hc0h7H1JuEhzyEi9S4R5LM8+Y= k8s.io/api v0.21.0/go.mod h1:+YbrhBBGgsxbF6o6Kj4KJPJnBmAKuXDeS3E18bgHNVU= k8s.io/apiextensions-apiserver v0.21.0 h1:Nd4uBuweg6ImzbxkC1W7xUNZcCV/8Vt10iTdTIVF3hw= diff --git a/pkg/microservice/policy/core/service/bundle/exemption_urls.go b/pkg/microservice/policy/core/service/bundle/exemption_urls.go index 11ee4884c..3ff426bf0 100644 --- a/pkg/microservice/policy/core/service/bundle/exemption_urls.go +++ b/pkg/microservice/policy/core/service/bundle/exemption_urls.go @@ -55,6 +55,22 @@ var publicURLs = []*policyRule{ Methods: []string{"GET"}, Endpoints: []string{"api/podexec/health"}, }, + { + Methods: []string{"GET", "POST"}, + Endpoints: []string{"login"}, + }, + { + Methods: []string{"*"}, + Endpoints: []string{"api/v1/callback"}, + }, + { + Methods: []string{"*"}, + Endpoints: []string{"dex/**"}, + }, + { + Methods: []string{"GET"}, + Endpoints: []string{""}, + }, } // actions which are allowed for admins only. @@ -187,4 +203,12 @@ var adminURLs = []*policyRule{ Methods: []string{"GET"}, Endpoints: []string{"api/aslan/system/proxy/config"}, }, + { + Methods: []string{"*"}, + Endpoints: []string{"api/v1/users"}, + }, + { + Methods: []string{"*"}, + Endpoints: []string{"api/v1/users/?*"}, + }, } diff --git a/pkg/microservice/systemconfig/core/service/types.go b/pkg/microservice/systemconfig/core/service/types.go index dd87a95f8..90c22df8e 100644 --- a/pkg/microservice/systemconfig/core/service/types.go +++ b/pkg/microservice/systemconfig/core/service/types.go @@ -19,15 +19,27 @@ package service import ( "encoding/json" + "github.com/dexidp/dex/connector/gitea" "github.com/dexidp/dex/connector/github" + "github.com/dexidp/dex/connector/gitlab" + "github.com/dexidp/dex/connector/google" "github.com/dexidp/dex/connector/ldap" + "github.com/dexidp/dex/connector/linkedin" + "github.com/dexidp/dex/connector/microsoft" + "github.com/dexidp/dex/connector/oidc" ) type ConnectorType string const ( - TypeLDAP ConnectorType = "ldap" - TypeGitHub ConnectorType = "github" + TypeLDAP ConnectorType = "ldap" + TypeGitHub ConnectorType = "github" + TypeGitlab ConnectorType = "gitlab" + TypeOIDC ConnectorType = "oidc" + TypeGitea ConnectorType = "gitea" + TypeGoogle ConnectorType = "google" + TypeLinkedIn ConnectorType = "linkedin" + TypeMicrosoft ConnectorType = "microsoft" ) type Connector struct { @@ -53,6 +65,18 @@ func (c *Connector) UnmarshalJSON(data []byte) error { c.Config = &ldap.Config{} case TypeGitHub: c.Config = &github.Config{} + case TypeGitlab: + c.Config = &gitlab.Config{} + case TypeOIDC: + c.Config = &oidc.Config{} + case TypeGitea: + c.Config = &gitea.Config{} + case TypeGoogle: + c.Config = &google.Config{} + case TypeLinkedIn: + c.Config = &linkedin.Config{} + case TypeMicrosoft: + c.Config = µsoft.Config{} } type tmp Connector -- Gitee From abf5959d52ca9c5ad7de363ce602d6bcfef62558 Mon Sep 17 00:00:00 2001 From: lou Date: Mon, 25 Oct 2021 15:31:26 +0800 Subject: [PATCH 101/405] add get_role api Signed-off-by: lou --- pkg/microservice/policy/core/handler/role.go | 22 ++++++++++++++- .../policy/core/handler/router.go | 2 ++ pkg/microservice/policy/core/service/role.go | 27 ++++++++++++++++++- 3 files changed, 49 insertions(+), 2 deletions(-) diff --git a/pkg/microservice/policy/core/handler/role.go b/pkg/microservice/policy/core/handler/role.go index 86bcb70b1..c55ea6b93 100644 --- a/pkg/microservice/policy/core/handler/role.go +++ b/pkg/microservice/policy/core/handler/role.go @@ -87,8 +87,21 @@ func ListRoles(c *gin.Context) { ctx.Err = e.ErrInvalidParam.AddDesc("args projectName can't be empty") return } + ctx.Resp, ctx.Err = service.ListRoles(projectName, ctx.Logger) - return +} + +func GetRole(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + + projectName := c.Query("projectName") + if projectName == "" { + ctx.Err = e.ErrInvalidParam.AddDesc("args projectName can't be empty") + return + } + + ctx.Resp, ctx.Err = service.GetRole(projectName, c.Param("name"), ctx.Logger) } func CreatePublicRole(c *gin.Context) { @@ -112,6 +125,13 @@ func ListPublicRoles(c *gin.Context) { return } +func GetPublicRole(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + + ctx.Resp, ctx.Err = service.GetRole("", c.Param("name"), ctx.Logger) +} + func DeleteRole(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() diff --git a/pkg/microservice/policy/core/handler/router.go b/pkg/microservice/policy/core/handler/router.go index 145d956ba..dc0019f86 100644 --- a/pkg/microservice/policy/core/handler/router.go +++ b/pkg/microservice/policy/core/handler/router.go @@ -28,6 +28,7 @@ func (*Router) Inject(router *gin.RouterGroup) { roles.POST("", CreateRole) roles.PUT("/:name", UpdateRole) roles.GET("", ListRoles) + roles.GET("/:name", GetRole) roles.DELETE("/:name", DeleteRole) } @@ -35,6 +36,7 @@ func (*Router) Inject(router *gin.RouterGroup) { { publicRoles.POST("", CreatePublicRole) publicRoles.GET("", ListPublicRoles) + publicRoles.GET("/:name", GetPublicRole) publicRoles.PUT("/:name", UpdatePublicRole) publicRoles.DELETE("/:name", DeletePublicRole) } diff --git a/pkg/microservice/policy/core/service/role.go b/pkg/microservice/policy/core/service/role.go index 8c40f0ae6..63b21e30b 100644 --- a/pkg/microservice/policy/core/service/role.go +++ b/pkg/microservice/policy/core/service/role.go @@ -17,6 +17,8 @@ limitations under the License. package service import ( + "fmt" + "go.uber.org/zap" "github.com/koderover/zadig/pkg/microservice/policy/core/repository/models" @@ -67,7 +69,8 @@ func UpdateRole(ns string, role *Role, _ *zap.SugaredLogger) error { return mongodb.NewRoleColl().UpdateRole(obj) } -func ListRoles(projectName string, _ *zap.SugaredLogger) (roles []*Role, err error) { +func ListRoles(projectName string, _ *zap.SugaredLogger) ([]*Role, error) { + var roles []*Role projectRoles, err := mongodb.NewRoleColl().ListBy(projectName) if err != nil { return nil, err @@ -80,6 +83,28 @@ func ListRoles(projectName string, _ *zap.SugaredLogger) (roles []*Role, err err return roles, nil } +func GetRole(ns, name string, _ *zap.SugaredLogger) (*Role, error) { + r, found, err := mongodb.NewRoleColl().Get(ns, name) + if err != nil { + return nil, err + } else if !found { + return nil, fmt.Errorf("role %s not found", name) + } + + res := &Role{ + Name: r.Name, + } + for _, ru := range r.Rules { + res.Rules = append(res.Rules, &Rule{ + Verbs: ru.Verbs, + Kind: ru.Kind, + Resources: ru.Resources, + }) + } + + return res, nil +} + func DeleteRole(name string, projectName string, _ *zap.SugaredLogger) (err error) { return mongodb.NewRoleColl().Delete(name, projectName) } -- Gitee From 5d0af5ff56ee999c29ed0342fb87b9b9e957ee3b Mon Sep 17 00:00:00 2001 From: mouuii Date: Mon, 25 Oct 2021 15:43:16 +0800 Subject: [PATCH 102/405] remove jira organization Signed-off-by: mouuii --- .../aslan/core/common/service/git/hook.go | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/pkg/microservice/aslan/core/common/service/git/hook.go b/pkg/microservice/aslan/core/common/service/git/hook.go index f716d9a6d..0499752f3 100644 --- a/pkg/microservice/aslan/core/common/service/git/hook.go +++ b/pkg/microservice/aslan/core/common/service/git/hook.go @@ -26,13 +26,11 @@ var once sync.Once var secret string func GetHookSecret() string { - once.Do(func() { - token, err := crypto.AesEncrypt("hook") - if err != nil { - panic("Failed to get token") - } - secret = token - }) + token, err := crypto.AesEncrypt("hook") + if err != nil { + panic("Failed to get token") + } + secret = token return secret } -- Gitee From 3f04b73a2ab2324cefd54fb71f4c0d9d3ba58e73 Mon Sep 17 00:00:00 2001 From: mouuii Date: Mon, 25 Oct 2021 15:47:01 +0800 Subject: [PATCH 103/405] remove jira organization Signed-off-by: mouuii --- .../aslan/core/common/service/git/hook.go | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/pkg/microservice/aslan/core/common/service/git/hook.go b/pkg/microservice/aslan/core/common/service/git/hook.go index 0499752f3..0c7699d73 100644 --- a/pkg/microservice/aslan/core/common/service/git/hook.go +++ b/pkg/microservice/aslan/core/common/service/git/hook.go @@ -17,20 +17,15 @@ limitations under the License. package git import ( - "sync" - "github.com/koderover/zadig/pkg/tool/crypto" + "github.com/koderover/zadig/pkg/tool/log" ) -var once sync.Once -var secret string - func GetHookSecret() string { token, err := crypto.AesEncrypt("hook") if err != nil { - panic("Failed to get token") + log.DPanic(err) } - secret = token - return secret + return token } -- Gitee From e1bcd59ea3160898d8fee4803a1a75ef248e2a92 Mon Sep 17 00:00:00 2001 From: mouuii Date: Mon, 25 Oct 2021 15:51:03 +0800 Subject: [PATCH 104/405] remove jira organization Signed-off-by: mouuii --- pkg/microservice/aslan/core/common/service/git/hook.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pkg/microservice/aslan/core/common/service/git/hook.go b/pkg/microservice/aslan/core/common/service/git/hook.go index 0c7699d73..a1d992191 100644 --- a/pkg/microservice/aslan/core/common/service/git/hook.go +++ b/pkg/microservice/aslan/core/common/service/git/hook.go @@ -21,8 +21,10 @@ import ( "github.com/koderover/zadig/pkg/tool/log" ) +const plainSecret = "webhook secret" + func GetHookSecret() string { - token, err := crypto.AesEncrypt("hook") + token, err := crypto.AesEncrypt(plainSecret) if err != nil { log.DPanic(err) } -- Gitee From 574e599b159a817586e5fdd8e191033a9024b89d Mon Sep 17 00:00:00 2001 From: lou Date: Mon, 25 Oct 2021 19:39:11 +0800 Subject: [PATCH 105/405] add user binding api Signed-off-by: lou --- .../policy/core/handler/role_binding.go | 21 +++++++++++++++++-- .../policy/core/handler/router.go | 5 +++++ .../core/repository/models/role_binding.go | 4 ++-- .../core/repository/mongodb/role_binding.go | 6 +++--- .../policy/core/service/bundle/opa_bundle.go | 12 +++++------ .../core/service/bundle/opa_bundle_test.go | 12 +++++------ .../policy/core/service/role_binding.go | 16 +++++++------- 7 files changed, 50 insertions(+), 26 deletions(-) diff --git a/pkg/microservice/policy/core/handler/role_binding.go b/pkg/microservice/policy/core/handler/role_binding.go index 874437422..5b1026868 100644 --- a/pkg/microservice/policy/core/handler/role_binding.go +++ b/pkg/microservice/policy/core/handler/role_binding.go @@ -53,7 +53,7 @@ func ListRoleBindings(c *gin.Context) { return } - ctx.Resp, ctx.Err = service.ListRoleBindings(projectName, c.Query("user"), ctx.Logger) + ctx.Resp, ctx.Err = service.ListRoleBindings(projectName, "", ctx.Logger) } func DeleteRoleBinding(c *gin.Context) { @@ -97,5 +97,22 @@ func ListSystemRoleBindings(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - ctx.Resp, ctx.Err = service.ListRoleBindings(service.SystemScope, c.Query("user"), ctx.Logger) + ctx.Resp, ctx.Err = service.ListRoleBindings(service.SystemScope, "", ctx.Logger) +} + +func ListUserBindings(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + + uid := c.Query("uid") + if uid == "" { + ctx.Err = e.ErrInvalidParam.AddDesc("uid is empty") + return + } + projectName := c.Query("projectName") + if projectName == "" { + projectName = service.SystemScope + } + + ctx.Resp, ctx.Err = service.ListRoleBindings(c.Query("projectName"), uid, ctx.Logger) } diff --git a/pkg/microservice/policy/core/handler/router.go b/pkg/microservice/policy/core/handler/router.go index dc0019f86..e53d01d02 100644 --- a/pkg/microservice/policy/core/handler/router.go +++ b/pkg/microservice/policy/core/handler/router.go @@ -62,6 +62,11 @@ func (*Router) Inject(router *gin.RouterGroup) { systemRoleBindings.DELETE("/:name", DeleteSystemRoleBinding) } + userBindings := router.Group("userbindings") + { + userBindings.GET("", ListUserBindings) + } + bundles := router.Group("bundles") { bundles.GET("/:name", DownloadBundle) diff --git a/pkg/microservice/policy/core/repository/models/role_binding.go b/pkg/microservice/policy/core/repository/models/role_binding.go index 956b1b1b7..64d24dca3 100644 --- a/pkg/microservice/policy/core/repository/models/role_binding.go +++ b/pkg/microservice/policy/core/repository/models/role_binding.go @@ -41,8 +41,8 @@ type RoleBinding struct { type Subject struct { // Kind of object being referenced. allowed values are "User", "Group". Kind SubjectKind `bson:"kind" json:"kind"` - // Name of the object being referenced. - Name string `bson:"name" json:"name"` + // unique identifier of the object being referenced. + UID string `bson:"uid" json:"uid"` } // RoleRef contains information that points to the role being used diff --git a/pkg/microservice/policy/core/repository/mongodb/role_binding.go b/pkg/microservice/policy/core/repository/mongodb/role_binding.go index 722050fe8..28e02ed07 100644 --- a/pkg/microservice/policy/core/repository/mongodb/role_binding.go +++ b/pkg/microservice/policy/core/repository/mongodb/role_binding.go @@ -78,13 +78,13 @@ func (c *RoleBindingColl) List() ([]*models.RoleBinding, error) { return res, nil } -func (c *RoleBindingColl) ListBy(projectName, user string) ([]*models.RoleBinding, error) { +func (c *RoleBindingColl) ListBy(projectName, uid string) ([]*models.RoleBinding, error) { var res []*models.RoleBinding ctx := context.Background() query := bson.M{"namespace": projectName} - if user != "" { - query["subjects.name"] = user + if uid != "" { + query["subjects.uid"] = uid query["subjects.kind"] = models.UserKind } diff --git a/pkg/microservice/policy/core/service/bundle/opa_bundle.go b/pkg/microservice/policy/core/service/bundle/opa_bundle.go index bf032b8e1..855b2c03f 100644 --- a/pkg/microservice/policy/core/service/bundle/opa_bundle.go +++ b/pkg/microservice/policy/core/service/bundle/opa_bundle.go @@ -77,7 +77,7 @@ type rule struct { } type roleBinding struct { - User string `json:"user"` + UID string `json:"uid"` Bindings bindings `json:"bindings"` } @@ -183,7 +183,7 @@ type roleBindings []*roleBinding func (o roleBindings) Len() int { return len(o) } func (o roleBindings) Swap(i, j int) { o[i], o[j] = o[j], o[i] } func (o roleBindings) Less(i, j int) bool { - return o[i].User < o[j].User + return o[i].UID < o[j].UID } func generateOPARoles(roles []*models.Role, policies []*models.Policy) *opaRoles { @@ -227,10 +227,10 @@ func generateOPARoleBindings(rbs []*models.RoleBinding) *opaRoleBindings { for _, rb := range rbs { for _, s := range rb.Subjects { if s.Kind == models.UserKind { - if _, ok := userRoleMap[s.Name]; !ok { - userRoleMap[s.Name] = make(map[string][]*roleRef) + if _, ok := userRoleMap[s.UID]; !ok { + userRoleMap[s.UID] = make(map[string][]*roleRef) } - userRoleMap[s.Name][rb.Namespace] = append(userRoleMap[s.Name][rb.Namespace], &roleRef{Name: rb.RoleRef.Name, Namespace: rb.RoleRef.Namespace}) + userRoleMap[s.UID][rb.Namespace] = append(userRoleMap[s.UID][rb.Namespace], &roleRef{Name: rb.RoleRef.Name, Namespace: rb.RoleRef.Namespace}) } } } @@ -242,7 +242,7 @@ func generateOPARoleBindings(rbs []*models.RoleBinding) *opaRoleBindings { bindingsData = append(bindingsData, &binding{Namespace: n, RoleRefs: b}) } sort.Sort(bindings(bindingsData)) - data.RoleBindings = append(data.RoleBindings, &roleBinding{User: u, Bindings: bindingsData}) + data.RoleBindings = append(data.RoleBindings, &roleBinding{UID: u, Bindings: bindingsData}) } sort.Sort(data.RoleBindings) diff --git a/pkg/microservice/policy/core/service/bundle/opa_bundle_test.go b/pkg/microservice/policy/core/service/bundle/opa_bundle_test.go index 62a5e86f0..80c131c67 100644 --- a/pkg/microservice/policy/core/service/bundle/opa_bundle_test.go +++ b/pkg/microservice/policy/core/service/bundle/opa_bundle_test.go @@ -59,11 +59,11 @@ var testBinding1 = ` "subjects": [ { "kind": "user", - "name": "alice" + "uid": "alice" }, { "kind": "user", - "name": "bob" + "uid": "bob" } ], "roleRef": { @@ -80,7 +80,7 @@ var testBinding2 = ` "subjects": [ { "kind": "user", - "name": "alice" + "uid": "alice" } ], "roleRef": { @@ -149,7 +149,7 @@ var expectOPARoleBindings = ` { "role_bindings": [ { - "user": "alice", + "uid": "alice", "role_refs": [ { "name": "author", @@ -162,7 +162,7 @@ var expectOPARoleBindings = ` ] }, { - "user": "bob", + "uid": "bob", "role_refs": [ { "name": "superuser", @@ -193,7 +193,7 @@ var _ = Describe("Testing generate OPA roles and bindings", func() { }) It("should work as expected", func() { - data := generateOPARoles(testRoles) + data := generateOPARoles(testRoles, nil) actual, err := json.MarshalIndent(data, "", " ") Expect(err).ShouldNot(HaveOccurred()) Expect(string(actual)).To(Equal(strings.TrimSpace(expectOPARoles))) diff --git a/pkg/microservice/policy/core/service/role_binding.go b/pkg/microservice/policy/core/service/role_binding.go index c89adb9a8..4aeb6ed47 100644 --- a/pkg/microservice/policy/core/service/role_binding.go +++ b/pkg/microservice/policy/core/service/role_binding.go @@ -27,7 +27,7 @@ import ( type RoleBinding struct { Name string `json:"name"` - User string `json:"user"` + UID string `json:"uid"` Role string `json:"role"` Global bool `json:"global"` } @@ -51,7 +51,7 @@ func CreateRoleBinding(ns string, rb *RoleBinding, logger *zap.SugaredLogger) er obj := &models.RoleBinding{ Name: rb.Name, Namespace: ns, - Subjects: []*models.Subject{{Kind: models.UserKind, Name: rb.User}}, + Subjects: []*models.Subject{{Kind: models.UserKind, UID: rb.UID}}, RoleRef: &models.RoleRef{ Name: role.Name, Namespace: role.Namespace, @@ -61,8 +61,9 @@ func CreateRoleBinding(ns string, rb *RoleBinding, logger *zap.SugaredLogger) er return mongodb.NewRoleBindingColl().Create(obj) } -func ListRoleBindings(ns, user string, _ *zap.SugaredLogger) (roleBindings []*RoleBinding, err error) { - modelRoleBindings, err := mongodb.NewRoleBindingColl().ListBy(ns, user) +func ListRoleBindings(ns, uid string, _ *zap.SugaredLogger) ([]*RoleBinding, error) { + var roleBindings []*RoleBinding + modelRoleBindings, err := mongodb.NewRoleBindingColl().ListBy(ns, uid) if err != nil { return nil, err } @@ -71,13 +72,14 @@ func ListRoleBindings(ns, user string, _ *zap.SugaredLogger) (roleBindings []*Ro roleBindings = append(roleBindings, &RoleBinding{ Name: v.Name, Role: v.RoleRef.Name, - User: v.Subjects[0].Name, + UID: v.Subjects[0].UID, Global: v.Namespace == "", }) } - return + + return roleBindings, nil } -func DeleteRoleBinding(name string, projectName string, logger *zap.SugaredLogger) error { +func DeleteRoleBinding(name string, projectName string, _ *zap.SugaredLogger) error { return mongodb.NewRoleBindingColl().Delete(name, projectName) } -- Gitee From 7fb7831f9f54c3589a565074482e6db231defb86 Mon Sep 17 00:00:00 2001 From: lou Date: Mon, 25 Oct 2021 19:54:15 +0800 Subject: [PATCH 106/405] user name to uid Signed-off-by: lou --- .../policy/core/service/bundle/rego/authz.rego | 12 ++++++------ .../service/bundle/rego/test_data/bindings/data.json | 6 +++--- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/pkg/microservice/policy/core/service/bundle/rego/authz.rego b/pkg/microservice/policy/core/service/bundle/rego/authz.rego index 79686a41f..d3bb99c26 100644 --- a/pkg/microservice/policy/core/service/bundle/rego/authz.rego +++ b/pkg/microservice/policy/core/service/bundle/rego/authz.rego @@ -22,7 +22,7 @@ allow { # Allow all valid users to visit exempted urls. allow { url_is_exempted - claims.name != "" + claims.uid != "" } # Allow admins to do anything. @@ -92,14 +92,14 @@ project_name := pn { # get all projects which are visible by current user user_projects[project] { some i - data.bindings.role_bindings[i].user == claims.name + data.bindings.role_bindings[i].uid == claims.uid project := data.bindings.role_bindings[i].bindings[_].namespace } # get all projects which are visible by all users (the user name is "*") user_projects[project] { some i - data.bindings.role_bindings[i].user == "*" + data.bindings.role_bindings[i].uid == "*" project := data.bindings.role_bindings[i].bindings[_].namespace } @@ -133,14 +133,14 @@ user_visible_projects[project] { all_roles[role_ref] { some i - data.bindings.role_bindings[i].user == claims.name + data.bindings.role_bindings[i].uid == claims.uid role_ref := data.bindings.role_bindings[i].bindings[j].role_refs[_] } # only roles under the given project are allowed allowed_roles[role_ref] { some i - data.bindings.role_bindings[i].user == claims.name + data.bindings.role_bindings[i].uid == claims.uid data.bindings.role_bindings[i].bindings[j].namespace == project_name role_ref := data.bindings.role_bindings[i].bindings[j].role_refs[_] } @@ -148,7 +148,7 @@ allowed_roles[role_ref] { # if the proejct is visible by all users (the user name is "*"), the bound roles are also allowed allowed_roles[role_ref] { some i - data.bindings.role_bindings[i].user == "*" + data.bindings.role_bindings[i].uid == "*" project := data.bindings.role_bindings[i].bindings[_].namespace == project_name role_ref := data.bindings.role_bindings[i].bindings[j].role_refs[_] } diff --git a/pkg/microservice/policy/core/service/bundle/rego/test_data/bindings/data.json b/pkg/microservice/policy/core/service/bundle/rego/test_data/bindings/data.json index fb99ca388..c13fae78e 100644 --- a/pkg/microservice/policy/core/service/bundle/rego/test_data/bindings/data.json +++ b/pkg/microservice/policy/core/service/bundle/rego/test_data/bindings/data.json @@ -1,7 +1,7 @@ { "role_bindings": [ { - "user": "alice", + "uid": "alice", "bindings": [ { "namespace": "", @@ -41,7 +41,7 @@ ] }, { - "user": "*", + "uid": "*", "bindings": [ { "namespace": "project3", @@ -64,7 +64,7 @@ ] }, { - "user": "bob", + "uid": "bob", "bindings": [ { "namespace": "project4", -- Gitee From 7cdecba8a28ec623ce9c3489eaa4474f94f50a8d Mon Sep 17 00:00:00 2001 From: mouuii Date: Mon, 25 Oct 2021 20:03:10 +0800 Subject: [PATCH 107/405] remove feature Signed-off-by: mouuii --- .../core/common/repository/models/queue.go | 5 +- .../common/repository/models/task/model.go | 5 +- .../core/common/service/template_product.go | 59 +------------------ .../aslan/core/project/service/product.go | 13 ---- .../core/workflow/service/workflow/convert.go | 2 - .../cron/core/service/scheduler/scheduler.go | 18 ------ .../core/service/taskplugin/build.go | 7 --- .../core/service/types/task/model.go | 5 +- pkg/shared/poetry/check.go | 37 ------------ 9 files changed, 9 insertions(+), 142 deletions(-) delete mode 100644 pkg/shared/poetry/check.go diff --git a/pkg/microservice/aslan/core/common/repository/models/queue.go b/pkg/microservice/aslan/core/common/repository/models/queue.go index d6279a8b3..4e1d29520 100644 --- a/pkg/microservice/aslan/core/common/repository/models/queue.go +++ b/pkg/microservice/aslan/core/common/repository/models/queue.go @@ -81,9 +81,8 @@ type Queue struct { TriggerBy *TriggerBy `json:"trigger_by,omitempty" bson:"trigger_by,omitempty"` - Features []string `bson:"features" json:"features"` - IsRestart bool `bson:"is_restart" json:"is_restart"` - StorageEndpoint string `bson:"storage_endpoint" json:"storage_endpoint"` + IsRestart bool `bson:"is_restart" json:"is_restart"` + StorageEndpoint string `bson:"storage_endpoint" json:"storage_endpoint"` } type TriggerBy struct { diff --git a/pkg/microservice/aslan/core/common/repository/models/task/model.go b/pkg/microservice/aslan/core/common/repository/models/task/model.go index b71dabdb5..04f9b8a31 100644 --- a/pkg/microservice/aslan/core/common/repository/models/task/model.go +++ b/pkg/microservice/aslan/core/common/repository/models/task/model.go @@ -84,9 +84,8 @@ type Task struct { TriggerBy *models.TriggerBy `json:"trigger_by,omitempty" bson:"trigger_by,omitempty"` - Features []string `bson:"features" json:"features"` - IsRestart bool `bson:"is_restart" json:"is_restart"` - StorageEndpoint string `bson:"storage_endpoint" json:"storage_endpoint"` + IsRestart bool `bson:"is_restart" json:"is_restart"` + StorageEndpoint string `bson:"storage_endpoint" json:"storage_endpoint"` } //type RenderInfo struct { diff --git a/pkg/microservice/aslan/core/common/service/template_product.go b/pkg/microservice/aslan/core/common/service/template_product.go index bb4b46715..a303bf30f 100644 --- a/pkg/microservice/aslan/core/common/service/template_product.go +++ b/pkg/microservice/aslan/core/common/service/template_product.go @@ -18,20 +18,16 @@ package service import ( "fmt" - "strings" "sync" "go.uber.org/zap" - "github.com/koderover/zadig/pkg/microservice/aslan/config" "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/models" "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/models/template" commonrepo "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/mongodb" templaterepo "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/mongodb/template" "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/collie" - "github.com/koderover/zadig/pkg/microservice/aslan/internal/cache" "github.com/koderover/zadig/pkg/setting" - "github.com/koderover/zadig/pkg/shared/poetry" e "github.com/koderover/zadig/pkg/tool/errors" ) @@ -40,9 +36,9 @@ type PipelineResource struct { Kind string `json:"kind"` } -type Features struct { - Features []string `json:"features"` -} +//type Features struct { +// Features []string `json:"features"` +//} func GetProductTemplate(productName string, log *zap.SugaredLogger) (*template.Product, error) { resp, err := templaterepo.NewProductColl().Find(productName) @@ -52,26 +48,6 @@ func GetProductTemplate(productName string, log *zap.SugaredLogger) (*template.P } totalFreeStyles := make([]*collie.CiPipelineResource, 0) - features, err := GetFeatures(log) - if err != nil { - log.Errorf("GetProductTemplate GetFeatures err : %v", err) - } - - if strings.Contains(features, string(config.FreestyleType)) { - // CI场景onboarding流程处于第二步时,需要返回ci工作流id,用于前端跳转 - collieAPIAddress := config.CollieAPIAddress() - cl := collie.New(collieAPIAddress) - if resp.ProductFeature != nil && resp.ProductFeature.DevelopHabit == "yaml" && resp.OnboardingStatus == setting.OnboardingStatusSecond && collieAPIAddress != "" { - ciPipelines, err := cl.ListCIPipelines(productName, log) - if err != nil { - log.Errorf("GetProductTemplate error: %v", err) - return nil, e.ErrGetProduct.AddDesc(err.Error()) - } - if len(ciPipelines) != 0 { - resp.CiPipelineID = ciPipelines[0].Metadata.ID - } - } - } err = FillProductTemplateVars([]*template.Product{resp}, log) if err != nil { @@ -116,15 +92,6 @@ func GetProductTemplate(productName string, log *zap.SugaredLogger) (*template.P return resp, fmt.Errorf("Pipeline.List err : %v", err) } - if strings.Contains(features, string(config.FreestyleType)) { - collieAPIAddress := config.CollieAPIAddress() - cl := collie.New(collieAPIAddress) - totalFreeStyles, err = cl.ListCIPipelines(productName, log) - if err != nil { - log.Errorf("GetProductTemplate freestyle.List err : %v", err) - } - } - totalEnvTemplateServiceNum := 0 for _, services := range resp.Services { totalEnvTemplateServiceNum += len(services) @@ -165,26 +132,6 @@ func GetProductTemplate(productName string, log *zap.SugaredLogger) (*template.P return resp, nil } -func GetFeatures(log *zap.SugaredLogger) (string, error) { - featuresByteKey := []byte("features") - featuresByteValue, err := cache.Get(featuresByteKey) - if err != nil { - poetryCtl := poetry.New(config.PoetryAPIServer()) - fs, err := poetryCtl.ListFeatures() - if err != nil { - return "", err - } - cacheValue := strings.Join(fs, ",") - // 一天过期 - if err = cache.Set(featuresByteKey, []byte(cacheValue), 86400); err != nil { - log.Errorf("getFeatures set cache err:%v", err) - } - return cacheValue, nil - } - - return string(featuresByteValue), nil -} - func FillProductTemplateVars(productTemplates []*template.Product, log *zap.SugaredLogger) error { var ( wg sync.WaitGroup diff --git a/pkg/microservice/aslan/core/project/service/product.go b/pkg/microservice/aslan/core/project/service/product.go index ee01dfe0b..f0948b0d3 100644 --- a/pkg/microservice/aslan/core/project/service/product.go +++ b/pkg/microservice/aslan/core/project/service/product.go @@ -35,7 +35,6 @@ import ( commonrepo "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/mongodb" templaterepo "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/mongodb/template" commonservice "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service" - "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/collie" environmentservice "github.com/koderover/zadig/pkg/microservice/aslan/core/environment/service" workflowservice "github.com/koderover/zadig/pkg/microservice/aslan/core/workflow/service/workflow" "github.com/koderover/zadig/pkg/setting" @@ -339,18 +338,6 @@ func DeleteProductTemplate(userName, productName, requestID string, log *zap.Sug return err } - //删除自由编排工作流 - features, err := commonservice.GetFeatures(log) - if err != nil { - log.Errorf("DeleteProductTemplate productName %s getFeatures err: %v", productName, err) - } - if strings.Contains(features, string(config.FreestyleType)) { - collieClient := collie.New(config.CollieAPIAddress()) - if err = collieClient.DeleteCIPipelines(productName, log); err != nil { - log.Errorf("DeleteProductTemplate Delete productName %s freestyle pipeline err: %v", productName, err) - } - } - err = templaterepo.NewProductColl().Delete(productName) if err != nil { log.Errorf("ProductTmpl.Delete error: %v", err) diff --git a/pkg/microservice/aslan/core/workflow/service/workflow/convert.go b/pkg/microservice/aslan/core/workflow/service/workflow/convert.go index 811627426..8b7ab9b82 100644 --- a/pkg/microservice/aslan/core/workflow/service/workflow/convert.go +++ b/pkg/microservice/aslan/core/workflow/service/workflow/convert.go @@ -69,7 +69,6 @@ func ConvertQueueToTask(queueTask *commonmodels.Queue) *task.Task { RwLock: queueTask.RwLock, ResetImage: queueTask.ResetImage, TriggerBy: queueTask.TriggerBy, - Features: queueTask.Features, IsRestart: queueTask.IsRestart, StorageEndpoint: queueTask.StorageEndpoint, } @@ -115,7 +114,6 @@ func ConvertTaskToQueue(task *task.Task) *commonmodels.Queue { RwLock: task.RwLock, ResetImage: task.ResetImage, TriggerBy: task.TriggerBy, - Features: task.Features, IsRestart: task.IsRestart, StorageEndpoint: task.StorageEndpoint, } diff --git a/pkg/microservice/cron/core/service/scheduler/scheduler.go b/pkg/microservice/cron/core/service/scheduler/scheduler.go index 5f45ae44b..ec390f33c 100644 --- a/pkg/microservice/cron/core/service/scheduler/scheduler.go +++ b/pkg/microservice/cron/core/service/scheduler/scheduler.go @@ -20,7 +20,6 @@ import ( "fmt" stdlog "log" "os" - "strings" "time" "github.com/jasonlvhit/gocron" @@ -33,7 +32,6 @@ import ( "github.com/koderover/zadig/pkg/microservice/cron/core/service" "github.com/koderover/zadig/pkg/microservice/cron/core/service/client" "github.com/koderover/zadig/pkg/setting" - "github.com/koderover/zadig/pkg/shared/poetry" "github.com/koderover/zadig/pkg/tool/log" ) @@ -141,12 +139,6 @@ func (c *CronClient) Init() { // 测试管理的定时任务触发 c.InitTestScheduler() - // 自由编排工作流定时任务触发 - features, _ := getFeatures() - if strings.Contains(features, freestyleType) { - c.InitColliePipelineScheduler() - } - // 定时清理环境 c.InitCleanProductScheduler() // 定时初始化构建数据 @@ -159,16 +151,6 @@ func (c *CronClient) Init() { c.InitHealthCheckScheduler() } -func getFeatures() (string, error) { - cl := poetry.New(configbase.PoetryServiceAddress()) - fs, err := cl.ListFeatures() - if err != nil { - return "", err - } - - return strings.Join(fs, ","), nil -} - // InitCleanJobScheduler ... func (c *CronClient) InitCleanJobScheduler() { diff --git a/pkg/microservice/warpdrive/core/service/taskplugin/build.go b/pkg/microservice/warpdrive/core/service/taskplugin/build.go index 1867fd455..630004f86 100644 --- a/pkg/microservice/warpdrive/core/service/taskplugin/build.go +++ b/pkg/microservice/warpdrive/core/service/taskplugin/build.go @@ -29,11 +29,9 @@ import ( "k8s.io/apimachinery/pkg/util/sets" "sigs.k8s.io/controller-runtime/pkg/client" - configbase "github.com/koderover/zadig/pkg/config" "github.com/koderover/zadig/pkg/microservice/warpdrive/config" "github.com/koderover/zadig/pkg/microservice/warpdrive/core/service/types/task" "github.com/koderover/zadig/pkg/setting" - "github.com/koderover/zadig/pkg/shared/poetry" krkubeclient "github.com/koderover/zadig/pkg/tool/kube/client" "github.com/koderover/zadig/pkg/tool/kube/updater" ) @@ -162,11 +160,6 @@ func (p *BuildTaskPlugin) Run(ctx context.Context, pipelineTask *task.Task, pipe Installs: p.Task.InstallCtx, } - poetryClient := poetry.New(configbase.PoetryServiceAddress()) - if fs, err := poetryClient.ListFeatures(); err == nil { - pipelineTask.Features = fs - } - if p.Task.BuildStatus == nil { p.Task.BuildStatus = &task.BuildStatus{} } diff --git a/pkg/microservice/warpdrive/core/service/types/task/model.go b/pkg/microservice/warpdrive/core/service/types/task/model.go index 8fc7400a9..6b9af3a24 100644 --- a/pkg/microservice/warpdrive/core/service/types/task/model.go +++ b/pkg/microservice/warpdrive/core/service/types/task/model.go @@ -81,9 +81,8 @@ type Task struct { TriggerBy *TriggerBy `json:"trigger_by,omitempty" bson:"trigger_by,omitempty"` - Features []string `bson:"features" json:"features"` - IsRestart bool `bson:"is_restart" json:"is_restart"` - StorageEndpoint string `bson:"storage_endpoint" json:"storage_endpoint"` + IsRestart bool `bson:"is_restart" json:"is_restart"` + StorageEndpoint string `bson:"storage_endpoint" json:"storage_endpoint"` } type RenderInfo struct { diff --git a/pkg/shared/poetry/check.go b/pkg/shared/poetry/check.go deleted file mode 100644 index d205c5121..000000000 --- a/pkg/shared/poetry/check.go +++ /dev/null @@ -1,37 +0,0 @@ -/* -Copyright 2021 The KodeRover 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 poetry - -import ( - "github.com/koderover/zadig/pkg/tool/httpclient" -) - -type features struct { - Features []string `json:"features"` -} - -func (c *Client) ListFeatures() ([]string, error) { - url := "/directory/check" - - fs := &features{} - _, err := c.Get(url, httpclient.SetResult(fs)) - if err != nil { - return nil, err - } - - return fs.Features, nil -} -- Gitee From 9604ec0a9b00162f2226e3ef10876822bd6f3cac Mon Sep 17 00:00:00 2001 From: mouuii Date: Mon, 25 Oct 2021 20:04:19 +0800 Subject: [PATCH 108/405] remove feature Signed-off-by: mouuii --- .../aslan/core/common/service/template_product.go | 4 ---- 1 file changed, 4 deletions(-) diff --git a/pkg/microservice/aslan/core/common/service/template_product.go b/pkg/microservice/aslan/core/common/service/template_product.go index a303bf30f..916d490db 100644 --- a/pkg/microservice/aslan/core/common/service/template_product.go +++ b/pkg/microservice/aslan/core/common/service/template_product.go @@ -36,10 +36,6 @@ type PipelineResource struct { Kind string `json:"kind"` } -//type Features struct { -// Features []string `json:"features"` -//} - func GetProductTemplate(productName string, log *zap.SugaredLogger) (*template.Product, error) { resp, err := templaterepo.NewProductColl().Find(productName) if err != nil { -- Gitee From 96ac7757b99997eb31f725af503037eee2a0440d Mon Sep 17 00:00:00 2001 From: mouuii Date: Mon, 25 Oct 2021 20:08:20 +0800 Subject: [PATCH 109/405] remove feature Signed-off-by: mouuii --- .../cron/core/service/scheduler/scheduler.go | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/pkg/microservice/cron/core/service/scheduler/scheduler.go b/pkg/microservice/cron/core/service/scheduler/scheduler.go index ec390f33c..11997133f 100644 --- a/pkg/microservice/cron/core/service/scheduler/scheduler.go +++ b/pkg/microservice/cron/core/service/scheduler/scheduler.go @@ -191,16 +191,6 @@ func (c *CronClient) InitTestScheduler() { c.Schedulers[UpsertTestScheduler].Start() } -// InitJobScheduler ... -func (c *CronClient) InitColliePipelineScheduler() { - - c.Schedulers[UpsertColliePipelineScheduler] = gocron.NewScheduler() - - c.Schedulers[UpsertColliePipelineScheduler].Every(1).Minutes().Do(c.UpsertColliePipelineScheduler, c.log) - - c.Schedulers[UpsertColliePipelineScheduler].Start() -} - // InitBuildStatScheduler ... func (c *CronClient) InitBuildStatScheduler() { -- Gitee From f2325fd58247ddb6b774001ba6bcce884f0e3164 Mon Sep 17 00:00:00 2001 From: lou Date: Tue, 26 Oct 2021 09:40:23 +0800 Subject: [PATCH 110/405] add privileged urls Signed-off-by: lou --- .../core/service/bundle/exemption_urls.go | 107 ++++++++++++++---- .../policy/core/service/bundle/opa_bundle.go | 26 +---- .../core/service/bundle/rego/authz.rego | 22 ++-- .../bundle/rego/test_data/bindings/data.json | 11 +- .../core/service/bundle/rego/test_input.json | 2 +- 5 files changed, 104 insertions(+), 64 deletions(-) diff --git a/pkg/microservice/policy/core/service/bundle/exemption_urls.go b/pkg/microservice/policy/core/service/bundle/exemption_urls.go index 3ff426bf0..7d161d006 100644 --- a/pkg/microservice/policy/core/service/bundle/exemption_urls.go +++ b/pkg/microservice/policy/core/service/bundle/exemption_urls.go @@ -5,9 +5,8 @@ package bundle // how to make a decision without being aware of the detailed rules. type exemptionURLs struct { - Global rules `json:"global"` // global urls are only controlled by AuthN, and it is visible for all users - Namespaced rules `json:"namespaced"` // global urls are only controlled by AuthN, and it is visible for users under certain projects Public rules `json:"public"` // public urls are not controlled by AuthN and AuthZ + Privileged rules `json:"privileged"` // privileged urls can only be visited by system admins Registered rules `json:"registered"` // registered urls are the entire list of urls which are controlled by AuthZ, which means that if an url is not in this list, it is not controlled by AuthZ } @@ -16,20 +15,6 @@ type policyRule struct { Endpoints []string `json:"endpoints"` } -var globalURLs = []*policyRule{ - { - Methods: []string{"*"}, - Endpoints: []string{"api/v1/version"}, - }, -} - -var namespacedURLs = []*policyRule{ - { - Methods: []string{"*"}, - Endpoints: []string{"api/v1/version1"}, - }, -} - var publicURLs = []*policyRule{ { Methods: []string{"GET"}, @@ -71,12 +56,16 @@ var publicURLs = []*policyRule{ Methods: []string{"GET"}, Endpoints: []string{""}, }, + { + Methods: []string{"GET"}, + Endpoints: []string{"api/directory/check"}, + }, } -// actions which are allowed for admins only. -var adminURLs = []*policyRule{ +// actions which are allowed for system admins only. +var systemAdminURLs = []*policyRule{ { - Methods: []string{"POST", "PUT"}, + Methods: []string{"POST"}, Endpoints: []string{"api/aslan/project/products"}, }, { @@ -204,11 +193,85 @@ var adminURLs = []*policyRule{ Endpoints: []string{"api/aslan/system/proxy/config"}, }, { - Methods: []string{"*"}, + Methods: []string{"GET"}, + Endpoints: []string{"api/v1/users/?*"}, + }, + { + Methods: []string{"POST"}, Endpoints: []string{"api/v1/users"}, }, { - Methods: []string{"*"}, - Endpoints: []string{"api/v1/users/?*"}, + Methods: []string{"POST"}, + Endpoints: []string{"api/v1/public-roles"}, + }, + { + Methods: []string{"PUT", "DELETE"}, + Endpoints: []string{"api/v1/public-roles/?*"}, + }, + { + Methods: []string{"GET", "POST"}, + Endpoints: []string{"api/v1/system-roles"}, + }, + { + Methods: []string{"DELETE"}, + Endpoints: []string{"api/v1/system-roles/?*"}, + }, + { + Methods: []string{"GET", "POST"}, + Endpoints: []string{"api/v1/system-rolebindings"}, + }, + { + Methods: []string{"DELETE"}, + Endpoints: []string{"api/v1/system-rolebindings/?*"}, }, } + +// actions which are allowed for system admins only. +var projectAdminURLs = []*policyRule{ + { + Methods: []string{"PUT"}, + Endpoints: []string{"api/aslan/project/products"}, + }, + { + Methods: []string{"DELETE"}, + Endpoints: []string{"api/aslan/project/products/?*"}, + }, + { + Methods: []string{"GET"}, + Endpoints: []string{"api/v1/users"}, + }, + { + Methods: []string{"GET"}, + Endpoints: []string{"api/v1/roles"}, + }, + { + Methods: []string{"GET"}, + Endpoints: []string{"api/v1/roles/?*"}, + }, + { + Methods: []string{"POST"}, + Endpoints: []string{"api/v1/roles"}, + }, + { + Methods: []string{"PUT", "DELETE"}, + Endpoints: []string{"api/v1/roles/?*"}, + }, + { + Methods: []string{"GET"}, + Endpoints: []string{"api/v1/public-roles"}, + }, + { + Methods: []string{"GET"}, + Endpoints: []string{"api/v1/public-roles/?*"}, + }, + { + Methods: []string{"GET", "POST"}, + Endpoints: []string{"api/v1/rolebindings"}, + }, + { + Methods: []string{"DELETE"}, + Endpoints: []string{"api/v1/rolebindings/?*"}, + }, +} + +var adminURLs = append(systemAdminURLs, projectAdminURLs...) diff --git a/pkg/microservice/policy/core/service/bundle/opa_bundle.go b/pkg/microservice/policy/core/service/bundle/opa_bundle.go index 855b2c03f..84cdf4dbe 100644 --- a/pkg/microservice/policy/core/service/bundle/opa_bundle.go +++ b/pkg/microservice/policy/core/service/bundle/opa_bundle.go @@ -253,43 +253,29 @@ func generateOPARoleBindings(rbs []*models.RoleBinding) *opaRoleBindings { func generateOPAExemptionURLs(policies []*models.Policy) *exemptionURLs { data := &exemptionURLs{} - for _, r := range globalURLs { - if len(r.Methods) == 1 && r.Methods[0] == models.MethodAll { - r.Methods = AllMethods - } - for _, method := range r.Methods { - for _, endpoint := range r.Endpoints { - data.Global = append(data.Global, &rule{Method: method, Endpoint: endpoint}) - } - } - } - sort.Sort(data.Global) - - for _, r := range namespacedURLs { + for _, r := range publicURLs { if len(r.Methods) == 1 && r.Methods[0] == models.MethodAll { r.Methods = AllMethods } for _, method := range r.Methods { for _, endpoint := range r.Endpoints { - data.Namespaced = append(data.Namespaced, &rule{Method: method, Endpoint: endpoint}) + data.Public = append(data.Public, &rule{Method: method, Endpoint: endpoint}) } } } + sort.Sort(data.Public) - sort.Sort(data.Namespaced) - - for _, r := range publicURLs { + for _, r := range systemAdminURLs { if len(r.Methods) == 1 && r.Methods[0] == models.MethodAll { r.Methods = AllMethods } for _, method := range r.Methods { for _, endpoint := range r.Endpoints { - data.Public = append(data.Public, &rule{Method: method, Endpoint: endpoint}) + data.Privileged = append(data.Privileged, &rule{Method: method, Endpoint: endpoint}) } } } - - sort.Sort(data.Public) + sort.Sort(data.Privileged) resourceMappings := getResourceActionMappings(policies) for _, resourceMappings := range resourceMappings { diff --git a/pkg/microservice/policy/core/service/bundle/rego/authz.rego b/pkg/microservice/policy/core/service/bundle/rego/authz.rego index d3bb99c26..da9813520 100644 --- a/pkg/microservice/policy/core/service/bundle/rego/authz.rego +++ b/pkg/microservice/policy/core/service/bundle/rego/authz.rego @@ -32,11 +32,14 @@ allow { # Allow project admins to do anything under the given project. allow { + not url_is_privileged user_is_project_admin } # Allow the action if the user is granted permission to perform the action. allow { + not url_is_privileged + some grant user_is_granted[grant] @@ -60,22 +63,13 @@ user_is_project_admin { role.namespace == project_name } +# public urls are visible for all users url_is_public { data.exemptions.public[_].method == http_request.method glob.match(trim(data.exemptions.public[_].endpoint, "/"), ["/"], concat("/", input.parsed_path)) } -url_is_exempted { - data.exemptions.global[_].method == http_request.method - glob.match(trim(data.exemptions.global[_].endpoint, "/"), ["/"], concat("/", input.parsed_path)) -} - -url_is_exempted { - data.exemptions.namespaced[_].method == http_request.method - glob.match(trim(data.exemptions.namespaced[_].endpoint, "/"), ["/"], concat("/", input.parsed_path)) - user_projects[_] == project_name -} - +# exempted urls are visible for all authenticated users url_is_exempted { not url_is_registered } @@ -85,6 +79,12 @@ url_is_registered { glob.match(trim(data.exemptions.registered[_].endpoint, "/"), ["/"], concat("/", input.parsed_path)) } +# privileged urls are visible for system admins only +url_is_privileged { + data.exemptions.privileged[_].method == http_request.method + glob.match(trim(data.exemptions.privileged[_].endpoint, "/"), ["/"], concat("/", input.parsed_path)) +} + project_name := pn { pn := input.parsed_query.projectName[0] } diff --git a/pkg/microservice/policy/core/service/bundle/rego/test_data/bindings/data.json b/pkg/microservice/policy/core/service/bundle/rego/test_data/bindings/data.json index c13fae78e..9344d9cb1 100644 --- a/pkg/microservice/policy/core/service/bundle/rego/test_data/bindings/data.json +++ b/pkg/microservice/policy/core/service/bundle/rego/test_data/bindings/data.json @@ -1,17 +1,8 @@ { "role_bindings": [ { - "uid": "alice", + "uid": "2e6c5200-358f-11ec-981f-de2269351a1e", "bindings": [ - { - "namespace": "", - "role_refs": [ - { - "name": "admin", - "namespace": "" - } - ] - }, { "namespace": "project1", "role_refs": [ diff --git a/pkg/microservice/policy/core/service/bundle/rego/test_input.json b/pkg/microservice/policy/core/service/bundle/rego/test_input.json index d6aad2a26..9647fc86a 100644 --- a/pkg/microservice/policy/core/service/bundle/rego/test_input.json +++ b/pkg/microservice/policy/core/service/bundle/rego/test_input.json @@ -19,7 +19,7 @@ "accept": "*/*", "accept-encoding": "gzip, deflate", "accept-language": "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2", - "authorization": "Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6ImFmMGNlZTQxOGY0NjJkNWMzMjYyNGRiY2FlN2NjM2E2MjFmMDlkMjMifQ.eyJpc3MiOiJodHRwOi8vZGV4LnRlc3QuOHNsYW4uY29tL2RleCIsInN1YiI6IkNpVXhNak0wTlRZM09EQXRaR0k0T0MwMFlqY3pMVGt3WVRrdE0yTmtNVFkyTVdZMU5EWTJFZ1ZzYjJOaGJBIiwiYXVkIjoiZXhhbXBsZS1hcHAiLCJleHAiOjE2MzM3ODQ2NTgsImlhdCI6MTYzMzY5ODI1OCwiYXRfaGFzaCI6IkhzV0trWFhucDAzZFh1aGxOc00ycUEiLCJjX2hhc2giOiJISjllRUhhMnNBTHY5elBVaERERDd3IiwiZW1haWwiOiJsb3V0ZXN0QGV4YW1wbGUuY29tIiwiZW1haWxfdmVyaWZpZWQiOnRydWUsIm5hbWUiOiJhbGljZSJ9.cAphZs4fv_ZxTNZpIziPi4btm50eYpSvXJGrmNP7TQilGKqkaIF6oroCHsdxuBm3pwIOI8dE4nws7Eogxdtx1AH6EQ3vWv8OoIW1TpCDQit4cX5MsLnEyzuS3r30QQXxi1x2veabsfQungudPivFr4_1xQcjho9G1Y3AGxEDU9zA0-r3U7g9M3lrcF4domaF1xzR1FT2TP0V2QVPCxOocPUl65P-Oxu7oRxpnv44d5ORvAuTuU5IrulZMs5NyaY145qzpBZSTU_x3xQAl4BE35XYh_w1wBqqSEpNbAum9VlpX9kaNrHc8B-jHw2cBRuEIyJU6CPC4g1wcYlxoCrCDg", + "authorization": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiYWRtaW4xIiwiZW1haWwiOiJhZG1pbjFAa29kZXJvdmVyLmNvbSIsInVpZCI6IjJlNmM1MjAwLTM1OGYtMTFlYy05ODFmLWRlMjI2OTM1MWExZSIsImZlZGVyYXRlZF9jbGFpbXMiOnsiY29ubmVjdG9yX2lkIjoiIiwidXNlcl9pZCI6IiJ9LCJhdWQiOiJ6YWRpZyIsImV4cCI6MTYzNTI1MTQxOH0.7GAndkOICyk7QucBaUiGmd7ZJstWJfoNDw5JKZjz4TY", "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:92.0) Gecko/20100101 Firefox/92.0", "x-forwarded-proto": "http", "x-request-id": "14404686-7a28-48a6-9be6-bdd6e119f81a" -- Gitee From b8ded56807ff2d0b90993657f96a7352891c3ba0 Mon Sep 17 00:00:00 2001 From: mouuii <49775493+mouuii@users.noreply.github.com> Date: Tue, 26 Oct 2021 10:01:39 +0800 Subject: [PATCH 111/405] Revert "remove poetry feature" --- .../core/common/repository/models/queue.go | 5 +- .../common/repository/models/task/model.go | 5 +- .../core/common/service/template_product.go | 57 +++++++++++++++++++ .../aslan/core/project/service/product.go | 13 +++++ .../core/workflow/service/workflow/convert.go | 2 + .../cron/core/service/scheduler/scheduler.go | 28 +++++++++ .../core/service/taskplugin/build.go | 7 +++ .../core/service/types/task/model.go | 5 +- pkg/shared/poetry/check.go | 37 ++++++++++++ 9 files changed, 153 insertions(+), 6 deletions(-) create mode 100644 pkg/shared/poetry/check.go diff --git a/pkg/microservice/aslan/core/common/repository/models/queue.go b/pkg/microservice/aslan/core/common/repository/models/queue.go index 4e1d29520..d6279a8b3 100644 --- a/pkg/microservice/aslan/core/common/repository/models/queue.go +++ b/pkg/microservice/aslan/core/common/repository/models/queue.go @@ -81,8 +81,9 @@ type Queue struct { TriggerBy *TriggerBy `json:"trigger_by,omitempty" bson:"trigger_by,omitempty"` - IsRestart bool `bson:"is_restart" json:"is_restart"` - StorageEndpoint string `bson:"storage_endpoint" json:"storage_endpoint"` + Features []string `bson:"features" json:"features"` + IsRestart bool `bson:"is_restart" json:"is_restart"` + StorageEndpoint string `bson:"storage_endpoint" json:"storage_endpoint"` } type TriggerBy struct { diff --git a/pkg/microservice/aslan/core/common/repository/models/task/model.go b/pkg/microservice/aslan/core/common/repository/models/task/model.go index 04f9b8a31..b71dabdb5 100644 --- a/pkg/microservice/aslan/core/common/repository/models/task/model.go +++ b/pkg/microservice/aslan/core/common/repository/models/task/model.go @@ -84,8 +84,9 @@ type Task struct { TriggerBy *models.TriggerBy `json:"trigger_by,omitempty" bson:"trigger_by,omitempty"` - IsRestart bool `bson:"is_restart" json:"is_restart"` - StorageEndpoint string `bson:"storage_endpoint" json:"storage_endpoint"` + Features []string `bson:"features" json:"features"` + IsRestart bool `bson:"is_restart" json:"is_restart"` + StorageEndpoint string `bson:"storage_endpoint" json:"storage_endpoint"` } //type RenderInfo struct { diff --git a/pkg/microservice/aslan/core/common/service/template_product.go b/pkg/microservice/aslan/core/common/service/template_product.go index 916d490db..bb4b46715 100644 --- a/pkg/microservice/aslan/core/common/service/template_product.go +++ b/pkg/microservice/aslan/core/common/service/template_product.go @@ -18,16 +18,20 @@ package service import ( "fmt" + "strings" "sync" "go.uber.org/zap" + "github.com/koderover/zadig/pkg/microservice/aslan/config" "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/models" "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/models/template" commonrepo "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/mongodb" templaterepo "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/mongodb/template" "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/collie" + "github.com/koderover/zadig/pkg/microservice/aslan/internal/cache" "github.com/koderover/zadig/pkg/setting" + "github.com/koderover/zadig/pkg/shared/poetry" e "github.com/koderover/zadig/pkg/tool/errors" ) @@ -36,6 +40,10 @@ type PipelineResource struct { Kind string `json:"kind"` } +type Features struct { + Features []string `json:"features"` +} + func GetProductTemplate(productName string, log *zap.SugaredLogger) (*template.Product, error) { resp, err := templaterepo.NewProductColl().Find(productName) if err != nil { @@ -44,6 +52,26 @@ func GetProductTemplate(productName string, log *zap.SugaredLogger) (*template.P } totalFreeStyles := make([]*collie.CiPipelineResource, 0) + features, err := GetFeatures(log) + if err != nil { + log.Errorf("GetProductTemplate GetFeatures err : %v", err) + } + + if strings.Contains(features, string(config.FreestyleType)) { + // CI场景onboarding流程处于第二步时,需要返回ci工作流id,用于前端跳转 + collieAPIAddress := config.CollieAPIAddress() + cl := collie.New(collieAPIAddress) + if resp.ProductFeature != nil && resp.ProductFeature.DevelopHabit == "yaml" && resp.OnboardingStatus == setting.OnboardingStatusSecond && collieAPIAddress != "" { + ciPipelines, err := cl.ListCIPipelines(productName, log) + if err != nil { + log.Errorf("GetProductTemplate error: %v", err) + return nil, e.ErrGetProduct.AddDesc(err.Error()) + } + if len(ciPipelines) != 0 { + resp.CiPipelineID = ciPipelines[0].Metadata.ID + } + } + } err = FillProductTemplateVars([]*template.Product{resp}, log) if err != nil { @@ -88,6 +116,15 @@ func GetProductTemplate(productName string, log *zap.SugaredLogger) (*template.P return resp, fmt.Errorf("Pipeline.List err : %v", err) } + if strings.Contains(features, string(config.FreestyleType)) { + collieAPIAddress := config.CollieAPIAddress() + cl := collie.New(collieAPIAddress) + totalFreeStyles, err = cl.ListCIPipelines(productName, log) + if err != nil { + log.Errorf("GetProductTemplate freestyle.List err : %v", err) + } + } + totalEnvTemplateServiceNum := 0 for _, services := range resp.Services { totalEnvTemplateServiceNum += len(services) @@ -128,6 +165,26 @@ func GetProductTemplate(productName string, log *zap.SugaredLogger) (*template.P return resp, nil } +func GetFeatures(log *zap.SugaredLogger) (string, error) { + featuresByteKey := []byte("features") + featuresByteValue, err := cache.Get(featuresByteKey) + if err != nil { + poetryCtl := poetry.New(config.PoetryAPIServer()) + fs, err := poetryCtl.ListFeatures() + if err != nil { + return "", err + } + cacheValue := strings.Join(fs, ",") + // 一天过期 + if err = cache.Set(featuresByteKey, []byte(cacheValue), 86400); err != nil { + log.Errorf("getFeatures set cache err:%v", err) + } + return cacheValue, nil + } + + return string(featuresByteValue), nil +} + func FillProductTemplateVars(productTemplates []*template.Product, log *zap.SugaredLogger) error { var ( wg sync.WaitGroup diff --git a/pkg/microservice/aslan/core/project/service/product.go b/pkg/microservice/aslan/core/project/service/product.go index f0948b0d3..ee01dfe0b 100644 --- a/pkg/microservice/aslan/core/project/service/product.go +++ b/pkg/microservice/aslan/core/project/service/product.go @@ -35,6 +35,7 @@ import ( commonrepo "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/mongodb" templaterepo "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/mongodb/template" commonservice "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service" + "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/collie" environmentservice "github.com/koderover/zadig/pkg/microservice/aslan/core/environment/service" workflowservice "github.com/koderover/zadig/pkg/microservice/aslan/core/workflow/service/workflow" "github.com/koderover/zadig/pkg/setting" @@ -338,6 +339,18 @@ func DeleteProductTemplate(userName, productName, requestID string, log *zap.Sug return err } + //删除自由编排工作流 + features, err := commonservice.GetFeatures(log) + if err != nil { + log.Errorf("DeleteProductTemplate productName %s getFeatures err: %v", productName, err) + } + if strings.Contains(features, string(config.FreestyleType)) { + collieClient := collie.New(config.CollieAPIAddress()) + if err = collieClient.DeleteCIPipelines(productName, log); err != nil { + log.Errorf("DeleteProductTemplate Delete productName %s freestyle pipeline err: %v", productName, err) + } + } + err = templaterepo.NewProductColl().Delete(productName) if err != nil { log.Errorf("ProductTmpl.Delete error: %v", err) diff --git a/pkg/microservice/aslan/core/workflow/service/workflow/convert.go b/pkg/microservice/aslan/core/workflow/service/workflow/convert.go index 8b7ab9b82..811627426 100644 --- a/pkg/microservice/aslan/core/workflow/service/workflow/convert.go +++ b/pkg/microservice/aslan/core/workflow/service/workflow/convert.go @@ -69,6 +69,7 @@ func ConvertQueueToTask(queueTask *commonmodels.Queue) *task.Task { RwLock: queueTask.RwLock, ResetImage: queueTask.ResetImage, TriggerBy: queueTask.TriggerBy, + Features: queueTask.Features, IsRestart: queueTask.IsRestart, StorageEndpoint: queueTask.StorageEndpoint, } @@ -114,6 +115,7 @@ func ConvertTaskToQueue(task *task.Task) *commonmodels.Queue { RwLock: task.RwLock, ResetImage: task.ResetImage, TriggerBy: task.TriggerBy, + Features: task.Features, IsRestart: task.IsRestart, StorageEndpoint: task.StorageEndpoint, } diff --git a/pkg/microservice/cron/core/service/scheduler/scheduler.go b/pkg/microservice/cron/core/service/scheduler/scheduler.go index 11997133f..5f45ae44b 100644 --- a/pkg/microservice/cron/core/service/scheduler/scheduler.go +++ b/pkg/microservice/cron/core/service/scheduler/scheduler.go @@ -20,6 +20,7 @@ import ( "fmt" stdlog "log" "os" + "strings" "time" "github.com/jasonlvhit/gocron" @@ -32,6 +33,7 @@ import ( "github.com/koderover/zadig/pkg/microservice/cron/core/service" "github.com/koderover/zadig/pkg/microservice/cron/core/service/client" "github.com/koderover/zadig/pkg/setting" + "github.com/koderover/zadig/pkg/shared/poetry" "github.com/koderover/zadig/pkg/tool/log" ) @@ -139,6 +141,12 @@ func (c *CronClient) Init() { // 测试管理的定时任务触发 c.InitTestScheduler() + // 自由编排工作流定时任务触发 + features, _ := getFeatures() + if strings.Contains(features, freestyleType) { + c.InitColliePipelineScheduler() + } + // 定时清理环境 c.InitCleanProductScheduler() // 定时初始化构建数据 @@ -151,6 +159,16 @@ func (c *CronClient) Init() { c.InitHealthCheckScheduler() } +func getFeatures() (string, error) { + cl := poetry.New(configbase.PoetryServiceAddress()) + fs, err := cl.ListFeatures() + if err != nil { + return "", err + } + + return strings.Join(fs, ","), nil +} + // InitCleanJobScheduler ... func (c *CronClient) InitCleanJobScheduler() { @@ -191,6 +209,16 @@ func (c *CronClient) InitTestScheduler() { c.Schedulers[UpsertTestScheduler].Start() } +// InitJobScheduler ... +func (c *CronClient) InitColliePipelineScheduler() { + + c.Schedulers[UpsertColliePipelineScheduler] = gocron.NewScheduler() + + c.Schedulers[UpsertColliePipelineScheduler].Every(1).Minutes().Do(c.UpsertColliePipelineScheduler, c.log) + + c.Schedulers[UpsertColliePipelineScheduler].Start() +} + // InitBuildStatScheduler ... func (c *CronClient) InitBuildStatScheduler() { diff --git a/pkg/microservice/warpdrive/core/service/taskplugin/build.go b/pkg/microservice/warpdrive/core/service/taskplugin/build.go index 630004f86..1867fd455 100644 --- a/pkg/microservice/warpdrive/core/service/taskplugin/build.go +++ b/pkg/microservice/warpdrive/core/service/taskplugin/build.go @@ -29,9 +29,11 @@ import ( "k8s.io/apimachinery/pkg/util/sets" "sigs.k8s.io/controller-runtime/pkg/client" + configbase "github.com/koderover/zadig/pkg/config" "github.com/koderover/zadig/pkg/microservice/warpdrive/config" "github.com/koderover/zadig/pkg/microservice/warpdrive/core/service/types/task" "github.com/koderover/zadig/pkg/setting" + "github.com/koderover/zadig/pkg/shared/poetry" krkubeclient "github.com/koderover/zadig/pkg/tool/kube/client" "github.com/koderover/zadig/pkg/tool/kube/updater" ) @@ -160,6 +162,11 @@ func (p *BuildTaskPlugin) Run(ctx context.Context, pipelineTask *task.Task, pipe Installs: p.Task.InstallCtx, } + poetryClient := poetry.New(configbase.PoetryServiceAddress()) + if fs, err := poetryClient.ListFeatures(); err == nil { + pipelineTask.Features = fs + } + if p.Task.BuildStatus == nil { p.Task.BuildStatus = &task.BuildStatus{} } diff --git a/pkg/microservice/warpdrive/core/service/types/task/model.go b/pkg/microservice/warpdrive/core/service/types/task/model.go index 6b9af3a24..8fc7400a9 100644 --- a/pkg/microservice/warpdrive/core/service/types/task/model.go +++ b/pkg/microservice/warpdrive/core/service/types/task/model.go @@ -81,8 +81,9 @@ type Task struct { TriggerBy *TriggerBy `json:"trigger_by,omitempty" bson:"trigger_by,omitempty"` - IsRestart bool `bson:"is_restart" json:"is_restart"` - StorageEndpoint string `bson:"storage_endpoint" json:"storage_endpoint"` + Features []string `bson:"features" json:"features"` + IsRestart bool `bson:"is_restart" json:"is_restart"` + StorageEndpoint string `bson:"storage_endpoint" json:"storage_endpoint"` } type RenderInfo struct { diff --git a/pkg/shared/poetry/check.go b/pkg/shared/poetry/check.go new file mode 100644 index 000000000..d205c5121 --- /dev/null +++ b/pkg/shared/poetry/check.go @@ -0,0 +1,37 @@ +/* +Copyright 2021 The KodeRover 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 poetry + +import ( + "github.com/koderover/zadig/pkg/tool/httpclient" +) + +type features struct { + Features []string `json:"features"` +} + +func (c *Client) ListFeatures() ([]string, error) { + url := "/directory/check" + + fs := &features{} + _, err := c.Get(url, httpclient.SetResult(fs)) + if err != nil { + return nil, err + } + + return fs.Features, nil +} -- Gitee From e1f9771317f291b27bab9b17bf7e4ebe586467fe Mon Sep 17 00:00:00 2001 From: mouuii Date: Tue, 26 Oct 2021 11:10:29 +0800 Subject: [PATCH 112/405] initconfig Signed-off-by: mouuii --- cmd/initconfig/main.go | 25 ++++++ pkg/cli/initconfig/cmd/init.go | 129 +++++++++++++++++++++++++++++ pkg/cli/initconfig/cmd/root.go | 86 +++++++++++++++++++ pkg/setting/consts.go | 1 + pkg/shared/client/policy/policy.go | 13 +++ 5 files changed, 254 insertions(+) create mode 100644 cmd/initconfig/main.go create mode 100644 pkg/cli/initconfig/cmd/init.go create mode 100644 pkg/cli/initconfig/cmd/root.go diff --git a/cmd/initconfig/main.go b/cmd/initconfig/main.go new file mode 100644 index 000000000..6d10e2d03 --- /dev/null +++ b/cmd/initconfig/main.go @@ -0,0 +1,25 @@ +/* +Copyright 2021 The KodeRover 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 main + +import ( + "github.com/koderover/zadig/pkg/cli/initconfig/cmd" +) + +func main() { + cmd.Execute() +} diff --git a/pkg/cli/initconfig/cmd/init.go b/pkg/cli/initconfig/cmd/init.go new file mode 100644 index 000000000..f191ceff0 --- /dev/null +++ b/pkg/cli/initconfig/cmd/init.go @@ -0,0 +1,129 @@ +/* +Copyright 2021 The KodeRover 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 cmd + +import ( + "github.com/spf13/cobra" + + "github.com/koderover/zadig/pkg/microservice/policy/core/service" + "github.com/koderover/zadig/pkg/setting" + "github.com/koderover/zadig/pkg/shared/client/policy" + "github.com/koderover/zadig/pkg/tool/log" +) + +func init() { + rootCmd.AddCommand(migrateCmd) + +} + +var migrateCmd = &cobra.Command{ + Use: "init", + Short: "init preset role", + Long: `init preset role.`, + Run: func(cmd *cobra.Command, args []string) { + if err := run(); err != nil { + log.Fatal(err) + } + }, +} + +func run() error { + return presetRole() +} + +func presetRole() error { + if err := policy.New().CreateSystemRole(&service.Role{ + Name: "admin", + Rules: []*service.Rule{&service.Rule{ + Verbs: []string{"*"}, + Resources: []string{"*"}, + }}, + }); err != nil { + return err + } + if err := policy.New().CreatePublicRole(&service.Role{ + Name: string(setting.Contributor), + Rules: []*service.Rule{&service.Rule{ + Verbs: []string{"get_workflow", "run_workflow"}, + Kind: "resource", + Resources: []string{"Workflow"}, + }, &service.Rule{ + Verbs: []string{"get_environment", "config_environment", "manage_environment", "delete_environment"}, + Kind: "resource", + Resources: []string{"Environment"}, + }, &service.Rule{ + Verbs: []string{"get_build", "get_service"}, + Kind: "resource", + Resources: []string{"Service"}, + }, &service.Rule{ + Verbs: []string{"get_test"}, + Kind: "resource", + Resources: []string{"Test"}, + }}, + }); err != nil { + return err + } + if err := policy.New().CreatePublicRole(&service.Role{ + Name: string(setting.Contributor), + Rules: []*service.Rule{&service.Rule{ + Verbs: []string{"get_workflow", "run_workflow"}, + Kind: "resource", + Resources: []string{"Workflow"}, + }, &service.Rule{ + Verbs: []string{"get_environment", "config_environment", "manage_environment", "delete_environment"}, + Kind: "resource", + Resources: []string{"Environment"}, + }, &service.Rule{ + Verbs: []string{"get_build", "get_service"}, + Kind: "resource", + Resources: []string{"Service"}, + }, &service.Rule{ + Verbs: []string{"get_test"}, + Kind: "resource", + Resources: []string{"Test"}, + }}, + }); err != nil { + return err + } + if err := policy.New().CreatePublicRole(&service.Role{ + Name: string(setting.ReadOnly), + Rules: []*service.Rule{&service.Rule{ + Verbs: []string{"get_workflow"}, + Kind: "resource", + Resources: []string{"Workflow"}, + }, &service.Rule{ + Verbs: []string{"get_environment"}, + Kind: "resource", + Resources: []string{"Environment"}, + }, &service.Rule{ + Verbs: []string{"get_build", "get_service"}, + Kind: "resource", + Resources: []string{"Service"}, + }, &service.Rule{ + Verbs: []string{"get_test"}, + Kind: "resource", + Resources: []string{"Test"}, + }, &service.Rule{ + Verbs: []string{"get_delivery"}, + Kind: "resource", + Resources: []string{"Delivery"}, + }}, + }); err != nil { + return err + } + return nil +} diff --git a/pkg/cli/initconfig/cmd/root.go b/pkg/cli/initconfig/cmd/root.go new file mode 100644 index 000000000..700380445 --- /dev/null +++ b/pkg/cli/initconfig/cmd/root.go @@ -0,0 +1,86 @@ +/* +Copyright © 2021 NAME HERE + +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 cmd + +import ( + "fmt" + "os" + + "github.com/spf13/cobra" + + "github.com/spf13/viper" +) + +var cfgFile string + +// rootCmd represents the base command when called without any subcommands +var rootCmd = &cobra.Command{ + Use: "newApp", + Short: "A brief description of your application", + Long: `A longer description that spans multiple lines and likely contains +examples and usage of using your application. For example: + +Cobra is a CLI library for Go that empowers applications. +This application is a tool to generate the needed files +to quickly create a Cobra application.`, + // Uncomment the following line if your bare application + // has an action associated with it: + // Run: func(cmd *cobra.Command, args []string) { }, +} + +// Execute adds all child commands to the root command and sets flags appropriately. +// This is called by main.main(). It only needs to happen once to the rootCmd. +func Execute() { + cobra.CheckErr(rootCmd.Execute()) +} + +func init() { + cobra.OnInitialize(initConfig) + + // Here you will define your flags and configuration settings. + // Cobra supports persistent flags, which, if defined here, + // will be global for your application. + + rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (default is $HOME/.newApp.yaml)") + + // Cobra also supports local flags, which will only run + // when this action is called directly. + rootCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle") +} + +// initConfig reads in config file and ENV variables if set. +func initConfig() { + if cfgFile != "" { + // Use config file from the flag. + viper.SetConfigFile(cfgFile) + } else { + // Find home directory. + home, err := os.UserHomeDir() + cobra.CheckErr(err) + + // Search config in home directory with name ".newApp" (without extension). + viper.AddConfigPath(home) + viper.SetConfigType("yaml") + viper.SetConfigName(".newApp") + } + + viper.AutomaticEnv() // read in environment variables that match + + // If a config file is found, read it in. + if err := viper.ReadInConfig(); err == nil { + fmt.Fprintln(os.Stderr, "Using config file:", viper.ConfigFileUsed()) + } +} diff --git a/pkg/setting/consts.go b/pkg/setting/consts.go index bc1457a1d..31c61d318 100644 --- a/pkg/setting/consts.go +++ b/pkg/setting/consts.go @@ -484,5 +484,6 @@ type RoleType string const ( Contributor RoleType = "Contributor" + ReadOnly RoleType = "ReadOnly" ContributorRoleBindingFmt string = "contributor-project:%s-user:%s" ) diff --git a/pkg/shared/client/policy/policy.go b/pkg/shared/client/policy/policy.go index 10f01e743..3e63c0873 100644 --- a/pkg/shared/client/policy/policy.go +++ b/pkg/shared/client/policy/policy.go @@ -3,6 +3,7 @@ package policy import ( "fmt" + "github.com/koderover/zadig/pkg/microservice/policy/core/service" "github.com/koderover/zadig/pkg/setting" "github.com/koderover/zadig/pkg/tool/httpclient" ) @@ -52,3 +53,15 @@ func (c *Client) DeleteRoleBinding(name string, projectName string) error { _, err := c.Delete(url) return err } + +func (c *Client) CreateSystemRole(role *service.Role) error { + url := fmt.Sprintf("/system-roles", role) + _, err := c.Post(url, httpclient.SetBody(role)) + return err +} + +func (c *Client) CreatePublicRole(role *service.Role) error { + url := fmt.Sprintf("/public-roles", role) + _, err := c.Post(url, httpclient.SetBody(role)) + return err +} -- Gitee From d237ea6cfd987c7104beac9705ddcd92a86e52b1 Mon Sep 17 00:00:00 2001 From: panxunying <641770806@qq.com> Date: Tue, 26 Oct 2021 14:33:22 +0800 Subject: [PATCH 113/405] init user --- Makefile | 2 +- cmd/user/main.go | 38 ++++ docker/service/user.Dockerfile | 11 ++ go.mod | 8 +- go.sum | 37 ++-- pkg/config/config.go | 4 + pkg/microservice/user/config/config.go | 85 +++++++++ pkg/microservice/user/config/consts.go | 23 +++ .../user/core/handler/login/internal.go | 18 ++ .../user/core/handler/login/third_part.go | 134 +++++++++++++ pkg/microservice/user/core/handler/router.go | 44 +++++ .../user/core/handler/user/user.go | 47 +++++ .../user/core/repository/models/user.go | 12 ++ .../user/core/repository/models/user_login.go | 10 + .../user/core/repository/mysql/user.go | 77 ++++++++ .../user/core/repository/mysql/user_login.go | 45 +++++ pkg/microservice/user/core/service.go | 98 ++++++++++ .../user/core/service/login/internal.go | 80 ++++++++ .../user/core/service/login/third_part.go | 75 ++++++++ .../user/core/service/user/user.go | 176 ++++++++++++++++++ pkg/microservice/user/server/rest/router.go | 35 ++++ pkg/microservice/user/server/rest/server.go | 76 ++++++++ pkg/microservice/user/server/server.go | 60 ++++++ pkg/setting/consts.go | 18 ++ pkg/tool/errors/http_errors.go | 3 +- pkg/util/sign.go | 24 +++ 26 files changed, 1215 insertions(+), 25 deletions(-) create mode 100644 cmd/user/main.go create mode 100644 docker/service/user.Dockerfile create mode 100644 pkg/microservice/user/config/config.go create mode 100644 pkg/microservice/user/config/consts.go create mode 100644 pkg/microservice/user/core/handler/login/internal.go create mode 100644 pkg/microservice/user/core/handler/login/third_part.go create mode 100644 pkg/microservice/user/core/handler/router.go create mode 100644 pkg/microservice/user/core/handler/user/user.go create mode 100644 pkg/microservice/user/core/repository/models/user.go create mode 100644 pkg/microservice/user/core/repository/models/user_login.go create mode 100644 pkg/microservice/user/core/repository/mysql/user.go create mode 100644 pkg/microservice/user/core/repository/mysql/user_login.go create mode 100644 pkg/microservice/user/core/service.go create mode 100644 pkg/microservice/user/core/service/login/internal.go create mode 100644 pkg/microservice/user/core/service/login/third_part.go create mode 100644 pkg/microservice/user/core/service/user/user.go create mode 100644 pkg/microservice/user/server/rest/router.go create mode 100644 pkg/microservice/user/server/rest/server.go create mode 100644 pkg/microservice/user/server/server.go diff --git a/Makefile b/Makefile index d46ca9fbc..7921f0f31 100644 --- a/Makefile +++ b/Makefile @@ -4,7 +4,7 @@ IMAGE_REPOSITORY = ccr.ccs.tencentyun.com/koderover-rc VERSION ?= $(shell date +'%Y%m%d%H%M%S') -TARGETS = aslan cron hub-agent hub-server jenkins-plugin podexec predator-plugin resource-server ua warpdrive policy picket +TARGETS = aslan cron hub-agent hub-server jenkins-plugin podexec predator-plugin resource-server ua warpdrive policy user picket REAPER_OS= focal xenial bionic ALL_IMAGES=$(TARGETS:=.image) diff --git a/cmd/user/main.go b/cmd/user/main.go new file mode 100644 index 000000000..2f8f7c699 --- /dev/null +++ b/cmd/user/main.go @@ -0,0 +1,38 @@ +/* +Copyright 2021 The KodeRover 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 main + +import ( + "context" + "log" + "os/signal" + "syscall" + + "github.com/koderover/zadig/pkg/microservice/user/server" +) + +func main() { + ctx, stop := signal.NotifyContext(context.Background(), syscall.SIGTERM, syscall.SIGINT) + go func() { + <-ctx.Done() + stop() + }() + + if err := server.Serve(ctx); err != nil { + log.Fatal(err) + } +} diff --git a/docker/service/user.Dockerfile b/docker/service/user.Dockerfile new file mode 100644 index 000000000..2ff142037 --- /dev/null +++ b/docker/service/user.Dockerfile @@ -0,0 +1,11 @@ +#golang.Dockerfile + +RUN go build -v -o /user ./cmd/user/main.go + +#alpine.Dockerfile + +WORKDIR /app + +COPY --from=build /user . + +ENTRYPOINT ["/app/user"] diff --git a/go.mod b/go.mod index 28512627c..d4d5badad 100644 --- a/go.mod +++ b/go.mod @@ -16,13 +16,16 @@ require ( github.com/bugsnag/panicwrap v1.3.1 // indirect github.com/cenkalti/backoff/v3 v3.0.0 github.com/coocood/freecache v1.1.0 + github.com/coreos/go-oidc v2.1.0+incompatible + github.com/coreos/go-oidc/v3 v3.0.0 + github.com/dgrijalva/jwt-go v3.2.0+incompatible github.com/docker/distribution v2.7.1+incompatible github.com/docker/docker v17.12.0-ce-rc1.0.20200618181300-9dc6525e6118+incompatible github.com/docker/go-connections v0.4.0 github.com/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7 // indirect github.com/dsnet/compress v0.0.1 // indirect + github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5 // indirect github.com/garyburd/redigo v1.6.2 // indirect - github.com/gin-contrib/sessions v0.0.3 github.com/gin-contrib/sse v0.1.0 github.com/gin-gonic/gin v1.7.2 github.com/go-resty/resty/v2 v2.6.0 @@ -37,6 +40,8 @@ require ( github.com/hashicorp/go-multierror v1.1.1 github.com/huaweicloud/huaweicloud-sdk-go-v3 v0.0.50 github.com/jasonlvhit/gocron v0.0.0-20171226191223-3c914c8681c3 + github.com/jinzhu/gorm v0.0.0-20180213101209-6e1387b44c64 + github.com/jinzhu/inflection v0.0.0-20170102125226-1c35d901db3d // indirect github.com/jinzhu/now v1.1.2 github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 // indirect github.com/mittwald/go-helm-client v0.8.0 @@ -65,6 +70,7 @@ require ( github.com/yvasiyarov/newrelic_platform_go v0.0.0-20160601141957-9c099fbc30e9 // indirect go.mongodb.org/mongo-driver v1.5.0 go.uber.org/zap v1.19.0 + golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83 golang.org/x/net v0.0.0-20210428140749-89ef3d95e781 golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d golang.org/x/sync v0.0.0-20210220032951-036812b2e83c diff --git a/go.sum b/go.sum index 08ed6a88b..dd2bf2eda 100644 --- a/go.sum +++ b/go.sum @@ -121,11 +121,8 @@ github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= github.com/bndr/gojenkins v1.1.0 h1:TWyJI6ST1qDAfH33DQb3G4mD8KkrBfyfSUoZBHQAvPI= github.com/bndr/gojenkins v1.1.0/go.mod h1:QeskxN9F/Csz0XV/01IC8y37CapKKWvOHa0UHLLX1fM= -github.com/boj/redistore v0.0.0-20180917114910-cd5dcc76aeff/go.mod h1:+RTT1BOk5P97fT2CiHkbFQwkK3mjsFAP6zCYV2aXtjw= -github.com/bradfitz/gomemcache v0.0.0-20190329173943-551aad21a668/go.mod h1:H0wQNHz2YrLsuXOZozoeDmnHXkNCRmMW0gwFWDfEZDA= github.com/bradleyfalzon/ghinstallation v1.1.1 h1:pmBXkxgM1WeF8QYvDLT5kuQiHMcmf+X015GI0KM/E3I= github.com/bradleyfalzon/ghinstallation v1.1.1/go.mod h1:vyCmHTciHx/uuyN82Zc3rXN3X2KTK8nUTCrTMwAhcug= -github.com/bradleypeabody/gorilla-sessions-memcache v0.0.0-20181103040241-659414f458e1/go.mod h1:dkChI7Tbtx7H1Tj7TqGSZMOeGpMP5gLHtjroHd4agiI= github.com/bshuster-repo/logrus-logstash-hook v1.0.0 h1:e+C0SB5R1pu//O4MQ3f9cFuPGoOVeF2fE4Og9otCc70= github.com/bshuster-repo/logrus-logstash-hook v1.0.0/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= github.com/bugsnag/bugsnag-go v2.1.0+incompatible h1:SuqsBHDutts2rZh4swHEWTexxi0F/JZ/6j1rR9BFe7I= @@ -172,7 +169,10 @@ github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkE github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= +github.com/coreos/go-oidc v2.1.0+incompatible h1:sdJrfw8akMnCuUlaZU3tE/uYXFgfqom8DBE9so9EBsM= github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= +github.com/coreos/go-oidc/v3 v3.0.0 h1:/mAA0XMgYJw2Uqm7WKGCsKnjitE/+A0FFbOmiRJm7LQ= +github.com/coreos/go-oidc/v3 v3.0.0/go.mod h1:rEJ/idjfUyfkBit1eI1fvyr+64/g9dcKpAm8MJMesvo= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= @@ -195,6 +195,7 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/daviddengcn/go-colortext v0.0.0-20160507010035-511bcaf42ccd/go.mod h1:dv4zxwHi5C/8AeI+4gX4dCWOIvNi7I6JCSX0HvlKPgE= github.com/deislabs/oras v0.11.1 h1:oo2J/3vXdcti8cjFi8ghMOkx0OacONxHC8dhJ17NdJ0= github.com/deislabs/oras v0.11.1/go.mod h1:39lCtf8Q6WDC7ul9cnyWXONNzKvabEKk+AX+L0ImnQk= +github.com/denisenkom/go-mssqldb v0.0.0-20191001013358-cfbb681360f0 h1:epsH3lb7KVbXHYk7LYGN5EiE0MxcevHU85CKITJ0wUY= github.com/denisenkom/go-mssqldb v0.0.0-20191001013358-cfbb681360f0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= @@ -235,6 +236,8 @@ github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1m github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5 h1:Yzb9+7DPaBjB8zlTR87/ElzFsnQfuHnVUVqpZZIcV5Y= +github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5/go.mod h1:a2zkGnVExMxdzMo3M0Hi/3sEU+cWnZpSni0O6/Yb/P0= github.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ= github.com/evanphx/json-patch v4.5.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= @@ -259,15 +262,12 @@ github.com/garyburd/redigo v1.6.2/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05 github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gin-contrib/gzip v0.0.1 h1:ezvKOL6jH+jlzdHNE4h9h8q8uMpDQjyl0NN0Jd7jozc= github.com/gin-contrib/gzip v0.0.1/go.mod h1:fGBJBCdt6qCZuCAOwWuFhBB4OOq9EFqlo5dEaFhhu5w= -github.com/gin-contrib/sessions v0.0.3 h1:PoBXki+44XdJdlgDqDrY5nDVe3Wk7wDV/UCOuLP6fBI= -github.com/gin-contrib/sessions v0.0.3/go.mod h1:8C/J6cad3Il1mWYYgtw0w+hqasmpvy25mPkXdOgeB9I= github.com/gin-contrib/sse v0.0.0-20170109093832-22d885f9ecc7/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= github.com/gin-gonic/gin v1.3.0/go.mod h1:7cKuhb5qV2ggCFctp2fJQ+ErvciLZrIeoOSOm6mUr7Y= github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM= -github.com/gin-gonic/gin v1.5.0/go.mod h1:Nd6IXA8m5kNZdNEHMBd93KT+mdY3+bewLgRvmCsR2Do= github.com/gin-gonic/gin v1.7.2 h1:Tg03T9yM2xa8j6I3Z3oqLaQRSmKvxPd6g/2HJ6zICFA= github.com/gin-gonic/gin v1.7.2/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY= github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= @@ -339,10 +339,8 @@ github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2K github.com/go-openapi/validate v0.19.8/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85nY1c2z52x1Gk4= github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A= github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/go-playground/locales v0.12.1/go.mod h1:IUMDtCfWo/w/mtMfIE/IG2K+Ey3ygWanZIBtBW0W2TM= github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q= github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= -github.com/go-playground/universal-translator v0.16.0/go.mod h1:1AnU7NaIRDWWzGEKwgtJRd2xk99HeFyHw3yid4rvQIY= github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no= github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= github.com/go-playground/validator/v10 v10.4.1 h1:pH2c5ADXtd66mxoE0Zm9SUhxE20r7aM3F26W0hOn+GE= @@ -403,6 +401,7 @@ github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zV github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe h1:lXe2qZdvpiX5WZkZR4hgp4KJVfY3nMkvmwbVkpv1rVY= github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -437,7 +436,6 @@ github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8l github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golangplus/testing v0.0.0-20180327235837-af21d9c3145e/go.mod h1:0AA//k/eakGydO4jKRoRL2j92ZKSzTgj9tclaCrvXHk= -github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= @@ -480,18 +478,12 @@ github.com/googleapis/gnostic v0.4.1 h1:DLJCy1n/vrD4HPjOvYcT8aYQXpPIzoRZONaYwyyc github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/context v1.1.1 h1:AWwleXJkX/nhcU9bZSnZoi3h/qGYqQAGhq6zZe/aQW8= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.3 h1:gnP5JzjVOuiZD07fKKToCAOjS0yOpj/qPETTXCCS6hw= github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/securecookie v1.1.1 h1:miw7JPhV+b/lAHSXz4qd/nN9jRiAFV5FwjeKyCS8BvQ= -github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= -github.com/gorilla/sessions v1.1.1/go.mod h1:8KCfur6+4Mqcc6S0FEfKuN15Vl5MgXW92AE8ovaJD0w= -github.com/gorilla/sessions v1.1.3 h1:uXoZdcdA5XdXF3QzuSlheVRUvjl+1rKY7zBXL68L9RU= -github.com/gorilla/sessions v1.1.3/go.mod h1:8KCfur6+4Mqcc6S0FEfKuN15Vl5MgXW92AE8ovaJD0w= github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= @@ -559,6 +551,10 @@ github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod github.com/jasonlvhit/gocron v0.0.0-20171226191223-3c914c8681c3 h1:s2ARkZWJfkyjrUi8Dj0mMbc1inxeOnIrO9zc3oQX8iU= github.com/jasonlvhit/gocron v0.0.0-20171226191223-3c914c8681c3/go.mod h1:rwi/esz/h+4oWLhbWWK7f6dtmgLzxeZhnwGr7MCsTNk= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jinzhu/gorm v0.0.0-20180213101209-6e1387b44c64 h1:8I4kQ5M5OjZKNsgRUs20soTdIoo1GbiGApV31kJ9e6Y= +github.com/jinzhu/gorm v0.0.0-20180213101209-6e1387b44c64/go.mod h1:Vla75njaFJ8clLU1W44h34PjIkijhjHIYnZxMqCdxqo= +github.com/jinzhu/inflection v0.0.0-20170102125226-1c35d901db3d h1:jRQLvyVGL+iVtDElaEIDdKwpPqUIZJfzkNLV34htpEc= +github.com/jinzhu/inflection v0.0.0-20170102125226-1c35d901db3d/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= github.com/jinzhu/now v1.1.2 h1:eVKgfIdy9b6zbWBMgFpfDPoAMifwSZagU9HmEU6zgiI= github.com/jinzhu/now v1.1.2/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= @@ -590,7 +586,6 @@ github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 h1:iQTw/8FWTuc7uia github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8= github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4= github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= -github.com/kidstuff/mongostore v0.0.0-20181113001930-e650cd85ee4b/go.mod h1:g2nVr8KZVXJSS97Jo8pJ0jgq29P6H7dG0oplUA86MQw= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= @@ -615,7 +610,6 @@ github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 h1:SOEGU9fKiNWd/HOJuq github.com/lann/builder v0.0.0-20180802200727-47ae307949d0/go.mod h1:dXGbAdH5GtBTC4WfIxhKZfyBF/HBFgRZSWwZ9g/He9o= github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 h1:P6pPBnrTSX3DEVR4fDembhRWSsG5rVo6hYhAB/ADZrk= github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0/go.mod h1:vmVJ0l/dxyfGW6FmdpVm2joNMFikkuWg0EoCKLGUMNw= -github.com/leodido/go-urn v1.1.0/go.mod h1:+cyI34gQWZcE1eQU7NVgKkkzdXDQHr1dBMtdAPozLkw= github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= @@ -645,7 +639,6 @@ github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNx github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-oci8 v0.0.7/go.mod h1:wjDx6Xm9q7dFtHJvIlrI99JytznLw5wQ4R+9mNXJwGI= @@ -662,7 +655,6 @@ github.com/mattomatic/dijkstra v0.0.0-20130617153013-6f6d134eb237/go.mod h1:UOnL github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/memcachier/mc v2.0.1+incompatible/go.mod h1:7bkvFE61leUBvXz+yxsOnGBQSZpBSPIMUQSmmSHvuXc= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= @@ -791,6 +783,7 @@ github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021 h1:0XM1XL/OFFJjXsYXlG30spTkV/E9+gmd5GD1w2HE8xM= github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= @@ -826,7 +819,6 @@ github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4O github.com/prometheus/procfs v0.6.0 h1:mxy4L2jP6qMonqmq+aTtOx1ifVWUgG/TAmntgbh3xv4= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/quasoft/memstore v0.0.0-20180925164028-84a050167438/go.mod h1:wTPjTepVu7uJBYgZ0SdWHQlIas582j6cn2jgk4DDdlg= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rfyiamcool/cronlib v1.0.0 h1:PNTF7pgtbL7TedrqnC6syhHwj4d1bCKxH3XmPqqgxvg= github.com/rfyiamcool/cronlib v1.0.0/go.mod h1:i7AVVUhM/kkNcC/Ayq0XOmyCJCcqa/FlflyYQMm5QWE= @@ -1107,6 +1099,7 @@ golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200505041828-1ed23360d12c/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= @@ -1161,7 +1154,6 @@ golang.org/x/sys v0.0.0-20190610200419-93c9922d18ae/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1375,7 +1367,6 @@ gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMy gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= -gopkg.in/go-playground/validator.v9 v9.29.1/go.mod h1:+c9/zcJMFNgbLvly1L1V+PpxWdVbfP1avr/N00E2vyQ= gopkg.in/gorp.v1 v1.7.2 h1:j3DWlAyGVv8whO7AcIWznQ2Yj7yJkn34B8s63GViAAw= gopkg.in/gorp.v1 v1.7.2/go.mod h1:Wo3h+DBQZIxATwftsglhdD/62zRFPhGhTiu5jUJmCaw= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= @@ -1388,6 +1379,8 @@ gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXL gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/square/go-jose.v2 v2.5.1 h1:7odma5RETjNHWJnR32wx8t+Io4djHE1PqxCFx3iiZ2w= +gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= diff --git a/pkg/config/config.go b/pkg/config/config.go index 36aed9665..1936fed86 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -85,6 +85,10 @@ func AslanServiceInfo() *setting.ServiceInfo { return GetServiceByCode(setting.Aslan) } +func SecretKey() string { + return viper.GetString(setting.SecretKey) +} + func AslanServiceAddress() string { s := AslanServiceInfo() return GetServiceAddress(s.Name, s.Port) diff --git a/pkg/microservice/user/config/config.go b/pkg/microservice/user/config/config.go new file mode 100644 index 000000000..ccffd53d9 --- /dev/null +++ b/pkg/microservice/user/config/config.go @@ -0,0 +1,85 @@ +/* +Copyright 2021 The KodeRover 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 config + +import ( + "context" + "fmt" + "github.com/coreos/go-oidc" + _ "github.com/koderover/zadig/pkg/config" + "github.com/koderover/zadig/pkg/setting" + "github.com/spf13/viper" + "net/http" + "strings" +) + +func IssuerURL() string { + return viper.GetString(setting.IssuerURL) +} + +func Debug() string { + return viper.GetString(setting.Debug) +} + +func ClientID() string { + return viper.GetString(setting.ClientID) +} + +func ClientSecret() string { + return viper.GetString(setting.ClientSecret) +} + +func RedirectURI() string { + return viper.GetString(setting.RedirectURI) +} + +func Scopes() []string { + return strings.Split(viper.GetString(setting.Scopes), ",") +} + +func Client() *http.Client { + return http.DefaultClient +} + +func Provider() *oidc.Provider { + ctx := oidc.ClientContext(context.Background(), Client()) + provider, err := oidc.NewProvider(ctx, IssuerURL()) + if err != nil { + panic(fmt.Sprintf("init provider error:%s", err.Error())) + } + return provider +} + +func Verifier() *oidc.IDTokenVerifier { + return Provider().Verifier(&oidc.Config{ClientID: ClientID()}) +} + +func User() string { + return viper.GetString(setting.MysqlUser) +} + +func Password() string { + return viper.GetString(setting.Password) +} + +func Host() string { + return viper.GetString(setting.Host) +} + +func Name() string { + return viper.GetString(setting.Name) +} diff --git a/pkg/microservice/user/config/consts.go b/pkg/microservice/user/config/consts.go new file mode 100644 index 000000000..14144b2db --- /dev/null +++ b/pkg/microservice/user/config/consts.go @@ -0,0 +1,23 @@ +/* +Copyright 2021 The KodeRover 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 config + +const ( + AppState = "zadig user" + Audience = "zadig" + SystemIdentityType = "system" +) diff --git a/pkg/microservice/user/core/handler/login/internal.go b/pkg/microservice/user/core/handler/login/internal.go new file mode 100644 index 000000000..74c1a6eef --- /dev/null +++ b/pkg/microservice/user/core/handler/login/internal.go @@ -0,0 +1,18 @@ +package login + +import ( + "github.com/gin-gonic/gin" + "github.com/koderover/zadig/pkg/microservice/user/core/service/login" + internalhandler "github.com/koderover/zadig/pkg/shared/handler" +) + +func InternalLogin(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + args := &login.LoginArgs{} + if err := c.ShouldBindJSON(args); err != nil { + ctx.Err = err + return + } + ctx.Resp, ctx.Err = login.InternalLogin(args, ctx.Logger) +} diff --git a/pkg/microservice/user/core/handler/login/third_part.go b/pkg/microservice/user/core/handler/login/third_part.go new file mode 100644 index 000000000..c274cf6d3 --- /dev/null +++ b/pkg/microservice/user/core/handler/login/third_part.go @@ -0,0 +1,134 @@ +package login + +import ( + "bytes" + "encoding/json" + "fmt" + "github.com/coreos/go-oidc/v3/oidc" + "github.com/gin-gonic/gin" + "github.com/koderover/zadig/pkg/microservice/user/config" + "github.com/koderover/zadig/pkg/microservice/user/core/service/login" + internalhandler "github.com/koderover/zadig/pkg/shared/handler" + e "github.com/koderover/zadig/pkg/tool/errors" + "github.com/koderover/zadig/pkg/util" + "golang.org/x/oauth2" + "net/http" + "net/url" + "time" +) + +func Login(c *gin.Context) { + oauth2Config := &oauth2.Config{ + ClientID: config.ClientID(), + ClientSecret: config.ClientSecret(), + Endpoint: config.Provider().Endpoint(), + Scopes: config.Scopes(), + RedirectURL: config.RedirectURI(), + } + authCodeURL := oauth2Config.AuthCodeURL(config.AppState, oauth2.AccessTypeOffline) + c.Redirect(http.StatusSeeOther, authCodeURL) +} + +func Callback(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + + oidcCtx := oidc.ClientContext(c.Request.Context(), config.Client()) + oauth2Config := &oauth2.Config{ + ClientID: config.ClientID(), + ClientSecret: config.ClientSecret(), + Endpoint: config.Provider().Endpoint(), + Scopes: nil, + RedirectURL: config.RedirectURI(), + } + var err error + var token *oauth2.Token + switch c.Request.Method { + case http.MethodGet: + // Authorization redirect callback from OAuth2 auth flow. + if errMsg := c.Query("error"); errMsg != "" { + ctx.Err = e.ErrCallBackUser.AddDesc(errMsg) + return + } + code := c.Query("code") + if code == "" { + ctx.Err = e.ErrCallBackUser.AddDesc(fmt.Sprintf("no code in request: %q", c.Request.Form)) + return + } + if state := c.Query("state"); state != config.AppState { + ctx.Err = e.ErrCallBackUser.AddDesc(fmt.Sprintf("expected state %q got %q", config.AppState, state)) + return + } + token, err = oauth2Config.Exchange(oidcCtx, code) + case http.MethodPost: + // Form request from frontend to refresh a token. + refresh := c.Query("refresh_token") + if refresh == "" { + ctx.Err = e.ErrCallBackUser.AddDesc(fmt.Sprintf("no refresh_token in request: %q", c.Request.Form)) + return + } + t := &oauth2.Token{ + RefreshToken: refresh, + Expiry: time.Now().Add(-time.Hour), + } + token, err = oauth2Config.TokenSource(oidcCtx, t).Token() + default: + ctx.Err = e.ErrCallBackUser.AddDesc(fmt.Sprintf("method not implemented: %s", c.Request.Method)) + return + } + + if err != nil { + ctx.Err = e.ErrCallBackUser.AddDesc(fmt.Sprintf("failed to get token: %v", err)) + return + } + + rawIDToken, ok := token.Extra("id_token").(string) + if !ok { + ctx.Err = e.ErrCallBackUser.AddDesc("no id_token in token response") + return + } + + idToken, err := config.Verifier().Verify(c.Request.Context(), rawIDToken) + if err != nil { + ctx.Err = e.ErrCallBackUser.AddDesc(fmt.Sprintf("failed to verify ID token: %v", err)) + return + } + + var claimsRaw json.RawMessage + if err := idToken.Claims(&claimsRaw); err != nil { + ctx.Err = e.ErrCallBackUser.AddDesc(fmt.Sprintf("error decoding ID token claims: %v", err)) + return + } + buff := new(bytes.Buffer) + if err := json.Indent(buff, claimsRaw, "", " "); err != nil { + ctx.Err = e.ErrCallBackUser.AddDesc(fmt.Sprintf("error indenting ID token claims: %v", err)) + return + } + + var claims util.Claims + err = json.Unmarshal(claimsRaw, &claims) + if err != nil { + ctx.Err = err + return + } + user, err := login.SyncUser(&login.SyncUserInfo{ + Email: claims.Email, + Name: claims.Name, + IdentityType: claims.FederatedClaims.ConnectorId, + }, ctx.Logger) + if err != nil { + ctx.Err = err + return + } + claims.Uid = user.Uid + claims.StandardClaims.ExpiresAt = time.Now().Add(24 * time.Hour).Unix() + userToken, err := util.CreateToken(&claims) + if err != nil { + ctx.Err = err + return + } + v := url.Values{} + v.Add("token", userToken) + redirectUrl := "../..?" + v.Encode() + c.Redirect(http.StatusSeeOther, redirectUrl) +} diff --git a/pkg/microservice/user/core/handler/router.go b/pkg/microservice/user/core/handler/router.go new file mode 100644 index 000000000..eaab5cbe0 --- /dev/null +++ b/pkg/microservice/user/core/handler/router.go @@ -0,0 +1,44 @@ +/* +Copyright 2021 The KodeRover 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 handler + +import ( + "github.com/gin-gonic/gin" + "github.com/koderover/zadig/pkg/microservice/user/core/handler/login" + "github.com/koderover/zadig/pkg/microservice/user/core/handler/user" +) + +type Router struct{} + +func (*Router) Inject(router *gin.RouterGroup) { + users := router.Group("/") + { + users.GET("login", login.Login) + + users.GET("api/v1/callback", login.Callback) + + users.POST("login", login.InternalLogin) + + users.POST("api/v1/users", user.CreateUser) + + users.PUT("api/v1/users/:uid/password", user.UpdatePassword) + + users.GET("api/v1/users/:uid", user.GetUser) + + users.GET("api/v1/users", user.GetUsers) + } +} diff --git a/pkg/microservice/user/core/handler/user/user.go b/pkg/microservice/user/core/handler/user/user.go new file mode 100644 index 000000000..d89ee9ffa --- /dev/null +++ b/pkg/microservice/user/core/handler/user/user.go @@ -0,0 +1,47 @@ +package user + +import ( + "github.com/gin-gonic/gin" + "github.com/koderover/zadig/pkg/microservice/user/core/service/user" + internalhandler "github.com/koderover/zadig/pkg/shared/handler" + "strconv" +) + +func GetUser(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + ctx.Resp, ctx.Err = user.GetUser(c.Param("uid"), ctx.Logger) +} + +func GetUsers(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + args := &user.Users{} + args.Name = c.Query("name") + args.Page, _ = strconv.Atoi(c.Query("page")) + args.PerPage, _ = strconv.Atoi(c.Query("per_page")) + ctx.Resp, ctx.Err = user.GetUsers(args, ctx.Logger) +} + +func CreateUser(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + args := &user.User{} + if err := c.ShouldBindJSON(args); err != nil { + ctx.Err = err + return + } + ctx.Err = user.CreateUser(args, ctx.Logger) +} + +func UpdatePassword(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + args := &user.Password{} + if err := c.ShouldBindJSON(args); err != nil { + ctx.Err = err + return + } + args.Uid = c.Param("uid") + ctx.Err = user.UpdatePassword(args, ctx.Logger) +} diff --git a/pkg/microservice/user/core/repository/models/user.go b/pkg/microservice/user/core/repository/models/user.go new file mode 100644 index 000000000..53351e5fa --- /dev/null +++ b/pkg/microservice/user/core/repository/models/user.go @@ -0,0 +1,12 @@ +package models + +import "github.com/koderover/zadig/pkg/microservice/user/core" + +type User struct { + core.Model + Uid string `json:"uid"` + Name string `json:"name"` + IdentityType string `gorm:"default:'unknown'" json:"identity_type"` + Email string `json:"email"` + Phone string `json:"phone"` +} diff --git a/pkg/microservice/user/core/repository/models/user_login.go b/pkg/microservice/user/core/repository/models/user_login.go new file mode 100644 index 000000000..b4bc0a1d1 --- /dev/null +++ b/pkg/microservice/user/core/repository/models/user_login.go @@ -0,0 +1,10 @@ +package models + +import "github.com/koderover/zadig/pkg/microservice/user/core" + +type UserLogin struct { + core.Model + Uid string `json:"uid"` + Password string `json:"password"` + LastLoginTime int64 `json:"last_login_time"` +} diff --git a/pkg/microservice/user/core/repository/mysql/user.go b/pkg/microservice/user/core/repository/mysql/user.go new file mode 100644 index 000000000..406914d87 --- /dev/null +++ b/pkg/microservice/user/core/repository/mysql/user.go @@ -0,0 +1,77 @@ +package mysql + +import ( + "github.com/jinzhu/gorm" + "github.com/koderover/zadig/pkg/microservice/user/core" + "github.com/koderover/zadig/pkg/microservice/user/core/repository/models" +) + +// CreateUser create a user +func CreateUser(user *models.User, db *gorm.DB) error { + if err := db.Create(&user).Error; err != nil { + return err + } + return nil +} + +// GetUser Get a user based on email and identityType +func GetUser(email string, identityType string, db *gorm.DB) (*models.User, error) { + var user models.User + err := db.Where("email = ? and identity_type = ?", email, identityType).First(&user).Error + if err != nil && err != gorm.ErrRecordNotFound { + return nil, err + } + if err == gorm.ErrRecordNotFound { + return nil, nil + } + return &user, nil +} + +// GetUserByUid Get a user based on uid +func GetUserByUid(uid string, db *gorm.DB) (*models.User, error) { + var user models.User + err := db.Where("uid = ?", uid).First(&user).Error + if err != nil && err != gorm.ErrRecordNotFound { + return nil, err + } + if err == gorm.ErrRecordNotFound { + return nil, nil + } + return &user, nil +} + +// GetUsers gets a list of users based on paging constraints +func GetUsers(page int, perPage int, name string, db *gorm.DB) ([]models.User, error) { + var ( + users []models.User + err error + ) + if page > 0 && perPage > 0 { + err = db.Where("name LIKE ?", "%"+name+"%").Find(&users).Offset((page - 1) * perPage).Limit(perPage).Error + } else { + err = db.Where("name LIKE ?", "%"+name+"%").Find(&users).Error + } + + if err != nil && err != gorm.ErrRecordNotFound { + return nil, err + } + + return users, nil +} + +// GetUsersCount gets user count +func GetUsersCount(name string) (int, error) { + var ( + users []models.User + err error + count int + ) + + err = core.DB.Where("name LIKE ?", "%"+name+"%").Find(&users).Count(&count).Error + + if err != nil { + return 0, err + } + + return count, nil +} diff --git a/pkg/microservice/user/core/repository/mysql/user_login.go b/pkg/microservice/user/core/repository/mysql/user_login.go new file mode 100644 index 000000000..8bbd2cd8f --- /dev/null +++ b/pkg/microservice/user/core/repository/mysql/user_login.go @@ -0,0 +1,45 @@ +package mysql + +import ( + "github.com/jinzhu/gorm" + "github.com/koderover/zadig/pkg/microservice/user/core/repository/models" +) + +// CreateUserLogin add a userLogin record +func CreateUserLogin(userLogin *models.UserLogin, db *gorm.DB) error { + if err := db.Create(&userLogin).Error; err != nil { + return err + } + return nil +} + +// GetUserLogin Get a userLogin based on uid +func GetUserLogin(uid string, db *gorm.DB) (*models.UserLogin, error) { + var userLogin models.UserLogin + err := db.Where("uid = ?", uid).First(&userLogin).Error + if err != nil && err != gorm.ErrRecordNotFound { + return nil, err + } + if err == gorm.ErrRecordNotFound { + return nil, nil + } + return &userLogin, nil +} + +// GetUserLogins Get a userLogin based on uid list +func GetUserLogins(uids []string, db *gorm.DB) (*[]models.UserLogin, error) { + var userLogins []models.UserLogin + err := db.Where("uid IN (?)", uids).Find(&userLogins).Error + if err != nil { + return nil, err + } + return &userLogins, nil +} + +// UpdateUserLogin update login info +func UpdateUserLogin(uid string, userLogin *models.UserLogin, db *gorm.DB) error { + if err := db.Model(&models.UserLogin{}).Where("uid = ?", uid).Updates(userLogin).Error; err != nil { + return err + } + return nil +} diff --git a/pkg/microservice/user/core/service.go b/pkg/microservice/user/core/service.go new file mode 100644 index 000000000..f4c09094f --- /dev/null +++ b/pkg/microservice/user/core/service.go @@ -0,0 +1,98 @@ +/* +Copyright 2021 The KodeRover 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 core + +import ( + "context" + "fmt" + "github.com/jinzhu/gorm" + _ "github.com/jinzhu/gorm/dialects/mysql" + "github.com/koderover/zadig/pkg/config" + config2 "github.com/koderover/zadig/pkg/microservice/user/config" + "github.com/koderover/zadig/pkg/setting" + "github.com/koderover/zadig/pkg/tool/log" + "time" +) + +func Start(_ context.Context) { + log.Init(&log.Config{ + Level: config.LogLevel(), + Filename: config.LogFile(), + SendToFile: config.SendLogToFile(), + Development: config.Mode() != setting.ReleaseMode, + }) + Setup() +} + +var DB *gorm.DB + +type Model struct { + CreatedAt int `json:"created_at"` + UpdatedAt int `json:"updated_at"` +} + +// Setup initializes the database instance +func Setup() { + var err error + DB, err = gorm.Open("mysql", fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8&parseTime=True&loc=Local", + config2.User(), + config2.Password(), + config2.Host(), + config2.Name())) + if err != nil { + log.Fatalf("models.Setup err: %v", err) + } + + gorm.DefaultTableNameHandler = func(db *gorm.DB, defaultTableName string) string { + return defaultTableName + } + + DB.SingularTable(true) + DB.Callback().Create().Replace("gorm:update_time_stamp", updateTimeStampForCreateCallback) + DB.Callback().Update().Replace("gorm:update_time_stamp", updateTimeStampForUpdateCallback) + DB.DB().SetMaxIdleConns(10) + DB.DB().SetMaxOpenConns(100) +} + +// updateTimeStampForCreateCallback will set `CreatedOn`, `ModifiedOn` when creating +func updateTimeStampForCreateCallback(scope *gorm.Scope) { + if !scope.HasError() { + nowTime := time.Now().Unix() + if createTimeField, ok := scope.FieldByName("CreatedAt"); ok { + if createTimeField.IsBlank { + createTimeField.Set(nowTime) + } + } + + if modifyTimeField, ok := scope.FieldByName("UpdatedAt"); ok { + if modifyTimeField.IsBlank { + modifyTimeField.Set(nowTime) + } + } + } +} + +// updateTimeStampForUpdateCallback will set `ModifiedOn` when updating +func updateTimeStampForUpdateCallback(scope *gorm.Scope) { + if _, ok := scope.Get("gorm:update_column"); !ok { + scope.SetColumn("ModifiedOn", time.Now().Unix()) + } +} + +func Stop(_ context.Context) { + DB.Close() +} diff --git a/pkg/microservice/user/core/service/login/internal.go b/pkg/microservice/user/core/service/login/internal.go new file mode 100644 index 000000000..4badd824b --- /dev/null +++ b/pkg/microservice/user/core/service/login/internal.go @@ -0,0 +1,80 @@ +package login + +import ( + "fmt" + "github.com/dgrijalva/jwt-go" + "github.com/koderover/zadig/pkg/microservice/user/config" + "github.com/koderover/zadig/pkg/microservice/user/core" + "github.com/koderover/zadig/pkg/microservice/user/core/repository/mysql" + "github.com/koderover/zadig/pkg/util" + "go.uber.org/zap" + "golang.org/x/crypto/bcrypt" + "time" +) + +type LoginArgs struct { + Email string `json:"email"` + Password string `json:"password"` +} + +type User struct { + Uid string `json:"uid"` + Token string `json:"token"` + Email string `json:"email"` + Phone string `json:"phone"` + Name string `json:"name"` + IdentityType string `json:"identityType"` +} + +func InternalLogin(args *LoginArgs, logger *zap.SugaredLogger) (*User, error) { + user, err := mysql.GetUser(args.Email, config.SystemIdentityType, core.DB) + if err != nil { + logger.Errorf("InternalLogin get user email:%s error", args.Email) + return nil, err + } + if user == nil { + return nil, fmt.Errorf("user not exist") + } + userLogin, err := mysql.GetUserLogin(user.Uid, core.DB) + if err != nil { + logger.Errorf("InternalLogin get user:%s user login not exist, error msg:%s", args.Email, err.Error()) + return nil, err + } + if userLogin == nil { + logger.Errorf("InternalLogin user:%s user login not exist", args.Email) + return nil, fmt.Errorf("user login not exist") + } + password := []byte(args.Password) + err = bcrypt.CompareHashAndPassword([]byte(userLogin.Password), password) + if err != nil { + logger.Errorf("InternalLogin user:%s check password error, error msg:%s", args.Email, err.Error()) + return nil, fmt.Errorf("check password error, error msg:%s", err.Error()) + } + userLogin.LastLoginTime = time.Now().Unix() + err = mysql.UpdateUserLogin(userLogin.Uid, userLogin, core.DB) + if err != nil { + logger.Errorf("InternalLogin user:%s update user login password error, error msg:%s", args.Email, err.Error()) + return nil, err + } + token, err := util.CreateToken(&util.Claims{ + Name: user.Name, + Email: user.Email, + Uid: user.Uid, + StandardClaims: jwt.StandardClaims{ + Audience: config.Audience, + ExpiresAt: time.Now().Add(24 * time.Hour).Unix(), + }, + }) + if err != nil { + logger.Errorf("InternalLogin user:%s create token error, error msg:%s", args.Email, err.Error()) + return nil, err + } + return &User{ + Uid: user.Uid, + Token: token, + Email: user.Email, + Phone: user.Phone, + Name: user.Name, + IdentityType: user.IdentityType, + }, nil +} diff --git a/pkg/microservice/user/core/service/login/third_part.go b/pkg/microservice/user/core/service/login/third_part.go new file mode 100644 index 000000000..81bc5338a --- /dev/null +++ b/pkg/microservice/user/core/service/login/third_part.go @@ -0,0 +1,75 @@ +package login + +import ( + "github.com/google/uuid" + "github.com/koderover/zadig/pkg/microservice/user/core" + "github.com/koderover/zadig/pkg/microservice/user/core/repository/models" + "github.com/koderover/zadig/pkg/microservice/user/core/repository/mysql" + "go.uber.org/zap" + "time" +) + +type SyncUserInfo struct { + Email string `json:"email"` + IdentityType string `json:"identityType"` + Name string `json:"name"` +} + +func SyncUser(syncUserInfo *SyncUserInfo, logger *zap.SugaredLogger) (*models.User, error) { + user, err := mysql.GetUser(syncUserInfo.Email, syncUserInfo.IdentityType, core.DB) + if err != nil { + logger.Error("SyncUser get user:%s error, error msg:%s", syncUserInfo.Email, err.Error()) + return nil, err + } + tx := core.DB.Begin() + defer func() { + if r := recover(); r != nil { + tx.Rollback() + } + }() + if user == nil { + uid, _ := uuid.NewUUID() + user = &models.User{ + Uid: uid.String(), + Name: syncUserInfo.Name, + Email: syncUserInfo.Email, + IdentityType: syncUserInfo.IdentityType, + } + err = mysql.CreateUser(user, tx) + if err != nil { + tx.Rollback() + logger.Error("SyncUser create user:%s error, error msg:%s", syncUserInfo.Email, err.Error()) + return nil, err + } + } + userLogin, err := mysql.GetUserLogin(user.Uid, tx) + if err != nil { + tx.Rollback() + logger.Error("UpdateLoginInfo get user:%s login error, error msg:%s", user.Uid, err.Error()) + return nil, err + } + if userLogin != nil { + userLogin.LastLoginTime = time.Now().Unix() + err = mysql.UpdateUserLogin(user.Uid, userLogin, tx) + if err != nil { + tx.Rollback() + logger.Error("UpdateLoginInfo update user:%s login error, error msg:%s", user.Uid, err.Error()) + return nil, err + } + } else { + err = mysql.CreateUserLogin(&models.UserLogin{ + Uid: user.Uid, + LastLoginTime: time.Now().Unix(), + }, tx) + if err != nil { + tx.Rollback() + logger.Error("UpdateLoginInfo create user:%s login error, error msg:%s", user.Uid, err.Error()) + return nil, err + } + } + err = tx.Commit().Error + if err != nil { + return nil, err + } + return user, nil +} diff --git a/pkg/microservice/user/core/service/user/user.go b/pkg/microservice/user/core/service/user/user.go new file mode 100644 index 000000000..0f368eb57 --- /dev/null +++ b/pkg/microservice/user/core/service/user/user.go @@ -0,0 +1,176 @@ +package user + +import ( + "fmt" + "github.com/google/uuid" + "github.com/koderover/zadig/pkg/microservice/user/config" + "github.com/koderover/zadig/pkg/microservice/user/core" + "github.com/koderover/zadig/pkg/microservice/user/core/repository/models" + "github.com/koderover/zadig/pkg/microservice/user/core/repository/mysql" + "go.uber.org/zap" + "golang.org/x/crypto/bcrypt" +) + +type User struct { + Name string `json:"name"` + Password string `json:"password"` + Email string `json:"email"` + Phone string `json:"phone,omitempty"` +} + +type Users struct { + Name string `json:"name"` + PerPage int `json:"per_page"` + Page int `json:"page"` +} + +type UserInfo struct { + LastLoginTime int64 `json:"lastLoginTime"` + Uid string `json:"uid"` + Name string `json:"name"` + IdentityType string `gorm:"default:'unknown'" json:"identity_type"` + Email string `json:"email"` + Phone string `json:"phone"` +} + +type Password struct { + Uid string `json:"uid"` + OldPassword string `json:"oldPassword"` + NewPassword string `json:"newPassword"` +} + +type GetUsersResp struct { + Users []UserInfo `json:"users"` + TotalCount int `json:"totalCount"` +} + +func GetUser(uid string, logger *zap.SugaredLogger) (*models.User, error) { + user, err := mysql.GetUserByUid(uid, core.DB) + if err != nil { + logger.Errorf("GetUser getUserByUid:%s error, error msg:%s", uid, err.Error()) + return nil, err + } + return user, nil +} + +func GetUsers(args *Users, logger *zap.SugaredLogger) (*GetUsersResp, error) { + count, err := mysql.GetUsersCount(args.Name) + if err != nil { + logger.Errorf("GetUsers GetUsersCount By name:%s error, error msg:%s", args.Name, err.Error()) + return nil, err + } + users, err := mysql.GetUsers(args.Page, args.PerPage, args.Name, core.DB) + if err != nil { + logger.Errorf("GetUsers GetUsers By name:%s error, error msg:%s", args.Name, err.Error()) + return nil, err + } + var uids []string + for _, user := range users { + uids = append(uids, user.Uid) + } + userLogins, err := mysql.GetUserLogins(uids, core.DB) + if err != nil { + logger.Errorf("GetUsers GetUserLogins By uids:%s error, error msg:%s", uids, err.Error()) + return nil, err + } + userLoginMap := make(map[string]models.UserLogin) + for _, userLogin := range *userLogins { + userLoginMap[userLogin.Uid] = userLogin + } + var usersInfo []UserInfo + for _, user := range users { + if userLogin, ok := userLoginMap[user.Uid]; ok { + usersInfo = append(usersInfo, UserInfo{ + LastLoginTime: userLogin.LastLoginTime, + Uid: user.Uid, + Phone: user.Phone, + Name: user.Name, + Email: user.Email, + IdentityType: user.IdentityType, + }) + } else { + logger.Error("user:%s login info not exist") + } + } + return &GetUsersResp{ + Users: usersInfo, + TotalCount: count, + }, nil +} + +func CreateUser(args *User, logger *zap.SugaredLogger) error { + uid, _ := uuid.NewUUID() + user := &models.User{ + Name: args.Name, + Email: args.Email, + IdentityType: config.SystemIdentityType, + Phone: args.Phone, + Uid: uid.String(), + } + tx := core.DB.Begin() + defer func() { + if r := recover(); r != nil { + tx.Rollback() + } + }() + err := mysql.CreateUser(user, tx) + if err != nil { + tx.Rollback() + logger.Errorf("CreateUser CreateUser :%v error, error msg:%s", user, err.Error()) + return err + } + hashedPassword, _ := bcrypt.GenerateFromPassword([]byte(args.Password), bcrypt.DefaultCost) + userLogin := &models.UserLogin{ + Uid: user.Uid, + Password: string(hashedPassword), + LastLoginTime: 0, + } + err = mysql.CreateUserLogin(userLogin, tx) + if err != nil { + tx.Rollback() + logger.Errorf("CreateUser CreateUserLogin:%v error, error msg:%s", user, err.Error()) + return err + } + return tx.Commit().Error +} + +func UpdatePassword(args *Password, logger *zap.SugaredLogger) error { + user, err := mysql.GetUserByUid(args.Uid, core.DB) + if err != nil { + logger.Errorf("UpdatePassword GetUserByUid:%s error, error msg:%s", args.Uid, err.Error()) + return err + } + if user == nil { + return fmt.Errorf("user not exist") + } + userLogin, err := mysql.GetUserLogin(user.Uid, core.DB) + if err != nil { + logger.Errorf("UpdatePassword GetUserLogin:%s error, error msg:%s", args.Uid, err.Error()) + return err + } + if userLogin == nil { + logger.Errorf("UpdatePassword GetUserLogin:%s not exist", args.Uid) + return fmt.Errorf("userLogin not exist") + } + password := []byte(args.OldPassword) + err = bcrypt.CompareHashAndPassword([]byte(userLogin.Password), password) + if err == bcrypt.ErrMismatchedHashAndPassword { + return fmt.Errorf("password is wrong") + } + if err != nil { + logger.Errorf("UpdatePassword CompareHashAndPassword userLogin password:%s, password:%s error,"+ + " error msg:%s", userLogin.Password, password, err.Error()) + return err + } + hashedPassword, _ := bcrypt.GenerateFromPassword([]byte(args.NewPassword), bcrypt.DefaultCost) + userLogin = &models.UserLogin{ + Uid: user.Uid, + Password: string(hashedPassword), + } + err = mysql.UpdateUserLogin(user.Uid, userLogin, core.DB) + if err != nil { + logger.Errorf("UpdatePassword UpdateUserLogin:%v error, error msg:%s", userLogin, err.Error()) + return err + } + return nil +} diff --git a/pkg/microservice/user/server/rest/router.go b/pkg/microservice/user/server/rest/router.go new file mode 100644 index 000000000..101ce1e5a --- /dev/null +++ b/pkg/microservice/user/server/rest/router.go @@ -0,0 +1,35 @@ +/* +Copyright 2021 The KodeRover 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 rest + +import ( + "github.com/gin-gonic/gin" + + "github.com/koderover/zadig/pkg/microservice/user/core/handler" +) + +func (s *engine) injectRouterGroup(router *gin.RouterGroup) { + for name, r := range map[string]injector{ + "/": new(handler.Router), + } { + r.Inject(router.Group(name)) + } +} + +type injector interface { + Inject(router *gin.RouterGroup) +} diff --git a/pkg/microservice/user/server/rest/server.go b/pkg/microservice/user/server/rest/server.go new file mode 100644 index 000000000..18843b0a5 --- /dev/null +++ b/pkg/microservice/user/server/rest/server.go @@ -0,0 +1,76 @@ +/* +Copyright 2021 The KodeRover 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 rest + +import ( + "net/http" + + "github.com/gin-gonic/gin" + + "github.com/koderover/zadig/pkg/config" + ginmiddleware "github.com/koderover/zadig/pkg/middleware/gin" + "github.com/koderover/zadig/pkg/tool/log" +) + +type engine struct { + *gin.Engine + + mode string +} + +func NewEngine() *engine { + s := &engine{mode: config.Mode()} + + gin.SetMode(s.mode) + + s.injectMiddlewares() + s.injectRouters() + + return s +} + +func (s *engine) injectMiddlewares() { + g := gin.New() + defer func() { + s.Engine = g + }() + + if s.mode == gin.TestMode { + return + } + g.Use(ginmiddleware.Response()) + g.Use(ginmiddleware.RequestID()) + g.Use(ginmiddleware.RequestLog(log.NewFileLogger(config.RequestLogFile()))) + g.Use(gin.Recovery()) +} + +func (s *engine) injectRouters() { + g := s.Engine + + g.NoRoute(func(c *gin.Context) { + c.String(http.StatusNotFound, "Invalid path: %s", c.Request.URL.Path) + }) + g.HandleMethodNotAllowed = true + g.NoMethod(func(c *gin.Context) { + c.String(http.StatusMethodNotAllowed, "Method not allowed: %s %s", c.Request.Method, c.Request.URL.Path) + }) + + apiRouters := g.Group("") + s.injectRouterGroup(apiRouters) + + s.Engine = g +} diff --git a/pkg/microservice/user/server/server.go b/pkg/microservice/user/server/server.go new file mode 100644 index 000000000..a6c1e6169 --- /dev/null +++ b/pkg/microservice/user/server/server.go @@ -0,0 +1,60 @@ +/* +Copyright 2021 The KodeRover 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 server + +import ( + "context" + "net/http" + "time" + + "github.com/koderover/zadig/pkg/microservice/user/core" + "github.com/koderover/zadig/pkg/microservice/user/server/rest" + "github.com/koderover/zadig/pkg/tool/log" +) + +func Serve(ctx context.Context) error { + core.Start(ctx) + defer core.Stop(ctx) + + log.Info("Start policy service") + + engine := rest.NewEngine() + server := &http.Server{Addr: ":5555", Handler: engine} + + stopChan := make(chan struct{}) + go func() { + defer close(stopChan) + + <-ctx.Done() + + ctx, cancel := context.WithTimeout(context.TODO(), 5*time.Second) + defer cancel() + + if err := server.Shutdown(ctx); err != nil { + log.Errorf("Failed to stop server, error: %s", err) + } + }() + + if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed { + log.Errorf("Failed to start http server, error: %s", err) + return err + } + + <-stopChan + + return nil +} diff --git a/pkg/setting/consts.go b/pkg/setting/consts.go index 0dfa6e852..1567f423d 100644 --- a/pkg/setting/consts.go +++ b/pkg/setting/consts.go @@ -99,6 +99,24 @@ const ( DebugMode = "debug" ReleaseMode = "release" TestMode = "test" + + // user + IssuerURL = "ISSUER_URL" + Listen = "LISTEN" + TlsCert = "TLSCERT" + TlsKey = "TLSKEY" + RootCAs = "ROOT_CAS" + Debug = "DEBUG" + ClientID = "CLIENT_ID" + ClientSecret = "CLIENT_SECRET" + RedirectURI = "REDIRECT_URI" + SecretKey = "SECRET_KEY" + OfflineAsScope = "OFFLINE_AS_SCOPE" + MysqlUser = "MYSQL_USER" + Password = "PASSWORD" + Host = "HOST" + Name = "NAME" + Scopes = "SCOPES" ) // k8s concepts diff --git a/pkg/tool/errors/http_errors.go b/pkg/tool/errors/http_errors.go index 2c920d954..5c6a60949 100644 --- a/pkg/tool/errors/http_errors.go +++ b/pkg/tool/errors/http_errors.go @@ -44,7 +44,8 @@ var ( ErrListUsers = NewHTTPError(6002, "列出用户信息失败") // ErrFindUser ... ErrFindUser = NewHTTPError(6002, "获取用户信息失败") - + // ErrCallBackUser ... + ErrCallBackUser = NewHTTPError(6003, "dex回调用户失败") //----------------------------------------------------------------------------------------------- // Team APIs Range: 6020 - 6039 //----------------------------------------------------------------------------------------------- diff --git a/pkg/util/sign.go b/pkg/util/sign.go index 2e8cabca0..b982d8366 100644 --- a/pkg/util/sign.go +++ b/pkg/util/sign.go @@ -20,6 +20,8 @@ import ( "crypto/hmac" "crypto/sha256" "encoding/hex" + "github.com/dgrijalva/jwt-go" + "github.com/koderover/zadig/pkg/config" ) // ComputeHmacSha256 According to ak/sk generate secret key @@ -31,3 +33,25 @@ func ComputeHmacSha256(ak string, sk string) string { hex.EncodeToString(h.Sum(nil)) return sha } + +type Claims struct { + Name string `json:"name"` + Email string `json:"email"` + Uid string `json:"uid"` + FederatedClaims FederatedClaims `json:"federated_claims"` + jwt.StandardClaims +} + +type FederatedClaims struct { + ConnectorId string `json:"connector_id"` + UserId string `json:"user_id"` +} + +func CreateToken(claims *Claims) (string, error) { + token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) + tokenString, err := token.SignedString([]byte(config.SecretKey())) + if err != nil { + return "", err + } + return tokenString, nil +} -- Gitee From 8e475387b5a7af4072acfd19284019540fa9190f Mon Sep 17 00:00:00 2001 From: mouuii Date: Tue, 26 Oct 2021 15:01:41 +0800 Subject: [PATCH 114/405] initconfig Signed-off-by: mouuii --- pkg/cli/initconfig/cmd/init.go | 145 +++++++++++++---------------- pkg/cli/initconfig/cmd/root.go | 6 ++ pkg/shared/client/policy/client.go | 14 +++ pkg/shared/client/policy/policy.go | 4 +- 4 files changed, 89 insertions(+), 80 deletions(-) diff --git a/pkg/cli/initconfig/cmd/init.go b/pkg/cli/initconfig/cmd/init.go index f191ceff0..9c1b5642b 100644 --- a/pkg/cli/initconfig/cmd/init.go +++ b/pkg/cli/initconfig/cmd/init.go @@ -17,7 +17,11 @@ limitations under the License. package cmd import ( + "fmt" + "github.com/spf13/cobra" + "github.com/spf13/viper" + "golang.org/x/sync/errgroup" "github.com/koderover/zadig/pkg/microservice/policy/core/service" "github.com/koderover/zadig/pkg/setting" @@ -27,7 +31,6 @@ import ( func init() { rootCmd.AddCommand(migrateCmd) - } var migrateCmd = &cobra.Command{ @@ -46,83 +49,69 @@ func run() error { } func presetRole() error { - if err := policy.New().CreateSystemRole(&service.Role{ - Name: "admin", - Rules: []*service.Rule{&service.Rule{ - Verbs: []string{"*"}, - Resources: []string{"*"}, - }}, - }); err != nil { - return err - } - if err := policy.New().CreatePublicRole(&service.Role{ - Name: string(setting.Contributor), - Rules: []*service.Rule{&service.Rule{ - Verbs: []string{"get_workflow", "run_workflow"}, - Kind: "resource", - Resources: []string{"Workflow"}, - }, &service.Rule{ - Verbs: []string{"get_environment", "config_environment", "manage_environment", "delete_environment"}, - Kind: "resource", - Resources: []string{"Environment"}, - }, &service.Rule{ - Verbs: []string{"get_build", "get_service"}, - Kind: "resource", - Resources: []string{"Service"}, - }, &service.Rule{ - Verbs: []string{"get_test"}, - Kind: "resource", - Resources: []string{"Test"}, - }}, - }); err != nil { - return err - } - if err := policy.New().CreatePublicRole(&service.Role{ - Name: string(setting.Contributor), - Rules: []*service.Rule{&service.Rule{ - Verbs: []string{"get_workflow", "run_workflow"}, - Kind: "resource", - Resources: []string{"Workflow"}, - }, &service.Rule{ - Verbs: []string{"get_environment", "config_environment", "manage_environment", "delete_environment"}, - Kind: "resource", - Resources: []string{"Environment"}, - }, &service.Rule{ - Verbs: []string{"get_build", "get_service"}, - Kind: "resource", - Resources: []string{"Service"}, - }, &service.Rule{ - Verbs: []string{"get_test"}, - Kind: "resource", - Resources: []string{"Test"}, - }}, - }); err != nil { - return err - } - if err := policy.New().CreatePublicRole(&service.Role{ - Name: string(setting.ReadOnly), - Rules: []*service.Rule{&service.Rule{ - Verbs: []string{"get_workflow"}, - Kind: "resource", - Resources: []string{"Workflow"}, - }, &service.Rule{ - Verbs: []string{"get_environment"}, - Kind: "resource", - Resources: []string{"Environment"}, - }, &service.Rule{ - Verbs: []string{"get_build", "get_service"}, - Kind: "resource", - Resources: []string{"Service"}, - }, &service.Rule{ - Verbs: []string{"get_test"}, - Kind: "resource", - Resources: []string{"Test"}, - }, &service.Rule{ - Verbs: []string{"get_delivery"}, - Kind: "resource", - Resources: []string{"Delivery"}, - }}, - }); err != nil { + ss := viper.Get("yaml") + fmt.Println(ss) + return nil + g := new(errgroup.Group) + g.Go(func() error { + return policy.NewDefault().CreateSystemRole(&service.Role{ + Name: "admin", + Rules: []*service.Rule{&service.Rule{ + Verbs: []string{"*"}, + Resources: []string{"*"}, + }}, + }) + }) + + g.Go(func() error { + return policy.NewDefault().CreatePublicRole(&service.Role{ + Name: string(setting.Contributor), + Rules: []*service.Rule{&service.Rule{ + Verbs: []string{"get_workflow", "run_workflow"}, + Kind: "resource", + Resources: []string{"Workflow"}, + }, &service.Rule{ + Verbs: []string{"get_environment", "config_environment", "manage_environment", "delete_environment"}, + Kind: "resource", + Resources: []string{"Environment"}, + }, &service.Rule{ + Verbs: []string{"get_build", "get_service"}, + Kind: "resource", + Resources: []string{"Service"}, + }, &service.Rule{ + Verbs: []string{"get_test"}, + Kind: "resource", + Resources: []string{"Test"}, + }}, + }) + }) + g.Go(func() error { + return policy.NewDefault().CreatePublicRole(&service.Role{ + Name: string(setting.ReadOnly), + Rules: []*service.Rule{&service.Rule{ + Verbs: []string{"get_workflow"}, + Kind: "resource", + Resources: []string{"Workflow"}, + }, &service.Rule{ + Verbs: []string{"get_environment"}, + Kind: "resource", + Resources: []string{"Environment"}, + }, &service.Rule{ + Verbs: []string{"get_build", "get_service"}, + Kind: "resource", + Resources: []string{"Service"}, + }, &service.Rule{ + Verbs: []string{"get_test"}, + Kind: "resource", + Resources: []string{"Test"}, + }, &service.Rule{ + Verbs: []string{"get_delivery"}, + Kind: "resource", + Resources: []string{"Delivery"}, + }}, + }) + }) + if err := g.Wait(); err != nil { return err } return nil diff --git a/pkg/cli/initconfig/cmd/root.go b/pkg/cli/initconfig/cmd/root.go index 700380445..de595ea1b 100644 --- a/pkg/cli/initconfig/cmd/root.go +++ b/pkg/cli/initconfig/cmd/root.go @@ -21,6 +21,8 @@ import ( "github.com/spf13/cobra" + "github.com/koderover/zadig/pkg/tool/log" + "github.com/spf13/viper" ) @@ -78,6 +80,10 @@ func initConfig() { } viper.AutomaticEnv() // read in environment variables that match + log.Init(&log.Config{ + Level: "debug", + NoCaller: true, + }) // If a config file is found, read it in. if err := viper.ReadInConfig(); err == nil { diff --git a/pkg/shared/client/policy/client.go b/pkg/shared/client/policy/client.go index 7406675b9..251a6b521 100644 --- a/pkg/shared/client/policy/client.go +++ b/pkg/shared/client/policy/client.go @@ -45,3 +45,17 @@ func New() *Client { host: host, } } + +func NewDefault() *Client { + //host := config.PolicyServiceAddress() + host := "http://localhost:8080" + + c := httpclient.New( + httpclient.SetHostURL(host + "/api/v1"), + ) + + return &Client{ + Client: c, + host: host, + } +} diff --git a/pkg/shared/client/policy/policy.go b/pkg/shared/client/policy/policy.go index 3e63c0873..14e05eded 100644 --- a/pkg/shared/client/policy/policy.go +++ b/pkg/shared/client/policy/policy.go @@ -55,13 +55,13 @@ func (c *Client) DeleteRoleBinding(name string, projectName string) error { } func (c *Client) CreateSystemRole(role *service.Role) error { - url := fmt.Sprintf("/system-roles", role) + url := "/system-roles" _, err := c.Post(url, httpclient.SetBody(role)) return err } func (c *Client) CreatePublicRole(role *service.Role) error { - url := fmt.Sprintf("/public-roles", role) + url := "/public-roles" _, err := c.Post(url, httpclient.SetBody(role)) return err } -- Gitee From f0bb50494767e4c284a8ff2ad1ec187d7023ceb7 Mon Sep 17 00:00:00 2001 From: lou Date: Tue, 26 Oct 2021 15:27:17 +0800 Subject: [PATCH 115/405] enable secret verify Signed-off-by: lou --- .../policy/core/handler/role_binding.go | 2 +- .../policy/core/service/bundle/rego/authz.rego | 18 ++++++++++++++++-- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/pkg/microservice/policy/core/handler/role_binding.go b/pkg/microservice/policy/core/handler/role_binding.go index 5b1026868..0b9cbcdfd 100644 --- a/pkg/microservice/policy/core/handler/role_binding.go +++ b/pkg/microservice/policy/core/handler/role_binding.go @@ -114,5 +114,5 @@ func ListUserBindings(c *gin.Context) { projectName = service.SystemScope } - ctx.Resp, ctx.Err = service.ListRoleBindings(c.Query("projectName"), uid, ctx.Logger) + ctx.Resp, ctx.Err = service.ListRoleBindings(projectName, uid, ctx.Logger) } diff --git a/pkg/microservice/policy/core/service/bundle/rego/authz.rego b/pkg/microservice/policy/core/service/bundle/rego/authz.rego index da9813520..cec268d7c 100644 --- a/pkg/microservice/policy/core/service/bundle/rego/authz.rego +++ b/pkg/microservice/policy/core/service/bundle/rego/authz.rego @@ -164,11 +164,11 @@ user_is_granted[grant] { } claims := payload { - # TODO: Verify the signature on the Bearer token. The certificate can be + # Verify the signature on the Bearer token. The certificate can be # hardcoded into the policy, and it could also be loaded via data or # an environment variable. Environment variables can be accessed using # the `opa.runtime()` built-in function. - # io.jwt.verify_rs256(bearer_token, certificate) + io.jwt.verify_hs256(bearer_token, secret) # This statement invokes the built-in function `io.jwt.decode` passing the # parsed bearer_token as a parameter. The `io.jwt.decode` function returns an @@ -179,6 +179,12 @@ claims := payload { # In Rego, you can pattern match values using the `=` and `:=` operators. This # example pattern matches on the result to obtain the JWT payload. [_, payload, _] := io.jwt.decode(bearer_token) + + # it is not working, don't know why + # [valid, _, payload] := io.jwt.decode_verify(bearer_token, { + # "secret": secret, + # "alg": "alg", + # }) } bearer_token := t { @@ -189,3 +195,11 @@ bearer_token := t { startswith(v, "Bearer ") t := substring(v, count("Bearer "), -1) } + +envs := env { + env := opa.runtime()["env"] +} + +secret := s { + s := envs["SECRET_KEY"] +} -- Gitee From 98173fb86da997f787d1d8295cef5d6a850fc5d1 Mon Sep 17 00:00:00 2001 From: mouuii Date: Tue, 26 Oct 2021 15:36:25 +0800 Subject: [PATCH 116/405] initconfig Signed-off-by: mouuii --- pkg/cli/initconfig/cmd/admin.yaml | 6 ++ pkg/cli/initconfig/cmd/contributor.yaml | 27 ++++++++ pkg/cli/initconfig/cmd/init.go | 83 ++++++++----------------- pkg/cli/initconfig/cmd/read-only.yaml | 29 +++++++++ 4 files changed, 88 insertions(+), 57 deletions(-) create mode 100644 pkg/cli/initconfig/cmd/admin.yaml create mode 100644 pkg/cli/initconfig/cmd/contributor.yaml create mode 100644 pkg/cli/initconfig/cmd/read-only.yaml diff --git a/pkg/cli/initconfig/cmd/admin.yaml b/pkg/cli/initconfig/cmd/admin.yaml new file mode 100644 index 000000000..b64adb5c0 --- /dev/null +++ b/pkg/cli/initconfig/cmd/admin.yaml @@ -0,0 +1,6 @@ +name: admin +rules: + - verbs: + - "*" + resources: + - "*" \ No newline at end of file diff --git a/pkg/cli/initconfig/cmd/contributor.yaml b/pkg/cli/initconfig/cmd/contributor.yaml new file mode 100644 index 000000000..ecaf596a8 --- /dev/null +++ b/pkg/cli/initconfig/cmd/contributor.yaml @@ -0,0 +1,27 @@ +name: Contributor +rules: + - verbs: + - get_workflow + - run_workflow + resources: + - Workflow + kind: resource + - verbs: + - get_environment + - config_environment + - manage_environment + - delete_environment + resources: + - Environment + kind: resource + - verbs: + - get_build + - get_service + resources: + - Service + kind: resource + - verbs: + - get_test + resources: + - Test + kind: resource diff --git a/pkg/cli/initconfig/cmd/init.go b/pkg/cli/initconfig/cmd/init.go index 9c1b5642b..24451999a 100644 --- a/pkg/cli/initconfig/cmd/init.go +++ b/pkg/cli/initconfig/cmd/init.go @@ -17,14 +17,13 @@ limitations under the License. package cmd import ( - "fmt" + _ "embed" "github.com/spf13/cobra" - "github.com/spf13/viper" "golang.org/x/sync/errgroup" + "sigs.k8s.io/yaml" "github.com/koderover/zadig/pkg/microservice/policy/core/service" - "github.com/koderover/zadig/pkg/setting" "github.com/koderover/zadig/pkg/shared/client/policy" "github.com/koderover/zadig/pkg/tool/log" ) @@ -33,6 +32,15 @@ func init() { rootCmd.AddCommand(migrateCmd) } +//go:embed contributor.yaml +var contributor []byte + +//go:embed read-only.yaml +var readOnly []byte + +//go:embed admin.yaml +var admin []byte + var migrateCmd = &cobra.Command{ Use: "init", Short: "init preset role", @@ -49,67 +57,28 @@ func run() error { } func presetRole() error { - ss := viper.Get("yaml") - fmt.Println(ss) - return nil g := new(errgroup.Group) g.Go(func() error { - return policy.NewDefault().CreateSystemRole(&service.Role{ - Name: "admin", - Rules: []*service.Rule{&service.Rule{ - Verbs: []string{"*"}, - Resources: []string{"*"}, - }}, - }) + adminRole := &service.Role{} + if err := yaml.Unmarshal(admin, adminRole); err != nil { + log.DPanic(err) + } + return policy.NewDefault().CreateSystemRole(adminRole) }) g.Go(func() error { - return policy.NewDefault().CreatePublicRole(&service.Role{ - Name: string(setting.Contributor), - Rules: []*service.Rule{&service.Rule{ - Verbs: []string{"get_workflow", "run_workflow"}, - Kind: "resource", - Resources: []string{"Workflow"}, - }, &service.Rule{ - Verbs: []string{"get_environment", "config_environment", "manage_environment", "delete_environment"}, - Kind: "resource", - Resources: []string{"Environment"}, - }, &service.Rule{ - Verbs: []string{"get_build", "get_service"}, - Kind: "resource", - Resources: []string{"Service"}, - }, &service.Rule{ - Verbs: []string{"get_test"}, - Kind: "resource", - Resources: []string{"Test"}, - }}, - }) + contributorRole := &service.Role{} + if err := yaml.Unmarshal(contributor, contributorRole); err != nil { + log.DPanic(err) + } + return policy.NewDefault().CreatePublicRole(contributorRole) }) g.Go(func() error { - return policy.NewDefault().CreatePublicRole(&service.Role{ - Name: string(setting.ReadOnly), - Rules: []*service.Rule{&service.Rule{ - Verbs: []string{"get_workflow"}, - Kind: "resource", - Resources: []string{"Workflow"}, - }, &service.Rule{ - Verbs: []string{"get_environment"}, - Kind: "resource", - Resources: []string{"Environment"}, - }, &service.Rule{ - Verbs: []string{"get_build", "get_service"}, - Kind: "resource", - Resources: []string{"Service"}, - }, &service.Rule{ - Verbs: []string{"get_test"}, - Kind: "resource", - Resources: []string{"Test"}, - }, &service.Rule{ - Verbs: []string{"get_delivery"}, - Kind: "resource", - Resources: []string{"Delivery"}, - }}, - }) + readOnlyRole := &service.Role{} + if err := yaml.Unmarshal(readOnly, readOnlyRole); err != nil { + log.DPanic(err) + } + return policy.NewDefault().CreatePublicRole(readOnlyRole) }) if err := g.Wait(); err != nil { return err diff --git a/pkg/cli/initconfig/cmd/read-only.yaml b/pkg/cli/initconfig/cmd/read-only.yaml new file mode 100644 index 000000000..b79574da2 --- /dev/null +++ b/pkg/cli/initconfig/cmd/read-only.yaml @@ -0,0 +1,29 @@ +# 如果觉得好用,请收藏或则分享本站 +name: ReadOnly +rules: + - verbs: + - get_workflow + resources: + - Workflow + kind: resource + - verbs: + - get_environment + resources: + - Environment + kind: resource + - verbs: + - get_build + - get_service + resources: + - Service + kind: resource + - verbs: + - get_test + resources: + - Test + kind: resource + - verbs: + - get_delivery + resources: + - Delivery + kind: resource \ No newline at end of file -- Gitee From 5502fe70ddc03d48e72926418df6998f5222e006 Mon Sep 17 00:00:00 2001 From: mouuii Date: Tue, 26 Oct 2021 15:48:28 +0800 Subject: [PATCH 117/405] initconfig Signed-off-by: mouuii --- pkg/cli/initconfig/cmd/read-only.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/pkg/cli/initconfig/cmd/read-only.yaml b/pkg/cli/initconfig/cmd/read-only.yaml index b79574da2..6b27e1222 100644 --- a/pkg/cli/initconfig/cmd/read-only.yaml +++ b/pkg/cli/initconfig/cmd/read-only.yaml @@ -1,4 +1,3 @@ -# 如果觉得好用,请收藏或则分享本站 name: ReadOnly rules: - verbs: -- Gitee From 59469fc91980009d6ad37d0ea852528649db48d6 Mon Sep 17 00:00:00 2001 From: mouuii Date: Tue, 26 Oct 2021 16:13:21 +0800 Subject: [PATCH 118/405] initconfig Signed-off-by: mouuii --- pkg/cli/initconfig/cmd/contributor.yaml | 2 +- pkg/cli/initconfig/cmd/init.go | 39 ++++++++++++++----------- 2 files changed, 23 insertions(+), 18 deletions(-) diff --git a/pkg/cli/initconfig/cmd/contributor.yaml b/pkg/cli/initconfig/cmd/contributor.yaml index ecaf596a8..72513e431 100644 --- a/pkg/cli/initconfig/cmd/contributor.yaml +++ b/pkg/cli/initconfig/cmd/contributor.yaml @@ -13,7 +13,7 @@ rules: - delete_environment resources: - Environment - kind: resource + kind: resourcepkg/cli/initconfig/cmd/init.go - verbs: - get_build - get_service diff --git a/pkg/cli/initconfig/cmd/init.go b/pkg/cli/initconfig/cmd/init.go index 24451999a..2ae0bf7fc 100644 --- a/pkg/cli/initconfig/cmd/init.go +++ b/pkg/cli/initconfig/cmd/init.go @@ -29,7 +29,7 @@ import ( ) func init() { - rootCmd.AddCommand(migrateCmd) + rootCmd.AddCommand(initRoleCmd) } //go:embed contributor.yaml @@ -41,7 +41,7 @@ var readOnly []byte //go:embed admin.yaml var admin []byte -var migrateCmd = &cobra.Command{ +var initRoleCmd = &cobra.Command{ Use: "init", Short: "init preset role", Long: `init preset role.`, @@ -53,9 +53,12 @@ var migrateCmd = &cobra.Command{ } func run() error { - return presetRole() + return initSystemConfig() } +func initSystemConfig() { + presetRole() +} func presetRole() error { g := new(errgroup.Group) g.Go(func() error { @@ -66,20 +69,22 @@ func presetRole() error { return policy.NewDefault().CreateSystemRole(adminRole) }) - g.Go(func() error { - contributorRole := &service.Role{} - if err := yaml.Unmarshal(contributor, contributorRole); err != nil { - log.DPanic(err) - } - return policy.NewDefault().CreatePublicRole(contributorRole) - }) - g.Go(func() error { - readOnlyRole := &service.Role{} - if err := yaml.Unmarshal(readOnly, readOnlyRole); err != nil { - log.DPanic(err) - } - return policy.NewDefault().CreatePublicRole(readOnlyRole) - }) + var publicRoles []*service.Role + contributorRole := &service.Role{} + if err := yaml.Unmarshal(contributor, contributorRole); err != nil { + log.DPanic(err) + } + readOnlyRole := &service.Role{} + if err := yaml.Unmarshal(readOnly, readOnlyRole); err != nil { + log.DPanic(err) + } + publicRoles = append(publicRoles, contributorRole, readOnlyRole) + + for _, v := range publicRoles { + g.Go(func() error { + return policy.NewDefault().CreatePublicRole(v) + }) + } if err := g.Wait(); err != nil { return err } -- Gitee From 26654558bfa45b1a7ee0c328c1a955631816a544 Mon Sep 17 00:00:00 2001 From: mouuii Date: Tue, 26 Oct 2021 16:13:44 +0800 Subject: [PATCH 119/405] initconfig Signed-off-by: mouuii --- pkg/cli/initconfig/cmd/init.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/cli/initconfig/cmd/init.go b/pkg/cli/initconfig/cmd/init.go index 2ae0bf7fc..009c2c126 100644 --- a/pkg/cli/initconfig/cmd/init.go +++ b/pkg/cli/initconfig/cmd/init.go @@ -56,8 +56,8 @@ func run() error { return initSystemConfig() } -func initSystemConfig() { - presetRole() +func initSystemConfig() error { + return presetRole() } func presetRole() error { g := new(errgroup.Group) -- Gitee From bb5a2cdb0c2e1e7931a990573d87ad11e544b7bb Mon Sep 17 00:00:00 2001 From: mouuii Date: Tue, 26 Oct 2021 17:02:35 +0800 Subject: [PATCH 120/405] initconfig Signed-off-by: mouuii --- pkg/cli/initconfig/cmd/root.go | 64 ++++++---------------------------- 1 file changed, 10 insertions(+), 54 deletions(-) diff --git a/pkg/cli/initconfig/cmd/root.go b/pkg/cli/initconfig/cmd/root.go index de595ea1b..082fdcd40 100644 --- a/pkg/cli/initconfig/cmd/root.go +++ b/pkg/cli/initconfig/cmd/root.go @@ -1,5 +1,5 @@ /* -Copyright © 2021 NAME HERE +Copyright 2021 The KodeRover Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -13,80 +13,36 @@ 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 cmd import ( - "fmt" - "os" - "github.com/spf13/cobra" + "github.com/spf13/viper" "github.com/koderover/zadig/pkg/tool/log" - - "github.com/spf13/viper" ) -var cfgFile string - -// rootCmd represents the base command when called without any subcommands var rootCmd = &cobra.Command{ - Use: "newApp", - Short: "A brief description of your application", - Long: `A longer description that spans multiple lines and likely contains -examples and usage of using your application. For example: - -Cobra is a CLI library for Go that empowers applications. -This application is a tool to generate the needed files -to quickly create a Cobra application.`, - // Uncomment the following line if your bare application - // has an action associated with it: - // Run: func(cmd *cobra.Command, args []string) { }, + Use: "config", + Short: "init config for zadig", + Long: `init system config for zadig`, } -// Execute adds all child commands to the root command and sets flags appropriately. -// This is called by main.main(). It only needs to happen once to the rootCmd. -func Execute() { - cobra.CheckErr(rootCmd.Execute()) +// Execute executes the root command. +func Execute() error { + return rootCmd.Execute() } func init() { cobra.OnInitialize(initConfig) - - // Here you will define your flags and configuration settings. - // Cobra supports persistent flags, which, if defined here, - // will be global for your application. - - rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (default is $HOME/.newApp.yaml)") - - // Cobra also supports local flags, which will only run - // when this action is called directly. - rootCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle") } -// initConfig reads in config file and ENV variables if set. func initConfig() { - if cfgFile != "" { - // Use config file from the flag. - viper.SetConfigFile(cfgFile) - } else { - // Find home directory. - home, err := os.UserHomeDir() - cobra.CheckErr(err) - - // Search config in home directory with name ".newApp" (without extension). - viper.AddConfigPath(home) - viper.SetConfigType("yaml") - viper.SetConfigName(".newApp") - } + viper.AutomaticEnv() - viper.AutomaticEnv() // read in environment variables that match log.Init(&log.Config{ Level: "debug", NoCaller: true, }) - - // If a config file is found, read it in. - if err := viper.ReadInConfig(); err == nil { - fmt.Fprintln(os.Stderr, "Using config file:", viper.ConfigFileUsed()) - } } -- Gitee From ee4bf1a36adf1f7f9903d509229f9f5b4923c1f8 Mon Sep 17 00:00:00 2001 From: mouuii Date: Tue, 26 Oct 2021 17:05:38 +0800 Subject: [PATCH 121/405] initconfig Signed-off-by: mouuii --- pkg/cli/initconfig/cmd/init.go | 19 ++----------------- pkg/shared/client/policy/policy.go | 9 ++++----- 2 files changed, 6 insertions(+), 22 deletions(-) diff --git a/pkg/cli/initconfig/cmd/init.go b/pkg/cli/initconfig/cmd/init.go index 009c2c126..d37aa48b7 100644 --- a/pkg/cli/initconfig/cmd/init.go +++ b/pkg/cli/initconfig/cmd/init.go @@ -21,9 +21,7 @@ import ( "github.com/spf13/cobra" "golang.org/x/sync/errgroup" - "sigs.k8s.io/yaml" - "github.com/koderover/zadig/pkg/microservice/policy/core/service" "github.com/koderover/zadig/pkg/shared/client/policy" "github.com/koderover/zadig/pkg/tool/log" ) @@ -62,23 +60,10 @@ func initSystemConfig() error { func presetRole() error { g := new(errgroup.Group) g.Go(func() error { - adminRole := &service.Role{} - if err := yaml.Unmarshal(admin, adminRole); err != nil { - log.DPanic(err) - } - return policy.NewDefault().CreateSystemRole(adminRole) + return policy.NewDefault().CreateSystemRole(admin) }) - var publicRoles []*service.Role - contributorRole := &service.Role{} - if err := yaml.Unmarshal(contributor, contributorRole); err != nil { - log.DPanic(err) - } - readOnlyRole := &service.Role{} - if err := yaml.Unmarshal(readOnly, readOnlyRole); err != nil { - log.DPanic(err) - } - publicRoles = append(publicRoles, contributorRole, readOnlyRole) + publicRoles := [][]byte{contributor, readOnly} for _, v := range publicRoles { g.Go(func() error { diff --git a/pkg/shared/client/policy/policy.go b/pkg/shared/client/policy/policy.go index 14e05eded..62b9e0981 100644 --- a/pkg/shared/client/policy/policy.go +++ b/pkg/shared/client/policy/policy.go @@ -3,7 +3,6 @@ package policy import ( "fmt" - "github.com/koderover/zadig/pkg/microservice/policy/core/service" "github.com/koderover/zadig/pkg/setting" "github.com/koderover/zadig/pkg/tool/httpclient" ) @@ -54,14 +53,14 @@ func (c *Client) DeleteRoleBinding(name string, projectName string) error { return err } -func (c *Client) CreateSystemRole(role *service.Role) error { +func (c *Client) CreateSystemRole(body []byte) error { url := "/system-roles" - _, err := c.Post(url, httpclient.SetBody(role)) + _, err := c.Post(url, httpclient.SetBody(body)) return err } -func (c *Client) CreatePublicRole(role *service.Role) error { +func (c *Client) CreatePublicRole(body []byte) error { url := "/public-roles" - _, err := c.Post(url, httpclient.SetBody(role)) + _, err := c.Post(url, httpclient.SetBody(body)) return err } -- Gitee From d35a81e2897c337e1f7a333df8253391cf40d459 Mon Sep 17 00:00:00 2001 From: mouuii Date: Tue, 26 Oct 2021 18:07:59 +0800 Subject: [PATCH 122/405] initconfig Signed-off-by: mouuii --- pkg/cli/initconfig/cmd/init.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/cli/initconfig/cmd/init.go b/pkg/cli/initconfig/cmd/init.go index d37aa48b7..2653c8f62 100644 --- a/pkg/cli/initconfig/cmd/init.go +++ b/pkg/cli/initconfig/cmd/init.go @@ -41,8 +41,8 @@ var admin []byte var initRoleCmd = &cobra.Command{ Use: "init", - Short: "init preset role", - Long: `init preset role.`, + Short: "init cmd", + Long: `init cmd.`, Run: func(cmd *cobra.Command, args []string) { if err := run(); err != nil { log.Fatal(err) -- Gitee From 842486beedc580490375130d425f6dedcd42f3d9 Mon Sep 17 00:00:00 2001 From: mouuii Date: Tue, 26 Oct 2021 18:09:44 +0800 Subject: [PATCH 123/405] initconfig Signed-off-by: mouuii --- pkg/cli/initconfig/cmd/init.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pkg/cli/initconfig/cmd/init.go b/pkg/cli/initconfig/cmd/init.go index 2653c8f62..86a988648 100644 --- a/pkg/cli/initconfig/cmd/init.go +++ b/pkg/cli/initconfig/cmd/init.go @@ -27,7 +27,7 @@ import ( ) func init() { - rootCmd.AddCommand(initRoleCmd) + rootCmd.AddCommand(initCmd) } //go:embed contributor.yaml @@ -39,10 +39,10 @@ var readOnly []byte //go:embed admin.yaml var admin []byte -var initRoleCmd = &cobra.Command{ +var initCmd = &cobra.Command{ Use: "init", - Short: "init cmd", - Long: `init cmd.`, + Short: "init system config", + Long: `init system config.`, Run: func(cmd *cobra.Command, args []string) { if err := run(); err != nil { log.Fatal(err) -- Gitee From 764692238ba8e28918f0603d4145ea9d97aca395 Mon Sep 17 00:00:00 2001 From: mouuii Date: Tue, 26 Oct 2021 18:39:40 +0800 Subject: [PATCH 124/405] initconfig Signed-off-by: mouuii --- pkg/cli/initconfig/cmd/init.go | 5 ++++- pkg/cli/initconfig/cmd/project-admin.yaml | 6 ++++++ 2 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 pkg/cli/initconfig/cmd/project-admin.yaml diff --git a/pkg/cli/initconfig/cmd/init.go b/pkg/cli/initconfig/cmd/init.go index 86a988648..35480051b 100644 --- a/pkg/cli/initconfig/cmd/init.go +++ b/pkg/cli/initconfig/cmd/init.go @@ -39,6 +39,9 @@ var readOnly []byte //go:embed admin.yaml var admin []byte +//go:embed project-admin.yaml +var projectAdmin []byte + var initCmd = &cobra.Command{ Use: "init", Short: "init system config", @@ -63,7 +66,7 @@ func presetRole() error { return policy.NewDefault().CreateSystemRole(admin) }) - publicRoles := [][]byte{contributor, readOnly} + publicRoles := [][]byte{contributor, readOnly, projectAdmin} for _, v := range publicRoles { g.Go(func() error { diff --git a/pkg/cli/initconfig/cmd/project-admin.yaml b/pkg/cli/initconfig/cmd/project-admin.yaml new file mode 100644 index 000000000..68938e3f1 --- /dev/null +++ b/pkg/cli/initconfig/cmd/project-admin.yaml @@ -0,0 +1,6 @@ +name: project-admin +rules: + - verbs: + - "*" + resources: + - "*" \ No newline at end of file -- Gitee From 58a5e047288b28e597e6098eb9aa124691bde343 Mon Sep 17 00:00:00 2001 From: mouuii Date: Tue, 26 Oct 2021 20:14:12 +0800 Subject: [PATCH 125/405] initconfig Signed-off-by: mouuii --- pkg/cli/initconfig/cmd/init.go | 23 +++++++++--- pkg/microservice/policy/core/handler/role.go | 35 +++++++++++++++++++ .../policy/core/handler/router.go | 6 ++-- .../policy/core/repository/mongodb/role.go | 12 +++++++ pkg/microservice/policy/core/service/role.go | 16 +++++++++ pkg/shared/client/policy/policy.go | 13 +++---- 6 files changed, 93 insertions(+), 12 deletions(-) diff --git a/pkg/cli/initconfig/cmd/init.go b/pkg/cli/initconfig/cmd/init.go index 35480051b..2e885e6cb 100644 --- a/pkg/cli/initconfig/cmd/init.go +++ b/pkg/cli/initconfig/cmd/init.go @@ -22,6 +22,9 @@ import ( "github.com/spf13/cobra" "golang.org/x/sync/errgroup" + "sigs.k8s.io/yaml" + + "github.com/koderover/zadig/pkg/microservice/policy/core/service" "github.com/koderover/zadig/pkg/shared/client/policy" "github.com/koderover/zadig/pkg/tool/log" ) @@ -63,14 +66,26 @@ func initSystemConfig() error { func presetRole() error { g := new(errgroup.Group) g.Go(func() error { - return policy.NewDefault().CreateSystemRole(admin) + systemRole := &service.Role{} + if err := yaml.Unmarshal(admin, systemRole); err != nil { + log.DPanic(err) + } + return policy.NewDefault().CreateSystemRole(systemRole.Name, systemRole) }) - publicRoles := [][]byte{contributor, readOnly, projectAdmin} - + publicRoles := []*service.Role{} + var readOnlyRole *service.Role + var contributorRole *service.Role + if err := yaml.Unmarshal(readOnly, readOnlyRole); err != nil { + log.DPanic(err) + } + if err := yaml.Unmarshal(contributor, contributorRole); err != nil { + log.DPanic(err) + } + publicRoles = append(publicRoles, readOnlyRole, contributorRole) for _, v := range publicRoles { g.Go(func() error { - return policy.NewDefault().CreatePublicRole(v) + return policy.NewDefault().CreatePublicRole(v.Name, v) }) } if err := g.Wait(); err != nil { diff --git a/pkg/microservice/policy/core/handler/role.go b/pkg/microservice/policy/core/handler/role.go index c55ea6b93..64c82e381 100644 --- a/pkg/microservice/policy/core/handler/role.go +++ b/pkg/microservice/policy/core/handler/role.go @@ -64,6 +64,27 @@ func UpdateRole(c *gin.Context) { ctx.Err = service.UpdateRole(projectName, args, ctx.Logger) } +func UpdateOrCreateRole(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + + args := &service.Role{} + if err := c.ShouldBindJSON(args); err != nil { + ctx.Err = err + return + } + + projectName := c.Query("projectName") + if projectName == "" { + ctx.Err = e.ErrInvalidParam.AddDesc("projectName is empty") + return + } + name := c.Param("name") + args.Name = name + + ctx.Err = service.UpdateOrCreateRole(projectName, args, ctx.Logger) +} + func UpdatePublicRole(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() @@ -78,6 +99,20 @@ func UpdatePublicRole(c *gin.Context) { ctx.Err = service.UpdateRole("", args, ctx.Logger) } +func UpdateOrCreatePublicRole(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + + args := &service.Role{} + if err := c.ShouldBindJSON(args); err != nil { + ctx.Err = err + return + } + name := c.Param("name") + args.Name = name + ctx.Err = service.UpdateOrCreateRole("", args, ctx.Logger) +} + func ListRoles(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() diff --git a/pkg/microservice/policy/core/handler/router.go b/pkg/microservice/policy/core/handler/router.go index e53d01d02..3d86d812d 100644 --- a/pkg/microservice/policy/core/handler/router.go +++ b/pkg/microservice/policy/core/handler/router.go @@ -26,7 +26,8 @@ func (*Router) Inject(router *gin.RouterGroup) { roles := router.Group("roles") { roles.POST("", CreateRole) - roles.PUT("/:name", UpdateRole) + roles.PATCH("/:name", UpdateRole) + roles.PUT("/:name", UpdateOrCreateRole) roles.GET("", ListRoles) roles.GET("/:name", GetRole) roles.DELETE("/:name", DeleteRole) @@ -37,7 +38,8 @@ func (*Router) Inject(router *gin.RouterGroup) { publicRoles.POST("", CreatePublicRole) publicRoles.GET("", ListPublicRoles) publicRoles.GET("/:name", GetPublicRole) - publicRoles.PUT("/:name", UpdatePublicRole) + publicRoles.PATCH("/:name", UpdatePublicRole) + publicRoles.PUT("/:name", UpdateOrCreatePublicRole) publicRoles.DELETE("/:name", DeletePublicRole) } diff --git a/pkg/microservice/policy/core/repository/mongodb/role.go b/pkg/microservice/policy/core/repository/mongodb/role.go index 5ecff4502..6ac74026c 100644 --- a/pkg/microservice/policy/core/repository/mongodb/role.go +++ b/pkg/microservice/policy/core/repository/mongodb/role.go @@ -142,3 +142,15 @@ func (c *RoleColl) UpdateRole(obj *models.Role) error { _, err := c.UpdateOne(context.TODO(), query, change) return err } + +func (c *RoleColl) UpdateOrCreate(obj *models.Role) error { + if obj == nil { + return fmt.Errorf("nil object") + } + + query := bson.M{"name": obj.Name, "namespace": obj.Namespace} + opts := options.Replace().SetUpsert(true) + _, err := c.ReplaceOne(context.TODO(), query, obj, opts) + + return err +} diff --git a/pkg/microservice/policy/core/service/role.go b/pkg/microservice/policy/core/service/role.go index 63b21e30b..d7379ff9e 100644 --- a/pkg/microservice/policy/core/service/role.go +++ b/pkg/microservice/policy/core/service/role.go @@ -69,6 +69,22 @@ func UpdateRole(ns string, role *Role, _ *zap.SugaredLogger) error { return mongodb.NewRoleColl().UpdateRole(obj) } +func UpdateOrCreateRole(ns string, role *Role, _ *zap.SugaredLogger) error { + obj := &models.Role{ + Name: role.Name, + Namespace: ns, + } + + for _, r := range role.Rules { + obj.Rules = append(obj.Rules, &models.Rule{ + Verbs: r.Verbs, + Kind: r.Kind, + Resources: r.Resources, + }) + } + return mongodb.NewRoleColl().UpdateOrCreate(obj) +} + func ListRoles(projectName string, _ *zap.SugaredLogger) ([]*Role, error) { var roles []*Role projectRoles, err := mongodb.NewRoleColl().ListBy(projectName) diff --git a/pkg/shared/client/policy/policy.go b/pkg/shared/client/policy/policy.go index 62b9e0981..c1c0d3935 100644 --- a/pkg/shared/client/policy/policy.go +++ b/pkg/shared/client/policy/policy.go @@ -3,6 +3,7 @@ package policy import ( "fmt" + "github.com/koderover/zadig/pkg/microservice/policy/core/service" "github.com/koderover/zadig/pkg/setting" "github.com/koderover/zadig/pkg/tool/httpclient" ) @@ -53,14 +54,14 @@ func (c *Client) DeleteRoleBinding(name string, projectName string) error { return err } -func (c *Client) CreateSystemRole(body []byte) error { - url := "/system-roles" - _, err := c.Post(url, httpclient.SetBody(body)) +func (c *Client) CreateSystemRole(name string, role *service.Role) error { + url := fmt.Sprintf("/system-roles/%s", name) + _, err := c.Put(url, httpclient.SetBody(role)) return err } -func (c *Client) CreatePublicRole(body []byte) error { - url := "/public-roles" - _, err := c.Post(url, httpclient.SetBody(body)) +func (c *Client) CreatePublicRole(name string, role *service.Role) error { + url := fmt.Sprintf("/public-roles/%s", name) + _, err := c.Put(url, httpclient.SetBody(role)) return err } -- Gitee From b746834864a2f94284c1992a7372fa729e5d9be8 Mon Sep 17 00:00:00 2001 From: mouuii Date: Tue, 26 Oct 2021 20:14:42 +0800 Subject: [PATCH 126/405] initconfig Signed-off-by: mouuii --- pkg/shared/client/policy/client.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pkg/shared/client/policy/client.go b/pkg/shared/client/policy/client.go index 251a6b521..b81bce824 100644 --- a/pkg/shared/client/policy/client.go +++ b/pkg/shared/client/policy/client.go @@ -47,8 +47,7 @@ func New() *Client { } func NewDefault() *Client { - //host := config.PolicyServiceAddress() - host := "http://localhost:8080" + host := config.PolicyServiceAddress() c := httpclient.New( httpclient.SetHostURL(host + "/api/v1"), -- Gitee From c7fd7d0f1750deda5169d28e8a92e28418c9eca3 Mon Sep 17 00:00:00 2001 From: mouuii Date: Tue, 26 Oct 2021 20:17:21 +0800 Subject: [PATCH 127/405] initconfig Signed-off-by: mouuii --- pkg/cli/initconfig/cmd/init.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/pkg/cli/initconfig/cmd/init.go b/pkg/cli/initconfig/cmd/init.go index 2e885e6cb..64df3c069 100644 --- a/pkg/cli/initconfig/cmd/init.go +++ b/pkg/cli/initconfig/cmd/init.go @@ -76,13 +76,17 @@ func presetRole() error { publicRoles := []*service.Role{} var readOnlyRole *service.Role var contributorRole *service.Role + var projectAdminRole *service.Role if err := yaml.Unmarshal(readOnly, readOnlyRole); err != nil { log.DPanic(err) } if err := yaml.Unmarshal(contributor, contributorRole); err != nil { log.DPanic(err) } - publicRoles = append(publicRoles, readOnlyRole, contributorRole) + if err := yaml.Unmarshal(projectAdmin, projectAdminRole); err != nil { + log.DPanic(err) + } + publicRoles = append(publicRoles, readOnlyRole, contributorRole, projectAdminRole) for _, v := range publicRoles { g.Go(func() error { return policy.NewDefault().CreatePublicRole(v.Name, v) -- Gitee From bf307435f5bd2a25646aa31bc8cf4d07f2a9873f Mon Sep 17 00:00:00 2001 From: mouuii Date: Tue, 26 Oct 2021 20:18:48 +0800 Subject: [PATCH 128/405] initconfig Signed-off-by: mouuii --- pkg/cli/initconfig/cmd/init.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pkg/cli/initconfig/cmd/init.go b/pkg/cli/initconfig/cmd/init.go index 64df3c069..a6cb42be0 100644 --- a/pkg/cli/initconfig/cmd/init.go +++ b/pkg/cli/initconfig/cmd/init.go @@ -88,8 +88,9 @@ func presetRole() error { } publicRoles = append(publicRoles, readOnlyRole, contributorRole, projectAdminRole) for _, v := range publicRoles { + tmp := v g.Go(func() error { - return policy.NewDefault().CreatePublicRole(v.Name, v) + return policy.NewDefault().CreatePublicRole(tmp.Name, tmp) }) } if err := g.Wait(); err != nil { -- Gitee From 1a4b16f62bfab7c72c38c2f2c8a40f0ac54c54c2 Mon Sep 17 00:00:00 2001 From: mouuii Date: Tue, 26 Oct 2021 20:27:38 +0800 Subject: [PATCH 129/405] initconfig Signed-off-by: mouuii --- pkg/cli/initconfig/cmd/init.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pkg/cli/initconfig/cmd/init.go b/pkg/cli/initconfig/cmd/init.go index a6cb42be0..d2d739b7a 100644 --- a/pkg/cli/initconfig/cmd/init.go +++ b/pkg/cli/initconfig/cmd/init.go @@ -74,9 +74,9 @@ func presetRole() error { }) publicRoles := []*service.Role{} - var readOnlyRole *service.Role - var contributorRole *service.Role - var projectAdminRole *service.Role + readOnlyRole := &service.Role{} + contributorRole := &service.Role{} + projectAdminRole := &service.Role{} if err := yaml.Unmarshal(readOnly, readOnlyRole); err != nil { log.DPanic(err) } -- Gitee From 385fb703828ab622c73f68da7a4acaca4b900e23 Mon Sep 17 00:00:00 2001 From: mouuii Date: Tue, 26 Oct 2021 20:46:16 +0800 Subject: [PATCH 130/405] initconfig Signed-off-by: mouuii --- pkg/cli/initconfig/cmd/contributor.yaml | 2 +- pkg/cli/initconfig/cmd/read-only.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/cli/initconfig/cmd/contributor.yaml b/pkg/cli/initconfig/cmd/contributor.yaml index 72513e431..e69c45246 100644 --- a/pkg/cli/initconfig/cmd/contributor.yaml +++ b/pkg/cli/initconfig/cmd/contributor.yaml @@ -1,4 +1,4 @@ -name: Contributor +name: contributor rules: - verbs: - get_workflow diff --git a/pkg/cli/initconfig/cmd/read-only.yaml b/pkg/cli/initconfig/cmd/read-only.yaml index 6b27e1222..c781fb94c 100644 --- a/pkg/cli/initconfig/cmd/read-only.yaml +++ b/pkg/cli/initconfig/cmd/read-only.yaml @@ -1,4 +1,4 @@ -name: ReadOnly +name: readonly rules: - verbs: - get_workflow -- Gitee From 6445a15c87e263a2c096a83fb7468f39ae19539a Mon Sep 17 00:00:00 2001 From: mouuii Date: Tue, 26 Oct 2021 21:01:00 +0800 Subject: [PATCH 131/405] initconfig Signed-off-by: mouuii --- pkg/cli/initconfig/cmd/contributor.yaml | 2 +- pkg/cli/initconfig/cmd/init.go | 29 ++++++++--------------- pkg/cli/initconfig/cmd/project-admin.yaml | 2 +- pkg/shared/client/policy/policy.go | 14 ++++++++--- 4 files changed, 23 insertions(+), 24 deletions(-) diff --git a/pkg/cli/initconfig/cmd/contributor.yaml b/pkg/cli/initconfig/cmd/contributor.yaml index e69c45246..34a8ebd2e 100644 --- a/pkg/cli/initconfig/cmd/contributor.yaml +++ b/pkg/cli/initconfig/cmd/contributor.yaml @@ -13,7 +13,7 @@ rules: - delete_environment resources: - Environment - kind: resourcepkg/cli/initconfig/cmd/init.go + kind: resource - verbs: - get_build - get_service diff --git a/pkg/cli/initconfig/cmd/init.go b/pkg/cli/initconfig/cmd/init.go index d2d739b7a..60300e390 100644 --- a/pkg/cli/initconfig/cmd/init.go +++ b/pkg/cli/initconfig/cmd/init.go @@ -24,7 +24,6 @@ import ( "sigs.k8s.io/yaml" - "github.com/koderover/zadig/pkg/microservice/policy/core/service" "github.com/koderover/zadig/pkg/shared/client/policy" "github.com/koderover/zadig/pkg/tool/log" ) @@ -63,34 +62,26 @@ func run() error { func initSystemConfig() error { return presetRole() } + func presetRole() error { g := new(errgroup.Group) g.Go(func() error { - systemRole := &service.Role{} + systemRole := &policy.Role{} if err := yaml.Unmarshal(admin, systemRole); err != nil { log.DPanic(err) } return policy.NewDefault().CreateSystemRole(systemRole.Name, systemRole) }) - publicRoles := []*service.Role{} - readOnlyRole := &service.Role{} - contributorRole := &service.Role{} - projectAdminRole := &service.Role{} - if err := yaml.Unmarshal(readOnly, readOnlyRole); err != nil { - log.DPanic(err) - } - if err := yaml.Unmarshal(contributor, contributorRole); err != nil { - log.DPanic(err) - } - if err := yaml.Unmarshal(projectAdmin, projectAdminRole); err != nil { - log.DPanic(err) - } - publicRoles = append(publicRoles, readOnlyRole, contributorRole, projectAdminRole) - for _, v := range publicRoles { - tmp := v + rolesArray := [][]byte{readOnly, contributor, projectAdmin} + + for _, v := range rolesArray { + role := &policy.Role{} + if err := yaml.Unmarshal(v, role); err != nil { + log.DPanic(err) + } g.Go(func() error { - return policy.NewDefault().CreatePublicRole(tmp.Name, tmp) + return policy.NewDefault().CreatePublicRole(role.Name, role) }) } if err := g.Wait(); err != nil { diff --git a/pkg/cli/initconfig/cmd/project-admin.yaml b/pkg/cli/initconfig/cmd/project-admin.yaml index 68938e3f1..b64adb5c0 100644 --- a/pkg/cli/initconfig/cmd/project-admin.yaml +++ b/pkg/cli/initconfig/cmd/project-admin.yaml @@ -1,4 +1,4 @@ -name: project-admin +name: admin rules: - verbs: - "*" diff --git a/pkg/shared/client/policy/policy.go b/pkg/shared/client/policy/policy.go index c1c0d3935..4ec6b2836 100644 --- a/pkg/shared/client/policy/policy.go +++ b/pkg/shared/client/policy/policy.go @@ -3,7 +3,6 @@ package policy import ( "fmt" - "github.com/koderover/zadig/pkg/microservice/policy/core/service" "github.com/koderover/zadig/pkg/setting" "github.com/koderover/zadig/pkg/tool/httpclient" ) @@ -54,14 +53,23 @@ func (c *Client) DeleteRoleBinding(name string, projectName string) error { return err } -func (c *Client) CreateSystemRole(name string, role *service.Role) error { +func (c *Client) CreateSystemRole(name string, role *Role) error { url := fmt.Sprintf("/system-roles/%s", name) _, err := c.Put(url, httpclient.SetBody(role)) return err } -func (c *Client) CreatePublicRole(name string, role *service.Role) error { +func (c *Client) CreatePublicRole(name string, role *Role) error { url := fmt.Sprintf("/public-roles/%s", name) _, err := c.Put(url, httpclient.SetBody(role)) return err } + +type Role struct { + Name string `json:"name"` + Rules []*struct { + Verbs []string `json:"verbs"` + Resources []string `json:"resources"` + Kind string `json:"kind"` + } `json:"rules"` +} -- Gitee From c3fbbba78d3f08586d632c810cb1f3a98ccfd305 Mon Sep 17 00:00:00 2001 From: mouuii Date: Tue, 26 Oct 2021 21:02:04 +0800 Subject: [PATCH 132/405] initconfig Signed-off-by: mouuii --- pkg/microservice/policy/core/handler/role.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pkg/microservice/policy/core/handler/role.go b/pkg/microservice/policy/core/handler/role.go index 64c82e381..764569795 100644 --- a/pkg/microservice/policy/core/handler/role.go +++ b/pkg/microservice/policy/core/handler/role.go @@ -79,8 +79,7 @@ func UpdateOrCreateRole(c *gin.Context) { ctx.Err = e.ErrInvalidParam.AddDesc("projectName is empty") return } - name := c.Param("name") - args.Name = name + args.Name = c.Param("name") ctx.Err = service.UpdateOrCreateRole(projectName, args, ctx.Logger) } -- Gitee From 4c14922093caf5c0ac6e59f1f45a4ffc221b5eb9 Mon Sep 17 00:00:00 2001 From: lou Date: Wed, 27 Oct 2021 10:27:25 +0800 Subject: [PATCH 133/405] add bulk create role bindings api Signed-off-by: lou --- .../policy/core/handler/role_binding.go | 23 ++++--- .../core/repository/mongodb/role_binding.go | 15 +++++ .../core/service/bundle/exemption_urls.go | 2 +- .../policy/core/service/role_binding.go | 60 +++++++++++-------- 4 files changed, 68 insertions(+), 32 deletions(-) diff --git a/pkg/microservice/policy/core/handler/role_binding.go b/pkg/microservice/policy/core/handler/role_binding.go index 0b9cbcdfd..fe95f5cfc 100644 --- a/pkg/microservice/policy/core/handler/role_binding.go +++ b/pkg/microservice/policy/core/handler/role_binding.go @@ -34,13 +34,22 @@ func CreateRoleBinding(c *gin.Context) { return } - args := &service.RoleBinding{} - if err := c.ShouldBindJSON(args); err != nil { - ctx.Err = err - return + args := make([]*service.RoleBinding, 0) + if c.Query("bulk") == "true" { + if err := c.ShouldBindJSON(&args); err != nil { + ctx.Err = err + return + } + } else { + rb := &service.RoleBinding{} + if err := c.ShouldBindJSON(rb); err != nil { + ctx.Err = err + return + } + args = append(args, rb) } - ctx.Err = service.CreateRoleBinding(projectName, args, ctx.Logger) + ctx.Err = service.CreateRoleBindings(projectName, args, ctx.Logger) } func ListRoleBindings(c *gin.Context) { @@ -88,9 +97,9 @@ func CreateSystemRoleBinding(c *gin.Context) { return } - args.Global = false + args.Public = false - ctx.Err = service.CreateRoleBinding(service.SystemScope, args, ctx.Logger) + ctx.Err = service.CreateRoleBindings(service.SystemScope, []*service.RoleBinding{args}, ctx.Logger) } func ListSystemRoleBindings(c *gin.Context) { diff --git a/pkg/microservice/policy/core/repository/mongodb/role_binding.go b/pkg/microservice/policy/core/repository/mongodb/role_binding.go index 28e02ed07..fa3ff2c30 100644 --- a/pkg/microservice/policy/core/repository/mongodb/role_binding.go +++ b/pkg/microservice/policy/core/repository/mongodb/role_binding.go @@ -116,3 +116,18 @@ func (c *RoleBindingColl) Create(obj *models.RoleBinding) error { return err } + +func (c *RoleBindingColl) BulkCreate(objs []*models.RoleBinding) error { + if len(objs) == 0 { + return nil + } + + var ois []interface{} + for _, obj := range objs { + ois = append(ois, obj) + } + + _, err := c.InsertMany(context.TODO(), ois) + + return err +} diff --git a/pkg/microservice/policy/core/service/bundle/exemption_urls.go b/pkg/microservice/policy/core/service/bundle/exemption_urls.go index 7d161d006..7b4b451e9 100644 --- a/pkg/microservice/policy/core/service/bundle/exemption_urls.go +++ b/pkg/microservice/policy/core/service/bundle/exemption_urls.go @@ -54,7 +54,7 @@ var publicURLs = []*policyRule{ }, { Methods: []string{"GET"}, - Endpoints: []string{""}, + Endpoints: []string{"", "signin", "setup", "loading", "static/**"}, }, { Methods: []string{"GET"}, diff --git a/pkg/microservice/policy/core/service/role_binding.go b/pkg/microservice/policy/core/service/role_binding.go index 4aeb6ed47..51ce9dc22 100644 --- a/pkg/microservice/policy/core/service/role_binding.go +++ b/pkg/microservice/policy/core/service/role_binding.go @@ -29,36 +29,23 @@ type RoleBinding struct { Name string `json:"name"` UID string `json:"uid"` Role string `json:"role"` - Global bool `json:"global"` + Public bool `json:"public"` } const SystemScope = "*" -func CreateRoleBinding(ns string, rb *RoleBinding, logger *zap.SugaredLogger) error { - nsRole := ns - if rb.Global { - nsRole = "" - } - role, found, err := mongodb.NewRoleColl().Get(nsRole, rb.Role) - if err != nil { - logger.Errorf("Failed to get role %s in namespace %s, err: %s", rb.Role, nsRole, err) - return err - } else if !found { - logger.Errorf("Role %s is not found in namespace %s", rb.Role, nsRole) - return fmt.Errorf("role %s not found", rb.Role) - } +func CreateRoleBindings(ns string, rbs []*RoleBinding, logger *zap.SugaredLogger) error { + var objs []*models.RoleBinding + for _, rb := range rbs { + obj, err := createRoleBindingObject(ns, rb, logger) + if err != nil { + return err + } - obj := &models.RoleBinding{ - Name: rb.Name, - Namespace: ns, - Subjects: []*models.Subject{{Kind: models.UserKind, UID: rb.UID}}, - RoleRef: &models.RoleRef{ - Name: role.Name, - Namespace: role.Namespace, - }, + objs = append(objs, obj) } - return mongodb.NewRoleBindingColl().Create(obj) + return mongodb.NewRoleBindingColl().BulkCreate(objs) } func ListRoleBindings(ns, uid string, _ *zap.SugaredLogger) ([]*RoleBinding, error) { @@ -73,7 +60,7 @@ func ListRoleBindings(ns, uid string, _ *zap.SugaredLogger) ([]*RoleBinding, err Name: v.Name, Role: v.RoleRef.Name, UID: v.Subjects[0].UID, - Global: v.Namespace == "", + Public: v.Namespace == "", }) } @@ -83,3 +70,28 @@ func ListRoleBindings(ns, uid string, _ *zap.SugaredLogger) ([]*RoleBinding, err func DeleteRoleBinding(name string, projectName string, _ *zap.SugaredLogger) error { return mongodb.NewRoleBindingColl().Delete(name, projectName) } + +func createRoleBindingObject(ns string, rb *RoleBinding, logger *zap.SugaredLogger) (*models.RoleBinding, error) { + nsRole := ns + if rb.Public { + nsRole = "" + } + role, found, err := mongodb.NewRoleColl().Get(nsRole, rb.Role) + if err != nil { + logger.Errorf("Failed to get role %s in namespace %s, err: %s", rb.Role, nsRole, err) + return nil, err + } else if !found { + logger.Errorf("Role %s is not found in namespace %s", rb.Role, nsRole) + return nil, fmt.Errorf("role %s not found", rb.Role) + } + + return &models.RoleBinding{ + Name: rb.Name, + Namespace: ns, + Subjects: []*models.Subject{{Kind: models.UserKind, UID: rb.UID}}, + RoleRef: &models.RoleRef{ + Name: role.Name, + Namespace: role.Namespace, + }, + }, nil +} -- Gitee From 61b128d22647417b48e1553aa6d6f373740b6880 Mon Sep 17 00:00:00 2001 From: mouuii Date: Wed, 27 Oct 2021 13:52:31 +0800 Subject: [PATCH 134/405] features Signed-off-by: mouuii --- cmd/systemconfig/main.go | 11 +++++ .../systemconfig/config/config.go | 4 ++ .../systemconfig/config/consts.go | 4 ++ .../systemconfig/core/handler/features.go | 42 +++++++++++++++++++ .../systemconfig/core/handler/router.go | 4 ++ 5 files changed, 65 insertions(+) create mode 100644 pkg/microservice/systemconfig/core/handler/features.go diff --git a/cmd/systemconfig/main.go b/cmd/systemconfig/main.go index 90b61cc3f..760713e9a 100644 --- a/cmd/systemconfig/main.go +++ b/cmd/systemconfig/main.go @@ -18,14 +18,25 @@ package main import ( "context" + "flag" "log" "os/signal" "syscall" + "github.com/spf13/pflag" + "github.com/spf13/viper" + + "github.com/koderover/zadig/pkg/microservice/systemconfig/config" "github.com/koderover/zadig/pkg/microservice/systemconfig/server" ) func main() { + + flag.String(config.FeatureFlag, "", "help message for flagname") + + pflag.CommandLine.AddGoFlagSet(flag.CommandLine) + pflag.Parse() + viper.BindPFlags(pflag.CommandLine) ctx, stop := signal.NotifyContext(context.Background(), syscall.SIGTERM, syscall.SIGINT) go func() { <-ctx.Done() diff --git a/pkg/microservice/systemconfig/config/config.go b/pkg/microservice/systemconfig/config/config.go index 821936f8e..8300198c8 100644 --- a/pkg/microservice/systemconfig/config/config.go +++ b/pkg/microservice/systemconfig/config/config.go @@ -21,3 +21,7 @@ func DexMysqlUser() string { func DexMysqlPassword() string { return viper.GetString(ENVDexMysqlPassword) } + +func Features()string { + return viper.GetString(FeatureFlag) +} \ No newline at end of file diff --git a/pkg/microservice/systemconfig/config/consts.go b/pkg/microservice/systemconfig/config/consts.go index 23453c577..f830d417f 100644 --- a/pkg/microservice/systemconfig/config/consts.go +++ b/pkg/microservice/systemconfig/config/consts.go @@ -6,3 +6,7 @@ const ( ENVDexMysqlUser = "DEX_MYSQL_USER" ENVDexMysqlPassword = "DEX_MYSQL_PASSWORD" ) + +const ( + FeatureFlag = "features" +) diff --git a/pkg/microservice/systemconfig/core/handler/features.go b/pkg/microservice/systemconfig/core/handler/features.go new file mode 100644 index 000000000..6a69d930e --- /dev/null +++ b/pkg/microservice/systemconfig/core/handler/features.go @@ -0,0 +1,42 @@ +package handler + +import ( + "strings" + "sync" + + "github.com/gin-gonic/gin" + + "github.com/koderover/zadig/pkg/microservice/systemconfig/config" + internalhandler "github.com/koderover/zadig/pkg/shared/handler" +) + +var featureM map[string]string = map[string]string{ + "xx": "true", +} + +var FeatureFlag string +var once sync.Once + +func GetFeatures(c *gin.Context) { + featureName := c.Query("feature") + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + once.Do(func(){ + features := config.Features() + featureList := strings.Split(features,",") + for _,v := range featureList{ + feature := strings.Split(v,"=") + if len(feature) != 2 { + continue + } + if _ , ok := featureM[feature[0]];ok { + featureM[feature[0]] = feature[1] + } + } + }) + if v,ok := featureM[featureName];ok{ + ctx.Resp = v + } + ctx.Resp = "notfound" + +} diff --git a/pkg/microservice/systemconfig/core/handler/router.go b/pkg/microservice/systemconfig/core/handler/router.go index b59de3824..e681b8466 100644 --- a/pkg/microservice/systemconfig/core/handler/router.go +++ b/pkg/microservice/systemconfig/core/handler/router.go @@ -31,4 +31,8 @@ func (*Router) Inject(router *gin.RouterGroup) { roles.PUT("/:id", UpdateConnector) roles.DELETE("/:id", DeleteConnector) } + features := router.Group("features") + { + features.GET("", GetFeatures) + } } -- Gitee From 6f57f55d1c6372981c65dbada691a0eea2a5c2b0 Mon Sep 17 00:00:00 2001 From: panxunying <641770806@qq.com> Date: Wed, 27 Oct 2021 14:26:28 +0800 Subject: [PATCH 135/405] optimize Signed-off-by: panxunying <641770806@qq.com> --- go.mod | 6 +- pkg/config/config.go | 14 +- .../systemconfig/config/config.go | 16 +-- .../systemconfig/config/consts.go | 5 +- .../core/repository/orm/connector.go | 2 +- pkg/microservice/systemconfig/core/service.go | 10 +- .../systemconfig/core/service/types.go | 2 +- pkg/microservice/user/config/config.go | 51 ++----- pkg/microservice/user/config/consts.go | 1 - .../handler/login/{internal.go => local.go} | 3 +- .../login/{third_part.go => third_party.go} | 125 ++++++++---------- pkg/microservice/user/core/handler/router.go | 17 +-- .../user/core/handler/user/user.go | 15 ++- .../user/core/repository/models/user.go | 7 +- .../user/core/repository/models/user_login.go | 9 +- .../core/repository/{mysql => orm}/user.go | 13 +- .../repository/{mysql => orm}/user_login.go | 9 +- pkg/microservice/user/core/service.go | 77 +++-------- .../service/login/{internal.go => local.go} | 28 ++-- .../login/{third_part.go => third_party.go} | 28 ++-- .../user/core/service/login/token.go | 29 ++++ .../user/core/service/user/user.go | 59 +++++---- pkg/microservice/user/server/rest/router.go | 7 +- pkg/microservice/user/server/server.go | 2 +- pkg/setting/consts.go | 28 ++-- pkg/util/sign.go | 24 ---- 26 files changed, 272 insertions(+), 315 deletions(-) rename pkg/microservice/user/core/handler/login/{internal.go => local.go} (92%) rename pkg/microservice/user/core/handler/login/{third_part.go => third_party.go} (47%) rename pkg/microservice/user/core/repository/{mysql => orm}/user.go (86%) rename pkg/microservice/user/core/repository/{mysql => orm}/user_login.go (86%) rename pkg/microservice/user/core/service/login/{internal.go => local.go} (84%) rename pkg/microservice/user/core/service/login/{third_part.go => third_party.go} (78%) create mode 100644 pkg/microservice/user/core/service/login/token.go diff --git a/go.mod b/go.mod index 4603a21b3..3dc239e84 100644 --- a/go.mod +++ b/go.mod @@ -16,21 +16,19 @@ require ( github.com/bugsnag/panicwrap v1.3.1 // indirect github.com/cenkalti/backoff/v3 v3.0.0 github.com/coocood/freecache v1.1.0 - github.com/coreos/go-oidc v2.1.0+incompatible github.com/coreos/go-oidc/v3 v3.0.0 github.com/dexidp/dex v0.0.0-20210802203454-3fac2ab6bc3b - github.com/dgrijalva/jwt-go v3.2.0+incompatible github.com/docker/distribution v2.7.1+incompatible github.com/docker/docker v17.12.0-ce-rc1.0.20200618181300-9dc6525e6118+incompatible github.com/docker/go-connections v0.4.0 github.com/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7 // indirect github.com/dsnet/compress v0.0.1 // indirect - github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5 // indirect github.com/garyburd/redigo v1.6.2 // indirect github.com/gin-contrib/sse v0.1.0 github.com/gin-gonic/gin v1.7.2 github.com/go-resty/resty/v2 v2.6.0 github.com/gofrs/uuid v4.0.0+incompatible // indirect + github.com/golang-jwt/jwt v3.2.2+incompatible github.com/google/go-github/v35 v35.3.0 github.com/google/uuid v1.2.0 github.com/gorilla/mux v1.8.0 @@ -40,7 +38,7 @@ require ( github.com/hashicorp/go-multierror v1.1.1 github.com/huaweicloud/huaweicloud-sdk-go-v3 v0.0.50 github.com/jasonlvhit/gocron v0.0.0-20171226191223-3c914c8681c3 - github.com/jinzhu/gorm v0.0.0-20180213101209-6e1387b44c64 + github.com/jinzhu/gorm v1.9.16 github.com/jinzhu/now v1.1.2 github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 // indirect github.com/mittwald/go-helm-client v0.8.0 diff --git a/pkg/config/config.go b/pkg/config/config.go index 1936fed86..477198b41 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -86,7 +86,7 @@ func AslanServiceInfo() *setting.ServiceInfo { } func SecretKey() string { - return viper.GetString(setting.SecretKey) + return viper.GetString(setting.ENVSecretKey) } func AslanServiceAddress() string { @@ -228,3 +228,15 @@ func MongoURI() string { func MongoDatabase() string { return viper.GetString(setting.ENVAslanDBName) } + +func MysqlUser() string { + return viper.GetString(setting.ENVMysqlUser) +} + +func MysqlPassword() string { + return viper.GetString(setting.ENVMysqlPassword) +} + +func MysqlHost() string { + return viper.GetString(setting.ENVMysqlHost) +} diff --git a/pkg/microservice/systemconfig/config/config.go b/pkg/microservice/systemconfig/config/config.go index 821936f8e..5d0b8882f 100644 --- a/pkg/microservice/systemconfig/config/config.go +++ b/pkg/microservice/systemconfig/config/config.go @@ -6,18 +6,6 @@ import ( _ "github.com/koderover/zadig/pkg/config" ) -func DexMysqlDB() string { - return viper.GetString(ENVDexMysqlDB) -} - -func DexMysqlHost() string { - return viper.GetString(ENVDexMysqlHost) -} - -func DexMysqlUser() string { - return viper.GetString(ENVDexMysqlUser) -} - -func DexMysqlPassword() string { - return viper.GetString(ENVDexMysqlPassword) +func MysqlDexDB() string { + return viper.GetString(ENVMysqlDexDB) } diff --git a/pkg/microservice/systemconfig/config/consts.go b/pkg/microservice/systemconfig/config/consts.go index 23453c577..552789aab 100644 --- a/pkg/microservice/systemconfig/config/consts.go +++ b/pkg/microservice/systemconfig/config/consts.go @@ -1,8 +1,5 @@ package config const ( - ENVDexMysqlDB = "DEX_MYSQL_DB" - ENVDexMysqlHost = "DEX_MYSQL_HOST" - ENVDexMysqlUser = "DEX_MYSQL_USER" - ENVDexMysqlPassword = "DEX_MYSQL_PASSWORD" + ENVMysqlDexDB = "MYSQL_DEX_DB" ) diff --git a/pkg/microservice/systemconfig/core/repository/orm/connector.go b/pkg/microservice/systemconfig/core/repository/orm/connector.go index a51b858de..9ac1e501f 100644 --- a/pkg/microservice/systemconfig/core/repository/orm/connector.go +++ b/pkg/microservice/systemconfig/core/repository/orm/connector.go @@ -33,7 +33,7 @@ type ConnectorColl struct { func NewConnectorColl() *ConnectorColl { name := models.Connector{}.TableName() return &ConnectorColl{ - DB: gormtool.DB(config.DexMysqlDB()), + DB: gormtool.DB(config.MysqlDexDB()), coll: name, } } diff --git a/pkg/microservice/systemconfig/core/service.go b/pkg/microservice/systemconfig/core/service.go index a2e7b91aa..4030bd2fd 100644 --- a/pkg/microservice/systemconfig/core/service.go +++ b/pkg/microservice/systemconfig/core/service.go @@ -38,13 +38,13 @@ func Start(_ context.Context) { } func initDatabase() { - err := gormtool.Open(config.DexMysqlUser(), - config.DexMysqlPassword(), - config.DexMysqlHost(), - config.DexMysqlDB(), + err := gormtool.Open(configbase.MysqlUser(), + configbase.MysqlPassword(), + configbase.MysqlHost(), + config.MysqlDexDB(), ) if err != nil { - log.Panicf("Failed to open database %s", config.DexMysqlDB()) + log.Panicf("Failed to open database %s", config.MysqlDexDB()) } } diff --git a/pkg/microservice/systemconfig/core/service/types.go b/pkg/microservice/systemconfig/core/service/types.go index 90c22df8e..f9f45d74e 100644 --- a/pkg/microservice/systemconfig/core/service/types.go +++ b/pkg/microservice/systemconfig/core/service/types.go @@ -19,6 +19,7 @@ package service import ( "encoding/json" + "github.com/coreos/go-oidc/v3/oidc" "github.com/dexidp/dex/connector/gitea" "github.com/dexidp/dex/connector/github" "github.com/dexidp/dex/connector/gitlab" @@ -26,7 +27,6 @@ import ( "github.com/dexidp/dex/connector/ldap" "github.com/dexidp/dex/connector/linkedin" "github.com/dexidp/dex/connector/microsoft" - "github.com/dexidp/dex/connector/oidc" ) type ConnectorType string diff --git a/pkg/microservice/user/config/config.go b/pkg/microservice/user/config/config.go index 2b5b09335..160295d1b 100644 --- a/pkg/microservice/user/config/config.go +++ b/pkg/microservice/user/config/config.go @@ -17,71 +17,48 @@ limitations under the License. package config import ( - "context" - "fmt" - "net/http" + "strconv" "strings" - "github.com/coreos/go-oidc" "github.com/spf13/viper" _ "github.com/koderover/zadig/pkg/config" "github.com/koderover/zadig/pkg/setting" + "github.com/koderover/zadig/pkg/tool/log" ) func IssuerURL() string { - return viper.GetString(setting.IssuerURL) + return viper.GetString(setting.ENVIssuerURL) } func Debug() string { - return viper.GetString(setting.Debug) + return viper.GetString(setting.ENVDebug) } func ClientID() string { - return viper.GetString(setting.ClientID) + return viper.GetString(setting.ENVClientID) } func ClientSecret() string { - return viper.GetString(setting.ClientSecret) + return viper.GetString(setting.ENVClientSecret) } func RedirectURI() string { - return viper.GetString(setting.RedirectURI) + return viper.GetString(setting.ENVRedirectURI) } func Scopes() []string { - return strings.Split(viper.GetString(setting.Scopes), ",") + return strings.Split(viper.GetString(setting.ENVScopes), ",") } -func Client() *http.Client { - return http.DefaultClient +func MysqlUserDB() string { + return viper.GetString(setting.ENVMysqlUserDB) } -func Provider() *oidc.Provider { - ctx := oidc.ClientContext(context.Background(), Client()) - provider, err := oidc.NewProvider(ctx, IssuerURL()) +func TokenExpiresAt() int { + expiresAt, err := strconv.Atoi(viper.GetString(setting.ENVTokenExpiresAt)) if err != nil { - panic(fmt.Sprintf("init provider error:%s", err.Error())) + log.Panic(err) } - return provider -} - -func Verifier() *oidc.IDTokenVerifier { - return Provider().Verifier(&oidc.Config{ClientID: ClientID()}) -} - -func User() string { - return viper.GetString(setting.MysqlUser) -} - -func Password() string { - return viper.GetString(setting.Password) -} - -func Host() string { - return viper.GetString(setting.Host) -} - -func Name() string { - return viper.GetString(setting.Name) + return expiresAt } diff --git a/pkg/microservice/user/config/consts.go b/pkg/microservice/user/config/consts.go index 14144b2db..e7c7dca3f 100644 --- a/pkg/microservice/user/config/consts.go +++ b/pkg/microservice/user/config/consts.go @@ -18,6 +18,5 @@ package config const ( AppState = "zadig user" - Audience = "zadig" SystemIdentityType = "system" ) diff --git a/pkg/microservice/user/core/handler/login/internal.go b/pkg/microservice/user/core/handler/login/local.go similarity index 92% rename from pkg/microservice/user/core/handler/login/internal.go rename to pkg/microservice/user/core/handler/login/local.go index 74c1a6eef..8f6a53381 100644 --- a/pkg/microservice/user/core/handler/login/internal.go +++ b/pkg/microservice/user/core/handler/login/local.go @@ -2,11 +2,12 @@ package login import ( "github.com/gin-gonic/gin" + "github.com/koderover/zadig/pkg/microservice/user/core/service/login" internalhandler "github.com/koderover/zadig/pkg/shared/handler" ) -func InternalLogin(c *gin.Context) { +func LocalLogin(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() args := &login.LoginArgs{} diff --git a/pkg/microservice/user/core/handler/login/third_part.go b/pkg/microservice/user/core/handler/login/third_party.go similarity index 47% rename from pkg/microservice/user/core/handler/login/third_part.go rename to pkg/microservice/user/core/handler/login/third_party.go index c274cf6d3..30ad43b08 100644 --- a/pkg/microservice/user/core/handler/login/third_part.go +++ b/pkg/microservice/user/core/handler/login/third_party.go @@ -2,26 +2,38 @@ package login import ( "bytes" + "context" "encoding/json" "fmt" + "net/http" + "net/url" + "time" + "github.com/coreos/go-oidc/v3/oidc" "github.com/gin-gonic/gin" + "golang.org/x/oauth2" + "github.com/koderover/zadig/pkg/microservice/user/config" "github.com/koderover/zadig/pkg/microservice/user/core/service/login" internalhandler "github.com/koderover/zadig/pkg/shared/handler" e "github.com/koderover/zadig/pkg/tool/errors" - "github.com/koderover/zadig/pkg/util" - "golang.org/x/oauth2" - "net/http" - "net/url" - "time" + "github.com/koderover/zadig/pkg/tool/log" ) +func provider() *oidc.Provider { + ctx := oidc.ClientContext(context.Background(), http.DefaultClient) + provider, err := oidc.NewProvider(ctx, config.IssuerURL()) + if err != nil { + log.Panic(fmt.Sprintf("init provider error:%s", err)) + } + return provider +} + func Login(c *gin.Context) { oauth2Config := &oauth2.Config{ ClientID: config.ClientID(), ClientSecret: config.ClientSecret(), - Endpoint: config.Provider().Endpoint(), + Endpoint: provider().Endpoint(), Scopes: config.Scopes(), RedirectURL: config.RedirectURI(), } @@ -29,84 +41,63 @@ func Login(c *gin.Context) { c.Redirect(http.StatusSeeOther, authCodeURL) } -func Callback(c *gin.Context) { - ctx := internalhandler.NewContext(c) - defer func() { internalhandler.JSONResponse(c, ctx) }() - - oidcCtx := oidc.ClientContext(c.Request.Context(), config.Client()) +func verifyAndDecode(ctx context.Context, code string) (*login.Claims, error) { + oidcCtx := oidc.ClientContext(ctx, http.DefaultClient) oauth2Config := &oauth2.Config{ ClientID: config.ClientID(), ClientSecret: config.ClientSecret(), - Endpoint: config.Provider().Endpoint(), + Endpoint: provider().Endpoint(), Scopes: nil, RedirectURL: config.RedirectURI(), } - var err error var token *oauth2.Token - switch c.Request.Method { - case http.MethodGet: - // Authorization redirect callback from OAuth2 auth flow. - if errMsg := c.Query("error"); errMsg != "" { - ctx.Err = e.ErrCallBackUser.AddDesc(errMsg) - return - } - code := c.Query("code") - if code == "" { - ctx.Err = e.ErrCallBackUser.AddDesc(fmt.Sprintf("no code in request: %q", c.Request.Form)) - return - } - if state := c.Query("state"); state != config.AppState { - ctx.Err = e.ErrCallBackUser.AddDesc(fmt.Sprintf("expected state %q got %q", config.AppState, state)) - return - } - token, err = oauth2Config.Exchange(oidcCtx, code) - case http.MethodPost: - // Form request from frontend to refresh a token. - refresh := c.Query("refresh_token") - if refresh == "" { - ctx.Err = e.ErrCallBackUser.AddDesc(fmt.Sprintf("no refresh_token in request: %q", c.Request.Form)) - return - } - t := &oauth2.Token{ - RefreshToken: refresh, - Expiry: time.Now().Add(-time.Hour), - } - token, err = oauth2Config.TokenSource(oidcCtx, t).Token() - default: - ctx.Err = e.ErrCallBackUser.AddDesc(fmt.Sprintf("method not implemented: %s", c.Request.Method)) - return - } - + token, err := oauth2Config.Exchange(oidcCtx, code) if err != nil { - ctx.Err = e.ErrCallBackUser.AddDesc(fmt.Sprintf("failed to get token: %v", err)) - return + return nil, e.ErrCallBackUser.AddDesc(fmt.Sprintf("failed to get token: %v", err)) } - rawIDToken, ok := token.Extra("id_token").(string) if !ok { - ctx.Err = e.ErrCallBackUser.AddDesc("no id_token in token response") - return + return nil, e.ErrCallBackUser.AddDesc("no id_token in token response") } - - idToken, err := config.Verifier().Verify(c.Request.Context(), rawIDToken) + idToken, err := provider().Verifier(&oidc.Config{ClientID: config.ClientID()}).Verify(ctx, rawIDToken) if err != nil { - ctx.Err = e.ErrCallBackUser.AddDesc(fmt.Sprintf("failed to verify ID token: %v", err)) - return + return nil, e.ErrCallBackUser.AddDesc(fmt.Sprintf("failed to verify ID token: %v", err)) } - var claimsRaw json.RawMessage if err := idToken.Claims(&claimsRaw); err != nil { - ctx.Err = e.ErrCallBackUser.AddDesc(fmt.Sprintf("error decoding ID token claims: %v", err)) - return + return nil, e.ErrCallBackUser.AddDesc(fmt.Sprintf("error decoding ID token claims: %v", err)) } buff := new(bytes.Buffer) if err := json.Indent(buff, claimsRaw, "", " "); err != nil { - ctx.Err = e.ErrCallBackUser.AddDesc(fmt.Sprintf("error indenting ID token claims: %v", err)) - return + return nil, e.ErrCallBackUser.AddDesc(fmt.Sprintf("error indenting ID token claims: %v", err)) } - - var claims util.Claims + var claims login.Claims err = json.Unmarshal(claimsRaw, &claims) + if err != nil { + return nil, err + } + return &claims, nil +} + +func Callback(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + + // Authorization redirect callback from OAuth2 auth flow. + if errMsg := c.Query("error"); errMsg != "" { + ctx.Err = e.ErrCallBackUser.AddDesc(errMsg) + return + } + code := c.Query("code") + if code == "" { + ctx.Err = e.ErrCallBackUser.AddDesc(fmt.Sprintf("no code in request: %q", c.Request.Form)) + return + } + if state := c.Query("state"); state != config.AppState { + ctx.Err = e.ErrCallBackUser.AddDesc(fmt.Sprintf("expected state %q got %q", config.AppState, state)) + return + } + claims, err := verifyAndDecode(c.Request.Context(), code) if err != nil { ctx.Err = err return @@ -120,15 +111,15 @@ func Callback(c *gin.Context) { ctx.Err = err return } - claims.Uid = user.Uid - claims.StandardClaims.ExpiresAt = time.Now().Add(24 * time.Hour).Unix() - userToken, err := util.CreateToken(&claims) + claims.Uid = user.UID + claims.StandardClaims.ExpiresAt = time.Now().Add(time.Duration(config.TokenExpiresAt()) * time.Minute).Unix() + userToken, err := login.CreateToken(claims) if err != nil { ctx.Err = err return } v := url.Values{} v.Add("token", userToken) - redirectUrl := "../..?" + v.Encode() + redirectUrl := "/?" + v.Encode() c.Redirect(http.StatusSeeOther, redirectUrl) } diff --git a/pkg/microservice/user/core/handler/router.go b/pkg/microservice/user/core/handler/router.go index eaab5cbe0..2964f3472 100644 --- a/pkg/microservice/user/core/handler/router.go +++ b/pkg/microservice/user/core/handler/router.go @@ -18,6 +18,7 @@ package handler import ( "github.com/gin-gonic/gin" + "github.com/koderover/zadig/pkg/microservice/user/core/handler/login" "github.com/koderover/zadig/pkg/microservice/user/core/handler/user" ) @@ -25,20 +26,16 @@ import ( type Router struct{} func (*Router) Inject(router *gin.RouterGroup) { - users := router.Group("/") + users := router.Group("") { - users.GET("login", login.Login) - - users.GET("api/v1/callback", login.Callback) - - users.POST("login", login.InternalLogin) + users.GET("/callback", login.Callback) - users.POST("api/v1/users", user.CreateUser) + users.POST("/users", user.CreateUser) - users.PUT("api/v1/users/:uid/password", user.UpdatePassword) + users.PUT("/users/:uid/password", user.UpdatePassword) - users.GET("api/v1/users/:uid", user.GetUser) + users.GET("/users/:uid", user.GetUser) - users.GET("api/v1/users", user.GetUsers) + users.GET("/users", user.ListUsers) } } diff --git a/pkg/microservice/user/core/handler/user/user.go b/pkg/microservice/user/core/handler/user/user.go index d89ee9ffa..a16e107e3 100644 --- a/pkg/microservice/user/core/handler/user/user.go +++ b/pkg/microservice/user/core/handler/user/user.go @@ -2,9 +2,9 @@ package user import ( "github.com/gin-gonic/gin" + "github.com/koderover/zadig/pkg/microservice/user/core/service/user" internalhandler "github.com/koderover/zadig/pkg/shared/handler" - "strconv" ) func GetUser(c *gin.Context) { @@ -13,14 +13,15 @@ func GetUser(c *gin.Context) { ctx.Resp, ctx.Err = user.GetUser(c.Param("uid"), ctx.Logger) } -func GetUsers(c *gin.Context) { +func ListUsers(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - args := &user.Users{} - args.Name = c.Query("name") - args.Page, _ = strconv.Atoi(c.Query("page")) - args.PerPage, _ = strconv.Atoi(c.Query("per_page")) - ctx.Resp, ctx.Err = user.GetUsers(args, ctx.Logger) + args := &user.QueryArgs{} + if err := c.ShouldBindQuery(args); err != nil { + ctx.Err = err + return + } + ctx.Resp, ctx.Err = user.SeachUsers(args, ctx.Logger) } func CreateUser(c *gin.Context) { diff --git a/pkg/microservice/user/core/repository/models/user.go b/pkg/microservice/user/core/repository/models/user.go index 53351e5fa..98ce949f0 100644 --- a/pkg/microservice/user/core/repository/models/user.go +++ b/pkg/microservice/user/core/repository/models/user.go @@ -4,9 +4,14 @@ import "github.com/koderover/zadig/pkg/microservice/user/core" type User struct { core.Model - Uid string `json:"uid"` + UID string `json:"uid"` Name string `json:"name"` IdentityType string `gorm:"default:'unknown'" json:"identity_type"` Email string `json:"email"` Phone string `json:"phone"` } + +// TableName sets the insert table name for this struct type +func (User) TableName() string { + return "user" +} diff --git a/pkg/microservice/user/core/repository/models/user_login.go b/pkg/microservice/user/core/repository/models/user_login.go index b4bc0a1d1..86d2b3016 100644 --- a/pkg/microservice/user/core/repository/models/user_login.go +++ b/pkg/microservice/user/core/repository/models/user_login.go @@ -1,6 +1,8 @@ package models -import "github.com/koderover/zadig/pkg/microservice/user/core" +import ( + "github.com/koderover/zadig/pkg/microservice/user/core" +) type UserLogin struct { core.Model @@ -8,3 +10,8 @@ type UserLogin struct { Password string `json:"password"` LastLoginTime int64 `json:"last_login_time"` } + +// TableName sets the insert table name for this struct type +func (UserLogin) TableName() string { + return "user_login" +} diff --git a/pkg/microservice/user/core/repository/mysql/user.go b/pkg/microservice/user/core/repository/orm/user.go similarity index 86% rename from pkg/microservice/user/core/repository/mysql/user.go rename to pkg/microservice/user/core/repository/orm/user.go index 406914d87..9c34f2102 100644 --- a/pkg/microservice/user/core/repository/mysql/user.go +++ b/pkg/microservice/user/core/repository/orm/user.go @@ -1,7 +1,8 @@ -package mysql +package orm import ( - "github.com/jinzhu/gorm" + "gorm.io/gorm" + "github.com/koderover/zadig/pkg/microservice/user/core" "github.com/koderover/zadig/pkg/microservice/user/core/repository/models" ) @@ -40,8 +41,8 @@ func GetUserByUid(uid string, db *gorm.DB) (*models.User, error) { return &user, nil } -// GetUsers gets a list of users based on paging constraints -func GetUsers(page int, perPage int, name string, db *gorm.DB) ([]models.User, error) { +// ListUsers gets a list of users based on paging constraints +func ListUsers(page int, perPage int, name string, db *gorm.DB) ([]models.User, error) { var ( users []models.User err error @@ -60,11 +61,11 @@ func GetUsers(page int, perPage int, name string, db *gorm.DB) ([]models.User, e } // GetUsersCount gets user count -func GetUsersCount(name string) (int, error) { +func GetUsersCount(name string) (int64, error) { var ( users []models.User err error - count int + count int64 ) err = core.DB.Where("name LIKE ?", "%"+name+"%").Find(&users).Count(&count).Error diff --git a/pkg/microservice/user/core/repository/mysql/user_login.go b/pkg/microservice/user/core/repository/orm/user_login.go similarity index 86% rename from pkg/microservice/user/core/repository/mysql/user_login.go rename to pkg/microservice/user/core/repository/orm/user_login.go index 8bbd2cd8f..a7bc6c42a 100644 --- a/pkg/microservice/user/core/repository/mysql/user_login.go +++ b/pkg/microservice/user/core/repository/orm/user_login.go @@ -1,7 +1,8 @@ -package mysql +package orm import ( - "github.com/jinzhu/gorm" + "gorm.io/gorm" + "github.com/koderover/zadig/pkg/microservice/user/core/repository/models" ) @@ -26,8 +27,8 @@ func GetUserLogin(uid string, db *gorm.DB) (*models.UserLogin, error) { return &userLogin, nil } -// GetUserLogins Get a userLogin based on uid list -func GetUserLogins(uids []string, db *gorm.DB) (*[]models.UserLogin, error) { +// ListUserLogins Get a userLogin based on uid list +func ListUserLogins(uids []string, db *gorm.DB) (*[]models.UserLogin, error) { var userLogins []models.UserLogin err := db.Where("uid IN (?)", uids).Find(&userLogins).Error if err != nil { diff --git a/pkg/microservice/user/core/service.go b/pkg/microservice/user/core/service.go index f4c09094f..4d50f8739 100644 --- a/pkg/microservice/user/core/service.go +++ b/pkg/microservice/user/core/service.go @@ -18,16 +18,23 @@ package core import ( "context" - "fmt" - "github.com/jinzhu/gorm" - _ "github.com/jinzhu/gorm/dialects/mysql" + + "gorm.io/gorm" + "github.com/koderover/zadig/pkg/config" config2 "github.com/koderover/zadig/pkg/microservice/user/config" "github.com/koderover/zadig/pkg/setting" + gormtool "github.com/koderover/zadig/pkg/tool/gorm" "github.com/koderover/zadig/pkg/tool/log" - "time" ) +var DB *gorm.DB + +type Model struct { + CreatedAt int64 `json:"created_at"` + UpdatedAt int64 `json:"updated_at"` +} + func Start(_ context.Context) { log.Init(&log.Config{ Level: config.LogLevel(), @@ -35,64 +42,22 @@ func Start(_ context.Context) { SendToFile: config.SendLogToFile(), Development: config.Mode() != setting.ReleaseMode, }) - Setup() -} -var DB *gorm.DB - -type Model struct { - CreatedAt int `json:"created_at"` - UpdatedAt int `json:"updated_at"` + initDatabase() + DB = gormtool.DB(config2.MysqlUserDB()) } -// Setup initializes the database instance -func Setup() { - var err error - DB, err = gorm.Open("mysql", fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8&parseTime=True&loc=Local", - config2.User(), - config2.Password(), - config2.Host(), - config2.Name())) +func initDatabase() { + err := gormtool.Open(config.MysqlUser(), + config.MysqlPassword(), + config.MysqlHost(), + config2.MysqlUserDB(), + ) if err != nil { - log.Fatalf("models.Setup err: %v", err) - } - - gorm.DefaultTableNameHandler = func(db *gorm.DB, defaultTableName string) string { - return defaultTableName - } - - DB.SingularTable(true) - DB.Callback().Create().Replace("gorm:update_time_stamp", updateTimeStampForCreateCallback) - DB.Callback().Update().Replace("gorm:update_time_stamp", updateTimeStampForUpdateCallback) - DB.DB().SetMaxIdleConns(10) - DB.DB().SetMaxOpenConns(100) -} - -// updateTimeStampForCreateCallback will set `CreatedOn`, `ModifiedOn` when creating -func updateTimeStampForCreateCallback(scope *gorm.Scope) { - if !scope.HasError() { - nowTime := time.Now().Unix() - if createTimeField, ok := scope.FieldByName("CreatedAt"); ok { - if createTimeField.IsBlank { - createTimeField.Set(nowTime) - } - } - - if modifyTimeField, ok := scope.FieldByName("UpdatedAt"); ok { - if modifyTimeField.IsBlank { - modifyTimeField.Set(nowTime) - } - } - } -} - -// updateTimeStampForUpdateCallback will set `ModifiedOn` when updating -func updateTimeStampForUpdateCallback(scope *gorm.Scope) { - if _, ok := scope.Get("gorm:update_column"); !ok { - scope.SetColumn("ModifiedOn", time.Now().Unix()) + log.Panicf("Failed to open database %s", config2.MysqlUserDB()) } } func Stop(_ context.Context) { - DB.Close() + gormtool.Close() } diff --git a/pkg/microservice/user/core/service/login/internal.go b/pkg/microservice/user/core/service/login/local.go similarity index 84% rename from pkg/microservice/user/core/service/login/internal.go rename to pkg/microservice/user/core/service/login/local.go index 4badd824b..b15772232 100644 --- a/pkg/microservice/user/core/service/login/internal.go +++ b/pkg/microservice/user/core/service/login/local.go @@ -2,14 +2,16 @@ package login import ( "fmt" - "github.com/dgrijalva/jwt-go" - "github.com/koderover/zadig/pkg/microservice/user/config" - "github.com/koderover/zadig/pkg/microservice/user/core" - "github.com/koderover/zadig/pkg/microservice/user/core/repository/mysql" - "github.com/koderover/zadig/pkg/util" + "time" + + "github.com/golang-jwt/jwt" "go.uber.org/zap" "golang.org/x/crypto/bcrypt" - "time" + + "github.com/koderover/zadig/pkg/microservice/user/config" + "github.com/koderover/zadig/pkg/microservice/user/core" + "github.com/koderover/zadig/pkg/microservice/user/core/repository/orm" + "github.com/koderover/zadig/pkg/setting" ) type LoginArgs struct { @@ -27,7 +29,7 @@ type User struct { } func InternalLogin(args *LoginArgs, logger *zap.SugaredLogger) (*User, error) { - user, err := mysql.GetUser(args.Email, config.SystemIdentityType, core.DB) + user, err := orm.GetUser(args.Email, config.SystemIdentityType, core.DB) if err != nil { logger.Errorf("InternalLogin get user email:%s error", args.Email) return nil, err @@ -35,7 +37,7 @@ func InternalLogin(args *LoginArgs, logger *zap.SugaredLogger) (*User, error) { if user == nil { return nil, fmt.Errorf("user not exist") } - userLogin, err := mysql.GetUserLogin(user.Uid, core.DB) + userLogin, err := orm.GetUserLogin(user.UID, core.DB) if err != nil { logger.Errorf("InternalLogin get user:%s user login not exist, error msg:%s", args.Email, err.Error()) return nil, err @@ -51,17 +53,17 @@ func InternalLogin(args *LoginArgs, logger *zap.SugaredLogger) (*User, error) { return nil, fmt.Errorf("check password error, error msg:%s", err.Error()) } userLogin.LastLoginTime = time.Now().Unix() - err = mysql.UpdateUserLogin(userLogin.Uid, userLogin, core.DB) + err = orm.UpdateUserLogin(userLogin.Uid, userLogin, core.DB) if err != nil { logger.Errorf("InternalLogin user:%s update user login password error, error msg:%s", args.Email, err.Error()) return nil, err } - token, err := util.CreateToken(&util.Claims{ + token, err := CreateToken(&Claims{ Name: user.Name, Email: user.Email, - Uid: user.Uid, + Uid: user.UID, StandardClaims: jwt.StandardClaims{ - Audience: config.Audience, + Audience: setting.ProductName, ExpiresAt: time.Now().Add(24 * time.Hour).Unix(), }, }) @@ -70,7 +72,7 @@ func InternalLogin(args *LoginArgs, logger *zap.SugaredLogger) (*User, error) { return nil, err } return &User{ - Uid: user.Uid, + Uid: user.UID, Token: token, Email: user.Email, Phone: user.Phone, diff --git a/pkg/microservice/user/core/service/login/third_part.go b/pkg/microservice/user/core/service/login/third_party.go similarity index 78% rename from pkg/microservice/user/core/service/login/third_part.go rename to pkg/microservice/user/core/service/login/third_party.go index 81bc5338a..f51c021b1 100644 --- a/pkg/microservice/user/core/service/login/third_part.go +++ b/pkg/microservice/user/core/service/login/third_party.go @@ -1,12 +1,14 @@ package login import ( + "time" + "github.com/google/uuid" + "go.uber.org/zap" + "github.com/koderover/zadig/pkg/microservice/user/core" "github.com/koderover/zadig/pkg/microservice/user/core/repository/models" - "github.com/koderover/zadig/pkg/microservice/user/core/repository/mysql" - "go.uber.org/zap" - "time" + "github.com/koderover/zadig/pkg/microservice/user/core/repository/orm" ) type SyncUserInfo struct { @@ -16,7 +18,7 @@ type SyncUserInfo struct { } func SyncUser(syncUserInfo *SyncUserInfo, logger *zap.SugaredLogger) (*models.User, error) { - user, err := mysql.GetUser(syncUserInfo.Email, syncUserInfo.IdentityType, core.DB) + user, err := orm.GetUser(syncUserInfo.Email, syncUserInfo.IdentityType, core.DB) if err != nil { logger.Error("SyncUser get user:%s error, error msg:%s", syncUserInfo.Email, err.Error()) return nil, err @@ -30,40 +32,40 @@ func SyncUser(syncUserInfo *SyncUserInfo, logger *zap.SugaredLogger) (*models.Us if user == nil { uid, _ := uuid.NewUUID() user = &models.User{ - Uid: uid.String(), + UID: uid.String(), Name: syncUserInfo.Name, Email: syncUserInfo.Email, IdentityType: syncUserInfo.IdentityType, } - err = mysql.CreateUser(user, tx) + err = orm.CreateUser(user, tx) if err != nil { tx.Rollback() logger.Error("SyncUser create user:%s error, error msg:%s", syncUserInfo.Email, err.Error()) return nil, err } } - userLogin, err := mysql.GetUserLogin(user.Uid, tx) + userLogin, err := orm.GetUserLogin(user.UID, tx) if err != nil { tx.Rollback() - logger.Error("UpdateLoginInfo get user:%s login error, error msg:%s", user.Uid, err.Error()) + logger.Error("UpdateLoginInfo get user:%s login error, error msg:%s", user.UID, err.Error()) return nil, err } if userLogin != nil { userLogin.LastLoginTime = time.Now().Unix() - err = mysql.UpdateUserLogin(user.Uid, userLogin, tx) + err = orm.UpdateUserLogin(user.UID, userLogin, tx) if err != nil { tx.Rollback() - logger.Error("UpdateLoginInfo update user:%s login error, error msg:%s", user.Uid, err.Error()) + logger.Error("UpdateLoginInfo update user:%s login error, error msg:%s", user.UID, err.Error()) return nil, err } } else { - err = mysql.CreateUserLogin(&models.UserLogin{ - Uid: user.Uid, + err = orm.CreateUserLogin(&models.UserLogin{ + Uid: user.UID, LastLoginTime: time.Now().Unix(), }, tx) if err != nil { tx.Rollback() - logger.Error("UpdateLoginInfo create user:%s login error, error msg:%s", user.Uid, err.Error()) + logger.Error("UpdateLoginInfo create user:%s login error, error msg:%s", user.UID, err.Error()) return nil, err } } diff --git a/pkg/microservice/user/core/service/login/token.go b/pkg/microservice/user/core/service/login/token.go new file mode 100644 index 000000000..76ccfcdcb --- /dev/null +++ b/pkg/microservice/user/core/service/login/token.go @@ -0,0 +1,29 @@ +package login + +import ( + "github.com/golang-jwt/jwt" + + "github.com/koderover/zadig/pkg/config" +) + +type Claims struct { + Name string `json:"name"` + Email string `json:"email"` + Uid string `json:"uid"` + FederatedClaims FederatedClaims `json:"federated_claims"` + jwt.StandardClaims +} + +type FederatedClaims struct { + ConnectorId string `json:"connector_id"` + UserId string `json:"user_id"` +} + +func CreateToken(claims *Claims) (string, error) { + token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) + tokenString, err := token.SignedString([]byte(config.SecretKey())) + if err != nil { + return "", err + } + return tokenString, nil +} diff --git a/pkg/microservice/user/core/service/user/user.go b/pkg/microservice/user/core/service/user/user.go index 0f368eb57..4b2807235 100644 --- a/pkg/microservice/user/core/service/user/user.go +++ b/pkg/microservice/user/core/service/user/user.go @@ -2,13 +2,15 @@ package user import ( "fmt" + "github.com/google/uuid" + "go.uber.org/zap" + "golang.org/x/crypto/bcrypt" + "github.com/koderover/zadig/pkg/microservice/user/config" "github.com/koderover/zadig/pkg/microservice/user/core" "github.com/koderover/zadig/pkg/microservice/user/core/repository/models" - "github.com/koderover/zadig/pkg/microservice/user/core/repository/mysql" - "go.uber.org/zap" - "golang.org/x/crypto/bcrypt" + "github.com/koderover/zadig/pkg/microservice/user/core/repository/orm" ) type User struct { @@ -18,7 +20,7 @@ type User struct { Phone string `json:"phone,omitempty"` } -type Users struct { +type QueryArgs struct { Name string `json:"name"` PerPage int `json:"per_page"` Page int `json:"page"` @@ -39,13 +41,13 @@ type Password struct { NewPassword string `json:"newPassword"` } -type GetUsersResp struct { +type UsersResp struct { Users []UserInfo `json:"users"` - TotalCount int `json:"totalCount"` + TotalCount int64 `json:"totalCount"` } func GetUser(uid string, logger *zap.SugaredLogger) (*models.User, error) { - user, err := mysql.GetUserByUid(uid, core.DB) + user, err := orm.GetUserByUid(uid, core.DB) if err != nil { logger.Errorf("GetUser getUserByUid:%s error, error msg:%s", uid, err.Error()) return nil, err @@ -53,24 +55,29 @@ func GetUser(uid string, logger *zap.SugaredLogger) (*models.User, error) { return user, nil } -func GetUsers(args *Users, logger *zap.SugaredLogger) (*GetUsersResp, error) { - count, err := mysql.GetUsersCount(args.Name) +func SeachUsers(args *QueryArgs, logger *zap.SugaredLogger) (*UsersResp, error) { + count, err := orm.GetUsersCount(args.Name) if err != nil { - logger.Errorf("GetUsers GetUsersCount By name:%s error, error msg:%s", args.Name, err.Error()) + logger.Errorf("SeachUsers GetUsersCount By name:%s error, error msg:%s", args.Name, err.Error()) return nil, err } - users, err := mysql.GetUsers(args.Page, args.PerPage, args.Name, core.DB) + if count == 0 { + return &UsersResp{ + TotalCount: 0, + }, nil + } + users, err := orm.ListUsers(args.Page, args.PerPage, args.Name, core.DB) if err != nil { - logger.Errorf("GetUsers GetUsers By name:%s error, error msg:%s", args.Name, err.Error()) + logger.Errorf("SeachUsers SeachUsers By name:%s error, error msg:%s", args.Name, err.Error()) return nil, err } var uids []string for _, user := range users { - uids = append(uids, user.Uid) + uids = append(uids, user.UID) } - userLogins, err := mysql.GetUserLogins(uids, core.DB) + userLogins, err := orm.ListUserLogins(uids, core.DB) if err != nil { - logger.Errorf("GetUsers GetUserLogins By uids:%s error, error msg:%s", uids, err.Error()) + logger.Errorf("SeachUsers ListUserLogins By uids:%s error, error msg:%s", uids, err.Error()) return nil, err } userLoginMap := make(map[string]models.UserLogin) @@ -79,10 +86,10 @@ func GetUsers(args *Users, logger *zap.SugaredLogger) (*GetUsersResp, error) { } var usersInfo []UserInfo for _, user := range users { - if userLogin, ok := userLoginMap[user.Uid]; ok { + if userLogin, ok := userLoginMap[user.UID]; ok { usersInfo = append(usersInfo, UserInfo{ LastLoginTime: userLogin.LastLoginTime, - Uid: user.Uid, + Uid: user.UID, Phone: user.Phone, Name: user.Name, Email: user.Email, @@ -92,7 +99,7 @@ func GetUsers(args *Users, logger *zap.SugaredLogger) (*GetUsersResp, error) { logger.Error("user:%s login info not exist") } } - return &GetUsersResp{ + return &UsersResp{ Users: usersInfo, TotalCount: count, }, nil @@ -105,7 +112,7 @@ func CreateUser(args *User, logger *zap.SugaredLogger) error { Email: args.Email, IdentityType: config.SystemIdentityType, Phone: args.Phone, - Uid: uid.String(), + UID: uid.String(), } tx := core.DB.Begin() defer func() { @@ -113,7 +120,7 @@ func CreateUser(args *User, logger *zap.SugaredLogger) error { tx.Rollback() } }() - err := mysql.CreateUser(user, tx) + err := orm.CreateUser(user, tx) if err != nil { tx.Rollback() logger.Errorf("CreateUser CreateUser :%v error, error msg:%s", user, err.Error()) @@ -121,11 +128,11 @@ func CreateUser(args *User, logger *zap.SugaredLogger) error { } hashedPassword, _ := bcrypt.GenerateFromPassword([]byte(args.Password), bcrypt.DefaultCost) userLogin := &models.UserLogin{ - Uid: user.Uid, + Uid: user.UID, Password: string(hashedPassword), LastLoginTime: 0, } - err = mysql.CreateUserLogin(userLogin, tx) + err = orm.CreateUserLogin(userLogin, tx) if err != nil { tx.Rollback() logger.Errorf("CreateUser CreateUserLogin:%v error, error msg:%s", user, err.Error()) @@ -135,7 +142,7 @@ func CreateUser(args *User, logger *zap.SugaredLogger) error { } func UpdatePassword(args *Password, logger *zap.SugaredLogger) error { - user, err := mysql.GetUserByUid(args.Uid, core.DB) + user, err := orm.GetUserByUid(args.Uid, core.DB) if err != nil { logger.Errorf("UpdatePassword GetUserByUid:%s error, error msg:%s", args.Uid, err.Error()) return err @@ -143,7 +150,7 @@ func UpdatePassword(args *Password, logger *zap.SugaredLogger) error { if user == nil { return fmt.Errorf("user not exist") } - userLogin, err := mysql.GetUserLogin(user.Uid, core.DB) + userLogin, err := orm.GetUserLogin(user.UID, core.DB) if err != nil { logger.Errorf("UpdatePassword GetUserLogin:%s error, error msg:%s", args.Uid, err.Error()) return err @@ -164,10 +171,10 @@ func UpdatePassword(args *Password, logger *zap.SugaredLogger) error { } hashedPassword, _ := bcrypt.GenerateFromPassword([]byte(args.NewPassword), bcrypt.DefaultCost) userLogin = &models.UserLogin{ - Uid: user.Uid, + Uid: user.UID, Password: string(hashedPassword), } - err = mysql.UpdateUserLogin(user.Uid, userLogin, core.DB) + err = orm.UpdateUserLogin(user.UID, userLogin, core.DB) if err != nil { logger.Errorf("UpdatePassword UpdateUserLogin:%v error, error msg:%s", userLogin, err.Error()) return err diff --git a/pkg/microservice/user/server/rest/router.go b/pkg/microservice/user/server/rest/router.go index 101ce1e5a..27be0a983 100644 --- a/pkg/microservice/user/server/rest/router.go +++ b/pkg/microservice/user/server/rest/router.go @@ -20,11 +20,16 @@ import ( "github.com/gin-gonic/gin" "github.com/koderover/zadig/pkg/microservice/user/core/handler" + "github.com/koderover/zadig/pkg/microservice/user/core/handler/login" ) func (s *engine) injectRouterGroup(router *gin.RouterGroup) { + { + router.GET("login", login.Login) + router.POST("login", login.LocalLogin) + } for name, r := range map[string]injector{ - "/": new(handler.Router), + "/api/v1": new(handler.Router), } { r.Inject(router.Group(name)) } diff --git a/pkg/microservice/user/server/server.go b/pkg/microservice/user/server/server.go index a6c1e6169..b892ae276 100644 --- a/pkg/microservice/user/server/server.go +++ b/pkg/microservice/user/server/server.go @@ -33,7 +33,7 @@ func Serve(ctx context.Context) error { log.Info("Start policy service") engine := rest.NewEngine() - server := &http.Server{Addr: ":5555", Handler: engine} + server := &http.Server{Addr: ":80", Handler: engine} stopChan := make(chan struct{}) go func() { diff --git a/pkg/setting/consts.go b/pkg/setting/consts.go index 761f919a4..96feb1292 100644 --- a/pkg/setting/consts.go +++ b/pkg/setting/consts.go @@ -29,6 +29,9 @@ const ( ENVAslanDBName = "ASLAN_DB" ENVHubAgentImage = "HUB_AGENT_IMAGE" ENVPoetryAPIRootKey = "POETRY_API_ROOT_KEY" + ENVMysqlUser = "MYSQL_USER" + ENVMysqlPassword = "MYSQL_PASSWORD" + ENVMysqlHost = "MYSQL_HOST" // Aslan ENVPodName = "BE_POD_NAME" @@ -101,22 +104,15 @@ const ( TestMode = "test" // user - IssuerURL = "ISSUER_URL" - Listen = "LISTEN" - TlsCert = "TLSCERT" - TlsKey = "TLSKEY" - RootCAs = "ROOT_CAS" - Debug = "DEBUG" - ClientID = "CLIENT_ID" - ClientSecret = "CLIENT_SECRET" - RedirectURI = "REDIRECT_URI" - SecretKey = "SECRET_KEY" - OfflineAsScope = "OFFLINE_AS_SCOPE" - MysqlUser = "MYSQL_USER" - Password = "PASSWORD" - Host = "HOST" - Name = "NAME" - Scopes = "SCOPES" + ENVIssuerURL = "ISSUER_URL" + ENVDebug = "DEBUG" + ENVClientID = "CLIENT_ID" + ENVClientSecret = "CLIENT_SECRET" + ENVRedirectURI = "REDIRECT_URI" + ENVSecretKey = "SECRET_KEY" + ENVMysqlUserDB = "MYSQL_USER_DB" + ENVScopes = "SCOPES" + ENVTokenExpiresAt = "TOKEN_EXPIRES_AT" ) // k8s concepts diff --git a/pkg/util/sign.go b/pkg/util/sign.go index b982d8366..2e8cabca0 100644 --- a/pkg/util/sign.go +++ b/pkg/util/sign.go @@ -20,8 +20,6 @@ import ( "crypto/hmac" "crypto/sha256" "encoding/hex" - "github.com/dgrijalva/jwt-go" - "github.com/koderover/zadig/pkg/config" ) // ComputeHmacSha256 According to ak/sk generate secret key @@ -33,25 +31,3 @@ func ComputeHmacSha256(ak string, sk string) string { hex.EncodeToString(h.Sum(nil)) return sha } - -type Claims struct { - Name string `json:"name"` - Email string `json:"email"` - Uid string `json:"uid"` - FederatedClaims FederatedClaims `json:"federated_claims"` - jwt.StandardClaims -} - -type FederatedClaims struct { - ConnectorId string `json:"connector_id"` - UserId string `json:"user_id"` -} - -func CreateToken(claims *Claims) (string, error) { - token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) - tokenString, err := token.SignedString([]byte(config.SecretKey())) - if err != nil { - return "", err - } - return tokenString, nil -} -- Gitee From 13536ad06ed3fde27e718f8af56caf7ae02bbf33 Mon Sep 17 00:00:00 2001 From: mouuii Date: Wed, 27 Oct 2021 15:57:09 +0800 Subject: [PATCH 136/405] features Signed-off-by: mouuii --- .../systemconfig/core/handler/features.go | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/pkg/microservice/systemconfig/core/handler/features.go b/pkg/microservice/systemconfig/core/handler/features.go index 6a69d930e..f6c353353 100644 --- a/pkg/microservice/systemconfig/core/handler/features.go +++ b/pkg/microservice/systemconfig/core/handler/features.go @@ -11,7 +11,8 @@ import ( ) var featureM map[string]string = map[string]string{ - "xx": "true", + "ModernWorkflow": "false", + "CommunityProjectRepository":"false", } var FeatureFlag string @@ -21,6 +22,15 @@ func GetFeatures(c *gin.Context) { featureName := c.Query("feature") ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() + initOnce() + if v,ok := featureM[featureName];ok{ + ctx.Resp = v + return + } + ctx.Resp = "notfound" +} + +func initOnce(){ once.Do(func(){ features := config.Features() featureList := strings.Split(features,",") @@ -34,9 +44,4 @@ func GetFeatures(c *gin.Context) { } } }) - if v,ok := featureM[featureName];ok{ - ctx.Resp = v - } - ctx.Resp = "notfound" - } -- Gitee From 6e1e5c9d0cbe6441073feec725b3390cca64cdf2 Mon Sep 17 00:00:00 2001 From: panxunying <641770806@qq.com> Date: Wed, 27 Oct 2021 16:13:01 +0800 Subject: [PATCH 137/405] optimize Signed-off-by: panxunying <641770806@qq.com> --- go.mod | 1 - go.sum | 1685 +++++++++++++++++ .../systemconfig/core/service/types.go | 2 +- pkg/microservice/user/config/config.go | 12 +- pkg/microservice/user/config/consts.go | 6 +- .../user/core/handler/login/local.go | 2 +- .../user/core/handler/login/third_party.go | 2 +- .../user/core/repository/models/base.go | 6 + .../user/core/repository/models/user.go | 4 +- .../user/core/repository/models/user_login.go | 8 +- pkg/microservice/user/core/service.go | 5 - .../user/core/service/login/local.go | 4 +- .../user/core/service/login/third_party.go | 2 +- .../user/core/service/user/user.go | 6 +- pkg/microservice/user/server/server.go | 2 +- pkg/setting/consts.go | 1 - 16 files changed, 1710 insertions(+), 38 deletions(-) create mode 100644 go.sum create mode 100644 pkg/microservice/user/core/repository/models/base.go diff --git a/go.mod b/go.mod index 3dc239e84..d8f774933 100644 --- a/go.mod +++ b/go.mod @@ -38,7 +38,6 @@ require ( github.com/hashicorp/go-multierror v1.1.1 github.com/huaweicloud/huaweicloud-sdk-go-v3 v0.0.50 github.com/jasonlvhit/gocron v0.0.0-20171226191223-3c914c8681c3 - github.com/jinzhu/gorm v1.9.16 github.com/jinzhu/now v1.1.2 github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 // indirect github.com/mittwald/go-helm-client v0.8.0 diff --git a/go.sum b/go.sum new file mode 100644 index 000000000..b34685d13 --- /dev/null +++ b/go.sum @@ -0,0 +1,1685 @@ +bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= +cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= +cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= +cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= +cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= +cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= +cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= +cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= +cloud.google.com/go v0.88.0 h1:MZ2cf9Elnv1wqccq8ooKO2MqHQLc+ChCp/+QWObCpxg= +cloud.google.com/go v0.88.0/go.mod h1:dnKwfYbP9hQhefiUvpbcAyoGSHUrOxR20JVElLiUvEY= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= +cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= +cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= +cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +entgo.io/ent v0.8.0/go.mod h1:KNjsukat/NJi6zJh1utwRadsbGOZsBbAZNDxkW7tMCc= +github.com/27149chen/afero v1.6.2 h1:WRPUOreB90qGRQs8fxXcvi0srBPHy2octiJme7C7XCA= +github.com/27149chen/afero v1.6.2/go.mod h1:68wFWsZwQPvguVWn5di+KCOLI0KQtSRve2mPFVg6VWY= +github.com/AppsFlyer/go-sundheit v0.4.0/go.mod h1:iZ8zWMS7idcvmqewf5mEymWWgoOiG/0WD4+aeh+heX4= +github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= +github.com/Azure/go-ansiterm v0.0.0-20210608223527-2377c96fe795/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= +github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= +github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= +github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest/autorest v0.11.12/go.mod h1:eipySxLmqSyC5s5k1CLupqet0PSENBEDP93LQ9a8QYw= +github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= +github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= +github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= +github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= +github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= +github.com/Azure/go-ntlmssp v0.0.0-20200615164410-66371956d46c h1:/IBSNwUN8+eKzUzbJPqhK839ygXJ82sde8x3ogr6R28= +github.com/Azure/go-ntlmssp v0.0.0-20200615164410-66371956d46c/go.mod h1:chxPXzSsl7ZWRAuOIE23GDNzjWuZquvFlgA8xmpunjU= +github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/DATA-DOG/go-sqlmock v1.5.0 h1:Shsta01QNfFxHCfpW6YH2STWB0MudeXXEWMr20OEh60= +github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= +github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= +github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd h1:sjQovDkwrZp8u+gxLtPgKGjk5hCxuy2hrRejBTA9xFU= +github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd/go.mod h1:64YHyfSL2R96J44Nlwm39UHepQbyR5q10x7iYa1ks2E= +github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= +github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= +github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= +github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= +github.com/Masterminds/semver/v3 v3.1.1 h1:hLg3sBzpNErnxhQtUy/mmLR2I9foDujNK030IGemrRc= +github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= +github.com/Masterminds/sprig/v3 v3.2.2 h1:17jRggJu518dr3QaafizSXOjKYp94wKfABxUmyxvxX8= +github.com/Masterminds/sprig/v3 v3.2.2/go.mod h1:UoaO7Yp8KlPnJIYWTFkMaqPUYKTfGFPhxNuwnnxkKlk= +github.com/Masterminds/squirrel v1.5.0 h1:JukIZisrUXadA9pl3rMkjhiamxiB0cXiu+HGp/Y8cY8= +github.com/Masterminds/squirrel v1.5.0/go.mod h1:NNaOrjSoIDfDA40n7sr2tPNZRfjzjA400rg+riTZj10= +github.com/Masterminds/vcs v1.13.1/go.mod h1:N09YCmOQr6RLxC6UNHzuVwAdodYbbnycGHSmwVJjcKA= +github.com/Microsoft/go-winio v0.4.16-0.20201130162521-d1ffc52c7331/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= +github.com/Microsoft/go-winio v0.4.16 h1:FtSW/jqD+l4ba5iPBj9CODVtgfYAD8w2wS923g/cFDk= +github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= +github.com/Microsoft/hcsshim v0.8.14 h1:lbPVK25c1cu5xTLITwpUcxoA9vKrKErASPYygvouJns= +github.com/Microsoft/hcsshim v0.8.14/go.mod h1:NtVKoYxQuTLx6gEq0L96c9Ju4JbRJ4nY2ow3VK6a9Lg= +github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= +github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= +github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 h1:TngWCqHvy9oXAN6lEVMRuU21PR1EtLVZJmdB18Gu3Rw= +github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= +github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= +github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= +github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/RyanCarrier/dijkstra v1.1.0 h1:/NDihjfJA3CxFaZz8EdzTwdFKFZDvvB881OVLdakRcI= +github.com/RyanCarrier/dijkstra v1.1.0/go.mod h1:5agGUBNEtUAGIANmbw09fuO3a2htPEkc1jNH01qxCWA= +github.com/RyanCarrier/dijkstra-1 v0.0.0-20170512020943-0e5801a26345 h1:fgSpoKViTSqRb4hjDNj10ig5wUvO0CayCzFdLf6fuRM= +github.com/RyanCarrier/dijkstra-1 v0.0.0-20170512020943-0e5801a26345/go.mod h1:OK4EvWJ441LQqGzed5NGB6vKBAE34n3z7iayPcEwr30= +github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= +github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= +github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= +github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= +github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM= +github.com/albertorestifo/dijkstra v0.0.0-20160910063646-aba76f725f72 h1:uGeGZl8PxSq8VZGG4QK5njJTFA4/G/x5CYORvQVXtAE= +github.com/albertorestifo/dijkstra v0.0.0-20160910063646-aba76f725f72/go.mod h1:o+JdB7VetTHjLhU0N57x18B9voDBQe0paApdEAEoEfw= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 h1:JYp7IbQjafoB+tBA3gMyHYHrpOtNuDiK/uB5uXxq5wM= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= +github.com/andygrunwald/go-gerrit v0.0.0-20171029143327-95b11af228a1 h1:2Qp3BQZ7r1z+oMUnFhD6FQ86Hh1PO+59yoUNNJ5Dn0M= +github.com/andygrunwald/go-gerrit v0.0.0-20171029143327-95b11af228a1/go.mod h1:0iuRQp6WJ44ts+iihy5E/WlPqfg5RNeQxOmzRkxCdtk= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= +github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= +github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= +github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= +github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535 h1:4daAzAu0S6Vi7/lbWECcX0j45yZReDZ56BQsrVBOEEY= +github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg= +github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= +github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.34.28 h1:sscPpn/Ns3i0F4HPEWAVcwdIRaZZCuL7llJ2/60yPIk= +github.com/aws/aws-sdk-go v1.34.28/go.mod h1:H7NKnBqNVzoTJpGfLrQkkD+ytBA93eiDYi/+8rV9s48= +github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= +github.com/beevik/etree v1.1.0/go.mod h1:r8Aw8JqVegEf0w2fDnATrX9VpkMcyFeM0FhwO62wh+A= +github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= +github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= +github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= +github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= +github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= +github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= +github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= +github.com/bndr/gojenkins v1.1.0 h1:TWyJI6ST1qDAfH33DQb3G4mD8KkrBfyfSUoZBHQAvPI= +github.com/bndr/gojenkins v1.1.0/go.mod h1:QeskxN9F/Csz0XV/01IC8y37CapKKWvOHa0UHLLX1fM= +github.com/bradleyfalzon/ghinstallation v1.1.1 h1:pmBXkxgM1WeF8QYvDLT5kuQiHMcmf+X015GI0KM/E3I= +github.com/bradleyfalzon/ghinstallation v1.1.1/go.mod h1:vyCmHTciHx/uuyN82Zc3rXN3X2KTK8nUTCrTMwAhcug= +github.com/bshuster-repo/logrus-logstash-hook v1.0.0 h1:e+C0SB5R1pu//O4MQ3f9cFuPGoOVeF2fE4Og9otCc70= +github.com/bshuster-repo/logrus-logstash-hook v1.0.0/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= +github.com/bugsnag/bugsnag-go v2.1.0+incompatible h1:SuqsBHDutts2rZh4swHEWTexxi0F/JZ/6j1rR9BFe7I= +github.com/bugsnag/bugsnag-go v2.1.0+incompatible/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= +github.com/bugsnag/panicwrap v1.3.1 h1:pmuhHlhbUV4OOrGDvoiMjHSZzwRcL+I9cIzYKiW4lII= +github.com/bugsnag/panicwrap v1.3.1/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= +github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= +github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= +github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= +github.com/cenkalti/backoff/v3 v3.0.0 h1:ske+9nBpD9qZsTBoF41nW5L+AIuFBKMeze18XQ3eG1c= +github.com/cenkalti/backoff/v3 v3.0.0/go.mod h1:cIeZDE3IrqwwJl6VUwCN6trj1oXrTS4rc0ij+ULvLYs= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5/go.mod h1:/iP1qXHoty45bqomnu2LM+VVyAEdWN+vtSHGlQgyxbw= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/cilium/ebpf v0.0.0-20200110133405-4032b1d8aae3/go.mod h1:MA5e5Lr8slmEg9bt0VpxxWqJlO4iwu3FBdHUzV7wQVg= +github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= +github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= +github.com/containerd/cgroups v0.0.0-20200531161412-0dbf7f05ba59 h1:qWj4qVYZ95vLWwqyNJCQg7rDsG5wPdze0UaPolH7DUk= +github.com/containerd/cgroups v0.0.0-20200531161412-0dbf7f05ba59/go.mod h1:pA0z1pT8KYB3TCXK/ocprsh7MAkoW8bZVzPdih9snmM= +github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= +github.com/containerd/containerd v1.3.2/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.4 h1:rtRG4N6Ct7GNssATwgpvMGfnjnwfjnu/Zs9W3Ikzq+M= +github.com/containerd/containerd v1.4.4/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= +github.com/containerd/continuity v0.0.0-20201208142359-180525291bb7 h1:6ejg6Lkk8dskcM7wQ28gONkukbQkM4qpj4RnYbpFzrI= +github.com/containerd/continuity v0.0.0-20201208142359-180525291bb7/go.mod h1:kR3BEg7bDFaEddKm54WSmrol1fKWDU1nKYkgrcgZT7Y= +github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= +github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= +github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= +github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc= +github.com/coocood/freecache v1.1.0 h1:ENiHOsWdj1BrrlPwblhbn4GdAsMymK3pZORJ+bJGAjA= +github.com/coocood/freecache v1.1.0/go.mod h1:ePwxCDzOYvARfHdr1pByNct1at3CoKnsipOHwKlNbzI= +github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= +github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= +github.com/coreos/go-oidc v2.1.0+incompatible h1:sdJrfw8akMnCuUlaZU3tE/uYXFgfqom8DBE9so9EBsM= +github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= +github.com/coreos/go-oidc/v3 v3.0.0 h1:/mAA0XMgYJw2Uqm7WKGCsKnjitE/+A0FFbOmiRJm7LQ= +github.com/coreos/go-oidc/v3 v3.0.0/go.mod h1:rEJ/idjfUyfkBit1eI1fvyr+64/g9dcKpAm8MJMesvo= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= +github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/creack/pty v1.1.11 h1:07n33Z8lZxZ2qwegKbObQohDhXDQxiMMz1NOUGYlesw= +github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/cyphar/filepath-securejoin v0.2.2 h1:jCwT2GTP+PY5nBz3c/YL5PAIbusElVrPujOBSCj8xRg= +github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/daviddengcn/go-colortext v0.0.0-20160507010035-511bcaf42ccd/go.mod h1:dv4zxwHi5C/8AeI+4gX4dCWOIvNi7I6JCSX0HvlKPgE= +github.com/deislabs/oras v0.11.1 h1:oo2J/3vXdcti8cjFi8ghMOkx0OacONxHC8dhJ17NdJ0= +github.com/deislabs/oras v0.11.1/go.mod h1:39lCtf8Q6WDC7ul9cnyWXONNzKvabEKk+AX+L0ImnQk= +github.com/denisenkom/go-mssqldb v0.0.0-20191001013358-cfbb681360f0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= +github.com/dexidp/dex v0.0.0-20210802203454-3fac2ab6bc3b h1:ovHbNjGAQsGEs67tYU6C6ex2D2shDkeZ7pPprx58f2k= +github.com/dexidp/dex v0.0.0-20210802203454-3fac2ab6bc3b/go.mod h1:g64CEwk9b4oLTREOu8mFkjTkDUvyxzWGqhnPwQlfrq8= +github.com/dexidp/dex/api/v2 v2.0.0/go.mod h1:k5arBJT1QYvpsEY3sEd0NXJp3hKWKuUUfzJ3BlcqPdM= +github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/docker/cli v20.10.5+incompatible h1:bjflayQbWg+xOkF2WPEAOi4Y7zWhR7ptoPhV/VqLVDE= +github.com/docker/cli v20.10.5+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/distribution v2.6.0-rc.1.0.20170726174610-edc3ab29cdff+incompatible h1:357nGVUC8gSpeSc2Axup8HfrfTLLUfWfCsCUhiQSKIg= +github.com/docker/distribution v2.6.0-rc.1.0.20170726174610-edc3ab29cdff+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/docker v0.0.0-20180502112750-51a9119f6b81 h1:VnJAjP/7FbY46wddaiKakrc1ogXW+3MlP7cg+S4j4Og= +github.com/docker/docker v0.0.0-20180502112750-51a9119f6b81/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker-credential-helpers v0.6.3 h1:zI2p9+1NQYdnG6sMU26EX4aVGlqbInSQxQXLvzJ4RPQ= +github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y= +github.com/docker/go-connections v0.3.1-0.20180212134524-7beb39f0b969 h1:Z8LR4yJgA3vaXpBiUWcWdQZpB9h+dzj4NdLjP9Sfdb0= +github.com/docker/go-connections v0.3.1-0.20180212134524-7beb39f0b969/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= +github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= +github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7 h1:UhxFibDNY/bfvqU5CAUmr9zpesgbU6SWc8/B4mflAE4= +github.com/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= +github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= +github.com/dsnet/compress v0.0.1 h1:PlZu0n3Tuv04TzpfPbrnI0HW/YwodEXDS+oPKahKF0Q= +github.com/dsnet/compress v0.0.1/go.mod h1:Aw8dCMJ7RioblQeTqt88akK31OvO8Dhf5JflhBbQEHo= +github.com/dsnet/golib v0.0.0-20171103203638-1ea166775780/go.mod h1:Lj+Z9rebOhdfkVLjJ8T6VcRQv3SXugXy999NBtR9aFY= +github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= +github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= +github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= +github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= +github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153 h1:yUdfgN0XgIJw7foRItutHYUIhlcKzcSf5vDpdhQAKTc= +github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= +github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ= +github.com/evanphx/json-patch v4.5.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch v4.11.0+incompatible h1:glyUF9yIYtMHzn8xaKw5rMhdWcwsYV8dZHIq5567/xs= +github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d h1:105gxyaGwCFad8crR9dcMQWvV9Hvulu6hwUh4tWPJnM= +github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d/go.mod h1:ZZMPRZwes7CROmyNKgQzC3XPs6L/G2EJLHddWejkmf4= +github.com/fatih/camelcase v1.0.0/go.mod h1:yN2Sb0lFhZJUdVvtELVWefmrXpuZESvPmqwoZc+/fpc= +github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/felixge/httpsnoop v1.0.2 h1:+nS9g82KMXccJ/wp0zyRW9ZBHFETmMGtkk+2CTTrW4o= +github.com/felixge/httpsnoop v1.0.2/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= +github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= +github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= +github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fvbommel/sortorder v1.0.1/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0= +github.com/garyburd/redigo v1.6.2 h1:yE/pwKCrbLpLpQICzYTeZ7JsTA/C53wFTJHaEtRqniM= +github.com/garyburd/redigo v1.6.2/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gin-contrib/gzip v0.0.1 h1:ezvKOL6jH+jlzdHNE4h9h8q8uMpDQjyl0NN0Jd7jozc= +github.com/gin-contrib/gzip v0.0.1/go.mod h1:fGBJBCdt6qCZuCAOwWuFhBB4OOq9EFqlo5dEaFhhu5w= +github.com/gin-contrib/sse v0.0.0-20170109093832-22d885f9ecc7/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= +github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= +github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.3.0/go.mod h1:7cKuhb5qV2ggCFctp2fJQ+ErvciLZrIeoOSOm6mUr7Y= +github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM= +github.com/gin-gonic/gin v1.7.2 h1:Tg03T9yM2xa8j6I3Z3oqLaQRSmKvxPd6g/2HJ6zICFA= +github.com/gin-gonic/gin v1.7.2/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY= +github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= +github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= +github.com/go-asn1-ber/asn1-ber v1.5.1 h1:pDbRAunXzIUXfx4CB2QJFv5IuPiuoW+sWvr/Us009o8= +github.com/go-asn1-ber/asn1-ber v1.5.1/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0= +github.com/go-bindata/go-bindata v1.0.1-0.20190711162640-ee3c2418e368/go.mod h1:7xCgX1lzlrXPHkfvn3EhumqHkmSlzt8at9q7v0ax19c= +github.com/go-errors/errors v1.0.1 h1:LUHzmkK3GUKUrL/1gfBUxAHzcev3apQlezX/+O7ma6w= +github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= +github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= +github.com/go-ldap/ldap/v3 v3.3.0 h1:lwx+SJpgOHd8tG6SumBQZXCmNX51zM8B1cfxJ5gv4tQ= +github.com/go-ldap/ldap/v3 v3.3.0/go.mod h1:iYS1MdmrmceOJ1QOTnRXrIs7i3kloqtmGQjRvjKpyMg= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= +github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= +github.com/go-logr/logr v0.4.0 h1:K7/B1jt6fIBQVd4Owv2MqGQClcgf0R266+7C/QjRcLc= +github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= +github.com/go-logr/zapr v0.4.0 h1:uc1uML3hRYL9/ZZPdgHS/n8Nzo+eaYL/Efxkkamf7OM= +github.com/go-logr/zapr v0.4.0/go.mod h1:tabnROwaDl0UNxkVeFRbY8bwB37GwRv0P8lg6aAiEnk= +github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI= +github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= +github.com/go-openapi/analysis v0.18.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= +github.com/go-openapi/analysis v0.19.2/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk= +github.com/go-openapi/analysis v0.19.5/go.mod h1:hkEAkxagaIvIP7VTn8ygJNkd4kAYON2rCu0v0ObL0AU= +github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= +github.com/go-openapi/errors v0.18.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= +github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= +github.com/go-openapi/inflect v0.19.0/go.mod h1:lHpZVlpIQqLyKwJ4N+YSc9hchQy/i12fJykb83CRBH4= +github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= +github.com/go-openapi/jsonpointer v0.18.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= +github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= +github.com/go-openapi/jsonpointer v0.19.3 h1:gihV7YNZK1iK6Tgwwsxo2rJbD1GTbdm72325Bq8FI3w= +github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= +github.com/go-openapi/jsonreference v0.18.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= +github.com/go-openapi/jsonreference v0.19.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= +github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= +github.com/go-openapi/jsonreference v0.19.3 h1:5cxNfTy0UVC3X8JL5ymxzyoUZmo8iZb+jeTWn7tUa8o= +github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= +github.com/go-openapi/loads v0.17.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= +github.com/go-openapi/loads v0.18.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= +github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= +github.com/go-openapi/loads v0.19.2/go.mod h1:QAskZPMX5V0C2gvfkGZzJlINuP7Hx/4+ix5jWFxsNPs= +github.com/go-openapi/loads v0.19.4/go.mod h1:zZVHonKd8DXyxyw4yfnVjPzBjIQcLt0CCsn0N0ZrQsk= +github.com/go-openapi/runtime v0.0.0-20180920151709-4f900dc2ade9/go.mod h1:6v9a6LTXWQCdL8k1AO3cvqx5OtZY/Y9wKTgaoP6YRfA= +github.com/go-openapi/runtime v0.19.0/go.mod h1:OwNfisksmmaZse4+gpV3Ne9AyMOlP1lt4sK4FXt0O64= +github.com/go-openapi/runtime v0.19.4/go.mod h1:X277bwSUBxVlCYR3r7xgZZGKVvBd/29gLDlFGtJ8NL4= +github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= +github.com/go-openapi/spec v0.18.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= +github.com/go-openapi/spec v0.19.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= +github.com/go-openapi/spec v0.19.2/go.mod h1:sCxk3jxKgioEJikev4fgkNmwS+3kuYdJtcsZsD5zxMY= +github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= +github.com/go-openapi/spec v0.19.5 h1:Xm0Ao53uqnk9QE/LlYV5DEU09UAgpliA85QoT9LzqPw= +github.com/go-openapi/spec v0.19.5/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= +github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= +github.com/go-openapi/strfmt v0.18.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= +github.com/go-openapi/strfmt v0.19.0/go.mod h1:+uW+93UVvGGq2qGaZxdDeJqSAqBqBdl+ZPMF/cC8nDY= +github.com/go-openapi/strfmt v0.19.3/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= +github.com/go-openapi/strfmt v0.19.5/go.mod h1:eftuHTlB/dI8Uq8JJOyRlieZf+WkkxUuk0dgdHXr2Qk= +github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= +github.com/go-openapi/swag v0.18.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= +github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-openapi/swag v0.19.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tFY= +github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= +github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA= +github.com/go-openapi/validate v0.19.8/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85nY1c2z52x1Gk4= +github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A= +github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q= +github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= +github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no= +github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= +github.com/go-playground/validator/v10 v10.4.1 h1:pH2c5ADXtd66mxoE0Zm9SUhxE20r7aM3F26W0hOn+GE= +github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= +github.com/go-resty/resty/v2 v2.6.0 h1:joIR5PNLM2EFqqESUjCMGXrWmXNHEU9CEiK813oKYS4= +github.com/go-resty/resty/v2 v2.6.0/go.mod h1:PwvJS6hvaPkjtjNg9ph+VrSD92bi5Zq73w/BIH7cC3Q= +github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-sql-driver/mysql v1.5.1-0.20200311113236-681ffa848bae/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= +github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0= +github.com/gobuffalo/depgen v0.0.0-20190329151759-d478694a28d3/go.mod h1:3STtPUQYuzV0gBVOY3vy6CfMm/ljR4pABfrTeHNLHUY= +github.com/gobuffalo/depgen v0.1.0/go.mod h1:+ifsuy7fhi15RWncXQQKjWS9JPkdah5sZvtHc2RXGlg= +github.com/gobuffalo/envy v1.6.15/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= +github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= +github.com/gobuffalo/envy v1.7.1 h1:OQl5ys5MBea7OGCdvPbBJWRgnhC/fGona6QKfvFeau8= +github.com/gobuffalo/envy v1.7.1/go.mod h1:FurDp9+EDPE4aIUS3ZLyD+7/9fpx7YRt/ukY6jIHf0w= +github.com/gobuffalo/flect v0.1.0/go.mod h1:d2ehjJqGOH/Kjqcoz+F7jHTBbmDb38yXA598Hb50EGs= +github.com/gobuffalo/flect v0.1.1/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= +github.com/gobuffalo/flect v0.1.3/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= +github.com/gobuffalo/genny v0.0.0-20190329151137-27723ad26ef9/go.mod h1:rWs4Z12d1Zbf19rlsn0nurr75KqhYp52EAGGxTbBhNk= +github.com/gobuffalo/genny v0.0.0-20190403191548-3ca520ef0d9e/go.mod h1:80lIj3kVJWwOrXWWMRzzdhW3DsrdjILVil/SFKBzF28= +github.com/gobuffalo/genny v0.1.0/go.mod h1:XidbUqzak3lHdS//TPu2OgiFB+51Ur5f7CSnXZ/JDvo= +github.com/gobuffalo/genny v0.1.1/go.mod h1:5TExbEyY48pfunL4QSXxlDOmdsD44RRq4mVZ0Ex28Xk= +github.com/gobuffalo/gitgen v0.0.0-20190315122116-cc086187d211/go.mod h1:vEHJk/E9DmhejeLeNt7UVvlSGv3ziL+djtTr3yyzcOw= +github.com/gobuffalo/gogen v0.0.0-20190315121717-8f38393713f5/go.mod h1:V9QVDIxsgKNZs6L2IYiGR8datgMhB577vzTDqypH360= +github.com/gobuffalo/gogen v0.1.0/go.mod h1:8NTelM5qd8RZ15VjQTFkAW6qOMx5wBbW4dSCS3BY8gg= +github.com/gobuffalo/gogen v0.1.1/go.mod h1:y8iBtmHmGc4qa3urIyo1shvOD8JftTtfcKi+71xfDNE= +github.com/gobuffalo/here v0.6.0/go.mod h1:wAG085dHOYqUpf+Ap+WOdrPTp5IYcDAs/x7PLa8Y5fM= +github.com/gobuffalo/logger v0.0.0-20190315122211-86e12af44bc2/go.mod h1:QdxcLw541hSGtBnhUc4gaNIXRjiDppFGaDqzbrBd3v8= +github.com/gobuffalo/logger v1.0.1 h1:ZEgyRGgAm4ZAhAO45YXMs5Fp+bzGLESFewzAVBMKuTg= +github.com/gobuffalo/logger v1.0.1/go.mod h1:2zbswyIUa45I+c+FLXuWl9zSWEiVuthsk8ze5s8JvPs= +github.com/gobuffalo/mapi v1.0.1/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= +github.com/gobuffalo/mapi v1.0.2/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= +github.com/gobuffalo/packd v0.0.0-20190315124812-a385830c7fc0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= +github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= +github.com/gobuffalo/packd v0.3.0 h1:eMwymTkA1uXsqxS0Tpoop3Lc0u3kTfiMBE6nKtQU4g4= +github.com/gobuffalo/packd v0.3.0/go.mod h1:zC7QkmNkYVGKPw4tHpBQ+ml7W/3tIebgeo1b36chA3Q= +github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ= +github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0= +github.com/gobuffalo/packr/v2 v2.7.1 h1:n3CIW5T17T8v4GGK5sWXLVWJhCz7b5aNLSxW6gYim4o= +github.com/gobuffalo/packr/v2 v2.7.1/go.mod h1:qYEvAazPaVxy7Y7KR0W8qYEE+RymX74kETFqjFoFlOc= +github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw= +github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= +github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= +github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/godror/godror v0.13.3/go.mod h1:2ouUT4kdhUBk7TAkHWD4SN0CdI0pgEQbo8FVHhbSKWg= +github.com/gofrs/flock v0.8.0/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= +github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPhW6m+TnJw= +github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= +github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= +github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= +github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.3 h1:fHPg5GQYlCeLIPB9BZqMVR5nR9A+IM5zcgeTdjMYmLA= +github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golangplus/testing v0.0.0-20180327235837-af21d9c3145e/go.mod h1:0AA//k/eakGydO4jKRoRL2j92ZKSzTgj9tclaCrvXHk= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-github/v29 v29.0.2 h1:opYN6Wc7DOz7Ku3Oh4l7prmkOMwEcQxpFtxdU8N8Pts= +github.com/google/go-github/v29 v29.0.2/go.mod h1:CHKiKKPHJ0REzfwc14QMklvtHwCveD0PxlMjLlzAM5E= +github.com/google/go-github/v35 v35.3.0 h1:fU+WBzuukn0VssbayTT+Zo3/ESKX9JYWjbZTLOTEyho= +github.com/google/go-github/v35 v35.3.0/go.mod h1:yWB7uCcVWaUbUP74Aq3whuMySRMatyRmq5U9FTNlbio= +github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk= +github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= +github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210715191844-86eeefc3e471/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= +github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.2.0 h1:qJYtXnJRWmpe7m/3XlyhrsLrEURqHRM2kxzoxXqyUDs= +github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5 h1:sjZBwGj9Jlw33ImPtvFviGYvseOtDM7hkSKB7+Tv3SM= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/googleapis/gnostic v0.4.1 h1:DLJCy1n/vrD4HPjOvYcT8aYQXpPIzoRZONaYwyycI+I= +github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= +github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= +github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= +github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= +github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= +github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gosuri/uitable v0.0.4 h1:IG2xLKRvErL3uhY6e1BylFzG+aJiwQviDDTfOKeKTpY= +github.com/gosuri/uitable v0.0.4/go.mod h1:tKR86bXuXPZazfOTG1FIzvjIdXzd0mo4Vtn16vt0PJo= +github.com/gotestyourself/gotestyourself v2.2.0+incompatible h1:AQwinXlbQR2HvPjQZOmDhRqsv5mZf+Jb1RnSLxcqZcI= +github.com/gotestyourself/gotestyourself v2.2.0+incompatible/go.mod h1:zZKM6oeNM8k+FRljX1mnzVYeS8wiGgQyvST1/GafPbY= +github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= +github.com/gregjones/httpcache v0.0.0-20181110185634-c63ab54fda8f h1:ShTPMJQes6tubcjzGMODIVG5hlrCeImaBnZzKF2N8SM= +github.com/gregjones/httpcache v0.0.0-20181110185634-c63ab54fda8f/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= +github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= +github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM= +github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-hclog v0.9.2 h1:CG6TE5H9/JXsFWJCfoIVpKFIkFe6ysEuHirp4DxCsHI= +github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= +github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= +github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= +github.com/hashicorp/go-retryablehttp v0.6.8 h1:92lWxgpa+fF3FozM4B3UZtHZMJX8T5XT+TFdCxsPyWs= +github.com/hashicorp/go-retryablehttp v0.6.8/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= +github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= +github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= +github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= +github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= +github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/huandu/xstrings v1.3.1 h1:4jgBlKK6tLKFvO8u5pmYjG91cqytmDCDvGh7ECVFfFs= +github.com/huandu/xstrings v1.3.1/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= +github.com/huaweicloud/huaweicloud-sdk-go-v3 v0.0.50 h1:nQ1QIkLxAoFsYyjvpQH3gVIy3mHfI0WDYEWdmwwxSG0= +github.com/huaweicloud/huaweicloud-sdk-go-v3 v0.0.50/go.mod h1:Pp3sd2tx3j9qC7Ij6jGh5phZwTrI+/HUBK90f3Cn2CI= +github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= +github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= +github.com/jasonlvhit/gocron v0.0.0-20171226191223-3c914c8681c3 h1:s2ARkZWJfkyjrUi8Dj0mMbc1inxeOnIrO9zc3oQX8iU= +github.com/jasonlvhit/gocron v0.0.0-20171226191223-3c914c8681c3/go.mod h1:rwi/esz/h+4oWLhbWWK7f6dtmgLzxeZhnwGr7MCsTNk= +github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4= +github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= +github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jinzhu/now v1.1.2 h1:eVKgfIdy9b6zbWBMgFpfDPoAMifwSZagU9HmEU6zgiI= +github.com/jinzhu/now v1.1.2/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= +github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= +github.com/jmoiron/sqlx v1.3.1 h1:aLN7YINNZ7cYOPK3QC83dbM6KT0NMqVMw961TqrejlE= +github.com/jmoiron/sqlx v1.3.1/go.mod h1:2BljVx/86SuTyjE+aPYlHCTNvZrnJXghYGpNiXLBMCQ= +github.com/joho/godotenv v1.3.0 h1:Zjp+RcGpHhGlrMbJzXTrZZPrWj+1vfm90La1wgB6Bhc= +github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= +github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/jonboulle/clockwork v0.2.0/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= +github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= +github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.11 h1:uVUAXhF2To8cbw/3xN3pxj6kk7TYKs98NIrTqPlMWAQ= +github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 h1:iQTw/8FWTuc7uiaSepXwyf3o52HaUYcV+Tu66S3F5GA= +github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8= +github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4= +github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= +github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.9.5 h1:U+CaK85mrNNb4k8BNOfgJtJ/gr6kswUCFj6miSzVC6M= +github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 h1:SOEGU9fKiNWd/HOJuq6+3iTQz8KNCLtVX6idSoTLdUw= +github.com/lann/builder v0.0.0-20180802200727-47ae307949d0/go.mod h1:dXGbAdH5GtBTC4WfIxhKZfyBF/HBFgRZSWwZ9g/He9o= +github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 h1:P6pPBnrTSX3DEVR4fDembhRWSsG5rVo6hYhAB/ADZrk= +github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0/go.mod h1:vmVJ0l/dxyfGW6FmdpVm2joNMFikkuWg0EoCKLGUMNw= +github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= +github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= +github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.10.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lib/pq v1.10.2 h1:AqzbZs4ZoCBp+GtejcpCpcxM3zlSMx29dXbUSeVtJb8= +github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de h1:9TO3cAIGXtEhnIaL+V+BEER86oLrvS+kWobKpbJuye0= +github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE= +github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= +github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= +github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= +github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= +github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.5 h1:b6kJs+EmPFMYGkow9GiUyCyOvIwYetYJ3fSaWak/Gls= +github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.7.0 h1:aizVhC/NAAcKWb+5QsU1iNOZb4Yws5UO2I+aIprQITM= +github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= +github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE= +github.com/markbates/pkger v0.17.1/go.mod h1:0JoVlrol20BSywW79rN3kdFFsE5xYM+rSCQDXbLhiuI= +github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0= +github.com/mattermost/xml-roundtrip-validator v0.1.0/go.mod h1:qccnGMcpgwcNaBnxqpJpWWUiPNr5H3O8eDgGV9gT5To= +github.com/mattn/go-colorable v0.0.9 h1:UVL0vNpWh04HeJXV0KLcaT7r06gOH2l4OW6ddYRUIY4= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-oci8 v0.0.7/go.mod h1:wjDx6Xm9q7dFtHJvIlrI99JytznLw5wQ4R+9mNXJwGI= +github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= +github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-shellwords v1.0.11/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= +github.com/mattn/go-sqlite3 v1.12.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= +github.com/mattn/go-sqlite3 v1.14.8 h1:gDp86IdQsN/xWjIEmr9MF6o9mpksUgh0fu+9ByFxzIU= +github.com/mattn/go-sqlite3 v1.14.8/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= +github.com/mattomatic/dijkstra v0.0.0-20130617153013-6f6d134eb237 h1:acuCHBjzG7MFTugvx3buC4m5rLDLaKC9J8C9jtlraRc= +github.com/mattomatic/dijkstra v0.0.0-20130617153013-6f6d134eb237/go.mod h1:UOnLAUmVG5paym8pD3C4B9BQylUDC2vXFJJpT7JrlEA= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= +github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= +github.com/mitchellh/copystructure v1.1.1 h1:Bp6x9R1Wn16SIz3OfeDr0b7RnCG2OB66Y7PQyC/cvq4= +github.com/mitchellh/copystructure v1.1.1/go.mod h1:EBArHfARyrSWO/+Wyr9zwEkc6XMFB9XyNgFNmRkZZU4= +github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/go-wordwrap v1.0.0 h1:6GlHJ/LTGMrIJbwgdqdl2eEH8o+Exx/0m8ir9Gns0u4= +github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= +github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= +github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= +github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag= +github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/mitchellh/reflectwalk v1.0.1 h1:FVzMWA5RllMAKIdUSC8mdWo3XtwoecrH79BY70sEEpE= +github.com/mitchellh/reflectwalk v1.0.1/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/mittwald/go-helm-client v0.8.0 h1:k8yMvoWE7C+jJgw6iodJ0U5nY4hVpLU20VIpR+FfyJk= +github.com/mittwald/go-helm-client v0.8.0/go.mod h1:+Ks5OpzB0hJw91W8o/8G+FmjUtjrIXxPuJjE87XG/G0= +github.com/moby/spdystream v0.2.0 h1:cjW1zVyyoiM0T7b6UoySUFqzXMoqRckQtXwGPiBhOM8= +github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= +github.com/moby/term v0.0.0-20201216013528-df9cb8a40635/go.mod h1:FBS0z0QWA44HXygs7VXDUOGoN/1TV3RuWkLO04am3wc= +github.com/moby/term v0.0.0-20210610120745-9d4ed1856297 h1:yH0SvLzcbZxcJXho2yh7CqdENGMQe73Cw3woZBpPli0= +github.com/moby/term v0.0.0-20210610120745-9d4ed1856297/go.mod h1:vgPCkQMyxTZ7IDy8SXRufE172gr8+K/JE/7hHFxHW3A= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 h1:n6/2gBQ3RWajuToeY6ZtZTIKv2v7ThUy5KKusIT0yc0= +github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00/go.mod h1:Pm3mSP3c5uWn86xMLZ5Sa7JB9GsEZySvHYXCTK4E9q4= +github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= +github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= +github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f h1:y5//uYreIhSUg3J1GEMiLbxo1LJaP8RfCpH6pymGZus= +github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= +github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= +github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= +github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= +github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= +github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/nsqio/go-nsq v1.0.7 h1:O0pIZJYTf+x7cZBA0UMY8WxFG79lYTURmWzAAh48ljY= +github.com/nsqio/go-nsq v1.0.7/go.mod h1:XP5zaUs3pqf+Q71EqUJs3HYfBIqfK6G83WQMdNN+Ito= +github.com/nwaples/rardecode v1.0.0 h1:r7vGuS5akxOnR4JQSkko62RJ1ReCMXxQRPtxsiFMBOs= +github.com/nwaples/rardecode v1.0.0/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWkRpHbbfGS0= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= +github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= +github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= +github.com/oklog/run v1.1.0/go.mod h1:sVPdnTZT1zYwAJeCMu2Th4T21pA3FPOQRfWjQlk7DVU= +github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= +github.com/olekukonko/tablewriter v0.0.1/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= +github.com/olekukonko/tablewriter v0.0.2/go.mod h1:rSAaSIOAGT9odnlyGlUfAJaoc5w2fSBUmeGDbRWPxyQ= +github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= +github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= +github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= +github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= +github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.15.0 h1:WjP/FQ/sk43MRmnEcT+MlDw2TFvkrXlprrPST/IudjU= +github.com/onsi/gomega v1.15.0/go.mod h1:cIuvLEne0aoVhAgh/O6ac0Op8WWw9H6eYCriF+tEHG0= +github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= +github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= +github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= +github.com/opencontainers/image-spec v1.0.1 h1:JMemWkRwHx4Zj+fVxWoMCFm/8sYGGrUVojFA6h/TRcI= +github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v0.1.1 h1:GlxAyO6x8rfZYN9Tt0Kti5a/cP41iuiO2yYT0IJGY8Y= +github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/selinux v1.6.0 h1:+bIAS/Za3q5FTwWym4fTB0vObnfCf3G/NC7K6Jx62mY= +github.com/opencontainers/selinux v1.6.0/go.mod h1:VVGKuOLlE7v4PJyT6h7mNWvq1rzqiriPsEqVhc+svHE= +github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= +github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= +github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= +github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= +github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= +github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= +github.com/otiai10/copy v1.6.0 h1:IinKAryFFuPONZ7cm6T6E2QX/vcJwSnlaA5lfoaXIiQ= +github.com/otiai10/copy v1.6.0/go.mod h1:XWfuS3CrI0R6IE0FbgHsEazaXO8G0LpMp9o8tos0x4E= +github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE= +github.com/otiai10/curr v1.0.0/go.mod h1:LskTG5wDwr8Rs+nNQ+1LlxRjAtTZZjtJW4rMXl6j4vs= +github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo= +github.com/otiai10/mint v1.3.2 h1:VYWnrP5fXmz1MXvjuUvcBrXSjGE6xjON+axB/UrpO3E= +github.com/otiai10/mint v1.3.2/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc= +github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= +github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE= +github.com/pelletier/go-toml v1.9.3 h1:zeC5b1GviRUyKYd6OJPvBU/mcVDVoL1OhT17FCt5dSQ= +github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= +github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI= +github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= +github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2 h1:JhzVVoYvbOACxoUmOs6V/G4D5nPVUW73rKvXxP4XUJc= +github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2/go.mod h1:iIss55rKnNBTvrwdmkUpLnDpZoAHvWaiq5+iMmen4AE= +github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= +github.com/pierrec/lz4 v2.0.5+incompatible h1:2xWsjqPFWcplujydGg4WmhC/6fZqK42wMM8aXeqhl0I= +github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= +github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= +github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= +github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= +github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= +github.com/prometheus/client_golang v1.11.0 h1:HNkLOAEQMIDv/K+04rukrLx6ch7msSRwf3/SASFAGtQ= +github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= +github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= +github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= +github.com/prometheus/common v0.26.0 h1:iMAkS2TDoNWnKM+Kopnx/8tnEStIfpYA0ur0xQzzhMQ= +github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= +github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= +github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.6.0 h1:mxy4L2jP6qMonqmq+aTtOx1ifVWUgG/TAmntgbh3xv4= +github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/rfyiamcool/cronlib v1.0.0 h1:PNTF7pgtbL7TedrqnC6syhHwj4d1bCKxH3XmPqqgxvg= +github.com/rfyiamcool/cronlib v1.0.0/go.mod h1:i7AVVUhM/kkNcC/Ayq0XOmyCJCcqa/FlflyYQMm5QWE= +github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.3.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.4.0 h1:LUa41nrWTQNGhzdsZ5lTnkwbNjj6rXTdazA1cSdjkOY= +github.com/rogpeppe/go-internal v1.4.0/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rubenv/sql-migrate v0.0.0-20200616145509-8d140a17f351 h1:HXr/qUllAWv9riaI4zh2eXWKmCSDqVS/XH1MRHLKRwk= +github.com/rubenv/sql-migrate v0.0.0-20200616145509-8d140a17f351/go.mod h1:DCgfY80j8GYL7MLEfvcpSFvjD0L5yZq/aZUJmhZklyg= +github.com/russellhaering/goxmldsig v1.1.0/go.mod h1:QK8GhXPB3+AfuCrfo0oRISa9NfzeCpWmxeGnqEpDF9o= +github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= +github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= +github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= +github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= +github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= +github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= +github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ= +github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= +github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72 h1:qLC7fQah7D6K1B0ujays3HV9gkFtllcxhzImRR7ArPQ= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +github.com/spf13/afero v1.6.0 h1:xoax2sJ2DT8S8xA2paPFjDCScCNeWsg75VG0DLRreiY= +github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.3.1 h1:nFm6S0SMdyzrzcmThSipiEubIDy8WEXKNZ0UOgiRpng= +github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= +github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= +github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= +github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= +github.com/spf13/cobra v1.2.1 h1:+KmjbUw1hriSNMF55oPrkZcb27aECyrj8V2ytv7kWDw= +github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= +github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= +github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.1-0.20171106142849-4c012f6dcd95/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= +github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= +github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= +github.com/spf13/viper v1.8.1 h1:Kq1fyeebqsBfbjZj4EL7gj2IO0mMaiyjYUWcUsl2O44= +github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= +github.com/stevvooe/resumable v0.0.0-20180830230917-22b14a53ba50 h1:4bT0pPowCpQImewr+BjzfUKcuFW+KVyB8d1OF3b6oTI= +github.com/stevvooe/resumable v0.0.0-20180830230917-22b14a53ba50/go.mod h1:1pdIZTAHUz+HDKDVZ++5xg/duPlhKAIzw9qy42CWYp4= +github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48= +github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= +github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/swaggo/files v0.0.0-20190704085106-630677cd5c14 h1:PyYN9JH5jY9j6av01SpfRMb+1DWg/i3MbGOKPxJ2wjM= +github.com/swaggo/files v0.0.0-20190704085106-630677cd5c14/go.mod h1:gxQT6pBGRuIGunNf/+tSOB5OHvguWi8Tbt82WOkf35E= +github.com/swaggo/gin-swagger v1.3.0 h1:eOmp7r57oUgZPw2dJOjcGNMse9cvXcI4tTqBcnZtPsI= +github.com/swaggo/gin-swagger v1.3.0/go.mod h1:oy1BRA6WvgtCp848lhxce7BnWH4C8Bxa0m5SkWx+cS0= +github.com/swaggo/swag v1.5.1 h1:2Agm8I4K5qb00620mHq0VJ05/KT4FtmALPIcQR9lEZM= +github.com/swaggo/swag v1.5.1/go.mod h1:1Bl9F/ZBpVWh22nY0zmYyASPO1lI/zIwRDrpZU+tv8Y= +github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4= +github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= +github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= +github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= +github.com/ugorji/go v1.1.13 h1:nB3O5kBSQGjEQAcfe1aLUYuxmXdFKmYgBZhY32rQb6Q= +github.com/ugorji/go v1.1.13/go.mod h1:jxau1n+/wyTGLQoCkjok9r5zFa/FxT6eI5HiHKQszjc= +github.com/ugorji/go/codec v0.0.0-20181022190402-e5e69e061d4f/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= +github.com/ugorji/go/codec v1.1.13 h1:013LbFhocBoIqgHeIHKlV4JWYhqogATYWZhIcH0WHn4= +github.com/ugorji/go/codec v1.1.13/go.mod h1:oNVt3Dq+FO91WNQ/9JnHKQP2QJxTzoN7wCBFCq1OeuU= +github.com/ulikunitz/xz v0.5.6 h1:jGHAfXawEGZQ3blwU5wnWKQJvAraT7Ftq9EXjnXYgt8= +github.com/ulikunitz/xz v0.5.6/go.mod h1:2bypXElzHzzJZwzH67Y6wb67pO62Rzfn7BSiF4ABRW8= +github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= +github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= +github.com/willf/bitset v1.1.11-0.20200630133818-d5bec3311243 h1:R43TdZy32XXSXjJn7M/HhALJ9imq6ztLnChfYJpVDnM= +github.com/willf/bitset v1.1.11-0.20200630133818-d5bec3311243/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= +github.com/xanzy/go-gitlab v0.50.0 h1:t7IoYTrnLSbdEZN7d8X/5zcr+ZM4TZQ2mXa8MqWlAZQ= +github.com/xanzy/go-gitlab v0.50.0/go.mod h1:Q+hQhV508bDPoBijv7YjK/Lvlb4PhVhJdKqXVQrUoAE= +github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c h1:u40Z8hqBAAQyv+vATcGgV0YCnDjqSL7/q/JyPhhJSPk= +github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= +github.com/xdg/stringprep v0.0.0-20180714160509-73f8eece6fdc h1:n+nNi93yXLkJvKwXNP9d55HC7lGK4H/SRcwB5IaUZLo= +github.com/xdg/stringprep v0.0.0-20180714160509-73f8eece6fdc/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= +github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= +github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 h1:nIPpBwaJSVYIxUFsDv3M8ofmx9yWTog9BfvIu0q41lo= +github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8/go.mod h1:HUYIGzjTL3rfEspMxjDjgmT5uz5wzYJKVo23qUhYTos= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca h1:1CFlNzQhALwjS9mBAUkycX616GzgsuYUOCHA5+HSlXI= +github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA= +github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yvasiyarov/go-metrics v0.0.0-20150112132944-c25f46c4b940 h1:p7OofyZ509h8DmPLh8Hn+EIIZm/xYhdZHJ9GnXHdr6U= +github.com/yvasiyarov/go-metrics v0.0.0-20150112132944-c25f46c4b940/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs= +github.com/yvasiyarov/gorelic v0.0.7 h1:4DTF1WOM2ZZS/xMOkTFBOcb6XiHu/PKn3rVo6dbewQE= +github.com/yvasiyarov/gorelic v0.0.7/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA= +github.com/yvasiyarov/newrelic_platform_go v0.0.0-20160601141957-9c099fbc30e9 h1:AsFN8kXcCVkUFHyuzp1FtYbzp1nCO/H6+1uPSGEyPzM= +github.com/yvasiyarov/newrelic_platform_go v0.0.0-20160601141957-9c099fbc30e9/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg= +github.com/ziutek/mymysql v1.5.4 h1:GB0qdRGsTwQSBVYuVShFBKaXSnSnYYC2d9knnE1LHFs= +github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0= +go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= +go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= +go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg= +go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= +go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= +go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= +go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= +go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= +go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= +go.mongodb.org/mongo-driver v1.1.2/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= +go.mongodb.org/mongo-driver v1.5.0 h1:REddm85e1Nl0JPXGGhgZkgJdG/yOe6xvpXUcYK5WLt0= +go.mongodb.org/mongo-driver v1.5.0/go.mod h1:boiGPFqyBs5R0R5qf2ErokGRekMfwn+MqKaUyHs7wy0= +go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= +go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= +go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= +go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4= +go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= +go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM= +go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= +go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= +go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= +go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE= +go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE= +go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5 h1:+FNtrFTmVw0YZGpBGX56XDee331t6JAXeK2bcyhLOOc= +go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5/go.mod h1:nmDLcffg48OtT/PSW0Hg7FvpRQsQh5OSqIylirxKC7o= +go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/goleak v1.1.10 h1:z+mqJhf6ss6BSfSM671tgKyZBFPTTJM+HLxnhPC3wu0= +go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= +go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= +go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= +go.uber.org/zap v1.19.0 h1:mZQZefskPPCMIBCSEH0v2/iUqqLrYtaeqwD6FUGUnFE= +go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190621222207-cc06ce4a13d4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200414173820-0848c9571904/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2 h1:It14KIkyBFYkHkwZ7k45minvA9aorojkyjGk9KJ5B/w= +golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.1-0.20200828183125-ce943fd02449/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190320064053-1272bf9dcd53/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190611141213-3f473d35a33a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200505041828-1ed23360d12c/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210224082022-3d97a244fca7/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= +golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420 h1:a8jGStKg0XqKDlKqjLrXn0ioF5MH36pT7Z0BRTqLhbk= +golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20181106182150-f42d05182288/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914 h1:3B43BWw0xEBsLZ/NO1VALz6fppU3481pik+2Ksv45z8= +golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181228144115-9a3f9b0469bb/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190321052220-f7bb7a8bee54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190515120540-06a5c4944438/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190531175056-4c3a928424d2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190610200419-93c9922d18ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191002063906-3421d5a6bb1c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200120151820-655fe14d7479/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200831180312-196b9ba8737a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210817190340-bfb29a6856f2 h1:c8PlLMqBbOHoqtjteWm5/kbe6rNY2pbRfbIMVnepueo= +golang.org/x/sys v0.0.0-20210817190340-bfb29a6856f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d h1:SZxvLBoTP5yHO3Frd4z4vrF+DBX9vMVanchswa69toE= +golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac h1:7zkz7BUtwNFFqcowJ+RIgu2MaV/MapERkDIy+mwPyjs= +golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190125232054-d66bd3c5d5a6/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190329151228-23e29df326fe/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190416151739-9c9e1878f421/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190606050223-4d9ae51c2468/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190611222205-d73e1c7e250b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190617190820-da514acc4774/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191004055002-72853e10c5a3/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.5 h1:ouewzE6p+/VEB31YYnTbEJdi8pFqKp4P4n85vwo3DHA= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gomodules.xyz/jsonpatch/v2 v2.2.0 h1:4pT439QV83L+G9FkcCriY6EkpcK6r6bK+A5FBUMI7qY= +gomodules.xyz/jsonpatch/v2 v2.2.0/go.mod h1:WXp+iVDkoLQqPudfQ9GBlwB2eZ5DKOnjQZCYdOS8GPY= +google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= +google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= +google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= +google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= +google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= +google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= +google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= +google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= +google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= +google.golang.org/api v0.52.0 h1:m5FLEd6dp5CU1F0tMWyqDi2XjchviIz8ntzOSz7w8As= +google.golang.org/api v0.52.0/go.mod h1:Him/adpjt0sxtkWViy0b6xyKW/SD71CwdJ7HqJo7SrU= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= +google.golang.org/genproto v0.0.0-20210721163202-f1cecdd8b78a/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210722135532-667f2b7c528f h1:YORWxaStkWBnWgELOHTmDrqNlFXuVGEbhwbB5iK94bQ= +google.golang.org/genproto v0.0.0-20210722135532-667f2b7c528f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= +google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.39.0 h1:Klz8I9kdtkIN6EpHHUOMLCYhTn/2WAe5a0s1hcBkdTI= +google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= +gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= +gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= +gopkg.in/gorp.v1 v1.7.2 h1:j3DWlAyGVv8whO7AcIWznQ2Yj7yJkn34B8s63GViAAw= +gopkg.in/gorp.v1 v1.7.2/go.mod h1:Wo3h+DBQZIxATwftsglhdD/62zRFPhGhTiu5jUJmCaw= +gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.62.0 h1:duBzk771uxoUuOlyRLkHsygud9+5lrlGjdFBb4mSKDU= +gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/mholt/archiver.v3 v3.1.1 h1:sLb5X5fPPc9oU6YatdC+vbY46irElT3kPR0wOS7bjR4= +gopkg.in/mholt/archiver.v3 v3.1.1/go.mod h1:EwJV1tr6GQdNZ5IFFVakh0aYAjGLVjqvFVL/b8ZVdMw= +gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= +gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= +gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/square/go-jose.v2 v2.6.0 h1:NGk74WTnPKBNUhNzQX7PYcTLUjoq7mzKk2OKbvwk2iI= +gopkg.in/square/go-jose.v2 v2.6.0/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= +gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gorm.io/driver/mysql v1.1.2 h1:OofcyE2lga734MxwcCW9uB4mWNXMr50uaGRVwQL2B0M= +gorm.io/driver/mysql v1.1.2/go.mod h1:4P/X9vSc3WTrhTLZ259cpFd6xKNYiSSdSZngkSBGIMM= +gorm.io/gorm v1.21.12/go.mod h1:F+OptMscr0P2F2qU97WT1WimdH9GaQPoDW7AYd5i2Y0= +gorm.io/gorm v1.21.16 h1:YBIQLtP5PLfZQz59qfrq7xbrK7KWQ+JsXXCH/THlMqs= +gorm.io/gorm v1.21.16/go.mod h1:F+OptMscr0P2F2qU97WT1WimdH9GaQPoDW7AYd5i2Y0= +gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= +gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= +gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= +gotest.tools/v3 v3.0.3 h1:4AuOwCGf4lLR9u3YOe2awrHygurzhO/HeQ6laiA6Sx0= +gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= +helm.sh/helm/v3 v3.6.2 h1:7YbEhLC6AUgmcDoh5BGFUGNtR/o43pr0AIelSNjhuFU= +helm.sh/helm/v3 v3.6.2/go.mod h1:mIIus8EOqj+obtycw3sidsR4ORr2aFDmXMSI3k+oeVY= +honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +k8s.io/api v0.21.0 h1:gu5iGF4V6tfVCQ/R+8Hc0h7H1JuEhzyEi9S4R5LM8+Y= +k8s.io/api v0.21.0/go.mod h1:+YbrhBBGgsxbF6o6Kj4KJPJnBmAKuXDeS3E18bgHNVU= +k8s.io/apiextensions-apiserver v0.21.0 h1:Nd4uBuweg6ImzbxkC1W7xUNZcCV/8Vt10iTdTIVF3hw= +k8s.io/apiextensions-apiserver v0.21.0/go.mod h1:gsQGNtGkc/YoDG9loKI0V+oLZM4ljRPjc/sql5tmvzc= +k8s.io/apimachinery v0.21.0 h1:3Fx+41if+IRavNcKOz09FwEXDBG6ORh6iMsTSelhkMA= +k8s.io/apimachinery v0.21.0/go.mod h1:jbreFvJo3ov9rj7eWT7+sYiRx+qZuCYXwWT1bcDswPY= +k8s.io/apiserver v0.21.0 h1:1hWMfsz+cXxB77k6/y0XxWxwl6l9OF26PC9QneUVn1Q= +k8s.io/apiserver v0.21.0/go.mod h1:w2YSn4/WIwYuxG5zJmcqtRdtqgW/J2JRgFAqps3bBpg= +k8s.io/cli-runtime v0.21.0 h1:/V2Kkxtf6x5NI2z+Sd/mIrq4FQyQ8jzZAUD6N5RnN7Y= +k8s.io/cli-runtime v0.21.0/go.mod h1:XoaHP93mGPF37MkLbjGVYqg3S1MnsFdKtiA/RZzzxOo= +k8s.io/client-go v0.21.0 h1:n0zzzJsAQmJngpC0IhgFcApZyoGXPrDIAD601HD09ag= +k8s.io/client-go v0.21.0/go.mod h1:nNBytTF9qPFDEhoqgEPaarobC8QPae13bElIVHzIglA= +k8s.io/code-generator v0.21.0/go.mod h1:hUlps5+9QaTrKx+jiM4rmq7YmH8wPOIko64uZCHDh6Q= +k8s.io/component-base v0.21.0/go.mod h1:qvtjz6X0USWXbgmbfXR+Agik4RZ3jv2Bgr5QnZzdPYw= +k8s.io/component-base v0.22.1 h1:SFqIXsEN3v3Kkr1bS6rstrs1wd45StJqbtgbQ4nRQdo= +k8s.io/component-base v0.22.1/go.mod h1:0D+Bl8rrnsPN9v0dyYvkqFfBeAd4u7n77ze+p8CMiPo= +k8s.io/component-helpers v0.21.0/go.mod h1:tezqefP7lxfvJyR+0a+6QtVrkZ/wIkyMLK4WcQ3Cj8U= +k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/gengo v0.0.0-20201214224949-b6c5ce23f027/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= +k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= +k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= +k8s.io/klog/v2 v2.8.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= +k8s.io/klog/v2 v2.9.0 h1:D7HV+n1V57XeZ0m6tdRkfknthUaM06VFbWldOFh8kzM= +k8s.io/klog/v2 v2.9.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= +k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7 h1:vEx13qjvaZ4yfObSSXW7BrMc/KQBBT/Jyee8XtLf4x0= +k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7/go.mod h1:wXW5VT87nVfh/iLV8FpR2uDvrFyomxbtb1KivDbvPTE= +k8s.io/kubectl v0.21.0 h1:WZXlnG/yjcE4LWO2g6ULjFxtzK6H1TKzsfaBFuVIhNg= +k8s.io/kubectl v0.21.0/go.mod h1:EU37NukZRXn1TpAkMUoy8Z/B2u6wjHDS4aInsDzVvks= +k8s.io/metrics v0.21.0/go.mod h1:L3Ji9EGPP1YBbfm9sPfEXSpnj8i24bfQbAFAsW0NueQ= +k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20210707171843-4b05e18ac7d9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20210802155522-efc7438f0176 h1:Mx0aa+SUAcNRQbs5jUzV8lkDlGFU8laZsY9jrcVX5SY= +k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/letsencrypt v0.0.3 h1:H7xDfhkaFFSYEJlKeq38RwX2jYcnTeHuDQyT+mMNMwM= +rsc.io/letsencrypt v0.0.3/go.mod h1:buyQKZ6IXrRnB7TdkHP0RyEybLx18HHyOSoTyoOLqNY= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= +sigs.k8s.io/controller-runtime v0.10.0 h1:HgyZmMpjUOrtkaFtCnfxsR1bGRuFoAczSNbn2MoKj5U= +sigs.k8s.io/controller-runtime v0.10.0/go.mod h1:GCdh6kqV6IY4LK0JLwX0Zm6g233RtVGdb/f0+KSfprg= +sigs.k8s.io/kustomize/api v0.8.5 h1:bfCXGXDAbFbb/Jv5AhMj2BB8a5VAJuuQ5/KU69WtDjQ= +sigs.k8s.io/kustomize/api v0.8.5/go.mod h1:M377apnKT5ZHJS++6H4rQoCHmWtt6qTpp3mbe7p6OLY= +sigs.k8s.io/kustomize/cmd/config v0.9.7/go.mod h1:MvXCpHs77cfyxRmCNUQjIqCmZyYsbn5PyQpWiq44nW0= +sigs.k8s.io/kustomize/kustomize/v4 v4.0.5/go.mod h1:C7rYla7sI8EnxHE/xEhRBSHMNfcL91fx0uKmUlUhrBk= +sigs.k8s.io/kustomize/kyaml v0.10.15 h1:dSLgG78KyaxN4HylPXdK+7zB3k7sW6q3IcCmcfKA+aI= +sigs.k8s.io/kustomize/kyaml v0.10.15/go.mod h1:mlQFagmkm1P+W4lZJbJ/yaxMd8PqMRSC4cPcfUVt5Hg= +sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= +sigs.k8s.io/structured-merge-diff/v4 v4.1.0 h1:C4r9BgJ98vrKnnVCjwCSXcWjWe0NKcUQkmzDXZXGwH8= +sigs.k8s.io/structured-merge-diff/v4 v4.1.0/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= +sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= +sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= +sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= +sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= diff --git a/pkg/microservice/systemconfig/core/service/types.go b/pkg/microservice/systemconfig/core/service/types.go index f9f45d74e..90c22df8e 100644 --- a/pkg/microservice/systemconfig/core/service/types.go +++ b/pkg/microservice/systemconfig/core/service/types.go @@ -19,7 +19,6 @@ package service import ( "encoding/json" - "github.com/coreos/go-oidc/v3/oidc" "github.com/dexidp/dex/connector/gitea" "github.com/dexidp/dex/connector/github" "github.com/dexidp/dex/connector/gitlab" @@ -27,6 +26,7 @@ import ( "github.com/dexidp/dex/connector/ldap" "github.com/dexidp/dex/connector/linkedin" "github.com/dexidp/dex/connector/microsoft" + "github.com/dexidp/dex/connector/oidc" ) type ConnectorType string diff --git a/pkg/microservice/user/config/config.go b/pkg/microservice/user/config/config.go index 160295d1b..5999c8177 100644 --- a/pkg/microservice/user/config/config.go +++ b/pkg/microservice/user/config/config.go @@ -17,24 +17,18 @@ limitations under the License. package config import ( - "strconv" "strings" "github.com/spf13/viper" _ "github.com/koderover/zadig/pkg/config" "github.com/koderover/zadig/pkg/setting" - "github.com/koderover/zadig/pkg/tool/log" ) func IssuerURL() string { return viper.GetString(setting.ENVIssuerURL) } -func Debug() string { - return viper.GetString(setting.ENVDebug) -} - func ClientID() string { return viper.GetString(setting.ENVClientID) } @@ -56,9 +50,5 @@ func MysqlUserDB() string { } func TokenExpiresAt() int { - expiresAt, err := strconv.Atoi(viper.GetString(setting.ENVTokenExpiresAt)) - if err != nil { - log.Panic(err) - } - return expiresAt + return viper.GetInt(setting.ENVTokenExpiresAt) } diff --git a/pkg/microservice/user/config/consts.go b/pkg/microservice/user/config/consts.go index e7c7dca3f..11887903a 100644 --- a/pkg/microservice/user/config/consts.go +++ b/pkg/microservice/user/config/consts.go @@ -16,7 +16,11 @@ limitations under the License. package config +import ( + "github.com/koderover/zadig/pkg/setting" +) + const ( - AppState = "zadig user" + AppState = setting.ProductName + "user" SystemIdentityType = "system" ) diff --git a/pkg/microservice/user/core/handler/login/local.go b/pkg/microservice/user/core/handler/login/local.go index 8f6a53381..458b6051d 100644 --- a/pkg/microservice/user/core/handler/login/local.go +++ b/pkg/microservice/user/core/handler/login/local.go @@ -15,5 +15,5 @@ func LocalLogin(c *gin.Context) { ctx.Err = err return } - ctx.Resp, ctx.Err = login.InternalLogin(args, ctx.Logger) + ctx.Resp, ctx.Err = login.LocalLogin(args, ctx.Logger) } diff --git a/pkg/microservice/user/core/handler/login/third_party.go b/pkg/microservice/user/core/handler/login/third_party.go index 30ad43b08..b84412dbe 100644 --- a/pkg/microservice/user/core/handler/login/third_party.go +++ b/pkg/microservice/user/core/handler/login/third_party.go @@ -24,7 +24,7 @@ func provider() *oidc.Provider { ctx := oidc.ClientContext(context.Background(), http.DefaultClient) provider, err := oidc.NewProvider(ctx, config.IssuerURL()) if err != nil { - log.Panic(fmt.Sprintf("init provider error:%s", err)) + log.Panicf(fmt.Sprintf("init provider error:%s", err)) } return provider } diff --git a/pkg/microservice/user/core/repository/models/base.go b/pkg/microservice/user/core/repository/models/base.go new file mode 100644 index 000000000..cf42820a3 --- /dev/null +++ b/pkg/microservice/user/core/repository/models/base.go @@ -0,0 +1,6 @@ +package models + +type Model struct { + CreatedAt int64 `json:"created_at"` + UpdatedAt int64 `json:"updated_at"` +} diff --git a/pkg/microservice/user/core/repository/models/user.go b/pkg/microservice/user/core/repository/models/user.go index 98ce949f0..402d08a7b 100644 --- a/pkg/microservice/user/core/repository/models/user.go +++ b/pkg/microservice/user/core/repository/models/user.go @@ -1,9 +1,7 @@ package models -import "github.com/koderover/zadig/pkg/microservice/user/core" - type User struct { - core.Model + Model UID string `json:"uid"` Name string `json:"name"` IdentityType string `gorm:"default:'unknown'" json:"identity_type"` diff --git a/pkg/microservice/user/core/repository/models/user_login.go b/pkg/microservice/user/core/repository/models/user_login.go index 86d2b3016..34e5bbed5 100644 --- a/pkg/microservice/user/core/repository/models/user_login.go +++ b/pkg/microservice/user/core/repository/models/user_login.go @@ -1,12 +1,8 @@ package models -import ( - "github.com/koderover/zadig/pkg/microservice/user/core" -) - type UserLogin struct { - core.Model - Uid string `json:"uid"` + Model + UID string `json:"uid"` Password string `json:"password"` LastLoginTime int64 `json:"last_login_time"` } diff --git a/pkg/microservice/user/core/service.go b/pkg/microservice/user/core/service.go index 4d50f8739..8a91a7f27 100644 --- a/pkg/microservice/user/core/service.go +++ b/pkg/microservice/user/core/service.go @@ -30,11 +30,6 @@ import ( var DB *gorm.DB -type Model struct { - CreatedAt int64 `json:"created_at"` - UpdatedAt int64 `json:"updated_at"` -} - func Start(_ context.Context) { log.Init(&log.Config{ Level: config.LogLevel(), diff --git a/pkg/microservice/user/core/service/login/local.go b/pkg/microservice/user/core/service/login/local.go index b15772232..01d163759 100644 --- a/pkg/microservice/user/core/service/login/local.go +++ b/pkg/microservice/user/core/service/login/local.go @@ -28,7 +28,7 @@ type User struct { IdentityType string `json:"identityType"` } -func InternalLogin(args *LoginArgs, logger *zap.SugaredLogger) (*User, error) { +func LocalLogin(args *LoginArgs, logger *zap.SugaredLogger) (*User, error) { user, err := orm.GetUser(args.Email, config.SystemIdentityType, core.DB) if err != nil { logger.Errorf("InternalLogin get user email:%s error", args.Email) @@ -53,7 +53,7 @@ func InternalLogin(args *LoginArgs, logger *zap.SugaredLogger) (*User, error) { return nil, fmt.Errorf("check password error, error msg:%s", err.Error()) } userLogin.LastLoginTime = time.Now().Unix() - err = orm.UpdateUserLogin(userLogin.Uid, userLogin, core.DB) + err = orm.UpdateUserLogin(userLogin.UID, userLogin, core.DB) if err != nil { logger.Errorf("InternalLogin user:%s update user login password error, error msg:%s", args.Email, err.Error()) return nil, err diff --git a/pkg/microservice/user/core/service/login/third_party.go b/pkg/microservice/user/core/service/login/third_party.go index f51c021b1..30db1eb0e 100644 --- a/pkg/microservice/user/core/service/login/third_party.go +++ b/pkg/microservice/user/core/service/login/third_party.go @@ -60,7 +60,7 @@ func SyncUser(syncUserInfo *SyncUserInfo, logger *zap.SugaredLogger) (*models.Us } } else { err = orm.CreateUserLogin(&models.UserLogin{ - Uid: user.UID, + UID: user.UID, LastLoginTime: time.Now().Unix(), }, tx) if err != nil { diff --git a/pkg/microservice/user/core/service/user/user.go b/pkg/microservice/user/core/service/user/user.go index 4b2807235..44cf4c5e0 100644 --- a/pkg/microservice/user/core/service/user/user.go +++ b/pkg/microservice/user/core/service/user/user.go @@ -82,7 +82,7 @@ func SeachUsers(args *QueryArgs, logger *zap.SugaredLogger) (*UsersResp, error) } userLoginMap := make(map[string]models.UserLogin) for _, userLogin := range *userLogins { - userLoginMap[userLogin.Uid] = userLogin + userLoginMap[userLogin.UID] = userLogin } var usersInfo []UserInfo for _, user := range users { @@ -128,7 +128,7 @@ func CreateUser(args *User, logger *zap.SugaredLogger) error { } hashedPassword, _ := bcrypt.GenerateFromPassword([]byte(args.Password), bcrypt.DefaultCost) userLogin := &models.UserLogin{ - Uid: user.UID, + UID: user.UID, Password: string(hashedPassword), LastLoginTime: 0, } @@ -171,7 +171,7 @@ func UpdatePassword(args *Password, logger *zap.SugaredLogger) error { } hashedPassword, _ := bcrypt.GenerateFromPassword([]byte(args.NewPassword), bcrypt.DefaultCost) userLogin = &models.UserLogin{ - Uid: user.UID, + UID: user.UID, Password: string(hashedPassword), } err = orm.UpdateUserLogin(user.UID, userLogin, core.DB) diff --git a/pkg/microservice/user/server/server.go b/pkg/microservice/user/server/server.go index b892ae276..aa0f55e5d 100644 --- a/pkg/microservice/user/server/server.go +++ b/pkg/microservice/user/server/server.go @@ -30,7 +30,7 @@ func Serve(ctx context.Context) error { core.Start(ctx) defer core.Stop(ctx) - log.Info("Start policy service") + log.Info("Start user system service") engine := rest.NewEngine() server := &http.Server{Addr: ":80", Handler: engine} diff --git a/pkg/setting/consts.go b/pkg/setting/consts.go index 96feb1292..84c8cb95b 100644 --- a/pkg/setting/consts.go +++ b/pkg/setting/consts.go @@ -105,7 +105,6 @@ const ( // user ENVIssuerURL = "ISSUER_URL" - ENVDebug = "DEBUG" ENVClientID = "CLIENT_ID" ENVClientSecret = "CLIENT_SECRET" ENVRedirectURI = "REDIRECT_URI" -- Gitee From 0eb536b64abac4ad62e4d00a973692d00f77662c Mon Sep 17 00:00:00 2001 From: lou Date: Wed, 27 Oct 2021 16:54:43 +0800 Subject: [PATCH 138/405] improve feature gates Signed-off-by: lou --- cmd/systemconfig/main.go | 3 +- .../systemconfig/config/config.go | 4 +- .../systemconfig/config/consts.go | 5 +- .../systemconfig/core/handler/features.go | 45 ++++----------- .../systemconfig/core/handler/router.go | 2 +- pkg/microservice/systemconfig/core/service.go | 3 + .../core/service/featuregates/feature.go | 55 +++++++++++++++++++ 7 files changed, 76 insertions(+), 41 deletions(-) create mode 100644 pkg/microservice/systemconfig/core/service/featuregates/feature.go diff --git a/cmd/systemconfig/main.go b/cmd/systemconfig/main.go index 760713e9a..3df10041f 100644 --- a/cmd/systemconfig/main.go +++ b/cmd/systemconfig/main.go @@ -32,11 +32,12 @@ import ( func main() { - flag.String(config.FeatureFlag, "", "help message for flagname") + flag.String(config.FeatureFlag, "", "turn a set of features on or off") pflag.CommandLine.AddGoFlagSet(flag.CommandLine) pflag.Parse() viper.BindPFlags(pflag.CommandLine) + ctx, stop := signal.NotifyContext(context.Background(), syscall.SIGTERM, syscall.SIGINT) go func() { <-ctx.Done() diff --git a/pkg/microservice/systemconfig/config/config.go b/pkg/microservice/systemconfig/config/config.go index f8f90f552..1dbf7ef9c 100644 --- a/pkg/microservice/systemconfig/config/config.go +++ b/pkg/microservice/systemconfig/config/config.go @@ -10,6 +10,6 @@ func MysqlDexDB() string { return viper.GetString(ENVMysqlDexDB) } -func Features()string { +func Features() string { return viper.GetString(FeatureFlag) -} \ No newline at end of file +} diff --git a/pkg/microservice/systemconfig/config/consts.go b/pkg/microservice/systemconfig/config/consts.go index 891313287..27f698e59 100644 --- a/pkg/microservice/systemconfig/config/consts.go +++ b/pkg/microservice/systemconfig/config/consts.go @@ -2,8 +2,5 @@ package config const ( ENVMysqlDexDB = "MYSQL_DEX_DB" -) - -const ( - FeatureFlag = "features" + FeatureFlag = "feature-gates" ) diff --git a/pkg/microservice/systemconfig/core/handler/features.go b/pkg/microservice/systemconfig/core/handler/features.go index f6c353353..18952e069 100644 --- a/pkg/microservice/systemconfig/core/handler/features.go +++ b/pkg/microservice/systemconfig/core/handler/features.go @@ -1,47 +1,26 @@ package handler import ( - "strings" - "sync" - "github.com/gin-gonic/gin" - "github.com/koderover/zadig/pkg/microservice/systemconfig/config" + "github.com/koderover/zadig/pkg/microservice/systemconfig/core/service/featuregates" internalhandler "github.com/koderover/zadig/pkg/shared/handler" ) -var featureM map[string]string = map[string]string{ - "ModernWorkflow": "false", - "CommunityProjectRepository":"false", +type feature struct { + Name string `json:"name"` + Enabled bool `json:"enabled"` } -var FeatureFlag string -var once sync.Once - -func GetFeatures(c *gin.Context) { - featureName := c.Query("feature") +func GetFeature(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - initOnce() - if v,ok := featureM[featureName];ok{ - ctx.Resp = v - return - } - ctx.Resp = "notfound" -} -func initOnce(){ - once.Do(func(){ - features := config.Features() - featureList := strings.Split(features,",") - for _,v := range featureList{ - feature := strings.Split(v,"=") - if len(feature) != 2 { - continue - } - if _ , ok := featureM[feature[0]];ok { - featureM[feature[0]] = feature[1] - } - } - }) + name := c.Param("name") + enabled := featuregates.Features.FeatureEnabled(featuregates.Feature(name)) + + ctx.Resp = &feature{ + Name: c.Param("name"), + Enabled: enabled, + } } diff --git a/pkg/microservice/systemconfig/core/handler/router.go b/pkg/microservice/systemconfig/core/handler/router.go index e681b8466..282f4cb12 100644 --- a/pkg/microservice/systemconfig/core/handler/router.go +++ b/pkg/microservice/systemconfig/core/handler/router.go @@ -33,6 +33,6 @@ func (*Router) Inject(router *gin.RouterGroup) { } features := router.Group("features") { - features.GET("", GetFeatures) + features.GET("/:name", GetFeature) } } diff --git a/pkg/microservice/systemconfig/core/service.go b/pkg/microservice/systemconfig/core/service.go index 4030bd2fd..e77858f84 100644 --- a/pkg/microservice/systemconfig/core/service.go +++ b/pkg/microservice/systemconfig/core/service.go @@ -21,6 +21,7 @@ import ( configbase "github.com/koderover/zadig/pkg/config" "github.com/koderover/zadig/pkg/microservice/systemconfig/config" + "github.com/koderover/zadig/pkg/microservice/systemconfig/core/service/featuregates" "github.com/koderover/zadig/pkg/setting" gormtool "github.com/koderover/zadig/pkg/tool/gorm" "github.com/koderover/zadig/pkg/tool/log" @@ -35,6 +36,8 @@ func Start(_ context.Context) { }) initDatabase() + + featuregates.Features.MergeFeatureGates(featuregates.ToFeatureGates(config.Features())) } func initDatabase() { diff --git a/pkg/microservice/systemconfig/core/service/featuregates/feature.go b/pkg/microservice/systemconfig/core/service/featuregates/feature.go new file mode 100644 index 000000000..13b5c7d92 --- /dev/null +++ b/pkg/microservice/systemconfig/core/service/featuregates/feature.go @@ -0,0 +1,55 @@ +package featuregates + +import "strings" + +type Feature string + +const ( + ModernWorkflow Feature = "ModernWorkflow" + CommunityProjectRepository Feature = "CommunityProjectRepository" +) + +var Features FeatureGates = map[Feature]bool{ + ModernWorkflow: false, + CommunityProjectRepository: false, +} + +type FeatureGates map[Feature]bool + +func (fg FeatureGates) EnabledFeatures() []Feature { + var res []Feature + + for k, v := range fg { + if v { + res = append(res, k) + } + } + + return res +} + +func (fg FeatureGates) FeatureEnabled(f Feature) bool { + return fg[f] +} + +func (fg FeatureGates) MergeFeatureGates(fs FeatureGates) { + for k, v := range fs { + fg[k] = v + } +} + +func ToFeatureGates(s string) FeatureGates { + res := make(FeatureGates) + + fs := strings.Split(s, ",") + for _, f := range fs { + kv := strings.Split(f, "=") + if len(kv) != 2 { + continue + } + + res[Feature(kv[0])] = kv[1] == "true" + } + + return res +} -- Gitee From 0aadb1178ec979693bfeb45a57a5dc25ff2985ba Mon Sep 17 00:00:00 2001 From: mouuii Date: Wed, 27 Oct 2021 18:42:26 +0800 Subject: [PATCH 139/405] features Signed-off-by: mouuii --- pkg/config/config.go | 9 +++++++ .../core/common/service/template_product.go | 12 ++++----- .../aslan/core/project/service/product.go | 9 +++---- .../cron/core/service/scheduler/scheduler.go | 18 +++---------- .../core/service/taskplugin/build.go | 10 +++----- pkg/setting/consts.go | 4 +++ pkg/setting/types.go | 5 ++++ pkg/shared/config/client.go | 22 ++++++++++++++++ pkg/shared/config/features.go | 25 +++++++++++++++++++ 9 files changed, 81 insertions(+), 33 deletions(-) create mode 100644 pkg/shared/config/client.go create mode 100644 pkg/shared/config/features.go diff --git a/pkg/config/config.go b/pkg/config/config.go index 477198b41..35ee51b92 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -150,11 +150,20 @@ func PoetryServiceInfo() *setting.ServiceInfo { return GetServiceByCode(setting.Poetry) } +func ConfigServiceInfo() *setting.ServiceInfo { + return GetServiceByCode(setting.Poetry) +} + func PoetryServiceAddress() string { s := PoetryServiceInfo() return GetServiceAddress(s.Name, s.Port) } +func ConfigServiceAddress() string { + s := ConfigServiceInfo() + return GetServiceAddress(s.Name, s.Port) +} + func WarpDriveServiceInfo() *setting.ServiceInfo { return GetServiceByCode(setting.WarpDrive) } diff --git a/pkg/microservice/aslan/core/common/service/template_product.go b/pkg/microservice/aslan/core/common/service/template_product.go index bb4b46715..e85dc1ff8 100644 --- a/pkg/microservice/aslan/core/common/service/template_product.go +++ b/pkg/microservice/aslan/core/common/service/template_product.go @@ -23,6 +23,7 @@ import ( "go.uber.org/zap" + configbase "github.com/koderover/zadig/pkg/config" "github.com/koderover/zadig/pkg/microservice/aslan/config" "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/models" "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/models/template" @@ -31,6 +32,7 @@ import ( "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/collie" "github.com/koderover/zadig/pkg/microservice/aslan/internal/cache" "github.com/koderover/zadig/pkg/setting" + configCli "github.com/koderover/zadig/pkg/shared/config" "github.com/koderover/zadig/pkg/shared/poetry" e "github.com/koderover/zadig/pkg/tool/errors" ) @@ -52,12 +54,8 @@ func GetProductTemplate(productName string, log *zap.SugaredLogger) (*template.P } totalFreeStyles := make([]*collie.CiPipelineResource, 0) - features, err := GetFeatures(log) - if err != nil { - log.Errorf("GetProductTemplate GetFeatures err : %v", err) - } - - if strings.Contains(features, string(config.FreestyleType)) { + cl := configCli.New(configbase.ConfigServiceAddress()) + if enable, err := cl.CheckFeature(setting.ModernWorkflowType);err !=nil && enable{ // CI场景onboarding流程处于第二步时,需要返回ci工作流id,用于前端跳转 collieAPIAddress := config.CollieAPIAddress() cl := collie.New(collieAPIAddress) @@ -116,7 +114,7 @@ func GetProductTemplate(productName string, log *zap.SugaredLogger) (*template.P return resp, fmt.Errorf("Pipeline.List err : %v", err) } - if strings.Contains(features, string(config.FreestyleType)) { + if enable, err := cl.CheckFeature(setting.ModernWorkflowType);err !=nil && enable{ collieAPIAddress := config.CollieAPIAddress() cl := collie.New(collieAPIAddress) totalFreeStyles, err = cl.ListCIPipelines(productName, log) diff --git a/pkg/microservice/aslan/core/project/service/product.go b/pkg/microservice/aslan/core/project/service/product.go index ee01dfe0b..c66de01e7 100644 --- a/pkg/microservice/aslan/core/project/service/product.go +++ b/pkg/microservice/aslan/core/project/service/product.go @@ -29,6 +29,7 @@ import ( "k8s.io/apimachinery/pkg/util/sets" "sigs.k8s.io/yaml" + configbase "github.com/koderover/zadig/pkg/config" "github.com/koderover/zadig/pkg/microservice/aslan/config" commonmodels "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/models" "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/models/template" @@ -40,6 +41,7 @@ import ( workflowservice "github.com/koderover/zadig/pkg/microservice/aslan/core/workflow/service/workflow" "github.com/koderover/zadig/pkg/setting" "github.com/koderover/zadig/pkg/shared/client/policy" + configCli "github.com/koderover/zadig/pkg/shared/config" e "github.com/koderover/zadig/pkg/tool/errors" "github.com/koderover/zadig/pkg/tool/log" ) @@ -340,11 +342,8 @@ func DeleteProductTemplate(userName, productName, requestID string, log *zap.Sug } //删除自由编排工作流 - features, err := commonservice.GetFeatures(log) - if err != nil { - log.Errorf("DeleteProductTemplate productName %s getFeatures err: %v", productName, err) - } - if strings.Contains(features, string(config.FreestyleType)) { + cl := configCli.New(configbase.ConfigServiceAddress()) + if enable, err := cl.CheckFeature(setting.ModernWorkflowType);err !=nil && enable{ collieClient := collie.New(config.CollieAPIAddress()) if err = collieClient.DeleteCIPipelines(productName, log); err != nil { log.Errorf("DeleteProductTemplate Delete productName %s freestyle pipeline err: %v", productName, err) diff --git a/pkg/microservice/cron/core/service/scheduler/scheduler.go b/pkg/microservice/cron/core/service/scheduler/scheduler.go index 5f45ae44b..d50874b5b 100644 --- a/pkg/microservice/cron/core/service/scheduler/scheduler.go +++ b/pkg/microservice/cron/core/service/scheduler/scheduler.go @@ -20,7 +20,6 @@ import ( "fmt" stdlog "log" "os" - "strings" "time" "github.com/jasonlvhit/gocron" @@ -33,7 +32,7 @@ import ( "github.com/koderover/zadig/pkg/microservice/cron/core/service" "github.com/koderover/zadig/pkg/microservice/cron/core/service/client" "github.com/koderover/zadig/pkg/setting" - "github.com/koderover/zadig/pkg/shared/poetry" + configCli "github.com/koderover/zadig/pkg/shared/config" "github.com/koderover/zadig/pkg/tool/log" ) @@ -74,8 +73,6 @@ const ( //InitHealthCheckScheduler InitHealthCheckScheduler = "InitHealthCheckScheduler" - // FreestyleType 自由编排工作流 - freestyleType = "freestyle" ) // NewCronClient ... @@ -142,8 +139,8 @@ func (c *CronClient) Init() { c.InitTestScheduler() // 自由编排工作流定时任务触发 - features, _ := getFeatures() - if strings.Contains(features, freestyleType) { + cl := configCli.New(configbase.ConfigServiceAddress()) + if enable, err := cl.CheckFeature(setting.ModernWorkflowType);err !=nil && enable{ c.InitColliePipelineScheduler() } @@ -159,15 +156,6 @@ func (c *CronClient) Init() { c.InitHealthCheckScheduler() } -func getFeatures() (string, error) { - cl := poetry.New(configbase.PoetryServiceAddress()) - fs, err := cl.ListFeatures() - if err != nil { - return "", err - } - - return strings.Join(fs, ","), nil -} // InitCleanJobScheduler ... func (c *CronClient) InitCleanJobScheduler() { diff --git a/pkg/microservice/warpdrive/core/service/taskplugin/build.go b/pkg/microservice/warpdrive/core/service/taskplugin/build.go index 1867fd455..6b972350b 100644 --- a/pkg/microservice/warpdrive/core/service/taskplugin/build.go +++ b/pkg/microservice/warpdrive/core/service/taskplugin/build.go @@ -29,11 +29,9 @@ import ( "k8s.io/apimachinery/pkg/util/sets" "sigs.k8s.io/controller-runtime/pkg/client" - configbase "github.com/koderover/zadig/pkg/config" "github.com/koderover/zadig/pkg/microservice/warpdrive/config" "github.com/koderover/zadig/pkg/microservice/warpdrive/core/service/types/task" "github.com/koderover/zadig/pkg/setting" - "github.com/koderover/zadig/pkg/shared/poetry" krkubeclient "github.com/koderover/zadig/pkg/tool/kube/client" "github.com/koderover/zadig/pkg/tool/kube/updater" ) @@ -162,10 +160,10 @@ func (p *BuildTaskPlugin) Run(ctx context.Context, pipelineTask *task.Task, pipe Installs: p.Task.InstallCtx, } - poetryClient := poetry.New(configbase.PoetryServiceAddress()) - if fs, err := poetryClient.ListFeatures(); err == nil { - pipelineTask.Features = fs - } + //poetryClient := poetry.New(configbase.PoetryServiceAddress()) + //if fs, err := poetryClient.ListFeatures(); err == nil { + // pipelineTask.Features = fs + //} if p.Task.BuildStatus == nil { p.Task.BuildStatus = &task.BuildStatus{} diff --git a/pkg/setting/consts.go b/pkg/setting/consts.go index 819325699..61af7f765 100644 --- a/pkg/setting/consts.go +++ b/pkg/setting/consts.go @@ -500,3 +500,7 @@ const ( ReadOnly RoleType = "ReadOnly" ContributorRoleBindingFmt string = "contributor-project:%s-user:%s" ) + + +// ModernWorkflowType 自由编排工作流 +const ModernWorkflowType = "ModernWorkflow" \ No newline at end of file diff --git a/pkg/setting/types.go b/pkg/setting/types.go index dd1f1315a..a8293f086 100644 --- a/pkg/setting/types.go +++ b/pkg/setting/types.go @@ -48,6 +48,7 @@ const ( Minio // 11 OPA // 12 Policy // 13 + Config // 14 ) type ServiceInfo struct { @@ -108,4 +109,8 @@ var Services = map[int]*ServiceInfo{ Name: "policy", Port: 80, }, + Config:{ + Name:"config", + Port:80, + }, } diff --git a/pkg/shared/config/client.go b/pkg/shared/config/client.go new file mode 100644 index 000000000..07eeb4b25 --- /dev/null +++ b/pkg/shared/config/client.go @@ -0,0 +1,22 @@ +package config + +import ( + "github.com/koderover/zadig/pkg/tool/httpclient" +) + +type Client struct { + *httpclient.Client + + host string +} + +func New(host string) *Client { + c := httpclient.New( + httpclient.SetHostURL(host), + ) + + return &Client{ + Client: c, + host: host, + } +} diff --git a/pkg/shared/config/features.go b/pkg/shared/config/features.go new file mode 100644 index 000000000..82ef1f211 --- /dev/null +++ b/pkg/shared/config/features.go @@ -0,0 +1,25 @@ +package config + + +import ( + "fmt" + + "github.com/koderover/zadig/pkg/tool/httpclient" +) + +type feature struct { + Name string `json:"name"` + Enabled bool `json:"enabled"` +} + +func (c *Client) CheckFeature(featureName string) (bool, error) { + url := fmt.Sprintf("/api/v1/features/%s",featureName) + + fs := &feature{} + _, err := c.Get(url, httpclient.SetResult(fs)) + if err != nil { + return false, err + } + + return fs.Enabled, nil +} \ No newline at end of file -- Gitee From 49634684e453abb04d540bab8bbfd408e71dce60 Mon Sep 17 00:00:00 2001 From: mouuii Date: Wed, 27 Oct 2021 19:03:15 +0800 Subject: [PATCH 140/405] features Signed-off-by: mouuii --- .../aslan/core/common/service/template_product.go | 4 ++-- pkg/microservice/aslan/core/project/service/product.go | 2 +- pkg/microservice/cron/core/service/scheduler/scheduler.go | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pkg/microservice/aslan/core/common/service/template_product.go b/pkg/microservice/aslan/core/common/service/template_product.go index e85dc1ff8..b3263bdb7 100644 --- a/pkg/microservice/aslan/core/common/service/template_product.go +++ b/pkg/microservice/aslan/core/common/service/template_product.go @@ -55,7 +55,7 @@ func GetProductTemplate(productName string, log *zap.SugaredLogger) (*template.P totalFreeStyles := make([]*collie.CiPipelineResource, 0) cl := configCli.New(configbase.ConfigServiceAddress()) - if enable, err := cl.CheckFeature(setting.ModernWorkflowType);err !=nil && enable{ + if enable, err := cl.CheckFeature(setting.ModernWorkflowType);err ==nil && enable{ // CI场景onboarding流程处于第二步时,需要返回ci工作流id,用于前端跳转 collieAPIAddress := config.CollieAPIAddress() cl := collie.New(collieAPIAddress) @@ -114,7 +114,7 @@ func GetProductTemplate(productName string, log *zap.SugaredLogger) (*template.P return resp, fmt.Errorf("Pipeline.List err : %v", err) } - if enable, err := cl.CheckFeature(setting.ModernWorkflowType);err !=nil && enable{ + if enable, err := cl.CheckFeature(setting.ModernWorkflowType);err ==nil && enable{ collieAPIAddress := config.CollieAPIAddress() cl := collie.New(collieAPIAddress) totalFreeStyles, err = cl.ListCIPipelines(productName, log) diff --git a/pkg/microservice/aslan/core/project/service/product.go b/pkg/microservice/aslan/core/project/service/product.go index c66de01e7..86201f7d3 100644 --- a/pkg/microservice/aslan/core/project/service/product.go +++ b/pkg/microservice/aslan/core/project/service/product.go @@ -343,7 +343,7 @@ func DeleteProductTemplate(userName, productName, requestID string, log *zap.Sug //删除自由编排工作流 cl := configCli.New(configbase.ConfigServiceAddress()) - if enable, err := cl.CheckFeature(setting.ModernWorkflowType);err !=nil && enable{ + if enable, err := cl.CheckFeature(setting.ModernWorkflowType);err ==nil && enable{ collieClient := collie.New(config.CollieAPIAddress()) if err = collieClient.DeleteCIPipelines(productName, log); err != nil { log.Errorf("DeleteProductTemplate Delete productName %s freestyle pipeline err: %v", productName, err) diff --git a/pkg/microservice/cron/core/service/scheduler/scheduler.go b/pkg/microservice/cron/core/service/scheduler/scheduler.go index d50874b5b..d466e5494 100644 --- a/pkg/microservice/cron/core/service/scheduler/scheduler.go +++ b/pkg/microservice/cron/core/service/scheduler/scheduler.go @@ -140,7 +140,7 @@ func (c *CronClient) Init() { // 自由编排工作流定时任务触发 cl := configCli.New(configbase.ConfigServiceAddress()) - if enable, err := cl.CheckFeature(setting.ModernWorkflowType);err !=nil && enable{ + if enable, err := cl.CheckFeature(setting.ModernWorkflowType);err ==nil && enable{ c.InitColliePipelineScheduler() } -- Gitee From d739e2b8ccce1133215f06298ad5c52b5d5ea38e Mon Sep 17 00:00:00 2001 From: mouuii Date: Wed, 27 Oct 2021 19:07:27 +0800 Subject: [PATCH 141/405] features Signed-off-by: mouuii --- .../aslan/core/common/service/template_product.go | 4 ++-- pkg/microservice/aslan/core/project/service/product.go | 4 ++-- pkg/microservice/cron/core/service/scheduler/scheduler.go | 4 ++-- pkg/microservice/warpdrive/core/service/taskplugin/build.go | 5 ----- 4 files changed, 6 insertions(+), 11 deletions(-) diff --git a/pkg/microservice/aslan/core/common/service/template_product.go b/pkg/microservice/aslan/core/common/service/template_product.go index b3263bdb7..d77e64b30 100644 --- a/pkg/microservice/aslan/core/common/service/template_product.go +++ b/pkg/microservice/aslan/core/common/service/template_product.go @@ -32,7 +32,7 @@ import ( "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/collie" "github.com/koderover/zadig/pkg/microservice/aslan/internal/cache" "github.com/koderover/zadig/pkg/setting" - configCli "github.com/koderover/zadig/pkg/shared/config" + configcli "github.com/koderover/zadig/pkg/shared/config" "github.com/koderover/zadig/pkg/shared/poetry" e "github.com/koderover/zadig/pkg/tool/errors" ) @@ -54,7 +54,7 @@ func GetProductTemplate(productName string, log *zap.SugaredLogger) (*template.P } totalFreeStyles := make([]*collie.CiPipelineResource, 0) - cl := configCli.New(configbase.ConfigServiceAddress()) + cl := configcli.New(configbase.ConfigServiceAddress()) if enable, err := cl.CheckFeature(setting.ModernWorkflowType);err ==nil && enable{ // CI场景onboarding流程处于第二步时,需要返回ci工作流id,用于前端跳转 collieAPIAddress := config.CollieAPIAddress() diff --git a/pkg/microservice/aslan/core/project/service/product.go b/pkg/microservice/aslan/core/project/service/product.go index 86201f7d3..c98e96a84 100644 --- a/pkg/microservice/aslan/core/project/service/product.go +++ b/pkg/microservice/aslan/core/project/service/product.go @@ -41,7 +41,7 @@ import ( workflowservice "github.com/koderover/zadig/pkg/microservice/aslan/core/workflow/service/workflow" "github.com/koderover/zadig/pkg/setting" "github.com/koderover/zadig/pkg/shared/client/policy" - configCli "github.com/koderover/zadig/pkg/shared/config" + configclient "github.com/koderover/zadig/pkg/shared/config" e "github.com/koderover/zadig/pkg/tool/errors" "github.com/koderover/zadig/pkg/tool/log" ) @@ -342,7 +342,7 @@ func DeleteProductTemplate(userName, productName, requestID string, log *zap.Sug } //删除自由编排工作流 - cl := configCli.New(configbase.ConfigServiceAddress()) + cl := configclient.New(configbase.ConfigServiceAddress()) if enable, err := cl.CheckFeature(setting.ModernWorkflowType);err ==nil && enable{ collieClient := collie.New(config.CollieAPIAddress()) if err = collieClient.DeleteCIPipelines(productName, log); err != nil { diff --git a/pkg/microservice/cron/core/service/scheduler/scheduler.go b/pkg/microservice/cron/core/service/scheduler/scheduler.go index d466e5494..5bcb91f3e 100644 --- a/pkg/microservice/cron/core/service/scheduler/scheduler.go +++ b/pkg/microservice/cron/core/service/scheduler/scheduler.go @@ -32,7 +32,7 @@ import ( "github.com/koderover/zadig/pkg/microservice/cron/core/service" "github.com/koderover/zadig/pkg/microservice/cron/core/service/client" "github.com/koderover/zadig/pkg/setting" - configCli "github.com/koderover/zadig/pkg/shared/config" + configclient "github.com/koderover/zadig/pkg/shared/config" "github.com/koderover/zadig/pkg/tool/log" ) @@ -139,7 +139,7 @@ func (c *CronClient) Init() { c.InitTestScheduler() // 自由编排工作流定时任务触发 - cl := configCli.New(configbase.ConfigServiceAddress()) + cl := configclient.New(configbase.ConfigServiceAddress()) if enable, err := cl.CheckFeature(setting.ModernWorkflowType);err ==nil && enable{ c.InitColliePipelineScheduler() } diff --git a/pkg/microservice/warpdrive/core/service/taskplugin/build.go b/pkg/microservice/warpdrive/core/service/taskplugin/build.go index 6b972350b..630004f86 100644 --- a/pkg/microservice/warpdrive/core/service/taskplugin/build.go +++ b/pkg/microservice/warpdrive/core/service/taskplugin/build.go @@ -160,11 +160,6 @@ func (p *BuildTaskPlugin) Run(ctx context.Context, pipelineTask *task.Task, pipe Installs: p.Task.InstallCtx, } - //poetryClient := poetry.New(configbase.PoetryServiceAddress()) - //if fs, err := poetryClient.ListFeatures(); err == nil { - // pipelineTask.Features = fs - //} - if p.Task.BuildStatus == nil { p.Task.BuildStatus = &task.BuildStatus{} } -- Gitee From f51ed2cd507af791bdac97aaac73e15060b90ec5 Mon Sep 17 00:00:00 2001 From: mouuii Date: Wed, 27 Oct 2021 19:08:44 +0800 Subject: [PATCH 142/405] features Signed-off-by: mouuii --- .../aslan/core/common/service/template_product.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/microservice/aslan/core/common/service/template_product.go b/pkg/microservice/aslan/core/common/service/template_product.go index d77e64b30..1f39e415d 100644 --- a/pkg/microservice/aslan/core/common/service/template_product.go +++ b/pkg/microservice/aslan/core/common/service/template_product.go @@ -32,7 +32,7 @@ import ( "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/collie" "github.com/koderover/zadig/pkg/microservice/aslan/internal/cache" "github.com/koderover/zadig/pkg/setting" - configcli "github.com/koderover/zadig/pkg/shared/config" + configclient "github.com/koderover/zadig/pkg/shared/config" "github.com/koderover/zadig/pkg/shared/poetry" e "github.com/koderover/zadig/pkg/tool/errors" ) @@ -54,7 +54,7 @@ func GetProductTemplate(productName string, log *zap.SugaredLogger) (*template.P } totalFreeStyles := make([]*collie.CiPipelineResource, 0) - cl := configcli.New(configbase.ConfigServiceAddress()) + cl := configclient.New(configbase.ConfigServiceAddress()) if enable, err := cl.CheckFeature(setting.ModernWorkflowType);err ==nil && enable{ // CI场景onboarding流程处于第二步时,需要返回ci工作流id,用于前端跳转 collieAPIAddress := config.CollieAPIAddress() -- Gitee From 22388e8d76c855946a2f90bed507e98ff08dcfa8 Mon Sep 17 00:00:00 2001 From: mouuii Date: Wed, 27 Oct 2021 20:31:40 +0800 Subject: [PATCH 143/405] add put Signed-off-by: mouuii --- pkg/microservice/policy/core/handler/role.go | 14 ++++++++++++++ pkg/microservice/policy/core/handler/router.go | 1 + 2 files changed, 15 insertions(+) diff --git a/pkg/microservice/policy/core/handler/role.go b/pkg/microservice/policy/core/handler/role.go index 764569795..8f5d06e46 100644 --- a/pkg/microservice/policy/core/handler/role.go +++ b/pkg/microservice/policy/core/handler/role.go @@ -196,6 +196,20 @@ func CreateSystemRole(c *gin.Context) { ctx.Err = service.CreateRole("*", args, ctx.Logger) } +func UpdateOrCreateSystemRole(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + + args := &service.Role{} + if err := c.ShouldBindJSON(args); err != nil { + ctx.Err = err + return + } + name := c.Param("name") + args.Name = name + ctx.Err = service.UpdateOrCreateRole("*", args, ctx.Logger) +} + func ListSystemRoles(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() diff --git a/pkg/microservice/policy/core/handler/router.go b/pkg/microservice/policy/core/handler/router.go index 3d86d812d..41a67e241 100644 --- a/pkg/microservice/policy/core/handler/router.go +++ b/pkg/microservice/policy/core/handler/router.go @@ -46,6 +46,7 @@ func (*Router) Inject(router *gin.RouterGroup) { systemRoles := router.Group("system-roles") { systemRoles.POST("", CreateSystemRole) + systemRoles.PUT("/:name",UpdateOrCreateSystemRole) systemRoles.GET("", ListSystemRoles) systemRoles.DELETE("/:name", DeleteSystemRole) } -- Gitee From ae9fb2097b6b65ad550e1df7524877d91d484ed6 Mon Sep 17 00:00:00 2001 From: mouuii Date: Wed, 27 Oct 2021 20:51:47 +0800 Subject: [PATCH 144/405] change uids to string Signed-off-by: mouuii --- .../aslan/core/common/repository/models/template/product.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/microservice/aslan/core/common/repository/models/template/product.go b/pkg/microservice/aslan/core/common/repository/models/template/product.go index 549c99191..509a72a47 100644 --- a/pkg/microservice/aslan/core/common/repository/models/template/product.go +++ b/pkg/microservice/aslan/core/common/repository/models/template/product.go @@ -41,7 +41,7 @@ type Product struct { Vars []*RenderKV `bson:"vars" json:"vars"` EnvVars []*EnvRenderKV `bson:"-" json:"env_vars,omitempty"` ChartInfos []*RenderChart `bson:"-" json:"chart_infos,omitempty"` - UserIDs []int `bson:"user_ids" json:"user_ids"` + UserIDs []string `bson:"user_ids" json:"user_ids"` TeamID int `bson:"team_id" json:"team_id"` Description string `bson:"description,omitempty" json:"desc,omitempty"` ProductFeature *ProductFeature `bson:"product_feature,omitempty" json:"product_feature,omitempty"` -- Gitee From fe14ceb00f8639673a8c2922fa3137c3974a2ff1 Mon Sep 17 00:00:00 2001 From: lou Date: Wed, 27 Oct 2021 21:01:05 +0800 Subject: [PATCH 145/405] return empty projects Signed-off-by: lou --- pkg/microservice/picket/core/filter/service/project.go | 4 ++++ pkg/microservice/policy/core/service/bundle/exemption_urls.go | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/pkg/microservice/picket/core/filter/service/project.go b/pkg/microservice/picket/core/filter/service/project.go index 134a6294a..9b0a2b51c 100644 --- a/pkg/microservice/picket/core/filter/service/project.go +++ b/pkg/microservice/picket/core/filter/service/project.go @@ -23,6 +23,10 @@ func ListProjects(header http.Header, qs url.Values, logger *zap.SugaredLogger) return nil, err } + if len(names) == 0 { + return []byte("[]"), nil + } + for _, name := range names { qs.Add("names", name) } diff --git a/pkg/microservice/policy/core/service/bundle/exemption_urls.go b/pkg/microservice/policy/core/service/bundle/exemption_urls.go index 7b4b451e9..693b04a5b 100644 --- a/pkg/microservice/policy/core/service/bundle/exemption_urls.go +++ b/pkg/microservice/policy/core/service/bundle/exemption_urls.go @@ -54,7 +54,7 @@ var publicURLs = []*policyRule{ }, { Methods: []string{"GET"}, - Endpoints: []string{"", "signin", "setup", "loading", "static/**"}, + Endpoints: []string{"", "signin", "setup", "loading", "static/**", "v1/**", "mobile/**", "productpipelines/**"}, }, { Methods: []string{"GET"}, -- Gitee From 71a6d9205d0db6c2979204ff88b6d551685e10f2 Mon Sep 17 00:00:00 2001 From: lou Date: Thu, 28 Oct 2021 10:51:59 +0800 Subject: [PATCH 146/405] update policy Signed-off-by: lou --- pkg/microservice/aslan/core/project/handler/policy.yaml | 2 -- 1 file changed, 2 deletions(-) diff --git a/pkg/microservice/aslan/core/project/handler/policy.yaml b/pkg/microservice/aslan/core/project/handler/policy.yaml index 8e4a722a6..dbaf18ad8 100644 --- a/pkg/microservice/aslan/core/project/handler/policy.yaml +++ b/pkg/microservice/aslan/core/project/handler/policy.yaml @@ -14,8 +14,6 @@ rules: endpoint: "/api/aslan/project/products/?*/services" - method: GET endpoint: "/api/aslan/service/services/?*" - - method: GET - endpoint: "/api/aslan/service/name" - method: GET endpoint: "/api/aslan/project/products/?*/searching-rules" - method: GET -- Gitee From 30c408c0176eb2150d5e0075184a1674d25b858f Mon Sep 17 00:00:00 2001 From: mouuii Date: Thu, 28 Oct 2021 16:28:16 +0800 Subject: [PATCH 147/405] product create Signed-off-by: mouuii --- .../repository/mongodb/template/product.go | 1 - .../core/environment/service/environment.go | 1 - .../aslan/core/environment/service/product.go | 2 -- .../aslan/core/project/service/product.go | 5 ++--- .../picket/client/aslan/project.go | 11 ++++++++++ .../picket/core/filter/handler/project.go | 21 +++++++++++++++++++ .../picket/core/filter/handler/router.go | 5 +++-- .../picket/core/filter/service/project.go | 21 +++++++++++++++++++ pkg/setting/consts.go | 3 ++- pkg/shared/client/policy/policy.go | 2 +- 10 files changed, 61 insertions(+), 11 deletions(-) diff --git a/pkg/microservice/aslan/core/common/repository/mongodb/template/product.go b/pkg/microservice/aslan/core/common/repository/mongodb/template/product.go index a4312f184..c32ca2bcc 100644 --- a/pkg/microservice/aslan/core/common/repository/mongodb/template/product.go +++ b/pkg/microservice/aslan/core/common/repository/mongodb/template/product.go @@ -247,7 +247,6 @@ func (c *ProductColl) Update(productName string, args *template.Product) error { "teams": args.Teams, "enabled": args.Enabled, "description": args.Description, - "visibility": args.Visibility, "user_ids": args.UserIDs, "team_id": args.TeamID, "timeout": args.Timeout, diff --git a/pkg/microservice/aslan/core/environment/service/environment.go b/pkg/microservice/aslan/core/environment/service/environment.go index 31e4deb86..0c904e674 100644 --- a/pkg/microservice/aslan/core/environment/service/environment.go +++ b/pkg/microservice/aslan/core/environment/service/environment.go @@ -633,7 +633,6 @@ func CreateHelmProduct(userName, requestID string, args *CreateHelmProductArg, l productObj := &commonmodels.Product{ ProductName: args.ProductName, Revision: 1, - Enabled: false, EnvName: args.EnvName, UpdateBy: userName, IsPublic: true, diff --git a/pkg/microservice/aslan/core/environment/service/product.go b/pkg/microservice/aslan/core/environment/service/product.go index c04f3cdfe..eef10e4b2 100644 --- a/pkg/microservice/aslan/core/environment/service/product.go +++ b/pkg/microservice/aslan/core/environment/service/product.go @@ -107,11 +107,9 @@ func GetInitProduct(productTmplName string, log *zap.SugaredLogger) (*commonmode //返回中的ProductName即产品模板的名称 ret.ProductName = prodTmpl.ProductName ret.Revision = prodTmpl.Revision - ret.Enabled = prodTmpl.Enabled ret.Services = [][]*commonmodels.ProductService{} ret.UpdateBy = prodTmpl.UpdateBy ret.CreateTime = prodTmpl.CreateTime - ret.Visibility = prodTmpl.Visibility ret.Render = &commonmodels.RenderInfo{Name: "", Description: ""} ret.Vars = prodTmpl.Vars ret.ChartInfos = prodTmpl.ChartInfos diff --git a/pkg/microservice/aslan/core/project/service/product.go b/pkg/microservice/aslan/core/project/service/product.go index c98e96a84..efc665174 100644 --- a/pkg/microservice/aslan/core/project/service/product.go +++ b/pkg/microservice/aslan/core/project/service/product.go @@ -510,12 +510,11 @@ func ForkProduct(username, requestID string, args *template.ForkProject, log *za CreateBy: username, UpdateBy: username, } - policyClient := policy.New() - err = policyClient.CreateRoleBinding(args.ProductName, &policy.RoleBinding{ + err = policy.NewDefault().CreateRoleBinding(args.ProductName, &policy.RoleBinding{ Name: fmt.Sprintf(setting.ContributorRoleBindingFmt, args.ProductName, username), User: username, Role: setting.Contributor, - Global: true, + Public: true, }) if err != nil { log.Error("rolebinding error") diff --git a/pkg/microservice/picket/client/aslan/project.go b/pkg/microservice/picket/client/aslan/project.go index 80e677578..cbad86b73 100644 --- a/pkg/microservice/picket/client/aslan/project.go +++ b/pkg/microservice/picket/client/aslan/project.go @@ -1,6 +1,7 @@ package aslan import ( + "fmt" "net/http" "net/url" @@ -17,3 +18,13 @@ func (c *Client) ListProjects(header http.Header, qs url.Values) ([]byte, error) return res.Body(), nil } + +func (c *Client) CreateProject(header http.Header,body []byte,projectName string)([]byte,error){ + url := fmt.Sprintf("/project/projects/%s",projectName) + res, err := c.Post(url, httpclient.SetHeadersFromHTTPHeader(header),httpclient.SetBody(body)) + if err != nil { + return nil, err + } + + return res.Body(), nil +} diff --git a/pkg/microservice/picket/core/filter/handler/project.go b/pkg/microservice/picket/core/filter/handler/project.go index a4f38ab7d..e4e1f1bc5 100644 --- a/pkg/microservice/picket/core/filter/handler/project.go +++ b/pkg/microservice/picket/core/filter/handler/project.go @@ -1,10 +1,13 @@ package handler import ( + "io/ioutil" + "github.com/gin-gonic/gin" "github.com/koderover/zadig/pkg/microservice/picket/core/filter/service" internalhandler "github.com/koderover/zadig/pkg/shared/handler" + e "github.com/koderover/zadig/pkg/tool/errors" ) func ListProjects(c *gin.Context) { @@ -13,3 +16,21 @@ func ListProjects(c *gin.Context) { ctx.Resp, ctx.Err = service.ListProjects(c.Request.Header, c.Request.URL.Query(), ctx.Logger) } + +type CreateProjectReq struct { + Public bool `json:"public"` + ProjectName string `json:"project_name"` +} + +func CreateProject(c *gin.Context){ + ctx := internalhandler.NewContext(c) + defer func() {internalhandler.JSONResponse(c,ctx)}() + + args := new(CreateProjectReq) + if err := c.ShouldBindJSON(args); err != nil { + ctx.Err = e.ErrInvalidParam.AddErr(err).AddDesc("invalid CreateProjectReq") + return + } + body ,_ := ioutil.ReadAll(c.Request.Body) + ctx.Resp,ctx.Err = service.CreateProject(c.Request.Header,body,args.ProjectName,args.Public,ctx.Logger) +} \ No newline at end of file diff --git a/pkg/microservice/picket/core/filter/handler/router.go b/pkg/microservice/picket/core/filter/handler/router.go index 9e8aea853..52575eed3 100644 --- a/pkg/microservice/picket/core/filter/handler/router.go +++ b/pkg/microservice/picket/core/filter/handler/router.go @@ -23,9 +23,10 @@ import ( type Router struct{} func (*Router) Inject(router *gin.RouterGroup) { - roles := router.Group("projects") + projects := router.Group("projects") { - roles.GET("", ListProjects) + projects.GET("", ListProjects) + projects.POST("",CreateProject) } workflows := router.Group("workflows") { diff --git a/pkg/microservice/picket/core/filter/service/project.go b/pkg/microservice/picket/core/filter/service/project.go index 9b0a2b51c..946300a80 100644 --- a/pkg/microservice/picket/core/filter/service/project.go +++ b/pkg/microservice/picket/core/filter/service/project.go @@ -1,6 +1,7 @@ package service import ( + "fmt" "net/http" "net/url" "strings" @@ -10,12 +11,32 @@ import ( "github.com/koderover/zadig/pkg/microservice/picket/client/aslan" "github.com/koderover/zadig/pkg/microservice/picket/client/opa" "github.com/koderover/zadig/pkg/setting" + "github.com/koderover/zadig/pkg/shared/client/policy" ) type allowedProjectsData struct { Result []string `json:"result"` } +func CreateProject(header http.Header,body []byte,projectName string,public bool, logger *zap.SugaredLogger)([]byte, error){ + // role binding + if public{ + err := policy.NewDefault().CreateRoleBinding(projectName, &policy.RoleBinding{ + Name: fmt.Sprintf(setting.ReadOnlyRoleBindingFmt, projectName, setting.ReadOnly), + User: "*", + Role: setting.ReadOnly, + Public: true, + }) + logger.Error(err) + } + + res, err := aslan.New().CreateProject(header,body,projectName) + if err !=nil { + policy.NewDefault().DeleteRoleBinding(fmt.Sprintf(setting.ReadOnlyRoleBindingFmt, projectName, setting.ReadOnly),projectName) + } + return res,err +} + func ListProjects(header http.Header, qs url.Values, logger *zap.SugaredLogger) ([]byte, error) { names, err := getVisibleProjects(header, logger) if err != nil { diff --git a/pkg/setting/consts.go b/pkg/setting/consts.go index 61af7f765..dca6919a6 100644 --- a/pkg/setting/consts.go +++ b/pkg/setting/consts.go @@ -497,8 +497,9 @@ type RoleType string const ( Contributor RoleType = "Contributor" - ReadOnly RoleType = "ReadOnly" + ReadOnly RoleType = "readonly" ContributorRoleBindingFmt string = "contributor-project:%s-user:%s" + ReadOnlyRoleBindingFmt string = "readonly-project:%s-user:%s" ) diff --git a/pkg/shared/client/policy/policy.go b/pkg/shared/client/policy/policy.go index 4ec6b2836..be7a8cb07 100644 --- a/pkg/shared/client/policy/policy.go +++ b/pkg/shared/client/policy/policy.go @@ -38,7 +38,7 @@ type RoleBinding struct { Name string User string Role setting.RoleType - Global bool + Public bool } func (c *Client) CreateRoleBinding(projectName string, roleBinding *RoleBinding) error { -- Gitee From 8a89805a514105c2862b4bb5936817808ba6f929 Mon Sep 17 00:00:00 2001 From: mouuii Date: Thu, 28 Oct 2021 16:38:23 +0800 Subject: [PATCH 148/405] product create Signed-off-by: mouuii --- pkg/microservice/picket/core/filter/handler/project.go | 4 ++-- pkg/microservice/picket/core/filter/handler/router.go | 5 ++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/pkg/microservice/picket/core/filter/handler/project.go b/pkg/microservice/picket/core/filter/handler/project.go index e4e1f1bc5..79edfa3fe 100644 --- a/pkg/microservice/picket/core/filter/handler/project.go +++ b/pkg/microservice/picket/core/filter/handler/project.go @@ -19,7 +19,7 @@ func ListProjects(c *gin.Context) { type CreateProjectReq struct { Public bool `json:"public"` - ProjectName string `json:"project_name"` + ProductName string `json:"product_name"` } func CreateProject(c *gin.Context){ @@ -32,5 +32,5 @@ func CreateProject(c *gin.Context){ return } body ,_ := ioutil.ReadAll(c.Request.Body) - ctx.Resp,ctx.Err = service.CreateProject(c.Request.Header,body,args.ProjectName,args.Public,ctx.Logger) + ctx.Resp,ctx.Err = service.CreateProject(c.Request.Header,body,args.ProductName,args.Public,ctx.Logger) } \ No newline at end of file diff --git a/pkg/microservice/picket/core/filter/handler/router.go b/pkg/microservice/picket/core/filter/handler/router.go index 52575eed3..4070548a1 100644 --- a/pkg/microservice/picket/core/filter/handler/router.go +++ b/pkg/microservice/picket/core/filter/handler/router.go @@ -26,7 +26,10 @@ func (*Router) Inject(router *gin.RouterGroup) { projects := router.Group("projects") { projects.GET("", ListProjects) - projects.POST("",CreateProject) + } + products := router.Group("products") + { + products.POST("",CreateProject) } workflows := router.Group("workflows") { -- Gitee From c98bebdf4e0e3d255447937b45b0eeb107028459 Mon Sep 17 00:00:00 2001 From: mouuii Date: Thu, 28 Oct 2021 16:41:42 +0800 Subject: [PATCH 149/405] product create Signed-off-by: mouuii --- .../picket/core/filter/service/project.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/pkg/microservice/picket/core/filter/service/project.go b/pkg/microservice/picket/core/filter/service/project.go index 946300a80..2a8ba6704 100644 --- a/pkg/microservice/picket/core/filter/service/project.go +++ b/pkg/microservice/picket/core/filter/service/project.go @@ -18,9 +18,9 @@ type allowedProjectsData struct { Result []string `json:"result"` } -func CreateProject(header http.Header,body []byte,projectName string,public bool, logger *zap.SugaredLogger)([]byte, error){ +func CreateProject(header http.Header, body []byte, projectName string, public bool, logger *zap.SugaredLogger) ([]byte, error) { // role binding - if public{ + if public { err := policy.NewDefault().CreateRoleBinding(projectName, &policy.RoleBinding{ Name: fmt.Sprintf(setting.ReadOnlyRoleBindingFmt, projectName, setting.ReadOnly), User: "*", @@ -30,11 +30,11 @@ func CreateProject(header http.Header,body []byte,projectName string,public bool logger.Error(err) } - res, err := aslan.New().CreateProject(header,body,projectName) - if err !=nil { - policy.NewDefault().DeleteRoleBinding(fmt.Sprintf(setting.ReadOnlyRoleBindingFmt, projectName, setting.ReadOnly),projectName) + res, err := aslan.New().CreateProject(header, body, projectName) + if err != nil { + policy.NewDefault().DeleteRoleBinding(fmt.Sprintf(setting.ReadOnlyRoleBindingFmt, projectName, setting.ReadOnly), projectName) } - return res,err + return res, err } func ListProjects(header http.Header, qs url.Values, logger *zap.SugaredLogger) ([]byte, error) { -- Gitee From 850382ae0107102168ccd03f297c90bc92c9def4 Mon Sep 17 00:00:00 2001 From: mouuii Date: Thu, 28 Oct 2021 17:01:22 +0800 Subject: [PATCH 150/405] product create Signed-off-by: mouuii --- .../aslan/core/project/handler/product.go | 2 +- .../aslan/core/project/service/product.go | 10 +++++----- .../picket/core/filter/handler/project.go | 17 ++++++++--------- .../picket/core/filter/service/project.go | 9 ++++++--- pkg/setting/consts.go | 10 ++++------ 5 files changed, 24 insertions(+), 24 deletions(-) diff --git a/pkg/microservice/aslan/core/project/handler/product.go b/pkg/microservice/aslan/core/project/handler/product.go index dee7e863b..0d96803f8 100644 --- a/pkg/microservice/aslan/core/project/handler/product.go +++ b/pkg/microservice/aslan/core/project/handler/product.go @@ -182,7 +182,7 @@ func ForkProduct(c *gin.Context) { return } args.ProductName = c.Param("productName") - ctx.Err = projectservice.ForkProduct(ctx.UserName, ctx.RequestID, args, ctx.Logger) + ctx.Err = projectservice.ForkProduct(ctx.UserName, ctx.UserID, ctx.RequestID, args, ctx.Logger) } func UnForkProduct(c *gin.Context) { diff --git a/pkg/microservice/aslan/core/project/service/product.go b/pkg/microservice/aslan/core/project/service/product.go index efc665174..94ba3b8c6 100644 --- a/pkg/microservice/aslan/core/project/service/product.go +++ b/pkg/microservice/aslan/core/project/service/product.go @@ -343,7 +343,7 @@ func DeleteProductTemplate(userName, productName, requestID string, log *zap.Sug //删除自由编排工作流 cl := configclient.New(configbase.ConfigServiceAddress()) - if enable, err := cl.CheckFeature(setting.ModernWorkflowType);err ==nil && enable{ + if enable, err := cl.CheckFeature(setting.ModernWorkflowType); err == nil && enable { collieClient := collie.New(config.CollieAPIAddress()) if err = collieClient.DeleteCIPipelines(productName, log); err != nil { log.Errorf("DeleteProductTemplate Delete productName %s freestyle pipeline err: %v", productName, err) @@ -397,7 +397,7 @@ func DeleteProductTemplate(userName, productName, requestID string, log *zap.Sug return nil } -func ForkProduct(username, requestID string, args *template.ForkProject, log *zap.SugaredLogger) error { +func ForkProduct(username, userid, requestID string, args *template.ForkProject, log *zap.SugaredLogger) error { prodTmpl, err := templaterepo.NewProductColl().Find(args.ProductName) if err != nil { @@ -511,8 +511,8 @@ func ForkProduct(username, requestID string, args *template.ForkProject, log *za UpdateBy: username, } err = policy.NewDefault().CreateRoleBinding(args.ProductName, &policy.RoleBinding{ - Name: fmt.Sprintf(setting.ContributorRoleBindingFmt, args.ProductName, username), - User: username, + Name: fmt.Sprintf(setting.RoleBindFmt, args.ProductName, userid), + User: userid, Role: setting.Contributor, Public: true, }) @@ -534,7 +534,7 @@ func UnForkProduct(userID string, username, productName, workflowName, envName, } policyClient := policy.New() - err := policyClient.DeleteRoleBinding(fmt.Sprintf(setting.ContributorRoleBindingFmt, productName, username), productName) + err := policyClient.DeleteRoleBinding(fmt.Sprintf(setting.RoleBindFmt, userID, setting.Contributor), productName) if err != nil { log.Error("rolebinding delete error") return e.ErrForkProduct diff --git a/pkg/microservice/picket/core/filter/handler/project.go b/pkg/microservice/picket/core/filter/handler/project.go index 79edfa3fe..6d5dff48c 100644 --- a/pkg/microservice/picket/core/filter/handler/project.go +++ b/pkg/microservice/picket/core/filter/handler/project.go @@ -1,8 +1,6 @@ package handler import ( - "io/ioutil" - "github.com/gin-gonic/gin" "github.com/koderover/zadig/pkg/microservice/picket/core/filter/service" @@ -18,19 +16,20 @@ func ListProjects(c *gin.Context) { } type CreateProjectReq struct { - Public bool `json:"public"` - ProductName string `json:"product_name"` + Public bool `json:"public"` + ProductName string `json:"product_name"` } -func CreateProject(c *gin.Context){ +func CreateProject(c *gin.Context) { ctx := internalhandler.NewContext(c) - defer func() {internalhandler.JSONResponse(c,ctx)}() + defer func() { internalhandler.JSONResponse(c, ctx) }() args := new(CreateProjectReq) if err := c.ShouldBindJSON(args); err != nil { ctx.Err = e.ErrInvalidParam.AddErr(err).AddDesc("invalid CreateProjectReq") return } - body ,_ := ioutil.ReadAll(c.Request.Body) - ctx.Resp,ctx.Err = service.CreateProject(c.Request.Header,body,args.ProductName,args.Public,ctx.Logger) -} \ No newline at end of file + body, _ := c.GetRawData() + + ctx.Resp, ctx.Err = service.CreateProject(c.Request.Header, body, args.ProductName, args.Public, ctx.Logger) +} diff --git a/pkg/microservice/picket/core/filter/service/project.go b/pkg/microservice/picket/core/filter/service/project.go index 2a8ba6704..03469e362 100644 --- a/pkg/microservice/picket/core/filter/service/project.go +++ b/pkg/microservice/picket/core/filter/service/project.go @@ -20,19 +20,22 @@ type allowedProjectsData struct { func CreateProject(header http.Header, body []byte, projectName string, public bool, logger *zap.SugaredLogger) ([]byte, error) { // role binding + roleBindingName := fmt.Sprintf(setting.RoleBindFmt, "*", setting.ReadOnly) if public { + err := policy.NewDefault().CreateRoleBinding(projectName, &policy.RoleBinding{ - Name: fmt.Sprintf(setting.ReadOnlyRoleBindingFmt, projectName, setting.ReadOnly), + Name: roleBindingName, User: "*", Role: setting.ReadOnly, Public: true, }) - logger.Error(err) + logger.Errorf("create rolebinding: %s err: %s", roleBindingName, err) } res, err := aslan.New().CreateProject(header, body, projectName) if err != nil { - policy.NewDefault().DeleteRoleBinding(fmt.Sprintf(setting.ReadOnlyRoleBindingFmt, projectName, setting.ReadOnly), projectName) + policy.NewDefault().DeleteRoleBinding(roleBindingName, projectName) + logger.Errorf("delete rolebinding: %s err: %s", roleBindingName, err) } return res, err } diff --git a/pkg/setting/consts.go b/pkg/setting/consts.go index dca6919a6..a6f446610 100644 --- a/pkg/setting/consts.go +++ b/pkg/setting/consts.go @@ -496,12 +496,10 @@ const ChartTemplatesPath = "charts" type RoleType string const ( - Contributor RoleType = "Contributor" - ReadOnly RoleType = "readonly" - ContributorRoleBindingFmt string = "contributor-project:%s-user:%s" - ReadOnlyRoleBindingFmt string = "readonly-project:%s-user:%s" + Contributor RoleType = "contributor" + ReadOnly RoleType = "readonly" + RoleBindFmt string = "userid:%s-role:%s" ) - // ModernWorkflowType 自由编排工作流 -const ModernWorkflowType = "ModernWorkflow" \ No newline at end of file +const ModernWorkflowType = "ModernWorkflow" -- Gitee From 8d5cd5d89d4d14bd39c3d8468e41a747995ef273 Mon Sep 17 00:00:00 2001 From: mouuii Date: Thu, 28 Oct 2021 17:03:19 +0800 Subject: [PATCH 151/405] product create Signed-off-by: mouuii --- pkg/microservice/picket/client/aslan/project.go | 6 +++--- pkg/microservice/picket/core/filter/handler/router.go | 6 ++---- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/pkg/microservice/picket/client/aslan/project.go b/pkg/microservice/picket/client/aslan/project.go index cbad86b73..8eaed21ba 100644 --- a/pkg/microservice/picket/client/aslan/project.go +++ b/pkg/microservice/picket/client/aslan/project.go @@ -19,9 +19,9 @@ func (c *Client) ListProjects(header http.Header, qs url.Values) ([]byte, error) return res.Body(), nil } -func (c *Client) CreateProject(header http.Header,body []byte,projectName string)([]byte,error){ - url := fmt.Sprintf("/project/projects/%s",projectName) - res, err := c.Post(url, httpclient.SetHeadersFromHTTPHeader(header),httpclient.SetBody(body)) +func (c *Client) CreateProject(header http.Header, body []byte, projectName string) ([]byte, error) { + url := fmt.Sprintf("/project/products/%s", projectName) + res, err := c.Post(url, httpclient.SetHeadersFromHTTPHeader(header), httpclient.SetBody(body)) if err != nil { return nil, err } diff --git a/pkg/microservice/picket/core/filter/handler/router.go b/pkg/microservice/picket/core/filter/handler/router.go index 4070548a1..f1a010d32 100644 --- a/pkg/microservice/picket/core/filter/handler/router.go +++ b/pkg/microservice/picket/core/filter/handler/router.go @@ -26,11 +26,9 @@ func (*Router) Inject(router *gin.RouterGroup) { projects := router.Group("projects") { projects.GET("", ListProjects) + projects.POST("", CreateProject) } - products := router.Group("products") - { - products.POST("",CreateProject) - } + workflows := router.Group("workflows") { workflows.GET("testName/:testName", ListTestWorkflows) -- Gitee From ff0d40330342a748a3d7185d1415e4db26993d83 Mon Sep 17 00:00:00 2001 From: lou Date: Thu, 28 Oct 2021 17:14:24 +0800 Subject: [PATCH 152/405] bulk delete roles and bindings Signed-off-by: lou --- pkg/microservice/policy/core/handler/role.go | 30 ++++++++++++++++++- .../policy/core/handler/role_binding.go | 23 ++++++++++++++ .../policy/core/handler/router.go | 4 ++- .../policy/core/repository/mongodb/role.go | 9 ++++++ .../core/repository/mongodb/role_binding.go | 9 ++++++ pkg/microservice/policy/core/service/role.go | 14 ++++++++- .../policy/core/service/role_binding.go | 12 ++++++++ 7 files changed, 98 insertions(+), 3 deletions(-) diff --git a/pkg/microservice/policy/core/handler/role.go b/pkg/microservice/policy/core/handler/role.go index 8f5d06e46..e9db13389 100644 --- a/pkg/microservice/policy/core/handler/role.go +++ b/pkg/microservice/policy/core/handler/role.go @@ -24,6 +24,10 @@ import ( e "github.com/koderover/zadig/pkg/tool/errors" ) +type deleteRolesArgs struct { + Names []string `json:"names"` +} + func CreateRole(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() @@ -169,10 +173,34 @@ func GetPublicRole(c *gin.Context) { func DeleteRole(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() + name := c.Param("name") projectName := c.Query("projectName") + if projectName == "" { + ctx.Err = e.ErrInvalidParam.AddDesc("args projectName can't be empty") + return + } + ctx.Err = service.DeleteRole(name, projectName, ctx.Logger) - return +} + +func DeleteRoles(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + + projectName := c.Query("projectName") + if projectName == "" { + ctx.Err = e.ErrInvalidParam.AddDesc("args projectName can't be empty") + return + } + + args := &deleteRolesArgs{} + if err := c.ShouldBindJSON(args); err != nil { + ctx.Err = err + return + } + + ctx.Err = service.DeleteRoles(args.Names, projectName, ctx.Logger) } func DeletePublicRole(c *gin.Context) { diff --git a/pkg/microservice/policy/core/handler/role_binding.go b/pkg/microservice/policy/core/handler/role_binding.go index fe95f5cfc..95780198c 100644 --- a/pkg/microservice/policy/core/handler/role_binding.go +++ b/pkg/microservice/policy/core/handler/role_binding.go @@ -24,6 +24,10 @@ import ( e "github.com/koderover/zadig/pkg/tool/errors" ) +type deleteRoleBindingsArgs struct { + Names []string `json:"names"` +} + func CreateRoleBinding(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() @@ -79,6 +83,25 @@ func DeleteRoleBinding(c *gin.Context) { ctx.Err = service.DeleteRoleBinding(name, projectName, ctx.Logger) } +func DeleteRoleBindings(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + + projectName := c.Query("projectName") + if projectName == "" { + ctx.Err = e.ErrInvalidParam.AddDesc("args projectName can't be empty") + return + } + + args := &deleteRoleBindingsArgs{} + if err := c.ShouldBindJSON(args); err != nil { + ctx.Err = err + return + } + + ctx.Err = service.DeleteRoleBindings(args.Names, projectName, ctx.Logger) +} + func DeleteSystemRoleBinding(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() diff --git a/pkg/microservice/policy/core/handler/router.go b/pkg/microservice/policy/core/handler/router.go index 41a67e241..a59a42430 100644 --- a/pkg/microservice/policy/core/handler/router.go +++ b/pkg/microservice/policy/core/handler/router.go @@ -26,6 +26,7 @@ func (*Router) Inject(router *gin.RouterGroup) { roles := router.Group("roles") { roles.POST("", CreateRole) + roles.POST("/bulk-delete", DeleteRoles) roles.PATCH("/:name", UpdateRole) roles.PUT("/:name", UpdateOrCreateRole) roles.GET("", ListRoles) @@ -46,7 +47,7 @@ func (*Router) Inject(router *gin.RouterGroup) { systemRoles := router.Group("system-roles") { systemRoles.POST("", CreateSystemRole) - systemRoles.PUT("/:name",UpdateOrCreateSystemRole) + systemRoles.PUT("/:name", UpdateOrCreateSystemRole) systemRoles.GET("", ListSystemRoles) systemRoles.DELETE("/:name", DeleteSystemRole) } @@ -56,6 +57,7 @@ func (*Router) Inject(router *gin.RouterGroup) { roleBindings.POST("", CreateRoleBinding) roleBindings.GET("", ListRoleBindings) roleBindings.DELETE("/:name", DeleteRoleBinding) + roleBindings.POST("/bulk-delete", DeleteRoleBindings) } systemRoleBindings := router.Group("system-rolebindings") diff --git a/pkg/microservice/policy/core/repository/mongodb/role.go b/pkg/microservice/policy/core/repository/mongodb/role.go index 6ac74026c..ff13c67fd 100644 --- a/pkg/microservice/policy/core/repository/mongodb/role.go +++ b/pkg/microservice/policy/core/repository/mongodb/role.go @@ -129,6 +129,15 @@ func (c *RoleColl) Delete(name string, projectName string) error { return err } +func (c *RoleColl) DeleteMany(names []string, projectName string) error { + query := bson.M{"namespace": projectName} + if len(names) > 0 { + query["name"] = bson.M{"$in": names} + } + _, err := c.Collection.DeleteMany(context.TODO(), query) + return err +} + func (c *RoleColl) UpdateRole(obj *models.Role) error { // avoid panic issue if obj == nil { diff --git a/pkg/microservice/policy/core/repository/mongodb/role_binding.go b/pkg/microservice/policy/core/repository/mongodb/role_binding.go index fa3ff2c30..831a5abb6 100644 --- a/pkg/microservice/policy/core/repository/mongodb/role_binding.go +++ b/pkg/microservice/policy/core/repository/mongodb/role_binding.go @@ -107,6 +107,15 @@ func (c *RoleBindingColl) Delete(name string, projectName string) error { return err } +func (c *RoleBindingColl) DeleteMany(names []string, projectName string) error { + query := bson.M{"namespace": projectName} + if len(names) > 0 { + query["name"] = bson.M{"$in": names} + } + _, err := c.Collection.DeleteMany(context.TODO(), query) + return err +} + func (c *RoleBindingColl) Create(obj *models.RoleBinding) error { if obj == nil { return fmt.Errorf("nil object") diff --git a/pkg/microservice/policy/core/service/role.go b/pkg/microservice/policy/core/service/role.go index d7379ff9e..bb91ecc4d 100644 --- a/pkg/microservice/policy/core/service/role.go +++ b/pkg/microservice/policy/core/service/role.go @@ -121,6 +121,18 @@ func GetRole(ns, name string, _ *zap.SugaredLogger) (*Role, error) { return res, nil } -func DeleteRole(name string, projectName string, _ *zap.SugaredLogger) (err error) { +func DeleteRole(name string, projectName string, _ *zap.SugaredLogger) error { return mongodb.NewRoleColl().Delete(name, projectName) } + +func DeleteRoles(names []string, projectName string, _ *zap.SugaredLogger) error { + if len(names) == 0 { + return nil + } + + if names[0] == "*" { + names = []string{} + } + + return mongodb.NewRoleColl().DeleteMany(names, projectName) +} diff --git a/pkg/microservice/policy/core/service/role_binding.go b/pkg/microservice/policy/core/service/role_binding.go index 51ce9dc22..9fbdc5c67 100644 --- a/pkg/microservice/policy/core/service/role_binding.go +++ b/pkg/microservice/policy/core/service/role_binding.go @@ -71,6 +71,18 @@ func DeleteRoleBinding(name string, projectName string, _ *zap.SugaredLogger) er return mongodb.NewRoleBindingColl().Delete(name, projectName) } +func DeleteRoleBindings(names []string, projectName string, _ *zap.SugaredLogger) error { + if len(names) == 0 { + return nil + } + + if names[0] == "*" { + names = []string{} + } + + return mongodb.NewRoleBindingColl().DeleteMany(names, projectName) +} + func createRoleBindingObject(ns string, rb *RoleBinding, logger *zap.SugaredLogger) (*models.RoleBinding, error) { nsRole := ns if rb.Public { -- Gitee From 56146717e49b48b52ee31c19574e2aae3d0184e3 Mon Sep 17 00:00:00 2001 From: mouuii Date: Thu, 28 Oct 2021 17:43:01 +0800 Subject: [PATCH 153/405] rolebinding fmt Signed-off-by: mouuii --- pkg/microservice/aslan/core/project/service/product.go | 4 ++-- pkg/microservice/picket/client/aslan/project.go | 5 ++--- pkg/microservice/picket/core/filter/service/project.go | 5 ++--- pkg/setting/consts.go | 3 ++- 4 files changed, 8 insertions(+), 9 deletions(-) diff --git a/pkg/microservice/aslan/core/project/service/product.go b/pkg/microservice/aslan/core/project/service/product.go index 94ba3b8c6..fbe696a45 100644 --- a/pkg/microservice/aslan/core/project/service/product.go +++ b/pkg/microservice/aslan/core/project/service/product.go @@ -511,7 +511,7 @@ func ForkProduct(username, userid, requestID string, args *template.ForkProject, UpdateBy: username, } err = policy.NewDefault().CreateRoleBinding(args.ProductName, &policy.RoleBinding{ - Name: fmt.Sprintf(setting.RoleBindFmt, args.ProductName, userid), + Name: fmt.Sprintf(setting.RoleBindingNameFmt, args.ProductName, userid, args.ProductName), User: userid, Role: setting.Contributor, Public: true, @@ -534,7 +534,7 @@ func UnForkProduct(userID string, username, productName, workflowName, envName, } policyClient := policy.New() - err := policyClient.DeleteRoleBinding(fmt.Sprintf(setting.RoleBindFmt, userID, setting.Contributor), productName) + err := policyClient.DeleteRoleBinding(fmt.Sprintf(setting.RoleBindingNameFmt, userID, setting.Contributor, productName), productName) if err != nil { log.Error("rolebinding delete error") return e.ErrForkProduct diff --git a/pkg/microservice/picket/client/aslan/project.go b/pkg/microservice/picket/client/aslan/project.go index 8eaed21ba..023b3fb31 100644 --- a/pkg/microservice/picket/client/aslan/project.go +++ b/pkg/microservice/picket/client/aslan/project.go @@ -1,7 +1,6 @@ package aslan import ( - "fmt" "net/http" "net/url" @@ -19,8 +18,8 @@ func (c *Client) ListProjects(header http.Header, qs url.Values) ([]byte, error) return res.Body(), nil } -func (c *Client) CreateProject(header http.Header, body []byte, projectName string) ([]byte, error) { - url := fmt.Sprintf("/project/products/%s", projectName) +func (c *Client) CreateProject(header http.Header, body []byte) ([]byte, error) { + url := "/project/products" res, err := c.Post(url, httpclient.SetHeadersFromHTTPHeader(header), httpclient.SetBody(body)) if err != nil { return nil, err diff --git a/pkg/microservice/picket/core/filter/service/project.go b/pkg/microservice/picket/core/filter/service/project.go index 03469e362..a0eab3786 100644 --- a/pkg/microservice/picket/core/filter/service/project.go +++ b/pkg/microservice/picket/core/filter/service/project.go @@ -20,9 +20,8 @@ type allowedProjectsData struct { func CreateProject(header http.Header, body []byte, projectName string, public bool, logger *zap.SugaredLogger) ([]byte, error) { // role binding - roleBindingName := fmt.Sprintf(setting.RoleBindFmt, "*", setting.ReadOnly) + roleBindingName := fmt.Sprintf(setting.RoleBindingNameFmt, "*", setting.ReadOnly, projectName) if public { - err := policy.NewDefault().CreateRoleBinding(projectName, &policy.RoleBinding{ Name: roleBindingName, User: "*", @@ -32,7 +31,7 @@ func CreateProject(header http.Header, body []byte, projectName string, public b logger.Errorf("create rolebinding: %s err: %s", roleBindingName, err) } - res, err := aslan.New().CreateProject(header, body, projectName) + res, err := aslan.New().CreateProject(header, body) if err != nil { policy.NewDefault().DeleteRoleBinding(roleBindingName, projectName) logger.Errorf("delete rolebinding: %s err: %s", roleBindingName, err) diff --git a/pkg/setting/consts.go b/pkg/setting/consts.go index a6f446610..a739ce5a5 100644 --- a/pkg/setting/consts.go +++ b/pkg/setting/consts.go @@ -498,7 +498,8 @@ type RoleType string const ( Contributor RoleType = "contributor" ReadOnly RoleType = "readonly" - RoleBindFmt string = "userid:%s-role:%s" + //scope is in {namespaced, public, system} + RoleBindingNameFmt string = "user:%s,role:%s,project:%s" ) // ModernWorkflowType 自由编排工作流 -- Gitee From b9f829c2a76b3e9be953f35167794aa133cf3b67 Mon Sep 17 00:00:00 2001 From: mouuii Date: Thu, 28 Oct 2021 17:47:19 +0800 Subject: [PATCH 154/405] rolebinding fmt Signed-off-by: mouuii --- pkg/setting/consts.go | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/pkg/setting/consts.go b/pkg/setting/consts.go index a739ce5a5..88efd0d62 100644 --- a/pkg/setting/consts.go +++ b/pkg/setting/consts.go @@ -496,10 +496,9 @@ const ChartTemplatesPath = "charts" type RoleType string const ( - Contributor RoleType = "contributor" - ReadOnly RoleType = "readonly" - //scope is in {namespaced, public, system} - RoleBindingNameFmt string = "user:%s,role:%s,project:%s" + Contributor RoleType = "contributor" + ReadOnly RoleType = "readonly" + RoleBindingNameFmt string = "user:%s,role:%s,project:%s" ) // ModernWorkflowType 自由编排工作流 -- Gitee From 257f594c6932d46ab268582d131cbc1405ecf8fc Mon Sep 17 00:00:00 2001 From: lou Date: Thu, 28 Oct 2021 19:01:15 +0800 Subject: [PATCH 155/405] remove orgId Signed-off-by: lou --- .../repository/models/delivery_version.go | 1 - .../repository/mongodb/delivery_version.go | 13 +++++---- .../repository/mongodb/registry_namespace.go | 22 --------------- .../aslan/core/common/service/delivery.go | 6 ++--- .../aslan/core/common/service/workflow.go | 2 +- .../aslan/core/delivery/handler/product.go | 12 ++------- .../aslan/core/delivery/handler/version.go | 27 +++---------------- .../aslan/core/delivery/service/product.go | 4 +-- .../aslan/core/delivery/service/version.go | 3 +-- .../workflow/service/workflow/nsq_handlers.go | 2 +- 10 files changed, 18 insertions(+), 74 deletions(-) diff --git a/pkg/microservice/aslan/core/common/repository/models/delivery_version.go b/pkg/microservice/aslan/core/common/repository/models/delivery_version.go index 785bc6384..459d7f96f 100644 --- a/pkg/microservice/aslan/core/common/repository/models/delivery_version.go +++ b/pkg/microservice/aslan/core/common/repository/models/delivery_version.go @@ -22,7 +22,6 @@ import ( type DeliveryVersion struct { ID primitive.ObjectID `bson:"_id,omitempty" json:"id,omitempty"` - OrgID int `bson:"org_id" json:"orgId"` Version string `bson:"version" json:"version"` ProductName string `bson:"product_name" json:"productName"` WorkflowName string `bson:"workflow_name" json:"workflowName"` diff --git a/pkg/microservice/aslan/core/common/repository/mongodb/delivery_version.go b/pkg/microservice/aslan/core/common/repository/mongodb/delivery_version.go index 69b56e10b..bae5fc668 100644 --- a/pkg/microservice/aslan/core/common/repository/mongodb/delivery_version.go +++ b/pkg/microservice/aslan/core/common/repository/mongodb/delivery_version.go @@ -33,7 +33,6 @@ import ( type DeliveryVersionArgs struct { ID string `json:"id"` - OrgID int `json:"orgId"` ProductName string `json:"productName"` WorkflowName string `json:"workflowName"` TaskID int `json:"taskId"` @@ -91,7 +90,7 @@ func (c *DeliveryVersionColl) Find(args *DeliveryVersionArgs) ([]*models.Deliver } var resp []*models.DeliveryVersion - query := bson.M{"org_id": args.OrgID, "deleted_at": 0} + query := bson.M{"deleted_at": 0} if args.ProductName != "" { query["product_name"] = args.ProductName } @@ -137,9 +136,9 @@ func (c *DeliveryVersionColl) Delete(id string) error { return err } -func (c *DeliveryVersionColl) ListDeliveryVersions(productName string, orgID int) ([]*models.DeliveryVersion, error) { +func (c *DeliveryVersionColl) ListDeliveryVersions(productName string) ([]*models.DeliveryVersion, error) { var resp []*models.DeliveryVersion - query := bson.M{"org_id": orgID, "deleted_at": 0} + query := bson.M{"deleted_at": 0} if productName != "" { query["product_name"] = productName } @@ -167,7 +166,7 @@ func (c *DeliveryVersionColl) Get(args *DeliveryVersionArgs) (*models.DeliveryVe if args.ID != "" { query = bson.M{"_id": args.ID, "deleted_at": 0} } else { - query = bson.M{"org_id": args.OrgID, "product_name": args.ProductName, "workflow_name": args.WorkflowName, "task_id": args.TaskID, "deleted_at": 0} + query = bson.M{"product_name": args.ProductName, "workflow_name": args.WorkflowName, "task_id": args.TaskID, "deleted_at": 0} } err := c.FindOne(context.TODO(), query).Decode(&resp) @@ -205,9 +204,9 @@ func (c *DeliveryVersionColl) Update(args *models.DeliveryVersion) error { return err } -func (c *DeliveryVersionColl) FindProducts(orgID int) ([]string, error) { +func (c *DeliveryVersionColl) FindProducts() ([]string, error) { resp := make([]string, 0) - query := bson.M{"org_id": orgID, "deleted_at": 0} + query := bson.M{"deleted_at": 0} ret, err := c.Distinct(context.TODO(), "product_name", query) if err != nil { return nil, err diff --git a/pkg/microservice/aslan/core/common/repository/mongodb/registry_namespace.go b/pkg/microservice/aslan/core/common/repository/mongodb/registry_namespace.go index 27c67248e..539da8c35 100644 --- a/pkg/microservice/aslan/core/common/repository/mongodb/registry_namespace.go +++ b/pkg/microservice/aslan/core/common/repository/mongodb/registry_namespace.go @@ -148,28 +148,6 @@ func (r *RegistryNamespaceColl) FindAll(opt *FindRegOps) ([]*models.RegistryName return resp, err } -func (r *RegistryNamespaceColl) List(orgID int, regType string) ([]*models.RegistryNamespace, error) { - query := bson.M{"org_id": orgID} - if regType != "" { - query["reg_type"] = regType - } - - ctx := context.Background() - opts := options.Find() - resp := make([]*models.RegistryNamespace, 0) - cursor, err := r.Collection.Find(ctx, query, opts) - if err != nil { - return nil, err - } - - err = cursor.All(ctx, &resp) - if err != nil { - return nil, err - } - - return resp, err -} - func (r *RegistryNamespaceColl) Update(id string, args *models.RegistryNamespace) error { if args == nil { return errors.New("nil Install") diff --git a/pkg/microservice/aslan/core/common/service/delivery.go b/pkg/microservice/aslan/core/common/service/delivery.go index 91d40737f..74baaf6f7 100644 --- a/pkg/microservice/aslan/core/common/service/delivery.go +++ b/pkg/microservice/aslan/core/common/service/delivery.go @@ -36,7 +36,7 @@ import ( ) func DeleteDeliveryInfos(productName string, log *zap.SugaredLogger) error { - deliveryVersions, err := mongodb.NewDeliveryVersionColl().ListDeliveryVersions(productName, 1) + deliveryVersions, err := mongodb.NewDeliveryVersionColl().ListDeliveryVersions(productName) if err != nil { log.Errorf("delete DeleteDeliveryInfo error: %v", err) return e.ErrDeleteDeliveryVersion @@ -71,9 +71,8 @@ func DeleteDeliveryInfos(productName string, log *zap.SugaredLogger) error { return nil } -func AddDeliveryVersion(orgID, taskID int, productName, workflowName string, pipelineTask *taskmodels.Task, logger *zap.SugaredLogger) error { +func AddDeliveryVersion(taskID int, productName, workflowName string, pipelineTask *taskmodels.Task, logger *zap.SugaredLogger) error { deliveryVersionArgs := &mongodb.DeliveryVersionArgs{ - OrgID: orgID, ProductName: productName, WorkflowName: workflowName, TaskID: taskID, @@ -87,7 +86,6 @@ func AddDeliveryVersion(orgID, taskID int, productName, workflowName string, pip } deliveryVersion := new(commonmodels.DeliveryVersion) - deliveryVersion.OrgID = orgID deliveryVersion.WorkflowName = workflowName deliveryVersion.TaskID = taskID deliveryVersion.ProductName = productName diff --git a/pkg/microservice/aslan/core/common/service/workflow.go b/pkg/microservice/aslan/core/common/service/workflow.go index 325a3f3de..beb0c3516 100644 --- a/pkg/microservice/aslan/core/common/service/workflow.go +++ b/pkg/microservice/aslan/core/common/service/workflow.go @@ -112,7 +112,7 @@ func DeleteWorkflow(workflowName, requestID string, isDeletingProductTmpl bool, log.Errorf("PipelineTaskV2.DeleteByPipelineName error: %v", err) } - if deliveryVersions, err := mongodb.NewDeliveryVersionColl().Find(&mongodb.DeliveryVersionArgs{OrgID: 1, WorkflowName: workflowName}); err == nil { + if deliveryVersions, err := mongodb.NewDeliveryVersionColl().Find(&mongodb.DeliveryVersionArgs{WorkflowName: workflowName}); err == nil { for _, deliveryVersion := range deliveryVersions { if err := mongodb.NewDeliveryVersionColl().Delete(deliveryVersion.ID.Hex()); err != nil { log.Errorf("DeleteWorkflow.DeliveryVersion.Delete error: %v", err) diff --git a/pkg/microservice/aslan/core/delivery/handler/product.go b/pkg/microservice/aslan/core/delivery/handler/product.go index ccdf392aa..ad252633a 100644 --- a/pkg/microservice/aslan/core/delivery/handler/product.go +++ b/pkg/microservice/aslan/core/delivery/handler/product.go @@ -17,8 +17,6 @@ limitations under the License. package handler import ( - "strconv" - "github.com/gin-gonic/gin" deliveryservice "github.com/koderover/zadig/pkg/microservice/aslan/core/delivery/service" @@ -29,14 +27,8 @@ import ( func ListDeliveryProduct(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - //params validate - orgIDStr := c.Query("orgId") - orgID, err := strconv.Atoi(orgIDStr) - if err != nil { - ctx.Err = e.ErrInvalidParam.AddDesc("orgId can't be empty!") - return - } - ctx.Resp, ctx.Err = deliveryservice.FindDeliveryProduct(orgID, ctx.Logger) + + ctx.Resp, ctx.Err = deliveryservice.FindDeliveryProduct(ctx.Logger) } func GetProductByDeliveryInfo(c *gin.Context) { diff --git a/pkg/microservice/aslan/core/delivery/handler/version.go b/pkg/microservice/aslan/core/delivery/handler/version.go index 920e2e526..44ea5e998 100644 --- a/pkg/microservice/aslan/core/delivery/handler/version.go +++ b/pkg/microservice/aslan/core/delivery/handler/version.go @@ -96,16 +96,10 @@ type DeliverySecurityStatsInfo struct { func ListDeliveryVersion(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - //params validate - orgIDStr := c.Query("orgId") - orgID, err := strconv.Atoi(orgIDStr) - if err != nil { - ctx.Err = e.ErrInvalidParam.AddDesc("orgId can't be empty!") - return - } taskIDStr := c.Query("taskId") var taskID = 0 + var err error if taskIDStr != "" { taskID, err = strconv.Atoi(taskIDStr) if err != nil { @@ -143,7 +137,6 @@ func ListDeliveryVersion(c *gin.Context) { serviceName := c.Query("serviceName") version := new(commonrepo.DeliveryVersionArgs) - version.OrgID = orgID version.ProductName = c.Query("projectName") version.WorkflowName = c.Query("workflowName") version.TaskID = taskID @@ -286,15 +279,8 @@ type DeliveryFileInfo struct { func ListPackagesVersion(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - //params validate - orgIDStr := c.Query("orgId") - orgID, err := strconv.Atoi(orgIDStr) - if err != nil { - ctx.Err = e.ErrInvalidParam.AddDesc("orgId can't be empty!") - return - } + version := &commonrepo.DeliveryVersionArgs{ - OrgID: orgID, ProductName: c.Query("projectName"), } deliveryVersions, err := deliveryservice.FindDeliveryVersion(version, ctx.Logger) @@ -383,12 +369,5 @@ func ListDeliveryServiceNames(c *gin.Context) { defer func() { internalhandler.JSONResponse(c, ctx) }() productName := c.Query("projectName") - orgIDStr := c.Query("orgId") - orgID, err := strconv.Atoi(orgIDStr) - if err != nil { - ctx.Err = e.ErrInvalidParam.AddDesc("orgId can't be empty!") - return - } - - ctx.Resp, ctx.Err = deliveryservice.ListDeliveryServiceNames(orgID, productName, ctx.Logger) + ctx.Resp, ctx.Err = deliveryservice.ListDeliveryServiceNames(productName, ctx.Logger) } diff --git a/pkg/microservice/aslan/core/delivery/service/product.go b/pkg/microservice/aslan/core/delivery/service/product.go index 9b2fdf8b7..d9c4e5612 100644 --- a/pkg/microservice/aslan/core/delivery/service/product.go +++ b/pkg/microservice/aslan/core/delivery/service/product.go @@ -24,8 +24,8 @@ import ( e "github.com/koderover/zadig/pkg/tool/errors" ) -func FindDeliveryProduct(orgID int, log *zap.SugaredLogger) ([]string, error) { - productNames, err := commonrepo.NewDeliveryVersionColl().FindProducts(orgID) +func FindDeliveryProduct(log *zap.SugaredLogger) ([]string, error) { + productNames, err := commonrepo.NewDeliveryVersionColl().FindProducts() if err != nil { log.Errorf("find FindDeliveryProduct error: %v", err) return []string{}, e.ErrFindDeliveryProducts diff --git a/pkg/microservice/aslan/core/delivery/service/version.go b/pkg/microservice/aslan/core/delivery/service/version.go index d9498b649..1c013f689 100644 --- a/pkg/microservice/aslan/core/delivery/service/version.go +++ b/pkg/microservice/aslan/core/delivery/service/version.go @@ -52,11 +52,10 @@ func DeleteDeliveryVersion(args *commonrepo.DeliveryVersionArgs, log *zap.Sugare return nil } -func ListDeliveryServiceNames(orgID int, productName string, log *zap.SugaredLogger) ([]string, error) { +func ListDeliveryServiceNames(productName string, log *zap.SugaredLogger) ([]string, error) { serviceNames := sets.String{} version := new(commonrepo.DeliveryVersionArgs) - version.OrgID = orgID version.ProductName = productName deliveryVersions, err := FindDeliveryVersion(version, log) if err != nil { diff --git a/pkg/microservice/aslan/core/workflow/service/workflow/nsq_handlers.go b/pkg/microservice/aslan/core/workflow/service/workflow/nsq_handlers.go index fbfa0e5cd..0b2692b2e 100644 --- a/pkg/microservice/aslan/core/workflow/service/workflow/nsq_handlers.go +++ b/pkg/microservice/aslan/core/workflow/service/workflow/nsq_handlers.go @@ -691,7 +691,7 @@ func (h *TaskAckHandler) createVersion(pt *task.Task) error { } if isDeploy { //版本交付 - return commonservice.AddDeliveryVersion(1, int(pt.TaskID), pt.ProductName, pt.PipelineName, pt, log.SugaredLogger()) + return commonservice.AddDeliveryVersion(int(pt.TaskID), pt.ProductName, pt.PipelineName, pt, log.SugaredLogger()) } } } -- Gitee From 5b5a26a8d3c49ee05c722f60037ea8711a0b9d7c Mon Sep 17 00:00:00 2001 From: lou Date: Thu, 28 Oct 2021 19:57:29 +0800 Subject: [PATCH 156/405] delete rolebindings when role is deleted Signed-off-by: lou --- .../policy/core/repository/mongodb/role_binding.go | 11 +++++++++++ pkg/microservice/policy/core/service/role.go | 9 +++++++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/pkg/microservice/policy/core/repository/mongodb/role_binding.go b/pkg/microservice/policy/core/repository/mongodb/role_binding.go index 831a5abb6..187890445 100644 --- a/pkg/microservice/policy/core/repository/mongodb/role_binding.go +++ b/pkg/microservice/policy/core/repository/mongodb/role_binding.go @@ -113,6 +113,17 @@ func (c *RoleBindingColl) DeleteMany(names []string, projectName string) error { query["name"] = bson.M{"$in": names} } _, err := c.Collection.DeleteMany(context.TODO(), query) + + return err +} +func (c *RoleBindingColl) DeleteByRole(roleName string, projectName string) error { + query := bson.M{"role_ref.name": roleName, "role_ref.namespace": projectName} + // if projectName == "", delete all rolebindings in all namespaces + if projectName != "" { + query["namespace"] = projectName + } + _, err := c.Collection.DeleteMany(context.TODO(), query) + return err } diff --git a/pkg/microservice/policy/core/service/role.go b/pkg/microservice/policy/core/service/role.go index bb91ecc4d..8a0f3b112 100644 --- a/pkg/microservice/policy/core/service/role.go +++ b/pkg/microservice/policy/core/service/role.go @@ -121,8 +121,13 @@ func GetRole(ns, name string, _ *zap.SugaredLogger) (*Role, error) { return res, nil } -func DeleteRole(name string, projectName string, _ *zap.SugaredLogger) error { - return mongodb.NewRoleColl().Delete(name, projectName) +func DeleteRole(name string, projectName string, logger *zap.SugaredLogger) error { + err := mongodb.NewRoleColl().Delete(name, projectName) + if err != nil { + logger.Errorf("Failed to delete role %s in project %s, err: %s", name, projectName, err) + } + + return mongodb.NewRoleBindingColl().DeleteByRole(name, projectName) } func DeleteRoles(names []string, projectName string, _ *zap.SugaredLogger) error { -- Gitee From b0dc33697eed13a094262d0ddf439c5e97395eb1 Mon Sep 17 00:00:00 2001 From: lou Date: Fri, 29 Oct 2021 11:15:37 +0800 Subject: [PATCH 157/405] list rolebindings in picket --- pkg/config/config.go | 9 ++++ .../aslan/core/project/service/product.go | 8 ++-- .../picket/client/policy/client.go | 25 ++++++++++ .../picket/client/policy/rolebinding.go | 27 +++++++++++ .../picket/core/filter/handler/rolebinding.go | 22 +++++++++ .../picket/core/filter/handler/router.go | 5 ++ .../picket/core/filter/service/project.go | 23 +++++---- .../picket/core/filter/service/rolebinding.go | 47 +++++++++++++++++++ .../core/repository/mongodb/role_binding.go | 15 ++++++ .../core/service/bundle/exemption_urls.go | 22 ++++++++- pkg/microservice/policy/core/service/role.go | 14 +++++- pkg/setting/types.go | 11 +++-- pkg/shared/client/policy/policy.go | 20 +++++--- pkg/shared/client/user/client.go | 41 ++++++++++++++++ pkg/shared/client/user/user.go | 32 +++++++++++++ 15 files changed, 297 insertions(+), 24 deletions(-) create mode 100644 pkg/microservice/picket/client/policy/client.go create mode 100644 pkg/microservice/picket/client/policy/rolebinding.go create mode 100644 pkg/microservice/picket/core/filter/handler/rolebinding.go create mode 100644 pkg/microservice/picket/core/filter/service/rolebinding.go create mode 100644 pkg/shared/client/user/client.go create mode 100644 pkg/shared/client/user/user.go diff --git a/pkg/config/config.go b/pkg/config/config.go index 35ee51b92..88dd35612 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -190,6 +190,15 @@ func PolicyServiceAddress() string { return GetServiceAddress(s.Name, s.Port) } +func UserServiceInfo() *setting.ServiceInfo { + return GetServiceByCode(setting.User) +} + +func UserServiceAddress() string { + s := UserServiceInfo() + return GetServiceAddress(s.Name, s.Port) +} + func GetServiceAddress(name string, port int32) string { return fmt.Sprintf("http://%s:%d", name, port) } diff --git a/pkg/microservice/aslan/core/project/service/product.go b/pkg/microservice/aslan/core/project/service/product.go index fbe696a45..78a64f51b 100644 --- a/pkg/microservice/aslan/core/project/service/product.go +++ b/pkg/microservice/aslan/core/project/service/product.go @@ -397,7 +397,7 @@ func DeleteProductTemplate(userName, productName, requestID string, log *zap.Sug return nil } -func ForkProduct(username, userid, requestID string, args *template.ForkProject, log *zap.SugaredLogger) error { +func ForkProduct(username, uid, requestID string, args *template.ForkProject, log *zap.SugaredLogger) error { prodTmpl, err := templaterepo.NewProductColl().Find(args.ProductName) if err != nil { @@ -511,9 +511,9 @@ func ForkProduct(username, userid, requestID string, args *template.ForkProject, UpdateBy: username, } err = policy.NewDefault().CreateRoleBinding(args.ProductName, &policy.RoleBinding{ - Name: fmt.Sprintf(setting.RoleBindingNameFmt, args.ProductName, userid, args.ProductName), - User: userid, - Role: setting.Contributor, + Name: fmt.Sprintf(setting.RoleBindingNameFmt, args.ProductName, uid, args.ProductName), + UID: uid, + Role: string(setting.Contributor), Public: true, }) if err != nil { diff --git a/pkg/microservice/picket/client/policy/client.go b/pkg/microservice/picket/client/policy/client.go new file mode 100644 index 000000000..18b72463d --- /dev/null +++ b/pkg/microservice/picket/client/policy/client.go @@ -0,0 +1,25 @@ +package policy + +import ( + "github.com/koderover/zadig/pkg/config" + "github.com/koderover/zadig/pkg/tool/httpclient" +) + +type Client struct { + *httpclient.Client + + host string +} + +func New() *Client { + host := config.PolicyServiceAddress() + + c := httpclient.New( + httpclient.SetHostURL(host + "/api/v1"), + ) + + return &Client{ + Client: c, + host: host, + } +} diff --git a/pkg/microservice/picket/client/policy/rolebinding.go b/pkg/microservice/picket/client/policy/rolebinding.go new file mode 100644 index 000000000..faa2e2a70 --- /dev/null +++ b/pkg/microservice/picket/client/policy/rolebinding.go @@ -0,0 +1,27 @@ +package policy + +import ( + "net/http" + "net/url" + + "github.com/koderover/zadig/pkg/tool/httpclient" +) + +type RoleBinding struct { + Name string `json:"name"` + UID string `json:"uid"` + Role string `json:"role"` + Public bool `json:"public"` +} + +func (c *Client) ListRoleBindings(header http.Header, qs url.Values) ([]*RoleBinding, error) { + url := "/rolebindings" + + res := make([]*RoleBinding, 0) + _, err := c.Get(url, httpclient.SetHeadersFromHTTPHeader(header), httpclient.SetQueryParamsFromValues(qs), httpclient.SetResult(&res)) + if err != nil { + return nil, err + } + + return res, nil +} diff --git a/pkg/microservice/picket/core/filter/handler/rolebinding.go b/pkg/microservice/picket/core/filter/handler/rolebinding.go new file mode 100644 index 000000000..9a69939c4 --- /dev/null +++ b/pkg/microservice/picket/core/filter/handler/rolebinding.go @@ -0,0 +1,22 @@ +package handler + +import ( + "github.com/gin-gonic/gin" + + "github.com/koderover/zadig/pkg/microservice/picket/core/filter/service" + internalhandler "github.com/koderover/zadig/pkg/shared/handler" + e "github.com/koderover/zadig/pkg/tool/errors" +) + +func ListRoleBindings(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + + projectName := c.Query("projectName") + if projectName == "" { + ctx.Err = e.ErrInvalidParam.AddDesc("projectName is empty") + return + } + + ctx.Resp, ctx.Err = service.ListRoleBindings(c.Request.Header, c.Request.URL.Query(), ctx.Logger) +} diff --git a/pkg/microservice/picket/core/filter/handler/router.go b/pkg/microservice/picket/core/filter/handler/router.go index f1a010d32..2f4bcc955 100644 --- a/pkg/microservice/picket/core/filter/handler/router.go +++ b/pkg/microservice/picket/core/filter/handler/router.go @@ -33,4 +33,9 @@ func (*Router) Inject(router *gin.RouterGroup) { { workflows.GET("testName/:testName", ListTestWorkflows) } + + rolebindings := router.Group("rolebindings") + { + rolebindings.GET("", ListRoleBindings) + } } diff --git a/pkg/microservice/picket/core/filter/service/project.go b/pkg/microservice/picket/core/filter/service/project.go index a0eab3786..dbeb42d97 100644 --- a/pkg/microservice/picket/core/filter/service/project.go +++ b/pkg/microservice/picket/core/filter/service/project.go @@ -22,21 +22,28 @@ func CreateProject(header http.Header, body []byte, projectName string, public b // role binding roleBindingName := fmt.Sprintf(setting.RoleBindingNameFmt, "*", setting.ReadOnly, projectName) if public { - err := policy.NewDefault().CreateRoleBinding(projectName, &policy.RoleBinding{ + if err := policy.NewDefault().CreateRoleBinding(projectName, &policy.RoleBinding{ Name: roleBindingName, - User: "*", - Role: setting.ReadOnly, + UID: "*", + Role: string(setting.ReadOnly), Public: true, - }) - logger.Errorf("create rolebinding: %s err: %s", roleBindingName, err) + }); err != nil { + logger.Errorf("Failed to create rolebinding %s, err: %s", roleBindingName, err) + return nil, err + } } res, err := aslan.New().CreateProject(header, body) if err != nil { - policy.NewDefault().DeleteRoleBinding(roleBindingName, projectName) - logger.Errorf("delete rolebinding: %s err: %s", roleBindingName, err) + logger.Errorf("Failed to create project %s, err: %s", projectName, err) + if err1 := policy.NewDefault().DeleteRoleBinding(roleBindingName, projectName); err1 != nil { + logger.Warnf("Failed to delete role binding, err: %s", err1) + } + + return nil, err } - return res, err + + return res, nil } func ListProjects(header http.Header, qs url.Values, logger *zap.SugaredLogger) ([]byte, error) { diff --git a/pkg/microservice/picket/core/filter/service/rolebinding.go b/pkg/microservice/picket/core/filter/service/rolebinding.go new file mode 100644 index 000000000..9cf53c128 --- /dev/null +++ b/pkg/microservice/picket/core/filter/service/rolebinding.go @@ -0,0 +1,47 @@ +package service + +import ( + "net/http" + "net/url" + + "go.uber.org/zap" + + "github.com/koderover/zadig/pkg/microservice/picket/client/policy" + "github.com/koderover/zadig/pkg/shared/client/user" +) + +type roleBinding struct { + *policy.RoleBinding + Username string `json:"username"` +} + +func ListRoleBindings(header http.Header, qs url.Values, logger *zap.SugaredLogger) ([]*roleBinding, error) { + rbs, err := policy.New().ListRoleBindings(header, qs) + if err != nil { + logger.Errorf("Failed to list rolebindings, err: %s", err) + return nil, err + } + + var uids []string + uidToRoleBinding := make(map[string]*roleBinding) + for _, rb := range rbs { + uids = append(uids, rb.UID) + uidToRoleBinding[rb.UID] = &roleBinding{RoleBinding: rb} + } + + users, err := user.New().ListUsers(&user.SearchArgs{UIDs: uids}) + if err != nil { + logger.Errorf("Failed to list users, err: %s", err) + return nil, err + } + + var res []*roleBinding + for _, u := range users { + if rb, ok := uidToRoleBinding[u.UID]; ok { + rb.Username = u.Name + res = append(res, rb) + } + } + + return res, nil +} diff --git a/pkg/microservice/policy/core/repository/mongodb/role_binding.go b/pkg/microservice/policy/core/repository/mongodb/role_binding.go index 187890445..0bd9ee6f7 100644 --- a/pkg/microservice/policy/core/repository/mongodb/role_binding.go +++ b/pkg/microservice/policy/core/repository/mongodb/role_binding.go @@ -116,6 +116,7 @@ func (c *RoleBindingColl) DeleteMany(names []string, projectName string) error { return err } + func (c *RoleBindingColl) DeleteByRole(roleName string, projectName string) error { query := bson.M{"role_ref.name": roleName, "role_ref.namespace": projectName} // if projectName == "", delete all rolebindings in all namespaces @@ -127,6 +128,20 @@ func (c *RoleBindingColl) DeleteByRole(roleName string, projectName string) erro return err } +func (c *RoleBindingColl) DeleteByRoles(roleNames []string, projectName string) error { + if projectName == "" { + return fmt.Errorf("projectName is empty") + } + if len(roleNames) == 0 { + return nil + } + + query := bson.M{"role_ref.name": bson.M{"$in": roleNames}, "role_ref.namespace": projectName, "namespace": projectName} + _, err := c.Collection.DeleteMany(context.TODO(), query) + + return err +} + func (c *RoleBindingColl) Create(obj *models.RoleBinding) error { if obj == nil { return fmt.Errorf("nil object") diff --git a/pkg/microservice/policy/core/service/bundle/exemption_urls.go b/pkg/microservice/policy/core/service/bundle/exemption_urls.go index 693b04a5b..809df6272 100644 --- a/pkg/microservice/policy/core/service/bundle/exemption_urls.go +++ b/pkg/microservice/policy/core/service/bundle/exemption_urls.go @@ -68,6 +68,10 @@ var systemAdminURLs = []*policyRule{ Methods: []string{"POST"}, Endpoints: []string{"api/aslan/project/products"}, }, + { + Methods: []string{"POST"}, + Endpoints: []string{"api/picket/projects"}, + }, { Methods: []string{"DELETE"}, Endpoints: []string{"api/aslan/project/products/?*"}, @@ -226,7 +230,7 @@ var systemAdminURLs = []*policyRule{ }, } -// actions which are allowed for system admins only. +// actions which are allowed for project admins. var projectAdminURLs = []*policyRule{ { Methods: []string{"PUT"}, @@ -240,6 +244,10 @@ var projectAdminURLs = []*policyRule{ Methods: []string{"GET"}, Endpoints: []string{"api/v1/users"}, }, + { + Methods: []string{"POST"}, + Endpoints: []string{"api/v1/users/search"}, + }, { Methods: []string{"GET"}, Endpoints: []string{"api/v1/roles"}, @@ -256,6 +264,10 @@ var projectAdminURLs = []*policyRule{ Methods: []string{"PUT", "DELETE"}, Endpoints: []string{"api/v1/roles/?*"}, }, + { + Methods: []string{"POST"}, + Endpoints: []string{"api/v1/roles/bulk-delete"}, + }, { Methods: []string{"GET"}, Endpoints: []string{"api/v1/public-roles"}, @@ -268,10 +280,18 @@ var projectAdminURLs = []*policyRule{ Methods: []string{"GET", "POST"}, Endpoints: []string{"api/v1/rolebindings"}, }, + { + Methods: []string{"GET"}, + Endpoints: []string{"api/v1/picket/rolebindings"}, + }, { Methods: []string{"DELETE"}, Endpoints: []string{"api/v1/rolebindings/?*"}, }, + { + Methods: []string{"POST"}, + Endpoints: []string{"api/v1/rolebindings/bulk-delete"}, + }, } var adminURLs = append(systemAdminURLs, projectAdminURLs...) diff --git a/pkg/microservice/policy/core/service/role.go b/pkg/microservice/policy/core/service/role.go index 8a0f3b112..1735b7f2c 100644 --- a/pkg/microservice/policy/core/service/role.go +++ b/pkg/microservice/policy/core/service/role.go @@ -125,19 +125,29 @@ func DeleteRole(name string, projectName string, logger *zap.SugaredLogger) erro err := mongodb.NewRoleColl().Delete(name, projectName) if err != nil { logger.Errorf("Failed to delete role %s in project %s, err: %s", name, projectName, err) + return err } return mongodb.NewRoleBindingColl().DeleteByRole(name, projectName) } -func DeleteRoles(names []string, projectName string, _ *zap.SugaredLogger) error { +func DeleteRoles(names []string, projectName string, logger *zap.SugaredLogger) error { if len(names) == 0 { return nil } + if projectName == "" { + return fmt.Errorf("projectName is empty") + } if names[0] == "*" { names = []string{} } - return mongodb.NewRoleColl().DeleteMany(names, projectName) + err := mongodb.NewRoleColl().DeleteMany(names, projectName) + if err != nil { + logger.Errorf("Failed to delete roles %s in project %s, err: %s", names, projectName, err) + return err + } + + return mongodb.NewRoleBindingColl().DeleteByRoles(names, projectName) } diff --git a/pkg/setting/types.go b/pkg/setting/types.go index a8293f086..746c65d1e 100644 --- a/pkg/setting/types.go +++ b/pkg/setting/types.go @@ -49,6 +49,7 @@ const ( OPA // 12 Policy // 13 Config // 14 + User // 15 ) type ServiceInfo struct { @@ -109,8 +110,12 @@ var Services = map[int]*ServiceInfo{ Name: "policy", Port: 80, }, - Config:{ - Name:"config", - Port:80, + Config: { + Name: "config", + Port: 80, + }, + User: { + Name: "user", + Port: 80, }, } diff --git a/pkg/shared/client/policy/policy.go b/pkg/shared/client/policy/policy.go index be7a8cb07..8401f878d 100644 --- a/pkg/shared/client/policy/policy.go +++ b/pkg/shared/client/policy/policy.go @@ -3,7 +3,6 @@ package policy import ( "fmt" - "github.com/koderover/zadig/pkg/setting" "github.com/koderover/zadig/pkg/tool/httpclient" ) @@ -26,6 +25,13 @@ type ActionRule struct { Endpoint string `json:"endpoint"` } +type RoleBinding struct { + Name string `json:"name"` + UID string `json:"uid"` + Role string `json:"role"` + Public bool `json:"public"` +} + func (c *Client) CreateOrUpdatePolicy(p *Policy) error { url := fmt.Sprintf("/policies/%s", p.Resource) @@ -34,11 +40,13 @@ func (c *Client) CreateOrUpdatePolicy(p *Policy) error { return err } -type RoleBinding struct { - Name string - User string - Role setting.RoleType - Public bool +func (c *Client) ListRoleBindings(projectName string) ([]*RoleBinding, error) { + url := fmt.Sprintf("/rolebindings?projectName=%s", projectName) + + res := make([]*RoleBinding, 0) + _, err := c.Get(url, httpclient.SetResult(&res)) + + return res, err } func (c *Client) CreateRoleBinding(projectName string, roleBinding *RoleBinding) error { diff --git a/pkg/shared/client/user/client.go b/pkg/shared/client/user/client.go new file mode 100644 index 000000000..5e6d8ac15 --- /dev/null +++ b/pkg/shared/client/user/client.go @@ -0,0 +1,41 @@ +/* +Copyright 2021 The KodeRover 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 user + +import ( + "github.com/koderover/zadig/pkg/config" + "github.com/koderover/zadig/pkg/tool/httpclient" +) + +type Client struct { + *httpclient.Client + + host string +} + +func New() *Client { + host := config.UserServiceAddress() + + c := httpclient.New( + httpclient.SetHostURL(host + "/api/v1"), + ) + + return &Client{ + Client: c, + host: host, + } +} diff --git a/pkg/shared/client/user/user.go b/pkg/shared/client/user/user.go new file mode 100644 index 000000000..bcec55684 --- /dev/null +++ b/pkg/shared/client/user/user.go @@ -0,0 +1,32 @@ +package user + +import ( + "github.com/koderover/zadig/pkg/tool/httpclient" +) + +type User struct { + UID string `json:"uid"` + Name string `json:"name"` + Email string `json:"email"` + Phone string `json:"phone"` +} + +type usersResp struct { + Users []*User `json:"users"` +} + +type SearchArgs struct { + UIDs []string `json:"uids"` +} + +func (c *Client) ListUsers(args *SearchArgs) ([]*User, error) { + url := "/users/search" + + res := &usersResp{} + _, err := c.Post(url, httpclient.SetResult(res), httpclient.SetBody(args)) + if err != nil { + return nil, err + } + + return res.Users, err +} -- Gitee From 5edc396d463a935f4f2adb6b119c61650f8ce845 Mon Sep 17 00:00:00 2001 From: mouuii Date: Fri, 29 Oct 2021 15:14:33 +0800 Subject: [PATCH 158/405] fix body read twice bug Signed-off-by: mouuii --- pkg/microservice/picket/core/filter/handler/project.go | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/pkg/microservice/picket/core/filter/handler/project.go b/pkg/microservice/picket/core/filter/handler/project.go index 6d5dff48c..4b2427ee7 100644 --- a/pkg/microservice/picket/core/filter/handler/project.go +++ b/pkg/microservice/picket/core/filter/handler/project.go @@ -2,6 +2,7 @@ package handler import ( "github.com/gin-gonic/gin" + "github.com/gin-gonic/gin/binding" "github.com/koderover/zadig/pkg/microservice/picket/core/filter/service" internalhandler "github.com/koderover/zadig/pkg/shared/handler" @@ -25,11 +26,16 @@ func CreateProject(c *gin.Context) { defer func() { internalhandler.JSONResponse(c, ctx) }() args := new(CreateProjectReq) - if err := c.ShouldBindJSON(args); err != nil { + if err := c.ShouldBindBodyWith(args, binding.JSON); err != nil { ctx.Err = e.ErrInvalidParam.AddErr(err).AddDesc("invalid CreateProjectReq") return } - body, _ := c.GetRawData() + var body []byte + if cb, ok := c.Get(gin.BodyBytesKey); ok { + if cbb, ok := cb.([]byte); ok { + body = cbb + } + } ctx.Resp, ctx.Err = service.CreateProject(c.Request.Header, body, args.ProductName, args.Public, ctx.Logger) } -- Gitee From c8bf661312a9cf10a06a36ad73fe81f5c6a1b3a2 Mon Sep 17 00:00:00 2001 From: panxunying <641770806@qq.com> Date: Fri, 29 Oct 2021 15:31:55 +0800 Subject: [PATCH 159/405] fix connector query error Signed-off-by: panxunying <641770806@qq.com> --- .../systemconfig/core/repository/orm/connector.go | 2 +- pkg/microservice/systemconfig/core/service/connector.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pkg/microservice/systemconfig/core/repository/orm/connector.go b/pkg/microservice/systemconfig/core/repository/orm/connector.go index 9ac1e501f..bab55de83 100644 --- a/pkg/microservice/systemconfig/core/repository/orm/connector.go +++ b/pkg/microservice/systemconfig/core/repository/orm/connector.go @@ -51,7 +51,7 @@ func (c *ConnectorColl) List() ([]*models.Connector, error) { func (c *ConnectorColl) Get(id string) (*models.Connector, error) { res := &models.Connector{} - result := c.First(&res, id) + result := c.First(&res, "id=?", id) return res, result.Error } diff --git a/pkg/microservice/systemconfig/core/service/connector.go b/pkg/microservice/systemconfig/core/service/connector.go index 03e3be1e5..a60d39e01 100644 --- a/pkg/microservice/systemconfig/core/service/connector.go +++ b/pkg/microservice/systemconfig/core/service/connector.go @@ -35,7 +35,7 @@ func ListConnectors(logger *zap.SugaredLogger) ([]*Connector, error) { var res []*Connector for _, c := range cs { cf := make(map[string]interface{}) - err = json.Unmarshal([]byte(c.Config), cf) + err = json.Unmarshal([]byte(c.Config), &cf) if err != nil { logger.Warnf("Failed to unmarshal config, err: %s", err) continue @@ -61,7 +61,7 @@ func GetConnector(id string, logger *zap.SugaredLogger) (*Connector, error) { } cf := make(map[string]interface{}) - err = json.Unmarshal([]byte(c.Config), cf) + err = json.Unmarshal([]byte(c.Config), &cf) if err != nil { logger.Warnf("Failed to unmarshal config, err: %s", err) -- Gitee From 8b5093b8fdbd34e026406e9d4ef1e4a8964ba263 Mon Sep 17 00:00:00 2001 From: mouuii Date: Fri, 29 Oct 2021 15:33:01 +0800 Subject: [PATCH 160/405] update project Signed-off-by: mouuii --- .../picket/client/aslan/project.go | 10 ++++++++ .../picket/core/filter/handler/project.go | 23 +++++++++++++++++++ .../picket/core/filter/handler/router.go | 1 + .../picket/core/filter/service/project.go | 18 +++++++++++++++ 4 files changed, 52 insertions(+) diff --git a/pkg/microservice/picket/client/aslan/project.go b/pkg/microservice/picket/client/aslan/project.go index 023b3fb31..9c62cd299 100644 --- a/pkg/microservice/picket/client/aslan/project.go +++ b/pkg/microservice/picket/client/aslan/project.go @@ -27,3 +27,13 @@ func (c *Client) CreateProject(header http.Header, body []byte) ([]byte, error) return res.Body(), nil } + +func (c *Client) UpdateProject(header http.Header, qs url.Values, body []byte) ([]byte, error) { + url := "/project/products" + res, err := c.Put(url, httpclient.SetHeadersFromHTTPHeader(header), httpclient.SetBody(body)) + if err != nil { + return nil, err + } + + return res.Body(), nil +} diff --git a/pkg/microservice/picket/core/filter/handler/project.go b/pkg/microservice/picket/core/filter/handler/project.go index 4b2427ee7..1aa08a7b0 100644 --- a/pkg/microservice/picket/core/filter/handler/project.go +++ b/pkg/microservice/picket/core/filter/handler/project.go @@ -39,3 +39,26 @@ func CreateProject(c *gin.Context) { ctx.Resp, ctx.Err = service.CreateProject(c.Request.Header, body, args.ProductName, args.Public, ctx.Logger) } + +type UpdateProjectReq struct { + Public bool `json:"public"` + ProductName string `json:"product_name"` +} + +func UpdateProject(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + + args := new(UpdateProjectReq) + if err := c.ShouldBindBodyWith(args, binding.JSON); err != nil { + ctx.Err = e.ErrInvalidParam.AddErr(err).AddDesc("invalid UpdateProject") + return + } + var body []byte + if cb, ok := c.Get(gin.BodyBytesKey); ok { + if cbb, ok := cb.([]byte); ok { + body = cbb + } + } + ctx.Resp, ctx.Err = service.UpdateProject(c.Request.Header, body, c.Request.URL.Query(), args.ProductName, args.Public, ctx.Logger) +} diff --git a/pkg/microservice/picket/core/filter/handler/router.go b/pkg/microservice/picket/core/filter/handler/router.go index 2f4bcc955..72a927c08 100644 --- a/pkg/microservice/picket/core/filter/handler/router.go +++ b/pkg/microservice/picket/core/filter/handler/router.go @@ -27,6 +27,7 @@ func (*Router) Inject(router *gin.RouterGroup) { { projects.GET("", ListProjects) projects.POST("", CreateProject) + projects.PUT("", UpdateProject) } workflows := router.Group("workflows") diff --git a/pkg/microservice/picket/core/filter/service/project.go b/pkg/microservice/picket/core/filter/service/project.go index dbeb42d97..dd47f5fdb 100644 --- a/pkg/microservice/picket/core/filter/service/project.go +++ b/pkg/microservice/picket/core/filter/service/project.go @@ -46,6 +46,24 @@ func CreateProject(header http.Header, body []byte, projectName string, public b return res, nil } +func UpdateProject(header http.Header, body []byte, qs url.Values, projectName string, public bool, logger *zap.SugaredLogger) ([]byte, error) { + // role binding + roleBindingName := fmt.Sprintf(setting.RoleBindingNameFmt, "*", setting.ReadOnly, projectName) + if !public { + if err := policy.NewDefault().DeleteRoleBinding(roleBindingName, projectName); err != nil { + logger.Warnf("Failed to delete role binding, err: %s", err) + } + } + + res, err := aslan.New().UpdateProject(header, qs, body) + if err != nil { + logger.Errorf("Failed to create project %s, err: %s", projectName, err) + return nil, err + } + + return res, nil +} + func ListProjects(header http.Header, qs url.Values, logger *zap.SugaredLogger) ([]byte, error) { names, err := getVisibleProjects(header, logger) if err != nil { -- Gitee From 22045a1139caa1e15a1f9be1253d14c65bcaedf9 Mon Sep 17 00:00:00 2001 From: mouuii Date: Fri, 29 Oct 2021 15:42:38 +0800 Subject: [PATCH 161/405] update project Signed-off-by: mouuii --- pkg/microservice/picket/client/aslan/project.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/microservice/picket/client/aslan/project.go b/pkg/microservice/picket/client/aslan/project.go index 9c62cd299..c0350b5c7 100644 --- a/pkg/microservice/picket/client/aslan/project.go +++ b/pkg/microservice/picket/client/aslan/project.go @@ -30,7 +30,7 @@ func (c *Client) CreateProject(header http.Header, body []byte) ([]byte, error) func (c *Client) UpdateProject(header http.Header, qs url.Values, body []byte) ([]byte, error) { url := "/project/products" - res, err := c.Put(url, httpclient.SetHeadersFromHTTPHeader(header), httpclient.SetBody(body)) + res, err := c.Put(url, httpclient.SetHeadersFromHTTPHeader(header), httpclient.SetQueryParamsFromValues(qs), httpclient.SetBody(body)) if err != nil { return nil, err } -- Gitee From 4bd8e1bbbcef4b7d05375c4977e08fdfd96c6558 Mon Sep 17 00:00:00 2001 From: mouuii Date: Fri, 29 Oct 2021 15:46:52 +0800 Subject: [PATCH 162/405] update project Signed-off-by: mouuii --- .../picket/core/filter/handler/project.go | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/pkg/microservice/picket/core/filter/handler/project.go b/pkg/microservice/picket/core/filter/handler/project.go index 1aa08a7b0..5e952bc0c 100644 --- a/pkg/microservice/picket/core/filter/handler/project.go +++ b/pkg/microservice/picket/core/filter/handler/project.go @@ -30,14 +30,18 @@ func CreateProject(c *gin.Context) { ctx.Err = e.ErrInvalidParam.AddErr(err).AddDesc("invalid CreateProjectReq") return } - var body []byte + body := getReqBody(c) + + ctx.Resp, ctx.Err = service.CreateProject(c.Request.Header, body, args.ProductName, args.Public, ctx.Logger) +} + +func getReqBody(c *gin.Context) (body []byte) { if cb, ok := c.Get(gin.BodyBytesKey); ok { if cbb, ok := cb.([]byte); ok { body = cbb } } - - ctx.Resp, ctx.Err = service.CreateProject(c.Request.Header, body, args.ProductName, args.Public, ctx.Logger) + return nil } type UpdateProjectReq struct { @@ -54,11 +58,6 @@ func UpdateProject(c *gin.Context) { ctx.Err = e.ErrInvalidParam.AddErr(err).AddDesc("invalid UpdateProject") return } - var body []byte - if cb, ok := c.Get(gin.BodyBytesKey); ok { - if cbb, ok := cb.([]byte); ok { - body = cbb - } - } + body := getReqBody(c) ctx.Resp, ctx.Err = service.UpdateProject(c.Request.Header, body, c.Request.URL.Query(), args.ProductName, args.Public, ctx.Logger) } -- Gitee From 759a5ec914ba3c49549f7e9bff5d3e2db42d34a5 Mon Sep 17 00:00:00 2001 From: mouuii Date: Fri, 29 Oct 2021 16:05:10 +0800 Subject: [PATCH 163/405] update project Signed-off-by: mouuii --- .../aslan/core/common/repository/models/template/product.go | 3 ++- .../aslan/core/common/repository/mongodb/template/product.go | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/pkg/microservice/aslan/core/common/repository/models/template/product.go b/pkg/microservice/aslan/core/common/repository/models/template/product.go index 509a72a47..7e2154c9c 100644 --- a/pkg/microservice/aslan/core/common/repository/models/template/product.go +++ b/pkg/microservice/aslan/core/common/repository/models/template/product.go @@ -41,7 +41,7 @@ type Product struct { Vars []*RenderKV `bson:"vars" json:"vars"` EnvVars []*EnvRenderKV `bson:"-" json:"env_vars,omitempty"` ChartInfos []*RenderChart `bson:"-" json:"chart_infos,omitempty"` - UserIDs []string `bson:"user_ids" json:"user_ids"` + UserIDs []string `bson:"user_ids" json:"user_ids"` TeamID int `bson:"team_id" json:"team_id"` Description string `bson:"description,omitempty" json:"desc,omitempty"` ProductFeature *ProductFeature `bson:"product_feature,omitempty" json:"product_feature,omitempty"` @@ -72,6 +72,7 @@ type Product struct { IsOpensource bool `bson:"is_opensource" json:"is_opensource"` CustomImageRule *CustomRule `bson:"custom_image_rule,omitempty" json:"custom_image_rule,omitempty"` CustomTarRule *CustomRule `bson:"custom_tar_rule,omitempty" json:"custom_tar_rule,omitempty"` + Public bool `bson:"public" json:"public"` } type ServiceInfo struct { diff --git a/pkg/microservice/aslan/core/common/repository/mongodb/template/product.go b/pkg/microservice/aslan/core/common/repository/mongodb/template/product.go index c32ca2bcc..98cd277bb 100644 --- a/pkg/microservice/aslan/core/common/repository/mongodb/template/product.go +++ b/pkg/microservice/aslan/core/common/repository/mongodb/template/product.go @@ -254,6 +254,7 @@ func (c *ProductColl) Update(productName string, args *template.Product) error { "image_searching_rules": args.ImageSearchingRules, "custom_tar_rule": args.CustomTarRule, "custom_image_rule": args.CustomImageRule, + "public": args.Public, }} _, err := c.UpdateOne(context.TODO(), query, change) -- Gitee From 46d7d677e560eda6596457b424e994ac1859f1f8 Mon Sep 17 00:00:00 2001 From: mouuii Date: Fri, 29 Oct 2021 16:13:23 +0800 Subject: [PATCH 164/405] update project Signed-off-by: mouuii --- pkg/microservice/picket/core/filter/handler/project.go | 2 +- pkg/microservice/picket/core/filter/service/project.go | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/pkg/microservice/picket/core/filter/handler/project.go b/pkg/microservice/picket/core/filter/handler/project.go index 5e952bc0c..2960abb01 100644 --- a/pkg/microservice/picket/core/filter/handler/project.go +++ b/pkg/microservice/picket/core/filter/handler/project.go @@ -41,7 +41,7 @@ func getReqBody(c *gin.Context) (body []byte) { body = cbb } } - return nil + return body } type UpdateProjectReq struct { diff --git a/pkg/microservice/picket/core/filter/service/project.go b/pkg/microservice/picket/core/filter/service/project.go index dd47f5fdb..d1d953bec 100644 --- a/pkg/microservice/picket/core/filter/service/project.go +++ b/pkg/microservice/picket/core/filter/service/project.go @@ -53,6 +53,13 @@ func UpdateProject(header http.Header, body []byte, qs url.Values, projectName s if err := policy.NewDefault().DeleteRoleBinding(roleBindingName, projectName); err != nil { logger.Warnf("Failed to delete role binding, err: %s", err) } + } else { + policy.NewDefault().CreateRoleBinding(projectName, &policy.RoleBinding{ + Name: roleBindingName, + UID: "*", + Role: string(setting.ReadOnly), + Public: true, + }) } res, err := aslan.New().UpdateProject(header, qs, body) -- Gitee From 4751304df82ed1ba50814acb417df759a8765658 Mon Sep 17 00:00:00 2001 From: lou Date: Fri, 29 Oct 2021 16:20:13 +0800 Subject: [PATCH 165/405] add more public rules Signed-off-by: lou --- pkg/microservice/policy/core/service/bundle/exemption_urls.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pkg/microservice/policy/core/service/bundle/exemption_urls.go b/pkg/microservice/policy/core/service/bundle/exemption_urls.go index 809df6272..eac910dab 100644 --- a/pkg/microservice/policy/core/service/bundle/exemption_urls.go +++ b/pkg/microservice/policy/core/service/bundle/exemption_urls.go @@ -60,6 +60,10 @@ var publicURLs = []*policyRule{ Methods: []string{"GET"}, Endpoints: []string{"api/directory/check"}, }, + { + Methods: []string{"GET"}, + Endpoints: []string{"api/directory/codehostss/?*/auth", "api/directory/codehosts/callback"}, + }, } // actions which are allowed for system admins only. -- Gitee From 9531e1a577181bb283b6b046e6b1dc7d84ec6be4 Mon Sep 17 00:00:00 2001 From: mouuii Date: Fri, 29 Oct 2021 16:21:33 +0800 Subject: [PATCH 166/405] update project Signed-off-by: mouuii --- .../aslan/core/common/repository/models/template/product.go | 2 +- pkg/microservice/picket/client/aslan/project.go | 4 ++-- pkg/microservice/picket/core/filter/handler/project.go | 4 ++-- pkg/microservice/picket/core/filter/service/project.go | 6 +++--- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/pkg/microservice/aslan/core/common/repository/models/template/product.go b/pkg/microservice/aslan/core/common/repository/models/template/product.go index 7e2154c9c..1554cd904 100644 --- a/pkg/microservice/aslan/core/common/repository/models/template/product.go +++ b/pkg/microservice/aslan/core/common/repository/models/template/product.go @@ -72,7 +72,7 @@ type Product struct { IsOpensource bool `bson:"is_opensource" json:"is_opensource"` CustomImageRule *CustomRule `bson:"custom_image_rule,omitempty" json:"custom_image_rule,omitempty"` CustomTarRule *CustomRule `bson:"custom_tar_rule,omitempty" json:"custom_tar_rule,omitempty"` - Public bool `bson:"public" json:"public"` + Public bool `bson:"public,omitempty" json:"public"` } type ServiceInfo struct { diff --git a/pkg/microservice/picket/client/aslan/project.go b/pkg/microservice/picket/client/aslan/project.go index c0350b5c7..0c8047e2d 100644 --- a/pkg/microservice/picket/client/aslan/project.go +++ b/pkg/microservice/picket/client/aslan/project.go @@ -18,9 +18,9 @@ func (c *Client) ListProjects(header http.Header, qs url.Values) ([]byte, error) return res.Body(), nil } -func (c *Client) CreateProject(header http.Header, body []byte) ([]byte, error) { +func (c *Client) CreateProject(header http.Header, qs url.Values, body []byte) ([]byte, error) { url := "/project/products" - res, err := c.Post(url, httpclient.SetHeadersFromHTTPHeader(header), httpclient.SetBody(body)) + res, err := c.Post(url, httpclient.SetHeadersFromHTTPHeader(header), httpclient.SetQueryParamsFromValues(qs), httpclient.SetBody(body)) if err != nil { return nil, err } diff --git a/pkg/microservice/picket/core/filter/handler/project.go b/pkg/microservice/picket/core/filter/handler/project.go index 2960abb01..26e6bf498 100644 --- a/pkg/microservice/picket/core/filter/handler/project.go +++ b/pkg/microservice/picket/core/filter/handler/project.go @@ -32,7 +32,7 @@ func CreateProject(c *gin.Context) { } body := getReqBody(c) - ctx.Resp, ctx.Err = service.CreateProject(c.Request.Header, body, args.ProductName, args.Public, ctx.Logger) + ctx.Resp, ctx.Err = service.CreateProject(c.Request.Header, body, c.Request.URL.Query(), args.ProductName, args.Public, ctx.Logger) } func getReqBody(c *gin.Context) (body []byte) { @@ -59,5 +59,5 @@ func UpdateProject(c *gin.Context) { return } body := getReqBody(c) - ctx.Resp, ctx.Err = service.UpdateProject(c.Request.Header, body, c.Request.URL.Query(), args.ProductName, args.Public, ctx.Logger) + ctx.Resp, ctx.Err = service.UpdateProject(c.Request.Header, c.Request.URL.Query(), body, args.ProductName, args.Public, ctx.Logger) } diff --git a/pkg/microservice/picket/core/filter/service/project.go b/pkg/microservice/picket/core/filter/service/project.go index d1d953bec..c9d4ba637 100644 --- a/pkg/microservice/picket/core/filter/service/project.go +++ b/pkg/microservice/picket/core/filter/service/project.go @@ -18,7 +18,7 @@ type allowedProjectsData struct { Result []string `json:"result"` } -func CreateProject(header http.Header, body []byte, projectName string, public bool, logger *zap.SugaredLogger) ([]byte, error) { +func CreateProject(header http.Header, body []byte, qs url.Values, projectName string, public bool, logger *zap.SugaredLogger) ([]byte, error) { // role binding roleBindingName := fmt.Sprintf(setting.RoleBindingNameFmt, "*", setting.ReadOnly, projectName) if public { @@ -33,7 +33,7 @@ func CreateProject(header http.Header, body []byte, projectName string, public b } } - res, err := aslan.New().CreateProject(header, body) + res, err := aslan.New().CreateProject(header, qs, body) if err != nil { logger.Errorf("Failed to create project %s, err: %s", projectName, err) if err1 := policy.NewDefault().DeleteRoleBinding(roleBindingName, projectName); err1 != nil { @@ -46,7 +46,7 @@ func CreateProject(header http.Header, body []byte, projectName string, public b return res, nil } -func UpdateProject(header http.Header, body []byte, qs url.Values, projectName string, public bool, logger *zap.SugaredLogger) ([]byte, error) { +func UpdateProject(header http.Header, qs url.Values, body []byte, projectName string, public bool, logger *zap.SugaredLogger) ([]byte, error) { // role binding roleBindingName := fmt.Sprintf(setting.RoleBindingNameFmt, "*", setting.ReadOnly, projectName) if !public { -- Gitee From 3d524b9485fd13701ac92a9daf0b3e5d104f850c Mon Sep 17 00:00:00 2001 From: mouuii Date: Fri, 29 Oct 2021 16:25:06 +0800 Subject: [PATCH 167/405] update project Signed-off-by: mouuii --- pkg/microservice/picket/core/filter/service/project.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/pkg/microservice/picket/core/filter/service/project.go b/pkg/microservice/picket/core/filter/service/project.go index c9d4ba637..02feff776 100644 --- a/pkg/microservice/picket/core/filter/service/project.go +++ b/pkg/microservice/picket/core/filter/service/project.go @@ -54,12 +54,14 @@ func UpdateProject(header http.Header, qs url.Values, body []byte, projectName s logger.Warnf("Failed to delete role binding, err: %s", err) } } else { - policy.NewDefault().CreateRoleBinding(projectName, &policy.RoleBinding{ + if err := policy.NewDefault().CreateRoleBinding(projectName, &policy.RoleBinding{ Name: roleBindingName, UID: "*", Role: string(setting.ReadOnly), Public: true, - }) + }); err != nil { + logger.Warnf("Failed to create role binding, err: %s", err) + } } res, err := aslan.New().UpdateProject(header, qs, body) -- Gitee From df220366323be8cbfd4bc1b0ea8b7dd259c029c4 Mon Sep 17 00:00:00 2001 From: lou Date: Fri, 29 Oct 2021 16:39:30 +0800 Subject: [PATCH 168/405] fix delete connector Signed-off-by: lou --- pkg/microservice/systemconfig/core/repository/orm/connector.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/microservice/systemconfig/core/repository/orm/connector.go b/pkg/microservice/systemconfig/core/repository/orm/connector.go index bab55de83..a13db5683 100644 --- a/pkg/microservice/systemconfig/core/repository/orm/connector.go +++ b/pkg/microservice/systemconfig/core/repository/orm/connector.go @@ -77,7 +77,7 @@ func (c *ConnectorColl) Update(obj *models.Connector) error { } func (c *ConnectorColl) Delete(id string) error { - result := c.DB.Delete(&models.Connector{}, id) + result := c.DB.Delete(&models.Connector{ID: id}) return result.Error } -- Gitee From 8e17ac0b3426fc0f2467225bc3f54f2ab87e3212 Mon Sep 17 00:00:00 2001 From: mouuii Date: Fri, 29 Oct 2021 17:14:08 +0800 Subject: [PATCH 169/405] update project Signed-off-by: mouuii --- .../picket/core/filter/service/project.go | 2 +- .../policy/core/handler/role_binding.go | 15 +++++++++++++++ pkg/microservice/policy/core/handler/router.go | 1 + .../core/repository/mongodb/role_binding.go | 12 ++++++++++++ .../policy/core/service/role_binding.go | 8 ++++++++ pkg/shared/client/policy/policy.go | 4 ++-- 6 files changed, 39 insertions(+), 3 deletions(-) diff --git a/pkg/microservice/picket/core/filter/service/project.go b/pkg/microservice/picket/core/filter/service/project.go index 02feff776..6d80f75e3 100644 --- a/pkg/microservice/picket/core/filter/service/project.go +++ b/pkg/microservice/picket/core/filter/service/project.go @@ -54,7 +54,7 @@ func UpdateProject(header http.Header, qs url.Values, body []byte, projectName s logger.Warnf("Failed to delete role binding, err: %s", err) } } else { - if err := policy.NewDefault().CreateRoleBinding(projectName, &policy.RoleBinding{ + if err := policy.NewDefault().CreateOrUpdateRoleBinding(projectName, &policy.RoleBinding{ Name: roleBindingName, UID: "*", Role: string(setting.ReadOnly), diff --git a/pkg/microservice/policy/core/handler/role_binding.go b/pkg/microservice/policy/core/handler/role_binding.go index 95780198c..0485cefd9 100644 --- a/pkg/microservice/policy/core/handler/role_binding.go +++ b/pkg/microservice/policy/core/handler/role_binding.go @@ -28,6 +28,21 @@ type deleteRoleBindingsArgs struct { Names []string `json:"names"` } +func UpdateRoleBinding(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + + projectName := c.Query("projectName") + if projectName == "" { + ctx.Err = e.ErrInvalidParam.AddDesc("projectName is empty") + return + } + + args := &service.RoleBinding{} + + ctx.Err = service.UpdateOrCreateRoleBinding(projectName, args, ctx.Logger) +} + func CreateRoleBinding(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() diff --git a/pkg/microservice/policy/core/handler/router.go b/pkg/microservice/policy/core/handler/router.go index a59a42430..22f1018f8 100644 --- a/pkg/microservice/policy/core/handler/router.go +++ b/pkg/microservice/policy/core/handler/router.go @@ -55,6 +55,7 @@ func (*Router) Inject(router *gin.RouterGroup) { roleBindings := router.Group("rolebindings") { roleBindings.POST("", CreateRoleBinding) + roleBindings.PUT("", UpdateRoleBinding) roleBindings.GET("", ListRoleBindings) roleBindings.DELETE("/:name", DeleteRoleBinding) roleBindings.POST("/bulk-delete", DeleteRoleBindings) diff --git a/pkg/microservice/policy/core/repository/mongodb/role_binding.go b/pkg/microservice/policy/core/repository/mongodb/role_binding.go index 0bd9ee6f7..9174fdeb9 100644 --- a/pkg/microservice/policy/core/repository/mongodb/role_binding.go +++ b/pkg/microservice/policy/core/repository/mongodb/role_binding.go @@ -166,3 +166,15 @@ func (c *RoleBindingColl) BulkCreate(objs []*models.RoleBinding) error { return err } + +func (c *RoleBindingColl) UpdateOrCreate(obj *models.RoleBinding) error { + if obj == nil { + return fmt.Errorf("nil object") + } + + query := bson.M{"name": obj.Name, "namespace": obj.Namespace} + opts := options.Replace().SetUpsert(true) + _, err := c.ReplaceOne(context.TODO(), query, obj, opts) + + return err +} diff --git a/pkg/microservice/policy/core/service/role_binding.go b/pkg/microservice/policy/core/service/role_binding.go index 9fbdc5c67..c08412c0e 100644 --- a/pkg/microservice/policy/core/service/role_binding.go +++ b/pkg/microservice/policy/core/service/role_binding.go @@ -48,6 +48,14 @@ func CreateRoleBindings(ns string, rbs []*RoleBinding, logger *zap.SugaredLogger return mongodb.NewRoleBindingColl().BulkCreate(objs) } +func UpdateOrCreateRoleBinding(ns string, rb *RoleBinding, logger *zap.SugaredLogger) error { + obj, err := createRoleBindingObject(ns, rb, logger) + if err != nil { + return err + } + return mongodb.NewRoleBindingColl().UpdateOrCreate(obj) +} + func ListRoleBindings(ns, uid string, _ *zap.SugaredLogger) ([]*RoleBinding, error) { var roleBindings []*RoleBinding modelRoleBindings, err := mongodb.NewRoleBindingColl().ListBy(ns, uid) diff --git a/pkg/shared/client/policy/policy.go b/pkg/shared/client/policy/policy.go index 8401f878d..8e9d4e8ea 100644 --- a/pkg/shared/client/policy/policy.go +++ b/pkg/shared/client/policy/policy.go @@ -49,9 +49,9 @@ func (c *Client) ListRoleBindings(projectName string) ([]*RoleBinding, error) { return res, err } -func (c *Client) CreateRoleBinding(projectName string, roleBinding *RoleBinding) error { +func (c *Client) CreateOrUpdateRoleBinding(projectName string, roleBinding *RoleBinding) error { url := fmt.Sprintf("/rolebindings?projectName=%s", projectName) - _, err := c.Post(url, httpclient.SetBody(roleBinding)) + _, err := c.Put(url, httpclient.SetBody(roleBinding)) return err } -- Gitee From a77386ac051fc829c264312010f40f848bb73bfb Mon Sep 17 00:00:00 2001 From: mouuii Date: Fri, 29 Oct 2021 17:17:06 +0800 Subject: [PATCH 170/405] update project Signed-off-by: mouuii --- pkg/microservice/picket/core/filter/service/project.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/microservice/picket/core/filter/service/project.go b/pkg/microservice/picket/core/filter/service/project.go index 6d80f75e3..c6cf27971 100644 --- a/pkg/microservice/picket/core/filter/service/project.go +++ b/pkg/microservice/picket/core/filter/service/project.go @@ -22,7 +22,7 @@ func CreateProject(header http.Header, body []byte, qs url.Values, projectName s // role binding roleBindingName := fmt.Sprintf(setting.RoleBindingNameFmt, "*", setting.ReadOnly, projectName) if public { - if err := policy.NewDefault().CreateRoleBinding(projectName, &policy.RoleBinding{ + if err := policy.NewDefault().CreateOrUpdateRoleBinding(projectName, &policy.RoleBinding{ Name: roleBindingName, UID: "*", Role: string(setting.ReadOnly), -- Gitee From e918127fe309c2b45a3b6c2fa2335b8eb773d976 Mon Sep 17 00:00:00 2001 From: mouuii Date: Fri, 29 Oct 2021 17:43:27 +0800 Subject: [PATCH 171/405] delete project Signed-off-by: mouuii --- pkg/microservice/picket/client/aslan/project.go | 12 ++++++++++++ .../picket/core/filter/handler/project.go | 7 +++++++ .../picket/core/filter/handler/router.go | 1 + .../picket/core/filter/service/project.go | 4 ++++ 4 files changed, 24 insertions(+) diff --git a/pkg/microservice/picket/client/aslan/project.go b/pkg/microservice/picket/client/aslan/project.go index 023b3fb31..3c45c5312 100644 --- a/pkg/microservice/picket/client/aslan/project.go +++ b/pkg/microservice/picket/client/aslan/project.go @@ -1,12 +1,24 @@ package aslan import ( + "fmt" "net/http" "net/url" "github.com/koderover/zadig/pkg/tool/httpclient" ) +func (c *Client) DeleteProject(header http.Header, qs url.Values, productName string) ([]byte, error) { + url := fmt.Sprintf("/project/prodects/%s", productName) + + res, err := c.Delete(url, httpclient.SetHeadersFromHTTPHeader(header), httpclient.SetQueryParamsFromValues(qs)) + if err != nil { + return nil, err + } + + return res.Body(), nil +} + func (c *Client) ListProjects(header http.Header, qs url.Values) ([]byte, error) { url := "/project/projects" diff --git a/pkg/microservice/picket/core/filter/handler/project.go b/pkg/microservice/picket/core/filter/handler/project.go index 4b2427ee7..beab31b6d 100644 --- a/pkg/microservice/picket/core/filter/handler/project.go +++ b/pkg/microservice/picket/core/filter/handler/project.go @@ -39,3 +39,10 @@ func CreateProject(c *gin.Context) { ctx.Resp, ctx.Err = service.CreateProject(c.Request.Header, body, args.ProductName, args.Public, ctx.Logger) } + +func DeleteProject(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + + ctx.Resp, ctx.Err = service.DeleteProject(c.Request.Header, c.Request.URL.Query(), c.Param("project"), ctx.Logger) +} diff --git a/pkg/microservice/picket/core/filter/handler/router.go b/pkg/microservice/picket/core/filter/handler/router.go index 2f4bcc955..47e34d147 100644 --- a/pkg/microservice/picket/core/filter/handler/router.go +++ b/pkg/microservice/picket/core/filter/handler/router.go @@ -25,6 +25,7 @@ type Router struct{} func (*Router) Inject(router *gin.RouterGroup) { projects := router.Group("projects") { + projects.DELETE("/:project", DeleteProject) projects.GET("", ListProjects) projects.POST("", CreateProject) } diff --git a/pkg/microservice/picket/core/filter/service/project.go b/pkg/microservice/picket/core/filter/service/project.go index dbeb42d97..8a63b2ee3 100644 --- a/pkg/microservice/picket/core/filter/service/project.go +++ b/pkg/microservice/picket/core/filter/service/project.go @@ -66,6 +66,10 @@ func ListProjects(header http.Header, qs url.Values, logger *zap.SugaredLogger) return aslanClient.ListProjects(header, qs) } +func DeleteProject(header http.Header, qs url.Values, productName string, logger *zap.SugaredLogger) ([]byte, error) { + return aslan.New().DeleteProject(header, qs, productName) +} + func getVisibleProjects(headers http.Header, logger *zap.SugaredLogger) ([]string, error) { res := &allowedProjectsData{} opaClient := opa.NewDefault() -- Gitee From 568acfe15c4b0de2870a9d7fd5699ad578ca930e Mon Sep 17 00:00:00 2001 From: mouuii Date: Fri, 29 Oct 2021 18:17:19 +0800 Subject: [PATCH 172/405] delete project Signed-off-by: mouuii --- .../picket/core/filter/service/project.go | 3 +++ pkg/shared/client/policy/policy.go | 24 +++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/pkg/microservice/picket/core/filter/service/project.go b/pkg/microservice/picket/core/filter/service/project.go index 8a63b2ee3..53ffd559e 100644 --- a/pkg/microservice/picket/core/filter/service/project.go +++ b/pkg/microservice/picket/core/filter/service/project.go @@ -67,6 +67,9 @@ func ListProjects(header http.Header, qs url.Values, logger *zap.SugaredLogger) } func DeleteProject(header http.Header, qs url.Values, productName string, logger *zap.SugaredLogger) ([]byte, error) { + // delete roles and rolebindings + policy.NewDefault().DeleteRoleBindings([]string{"*"}, productName) + policy.NewDefault().DeleteRoles([]string{"*"}, productName) return aslan.New().DeleteProject(header, qs, productName) } diff --git a/pkg/shared/client/policy/policy.go b/pkg/shared/client/policy/policy.go index 8401f878d..ac0cc2cf5 100644 --- a/pkg/shared/client/policy/policy.go +++ b/pkg/shared/client/policy/policy.go @@ -61,6 +61,30 @@ func (c *Client) DeleteRoleBinding(name string, projectName string) error { return err } +type NameArgs struct { + Names []string `json:"names"` +} + +func (c *Client) DeleteRoleBindings(names []string, projectName string) error { + url := fmt.Sprintf("/rolebindings/bulk-delete?projectName=%s", projectName) + nameArgs := NameArgs{} + for _, v := range names { + nameArgs.Names = append(nameArgs.Names, v) + } + _, err := c.Post(url, httpclient.SetBody(nameArgs)) + return err +} + +func (c *Client) DeleteRoles(names []string, projectName string) error { + url := fmt.Sprintf("/roles/bulk-delete?projectName=%s", projectName) + nameArgs := NameArgs{} + for _, v := range names { + nameArgs.Names = append(nameArgs.Names, v) + } + _, err := c.Post(url, httpclient.SetBody(nameArgs)) + return err +} + func (c *Client) CreateSystemRole(name string, role *Role) error { url := fmt.Sprintf("/system-roles/%s", name) _, err := c.Put(url, httpclient.SetBody(role)) -- Gitee From d7da9b8e9f042849d55a50800c2b2860b14b0d2f Mon Sep 17 00:00:00 2001 From: mouuii Date: Fri, 29 Oct 2021 18:19:23 +0800 Subject: [PATCH 173/405] delete project Signed-off-by: mouuii --- pkg/microservice/picket/core/filter/service/project.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/pkg/microservice/picket/core/filter/service/project.go b/pkg/microservice/picket/core/filter/service/project.go index c6cf27971..4708d5f69 100644 --- a/pkg/microservice/picket/core/filter/service/project.go +++ b/pkg/microservice/picket/core/filter/service/project.go @@ -37,7 +37,7 @@ func CreateProject(header http.Header, body []byte, qs url.Values, projectName s if err != nil { logger.Errorf("Failed to create project %s, err: %s", projectName, err) if err1 := policy.NewDefault().DeleteRoleBinding(roleBindingName, projectName); err1 != nil { - logger.Warnf("Failed to delete role binding, err: %s", err1) + logger.Errorf("Failed to delete role binding, err: %s", err1) } return nil, err @@ -51,7 +51,8 @@ func UpdateProject(header http.Header, qs url.Values, body []byte, projectName s roleBindingName := fmt.Sprintf(setting.RoleBindingNameFmt, "*", setting.ReadOnly, projectName) if !public { if err := policy.NewDefault().DeleteRoleBinding(roleBindingName, projectName); err != nil { - logger.Warnf("Failed to delete role binding, err: %s", err) + logger.Errorf("Failed to delete role binding, err: %s", err) + return nil, err } } else { if err := policy.NewDefault().CreateOrUpdateRoleBinding(projectName, &policy.RoleBinding{ @@ -61,6 +62,7 @@ func UpdateProject(header http.Header, qs url.Values, body []byte, projectName s Public: true, }); err != nil { logger.Warnf("Failed to create role binding, err: %s", err) + return nil, err } } -- Gitee From 40b32e1011a4092f7262e923e69a6633f49d37ba Mon Sep 17 00:00:00 2001 From: panxunying <641770806@qq.com> Date: Fri, 29 Oct 2021 18:21:49 +0800 Subject: [PATCH 174/405] change from login by email to account and add GetPersonalUser Signed-off-by: panxunying <641770806@qq.com> --- go.mod | 1 + pkg/microservice/user/config/consts.go | 6 + .../user/core/handler/login/third_party.go | 6 +- pkg/microservice/user/core/handler/router.go | 4 +- .../user/core/handler/user/user.go | 24 ++- .../user/core/repository/models/user.go | 1 + .../user/core/repository/models/user_login.go | 2 + .../user/core/repository/orm/user.go | 20 ++- .../user/core/repository/orm/user_login.go | 7 +- .../user/core/service/login/local.go | 26 ++-- .../user/core/service/login/third_party.go | 77 ---------- .../user/core/service/login/token.go | 2 +- .../user/core/service/user/user.go | 145 ++++++++++++++++-- 13 files changed, 204 insertions(+), 117 deletions(-) delete mode 100644 pkg/microservice/user/core/service/login/third_party.go diff --git a/go.mod b/go.mod index d8f774933..c281428b1 100644 --- a/go.mod +++ b/go.mod @@ -53,6 +53,7 @@ require ( github.com/satori/go.uuid v1.2.0 github.com/sirupsen/logrus v1.8.1 github.com/spf13/cobra v1.2.1 + github.com/spf13/pflag v1.0.5 github.com/spf13/viper v1.8.1 github.com/stevvooe/resumable v0.0.0-20180830230917-22b14a53ba50 // indirect github.com/stretchr/testify v1.7.0 diff --git a/pkg/microservice/user/config/consts.go b/pkg/microservice/user/config/consts.go index 11887903a..6f13e8e9f 100644 --- a/pkg/microservice/user/config/consts.go +++ b/pkg/microservice/user/config/consts.go @@ -24,3 +24,9 @@ const ( AppState = setting.ProductName + "user" SystemIdentityType = "system" ) + +type LoginType int + +const ( + AccountLocinType LoginType = 0 +) diff --git a/pkg/microservice/user/core/handler/login/third_party.go b/pkg/microservice/user/core/handler/login/third_party.go index b84412dbe..df86d6eac 100644 --- a/pkg/microservice/user/core/handler/login/third_party.go +++ b/pkg/microservice/user/core/handler/login/third_party.go @@ -15,6 +15,7 @@ import ( "github.com/koderover/zadig/pkg/microservice/user/config" "github.com/koderover/zadig/pkg/microservice/user/core/service/login" + "github.com/koderover/zadig/pkg/microservice/user/core/service/user" internalhandler "github.com/koderover/zadig/pkg/shared/handler" e "github.com/koderover/zadig/pkg/tool/errors" "github.com/koderover/zadig/pkg/tool/log" @@ -102,9 +103,8 @@ func Callback(c *gin.Context) { ctx.Err = err return } - user, err := login.SyncUser(&login.SyncUserInfo{ - Email: claims.Email, - Name: claims.Name, + user, err := user.SyncUser(&user.SyncUserInfo{ + Account: claims.Name, IdentityType: claims.FederatedClaims.ConnectorId, }, ctx.Logger) if err != nil { diff --git a/pkg/microservice/user/core/handler/router.go b/pkg/microservice/user/core/handler/router.go index 2964f3472..beb9e0e36 100644 --- a/pkg/microservice/user/core/handler/router.go +++ b/pkg/microservice/user/core/handler/router.go @@ -36,6 +36,8 @@ func (*Router) Inject(router *gin.RouterGroup) { users.GET("/users/:uid", user.GetUser) - users.GET("/users", user.ListUsers) + users.GET("/users/:uid/personal", user.GetPersonalUser) + + users.POST("/users/search", user.ListUsers) } } diff --git a/pkg/microservice/user/core/handler/user/user.go b/pkg/microservice/user/core/handler/user/user.go index a16e107e3..697dba0c5 100644 --- a/pkg/microservice/user/core/handler/user/user.go +++ b/pkg/microservice/user/core/handler/user/user.go @@ -1,6 +1,8 @@ package user import ( + "fmt" + "github.com/gin-gonic/gin" "github.com/koderover/zadig/pkg/microservice/user/core/service/user" @@ -13,15 +15,31 @@ func GetUser(c *gin.Context) { ctx.Resp, ctx.Err = user.GetUser(c.Param("uid"), ctx.Logger) } +func GetPersonalUser(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + uid := c.Param("uid") + if ctx.UserID != uid { + ctx.Err = fmt.Errorf("token uid doesn't match uid") + } + ctx.Resp, ctx.Err = user.GetUser(uid, ctx.Logger) +} + func ListUsers(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() args := &user.QueryArgs{} - if err := c.ShouldBindQuery(args); err != nil { + if err := c.ShouldBindJSON(args); err != nil { ctx.Err = err return } - ctx.Resp, ctx.Err = user.SeachUsers(args, ctx.Logger) + if len(args.UIDs) > 0 { + ctx.Resp, ctx.Err = user.SearchUsersByUIDs(args.UIDs, ctx.Logger) + return + } else { + ctx.Resp, ctx.Err = user.SearchUsers(args, ctx.Logger) + return + } } func CreateUser(c *gin.Context) { @@ -32,7 +50,7 @@ func CreateUser(c *gin.Context) { ctx.Err = err return } - ctx.Err = user.CreateUser(args, ctx.Logger) + ctx.Resp, ctx.Err = user.CreateUser(args, ctx.Logger) } func UpdatePassword(c *gin.Context) { diff --git a/pkg/microservice/user/core/repository/models/user.go b/pkg/microservice/user/core/repository/models/user.go index 402d08a7b..30862a890 100644 --- a/pkg/microservice/user/core/repository/models/user.go +++ b/pkg/microservice/user/core/repository/models/user.go @@ -7,6 +7,7 @@ type User struct { IdentityType string `gorm:"default:'unknown'" json:"identity_type"` Email string `json:"email"` Phone string `json:"phone"` + Account string `json:"account"` } // TableName sets the insert table name for this struct type diff --git a/pkg/microservice/user/core/repository/models/user_login.go b/pkg/microservice/user/core/repository/models/user_login.go index 34e5bbed5..f2b84804f 100644 --- a/pkg/microservice/user/core/repository/models/user_login.go +++ b/pkg/microservice/user/core/repository/models/user_login.go @@ -5,6 +5,8 @@ type UserLogin struct { UID string `json:"uid"` Password string `json:"password"` LastLoginTime int64 `json:"last_login_time"` + LoginId string `json:"login_id"` + LoginType int `json:"login_type"` } // TableName sets the insert table name for this struct type diff --git a/pkg/microservice/user/core/repository/orm/user.go b/pkg/microservice/user/core/repository/orm/user.go index 9c34f2102..faeda529f 100644 --- a/pkg/microservice/user/core/repository/orm/user.go +++ b/pkg/microservice/user/core/repository/orm/user.go @@ -16,9 +16,9 @@ func CreateUser(user *models.User, db *gorm.DB) error { } // GetUser Get a user based on email and identityType -func GetUser(email string, identityType string, db *gorm.DB) (*models.User, error) { +func GetUser(account string, identityType string, db *gorm.DB) (*models.User, error) { var user models.User - err := db.Where("email = ? and identity_type = ?", email, identityType).First(&user).Error + err := db.Where("account = ? and identity_type = ?", account, identityType).First(&user).Error if err != nil && err != gorm.ErrRecordNotFound { return nil, err } @@ -60,6 +60,22 @@ func ListUsers(page int, perPage int, name string, db *gorm.DB) ([]models.User, return users, nil } +// ListUsersByUIDs gets a list of users based on paging constraints +func ListUsersByUIDs(uids []string, db *gorm.DB) ([]models.User, error) { + var ( + users []models.User + err error + ) + + err = db.Find(&users, "uid in ?", uids).Error + + if err != nil && err != gorm.ErrRecordNotFound { + return nil, err + } + + return users, nil +} + // GetUsersCount gets user count func GetUsersCount(name string) (int64, error) { var ( diff --git a/pkg/microservice/user/core/repository/orm/user_login.go b/pkg/microservice/user/core/repository/orm/user_login.go index a7bc6c42a..153a538a6 100644 --- a/pkg/microservice/user/core/repository/orm/user_login.go +++ b/pkg/microservice/user/core/repository/orm/user_login.go @@ -3,6 +3,7 @@ package orm import ( "gorm.io/gorm" + "github.com/koderover/zadig/pkg/microservice/user/config" "github.com/koderover/zadig/pkg/microservice/user/core/repository/models" ) @@ -15,9 +16,9 @@ func CreateUserLogin(userLogin *models.UserLogin, db *gorm.DB) error { } // GetUserLogin Get a userLogin based on uid -func GetUserLogin(uid string, db *gorm.DB) (*models.UserLogin, error) { +func GetUserLogin(uid string, account string, loginType config.LoginType, db *gorm.DB) (*models.UserLogin, error) { var userLogin models.UserLogin - err := db.Where("uid = ?", uid).First(&userLogin).Error + err := db.Where("uid = ? and login_id = ? and login_type = ?", uid, account, loginType).First(&userLogin).Error if err != nil && err != gorm.ErrRecordNotFound { return nil, err } @@ -30,7 +31,7 @@ func GetUserLogin(uid string, db *gorm.DB) (*models.UserLogin, error) { // ListUserLogins Get a userLogin based on uid list func ListUserLogins(uids []string, db *gorm.DB) (*[]models.UserLogin, error) { var userLogins []models.UserLogin - err := db.Where("uid IN (?)", uids).Find(&userLogins).Error + err := db.Find(&userLogins, "uid in ?", uids).Error if err != nil { return nil, err } diff --git a/pkg/microservice/user/core/service/login/local.go b/pkg/microservice/user/core/service/login/local.go index 01d163759..e0c300cf2 100644 --- a/pkg/microservice/user/core/service/login/local.go +++ b/pkg/microservice/user/core/service/login/local.go @@ -15,7 +15,7 @@ import ( ) type LoginArgs struct { - Email string `json:"email"` + Account string `json:"account"` Password string `json:"password"` } @@ -25,50 +25,51 @@ type User struct { Email string `json:"email"` Phone string `json:"phone"` Name string `json:"name"` + Account string `json:"account"` IdentityType string `json:"identityType"` } func LocalLogin(args *LoginArgs, logger *zap.SugaredLogger) (*User, error) { - user, err := orm.GetUser(args.Email, config.SystemIdentityType, core.DB) + user, err := orm.GetUser(args.Account, config.SystemIdentityType, core.DB) if err != nil { - logger.Errorf("InternalLogin get user email:%s error", args.Email) + logger.Errorf("InternalLogin get user account:%s error", args.Account) return nil, err } if user == nil { return nil, fmt.Errorf("user not exist") } - userLogin, err := orm.GetUserLogin(user.UID, core.DB) + userLogin, err := orm.GetUserLogin(user.UID, args.Account, config.AccountLocinType, core.DB) if err != nil { - logger.Errorf("InternalLogin get user:%s user login not exist, error msg:%s", args.Email, err.Error()) + logger.Errorf("LocalLogin get user:%s user login not exist, error msg:%s", args.Account, err.Error()) return nil, err } if userLogin == nil { - logger.Errorf("InternalLogin user:%s user login not exist", args.Email) + logger.Errorf("InternalLogin user:%s user login not exist", args.Account) return nil, fmt.Errorf("user login not exist") } password := []byte(args.Password) err = bcrypt.CompareHashAndPassword([]byte(userLogin.Password), password) if err != nil { - logger.Errorf("InternalLogin user:%s check password error, error msg:%s", args.Email, err.Error()) + logger.Errorf("LocalLogin user:%s check password error, error msg:%s", args.Account, err.Error()) return nil, fmt.Errorf("check password error, error msg:%s", err.Error()) } userLogin.LastLoginTime = time.Now().Unix() err = orm.UpdateUserLogin(userLogin.UID, userLogin, core.DB) if err != nil { - logger.Errorf("InternalLogin user:%s update user login password error, error msg:%s", args.Email, err.Error()) + logger.Errorf("LocalLogin user:%s update user login password error, error msg:%s", args.Account, err.Error()) return nil, err } token, err := CreateToken(&Claims{ - Name: user.Name, - Email: user.Email, - Uid: user.UID, + Name: user.Name, + Account: user.Account, + Uid: user.UID, StandardClaims: jwt.StandardClaims{ Audience: setting.ProductName, ExpiresAt: time.Now().Add(24 * time.Hour).Unix(), }, }) if err != nil { - logger.Errorf("InternalLogin user:%s create token error, error msg:%s", args.Email, err.Error()) + logger.Errorf("LocalLogin user:%s create token error, error msg:%s", args.Account, err.Error()) return nil, err } return &User{ @@ -77,6 +78,7 @@ func LocalLogin(args *LoginArgs, logger *zap.SugaredLogger) (*User, error) { Email: user.Email, Phone: user.Phone, Name: user.Name, + Account: user.Account, IdentityType: user.IdentityType, }, nil } diff --git a/pkg/microservice/user/core/service/login/third_party.go b/pkg/microservice/user/core/service/login/third_party.go deleted file mode 100644 index 30db1eb0e..000000000 --- a/pkg/microservice/user/core/service/login/third_party.go +++ /dev/null @@ -1,77 +0,0 @@ -package login - -import ( - "time" - - "github.com/google/uuid" - "go.uber.org/zap" - - "github.com/koderover/zadig/pkg/microservice/user/core" - "github.com/koderover/zadig/pkg/microservice/user/core/repository/models" - "github.com/koderover/zadig/pkg/microservice/user/core/repository/orm" -) - -type SyncUserInfo struct { - Email string `json:"email"` - IdentityType string `json:"identityType"` - Name string `json:"name"` -} - -func SyncUser(syncUserInfo *SyncUserInfo, logger *zap.SugaredLogger) (*models.User, error) { - user, err := orm.GetUser(syncUserInfo.Email, syncUserInfo.IdentityType, core.DB) - if err != nil { - logger.Error("SyncUser get user:%s error, error msg:%s", syncUserInfo.Email, err.Error()) - return nil, err - } - tx := core.DB.Begin() - defer func() { - if r := recover(); r != nil { - tx.Rollback() - } - }() - if user == nil { - uid, _ := uuid.NewUUID() - user = &models.User{ - UID: uid.String(), - Name: syncUserInfo.Name, - Email: syncUserInfo.Email, - IdentityType: syncUserInfo.IdentityType, - } - err = orm.CreateUser(user, tx) - if err != nil { - tx.Rollback() - logger.Error("SyncUser create user:%s error, error msg:%s", syncUserInfo.Email, err.Error()) - return nil, err - } - } - userLogin, err := orm.GetUserLogin(user.UID, tx) - if err != nil { - tx.Rollback() - logger.Error("UpdateLoginInfo get user:%s login error, error msg:%s", user.UID, err.Error()) - return nil, err - } - if userLogin != nil { - userLogin.LastLoginTime = time.Now().Unix() - err = orm.UpdateUserLogin(user.UID, userLogin, tx) - if err != nil { - tx.Rollback() - logger.Error("UpdateLoginInfo update user:%s login error, error msg:%s", user.UID, err.Error()) - return nil, err - } - } else { - err = orm.CreateUserLogin(&models.UserLogin{ - UID: user.UID, - LastLoginTime: time.Now().Unix(), - }, tx) - if err != nil { - tx.Rollback() - logger.Error("UpdateLoginInfo create user:%s login error, error msg:%s", user.UID, err.Error()) - return nil, err - } - } - err = tx.Commit().Error - if err != nil { - return nil, err - } - return user, nil -} diff --git a/pkg/microservice/user/core/service/login/token.go b/pkg/microservice/user/core/service/login/token.go index 76ccfcdcb..734e19b5a 100644 --- a/pkg/microservice/user/core/service/login/token.go +++ b/pkg/microservice/user/core/service/login/token.go @@ -8,7 +8,7 @@ import ( type Claims struct { Name string `json:"name"` - Email string `json:"email"` + Account string `json:"account"` Uid string `json:"uid"` FederatedClaims FederatedClaims `json:"federated_claims"` jwt.StandardClaims diff --git a/pkg/microservice/user/core/service/user/user.go b/pkg/microservice/user/core/service/user/user.go index 44cf4c5e0..6f93566ec 100644 --- a/pkg/microservice/user/core/service/user/user.go +++ b/pkg/microservice/user/core/service/user/user.go @@ -2,6 +2,7 @@ package user import ( "fmt" + "time" "github.com/google/uuid" "go.uber.org/zap" @@ -14,16 +15,18 @@ import ( ) type User struct { - Name string `json:"name"` + Name string `json:"name,omitempty"` Password string `json:"password"` - Email string `json:"email"` + Email string `json:"email,omitempty"` + Account string `json:"account"` Phone string `json:"phone,omitempty"` } type QueryArgs struct { - Name string `json:"name"` - PerPage int `json:"per_page"` - Page int `json:"page"` + Name string `json:"name,omitempty"` + UIDs []string `json:"uids,omitempty"` + PerPage int `json:"per_page,omitempty"` + Page int `json:"page,omitempty"` } type UserInfo struct { @@ -33,6 +36,7 @@ type UserInfo struct { IdentityType string `gorm:"default:'unknown'" json:"identity_type"` Email string `json:"email"` Phone string `json:"phone"` + Account string `json:"account"` } type Password struct { @@ -46,16 +50,28 @@ type UsersResp struct { TotalCount int64 `json:"totalCount"` } -func GetUser(uid string, logger *zap.SugaredLogger) (*models.User, error) { +type SyncUserInfo struct { + Account string `json:"account"` + IdentityType string `json:"identityType"` + Name string `json:"name"` +} + +func GetUser(uid string, logger *zap.SugaredLogger) (*UserInfo, error) { user, err := orm.GetUserByUid(uid, core.DB) if err != nil { logger.Errorf("GetUser getUserByUid:%s error, error msg:%s", uid, err.Error()) return nil, err } - return user, nil + userLogin, err := orm.GetUserLogin(uid, user.Account, config.AccountLocinType, core.DB) + if err != nil { + logger.Errorf("GetUser GetUserLogin:%s error, error msg:%s", uid, err.Error()) + return nil, err + } + userInfo := mergeUserLogin([]models.User{*user}, []models.UserLogin{*userLogin}, logger) + return &userInfo[0], nil } -func SeachUsers(args *QueryArgs, logger *zap.SugaredLogger) (*UsersResp, error) { +func SearchUsers(args *QueryArgs, logger *zap.SugaredLogger) (*UsersResp, error) { count, err := orm.GetUsersCount(args.Name) if err != nil { logger.Errorf("SeachUsers GetUsersCount By name:%s error, error msg:%s", args.Name, err.Error()) @@ -66,6 +82,7 @@ func SeachUsers(args *QueryArgs, logger *zap.SugaredLogger) (*UsersResp, error) TotalCount: 0, }, nil } + users, err := orm.ListUsers(args.Page, args.PerPage, args.Name, core.DB) if err != nil { logger.Errorf("SeachUsers SeachUsers By name:%s error, error msg:%s", args.Name, err.Error()) @@ -80,8 +97,16 @@ func SeachUsers(args *QueryArgs, logger *zap.SugaredLogger) (*UsersResp, error) logger.Errorf("SeachUsers ListUserLogins By uids:%s error, error msg:%s", uids, err.Error()) return nil, err } + usersInfo := mergeUserLogin(users, *userLogins, logger) + return &UsersResp{ + Users: usersInfo, + TotalCount: count, + }, nil +} + +func mergeUserLogin(users []models.User, userLogins []models.UserLogin, logger *zap.SugaredLogger) []UserInfo { userLoginMap := make(map[string]models.UserLogin) - for _, userLogin := range *userLogins { + for _, userLogin := range userLogins { userLoginMap[userLogin.UID] = userLogin } var usersInfo []UserInfo @@ -94,24 +119,51 @@ func SeachUsers(args *QueryArgs, logger *zap.SugaredLogger) (*UsersResp, error) Name: user.Name, Email: user.Email, IdentityType: user.IdentityType, + Account: user.Account, }) } else { logger.Error("user:%s login info not exist") } } + return usersInfo +} + +func SearchUsersByUIDs(uids []string, logger *zap.SugaredLogger) (*UsersResp, error) { + users, err := orm.ListUsersByUIDs(uids, core.DB) + if err != nil { + logger.Errorf("SearchUsersByUIDs SeachUsers By uids:%s error, error msg:%s", uids, err.Error()) + return nil, err + } + userLogins, err := orm.ListUserLogins(uids, core.DB) + if err != nil { + logger.Errorf("SearchUsersByUIDs ListUserLogins By uids:%s error, error msg:%s", uids, err.Error()) + return nil, err + } + usersInfo := mergeUserLogin(users, *userLogins, logger) return &UsersResp{ Users: usersInfo, - TotalCount: count, + TotalCount: int64(len(usersInfo)), }, nil } -func CreateUser(args *User, logger *zap.SugaredLogger) error { +func getLoginId(user *models.User, loginType config.LoginType) string { + switch loginType { + case config.AccountLocinType: + return user.Account + default: + return user.Account + } + +} + +func CreateUser(args *User, logger *zap.SugaredLogger) (*models.User, error) { uid, _ := uuid.NewUUID() user := &models.User{ Name: args.Name, Email: args.Email, IdentityType: config.SystemIdentityType, Phone: args.Phone, + Account: args.Account, UID: uid.String(), } tx := core.DB.Begin() @@ -124,21 +176,23 @@ func CreateUser(args *User, logger *zap.SugaredLogger) error { if err != nil { tx.Rollback() logger.Errorf("CreateUser CreateUser :%v error, error msg:%s", user, err.Error()) - return err + return nil, err } hashedPassword, _ := bcrypt.GenerateFromPassword([]byte(args.Password), bcrypt.DefaultCost) userLogin := &models.UserLogin{ UID: user.UID, Password: string(hashedPassword), LastLoginTime: 0, + LoginId: getLoginId(user, config.AccountLocinType), + LoginType: int(config.AccountLocinType), } err = orm.CreateUserLogin(userLogin, tx) if err != nil { tx.Rollback() logger.Errorf("CreateUser CreateUserLogin:%v error, error msg:%s", user, err.Error()) - return err + return nil, err } - return tx.Commit().Error + return user, tx.Commit().Error } func UpdatePassword(args *Password, logger *zap.SugaredLogger) error { @@ -150,7 +204,7 @@ func UpdatePassword(args *Password, logger *zap.SugaredLogger) error { if user == nil { return fmt.Errorf("user not exist") } - userLogin, err := orm.GetUserLogin(user.UID, core.DB) + userLogin, err := orm.GetUserLogin(user.UID, user.Account, config.AccountLocinType, core.DB) if err != nil { logger.Errorf("UpdatePassword GetUserLogin:%s error, error msg:%s", args.Uid, err.Error()) return err @@ -181,3 +235,64 @@ func UpdatePassword(args *Password, logger *zap.SugaredLogger) error { } return nil } + +func SyncUser(syncUserInfo *SyncUserInfo, logger *zap.SugaredLogger) (*models.User, error) { + user, err := orm.GetUser(syncUserInfo.Account, syncUserInfo.IdentityType, core.DB) + if err != nil { + logger.Error("SyncUser get user:%s error, error msg:%s", syncUserInfo.Account, err.Error()) + return nil, err + } + tx := core.DB.Begin() + defer func() { + if r := recover(); r != nil { + tx.Rollback() + } + }() + if user == nil { + uid, _ := uuid.NewUUID() + user = &models.User{ + UID: uid.String(), + Name: syncUserInfo.Name, + Account: syncUserInfo.Account, + IdentityType: syncUserInfo.IdentityType, + } + err = orm.CreateUser(user, tx) + if err != nil { + tx.Rollback() + logger.Error("SyncUser create user:%s error, error msg:%s", syncUserInfo.Account, err.Error()) + return nil, err + } + } + userLogin, err := orm.GetUserLogin(user.UID, user.Account, config.AccountLocinType, tx) + if err != nil { + tx.Rollback() + logger.Error("UpdateLoginInfo get user:%s login error, error msg:%s", user.UID, err.Error()) + return nil, err + } + if userLogin != nil { + userLogin.LastLoginTime = time.Now().Unix() + err = orm.UpdateUserLogin(user.UID, userLogin, tx) + if err != nil { + tx.Rollback() + logger.Error("UpdateLoginInfo update user:%s login error, error msg:%s", user.UID, err.Error()) + return nil, err + } + } else { + err = orm.CreateUserLogin(&models.UserLogin{ + UID: user.UID, + LastLoginTime: time.Now().Unix(), + LoginId: getLoginId(user, config.AccountLocinType), + LoginType: int(config.AccountLocinType), + }, tx) + if err != nil { + tx.Rollback() + logger.Error("UpdateLoginInfo create user:%s login error, error msg:%s", user.UID, err.Error()) + return nil, err + } + } + err = tx.Commit().Error + if err != nil { + return nil, err + } + return user, nil +} -- Gitee From daa30b0d57fc1ae6a97d51b647e8fb8f81e0753c Mon Sep 17 00:00:00 2001 From: mouuii Date: Fri, 29 Oct 2021 18:26:25 +0800 Subject: [PATCH 175/405] delete project Signed-off-by: mouuii --- pkg/microservice/policy/core/handler/router.go | 2 +- pkg/shared/client/policy/policy.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/microservice/policy/core/handler/router.go b/pkg/microservice/policy/core/handler/router.go index 22f1018f8..1ddaebbb2 100644 --- a/pkg/microservice/policy/core/handler/router.go +++ b/pkg/microservice/policy/core/handler/router.go @@ -55,7 +55,7 @@ func (*Router) Inject(router *gin.RouterGroup) { roleBindings := router.Group("rolebindings") { roleBindings.POST("", CreateRoleBinding) - roleBindings.PUT("", UpdateRoleBinding) + roleBindings.PUT("/:name", UpdateRoleBinding) roleBindings.GET("", ListRoleBindings) roleBindings.DELETE("/:name", DeleteRoleBinding) roleBindings.POST("/bulk-delete", DeleteRoleBindings) diff --git a/pkg/shared/client/policy/policy.go b/pkg/shared/client/policy/policy.go index 8e9d4e8ea..74fb132d1 100644 --- a/pkg/shared/client/policy/policy.go +++ b/pkg/shared/client/policy/policy.go @@ -50,7 +50,7 @@ func (c *Client) ListRoleBindings(projectName string) ([]*RoleBinding, error) { } func (c *Client) CreateOrUpdateRoleBinding(projectName string, roleBinding *RoleBinding) error { - url := fmt.Sprintf("/rolebindings?projectName=%s", projectName) + url := fmt.Sprintf("/rolebindings/%s?projectName=%s", roleBinding.Name, projectName) _, err := c.Put(url, httpclient.SetBody(roleBinding)) return err } -- Gitee From fca87305e20e557cb86a23f86463545f552e5453 Mon Sep 17 00:00:00 2001 From: mouuii Date: Fri, 29 Oct 2021 18:32:22 +0800 Subject: [PATCH 176/405] put name project Signed-off-by: mouuii --- pkg/microservice/picket/core/filter/handler/router.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/microservice/picket/core/filter/handler/router.go b/pkg/microservice/picket/core/filter/handler/router.go index 72a927c08..fcb5fd1fa 100644 --- a/pkg/microservice/picket/core/filter/handler/router.go +++ b/pkg/microservice/picket/core/filter/handler/router.go @@ -27,7 +27,7 @@ func (*Router) Inject(router *gin.RouterGroup) { { projects.GET("", ListProjects) projects.POST("", CreateProject) - projects.PUT("", UpdateProject) + projects.PUT("/:name", UpdateProject) } workflows := router.Group("workflows") -- Gitee From d3d7c6f7cb24a2e24f233028d8862291cfcbfcb2 Mon Sep 17 00:00:00 2001 From: mouuii Date: Fri, 29 Oct 2021 18:35:50 +0800 Subject: [PATCH 177/405] marsh project Signed-off-by: mouuii --- pkg/microservice/policy/core/handler/role_binding.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pkg/microservice/policy/core/handler/role_binding.go b/pkg/microservice/policy/core/handler/role_binding.go index 0485cefd9..c14d37ff9 100644 --- a/pkg/microservice/policy/core/handler/role_binding.go +++ b/pkg/microservice/policy/core/handler/role_binding.go @@ -37,9 +37,10 @@ func UpdateRoleBinding(c *gin.Context) { ctx.Err = e.ErrInvalidParam.AddDesc("projectName is empty") return } - args := &service.RoleBinding{} - + if err := c.ShouldBindJSON(&args); err != nil { + ctx.Err = e.ErrInvalidParam.AddDesc("bind json fail %s") + } ctx.Err = service.UpdateOrCreateRoleBinding(projectName, args, ctx.Logger) } -- Gitee From f2af2573b61769d16624373ae9c155b0f34f8f1a Mon Sep 17 00:00:00 2001 From: mouuii Date: Fri, 29 Oct 2021 18:41:01 +0800 Subject: [PATCH 178/405] log err Signed-off-by: mouuii --- pkg/microservice/picket/core/filter/service/project.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/microservice/picket/core/filter/service/project.go b/pkg/microservice/picket/core/filter/service/project.go index 4708d5f69..3dcf64f84 100644 --- a/pkg/microservice/picket/core/filter/service/project.go +++ b/pkg/microservice/picket/core/filter/service/project.go @@ -61,7 +61,7 @@ func UpdateProject(header http.Header, qs url.Values, body []byte, projectName s Role: string(setting.ReadOnly), Public: true, }); err != nil { - logger.Warnf("Failed to create role binding, err: %s", err) + logger.Errorf("Failed to create role binding, err: %s", err) return nil, err } } -- Gitee From c751e944d8654eab5116b087de1762614256a2e9 Mon Sep 17 00:00:00 2001 From: mouuii Date: Fri, 29 Oct 2021 19:00:03 +0800 Subject: [PATCH 179/405] bug Signed-off-by: mouuii --- pkg/microservice/aslan/core/project/service/product.go | 2 +- pkg/microservice/picket/core/filter/handler/project.go | 2 +- pkg/microservice/picket/core/filter/handler/router.go | 2 +- pkg/microservice/picket/core/filter/service/project.go | 9 +++++++-- 4 files changed, 10 insertions(+), 5 deletions(-) diff --git a/pkg/microservice/aslan/core/project/service/product.go b/pkg/microservice/aslan/core/project/service/product.go index 78a64f51b..cabd3fc5a 100644 --- a/pkg/microservice/aslan/core/project/service/product.go +++ b/pkg/microservice/aslan/core/project/service/product.go @@ -510,7 +510,7 @@ func ForkProduct(username, uid, requestID string, args *template.ForkProject, lo CreateBy: username, UpdateBy: username, } - err = policy.NewDefault().CreateRoleBinding(args.ProductName, &policy.RoleBinding{ + err = policy.NewDefault().CreateOrUpdateRoleBinding(args.ProductName, &policy.RoleBinding{ Name: fmt.Sprintf(setting.RoleBindingNameFmt, args.ProductName, uid, args.ProductName), UID: uid, Role: string(setting.Contributor), diff --git a/pkg/microservice/picket/core/filter/handler/project.go b/pkg/microservice/picket/core/filter/handler/project.go index e3bc33fa8..5e8097f08 100644 --- a/pkg/microservice/picket/core/filter/handler/project.go +++ b/pkg/microservice/picket/core/filter/handler/project.go @@ -66,5 +66,5 @@ func DeleteProject(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - ctx.Resp, ctx.Err = service.DeleteProject(c.Request.Header, c.Request.URL.Query(), c.Param("project"), ctx.Logger) + ctx.Resp, ctx.Err = service.DeleteProject(c.Request.Header, c.Request.URL.Query(), c.Param("name"), ctx.Logger) } diff --git a/pkg/microservice/picket/core/filter/handler/router.go b/pkg/microservice/picket/core/filter/handler/router.go index 2d41dfd0f..5ec375405 100644 --- a/pkg/microservice/picket/core/filter/handler/router.go +++ b/pkg/microservice/picket/core/filter/handler/router.go @@ -25,7 +25,7 @@ type Router struct{} func (*Router) Inject(router *gin.RouterGroup) { projects := router.Group("projects") { - projects.DELETE("/:project", DeleteProject) + projects.DELETE("/:name", DeleteProject) projects.GET("", ListProjects) projects.POST("", CreateProject) projects.PUT("/:name", UpdateProject) diff --git a/pkg/microservice/picket/core/filter/service/project.go b/pkg/microservice/picket/core/filter/service/project.go index e7a1deee8..b76650b75 100644 --- a/pkg/microservice/picket/core/filter/service/project.go +++ b/pkg/microservice/picket/core/filter/service/project.go @@ -12,6 +12,7 @@ import ( "github.com/koderover/zadig/pkg/microservice/picket/client/opa" "github.com/koderover/zadig/pkg/setting" "github.com/koderover/zadig/pkg/shared/client/policy" + "github.com/koderover/zadig/pkg/tool/log" ) type allowedProjectsData struct { @@ -97,8 +98,12 @@ func ListProjects(header http.Header, qs url.Values, logger *zap.SugaredLogger) func DeleteProject(header http.Header, qs url.Values, productName string, logger *zap.SugaredLogger) ([]byte, error) { // delete roles and rolebindings - policy.NewDefault().DeleteRoleBindings([]string{"*"}, productName) - policy.NewDefault().DeleteRoles([]string{"*"}, productName) + if err := policy.NewDefault().DeleteRoleBindings([]string{"*"}, productName); err != nil { + log.Errorf("delete rolebindings err:%s", err) + } + if err := policy.NewDefault().DeleteRoles([]string{"*"}, productName); err != nil { + log.Errorf("delete roles err:%s", err) + } return aslan.New().DeleteProject(header, qs, productName) } -- Gitee From 87dec6457750cd8f9a79ae977f5f78c69ebda505 Mon Sep 17 00:00:00 2001 From: mouuii Date: Fri, 29 Oct 2021 19:32:14 +0800 Subject: [PATCH 180/405] refactor Signed-off-by: mouuii --- pkg/shared/client/policy/policy.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/shared/client/policy/policy.go b/pkg/shared/client/policy/policy.go index 50233364c..23cdbe5fa 100644 --- a/pkg/shared/client/policy/policy.go +++ b/pkg/shared/client/policy/policy.go @@ -67,7 +67,7 @@ type NameArgs struct { func (c *Client) DeleteRoleBindings(names []string, projectName string) error { url := fmt.Sprintf("/rolebindings/bulk-delete?projectName=%s", projectName) - nameArgs := NameArgs{} + nameArgs := &NameArgs{} for _, v := range names { nameArgs.Names = append(nameArgs.Names, v) } @@ -77,7 +77,7 @@ func (c *Client) DeleteRoleBindings(names []string, projectName string) error { func (c *Client) DeleteRoles(names []string, projectName string) error { url := fmt.Sprintf("/roles/bulk-delete?projectName=%s", projectName) - nameArgs := NameArgs{} + nameArgs := &NameArgs{} for _, v := range names { nameArgs.Names = append(nameArgs.Names, v) } -- Gitee From 35335d4959e0ffe6248ee629dad4361205fe378e Mon Sep 17 00:00:00 2001 From: panxunying <641770806@qq.com> Date: Fri, 29 Oct 2021 19:51:47 +0800 Subject: [PATCH 181/405] optimize Signed-off-by: panxunying <641770806@qq.com> --- pkg/microservice/user/config/consts.go | 2 +- pkg/microservice/user/core/handler/user/user.go | 6 +++--- pkg/microservice/user/core/service/user/user.go | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/pkg/microservice/user/config/consts.go b/pkg/microservice/user/config/consts.go index 6f13e8e9f..4935cbe9a 100644 --- a/pkg/microservice/user/config/consts.go +++ b/pkg/microservice/user/config/consts.go @@ -28,5 +28,5 @@ const ( type LoginType int const ( - AccountLocinType LoginType = 0 + AccountLoginType LoginType = 0 ) diff --git a/pkg/microservice/user/core/handler/user/user.go b/pkg/microservice/user/core/handler/user/user.go index 697dba0c5..b103d84f7 100644 --- a/pkg/microservice/user/core/handler/user/user.go +++ b/pkg/microservice/user/core/handler/user/user.go @@ -1,12 +1,12 @@ package user import ( - "fmt" - "github.com/gin-gonic/gin" "github.com/koderover/zadig/pkg/microservice/user/core/service/user" internalhandler "github.com/koderover/zadig/pkg/shared/handler" + + e "github.com/koderover/zadig/pkg/tool/errors" ) func GetUser(c *gin.Context) { @@ -20,7 +20,7 @@ func GetPersonalUser(c *gin.Context) { defer func() { internalhandler.JSONResponse(c, ctx) }() uid := c.Param("uid") if ctx.UserID != uid { - ctx.Err = fmt.Errorf("token uid doesn't match uid") + ctx.Err = e.ErrForbidden } ctx.Resp, ctx.Err = user.GetUser(uid, ctx.Logger) } diff --git a/pkg/microservice/user/core/service/user/user.go b/pkg/microservice/user/core/service/user/user.go index 6f93566ec..016357fa7 100644 --- a/pkg/microservice/user/core/service/user/user.go +++ b/pkg/microservice/user/core/service/user/user.go @@ -183,8 +183,8 @@ func CreateUser(args *User, logger *zap.SugaredLogger) (*models.User, error) { UID: user.UID, Password: string(hashedPassword), LastLoginTime: 0, - LoginId: getLoginId(user, config.AccountLocinType), - LoginType: int(config.AccountLocinType), + LoginId: getLoginId(user, config.AccountLoginType), + LoginType: int(config.AccountLoginType), } err = orm.CreateUserLogin(userLogin, tx) if err != nil { -- Gitee From a4945ab9b8071c000b0e017093da1e987385b5e2 Mon Sep 17 00:00:00 2001 From: panxunying <641770806@qq.com> Date: Fri, 29 Oct 2021 19:57:21 +0800 Subject: [PATCH 182/405] optimize Signed-off-by: panxunying <641770806@qq.com> --- pkg/microservice/user/core/handler/user/user.go | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/microservice/user/core/handler/user/user.go b/pkg/microservice/user/core/handler/user/user.go index b103d84f7..530b434d4 100644 --- a/pkg/microservice/user/core/handler/user/user.go +++ b/pkg/microservice/user/core/handler/user/user.go @@ -21,6 +21,7 @@ func GetPersonalUser(c *gin.Context) { uid := c.Param("uid") if ctx.UserID != uid { ctx.Err = e.ErrForbidden + return } ctx.Resp, ctx.Err = user.GetUser(uid, ctx.Logger) } -- Gitee From 7b01caa3e488e598696f4ecb74f2816441f2d0f2 Mon Sep 17 00:00:00 2001 From: lou Date: Fri, 29 Oct 2021 20:06:53 +0800 Subject: [PATCH 183/405] return 401 if not authenticated Signed-off-by: lou --- .../core/service/bundle/rego/authz.rego | 35 ++++++++++++++++--- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/pkg/microservice/policy/core/service/bundle/rego/authz.rego b/pkg/microservice/policy/core/service/bundle/rego/authz.rego index cec268d7c..5e726706a 100644 --- a/pkg/microservice/policy/core/service/bundle/rego/authz.rego +++ b/pkg/microservice/policy/core/service/bundle/rego/authz.rego @@ -5,11 +5,31 @@ import input.attributes.request.http as http_request # Policy rule definitions in rbac style which is consumed by OPA server. # you can use it to: # 1. decide if a request is allowed by querying: rbac.allow -# 2. get all visible projects for an authenticated user by querying: rbac.user_visible_projects -# 3. get all allowed projects for a certain action(method+endpoint) for an authenticated user by querying: rbac.user_allowed_projects -# 4. check if a user is system admin by querying: rbac.user_is_admin -# 5. check if a user is project admin by querying: rbac.user_is_project_admin +# 2. decide if a request is allowed and get the status code by querying: rbac.response +# 3. get all visible projects for an authenticated user by querying: rbac.user_visible_projects +# 4. get all allowed projects for a certain action(method+endpoint) for an authenticated user by querying: rbac.user_allowed_projects +# 5. check if a user is system admin by querying: rbac.user_is_admin +# 6. check if a user is project admin by querying: rbac.user_is_project_admin +default response = { + "allowed": false, + "http_status": 403 +} + +response = r { + not is_authenticated + r := { + "allowed": false, + "http_status": 401 + } +} + +response = r { + allow + r := { + "allowed": true, + } +} # By default, deny requests. default allow = false @@ -21,8 +41,8 @@ allow { # Allow all valid users to visit exempted urls. allow { + is_authenticated url_is_exempted - claims.uid != "" } # Allow admins to do anything. @@ -196,6 +216,11 @@ bearer_token := t { t := substring(v, count("Bearer "), -1) } +is_authenticated { + claims + claims.uid != "" +} + envs := env { env := opa.runtime()["env"] } -- Gitee From 0bdabbc3aeadb381a34a6c747059b13f1cb4a86d Mon Sep 17 00:00:00 2001 From: lou Date: Fri, 29 Oct 2021 21:03:49 +0800 Subject: [PATCH 184/405] fix issue Signed-off-by: lou --- pkg/microservice/policy/core/service/bundle/rego/authz.rego | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/microservice/policy/core/service/bundle/rego/authz.rego b/pkg/microservice/policy/core/service/bundle/rego/authz.rego index 5e726706a..f35dd344f 100644 --- a/pkg/microservice/policy/core/service/bundle/rego/authz.rego +++ b/pkg/microservice/policy/core/service/bundle/rego/authz.rego @@ -18,6 +18,7 @@ default response = { response = r { not is_authenticated + not url_is_public r := { "allowed": false, "http_status": 401 -- Gitee From 2ea6f74ed74ba9e3ec51537e22c622725fa87df3 Mon Sep 17 00:00:00 2001 From: panxunying <641770806@qq.com> Date: Fri, 29 Oct 2021 21:22:55 +0800 Subject: [PATCH 185/405] add user-sync Signed-off-by: panxunying <641770806@qq.com> --- go.mod | 1 + pkg/config/config.go | 8 +-- pkg/microservice/user/core/handler/router.go | 2 + .../user/core/handler/user/user.go | 70 +++++++++++++++++++ .../user/core/repository/orm/user.go | 13 ++-- .../user/core/service/user/user.go | 10 +-- pkg/shared/client/systemconfig/client.go | 40 +++++++++++ .../client/systemconfig/systemconfig.go | 18 +++++ 8 files changed, 145 insertions(+), 17 deletions(-) create mode 100644 pkg/shared/client/systemconfig/client.go create mode 100644 pkg/shared/client/systemconfig/systemconfig.go diff --git a/go.mod b/go.mod index c281428b1..140b7fbf1 100644 --- a/go.mod +++ b/go.mod @@ -26,6 +26,7 @@ require ( github.com/garyburd/redigo v1.6.2 // indirect github.com/gin-contrib/sse v0.1.0 github.com/gin-gonic/gin v1.7.2 + github.com/go-ldap/ldap/v3 v3.3.0 github.com/go-resty/resty/v2 v2.6.0 github.com/gofrs/uuid v4.0.0+incompatible // indirect github.com/golang-jwt/jwt v3.2.2+incompatible diff --git a/pkg/config/config.go b/pkg/config/config.go index 88dd35612..7dfa9703c 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -150,15 +150,15 @@ func PoetryServiceInfo() *setting.ServiceInfo { return GetServiceByCode(setting.Poetry) } -func ConfigServiceInfo() *setting.ServiceInfo { - return GetServiceByCode(setting.Poetry) -} - func PoetryServiceAddress() string { s := PoetryServiceInfo() return GetServiceAddress(s.Name, s.Port) } +func ConfigServiceInfo() *setting.ServiceInfo { + return GetServiceByCode(setting.Config) +} + func ConfigServiceAddress() string { s := ConfigServiceInfo() return GetServiceAddress(s.Name, s.Port) diff --git a/pkg/microservice/user/core/handler/router.go b/pkg/microservice/user/core/handler/router.go index beb9e0e36..5b191c859 100644 --- a/pkg/microservice/user/core/handler/router.go +++ b/pkg/microservice/user/core/handler/router.go @@ -39,5 +39,7 @@ func (*Router) Inject(router *gin.RouterGroup) { users.GET("/users/:uid/personal", user.GetPersonalUser) users.POST("/users/search", user.ListUsers) + + users.POST("/users/ldap/:ldapId", user.SyncLdapUser) } } diff --git a/pkg/microservice/user/core/handler/user/user.go b/pkg/microservice/user/core/handler/user/user.go index 697dba0c5..642fcc9dc 100644 --- a/pkg/microservice/user/core/handler/user/user.go +++ b/pkg/microservice/user/core/handler/user/user.go @@ -3,12 +3,82 @@ package user import ( "fmt" + "github.com/dexidp/dex/connector/ldap" "github.com/gin-gonic/gin" + "go.uber.org/zap" + ldapv3 "github.com/go-ldap/ldap/v3" + + "github.com/koderover/zadig/pkg/microservice/systemconfig/core/service" "github.com/koderover/zadig/pkg/microservice/user/core/service/user" + "github.com/koderover/zadig/pkg/shared/client/systemconfig" internalhandler "github.com/koderover/zadig/pkg/shared/handler" ) +func searchAndSyncUser(si *service.Connector, logger *zap.SugaredLogger) error { + if si == nil || si.Config == nil { + logger.Error("can't find connector") + return fmt.Errorf("can't find connector") + } + config, _ := si.Config.(*ldap.Config) + l, err := ldapv3.Dial("tcp", config.Host) + if err != nil { + logger.Error(err) + return err + } + defer l.Close() + + err = l.Bind(config.BindDN, config.BindPW) + if err != nil { + logger.Error(err) + return err + } + + searchRequest := ldapv3.NewSearchRequest( + config.GroupSearch.BaseDN, + ldapv3.ScopeWholeSubtree, ldapv3.NeverDerefAliases, 0, 0, false, + config.GroupSearch.Filter, // The filter to apply + []string{config.UserSearch.NameAttr, config.UserSearch.EmailAttr}, // A list attributes to retrieve + nil, + ) + + sr, err := l.Search(searchRequest) + if err != nil { + logger.Error(err) + return err + } + + for _, entry := range sr.Entries { + _, err := user.SyncUser(&user.SyncUserInfo{ + Account: entry.GetAttributeValue(config.UserSearch.NameAttr), + IdentityType: si.ID, + }, logger) + if err != nil { + return err + } + } + return nil +} + +func SyncLdapUser(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + ctx.Logger.Info("SyncLdapUser start") + ldapId := c.Param("ldapId") + systemConfigClient := systemconfig.New() + si, err := systemConfigClient.GetConnector(ldapId) + if err != nil { + ctx.Logger.Error(err) + ctx.Err = err + return + } + if err != nil { + ctx.Err = err + return + } + ctx.Err = searchAndSyncUser(si, ctx.Logger) +} + func GetUser(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() diff --git a/pkg/microservice/user/core/repository/orm/user.go b/pkg/microservice/user/core/repository/orm/user.go index faeda529f..b70ffa9e0 100644 --- a/pkg/microservice/user/core/repository/orm/user.go +++ b/pkg/microservice/user/core/repository/orm/user.go @@ -42,16 +42,13 @@ func GetUserByUid(uid string, db *gorm.DB) (*models.User, error) { } // ListUsers gets a list of users based on paging constraints -func ListUsers(page int, perPage int, name string, db *gorm.DB) ([]models.User, error) { +func ListUsers(page int, perPage int, account string, db *gorm.DB) ([]models.User, error) { var ( users []models.User err error ) - if page > 0 && perPage > 0 { - err = db.Where("name LIKE ?", "%"+name+"%").Find(&users).Offset((page - 1) * perPage).Limit(perPage).Error - } else { - err = db.Where("name LIKE ?", "%"+name+"%").Find(&users).Error - } + + err = db.Where("account LIKE ?", "%"+account+"%").Offset((page - 1) * perPage).Limit(perPage).Find(&users).Error if err != nil && err != gorm.ErrRecordNotFound { return nil, err @@ -77,14 +74,14 @@ func ListUsersByUIDs(uids []string, db *gorm.DB) ([]models.User, error) { } // GetUsersCount gets user count -func GetUsersCount(name string) (int64, error) { +func GetUsersCount(account string) (int64, error) { var ( users []models.User err error count int64 ) - err = core.DB.Where("name LIKE ?", "%"+name+"%").Find(&users).Count(&count).Error + err = core.DB.Where("account LIKE ?", "%"+account+"%").Find(&users).Count(&count).Error if err != nil { return 0, err diff --git a/pkg/microservice/user/core/service/user/user.go b/pkg/microservice/user/core/service/user/user.go index 6f93566ec..dd8423b00 100644 --- a/pkg/microservice/user/core/service/user/user.go +++ b/pkg/microservice/user/core/service/user/user.go @@ -23,7 +23,7 @@ type User struct { } type QueryArgs struct { - Name string `json:"name,omitempty"` + Account string `json:"account,omitempty"` UIDs []string `json:"uids,omitempty"` PerPage int `json:"per_page,omitempty"` Page int `json:"page,omitempty"` @@ -72,9 +72,9 @@ func GetUser(uid string, logger *zap.SugaredLogger) (*UserInfo, error) { } func SearchUsers(args *QueryArgs, logger *zap.SugaredLogger) (*UsersResp, error) { - count, err := orm.GetUsersCount(args.Name) + count, err := orm.GetUsersCount(args.Account) if err != nil { - logger.Errorf("SeachUsers GetUsersCount By name:%s error, error msg:%s", args.Name, err.Error()) + logger.Errorf("SeachUsers GetUsersCount By account:%s error, error msg:%s", args.Account, err.Error()) return nil, err } if count == 0 { @@ -83,9 +83,9 @@ func SearchUsers(args *QueryArgs, logger *zap.SugaredLogger) (*UsersResp, error) }, nil } - users, err := orm.ListUsers(args.Page, args.PerPage, args.Name, core.DB) + users, err := orm.ListUsers(args.Page, args.PerPage, args.Account, core.DB) if err != nil { - logger.Errorf("SeachUsers SeachUsers By name:%s error, error msg:%s", args.Name, err.Error()) + logger.Errorf("SeachUsers SeachUsers By account:%s error, error msg:%s", args.Account, err.Error()) return nil, err } var uids []string diff --git a/pkg/shared/client/systemconfig/client.go b/pkg/shared/client/systemconfig/client.go new file mode 100644 index 000000000..cc9052c52 --- /dev/null +++ b/pkg/shared/client/systemconfig/client.go @@ -0,0 +1,40 @@ +/* +Copyright 2021 The KodeRover 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 systemconfig + +import ( + "github.com/koderover/zadig/pkg/config" + "github.com/koderover/zadig/pkg/tool/httpclient" +) + +type Client struct { + *httpclient.Client + + host string +} + +func New() *Client { + host := config.ConfigServiceAddress() + c := httpclient.New( + httpclient.SetHostURL(host + "/api/v1"), + ) + + return &Client{ + Client: c, + host: host, + } +} diff --git a/pkg/shared/client/systemconfig/systemconfig.go b/pkg/shared/client/systemconfig/systemconfig.go new file mode 100644 index 000000000..f75eb8302 --- /dev/null +++ b/pkg/shared/client/systemconfig/systemconfig.go @@ -0,0 +1,18 @@ +package systemconfig + +import ( + "github.com/koderover/zadig/pkg/microservice/systemconfig/core/service" + "github.com/koderover/zadig/pkg/tool/httpclient" +) + +func (c *Client) GetConnector(id string) (*service.Connector, error) { + url := "/connectors/" + id + + res := &service.Connector{} + _, err := c.Get(url, httpclient.SetResult(res)) + if err != nil { + return nil, err + } + + return res, err +} -- Gitee From bc6b179fd2da04e04703bd5ff4ceca49896a27ad Mon Sep 17 00:00:00 2001 From: lou Date: Fri, 29 Oct 2021 21:35:31 +0800 Subject: [PATCH 186/405] remove org_id Signed-off-by: lou --- .../aslan/core/common/repository/models/pipeline.go | 2 -- .../aslan/core/common/repository/models/queue.go | 2 -- .../core/common/repository/models/registry_namespace.go | 4 ---- .../aslan/core/common/repository/models/task/model.go | 2 -- .../aslan/core/common/repository/models/template/product.go | 1 - .../core/common/repository/mongodb/registry_namespace.go | 5 ----- .../aslan/core/workflow/service/workflow/convert.go | 2 -- .../aslan/core/workflow/service/workflow/pipeline_task.go | 1 - pkg/microservice/cron/core/service/types.go | 2 -- pkg/microservice/warpdrive/core/service/types/task/build.go | 1 - pkg/microservice/warpdrive/core/service/types/task/model.go | 2 -- pkg/shared/codehost/codehost.go | 1 - pkg/shared/poetry/codehost.go | 3 +-- pkg/shared/poetry/jira.go | 2 +- 14 files changed, 2 insertions(+), 28 deletions(-) diff --git a/pkg/microservice/aslan/core/common/repository/models/pipeline.go b/pkg/microservice/aslan/core/common/repository/models/pipeline.go index 40cfe1561..8be7b23f0 100644 --- a/pkg/microservice/aslan/core/common/repository/models/pipeline.go +++ b/pkg/microservice/aslan/core/common/repository/models/pipeline.go @@ -32,8 +32,6 @@ type Pipeline struct { Enabled bool `bson:"enabled" json:"enabled"` TeamName string `bson:"team" json:"team"` ProductName string `bson:"product_name" json:"product_name"` - // OrgID 单租户ID - OrgID int `bson:"org_id" json:"org_id"` // target 服务名称, k8s为容器名称, 物理机为服务名 Target string `bson:"target" json:"target"` // 使用预定义编译管理模块中的内容生成SubTasks, diff --git a/pkg/microservice/aslan/core/common/repository/models/queue.go b/pkg/microservice/aslan/core/common/repository/models/queue.go index d6279a8b3..20b458454 100644 --- a/pkg/microservice/aslan/core/common/repository/models/queue.go +++ b/pkg/microservice/aslan/core/common/repository/models/queue.go @@ -67,8 +67,6 @@ type Queue struct { ServiceTaskArgs *ServiceTaskArgs `bson:"service_args,omitempty" json:"service_args,omitempty"` ConfigPayload *ConfigPayload `json:"config_payload,omitempty"` Error string `bson:"error,omitempty" json:"error,omitempty"` - // OrgID 单租户ID - OrgID int `bson:"org_id,omitempty" json:"org_id,omitempty"` Services [][]*ProductService `bson:"services" json:"services"` Render *RenderInfo `bson:"render" json:"render"` StorageURI string `bson:"storage_uri,omitempty" json:"storage_uri,omitempty"` diff --git a/pkg/microservice/aslan/core/common/repository/models/registry_namespace.go b/pkg/microservice/aslan/core/common/repository/models/registry_namespace.go index 3c45ae984..707493e33 100644 --- a/pkg/microservice/aslan/core/common/repository/models/registry_namespace.go +++ b/pkg/microservice/aslan/core/common/repository/models/registry_namespace.go @@ -24,7 +24,6 @@ import ( type RegistryNamespace struct { ID primitive.ObjectID `bson:"_id,omitempty" json:"id,omitempty"` - OrgID int `bson:"org_id" json:"org_id"` RegAddr string `bson:"reg_addr" json:"reg_addr"` RegType string `bson:"reg_type" json:"reg_type"` RegProvider string `bson:"reg_provider" json:"reg_provider"` @@ -38,9 +37,6 @@ type RegistryNamespace struct { } func (ns *RegistryNamespace) Validate() error { - if ns.OrgID == 0 { - return errors.New("empty org_id") - } if ns.RegAddr == "" { return errors.New("empty reg_addr") diff --git a/pkg/microservice/aslan/core/common/repository/models/task/model.go b/pkg/microservice/aslan/core/common/repository/models/task/model.go index b71dabdb5..c503d9c6f 100644 --- a/pkg/microservice/aslan/core/common/repository/models/task/model.go +++ b/pkg/microservice/aslan/core/common/repository/models/task/model.go @@ -70,8 +70,6 @@ type Task struct { // ConfigPayload 系统配置信息 ConfigPayload *models.ConfigPayload `json:"config_payload,omitempty"` Error string `bson:"error,omitempty" json:"error,omitempty"` - // OrgID 单租户ID - OrgID int `bson:"org_id,omitempty" json:"org_id,omitempty"` Services [][]*models.ProductService `bson:"services" json:"services"` Render *models.RenderInfo `bson:"render" json:"render"` StorageURI string `bson:"storage_uri,omitempty" json:"storage_uri,omitempty"` diff --git a/pkg/microservice/aslan/core/common/repository/models/template/product.go b/pkg/microservice/aslan/core/common/repository/models/template/product.go index 1554cd904..73d4cc953 100644 --- a/pkg/microservice/aslan/core/common/repository/models/template/product.go +++ b/pkg/microservice/aslan/core/common/repository/models/template/product.go @@ -68,7 +68,6 @@ type Product struct { LatestWorkflowUpdateTime int64 `bson:"-" json:"latest_workflow_update_time"` LatestWorkflowUpdateBy string `bson:"-" json:"latest_workflow_update_by"` TotalEnvTemplateServiceNum int `bson:"-" json:"total_env_template_service_num"` - ShowProject bool `bson:"-" json:"show_project"` IsOpensource bool `bson:"is_opensource" json:"is_opensource"` CustomImageRule *CustomRule `bson:"custom_image_rule,omitempty" json:"custom_image_rule,omitempty"` CustomTarRule *CustomRule `bson:"custom_tar_rule,omitempty" json:"custom_tar_rule,omitempty"` diff --git a/pkg/microservice/aslan/core/common/repository/mongodb/registry_namespace.go b/pkg/microservice/aslan/core/common/repository/mongodb/registry_namespace.go index 539da8c35..d3df395c3 100644 --- a/pkg/microservice/aslan/core/common/repository/mongodb/registry_namespace.go +++ b/pkg/microservice/aslan/core/common/repository/mongodb/registry_namespace.go @@ -33,7 +33,6 @@ import ( type FindRegOps struct { ID string `json:"id"` - OrgID int `json:"org_id"` RegAddr string `json:"reg_addr"` RegType string `json:"reg_type"` RegProvider string `json:"reg_provider"` @@ -97,10 +96,6 @@ func (opt FindRegOps) getQuery() bson.M { query["is_default"] = true } - if opt.OrgID != 0 { - query["org_id"] = opt.OrgID - } - if opt.RegType != "" { query["reg_type"] = opt.RegType } diff --git a/pkg/microservice/aslan/core/workflow/service/workflow/convert.go b/pkg/microservice/aslan/core/workflow/service/workflow/convert.go index 811627426..7d98f8c95 100644 --- a/pkg/microservice/aslan/core/workflow/service/workflow/convert.go +++ b/pkg/microservice/aslan/core/workflow/service/workflow/convert.go @@ -61,7 +61,6 @@ func ConvertQueueToTask(queueTask *commonmodels.Queue) *task.Task { ServiceTaskArgs: queueTask.ServiceTaskArgs, ConfigPayload: queueTask.ConfigPayload, Error: queueTask.Error, - OrgID: queueTask.OrgID, Services: queueTask.Services, Render: queueTask.Render, StorageURI: queueTask.StorageURI, @@ -107,7 +106,6 @@ func ConvertTaskToQueue(task *task.Task) *commonmodels.Queue { ServiceTaskArgs: task.ServiceTaskArgs, ConfigPayload: task.ConfigPayload, Error: task.Error, - OrgID: task.OrgID, Services: task.Services, Render: task.Render, StorageURI: task.StorageURI, diff --git a/pkg/microservice/aslan/core/workflow/service/workflow/pipeline_task.go b/pkg/microservice/aslan/core/workflow/service/workflow/pipeline_task.go index 906a7fbe8..556a23a8d 100644 --- a/pkg/microservice/aslan/core/workflow/service/workflow/pipeline_task.go +++ b/pkg/microservice/aslan/core/workflow/service/workflow/pipeline_task.go @@ -196,7 +196,6 @@ func CreatePipelineTask(args *commonmodels.TaskArgs, log *zap.SugaredLogger) (*C MultiRun: pipeline.MultiRun, BuildModuleVer: pipeline.BuildModuleVer, Target: pipeline.Target, - OrgID: pipeline.OrgID, StorageURI: defaultStorageURI, } diff --git a/pkg/microservice/cron/core/service/types.go b/pkg/microservice/cron/core/service/types.go index 2fdddf7ce..ecce072b2 100644 --- a/pkg/microservice/cron/core/service/types.go +++ b/pkg/microservice/cron/core/service/types.go @@ -439,8 +439,6 @@ type Pipeline struct { Enabled bool `bson:"enabled" json:"enabled"` TeamName string `bson:"team" json:"team"` ProductName string `bson:"product_name" json:"product_name"` - // OrgID 单租户ID - OrgID int `bson:"org_id" json:"org_id"` // target 服务名称, k8s为容器名称, 物理机为服务名 Target string `bson:"target" json:"target"` // 使用预定义编译管理模块中的内容生成SubTasks, diff --git a/pkg/microservice/warpdrive/core/service/types/task/build.go b/pkg/microservice/warpdrive/core/service/types/task/build.go index eed15c975..e43541c77 100644 --- a/pkg/microservice/warpdrive/core/service/types/task/build.go +++ b/pkg/microservice/warpdrive/core/service/types/task/build.go @@ -76,7 +76,6 @@ type Install struct { } type RegistryNamespace struct { - OrgID int `bson:"org_id" json:"org_id"` RegAddr string `bson:"reg_addr" json:"reg_addr"` RegType string `bson:"reg_type" json:"reg_type"` RegProvider string `bson:"reg_provider" json:"reg_provider"` diff --git a/pkg/microservice/warpdrive/core/service/types/task/model.go b/pkg/microservice/warpdrive/core/service/types/task/model.go index 8fc7400a9..d21c91ccf 100644 --- a/pkg/microservice/warpdrive/core/service/types/task/model.go +++ b/pkg/microservice/warpdrive/core/service/types/task/model.go @@ -67,8 +67,6 @@ type Task struct { // ConfigPayload 系统配置信息 ConfigPayload *ConfigPayload `json:"config_payload,omitempty"` Error string `bson:"error,omitempty" json:"error,omitempty"` - // OrgID 单租户ID - OrgID int `bson:"org_id,omitempty" json:"org_id,omitempty"` Services [][]*ProductService `bson:"services" json:"services"` Render *RenderInfo `bson:"render" json:"render"` StorageURI string `bson:"storage_uri,omitempty" json:"storage_uri,omitempty"` diff --git a/pkg/shared/codehost/codehost.go b/pkg/shared/codehost/codehost.go index a266fd4a2..f86b08037 100644 --- a/pkg/shared/codehost/codehost.go +++ b/pkg/shared/codehost/codehost.go @@ -34,7 +34,6 @@ const ( type CodeHost struct { ID int `json:"id"` - OrgID int `json:"orgId"` Address string `json:"address"` Type string `json:"type"` AccessToken string `json:"accessToken"` diff --git a/pkg/shared/poetry/codehost.go b/pkg/shared/poetry/codehost.go index add22aa37..f095f9c63 100644 --- a/pkg/shared/poetry/codehost.go +++ b/pkg/shared/poetry/codehost.go @@ -22,7 +22,6 @@ import ( type CodeHost struct { ID int `json:"id"` - OrgID int `json:"orgId"` Address string `json:"address"` Type string `json:"type"` AccessToken string `json:"accessToken"` @@ -38,7 +37,7 @@ func (c *Client) ListCodeHosts() ([]*CodeHost, error) { url := "/directory/codehostss/search" codeHosts := make([]*CodeHost, 0) - _, err := c.Get(url, httpclient.SetResult(&codeHosts), httpclient.SetQueryParam("orgId", "1")) + _, err := c.Get(url, httpclient.SetResult(&codeHosts)) if err != nil { return nil, err } diff --git a/pkg/shared/poetry/jira.go b/pkg/shared/poetry/jira.go index 8cb131779..088279953 100644 --- a/pkg/shared/poetry/jira.go +++ b/pkg/shared/poetry/jira.go @@ -34,7 +34,7 @@ func (c *Client) GetJiraInfo() (*JiraInfo, error) { url := "/directory/jira" jira := &JiraInfo{} - _, err := c.Get(url, httpclient.SetResult(jira), httpclient.SetQueryParam("orgId", "1")) + _, err := c.Get(url, httpclient.SetResult(jira)) if err != nil { return nil, err } -- Gitee From 9b80d21be3f881dc7eea149b7682ade00f040be2 Mon Sep 17 00:00:00 2001 From: Guang Jiong Lou <7991675+27149chen@users.noreply.github.com> Date: Mon, 1 Nov 2021 14:27:14 +0800 Subject: [PATCH 187/405] merge main to nga (#503) * test labeler Signed-off-by: landylee007 * test labeler Signed-off-by: landylee007 * test labeler Signed-off-by: landylee007 * test labeler Signed-off-by: landylee007 * test labeler Signed-off-by: landylee007 * test labeler Signed-off-by: landylee007 * Feature/upgrade assistant (#343) * update upgrade logic Signed-off-by: allenshen * remove test code Signed-off-by: allenshen * Hotfix/environment update (#356) * Feature/upgrade assistant (#343) * update upgrade logic Signed-off-by: allenshen * remove test code Signed-off-by: allenshen * add filter serivce logic when updat Signed-off-by: allenshen * add helm service create data Signed-off-by: allenshen * add repo_link json tag Signed-off-by: allenshen * add service name response Signed-off-by: allenshen * use helm upgrade to update container image Signed-off-by: allenshen * add load bulk service from chart template Signed-off-by: allenshen * optimize code Signed-off-by: allenshen * optimize code Signed-off-by: allenshen * add list tar interface Signed-off-by: liu deyi * optimize list tar interface Signed-off-by: liu deyi * artifact args add url field Signed-off-by: liu deyi * download artifact file Signed-off-by: liu deyi * modify workspace Signed-off-by: liu deyi * optimize create artifact logic Signed-off-by: liu deyi * optimize create artifact logic Signed-off-by: liu deyi * add artifact sort Signed-off-by: liu deyi * modify artifact deploy logic Signed-off-by: liu deyi * modify subtask logic Signed-off-by: liu deyi * add artifact deploy stage Signed-off-by: liu deyi * modify artifact deploy stage Signed-off-by: liu deyi * optimize artifact deploy stage Signed-off-by: liu deyi * modify field Signed-off-by: liu deyi * add pipeline name field Signed-off-by: liu deyi * add product name field Signed-off-by: liu deyi * optimize code Signed-off-by: allenshen * update replace image logic Signed-off-by: allenshen * optimize code Signed-off-by: allenshen * fix compile error Signed-off-by: allenshen * remove useless code Signed-off-by: allenshen * optimze code Signed-off-by: allenshen * optimze code Signed-off-by: allenshen * optimze code Signed-off-by: allenshen * optimze code Signed-off-by: allenshen * optimze code Signed-off-by: allenshen * optize err print format Signed-off-by: allenshen * optimize code Signed-off-by: liu deyi * build add productName field Signed-off-by: liu deyi * optimize code Signed-off-by: allenshen * optmize code Signed-off-by: allenshen * workflow add storage_id field Signed-off-by: liu deyi * optimize code Signed-off-by: allenshen * opmize code Signed-off-by: allenshen * fix share service bug Signed-off-by: liu deyi * fix create env bug Signed-off-by: liu deyi * fix create env bug Signed-off-by: liu deyi * fix create env bug Signed-off-by: liu deyi * fix service deploy bug Signed-off-by: liu deyi * fix build bug Signed-off-by: liu deyi * fix tar file rule bug Signed-off-by: liu deyi * modify reaper Signed-off-by: liu deyi * modify reaper Signed-off-by: liu deyi * modify reaper Signed-off-by: liu deyi * fix loop bug Signed-off-by: liu deyi * remove debug code Signed-off-by: liu deyi * modify list tar interface Signed-off-by: liu deyi * debug code Signed-off-by: liu deyi * modify artifact interface Signed-off-by: liu deyi * modify artifact interface Signed-off-by: liu deyi * add batch insert cvm host interface Signed-off-by: liu deyi * fix nil pointer Signed-off-by: lou * optimize code Signed-off-by: allenshen * validate bulk add privatekey function Signed-off-by: liu deyi * add labels interface Signed-off-by: liu deyi * modify bulk add priviateKey interface Signed-off-by: liu deyi * add host label by label Signed-off-by: liu deyi * optimize code Signed-off-by: allenshen * added dockerfile template api & basic implementations Signed-off-by: Min Min * debug Signed-off-by: Min Min * minor bugfixes Signed-off-by: Min Min * added dockerfile parser validation Signed-off-by: Min Min * validation stuff Signed-off-by: Min Min * fix broken dependency Signed-off-by: Min Min * added dockerfile template to build Signed-off-by: Min Min * add validation API for dockerfile template Signed-off-by: Min Min * changed validation api response Signed-off-by: Min Min * get reference api fixed Signed-off-by: Min Min * added dockerfile template function to workflow Signed-off-by: Min Min * added auth token for reaper Signed-off-by: Min Min * reaper bugfix Signed-off-by: Min Min * added some debug information Signed-off-by: Min Min * debug logs Signed-off-by: Min Min * removed debug logs & bugfix Signed-off-by: Min Min * add debug logs to prevent nil Signed-off-by: Min Min * removed logs & finalize Signed-off-by: Min Min * set name of dockerfile template as unique Signed-off-by: Min Min * code review changes Signed-off-by: Min Min * code review changes Signed-off-by: Min Min * debug Signed-off-by: Min Min * debug on missing arg Signed-off-by: Min Min * dockerfile template Signed-off-by: Min Min * debug Signed-off-by: Min Min * modify list host ip interface Signed-off-by: liu deyi * change docker build command generate Signed-off-by: Min Min * debug Signed-off-by: Min Min * update the provider of privatekey Signed-off-by: liu deyi * Added _COMMIT_ID as workflow default parameter Signed-off-by: Min Min * update env config Signed-off-by: liu deyi * update env config Signed-off-by: liu deyi * CRUD for yaml template done Signed-off-by: Min Min * added create service from yaml template and reload service from yaml template Signed-off-by: Min Min * rebasing dockerfile_template Signed-off-by: Min Min * debug logs Signed-off-by: Min Min * debug replace yaml and webhook process logic Signed-off-by: Min Min * added get reference API Signed-off-by: Min Min * debug Signed-off-by: Min Min * Make template that is in-use not able to be deleted Signed-off-by: Min Min * optimize code Signed-off-by: liu deyi * changed update logic Signed-off-by: Min Min * filter the case where the label is empty Signed-off-by: liu deyi * optimize code Signed-off-by: liu deyi * added update yaml template varible values API Signed-off-by: Min Min * debugs Signed-off-by: Min Min * debugs Signed-off-by: Min Min * changed query reference logic Signed-off-by: Min Min * changed logic for loading service from template and list yaml templates api response Signed-off-by: Min Min * fix panic error Signed-off-by: allenshen * service module updates Signed-off-by: Min Min * add ingress display to service list Signed-off-by: liu deyi * optimize code Signed-off-by: liu deyi * naming stuff Signed-off-by: Min Min * changed location Signed-off-by: Min Min * optimize code Signed-off-by: liu deyi * optimize code Signed-off-by: liu deyi * optimize code Signed-off-by: liu deyi * optimize code Signed-off-by: liu deyi * optimize code Signed-off-by: liu deyi * optimize code Signed-off-by: liu deyi * Modify the way to get the service Signed-off-by: liu deyi * debug coe Signed-off-by: liu deyi * debug code Signed-off-by: liu deyi * debug code Signed-off-by: liu deyi * debug code Signed-off-by: liu deyi * debug code Signed-off-by: liu deyi * debug code Signed-off-by: liu deyi * debug code Signed-off-by: liu deyi * remove debug code Signed-off-by: liu deyi * optimize code Signed-off-by: liu deyi * debug code Signed-off-by: liu deyi * debug code Signed-off-by: liu deyi * add Bootcamps info to readme Signed-off-by: landylee007 * add Bootcamps info to readme Signed-off-by: landylee007 * Update server.go * Update types.go * Update action.yml * add Bootcamps info to readme Signed-off-by: landylee007 * modify the number of pr list Signed-off-by: liu deyi * modify error message Signed-off-by: liu deyi * fix file download failure problem Signed-off-by: liu deyi * fix file download failure problem Signed-off-by: liu deyi * debug code Signed-off-by: liu deyi * debug code Signed-off-by: liu deyi * debug code Signed-off-by: liu deyi * remove code Signed-off-by: liu deyi * remove code Signed-off-by: liu deyi * fix artifact download bug Signed-off-by: liu deyi * fix artifact download bug Signed-off-by: liu deyi * fix artifact download bug Signed-off-by: liu deyi * fix artifact download bug Signed-off-by: liu deyi * fix artifact download bug Signed-off-by: liu deyi * fix artifact download bug Signed-off-by: liu deyi * fix artifact download bug Signed-off-by: liu deyi * remove debug code Signed-off-by: liu deyi * rename function name Signed-off-by: liu deyi * return err Signed-off-by: liu deyi * modify log download logic Signed-off-by: liu deyi * fix conflict Signed-off-by: lou Co-authored-by: landylee007 Co-authored-by: Landy Co-authored-by: shendongdong Co-authored-by: lilianzhu Co-authored-by: liu deyi Co-authored-by: Min Min --- README-zh-CN.md | 35 +- README.md | 37 +- go.mod | 17 +- go.sum | 1003 ++++++++++++++--- pkg/microservice/aslan/config/consts.go | 1 + .../aslan/core/code/service/merge_request.go | 5 +- .../core/common/repository/models/build.go | 6 + .../common/repository/models/private_key.go | 10 - .../core/common/repository/models/queue.go | 11 +- .../aslan/core/common/repository/models/s3.go | 8 + .../core/common/repository/models/service.go | 23 + .../common/repository/models/task/build.go | 17 +- .../repository/models/task/docker_build.go | 2 + .../repository/models/template/product.go | 14 +- .../core/common/repository/models/workflow.go | 51 +- .../common/repository/models/yaml_template.go | 19 + .../core/common/repository/mongodb/build.go | 15 + .../repository/mongodb/delivery_artifact.go | 64 +- .../common/repository/mongodb/private_key.go | 55 +- .../core/common/repository/mongodb/service.go | 18 +- .../repository/mongodb/yaml_template.go | 116 ++ .../aslan/core/common/service/environment.go | 71 +- .../core/common/service/gitlab/webhook.go | 5 +- .../aslan/core/common/service/render.go | 8 +- .../aslan/core/common/service/service.go | 8 +- .../core/environment/service/environment.go | 222 ++-- .../service/environment_creator.go | 2 +- .../aslan/core/environment/service/image.go | 356 +++++- .../aslan/core/log/service/log.go | 3 +- pkg/microservice/aslan/core/service.go | 4 + .../aslan/core/service/handler/helm.go | 14 + .../aslan/core/service/handler/router.go | 7 + .../core/service/handler/yaml_template.go | 42 + .../aslan/core/service/service/helm.go | 385 ++++++- .../aslan/core/service/service/pm.go | 2 +- .../aslan/core/service/service/service.go | 7 +- .../aslan/core/service/service/types.go | 51 +- .../core/service/service/yaml_template.go | 86 ++ .../aslan/core/system/handler/private_key.go | 36 + .../aslan/core/system/handler/router.go | 3 + .../aslan/core/system/handler/s3.go | 17 + .../aslan/core/system/service/private_key.go | 64 ++ .../aslan/core/system/service/s3.go | 75 ++ .../core/templatestore/handler/dockerfile.go | 128 +++ .../core/templatestore/handler/router.go | 22 + .../aslan/core/templatestore/handler/yaml.go | 107 ++ .../repository/models/dockerfile.go | 13 + .../repository/mongodb/dockerfile.go | 116 ++ .../core/templatestore/service/dockerfile.go | 171 +++ .../aslan/core/templatestore/service/types.go | 51 + .../aslan/core/templatestore/service/yaml.go | 212 ++++ .../aslan/core/workflow/handler/build.go | 7 +- .../core/workflow/handler/workflow_task.go | 12 +- .../service/webhook/github_workflow_task.go | 2 +- .../workflow/service/workflow/nsq_handlers.go | 6 +- .../service/workflow/pipeline_task.go | 39 +- .../service/workflow/pipeline_validation.go | 6 +- .../workflow/service/workflow/service_task.go | 7 +- .../workflow/service/workflow/workflow.go | 4 +- .../service/workflow/workflow_task.go | 154 ++- .../workflow/testing/handler/workspace.go | 2 +- .../workflow/testing/service/workspace.go | 17 +- pkg/microservice/cron/core/service/types.go | 1 + .../reaper/core/service/client/client.go | 25 + .../reaper/core/service/client/dockerfile.go | 44 + .../reaper/core/service/meta/types.go | 33 +- .../reaper/core/service/reaper/reaper.go | 65 +- .../reaper/core/service/reaper/script.go | 37 + pkg/microservice/reaper/executor/executor.go | 8 +- pkg/microservice/warpdrive/config/const.go | 1 + .../service/taskcontroller/task_helper.go | 1 + .../service/taskplugin/artifact_deploy.go | 369 ++++++ .../core/service/taskplugin/build.go | 19 + .../core/service/taskplugin/deploy.go | 50 +- .../core/service/taskplugin/docker_build.go | 2 + .../warpdrive/core/service/taskplugin/job.go | 12 +- .../core/service/types/environment.go | 2 +- .../warpdrive/core/service/types/reaper.go | 20 +- .../core/service/types/task/build.go | 19 +- .../core/service/types/task/config_payload.go | 1 + .../core/service/types/task/docker_build.go | 2 + .../core/service/types/task/model.go | 42 +- pkg/setting/consts.go | 36 + pkg/tool/errors/http_errors.go | 1 + pkg/tool/s3/client.go | 4 +- 85 files changed, 4190 insertions(+), 675 deletions(-) create mode 100644 pkg/microservice/aslan/core/common/repository/models/yaml_template.go create mode 100644 pkg/microservice/aslan/core/common/repository/mongodb/yaml_template.go create mode 100644 pkg/microservice/aslan/core/service/handler/yaml_template.go create mode 100644 pkg/microservice/aslan/core/service/service/yaml_template.go create mode 100644 pkg/microservice/aslan/core/templatestore/handler/dockerfile.go create mode 100644 pkg/microservice/aslan/core/templatestore/handler/yaml.go create mode 100644 pkg/microservice/aslan/core/templatestore/repository/models/dockerfile.go create mode 100644 pkg/microservice/aslan/core/templatestore/repository/mongodb/dockerfile.go create mode 100644 pkg/microservice/aslan/core/templatestore/service/dockerfile.go create mode 100644 pkg/microservice/aslan/core/templatestore/service/yaml.go create mode 100644 pkg/microservice/reaper/core/service/client/client.go create mode 100644 pkg/microservice/reaper/core/service/client/dockerfile.go create mode 100644 pkg/microservice/warpdrive/core/service/taskplugin/artifact_deploy.go diff --git a/README-zh-CN.md b/README-zh-CN.md index ecfe7fd76..beba21f0e 100644 --- a/README-zh-CN.md +++ b/README-zh-CN.md @@ -44,25 +44,30 @@ Zadig 是一款面向开发者设计的云原生持续交付(Continuous Delivery 产品特性介绍: -- **高并发的工作流** +
+ 高并发的工作流 + 基于云原生设计,经过简单配置,系统自动生成工作流,实现多服务高并发执行构建部署测试任务,以解决微服务架构下带来的多服务构建部署效率低下问题。 +
-基于云原生设计,经过简单配置,系统自动生成工作流,实现多服务高并发执行构建部署测试任务,以解决微服务架构下带来的多服务构建部署效率低下问题。 +
+ 以服务为核心的集成环境 + 一套服务配置,分钟级创建多套数据隔离的测试环境。为开发者进行日常调试、为测试人员做集成测试、为产品经理对外 Demo 提供强力支撑。 -- **以服务为核心的集成环境** + 对于现有的环境无需担心迁移成本,一键托管,轻松浏览、调试环境中的所有服务。 +
-一套服务配置,分钟级创建多套数据隔离的测试环境。为开发者进行日常调试、为测试人员做集成测试、为产品经理对外 Demo 提供强力支撑。 +
+ 无侵入的自动化测试 + 便捷且无侵入的对接已有自动化测试框架,通过 GitHub/GitLab Webhook 自动构建、部署及测试。 -对于现有的环境无需担心迁移成本,一键托管,轻松浏览、调试环境中的所有服务。 + 通过办公通讯机器人为开发者提供第一时间质量反馈,精准高效。有效落地“测试左移”工程实践,让测试价值得到体现。 +
-- **无侵入的自动化测试** +
+ 开发本地联调 CLI/IDE Plugin 插件 + 开发本地编辑完代码,一键进行本地代码构建,部署到联调环境,无需再陷入复杂且繁琐的工作流程。解放工程师双手,去创造更多产品价值。 +
-便捷且无侵入的对接已有自动化测试框架,通过 GitHub/GitLab Webhook 自动构建、部署及测试。 - -通过办公通讯机器人为开发者提供第一时间质量反馈,精准高效。有效落地“测试左移”工程实践,让测试价值得到体现。 - -- **开发本地联调 CLI** - -开发本地编辑完代码,一键进行本地代码构建,部署到联调环境,无需再陷入复杂且繁琐的工作流程,让本地联调不再成为难事。解放工程师双手,去创造更多产品价值。 ## 快速上手 @@ -70,6 +75,10 @@ Zadig 是一款面向开发者设计的云原生持续交付(Continuous Delivery 请参阅 [快速入门](https://docs.koderover.com/zadig/quick-start/try-out-install) +### 训练营 + +Zadig [训练营](https://github.com/koderover/zadig-bootcamp)主要是为开发者提供实践小技巧、最佳实践案例的搭建、典型应用场景的演示等,以便快速获得持续交付最佳解决方案。可以直接进入 [教程](https://www.koderover.com/tutorials) 一步步实践和尝试。 + ### 快速开发 请阅读完整的 [Zadig 贡献指南](CONTRIBUTING-zh-CN.md),该包含参与贡献的方式、流程、格式、如何部署、哪里可以获取帮助等。 diff --git a/README.md b/README.md index 92c3a999b..374fa483a 100644 --- a/README.md +++ b/README.md @@ -47,25 +47,30 @@ The architecture is as follows: The Highlighted Features: -- **High Concurrency** +
+ High Concurrency + Based on cloud-native design, through simple configuration, the system automatically generates workflows to achieve high concurrent execution for continuous delivery relevant tasks such as building, testing and deployment, across multiple services. It significantly improves the efficiency of multi-services deployment in microservice architecture. +
-Based on cloud-native design, through simple configuration, the system automatically generates workflows to achieve high concurrent execution for continuous delivery relevant tasks such as building, testing and deployment, across multiple services. It significantly improves the efficiency of multi-services deployment in microservice architecture. +
+ Service-oriented Environment + With just one set of service configuration, multiple encapsulated environments will be provided automatically within minutes, empowering independent environments for developers, QAs and product managers. -- **Service-oriented Environment** + Minimum to none migration cost of existing environments -- just hosting with one click, the system allows browsing and adjusting all the services at your fingertips. +
-With just one set of service configuration, multiple encapsulated environments will be provided automatically within minutes, empowering independent environments for developers, QAs and product managers. +
+ Non-intrusive Testing Automation + Zadig can easily and non-intrusively embed existing testing automation frameworks, and achieve continuous building, testing and deployment via GitHub/GitLab Webhook. -Minimum to none migration cost of existing environments -- just hosting with one click, the system allows browsing and adjusting all the services at your fingertips. + It also integrates with productivity bots to provide instant quality report, which effectively applies shift-left testing best practices. +
-- **Non-intrusive Testing Automation** +
+ Convenient Development CLI/IDE Plugin + Zadig also provides a convenient toolkit with development commandline interface which allows compiling, building and deploying the changes to dev environment with one command. It enables collaborated debugging and testing with minimum manual toil, reduces cognitive load and allows teams to focus more on business. +
-Zadig can easily and non-intrusively embed existing testing automation frameworks, and achieve continuous building, testing and deployment via GitHub/GitLab Webhook. - -It also integrates with productivity bots to provide instant quality report, which effectively applies shift-left testing best practices. - -- **Convenient Development CLI** - -Zadig also provides a convenient toolkit with development commandline interface which allows compiling, building and deploying the changes to dev environment with one command. It enables collaborated debugging and testing with minimum manual toil, reduces cognitive load and allows teams to focus more on business. ## Quick start @@ -73,6 +78,12 @@ Zadig also provides a convenient toolkit with development commandline interface Please follow [Quick Start](https://docs.koderover.com/zadig/quick-start/try-out-install) +### Bootcamps + +With many hands-on tips, case studies and demos of different application types, Zadig [bootcamp](https://github.com/koderover/zadig-bootcamp) gives developers easy to follow best practices in a cloud native CI/CD solution + +Just follow [Tutorials](https://www.koderover.com/tutorials) to try it step by step. + ### How to make contribution? Please check out [our contributing guideline](CONTRIBUTING.md). diff --git a/go.mod b/go.mod index c281428b1..61ad1a857 100644 --- a/go.mod +++ b/go.mod @@ -11,7 +11,6 @@ require ( github.com/blang/semver/v4 v4.0.0 github.com/bndr/gojenkins v1.1.0 github.com/bradleyfalzon/ghinstallation v1.1.1 - github.com/bshuster-repo/logrus-logstash-hook v1.0.0 // indirect github.com/bugsnag/bugsnag-go v2.1.0+incompatible // indirect github.com/bugsnag/panicwrap v1.3.1 // indirect github.com/cenkalti/backoff/v3 v3.0.0 @@ -19,7 +18,7 @@ require ( github.com/coreos/go-oidc/v3 v3.0.0 github.com/dexidp/dex v0.0.0-20210802203454-3fac2ab6bc3b github.com/docker/distribution v2.7.1+incompatible - github.com/docker/docker v17.12.0-ce-rc1.0.20200618181300-9dc6525e6118+incompatible + github.com/docker/docker v20.10.7+incompatible github.com/docker/go-connections v0.4.0 github.com/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7 // indirect github.com/dsnet/compress v0.0.1 // indirect @@ -33,20 +32,19 @@ require ( github.com/google/uuid v1.2.0 github.com/gorilla/mux v1.8.0 github.com/gorilla/websocket v1.4.2 - github.com/gotestyourself/gotestyourself v2.2.0+incompatible // indirect github.com/gregjones/httpcache v0.0.0-20181110185634-c63ab54fda8f github.com/hashicorp/go-multierror v1.1.1 github.com/huaweicloud/huaweicloud-sdk-go-v3 v0.0.50 github.com/jasonlvhit/gocron v0.0.0-20171226191223-3c914c8681c3 github.com/jinzhu/now v1.1.2 github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 // indirect - github.com/mittwald/go-helm-client v0.8.0 + github.com/mittwald/go-helm-client v0.8.2 + github.com/moby/buildkit v0.9.1 github.com/nsqio/go-nsq v1.0.7 github.com/nwaples/rardecode v1.0.0 // indirect github.com/onsi/ginkgo v1.16.4 github.com/onsi/gomega v1.15.0 github.com/opencontainers/go-digest v1.0.0 - github.com/opencontainers/selinux v1.6.0 // indirect github.com/otiai10/copy v1.6.0 github.com/pkg/errors v0.9.1 github.com/rfyiamcool/cronlib v1.0.0 @@ -61,14 +59,13 @@ require ( github.com/swaggo/gin-swagger v1.3.0 github.com/swaggo/swag v1.5.1 github.com/xanzy/go-gitlab v0.50.0 - github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 // indirect github.com/yvasiyarov/go-metrics v0.0.0-20150112132944-c25f46c4b940 // indirect github.com/yvasiyarov/gorelic v0.0.7 // indirect github.com/yvasiyarov/newrelic_platform_go v0.0.0-20160601141957-9c099fbc30e9 // indirect go.mongodb.org/mongo-driver v1.5.0 go.uber.org/zap v1.19.0 - golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2 - golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420 + golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a + golang.org/x/net v0.0.0-20210520170846-37e1c6afe023 golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914 golang.org/x/sync v0.0.0-20210220032951-036812b2e83c gopkg.in/mholt/archiver.v3 v3.1.1 @@ -76,11 +73,11 @@ require ( gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b gorm.io/driver/mysql v1.1.2 gorm.io/gorm v1.21.16 - helm.sh/helm/v3 v3.6.2 + helm.sh/helm/v3 v3.7.1 k8s.io/api v0.22.1 k8s.io/apimachinery v0.22.1 k8s.io/client-go v0.22.1 - k8s.io/kubectl v0.21.0 + k8s.io/kubectl v0.22.1 k8s.io/utils v0.0.0-20210802155522-efc7438f0176 sigs.k8s.io/controller-runtime v0.10.0 sigs.k8s.io/yaml v1.2.0 diff --git a/go.sum b/go.sum index b34685d13..e9ff3cff2 100644 --- a/go.sum +++ b/go.sum @@ -1,9 +1,15 @@ bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= +bazil.org/fuse v0.0.0-20180421153158-65cc252bf669/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= +cloud.google.com/go v0.25.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.31.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.37.2/go.mod h1:H8IAquKe2L30IxoupDgqTaQvKSwF/c8prYHynGIWQbA= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.39.0/go.mod h1:rVLT6fkc8chs9sfPtFc1SBH6em7n+ZoXaG+87tDISts= cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= @@ -41,21 +47,67 @@ cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0Zeo cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +code.gitea.io/sdk/gitea v0.12.0/go.mod h1:z3uwDV/b9Ls47NGukYM9XhnHtqPh/J+t40lsUrR6JDY= +contrib.go.opencensus.io/exporter/aws v0.0.0-20181029163544-2befc13012d0/go.mod h1:uu1P0UCM/6RbsMrgPa98ll8ZcHM858i/AD06a9aLRCA= +contrib.go.opencensus.io/exporter/ocagent v0.5.0/go.mod h1:ImxhfLRpxoYiSq891pBrLVhN+qmP8BTVvdH2YLs7Gl0= +contrib.go.opencensus.io/exporter/stackdriver v0.12.1/go.mod h1:iwB6wGarfphGGe/e5CWqyUk/cLzKnWsOKPVW3no6OTw= +contrib.go.opencensus.io/integrations/ocsql v0.1.4/go.mod h1:8DsSdjz3F+APR+0z0WkU1aRorQCFfRxvqjUUPMbF3fE= +contrib.go.opencensus.io/resource v0.1.1/go.mod h1:F361eGI91LCmW1I/Saf+rX0+OFcigGlFvXwEGEnkRLA= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= entgo.io/ent v0.8.0/go.mod h1:KNjsukat/NJi6zJh1utwRadsbGOZsBbAZNDxkW7tMCc= +git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= +git.apache.org/thrift.git v0.12.0/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= github.com/27149chen/afero v1.6.2 h1:WRPUOreB90qGRQs8fxXcvi0srBPHy2octiJme7C7XCA= github.com/27149chen/afero v1.6.2/go.mod h1:68wFWsZwQPvguVWn5di+KCOLI0KQtSRve2mPFVg6VWY= +github.com/AkihiroSuda/containerd-fuse-overlayfs v1.0.0/go.mod h1:0mMDvQFeLbbn1Wy8P2j3hwFhqBq+FKn8OZPno8WLmp8= github.com/AppsFlyer/go-sundheit v0.4.0/go.mod h1:iZ8zWMS7idcvmqewf5mEymWWgoOiG/0WD4+aeh+heX4= +github.com/Azure/azure-amqp-common-go/v2 v2.1.0/go.mod h1:R8rea+gJRuJR6QxTir/XuEd+YuKoUiazDC/N96FiDEU= +github.com/Azure/azure-pipeline-go v0.2.1/go.mod h1:UGSo8XybXnIGZ3epmeBw7Jdz+HiUVpqIlpz/HKHylF4= +github.com/Azure/azure-pipeline-go v0.2.2/go.mod h1:4rQ/NZncSvGqNkkOsNpOU1tgoNuIlp9AfUH5G1tvCHc= +github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v19.1.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v29.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v30.1.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v35.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v38.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v42.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-service-bus-go v0.9.1/go.mod h1:yzBx6/BUGfjfeqbRZny9AQIbIe3AcV9WZbAdpkoXOa0= +github.com/Azure/azure-storage-blob-go v0.8.0/go.mod h1:lPI3aLPpuLTeUwh1sViKXFxwl2B6teiRqI0deQUvsw0= github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= github.com/Azure/go-ansiterm v0.0.0-20210608223527-2377c96fe795/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= +github.com/Azure/go-autorest v10.8.1+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest v10.15.5+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest v12.0.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest v14.1.1+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= +github.com/Azure/go-autorest/autorest v0.9.3/go.mod h1:GsRuLYvwzLjjjRoWEIyMUaYq8GNUx2nRB378IPt/1p0= +github.com/Azure/go-autorest/autorest v0.10.2/go.mod h1:/FALq9T/kS7b5J5qsQ+RSTUdAmGFqi0vUdVNNx8q630= github.com/Azure/go-autorest/autorest v0.11.12/go.mod h1:eipySxLmqSyC5s5k1CLupqet0PSENBEDP93LQ9a8QYw= +github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= +github.com/Azure/go-autorest/autorest/adal v0.8.0/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc= +github.com/Azure/go-autorest/autorest/adal v0.8.1/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= +github.com/Azure/go-autorest/autorest/adal v0.8.2/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= +github.com/Azure/go-autorest/autorest/adal v0.8.3/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= +github.com/Azure/go-autorest/autorest/azure/auth v0.4.2/go.mod h1:90gmfKdlmKgfjUpnCEpOJzsUEjrWDSLwHIG73tSXddM= +github.com/Azure/go-autorest/autorest/azure/cli v0.3.1/go.mod h1:ZG5p860J94/0kI9mNJVoIoLgXcirM2gF5i2kWloofxw= +github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= +github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g= github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= +github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= +github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= +github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM= github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= +github.com/Azure/go-autorest/autorest/to v0.2.0/go.mod h1:GunWKJp1AEqgMaGLV+iocmRAJWqST1wQYhyyjXJ3SJc= +github.com/Azure/go-autorest/autorest/to v0.3.0/go.mod h1:MgwOyqaIuKdG4TL/2ywSsIWKAfJfgHDo8ObuUk3t5sA= +github.com/Azure/go-autorest/autorest/validation v0.1.0/go.mod h1:Ha3z/SqBeaalWQvokg3NZAlQTalVMtOIAs1aGK7G6u8= +github.com/Azure/go-autorest/autorest/validation v0.2.0/go.mod h1:3EEqHnBxQGHXRYq3HT1WyXAvT7LLY3tl70hw6tQIbjI= +github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= +github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= github.com/Azure/go-ntlmssp v0.0.0-20200615164410-66371956d46c h1:/IBSNwUN8+eKzUzbJPqhK839ygXJ82sde8x3ogr6R28= github.com/Azure/go-ntlmssp v0.0.0-20200615164410-66371956d46c/go.mod h1:chxPXzSsl7ZWRAuOIE23GDNzjWuZquvFlgA8xmpunjU= @@ -64,73 +116,121 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DATA-DOG/go-sqlmock v1.5.0 h1:Shsta01QNfFxHCfpW6YH2STWB0MudeXXEWMr20OEh60= github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= -github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= +github.com/Djarvur/go-err113 v0.0.0-20200410182137-af658d038157/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs= +github.com/Djarvur/go-err113 v0.1.0/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs= +github.com/GoogleCloudPlatform/cloudsql-proxy v0.0.0-20191009163259-e802c2cb94ae/go.mod h1:mjwGPas4yKduTyubHvD1Atl9r1rUq8DfVy+gkVvZ+oo= +github.com/GoogleCloudPlatform/k8s-cloud-provider v0.0.0-20190822182118-27a4ced34534/go.mod h1:iroGtC8B3tQiqtds1l+mgk/BBOrxbqjH+eUfFQYRc14= github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd h1:sjQovDkwrZp8u+gxLtPgKGjk5hCxuy2hrRejBTA9xFU= github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd/go.mod h1:64YHyfSL2R96J44Nlwm39UHepQbyR5q10x7iYa1ks2E= +github.com/Masterminds/goutils v1.1.0/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= +github.com/Masterminds/semver/v3 v3.0.3/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= +github.com/Masterminds/semver/v3 v3.1.0/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= github.com/Masterminds/semver/v3 v3.1.1 h1:hLg3sBzpNErnxhQtUy/mmLR2I9foDujNK030IGemrRc= github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= +github.com/Masterminds/sprig v2.22.0+incompatible h1:z4yfnGrZ7netVz+0EDJ0Wi+5VZCSYp4Z0m2dk6cEM60= +github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= github.com/Masterminds/sprig/v3 v3.2.2 h1:17jRggJu518dr3QaafizSXOjKYp94wKfABxUmyxvxX8= github.com/Masterminds/sprig/v3 v3.2.2/go.mod h1:UoaO7Yp8KlPnJIYWTFkMaqPUYKTfGFPhxNuwnnxkKlk= github.com/Masterminds/squirrel v1.5.0 h1:JukIZisrUXadA9pl3rMkjhiamxiB0cXiu+HGp/Y8cY8= github.com/Masterminds/squirrel v1.5.0/go.mod h1:NNaOrjSoIDfDA40n7sr2tPNZRfjzjA400rg+riTZj10= github.com/Masterminds/vcs v1.13.1/go.mod h1:N09YCmOQr6RLxC6UNHzuVwAdodYbbnycGHSmwVJjcKA= +github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= +github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= +github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= +github.com/Microsoft/go-winio v0.4.15-0.20200908182639-5b44b70ab3ab/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= +github.com/Microsoft/go-winio v0.4.15/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= github.com/Microsoft/go-winio v0.4.16-0.20201130162521-d1ffc52c7331/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= -github.com/Microsoft/go-winio v0.4.16 h1:FtSW/jqD+l4ba5iPBj9CODVtgfYAD8w2wS923g/cFDk= github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= -github.com/Microsoft/hcsshim v0.8.14 h1:lbPVK25c1cu5xTLITwpUcxoA9vKrKErASPYygvouJns= +github.com/Microsoft/go-winio v0.4.17-0.20210211115548-6eac466e5fa3/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.4.17-0.20210324224401-5516f17a5958/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.4.17 h1:iT12IBVClFevaf8PuVyi3UmZOVh4OqnaLxDTW2O6j3w= +github.com/Microsoft/go-winio v0.4.17/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/hcsshim v0.8.6/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= +github.com/Microsoft/hcsshim v0.8.7-0.20190325164909-8abdbb8205e4/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= +github.com/Microsoft/hcsshim v0.8.7/go.mod h1:OHd7sQqRFrYd3RmSgbgji+ctCwkbq2wbEYNSzOYtcBQ= +github.com/Microsoft/hcsshim v0.8.9/go.mod h1:5692vkUqntj1idxauYlpoINNKeqCiG6Sg38RRsjT5y8= +github.com/Microsoft/hcsshim v0.8.10/go.mod h1:g5uw8EV2mAlzqe94tfNBNdr89fnbD/n3HV0OhsddkmM= github.com/Microsoft/hcsshim v0.8.14/go.mod h1:NtVKoYxQuTLx6gEq0L96c9Ju4JbRJ4nY2ow3VK6a9Lg= +github.com/Microsoft/hcsshim v0.8.15/go.mod h1:x38A4YbHbdxJtc0sF6oIz+RG0npwSCAvn69iY6URG00= +github.com/Microsoft/hcsshim v0.8.16/go.mod h1:o5/SZqmR7x9JNKsW3pu+nqHm0MF8vbA+VxGOoXdC600= +github.com/Microsoft/hcsshim v0.8.18/go.mod h1:+w2gRZ5ReXQhFOrvSQeNfhrYB/dg3oDwTOcER2fw4I4= +github.com/Microsoft/hcsshim v0.8.21 h1:btRfUDThBE5IKcvI8O8jOiIkujUsAMBSRsYDYmEi6oM= +github.com/Microsoft/hcsshim v0.8.21/go.mod h1:+w2gRZ5ReXQhFOrvSQeNfhrYB/dg3oDwTOcER2fw4I4= +github.com/Microsoft/hcsshim/test v0.0.0-20200826032352-301c83a30e7c/go.mod h1:30A5igQ91GEmhYJF8TaRP79pMBOYynRsyOByfVV0dU4= +github.com/Microsoft/hcsshim/test v0.0.0-20201218223536-d3e5debf77da/go.mod h1:5hlzMzRKMLyo42nCZ9oml8AdTlq/0cvIaBv6tK1RehU= +github.com/Microsoft/hcsshim/test v0.0.0-20210227013316-43a75bb4edd3/go.mod h1:mw7qgWloBUl75W/gVH3cQszUg1+gUITj7D6NY7ywVnY= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 h1:TngWCqHvy9oXAN6lEVMRuU21PR1EtLVZJmdB18Gu3Rw= github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/OpenPeeDeeP/depguard v1.0.1/go.mod h1:xsIw86fROiiwelg+jB2uM9PiKihMMmUx/1V+TNhjQvM= +github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/RyanCarrier/dijkstra v1.1.0 h1:/NDihjfJA3CxFaZz8EdzTwdFKFZDvvB881OVLdakRcI= github.com/RyanCarrier/dijkstra v1.1.0/go.mod h1:5agGUBNEtUAGIANmbw09fuO3a2htPEkc1jNH01qxCWA= github.com/RyanCarrier/dijkstra-1 v0.0.0-20170512020943-0e5801a26345 h1:fgSpoKViTSqRb4hjDNj10ig5wUvO0CayCzFdLf6fuRM= github.com/RyanCarrier/dijkstra-1 v0.0.0-20170512020943-0e5801a26345/go.mod h1:OK4EvWJ441LQqGzed5NGB6vKBAE34n3z7iayPcEwr30= +github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d h1:UrqY+r/OJnIp5u0s1SbQ8dVfLCZJsnvazdBP5hS4iRs= +github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= -github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= -github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= +github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= +github.com/agext/levenshtein v1.2.3 h1:YB2fHEn0UJagG8T1rrWknE3ZQzWM06O8AMAatNn7lmo= +github.com/agext/levenshtein v1.2.3/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558= github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM= github.com/albertorestifo/dijkstra v0.0.0-20160910063646-aba76f725f72 h1:uGeGZl8PxSq8VZGG4QK5njJTFA4/G/x5CYORvQVXtAE= github.com/albertorestifo/dijkstra v0.0.0-20160910063646-aba76f725f72/go.mod h1:o+JdB7VetTHjLhU0N57x18B9voDBQe0paApdEAEoEfw= +github.com/alecthomas/kingpin v2.2.6+incompatible/go.mod h1:59OFYbFVLKQKq+mqrL6Rw5bR0c3ACQaawgXx0QYndlE= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 h1:JYp7IbQjafoB+tBA3gMyHYHrpOtNuDiK/uB5uXxq5wM= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae/go.mod h1:CgnQgUtFrFz9mxFNtED3jI5tLDjKlOM+oUF/sTk6ps0= github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= github.com/andygrunwald/go-gerrit v0.0.0-20171029143327-95b11af228a1 h1:2Qp3BQZ7r1z+oMUnFhD6FQ86Hh1PO+59yoUNNJ5Dn0M= github.com/andygrunwald/go-gerrit v0.0.0-20171029143327-95b11af228a1/go.mod h1:0iuRQp6WJ44ts+iihy5E/WlPqfg5RNeQxOmzRkxCdtk= +github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/apex/log v1.1.4/go.mod h1:AlpoD9aScyQfJDVHmLMEcx4oU6LqzkWp4Mg9GdAcEvQ= +github.com/apex/log v1.3.0/go.mod h1:jd8Vpsr46WAe3EZSQ/IUMs2qQD/GOycT5rPWCO1yGcs= +github.com/apex/logs v0.0.4/go.mod h1:XzxuLZ5myVHDy9SAmYpamKKRNApGj54PfYLcFrXqDwo= +github.com/aphistic/golf v0.0.0-20180712155816-02c07f170c5a/go.mod h1:3NqKYiepwy8kCu4PNA+aP7WUV72eXWJeP9/r3/K9aLE= +github.com/aphistic/sweet v0.2.0/go.mod h1:fWDlIh/isSE9n6EPsRmC0det+whmX6dJid3stzu0Xys= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535 h1:4daAzAu0S6Vi7/lbWECcX0j45yZReDZ56BQsrVBOEEY= github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg= -github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= -github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.15.27/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= +github.com/aws/aws-sdk-go v1.15.90/go.mod h1:es1KtYUFs7le0xQ3rOihkuoVD90z7D0fR2Qm4S00/gU= +github.com/aws/aws-sdk-go v1.16.26/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.19.18/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.19.45/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.20.6/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.25.11/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.27.1/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.31.6/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= +github.com/aws/aws-sdk-go v1.34.9/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= github.com/aws/aws-sdk-go v1.34.28 h1:sscPpn/Ns3i0F4HPEWAVcwdIRaZZCuL7llJ2/60yPIk= github.com/aws/aws-sdk-go v1.34.28/go.mod h1:H7NKnBqNVzoTJpGfLrQkkD+ytBA93eiDYi/+8rV9s48= -github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= +github.com/aybabtme/rgbterm v0.0.0-20170906152045-cc83f3b3ce59/go.mod h1:q/89r3U2H7sSsE2t6Kca0lfwTK8JdoNGS/yzM/4iH5I= github.com/beevik/etree v1.1.0/go.mod h1:r8Aw8JqVegEf0w2fDnATrX9VpkMcyFeM0FhwO62wh+A= github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= @@ -140,75 +240,192 @@ github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+Ce github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= +github.com/bits-and-blooms/bitset v1.2.0 h1:Kn4yilvwNtMACtf1eYDlG8H77R07mZSPbMjLyS07ChA= +github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= +github.com/blakesmith/ar v0.0.0-20190502131153-809d4375e1fb/go.mod h1:PkYb9DJNAwrSvRx5DYA+gUcOIgTGVMNkfSCbZM8cWpI= +github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= +github.com/blang/semver v3.5.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= +github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= github.com/bndr/gojenkins v1.1.0 h1:TWyJI6ST1qDAfH33DQb3G4mD8KkrBfyfSUoZBHQAvPI= github.com/bndr/gojenkins v1.1.0/go.mod h1:QeskxN9F/Csz0XV/01IC8y37CapKKWvOHa0UHLLX1fM= +github.com/bombsimon/wsl/v2 v2.0.0/go.mod h1:mf25kr/SqFEPhhcxW1+7pxzGlW+hIl/hYTKY95VwV8U= +github.com/bombsimon/wsl/v2 v2.2.0/go.mod h1:Azh8c3XGEJl9LyX0/sFC+CKMc7Ssgua0g+6abzXN4Pg= +github.com/bombsimon/wsl/v3 v3.0.0/go.mod h1:st10JtZYLE4D5sC7b8xV4zTKZwAQjCH/Hy2Pm1FNZIc= +github.com/bombsimon/wsl/v3 v3.1.0/go.mod h1:st10JtZYLE4D5sC7b8xV4zTKZwAQjCH/Hy2Pm1FNZIc= +github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g= github.com/bradleyfalzon/ghinstallation v1.1.1 h1:pmBXkxgM1WeF8QYvDLT5kuQiHMcmf+X015GI0KM/E3I= github.com/bradleyfalzon/ghinstallation v1.1.1/go.mod h1:vyCmHTciHx/uuyN82Zc3rXN3X2KTK8nUTCrTMwAhcug= github.com/bshuster-repo/logrus-logstash-hook v1.0.0 h1:e+C0SB5R1pu//O4MQ3f9cFuPGoOVeF2fE4Og9otCc70= github.com/bshuster-repo/logrus-logstash-hook v1.0.0/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= +github.com/buger/jsonparser v0.0.0-20180808090653-f4dd9f5a6b44/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= +github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= github.com/bugsnag/bugsnag-go v2.1.0+incompatible h1:SuqsBHDutts2rZh4swHEWTexxi0F/JZ/6j1rR9BFe7I= github.com/bugsnag/bugsnag-go v2.1.0+incompatible/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= +github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50= +github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= github.com/bugsnag/panicwrap v1.3.1 h1:pmuhHlhbUV4OOrGDvoiMjHSZzwRcL+I9cIzYKiW4lII= github.com/bugsnag/panicwrap v1.3.1/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= -github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= -github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= -github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= +github.com/caarlos0/ctrlc v1.0.0/go.mod h1:CdXpj4rmq0q/1Eb44M9zi2nKB0QraNKuRGYGrrHhcQw= +github.com/campoy/unique v0.0.0-20180121183637-88950e537e7e/go.mod h1:9IOqJGCPMSc6E5ydlp5NIonxObaeu/Iub/X03EKPVYo= +github.com/cavaliercoder/go-cpio v0.0.0-20180626203310-925f9528c45e/go.mod h1:oDpT4efm8tSYHXV5tHSdRvBet/b/QzxZ+XyyPehvm3A= github.com/cenkalti/backoff/v3 v3.0.0 h1:ske+9nBpD9qZsTBoF41nW5L+AIuFBKMeze18XQ3eG1c= github.com/cenkalti/backoff/v3 v3.0.0/go.mod h1:cIeZDE3IrqwwJl6VUwCN6trj1oXrTS4rc0ij+ULvLYs= +github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= +github.com/census-instrumentation/opencensus-proto v0.2.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= +github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5/go.mod h1:/iP1qXHoty45bqomnu2LM+VVyAEdWN+vtSHGlQgyxbw= +github.com/checkpoint-restore/go-criu/v4 v4.1.0/go.mod h1:xUQBLp4RLc5zJtWY++yjOoMoB5lihDt7fai+75m+rGw= +github.com/checkpoint-restore/go-criu/v5 v5.0.0/go.mod h1:cfwC0EG7HMUenopBsUf9d89JlCLQIfgVcNsNN0t6T2M= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/cilium/ebpf v0.0.0-20200110133405-4032b1d8aae3/go.mod h1:MA5e5Lr8slmEg9bt0VpxxWqJlO4iwu3FBdHUzV7wQVg= -github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= +github.com/cilium/ebpf v0.0.0-20200702112145-1c8d4c9ef775/go.mod h1:7cR51M8ViRLIdUjrmSXlK9pkrsDlLHbO8jiB8X8JnOc= +github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= +github.com/cilium/ebpf v0.4.0/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= +github.com/cilium/ebpf v0.6.2/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= -github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= -github.com/containerd/cgroups v0.0.0-20200531161412-0dbf7f05ba59 h1:qWj4qVYZ95vLWwqyNJCQg7rDsG5wPdze0UaPolH7DUk= +github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo= +github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= +github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= +github.com/codahale/hdrhistogram v0.0.0-20160425231609-f8ad88b59a58/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= +github.com/containerd/aufs v0.0.0-20200908144142-dab0cbea06f4/go.mod h1:nukgQABAEopAHvB6j7cnP5zJ+/3aVcE7hCYqvIwAHyE= +github.com/containerd/aufs v0.0.0-20201003224125-76a6863f2989/go.mod h1:AkGGQs9NM2vtYHaUen+NljV0/baGCAPELGm2q9ZXpWU= +github.com/containerd/aufs v0.0.0-20210316121734-20793ff83c97/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= +github.com/containerd/aufs v1.0.0/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= +github.com/containerd/btrfs v0.0.0-20201111183144-404b9149801e/go.mod h1:jg2QkJcsabfHugurUvvPhS3E08Oxiuh5W/g1ybB4e0E= +github.com/containerd/btrfs v0.0.0-20210316141732-918d888fb676/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss= +github.com/containerd/btrfs v1.0.0/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss= +github.com/containerd/cgroups v0.0.0-20190717030353-c4b9ac5c7601/go.mod h1:X9rLEHIqSf/wfK8NsPqxJmeZgW4pcfzdXITDrUSJ6uI= +github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f/go.mod h1:OApqhQ4XNSNC13gXIwDjhOQxjWa/NxkwZXJ1EvqT0ko= github.com/containerd/cgroups v0.0.0-20200531161412-0dbf7f05ba59/go.mod h1:pA0z1pT8KYB3TCXK/ocprsh7MAkoW8bZVzPdih9snmM= +github.com/containerd/cgroups v0.0.0-20200710171044-318312a37340/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= +github.com/containerd/cgroups v0.0.0-20200824123100-0b889c03f102/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= +github.com/containerd/cgroups v0.0.0-20210114181951-8a68de567b68/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE= +github.com/containerd/cgroups v1.0.1 h1:iJnMvco9XGvKUvNQkv88bE4uJXxRQH18efbKo9w5vHQ= +github.com/containerd/cgroups v1.0.1/go.mod h1:0SJrPIenamHDcZhEcJMNBB85rHcUsw4f25ZfBiPYRkU= github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= +github.com/containerd/console v0.0.0-20181022165439-0650fd9eeb50/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= +github.com/containerd/console v0.0.0-20191206165004-02ecf6a7291e/go.mod h1:8Pf4gM6VEbTNRIT26AyyU7hxdQU3MvAvxVI0sc00XBE= +github.com/containerd/console v1.0.0/go.mod h1:8Pf4gM6VEbTNRIT26AyyU7hxdQU3MvAvxVI0sc00XBE= +github.com/containerd/console v1.0.1/go.mod h1:XUsP6YE/mKtz6bxc+I8UiKKTP04qjQL4qcS3XoQ5xkw= +github.com/containerd/console v1.0.2/go.mod h1:ytZPjGgY2oeTkAONYafi2kSj0aYggsf8acV1PGKCbzQ= +github.com/containerd/containerd v1.2.10/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.0-beta.2.0.20190828155532-0293cbd26c69/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.1-0.20191213020239-082f7e3aed57/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= github.com/containerd/containerd v1.3.2/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.4.4 h1:rtRG4N6Ct7GNssATwgpvMGfnjnwfjnu/Zs9W3Ikzq+M= -github.com/containerd/containerd v1.4.4/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.0-beta.2.0.20200729163537-40b22ef07410/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.1-0.20201117152358-0edc412565dc/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.1/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.3/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.5.0-beta.1/go.mod h1:5HfvG1V2FsKesEGQ17k5/T7V960Tmcumvqn8Mc+pCYQ= +github.com/containerd/containerd v1.5.0-beta.3/go.mod h1:/wr9AVtEM7x9c+n0+stptlo/uBBoBORwEx6ardVcmKU= +github.com/containerd/containerd v1.5.0-beta.4/go.mod h1:GmdgZd2zA2GYIBZ0w09ZvgqEq8EfBp/m3lcVZIvPHhI= +github.com/containerd/containerd v1.5.0-rc.0/go.mod h1:V/IXoMqNGgBlabz3tHD2TWDoTJseu1FGOKuoA4nNb2s= +github.com/containerd/containerd v1.5.1/go.mod h1:0DOxVqwDy2iZvrZp2JUx/E+hS0UNTVn7dJnIOwtYR4g= +github.com/containerd/containerd v1.5.2/go.mod h1:0DOxVqwDy2iZvrZp2JUx/E+hS0UNTVn7dJnIOwtYR4g= +github.com/containerd/containerd v1.5.3/go.mod h1:sx18RgvW6ABJ4iYUw7Q5x7bgFOAB9B6G7+yO0XBc4zw= +github.com/containerd/containerd v1.5.4/go.mod h1:sx18RgvW6ABJ4iYUw7Q5x7bgFOAB9B6G7+yO0XBc4zw= +github.com/containerd/containerd v1.5.7 h1:rQyoYtj4KddB3bxG6SAqd4+08gePNyJjRqvOIfV3rkM= +github.com/containerd/containerd v1.5.7/go.mod h1:gyvv6+ugqY25TiXxcZC3L5yOeYgEw0QMhscqVp1AR9c= github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= -github.com/containerd/continuity v0.0.0-20201208142359-180525291bb7 h1:6ejg6Lkk8dskcM7wQ28gONkukbQkM4qpj4RnYbpFzrI= +github.com/containerd/continuity v0.0.0-20190815185530-f2a389ac0a02/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= +github.com/containerd/continuity v0.0.0-20191127005431-f65d91d395eb/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= +github.com/containerd/continuity v0.0.0-20200710164510-efbc4488d8fe/go.mod h1:cECdGN1O8G9bgKTlLhuPJimka6Xb/Gg7vYzCTNVxhvo= github.com/containerd/continuity v0.0.0-20201208142359-180525291bb7/go.mod h1:kR3BEg7bDFaEddKm54WSmrol1fKWDU1nKYkgrcgZT7Y= +github.com/containerd/continuity v0.0.0-20210208174643-50096c924a4e/go.mod h1:EXlVlkqNba9rJe3j7w3Xa924itAMLgZH4UD/Q4PExuQ= +github.com/containerd/continuity v0.1.0 h1:UFRRY5JemiAhPZrr/uE0n8fMTLcZsUvySPr1+D7pgr8= +github.com/containerd/continuity v0.1.0/go.mod h1:ICJu0PwR54nI0yPEnJ6jcS+J7CZAUXrLh8lPo2knzsM= +github.com/containerd/fifo v0.0.0-20180307165137-3d5202aec260/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= +github.com/containerd/fifo v0.0.0-20200410184934-f15a3290365b/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= +github.com/containerd/fifo v0.0.0-20201026212402-0724c46b320c/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= +github.com/containerd/fifo v0.0.0-20210316144830-115abcc95a1d/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= +github.com/containerd/fifo v1.0.0/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= +github.com/containerd/fuse-overlayfs-snapshotter v1.0.2/go.mod h1:nRZceC8a7dRm3Ao6cJAwuJWPFiBPaibHiFntRUnzhwU= +github.com/containerd/go-cni v1.0.1/go.mod h1:+vUpYxKvAF72G9i1WoDOiPGRtQpqsNW/ZHtSlv++smU= +github.com/containerd/go-cni v1.0.2/go.mod h1:nrNABBHzu0ZwCug9Ije8hL2xBCYh/pjfMb1aZGrrohk= github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= +github.com/containerd/go-runc v0.0.0-20190911050354-e029b79d8cda/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= +github.com/containerd/go-runc v0.0.0-20200220073739-7016d3ce2328/go.mod h1:PpyHrqVs8FTi9vpyHwPwiNEGaACDxT/N/pLcvMSRA9g= +github.com/containerd/go-runc v0.0.0-20201020171139-16b287bc67d0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= +github.com/containerd/go-runc v1.0.0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= +github.com/containerd/imgcrypt v1.0.1/go.mod h1:mdd8cEPW7TPgNG4FpuP3sGBiQ7Yi/zak9TYCG3juvb0= +github.com/containerd/imgcrypt v1.0.4-0.20210301171431-0ae5c75f59ba/go.mod h1:6TNsg0ctmizkrOgXRNQjAPFWpMYRWuiB6dSF4Pfa5SA= +github.com/containerd/imgcrypt v1.1.1-0.20210312161619-7ed62a527887/go.mod h1:5AZJNI6sLHJljKuI9IHnw1pWqo/F0nGDOuR9zgTs7ow= +github.com/containerd/imgcrypt v1.1.1/go.mod h1:xpLnwiQmEUJPvQoAapeb2SNCxz7Xr6PJrXQb0Dpc4ms= +github.com/containerd/nri v0.0.0-20201007170849-eb1350a75164/go.mod h1:+2wGSDGFYfE5+So4M5syatU0N0f0LbWpuqyMi4/BE8c= +github.com/containerd/nri v0.0.0-20210316161719-dbaa18c31c14/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= +github.com/containerd/nri v0.1.0/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= +github.com/containerd/stargz-snapshotter v0.0.0-20201027054423-3a04e4c2c116/go.mod h1:o59b3PCKVAf9jjiKtCc/9hLAd+5p/rfhBfm6aBcTEr4= +github.com/containerd/stargz-snapshotter v0.6.4/go.mod h1:1t0SF1gAHJhCSftWKDLVitvfF3c2qhL5hymG7C50wto= +github.com/containerd/stargz-snapshotter/estargz v0.6.4/go.mod h1:83VWDqHnurTKliEB0YvWMiCfLDwv4Cjj1X9Vk98GJZw= github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= +github.com/containerd/ttrpc v0.0.0-20190828172938-92c8520ef9f8/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= +github.com/containerd/ttrpc v0.0.0-20191028202541-4f1b8fe65a5c/go.mod h1:LPm1u0xBw8r8NOKoOdNMeVHSawSsltak+Ihv+etqsE8= +github.com/containerd/ttrpc v1.0.1/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= +github.com/containerd/ttrpc v1.0.2/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc= +github.com/containerd/typeurl v0.0.0-20190911142611-5eb25027c9fd/go.mod h1:GeKYzf2pQcqv7tJ0AoCuuhtnqhva5LNU3U+OyKxxJpk= +github.com/containerd/typeurl v1.0.1/go.mod h1:TB1hUtrpaiO88KEK56ijojHS1+NeF0izUACaJW2mdXg= +github.com/containerd/typeurl v1.0.2 h1:Chlt8zIieDbzQFzXzAeBEF92KhExuE4p9p92/QmY7aY= +github.com/containerd/typeurl v1.0.2/go.mod h1:9trJWW2sRlGub4wZJRTW83VtbOLS6hwcDZXTn6oPz9s= +github.com/containerd/zfs v0.0.0-20200918131355-0a33824f23a2/go.mod h1:8IgZOBdv8fAgXddBT4dBXJPtxyRsejFIpXoklgxgEjw= +github.com/containerd/zfs v0.0.0-20210301145711-11e8f1707f62/go.mod h1:A9zfAbMlQwE+/is6hi0Xw8ktpL+6glmqZYtevJgaB8Y= +github.com/containerd/zfs v0.0.0-20210315114300-dde8f0fda960/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= +github.com/containerd/zfs v0.0.0-20210324211415-d5c4544f0433/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= +github.com/containerd/zfs v1.0.0/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= +github.com/containernetworking/cni v0.7.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= +github.com/containernetworking/cni v0.8.0/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= +github.com/containernetworking/cni v0.8.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= +github.com/containernetworking/plugins v0.8.6/go.mod h1:qnw5mN19D8fIwkqW7oHHYDHVlzhJpcY6TQxn/fUyDDM= +github.com/containernetworking/plugins v0.9.1/go.mod h1:xP/idU2ldlzN6m4p5LmGiwRDjeJr6FLK6vuiUwoH7P8= +github.com/containers/ocicrypt v1.0.1/go.mod h1:MeJDzk1RJHv89LjsH0Sp5KTY3ZYkjXO/C+bKAeWFIrc= +github.com/containers/ocicrypt v1.1.0/go.mod h1:b8AOe0YR67uU8OqfVNcznfFpAzu3rdgUV4GP9qXPfu4= +github.com/containers/ocicrypt v1.1.1/go.mod h1:Dm55fwWm1YZAjYRaJ94z2mfZikIyIN4B0oB3dj3jFxY= github.com/coocood/freecache v1.1.0 h1:ENiHOsWdj1BrrlPwblhbn4GdAsMymK3pZORJ+bJGAjA= github.com/coocood/freecache v1.1.0/go.mod h1:ePwxCDzOYvARfHdr1pByNct1at3CoKnsipOHwKlNbzI= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= +github.com/coreos/go-iptables v0.4.5/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= +github.com/coreos/go-iptables v0.5.0/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= github.com/coreos/go-oidc v2.1.0+incompatible h1:sdJrfw8akMnCuUlaZU3tE/uYXFgfqom8DBE9so9EBsM= github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= github.com/coreos/go-oidc/v3 v3.0.0 h1:/mAA0XMgYJw2Uqm7WKGCsKnjitE/+A0FFbOmiRJm7LQ= github.com/coreos/go-oidc/v3 v3.0.0/go.mod h1:rEJ/idjfUyfkBit1eI1fvyr+64/g9dcKpAm8MJMesvo= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20161114122254-48702e0da86b/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= +github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/coreos/pkg v0.0.0-20180108230652-97fdf19511ea/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= @@ -219,21 +436,36 @@ github.com/creack/pty v1.1.11 h1:07n33Z8lZxZ2qwegKbObQohDhXDQxiMMz1NOUGYlesw= github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/cyphar/filepath-securejoin v0.2.2 h1:jCwT2GTP+PY5nBz3c/YL5PAIbusElVrPujOBSCj8xRg= github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4= +github.com/d2g/dhcp4 v0.0.0-20170904100407-a1d1b6c41b1c/go.mod h1:Ct2BUK8SB0YC1SMSibvLzxjeJLnrYEVLULFNiHY9YfQ= +github.com/d2g/dhcp4client v1.0.0/go.mod h1:j0hNfjhrt2SxUOw55nL0ATM/z4Yt3t2Kd1mW34z5W5s= +github.com/d2g/dhcp4server v0.0.0-20181031114812-7d4a0a7f59a5/go.mod h1:Eo87+Kg/IX2hfWJfwxMzLyuSZyxSoAug2nGa1G2QAi8= +github.com/d2g/hardwareaddr v0.0.0-20190221164911-e7d9fbe030e4/go.mod h1:bMl4RjIciD2oAxI7DmWRx6gbeqrkoLqv3MV0vzNad+I= +github.com/davecgh/go-spew v0.0.0-20151105211317-5215b55f46b2/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/daviddengcn/go-colortext v0.0.0-20160507010035-511bcaf42ccd/go.mod h1:dv4zxwHi5C/8AeI+4gX4dCWOIvNi7I6JCSX0HvlKPgE= -github.com/deislabs/oras v0.11.1 h1:oo2J/3vXdcti8cjFi8ghMOkx0OacONxHC8dhJ17NdJ0= -github.com/deislabs/oras v0.11.1/go.mod h1:39lCtf8Q6WDC7ul9cnyWXONNzKvabEKk+AX+L0ImnQk= -github.com/denisenkom/go-mssqldb v0.0.0-20191001013358-cfbb681360f0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= +github.com/denisenkom/go-mssqldb v0.9.0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= +github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= +github.com/devigned/tab v0.1.1/go.mod h1:XG9mPq0dFghrYvoBF3xdRrJzSTX1b7IQrvaL9mzjeJY= github.com/dexidp/dex v0.0.0-20210802203454-3fac2ab6bc3b h1:ovHbNjGAQsGEs67tYU6C6ex2D2shDkeZ7pPprx58f2k= github.com/dexidp/dex v0.0.0-20210802203454-3fac2ab6bc3b/go.mod h1:g64CEwk9b4oLTREOu8mFkjTkDUvyxzWGqhnPwQlfrq8= github.com/dexidp/dex/api/v2 v2.0.0/go.mod h1:k5arBJT1QYvpsEY3sEd0NXJp3hKWKuUUfzJ3BlcqPdM= +github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/docker/cli v20.10.5+incompatible h1:bjflayQbWg+xOkF2WPEAOi4Y7zWhR7ptoPhV/VqLVDE= -github.com/docker/cli v20.10.5+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8= +github.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/j0mACtrfE= +github.com/distribution/distribution/v3 v3.0.0-20210804104954-38ab4c606ee3 h1:rEK0juuU5idazw//KzUcL3yYwUU3DIe2OnfJwjDBqno= +github.com/distribution/distribution/v3 v3.0.0-20210804104954-38ab4c606ee3/go.mod h1:gt38b7cvVKazi5XkHvINNytZXgTEntyhtyM3HQz46Nk= +github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= +github.com/docker/cli v0.0.0-20190925022749-754388324470/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/cli v0.0.0-20191017083524-a8ff7f821017/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/cli v20.10.0-beta1.0.20201029214301-1d20b15adc38+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/cli v20.10.6+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/cli v20.10.7+incompatible h1:pv/3NqibQKphWZiAskMzdz8w0PRbtTaEB+f6NwdU7Is= +github.com/docker/cli v20.10.7+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/distribution v2.6.0-rc.1.0.20170726174610-edc3ab29cdff+incompatible h1:357nGVUC8gSpeSc2Axup8HfrfTLLUfWfCsCUhiQSKIg= github.com/docker/distribution v2.6.0-rc.1.0.20170726174610-edc3ab29cdff+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/docker v0.0.0-20180502112750-51a9119f6b81 h1:VnJAjP/7FbY46wddaiKakrc1ogXW+3MlP7cg+S4j4Og= @@ -242,9 +474,16 @@ github.com/docker/docker-credential-helpers v0.6.3 h1:zI2p9+1NQYdnG6sMU26EX4aVGl github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y= github.com/docker/go-connections v0.3.1-0.20180212134524-7beb39f0b969 h1:Z8LR4yJgA3vaXpBiUWcWdQZpB9h+dzj4NdLjP9Sfdb0= github.com/docker/go-connections v0.3.1-0.20180212134524-7beb39f0b969/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= +github.com/docker/go-events v0.0.0-20170721190031-9461782956ad/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= +github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c h1:+pKlWGMw7gf6bQ+oDZB4KHQFypsfjYlq/C4rfL7D3g8= +github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= +github.com/docker/go-metrics v0.0.1 h1:AgB/0SvBxihN0X8OR4SjsblXkbMvalQ8cjmtKQ2rQV8= +github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/docker/libnetwork v0.8.0-dev.2.0.20200917202933-d0951081b35f/go.mod h1:93m0aTqz6z+g32wla4l4WxTrdtvBRmVzYRkYvasA5Z8= +github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= github.com/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7 h1:UhxFibDNY/bfvqU5CAUmr9zpesgbU6SWc8/B4mflAE4= github.com/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= @@ -256,12 +495,10 @@ github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25Kn github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= -github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153 h1:yUdfgN0XgIJw7foRItutHYUIhlcKzcSf5vDpdhQAKTc= github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= @@ -271,6 +508,7 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.m github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ= +github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v4.5.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v4.11.0+incompatible h1:glyUF9yIYtMHzn8xaKw5rMhdWcwsYV8dZHIq5567/xs= @@ -278,21 +516,27 @@ github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQL github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d h1:105gxyaGwCFad8crR9dcMQWvV9Hvulu6hwUh4tWPJnM= github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d/go.mod h1:ZZMPRZwes7CROmyNKgQzC3XPs6L/G2EJLHddWejkmf4= github.com/fatih/camelcase v1.0.0/go.mod h1:yN2Sb0lFhZJUdVvtELVWefmrXpuZESvPmqwoZc+/fpc= -github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/color v1.9.0 h1:8xPHl4/q1VyqGIPif1F+1V3Y3lSmrq01EabUW3CoW5s= +github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/felixge/httpsnoop v1.0.2 h1:+nS9g82KMXccJ/wp0zyRW9ZBHFETmMGtkk+2CTTrW4o= github.com/felixge/httpsnoop v1.0.2/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= +github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= +github.com/fortytw2/leaktest v1.2.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= -github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= -github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= +github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA= github.com/fvbommel/sortorder v1.0.1/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0= github.com/garyburd/redigo v1.6.2 h1:yE/pwKCrbLpLpQICzYTeZ7JsTA/C53wFTJHaEtRqniM= github.com/garyburd/redigo v1.6.2/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= +github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= +github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gin-contrib/gzip v0.0.1 h1:ezvKOL6jH+jlzdHNE4h9h8q8uMpDQjyl0NN0Jd7jozc= github.com/gin-contrib/gzip v0.0.1/go.mod h1:fGBJBCdt6qCZuCAOwWuFhBB4OOq9EFqlo5dEaFhhu5w= @@ -304,22 +548,26 @@ github.com/gin-gonic/gin v1.3.0/go.mod h1:7cKuhb5qV2ggCFctp2fJQ+ErvciLZrIeoOSOm6 github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM= github.com/gin-gonic/gin v1.7.2 h1:Tg03T9yM2xa8j6I3Z3oqLaQRSmKvxPd6g/2HJ6zICFA= github.com/gin-gonic/gin v1.7.2/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY= +github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= github.com/go-asn1-ber/asn1-ber v1.5.1 h1:pDbRAunXzIUXfx4CB2QJFv5IuPiuoW+sWvr/Us009o8= github.com/go-asn1-ber/asn1-ber v1.5.1/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0= github.com/go-bindata/go-bindata v1.0.1-0.20190711162640-ee3c2418e368/go.mod h1:7xCgX1lzlrXPHkfvn3EhumqHkmSlzt8at9q7v0ax19c= +github.com/go-critic/go-critic v0.4.1/go.mod h1:7/14rZGnZbY6E38VEGk2kVhoq6itzc1E68facVDK23g= +github.com/go-critic/go-critic v0.4.3/go.mod h1:j4O3D4RoIwRqlZw5jJpx0BNfXWWbpcJoKu5cYSe4YmQ= github.com/go-errors/errors v1.0.1 h1:LUHzmkK3GUKUrL/1gfBUxAHzcev3apQlezX/+O7ma6w= github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= github.com/go-ldap/ldap/v3 v3.3.0 h1:lwx+SJpgOHd8tG6SumBQZXCmNX51zM8B1cfxJ5gv4tQ= github.com/go-ldap/ldap/v3 v3.3.0/go.mod h1:iYS1MdmrmceOJ1QOTnRXrIs7i3kloqtmGQjRvjKpyMg= +github.com/go-lintpack/lintpack v0.5.2/go.mod h1:NwZuYi2nUHho8XEIZ6SIxihrnPoqBTDqfpXvXAN0sXM= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= @@ -329,6 +577,7 @@ github.com/go-logr/logr v0.4.0 h1:K7/B1jt6fIBQVd4Owv2MqGQClcgf0R266+7C/QjRcLc= github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-logr/zapr v0.4.0 h1:uc1uML3hRYL9/ZZPdgHS/n8Nzo+eaYL/Efxkkamf7OM= github.com/go-logr/zapr v0.4.0/go.mod h1:tabnROwaDl0UNxkVeFRbY8bwB37GwRv0P8lg6aAiEnk= +github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI= github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= github.com/go-openapi/analysis v0.18.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= @@ -338,17 +587,21 @@ github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQH github.com/go-openapi/errors v0.18.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= github.com/go-openapi/inflect v0.19.0/go.mod h1:lHpZVlpIQqLyKwJ4N+YSc9hchQy/i12fJykb83CRBH4= +github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= github.com/go-openapi/jsonpointer v0.18.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= -github.com/go-openapi/jsonpointer v0.19.3 h1:gihV7YNZK1iK6Tgwwsxo2rJbD1GTbdm72325Bq8FI3w= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= +github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= github.com/go-openapi/jsonreference v0.18.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= github.com/go-openapi/jsonreference v0.19.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= -github.com/go-openapi/jsonreference v0.19.3 h1:5cxNfTy0UVC3X8JL5ymxzyoUZmo8iZb+jeTWn7tUa8o= github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= +github.com/go-openapi/jsonreference v0.19.5 h1:1WJP/wi4OjB4iV8KVbH73rQaoialJrqv8gitZLxGLtM= +github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= github.com/go-openapi/loads v0.17.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= github.com/go-openapi/loads v0.18.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= @@ -357,6 +610,7 @@ github.com/go-openapi/loads v0.19.4/go.mod h1:zZVHonKd8DXyxyw4yfnVjPzBjIQcLt0CCs github.com/go-openapi/runtime v0.0.0-20180920151709-4f900dc2ade9/go.mod h1:6v9a6LTXWQCdL8k1AO3cvqx5OtZY/Y9wKTgaoP6YRfA= github.com/go-openapi/runtime v0.19.0/go.mod h1:OwNfisksmmaZse4+gpV3Ne9AyMOlP1lt4sK4FXt0O64= github.com/go-openapi/runtime v0.19.4/go.mod h1:X277bwSUBxVlCYR3r7xgZZGKVvBd/29gLDlFGtJ8NL4= +github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= github.com/go-openapi/spec v0.18.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= github.com/go-openapi/spec v0.19.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= @@ -369,11 +623,13 @@ github.com/go-openapi/strfmt v0.18.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pL github.com/go-openapi/strfmt v0.19.0/go.mod h1:+uW+93UVvGGq2qGaZxdDeJqSAqBqBdl+ZPMF/cC8nDY= github.com/go-openapi/strfmt v0.19.3/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= github.com/go-openapi/strfmt v0.19.5/go.mod h1:eftuHTlB/dI8Uq8JJOyRlieZf+WkkxUuk0dgdHXr2Qk= +github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= github.com/go-openapi/swag v0.18.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tFY= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-openapi/swag v0.19.14 h1:gm3vOOXfiuw5i9p5N9xJvfjvuofpyvLA9Wr6QfK5Fng= +github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA= github.com/go-openapi/validate v0.19.8/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85nY1c2z52x1Gk4= @@ -396,13 +652,26 @@ github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LB github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/go-toolsmith/astcast v1.0.0/go.mod h1:mt2OdQTeAQcY4DQgPSArJjHCcOwlX+Wl/kwN+LbLGQ4= +github.com/go-toolsmith/astcopy v1.0.0/go.mod h1:vrgyG+5Bxrnz4MZWPF+pI4R8h3qKRjjyvV/DSez4WVQ= +github.com/go-toolsmith/astequal v0.0.0-20180903214952-dcb477bfacd6/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY= +github.com/go-toolsmith/astequal v1.0.0/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY= +github.com/go-toolsmith/astfmt v0.0.0-20180903215011-8f8ee99c3086/go.mod h1:mP93XdblcopXwlyN4X4uodxXQhldPGZbcEJIimQHrkg= +github.com/go-toolsmith/astfmt v1.0.0/go.mod h1:cnWmsOAuq4jJY6Ct5YWlVLmcmLMn1JUPuQIHCY7CJDw= +github.com/go-toolsmith/astinfo v0.0.0-20180906194353-9809ff7efb21/go.mod h1:dDStQCHtmZpYOmjRP/8gHHnCCch3Zz3oEgCdZVdtweU= +github.com/go-toolsmith/astp v0.0.0-20180903215135-0af7e3c24f30/go.mod h1:SV2ur98SGypH1UjcPpCatrV5hPazG6+IfNHbkDXBRrk= +github.com/go-toolsmith/astp v1.0.0/go.mod h1:RSyrtpVlfTFGDYRbrjyWP1pYu//tSFcvdYrA8meBmLI= +github.com/go-toolsmith/pkgload v0.0.0-20181119091011-e9e65178eee8/go.mod h1:WoMrjiy4zvdS+Bg6z9jZH82QXwkcgCBX6nOfnmdaHks= +github.com/go-toolsmith/pkgload v1.0.0/go.mod h1:5eFArkbO80v7Z0kdngIxsRXRMTaX4Ilcwuh3clNrQJc= +github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8= +github.com/go-toolsmith/typep v1.0.0/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= +github.com/go-toolsmith/typep v1.0.2/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= +github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM= github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0= github.com/gobuffalo/depgen v0.0.0-20190329151759-d478694a28d3/go.mod h1:3STtPUQYuzV0gBVOY3vy6CfMm/ljR4pABfrTeHNLHUY= github.com/gobuffalo/depgen v0.1.0/go.mod h1:+ifsuy7fhi15RWncXQQKjWS9JPkdah5sZvtHc2RXGlg= github.com/gobuffalo/envy v1.6.15/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= -github.com/gobuffalo/envy v1.7.1 h1:OQl5ys5MBea7OGCdvPbBJWRgnhC/fGona6QKfvFeau8= -github.com/gobuffalo/envy v1.7.1/go.mod h1:FurDp9+EDPE4aIUS3ZLyD+7/9fpx7YRt/ukY6jIHf0w= github.com/gobuffalo/flect v0.1.0/go.mod h1:d2ehjJqGOH/Kjqcoz+F7jHTBbmDb38yXA598Hb50EGs= github.com/gobuffalo/flect v0.1.1/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= github.com/gobuffalo/flect v0.1.3/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= @@ -416,31 +685,40 @@ github.com/gobuffalo/gogen v0.1.0/go.mod h1:8NTelM5qd8RZ15VjQTFkAW6qOMx5wBbW4dSC github.com/gobuffalo/gogen v0.1.1/go.mod h1:y8iBtmHmGc4qa3urIyo1shvOD8JftTtfcKi+71xfDNE= github.com/gobuffalo/here v0.6.0/go.mod h1:wAG085dHOYqUpf+Ap+WOdrPTp5IYcDAs/x7PLa8Y5fM= github.com/gobuffalo/logger v0.0.0-20190315122211-86e12af44bc2/go.mod h1:QdxcLw541hSGtBnhUc4gaNIXRjiDppFGaDqzbrBd3v8= -github.com/gobuffalo/logger v1.0.1 h1:ZEgyRGgAm4ZAhAO45YXMs5Fp+bzGLESFewzAVBMKuTg= -github.com/gobuffalo/logger v1.0.1/go.mod h1:2zbswyIUa45I+c+FLXuWl9zSWEiVuthsk8ze5s8JvPs= +github.com/gobuffalo/logger v1.0.3 h1:YaXOTHNPCvkqqA7w05A4v0k2tCdpr+sgFlgINbQ6gqc= +github.com/gobuffalo/logger v1.0.3/go.mod h1:SoeejUwldiS7ZsyCBphOGURmWdwUFXs0J7TCjEhjKxM= github.com/gobuffalo/mapi v1.0.1/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= github.com/gobuffalo/mapi v1.0.2/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= github.com/gobuffalo/packd v0.0.0-20190315124812-a385830c7fc0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= -github.com/gobuffalo/packd v0.3.0 h1:eMwymTkA1uXsqxS0Tpoop3Lc0u3kTfiMBE6nKtQU4g4= -github.com/gobuffalo/packd v0.3.0/go.mod h1:zC7QkmNkYVGKPw4tHpBQ+ml7W/3tIebgeo1b36chA3Q= +github.com/gobuffalo/packd v1.0.0 h1:6ERZvJHfe24rfFmA9OaoKBdC7+c9sydrytMg8SdFGBM= +github.com/gobuffalo/packd v1.0.0/go.mod h1:6VTc4htmJRFB7u1m/4LeMTWjFoYrUiBkU9Fdec9hrhI= github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ= github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0= -github.com/gobuffalo/packr/v2 v2.7.1 h1:n3CIW5T17T8v4GGK5sWXLVWJhCz7b5aNLSxW6gYim4o= -github.com/gobuffalo/packr/v2 v2.7.1/go.mod h1:qYEvAazPaVxy7Y7KR0W8qYEE+RymX74kETFqjFoFlOc= +github.com/gobuffalo/packr/v2 v2.8.1 h1:tkQpju6i3EtMXJ9uoF5GT6kB+LMTimDWD8Xvbz6zDVA= +github.com/gobuffalo/packr/v2 v2.8.1/go.mod h1:c/PLlOuTU+p3SybaJATW3H6lX/iK7xEz5OeMf+NnJpg= github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw= github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= +github.com/godbus/dbus v0.0.0-20151105175453-c7fdd8b5cd55/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= +github.com/godbus/dbus v0.0.0-20180201030542-885f9cc04c9c/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= +github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/godror/godror v0.13.3/go.mod h1:2ouUT4kdhUBk7TAkHWD4SN0CdI0pgEQbo8FVHhbSKWg= +github.com/godror/godror v0.24.2/go.mod h1:wZv/9vPiUib6tkoDl+AZ/QLf5YZgMravZ7jxH2eQWAE= +github.com/gofrs/flock v0.0.0-20190320160742-5135e617513b/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= +github.com/gofrs/flock v0.7.3/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= github.com/gofrs/flock v0.8.0/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPhW6m+TnJw= github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= +github.com/gogo/googleapis v1.2.0/go.mod h1:Njal3psf3qN6dwBtQfUmBZh2ybovJ0tlu3o/AC7HYjU= +github.com/gogo/googleapis v1.3.2/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= +github.com/gogo/googleapis v1.4.0/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= @@ -452,8 +730,10 @@ github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4er github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= @@ -463,6 +743,7 @@ github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -483,12 +764,37 @@ github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.3 h1:fHPg5GQYlCeLIPB9BZqMVR5nR9A+IM5zcgeTdjMYmLA= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.4-0.20210608040537-544b4180ac70 h1:yxuuMouxXYv9V1HprM9jTODJPGrTrC0FYVtPSnyIXxs= +github.com/golang/snappy v0.0.4-0.20210608040537-544b4180ac70/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2/go.mod h1:k9Qvh+8juN+UKMCS/3jFtGICgW8O96FVaZsaxdzDkR4= +github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a/go.mod h1:ryS0uhF+x9jgbj/N71xsEqODy9BN81/GonCZiOzirOk= +github.com/golangci/errcheck v0.0.0-20181223084120-ef45e06d44b6/go.mod h1:DbHgvLiFKX1Sh2T1w8Q/h4NAI8MHIpzCdnBUDTXU3I0= +github.com/golangci/go-misc v0.0.0-20180628070357-927a3d87b613/go.mod h1:SyvUF2NxV+sN8upjjeVYr5W7tyxaT1JVtvhKhOn2ii8= +github.com/golangci/goconst v0.0.0-20180610141641-041c5f2b40f3/go.mod h1:JXrF4TWy4tXYn62/9x8Wm/K/dm06p8tCKwFRDPZG/1o= +github.com/golangci/gocyclo v0.0.0-20180528134321-2becd97e67ee/go.mod h1:ozx7R9SIwqmqf5pRP90DhR2Oay2UIjGuKheCBCNwAYU= +github.com/golangci/gocyclo v0.0.0-20180528144436-0a533e8fa43d/go.mod h1:ozx7R9SIwqmqf5pRP90DhR2Oay2UIjGuKheCBCNwAYU= +github.com/golangci/gofmt v0.0.0-20190930125516-244bba706f1a/go.mod h1:9qCChq59u/eW8im404Q2WWTrnBUQKjpNYKMbU4M7EFU= +github.com/golangci/golangci-lint v1.23.7/go.mod h1:g/38bxfhp4rI7zeWSxcdIeHTQGS58TCak8FYcyCmavQ= +github.com/golangci/golangci-lint v1.27.0/go.mod h1:+eZALfxIuthdrHPtfM7w/R3POJLjHDfJJw8XZl9xOng= +github.com/golangci/ineffassign v0.0.0-20190609212857-42439a7714cc/go.mod h1:e5tpTHCfVze+7EpLEozzMB3eafxo2KT5veNg1k6byQU= +github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0/go.mod h1:66R6K6P6VWk9I95jvqGxkqJxVWGFy9XlDwLwVz1RCFg= +github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca/go.mod h1:tvlJhZqDe4LMs4ZHD0oMUlt9G2LWuDGoisJTBzLMV9o= +github.com/golangci/misspell v0.0.0-20180809174111-950f5d19e770/go.mod h1:dEbvlSfYbMQDtrpRMQU675gSDLDNa8sCPPChZ7PhiVA= +github.com/golangci/misspell v0.3.5/go.mod h1:dEbvlSfYbMQDtrpRMQU675gSDLDNa8sCPPChZ7PhiVA= +github.com/golangci/prealloc v0.0.0-20180630174525-215b22d4de21/go.mod h1:tf5+bzsHdTM0bsB7+8mt0GUMvjCgwLpTapNZHU8AajI= +github.com/golangci/revgrep v0.0.0-20180526074752-d9c87f5ffaf0/go.mod h1:qOQCunEYvmd/TLamH+7LlVccLvUH5kZNhbCgTHoBbp4= +github.com/golangci/revgrep v0.0.0-20180812185044-276a5c0a1039/go.mod h1:qOQCunEYvmd/TLamH+7LlVccLvUH5kZNhbCgTHoBbp4= +github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4/go.mod h1:Izgrg8RkN3rCIMLGE9CyYmU9pY2Jer6DgANEnZ/L/cQ= github.com/golangplus/testing v0.0.0-20180327235837-af21d9c3145e/go.mod h1:0AA//k/eakGydO4jKRoRL2j92ZKSzTgj9tclaCrvXHk= +github.com/gomodule/redigo v1.8.2 h1:H5XSIre1MB5NbPYFp+i1NBbb5qN1W8Y8YAQoAYbkm8k= +github.com/gomodule/redigo v1.8.2/go.mod h1:P9dn9mFrCBvWhGE1wpxx6fgq7BAeLBk+UUUzlpkBYO0= +github.com/google/btree v0.0.0-20180124185431-e89373fe6b4a/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4= +github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= +github.com/google/crfs v0.0.0-20191108021818-71d77da419c9/go.mod h1:etGhoOqfwPkooV6aqoX3eBGQOJblqdoc9XvWOeuxpPw= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -502,16 +808,26 @@ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-containerregistry v0.0.0-20191010200024-a3d713f9b7f8/go.mod h1:KyKXa9ciM8+lgMXwOVsXi7UxGrsf9mM61Mzs+xKUrKE= +github.com/google/go-containerregistry v0.1.2/go.mod h1:GPivBPgdAyd2SU+vf6EpsgOtWDuPqjW0hJZt4rNdTZ4= +github.com/google/go-github v17.0.0+incompatible h1:N0LgJ1j65A7kfXrZnUDaYCs/Sf4rEjNlfyDHW9dolSY= +github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= +github.com/google/go-github/v28 v28.1.1/go.mod h1:bsqJWQX05omyWVmc00nEUql9mhQyv38lDZ8kPZcQVoM= github.com/google/go-github/v29 v29.0.2 h1:opYN6Wc7DOz7Ku3Oh4l7prmkOMwEcQxpFtxdU8N8Pts= github.com/google/go-github/v29 v29.0.2/go.mod h1:CHKiKKPHJ0REzfwc14QMklvtHwCveD0PxlMjLlzAM5E= github.com/google/go-github/v35 v35.3.0 h1:fU+WBzuukn0VssbayTT+Zo3/ESKX9JYWjbZTLOTEyho= github.com/google/go-github/v35 v35.3.0/go.mod h1:yWB7uCcVWaUbUP74Aq3whuMySRMatyRmq5U9FTNlbio= github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= +github.com/google/go-replayers/grpcreplay v0.1.0/go.mod h1:8Ig2Idjpr6gifRd6pNVggX6TC1Zw6Jx74AKp7QNH2QE= +github.com/google/go-replayers/httpreplay v0.1.0/go.mod h1:YKZViNhiGgqdBlUbI2MwGpq4pXxNmhJLPHQ7cv2b5no= +github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= +github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian v2.1.1-0.20190517191504-25dcb96d9e51+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= @@ -529,20 +845,36 @@ github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210715191844-86eeefc3e471/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/rpmpack v0.0.0-20191226140753-aa36bfddb3a0/go.mod h1:RaTPr0KUf2K7fnZYLNDrr8rxAamWs3iNywJLtQ2AzBg= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= +github.com/google/subcommands v1.0.1/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.2.0 h1:qJYtXnJRWmpe7m/3XlyhrsLrEURqHRM2kxzoxXqyUDs= github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/wire v0.3.0/go.mod h1:i1DMg/Lu8Sz5yYl25iOdmc5CT5qusaa+zmRWs16741s= +github.com/google/wire v0.4.0/go.mod h1:ngWDr9Qvq3yZA10YrxfyGELY/AFWGVpy9c1LTRi1EoU= +github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= +github.com/googleapis/gax-go v2.0.2+incompatible h1:silFMLAnr330+NRuag/VjIGF7TLp/LBrV2CJKFLWEww= +github.com/googleapis/gax-go v2.0.2+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5 h1:sjZBwGj9Jlw33ImPtvFviGYvseOtDM7hkSKB7+Tv3SM= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gnostic v0.4.1 h1:DLJCy1n/vrD4HPjOvYcT8aYQXpPIzoRZONaYwyycI+I= +github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= +github.com/googleapis/gnostic v0.2.2/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= +github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU= +github.com/googleapis/gnostic v0.5.5 h1:9fHAtK0uDfpveeqqo1hkEZJcFvYXAiCN3UutL8F9xHw= +github.com/googleapis/gnostic v0.5.5/go.mod h1:7+EbHbldMins07ALC74bsA81Ovc97DwqyJO1AENw9kA= +github.com/gookit/color v1.2.4/go.mod h1:AhIE+pS6D4Ql0SQWbBeXPHw7gY0/sjHoA4s/n1KB7xg= +github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/goreleaser/goreleaser v0.136.0/go.mod h1:wiKrPUeSNh6Wu8nUHxZydSOVQ/OZvOaO7DTtFqie904= +github.com/goreleaser/nfpm v1.2.1/go.mod h1:TtWrABZozuLOttX2uDlYyECfQX7x5XYkVxhjYcR6G9w= +github.com/goreleaser/nfpm v1.3.0/go.mod h1:w0p7Kc9TAUgWMyrub63ex3M2Mgw88M4GZXoTq5UCb40= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= @@ -554,6 +886,8 @@ github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gostaticanalysis/analysisutil v0.0.0-20190318220348-4088753ea4d3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= +github.com/gostaticanalysis/analysisutil v0.0.3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= github.com/gosuri/uitable v0.0.4 h1:IG2xLKRvErL3uhY6e1BylFzG+aJiwQviDDTfOKeKTpY= github.com/gosuri/uitable v0.0.4/go.mod h1:tKR86bXuXPZazfOTG1FIzvjIdXzd0mo4Vtn16vt0PJo= github.com/gotestyourself/gotestyourself v2.2.0+incompatible h1:AQwinXlbQR2HvPjQZOmDhRqsv5mZf+Jb1RnSLxcqZcI= @@ -563,14 +897,23 @@ github.com/gregjones/httpcache v0.0.0-20181110185634-c63ab54fda8f h1:ShTPMJQes6t github.com/gregjones/httpcache v0.0.0-20181110185634-c63ab54fda8f/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-middleware v1.2.0/go.mod h1:mJzapYve32yjrKlk9GbyCZHuPgZsrbyIbyKhSzOpg6s= +github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= +github.com/grpc-ecosystem/grpc-gateway v1.6.2/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= +github.com/grpc-ecosystem/grpc-gateway v1.8.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.9.2/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645/go.mod h1:6iZfnjpejD4L/4DwD7NryNaJyCQdzwWwH2MWhCA90Kw= +github.com/hanwen/go-fuse v1.0.0/go.mod h1:unqXarDXqzAk0rt98O2tVndEPIpUgLD9+rwFisZH3Ok= +github.com/hanwen/go-fuse/v2 v2.0.3/go.mod h1:0EQM6aH2ctVpvZ6a+onrQ/vaykxh2GH7hy3e13vzTUY= +github.com/hanwen/go-fuse/v2 v2.1.0/go.mod h1:oRyA5eK+pvJyv5otpO/DgccS8y/RvYMaO00GgRLGryc= github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM= @@ -578,10 +921,14 @@ github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtng github.com/hashicorp/go-hclog v0.9.2 h1:CG6TE5H9/JXsFWJCfoIVpKFIkFe6ysEuHirp4DxCsHI= github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= +github.com/hashicorp/go-retryablehttp v0.6.4/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= +github.com/hashicorp/go-retryablehttp v0.6.6/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= github.com/hashicorp/go-retryablehttp v0.6.8 h1:92lWxgpa+fF3FozM4B3UZtHZMJX8T5XT+TFdCxsPyWs= github.com/hashicorp/go-retryablehttp v0.6.8/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= @@ -592,49 +939,71 @@ github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/b github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.3 h1:YPkqC67at8FYaadspW/6uE0COsBxS2656RLEr8Bppgk= +github.com/hashicorp/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= +github.com/hashicorp/uuid v0.0.0-20160311170451-ebb0a03e909c/go.mod h1:fHzc09UnyJyqyW+bFuq864eh+wC7dj65aXmXLRe5to0= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/huandu/xstrings v1.3.1 h1:4jgBlKK6tLKFvO8u5pmYjG91cqytmDCDvGh7ECVFfFs= github.com/huandu/xstrings v1.3.1/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= +github.com/huandu/xstrings v1.3.2 h1:L18LIDzqlW6xN2rEkpdV8+oL/IXWJ1APd+vsdYy4Wdw= +github.com/huandu/xstrings v1.3.2/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/huaweicloud/huaweicloud-sdk-go-v3 v0.0.50 h1:nQ1QIkLxAoFsYyjvpQH3gVIy3mHfI0WDYEWdmwwxSG0= github.com/huaweicloud/huaweicloud-sdk-go-v3 v0.0.50/go.mod h1:Pp3sd2tx3j9qC7Ij6jGh5phZwTrI+/HUBK90f3Cn2CI= -github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.9/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= +github.com/ishidawataru/sctp v0.0.0-20191218070446-00ab2ac2db07/go.mod h1:co9pwDoBCm1kGxawmb4sPq0cSIOOWNPT4KnHotMP1Zg= +github.com/ishidawataru/sctp v0.0.0-20210226210310-f2269e66cdee/go.mod h1:co9pwDoBCm1kGxawmb4sPq0cSIOOWNPT4KnHotMP1Zg= +github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA= +github.com/jaguilar/vt100 v0.0.0-20150826170717-2703a27b14ea/go.mod h1:QMdK4dGB3YhEW2BmA1wgGpPYI3HZy/5gD705PXKUVSg= +github.com/jarcoal/httpmock v1.0.5/go.mod h1:ATjnClrvW/3tijVmpL/va5Z3aAyGvqU3gCT8nX0Txik= github.com/jasonlvhit/gocron v0.0.0-20171226191223-3c914c8681c3 h1:s2ARkZWJfkyjrUi8Dj0mMbc1inxeOnIrO9zc3oQX8iU= github.com/jasonlvhit/gocron v0.0.0-20171226191223-3c914c8681c3/go.mod h1:rwi/esz/h+4oWLhbWWK7f6dtmgLzxeZhnwGr7MCsTNk= +github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4= +github.com/jingyugao/rowserrcheck v0.0.0-20191204022205-72ab7603b68a/go.mod h1:xRskid8CManxVta/ALEhJha/pweKBaVG6fWgc0yH25s= github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= github.com/jinzhu/now v1.1.2 h1:eVKgfIdy9b6zbWBMgFpfDPoAMifwSZagU9HmEU6zgiI= github.com/jinzhu/now v1.1.2/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/jirfag/go-printf-func-name v0.0.0-20191110105641-45db9963cdd3/go.mod h1:HEWGJkRDzjJY2sqdDwxccsGicWEf9BQOZsq2tV+xzM0= +github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af/go.mod h1:HEWGJkRDzjJY2sqdDwxccsGicWEf9BQOZsq2tV+xzM0= +github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= +github.com/jmoiron/sqlx v1.2.1-0.20190826204134-d7d95172beb5/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= github.com/jmoiron/sqlx v1.3.1 h1:aLN7YINNZ7cYOPK3QC83dbM6KT0NMqVMw961TqrejlE= github.com/jmoiron/sqlx v1.3.1/go.mod h1:2BljVx/86SuTyjE+aPYlHCTNvZrnJXghYGpNiXLBMCQ= -github.com/joho/godotenv v1.3.0 h1:Zjp+RcGpHhGlrMbJzXTrZZPrWj+1vfm90La1wgB6Bhc= +github.com/joefitzgerald/rainbow-reporter v0.1.0/go.mod h1:481CNgqmVHQZzdIbN52CupLJyoVwB10FQ/IQlF1pdL8= github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/jonboulle/clockwork v0.2.0/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= +github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/jpillora/backoff v0.0.0-20180909062703-3050d21c67d7/go.mod h1:2iMrUgbbvHEiQClaW2NsSzMyGHqN+rDFqY705q49KG0= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= +github.com/json-iterator/go v0.0.0-20180612202835-f2b4162afba3/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v0.0.0-20180701071628-ab8a2e0c74be/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= @@ -653,26 +1022,39 @@ github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 h1:iQTw/8FWTuc7uia github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8= github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4= github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= +github.com/karrick/godirwalk v1.15.8 h1:7+rWAZPn9zuRxaIqqT8Ohs2Q2Ac0msBqwRdxNCr2VVs= +github.com/karrick/godirwalk v1.15.8/go.mod h1:j4mkqPuvaLI8mp1DroR3P6ad7cyYd4c1qeJ3RV7ULlk= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.9.5 h1:U+CaK85mrNNb4k8BNOfgJtJ/gr6kswUCFj6miSzVC6M= github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.11.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.11.13/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.12.3 h1:G5AfA94pHPysR56qqrkO2pxEexdDzrpFJ6yt/VqWxVU= +github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= +github.com/klauspost/cpuid v0.0.0-20180405133222-e7e905edc00e/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kortschak/utter v1.0.1/go.mod h1:vSmSjbyrlKjjsL71193LmzBOKgwePk9DH6uFaWHIInc= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= +github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 h1:SOEGU9fKiNWd/HOJuq6+3iTQz8KNCLtVX6idSoTLdUw= @@ -681,83 +1063,132 @@ github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 h1:P6pPBnrTSX3DEVR4fDembhR github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0/go.mod h1:vmVJ0l/dxyfGW6FmdpVm2joNMFikkuWg0EoCKLGUMNw= github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= +github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.10.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lib/pq v1.10.2 h1:AqzbZs4ZoCBp+GtejcpCpcxM3zlSMx29dXbUSeVtJb8= github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de h1:9TO3cAIGXtEhnIaL+V+BEER86oLrvS+kWobKpbJuye0= github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE= -github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= -github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= -github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= +github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.5 h1:b6kJs+EmPFMYGkow9GiUyCyOvIwYetYJ3fSaWak/Gls= github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.0 h1:aizVhC/NAAcKWb+5QsU1iNOZb4Yws5UO2I+aIprQITM= github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= +github.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA= +github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/maratori/testpackage v1.0.1/go.mod h1:ddKdw+XG0Phzhx8BFDTKgpWP4i7MpApTE5fXSKAqwDU= +github.com/markbates/errx v1.1.0 h1:QDFeR+UP95dO12JgW+tgi2UVfo0V8YBHiUIOaeBPiEI= +github.com/markbates/errx v1.1.0/go.mod h1:PLa46Oex9KNbVDZhKel8v1OT7hD5JZ2eI7AHhA0wswc= github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE= +github.com/markbates/oncer v1.0.0 h1:E83IaVAHygyndzPimgUYJjbshhDTALZyXxvk9FOlQRY= +github.com/markbates/oncer v1.0.0/go.mod h1:Z59JA581E9GP6w96jai+TGqafHPW+cPfRxz2aSZ0mcI= github.com/markbates/pkger v0.17.1/go.mod h1:0JoVlrol20BSywW79rN3kdFFsE5xYM+rSCQDXbLhiuI= +github.com/markbates/safe v1.0.1 h1:yjZkbvRM6IzKj9tlu/zMJLS0n/V351OZWRnF3QfaUxI= github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0= +github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= +github.com/matoous/godox v0.0.0-20190911065817-5d6d842e92eb/go.mod h1:1BELzlh859Sh1c6+90blK8lbYy0kwQf1bYlBhBysy1s= github.com/mattermost/xml-roundtrip-validator v0.1.0/go.mod h1:qccnGMcpgwcNaBnxqpJpWWUiPNr5H3O8eDgGV9gT5To= -github.com/mattn/go-colorable v0.0.9 h1:UVL0vNpWh04HeJXV0KLcaT7r06gOH2l4OW6ddYRUIY4= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= +github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.6 h1:6Su7aK7lXmJ/U79bYtBjLNaha4Fs1Rg9plHpcH+vvnE= +github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-ieproxy v0.0.0-20190610004146-91bb50d98149/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= +github.com/mattn/go-ieproxy v0.0.0-20190702010315-6dee0af9227d/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= +github.com/mattn/go-ieproxy v0.0.1/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-oci8 v0.0.7/go.mod h1:wjDx6Xm9q7dFtHJvIlrI99JytznLw5wQ4R+9mNXJwGI= +github.com/mattn/go-oci8 v0.1.1/go.mod h1:wjDx6Xm9q7dFtHJvIlrI99JytznLw5wQ4R+9mNXJwGI= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= +github.com/mattn/go-shellwords v1.0.10/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= github.com/mattn/go-shellwords v1.0.11/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= -github.com/mattn/go-sqlite3 v1.12.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/mattn/go-sqlite3 v1.14.8 h1:gDp86IdQsN/xWjIEmr9MF6o9mpksUgh0fu+9ByFxzIU= github.com/mattn/go-sqlite3 v1.14.8/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= +github.com/mattn/go-zglob v0.0.1/go.mod h1:9fxibJccNxU2cnpIKLRRFA7zX7qhkJIQWBb449FYHOo= +github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= github.com/mattomatic/dijkstra v0.0.0-20130617153013-6f6d134eb237 h1:acuCHBjzG7MFTugvx3buC4m5rLDLaKC9J8C9jtlraRc= github.com/mattomatic/dijkstra v0.0.0-20130617153013-6f6d134eb237/go.mod h1:UOnLAUmVG5paym8pD3C4B9BQylUDC2vXFJJpT7JrlEA= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/maxbrunsfeld/counterfeiter/v6 v6.2.2/go.mod h1:eD9eIE7cdwcMi9rYluz88Jz2VyhSmden33/aXg4oVIY= +github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= +github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/cli v1.1.2/go.mod h1:6iaV0fGdElS6dPBx0EApTxHrcWvmJphyh2n8YBLPPZ4= github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= github.com/mitchellh/copystructure v1.1.1 h1:Bp6x9R1Wn16SIz3OfeDr0b7RnCG2OB66Y7PQyC/cvq4= github.com/mitchellh/copystructure v1.1.1/go.mod h1:EBArHfARyrSWO/+Wyr9zwEkc6XMFB9XyNgFNmRkZZU4= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-ps v0.0.0-20190716172923-621e5597135b/go.mod h1:r1VsdOzOPt1ZSrGZWFoNhsAedKnEd6r9Np1+5blZCWk= github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= github.com/mitchellh/go-wordwrap v1.0.0 h1:6GlHJ/LTGMrIJbwgdqdl2eEH8o+Exx/0m8ir9Gns0u4= github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= +github.com/mitchellh/hashstructure v1.0.0/go.mod h1:QjSHrPWS+BGUVBYkbTZWEnOh3G1DutKwClXU/ABz6AQ= github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.3.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag= github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQZAeMln+1tSwduZz7+Af5oFlKirV/MSYes2A= github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/mitchellh/reflectwalk v1.0.1 h1:FVzMWA5RllMAKIdUSC8mdWo3XtwoecrH79BY70sEEpE= github.com/mitchellh/reflectwalk v1.0.1/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= -github.com/mittwald/go-helm-client v0.8.0 h1:k8yMvoWE7C+jJgw6iodJ0U5nY4hVpLU20VIpR+FfyJk= -github.com/mittwald/go-helm-client v0.8.0/go.mod h1:+Ks5OpzB0hJw91W8o/8G+FmjUtjrIXxPuJjE87XG/G0= +github.com/mittwald/go-helm-client v0.8.2 h1:tWPe+e4Bx2bAC0lY55nxuOxOvNEP4aBfCdizvGpM24U= +github.com/mittwald/go-helm-client v0.8.2/go.mod h1:DVtyXr7KDPIT44X320DkxF39nfbZn8KdjvibnN7iHnQ= +github.com/moby/buildkit v0.8.1/go.mod h1:/kyU1hKy/aYCuP39GZA9MaKioovHku57N6cqlKZIaiQ= +github.com/moby/buildkit v0.9.1 h1:6noq8jvkaRs3OQGTIDf5U5Etkgq6zsPmQHGWi5yhh88= +github.com/moby/buildkit v0.9.1/go.mod h1:oVZKk3TMm0MlDx7XxnlF0wKmcpyrzOs9GEp0VXKWFPk= +github.com/moby/locker v1.0.1 h1:fOXqR41zeveg4fFODix+1Ch4mj/gT0NE1XJbp/epuBg= +github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= github.com/moby/spdystream v0.2.0 h1:cjW1zVyyoiM0T7b6UoySUFqzXMoqRckQtXwGPiBhOM8= github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= +github.com/moby/sys/mount v0.1.0/go.mod h1:FVQFLDRWwyBjDTBNQXDlWnSFREqOo3OKX9aqhmeoo74= +github.com/moby/sys/mount v0.1.1/go.mod h1:FVQFLDRWwyBjDTBNQXDlWnSFREqOo3OKX9aqhmeoo74= +github.com/moby/sys/mount v0.2.0/go.mod h1:aAivFE2LB3W4bACsUXChRHQ0qKWsetY4Y9V7sxOougM= +github.com/moby/sys/mountinfo v0.1.0/go.mod h1:w2t2Avltqx8vE7gX5l+QiBKxODu2TX0+Syr3h52Tw4o= +github.com/moby/sys/mountinfo v0.1.3/go.mod h1:w2t2Avltqx8vE7gX5l+QiBKxODu2TX0+Syr3h52Tw4o= +github.com/moby/sys/mountinfo v0.4.0/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= +github.com/moby/sys/mountinfo v0.4.1 h1:1O+1cHA1aujwEwwVMa2Xm2l+gIpUHyd3+D+d7LZh1kM= +github.com/moby/sys/mountinfo v0.4.1/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= +github.com/moby/sys/symlink v0.1.0/go.mod h1:GGDODQmbFOjFsXvfLVn3+ZRxkch54RkSiGqsZeMYowQ= +github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo= +github.com/moby/term v0.0.0-20200915141129-7f0af18e79f2/go.mod h1:TjQg8pa4iejrUrjiz0MCtMV38jdMNW4doKSiBrEvCQQ= +github.com/moby/term v0.0.0-20201110203204-bea5bbe245bf/go.mod h1:FBS0z0QWA44HXygs7VXDUOGoN/1TV3RuWkLO04am3wc= github.com/moby/term v0.0.0-20201216013528-df9cb8a40635/go.mod h1:FBS0z0QWA44HXygs7VXDUOGoN/1TV3RuWkLO04am3wc= github.com/moby/term v0.0.0-20210610120745-9d4ed1856297 h1:yH0SvLzcbZxcJXho2yh7CqdENGMQe73Cw3woZBpPli0= github.com/moby/term v0.0.0-20210610120745-9d4ed1856297/go.mod h1:vgPCkQMyxTZ7IDy8SXRufE172gr8+K/JE/7hHFxHW3A= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180320133207-05fbef0ca5da/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= @@ -765,20 +1196,19 @@ github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 h1:n6/ github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00/go.mod h1:Pm3mSP3c5uWn86xMLZ5Sa7JB9GsEZySvHYXCTK4E9q4= github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= +github.com/mozilla/tls-observatory v0.0.0-20190404164649-a3c1b6cfecfd/go.mod h1:SrKMQvPiws7F7iqYp8/TX+IhxCYhzr6N/1yb8cwHsGk= +github.com/mozilla/tls-observatory v0.0.0-20200317151703-4fa42e1c2dee/go.mod h1:SrKMQvPiws7F7iqYp8/TX+IhxCYhzr6N/1yb8cwHsGk= +github.com/mrunalp/fileutils v0.0.0-20200520151820-abd8a0e76976/go.mod h1:x8F1gnqOkIEiO4rqoeEEEqQbo7HjGMTvyoq3gej4iT0= +github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f h1:y5//uYreIhSUg3J1GEMiLbxo1LJaP8RfCpH6pymGZus= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= -github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= -github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= -github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= -github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= -github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= -github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= +github.com/nakabonne/nestif v0.3.0/go.mod h1:dI314BppzXjJ4HsCnbo7XzrJHPszZsjnk5wEBSYHI2c= +github.com/nbutton23/zxcvbn-go v0.0.0-20180912185939-ae427f1e4c1d/go.mod h1:o96djdrsSGy3AWPyBgZMAGfxZNfgntdJG+11KU4QvbU= +github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nsqio/go-nsq v1.0.7 h1:O0pIZJYTf+x7cZBA0UMY8WxFG79lYTURmWzAAh48ljY= github.com/nsqio/go-nsq v1.0.7/go.mod h1:XP5zaUs3pqf+Q71EqUJs3HYfBIqfK6G83WQMdNN+Ito= @@ -787,49 +1217,70 @@ github.com/nwaples/rardecode v1.0.0/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWk github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= -github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= -github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/oklog/run v1.1.0/go.mod h1:sVPdnTZT1zYwAJeCMu2Th4T21pA3FPOQRfWjQlk7DVU= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= -github.com/olekukonko/tablewriter v0.0.1/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= -github.com/olekukonko/tablewriter v0.0.2/go.mod h1:rSAaSIOAGT9odnlyGlUfAJaoc5w2fSBUmeGDbRWPxyQ= github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= +github.com/onsi/ginkgo v0.0.0-20151202141238-7f8ab55aaf3b/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= +github.com/onsi/gomega v0.0.0-20151007035656-2152b45fa28a/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.8.1/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= +github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= github.com/onsi/gomega v1.15.0 h1:WjP/FQ/sk43MRmnEcT+MlDw2TFvkrXlprrPST/IudjU= github.com/onsi/gomega v1.15.0/go.mod h1:cIuvLEne0aoVhAgh/O6ac0Op8WWw9H6eYCriF+tEHG0= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/go-digest v1.0.0-rc1.0.20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.0.1 h1:JMemWkRwHx4Zj+fVxWoMCFm/8sYGGrUVojFA6h/TRcI= github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v0.1.1 h1:GlxAyO6x8rfZYN9Tt0Kti5a/cP41iuiO2yYT0IJGY8Y= github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v1.0.0-rc10/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v1.0.0-rc8.0.20190926000215-3e425f80a8c9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v1.0.0-rc9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v1.0.0-rc92/go.mod h1:X1zlU4p7wOlX4+WRCz+hvlRv8phdL7UqbYD+vQwNMmE= +github.com/opencontainers/runc v1.0.0-rc93/go.mod h1:3NOsor4w32B2tC0Zbl8Knk4Wg84SM2ImC1fxBuqJ/H0= +github.com/opencontainers/runc v1.0.2 h1:opHZMaswlyxz1OuGpBE53Dwe4/xF7EZTY0A2L/FpCOg= +github.com/opencontainers/runc v1.0.2/go.mod h1:aTaHFFwQXuA71CiyxOdFFIorAoemI04suvGRQFzWTD0= +github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.2-0.20190207185410-29686dbc5559/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/selinux v1.6.0 h1:+bIAS/Za3q5FTwWym4fTB0vObnfCf3G/NC7K6Jx62mY= +github.com/opencontainers/runtime-spec v1.0.3-0.20200728170252-4d89ac9fbff6/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.3-0.20200929063507-e6143ca7d51d/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs= github.com/opencontainers/selinux v1.6.0/go.mod h1:VVGKuOLlE7v4PJyT6h7mNWvq1rzqiriPsEqVhc+svHE= -github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= -github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= -github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opencontainers/selinux v1.8.0/go.mod h1:RScLhm78qiWa2gbVCcGkC7tCGdgk3ogry1nUQF8Evvo= +github.com/opencontainers/selinux v1.8.2 h1:c4ca10UMgRcvZ6h0K4HtS15UaVSBEaE+iln2LVpAuGc= +github.com/opencontainers/selinux v1.8.2/go.mod h1:MUIHuUEvKB1wtJjQdOyYRgOnLD2xAPP8dBsCoU0KuF8= +github.com/opentracing-contrib/go-stdlib v1.0.0/go.mod h1:qtI1ogk+2JhVPIXVc6q+NHziSmy2W5GbdQZFUHADCBU= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= +github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= +github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= +github.com/openzipkin/zipkin-go v0.1.3/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= -github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= -github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= github.com/otiai10/copy v1.6.0 h1:IinKAryFFuPONZ7cm6T6E2QX/vcJwSnlaA5lfoaXIiQ= github.com/otiai10/copy v1.6.0/go.mod h1:XWfuS3CrI0R6IE0FbgHsEazaXO8G0LpMp9o8tos0x4E= github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE= @@ -837,36 +1288,40 @@ github.com/otiai10/curr v1.0.0/go.mod h1:LskTG5wDwr8Rs+nNQ+1LlxRjAtTZZjtJW4rMXl6 github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo= github.com/otiai10/mint v1.3.2 h1:VYWnrP5fXmz1MXvjuUvcBrXSjGE6xjON+axB/UrpO3E= github.com/otiai10/mint v1.3.2/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc= -github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE= +github.com/pelletier/go-toml v1.8.0/go.mod h1:D6yutnOGMveHEPV7VQOuvI/gXY61bv+9bAOTRnLElKs= +github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc= +github.com/pelletier/go-toml v1.9.1/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pelletier/go-toml v1.9.3 h1:zeC5b1GviRUyKYd6OJPvBU/mcVDVoL1OhT17FCt5dSQ= github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= +github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d/go.mod h1:3OzsM7FXDQlpCiw2j81fOmAwQLnZnLGXVKUzeKQXIAw= github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2 h1:JhzVVoYvbOACxoUmOs6V/G4D5nPVUW73rKvXxP4XUJc= github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2/go.mod h1:iIss55rKnNBTvrwdmkUpLnDpZoAHvWaiq5+iMmen4AE= -github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= github.com/pierrec/lz4 v2.0.5+incompatible h1:2xWsjqPFWcplujydGg4WmhC/6fZqK42wMM8aXeqhl0I= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1-0.20171018195549-f15c970de5b7/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= +github.com/pkg/profile v1.5.0/go.mod h1:qBsxPvzyUincmltOk6iyRVxHYg4adc0OFOv72ZdLa18= github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= +github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= +github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= +github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.11.0 h1:HNkLOAEQMIDv/K+04rukrLx6ch7msSRwf3/SASFAGtQ= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= @@ -874,56 +1329,79 @@ github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1: github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= +github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.26.0 h1:iMAkS2TDoNWnKM+Kopnx/8tnEStIfpYA0ur0xQzzhMQ= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.0-20190522114515-bc1a522cf7b1/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= +github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0 h1:mxy4L2jP6qMonqmq+aTtOx1ifVWUgG/TAmntgbh3xv4= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/quasilyte/go-consistent v0.0.0-20190521200055-c6f3937de18c/go.mod h1:5STLWrekHfjyYwxBRVRXNOSewLJ3PWfDJd1VyTS21fI= +github.com/quasilyte/go-ruleguard v0.1.2-0.20200318202121-b00d7a75d3d8/go.mod h1:CGFX09Ci3pq9QZdj86B+VGIdNj4VyCo2iPOGS9esB/k= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/remyoudompheng/bigfft v0.0.0-20170806203942-52369c62f446/go.mod h1:uYEyJGbgTkfkS4+E/PavXkNJcbFIpEtjt2B0KDQ5+9M= github.com/rfyiamcool/cronlib v1.0.0 h1:PNTF7pgtbL7TedrqnC6syhHwj4d1bCKxH3XmPqqgxvg= github.com/rfyiamcool/cronlib v1.0.0/go.mod h1:i7AVVUhM/kkNcC/Ayq0XOmyCJCcqa/FlflyYQMm5QWE= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rogpeppe/fastuuid v1.1.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.3.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.4.0 h1:LUa41nrWTQNGhzdsZ5lTnkwbNjj6rXTdazA1cSdjkOY= -github.com/rogpeppe/go-internal v1.4.0/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rubenv/sql-migrate v0.0.0-20200616145509-8d140a17f351 h1:HXr/qUllAWv9riaI4zh2eXWKmCSDqVS/XH1MRHLKRwk= -github.com/rubenv/sql-migrate v0.0.0-20200616145509-8d140a17f351/go.mod h1:DCgfY80j8GYL7MLEfvcpSFvjD0L5yZq/aZUJmhZklyg= +github.com/rogpeppe/go-internal v1.5.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= +github.com/rubenv/sql-migrate v0.0.0-20210614095031-55d5740dbbcc h1:BD7uZqkN8CpjJtN/tScAKiccBikU4dlqe/gNrkRaPY4= +github.com/rubenv/sql-migrate v0.0.0-20210614095031-55d5740dbbcc/go.mod h1:HFLT6i9iR4QBOF5rdCyjddC9t59ArqWJV2xx+jwcCMo= +github.com/rubiojr/go-vhd v0.0.0-20160810183302-0bfd3b39853c/go.mod h1:DM5xW0nvfNNm2uytzsvhI3OnX8uzaRAg8UX/CnDqbto= github.com/russellhaering/goxmldsig v1.1.0/go.mod h1:QK8GhXPB3+AfuCrfo0oRISa9NfzeCpWmxeGnqEpDF9o= github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ryancurrah/gomodguard v1.0.4/go.mod h1:9T/Cfuxs5StfsocWr4WzDL36HqnX0fVb9d5fSEaLhoE= +github.com/ryancurrah/gomodguard v1.1.0/go.mod h1:4O8tr7hBODaGE6VIhfJDHcwzh5GUccKSJBU0UMXJFVM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= +github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= +github.com/sassoftware/go-rpmutils v0.0.0-20190420191620-a8f1baeba37b/go.mod h1:am+Fp8Bt506lA3Rk3QCmSqmYmLMnPDhdDUcosQCAx+I= github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/sclevine/spec v1.2.0/go.mod h1:W4J29eT/Kzv7/b9IWLB055Z+qvVC9vt0Arko24q7p+U= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= +github.com/securego/gosec v0.0.0-20200103095621-79fbf3af8d83/go.mod h1:vvbZ2Ae7AzSq3/kywjUDxSNq2SJ27RxCz2un0H3ePqE= +github.com/securego/gosec v0.0.0-20200401082031-e946c8c39989/go.mod h1:i9l/TNj+yDFh9SZXUTvspXTjbFXgZGP/UvhU1S65A4A= +github.com/securego/gosec/v2 v2.3.0/go.mod h1:UzeVyUXbxukhLeHKV3VVqo7HdoQR9MrRfFmZYotn8ME= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= +github.com/serialx/hashring v0.0.0-20190422032157-8b2912629002/go.mod h1:/yeG0My1xr/u+HZrFQ1tOQQQQrOawfyMUH13ai5brBc= +github.com/shirou/gopsutil v0.0.0-20190901111213-e4ec7b275ada/go.mod h1:WWnYX4lzhCH5h/3YBfyVA3VbLYjlMZZAQcW9ojMexNc= +github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc= github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ= github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= +github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= +github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/sirupsen/logrus v1.0.4-0.20170822132746-89742aefa4b2/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= +github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= @@ -932,12 +1410,17 @@ github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrf github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/assertions v1.0.0 h1:UVQPSSmc3qtTi+zPPkCXvZX9VvW/xT/NsRvKfwY81a8= +github.com/smartystreets/assertions v1.0.0/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= +github.com/smartystreets/go-aws-auth v0.0.0-20180515143844-0c1422d1fdb9/go.mod h1:SnhjPscd9TpLiy1LpzGSKh3bXCfxxXuqd9xmQJy3slM= github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/smartystreets/gunit v1.0.0/go.mod h1:qwPWnhz6pn0NnRBP++URONOVyNkPyr4SauJk4cUOwJs= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= +github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= +github.com/sourcegraph/go-diff v0.5.1/go.mod h1:j2dHj3m8aZgQO8lMTcTnBcXkRRRqi34cd2MNlA9u1mE= +github.com/sourcegraph/go-diff v0.5.3/go.mod h1:v9JDtjCE4HHHCZGId75rg8gkKKa98RVjBcBGsVmMmak= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72 h1:qLC7fQah7D6K1B0ujays3HV9gkFtllcxhzImRR7ArPQ= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= @@ -950,6 +1433,7 @@ github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkU github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= +github.com/spf13/cobra v0.0.6/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= @@ -966,18 +1450,21 @@ github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= +github.com/spf13/viper v1.6.1/go.mod h1:t3iDnF5Jlj76alVNuyFBk5oUMCvsrkbvZK0WQdfDi5k= github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/spf13/viper v1.8.1 h1:Kq1fyeebqsBfbjZj4EL7gj2IO0mMaiyjYUWcUsl2O44= github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= +github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980/go.mod h1:AO3tvPzVZ/ayst6UlUKUv6rcPQInYe3IknH3jYhAKu8= github.com/stevvooe/resumable v0.0.0-20180830230917-22b14a53ba50 h1:4bT0pPowCpQImewr+BjzfUKcuFW+KVyB8d1OF3b6oTI= github.com/stevvooe/resumable v0.0.0-20180830230917-22b14a53ba50/go.mod h1:1pdIZTAHUz+HDKDVZ++5xg/duPlhKAIzw9qy42CWYp4= -github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= -github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= -github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= +github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= +github.com/stretchr/objx v0.0.0-20180129172003-8a3f7159479f/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/testify v0.0.0-20151208002404-e3a8ff8ce365/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v0.0.0-20180303142811-b89eecf5ca5d/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= @@ -993,10 +1480,35 @@ github.com/swaggo/gin-swagger v1.3.0 h1:eOmp7r57oUgZPw2dJOjcGNMse9cvXcI4tTqBcnZt github.com/swaggo/gin-swagger v1.3.0/go.mod h1:oy1BRA6WvgtCp848lhxce7BnWH4C8Bxa0m5SkWx+cS0= github.com/swaggo/swag v1.5.1 h1:2Agm8I4K5qb00620mHq0VJ05/KT4FtmALPIcQR9lEZM= github.com/swaggo/swag v1.5.1/go.mod h1:1Bl9F/ZBpVWh22nY0zmYyASPO1lI/zIwRDrpZU+tv8Y= +github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= +github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= +github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= +github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= +github.com/tchap/go-patricia v2.2.6+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I= +github.com/tdakkota/asciicheck v0.0.0-20200416190851-d7f85be797a2/go.mod h1:yHp0ai0Z9gUljN3o0xMhYJnH/IcvkdTBOX2fmJ93JEM= +github.com/tdakkota/asciicheck v0.0.0-20200416200610-e657995f937b/go.mod h1:yHp0ai0Z9gUljN3o0xMhYJnH/IcvkdTBOX2fmJ93JEM= +github.com/tetafro/godot v0.3.7/go.mod h1:/7NLHhv08H1+8DNj0MElpAACw1ajsCuf3TKNQxA5S+0= +github.com/tetafro/godot v0.4.2/go.mod h1:/7NLHhv08H1+8DNj0MElpAACw1ajsCuf3TKNQxA5S+0= github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= +github.com/timakin/bodyclose v0.0.0-20190930140734-f7f2e9bca95e/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk= +github.com/timakin/bodyclose v0.0.0-20200424151742-cb6215831a94/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk= +github.com/tj/assert v0.0.0-20171129193455-018094318fb0/go.mod h1:mZ9/Rh9oLWpLLDRpvE+3b7gP/C2YyLFYxNmcLnPTMe0= +github.com/tj/go-elastic v0.0.0-20171221160941-36157cbbebc2/go.mod h1:WjeM0Oo1eNAjXGDx2yma7uG2XoyRZTq1uv3M/o7imD0= +github.com/tj/go-kinesis v0.0.0-20171128231115-08b17f58cb1b/go.mod h1:/yhzCV0xPfx6jb1bBgRFjl5lytqVqZXEaeqWP8lTEao= +github.com/tj/go-spin v1.1.0/go.mod h1:Mg1mzmePZm4dva8Qz60H2lHwmJ2loum4VIrLgVnKwh4= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tommy-muehle/go-mnd v1.1.1/go.mod h1:dSUh0FtTP8VhvkL1S+gUR1OKd9ZnSaozuI6r3m6wOig= +github.com/tommy-muehle/go-mnd v1.3.1-0.20200224220436-e6f9a994e8fa/go.mod h1:dSUh0FtTP8VhvkL1S+gUR1OKd9ZnSaozuI6r3m6wOig= +github.com/tonistiigi/fsutil v0.0.0-20201103201449-0834f99b7b85/go.mod h1:a7cilN64dG941IOXfhJhlH0qB92hxJ9A1ewrdUmJ6xo= +github.com/tonistiigi/fsutil v0.0.0-20210609172227-d72af97c0eaf/go.mod h1:lJAxK//iyZ3yGbQswdrPTxugZIDM7sd4bEsD0x3XMHk= +github.com/tonistiigi/go-actions-cache v0.0.0-20211002214948-4d48f2ff622a/go.mod h1:YiIBjH5gP7mao3t0dBrNNBGuKYdeJmcAJjYLXr43k6A= +github.com/tonistiigi/units v0.0.0-20180711220420-6950e57a87ea/go.mod h1:WPnis/6cRcDZSUvVmezrxJPkiO87ThFYsoUiMwWNDJk= +github.com/tonistiigi/vt100 v0.0.0-20210615222946-8066bb97264f/go.mod h1:ulncasL3N9uLrVann0m+CDlJKWsIAP34MPcOJF6VRvc= +github.com/uber/jaeger-client-go v2.25.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= +github.com/uber/jaeger-lib v2.2.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go v1.1.13 h1:nB3O5kBSQGjEQAcfe1aLUYuxmXdFKmYgBZhY32rQb6Q= @@ -1006,14 +1518,33 @@ github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljT github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= github.com/ugorji/go/codec v1.1.13 h1:013LbFhocBoIqgHeIHKlV4JWYhqogATYWZhIcH0WHn4= github.com/ugorji/go/codec v1.1.13/go.mod h1:oNVt3Dq+FO91WNQ/9JnHKQP2QJxTzoN7wCBFCq1OeuU= -github.com/ulikunitz/xz v0.5.6 h1:jGHAfXawEGZQ3blwU5wnWKQJvAraT7Ftq9EXjnXYgt8= github.com/ulikunitz/xz v0.5.6/go.mod h1:2bypXElzHzzJZwzH67Y6wb67pO62Rzfn7BSiF4ABRW8= +github.com/ulikunitz/xz v0.5.7 h1:YvTNdFzX6+W5m9msiYg/zpkSURPPtOlzbqYjrFn7Yt4= +github.com/ulikunitz/xz v0.5.7/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= +github.com/ultraware/funlen v0.0.2/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA= +github.com/ultraware/whitespace v0.0.4/go.mod h1:aVMh/gQve5Maj9hQ/hg+F75lr/X5A89uZnzAmWSineA= +github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/uudashr/gocognit v1.0.1/go.mod h1:j44Ayx2KW4+oB6SWMv8KsmHzZrOInQav7D3cQMJ5JUM= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasthttp v1.2.0/go.mod h1:4vX61m6KN+xDduDNwXrhIAVZaZaZiQ1luJk8LWSxF3s= +github.com/valyala/quicktemplate v1.2.0/go.mod h1:EH+4AkTd43SvgIbQHYu59/cJyxDoOVRUAfrukLPuGJ4= +github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= +github.com/vdemeester/k8s-pkg-credentialprovider v1.17.4/go.mod h1:inCTmtUdr5KJbreVojo06krnTgaeAz/Z7lynpPk/Q2c= github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= -github.com/willf/bitset v1.1.11-0.20200630133818-d5bec3311243 h1:R43TdZy32XXSXjJn7M/HhALJ9imq6ztLnChfYJpVDnM= +github.com/vishvananda/netlink v0.0.0-20181108222139-023a6dafdcdf/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk= +github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= +github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= +github.com/vishvananda/netns v0.0.0-20180720170159-13995c7128cc/go.mod h1:ZjcWmFBXmLKZu9Nxj3WKYEafiSqer2rnvPr0en9UNpI= +github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= +github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= +github.com/vmware/govmomi v0.20.3/go.mod h1:URlwyTFZX72RmxtxuaFL2Uj3fD1JTvZdx59bHWk6aFU= github.com/willf/bitset v1.1.11-0.20200630133818-d5bec3311243/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= +github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr3+MjI= +github.com/xanzy/go-gitlab v0.31.0/go.mod h1:sPLojNBn68fMUWSxIJtdVVIP8uSBYqesTfDUseX11Ug= +github.com/xanzy/go-gitlab v0.32.0/go.mod h1:sPLojNBn68fMUWSxIJtdVVIP8uSBYqesTfDUseX11Ug= github.com/xanzy/go-gitlab v0.50.0 h1:t7IoYTrnLSbdEZN7d8X/5zcr+ZM4TZQ2mXa8MqWlAZQ= github.com/xanzy/go-gitlab v0.50.0/go.mod h1:Q+hQhV508bDPoBijv7YjK/Lvlb4PhVhJdKqXVQrUoAE= github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c h1:u40Z8hqBAAQyv+vATcGgV0YCnDjqSL7/q/JyPhhJSPk= @@ -1024,6 +1555,7 @@ github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 h1:nIPpBwaJSVYIxUFsDv3M8ofmx9yWTog9BfvIu0q41lo= @@ -1039,10 +1571,13 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs= github.com/yvasiyarov/go-metrics v0.0.0-20150112132944-c25f46c4b940 h1:p7OofyZ509h8DmPLh8Hn+EIIZm/xYhdZHJ9GnXHdr6U= github.com/yvasiyarov/go-metrics v0.0.0-20150112132944-c25f46c4b940/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs= +github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA= github.com/yvasiyarov/gorelic v0.0.7 h1:4DTF1WOM2ZZS/xMOkTFBOcb6XiHu/PKn3rVo6dbewQE= github.com/yvasiyarov/gorelic v0.0.7/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA= +github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg= github.com/yvasiyarov/newrelic_platform_go v0.0.0-20160601141957-9c099fbc30e9 h1:AsFN8kXcCVkUFHyuzp1FtYbzp1nCO/H6+1uPSGEyPzM= github.com/yvasiyarov/newrelic_platform_go v0.0.0-20160601141957-9c099fbc30e9/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg= github.com/ziutek/mymysql v1.5.4 h1:GB0qdRGsTwQSBVYuVShFBKaXSnSnYYC2d9knnE1LHFs= @@ -1050,19 +1585,26 @@ github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wK go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= +go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg= go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= +go.etcd.io/etcd/pkg/v3 v3.5.0/go.mod h1:UzJGatBQ1lXChBkQF0AuAtkRQMYnHubxAEYIrC3MSsE= +go.etcd.io/etcd/raft/v3 v3.5.0/go.mod h1:UFOHSIvO/nKwd4lhkwabrTD3cqW5yVyYYf/KlD00Szc= +go.etcd.io/etcd/server/v3 v3.5.0/go.mod h1:3Ah5ruV+M+7RZr0+Y/5mNLwC+eQlni+mQmOVdCRJoS4= go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= go.mongodb.org/mongo-driver v1.1.2/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= go.mongodb.org/mongo-driver v1.5.0 h1:REddm85e1Nl0JPXGGhgZkgJdG/yOe6xvpXUcYK5WLt0= go.mongodb.org/mongo-driver v1.5.0/go.mod h1:boiGPFqyBs5R0R5qf2ErokGRekMfwn+MqKaUyHs7wy0= -go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= -go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= +go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1/go.mod h1:SNgMg+EgDFwmvSmLRTNKC5fegJjB7v23qTQ0XLGUNHk= +go.opencensus.io v0.15.0/go.mod h1:UffZAU+4sDEINUGP/B7UfBBkq4fqLu9zXAX7ke6CHW0= +go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA= +go.opencensus.io v0.19.1/go.mod h1:gug0GbSHa8Pafr0d2urOSgoXHZ6x/RUlaiT0d9pqb4A= +go.opencensus.io v0.19.2/go.mod h1:NO/8qkisMZLZ1FCsKNqtJPwc8/TaclWyY0B6wcYNg9M= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= @@ -1072,61 +1614,90 @@ go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= +go.opentelemetry.io/contrib v0.21.0/go.mod h1:EH4yDYeNoaTqn/8yCWQmfNB78VHfGX2Jt2bvnvzBlGM= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.21.0/go.mod h1:Vm5u/mtkj1OMhtao0v+BGo2LUoLCgHYXvRmj0jWITlE= +go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.21.0/go.mod h1:a9cocRplhIBkUAJmak+BPDx+LVL7cTmqUPB0uBcTA4k= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.21.0/go.mod h1:JQAtechjxLEL81EjmbRwxBq/XEzGaHcsPuDHAx54hg4= go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= +go.opentelemetry.io/otel v1.0.0-RC1/go.mod h1:x9tRa9HK4hSSq7jf2TKbqFbtt58/TGk0f9XiEYISI1I= +go.opentelemetry.io/otel/exporters/jaeger v1.0.0-RC1/go.mod h1:FXJnjGCoTQL6nQ8OpFJ0JI1DrdOvMoVx49ic0Hg4+D4= go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.0.0-RC1/go.mod h1:FliQjImlo7emZVjixV8nbDMAa4iAkcWTE9zzSEOiEPw= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.0.0-RC1/go.mod h1:cDwRc2Jrh5Gku1peGK8p9rRuX/Uq2OtVmLicjlw2WYU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.0.0-RC1/go.mod h1:OYKzEoxgXFvehW7X12WYT4/a2BlASJK9l7RtG4A91fg= +go.opentelemetry.io/otel/internal/metric v0.21.0/go.mod h1:iOfAaY2YycsXfYD4kaRSbLx2LKmfpKObWBEv9QK5zFo= go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= +go.opentelemetry.io/otel/metric v0.21.0/go.mod h1:JWCt1bjivC4iCrz/aCrM1GSw+ZcvY44KCbaeeRhzHnc= go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= +go.opentelemetry.io/otel/oteltest v1.0.0-RC1/go.mod h1:+eoIG0gdEOaPNftuy1YScLr1Gb4mL/9lpDkZ0JjMRq4= go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= +go.opentelemetry.io/otel/sdk v1.0.0-RC1/go.mod h1:kj6yPn7Pgt5ByRuwesbaWcRLA+V7BSDg3Hf8xRvsvf8= go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE= go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE= go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= +go.opentelemetry.io/otel/trace v1.0.0-RC1/go.mod h1:86UHmyHWFEtWjfWPSbu0+d0Pf9Q6e1U+3ViBOc+NXAg= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.opentelemetry.io/proto/otlp v0.9.0/go.mod h1:1vKfU9rv61e9EVGthD1zNvUbiwPcimSsOPU9brfSHJg= go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5 h1:+FNtrFTmVw0YZGpBGX56XDee331t6JAXeK2bcyhLOOc= go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5/go.mod h1:nmDLcffg48OtT/PSW0Hg7FvpRQsQh5OSqIylirxKC7o= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/goleak v1.1.10 h1:z+mqJhf6ss6BSfSM671tgKyZBFPTTJM+HLxnhPC3wu0= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= go.uber.org/zap v1.19.0 h1:mZQZefskPPCMIBCSEH0v2/iUqqLrYtaeqwD6FUGUnFE= go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= +go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= +gocloud.dev v0.19.0/go.mod h1:SmKwiR8YwIMMJvQBKLsC3fHNyMwXLw3PMDO+VVteJMI= +golang.org/x/build v0.0.0-20190314133821-5284462c4bec/go.mod h1:atTaCNAy0f16Ah5aV1gMSwgiKVHwu/JncqDpuRr7lS4= +golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181009213950-7c1a557ab941/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= +golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190621222207-cc06ce4a13d4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191002192127-34f69633bfdc/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191122220453-ac88ee75c92c/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200128174031-69ecbb4d6d5d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200414173820-0848c9571904/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20201117144127-c1f2f97bffc9/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2 h1:It14KIkyBFYkHkwZ7k45minvA9aorojkyjGk9KJ5B/w= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a h1:kr2P4QFmQr29mSLA43kwrOcgcReGTfbE9N577tCTuBc= +golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190312203227-4b39c73a6495/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= @@ -1137,7 +1708,9 @@ golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EH golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20181217174547-8f45f776aaf1/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= @@ -1163,11 +1736,17 @@ golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180911220305-26e67e76b6c3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181029044818-c44066c5c816/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181106065722-10aee1819953/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181108082009-03003ca0c849/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1183,12 +1762,15 @@ golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190611141213-3f473d35a33a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190619014844-b5b0513f8c1b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191112182307-2180aed22343/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -1205,21 +1787,29 @@ golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210224082022-3d97a244fca7/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420 h1:a8jGStKg0XqKDlKqjLrXn0ioF5MH36pT7Z0BRTqLhbk= golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210520170846-37e1c6afe023 h1:ADo5wSpq2gqaCGQWzk7S5vd//0iyyLeAratkEoG5dLE= +golang.org/x/net v0.0.0-20210520170846-37e1c6afe023/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/oauth2 v0.0.0-20180724155351-3d292e4d0cdc/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181106182150-f42d05182288/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190402181905-9f3314589c9a/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1233,6 +1823,7 @@ golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914 h1:3B43BWw0xEBsLZ/NO1VALz6fppU3481pik+2Ksv45z8= golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1246,16 +1837,20 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181029174526-d69651ed3497/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181218192612-074acd46bca6/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181228144115-9a3f9b0469bb/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190209173611-3b5209105503/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1266,33 +1861,43 @@ golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190515120540-06a5c4944438/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190514135907-3a4b5fb9f71f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190522044717-8097e1b27ff5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190531175056-4c3a928424d2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190610200419-93c9922d18ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190620070143-6f217b454f45/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190812073006-9eafafc0a87e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191002063906-3421d5a6bb1c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191112214154-59a1497f0cea/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191210023423-ac6580df4449/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200120151820-655fe14d7479/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1302,13 +1907,25 @@ golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200817155316-9781c653f443/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200831180312-196b9ba8737a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200916030750-2334cc1a136f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200917073148-efd3b9a0ff20/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200922070232-aee5d888a860/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201013081832-0aaa2718063a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201117170446-d9b008d0a637/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201202213521-69691e467435/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1316,11 +1933,14 @@ golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210313202042-bd2e13477e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1333,6 +1953,7 @@ golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXR golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d h1:SZxvLBoTP5yHO3Frd4z4vrF+DBX9vMVanchswa69toE= golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1346,25 +1967,38 @@ golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac h1:7zkz7BUtwNFFqcowJ+RIgu2MaV/MapERkDIy+mwPyjs= golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181117154741-2ddaf7f79a09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181219222714-6e267b5cc78e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190110163146-51295c7ec13a/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190125232054-d66bd3c5d5a6/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190221204921-83362c3779f5/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190311215038-5c2858a9cfe5/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190322203728-c1a832b0ad89/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190329151228-23e29df326fe/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190416151739-9c9e1878f421/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190422233926-fe54fb35175b/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190521203540-521d6ed310dd/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190606050223-4d9ae51c2468/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= @@ -1375,34 +2009,44 @@ golang.org/x/tools v0.0.0-20190617190820-da514acc4774/go.mod h1:/rFqwRUd4F7ZHNgw golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190706070813-72ffa07ba3db/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= +golang.org/x/tools v0.0.0-20190719005602-e377ae9d6386/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190910044552-dd2b5c81c578/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191004055002-72853e10c5a3/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113232020-e2727e816f5a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200102140908-9497f49d5709/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204192400-7124308813f3/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200308013534-11ec41452d41/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200324003944-a576cf524670/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200331202046-9d5940d49312/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200414032229-332987a829c3/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200422022333-3d57cf2e726e/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200426102838-f3a5411a4c3b/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200502202811-ed308ab3e770/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -1432,8 +2076,19 @@ golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1N golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gomodules.xyz/jsonpatch/v2 v2.2.0 h1:4pT439QV83L+G9FkcCriY6EkpcK6r6bK+A5FBUMI7qY= gomodules.xyz/jsonpatch/v2 v2.2.0/go.mod h1:WXp+iVDkoLQqPudfQ9GBlwB2eZ5DKOnjQZCYdOS8GPY= -google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= +gonum.org/v1/gonum v0.0.0-20190331200053-3d26580ed485/go.mod h1:2ltnJ7xHfj0zHS40VVPYEAAMTa3ZGguvHGBSJeRWqE0= +gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= +gonum.org/v1/netlib v0.0.0-20190331212654-76723241ea4e/go.mod h1:kS+toOQn6AQKjmKJ7gzohV1XkqsFehRA2FbsbkopSuQ= +google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= +google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= +google.golang.org/api v0.0.0-20181030000543-1d582fd0359e/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= +google.golang.org/api v0.0.0-20181220000619-583d854617af/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= +google.golang.org/api v0.2.0/go.mod h1:IfRCZScioGtypHNTlz3gFk67J8uePVW7uDTBzXuIkhU= +google.golang.org/api v0.3.0/go.mod h1:IuvZyQh8jgscv8qWfQ4ABd8m7hEudgBFM/EdhA3BnXw= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.5.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.6.0/go.mod h1:btoxGiFvQNVUZQ8W08zLtrVS08CNpINPEfxXxgJL1Q4= +google.golang.org/api v0.6.1-0.20190607001116-5213b8090861/go.mod h1:btoxGiFvQNVUZQ8W08zLtrVS08CNpINPEfxXxgJL1Q4= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -1446,6 +2101,7 @@ google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/ google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.25.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= @@ -1470,12 +2126,19 @@ google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCID google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8/go.mod h1:0H1ncTHf11KCFhTc/+EFRbzSCOZx+VUbRMk55Yv5MYk= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20181029155118-b69ba1387ce2/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20181219182458-5a97ab628bfb/go.mod h1:7Ep/1NZk928CDR8SjdVbjWNpdIf6nzjE3BTgJDr2Atg= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190508193815-b515fa19cec8/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190522204451-c2c4e71fbf69/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= +google.golang.org/genproto v0.0.0-20190620144150-6af8c5fc6601/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= @@ -1484,6 +2147,7 @@ google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvx google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200117163144-32f20d992d24/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= @@ -1492,16 +2156,19 @@ google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200527145253-8367513e4ece/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= @@ -1520,15 +2187,17 @@ google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+n google.golang.org/genproto v0.0.0-20210721163202-f1cecdd8b78a/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= google.golang.org/genproto v0.0.0-20210722135532-667f2b7c528f h1:YORWxaStkWBnWgELOHTmDrqNlFXuVGEbhwbB5iK94bQ= google.golang.org/genproto v0.0.0-20210722135532-667f2b7c528f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= +google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= +google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= @@ -1564,16 +2233,20 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0 google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20141024133853-64131543e789/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= +gopkg.in/gcfg.v1 v1.2.0/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= +gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= gopkg.in/gorp.v1 v1.7.2 h1:j3DWlAyGVv8whO7AcIWznQ2Yj7yJkn34B8s63GViAAw= @@ -1581,6 +2254,7 @@ gopkg.in/gorp.v1 v1.7.2/go.mod h1:Wo3h+DBQZIxATwftsglhdD/62zRFPhGhTiu5jUJmCaw= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.56.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.62.0 h1:duBzk771uxoUuOlyRLkHsygud9+5lrlGjdFBb4mSKDU= gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/mholt/archiver.v3 v3.1.1 h1:sLb5X5fPPc9oU6YatdC+vbY46irElT3kPR0wOS7bjR4= @@ -1589,12 +2263,13 @@ gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXL gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/square/go-jose.v2 v2.6.0 h1:NGk74WTnPKBNUhNzQX7PYcTLUjoq7mzKk2OKbvwk2iI= gopkg.in/square/go-jose.v2 v2.6.0/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= +gopkg.in/warnings.v0 v0.1.1/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -1607,6 +2282,7 @@ gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gorm.io/driver/mysql v1.1.2 h1:OofcyE2lga734MxwcCW9uB4mWNXMr50uaGRVwQL2B0M= @@ -1619,9 +2295,12 @@ gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81 gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= gotest.tools/v3 v3.0.3 h1:4AuOwCGf4lLR9u3YOe2awrHygurzhO/HeQ6laiA6Sx0= gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= -helm.sh/helm/v3 v3.6.2 h1:7YbEhLC6AUgmcDoh5BGFUGNtR/o43pr0AIelSNjhuFU= -helm.sh/helm/v3 v3.6.2/go.mod h1:mIIus8EOqj+obtycw3sidsR4ORr2aFDmXMSI3k+oeVY= +grpc.go4.org v0.0.0-20170609214715-11d0a25b4919/go.mod h1:77eQGdRu53HpSqPFJFmuJdjuHRquDANNeA4x7B8WQ9o= +helm.sh/helm/v3 v3.7.0/go.mod h1:DajHtQTe8KrjNmvy5gxWkosFKaADrS3uRS5EkDtsmI4= +helm.sh/helm/v3 v3.7.1 h1:kED/HWx09QHHSJhYaJY6ttj/BhmzBmT1oupKslncibY= +helm.sh/helm/v3 v3.7.1/go.mod h1:3eOeBD3Z+O/ELiuu19zynZSN8jP1ErXLuyP21SZeMq8= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20180920025451-e3ad64cb4ed3/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -1629,57 +2308,111 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.5/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= k8s.io/api v0.21.0 h1:gu5iGF4V6tfVCQ/R+8Hc0h7H1JuEhzyEi9S4R5LM8+Y= k8s.io/api v0.21.0/go.mod h1:+YbrhBBGgsxbF6o6Kj4KJPJnBmAKuXDeS3E18bgHNVU= k8s.io/apiextensions-apiserver v0.21.0 h1:Nd4uBuweg6ImzbxkC1W7xUNZcCV/8Vt10iTdTIVF3hw= k8s.io/apiextensions-apiserver v0.21.0/go.mod h1:gsQGNtGkc/YoDG9loKI0V+oLZM4ljRPjc/sql5tmvzc= k8s.io/apimachinery v0.21.0 h1:3Fx+41if+IRavNcKOz09FwEXDBG6ORh6iMsTSelhkMA= k8s.io/apimachinery v0.21.0/go.mod h1:jbreFvJo3ov9rj7eWT7+sYiRx+qZuCYXwWT1bcDswPY= -k8s.io/apiserver v0.21.0 h1:1hWMfsz+cXxB77k6/y0XxWxwl6l9OF26PC9QneUVn1Q= +k8s.io/apiserver v0.17.4/go.mod h1:5ZDQ6Xr5MNBxyi3iUZXS84QOhZl+W7Oq2us/29c0j9I= +k8s.io/apiserver v0.20.1/go.mod h1:ro5QHeQkgMS7ZGpvf4tSMx6bBOgPfE+f52KwvXfScaU= +k8s.io/apiserver v0.20.4/go.mod h1:Mc80thBKOyy7tbvFtB4kJv1kbdD0eIH8k8vianJcbFM= +k8s.io/apiserver v0.20.6/go.mod h1:QIJXNt6i6JB+0YQRNcS0hdRHJlMhflFmsBDeSgT1r8Q= k8s.io/apiserver v0.21.0/go.mod h1:w2YSn4/WIwYuxG5zJmcqtRdtqgW/J2JRgFAqps3bBpg= +k8s.io/apiserver v0.22.1 h1:Ul9Iv8OMB2s45h2tl5XWPpAZo1VPIJ/6N+MESeed7L8= +k8s.io/apiserver v0.22.1/go.mod h1:2mcM6dzSt+XndzVQJX21Gx0/Klo7Aen7i0Ai6tIa400= k8s.io/cli-runtime v0.21.0 h1:/V2Kkxtf6x5NI2z+Sd/mIrq4FQyQ8jzZAUD6N5RnN7Y= k8s.io/cli-runtime v0.21.0/go.mod h1:XoaHP93mGPF37MkLbjGVYqg3S1MnsFdKtiA/RZzzxOo= k8s.io/client-go v0.21.0 h1:n0zzzJsAQmJngpC0IhgFcApZyoGXPrDIAD601HD09ag= k8s.io/client-go v0.21.0/go.mod h1:nNBytTF9qPFDEhoqgEPaarobC8QPae13bElIVHzIglA= +k8s.io/cloud-provider v0.17.4/go.mod h1:XEjKDzfD+b9MTLXQFlDGkk6Ho8SGMpaU8Uugx/KNK9U= +k8s.io/code-generator v0.17.2/go.mod h1:DVmfPQgxQENqDIzVR2ddLXMH34qeszkKSdH/N+s+38s= k8s.io/code-generator v0.21.0/go.mod h1:hUlps5+9QaTrKx+jiM4rmq7YmH8wPOIko64uZCHDh6Q= +k8s.io/component-base v0.17.4/go.mod h1:5BRqHMbbQPm2kKu35v3G+CpVq4K0RJKC7TRioF0I9lE= +k8s.io/component-base v0.20.1/go.mod h1:guxkoJnNoh8LNrbtiQOlyp2Y2XFCZQmrcg2n/DeYNLk= +k8s.io/component-base v0.20.4/go.mod h1:t4p9EdiagbVCJKrQ1RsA5/V4rFQNDfRlevJajlGwgjI= +k8s.io/component-base v0.20.6/go.mod h1:6f1MPBAeI+mvuts3sIdtpjljHWBQ2cIy38oBIWMYnrM= k8s.io/component-base v0.21.0/go.mod h1:qvtjz6X0USWXbgmbfXR+Agik4RZ3jv2Bgr5QnZzdPYw= k8s.io/component-base v0.22.1 h1:SFqIXsEN3v3Kkr1bS6rstrs1wd45StJqbtgbQ4nRQdo= k8s.io/component-base v0.22.1/go.mod h1:0D+Bl8rrnsPN9v0dyYvkqFfBeAd4u7n77ze+p8CMiPo= k8s.io/component-helpers v0.21.0/go.mod h1:tezqefP7lxfvJyR+0a+6QtVrkZ/wIkyMLK4WcQ3Cj8U= +k8s.io/cri-api v0.17.3/go.mod h1:X1sbHmuXhwaHs9xxYffLqJogVsnI+f6cPRcgPel7ywM= +k8s.io/cri-api v0.20.1/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= +k8s.io/cri-api v0.20.4/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= +k8s.io/cri-api v0.20.6/go.mod h1:ew44AjNXwyn1s0U4xCKGodU7J1HzBeZ1MpGrpa5r8Yc= +k8s.io/csi-translation-lib v0.17.4/go.mod h1:CsxmjwxEI0tTNMzffIAcgR9lX4wOh6AKHdxQrT7L0oo= +k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/gengo v0.0.0-20190822140433-26a664648505/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20201214224949-b6c5ce23f027/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= +k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= +k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= +k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= +k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= +k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= k8s.io/klog/v2 v2.8.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= k8s.io/klog/v2 v2.9.0 h1:D7HV+n1V57XeZ0m6tdRkfknthUaM06VFbWldOFh8kzM= k8s.io/klog/v2 v2.9.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= -k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7 h1:vEx13qjvaZ4yfObSSXW7BrMc/KQBBT/Jyee8XtLf4x0= +k8s.io/kube-openapi v0.0.0-20180731170545-e3762e86a74c/go.mod h1:BXM9ceUBTj2QnfH2MK1odQs778ajze1RxcmP6S8RVVc= +k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= +k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7/go.mod h1:wXW5VT87nVfh/iLV8FpR2uDvrFyomxbtb1KivDbvPTE= +k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e h1:KLHHjkdQFomZy8+06csTWZ0m1343QqxZhR2LJ1OxCYM= +k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= k8s.io/kubectl v0.21.0 h1:WZXlnG/yjcE4LWO2g6ULjFxtzK6H1TKzsfaBFuVIhNg= k8s.io/kubectl v0.21.0/go.mod h1:EU37NukZRXn1TpAkMUoy8Z/B2u6wjHDS4aInsDzVvks= +k8s.io/kubernetes v1.11.10/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= +k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= +k8s.io/legacy-cloud-providers v0.17.4/go.mod h1:FikRNoD64ECjkxO36gkDgJeiQWwyZTuBkhu+yxOc1Js= k8s.io/metrics v0.21.0/go.mod h1:L3Ji9EGPP1YBbfm9sPfEXSpnj8i24bfQbAFAsW0NueQ= +k8s.io/utils v0.0.0-20191114184206-e782cd3c129f/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= k8s.io/utils v0.0.0-20210707171843-4b05e18ac7d9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= k8s.io/utils v0.0.0-20210802155522-efc7438f0176 h1:Mx0aa+SUAcNRQbs5jUzV8lkDlGFU8laZsY9jrcVX5SY= k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw= +modernc.org/golex v1.0.0/go.mod h1:b/QX9oBD/LhixY6NDh+IdGv17hgB+51fET1i2kPSmvk= +modernc.org/mathutil v1.0.0/go.mod h1:wU0vUrJsVWBZ4P6e7xtFJEhFSNsfRLJ8H458uRjg03k= +modernc.org/strutil v1.0.0/go.mod h1:lstksw84oURvj9y3tn8lGvRxyRC1S2+g5uuIzNfIOBs= +modernc.org/xc v1.0.0/go.mod h1:mRNCo0bvLjGhHO9WsyuKVU4q0ceiDDDoEeWDJHrNx8I= +mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc= +mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4= +mvdan.cc/unparam v0.0.0-20190720180237-d51796306d8f/go.mod h1:4G1h5nDURzA3bwVMZIVpwbkw+04kSxk3rAtzlimaUJw= +mvdan.cc/unparam v0.0.0-20200501210554-b37ab49443f7/go.mod h1:HGC5lll35J70Y5v7vCGb9oLhHoScFwkHDJm/05RdSTc= +oras.land/oras-go v0.4.0 h1:u6+7D+raZDYHwlz/uOwNANiRmyYDSSMW7A9E1xXycUQ= +oras.land/oras-go v0.4.0/go.mod h1:VJcU+VE4rkclUbum5C0O7deEZbBYnsnpbGSACwTjOcg= +pack.ag/amqp v0.11.2/go.mod h1:4/cbmt4EJXSKlG6LCfWHoqmN0uFdy5i/+YFz+fTfhV4= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/letsencrypt v0.0.3 h1:H7xDfhkaFFSYEJlKeq38RwX2jYcnTeHuDQyT+mMNMwM= rsc.io/letsencrypt v0.0.3/go.mod h1:buyQKZ6IXrRnB7TdkHP0RyEybLx18HHyOSoTyoOLqNY= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.14/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.22/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= sigs.k8s.io/controller-runtime v0.10.0 h1:HgyZmMpjUOrtkaFtCnfxsR1bGRuFoAczSNbn2MoKj5U= sigs.k8s.io/controller-runtime v0.10.0/go.mod h1:GCdh6kqV6IY4LK0JLwX0Zm6g233RtVGdb/f0+KSfprg= -sigs.k8s.io/kustomize/api v0.8.5 h1:bfCXGXDAbFbb/Jv5AhMj2BB8a5VAJuuQ5/KU69WtDjQ= sigs.k8s.io/kustomize/api v0.8.5/go.mod h1:M377apnKT5ZHJS++6H4rQoCHmWtt6qTpp3mbe7p6OLY= +sigs.k8s.io/kustomize/api v0.8.11 h1:LzQzlq6Z023b+mBtc6v72N2mSHYmN8x7ssgbf/hv0H8= +sigs.k8s.io/kustomize/api v0.8.11/go.mod h1:a77Ls36JdfCWojpUqR6m60pdGY1AYFix4AH83nJtY1g= sigs.k8s.io/kustomize/cmd/config v0.9.7/go.mod h1:MvXCpHs77cfyxRmCNUQjIqCmZyYsbn5PyQpWiq44nW0= sigs.k8s.io/kustomize/kustomize/v4 v4.0.5/go.mod h1:C7rYla7sI8EnxHE/xEhRBSHMNfcL91fx0uKmUlUhrBk= -sigs.k8s.io/kustomize/kyaml v0.10.15 h1:dSLgG78KyaxN4HylPXdK+7zB3k7sW6q3IcCmcfKA+aI= sigs.k8s.io/kustomize/kyaml v0.10.15/go.mod h1:mlQFagmkm1P+W4lZJbJ/yaxMd8PqMRSC4cPcfUVt5Hg= +sigs.k8s.io/kustomize/kyaml v0.11.0 h1:9KhiCPKaVyuPcgOLJXkvytOvjMJLoxpjodiycb4gHsA= +sigs.k8s.io/kustomize/kyaml v0.11.0/go.mod h1:GNMwjim4Ypgp/MueD3zXHLRJEjz7RvtPae0AwlvEMFM= +sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI= +sigs.k8s.io/structured-merge-diff v1.0.1-0.20191108220359-b1b620dd3f06 h1:zD2IemQ4LmOcAumeiyDWXKUI2SO0NYDe3H6QGvPOVgU= +sigs.k8s.io/structured-merge-diff v1.0.1-0.20191108220359-b1b620dd3f06/go.mod h1:/ULNhyfzRopfcjskuui0cTITekDduZ7ycKN3oUT9R18= sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.1.0 h1:C4r9BgJ98vrKnnVCjwCSXcWjWe0NKcUQkmzDXZXGwH8= +sigs.k8s.io/structured-merge-diff/v4 v4.0.3/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= sigs.k8s.io/structured-merge-diff/v4 v4.1.0/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= +sigs.k8s.io/structured-merge-diff/v4 v4.1.2 h1:Hr/htKFmJEbtMgS/UD0N+gtgctAqz81t3nu+sPzynno= +sigs.k8s.io/structured-merge-diff/v4 v4.1.2/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= -sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= +sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0= +sourcegraph.com/sqs/pbtypes v1.0.0/go.mod h1:3AciMUv4qUuRHRHhOG4TZOB+72GdPVz5k+c648qsFS4= diff --git a/pkg/microservice/aslan/config/consts.go b/pkg/microservice/aslan/config/consts.go index f6a1b9df4..363760937 100644 --- a/pkg/microservice/aslan/config/consts.go +++ b/pkg/microservice/aslan/config/consts.go @@ -119,6 +119,7 @@ const ( TaskBuild TaskType = "buildv2" TaskJenkinsBuild TaskType = "jenkins_build" TaskArtifact TaskType = "artifact" + TaskArtifactDeploy TaskType = "artifact_deploy" TaskDeploy TaskType = "deploy" TaskTestingV2 TaskType = "testingv2" TaskDistributeToS3 TaskType = "distribute2kodo" diff --git a/pkg/microservice/aslan/core/code/service/merge_request.go b/pkg/microservice/aslan/core/code/service/merge_request.go index 527bb06bc..fd5ca5544 100644 --- a/pkg/microservice/aslan/core/code/service/merge_request.go +++ b/pkg/microservice/aslan/core/code/service/merge_request.go @@ -19,6 +19,7 @@ package service import ( "context" + "github.com/google/go-github/v35/github" "go.uber.org/zap" "github.com/koderover/zadig/pkg/microservice/aslan/config" @@ -69,7 +70,9 @@ func CodeHostListPRs(codeHostID int, projectName, namespace, targetBr string, lo } else { // github gh := git.NewClient(ch.AccessToken, config.ProxyHTTPSAddr()) - pullRequests, err := gh.ListPullRequests(context.TODO(), namespace, projectName, nil) + pullRequests, err := gh.ListPullRequests(context.TODO(), namespace, projectName, &github.PullRequestListOptions{ + ListOptions: github.ListOptions{PerPage: 100}, + }) if err != nil { return nil, err } diff --git a/pkg/microservice/aslan/core/common/repository/models/build.go b/pkg/microservice/aslan/core/common/repository/models/build.go index e808b529a..c5288acc9 100644 --- a/pkg/microservice/aslan/core/common/repository/models/build.go +++ b/pkg/microservice/aslan/core/common/repository/models/build.go @@ -96,6 +96,12 @@ type DockerBuild struct { DockerFile string `bson:"docker_file" json:"docker_file"` // BuildArgs docker build args BuildArgs string `bson:"build_args,omitempty" json:"build_args"` + // Source whether dockerfile comes from template or existing file + Source string `bson:"source" json:"source"` + // TemplateId is the id of the template dockerfile + TemplateID string `bson:"template_id" json:"template_id"` + // TemplateName is the name of the template dockerfile + TemplateName string `bson:"template_name" json:"template_name"` } type JenkinsBuild struct { diff --git a/pkg/microservice/aslan/core/common/repository/models/private_key.go b/pkg/microservice/aslan/core/common/repository/models/private_key.go index f8e711bc4..c54b9c269 100644 --- a/pkg/microservice/aslan/core/common/repository/models/private_key.go +++ b/pkg/microservice/aslan/core/common/repository/models/private_key.go @@ -37,13 +37,3 @@ type PrivateKey struct { func (PrivateKey) TableName() string { return "private_key" } - -//type SSH struct { -// ID string `json:"id"` -// Name string `json:"name"` -// UserName string `json:"user_name"` -// IP string `json:"ip"` -// IsProd bool `json:"is_prod"` -// Label string `json:"label"` -// PrivateKey string `json:"private_key"` -//} diff --git a/pkg/microservice/aslan/core/common/repository/models/queue.go b/pkg/microservice/aslan/core/common/repository/models/queue.go index 20b458454..20922d121 100644 --- a/pkg/microservice/aslan/core/common/repository/models/queue.go +++ b/pkg/microservice/aslan/core/common/repository/models/queue.go @@ -109,7 +109,6 @@ type ServiceTaskArgs struct { } type ConfigPayload struct { - Aslan AslanConfig `json:"aslan"` Proxy Proxy `json:"proxy"` S3Storage S3Config `json:"s3_storage"` Github GithubConfig `json:"github"` @@ -162,15 +161,15 @@ type S3Config struct { type GithubConfig struct { // github API access token - AccessToken string + AccessToken string `json:"access_token"` // github ssh key with base64 encoded - SSHKey string + SSHKey string `json:"ssh_key"` // github knownhost - KnownHost string + KnownHost string `json:"known_host"` // github app private key - AppKey string + AppKey string `json:"app_key"` // gihhub app id - AppID int + AppID int `json:"app_id"` } type GitlabConfig struct { diff --git a/pkg/microservice/aslan/core/common/repository/models/s3.go b/pkg/microservice/aslan/core/common/repository/models/s3.go index 23a2be10e..c0381b275 100644 --- a/pkg/microservice/aslan/core/common/repository/models/s3.go +++ b/pkg/microservice/aslan/core/common/repository/models/s3.go @@ -35,6 +35,14 @@ type S3Storage struct { Provider int8 `bson:"provider" json:"provider"` } +type TarInfo struct { + URL string `bson:"url" json:"url"` + Name string `bson:"name" json:"name"` + WorkflowName string `bson:"workflow_name" json:"workflow_name"` + TaskID int64 `bson:"task_id" json:"task_id"` + FileName string `bson:"file_name" json:"file_name"` +} + func (s S3Storage) TableName() string { return "s3storage" } diff --git a/pkg/microservice/aslan/core/common/repository/models/service.go b/pkg/microservice/aslan/core/common/repository/models/service.go index 3c1e83684..8e2ae751e 100644 --- a/pkg/microservice/aslan/core/common/repository/models/service.go +++ b/pkg/microservice/aslan/core/common/repository/models/service.go @@ -16,6 +16,10 @@ limitations under the License. package models +import ( + templatemodels "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/models/template" +) + // TODO: move Revision out of Service. // Service : service template struct @@ -57,9 +61,27 @@ type Service struct { BranchName string `bson:"branch_name,omitempty" json:"branch_name,omitempty"` LoadPath string `bson:"load_path,omitempty" json:"load_path,omitempty"` LoadFromDir bool `bson:"is_dir,omitempty" json:"is_dir,omitempty"` + CreateFrom interface{} `bson:"create_from,omitempty" json:"create_from,omitempty"` HealthChecks []*PmHealthCheck `bson:"health_checks,omitempty" json:"health_checks,omitempty"` WorkloadType string `bson:"workload_type,omitempty" json:"workload_type,omitempty"` EnvName string `bson:"env_name,omitempty" json:"env_name,omitempty"` + TemplateID string `bson:"template_id,omitempty" json:"template_id,omitempty"` +} + +type CreateFromRepo struct { + GitRepoConfig *templatemodels.GitRepoConfig `bson:"git_repo_config,omitempty" json:"git_repo_config,omitempty"` + LoadPath string `bson:"load_path,omitempty" json:"load_path,omitempty"` +} + +type CreateFromPublicRepo struct { + RepoLink string `bson:"repo_link" json:"repo_link"` + LoadPath string `bson:"load_path,omitempty" json:"load_path,omitempty"` +} + +type CreateFromChartTemplate struct { + YamlData *templatemodels.CustomYaml `bson:"yaml_data,omitempty" json:"yaml_data,omitempty"` + TemplateName string `bson:"template_name" json:"template_name"` + ServiceName string `bson:"service_name" json:"service_name"` } type GUIConfig struct { @@ -200,6 +222,7 @@ type EnvStatus struct { type EnvConfig struct { EnvName string `bson:"env_name,omitempty" json:"env_name"` HostIDs []string `bson:"host_ids,omitempty" json:"host_ids"` + Labels []string `bson:"labels,omitempty" json:"labels"` } type PmHealthCheck struct { diff --git a/pkg/microservice/aslan/core/common/repository/models/task/build.go b/pkg/microservice/aslan/core/common/repository/models/task/build.go index 47f180749..c82112975 100644 --- a/pkg/microservice/aslan/core/common/repository/models/task/build.go +++ b/pkg/microservice/aslan/core/common/repository/models/task/build.go @@ -26,9 +26,10 @@ import ( ) type Build struct { - TaskType config.TaskType `bson:"type" json:"type"` - Enabled bool `bson:"enabled" json:"enabled"` - TaskStatus config.Status `bson:"status" json:"status"` + TaskType config.TaskType `bson:"type" json:"type"` + Enabled bool `bson:"enabled" json:"enabled"` + TaskStatus config.Status `bson:"status" json:"status"` + ProductName string `bson:"product_name" json:"product_name"` // 新增一个service表示服务名称 Service string `bson:"service" json:"service"` // 该名称实际为服务组件名称 @@ -56,7 +57,15 @@ type Build struct { BuildStatus *BuildStatus `bson:"build_status,omitempty" json:"build_status,omitempty"` IsRestart bool `bson:"is_restart" json:"is_restart"` // Get the host bound to the environment of the cloud host service configuration - EnvHostInfo map[string][]string `bson:"env_host_info,omitempty" json:"env_host_info,omitempty"` + EnvHostInfo map[string][]string `bson:"env_host_info,omitempty" json:"env_host_info,omitempty"` + ArtifactInfo *ArtifactInfo `bson:"artifact_info,omitempty" json:"artifact_info,omitempty"` +} + +type ArtifactInfo struct { + URL string `bson:"url" json:"url"` + WorkflowName string `bson:"workflow_name" json:"workflow_name"` + TaskID int64 `bson:"task_id" json:"task_id"` + FileName string `bson:"file_name" json:"file_name"` } //type Item struct { diff --git a/pkg/microservice/aslan/core/common/repository/models/task/docker_build.go b/pkg/microservice/aslan/core/common/repository/models/task/docker_build.go index fe6162731..8d334a4f8 100644 --- a/pkg/microservice/aslan/core/common/repository/models/task/docker_build.go +++ b/pkg/microservice/aslan/core/common/repository/models/task/docker_build.go @@ -54,6 +54,8 @@ func (db *DockerBuild) ToSubTask() (map[string]interface{}, error) { // DockerFile: dockerfile名称, 默认为Dockerfile // ImageBuild: build image镜像全称, e.g. xxx.com/release-candidates/image:tag type DockerBuildCtx struct { + Source string `yaml:"source" bson:"source" json:"source"` + TemplateID string `yaml:"template_id" bson:"template_id" json:"template_id"` WorkDir string `yaml:"work_dir" bson:"work_dir" json:"work_dir"` DockerFile string `yaml:"docker_file" bson:"docker_file" json:"docker_file"` ImageName string `yaml:"image_name" bson:"image_name" json:"image_name"` diff --git a/pkg/microservice/aslan/core/common/repository/models/template/product.go b/pkg/microservice/aslan/core/common/repository/models/template/product.go index 73d4cc953..f63570128 100644 --- a/pkg/microservice/aslan/core/common/repository/models/template/product.go +++ b/pkg/microservice/aslan/core/common/repository/models/template/product.go @@ -104,20 +104,20 @@ type GitRepoConfig struct { Branch string `bson:"branch,omitempty"` } -type OverrideYaml struct { +type CustomYaml struct { YamlSource string `bson:"yaml_source,omitempty" json:"yaml_source,omitempty"` YamlContent string `bson:"yaml_content,omitempty" json:"yaml_content,omitempty"` - GitRepoConfig *GitRepoConfig `bson:"git_repo_config,omitempty" json:"gitRepoConfig,omitempty"` + GitRepoConfig *GitRepoConfig `bson:"git_repo_config,omitempty" json:"git_repo_config,omitempty"` ValuesPaths []string `bson:"values_paths,omitempty" json:"values_paths,omitempty"` } // RenderChart ... type RenderChart struct { - ServiceName string `bson:"service_name,omitempty" json:"service_name,omitempty"` - ChartVersion string `bson:"chart_version,omitempty" json:"chart_version,omitempty"` - ValuesYaml string `bson:"values_yaml,omitempty" json:"values_yaml,omitempty"` - OverrideYaml *OverrideYaml `bson:"override_yaml,omitempty" json:"override_yaml,omitempty"` - OverrideValues string `bson:"override_values,omitempty" json:"override_values,omitempty"` + ServiceName string `bson:"service_name,omitempty" json:"service_name,omitempty"` + ChartVersion string `bson:"chart_version,omitempty" json:"chart_version,omitempty"` + ValuesYaml string `bson:"values_yaml,omitempty" json:"values_yaml,omitempty"` + OverrideYaml *CustomYaml `bson:"override_yaml,omitempty" json:"override_yaml,omitempty"` + OverrideValues string `bson:"override_values,omitempty" json:"override_values,omitempty"` } type ProductFeature struct { diff --git a/pkg/microservice/aslan/core/common/repository/models/workflow.go b/pkg/microservice/aslan/core/common/repository/models/workflow.go index 0eaa8dc82..86c7a1610 100644 --- a/pkg/microservice/aslan/core/common/repository/models/workflow.go +++ b/pkg/microservice/aslan/core/common/repository/models/workflow.go @@ -140,18 +140,19 @@ type WorkflowTaskArgs struct { ProductTmplName string `bson:"product_tmpl_name" json:"product_tmpl_name"` Description string `bson:"description,omitempty" json:"description,omitempty"` //为了兼容老数据,namespace可能会存多个环境名称,用逗号隔开 - Namespace string `bson:"namespace" json:"namespace"` - BaseNamespace string `bson:"base_namespace,omitempty" json:"base_namespace,omitempty"` - EnvRecyclePolicy string `bson:"env_recycle_policy,omitempty" json:"env_recycle_policy,omitempty"` - EnvUpdatePolicy string `bson:"env_update_policy,omitempty" json:"env_update_policy,omitempty"` - Target []*TargetArgs `bson:"targets" json:"targets"` - Artifact []*ArtifactArgs `bson:"artifact_args" json:"artifact_args"` - Tests []*TestArgs `bson:"tests" json:"tests"` - VersionArgs *VersionArgs `bson:"version_args,omitempty" json:"version_args,omitempty"` - ReqID string `bson:"req_id" json:"req_id"` - RegistryID string `bson:"registry_id,omitempty" json:"registry_id,omitempty"` - DistributeEnabled bool `bson:"distribute_enabled" json:"distribute_enabled"` - WorklowTaskCreator string `bson:"workflow_task_creator" json:"workflow_task_creator"` + Namespace string `bson:"namespace" json:"namespace"` + BaseNamespace string `bson:"base_namespace,omitempty" json:"base_namespace,omitempty"` + EnvRecyclePolicy string `bson:"env_recycle_policy,omitempty" json:"env_recycle_policy,omitempty"` + EnvUpdatePolicy string `bson:"env_update_policy,omitempty" json:"env_update_policy,omitempty"` + Target []*TargetArgs `bson:"targets" json:"targets"` + Artifact []*ArtifactArgs `bson:"artifact_args" json:"artifact_args"` + Tests []*TestArgs `bson:"tests" json:"tests"` + VersionArgs *VersionArgs `bson:"version_args,omitempty" json:"version_args,omitempty"` + ReqID string `bson:"req_id" json:"req_id"` + RegistryID string `bson:"registry_id,omitempty" json:"registry_id,omitempty"` + StorageID string `bson:"storage_id,omitempty" json:"storage_id,omitempty"` + DistributeEnabled bool `bson:"distribute_enabled" json:"distribute_enabled"` + WorkflowTaskCreator string `bson:"workflow_task_creator" json:"workflow_task_creator"` // Ignore docker build cache IgnoreCache bool `json:"ignore_cache" bson:"ignore_cache"` // Ignore workspace cache and reset volume @@ -339,10 +340,14 @@ type DeployEnv struct { } type ArtifactArgs struct { - Name string `bson:"name" json:"name"` - ServiceName string `bson:"service_name" json:"service_name"` - Image string `bson:"image" json:"image"` - Deploy []DeployEnv `bson:"deloy" json:"deploy"` + Name string `bson:"name" json:"name"` + ServiceName string `bson:"service_name" json:"service_name"` + Image string `bson:"image,omitempty" json:"image,omitempty"` + Deploy []DeployEnv `bson:"deploy" json:"deploy"` + WorkflowName string `bson:"workflow_name,omitempty" json:"workflow_name,omitempty"` + TaskID int64 `bson:"task_id,omitempty" json:"task_id,omitempty"` + FileName string `bson:"file_name,omitempty" json:"file_name,omitempty"` + URL string `bson:"url,omitempty" json:"url,omitempty"` } type VersionArgs struct { @@ -352,6 +357,20 @@ type VersionArgs struct { Labels []string `bson:"labels" json:"labels"` } +type BuildModuleArgs struct { + BuildName string + Target string + ServiceName string + ProductName string + Variables []*KeyVal + Env *Product + WorkflowName string + TaskID int64 + FileName string + URL string + TaskType string +} + func (Workflow) TableName() string { return "workflow" } diff --git a/pkg/microservice/aslan/core/common/repository/models/yaml_template.go b/pkg/microservice/aslan/core/common/repository/models/yaml_template.go new file mode 100644 index 000000000..34af08db1 --- /dev/null +++ b/pkg/microservice/aslan/core/common/repository/models/yaml_template.go @@ -0,0 +1,19 @@ +package models + +import "go.mongodb.org/mongo-driver/bson/primitive" + +type YamlTemplate struct { + ID primitive.ObjectID `bson:"_id,omitempty" json:"id,omitempty"` + Name string `bson:"name" json:"name"` + Content string `bson:"content" json:"content"` + Variables []*Variable `bson:"variables" json:"variables"` +} + +type Variable struct { + Key string `bson:"key" json:"key"` + Value string `bson:"value" json:"value"` +} + +func (YamlTemplate) TableName() string { + return "yaml_template" +} diff --git a/pkg/microservice/aslan/core/common/repository/mongodb/build.go b/pkg/microservice/aslan/core/common/repository/mongodb/build.go index a1402eaab..8dc74f0ce 100644 --- a/pkg/microservice/aslan/core/common/repository/mongodb/build.go +++ b/pkg/microservice/aslan/core/common/repository/mongodb/build.go @@ -266,3 +266,18 @@ func (c *BuildColl) DistinctTargets(excludeModule []string, productName string) return resp, err } + +func (c *BuildColl) GetDockerfileTemplateReference(templateID string) ([]*models.Build, error) { + ret := make([]*models.Build, 0) + query := bson.M{"post_build.docker_build.template_id": templateID} + + cursor, err := c.Collection.Find(context.TODO(), query) + if err != nil { + return nil, err + } + err = cursor.All(context.TODO(), &ret) + if err != nil { + return nil, err + } + return ret, nil +} diff --git a/pkg/microservice/aslan/core/common/repository/mongodb/delivery_artifact.go b/pkg/microservice/aslan/core/common/repository/mongodb/delivery_artifact.go index 85cfa6f67..e0e0cc75b 100644 --- a/pkg/microservice/aslan/core/common/repository/mongodb/delivery_artifact.go +++ b/pkg/microservice/aslan/core/common/repository/mongodb/delivery_artifact.go @@ -32,19 +32,20 @@ import ( ) type DeliveryArtifactArgs struct { - ID string `json:"id"` - Image string `json:"image"` - Name string `json:"name"` - Type string `json:"type"` - RepoName string `json:"repo_name"` - Branch string `json:"branch"` - Source string `json:"source"` - ImageHash string `json:"image_hash"` - ImageTag string `json:"image_tag"` - ImageDigest string `json:"image_digest"` - PerPage int `json:"per_page"` - Page int `json:"page"` - IsFuzzyQuery bool `json:"is_fuzzy_query"` + ID string `json:"id"` + Image string `json:"image"` + Name string `json:"name"` + Type string `json:"type"` + RepoName string `json:"repo_name"` + Branch string `json:"branch"` + Source string `json:"source"` + ImageHash string `json:"image_hash"` + ImageTag string `json:"image_tag"` + ImageDigest string `json:"image_digest"` + PerPage int `json:"per_page"` + Page int `json:"page"` + IsFuzzyQuery bool `json:"is_fuzzy_query"` + PackageStorageURI string `json:"package_storage_uri"` } type DeliveryArtifactColl struct { @@ -187,3 +188,40 @@ func (c *DeliveryArtifactColl) Update(args *DeliveryArtifactArgs) error { _, err := c.UpdateOne(context.TODO(), query, change, options.Update().SetUpsert(true)) return err } + +func (c *DeliveryArtifactColl) ListTars(args *DeliveryArtifactArgs) ([]*models.DeliveryArtifact, error) { + if args == nil { + return nil, errors.New("nil delivery_artifact args") + } + + resp := make([]*models.DeliveryArtifact, 0) + query := bson.M{} + if args.Name != "" { + query["name"] = args.Name + } + + if args.Type != "" { + query["type"] = args.Type + } + + if args.Source != "" { + query["source"] = args.Source + } + + if args.PackageStorageURI != "" { + query["package_storage_uri"] = args.PackageStorageURI + } + + opt := options.Find(). + SetSort(bson.D{{"created_time", -1}}) + + cursor, err := c.Collection.Find(context.TODO(), query, opt) + if err != nil { + return nil, err + } + err = cursor.All(context.TODO(), &resp) + if err != nil { + return nil, err + } + return resp, nil +} diff --git a/pkg/microservice/aslan/core/common/repository/mongodb/private_key.go b/pkg/microservice/aslan/core/common/repository/mongodb/private_key.go index 639b7b730..c2f97eb75 100644 --- a/pkg/microservice/aslan/core/common/repository/mongodb/private_key.go +++ b/pkg/microservice/aslan/core/common/repository/mongodb/private_key.go @@ -138,6 +138,7 @@ func (c *PrivateKeyColl) Update(id string, args *models.PrivateKey) error { "label": args.Label, "is_prod": args.IsProd, "private_key": args.PrivateKey, + "provider": args.Provider, "update_by": args.UpdateBy, "update_time": time.Now().Unix(), }} @@ -158,20 +159,39 @@ func (c *PrivateKeyColl) Delete(id string) error { return err } -func (c *PrivateKeyColl) ListHostIPByIDs(ids []string) ([]*models.PrivateKey, error) { +func (c *PrivateKeyColl) DeleteAll() error { + _, err := c.DeleteMany(context.TODO(), bson.M{}) + return err +} + +type ListHostIPArgs struct { + IDs []string `json:"ids"` + Labels []string `json:"labels"` +} + +func (c *PrivateKeyColl) ListHostIPByArgs(args *ListHostIPArgs) ([]*models.PrivateKey, error) { query := bson.M{} resp := make([]*models.PrivateKey, 0) ctx := context.Background() - var oids []primitive.ObjectID - for _, id := range ids { - oid, err := primitive.ObjectIDFromHex(id) - if err != nil { - return nil, err + if len(args.IDs) == 0 && len(args.Labels) == 0 { + return resp, nil + } + + if len(args.IDs) > 0 { + var oids []primitive.ObjectID + for _, id := range args.IDs { + oid, err := primitive.ObjectIDFromHex(id) + if err != nil { + return nil, err + } + oids = append(oids, oid) } - oids = append(oids, oid) + query["_id"] = bson.M{"$in": oids} + } else if len(args.Labels) > 0 { + query["label"] = bson.M{"$in": args.Labels} } - query["_id"] = bson.M{"$in": oids} + opt := options.Find() selector := bson.D{ {"ip", 1}, @@ -189,3 +209,22 @@ func (c *PrivateKeyColl) ListHostIPByIDs(ids []string) ([]*models.PrivateKey, er return resp, err } + +// DistinctLabels returns distinct label +func (c *PrivateKeyColl) DistinctLabels() ([]string, error) { + var resp []string + query := bson.M{} + ctx := context.Background() + labels, err := c.Collection.Distinct(ctx, "label", query) + + for _, labelInter := range labels { + if label, ok := labelInter.(string); ok { + if label == "" { + continue + } + resp = append(resp, label) + } + } + + return resp, err +} diff --git a/pkg/microservice/aslan/core/common/repository/mongodb/service.go b/pkg/microservice/aslan/core/common/repository/mongodb/service.go index 93dcba901..26bd34d25 100644 --- a/pkg/microservice/aslan/core/common/repository/mongodb/service.go +++ b/pkg/microservice/aslan/core/common/repository/mongodb/service.go @@ -204,15 +204,14 @@ func (c *ServiceColl) Find(opt *ServiceFindOption) (*models.Service, error) { if opt.ServiceName == "" { return nil, fmt.Errorf("ServiceName is empty") } - if opt.ProductName == "" { - return nil, fmt.Errorf("ProductName is empty") - } query := bson.M{} query["service_name"] = opt.ServiceName - query["product_name"] = opt.ProductName - service := new(models.Service) + if opt.ProductName != "" { + query["product_name"] = opt.ProductName + } + service := new(models.Service) if opt.Type != "" { query["type"] = opt.Type } @@ -457,6 +456,15 @@ func (c *ServiceColl) Count(productName string) (int, error) { return cs[0].Count, nil } +func (c *ServiceColl) GetTemplateReference(templateID string) ([]*models.Service, error) { + query := bson.M{ + "template_id": templateID, + "status": bson.M{"$ne": setting.ProductStatusDeleting}, + } + + return c.listMaxRevisions(query, nil) +} + func (c *ServiceColl) listMaxRevisions(preMatch, postMatch bson.M) ([]*models.Service, error) { var pipeResp []*grouped pipeline := []bson.M{ diff --git a/pkg/microservice/aslan/core/common/repository/mongodb/yaml_template.go b/pkg/microservice/aslan/core/common/repository/mongodb/yaml_template.go new file mode 100644 index 000000000..9d65e08ba --- /dev/null +++ b/pkg/microservice/aslan/core/common/repository/mongodb/yaml_template.go @@ -0,0 +1,116 @@ +package mongodb + +import ( + "context" + "fmt" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/bson/primitive" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" + + "github.com/koderover/zadig/pkg/microservice/aslan/config" + "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/models" + mongotool "github.com/koderover/zadig/pkg/tool/mongo" +) + +type YamlTemplateColl struct { + *mongo.Collection + + coll string +} + +func NewYamlTemplateColl() *YamlTemplateColl { + name := models.YamlTemplate{}.TableName() + return &YamlTemplateColl{ + Collection: mongotool.Database(config.MongoDatabase()).Collection(name), + coll: name, + } +} + +func (c *YamlTemplateColl) GetCollectionName() string { + return c.coll +} + +func (c *YamlTemplateColl) EnsureIndex(ctx context.Context) error { + mod := mongo.IndexModel{ + Keys: bson.M{"name": 1}, + Options: options.Index().SetUnique(true), + } + + _, err := c.Indexes().CreateOne(ctx, mod) + + return err +} + +func (c *YamlTemplateColl) Create(obj *models.YamlTemplate) error { + if obj == nil { + return fmt.Errorf("nil object") + } + + _, err := c.InsertOne(context.TODO(), obj) + return err +} + +func (c *YamlTemplateColl) Update(idString string, obj *models.YamlTemplate) error { + if obj == nil { + return fmt.Errorf("nil object") + } + id, err := primitive.ObjectIDFromHex(idString) + if err != nil { + return fmt.Errorf("invalid id") + } + filter := bson.M{"_id": id} + update := bson.M{"$set": obj} + + _, err = c.UpdateOne(context.TODO(), filter, update) + return err +} + +func (c *YamlTemplateColl) List(pageNum, pageSize int) ([]*models.YamlTemplate, int, error) { + resp := make([]*models.YamlTemplate, 0) + query := bson.M{} + count, err := c.CountDocuments(context.TODO(), query) + if err != nil { + return nil, 0, err + } + opt := options.Find(). + SetSkip(int64((pageNum - 1) * pageSize)). + SetLimit(int64(pageSize)) + + cursor, err := c.Collection.Find(context.TODO(), query, opt) + if err != nil { + return nil, 0, err + } + err = cursor.All(context.TODO(), &resp) + if err != nil { + return nil, 0, err + } + return resp, int(count), nil +} + +func (c *YamlTemplateColl) GetById(idstring string) (*models.YamlTemplate, error) { + resp := new(models.YamlTemplate) + id, err := primitive.ObjectIDFromHex(idstring) + if err != nil { + return nil, err + } + query := bson.M{"_id": id} + + err = c.FindOne(context.TODO(), query).Decode(&resp) + if err != nil { + return nil, err + } + return resp, nil +} + +func (c *YamlTemplateColl) DeleteByID(idstring string) error { + id, err := primitive.ObjectIDFromHex(idstring) + if err != nil { + return err + } + query := bson.M{"_id": id} + + _, err = c.DeleteOne(context.TODO(), query) + return err +} diff --git a/pkg/microservice/aslan/core/common/service/environment.go b/pkg/microservice/aslan/core/common/service/environment.go index 3844e98b1..bb0e0d964 100644 --- a/pkg/microservice/aslan/core/common/service/environment.go +++ b/pkg/microservice/aslan/core/common/service/environment.go @@ -24,6 +24,7 @@ import ( "go.uber.org/zap" corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/util/sets" "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/models" @@ -186,13 +187,14 @@ func (f *workloadFilter) Match(workload *Workload) bool { } type Workload struct { - EnvName string `json:"env_name"` - Name string `json:"name"` - Type string `json:"type"` - ProductName string `json:"product_name"` - Spec corev1.ServiceSpec `json:"-"` - Images []string `json:"-"` - Ready bool + EnvName string `json:"env_name"` + Name string `json:"name"` + Type string `json:"type"` + ProductName string `json:"product_name"` + Spec corev1.PodTemplateSpec `json:"-"` + Images []string `json:"-"` + Ready bool `json:"ready"` + ServiceName string `json:"service_name"` } func ListWorkloads(envName, clusterID, namespace, productName string, perPage, page int, log *zap.SugaredLogger, filter ...FilterFunc) (int, []*ServiceResp, error) { @@ -212,7 +214,7 @@ func ListWorkloads(envName, clusterID, namespace, productName string, perPage, p return 0, resp, e.ErrListGroups.AddDesc(err.Error()) } for _, v := range listDeployments { - workLoads = append(workLoads, &Workload{Name: v.Name, Spec: corev1.ServiceSpec{Selector: v.Spec.Selector.MatchLabels}, Type: setting.Deployment, Images: wrapper.Deployment(v).ImageInfos(), Ready: wrapper.Deployment(v).Ready()}) + workLoads = append(workLoads, &Workload{Name: v.Name, Spec: v.Spec.Template, Type: setting.Deployment, Images: wrapper.Deployment(v).ImageInfos(), Ready: wrapper.Deployment(v).Ready()}) } statefulSets, err := getter.ListStatefulSets(namespace, nil, kubeClient) if err != nil { @@ -220,7 +222,7 @@ func ListWorkloads(envName, clusterID, namespace, productName string, perPage, p return 0, resp, e.ErrListGroups.AddDesc(err.Error()) } for _, v := range statefulSets { - workLoads = append(workLoads, &Workload{Name: v.Name, Spec: corev1.ServiceSpec{Selector: v.Spec.Selector.MatchLabels}, Type: setting.StatefulSet, Images: wrapper.StatefulSet(v).ImageInfos(), Ready: wrapper.StatefulSet(v).Ready()}) + workLoads = append(workLoads, &Workload{Name: v.Name, Spec: v.Spec.Template, Type: setting.StatefulSet, Images: wrapper.StatefulSet(v).ImageInfos(), Ready: wrapper.StatefulSet(v).Ready()}) } log.Debugf("Found %d workloads in total", len(workLoads)) @@ -249,6 +251,20 @@ func ListWorkloads(envName, clusterID, namespace, productName string, perPage, p } } + hostInfos := make([]resource.HostInfo, 0) + // get all ingresses + if ingresses, err := getter.ListIngresses(namespace, nil, kubeClient); err == nil { + for _, ingress := range ingresses { + hostInfos = append(hostInfos, wrapper.Ingress(ingress).HostInfo()...) + } + } + + // get all services + allServices, err := getter.ListServices(namespace, nil, kubeClient) + if err != nil { + log.Errorf("[%s][%s] list service error: %s", envName, namespace, err) + } + for _, workload := range workLoads { tmpProductName := workload.ProductName if tmpProductName == "" && productName != "" { @@ -268,10 +284,45 @@ func ListWorkloads(envName, clusterID, namespace, productName string, perPage, p productRespInfo.Status = setting.PodUnstable productRespInfo.Ready = setting.PodNotReady } + + productRespInfo.Ingress = &IngressInfo{ + HostInfo: findServiceFromIngress(hostInfos, workload, allServices), + } + resp = append(resp, productRespInfo) } - log.Infof("Finish to list workloads in namespace %s", namespace) return count, resp, nil } + +func findServiceFromIngress(hostInfos []resource.HostInfo, currentWorkload *Workload, allServices []*corev1.Service) []resource.HostInfo { + if len(allServices) == 0 || len(hostInfos) == 0 { + return []resource.HostInfo{} + } + serviceName := "" + podLabels := labels.Set(currentWorkload.Spec.Labels) + for _, svc := range allServices { + if len(svc.Spec.Selector) == 0 { + continue + } + if labels.SelectorFromValidatedSet(svc.Spec.Selector).Matches(podLabels) { + serviceName = svc.Name + break + } + } + if serviceName == "" { + return []resource.HostInfo{} + } + + resp := make([]resource.HostInfo, 0) + for _, hostInfo := range hostInfos { + for _, backend := range hostInfo.Backends { + if backend.ServiceName == serviceName { + resp = append(resp, hostInfo) + break + } + } + } + return resp +} diff --git a/pkg/microservice/aslan/core/common/service/gitlab/webhook.go b/pkg/microservice/aslan/core/common/service/gitlab/webhook.go index 677f225e4..cf6f76736 100644 --- a/pkg/microservice/aslan/core/common/service/gitlab/webhook.go +++ b/pkg/microservice/aslan/core/common/service/gitlab/webhook.go @@ -30,8 +30,11 @@ func (c *Client) CreateWebHook(owner, repo string) (string, error) { Secret: gitservice.GetHookSecret(), Events: []string{git.PushEvent, git.PullRequestEvent, git.BranchOrTagCreateEvent}, }) + if err != nil { + return "", err + } - return strconv.Itoa(projectHook.ID), err + return strconv.Itoa(projectHook.ID), nil } func (c *Client) DeleteWebHook(owner, repo, hookID string) error { diff --git a/pkg/microservice/aslan/core/common/service/render.go b/pkg/microservice/aslan/core/common/service/render.go index 110d42491..3552b1e1b 100644 --- a/pkg/microservice/aslan/core/common/service/render.go +++ b/pkg/microservice/aslan/core/common/service/render.go @@ -83,15 +83,15 @@ func (args *RenderChartArg) fromOverrideValueString(valueStr string) { } } -func (args *RenderChartArg) toCustomValuesYaml() *templatemodels.OverrideYaml { +func (args *RenderChartArg) toCustomValuesYaml() *templatemodels.CustomYaml { switch args.YamlSource { case setting.ValuesYamlSourceFreeEdit: - return &templatemodels.OverrideYaml{ + return &templatemodels.CustomYaml{ YamlSource: args.YamlSource, YamlContent: args.ValuesYAML, } case setting.ValuesYamlSourceGitRepo: - return &templatemodels.OverrideYaml{ + return &templatemodels.CustomYaml{ YamlSource: args.YamlSource, YamlContent: args.ValuesYAML, ValuesPaths: args.GitRepoConfig.ValuesPaths, @@ -106,7 +106,7 @@ func (args *RenderChartArg) toCustomValuesYaml() *templatemodels.OverrideYaml { return nil } -func (args *RenderChartArg) fromCustomValueYaml(customValuesYaml *templatemodels.OverrideYaml) { +func (args *RenderChartArg) fromCustomValueYaml(customValuesYaml *templatemodels.CustomYaml) { if customValuesYaml == nil { return } diff --git a/pkg/microservice/aslan/core/common/service/service.go b/pkg/microservice/aslan/core/common/service/service.go index 0e5f52896..6421572de 100644 --- a/pkg/microservice/aslan/core/common/service/service.go +++ b/pkg/microservice/aslan/core/common/service/service.go @@ -479,10 +479,14 @@ func DeleteServiceWebhookByName(serviceName, productName string, logger *zap.Sug } func ProcessServiceWebhook(updated, current *commonmodels.Service, serviceName string, logger *zap.SugaredLogger) { + // helm service doesn't support webhook + if current != nil && current.Type == setting.HelmDeployType { + return + } var action string var updatedHooks, currentHooks []*webhook.WebHook if updated != nil { - if updated.Source == setting.SourceFromZadig || updated.Source == setting.SourceFromGerrit || updated.Source == "" || updated.Source == setting.SourceFromExternal { + if updated.Source == setting.ServiceSourceTemplate || updated.Source == setting.SourceFromZadig || updated.Source == setting.SourceFromGerrit || updated.Source == "" || updated.Source == setting.SourceFromExternal { return } action = "add" @@ -493,7 +497,7 @@ func ProcessServiceWebhook(updated, current *commonmodels.Service, serviceName s updatedHooks = append(updatedHooks, &webhook.WebHook{Owner: updated.RepoOwner, Repo: updated.RepoName, Address: address, Name: "trigger", CodeHostID: updated.CodehostID}) } if current != nil { - if current.Source == setting.SourceFromZadig || current.Source == setting.SourceFromGerrit || current.Source == "" || current.Source == setting.SourceFromExternal { + if current.Source == setting.ServiceSourceTemplate || current.Source == setting.SourceFromZadig || current.Source == setting.SourceFromGerrit || current.Source == "" || current.Source == setting.SourceFromExternal { return } action = "remove" diff --git a/pkg/microservice/aslan/core/environment/service/environment.go b/pkg/microservice/aslan/core/environment/service/environment.go index 0c904e674..5f542f97c 100644 --- a/pkg/microservice/aslan/core/environment/service/environment.go +++ b/pkg/microservice/aslan/core/environment/service/environment.go @@ -57,6 +57,7 @@ import ( "github.com/koderover/zadig/pkg/tool/kube/getter" "github.com/koderover/zadig/pkg/tool/kube/serializer" "github.com/koderover/zadig/pkg/tool/kube/updater" + "github.com/koderover/zadig/pkg/tool/log" "github.com/koderover/zadig/pkg/util" "github.com/koderover/zadig/pkg/util/converter" "github.com/koderover/zadig/pkg/util/fs" @@ -1484,26 +1485,36 @@ func upsertService(isUpdate bool, env *commonmodels.Product, u.SetAPIVersion(setting.APIVersionAppsV1) u.SetLabels(kube.MergeLabels(labels, u.GetLabels())) - podLabels, _, _ := unstructured.NestedStringMap(u.Object, "spec", "template", "metadata", "labels") - err := unstructured.SetNestedStringMap(u.Object, kube.MergeLabels(labels, podLabels), "spec", "template", "metadata", "labels") + podLabels, _, err := unstructured.NestedStringMap(u.Object, "spec", "template", "metadata", "labels") if err != nil { - // should not have happened - panic(err) + podLabels = nil + } + err = unstructured.SetNestedStringMap(u.Object, kube.MergeLabels(labels, podLabels), "spec", "template", "metadata", "labels") + if err != nil { + log.Errorf("merge label failed err:%s", err) + u.Object = setFieldValueIsNotExist(u.Object, kube.MergeLabels(labels, podLabels), "spec", "template", "metadata", "labels") } - podAnnotations, _, _ := unstructured.NestedStringMap(u.Object, "spec", "template", "metadata", "annotations") + podAnnotations, _, err := unstructured.NestedStringMap(u.Object, "spec", "template", "metadata", "annotations") + if err != nil { + podAnnotations = nil + } err = unstructured.SetNestedStringMap(u.Object, applyUpdatedAnnotations(podAnnotations), "spec", "template", "metadata", "annotations") if err != nil { - // should not have happened - panic(err) + log.Errorf("merge annotation failed err:%s", err) + u.Object = setFieldValueIsNotExist(u.Object, applyUpdatedAnnotations(podAnnotations), "spec", "template", "metadata", "annotations") } // Inject selector: s-product and s-service - selector, _, _ := unstructured.NestedStringMap(u.Object, "spec", "selector", "matchLabels") + selector, _, err := unstructured.NestedStringMap(u.Object, "spec", "selector", "matchLabels") + if err != nil { + selector = nil + } + err = unstructured.SetNestedStringMap(u.Object, kube.MergeLabels(labels, selector), "spec", "selector", "matchLabels") if err != nil { - // should not have happened - panic(err) + log.Errorf("merge selector failed err:%s", err) + u.Object = setFieldValueIsNotExist(u.Object, kube.MergeLabels(labels, selector), "spec", "selector", "matchLabels") } jsonData, err := u.MarshalJSON() @@ -2019,7 +2030,49 @@ func FindHelmRenderSet(productName, renderName string, log *zap.SugaredLogger) ( return resp, nil } -func installOrUpdateHelmChart(user, envName, requestID string, args *commonmodels.Product, eventStart int64, helmClient helmclient.Client, log *zap.SugaredLogger) { +func installOrUpgradeHelmChart(namespace string, renderChart *template.RenderChart, serviceObj *commonmodels.Service, timeout time.Duration, helmClient helmclient.Client) error { + mergedValuesYaml, err := helmtool.MergeOverrideValues(renderChart.ValuesYaml, renderChart.GetOverrideYaml(), renderChart.OverrideValues) + if err != nil { + err = errors.WithMessagef(err, "failed to merge override yaml %s and values %s", renderChart.GetOverrideYaml(), renderChart.OverrideValues) + return err + } + return installOrUpgradeHelmChartWithValues(namespace, mergedValuesYaml, renderChart, serviceObj, timeout, helmClient) +} + +func installOrUpgradeHelmChartWithValues(namespace, valuesYaml string, renderChart *template.RenderChart, serviceObj *commonmodels.Service, timeout time.Duration, helmClient helmclient.Client) error { + base := config.LocalServicePath(serviceObj.ProductName, serviceObj.ServiceName) + if err := commonservice.PreLoadServiceManifests(base, serviceObj); err != nil { + log.Errorf("Failed to load manifest for service %s in project %s, err: %s", serviceObj.ServiceName, serviceObj.ProductName, err) + return err + } + + chartFullPath := filepath.Join(base, serviceObj.ServiceName) + chartPath, err := fs.RelativeToCurrentPath(chartFullPath) + if err != nil { + log.Errorf("Failed to get relative path %s, err: %s", chartFullPath, err) + return err + } + + chartSpec := &helmclient.ChartSpec{ + ReleaseName: util.GeneHelmReleaseName(namespace, serviceObj.ServiceName), + ChartName: chartPath, + Namespace: namespace, + Version: renderChart.ChartVersion, + ValuesYaml: valuesYaml, + UpgradeCRDs: true, + } + if timeout > 0 { + chartSpec.Wait = true + chartSpec.Timeout = timeout + } + + if _, err = helmClient.InstallOrUpgradeChart(context.TODO(), chartSpec); err != nil { + return err + } + return nil +} + +func installProductHelmCharts(user, envName, requestID string, args *commonmodels.Product, eventStart int64, helmClient helmclient.Client, log *zap.SugaredLogger) { var ( err error wg sync.WaitGroup @@ -2077,45 +2130,8 @@ func installOrUpdateHelmChart(user, envName, requestID string, args *commonmodel return } - base := config.LocalServicePath(service.ProductName, service.ServiceName) - if err = commonservice.PreLoadServiceManifests(base, serviceObj); err != nil { - log.Errorf("Failed to load service menifests for service %s in project %s, err: %s", service.ServiceName, service.ProductName, err) - errList = multierror.Append(errList, err) - return - } - - chartFullPath := filepath.Join(base, service.ServiceName) - chartPath, err := fs.RelativeToCurrentPath(chartFullPath) + err = installOrUpgradeHelmChart(args.Namespace, renderChart, serviceObj, Timeout*time.Second*10, helmClient) if err != nil { - log.Errorf("Failed to get relative path %s, err: %s", chartFullPath, err) - errList = multierror.Append(errList, err) - return - } - - mergedValuesYaml, err := helmtool.MergeOverrideValues(renderChart.ValuesYaml, renderChart.GetOverrideYaml(), renderChart.OverrideValues) - if err != nil { - err = errors.WithMessagef( - err, - "failed to merge override yaml %s and values %s", - renderChart.GetOverrideYaml(), - renderChart.OverrideValues, - ) - errList = multierror.Append(errList, err) - return - } - - chartSpec := &helmclient.ChartSpec{ - ReleaseName: util.GeneHelmReleaseName(args.Namespace, service.ServiceName), - ChartName: chartPath, - Namespace: args.Namespace, - Wait: true, - Version: renderChart.ChartVersion, - ValuesYaml: mergedValuesYaml, - UpgradeCRDs: true, - Timeout: Timeout * time.Second * 10, - } - - if _, err = helmClient.InstallOrUpgradeChart(context.TODO(), chartSpec); err != nil { errList = multierror.Append(errList, err) return } @@ -2238,6 +2254,14 @@ func updateProductGroup(productName, envName, updateType string, productResp *co return e.ErrUpdateEnv.AddDesc("对比环境中的value.yaml和系统默认的value.yaml失败") } + svcNameSet := sets.NewString() + for _, singleChart := range overrideCharts { + if singleChart.EnvName != envName { + continue + } + svcNameSet.Insert(singleChart.ServiceName) + } + for _, renderChart := range renderSet.ChartInfos { renderChartMap[renderChart.ServiceName] = renderChart } @@ -2251,6 +2275,11 @@ func updateProductGroup(productName, envName, updateType string, productResp *co continue } + // service is not in update list + if !svcNameSet.Has(svc.ServiceName) { + continue + } + wg.Add(1) go func(service *commonmodels.ProductService) { defer wg.Done() @@ -2269,48 +2298,11 @@ func updateProductGroup(productName, envName, updateType string, productResp *co return } - base := config.LocalServicePath(service.ProductName, service.ServiceName) - if err = commonservice.PreLoadServiceManifests(base, serviceObj); err != nil { - log.Errorf("Failed to load service menifests for service %s in project %s, err: %s", service.ServiceName, service.ProductName, err) - errList = multierror.Append(errList, err) - return - } - - chartFullPath := filepath.Join(base, service.ServiceName) - chartPath, err := fs.RelativeToCurrentPath(chartFullPath) - if err != nil { - log.Errorf("Failed to get relative path %s, err: %s", chartFullPath, err) - errList = multierror.Append(errList, err) - return - } - - mergedValuesYaml, err := helmtool.MergeOverrideValues(renderChart.ValuesYaml, renderChart.GetOverrideYaml(), renderChart.OverrideValues) + err = installOrUpgradeHelmChart(productResp.Namespace, renderChart, serviceObj, Timeout*time.Second*10, helmClient) if err != nil { - err = errors.WithMessagef( - err, - "failed to merge override yaml %s and values %s", - renderChart.GetOverrideYaml(), - renderChart.OverrideValues, - ) errList = multierror.Append(errList, err) return } - - chartSpec := helmclient.ChartSpec{ - ReleaseName: util.GeneHelmReleaseName(productResp.Namespace, service.ServiceName), - ChartName: chartPath, - Namespace: productResp.Namespace, - Wait: true, - Version: renderChart.ChartVersion, - ValuesYaml: mergedValuesYaml, - UpgradeCRDs: true, - Timeout: Timeout * time.Second * 10, - } - - if _, err = helmClient.InstallOrUpgradeChart(context.TODO(), &chartSpec); err != nil { - log.Errorf("install helm chart %s error :%+v", chartSpec.ReleaseName, err) - errList = multierror.Append(errList, err) - } }(svc) } @@ -2522,48 +2514,11 @@ func updateProductVariable(productName, envName string, productResp *commonmodel go func(tmpRenderChart *template.RenderChart, currentService *commonmodels.Service) { defer wg.Done() - base := config.LocalServicePath(currentService.ProductName, currentService.ServiceName) - if err = commonservice.PreLoadServiceManifests(base, currentService); err != nil { - log.Errorf("Failed to load service menifests for service %s in project %s, err: %s", currentService.ServiceName, currentService.ProductName, err) - errList = multierror.Append(errList, err) - return - } - - chartFullPath := filepath.Join(base, currentService.ServiceName) - chartPath, err := fs.RelativeToCurrentPath(chartFullPath) - if err != nil { - log.Errorf("Failed to get relative path %s, err: %s", chartFullPath, err) - errList = multierror.Append(errList, err) - return - } - - mergedValuesYaml, err := helmtool.MergeOverrideValues(tmpRenderChart.ValuesYaml, tmpRenderChart.GetOverrideYaml(), tmpRenderChart.OverrideValues) + err = installOrUpgradeHelmChart(productResp.Namespace, renderChart, currentService, Timeout*time.Second*10, helmClient) if err != nil { - err = errors.WithMessagef( - err, - "failed to merge override yaml %s and values %s", - tmpRenderChart.GetOverrideYaml(), - tmpRenderChart.OverrideValues, - ) errList = multierror.Append(errList, err) return } - - chartSpec := helmclient.ChartSpec{ - ReleaseName: util.GeneHelmReleaseName(productResp.Namespace, tmpRenderChart.ServiceName), - ChartName: chartPath, - Namespace: productResp.Namespace, - Wait: true, - Version: tmpRenderChart.ChartVersion, - ValuesYaml: mergedValuesYaml, - UpgradeCRDs: true, - Atomic: true, - Timeout: Timeout * time.Second * 10, - } - if _, err = helmClient.InstallOrUpgradeChart(context.TODO(), &chartSpec); err != nil { - errList = multierror.Append(errList, err) - log.Errorf("install helm chart error :%+v", err) - } }(renderChart, serviceObj) } groupServices = append(groupServices, service) @@ -2580,3 +2535,20 @@ func updateProductVariable(productName, envName string, productResp *commonmodel } return errList.ErrorOrNil() } + +func setFieldValueIsNotExist(obj map[string]interface{}, value interface{}, fields ...string) map[string]interface{} { + m := obj + for _, field := range fields[:len(fields)-1] { + if val, ok := m[field]; ok { + if valMap, ok := val.(map[string]interface{}); ok { + m = valMap + } else { + newVal := make(map[string]interface{}) + m[field] = newVal + m = newVal + } + } + } + m[fields[len(fields)-1]] = value + return obj +} diff --git a/pkg/microservice/aslan/core/environment/service/environment_creator.go b/pkg/microservice/aslan/core/environment/service/environment_creator.go index cbf8d2cee..45a58c968 100644 --- a/pkg/microservice/aslan/core/environment/service/environment_creator.go +++ b/pkg/microservice/aslan/core/environment/service/environment_creator.go @@ -217,7 +217,7 @@ func (creator *HelmProductCreator) Create(user, requestID string, args *models.P eventStart := time.Now().Unix() - go installOrUpdateHelmChart(user, args.EnvName, requestID, args, eventStart, helmClient, log) + go installProductHelmCharts(user, args.EnvName, requestID, args, eventStart, helmClient, log) return nil } diff --git a/pkg/microservice/aslan/core/environment/service/image.go b/pkg/microservice/aslan/core/environment/service/image.go index 4f8705dad..34589fe24 100644 --- a/pkg/microservice/aslan/core/environment/service/image.go +++ b/pkg/microservice/aslan/core/environment/service/image.go @@ -19,20 +19,33 @@ package service import ( "bytes" "fmt" + "regexp" "strings" "time" + helmclient "github.com/mittwald/go-helm-client" "go.uber.org/zap" "helm.sh/helm/v3/pkg/strvals" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/client-go/rest" + "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/yaml" + "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/models" + templatemodels "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/models/template" commonrepo "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/mongodb" commonservice "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service" "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/kube" "github.com/koderover/zadig/pkg/setting" e "github.com/koderover/zadig/pkg/tool/errors" + helmtool "github.com/koderover/zadig/pkg/tool/helmclient" + "github.com/koderover/zadig/pkg/tool/kube/getter" "github.com/koderover/zadig/pkg/tool/kube/updater" + "github.com/koderover/zadig/pkg/tool/log" + "github.com/koderover/zadig/pkg/util" "github.com/koderover/zadig/pkg/util/converter" + yamlutil "github.com/koderover/zadig/pkg/util/yaml" ) type UpdateContainerImageArgs struct { @@ -45,6 +58,262 @@ type UpdateContainerImageArgs struct { Image string `json:"image"` } +const ( + imageUrlParseRegexString = `(?P.+/)?(?P[^:]+){1}(:)?(?P.+)?` +) + +var ( + imageParseRegex = regexp.MustCompile(imageUrlParseRegexString) +) + +func getHelmServiceName(namespace, resType, resName string, kubeClient client.Client) (string, error) { + res := &unstructured.Unstructured{} + res.SetGroupVersionKind(schema.GroupVersionKind{ + Group: "apps", + Version: "v1", + Kind: resType, + }) + found, err := getter.GetResourceInCache(namespace, resName, res, kubeClient) + if err != nil { + return "", fmt.Errorf("failed to find resource %s, type %s, err %s", resName, resType, err.Error()) + } + if !found { + return "", fmt.Errorf("failed to find resource %s, type %s", resName, resType) + } + annotation := res.GetAnnotations() + if len(annotation) > 0 { + if chartRelease, ok := annotation[setting.HelmReleaseNameAnnotation]; ok { + return util.ExtraServiceName(chartRelease, namespace), nil + } + } + return "", fmt.Errorf("failed to get annotation from resource %s, type %s", resName, resType) +} + +func getValidMatchData(spec *models.ImagePathSpec) map[string]string { + ret := make(map[string]string) + if spec.Repo != "" { + ret[setting.PathSearchComponentRepo] = spec.Repo + } + if spec.Image != "" { + ret[setting.PathSearchComponentImage] = spec.Image + } + if spec.Tag != "" { + ret[setting.PathSearchComponentTag] = spec.Tag + } + return ret +} + +// parse image url to map: repo=>xxx/xx/xx image=>xx tag=>xxx +func resolveImageUrl(imageUrl string) map[string]string { + subMatchAll := imageParseRegex.FindStringSubmatch(imageUrl) + result := make(map[string]string) + exNames := imageParseRegex.SubexpNames() + for i, matchedStr := range subMatchAll { + if i != 0 && matchedStr != "" && matchedStr != ":" { + result[exNames[i]] = matchedStr + } + } + return result +} + +// replace image defines in yaml by new version +func replaceImage(sourceYaml string, imageValuesMap map[string]interface{}) (string, error) { + nestedMap, err := converter.Expand(imageValuesMap) + if err != nil { + return "", err + } + bs, err := yaml.Marshal(nestedMap) + if err != nil { + return "", err + } + mergedBs, err := yamlutil.Merge([][]byte{[]byte(sourceYaml), bs}) + if err != nil { + return "", err + } + return string(mergedBs), nil +} + +// AssignImageData assign image url data into match data +// matchData: image=>absolute-path repo=>absolute-path tag=>absolute-path +// return: absolute-image-path=>image-value absolute-repo-path=>repo-value absolute-tag-path=>tag-value +func assignImageData(imageUrl string, matchData map[string]string) (map[string]interface{}, error) { + ret := make(map[string]interface{}) + // total image url assigned into one single value + if len(matchData) == 1 { + for _, v := range matchData { + ret[v] = imageUrl + } + return ret, nil + } + + resolvedImageUrl := resolveImageUrl(imageUrl) + + // image url assigned into repo/image+tag + if len(matchData) == 3 { + ret[matchData[setting.PathSearchComponentRepo]] = strings.TrimSuffix(resolvedImageUrl[setting.PathSearchComponentRepo], "/") + ret[matchData[setting.PathSearchComponentImage]] = resolvedImageUrl[setting.PathSearchComponentImage] + ret[matchData[setting.PathSearchComponentTag]] = resolvedImageUrl[setting.PathSearchComponentTag] + return ret, nil + } + + if len(matchData) == 2 { + // image url assigned into repo/image + tag + if tagPath, ok := matchData[setting.PathSearchComponentTag]; ok { + ret[tagPath] = resolvedImageUrl[setting.PathSearchComponentTag] + for k, imagePath := range matchData { + if k == setting.PathSearchComponentTag { + continue + } + ret[imagePath] = fmt.Sprintf("%s%s", resolvedImageUrl[setting.PathSearchComponentRepo], resolvedImageUrl[setting.PathSearchComponentImage]) + break + } + return ret, nil + } + // image url assigned into repo + image(tag) + ret[matchData[setting.PathSearchComponentRepo]] = strings.TrimSuffix(resolvedImageUrl[setting.PathSearchComponentRepo], "/") + ret[matchData[setting.PathSearchComponentImage]] = fmt.Sprintf("%s:%s", resolvedImageUrl[setting.PathSearchComponentImage], resolvedImageUrl[setting.PathSearchComponentTag]) + return ret, nil + } + + return nil, fmt.Errorf("match data illegal, expect length: 1-3, actual length: %d", len(matchData)) +} + +// prepare necessary data from db +func prepareData(namespace, serviceName string, containerName string, product *models.Product) (targetContainer *models.Container, + targetChart *templatemodels.RenderChart, renderSet *models.RenderSet, serviceObj *models.Service, err error) { + + var targetProductService *models.ProductService + for _, productService := range product.GetServiceMap() { + if productService.ServiceName != serviceName { + continue + } + targetProductService = productService + for _, container := range productService.Containers { + if container.Name != containerName { + continue + } + targetContainer = container + break + } + break + } + if targetContainer == nil { + err = fmt.Errorf("failed to find container %s", containerName) + return + } + + renderSet, err = commonrepo.NewRenderSetColl().Find(&commonrepo.RenderSetFindOption{Name: namespace, Revision: product.Render.Revision}) + if err != nil { + log.Errorf("[RenderSet.find] update product %s error: %s", product.ProductName, err.Error()) + err = fmt.Errorf("failed to find redset name %s revision %d", namespace, product.Render.Revision) + return + } + + for _, chartInfo := range renderSet.ChartInfos { + if chartInfo.ServiceName == serviceName { + targetChart = chartInfo + break + } + } + if targetChart == nil { + err = fmt.Errorf("failed to find chart info %s", serviceName) + return + } + + // 获取服务详情 + opt := &commonrepo.ServiceFindOption{ + ServiceName: serviceName, + Revision: targetProductService.Revision, + ProductName: product.ProductName, + } + + serviceObj, err = commonrepo.NewServiceColl().Find(opt) + if err != nil { + log.Errorf("failed to find template service, opt %+v, err :%s", *opt, err.Error()) + err = fmt.Errorf("failed to find template service, opt %+v", *opt) + return + } + return +} + +func updateContainerForHelmChart(serviceName, resType, image, containerName string, product *models.Product) error { + var ( + replaceValuesMap map[string]interface{} + replacedValuesYaml string + mergedValuesYaml string + replacedMergedValuesYaml string + restConfig *rest.Config + helmClient helmclient.Client + namespace string = product.Namespace + ) + + targetContainer, targetChart, renderSet, serviceObj, err := prepareData(namespace, serviceName, containerName, product) + if err != nil { + return err + } + + // update image info in product.services.container + targetContainer.Image = image + + // prepare image replace info + replaceValuesMap, err = assignImageData(image, getValidMatchData(targetContainer.ImagePath)) + if err != nil { + return fmt.Errorf("failed to pase image uri %s/%s, err %s", namespace, serviceName, err.Error()) + } + + // replace image into service's values.yaml + replacedValuesYaml, err = replaceImage(targetChart.ValuesYaml, replaceValuesMap) + if err != nil { + return fmt.Errorf("failed to replace image uri %s/%s, err %s", namespace, serviceName, err.Error()) + + } + if replacedValuesYaml == "" { + return fmt.Errorf("failed to set new image uri into service's values.yaml %s/%s", namespace, serviceName) + } + + // update values.yaml content in chart + targetChart.ValuesYaml = replacedValuesYaml + + // merge override values and kvs into service's yaml + mergedValuesYaml, err = helmtool.MergeOverrideValues(replacedValuesYaml, targetChart.GetOverrideYaml(), targetChart.OverrideValues) + if err != nil { + return err + } + + // replace image into final merged values.yaml + replacedMergedValuesYaml, err = replaceImage(mergedValuesYaml, replaceValuesMap) + if err != nil { + return err + } + + restConfig, err = kube.GetRESTConfig(product.ClusterID) + if err != nil { + return err + } + helmClient, err = helmtool.NewClientFromRestConf(restConfig, namespace) + if err != nil { + return err + } + + // when replace image, should not wait + err = installOrUpgradeHelmChartWithValues(namespace, replacedMergedValuesYaml, targetChart, serviceObj, 0, helmClient) + if err != nil { + return err + } + + if err = commonrepo.NewRenderSetColl().Update(renderSet); err != nil { + log.Errorf("[RenderSet.update] product %s error: %s", product.ProductName, err.Error()) + return fmt.Errorf("failed to update render set, productName %s", product.ProductName) + } + + if err = commonrepo.NewProductColl().Update(product); err != nil { + log.Errorf("[%s] update product %s error: %s", namespace, product.ProductName, err.Error()) + return fmt.Errorf("failed to update product info, name %s", product.ProductName) + } + + return nil +} + func UpdateContainerImage(requestID string, args *UpdateContainerImageArgs, log *zap.SugaredLogger) error { product, err := commonrepo.NewProductColl().Find(&commonrepo.ProductFindOptions{EnvName: args.EnvName, Name: args.ProductName}) if err != nil { @@ -63,78 +332,49 @@ func UpdateContainerImage(requestID string, args *UpdateContainerImageArgs, log commonservice.LogProductStats(namespace, setting.UpdateContainerImageEvent, args.ProductName, requestID, eventStart, log) }() - switch args.Type { - case setting.Deployment: - if err := updater.UpdateDeploymentImage(namespace, args.Name, args.ContainerName, args.Image, kubeClient); err != nil { - log.Errorf("[%s] UpdateDeploymentImageByName error: %v", namespace, err) - return e.ErrUpdateConainterImage.AddDesc("更新 Deployment 容器镜像失败") + // update service in helm way + if product.Source == setting.HelmDeployType { + serviceName, err := getHelmServiceName(namespace, args.Type, args.Name, kubeClient) + if err != nil { + return e.ErrUpdateConainterImage.AddErr(err) } - case setting.StatefulSet: - if err := updater.UpdateStatefulSetImage(namespace, args.Name, args.ContainerName, args.Image, kubeClient); err != nil { - log.Errorf("[%s] UpdateStatefulsetImageByName error: %v", namespace, err) - return e.ErrUpdateConainterImage.AddDesc("更新 StatefulSet 容器镜像失败") + err = updateContainerForHelmChart(serviceName, args.Type, args.Image, args.ContainerName, product) + if err != nil { + return e.ErrUpdateConainterImage.AddErr(err) } - default: - return nil - } - - oldImageName := "" - for _, group := range product.Services { - for _, service := range group { - //如果为helm,serviceName可能不匹配 - if product.Source != setting.HelmDeployType { - if service.ServiceName == args.ServiceName { - for _, container := range service.Containers { - if container.Name == args.ContainerName { - container.Image = args.Image - break - } - } - } + } else { + switch args.Type { + case setting.Deployment: + if err := updater.UpdateDeploymentImage(namespace, args.Name, args.ContainerName, args.Image, kubeClient); err != nil { + log.Errorf("[%s] UpdateDeploymentImageByName error: %s", namespace, err.Error()) + return e.ErrUpdateConainterImage.AddDesc("更新 Deployment 容器镜像失败") + } + case setting.StatefulSet: + if err := updater.UpdateStatefulSetImage(namespace, args.Name, args.ContainerName, args.Image, kubeClient); err != nil { + log.Errorf("[%s] UpdateStatefulsetImageByName error: %s", namespace, err.Error()) + return e.ErrUpdateConainterImage.AddDesc("更新 StatefulSet 容器镜像失败") + } + default: + return e.ErrUpdateConainterImage.AddDesc(fmt.Sprintf("不支持的资源类型: %s", args.Type)) + } + // update image info in product.services.container + for _, service := range product.GetServiceMap() { + if service.ServiceName != args.ServiceName { continue } for _, container := range service.Containers { if container.Name == args.ContainerName { - oldImageName = container.Image container.Image = args.Image break } } + break } - } - - //如果环境是helm环境也要更新renderSet - if product.Source == setting.HelmDeployType && oldImageName != "" { - renderSetOpt := &commonrepo.RenderSetFindOption{Name: namespace, Revision: product.Render.Revision} - renderSet, err := commonrepo.NewRenderSetColl().Find(renderSetOpt) - if err != nil { - log.Errorf("[RenderSet.find] update product %s error: %v", args.ProductName, err) - return e.ErrUpdateConainterImage.AddDesc("更新环境信息失败") - } - oldImageRepo := strings.Split(oldImageName, ":")[0] - newImageTag := strings.Split(args.Image, ":")[1] - - for _, chartInfo := range renderSet.ChartInfos { - newValues, err := updateImageTagInValues([]byte(chartInfo.ValuesYaml), oldImageRepo, newImageTag) - if err != nil { - log.Errorf("Failed to update image tag, err: %v", err) - continue - } else if newValues == nil { - continue - } - chartInfo.ValuesYaml = string(newValues) - } - - if err := commonrepo.NewRenderSetColl().Update(renderSet); err != nil { - log.Errorf("[RenderSet.update] product %s error: %v", args.ProductName, err) + if err := commonrepo.NewProductColl().Update(product); err != nil { + log.Errorf("[%s] update product %s error: %s", namespace, args.ProductName, err.Error()) return e.ErrUpdateConainterImage.AddDesc("更新环境信息失败") } } - - if err := commonrepo.NewProductColl().Update(product); err != nil { - log.Errorf("[%s] update product %s error: %v", namespace, args.ProductName, err) - return e.ErrUpdateConainterImage.AddDesc("更新环境信息失败") - } return nil } diff --git a/pkg/microservice/aslan/core/log/service/log.go b/pkg/microservice/aslan/core/log/service/log.go index 7d8c5081b..c4e9ce00f 100644 --- a/pkg/microservice/aslan/core/log/service/log.go +++ b/pkg/microservice/aslan/core/log/service/log.go @@ -106,8 +106,7 @@ func getContainerLogFromS3(pipelineName, filenamePrefix string, taskID int64, lo if len(fileList) == 0 { return "", nil } - objectKey := storage.GetObjectPath(fileList[0]) - err = client.Download(storage.Bucket, objectKey, tempFile) + err = client.Download(storage.Bucket, fileList[0], tempFile) if err != nil { log.Errorf("GetContainerLogFromS3 Download err:%v", err) return "", err diff --git a/pkg/microservice/aslan/core/service.go b/pkg/microservice/aslan/core/service.go index 5ef918f49..90555c129 100644 --- a/pkg/microservice/aslan/core/service.go +++ b/pkg/microservice/aslan/core/service.go @@ -36,6 +36,7 @@ import ( projecthandler "github.com/koderover/zadig/pkg/microservice/aslan/core/project/handler" systemrepo "github.com/koderover/zadig/pkg/microservice/aslan/core/system/repository/mongodb" systemservice "github.com/koderover/zadig/pkg/microservice/aslan/core/system/service" + templaterepo "github.com/koderover/zadig/pkg/microservice/aslan/core/templatestore/repository/mongodb" workflowhandler "github.com/koderover/zadig/pkg/microservice/aslan/core/workflow/handler" workflowservice "github.com/koderover/zadig/pkg/microservice/aslan/core/workflow/service/workflow" testinghandler "github.com/koderover/zadig/pkg/microservice/aslan/core/workflow/testing/handler" @@ -199,6 +200,9 @@ func initDatabase() { commonrepo.NewWorkflowStatColl(), commonrepo.NewWorkLoadsStatColl(), + templaterepo.NewChartColl(), + templaterepo.NewDockerfileTemplateColl(), + systemrepo.NewAnnouncementColl(), systemrepo.NewOperationLogColl(), } { diff --git a/pkg/microservice/aslan/core/service/handler/helm.go b/pkg/microservice/aslan/core/service/handler/helm.go index 0ce5f006e..8f19493f8 100644 --- a/pkg/microservice/aslan/core/service/handler/helm.go +++ b/pkg/microservice/aslan/core/service/handler/helm.go @@ -69,6 +69,20 @@ func CreateOrUpdateHelmService(c *gin.Context) { ctx.Err = svcservice.CreateOrUpdateHelmService(c.Query("projectName"), args, ctx.Logger) } +func CreateOrUpdateBulkHelmServices(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + + args := new(svcservice.BulkHelmServiceCreationArgs) + if err := c.BindJSON(args); err != nil { + ctx.Err = e.ErrInvalidParam.AddDesc("invalid HelmService json args") + return + } + args.CreatedBy = ctx.UserName + + ctx.Resp, ctx.Err = svcservice.CreateOrUpdateBulkHelmService(c.Query("productName"), args, ctx.Logger) +} + func UpdateHelmService(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() diff --git a/pkg/microservice/aslan/core/service/handler/router.go b/pkg/microservice/aslan/core/service/handler/router.go index 3fabc8e8e..e83c94033 100644 --- a/pkg/microservice/aslan/core/service/handler/router.go +++ b/pkg/microservice/aslan/core/service/handler/router.go @@ -40,6 +40,7 @@ func (*Router) Inject(router *gin.RouterGroup) { helm.GET("/:productName/:serviceName/filePath", GetFilePath) helm.GET("/:productName/:serviceName/fileContent", GetFileContent) helm.POST("/services", CreateOrUpdateHelmService) + helm.POST("/services/bulk", CreateOrUpdateBulkHelmServices) helm.PUT("/:productName", UpdateHelmService) } @@ -79,4 +80,10 @@ func (*Router) Inject(router *gin.RouterGroup) { pm.POST("/:productName", gin2.UpdateOperationLogStatus, CreatePMService) pm.PUT("/:productName", gin2.UpdateOperationLogStatus, UpdatePmServiceTemplate) } + + template := router.Group("template") + { + template.POST("/load", LoadServiceFromYamlTemplate) + template.POST("/reload", ReloadServiceFromYamlTemplate) + } } diff --git a/pkg/microservice/aslan/core/service/handler/yaml_template.go b/pkg/microservice/aslan/core/service/handler/yaml_template.go new file mode 100644 index 000000000..99fd797cc --- /dev/null +++ b/pkg/microservice/aslan/core/service/handler/yaml_template.go @@ -0,0 +1,42 @@ +package handler + +import ( + "github.com/gin-gonic/gin" + + svcservice "github.com/koderover/zadig/pkg/microservice/aslan/core/service/service" + internalhandler "github.com/koderover/zadig/pkg/shared/handler" +) + +type LoadServiceFromYamlTemplateReq struct { + ServiceName string `json:"service_name"` + ProjectName string `json:"project_name"` + TemplateID string `json:"template_id"` + Variables []*svcservice.Variable `json:"variables"` +} + +func LoadServiceFromYamlTemplate(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + + req := new(LoadServiceFromYamlTemplateReq) + + if err := c.ShouldBindJSON(req); err != nil { + ctx.Err = err + return + } + + ctx.Err = svcservice.LoadServiceFromYamlTemplate(ctx.UserName, req.ProjectName, req.ServiceName, req.TemplateID, req.Variables, ctx.Logger) +} + +func ReloadServiceFromYamlTemplate(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + + req := new(LoadServiceFromYamlTemplateReq) + if err := c.ShouldBindJSON(req); err != nil { + ctx.Err = err + return + } + + ctx.Err = svcservice.ReloadServiceFromYamlTemplate(ctx.UserName, req.ProjectName, req.ServiceName, req.Variables, ctx.Logger) +} diff --git a/pkg/microservice/aslan/core/service/service/helm.go b/pkg/microservice/aslan/core/service/service/helm.go index e549c7823..5cf4e4dd0 100644 --- a/pkg/microservice/aslan/core/service/service/helm.go +++ b/pkg/microservice/aslan/core/service/service/helm.go @@ -36,13 +36,16 @@ import ( configbase "github.com/koderover/zadig/pkg/config" "github.com/koderover/zadig/pkg/microservice/aslan/config" "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/models" + "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/models/template" templatemodels "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/models/template" commonrepo "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/mongodb" templaterepo "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/mongodb/template" commonservice "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service" fsservice "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/fs" + templatestore "github.com/koderover/zadig/pkg/microservice/aslan/core/templatestore/repository/models" "github.com/koderover/zadig/pkg/microservice/aslan/core/templatestore/repository/mongodb" "github.com/koderover/zadig/pkg/setting" + "github.com/koderover/zadig/pkg/shared/codehost" e "github.com/koderover/zadig/pkg/tool/errors" "github.com/koderover/zadig/pkg/tool/log" "github.com/koderover/zadig/pkg/types" @@ -91,15 +94,30 @@ type Chart struct { } type helmServiceCreationArgs struct { - ServiceName string - FilePath string - ProductName string - CreateBy string - CodehostID int - Owner string - Repo string - Branch string - RepoLink string + ChartName string + ChartVersion string + ValuesYAML string + ServiceName string + FilePath string + ProductName string + CreateBy string + CodehostID int + Owner string + Repo string + Branch string + RepoLink string + Source string + HelmTemplateName string + ValuePaths []string + ValuesYaml string +} + +type ChartTemplateData struct { + TemplateName string + TemplateData *templatestore.Chart + ChartName string + ChartVersion string + DefaultValuesYAML []byte // content of values.yaml in template } func ListHelmServices(productName string, log *zap.SugaredLogger) (*HelmService, error) { @@ -132,6 +150,7 @@ func ListHelmServices(productName string, log *zap.SugaredLogger) (*HelmService, } func GetHelmServiceModule(serviceName, productName string, revision int64, log *zap.SugaredLogger) (*HelmServiceModule, error) { + serviceTemplate, err := commonservice.GetServiceTemplate(serviceName, setting.HelmDeployType, productName, setting.ProductStatusDeleting, revision, log) if err != nil { return nil, err @@ -182,6 +201,44 @@ func GetFileContent(serviceName, productName, filePath, fileName string, log *za return string(fileContent), nil } +func prepareChartTemplateData(templateName string, logger *zap.SugaredLogger) (*ChartTemplateData, error) { + // get chart template from local disk + templateChart, err := mongodb.NewChartColl().Get(templateName) + if err != nil { + logger.Errorf("Failed to get chart template %s, err: %s", templateName, err) + return nil, err + } + + localBase := configbase.LocalChartTemplatePath(templateName) + s3Base := configbase.ObjectStorageChartTemplatePath(templateName) + if err = fsservice.PreloadFiles(templateName, localBase, s3Base, logger); err != nil { + return nil, err + } + + base := filepath.Base(templateChart.Path) + defaultValuesFile := filepath.Join(localBase, base, setting.ValuesYaml) + defaultValues, _ := os.ReadFile(defaultValuesFile) + + chartFilePath := filepath.Join(localBase, base, setting.ChartYaml) + chartFileContent, err := os.ReadFile(chartFilePath) + if err != nil { + return nil, err + } + chart := new(Chart) + if err = yaml.Unmarshal(chartFileContent, chart); err != nil { + logger.Errorf("Failed to unmarshal chart yaml %s, err: %s", setting.ChartYaml, err) + return nil, err + } + + return &ChartTemplateData{ + TemplateName: templateName, + TemplateData: templateChart, + ChartName: chart.Name, + ChartVersion: chart.Version, + DefaultValuesYAML: defaultValues, + }, nil +} + func CreateOrUpdateHelmService(projectName string, args *HelmServiceCreationArgs, logger *zap.SugaredLogger) error { switch args.Source { case LoadFromRepo, LoadFromPublicRepo: @@ -199,28 +256,16 @@ func CreateOrUpdateHelmServiceFromChartTemplate(projectName string, args *HelmSe return fmt.Errorf("invalid argument") } - // get chart template from local disk - chart, err := mongodb.NewChartColl().Get(templateArgs.TemplateName) + templateChartInfo, err := prepareChartTemplateData(templateArgs.TemplateName, logger) if err != nil { - logger.Errorf("Failed to get chart template %s, err: %s", templateArgs.TemplateName, err) return err } - localBase := configbase.LocalChartTemplatePath(templateArgs.TemplateName) - s3Base := configbase.ObjectStorageChartTemplatePath(templateArgs.TemplateName) - if err = fsservice.PreloadFiles(templateArgs.TemplateName, localBase, s3Base, logger); err != nil { - return err - } - - // deal with values, values will come from template, git repo and user defined one, - // if one key exists in more than one values source, the latter one will override the former one. var values [][]byte - base := filepath.Base(chart.Path) - defaultValuesFile := filepath.Join(localBase, base, setting.ValuesYaml) - defaultValues, _ := os.ReadFile(defaultValuesFile) - if len(defaultValues) > 0 { - values = append(values, defaultValues) + if len(templateChartInfo.DefaultValuesYAML) > 0 { + values = append(values, templateChartInfo.DefaultValuesYAML) } + for _, path := range templateArgs.ValuesPaths { v, err := fsservice.DownloadFileFromSource(&fsservice.DownloadFromSourceArgs{ CodehostID: templateArgs.CodehostID, @@ -240,6 +285,9 @@ func CreateOrUpdateHelmServiceFromChartTemplate(projectName string, args *HelmSe values = append(values, []byte(templateArgs.ValuesYAML)) } + localBase := configbase.LocalChartTemplatePath(templateArgs.TemplateName) + base := filepath.Base(templateChartInfo.TemplateData.Path) + // copy template to service path and update the values.yaml from := filepath.Join(localBase, base) to := filepath.Join(config.LocalServicePath(projectName, args.Name), args.Name) @@ -269,14 +317,21 @@ func CreateOrUpdateHelmServiceFromChartTemplate(projectName string, args *HelmSe svc, err := createOrUpdateHelmService( fsTree, &helmServiceCreationArgs{ - ServiceName: args.Name, - FilePath: to, - ProductName: projectName, - CreateBy: args.CreatedBy, - CodehostID: templateArgs.CodehostID, - Owner: templateArgs.Owner, - Repo: templateArgs.Repo, - Branch: templateArgs.Branch, + ChartName: templateChartInfo.ChartName, + ChartVersion: templateChartInfo.ChartVersion, + ValuesYAML: string(merged), + ServiceName: args.Name, + FilePath: to, + ProductName: projectName, + CreateBy: args.CreatedBy, + CodehostID: templateArgs.CodehostID, + Owner: templateArgs.Owner, + Repo: templateArgs.Repo, + Branch: templateArgs.Branch, + Source: setting.SourceFromChartTemplate, + HelmTemplateName: templateArgs.TemplateName, + ValuePaths: templateArgs.ValuesPaths, + ValuesYaml: templateArgs.ValuesYAML, }, logger, ) @@ -297,6 +352,18 @@ func CreateOrUpdateHelmServiceFromChartTemplate(projectName string, args *HelmSe return nil } +func getCodehostType(repoArgs *CreateFromRepo, repoLink string) (string, error) { + if repoLink != "" { + return setting.SourceFromPublicRepo, nil + } + ch, err := codehost.GetCodeHostInfoByID(repoArgs.CodehostID) + if err != nil { + log.Errorf("Failed to get codeHost by id %d, err: %s", repoArgs.CodehostID, err.Error()) + return "", err + } + return ch.Type, nil +} + func CreateOrUpdateHelmServiceFromGitRepo(projectName string, args *HelmServiceCreationArgs, log *zap.SugaredLogger) error { var err error var repoLink string @@ -315,6 +382,13 @@ func CreateOrUpdateHelmServiceFromGitRepo(projectName string, args *HelmServiceC repoLink = publicArgs.RepoLink } + + source, err := getCodehostType(repoArgs, repoLink) + if err != nil { + log.Errorf("Failed to get source form repo data %+v, err: %s", *repoArgs, err.Error()) + return err + } + helmRenderCharts := make([]*templatemodels.RenderChart, 0, len(repoArgs.Paths)) var errs *multierror.Error @@ -335,13 +409,22 @@ func CreateOrUpdateHelmServiceFromGitRepo(projectName string, args *HelmServiceC log.Infof("Loading chart under path %s", filePath) - var serviceName string + var ( + serviceName string + chartVersion string + valuesYAML []byte + ) + fsTree, err := fsservice.DownloadFilesFromSource( &fsservice.DownloadFromSourceArgs{CodehostID: repoArgs.CodehostID, Owner: repoArgs.Owner, Repo: repoArgs.Repo, Path: filePath, Branch: repoArgs.Branch, RepoLink: repoLink}, func(chartTree afero.Fs) (string, error) { - chartName, _, err := readChartYAML(afero.NewIOFS(chartTree), filepath.Base(filePath), log) - serviceName = chartName - return chartName, err + var err error + serviceName, chartVersion, err = readChartYAML(afero.NewIOFS(chartTree), filepath.Base(filePath), log) + if err != nil { + return serviceName, err + } + valuesYAML, _, err = readValuesYAML(afero.NewIOFS(chartTree), filepath.Base(filePath), log) + return serviceName, err }) if err != nil { log.Errorf("Failed to download files from source, err %s", err) @@ -361,15 +444,19 @@ func CreateOrUpdateHelmServiceFromGitRepo(projectName string, args *HelmServiceC svc, err := createOrUpdateHelmService( fsTree, &helmServiceCreationArgs{ - ServiceName: serviceName, - FilePath: filePath, - ProductName: projectName, - CreateBy: args.CreatedBy, - CodehostID: repoArgs.CodehostID, - Owner: repoArgs.Owner, - Repo: repoArgs.Repo, - Branch: repoArgs.Branch, - RepoLink: repoLink, + ChartName: serviceName, + ChartVersion: chartVersion, + ValuesYAML: string(valuesYAML), + ServiceName: serviceName, + FilePath: filePath, + ProductName: projectName, + CreateBy: args.CreatedBy, + CodehostID: repoArgs.CodehostID, + Owner: repoArgs.Owner, + Repo: repoArgs.Repo, + Branch: repoArgs.Branch, + RepoLink: repoLink, + Source: source, }, log, ) @@ -396,6 +483,159 @@ func CreateOrUpdateHelmServiceFromGitRepo(projectName string, args *HelmServiceC return errs.ErrorOrNil() } +func CreateOrUpdateBulkHelmService(projectName string, args *BulkHelmServiceCreationArgs, logger *zap.SugaredLogger) (*BulkHelmServiceCreationResponse, error) { + switch args.Source { + case LoadFromChartTemplate: + return CreateOrUpdateBulkHelmServiceFromTemplate(projectName, args, logger) + default: + return nil, fmt.Errorf("invalid source") + } +} + +func CreateOrUpdateBulkHelmServiceFromTemplate(projectName string, args *BulkHelmServiceCreationArgs, logger *zap.SugaredLogger) (*BulkHelmServiceCreationResponse, error) { + templateArgs, ok := args.CreateFrom.(*CreateFromChartTemplate) + if !ok { + return nil, fmt.Errorf("invalid argument") + } + + if args.ValuesData == nil || args.ValuesData.GitRepoConfig == nil || len(args.ValuesData.GitRepoConfig.ValuesPaths) == 0 { + return nil, fmt.Errorf("invalid argument, missing values") + } + + templateChartData, err := prepareChartTemplateData(templateArgs.TemplateName, logger) + if err != nil { + return nil, err + } + + localBase := configbase.LocalChartTemplatePath(templateArgs.TemplateName) + base := filepath.Base(templateChartData.TemplateData.Path) + // copy template to service path and update the values.yaml + from := filepath.Join(localBase, base) + + //record errors for every service + failedServiceMap := &sync.Map{} + renderChartMap := &sync.Map{} + + wg := sync.WaitGroup{} + // run goroutines to speed up + for _, singlePath := range args.ValuesData.GitRepoConfig.ValuesPaths { + wg.Add(1) + go func(repoConfig *commonservice.RepoConfig, path string) { + defer wg.Done() + renderChart, err := handleSingleService(projectName, repoConfig, path, from, args.CreatedBy, templateChartData, logger) + if err != nil { + failedServiceMap.Store(path, err.Error()) + } else { + renderChartMap.Store(renderChart.ServiceName, renderChart) + } + }(args.ValuesData.GitRepoConfig, singlePath) + } + + wg.Wait() + + resp := &BulkHelmServiceCreationResponse{ + SuccessServices: make([]string, 0), + FailedServices: make([]*FailedService, 0), + } + + renderChars := make([]*templatemodels.RenderChart, 0) + + renderChartMap.Range(func(key, value interface{}) bool { + resp.SuccessServices = append(resp.SuccessServices, key.(string)) + renderChars = append(renderChars, value.(*templatemodels.RenderChart)) + return true + }) + + failedServiceMap.Range(func(key, value interface{}) bool { + resp.FailedServices = append(resp.FailedServices, &FailedService{ + Path: key.(string), + Error: value.(string), + }) + return true + }) + + compareHelmVariable(renderChars, projectName, args.CreatedBy, logger) + + return resp, nil +} + +func handleSingleService(projectName string, repoConfig *commonservice.RepoConfig, path, fromPath, createBy string, + templateChartData *ChartTemplateData, logger *zap.SugaredLogger) (*templatemodels.RenderChart, error) { + + valuesYAML, err := fsservice.DownloadFileFromSource(&fsservice.DownloadFromSourceArgs{ + CodehostID: repoConfig.CodehostID, + Owner: repoConfig.Owner, + Repo: repoConfig.Repo, + Path: path, + Branch: repoConfig.Branch, + }) + if err != nil { + return nil, err + } + + if len(valuesYAML) == 0 { + return nil, fmt.Errorf("values.yaml is empty") + } + + values := [][]byte{templateChartData.DefaultValuesYAML, valuesYAML} + mergedValues, err := yamlutil.Merge(values) + if err != nil { + logger.Errorf("Failed to merge values, err: %s", err) + return nil, err + } + + serviceName := filepath.Base(path) + serviceName = strings.TrimSuffix(serviceName, filepath.Ext(serviceName)) + + to := filepath.Join(config.LocalServicePath(projectName, serviceName), serviceName) + if err = copy.Copy(fromPath, to); err != nil { + logger.Errorf("Failed to copy file from %s to %s, err: %s", fromPath, to, err) + return nil, err + } + + // write values.yaml file + if err = os.WriteFile(filepath.Join(to, setting.ValuesYaml), mergedValues, 0644); err != nil { + logger.Errorf("Failed to write values, err: %s", err) + return nil, err + } + + fsTree := os.DirFS(config.LocalServicePath(projectName, serviceName)) + ServiceS3Base := config.ObjectStorageServicePath(projectName, serviceName) + if err = fsservice.ArchiveAndUploadFilesToS3(fsTree, serviceName, ServiceS3Base, logger); err != nil { + logger.Errorf("Failed to upload files for service %s in project %s, err: %s", serviceName, projectName, err) + return nil, err + } + + _, err = createOrUpdateHelmService( + fsTree, + &helmServiceCreationArgs{ + ChartName: templateChartData.ChartName, + ChartVersion: templateChartData.ChartVersion, + ValuesYAML: string(mergedValues), + ServiceName: serviceName, + FilePath: to, + ProductName: projectName, + CreateBy: createBy, + CodehostID: repoConfig.CodehostID, + Source: setting.SourceFromChartTemplate, + HelmTemplateName: templateChartData.TemplateName, + ValuePaths: []string{path}, + ValuesYaml: string(templateChartData.DefaultValuesYAML), + }, + logger, + ) + if err != nil { + logger.Errorf("Failed to create service %s in project %s, error: %s", serviceName, projectName, err) + return nil, err + } + + return &templatemodels.RenderChart{ + ServiceName: serviceName, + ChartVersion: templateChartData.ChartVersion, + ValuesYaml: string(mergedValues), + }, nil +} + func readChartYAML(chartTree fs.FS, base string, logger *zap.SugaredLogger) (string, string, error) { chartFile, err := fs.ReadFile(chartTree, filepath.Join(base, setting.ChartYaml)) if err != nil { @@ -427,6 +667,57 @@ func readValuesYAML(chartTree fs.FS, base string, logger *zap.SugaredLogger) ([] return content, valuesMap, nil } +func geneCreationDetail(args *helmServiceCreationArgs) interface{} { + switch args.Source { + case setting.SourceFromGitlab, + setting.SourceFromGithub, + setting.SourceFromGerrit, + setting.SourceFromCodeHub, + setting.SourceFromIlyshin: + return &models.CreateFromRepo{ + GitRepoConfig: &templatemodels.GitRepoConfig{ + CodehostID: args.CodehostID, + Owner: args.Owner, + Repo: args.Repo, + Branch: args.Branch, + }, + LoadPath: args.FilePath, + } + case setting.SourceFromPublicRepo: + return &models.CreateFromPublicRepo{ + RepoLink: args.RepoLink, + LoadPath: args.FilePath, + } + case setting.SourceFromChartTemplate: + var yamlData *template.CustomYaml + if args.CodehostID > 0 { + yamlData = &template.CustomYaml{ + YamlSource: setting.ValuesYamlSourceGitRepo, + YamlContent: "", + GitRepoConfig: &templatemodels.GitRepoConfig{ + CodehostID: args.CodehostID, + Owner: args.Owner, + Repo: args.Repo, + Branch: args.Branch, + }, + ValuesPaths: args.ValuePaths, + } + } else if len(args.ValuesYaml) > 0 { + yamlData = &template.CustomYaml{ + YamlSource: setting.ValuesYamlSourceFreeEdit, + YamlContent: args.ValuesYaml, + } + } + + return &models.CreateFromChartTemplate{ + YamlData: yamlData, + TemplateName: args.HelmTemplateName, + ServiceName: args.ServiceName, + } + } + return nil +} + func createOrUpdateHelmService(fsTree fs.FS, args *helmServiceCreationArgs, logger *zap.SugaredLogger) (*models.Service, error) { chartName, chartVersion, err := readChartYAML(fsTree, args.ServiceName, logger) if err != nil { @@ -471,6 +762,8 @@ func createOrUpdateHelmService(fsTree fs.FS, args *helmServiceCreationArgs, logg BranchName: args.Branch, LoadPath: args.FilePath, SrcPath: args.RepoLink, + CreateFrom: geneCreationDetail(args), + Source: args.Source, HelmChart: &models.HelmChart{ Name: chartName, Version: chartVersion, diff --git a/pkg/microservice/aslan/core/service/service/pm.go b/pkg/microservice/aslan/core/service/service/pm.go index a41b71461..0365592fd 100644 --- a/pkg/microservice/aslan/core/service/service/pm.go +++ b/pkg/microservice/aslan/core/service/service/pm.go @@ -90,7 +90,7 @@ func CreatePMService(username string, args *ServiceTmplBuildObject, log *zap.Sug } // Confirm whether the build exists - build, err := commonrepo.NewBuildColl().Find(&commonrepo.BuildFindOption{Name: args.Build.Name}) + build, err := commonrepo.NewBuildColl().Find(&commonrepo.BuildFindOption{Name: args.Build.Name, ProductName: args.Build.ProductName}) if err != nil { if err := commonservice.CreateBuild(username, args.Build, log); err != nil { log.Errorf("pmService.Create build %s error: %v", args.Build.Name, err) diff --git a/pkg/microservice/aslan/core/service/service/service.go b/pkg/microservice/aslan/core/service/service/service.go index c3b23dfa5..56373af0a 100644 --- a/pkg/microservice/aslan/core/service/service/service.go +++ b/pkg/microservice/aslan/core/service/service/service.go @@ -69,8 +69,9 @@ type ServiceModule struct { } type Variable struct { - Key string `json:"key"` - Value string `json:"value"` + Key string `json:"key"` + Value string `json:"value"` + Description string `json:"description,omitempty"` } type YamlPreviewForPorts struct { @@ -1050,7 +1051,7 @@ func ensureServiceTmpl(userName string, args *commonmodels.Service, log *zap.Sug args.Containers = make([]*commonmodels.Container, 0) } // Only the gerrit/spock/external type needs to be processed by yaml - if args.Source == setting.SourceFromGerrit || args.Source == setting.SourceFromZadig || args.Source == setting.SourceFromExternal { + if args.Source == setting.SourceFromGerrit || args.Source == setting.SourceFromZadig || args.Source == setting.SourceFromExternal || args.Source == setting.ServiceSourceTemplate { // 拆分 all-in-one yaml文件 // 替换分隔符 args.Yaml = util.ReplaceWrapLine(args.Yaml) diff --git a/pkg/microservice/aslan/core/service/service/types.go b/pkg/microservice/aslan/core/service/service/types.go index bdfdcd5be..0edc04a48 100644 --- a/pkg/microservice/aslan/core/service/service/types.go +++ b/pkg/microservice/aslan/core/service/service/types.go @@ -20,6 +20,7 @@ import ( "encoding/json" "fmt" + "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service" "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/git" ) @@ -37,12 +38,33 @@ type HelmLoadSource struct { type HelmServiceCreationArgs struct { HelmLoadSource - Name string `json:"name"` CreatedBy string `json:"createdBy"` CreateFrom interface{} `json:"createFrom"` } +type ValuesDataArgs struct { + YamlSource string `json:"yamlSource,omitempty"` + GitRepoConfig *service.RepoConfig `json:"gitRepoConfig,omitempty"` +} + +type BulkHelmServiceCreationArgs struct { + HelmLoadSource + CreateFrom interface{} `json:"createFrom"` + CreatedBy string `json:"createdBy"` + ValuesData *ValuesDataArgs `json:"valuesData"` +} + +type FailedService struct { + Path string `json:"path"` + Error string `json:"error"` +} + +type BulkHelmServiceCreationResponse struct { + SuccessServices []string `json:"successServices"` + FailedServices []*FailedService `json:"failedServices"` +} + type CreateFromRepo struct { CodehostID int `json:"codehostID"` Owner string `json:"owner"` @@ -57,13 +79,13 @@ type CreateFromPublicRepo struct { } type CreateFromChartTemplate struct { - CodehostID int `json:"codehostID"` - Owner string `json:"owner"` - Repo string `json:"repo"` - Branch string `json:"branch"` + CodehostID int `json:"codehostID,omitempty"` + Owner string `json:"owner,omitempty"` + Repo string `json:"repo,omitempty"` + Branch string `json:"branch,omitempty"` TemplateName string `json:"templateName"` - ValuesPaths []string `json:"valuesPaths"` - ValuesYAML string `json:"valuesYAML"` + ValuesPaths []string `json:"valuesPaths,omitempty"` + ValuesYAML string `json:"valuesYAML,omitempty"` } func PublicRepoToPrivateRepoArgs(args *CreateFromPublicRepo) (*CreateFromRepo, error) { @@ -101,3 +123,18 @@ func (a *HelmServiceCreationArgs) UnmarshalJSON(data []byte) error { return json.Unmarshal(data, (*tmp)(a)) } + +func (a *BulkHelmServiceCreationArgs) UnmarshalJSON(data []byte) error { + s := &HelmLoadSource{} + if err := json.Unmarshal(data, s); err != nil { + return err + } + + if s.Source == LoadFromChartTemplate { + a.CreateFrom = &CreateFromChartTemplate{} + } + + type tmp BulkHelmServiceCreationArgs + + return json.Unmarshal(data, (*tmp)(a)) +} diff --git a/pkg/microservice/aslan/core/service/service/yaml_template.go b/pkg/microservice/aslan/core/service/service/yaml_template.go new file mode 100644 index 000000000..a434fdf0d --- /dev/null +++ b/pkg/microservice/aslan/core/service/service/yaml_template.go @@ -0,0 +1,86 @@ +package service + +import ( + "errors" + "fmt" + "strings" + + "go.uber.org/zap" + + commonmodels "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/models" + commonrepo "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/mongodb" + "github.com/koderover/zadig/pkg/setting" +) + +func LoadServiceFromYamlTemplate(username, projectName, serviceName, templateID string, variables []*Variable, logger *zap.SugaredLogger) error { + template, err := commonrepo.NewYamlTemplateColl().GetById(templateID) + if err != nil { + logger.Errorf("Failed to find template of ID: %s, the error is: %s", templateID, err) + return err + } + renderedYaml := renderYamlFromTemplate(template.Content, projectName, serviceName, variables) + service := &commonmodels.Service{ + ServiceName: serviceName, + Type: setting.K8SDeployType, + ProductName: projectName, + Source: setting.ServiceSourceTemplate, + Yaml: renderedYaml, + Visibility: setting.PrivateVisibility, + TemplateID: templateID, + } + _, err = CreateServiceTemplate(username, service, logger) + if err != nil { + logger.Errorf("Failed to create service template from template ID: %s, the error is: %s", templateID, err) + } + return err +} + +func ReloadServiceFromYamlTemplate(username, projectName, serviceName string, variables []*Variable, logger *zap.SugaredLogger) error { + service, err := commonrepo.NewServiceColl().Find(&commonrepo.ServiceFindOption{ + ServiceName: serviceName, + ProductName: projectName, + }) + if err != nil { + logger.Errorf("Cannot find service of name [%s] from project [%s], the error is: %s", serviceName, projectName, err) + return err + } + if service.Source != setting.ServiceSourceTemplate { + return errors.New("service is not created from template") + } + if service.TemplateID == "" { + return errors.New("failed to find template id for service:" + serviceName) + } + template, err := commonrepo.NewYamlTemplateColl().GetById(service.TemplateID) + if err != nil { + logger.Errorf("Failed to find template of ID: %s, the error is: %s", service.TemplateID, err) + return err + } + renderedYaml := renderYamlFromTemplate(template.Content, projectName, serviceName, variables) + svc := &commonmodels.Service{ + ServiceName: serviceName, + Type: setting.K8SDeployType, + ProductName: projectName, + Source: setting.ServiceSourceTemplate, + Yaml: renderedYaml, + Visibility: setting.PrivateVisibility, + TemplateID: service.TemplateID, + } + _, err = CreateServiceTemplate(username, svc, logger) + if err != nil { + logger.Errorf("Failed to create service template from template ID: %s, the error is: %s", service.TemplateID, err) + } + return err +} + +func renderYamlFromTemplate(yaml, productName, serviceName string, variables []*Variable) string { + for _, variable := range variables { + yaml = strings.Replace(yaml, buildVariable(variable.Key), variable.Value, -1) + } + yaml = strings.Replace(yaml, setting.TemplateVariableProduct, productName, -1) + yaml = strings.Replace(yaml, setting.TemplateVariableService, serviceName, -1) + return yaml +} + +func buildVariable(key string) string { + return fmt.Sprintf("{{.%s}}", key) +} diff --git a/pkg/microservice/aslan/core/system/handler/private_key.go b/pkg/microservice/aslan/core/system/handler/private_key.go index 93377b129..b4756e254 100644 --- a/pkg/microservice/aslan/core/system/handler/private_key.go +++ b/pkg/microservice/aslan/core/system/handler/private_key.go @@ -103,3 +103,39 @@ func DeletePrivateKey(c *gin.Context) { internalhandler.InsertOperationLog(c, ctx.UserName, "", "删除", "资源管理-主机管理", fmt.Sprintf("id:%s", c.Param("id")), "", ctx.Logger) ctx.Err = service.DeletePrivateKey(c.Param("id"), ctx.Logger) } + +func ListLabels(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + + ctx.Resp, ctx.Err = service.ListLabels() +} + +type privateKeyArgs struct { + Option string `json:"option"` + Data []*commonmodels.PrivateKey `json:"data"` +} + +func BatchCreatePrivateKey(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + + args := new(privateKeyArgs) + data, err := c.GetRawData() + if err != nil { + log.Errorf("batchCreatePrivateKey c.GetRawData() err : %v", err) + } + if err = json.Unmarshal(data, args); err != nil { + log.Errorf("batchCreatePrivateKey json.Unmarshal err : %v", err) + } + internalhandler.InsertOperationLog(c, ctx.UserName, "", "批量新增", "资源管理-主机管理", "", string(data), ctx.Logger) + + c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(data)) + + if err := c.ShouldBindJSON(&args); err != nil { + ctx.Err = e.ErrInvalidParam.AddDesc("invalid PrivateKey args") + return + } + + ctx.Err = service.BatchCreatePrivateKey(args.Data, args.Option, ctx.UserName, ctx.Logger) +} diff --git a/pkg/microservice/aslan/core/system/handler/router.go b/pkg/microservice/aslan/core/system/handler/router.go index f0175bbc6..c72f6e133 100644 --- a/pkg/microservice/aslan/core/system/handler/router.go +++ b/pkg/microservice/aslan/core/system/handler/router.go @@ -78,6 +78,7 @@ func (*Router) Inject(router *gin.RouterGroup) { s3storage.GET("/:id", GetS3Storage) s3storage.PUT("/:id", gin2.UpdateOperationLogStatus, UpdateS3Storage) s3storage.DELETE("/:id", gin2.UpdateOperationLogStatus, DeleteS3Storage) + s3storage.POST("/:id/releases/search", ListTars) } //系统清理缓存 @@ -151,7 +152,9 @@ func (*Router) Inject(router *gin.RouterGroup) { { privateKey.GET("", ListPrivateKeys) privateKey.GET("/:id", GetPrivateKey) + privateKey.GET("/labels", ListLabels) privateKey.POST("", gin2.UpdateOperationLogStatus, CreatePrivateKey) + privateKey.POST("/batch", gin2.UpdateOperationLogStatus, BatchCreatePrivateKey) privateKey.PUT("/:id", gin2.UpdateOperationLogStatus, UpdatePrivateKey) privateKey.DELETE("/:id", gin2.UpdateOperationLogStatus, DeletePrivateKey) } diff --git a/pkg/microservice/aslan/core/system/handler/s3.go b/pkg/microservice/aslan/core/system/handler/s3.go index f7f0aa2d0..f8e534ad0 100644 --- a/pkg/microservice/aslan/core/system/handler/s3.go +++ b/pkg/microservice/aslan/core/system/handler/s3.go @@ -117,3 +117,20 @@ func DeleteS3Storage(c *gin.Context) { ctx.Err = service.DeleteS3Storage(ctx.UserName, c.Param("id"), ctx.Logger) } + +type ListTarsOption struct { + Names []string `json:"names"` +} + +func ListTars(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + + args := new(ListTarsOption) + if err := c.ShouldBindJSON(args); err != nil { + ctx.Err = e.ErrInvalidParam.AddErr(err) + return + } + + ctx.Resp, ctx.Err = service.ListTars(c.Param("id"), c.Query("kind"), args.Names, ctx.Logger) +} diff --git a/pkg/microservice/aslan/core/system/service/private_key.go b/pkg/microservice/aslan/core/system/service/private_key.go index d34ca4a00..bc9d8aecd 100644 --- a/pkg/microservice/aslan/core/system/service/private_key.go +++ b/pkg/microservice/aslan/core/system/service/private_key.go @@ -87,3 +87,67 @@ func DeletePrivateKey(id string, log *zap.SugaredLogger) error { } return nil } + +func ListLabels() ([]string, error) { + return commonrepo.NewPrivateKeyColl().DistinctLabels() +} + +// override: Full coverage (temporarily reserved) +// increment: Incremental coverage +// patch: Overwrite existing +func BatchCreatePrivateKey(args []*commonmodels.PrivateKey, option, username string, log *zap.SugaredLogger) error { + switch option { + //case "override": + // if err := commonrepo.NewPrivateKeyColl().DeleteAll(); err != nil { + // return e.ErrBulkCreatePrivateKey.AddDesc("delete all privateKeys failed") + // } + // for _, currentPrivateKey := range args { + // if !config.CVMNameRegex.MatchString(currentPrivateKey.Name) { + // return e.ErrBulkCreatePrivateKey.AddDesc("主机名称仅支持字母,数字和下划线且首个字符不以数字开头") + // } + // currentPrivateKey.UpdateBy = username + // if err := commonrepo.NewPrivateKeyColl().Create(currentPrivateKey); err != nil { + // log.Errorf("PrivateKey.Create error: %s", err) + // return e.ErrBulkCreatePrivateKey.AddDesc("bulk add privateKey failed") + // } + // } + case "increment": + for _, currentPrivateKey := range args { + if !config.CVMNameRegex.MatchString(currentPrivateKey.Name) { + return e.ErrBulkCreatePrivateKey.AddDesc("主机名称仅支持字母,数字和下划线且首个字符不以数字开头") + } + + if privateKeys, _ := commonrepo.NewPrivateKeyColl().List(&commonrepo.PrivateKeyArgs{Name: currentPrivateKey.Name}); len(privateKeys) > 0 { + continue + } + + currentPrivateKey.UpdateBy = username + if err := commonrepo.NewPrivateKeyColl().Create(currentPrivateKey); err != nil { + log.Errorf("PrivateKey.Create error: %s", err) + return e.ErrBulkCreatePrivateKey.AddDesc("bulk add privateKey failed") + } + } + + case "patch": + for _, currentPrivateKey := range args { + if !config.CVMNameRegex.MatchString(currentPrivateKey.Name) { + return e.ErrBulkCreatePrivateKey.AddDesc("主机名称仅支持字母,数字和下划线且首个字符不以数字开头") + } + currentPrivateKey.UpdateBy = username + if privateKeys, _ := commonrepo.NewPrivateKeyColl().List(&commonrepo.PrivateKeyArgs{Name: currentPrivateKey.Name}); len(privateKeys) > 0 { + if err := commonrepo.NewPrivateKeyColl().Update(privateKeys[0].ID.Hex(), currentPrivateKey); err != nil { + log.Errorf("PrivateKey.update error: %s", err) + return e.ErrBulkCreatePrivateKey.AddDesc("bulk update privateKey failed") + } + continue + } + + if err := commonrepo.NewPrivateKeyColl().Create(currentPrivateKey); err != nil { + log.Errorf("PrivateKey.Create error: %s", err) + return e.ErrBulkCreatePrivateKey.AddDesc("bulk add privateKey failed") + } + } + } + + return nil +} diff --git a/pkg/microservice/aslan/core/system/service/s3.go b/pkg/microservice/aslan/core/system/service/s3.go index 89f26377b..076b0fd65 100644 --- a/pkg/microservice/aslan/core/system/service/s3.go +++ b/pkg/microservice/aslan/core/system/service/s3.go @@ -17,8 +17,14 @@ limitations under the License. package service import ( + "strconv" + "strings" + "sync" + "go.uber.org/zap" + "k8s.io/apimachinery/pkg/util/wait" + "github.com/koderover/zadig/pkg/microservice/aslan/config" commonmodels "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/models" commonrepo "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/mongodb" "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/s3" @@ -95,3 +101,72 @@ func GetS3Storage(id string, logger *zap.SugaredLogger) (*commonmodels.S3Storage return store, nil } + +func ListTars(id, kind string, serviceNames []string, logger *zap.SugaredLogger) ([]*commonmodels.TarInfo, error) { + var ( + wg wait.Group + mutex sync.RWMutex + tarInfos = make([]*commonmodels.TarInfo, 0) + store *commonmodels.S3Storage + defaultS3 s3.S3 + defaultURL string + err error + ) + + store, err = commonrepo.NewS3StorageColl().Find(id) + if err != nil { + logger.Errorf("can't find store by id:%s err:%s", id, err) + return nil, err + } + defaultS3 = s3.S3{ + S3Storage: store, + } + defaultURL, err = defaultS3.GetEncryptedURL() + if err != nil { + logger.Errorf("defaultS3 GetEncryptedURL err:%s", err) + return nil, err + } + + for _, serviceName := range serviceNames { + newServiceName := serviceName + wg.Start(func() { + deliveryArtifacts, err := commonrepo.NewDeliveryArtifactColl().ListTars(&commonrepo.DeliveryArtifactArgs{ + Name: newServiceName, + Type: kind, + Source: string(config.WorkflowType), + PackageStorageURI: store.Endpoint + "/" + store.Bucket, + }) + if err != nil { + logger.Errorf("ListTars err:%s", err) + return + } + for _, deliveryArtifact := range deliveryArtifacts { + activities, _, err := commonrepo.NewDeliveryActivityColl().List(&commonrepo.DeliveryActivityArgs{ArtifactID: deliveryArtifact.ID.Hex()}) + if err != nil { + logger.Errorf("deliveryActivity.list err:%s", err) + return + } + urlArr := strings.Split(activities[0].URL, "/") + workflowName := urlArr[len(urlArr)-2] + taskIDStr := urlArr[len(urlArr)-1] + taskID, err := strconv.Atoi(taskIDStr) + if err != nil { + logger.Errorf("string convert to int err:%s", err) + return + } + + mutex.Lock() + tarInfos = append(tarInfos, &commonmodels.TarInfo{ + URL: defaultURL, + Name: newServiceName, + FileName: deliveryArtifact.Image, + WorkflowName: workflowName, + TaskID: int64(taskID), + }) + mutex.Unlock() + } + }) + } + wg.Wait() + return tarInfos, nil +} diff --git a/pkg/microservice/aslan/core/templatestore/handler/dockerfile.go b/pkg/microservice/aslan/core/templatestore/handler/dockerfile.go new file mode 100644 index 000000000..b01ee1b87 --- /dev/null +++ b/pkg/microservice/aslan/core/templatestore/handler/dockerfile.go @@ -0,0 +1,128 @@ +package handler + +import ( + "errors" + + "github.com/gin-gonic/gin" + + templateservice "github.com/koderover/zadig/pkg/microservice/aslan/core/templatestore/service" + internalhandler "github.com/koderover/zadig/pkg/shared/handler" +) + +func CreateDockerfileTemplate(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + + req := &templateservice.DockerfileTemplate{} + + if err := c.ShouldBindJSON(req); err != nil { + ctx.Err = err + return + } + + // some dockerfile validation stuff + err := templateservice.ValidateDockerfileTemplate(req.Content, ctx.Logger) + if err != nil { + ctx.Err = errors.New("invalid dockerfile, please check") + return + } + + ctx.Err = templateservice.CreateDockerfileTemplate(req, ctx.Logger) +} + +func UpdateDockerfileTemplate(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + + req := &templateservice.DockerfileTemplate{} + + if err := c.ShouldBindJSON(req); err != nil { + ctx.Err = err + return + } + + // some dockerfile validation stuff + err := templateservice.ValidateDockerfileTemplate(req.Content, ctx.Logger) + if err != nil { + ctx.Err = errors.New("invalid dockerfile, please check") + return + } + + ctx.Err = templateservice.UpdateDockerfileTemplate(c.Param("id"), req, ctx.Logger) +} + +type listDockerfileQuery struct { + PageSize int `json:"page_size" form:"page_size,default=100"` + PageNum int `json:"page_num" form:"page_num,default=1"` +} + +type ListDockefileResp struct { + DockerfileTemplates []*templateservice.DockerfileListObject `json:"dockerfile_template"` + Total int `json:"total"` +} + +func ListDockerfileTemplate(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + + // Query Verification + args := listDockerfileQuery{} + if err := c.ShouldBindQuery(&args); err != nil { + ctx.Err = err + return + } + + dockerfileTemplateList, total, err := templateservice.ListDockerfileTemplate(args.PageNum, args.PageSize, ctx.Logger) + resp := ListDockefileResp{ + DockerfileTemplates: dockerfileTemplateList, + Total: total, + } + ctx.Resp = resp + ctx.Err = err +} + +func GetDockerfileTemplateDetail(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + + ctx.Resp, ctx.Err = templateservice.GetDockerfileTemplateDetail(c.Param("id"), ctx.Logger) +} + +func DeleteDockerfileTemplate(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + + ctx.Err = templateservice.DeleteDockerfileTemplate(c.Param("id"), ctx.Logger) +} + +func GetDockerfileTemplateReference(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + + ctx.Resp, ctx.Err = templateservice.GetDockerfileTemplateReference(c.Param("id"), ctx.Logger) +} + +type validateDockerfileTemplateReq struct { + Content string `json:"content"` +} + +type validateDockerfileTemplateResp struct { + Error string `json:"error"` +} + +func ValidateDockerfileTemplate(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + + req := &validateDockerfileTemplateReq{} + if err := c.ShouldBindJSON(req); err != nil { + ctx.Err = err + return + } + + err := templateservice.ValidateDockerfileTemplate(req.Content, ctx.Logger) + ctx.Resp = &validateDockerfileTemplateResp{Error: ""} + if err != nil { + ctx.Resp = &validateDockerfileTemplateResp{Error: err.Error()} + } +} diff --git a/pkg/microservice/aslan/core/templatestore/handler/router.go b/pkg/microservice/aslan/core/templatestore/handler/router.go index 3dea48db4..78bc1300e 100644 --- a/pkg/microservice/aslan/core/templatestore/handler/router.go +++ b/pkg/microservice/aslan/core/templatestore/handler/router.go @@ -35,4 +35,26 @@ func (*Router) Inject(router *gin.RouterGroup) { install.PUT("/:name", UpdateChartTemplate) install.DELETE("/:name", RemoveChartTemplate) } + + dockerfile := router.Group("dockerfile") + { + dockerfile.POST("", CreateDockerfileTemplate) + dockerfile.PUT("/:id", UpdateDockerfileTemplate) + dockerfile.GET("", ListDockerfileTemplate) + dockerfile.GET("/:id", GetDockerfileTemplateDetail) + dockerfile.DELETE("/:id", DeleteDockerfileTemplate) + dockerfile.GET("/:id/reference", GetDockerfileTemplateReference) + dockerfile.POST("/validation", ValidateDockerfileTemplate) + } + + yaml := router.Group("yaml") + { + yaml.POST("", CreateYamlTemplate) + yaml.PUT("/:id", UpdateYamlTemplate) + yaml.GET("", ListYamlTemplate) + yaml.GET("/:id", GetYamlTemplateDetail) + yaml.DELETE("/:id", DeleteYamlTemplate) + yaml.GET("/:id/reference", GetYamlTemplateReference) + yaml.PUT("/:id/variables", UpdateYamlTemplateVariables) + } } diff --git a/pkg/microservice/aslan/core/templatestore/handler/yaml.go b/pkg/microservice/aslan/core/templatestore/handler/yaml.go new file mode 100644 index 000000000..ab5c9909f --- /dev/null +++ b/pkg/microservice/aslan/core/templatestore/handler/yaml.go @@ -0,0 +1,107 @@ +package handler + +import ( + "github.com/gin-gonic/gin" + + templateservice "github.com/koderover/zadig/pkg/microservice/aslan/core/templatestore/service" + internalhandler "github.com/koderover/zadig/pkg/shared/handler" +) + +func CreateYamlTemplate(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + + req := &templateservice.YamlTemplate{} + + if err := c.ShouldBindJSON(req); err != nil { + ctx.Err = err + return + } + + ctx.Err = templateservice.CreateYamlTemplate(req, ctx.Logger) +} + +func UpdateYamlTemplate(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + + req := &templateservice.YamlTemplate{} + + if err := c.ShouldBindJSON(req); err != nil { + ctx.Err = err + return + } + + ctx.Err = templateservice.UpdateYamlTemplate(c.Param("id"), req, ctx.Logger) +} + +type listYamlQuery struct { + PageSize int `json:"page_size" form:"page_size,default=100"` + PageNum int `json:"page_num" form:"page_num,default=1"` +} + +type ListYamlResp struct { + SystemVariables []*templateservice.Variable `json:"system_variables"` + YamlTemplates []*templateservice.YamlListObject `json:"yaml_template"` + Total int `json:"total"` +} + +func ListYamlTemplate(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + + // Query Verification + args := &listYamlQuery{} + if err := c.ShouldBindQuery(args); err != nil { + ctx.Err = err + return + } + + systemVariables := templateservice.GetSystemDefaultVariables() + YamlTemplateList, total, err := templateservice.ListYamlTemplate(args.PageNum, args.PageSize, ctx.Logger) + resp := ListYamlResp{ + SystemVariables: systemVariables, + YamlTemplates: YamlTemplateList, + Total: total, + } + ctx.Resp = resp + ctx.Err = err +} + +func GetYamlTemplateDetail(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + + ctx.Resp, ctx.Err = templateservice.GetYamlTemplateDetail(c.Param("id"), ctx.Logger) +} + +func DeleteYamlTemplate(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + + ctx.Err = templateservice.DeleteYamlTemplate(c.Param("id"), ctx.Logger) +} + +func GetYamlTemplateReference(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + + ctx.Resp, ctx.Err = templateservice.GetYamlTemplateReference(c.Param("id"), ctx.Logger) +} + +type updateYamlTemplateVariablesReq struct { + Variables []*templateservice.Variable `json:"variables"` +} + +func UpdateYamlTemplateVariables(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + + req := &updateYamlTemplateVariablesReq{} + if err := c.ShouldBindJSON(req); err != nil { + ctx.Err = err + return + } + + ctx.Err = templateservice.UpdateYamlTemplateVariables(c.Param("id"), req.Variables, ctx.Logger) +} diff --git a/pkg/microservice/aslan/core/templatestore/repository/models/dockerfile.go b/pkg/microservice/aslan/core/templatestore/repository/models/dockerfile.go new file mode 100644 index 000000000..19ab53dbe --- /dev/null +++ b/pkg/microservice/aslan/core/templatestore/repository/models/dockerfile.go @@ -0,0 +1,13 @@ +package models + +import "go.mongodb.org/mongo-driver/bson/primitive" + +type DockerfileTemplate struct { + ID primitive.ObjectID `bson:"_id,omitempty" json:"id,omitempty"` + Name string `bson:"name" json:"name"` + Content string `bson:"content" json:"content"` +} + +func (DockerfileTemplate) TableName() string { + return "dockerfile_template" +} diff --git a/pkg/microservice/aslan/core/templatestore/repository/mongodb/dockerfile.go b/pkg/microservice/aslan/core/templatestore/repository/mongodb/dockerfile.go new file mode 100644 index 000000000..a904efc54 --- /dev/null +++ b/pkg/microservice/aslan/core/templatestore/repository/mongodb/dockerfile.go @@ -0,0 +1,116 @@ +package mongodb + +import ( + "context" + "fmt" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/bson/primitive" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" + + "github.com/koderover/zadig/pkg/microservice/aslan/config" + "github.com/koderover/zadig/pkg/microservice/aslan/core/templatestore/repository/models" + mongotool "github.com/koderover/zadig/pkg/tool/mongo" +) + +type DockerfileTemplateColl struct { + *mongo.Collection + + coll string +} + +func NewDockerfileTemplateColl() *DockerfileTemplateColl { + name := models.DockerfileTemplate{}.TableName() + return &DockerfileTemplateColl{ + Collection: mongotool.Database(config.MongoDatabase()).Collection(name), + coll: name, + } +} + +func (c *DockerfileTemplateColl) GetCollectionName() string { + return c.coll +} + +func (c *DockerfileTemplateColl) EnsureIndex(ctx context.Context) error { + mod := mongo.IndexModel{ + Keys: bson.M{"name": 1}, + Options: options.Index().SetUnique(true), + } + + _, err := c.Indexes().CreateOne(ctx, mod) + + return err +} + +func (c *DockerfileTemplateColl) Create(obj *models.DockerfileTemplate) error { + if obj == nil { + return fmt.Errorf("nil object") + } + + _, err := c.InsertOne(context.TODO(), obj) + return err +} + +func (c *DockerfileTemplateColl) Update(idString string, obj *models.DockerfileTemplate) error { + if obj == nil { + return fmt.Errorf("nil object") + } + id, err := primitive.ObjectIDFromHex(idString) + if err != nil { + return fmt.Errorf("invalid id") + } + filter := bson.M{"_id": id} + update := bson.M{"$set": obj} + + _, err = c.UpdateOne(context.TODO(), filter, update) + return err +} + +func (c *DockerfileTemplateColl) List(pageNum, pageSize int) ([]*models.DockerfileTemplate, int, error) { + resp := make([]*models.DockerfileTemplate, 0) + query := bson.M{} + count, err := c.CountDocuments(context.TODO(), query) + if err != nil { + return nil, 0, err + } + opt := options.Find(). + SetSkip(int64((pageNum - 1) * pageSize)). + SetLimit(int64(pageSize)) + + cursor, err := c.Collection.Find(context.TODO(), query, opt) + if err != nil { + return nil, 0, err + } + err = cursor.All(context.TODO(), &resp) + if err != nil { + return nil, 0, err + } + return resp, int(count), nil +} + +func (c *DockerfileTemplateColl) GetById(idstring string) (*models.DockerfileTemplate, error) { + resp := new(models.DockerfileTemplate) + id, err := primitive.ObjectIDFromHex(idstring) + if err != nil { + return nil, err + } + query := bson.M{"_id": id} + + err = c.FindOne(context.TODO(), query).Decode(&resp) + if err != nil { + return nil, err + } + return resp, nil +} + +func (c *DockerfileTemplateColl) DeleteByID(idstring string) error { + id, err := primitive.ObjectIDFromHex(idstring) + if err != nil { + return err + } + query := bson.M{"_id": id} + + _, err = c.DeleteOne(context.TODO(), query) + return err +} diff --git a/pkg/microservice/aslan/core/templatestore/service/dockerfile.go b/pkg/microservice/aslan/core/templatestore/service/dockerfile.go new file mode 100644 index 000000000..2fa442464 --- /dev/null +++ b/pkg/microservice/aslan/core/templatestore/service/dockerfile.go @@ -0,0 +1,171 @@ +package service + +import ( + "errors" + "fmt" + "strings" + + dockerfileinstructions "github.com/moby/buildkit/frontend/dockerfile/instructions" + dockerfileparser "github.com/moby/buildkit/frontend/dockerfile/parser" + "go.uber.org/zap" + + commonrepo "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/mongodb" + "github.com/koderover/zadig/pkg/microservice/aslan/core/templatestore/repository/models" + "github.com/koderover/zadig/pkg/microservice/aslan/core/templatestore/repository/mongodb" + "github.com/koderover/zadig/pkg/setting" +) + +func CreateDockerfileTemplate(template *DockerfileTemplate, logger *zap.SugaredLogger) error { + err := mongodb.NewDockerfileTemplateColl().Create(&models.DockerfileTemplate{ + Name: template.Name, + Content: template.Content, + }) + if err != nil { + logger.Errorf("create dockerfile template error: %s", err) + } + return err +} + +func UpdateDockerfileTemplate(id string, template *DockerfileTemplate, logger *zap.SugaredLogger) error { + err := mongodb.NewDockerfileTemplateColl().Update( + id, + &models.DockerfileTemplate{ + Name: template.Name, + Content: template.Content, + }, + ) + if err != nil { + logger.Errorf("update dockerfile template error: %s", err) + } + return err +} + +func ListDockerfileTemplate(pageNum, pageSize int, logger *zap.SugaredLogger) ([]*DockerfileListObject, int, error) { + resp := make([]*DockerfileListObject, 0) + templateList, total, err := mongodb.NewDockerfileTemplateColl().List(pageNum, pageSize) + if err != nil { + logger.Errorf("list dockerfile template error: %s", err) + return resp, 0, err + } + for _, obj := range templateList { + resp = append(resp, &DockerfileListObject{ + ID: obj.ID.Hex(), + Name: obj.Name, + }) + } + return resp, total, err +} + +func GetDockerfileTemplateDetail(id string, logger *zap.SugaredLogger) (*DockerfileDetail, error) { + resp := new(DockerfileDetail) + dockerfileTemplate, err := mongodb.NewDockerfileTemplateColl().GetById(id) + if err != nil { + logger.Errorf("Failed to get dockerfile template from id: %s, the error is: %s", id, err) + return nil, err + } + variables, err := getVariables(dockerfileTemplate.Content, logger) + if err != nil { + return nil, errors.New("failed to get variables from dockerfile") + } + resp.ID = dockerfileTemplate.ID.Hex() + resp.Name = dockerfileTemplate.Name + resp.Content = dockerfileTemplate.Content + resp.Variables = variables + return resp, nil +} + +func DeleteDockerfileTemplate(id string, logger *zap.SugaredLogger) error { + ref, err := commonrepo.NewBuildColl().GetDockerfileTemplateReference(id) + if err != nil { + logger.Errorf("Failed to get build reference for template id: %s, the error is: %s", id, err) + return err + } + if len(ref) > 0 { + return errors.New("this template is in use") + } + err = mongodb.NewDockerfileTemplateColl().DeleteByID(id) + if err != nil { + logger.Errorf("Failed to delete dockerfile template of id: %s, the error is: %s", id, err) + } + return err +} + +func GetDockerfileTemplateReference(id string, logger *zap.SugaredLogger) ([]*BuildReference, error) { + ret := make([]*BuildReference, 0) + referenceList, err := commonrepo.NewBuildColl().GetDockerfileTemplateReference(id) + if err != nil { + logger.Errorf("Failed to get build reference for dockerfile template id: %s, the error is: %s", id, err) + return ret, err + } + for _, reference := range referenceList { + ret = append(ret, &BuildReference{ + BuildName: reference.Name, + ProjectName: reference.ProductName, + }) + } + return ret, nil +} + +func ValidateDockerfileTemplate(template string, logger *zap.SugaredLogger) error { + // some dockerfile validation stuff + reader := strings.NewReader(template) + result, err := dockerfileparser.Parse(reader) + if err != nil { + return err + } + _, _, err = dockerfileinstructions.Parse(result.AST) + if err != nil { + return err + } + return nil +} + +func getVariables(s string, logger *zap.SugaredLogger) ([]*Variable, error) { + ret := make([]*Variable, 0) + reader := strings.NewReader(s) + result, err := dockerfileparser.Parse(reader) + if err != nil { + logger.Errorf("Failed to parse the dockerfile from source, the error is: %s", err) + return []*Variable{}, err + } + stages, metaArgs, err := dockerfileinstructions.Parse(result.AST) + if err != nil { + logger.Errorf("Failed to parse stages from generated dockerfile AST, the error is: %s", err) + return []*Variable{}, err + } + keyMap := make(map[string]int) + for _, metaArg := range metaArgs { + for _, arg := range metaArg.Args { + if keyMap[arg.Key] == 0 { + ret = append(ret, &Variable{ + Key: arg.Key, + Value: arg.ValueString(), + }) + keyMap[arg.Key] = 1 + } + } + } + for _, stage := range stages { + for _, command := range stage.Commands { + if command.Name() == setting.DockerfileCmdArg { + fullCommand := fmt.Sprintf("%s", command) + commandContent := strings.Split(fullCommand, " ")[1] + kv := strings.Split(commandContent, "=") + key := kv[0] + value := "" + if len(kv) > 1 { + value = kv[1] + } + // if key has not been added yet + if keyMap[key] == 0 { + ret = append(ret, &Variable{ + Key: key, + Value: value, + }) + keyMap[key] = 1 + } + } + } + } + return ret, nil +} diff --git a/pkg/microservice/aslan/core/templatestore/service/types.go b/pkg/microservice/aslan/core/templatestore/service/types.go index da8cdeb74..92beafe2e 100644 --- a/pkg/microservice/aslan/core/templatestore/service/types.go +++ b/pkg/microservice/aslan/core/templatestore/service/types.go @@ -28,3 +28,54 @@ type Chart struct { Files []*fs.FileInfo `json:"files,omitempty"` } + +type DockerfileTemplate struct { + Name string `json:"name"` + Content string `json:"content"` +} + +type DockerfileListObject struct { + ID string `json:"id"` + Name string `json:"name"` +} + +type DockerfileDetail struct { + ID string `json:"id"` + Name string `json:"name"` + Content string `json:"content"` + Variables []*Variable `json:"variable"` +} + +type Variable struct { + Key string `json:"key"` + Value string `json:"value,omitempty"` + Description string `json:"description,omitempty"` +} + +type BuildReference struct { + BuildName string `json:"build_name"` + ProjectName string `json:"project_name"` +} + +type YamlTemplate struct { + Name string `json:"name"` + Content string `json:"content"` + Variable []*Variable `json:"variable"` +} + +type YamlListObject struct { + ID string `json:"id"` + Name string `json:"name"` +} + +type YamlDetail struct { + ID string `json:"id"` + Name string `json:"name"` + Content string `json:"content"` + Variables []*Variable `json:"variable"` +} + +type ServiceReference struct { + ProjectName string `json:"project_name"` + ServiceName string `json:"service_name"` +} diff --git a/pkg/microservice/aslan/core/templatestore/service/yaml.go b/pkg/microservice/aslan/core/templatestore/service/yaml.go new file mode 100644 index 000000000..fc382dffb --- /dev/null +++ b/pkg/microservice/aslan/core/templatestore/service/yaml.go @@ -0,0 +1,212 @@ +package service + +import ( + "errors" + "fmt" + "regexp" + "strings" + + "go.uber.org/zap" + + "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/models" + "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/mongodb" + commonrepo "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/mongodb" + "github.com/koderover/zadig/pkg/setting" +) + +var DefaultSystemVariable = map[string]string{ + setting.TemplateVariableProduct: setting.TemplateVariableProductDescription, + setting.TemplateVariableService: setting.TemplateVariableServiceDescription, +} + +func CreateYamlTemplate(template *YamlTemplate, logger *zap.SugaredLogger) error { + variableList, err := getYamlVariables(template.Content, logger) + if err != nil { + return err + } + variables := make([]*models.Variable, 0) + for _, v := range variableList { + variables = append(variables, &models.Variable{ + Key: v.Key, + Value: v.Value, + }) + } + err = mongodb.NewYamlTemplateColl().Create(&models.YamlTemplate{ + Name: template.Name, + Content: template.Content, + Variables: variables, + }) + if err != nil { + logger.Errorf("create dockerfile template error: %s", err) + } + return err +} + +func UpdateYamlTemplate(id string, template *YamlTemplate, logger *zap.SugaredLogger) error { + variableList, err := getYamlVariables(template.Content, logger) + if err != nil { + return err + } + variables := make([]*models.Variable, 0) + for _, v := range variableList { + variables = append(variables, &models.Variable{ + Key: v.Key, + Value: v.Value, + }) + } + err = mongodb.NewYamlTemplateColl().Update( + id, + &models.YamlTemplate{ + Name: template.Name, + Content: template.Content, + Variables: variables, + }, + ) + if err != nil { + logger.Errorf("update dockerfile template error: %s", err) + } + return err +} + +func ListYamlTemplate(pageNum, pageSize int, logger *zap.SugaredLogger) ([]*YamlListObject, int, error) { + resp := make([]*YamlListObject, 0) + templateList, total, err := mongodb.NewYamlTemplateColl().List(pageNum, pageSize) + if err != nil { + logger.Errorf("list dockerfile template error: %s", err) + return resp, 0, err + } + for _, obj := range templateList { + resp = append(resp, &YamlListObject{ + ID: obj.ID.Hex(), + Name: obj.Name, + }) + } + return resp, total, err +} + +func GetYamlTemplateDetail(id string, logger *zap.SugaredLogger) (*YamlDetail, error) { + resp := new(YamlDetail) + yamlTemplate, err := mongodb.NewYamlTemplateColl().GetById(id) + if err != nil { + logger.Errorf("Failed to get dockerfile template from id: %s, the error is: %s", id, err) + return nil, err + } + variables := make([]*Variable, 0) + for _, v := range yamlTemplate.Variables { + variables = append(variables, &Variable{ + Key: v.Key, + Value: v.Value, + }) + } + resp.ID = yamlTemplate.ID.Hex() + resp.Name = yamlTemplate.Name + resp.Content = yamlTemplate.Content + resp.Variables = variables + return resp, nil +} + +func DeleteYamlTemplate(id string, logger *zap.SugaredLogger) error { + ref, err := commonrepo.NewServiceColl().GetTemplateReference(id) + if err != nil { + logger.Errorf("Failed to get service reference for template id: %s, the error is: %s", id, err) + return err + } + if len(ref) > 0 { + return errors.New("this template is in use") + } + err = mongodb.NewYamlTemplateColl().DeleteByID(id) + if err != nil { + logger.Errorf("Failed to delete dockerfile template of id: %s, the error is: %s", id, err) + } + return err +} + +func GetYamlTemplateReference(id string, logger *zap.SugaredLogger) ([]*ServiceReference, error) { + ret := make([]*ServiceReference, 0) + referenceList, err := commonrepo.NewServiceColl().GetTemplateReference(id) + if err != nil { + logger.Errorf("Failed to get build reference for dockerfile template id: %s, the error is: %s", id, err) + return ret, err + } + for _, reference := range referenceList { + ret = append(ret, &ServiceReference{ + ServiceName: reference.ServiceName, + ProjectName: reference.ProductName, + }) + } + return ret, nil +} + +func UpdateYamlTemplateVariables(id string, variables []*Variable, logger *zap.SugaredLogger) error { + templateDetail, err := mongodb.NewYamlTemplateColl().GetById(id) + if err != nil { + logger.Errorf("Failed to find yaml template of id: %s, the error is: %s", id, err) + return err + } + keyMap := make(map[string]int) + // the keys in database will not collide + for _, v := range templateDetail.Variables { + keyMap[v.Key] = 1 + } + newVars := make([]*models.Variable, 0) + for _, vars := range variables { + if keyMap[vars.Key] == 0 { + errorMsg := fmt.Sprintf("Given key [%s] does not exist in yaml template [%s]", vars.Key, id) + return errors.New(errorMsg) + } + newVars = append(newVars, &models.Variable{ + Key: vars.Key, + Value: vars.Value, + }) + } + err = mongodb.NewYamlTemplateColl().Update( + id, + &models.YamlTemplate{ + Name: templateDetail.Name, + Content: templateDetail.Content, + Variables: newVars, + }, + ) + if err != nil { + logger.Errorf("update dockerfile template error: %s", err) + } + return err +} + +func getYamlVariables(s string, logger *zap.SugaredLogger) ([]*Variable, error) { + resp := make([]*Variable, 0) + regex, err := regexp.Compile(setting.RegExpParameter) + if err != nil { + logger.Errorf("Cannot get regexp from the expression: %s, the error is: %s", setting.RegExpParameter, err) + return []*Variable{}, err + } + params := regex.FindAllString(s, -1) + keyMap := make(map[string]int) + for _, param := range params { + key := getParameterKey(param) + if keyMap[key] == 0 { + resp = append(resp, &Variable{ + Key: key, + }) + keyMap[key] = 1 + } + } + return resp, nil +} + +func GetSystemDefaultVariables() []*Variable { + resp := make([]*Variable, 0) + for key, description := range DefaultSystemVariable { + resp = append(resp, &Variable{ + Key: key, + Description: description, + }) + } + return resp +} + +// getParameter +func getParameterKey(parameter string) string { + a := strings.TrimPrefix(parameter, "{{.") + return strings.TrimSuffix(a, "}}") +} diff --git a/pkg/microservice/aslan/core/workflow/handler/build.go b/pkg/microservice/aslan/core/workflow/handler/build.go index 2fed933db..aeec1312c 100644 --- a/pkg/microservice/aslan/core/workflow/handler/build.go +++ b/pkg/microservice/aslan/core/workflow/handler/build.go @@ -19,6 +19,7 @@ package handler import ( "github.com/gin-gonic/gin" + "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/models" "github.com/koderover/zadig/pkg/microservice/aslan/core/workflow/service/workflow" internalhandler "github.com/koderover/zadig/pkg/shared/handler" ) @@ -27,7 +28,11 @@ func BuildModuleToSubTasks(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - resp, err := workflow.BuildModuleToSubTasks(c.Param("name"), "", "", c.Query("projectName"), nil, nil, ctx.Logger) + args := &models.BuildModuleArgs{ + BuildName: c.Param("name"), + ProductName: c.Query("productName"), + } + resp, err := workflow.BuildModuleToSubTasks(args, ctx.Logger) if err != nil { ctx.Err = err return diff --git a/pkg/microservice/aslan/core/workflow/handler/workflow_task.go b/pkg/microservice/aslan/core/workflow/handler/workflow_task.go index bb3bb8515..81a250a3d 100644 --- a/pkg/microservice/aslan/core/workflow/handler/workflow_task.go +++ b/pkg/microservice/aslan/core/workflow/handler/workflow_task.go @@ -105,11 +105,11 @@ func CreateWorkflowTask(c *gin.Context) { return } - if args.WorklowTaskCreator != setting.CronTaskCreator && args.WorklowTaskCreator != setting.WebhookTaskCreator { - args.WorklowTaskCreator = ctx.UserName + if args.WorkflowTaskCreator != setting.CronTaskCreator && args.WorkflowTaskCreator != setting.WebhookTaskCreator { + args.WorkflowTaskCreator = ctx.UserName } - ctx.Resp, ctx.Err = workflow.CreateWorkflowTask(args, args.WorklowTaskCreator, ctx.Logger) + ctx.Resp, ctx.Err = workflow.CreateWorkflowTask(args, args.WorkflowTaskCreator, ctx.Logger) // 发送通知 if ctx.Err != nil { @@ -138,11 +138,11 @@ func CreateArtifactWorkflowTask(c *gin.Context) { return } - if args.WorklowTaskCreator != setting.CronTaskCreator && args.WorklowTaskCreator != setting.WebhookTaskCreator { - args.WorklowTaskCreator = ctx.UserName + if args.WorkflowTaskCreator != setting.CronTaskCreator && args.WorkflowTaskCreator != setting.WebhookTaskCreator { + args.WorkflowTaskCreator = ctx.UserName } - ctx.Resp, ctx.Err = workflow.CreateArtifactWorkflowTask(args, args.WorklowTaskCreator, ctx.Logger) + ctx.Resp, ctx.Err = workflow.CreateArtifactWorkflowTask(args, args.WorkflowTaskCreator, ctx.Logger) } // ListWorkflowTasksResult workflowtask分页信息 diff --git a/pkg/microservice/aslan/core/workflow/service/webhook/github_workflow_task.go b/pkg/microservice/aslan/core/workflow/service/webhook/github_workflow_task.go index dcefdc6cd..175bc6bb8 100644 --- a/pkg/microservice/aslan/core/workflow/service/webhook/github_workflow_task.go +++ b/pkg/microservice/aslan/core/workflow/service/webhook/github_workflow_task.go @@ -149,7 +149,7 @@ type workflowArgsFactory struct { func (waf *workflowArgsFactory) Update(product *commonmodels.Product, args *commonmodels.WorkflowTaskArgs, repo *types.Repository) *commonmodels.WorkflowTaskArgs { workflow := waf.workflow args.WorkflowName = workflow.Name - args.WorklowTaskCreator = setting.WebhookTaskCreator + args.WorkflowTaskCreator = setting.WebhookTaskCreator args.ProductTmplName = workflow.ProductTmplName args.ReqID = waf.reqID var targetMap map[string][]commonmodels.DeployEnv diff --git a/pkg/microservice/aslan/core/workflow/service/workflow/nsq_handlers.go b/pkg/microservice/aslan/core/workflow/service/workflow/nsq_handlers.go index 0b2692b2e..01f804ac2 100644 --- a/pkg/microservice/aslan/core/workflow/service/workflow/nsq_handlers.go +++ b/pkg/microservice/aslan/core/workflow/service/workflow/nsq_handlers.go @@ -244,8 +244,10 @@ func (h *TaskAckHandler) uploadTaskData(pt *task.Task) error { deliveryArtifact.ImageTag = buildInfo.JobCtx.FileArchiveCtx.FileName deliveryArtifact.Type = string(config.File) deliveryArtifact.PackageFileLocation = buildInfo.JobCtx.FileArchiveCtx.FileLocation - storageInfo, _ := s3.NewS3StorageFromEncryptedURI(pt.StorageURI) - deliveryArtifact.PackageStorageURI = storageInfo.Endpoint + if storageInfo, err := s3.NewS3StorageFromEncryptedURI(pt.StorageURI); err == nil { + deliveryArtifact.PackageStorageURI = storageInfo.Endpoint + "/" + storageInfo.Bucket + } + deliveryArtifactArray = append(deliveryArtifactArray, deliveryArtifact) } diff --git a/pkg/microservice/aslan/core/workflow/service/workflow/pipeline_task.go b/pkg/microservice/aslan/core/workflow/service/workflow/pipeline_task.go index 556a23a8d..c59d90c16 100644 --- a/pkg/microservice/aslan/core/workflow/service/workflow/pipeline_task.go +++ b/pkg/microservice/aslan/core/workflow/service/workflow/pipeline_task.go @@ -68,7 +68,9 @@ func CreatePipelineTask(args *commonmodels.TaskArgs, log *zap.SugaredLogger) (*C // 如果用户使用预定义编译配置, 则从编译模块配置中生成SubTasks if pipeline.BuildModuleVer != "" { - subTasks, err := BuildModuleToSubTasks("", pipeline.Target, "", "", nil, nil, log) + subTasks, err := BuildModuleToSubTasks(&commonmodels.BuildModuleArgs{ + Target: pipeline.Target, + }, log) if err != nil { return nil, e.ErrCreateTask.AddErr(err) } @@ -923,20 +925,15 @@ func GePackageFileContent(pipelineName string, taskID int64, log *zap.SugaredLog } func GetArtifactFileContent(pipelineName string, taskID int64, log *zap.SugaredLogger) ([]byte, error) { - s3Storage, artifactFiles, _ := GetTestArtifactInfo(pipelineName, "", taskID, log) - tempdir, _ := ioutil.TempDir("", "") - sourcePath := path.Join(tempdir, "artifact") + s3Storage, client, artifactFiles, err := GetArtifactAndS3Info(pipelineName, "", taskID, log) + if err != nil { + return nil, fmt.Errorf("download artifact err: %s", err) + } + tempDir, _ := ioutil.TempDir("", "") + sourcePath := path.Join(tempDir, "artifact") if _, err := os.Stat(sourcePath); os.IsNotExist(err) { _ = os.MkdirAll(sourcePath, 0777) } - forcedPathStyle := true - if s3Storage.Provider == setting.ProviderSourceAli { - forcedPathStyle = false - } - client, err := s3tool.NewClient(s3Storage.Endpoint, s3Storage.Ak, s3Storage.Sk, s3Storage.Insecure, forcedPathStyle) - if err != nil { - return nil, fmt.Errorf("failed to create s3 client , error: %v", err) - } for _, artifactFile := range artifactFiles { artifactFileArr := strings.Split(artifactFile, "/") @@ -947,12 +944,10 @@ func GetArtifactFileContent(pipelineName string, taskID int64, log *zap.SugaredL return nil, fmt.Errorf("failed to create file %s %v", artifactFileName, err) } defer func() { - file.Close() - os.Remove(path.Join(sourcePath, artifactFileName)) + _ = file.Close() }() - objectKey := s3Storage.GetObjectPath(artifactFile) - err = client.Download(s3Storage.Bucket, objectKey, file.Name()) + err = client.Download(s3Storage.Bucket, artifactFile, file.Name()) if err != nil { return nil, fmt.Errorf("failed to download %s %v", artifactFile, err) } @@ -967,20 +962,20 @@ func GetArtifactFileContent(pipelineName string, taskID int64, log *zap.SugaredL } defer func() { _ = os.Remove(artifactTarFileName) - _ = os.Remove(tempdir) + _ = os.Remove(tempDir) }() fileBytes, err := ioutil.ReadFile(path.Join(sourcePath, "artifact.tar.gz")) return fileBytes, err } -func GetTestArtifactInfo(pipelineName, dir string, taskID int64, log *zap.SugaredLogger) (*s3.S3, []string, error) { +func GetArtifactAndS3Info(pipelineName, dir string, taskID int64, log *zap.SugaredLogger) (*s3.S3, *s3tool.Client, []string, error) { fis := make([]string, 0) storage, err := s3.FindDefaultS3() if err != nil { log.Errorf("GetTestArtifactInfo FindDefaultS3 err:%v", err) - return nil, fis, nil + return nil, nil, fis, err } if storage.Subfolder != "" { @@ -995,13 +990,13 @@ func GetTestArtifactInfo(pipelineName, dir string, taskID int64, log *zap.Sugare client, err := s3tool.NewClient(storage.Endpoint, storage.Ak, storage.Sk, storage.Insecure, forcedPathStyle) if err != nil { log.Errorf("GetTestArtifactInfo Create S3 client err:%+v", err) - return nil, fis, nil + return nil, nil, fis, err } prefix := storage.GetObjectPath(dir) files, err := client.ListFiles(storage.Bucket, prefix, true) if err != nil || len(files) <= 0 { log.Errorf("GetTestArtifactInfo ListFiles err:%v", err) - return nil, fis, nil + return nil, nil, fis, err } - return storage, files, nil + return storage, client, files, nil } diff --git a/pkg/microservice/aslan/core/workflow/service/workflow/pipeline_validation.go b/pkg/microservice/aslan/core/workflow/service/workflow/pipeline_validation.go index f233e98f1..797cbd470 100644 --- a/pkg/microservice/aslan/core/workflow/service/workflow/pipeline_validation.go +++ b/pkg/microservice/aslan/core/workflow/service/workflow/pipeline_validation.go @@ -533,7 +533,11 @@ func releaseCandidate(b *task.Build, taskID int64, productName, envName, deliver } switch deliveryType { case config.TarResourceType: - return replaceVariable(customTarRule, candidate) + newTarRule := replaceVariable(customTarRule, candidate) + if strings.Contains(newTarRule, ":") { + return strings.Replace(newTarRule, ":", "-", -1) + } + return newTarRule default: return replaceVariable(customImageRule, candidate) } diff --git a/pkg/microservice/aslan/core/workflow/service/workflow/service_task.go b/pkg/microservice/aslan/core/workflow/service/workflow/service_task.go index a6aa7d813..b15a1f181 100644 --- a/pkg/microservice/aslan/core/workflow/service/workflow/service_task.go +++ b/pkg/microservice/aslan/core/workflow/service/workflow/service_task.go @@ -215,7 +215,12 @@ func CreateServiceTask(args *commonmodels.ServiceTaskArgs, log *zap.SugaredLogge } stages := make([]*commonmodels.Stage, 0) - subTasks, err := BuildModuleToSubTasks("", args.ServiceName, args.ServiceName, args.ProductName, nil, nil, log) + buildModuleArgs := &commonmodels.BuildModuleArgs{ + Target: args.ServiceName, + ServiceName: args.ServiceName, + ProductName: args.ProductName, + } + subTasks, err := BuildModuleToSubTasks(buildModuleArgs, log) if err != nil { return nil, e.ErrCreateTask.AddErr(err) } diff --git a/pkg/microservice/aslan/core/workflow/service/workflow/workflow.go b/pkg/microservice/aslan/core/workflow/service/workflow/workflow.go index bf65a5bba..fc4fdc885 100644 --- a/pkg/microservice/aslan/core/workflow/service/workflow/workflow.go +++ b/pkg/microservice/aslan/core/workflow/service/workflow/workflow.go @@ -60,9 +60,7 @@ func AutoCreateWorkflow(productName string, log *zap.SugaredLogger) *EnvStatus { workflowNames := []string{productName + "-workflow-dev", productName + "-workflow-qa", productName + "-workflow-ops"} // 云主机场景不创建ops工作流 - if productTmpl.ProductFeature != nil && productTmpl.ProductFeature.BasicFacility == "cloud_host" { - workflowNames = []string{productName + "-workflow-dev", productName + "-workflow-qa"} - } else if productTmpl.ProductFeature != nil && productTmpl.ProductFeature.CreateEnvType == setting.SourceFromExternal { + if productTmpl.ProductFeature != nil && productTmpl.ProductFeature.CreateEnvType == setting.SourceFromExternal { workflowNames = []string{productName + "-workflow-dev"} } diff --git a/pkg/microservice/aslan/core/workflow/service/workflow/workflow_task.go b/pkg/microservice/aslan/core/workflow/service/workflow/workflow_task.go index f94144fb0..4184d9aa5 100644 --- a/pkg/microservice/aslan/core/workflow/service/workflow/workflow_task.go +++ b/pkg/microservice/aslan/core/workflow/service/workflow/workflow_task.go @@ -28,6 +28,7 @@ import ( "go.mongodb.org/mongo-driver/mongo" "go.uber.org/zap" + "k8s.io/apimachinery/pkg/util/sets" configbase "github.com/koderover/zadig/pkg/config" "github.com/koderover/zadig/pkg/microservice/aslan/config" @@ -497,7 +498,14 @@ func CreateWorkflowTask(args *commonmodels.WorkflowTaskArgs, taskCreator string, var subTasks []map[string]interface{} var err error if target.JenkinsBuildArgs == nil { - subTasks, err = BuildModuleToSubTasks("", target.Name, target.ServiceName, target.ProductName, target.Envs, env, log) + buildModuleArgs := &commonmodels.BuildModuleArgs{ + Target: target.Name, + ServiceName: target.ServiceName, + ProductName: target.ProductName, + Variables: target.Envs, + Env: env, + } + subTasks, err = BuildModuleToSubTasks(buildModuleArgs, log) } else { subTasks, err = JenkinsBuildModuleToSubTasks(&JenkinsBuildOption{ Target: target.Name, @@ -1095,7 +1103,7 @@ func addSecurityToSubTasks() (map[string]interface{}, error) { } func workFlowArgsToTaskArgs(target string, workflowArgs *commonmodels.WorkflowTaskArgs) *commonmodels.TaskArgs { - resp := &commonmodels.TaskArgs{PipelineName: workflowArgs.WorkflowName, TaskCreator: workflowArgs.WorklowTaskCreator} + resp := &commonmodels.TaskArgs{PipelineName: workflowArgs.WorkflowName, TaskCreator: workflowArgs.WorkflowTaskCreator} for _, build := range workflowArgs.Target { if build.Name == target { if build.Build != nil { @@ -1119,7 +1127,7 @@ func testArgsToSubtask(args *commonmodels.WorkflowTaskArgs, pt *task.Task, log * } testArgs := args.Tests - testCreator := args.WorklowTaskCreator + testCreator := args.WorkflowTaskCreator registries, err := commonservice.ListRegistryNamespaces(log) if err != nil { @@ -1271,34 +1279,54 @@ func CreateArtifactWorkflowTask(args *commonmodels.WorkflowTaskArgs, taskCreator stages := make([]*commonmodels.Stage, 0) for _, artifact := range args.Artifact { subTasks := make([]map[string]interface{}, 0) - artifactSubtask, err := artifactToSubTasks(artifact.Name, artifact.Image) - if err != nil { - log.Errorf("artifactToSubTasks artifact.Name:[%s] err:%v", artifact.Name, err) - return nil, e.ErrCreateTask.AddErr(err) - } - subTasks = append(subTasks, artifactSubtask) - if env != nil { - // 生成部署的subtask - for _, deployEnv := range artifact.Deploy { - deployTask, err := deployEnvToSubTasks(deployEnv, env, productTempl.Timeout) - if err != nil { - log.Errorf("deploy env to subtask error: %v", err) - return nil, err - } - - if workflow.ResetImage { - resetImageTask, err := resetImageTaskToSubTask(deployEnv, env) + // image artifact deploy + if artifact.Image != "" { + artifactSubtask, err := artifactToSubTasks(artifact.Name, artifact.Image) + if err != nil { + log.Errorf("artifactToSubTasks artifact.Name:[%s] err:%v", artifact.Name, err) + return nil, e.ErrCreateTask.AddErr(err) + } + subTasks = append(subTasks, artifactSubtask) + if env != nil { + // 生成部署的subtask + for _, deployEnv := range artifact.Deploy { + deployTask, err := deployEnvToSubTasks(deployEnv, env, productTempl.Timeout) if err != nil { - log.Errorf("resetImageTaskToSubTask deploy env:[%s] err:%v ", deployEnv.Env, err) + log.Errorf("deploy env to subtask error: %v", err) return nil, err } - if resetImageTask != nil { - subTasks = append(subTasks, resetImageTask) - } - } - subTasks = append(subTasks, deployTask) + if workflow.ResetImage { + resetImageTask, err := resetImageTaskToSubTask(deployEnv, env) + if err != nil { + log.Errorf("resetImageTaskToSubTask deploy env:[%s] err:%v ", deployEnv.Env, err) + return nil, err + } + if resetImageTask != nil { + subTasks = append(subTasks, resetImageTask) + } + } + subTasks = append(subTasks, deployTask) + } + } + } else if artifact.FileName != "" { + buildModuleArgs := &commonmodels.BuildModuleArgs{ + Target: artifact.Name, + ServiceName: artifact.ServiceName, + ProductName: args.ProductTmplName, + Env: env, + URL: artifact.URL, + WorkflowName: artifact.WorkflowName, + TaskID: artifact.TaskID, + FileName: artifact.FileName, + TaskType: string(config.TaskArtifactDeploy), + } + buildSubtasks, err := BuildModuleToSubTasks(buildModuleArgs, log) + if err != nil { + log.Errorf("buildModuleToSubTasks target:[%s] err:%s", artifact.Name, err) + return nil, e.ErrCreateTask.AddErr(err) } + subTasks = append(subTasks, buildSubtasks...) } // 生成分发的subtask @@ -1347,12 +1375,15 @@ func CreateArtifactWorkflowTask(args *commonmodels.WorkflowTaskArgs, taskCreator // 填充subtask之间关联内容 task := &task.Task{ + ProductName: args.ProductTmplName, + PipelineName: args.WorkflowName, TaskID: nextTaskID, TaskCreator: taskCreator, ReqID: args.ReqID, SubTasks: subTasks, ServiceName: artifact.Name, ConfigPayload: configPayload, + TaskArgs: workFlowArgsToTaskArgs(artifact.Name, args), WorkflowArgs: args, } sort.Sort(ByTaskKind(task.SubTasks)) @@ -1456,25 +1487,25 @@ func CreateArtifactWorkflowTask(args *commonmodels.WorkflowTaskArgs, taskCreator return resp, nil } -func BuildModuleToSubTasks(moduleName, target, serviceName, productName string, envs []*commonmodels.KeyVal, pro *commonmodels.Product, log *zap.SugaredLogger) ([]map[string]interface{}, error) { +func BuildModuleToSubTasks(args *commonmodels.BuildModuleArgs, log *zap.SugaredLogger) ([]map[string]interface{}, error) { var ( subTasks = make([]map[string]interface{}, 0) serviceTmpl *commonmodels.Service ) opt := &commonrepo.BuildListOption{ - Name: moduleName, - ServiceName: serviceName, - ProductName: productName, + Name: args.BuildName, + ServiceName: args.ServiceName, + ProductName: args.ProductName, } - if len(target) > 0 { - opt.Targets = []string{target} + if len(args.Target) > 0 { + opt.Targets = []string{args.Target} } - if pro != nil { + if args.Env != nil { serviceTmpl, _ = commonservice.GetServiceTemplate( - target, setting.PMDeployType, productName, setting.ProductStatusDeleting, 0, log, + args.Target, setting.PMDeployType, args.ProductName, setting.ProductStatusDeleting, 0, log, ) } @@ -1493,8 +1524,8 @@ func BuildModuleToSubTasks(moduleName, target, serviceName, productName string, TaskType: config.TaskBuild, Enabled: true, InstallItems: module.PreBuild.Installs, - ServiceName: target, - Service: serviceName, + ServiceName: args.Target, + Service: args.ServiceName, JobCtx: task.JobCtx{}, ImageID: module.PreBuild.ImageID, BuildOS: module.PreBuild.BuildOS, @@ -1502,6 +1533,11 @@ func BuildModuleToSubTasks(moduleName, target, serviceName, productName string, ResReq: module.PreBuild.ResReq, Timeout: module.Timeout, Registries: registries, + ProductName: args.ProductName, + } + + if args.TaskType != "" { + build.TaskType = config.TaskArtifactDeploy } // 自定义基础镜像的镜像名称可能会被更新,需要使用ID获取最新的镜像名称 @@ -1519,24 +1555,30 @@ func BuildModuleToSubTasks(moduleName, target, serviceName, productName string, } if serviceTmpl != nil { - build.Namespace = pro.Namespace + build.Namespace = args.Env.Namespace build.ServiceType = setting.PMDeployType envHost := make(map[string][]string) for _, envConfig := range serviceTmpl.EnvConfigs { - privateKeys, err := commonrepo.NewPrivateKeyColl().ListHostIPByIDs(envConfig.HostIDs) + privateKeys, err := commonrepo.NewPrivateKeyColl().ListHostIPByArgs(&commonrepo.ListHostIPArgs{IDs: envConfig.HostIDs}) if err != nil { - log.Errorf("ListNameByIDs err:%s", err) + log.Errorf("ListNameByArgs ids err:%s", err) continue } - for _, privateKey := range privateKeys { - envHost[envConfig.EnvName] = append(envHost[envConfig.EnvName], privateKey.IP) + ips := sets.NewString() + ips = extractHostIPs(privateKeys, ips) + privateKeys, err = commonrepo.NewPrivateKeyColl().ListHostIPByArgs(&commonrepo.ListHostIPArgs{Labels: envConfig.Labels}) + if err != nil { + log.Errorf("ListNameByArgs labels err:%s", err) + continue } + ips = extractHostIPs(privateKeys, ips) + envHost[envConfig.EnvName] = ips.List() } build.EnvHostInfo = envHost } - if pro != nil { - build.EnvName = pro.EnvName + if args.Env != nil { + build.EnvName = args.Env.EnvName } if build.InstallItems == nil { @@ -1583,9 +1625,9 @@ func BuildModuleToSubTasks(moduleName, target, serviceName, productName string, build.JobCtx.EnvVars = make([]*commonmodels.KeyVal, 0) } - if len(envs) > 0 { + if len(args.Variables) > 0 { for _, envVar := range build.JobCtx.EnvVars { - for _, overwrite := range envs { + for _, overwrite := range args.Variables { if overwrite.Key == envVar.Key && overwrite.Value != setting.MaskValue { envVar.Value = overwrite.Value envVar.IsCredential = overwrite.IsCredential @@ -1601,6 +1643,8 @@ func BuildModuleToSubTasks(moduleName, target, serviceName, productName string, if module.PostBuild != nil && module.PostBuild.DockerBuild != nil { build.JobCtx.DockerBuildCtx = &task.DockerBuildCtx{ + Source: module.PostBuild.DockerBuild.Source, + TemplateID: module.PostBuild.DockerBuild.TemplateID, WorkDir: module.PostBuild.DockerBuild.WorkDir, DockerFile: module.PostBuild.DockerBuild.DockerFile, BuildArgs: module.PostBuild.DockerBuild.BuildArgs, @@ -1619,6 +1663,15 @@ func BuildModuleToSubTasks(moduleName, target, serviceName, productName string, build.JobCtx.Caches = module.Caches + if args.FileName != "" { + build.ArtifactInfo = &task.ArtifactInfo{ + URL: args.URL, + WorkflowName: args.WorkflowName, + TaskID: args.TaskID, + FileName: args.FileName, + } + } + bst, err := build.ToSubTask() if err != nil { return subTasks, e.ErrConvertSubTasks.AddErr(err) @@ -1629,6 +1682,13 @@ func BuildModuleToSubTasks(moduleName, target, serviceName, productName string, return subTasks, nil } +func extractHostIPs(privateKeys []*commonmodels.PrivateKey, ips sets.String) sets.String { + for _, privateKey := range privateKeys { + ips.Insert(privateKey.IP) + } + return ips +} + func ensurePipelineTask(pt *task.Task, envName string, log *zap.SugaredLogger) error { var ( buildEnvs []*commonmodels.KeyVal @@ -1651,7 +1711,7 @@ func ensurePipelineTask(pt *task.Task, envName string, log *zap.SugaredLogger) e switch pre.TaskType { - case config.TaskBuild: + case config.TaskBuild, config.TaskArtifactDeploy: t, err := base.ToBuildTask(subTask) fmtBuildsTask(t, log) if err != nil { @@ -1798,7 +1858,7 @@ func ensurePipelineTask(pt *task.Task, envName string, log *zap.SugaredLogger) e } if t.Enabled { if pt.TaskArgs == nil { - pt.TaskArgs = &commonmodels.TaskArgs{PipelineName: pt.WorkflowArgs.WorkflowName, TaskCreator: pt.WorkflowArgs.WorklowTaskCreator} + pt.TaskArgs = &commonmodels.TaskArgs{PipelineName: pt.WorkflowArgs.WorkflowName, TaskCreator: pt.WorkflowArgs.WorkflowTaskCreator} } registry := pt.ConfigPayload.RepoConfigs[pt.WorkflowArgs.RegistryID] t.Image = fmt.Sprintf("%s/%s/%s", util.GetURLHostName(registry.RegAddr), registry.Namespace, t.Image) diff --git a/pkg/microservice/aslan/core/workflow/testing/handler/workspace.go b/pkg/microservice/aslan/core/workflow/testing/handler/workspace.go index 3c8ef86f6..69171697a 100644 --- a/pkg/microservice/aslan/core/workflow/testing/handler/workspace.go +++ b/pkg/microservice/aslan/core/workflow/testing/handler/workspace.go @@ -38,5 +38,5 @@ func GetTestArtifactInfo(c *gin.Context) { dir := c.Query("dir") - _, ctx.Resp, ctx.Err = service.GetTestArtifactInfo(c.Param("pipelineName"), dir, taskID, ctx.Logger) + ctx.Resp, ctx.Err = service.GetTestArtifactInfo(c.Param("pipelineName"), dir, taskID, ctx.Logger) } diff --git a/pkg/microservice/aslan/core/workflow/testing/service/workspace.go b/pkg/microservice/aslan/core/workflow/testing/service/workspace.go index 7f7916129..da56a35e0 100644 --- a/pkg/microservice/aslan/core/workflow/testing/service/workspace.go +++ b/pkg/microservice/aslan/core/workflow/testing/service/workspace.go @@ -18,22 +18,22 @@ package service import ( "fmt" + "path" "go.uber.org/zap" - commonmodels "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/models" "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/s3" "github.com/koderover/zadig/pkg/setting" s3tool "github.com/koderover/zadig/pkg/tool/s3" ) -func GetTestArtifactInfo(pipelineName, dir string, taskID int64, log *zap.SugaredLogger) (*commonmodels.S3Storage, []string, error) { +func GetTestArtifactInfo(pipelineName, dir string, taskID int64, log *zap.SugaredLogger) ([]string, error) { fis := make([]string, 0) storage, err := s3.FindDefaultS3() if err != nil { log.Errorf("GetTestArtifactInfo FindDefaultS3 err:%v", err) - return nil, fis, nil + return fis, err } if storage.Subfolder != "" { storage.Subfolder = fmt.Sprintf("%s/%s/%d/%s", storage.Subfolder, pipelineName, taskID, "artifact") @@ -47,13 +47,18 @@ func GetTestArtifactInfo(pipelineName, dir string, taskID int64, log *zap.Sugare client, err := s3tool.NewClient(storage.Endpoint, storage.Ak, storage.Sk, storage.Insecure, forcedPathStyle) if err != nil { log.Errorf("GetTestArtifactInfo create s3 client err:%v", err) - return nil, fis, nil + return fis, err } prefix := storage.GetObjectPath(dir) files, err := client.ListFiles(storage.Bucket, prefix, true) if err != nil || len(files) <= 0 { log.Errorf("GetTestArtifactInfo ListFiles err:%v", err) - return nil, fis, nil + return fis, err } - return storage.S3Storage, files, nil + resp := make([]string, 0) + for _, file := range files { + _, fileName := path.Split(file) + resp = append(resp, fileName) + } + return resp, nil } diff --git a/pkg/microservice/cron/core/service/types.go b/pkg/microservice/cron/core/service/types.go index ecce072b2..f1c5c917c 100644 --- a/pkg/microservice/cron/core/service/types.go +++ b/pkg/microservice/cron/core/service/types.go @@ -260,6 +260,7 @@ type WorkflowTaskArgs struct { VersionArgs *VersionArgs `bson:"version_args,omitempty" json:"version_args,omitempty"` ReqID string `bson:"req_id" json:"req_id"` RegistryID string `bson:"registry_id,omitempty" json:"registry_id,omitempty"` + StorageID string `bson:"storage_id,omitempty" json:"storage_id,omitempty"` DistributeEnabled bool `bson:"distribute_enabled" json:"distribute_enabled"` WorklowTaskCreator string `bson:"workflow_task_creator" json:"workflow_task_creator"` // Ignore docker build cache diff --git a/pkg/microservice/reaper/core/service/client/client.go b/pkg/microservice/reaper/core/service/client/client.go new file mode 100644 index 000000000..bd90314db --- /dev/null +++ b/pkg/microservice/reaper/core/service/client/client.go @@ -0,0 +1,25 @@ +package client + +import ( + "net/http" + "net/http/cookiejar" +) + +type Client struct { + APIBase string + Token string + Conn *http.Client +} + +// NewAslanClient is to get aslan client func +func NewAslanClient(host, token string) *Client { + jar, _ := cookiejar.New(nil) + + c := &Client{ + Token: token, + APIBase: host, + Conn: &http.Client{Transport: http.DefaultTransport, Jar: jar}, + } + + return c +} diff --git a/pkg/microservice/reaper/core/service/client/dockerfile.go b/pkg/microservice/reaper/core/service/client/dockerfile.go new file mode 100644 index 000000000..211f5edb7 --- /dev/null +++ b/pkg/microservice/reaper/core/service/client/dockerfile.go @@ -0,0 +1,44 @@ +package client + +import ( + "encoding/json" + "fmt" + "io/ioutil" + "net/http" + + "github.com/pkg/errors" + + "github.com/koderover/zadig/pkg/tool/log" +) + +type Dockerfile struct { + ID string `json:"id"` + Name string `json:"name"` + Content string `json:"content"` +} + +func (c *Client) GetDockerfile(id string) (*Dockerfile, error) { + resp := new(Dockerfile) + var err error + + url := fmt.Sprintf("%s/api/template/dockerfile/%s", c.APIBase, id) + request, err := http.NewRequest("GET", url, nil) + if err != nil { + log.Errorf("new http request error: %v", err) + return nil, err + } + // No auth required + var ret *http.Response + if ret, err = c.Conn.Do(request); err == nil { + defer func() { _ = ret.Body.Close() }() + var body []byte + body, err = ioutil.ReadAll(ret.Body) + if err == nil { + if err = json.Unmarshal(body, &resp); err == nil { + return resp, nil + } + } + } + + return resp, errors.WithMessage(err, "failed to get dockerfile template") +} diff --git a/pkg/microservice/reaper/core/service/meta/types.go b/pkg/microservice/reaper/core/service/meta/types.go index 7dfd43373..1720cc789 100644 --- a/pkg/microservice/reaper/core/service/meta/types.go +++ b/pkg/microservice/reaper/core/service/meta/types.go @@ -24,10 +24,13 @@ import ( "strings" "github.com/koderover/zadig/pkg/microservice/reaper/config" + "github.com/koderover/zadig/pkg/setting" ) // Context ... type Context struct { + // API token 服务访问使用的api token + APIToken string `yaml:"api_token"` // Workspace 容器工作目录 [必填] Workspace string `yaml:"workspace"` @@ -106,11 +109,19 @@ type Context struct { // IgnoreCache ignore docker build cache [runtime] IgnoreCache bool `yaml:"ignore_cache"` - StorageEndpoint string `yaml:"storage_endpoint"` - StorageAK string `yaml:"storage_ak"` - StorageSK string `yaml:"storage_sk"` - StorageBucket string `yaml:"storage_bucket"` - StorageProvider int `yaml:"storage_provider"` + StorageEndpoint string `yaml:"storage_endpoint"` + StorageAK string `yaml:"storage_ak"` + StorageSK string `yaml:"storage_sk"` + StorageBucket string `yaml:"storage_bucket"` + StorageProvider int `yaml:"storage_provider"` + ArtifactInfo *ArtifactInfo `yaml:"artifact_info"` +} + +type ArtifactInfo struct { + URL string `yaml:"url"` + WorkflowName string `yaml:"workflow_name"` + TaskID int64 `yaml:"task_id"` + FileName string `yaml:"file_name"` } // DockerBuildCtx ... @@ -119,14 +130,20 @@ type Context struct { // DockerFile: dockerfile名称, 默认为Dockerfile // ImageBuild: build image镜像全称, e.g. xxx.com/spock-release-candidates/image:tag type DockerBuildCtx struct { - WorkDir string `yaml:"work_dir" bson:"work_dir" json:"work_dir"` + Source string `yaml:"source" bson:"source" json:"source"` + TemplateID string `yaml:"template_id" bson:"template_id" json:"template_id"` + WorkDir string `yaml:"work_dir" bson:"work_dir" json:"work_dir"` DockerFile string `yaml:"docker_file" bson:"docker_file" json:"docker_file"` - ImageName string `yaml:"image_name" bson:"image_name" json:"image_name"` - BuildArgs string `yaml:"build_args" bson:"build_args" json:"build_args"` + ImageName string `yaml:"image_name" bson:"image_name" json:"image_name"` + BuildArgs string `yaml:"build_args" bson:"build_args" json:"build_args"` ImageReleaseTag string `yaml:"image_release_tag,omitempty" bson:"image_release_tag,omitempty" json:"image_release_tag"` } func (c *DockerBuildCtx) GetDockerFile() string { + // if the source of the dockerfile is from template, we write our own dockerfile + if c.Source == setting.DockerfileSourceTemplate { + return fmt.Sprintf("/%s", setting.ZadigDockerfilePath) + } if c.DockerFile == "" { return "Dockerfile" } diff --git a/pkg/microservice/reaper/core/service/reaper/reaper.go b/pkg/microservice/reaper/core/service/reaper/reaper.go index e720fb2ca..a7a141366 100644 --- a/pkg/microservice/reaper/core/service/reaper/reaper.go +++ b/pkg/microservice/reaper/core/service/reaper/reaper.go @@ -19,6 +19,7 @@ package reaper import ( "bytes" "fmt" + "io" "io/ioutil" "os" "os/exec" @@ -29,11 +30,14 @@ import ( "gopkg.in/yaml.v3" + configbase "github.com/koderover/zadig/pkg/config" "github.com/koderover/zadig/pkg/microservice/reaper/config" "github.com/koderover/zadig/pkg/microservice/reaper/core/service/archive" + "github.com/koderover/zadig/pkg/microservice/reaper/core/service/client" "github.com/koderover/zadig/pkg/microservice/reaper/core/service/meta" "github.com/koderover/zadig/pkg/setting" "github.com/koderover/zadig/pkg/tool/log" + "github.com/koderover/zadig/pkg/util/fs" ) const ( @@ -255,21 +259,23 @@ func (r *Reaper) BeforeExec() error { } func dockerBuildCmd(dockerfile, fullImage, ctx, buildArgs string, ignoreCache bool) *exec.Cmd { - args := []string{"build", "--rm=true"} + args := []string{"-c"} + dockerCommand := "docker build --rm=true" if ignoreCache { - args = append(args, "--no-cache") + dockerCommand += " --no-cache" } if buildArgs != "" { for _, val := range strings.Fields(buildArgs) { if val != "" { - args = append(args, val) + dockerCommand = dockerCommand + " " + val } } } - args = append(args, []string{"-t", fullImage, "-f", dockerfile, ctx}...) - return exec.Command(dockerExe, args...) + dockerCommand = dockerCommand + " -t " + fullImage + " -f " + dockerfile + " " + ctx + args = append(args, dockerCommand) + return exec.Command("sh", args...) } func (r *Reaper) setProxy(ctx *meta.DockerBuildCtx, cfg *meta.Proxy) { @@ -301,6 +307,10 @@ func (r *Reaper) dockerCommands() []*exec.Cmd { func (r *Reaper) runDockerBuild() error { if r.Ctx.DockerBuildCtx != nil { + err := r.prepareDockerfile() + if err != nil { + return err + } if r.Ctx.Proxy != nil { r.setProxy(r.Ctx.DockerBuildCtx, r.Ctx.Proxy) } @@ -320,6 +330,24 @@ func (r *Reaper) runDockerBuild() error { return nil } +func (r *Reaper) prepareDockerfile() error { + if r.Ctx.DockerBuildCtx.Source == setting.DockerfileSourceTemplate { + aslanClient := client.NewAslanClient(configbase.AslanServiceAddress(), r.Ctx.APIToken) + dockerfile, err := aslanClient.GetDockerfile(r.Ctx.DockerBuildCtx.TemplateID) + if err != nil { + return err + } + reader := strings.NewReader(dockerfile.Content) + readcloser := io.NopCloser(reader) + path := fmt.Sprintf("/%s", setting.ZadigDockerfilePath) + err = fs.SaveFile(readcloser, path) + if err != nil { + return err + } + } + return nil +} + // Exec ... func (r *Reaper) Exec() error { @@ -390,12 +418,12 @@ func (r *Reaper) AfterExec(upStreamErr error) error { } // 将上面生成的统计结果文件上传到S3 if err = r.archiveTestFiles(); err != nil { - log.Errorf("archiveFiles err %v", err) + log.Errorf("archiveTestFiles err %v", err) return err } // 将HTML测试报告上传到S3 if err = r.archiveHTMLTestReportFile(); err != nil { - log.Errorf("archiveFiles err %v", err) + log.Errorf("archiveHTMLTestReportFile err %v", err) return err } @@ -403,14 +431,21 @@ func (r *Reaper) AfterExec(upStreamErr error) error { // should archive file first, since compress cache will clean the workspace if upStreamErr == nil { - if err = r.archiveS3Files(); err != nil { - log.Errorf("archiveFiles err %v", err) - return err - } - // 运行构建后置脚本 - if err = r.RunPostScripts(); err != nil { - log.Errorf("RunPostScripts err %v", err) - return err + if r.Ctx.ArtifactInfo == nil { + if err = r.archiveS3Files(); err != nil { + log.Errorf("archiveFiles err %v", err) + return err + } + // 运行构建后置脚本 + if err = r.RunPostScripts(); err != nil { + log.Errorf("RunPostScripts err %v", err) + return err + } + } else { + if err = r.downloadArtifactFile(); err != nil { + log.Errorf("download archiveFiles err %v", err) + return err + } } // 运行物理机部署脚本 diff --git a/pkg/microservice/reaper/core/service/reaper/script.go b/pkg/microservice/reaper/core/service/reaper/script.go index bbe55ba35..9a175f431 100644 --- a/pkg/microservice/reaper/core/service/reaper/script.go +++ b/pkg/microservice/reaper/core/service/reaper/script.go @@ -373,3 +373,40 @@ func (r *Reaper) RunPMDeployScripts() error { return cmd.Run() } + +func (r *Reaper) downloadArtifactFile() error { + var err error + var store *s3.S3 + if store, err = s3.NewS3StorageFromEncryptedURI(r.Ctx.ArtifactInfo.URL); err != nil { + log.Errorf("Archive failed to create s3 storage %s", r.Ctx.ArtifactInfo.URL) + return err + } + if store.Subfolder != "" { + store.Subfolder = fmt.Sprintf("%s/%s/%d/%s", store.Subfolder, r.Ctx.ArtifactInfo.WorkflowName, r.Ctx.ArtifactInfo.TaskID, "file") + } else { + store.Subfolder = fmt.Sprintf("%s/%d/%s", r.Ctx.ArtifactInfo.WorkflowName, r.Ctx.ArtifactInfo.TaskID, "file") + } + + forcedPathStyle := true + if store.Provider == setting.ProviderSourceAli { + forcedPathStyle = false + } + s3client, err := s3tool.NewClient(store.Endpoint, store.Ak, store.Sk, store.Insecure, forcedPathStyle) + if err != nil { + log.Errorf("s3 create client err:%s", err) + return err + } + files, err := s3client.ListFiles(store.Bucket, store.GetObjectPath(r.Ctx.ArtifactInfo.FileName), false) + if err != nil { + log.Errorf("s3 list file err:%s", err) + return err + } + if len(files) > 0 { + objectKey := store.GetObjectPath(files[0]) + if err = s3client.Download(store.Bucket, objectKey, fmt.Sprintf("%s/%s", r.ActiveWorkspace, r.Ctx.ArtifactInfo.FileName)); err != nil { + log.Errorf("s3 download file err:%s", err) + return err + } + } + return nil +} diff --git a/pkg/microservice/reaper/executor/executor.go b/pkg/microservice/reaper/executor/executor.go index 15af03878..76ca7a0c0 100644 --- a/pkg/microservice/reaper/executor/executor.go +++ b/pkg/microservice/reaper/executor/executor.go @@ -54,9 +54,13 @@ func Execute() error { if err = r.BeforeExec(); err != nil { log.Fatal(err) } - if err = r.Exec(); err != nil { - errs = multierror.Append(errs, err) + + if r.Ctx.ArtifactInfo == nil { + if err = r.Exec(); err != nil { + errs = multierror.Append(errs, err) + } } + if err = r.AfterExec(err); err != nil { errs = multierror.Append(errs, err) } diff --git a/pkg/microservice/warpdrive/config/const.go b/pkg/microservice/warpdrive/config/const.go index 79acdadf0..6e4fcaca3 100644 --- a/pkg/microservice/warpdrive/config/const.go +++ b/pkg/microservice/warpdrive/config/const.go @@ -21,6 +21,7 @@ type TaskType string const ( TaskPipeline TaskType = "pipeline" TaskBuild TaskType = "buildv2" + TaskArtifactDeploy TaskType = "artifact_deploy" TaskJenkinsBuild TaskType = "jenkins_build" TaskArtifact TaskType = "artifact" TaskDeploy TaskType = "deploy" diff --git a/pkg/microservice/warpdrive/core/service/taskcontroller/task_helper.go b/pkg/microservice/warpdrive/core/service/taskcontroller/task_helper.go index 867b82e33..b0a13595e 100644 --- a/pkg/microservice/warpdrive/core/service/taskcontroller/task_helper.go +++ b/pkg/microservice/warpdrive/core/service/taskcontroller/task_helper.go @@ -540,6 +540,7 @@ func initTaskPlugins(execHandler *ExecHandler) { pluginConf := map[config.TaskType]plugins.Initiator{ config.TaskJira: plugins.InitializeJiraTaskPlugin, config.TaskBuild: plugins.InitializeBuildTaskPlugin, + config.TaskArtifactDeploy: plugins.InitializeArtifactTaskPlugin, config.TaskJenkinsBuild: plugins.InitializeJenkinsBuildPlugin, config.TaskDockerBuild: plugins.InitializeDockerBuildTaskPlugin, config.TaskDeploy: plugins.InitializeDeployTaskPlugin, diff --git a/pkg/microservice/warpdrive/core/service/taskplugin/artifact_deploy.go b/pkg/microservice/warpdrive/core/service/taskplugin/artifact_deploy.go new file mode 100644 index 000000000..c3a06aafa --- /dev/null +++ b/pkg/microservice/warpdrive/core/service/taskplugin/artifact_deploy.go @@ -0,0 +1,369 @@ +/* +Copyright 2021 The KodeRover 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 taskplugin + +import ( + "context" + "fmt" + "math/rand" + "strconv" + "strings" + "time" + + "go.uber.org/zap" + "gopkg.in/yaml.v3" + "k8s.io/apimachinery/pkg/util/sets" + "sigs.k8s.io/controller-runtime/pkg/client" + + "github.com/koderover/zadig/pkg/microservice/warpdrive/config" + "github.com/koderover/zadig/pkg/microservice/warpdrive/core/service/types/task" + "github.com/koderover/zadig/pkg/setting" + krkubeclient "github.com/koderover/zadig/pkg/tool/kube/client" + "github.com/koderover/zadig/pkg/tool/kube/updater" +) + +const ( + // ArtifactDeployTaskV2Timeout ... + ArtifactDeployTaskV2Timeout = 60 * 60 * 1 // 60 minutes +) + +// InitializeArtifactTaskPlugin to initialize build task plugin, and return reference +func InitializeArtifactTaskPlugin(taskType config.TaskType) TaskPlugin { + return &ArtifactDeployTaskPlugin{ + Name: taskType, + kubeClient: krkubeclient.Client(), + } +} + +// BuildTaskPlugin is Plugin, name should be compatible with task type +type ArtifactDeployTaskPlugin struct { + Name config.TaskType + KubeNamespace string + JobName string + FileName string + kubeClient client.Client + Task *task.Build + Log *zap.SugaredLogger + + ack func() +} + +func (p *ArtifactDeployTaskPlugin) SetAckFunc(ack func()) { + p.ack = ack +} + +// Init ... +func (p *ArtifactDeployTaskPlugin) Init(jobname, filename string, xl *zap.SugaredLogger) { + p.JobName = jobname + p.Log = xl + p.FileName = filename +} + +func (p *ArtifactDeployTaskPlugin) Type() config.TaskType { + return p.Name +} + +// Status ... +func (p *ArtifactDeployTaskPlugin) Status() config.Status { + return p.Task.TaskStatus +} + +// SetStatus ... +func (p *ArtifactDeployTaskPlugin) SetStatus(status config.Status) { + p.Task.TaskStatus = status +} + +// TaskTimeout ... +func (p *ArtifactDeployTaskPlugin) TaskTimeout() int { + if p.Task.Timeout == 0 { + p.Task.Timeout = ArtifactDeployTaskV2Timeout + } else { + if !p.Task.IsRestart { + p.Task.Timeout = p.Task.Timeout * 60 + } + } + return p.Task.Timeout +} + +func (p *ArtifactDeployTaskPlugin) SetBuildStatusCompleted(status config.Status) { + p.Task.BuildStatus.Status = status + p.Task.BuildStatus.EndTime = time.Now().Unix() +} + +func (p *ArtifactDeployTaskPlugin) Run(ctx context.Context, pipelineTask *task.Task, pipelineCtx *task.PipelineCtx, serviceName string) { + envName := pipelineTask.WorkflowArgs.Namespace + envNameVar := &task.KeyVal{Key: "ENV_NAME", Value: envName, IsCredential: false} + p.Task.JobCtx.EnvVars = append(p.Task.JobCtx.EnvVars, envNameVar) + + taskIDVar := &task.KeyVal{Key: "TASK_ID", Value: strconv.FormatInt(pipelineTask.TaskID, 10), IsCredential: false} + p.Task.JobCtx.EnvVars = append(p.Task.JobCtx.EnvVars, taskIDVar) + + privateKeys := sets.String{} + for _, privateKey := range pipelineTask.ConfigPayload.PrivateKeys { + privateKeys.Insert(privateKey.Name) + } + + privateKeysVar := &task.KeyVal{Key: "AGENTS", Value: strings.Join(privateKeys.List(), ","), IsCredential: false} + p.Task.JobCtx.EnvVars = append(p.Task.JobCtx.EnvVars, privateKeysVar) + + // env host ips + for envName, HostIPs := range p.Task.EnvHostInfo { + envHostKeysVar := &task.KeyVal{Key: envName + "_HOST_IPs", Value: strings.Join(HostIPs, ","), IsCredential: false} + p.Task.JobCtx.EnvVars = append(p.Task.JobCtx.EnvVars, envHostKeysVar) + } + + // ARTIFACT + if p.Task.ArtifactInfo != nil { + var workspace = "/workspace" + if pipelineTask.ConfigPayload.ClassicBuild { + workspace = pipelineCtx.Workspace + } + pipelineTask.ArtifactInfo = p.Task.ArtifactInfo + artifactKeysVar := &task.KeyVal{Key: "ARTIFACT", Value: fmt.Sprintf("%s/%s", workspace, p.Task.ArtifactInfo.FileName), IsCredential: false} + p.Task.JobCtx.EnvVars = append(p.Task.JobCtx.EnvVars, artifactKeysVar) + } + + p.KubeNamespace = pipelineTask.ConfigPayload.Build.KubeNamespace + for _, repo := range p.Task.JobCtx.Builds { + repoName := strings.Replace(repo.RepoName, "-", "_", -1) + if len(repo.Branch) > 0 { + branchVar := &task.KeyVal{Key: fmt.Sprintf("%s_BRANCH", repoName), Value: repo.Branch, IsCredential: false} + p.Task.JobCtx.EnvVars = append(p.Task.JobCtx.EnvVars, branchVar) + } + + if len(repo.Tag) > 0 { + tagVar := &task.KeyVal{Key: fmt.Sprintf("%s_TAG", repoName), Value: repo.Tag, IsCredential: false} + p.Task.JobCtx.EnvVars = append(p.Task.JobCtx.EnvVars, tagVar) + } + + if repo.PR > 0 { + prVar := &task.KeyVal{Key: fmt.Sprintf("%s_PR", repoName), Value: strconv.Itoa(repo.PR), IsCredential: false} + p.Task.JobCtx.EnvVars = append(p.Task.JobCtx.EnvVars, prVar) + } + } + + jobCtx := JobCtxBuilder{ + JobName: p.JobName, + PipelineCtx: pipelineCtx, + ArchiveFile: p.Task.JobCtx.PackageFile, + JobCtx: p.Task.JobCtx, + Installs: p.Task.InstallCtx, + } + + if p.Task.BuildStatus == nil { + p.Task.BuildStatus = &task.BuildStatus{} + } + + p.Task.BuildStatus.Status = config.StatusRunning + p.Task.BuildStatus.StartTime = time.Now().Unix() + p.ack() + + jobCtxBytes, err := yaml.Marshal(jobCtx.BuildReaperContext(pipelineTask, serviceName)) + if err != nil { + msg := fmt.Sprintf("cannot reaper.Context data: %v", err) + p.Log.Error(msg) + p.Task.TaskStatus = config.StatusFailed + p.Task.Error = msg + p.SetBuildStatusCompleted(config.StatusFailed) + return + } + + jobLabel := &JobLabel{ + PipelineName: pipelineTask.PipelineName, + ServiceName: serviceName, + TaskID: pipelineTask.TaskID, + TaskType: string(p.Type()), + PipelineType: string(pipelineTask.Type), + } + + if err := ensureDeleteConfigMap(p.KubeNamespace, jobLabel, p.kubeClient); err != nil { + p.Log.Error(err) + p.Task.TaskStatus = config.StatusFailed + p.Task.Error = err.Error() + p.SetBuildStatusCompleted(config.StatusFailed) + return + } + + if err := createJobConfigMap( + p.KubeNamespace, p.JobName, jobLabel, string(jobCtxBytes), p.kubeClient); err != nil { + msg := fmt.Sprintf("createJobConfigMap error: %v", err) + p.Log.Error(msg) + p.Task.TaskStatus = config.StatusFailed + p.Task.Error = msg + p.SetBuildStatusCompleted(config.StatusFailed) + return + } + p.Log.Infof("succeed to create cm for build job %s", p.JobName) + + jobImage := fmt.Sprintf("%s-%s", pipelineTask.ConfigPayload.Release.ReaperImage, p.Task.BuildOS) + if p.Task.ImageFrom == setting.ImageFromCustom { + jobImage = p.Task.BuildOS + } + + //Resource request default value is LOW + job, err := buildJob(p.Type(), jobImage, p.JobName, serviceName, p.Task.ResReq, pipelineCtx, pipelineTask, p.Task.Registries) + if err != nil { + msg := fmt.Sprintf("create build job context error: %v", err) + p.Log.Error(msg) + p.Task.TaskStatus = config.StatusFailed + p.Task.Error = msg + p.SetBuildStatusCompleted(config.StatusFailed) + return + } + + job.Namespace = p.KubeNamespace + + if err := ensureDeleteJob(p.KubeNamespace, jobLabel, p.kubeClient); err != nil { + msg := fmt.Sprintf("delete build job error: %v", err) + p.Log.Error(msg) + p.Task.TaskStatus = config.StatusFailed + p.Task.Error = msg + p.SetBuildStatusCompleted(config.StatusFailed) + return + } + + // 将集成到KodeRover的私有镜像仓库的访问权限设置到namespace中 + if err := createOrUpdateRegistrySecrets(p.KubeNamespace, p.Task.Registries, p.kubeClient); err != nil { + msg := fmt.Sprintf("create secret error: %v", err) + p.Log.Error(msg) + p.Task.TaskStatus = config.StatusFailed + p.Task.Error = msg + p.SetBuildStatusCompleted(config.StatusFailed) + return + } + if err := updater.CreateJob(job, p.kubeClient); err != nil { + msg := fmt.Sprintf("create build job error: %v", err) + p.Log.Error(msg) + p.Task.TaskStatus = config.StatusFailed + p.Task.Error = msg + p.SetBuildStatusCompleted(config.StatusFailed) + return + } + p.Log.Infof("succeed to create build job %s", p.JobName) +} + +// Wait ... +func (p *ArtifactDeployTaskPlugin) Wait(ctx context.Context) { + status := waitJobEndWithFile(ctx, p.TaskTimeout(), p.KubeNamespace, p.JobName, true, p.kubeClient, p.Log) + p.SetBuildStatusCompleted(status) + + if status == config.StatusPassed { + if p.Task.DockerBuildStatus == nil { + p.Task.DockerBuildStatus = &task.DockerBuildStatus{} + } + + p.Task.DockerBuildStatus.StartTime = time.Now().Unix() + p.Task.DockerBuildStatus.Status = config.StatusRunning + p.ack() + + select { + case <-ctx.Done(): + p.Task.DockerBuildStatus.EndTime = time.Now().Unix() + p.Task.DockerBuildStatus.Status = config.StatusCancelled + p.Task.TaskStatus = config.StatusCancelled + p.ack() + return + case <-time.After(time.Duration(rand.Int()%2) * time.Second): + p.Task.DockerBuildStatus.EndTime = time.Now().Unix() + p.Task.DockerBuildStatus.Status = config.StatusPassed + } + } + + p.SetStatus(status) +} + +// Complete ... +func (p *ArtifactDeployTaskPlugin) Complete(ctx context.Context, pipelineTask *task.Task, serviceName string) { + jobLabel := &JobLabel{ + PipelineName: pipelineTask.PipelineName, + ServiceName: serviceName, + TaskID: pipelineTask.TaskID, + TaskType: string(p.Type()), + PipelineType: string(pipelineTask.Type), + } + + // 清理用户取消和超时的任务 + defer func() { + if p.Task.TaskStatus == config.StatusCancelled || p.Task.TaskStatus == config.StatusTimeout { + if err := ensureDeleteJob(p.KubeNamespace, jobLabel, p.kubeClient); err != nil { + p.Log.Error(err) + p.Task.Error = err.Error() + } + return + } + }() + + err := saveContainerLog(pipelineTask, p.KubeNamespace, p.FileName, jobLabel, p.kubeClient) + if err != nil { + p.Log.Error(err) + p.Task.Error = err.Error() + return + } + + p.Task.LogFile = p.FileName +} + +// SetTask ... +func (p *ArtifactDeployTaskPlugin) SetTask(t map[string]interface{}) error { + task, err := ToBuildTask(t) + if err != nil { + return err + } + p.Task = task + return nil +} + +// GetTask ... +func (p *ArtifactDeployTaskPlugin) GetTask() interface{} { + return p.Task +} + +// IsTaskDone ... +func (p *ArtifactDeployTaskPlugin) IsTaskDone() bool { + if p.Task.TaskStatus != config.StatusCreated && p.Task.TaskStatus != config.StatusRunning { + return true + } + return false +} + +// IsTaskFailed ... +func (p *ArtifactDeployTaskPlugin) IsTaskFailed() bool { + if p.Task.TaskStatus == config.StatusFailed || p.Task.TaskStatus == config.StatusTimeout || p.Task.TaskStatus == config.StatusCancelled { + return true + } + return false +} + +// SetStartTime ... +func (p *ArtifactDeployTaskPlugin) SetStartTime() { + p.Task.StartTime = time.Now().Unix() +} + +// SetEndTime ... +func (p *ArtifactDeployTaskPlugin) SetEndTime() { + p.Task.EndTime = time.Now().Unix() +} + +// IsTaskEnabled ... +func (p *ArtifactDeployTaskPlugin) IsTaskEnabled() bool { + return p.Task.Enabled +} + +// ResetError ... +func (p *ArtifactDeployTaskPlugin) ResetError() { + p.Task.Error = "" +} diff --git a/pkg/microservice/warpdrive/core/service/taskplugin/build.go b/pkg/microservice/warpdrive/core/service/taskplugin/build.go index 630004f86..db5c7f078 100644 --- a/pkg/microservice/warpdrive/core/service/taskplugin/build.go +++ b/pkg/microservice/warpdrive/core/service/taskplugin/build.go @@ -133,6 +133,16 @@ func (p *BuildTaskPlugin) Run(ctx context.Context, pipelineTask *task.Task, pipe p.Task.JobCtx.EnvVars = append(p.Task.JobCtx.EnvVars, envHostKeysVar) } + // ARTIFACT + if p.Task.JobCtx.FileArchiveCtx != nil { + var workspace = "/workspace" + if pipelineTask.ConfigPayload.ClassicBuild { + workspace = pipelineCtx.Workspace + } + artifactKeysVar := &task.KeyVal{Key: "ARTIFACT", Value: fmt.Sprintf("%s/%s/%s", workspace, p.Task.JobCtx.FileArchiveCtx.FileLocation, p.Task.JobCtx.FileArchiveCtx.FileName), IsCredential: false} + p.Task.JobCtx.EnvVars = append(p.Task.JobCtx.EnvVars, artifactKeysVar) + } + p.KubeNamespace = pipelineTask.ConfigPayload.Build.KubeNamespace for _, repo := range p.Task.JobCtx.Builds { repoName := strings.Replace(repo.RepoName, "-", "_", -1) @@ -150,6 +160,15 @@ func (p *BuildTaskPlugin) Run(ctx context.Context, pipelineTask *task.Task, pipe prVar := &task.KeyVal{Key: fmt.Sprintf("%s_PR", repoName), Value: strconv.Itoa(repo.PR), IsCredential: false} p.Task.JobCtx.EnvVars = append(p.Task.JobCtx.EnvVars, prVar) } + + if len(repo.CommitID) > 0 { + commitVar := &task.KeyVal{ + Key: fmt.Sprintf("%s_COMMIT_ID", repoName), + Value: repo.CommitID, + IsCredential: false, + } + p.Task.JobCtx.EnvVars = append(p.Task.JobCtx.EnvVars, commitVar) + } } jobCtx := JobCtxBuilder{ diff --git a/pkg/microservice/warpdrive/core/service/taskplugin/deploy.go b/pkg/microservice/warpdrive/core/service/taskplugin/deploy.go index d3dce9b00..663a3e530 100644 --- a/pkg/microservice/warpdrive/core/service/taskplugin/deploy.go +++ b/pkg/microservice/warpdrive/core/service/taskplugin/deploy.go @@ -193,7 +193,11 @@ func (p *DeployTaskPlugin) Run(ctx context.Context, pipelineTask *task.Task, _ * ) serviceInfo, err = p.getService(ctx, p.Task.ServiceName, p.Task.ServiceType, p.Task.ProductName) if err != nil { - return + // Maybe it is a share service, the entity is not under the project + serviceInfo, err = p.getService(ctx, p.Task.ServiceName, p.Task.ServiceType, "") + if err != nil { + return + } } if serviceInfo.WorkloadType == "" { selector := labels.Set{setting.ProductLabel: p.Task.ProductName, setting.ServiceLabel: p.Task.ServiceName}.AsSelector() @@ -415,8 +419,9 @@ func (p *DeployTaskPlugin) Run(ctx context.Context, pipelineTask *task.Task, _ * serviceValuesYaml := renderChart.ValuesYaml // prepare image replace info - getValidMatchData := getValidMatchData(targetContainer.ImagePath) - replaceValuesMap, err = assignImageData(p.Task.Image, getValidMatchData) + validMatchData := getValidMatchData(targetContainer.ImagePath) + + replaceValuesMap, err = assignImageData(p.Task.Image, validMatchData) if err != nil { err = errors.WithMessagef( err, @@ -622,18 +627,29 @@ func getValidMatchData(spec *types.ImagePathSpec) map[string]string { return ret } +// parse image url to map: repo=>xxx/xx/xx image=>xx tag=>xxx +func resolveImageUrl(imageUrl string) map[string]string { + subMatchAll := imageParseRegex.FindStringSubmatch(imageUrl) + result := make(map[string]string) + exNames := imageParseRegex.SubexpNames() + for i, matchedStr := range subMatchAll { + if i != 0 && matchedStr != "" && matchedStr != ":" { + result[exNames[i]] = matchedStr + } + } + return result +} + // replace image defines in yaml by new version func replaceImage(sourceYaml string, imageValuesMap map[string]interface{}) (string, error) { nestedMap, err := converter.Expand(imageValuesMap) if err != nil { return "", err } - bs, err := yaml.Marshal(nestedMap) if err != nil { return "", err } - mergedBs, err := yamlutil.Merge([][]byte{[]byte(sourceYaml), bs}) if err != nil { return "", err @@ -641,7 +657,7 @@ func replaceImage(sourceYaml string, imageValuesMap map[string]interface{}) (str return string(mergedBs), nil } -// assign image url data into match data +// assignImageData assign image url data into match data // matchData: image=>absolute-path repo=>absolute-path tag=>absolute-path // return: absolute-image-path=>image-value absolute-repo-path=>repo-value absolute-tag-path=>tag-value func assignImageData(imageUrl string, matchData map[string]string) (map[string]interface{}, error) { @@ -676,30 +692,16 @@ func assignImageData(imageUrl string, matchData map[string]string) (map[string]i break } return ret, nil - } else { - // image url assigned into repo + image(tag) - ret[matchData[setting.PathSearchComponentRepo]] = strings.TrimSuffix(resolvedImageUrl[setting.PathSearchComponentRepo], "/") - ret[matchData[setting.PathSearchComponentImage]] = fmt.Sprintf("%s:%s", resolvedImageUrl[setting.PathSearchComponentImage], resolvedImageUrl[setting.PathSearchComponentTag]) - return ret, nil } + // image url assigned into repo + image(tag) + ret[matchData[setting.PathSearchComponentRepo]] = strings.TrimSuffix(resolvedImageUrl[setting.PathSearchComponentRepo], "/") + ret[matchData[setting.PathSearchComponentImage]] = fmt.Sprintf("%s:%s", resolvedImageUrl[setting.PathSearchComponentImage], resolvedImageUrl[setting.PathSearchComponentTag]) + return ret, nil } return nil, errors.Errorf("match data illegal, expect length: 1-3, actual length: %d", len(matchData)) } -// parse image url to map: repo=>xxx/xx/xx image=>xx tag=>xxx -func resolveImageUrl(imageUrl string) map[string]string { - subMatchAll := imageParseRegex.FindStringSubmatch(imageUrl) - result := make(map[string]string) - exNames := imageParseRegex.SubexpNames() - for i, matchedStr := range subMatchAll { - if i != 0 && matchedStr != "" && matchedStr != ":" { - result[exNames[i]] = matchedStr - } - } - return result -} - // Wait ... func (p *DeployTaskPlugin) Wait(ctx context.Context) { // skip waiting for reset image task diff --git a/pkg/microservice/warpdrive/core/service/taskplugin/docker_build.go b/pkg/microservice/warpdrive/core/service/taskplugin/docker_build.go index b963e3937..cc02d9cb8 100644 --- a/pkg/microservice/warpdrive/core/service/taskplugin/docker_build.go +++ b/pkg/microservice/warpdrive/core/service/taskplugin/docker_build.go @@ -134,6 +134,8 @@ func (p *DockerBuildPlugin) Run(ctx context.Context, pipelineTask *task.Task, pi JobType: setting.BuildImageJob, //Docker build context DockerBuildCtx: &task.DockerBuildCtx{ + Source: p.Task.Source, + TemplateID: p.Task.TemplateID, WorkDir: fmt.Sprintf("%s/%s", pipelineCtx.Workspace, p.Task.WorkDir), DockerFile: fmt.Sprintf("%s/%s", pipelineCtx.Workspace, p.Task.DockerFile), ImageName: p.Task.Image, diff --git a/pkg/microservice/warpdrive/core/service/taskplugin/job.go b/pkg/microservice/warpdrive/core/service/taskplugin/job.go index d0ddc2ad1..1d13553eb 100644 --- a/pkg/microservice/warpdrive/core/service/taskplugin/job.go +++ b/pkg/microservice/warpdrive/core/service/taskplugin/job.go @@ -174,6 +174,7 @@ func replaceWrapLine(script string) string { func (b *JobCtxBuilder) BuildReaperContext(pipelineTask *task.Task, serviceName string) *types.Context { ctx := &types.Context{ + APIToken: pipelineTask.ConfigPayload.APIToken, Workspace: b.PipelineCtx.Workspace, CleanWorkspace: b.JobCtx.CleanWorkspace, IgnoreCache: pipelineTask.ConfigPayload.IgnoreCache, @@ -209,7 +210,6 @@ func (b *JobCtxBuilder) BuildReaperContext(pipelineTask *task.Task, serviceName ServiceName: serviceName, StorageEndpoint: pipelineTask.StorageEndpoint, } - for _, install := range b.Installs { inst := &types.Install{ // TODO: 之后可以适配 install.Scripts 为[]string @@ -283,6 +283,8 @@ func (b *JobCtxBuilder) BuildReaperContext(pipelineTask *task.Task, serviceName if b.JobCtx.DockerBuildCtx != nil { ctx.DockerBuildCtx = &task.DockerBuildCtx{ + Source: b.JobCtx.DockerBuildCtx.Source, + TemplateID: b.JobCtx.DockerBuildCtx.TemplateID, WorkDir: b.JobCtx.DockerBuildCtx.WorkDir, DockerFile: b.JobCtx.DockerBuildCtx.DockerFile, ImageName: b.JobCtx.DockerBuildCtx.ImageName, @@ -309,6 +311,14 @@ func (b *JobCtxBuilder) BuildReaperContext(pipelineTask *task.Task, serviceName ctx.StorageSK = pipelineTask.ConfigPayload.S3Storage.Sk ctx.StorageBucket = pipelineTask.ConfigPayload.S3Storage.Bucket ctx.StorageProvider = pipelineTask.ConfigPayload.S3Storage.Provider + if pipelineTask.ArtifactInfo != nil { + ctx.ArtifactInfo = &types.ArtifactInfo{ + URL: pipelineTask.ArtifactInfo.URL, + WorkflowName: pipelineTask.ArtifactInfo.WorkflowName, + TaskID: pipelineTask.ArtifactInfo.TaskID, + FileName: pipelineTask.ArtifactInfo.FileName, + } + } return ctx } diff --git a/pkg/microservice/warpdrive/core/service/types/environment.go b/pkg/microservice/warpdrive/core/service/types/environment.go index dcb576db7..b8ac9e7ee 100644 --- a/pkg/microservice/warpdrive/core/service/types/environment.go +++ b/pkg/microservice/warpdrive/core/service/types/environment.go @@ -70,7 +70,7 @@ type GitRepoConfig struct { type OverrideYaml struct { YamlSource string `bson:"yaml_source,omitempty" json:"yaml_source,omitempty"` YamlContent string `bson:"yaml_content,omitempty" json:"yaml_content,omitempty"` - GitRepoConfig *GitRepoConfig `bson:"git_repo_config,omitempty" json:"gitRepoConfig,omitempty"` + GitRepoConfig *GitRepoConfig `bson:"git_repo_config,omitempty" json:"git_repo_config,omitempty"` ValuesPaths []string `bson:"values_paths,omitempty" json:"values_paths,omitempty"` } diff --git a/pkg/microservice/warpdrive/core/service/types/reaper.go b/pkg/microservice/warpdrive/core/service/types/reaper.go index 8ac5c01c3..9ed4b2fdd 100644 --- a/pkg/microservice/warpdrive/core/service/types/reaper.go +++ b/pkg/microservice/warpdrive/core/service/types/reaper.go @@ -27,6 +27,8 @@ import ( // Context ... type Context struct { + // API token 服务访问使用的api token + APIToken string `yaml:"api_token"` // Workspace 容器工作目录 [必填] Workspace string `yaml:"workspace"` @@ -105,11 +107,19 @@ type Context struct { // IgnoreCache ignore docker build cache [runtime] IgnoreCache bool `yaml:"ignore_cache"` - StorageEndpoint string `yaml:"storage_endpoint"` - StorageAK string `yaml:"storage_ak"` - StorageSK string `yaml:"storage_sk"` - StorageBucket string `yaml:"storage_bucket"` - StorageProvider int8 `yaml:"storage_provider"` + StorageEndpoint string `yaml:"storage_endpoint"` + StorageAK string `yaml:"storage_ak"` + StorageSK string `yaml:"storage_sk"` + StorageBucket string `yaml:"storage_bucket"` + StorageProvider int8 `yaml:"storage_provider"` + ArtifactInfo *ArtifactInfo `yaml:"artifact_info"` +} + +type ArtifactInfo struct { + URL string `yaml:"url"` + WorkflowName string `yaml:"workflow_name"` + TaskID int64 `yaml:"task_id"` + FileName string `yaml:"file_name"` } // Proxy 翻墙配置信息 diff --git a/pkg/microservice/warpdrive/core/service/types/task/build.go b/pkg/microservice/warpdrive/core/service/types/task/build.go index e43541c77..4d6e55c3b 100644 --- a/pkg/microservice/warpdrive/core/service/types/task/build.go +++ b/pkg/microservice/warpdrive/core/service/types/task/build.go @@ -24,9 +24,10 @@ import ( ) type Build struct { - TaskType config.TaskType `bson:"type" json:"type"` - Enabled bool `bson:"enabled" json:"enabled"` - TaskStatus config.Status `bson:"status" json:"status"` + TaskType config.TaskType `bson:"type" json:"type"` + Enabled bool `bson:"enabled" json:"enabled"` + TaskStatus config.Status `bson:"status" json:"status"` + ProductName string `bson:"product_name" json:"product_name"` // 新增一个service表示服务名称 Service string `bson:"service" json:"service"` // 该名称实际为服务组件名称 @@ -54,7 +55,15 @@ type Build struct { BuildStatus *BuildStatus `bson:"build_status,omitempty" json:"build_status,omitempty"` IsRestart bool `bson:"is_restart" json:"is_restart"` // Get the host bound to the environment of the cloud host service configuration - EnvHostInfo map[string][]string `bson:"env_host_info,omitempty" json:"env_host_info,omitempty"` + EnvHostInfo map[string][]string `bson:"env_host_info,omitempty" json:"env_host_info,omitempty"` + ArtifactInfo *ArtifactInfo `bson:"artifact_info,omitempty" json:"artifact_info,omitempty"` +} + +type ArtifactInfo struct { + URL string `bson:"url" json:"url"` + WorkflowName string `bson:"workflow_name" json:"workflow_name"` + TaskID int64 `bson:"task_id" json:"task_id"` + FileName string `bson:"file_name" json:"file_name"` } type Item struct { @@ -195,6 +204,8 @@ type DockerBuildCtx struct { ImageName string `yaml:"image_name" bson:"image_name" json:"image_name"` BuildArgs string `yaml:"build_args" bson:"build_args" json:"build_args"` ImageReleaseTag string `yaml:"image_release_tag,omitempty" bson:"image_release_tag,omitempty" json:"image_release_tag"` + Source string `yaml:"source" bson:"source" json:"source"` + TemplateID string `yaml:"template_id" bson:"template_id" json:"template_id"` } type FileArchiveCtx struct { diff --git a/pkg/microservice/warpdrive/core/service/types/task/config_payload.go b/pkg/microservice/warpdrive/core/service/types/task/config_payload.go index 2692dbc31..0dfdbcda7 100644 --- a/pkg/microservice/warpdrive/core/service/types/task/config_payload.go +++ b/pkg/microservice/warpdrive/core/service/types/task/config_payload.go @@ -21,6 +21,7 @@ import ( ) type ConfigPayload struct { + APIToken string `json:"api_token"` Proxy Proxy `json:"proxy"` S3Storage S3Config `json:"s3_storage"` Github GithubConfig `json:"github"` diff --git a/pkg/microservice/warpdrive/core/service/types/task/docker_build.go b/pkg/microservice/warpdrive/core/service/types/task/docker_build.go index 88eb7dcbc..f1e97a6e0 100644 --- a/pkg/microservice/warpdrive/core/service/types/task/docker_build.go +++ b/pkg/microservice/warpdrive/core/service/types/task/docker_build.go @@ -23,6 +23,8 @@ import ( ) type DockerBuild struct { + Source string `bson:"source" json:"source"` // Dockerfile source + TemplateID string `bson:"template_id" json:"template_id"` TaskType config.TaskType `bson:"type" json:"type"` Enabled bool `bson:"enabled" json:"enabled"` TaskStatus config.Status `bson:"status" json:"status"` diff --git a/pkg/microservice/warpdrive/core/service/types/task/model.go b/pkg/microservice/warpdrive/core/service/types/task/model.go index d21c91ccf..d6a0d9751 100644 --- a/pkg/microservice/warpdrive/core/service/types/task/model.go +++ b/pkg/microservice/warpdrive/core/service/types/task/model.go @@ -65,23 +65,20 @@ type Task struct { // ServiceTaskArgs 脚本部署工作流任务参数 ServiceTaskArgs *ServiceTaskArgs `bson:"service_args,omitempty" json:"service_args,omitempty"` // ConfigPayload 系统配置信息 - ConfigPayload *ConfigPayload `json:"config_payload,omitempty"` - Error string `bson:"error,omitempty" json:"error,omitempty"` - Services [][]*ProductService `bson:"services" json:"services"` - Render *RenderInfo `bson:"render" json:"render"` - StorageURI string `bson:"storage_uri,omitempty" json:"storage_uri,omitempty"` + ConfigPayload *ConfigPayload `json:"config_payload,omitempty"` + Error string `bson:"error,omitempty" json:"error,omitempty"` + Services [][]*ProductService `bson:"services" json:"services"` + Render *RenderInfo `bson:"render" json:"render"` + StorageURI string `bson:"storage_uri,omitempty" json:"storage_uri,omitempty"` // interface{} 为types.TestReport - TestReports map[string]interface{} `bson:"test_reports,omitempty" json:"test_reports,omitempty"` - - RwLock sync.Mutex `bson:"-" json:"-"` - - ResetImage bool `json:"resetImage" bson:"resetImage"` - - TriggerBy *TriggerBy `json:"trigger_by,omitempty" bson:"trigger_by,omitempty"` - - Features []string `bson:"features" json:"features"` - IsRestart bool `bson:"is_restart" json:"is_restart"` - StorageEndpoint string `bson:"storage_endpoint" json:"storage_endpoint"` + TestReports map[string]interface{} `bson:"test_reports,omitempty" json:"test_reports,omitempty"` + RwLock sync.Mutex `bson:"-" json:"-"` + ResetImage bool `json:"resetImage" bson:"resetImage"` + TriggerBy *TriggerBy `json:"trigger_by,omitempty" bson:"trigger_by,omitempty"` + Features []string `bson:"features" json:"features"` + IsRestart bool `bson:"is_restart" json:"is_restart"` + StorageEndpoint string `bson:"storage_endpoint" json:"storage_endpoint"` + ArtifactInfo *ArtifactInfo `bson:"artifact_info" json:"artifact_info"` } type RenderInfo struct { @@ -135,6 +132,7 @@ type WorkflowTaskArgs struct { VersionArgs *VersionArgs `bson:"version_args,omitempty" json:"version_args,omitempty"` ReqID string `bson:"req_id" json:"req_id"` RegistryID string `bson:"registry_id,omitempty" json:"registry_id,omitempty"` + StorageID string `bson:"storage_id,omitempty" json:"storage_id,omitempty"` DistributeEnabled bool `bson:"distribute_enabled" json:"distribute_enabled"` WorklowTaskCreator string `bson:"workflow_task_creator" json:"workflow_task_creator"` // Ignore docker build cache @@ -168,10 +166,14 @@ type TestArgs struct { } type ArtifactArgs struct { - Name string `bson:"name" json:"name"` - ServiceName string `bson:"service_name" json:"service_name"` - Image string `bson:"image" json:"image"` - Deploy []DeployEnv `bson:"deloy" json:"deploy"` + Name string `bson:"name" json:"name"` + ServiceName string `bson:"service_name" json:"service_name"` + Image string `bson:"image" json:"image"` + Deploy []DeployEnv `bson:"deploy" json:"deploy"` + WorkflowName string `bson:"workflow_name,omitempty" json:"workflow_name,omitempty"` + TaskID int64 `bson:"task_id,omitempty" json:"task_id,omitempty"` + FileName string `bson:"file_name,omitempty" json:"file_name,omitempty"` + URL string `bson:"url,omitempty" json:"url,omitempty"` } type VersionArgs struct { diff --git a/pkg/setting/consts.go b/pkg/setting/consts.go index 88efd0d62..3836cd53f 100644 --- a/pkg/setting/consts.go +++ b/pkg/setting/consts.go @@ -179,6 +179,9 @@ const ( ClusterNotFound = "NotFound" ClusterDisconnected = "Disconnected" + // annotations + HelmReleaseNameAnnotation = "meta.helm.sh/release-name" + EnvCreatedBy = "createdBy" EnvCreator = "koderover" PodReady = "ready" @@ -226,12 +229,19 @@ const ( SourceFromCodeHub = "codehub" // SourceFromIlyshin 配置来源为ilyshin SourceFromIlyshin = "ilyshin" + // SourceFromChartTemplate 配置来源为helmTemplate + SourceFromChartTemplate = "chartTemplate" + // SourceFromPublicRepo 配置来源为publicRepo + SourceFromPublicRepo = "publicRepo" + // SourceFromGUI 配置来源为gui SourceFromGUI = "gui" //SourceFromHelm SourceFromHelm = "helm" //SourceFromExternal SourceFromExternal = "external" + // service from yaml template + ServiceSourceTemplate = "template" ProdENV = "prod" TestENV = "test" @@ -482,6 +492,32 @@ const ( AliyunHost = ".aliyuncs.com" ) +// Dockerfile parsing consts +const ( + DockerfileCmdArg = "ARG" +) + +// Dockerfile template constant +const ( + DockerfileSourceLocal = "local" + DockerfileSourceTemplate = "template" + + ZadigDockerfilePath = "zadig-dockerfile" +) + +// Yaml template constant +const ( + RegExpParameter = `{{.(\w)+}}` +) + +// template common constant +const ( + TemplateVariableProduct = "$T-Project$" + TemplateVariableProductDescription = "项目名称" + TemplateVariableService = "$T-Service$" + TemplateVariableServiceDescription = "服务名称" +) + const MaxTries = 1 const DogFood = "/var/run/koderover-dog-food" diff --git a/pkg/tool/errors/http_errors.go b/pkg/tool/errors/http_errors.go index e235a1b69..a1a2f8702 100644 --- a/pkg/tool/errors/http_errors.go +++ b/pkg/tool/errors/http_errors.go @@ -584,6 +584,7 @@ var ( ErrListPrivateKeys = NewHTTPError(6684, "列出私钥失败") ErrDeletePrivateKey = NewHTTPError(6685, "删除私钥失败") ErrDeleteUsedPrivateKey = NewHTTPError(6686, "删除私钥失败,此私钥已经被引用,请确认") + ErrBulkCreatePrivateKey = NewHTTPError(6687, "批量创建私钥失败") //----------------------------------------------------------------------------------------------- // signature APIs Range: 6690 - 6699 diff --git a/pkg/tool/s3/client.go b/pkg/tool/s3/client.go index de4076b6d..cdabe6c69 100644 --- a/pkg/tool/s3/client.go +++ b/pkg/tool/s3/client.go @@ -19,7 +19,6 @@ package s3 import ( "fmt" "os" - "path" "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/awserr" @@ -211,8 +210,7 @@ func (c *Client) ListFiles(bucketName, prefix string, recursive bool) ([]string, for _, item := range output.Contents { itemKey := *item.Key - _, fileName := path.Split(itemKey) - ret = append(ret, fileName) + ret = append(ret, itemKey) } return ret, nil -- Gitee From 8a7a5a93a5c9f2edfb00104e91f5a8fbf9079026 Mon Sep 17 00:00:00 2001 From: panxunying <641770806@qq.com> Date: Mon, 1 Nov 2021 16:16:47 +0800 Subject: [PATCH 188/405] optimize Signed-off-by: panxunying <641770806@qq.com> --- .../user/core/handler/user/user.go | 60 ++--------------- .../user/core/service/login/local.go | 2 +- .../user/core/service/user/user.go | 64 +++++++++++++++++-- .../client/systemconfig/systemconfig.go | 8 +++ 4 files changed, 73 insertions(+), 61 deletions(-) diff --git a/pkg/microservice/user/core/handler/user/user.go b/pkg/microservice/user/core/handler/user/user.go index 45268f6fd..d1f109dc6 100644 --- a/pkg/microservice/user/core/handler/user/user.go +++ b/pkg/microservice/user/core/handler/user/user.go @@ -1,15 +1,8 @@ package user import ( - "fmt" - - "github.com/dexidp/dex/connector/ldap" "github.com/gin-gonic/gin" - "go.uber.org/zap" - - ldapv3 "github.com/go-ldap/ldap/v3" - "github.com/koderover/zadig/pkg/microservice/systemconfig/core/service" "github.com/koderover/zadig/pkg/microservice/user/core/service/user" "github.com/koderover/zadig/pkg/shared/client/systemconfig" internalhandler "github.com/koderover/zadig/pkg/shared/handler" @@ -17,55 +10,9 @@ import ( e "github.com/koderover/zadig/pkg/tool/errors" ) -func searchAndSyncUser(si *service.Connector, logger *zap.SugaredLogger) error { - if si == nil || si.Config == nil { - logger.Error("can't find connector") - return fmt.Errorf("can't find connector") - } - config, _ := si.Config.(*ldap.Config) - l, err := ldapv3.Dial("tcp", config.Host) - if err != nil { - logger.Error(err) - return err - } - defer l.Close() - - err = l.Bind(config.BindDN, config.BindPW) - if err != nil { - logger.Error(err) - return err - } - - searchRequest := ldapv3.NewSearchRequest( - config.GroupSearch.BaseDN, - ldapv3.ScopeWholeSubtree, ldapv3.NeverDerefAliases, 0, 0, false, - config.GroupSearch.Filter, // The filter to apply - []string{config.UserSearch.NameAttr, config.UserSearch.EmailAttr}, // A list attributes to retrieve - nil, - ) - - sr, err := l.Search(searchRequest) - if err != nil { - logger.Error(err) - return err - } - - for _, entry := range sr.Entries { - _, err := user.SyncUser(&user.SyncUserInfo{ - Account: entry.GetAttributeValue(config.UserSearch.NameAttr), - IdentityType: si.ID, - }, logger) - if err != nil { - return err - } - } - return nil -} - func SyncLdapUser(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - ctx.Logger.Info("SyncLdapUser start") ldapId := c.Param("ldapId") systemConfigClient := systemconfig.New() si, err := systemConfigClient.GetConnector(ldapId) @@ -78,7 +25,12 @@ func SyncLdapUser(c *gin.Context) { ctx.Err = err return } - ctx.Err = searchAndSyncUser(si, ctx.Logger) + ctx.Err = user.SearchAndSyncUser(&systemconfig.Connector{ + ConnectorBase: si.ConnectorBase, + ID: si.ID, + Name: si.Name, + Config: si.Config, + }, ctx.Logger) } func GetUser(c *gin.Context) { diff --git a/pkg/microservice/user/core/service/login/local.go b/pkg/microservice/user/core/service/login/local.go index e0c300cf2..ccb54d625 100644 --- a/pkg/microservice/user/core/service/login/local.go +++ b/pkg/microservice/user/core/service/login/local.go @@ -38,7 +38,7 @@ func LocalLogin(args *LoginArgs, logger *zap.SugaredLogger) (*User, error) { if user == nil { return nil, fmt.Errorf("user not exist") } - userLogin, err := orm.GetUserLogin(user.UID, args.Account, config.AccountLocinType, core.DB) + userLogin, err := orm.GetUserLogin(user.UID, args.Account, config.AccountLoginType, core.DB) if err != nil { logger.Errorf("LocalLogin get user:%s user login not exist, error msg:%s", args.Account, err.Error()) return nil, err diff --git a/pkg/microservice/user/core/service/user/user.go b/pkg/microservice/user/core/service/user/user.go index ec6c52dfb..6e5d1b3c9 100644 --- a/pkg/microservice/user/core/service/user/user.go +++ b/pkg/microservice/user/core/service/user/user.go @@ -4,6 +4,8 @@ import ( "fmt" "time" + "github.com/dexidp/dex/connector/ldap" + ldapv3 "github.com/go-ldap/ldap/v3" "github.com/google/uuid" "go.uber.org/zap" "golang.org/x/crypto/bcrypt" @@ -12,6 +14,7 @@ import ( "github.com/koderover/zadig/pkg/microservice/user/core" "github.com/koderover/zadig/pkg/microservice/user/core/repository/models" "github.com/koderover/zadig/pkg/microservice/user/core/repository/orm" + "github.com/koderover/zadig/pkg/shared/client/systemconfig" ) type User struct { @@ -56,13 +59,62 @@ type SyncUserInfo struct { Name string `json:"name"` } +func SearchAndSyncUser(si *systemconfig.Connector, logger *zap.SugaredLogger) error { + if si == nil || si.Config == nil { + logger.Error("can't find connector") + return fmt.Errorf("can't find connector") + } + config, ok := si.Config.(*ldap.Config) + if !ok { + return fmt.Errorf("connector config error") + } + l, err := ldapv3.Dial("tcp", config.Host) + if err != nil { + logger.Errorf("ldap dial host:%s error, error msg:%s", config.Host, err) + return err + } + defer l.Close() + + err = l.Bind(config.BindDN, config.BindPW) + if err != nil { + logger.Errorf("ldap bind host:%s error, error msg:%s", config.Host, err) + return err + } + + searchRequest := ldapv3.NewSearchRequest( + config.GroupSearch.BaseDN, + ldapv3.ScopeWholeSubtree, ldapv3.NeverDerefAliases, 0, 0, false, + config.GroupSearch.Filter, // The filter to apply + []string{config.UserSearch.NameAttr}, // A list attributes to retrieve + nil, + ) + + sr, err := l.Search(searchRequest) + if err != nil { + logger.Errorf("ldap search host:%s error, error msg:%s", config.Host, err) + return err + } + + for _, entry := range sr.Entries { + _, err := SyncUser(&SyncUserInfo{ + Account: entry.GetAttributeValue(config.UserSearch.NameAttr), + IdentityType: si.ID, + }, logger) + if err != nil { + logger.Errorf("ldap host:%s sync user error, error msg:%s", config.Host, err) + return err + } + } + return nil +} + func GetUser(uid string, logger *zap.SugaredLogger) (*UserInfo, error) { user, err := orm.GetUserByUid(uid, core.DB) if err != nil { logger.Errorf("GetUser getUserByUid:%s error, error msg:%s", uid, err.Error()) return nil, err } - userLogin, err := orm.GetUserLogin(uid, user.Account, config.AccountLocinType, core.DB) + userLogin, err := orm.GetUserLogin(uid, user.Account, config.AccountLoginType, core.DB) if err != nil { logger.Errorf("GetUser GetUserLogin:%s error, error msg:%s", uid, err.Error()) return nil, err @@ -148,7 +200,7 @@ func SearchUsersByUIDs(uids []string, logger *zap.SugaredLogger) (*UsersResp, er func getLoginId(user *models.User, loginType config.LoginType) string { switch loginType { - case config.AccountLocinType: + case config.AccountLoginType: return user.Account default: return user.Account @@ -204,7 +256,7 @@ func UpdatePassword(args *Password, logger *zap.SugaredLogger) error { if user == nil { return fmt.Errorf("user not exist") } - userLogin, err := orm.GetUserLogin(user.UID, user.Account, config.AccountLocinType, core.DB) + userLogin, err := orm.GetUserLogin(user.UID, user.Account, config.AccountLoginType, core.DB) if err != nil { logger.Errorf("UpdatePassword GetUserLogin:%s error, error msg:%s", args.Uid, err.Error()) return err @@ -263,7 +315,7 @@ func SyncUser(syncUserInfo *SyncUserInfo, logger *zap.SugaredLogger) (*models.Us return nil, err } } - userLogin, err := orm.GetUserLogin(user.UID, user.Account, config.AccountLocinType, tx) + userLogin, err := orm.GetUserLogin(user.UID, user.Account, config.AccountLoginType, tx) if err != nil { tx.Rollback() logger.Error("UpdateLoginInfo get user:%s login error, error msg:%s", user.UID, err.Error()) @@ -281,8 +333,8 @@ func SyncUser(syncUserInfo *SyncUserInfo, logger *zap.SugaredLogger) (*models.Us err = orm.CreateUserLogin(&models.UserLogin{ UID: user.UID, LastLoginTime: time.Now().Unix(), - LoginId: getLoginId(user, config.AccountLocinType), - LoginType: int(config.AccountLocinType), + LoginId: getLoginId(user, config.AccountLoginType), + LoginType: int(config.AccountLoginType), }, tx) if err != nil { tx.Rollback() diff --git a/pkg/shared/client/systemconfig/systemconfig.go b/pkg/shared/client/systemconfig/systemconfig.go index f75eb8302..acc8f4ce8 100644 --- a/pkg/shared/client/systemconfig/systemconfig.go +++ b/pkg/shared/client/systemconfig/systemconfig.go @@ -5,6 +5,14 @@ import ( "github.com/koderover/zadig/pkg/tool/httpclient" ) +type Connector struct { + service.ConnectorBase + + ID string `json:"id"` + Name string `json:"name"` + Config interface{} `json:"config"` +} + func (c *Client) GetConnector(id string) (*service.Connector, error) { url := "/connectors/" + id -- Gitee From f126301a57d9585614f0f45f52295f738017810b Mon Sep 17 00:00:00 2001 From: panxunying <641770806@qq.com> Date: Mon, 1 Nov 2021 18:54:06 +0800 Subject: [PATCH 189/405] update list user Signed-off-by: panxunying <641770806@qq.com> --- .../user/core/handler/user/user.go | 2 + .../user/core/service/login/local.go | 2 +- .../user/core/service/user/user.go | 40 ++++++++++++++----- 3 files changed, 33 insertions(+), 11 deletions(-) diff --git a/pkg/microservice/user/core/handler/user/user.go b/pkg/microservice/user/core/handler/user/user.go index 530b434d4..d78edcb0e 100644 --- a/pkg/microservice/user/core/handler/user/user.go +++ b/pkg/microservice/user/core/handler/user/user.go @@ -37,6 +37,8 @@ func ListUsers(c *gin.Context) { if len(args.UIDs) > 0 { ctx.Resp, ctx.Err = user.SearchUsersByUIDs(args.UIDs, ctx.Logger) return + } else if len(args.Account) > 0 { + ctx.Resp, ctx.Err = user.SearchUserByAccount(args, ctx.Logger) } else { ctx.Resp, ctx.Err = user.SearchUsers(args, ctx.Logger) return diff --git a/pkg/microservice/user/core/service/login/local.go b/pkg/microservice/user/core/service/login/local.go index e0c300cf2..ccb54d625 100644 --- a/pkg/microservice/user/core/service/login/local.go +++ b/pkg/microservice/user/core/service/login/local.go @@ -38,7 +38,7 @@ func LocalLogin(args *LoginArgs, logger *zap.SugaredLogger) (*User, error) { if user == nil { return nil, fmt.Errorf("user not exist") } - userLogin, err := orm.GetUserLogin(user.UID, args.Account, config.AccountLocinType, core.DB) + userLogin, err := orm.GetUserLogin(user.UID, args.Account, config.AccountLoginType, core.DB) if err != nil { logger.Errorf("LocalLogin get user:%s user login not exist, error msg:%s", args.Account, err.Error()) return nil, err diff --git a/pkg/microservice/user/core/service/user/user.go b/pkg/microservice/user/core/service/user/user.go index 016357fa7..5933f5a82 100644 --- a/pkg/microservice/user/core/service/user/user.go +++ b/pkg/microservice/user/core/service/user/user.go @@ -23,10 +23,12 @@ type User struct { } type QueryArgs struct { - Name string `json:"name,omitempty"` - UIDs []string `json:"uids,omitempty"` - PerPage int `json:"per_page,omitempty"` - Page int `json:"page,omitempty"` + Name string `json:"name,omitempty"` + Account string `json:"account,omitempty"` + IdentityType string `json:"identity_type,omitempty"` + UIDs []string `json:"uids,omitempty"` + PerPage int `json:"per_page,omitempty"` + Page int `json:"page,omitempty"` } type UserInfo struct { @@ -62,7 +64,7 @@ func GetUser(uid string, logger *zap.SugaredLogger) (*UserInfo, error) { logger.Errorf("GetUser getUserByUid:%s error, error msg:%s", uid, err.Error()) return nil, err } - userLogin, err := orm.GetUserLogin(uid, user.Account, config.AccountLocinType, core.DB) + userLogin, err := orm.GetUserLogin(uid, user.Account, config.AccountLoginType, core.DB) if err != nil { logger.Errorf("GetUser GetUserLogin:%s error, error msg:%s", uid, err.Error()) return nil, err @@ -71,6 +73,24 @@ func GetUser(uid string, logger *zap.SugaredLogger) (*UserInfo, error) { return &userInfo[0], nil } +func SearchUserByAccount(args *QueryArgs, logger *zap.SugaredLogger) (*UsersResp, error) { + user, err := orm.GetUser(args.Account, args.IdentityType, core.DB) + if err != nil { + logger.Errorf("SearchUserByAccount GetUser By account:%s error, error msg:%s", args.Account, err.Error()) + return nil, err + } + userLogins, err := orm.ListUserLogins([]string{user.UID}, core.DB) + if err != nil { + logger.Errorf("SearchUserByAccount ListUserLogins By uid:%s error, error msg:%s", user.UID, err.Error()) + return nil, err + } + usersInfo := mergeUserLogin([]models.User{*user}, *userLogins, logger) + return &UsersResp{ + Users: usersInfo, + TotalCount: int64(len(usersInfo)), + }, nil +} + func SearchUsers(args *QueryArgs, logger *zap.SugaredLogger) (*UsersResp, error) { count, err := orm.GetUsersCount(args.Name) if err != nil { @@ -148,7 +168,7 @@ func SearchUsersByUIDs(uids []string, logger *zap.SugaredLogger) (*UsersResp, er func getLoginId(user *models.User, loginType config.LoginType) string { switch loginType { - case config.AccountLocinType: + case config.AccountLoginType: return user.Account default: return user.Account @@ -204,7 +224,7 @@ func UpdatePassword(args *Password, logger *zap.SugaredLogger) error { if user == nil { return fmt.Errorf("user not exist") } - userLogin, err := orm.GetUserLogin(user.UID, user.Account, config.AccountLocinType, core.DB) + userLogin, err := orm.GetUserLogin(user.UID, user.Account, config.AccountLoginType, core.DB) if err != nil { logger.Errorf("UpdatePassword GetUserLogin:%s error, error msg:%s", args.Uid, err.Error()) return err @@ -263,7 +283,7 @@ func SyncUser(syncUserInfo *SyncUserInfo, logger *zap.SugaredLogger) (*models.Us return nil, err } } - userLogin, err := orm.GetUserLogin(user.UID, user.Account, config.AccountLocinType, tx) + userLogin, err := orm.GetUserLogin(user.UID, user.Account, config.AccountLoginType, tx) if err != nil { tx.Rollback() logger.Error("UpdateLoginInfo get user:%s login error, error msg:%s", user.UID, err.Error()) @@ -281,8 +301,8 @@ func SyncUser(syncUserInfo *SyncUserInfo, logger *zap.SugaredLogger) (*models.Us err = orm.CreateUserLogin(&models.UserLogin{ UID: user.UID, LastLoginTime: time.Now().Unix(), - LoginId: getLoginId(user, config.AccountLocinType), - LoginType: int(config.AccountLocinType), + LoginId: getLoginId(user, config.AccountLoginType), + LoginType: int(config.AccountLoginType), }, tx) if err != nil { tx.Rollback() -- Gitee From 4066e26f4c8d0c2485dcde4726a88a87ba3dc4ec Mon Sep 17 00:00:00 2001 From: panxunying <641770806@qq.com> Date: Mon, 1 Nov 2021 19:16:28 +0800 Subject: [PATCH 190/405] optimize Signed-off-by: panxunying <641770806@qq.com> --- .../user/core/handler/user/user.go | 22 +++---------------- .../user/core/service/user/user.go | 8 ++++++- .../client/systemconfig/systemconfig.go | 8 +++---- 3 files changed, 13 insertions(+), 25 deletions(-) diff --git a/pkg/microservice/user/core/handler/user/user.go b/pkg/microservice/user/core/handler/user/user.go index d1f109dc6..03c26748d 100644 --- a/pkg/microservice/user/core/handler/user/user.go +++ b/pkg/microservice/user/core/handler/user/user.go @@ -4,7 +4,6 @@ import ( "github.com/gin-gonic/gin" "github.com/koderover/zadig/pkg/microservice/user/core/service/user" - "github.com/koderover/zadig/pkg/shared/client/systemconfig" internalhandler "github.com/koderover/zadig/pkg/shared/handler" e "github.com/koderover/zadig/pkg/tool/errors" @@ -13,24 +12,9 @@ import ( func SyncLdapUser(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - ldapId := c.Param("ldapId") - systemConfigClient := systemconfig.New() - si, err := systemConfigClient.GetConnector(ldapId) - if err != nil { - ctx.Logger.Error(err) - ctx.Err = err - return - } - if err != nil { - ctx.Err = err - return - } - ctx.Err = user.SearchAndSyncUser(&systemconfig.Connector{ - ConnectorBase: si.ConnectorBase, - ID: si.ID, - Name: si.Name, - Config: si.Config, - }, ctx.Logger) + ldapID := c.Param("ldapId") + + ctx.Err = user.SearchAndSyncUser(ldapID, ctx.Logger) } func GetUser(c *gin.Context) { diff --git a/pkg/microservice/user/core/service/user/user.go b/pkg/microservice/user/core/service/user/user.go index 6e5d1b3c9..ab03313d3 100644 --- a/pkg/microservice/user/core/service/user/user.go +++ b/pkg/microservice/user/core/service/user/user.go @@ -59,7 +59,13 @@ type SyncUserInfo struct { Name string `json:"name"` } -func SearchAndSyncUser(si *systemconfig.Connector, logger *zap.SugaredLogger) error { +func SearchAndSyncUser(ldapId string, logger *zap.SugaredLogger) error { + systemConfigClient := systemconfig.New() + si, err := systemConfigClient.GetConnector(ldapId) + if err != nil { + logger.Errorf("SearchAndSyncUser GetConnector error, error msg:%s", err) + return fmt.Errorf("SearchAndSyncUser GetConnector error, error msg:%s", err) + } if si == nil || si.Config == nil { logger.Error("can't find connector") return fmt.Errorf("can't find connector") diff --git a/pkg/shared/client/systemconfig/systemconfig.go b/pkg/shared/client/systemconfig/systemconfig.go index acc8f4ce8..6d98e516f 100644 --- a/pkg/shared/client/systemconfig/systemconfig.go +++ b/pkg/shared/client/systemconfig/systemconfig.go @@ -1,22 +1,20 @@ package systemconfig import ( - "github.com/koderover/zadig/pkg/microservice/systemconfig/core/service" "github.com/koderover/zadig/pkg/tool/httpclient" ) type Connector struct { - service.ConnectorBase - + Type string `json:"type"` ID string `json:"id"` Name string `json:"name"` Config interface{} `json:"config"` } -func (c *Client) GetConnector(id string) (*service.Connector, error) { +func (c *Client) GetConnector(id string) (*Connector, error) { url := "/connectors/" + id - res := &service.Connector{} + res := &Connector{} _, err := c.Get(url, httpclient.SetResult(res)) if err != nil { return nil, err -- Gitee From a2dd5905302b7e0ac1fa543ac470348649dccbb1 Mon Sep 17 00:00:00 2001 From: panxunying <641770806@qq.com> Date: Mon, 1 Nov 2021 19:22:12 +0800 Subject: [PATCH 191/405] Ldap sync user (#508) * add user-sync Signed-off-by: panxunying <641770806@qq.com> * optimize Signed-off-by: panxunying <641770806@qq.com> * optimize Signed-off-by: panxunying <641770806@qq.com> --- go.mod | 1 + pkg/config/config.go | 8 +- pkg/microservice/user/core/handler/router.go | 2 + .../user/core/handler/user/user.go | 8 ++ .../user/core/repository/orm/user.go | 13 ++- .../user/core/service/login/local.go | 2 +- .../user/core/service/user/user.go | 80 ++++++++++++++++--- pkg/shared/client/systemconfig/client.go | 40 ++++++++++ .../client/systemconfig/systemconfig.go | 24 ++++++ 9 files changed, 154 insertions(+), 24 deletions(-) create mode 100644 pkg/shared/client/systemconfig/client.go create mode 100644 pkg/shared/client/systemconfig/systemconfig.go diff --git a/go.mod b/go.mod index 61ad1a857..d17cc71d0 100644 --- a/go.mod +++ b/go.mod @@ -25,6 +25,7 @@ require ( github.com/garyburd/redigo v1.6.2 // indirect github.com/gin-contrib/sse v0.1.0 github.com/gin-gonic/gin v1.7.2 + github.com/go-ldap/ldap/v3 v3.3.0 github.com/go-resty/resty/v2 v2.6.0 github.com/gofrs/uuid v4.0.0+incompatible // indirect github.com/golang-jwt/jwt v3.2.2+incompatible diff --git a/pkg/config/config.go b/pkg/config/config.go index 88dd35612..7dfa9703c 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -150,15 +150,15 @@ func PoetryServiceInfo() *setting.ServiceInfo { return GetServiceByCode(setting.Poetry) } -func ConfigServiceInfo() *setting.ServiceInfo { - return GetServiceByCode(setting.Poetry) -} - func PoetryServiceAddress() string { s := PoetryServiceInfo() return GetServiceAddress(s.Name, s.Port) } +func ConfigServiceInfo() *setting.ServiceInfo { + return GetServiceByCode(setting.Config) +} + func ConfigServiceAddress() string { s := ConfigServiceInfo() return GetServiceAddress(s.Name, s.Port) diff --git a/pkg/microservice/user/core/handler/router.go b/pkg/microservice/user/core/handler/router.go index beb9e0e36..5b191c859 100644 --- a/pkg/microservice/user/core/handler/router.go +++ b/pkg/microservice/user/core/handler/router.go @@ -39,5 +39,7 @@ func (*Router) Inject(router *gin.RouterGroup) { users.GET("/users/:uid/personal", user.GetPersonalUser) users.POST("/users/search", user.ListUsers) + + users.POST("/users/ldap/:ldapId", user.SyncLdapUser) } } diff --git a/pkg/microservice/user/core/handler/user/user.go b/pkg/microservice/user/core/handler/user/user.go index 530b434d4..03c26748d 100644 --- a/pkg/microservice/user/core/handler/user/user.go +++ b/pkg/microservice/user/core/handler/user/user.go @@ -9,6 +9,14 @@ import ( e "github.com/koderover/zadig/pkg/tool/errors" ) +func SyncLdapUser(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + ldapID := c.Param("ldapId") + + ctx.Err = user.SearchAndSyncUser(ldapID, ctx.Logger) +} + func GetUser(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() diff --git a/pkg/microservice/user/core/repository/orm/user.go b/pkg/microservice/user/core/repository/orm/user.go index faeda529f..b70ffa9e0 100644 --- a/pkg/microservice/user/core/repository/orm/user.go +++ b/pkg/microservice/user/core/repository/orm/user.go @@ -42,16 +42,13 @@ func GetUserByUid(uid string, db *gorm.DB) (*models.User, error) { } // ListUsers gets a list of users based on paging constraints -func ListUsers(page int, perPage int, name string, db *gorm.DB) ([]models.User, error) { +func ListUsers(page int, perPage int, account string, db *gorm.DB) ([]models.User, error) { var ( users []models.User err error ) - if page > 0 && perPage > 0 { - err = db.Where("name LIKE ?", "%"+name+"%").Find(&users).Offset((page - 1) * perPage).Limit(perPage).Error - } else { - err = db.Where("name LIKE ?", "%"+name+"%").Find(&users).Error - } + + err = db.Where("account LIKE ?", "%"+account+"%").Offset((page - 1) * perPage).Limit(perPage).Find(&users).Error if err != nil && err != gorm.ErrRecordNotFound { return nil, err @@ -77,14 +74,14 @@ func ListUsersByUIDs(uids []string, db *gorm.DB) ([]models.User, error) { } // GetUsersCount gets user count -func GetUsersCount(name string) (int64, error) { +func GetUsersCount(account string) (int64, error) { var ( users []models.User err error count int64 ) - err = core.DB.Where("name LIKE ?", "%"+name+"%").Find(&users).Count(&count).Error + err = core.DB.Where("account LIKE ?", "%"+account+"%").Find(&users).Count(&count).Error if err != nil { return 0, err diff --git a/pkg/microservice/user/core/service/login/local.go b/pkg/microservice/user/core/service/login/local.go index e0c300cf2..ccb54d625 100644 --- a/pkg/microservice/user/core/service/login/local.go +++ b/pkg/microservice/user/core/service/login/local.go @@ -38,7 +38,7 @@ func LocalLogin(args *LoginArgs, logger *zap.SugaredLogger) (*User, error) { if user == nil { return nil, fmt.Errorf("user not exist") } - userLogin, err := orm.GetUserLogin(user.UID, args.Account, config.AccountLocinType, core.DB) + userLogin, err := orm.GetUserLogin(user.UID, args.Account, config.AccountLoginType, core.DB) if err != nil { logger.Errorf("LocalLogin get user:%s user login not exist, error msg:%s", args.Account, err.Error()) return nil, err diff --git a/pkg/microservice/user/core/service/user/user.go b/pkg/microservice/user/core/service/user/user.go index 016357fa7..ab03313d3 100644 --- a/pkg/microservice/user/core/service/user/user.go +++ b/pkg/microservice/user/core/service/user/user.go @@ -4,6 +4,8 @@ import ( "fmt" "time" + "github.com/dexidp/dex/connector/ldap" + ldapv3 "github.com/go-ldap/ldap/v3" "github.com/google/uuid" "go.uber.org/zap" "golang.org/x/crypto/bcrypt" @@ -12,6 +14,7 @@ import ( "github.com/koderover/zadig/pkg/microservice/user/core" "github.com/koderover/zadig/pkg/microservice/user/core/repository/models" "github.com/koderover/zadig/pkg/microservice/user/core/repository/orm" + "github.com/koderover/zadig/pkg/shared/client/systemconfig" ) type User struct { @@ -23,7 +26,7 @@ type User struct { } type QueryArgs struct { - Name string `json:"name,omitempty"` + Account string `json:"account,omitempty"` UIDs []string `json:"uids,omitempty"` PerPage int `json:"per_page,omitempty"` Page int `json:"page,omitempty"` @@ -56,13 +59,68 @@ type SyncUserInfo struct { Name string `json:"name"` } +func SearchAndSyncUser(ldapId string, logger *zap.SugaredLogger) error { + systemConfigClient := systemconfig.New() + si, err := systemConfigClient.GetConnector(ldapId) + if err != nil { + logger.Errorf("SearchAndSyncUser GetConnector error, error msg:%s", err) + return fmt.Errorf("SearchAndSyncUser GetConnector error, error msg:%s", err) + } + if si == nil || si.Config == nil { + logger.Error("can't find connector") + return fmt.Errorf("can't find connector") + } + config, ok := si.Config.(*ldap.Config) + if !ok { + return fmt.Errorf("connector config error") + } + l, err := ldapv3.Dial("tcp", config.Host) + if err != nil { + logger.Errorf("ldap dial host:%s error, error msg:%s", config.Host, err) + return err + } + defer l.Close() + + err = l.Bind(config.BindDN, config.BindPW) + if err != nil { + logger.Errorf("ldap bind host:%s error, error msg:%s", config.Host, err) + return err + } + + searchRequest := ldapv3.NewSearchRequest( + config.GroupSearch.BaseDN, + ldapv3.ScopeWholeSubtree, ldapv3.NeverDerefAliases, 0, 0, false, + config.GroupSearch.Filter, // The filter to apply + []string{config.UserSearch.NameAttr}, // A list attributes to retrieve + nil, + ) + + sr, err := l.Search(searchRequest) + if err != nil { + logger.Errorf("ldap search host:%s error, error msg:%s", config.Host, err) + return err + } + + for _, entry := range sr.Entries { + _, err := SyncUser(&SyncUserInfo{ + Account: entry.GetAttributeValue(config.UserSearch.NameAttr), + IdentityType: si.ID, + }, logger) + if err != nil { + logger.Errorf("ldap host:%s sync user error, error msg:%s", config.Host, err) + return err + } + } + return nil +} + func GetUser(uid string, logger *zap.SugaredLogger) (*UserInfo, error) { user, err := orm.GetUserByUid(uid, core.DB) if err != nil { logger.Errorf("GetUser getUserByUid:%s error, error msg:%s", uid, err.Error()) return nil, err } - userLogin, err := orm.GetUserLogin(uid, user.Account, config.AccountLocinType, core.DB) + userLogin, err := orm.GetUserLogin(uid, user.Account, config.AccountLoginType, core.DB) if err != nil { logger.Errorf("GetUser GetUserLogin:%s error, error msg:%s", uid, err.Error()) return nil, err @@ -72,9 +130,9 @@ func GetUser(uid string, logger *zap.SugaredLogger) (*UserInfo, error) { } func SearchUsers(args *QueryArgs, logger *zap.SugaredLogger) (*UsersResp, error) { - count, err := orm.GetUsersCount(args.Name) + count, err := orm.GetUsersCount(args.Account) if err != nil { - logger.Errorf("SeachUsers GetUsersCount By name:%s error, error msg:%s", args.Name, err.Error()) + logger.Errorf("SeachUsers GetUsersCount By account:%s error, error msg:%s", args.Account, err.Error()) return nil, err } if count == 0 { @@ -83,9 +141,9 @@ func SearchUsers(args *QueryArgs, logger *zap.SugaredLogger) (*UsersResp, error) }, nil } - users, err := orm.ListUsers(args.Page, args.PerPage, args.Name, core.DB) + users, err := orm.ListUsers(args.Page, args.PerPage, args.Account, core.DB) if err != nil { - logger.Errorf("SeachUsers SeachUsers By name:%s error, error msg:%s", args.Name, err.Error()) + logger.Errorf("SeachUsers SeachUsers By account:%s error, error msg:%s", args.Account, err.Error()) return nil, err } var uids []string @@ -148,7 +206,7 @@ func SearchUsersByUIDs(uids []string, logger *zap.SugaredLogger) (*UsersResp, er func getLoginId(user *models.User, loginType config.LoginType) string { switch loginType { - case config.AccountLocinType: + case config.AccountLoginType: return user.Account default: return user.Account @@ -204,7 +262,7 @@ func UpdatePassword(args *Password, logger *zap.SugaredLogger) error { if user == nil { return fmt.Errorf("user not exist") } - userLogin, err := orm.GetUserLogin(user.UID, user.Account, config.AccountLocinType, core.DB) + userLogin, err := orm.GetUserLogin(user.UID, user.Account, config.AccountLoginType, core.DB) if err != nil { logger.Errorf("UpdatePassword GetUserLogin:%s error, error msg:%s", args.Uid, err.Error()) return err @@ -263,7 +321,7 @@ func SyncUser(syncUserInfo *SyncUserInfo, logger *zap.SugaredLogger) (*models.Us return nil, err } } - userLogin, err := orm.GetUserLogin(user.UID, user.Account, config.AccountLocinType, tx) + userLogin, err := orm.GetUserLogin(user.UID, user.Account, config.AccountLoginType, tx) if err != nil { tx.Rollback() logger.Error("UpdateLoginInfo get user:%s login error, error msg:%s", user.UID, err.Error()) @@ -281,8 +339,8 @@ func SyncUser(syncUserInfo *SyncUserInfo, logger *zap.SugaredLogger) (*models.Us err = orm.CreateUserLogin(&models.UserLogin{ UID: user.UID, LastLoginTime: time.Now().Unix(), - LoginId: getLoginId(user, config.AccountLocinType), - LoginType: int(config.AccountLocinType), + LoginId: getLoginId(user, config.AccountLoginType), + LoginType: int(config.AccountLoginType), }, tx) if err != nil { tx.Rollback() diff --git a/pkg/shared/client/systemconfig/client.go b/pkg/shared/client/systemconfig/client.go new file mode 100644 index 000000000..cc9052c52 --- /dev/null +++ b/pkg/shared/client/systemconfig/client.go @@ -0,0 +1,40 @@ +/* +Copyright 2021 The KodeRover 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 systemconfig + +import ( + "github.com/koderover/zadig/pkg/config" + "github.com/koderover/zadig/pkg/tool/httpclient" +) + +type Client struct { + *httpclient.Client + + host string +} + +func New() *Client { + host := config.ConfigServiceAddress() + c := httpclient.New( + httpclient.SetHostURL(host + "/api/v1"), + ) + + return &Client{ + Client: c, + host: host, + } +} diff --git a/pkg/shared/client/systemconfig/systemconfig.go b/pkg/shared/client/systemconfig/systemconfig.go new file mode 100644 index 000000000..6d98e516f --- /dev/null +++ b/pkg/shared/client/systemconfig/systemconfig.go @@ -0,0 +1,24 @@ +package systemconfig + +import ( + "github.com/koderover/zadig/pkg/tool/httpclient" +) + +type Connector struct { + Type string `json:"type"` + ID string `json:"id"` + Name string `json:"name"` + Config interface{} `json:"config"` +} + +func (c *Client) GetConnector(id string) (*Connector, error) { + url := "/connectors/" + id + + res := &Connector{} + _, err := c.Get(url, httpclient.SetResult(res)) + if err != nil { + return nil, err + } + + return res, err +} -- Gitee From 3805d30dd1899ddca24da9dc853f8c73b9f3fdb6 Mon Sep 17 00:00:00 2001 From: panxunying <641770806@qq.com> Date: Mon, 1 Nov 2021 19:56:27 +0800 Subject: [PATCH 192/405] optimize Signed-off-by: panxunying <641770806@qq.com> --- pkg/microservice/user/core/handler/user/user.go | 6 ++++-- pkg/microservice/user/core/service/user/user.go | 6 ++++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/pkg/microservice/user/core/handler/user/user.go b/pkg/microservice/user/core/handler/user/user.go index cbc3f2552..22a697275 100644 --- a/pkg/microservice/user/core/handler/user/user.go +++ b/pkg/microservice/user/core/handler/user/user.go @@ -44,13 +44,15 @@ func ListUsers(c *gin.Context) { } if len(args.UIDs) > 0 { ctx.Resp, ctx.Err = user.SearchUsersByUIDs(args.UIDs, ctx.Logger) - return } else if len(args.Account) > 0 { + if len(args.IdentityType) == 0 { + args.IdentityType = "system" + } ctx.Resp, ctx.Err = user.SearchUserByAccount(args, ctx.Logger) } else { ctx.Resp, ctx.Err = user.SearchUsers(args, ctx.Logger) - return } + return } func CreateUser(c *gin.Context) { diff --git a/pkg/microservice/user/core/service/user/user.go b/pkg/microservice/user/core/service/user/user.go index b15e9d1d5..692284f0a 100644 --- a/pkg/microservice/user/core/service/user/user.go +++ b/pkg/microservice/user/core/service/user/user.go @@ -137,6 +137,12 @@ func SearchUserByAccount(args *QueryArgs, logger *zap.SugaredLogger) (*UsersResp logger.Errorf("SearchUserByAccount GetUser By account:%s error, error msg:%s", args.Account, err.Error()) return nil, err } + if user == nil { + return &UsersResp{ + Users: nil, + TotalCount: 0, + }, nil + } userLogins, err := orm.ListUserLogins([]string{user.UID}, core.DB) if err != nil { logger.Errorf("SearchUserByAccount ListUserLogins By uid:%s error, error msg:%s", user.UID, err.Error()) -- Gitee From 42f037c189f1c7c4cd342bb8b4b486bff3225033 Mon Sep 17 00:00:00 2001 From: mouuii Date: Mon, 1 Nov 2021 19:59:24 +0800 Subject: [PATCH 193/405] test workflows Signed-off-by: mouuii --- .../aslan/core/common/repository/mongodb/workflow.go | 9 ++++++--- pkg/microservice/picket/core/filter/service/workflow.go | 3 +++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/pkg/microservice/aslan/core/common/repository/mongodb/workflow.go b/pkg/microservice/aslan/core/common/repository/mongodb/workflow.go index c7bbc880d..edd7015c6 100644 --- a/pkg/microservice/aslan/core/common/repository/mongodb/workflow.go +++ b/pkg/microservice/aslan/core/common/repository/mongodb/workflow.go @@ -175,9 +175,12 @@ func (c *WorkflowColl) ListWithScheduleEnabled() ([]*models.Workflow, error) { func (c *WorkflowColl) ListWorkflowsByProjects(projects []string) ([]*models.Workflow, error) { resp := make([]*models.Workflow, 0) - query := bson.M{"product_tmpl_name": bson.M{ - "$in": projects, - }} + query := bson.M{} + if len(projects) != 0 { + query = bson.M{"product_tmpl_name": bson.M{ + "$in": projects, + }} + } cursor, err := c.Collection.Find(context.TODO(), query) if err != nil { diff --git a/pkg/microservice/picket/core/filter/service/workflow.go b/pkg/microservice/picket/core/filter/service/workflow.go index c05c62607..273acab19 100644 --- a/pkg/microservice/picket/core/filter/service/workflow.go +++ b/pkg/microservice/picket/core/filter/service/workflow.go @@ -21,6 +21,9 @@ func ListTestWorkflows(testName string, header http.Header, qs url.Values, logge logger.Errorf("Failed to get allowed project names, err: %s", err) return nil, err } + if len(names) == 0 { + return nil, nil + } for _, name := range names { qs.Add("projects", name) -- Gitee From a893df9a8a2a700ac9a015246d724aa3bfd0b617 Mon Sep 17 00:00:00 2001 From: panxunying <641770806@qq.com> Date: Mon, 1 Nov 2021 20:16:31 +0800 Subject: [PATCH 194/405] fix get user nil pointer Signed-off-by: panxunying <641770806@qq.com> --- pkg/microservice/user/core/service/user/user.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pkg/microservice/user/core/service/user/user.go b/pkg/microservice/user/core/service/user/user.go index 692284f0a..352003792 100644 --- a/pkg/microservice/user/core/service/user/user.go +++ b/pkg/microservice/user/core/service/user/user.go @@ -122,6 +122,9 @@ func GetUser(uid string, logger *zap.SugaredLogger) (*UserInfo, error) { logger.Errorf("GetUser getUserByUid:%s error, error msg:%s", uid, err.Error()) return nil, err } + if user == nil { + return nil, nil + } userLogin, err := orm.GetUserLogin(uid, user.Account, config.AccountLoginType, core.DB) if err != nil { logger.Errorf("GetUser GetUserLogin:%s error, error msg:%s", uid, err.Error()) -- Gitee From af72fb3213baa0f29d9205cc34c8242649ac2a43 Mon Sep 17 00:00:00 2001 From: Guang Jiong Lou <7991675+27149chen@users.noreply.github.com> Date: Mon, 1 Nov 2021 20:34:01 +0800 Subject: [PATCH 195/405] token expiry check (#510) Signed-off-by: lou --- .../policy/core/service/bundle/exemption_urls.go | 2 +- .../policy/core/service/bundle/rego/authz.rego | 16 +++++++++++----- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/pkg/microservice/policy/core/service/bundle/exemption_urls.go b/pkg/microservice/policy/core/service/bundle/exemption_urls.go index eac910dab..6f68587dd 100644 --- a/pkg/microservice/policy/core/service/bundle/exemption_urls.go +++ b/pkg/microservice/policy/core/service/bundle/exemption_urls.go @@ -74,7 +74,7 @@ var systemAdminURLs = []*policyRule{ }, { Methods: []string{"POST"}, - Endpoints: []string{"api/picket/projects"}, + Endpoints: []string{"api/v1/picket/projects"}, }, { Methods: []string{"DELETE"}, diff --git a/pkg/microservice/policy/core/service/bundle/rego/authz.rego b/pkg/microservice/policy/core/service/bundle/rego/authz.rego index f35dd344f..6cb643b98 100644 --- a/pkg/microservice/policy/core/service/bundle/rego/authz.rego +++ b/pkg/microservice/policy/core/service/bundle/rego/authz.rego @@ -2,7 +2,7 @@ package rbac import input.attributes.request.http as http_request -# Policy rule definitions in rbac style which is consumed by OPA server. +# Policy rule definitions in rbac style, which is consumed by OPA server. # you can use it to: # 1. decide if a request is allowed by querying: rbac.allow # 2. decide if a request is allowed and get the status code by querying: rbac.response @@ -40,25 +40,30 @@ allow { url_is_public } -# Allow all valid users to visit exempted urls. allow { is_authenticated + access_is_granted + +} + +# Allow all valid users to visit exempted urls. +access_is_granted { url_is_exempted } # Allow admins to do anything. -allow { +access_is_granted { user_is_admin } # Allow project admins to do anything under the given project. -allow { +access_is_granted { not url_is_privileged user_is_project_admin } # Allow the action if the user is granted permission to perform the action. -allow { +access_is_granted { not url_is_privileged some grant @@ -220,6 +225,7 @@ bearer_token := t { is_authenticated { claims claims.uid != "" + claims.exp > time.now_ns()/1000000000 } envs := env { -- Gitee From 1a698daaab41f5c05bb5e99aef2fbbda38d1a8b1 Mon Sep 17 00:00:00 2001 From: mouuii Date: Mon, 1 Nov 2021 20:40:09 +0800 Subject: [PATCH 196/405] test workflows Signed-off-by: mouuii --- pkg/microservice/picket/core/filter/service/workflow.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/pkg/microservice/picket/core/filter/service/workflow.go b/pkg/microservice/picket/core/filter/service/workflow.go index 273acab19..d088fad7c 100644 --- a/pkg/microservice/picket/core/filter/service/workflow.go +++ b/pkg/microservice/picket/core/filter/service/workflow.go @@ -24,14 +24,15 @@ func ListTestWorkflows(testName string, header http.Header, qs url.Values, logge if len(names) == 0 { return nil, nil } + if len(names) == 1 && names[0] == "*" { + return aslan.New().ListTestWorkflows(testName, header, qs) + } for _, name := range names { qs.Add("projects", name) } - aslanClient := aslan.New() - - return aslanClient.ListTestWorkflows(testName, header, qs) + return aslan.New().ListTestWorkflows(testName, header, qs) } type rule struct { -- Gitee From 1ae855936d54169aa4a966991a40f7396abc307a Mon Sep 17 00:00:00 2001 From: mouuii Date: Mon, 1 Nov 2021 20:44:49 +0800 Subject: [PATCH 197/405] test workflows Signed-off-by: mouuii --- .../picket/core/filter/service/workflow.go | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/pkg/microservice/picket/core/filter/service/workflow.go b/pkg/microservice/picket/core/filter/service/workflow.go index d088fad7c..d2550025d 100644 --- a/pkg/microservice/picket/core/filter/service/workflow.go +++ b/pkg/microservice/picket/core/filter/service/workflow.go @@ -24,14 +24,11 @@ func ListTestWorkflows(testName string, header http.Header, qs url.Values, logge if len(names) == 0 { return nil, nil } - if len(names) == 1 && names[0] == "*" { - return aslan.New().ListTestWorkflows(testName, header, qs) - } - - for _, name := range names { - qs.Add("projects", name) + if !(len(names) == 1 && names[0] == "*") { + for _, name := range names { + qs.Add("projects", name) + } } - return aslan.New().ListTestWorkflows(testName, header, qs) } -- Gitee From 2726eec03945409c8900dec205d2ca63a1095db4 Mon Sep 17 00:00:00 2001 From: panxunying <641770806@qq.com> Date: Mon, 1 Nov 2021 21:37:43 +0800 Subject: [PATCH 198/405] add sync deleted user Signed-off-by: panxunying <641770806@qq.com> --- .../user/core/repository/orm/user.go | 26 +++++++++++++ .../user/core/repository/orm/user_login.go | 10 +++++ .../user/core/service/user/user.go | 39 ++++++++++++++++++- 3 files changed, 73 insertions(+), 2 deletions(-) diff --git a/pkg/microservice/user/core/repository/orm/user.go b/pkg/microservice/user/core/repository/orm/user.go index b70ffa9e0..a90a50417 100644 --- a/pkg/microservice/user/core/repository/orm/user.go +++ b/pkg/microservice/user/core/repository/orm/user.go @@ -73,6 +73,32 @@ func ListUsersByUIDs(uids []string, db *gorm.DB) ([]models.User, error) { return users, nil } +// ListUsersByIdentityType gets a list of users based on identityType +func ListUsersByIdentityType(identityType string, db *gorm.DB) ([]models.User, error) { + var ( + users []models.User + err error + ) + + err = db.Find(&users, "identity_type = ?", identityType).Error + + if err != nil && err != gorm.ErrRecordNotFound { + return nil, err + } + + return users, nil +} + +// DeleteUserByUids Delete users based on uids +func DeleteUserByUids(uids []string, db *gorm.DB) error { + var user models.User + err := db.Where("uid in ?", uids).Delete(&user).Error + if err != nil { + return err + } + return nil +} + // GetUsersCount gets user count func GetUsersCount(account string) (int64, error) { var ( diff --git a/pkg/microservice/user/core/repository/orm/user_login.go b/pkg/microservice/user/core/repository/orm/user_login.go index 153a538a6..a46c517dc 100644 --- a/pkg/microservice/user/core/repository/orm/user_login.go +++ b/pkg/microservice/user/core/repository/orm/user_login.go @@ -28,6 +28,16 @@ func GetUserLogin(uid string, account string, loginType config.LoginType, db *go return &userLogin, nil } +// DeleteUserLoginByUids Delete userLogin based on uids +func DeleteUserLoginByUids(uids []string, db *gorm.DB) error { + var userLogin models.UserLogin + err := db.Where("uid in ?", uids).Delete(&userLogin).Error + if err != nil { + return err + } + return nil +} + // ListUserLogins Get a userLogin based on uid list func ListUserLogins(uids []string, db *gorm.DB) (*[]models.UserLogin, error) { var userLogins []models.UserLogin diff --git a/pkg/microservice/user/core/service/user/user.go b/pkg/microservice/user/core/service/user/user.go index ab03313d3..6dcd5945b 100644 --- a/pkg/microservice/user/core/service/user/user.go +++ b/pkg/microservice/user/core/service/user/user.go @@ -100,16 +100,51 @@ func SearchAndSyncUser(ldapId string, logger *zap.SugaredLogger) error { logger.Errorf("ldap search host:%s error, error msg:%s", config.Host, err) return err } - + syncUserMap := make(map[string]bool) for _, entry := range sr.Entries { + account := config.UserSearch.NameAttr _, err := SyncUser(&SyncUserInfo{ - Account: entry.GetAttributeValue(config.UserSearch.NameAttr), + Account: entry.GetAttributeValue(account), IdentityType: si.ID, }, logger) if err != nil { logger.Errorf("ldap host:%s sync user error, error msg:%s", config.Host, err) return err } + syncUserMap[account] = true + } + users, err := orm.ListUsersByIdentityType(si.ID, core.DB) + if err != nil { + logger.Errorf("ListUsers by identityType:%s error, error msg:%s", si.ID, err) + return err + } + var deletedUsers []string + for _, user := range users { + if ok := syncUserMap[user.Account]; !ok { + deletedUsers = append(deletedUsers, user.UID) + } + } + tx := core.DB.Begin() + defer func() { + if r := recover(); r != nil { + tx.Rollback() + } + }() + err = orm.DeleteUserByUids(deletedUsers, tx) + if err != nil { + tx.Rollback() + logger.Errorf("SearchAndSyncUser delete user by uids:%s error, error msg:%s", deletedUsers, err) + return fmt.Errorf("SearchAndSyncUser delete user by uids:%s error, error msg:%s", deletedUsers, err) + } + err = orm.DeleteUserLoginByUids(deletedUsers, tx) + if err != nil { + tx.Rollback() + logger.Errorf("SearchAndSyncUser delete userlogin by uids:%s error, error msg:%s", deletedUsers, err) + return fmt.Errorf("SearchAndSyncUser delete userlogin by uids:%s error, error msg:%s", deletedUsers, err) + } + err = tx.Commit().Error + if err != nil { + return err } return nil } -- Gitee From fec5d38afedb7b240a4830460a3f9f24533e13fc Mon Sep 17 00:00:00 2001 From: panxunying <641770806@qq.com> Date: Tue, 2 Nov 2021 10:53:35 +0800 Subject: [PATCH 199/405] optimize Signed-off-by: panxunying <641770806@qq.com> --- pkg/microservice/user/core/handler/user/user.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pkg/microservice/user/core/handler/user/user.go b/pkg/microservice/user/core/handler/user/user.go index 22a697275..a3f5d143b 100644 --- a/pkg/microservice/user/core/handler/user/user.go +++ b/pkg/microservice/user/core/handler/user/user.go @@ -3,6 +3,7 @@ package user import ( "github.com/gin-gonic/gin" + "github.com/koderover/zadig/pkg/microservice/user/config" "github.com/koderover/zadig/pkg/microservice/user/core/service/user" internalhandler "github.com/koderover/zadig/pkg/shared/handler" @@ -46,7 +47,7 @@ func ListUsers(c *gin.Context) { ctx.Resp, ctx.Err = user.SearchUsersByUIDs(args.UIDs, ctx.Logger) } else if len(args.Account) > 0 { if len(args.IdentityType) == 0 { - args.IdentityType = "system" + args.IdentityType = config.SystemIdentityType } ctx.Resp, ctx.Err = user.SearchUserByAccount(args, ctx.Logger) } else { -- Gitee From 85e2b6f7568a51779f0df9236a401bf56c7fd0b8 Mon Sep 17 00:00:00 2001 From: panxunying <641770806@qq.com> Date: Tue, 2 Nov 2021 11:29:34 +0800 Subject: [PATCH 200/405] optimize Signed-off-by: panxunying <641770806@qq.com> --- pkg/microservice/user/core/repository/orm/user.go | 8 ++++---- pkg/microservice/user/core/service/user/user.go | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/pkg/microservice/user/core/repository/orm/user.go b/pkg/microservice/user/core/repository/orm/user.go index b70ffa9e0..84e658bc2 100644 --- a/pkg/microservice/user/core/repository/orm/user.go +++ b/pkg/microservice/user/core/repository/orm/user.go @@ -42,13 +42,13 @@ func GetUserByUid(uid string, db *gorm.DB) (*models.User, error) { } // ListUsers gets a list of users based on paging constraints -func ListUsers(page int, perPage int, account string, db *gorm.DB) ([]models.User, error) { +func ListUsers(page int, perPage int, name string, db *gorm.DB) ([]models.User, error) { var ( users []models.User err error ) - err = db.Where("account LIKE ?", "%"+account+"%").Offset((page - 1) * perPage).Limit(perPage).Find(&users).Error + err = db.Where("name LIKE ?", "%"+name+"%").Offset((page - 1) * perPage).Limit(perPage).Find(&users).Error if err != nil && err != gorm.ErrRecordNotFound { return nil, err @@ -74,14 +74,14 @@ func ListUsersByUIDs(uids []string, db *gorm.DB) ([]models.User, error) { } // GetUsersCount gets user count -func GetUsersCount(account string) (int64, error) { +func GetUsersCount(name string) (int64, error) { var ( users []models.User err error count int64 ) - err = core.DB.Where("account LIKE ?", "%"+account+"%").Find(&users).Count(&count).Error + err = core.DB.Where("name LIKE ?", "%"+name+"%").Find(&users).Count(&count).Error if err != nil { return 0, err diff --git a/pkg/microservice/user/core/service/user/user.go b/pkg/microservice/user/core/service/user/user.go index 352003792..3ab8627ed 100644 --- a/pkg/microservice/user/core/service/user/user.go +++ b/pkg/microservice/user/core/service/user/user.go @@ -159,7 +159,7 @@ func SearchUserByAccount(args *QueryArgs, logger *zap.SugaredLogger) (*UsersResp } func SearchUsers(args *QueryArgs, logger *zap.SugaredLogger) (*UsersResp, error) { - count, err := orm.GetUsersCount(args.Account) + count, err := orm.GetUsersCount(args.Name) if err != nil { logger.Errorf("SeachUsers GetUsersCount By account:%s error, error msg:%s", args.Account, err.Error()) return nil, err @@ -170,9 +170,9 @@ func SearchUsers(args *QueryArgs, logger *zap.SugaredLogger) (*UsersResp, error) }, nil } - users, err := orm.ListUsers(args.Page, args.PerPage, args.Account, core.DB) + users, err := orm.ListUsers(args.Page, args.PerPage, args.Name, core.DB) if err != nil { - logger.Errorf("SeachUsers SeachUsers By account:%s error, error msg:%s", args.Account, err.Error()) + logger.Errorf("SeachUsers SeachUsers By name:%s error, error msg:%s", args.Name, err.Error()) return nil, err } var uids []string -- Gitee From f795ec3c5454d0a5d3e5aca1f334ab995dab75be Mon Sep 17 00:00:00 2001 From: panxunying <641770806@qq.com> Date: Tue, 2 Nov 2021 11:39:48 +0800 Subject: [PATCH 201/405] optimize Signed-off-by: panxunying <641770806@qq.com> --- pkg/microservice/user/core/handler/user/user.go | 1 - 1 file changed, 1 deletion(-) diff --git a/pkg/microservice/user/core/handler/user/user.go b/pkg/microservice/user/core/handler/user/user.go index a3f5d143b..7694a6e97 100644 --- a/pkg/microservice/user/core/handler/user/user.go +++ b/pkg/microservice/user/core/handler/user/user.go @@ -53,7 +53,6 @@ func ListUsers(c *gin.Context) { } else { ctx.Resp, ctx.Err = user.SearchUsers(args, ctx.Logger) } - return } func CreateUser(c *gin.Context) { -- Gitee From 2724976e7b81b99ac8db83b77aba9f24485be2ba Mon Sep 17 00:00:00 2001 From: Guang Jiong Lou <7991675+27149chen@users.noreply.github.com> Date: Tue, 2 Nov 2021 11:54:36 +0800 Subject: [PATCH 202/405] add more user info (#511) Signed-off-by: lou --- pkg/microservice/picket/core/filter/service/rolebinding.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pkg/microservice/picket/core/filter/service/rolebinding.go b/pkg/microservice/picket/core/filter/service/rolebinding.go index 9cf53c128..b46719be4 100644 --- a/pkg/microservice/picket/core/filter/service/rolebinding.go +++ b/pkg/microservice/picket/core/filter/service/rolebinding.go @@ -13,6 +13,8 @@ import ( type roleBinding struct { *policy.RoleBinding Username string `json:"username"` + Email string `json:"email"` + Phone string `json:"phone"` } func ListRoleBindings(header http.Header, qs url.Values, logger *zap.SugaredLogger) ([]*roleBinding, error) { @@ -39,6 +41,8 @@ func ListRoleBindings(header http.Header, qs url.Values, logger *zap.SugaredLogg for _, u := range users { if rb, ok := uidToRoleBinding[u.UID]; ok { rb.Username = u.Name + rb.Email = u.Email + rb.Phone = u.Phone res = append(res, rb) } } -- Gitee From c953f1870e1d674680bec5043a539065d9c38511 Mon Sep 17 00:00:00 2001 From: panxunying <641770806@qq.com> Date: Tue, 2 Nov 2021 11:54:49 +0800 Subject: [PATCH 203/405] List user (#512) * update list user Signed-off-by: panxunying <641770806@qq.com> * optimize Signed-off-by: panxunying <641770806@qq.com> * fix get user nil pointer Signed-off-by: panxunying <641770806@qq.com> * optimize Signed-off-by: panxunying <641770806@qq.com> * optimize Signed-off-by: panxunying <641770806@qq.com> * optimize Signed-off-by: panxunying <641770806@qq.com> --- .../user/core/handler/user/user.go | 8 +++- .../user/core/repository/orm/user.go | 8 ++-- .../user/core/service/user/user.go | 43 ++++++++++++++++--- 3 files changed, 46 insertions(+), 13 deletions(-) diff --git a/pkg/microservice/user/core/handler/user/user.go b/pkg/microservice/user/core/handler/user/user.go index 03c26748d..7694a6e97 100644 --- a/pkg/microservice/user/core/handler/user/user.go +++ b/pkg/microservice/user/core/handler/user/user.go @@ -3,6 +3,7 @@ package user import ( "github.com/gin-gonic/gin" + "github.com/koderover/zadig/pkg/microservice/user/config" "github.com/koderover/zadig/pkg/microservice/user/core/service/user" internalhandler "github.com/koderover/zadig/pkg/shared/handler" @@ -44,10 +45,13 @@ func ListUsers(c *gin.Context) { } if len(args.UIDs) > 0 { ctx.Resp, ctx.Err = user.SearchUsersByUIDs(args.UIDs, ctx.Logger) - return + } else if len(args.Account) > 0 { + if len(args.IdentityType) == 0 { + args.IdentityType = config.SystemIdentityType + } + ctx.Resp, ctx.Err = user.SearchUserByAccount(args, ctx.Logger) } else { ctx.Resp, ctx.Err = user.SearchUsers(args, ctx.Logger) - return } } diff --git a/pkg/microservice/user/core/repository/orm/user.go b/pkg/microservice/user/core/repository/orm/user.go index b70ffa9e0..84e658bc2 100644 --- a/pkg/microservice/user/core/repository/orm/user.go +++ b/pkg/microservice/user/core/repository/orm/user.go @@ -42,13 +42,13 @@ func GetUserByUid(uid string, db *gorm.DB) (*models.User, error) { } // ListUsers gets a list of users based on paging constraints -func ListUsers(page int, perPage int, account string, db *gorm.DB) ([]models.User, error) { +func ListUsers(page int, perPage int, name string, db *gorm.DB) ([]models.User, error) { var ( users []models.User err error ) - err = db.Where("account LIKE ?", "%"+account+"%").Offset((page - 1) * perPage).Limit(perPage).Find(&users).Error + err = db.Where("name LIKE ?", "%"+name+"%").Offset((page - 1) * perPage).Limit(perPage).Find(&users).Error if err != nil && err != gorm.ErrRecordNotFound { return nil, err @@ -74,14 +74,14 @@ func ListUsersByUIDs(uids []string, db *gorm.DB) ([]models.User, error) { } // GetUsersCount gets user count -func GetUsersCount(account string) (int64, error) { +func GetUsersCount(name string) (int64, error) { var ( users []models.User err error count int64 ) - err = core.DB.Where("account LIKE ?", "%"+account+"%").Find(&users).Count(&count).Error + err = core.DB.Where("name LIKE ?", "%"+name+"%").Find(&users).Count(&count).Error if err != nil { return 0, err diff --git a/pkg/microservice/user/core/service/user/user.go b/pkg/microservice/user/core/service/user/user.go index ab03313d3..3ab8627ed 100644 --- a/pkg/microservice/user/core/service/user/user.go +++ b/pkg/microservice/user/core/service/user/user.go @@ -26,10 +26,12 @@ type User struct { } type QueryArgs struct { - Account string `json:"account,omitempty"` - UIDs []string `json:"uids,omitempty"` - PerPage int `json:"per_page,omitempty"` - Page int `json:"page,omitempty"` + Name string `json:"name,omitempty"` + Account string `json:"account,omitempty"` + IdentityType string `json:"identity_type,omitempty"` + UIDs []string `json:"uids,omitempty"` + PerPage int `json:"per_page,omitempty"` + Page int `json:"page,omitempty"` } type UserInfo struct { @@ -120,6 +122,9 @@ func GetUser(uid string, logger *zap.SugaredLogger) (*UserInfo, error) { logger.Errorf("GetUser getUserByUid:%s error, error msg:%s", uid, err.Error()) return nil, err } + if user == nil { + return nil, nil + } userLogin, err := orm.GetUserLogin(uid, user.Account, config.AccountLoginType, core.DB) if err != nil { logger.Errorf("GetUser GetUserLogin:%s error, error msg:%s", uid, err.Error()) @@ -129,8 +134,32 @@ func GetUser(uid string, logger *zap.SugaredLogger) (*UserInfo, error) { return &userInfo[0], nil } +func SearchUserByAccount(args *QueryArgs, logger *zap.SugaredLogger) (*UsersResp, error) { + user, err := orm.GetUser(args.Account, args.IdentityType, core.DB) + if err != nil { + logger.Errorf("SearchUserByAccount GetUser By account:%s error, error msg:%s", args.Account, err.Error()) + return nil, err + } + if user == nil { + return &UsersResp{ + Users: nil, + TotalCount: 0, + }, nil + } + userLogins, err := orm.ListUserLogins([]string{user.UID}, core.DB) + if err != nil { + logger.Errorf("SearchUserByAccount ListUserLogins By uid:%s error, error msg:%s", user.UID, err.Error()) + return nil, err + } + usersInfo := mergeUserLogin([]models.User{*user}, *userLogins, logger) + return &UsersResp{ + Users: usersInfo, + TotalCount: int64(len(usersInfo)), + }, nil +} + func SearchUsers(args *QueryArgs, logger *zap.SugaredLogger) (*UsersResp, error) { - count, err := orm.GetUsersCount(args.Account) + count, err := orm.GetUsersCount(args.Name) if err != nil { logger.Errorf("SeachUsers GetUsersCount By account:%s error, error msg:%s", args.Account, err.Error()) return nil, err @@ -141,9 +170,9 @@ func SearchUsers(args *QueryArgs, logger *zap.SugaredLogger) (*UsersResp, error) }, nil } - users, err := orm.ListUsers(args.Page, args.PerPage, args.Account, core.DB) + users, err := orm.ListUsers(args.Page, args.PerPage, args.Name, core.DB) if err != nil { - logger.Errorf("SeachUsers SeachUsers By account:%s error, error msg:%s", args.Account, err.Error()) + logger.Errorf("SeachUsers SeachUsers By name:%s error, error msg:%s", args.Name, err.Error()) return nil, err } var uids []string -- Gitee From 14aece1a8bc923ecf34369b8520f0fefd6d75fdf Mon Sep 17 00:00:00 2001 From: Guang Jiong Lou <7991675+27149chen@users.noreply.github.com> Date: Tue, 2 Nov 2021 14:44:49 +0800 Subject: [PATCH 204/405] fix permission issue (#514) Signed-off-by: lou --- .../policy/core/service/bundle/rego/authz.rego | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/pkg/microservice/policy/core/service/bundle/rego/authz.rego b/pkg/microservice/policy/core/service/bundle/rego/authz.rego index 6cb643b98..e5ad3d107 100644 --- a/pkg/microservice/policy/core/service/bundle/rego/authz.rego +++ b/pkg/microservice/policy/core/service/bundle/rego/authz.rego @@ -91,8 +91,9 @@ user_is_project_admin { # public urls are visible for all users url_is_public { - data.exemptions.public[_].method == http_request.method - glob.match(trim(data.exemptions.public[_].endpoint, "/"), ["/"], concat("/", input.parsed_path)) + some i + data.exemptions.public[i].method == http_request.method + glob.match(trim(data.exemptions.public[i].endpoint, "/"), ["/"], concat("/", input.parsed_path)) } # exempted urls are visible for all authenticated users @@ -101,14 +102,16 @@ url_is_exempted { } url_is_registered { - data.exemptions.registered[_].method == http_request.method - glob.match(trim(data.exemptions.registered[_].endpoint, "/"), ["/"], concat("/", input.parsed_path)) + some i + data.exemptions.registered[i].method == http_request.method + glob.match(trim(data.exemptions.registered[i].endpoint, "/"), ["/"], concat("/", input.parsed_path)) } # privileged urls are visible for system admins only url_is_privileged { - data.exemptions.privileged[_].method == http_request.method - glob.match(trim(data.exemptions.privileged[_].endpoint, "/"), ["/"], concat("/", input.parsed_path)) + some i + data.exemptions.privileged[i].method == http_request.method + glob.match(trim(data.exemptions.privileged[i].endpoint, "/"), ["/"], concat("/", input.parsed_path)) } project_name := pn { -- Gitee From 3e7491fd1592eaa17932d92cb5497656d7b30a0e Mon Sep 17 00:00:00 2001 From: Guang Jiong Lou <7991675+27149chen@users.noreply.github.com> Date: Tue, 2 Nov 2021 15:48:00 +0800 Subject: [PATCH 205/405] fix restart workflow panic (#515) Signed-off-by: lou --- .../aslan/core/workflow/service/workflow/pipeline_task.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/microservice/aslan/core/workflow/service/workflow/pipeline_task.go b/pkg/microservice/aslan/core/workflow/service/workflow/pipeline_task.go index c59d90c16..0a47a9464 100644 --- a/pkg/microservice/aslan/core/workflow/service/workflow/pipeline_task.go +++ b/pkg/microservice/aslan/core/workflow/service/workflow/pipeline_task.go @@ -386,7 +386,7 @@ func RestartPipelineTaskV2(userName string, taskID int64, pipelineName string, t subBuildTaskMap := subStage.SubTasks for serviceModule, subTask := range subBuildTaskMap { if buildInfo, err := base.ToBuildTask(subTask); err == nil { - if newModules, err := commonrepo.NewBuildColl().List(&commonrepo.BuildListOption{Targets: []string{serviceModule}, ServiceName: buildInfo.Service, ProductName: t.ProductName}); err == nil { + if newModules, err := commonrepo.NewBuildColl().List(&commonrepo.BuildListOption{Targets: []string{serviceModule}, ServiceName: buildInfo.Service, ProductName: t.ProductName}); err == nil && len(newModules) > 0 { newBuildInfo := newModules[0] buildInfo.JobCtx.BuildSteps = []*task.BuildStep{} if newBuildInfo.Scripts != "" { -- Gitee From 85a804731e43fcc1311b05c86a74d74df90b90f2 Mon Sep 17 00:00:00 2001 From: mouuii <49775493+mouuii@users.noreply.github.com> Date: Tue, 2 Nov 2021 16:39:27 +0800 Subject: [PATCH 206/405] init admin user (#502) * init admin user Signed-off-by: mouuii * init admin user Signed-off-by: mouuii * admin Signed-off-by: mouuii * admin Signed-off-by: mouuii * admin Signed-off-by: mouuii * xxx Signed-off-by: mouuii * test workflows Signed-off-by: mouuii * init admin user Signed-off-by: mouuii * init admin user Signed-off-by: mouuii * init admin user Signed-off-by: mouuii * init admin user Signed-off-by: mouuii * flag Signed-off-by: mouuii * flag Signed-off-by: mouuii * flag Signed-off-by: mouuii * flag Signed-off-by: mouuii * flag Signed-off-by: mouuii Co-authored-by: mouuii --- pkg/cli/initconfig/cmd/init.go | 55 ++++++++++++++++++- pkg/config/config.go | 8 +++ .../policy/core/handler/role_binding.go | 15 +++++ .../policy/core/handler/router.go | 1 + .../policy/core/service/role_binding.go | 9 +++ pkg/setting/consts.go | 5 ++ pkg/shared/client/policy/policy.go | 6 ++ pkg/shared/client/user/user.go | 37 +++++++++++++ 8 files changed, 135 insertions(+), 1 deletion(-) diff --git a/pkg/cli/initconfig/cmd/init.go b/pkg/cli/initconfig/cmd/init.go index 60300e390..1ab3924cf 100644 --- a/pkg/cli/initconfig/cmd/init.go +++ b/pkg/cli/initconfig/cmd/init.go @@ -18,13 +18,17 @@ package cmd import ( _ "embed" + "fmt" "github.com/spf13/cobra" "golang.org/x/sync/errgroup" "sigs.k8s.io/yaml" + "github.com/koderover/zadig/pkg/config" + "github.com/koderover/zadig/pkg/setting" "github.com/koderover/zadig/pkg/shared/client/policy" + "github.com/koderover/zadig/pkg/shared/client/user" "github.com/koderover/zadig/pkg/tool/log" ) @@ -60,7 +64,56 @@ func run() error { } func initSystemConfig() error { - return presetRole() + email := config.AdminEmail() + password := config.AdminPassword() + + uid, err := presetSystemAdmin(email, password) + if err != nil { + log.Errorf("presetSystemAdmin err:%s", err) + return err + } + if err := presetRole(); err != nil { + log.Errorf("presetRole err:%s", err) + return err + } + + if err := presetRoleBinding(uid); err != nil { + log.Errorf("presetRoleBinding :%s", err) + return err + } + return nil +} + +func presetSystemAdmin(email string, password string) (string, error) { + r, err := user.New().SearchUser(&user.SearchUserArgs{Account: setting.PresetAccount}) + if err != nil { + log.Errorf("SearchUser err:%s", err) + return "", err + } + if len(r.Users) > 0 { + log.Infof("User admin exists, skip it.") + return r.Users[0].UID, nil + } + user, err := user.New().CreateUser(&user.CreateUserArgs{ + Name: setting.PresetAccount, + Password: password, + Account: setting.PresetAccount, + Email: email, + }) + if err != nil { + log.Infof("created admin err:%s", err) + return "", err + } + return user.Uid, nil +} + +func presetRoleBinding(uid string) error { + return policy.NewDefault().CreateOrUpdateSystemRoleBinding(&policy.RoleBinding{ + Name: fmt.Sprintf(setting.RoleBindingNameFmt, setting.RoleAdmin, setting.PresetAccount, ""), + UID: uid, + Role: setting.RoleAdmin, + }) + } func presetRole() error { diff --git a/pkg/config/config.go b/pkg/config/config.go index 7dfa9703c..42de9dce6 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -258,3 +258,11 @@ func MysqlPassword() string { func MysqlHost() string { return viper.GetString(setting.ENVMysqlHost) } + +func AdminEmail() string { + return viper.GetString(setting.ENVAdminEmail) +} + +func AdminPassword() string { + return viper.GetString(setting.ENVAdminPassword) +} diff --git a/pkg/microservice/policy/core/handler/role_binding.go b/pkg/microservice/policy/core/handler/role_binding.go index c14d37ff9..d33d7b8fe 100644 --- a/pkg/microservice/policy/core/handler/role_binding.go +++ b/pkg/microservice/policy/core/handler/role_binding.go @@ -141,6 +141,21 @@ func CreateSystemRoleBinding(c *gin.Context) { ctx.Err = service.CreateRoleBindings(service.SystemScope, []*service.RoleBinding{args}, ctx.Logger) } +func CreateOrUpdateSystemRoleBinding(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + + args := &service.RoleBinding{} + if err := c.ShouldBindJSON(args); err != nil { + ctx.Err = err + return + } + + args.Public = false + + ctx.Err = service.CreateOrUpdateSystemRoleBinding(service.SystemScope, args, ctx.Logger) +} + func ListSystemRoleBindings(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() diff --git a/pkg/microservice/policy/core/handler/router.go b/pkg/microservice/policy/core/handler/router.go index 1ddaebbb2..69da8b619 100644 --- a/pkg/microservice/policy/core/handler/router.go +++ b/pkg/microservice/policy/core/handler/router.go @@ -66,6 +66,7 @@ func (*Router) Inject(router *gin.RouterGroup) { systemRoleBindings.POST("", CreateSystemRoleBinding) systemRoleBindings.GET("", ListSystemRoleBindings) systemRoleBindings.DELETE("/:name", DeleteSystemRoleBinding) + systemRoleBindings.PUT("/:name", CreateOrUpdateSystemRoleBinding) } userBindings := router.Group("userbindings") diff --git a/pkg/microservice/policy/core/service/role_binding.go b/pkg/microservice/policy/core/service/role_binding.go index c08412c0e..c3509eb48 100644 --- a/pkg/microservice/policy/core/service/role_binding.go +++ b/pkg/microservice/policy/core/service/role_binding.go @@ -48,6 +48,15 @@ func CreateRoleBindings(ns string, rbs []*RoleBinding, logger *zap.SugaredLogger return mongodb.NewRoleBindingColl().BulkCreate(objs) } +func CreateOrUpdateSystemRoleBinding(ns string, rb *RoleBinding, logger *zap.SugaredLogger) error { + + obj, err := createRoleBindingObject(ns, rb, logger) + if err != nil { + return err + } + return mongodb.NewRoleBindingColl().UpdateOrCreate(obj) +} + func UpdateOrCreateRoleBinding(ns string, rb *RoleBinding, logger *zap.SugaredLogger) error { obj, err := createRoleBindingObject(ns, rb, logger) if err != nil { diff --git a/pkg/setting/consts.go b/pkg/setting/consts.go index 3836cd53f..198158280 100644 --- a/pkg/setting/consts.go +++ b/pkg/setting/consts.go @@ -112,6 +112,11 @@ const ( ENVMysqlUserDB = "MYSQL_USER_DB" ENVScopes = "SCOPES" ENVTokenExpiresAt = "TOKEN_EXPIRES_AT" + + // initconfig + ENVAdminEmail = "ADMIN_EMAIL" + ENVAdminPassword = "ADMIN_PASSWORD" + PresetAccount = "admin" ) // k8s concepts diff --git a/pkg/shared/client/policy/policy.go b/pkg/shared/client/policy/policy.go index 23cdbe5fa..ae27d6194 100644 --- a/pkg/shared/client/policy/policy.go +++ b/pkg/shared/client/policy/policy.go @@ -55,6 +55,12 @@ func (c *Client) CreateOrUpdateRoleBinding(projectName string, roleBinding *Role return err } +func (c *Client) CreateOrUpdateSystemRoleBinding(roleBinding *RoleBinding) error { + url := fmt.Sprintf("/system-rolebindings/%s", roleBinding.Name) + _, err := c.Put(url, httpclient.SetBody(roleBinding)) + return err +} + func (c *Client) DeleteRoleBinding(name string, projectName string) error { url := fmt.Sprintf("/rolebindings/%s?projectName=%s", name, projectName) _, err := c.Delete(url) diff --git a/pkg/shared/client/user/user.go b/pkg/shared/client/user/user.go index bcec55684..c080f6d2e 100644 --- a/pkg/shared/client/user/user.go +++ b/pkg/shared/client/user/user.go @@ -30,3 +30,40 @@ func (c *Client) ListUsers(args *SearchArgs) ([]*User, error) { return res.Users, err } + +type CreateUserArgs struct { + Name string `json:"name"` + Password string `json:"password"` + Email string `json:"email"` + Phone string `json:"phone"` + Account string `json:"account"` +} + +type CreateUserResp struct { + Name string `json:"name"` + Account string `json:"account"` + Uid string `json:"uid"` +} + +func (c *Client) CreateUser(args *CreateUserArgs) (*CreateUserResp, error) { + url := "/users" + resp := &CreateUserResp{} + _, err := c.Post(url, httpclient.SetBody(args), httpclient.SetResult(resp)) + return resp, err +} + +type SearchUserArgs struct { + Account string `json:"account"` +} + +type SearchUserResp struct { + TotalCount int `json:"totalCount"` + Users []*User `json:"users"` +} + +func (c *Client) SearchUser(args *SearchUserArgs) (*SearchUserResp, error) { + url := "/users/search" + resp := &SearchUserResp{} + _, err := c.Post(url, httpclient.SetBody(args), httpclient.SetResult(resp)) + return resp, err +} -- Gitee From 8954251bb7dc640acfc27cf2171d5a07b1f15b55 Mon Sep 17 00:00:00 2001 From: mouuii Date: Tue, 2 Nov 2021 16:39:37 +0800 Subject: [PATCH 207/405] public Signed-off-by: mouuii --- .../aslan/core/common/repository/mongodb/template/product.go | 1 + pkg/microservice/aslan/core/project/service/project.go | 2 ++ 2 files changed, 3 insertions(+) diff --git a/pkg/microservice/aslan/core/common/repository/mongodb/template/product.go b/pkg/microservice/aslan/core/common/repository/mongodb/template/product.go index 98cd277bb..85513537e 100644 --- a/pkg/microservice/aslan/core/common/repository/mongodb/template/product.go +++ b/pkg/microservice/aslan/core/common/repository/mongodb/template/product.go @@ -38,6 +38,7 @@ type ProjectInfo struct { UpdatedAt int64 `bson:"update_time"` UpdatedBy string `bson:"update_by"` OnboardStatus int `bson:"onboarding_status"` + Public bool `bson:"public"` } type ProductColl struct { diff --git a/pkg/microservice/aslan/core/project/service/project.go b/pkg/microservice/aslan/core/project/service/project.go index 046e45e2f..31f290392 100644 --- a/pkg/microservice/aslan/core/project/service/project.go +++ b/pkg/microservice/aslan/core/project/service/project.go @@ -47,6 +47,7 @@ type ProjectDetailedRepresentation struct { UpdatedAt int64 `json:"updatedAt"` UpdatedBy string `json:"updatedBy"` Onboard bool `json:"onboard"` + Public bool `json:"public"` } type ProjectBriefRepresentation struct { @@ -111,6 +112,7 @@ func listDetailedProjectInfos(opts *ProjectListOptions, logger *zap.SugaredLogge UpdatedAt: info.UpdatedAt, UpdatedBy: info.UpdatedBy, Onboard: info.OnboardStatus != 0, + Public: info.Public, }) } -- Gitee From 0dbb87033fa8cfd502c8eb4920da73b0d0f8a8fb Mon Sep 17 00:00:00 2001 From: mouuii Date: Tue, 2 Nov 2021 16:54:00 +0800 Subject: [PATCH 208/405] public Signed-off-by: mouuii --- .../aslan/core/common/repository/mongodb/template/product.go | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/microservice/aslan/core/common/repository/mongodb/template/product.go b/pkg/microservice/aslan/core/common/repository/mongodb/template/product.go index 85513537e..ec911ff7e 100644 --- a/pkg/microservice/aslan/core/common/repository/mongodb/template/product.go +++ b/pkg/microservice/aslan/core/common/repository/mongodb/template/product.go @@ -105,6 +105,7 @@ func (c *ProductColl) ListProjectBriefs(inNames []string) ([]*ProjectInfo, error {"update_time", 1}, {"update_by", 1}, {"onboarding_status", 1}, + {"public", 1}, }) } -- Gitee From f79b9cea290d62ca7bfe011458e3b3759b082a5b Mon Sep 17 00:00:00 2001 From: Guang Jiong Lou <7991675+27149chen@users.noreply.github.com> Date: Wed, 3 Nov 2021 11:14:14 +0800 Subject: [PATCH 209/405] merge main to nga (#520) * add product name field Signed-off-by: liu deyi * optimize code Signed-off-by: allenshen * update replace image logic Signed-off-by: allenshen * optimize code Signed-off-by: allenshen * fix compile error Signed-off-by: allenshen * remove useless code Signed-off-by: allenshen * optimze code Signed-off-by: allenshen * optimze code Signed-off-by: allenshen * optimze code Signed-off-by: allenshen * optimze code Signed-off-by: allenshen * optimze code Signed-off-by: allenshen * optize err print format Signed-off-by: allenshen * optimize code Signed-off-by: liu deyi * build add productName field Signed-off-by: liu deyi * optimize code Signed-off-by: allenshen * optmize code Signed-off-by: allenshen * workflow add storage_id field Signed-off-by: liu deyi * optimize code Signed-off-by: allenshen * opmize code Signed-off-by: allenshen * fix share service bug Signed-off-by: liu deyi * fix compile error Signed-off-by: allenshen * fix create env bug Signed-off-by: liu deyi * fix create env bug Signed-off-by: liu deyi * fix create env bug Signed-off-by: liu deyi * fix service deploy bug Signed-off-by: liu deyi * fix build bug Signed-off-by: liu deyi * fix tar file rule bug Signed-off-by: liu deyi * modify reaper Signed-off-by: liu deyi * modify reaper Signed-off-by: liu deyi * modify reaper Signed-off-by: liu deyi * fix loop bug Signed-off-by: liu deyi * remove debug code Signed-off-by: liu deyi * add environment variable logic Signed-off-by: allenshen * modify list tar interface Signed-off-by: liu deyi * annotating useless code Signed-off-by: allenshen * debug code Signed-off-by: liu deyi * modify artifact interface Signed-off-by: liu deyi * modify artifact interface Signed-off-by: liu deyi * add batch insert cvm host interface Signed-off-by: liu deyi * fix nil pointer Signed-off-by: lou * fix bug and change value merge orders Signed-off-by: allenshen * optimize code Signed-off-by: allenshen * validate bulk add privatekey function Signed-off-by: liu deyi * add labels interface Signed-off-by: liu deyi * modify bulk add priviateKey interface Signed-off-by: liu deyi * add host label by label Signed-off-by: liu deyi * update workflow logic Signed-off-by: allenshen * optimize code Signed-off-by: allenshen * added dockerfile template api & basic implementations Signed-off-by: Min Min * debug Signed-off-by: Min Min * minor bugfixes Signed-off-by: Min Min * added dockerfile parser validation Signed-off-by: Min Min * validation stuff Signed-off-by: Min Min * fix broken dependency Signed-off-by: Min Min * added dockerfile template to build Signed-off-by: Min Min * add validation API for dockerfile template Signed-off-by: Min Min * changed validation api response Signed-off-by: Min Min * get reference api fixed Signed-off-by: Min Min * added dockerfile template function to workflow Signed-off-by: Min Min * added auth token for reaper Signed-off-by: Min Min * reaper bugfix Signed-off-by: Min Min * added some debug information Signed-off-by: Min Min * debug logs Signed-off-by: Min Min * removed debug logs & bugfix Signed-off-by: Min Min * add debug logs to prevent nil Signed-off-by: Min Min * removed logs & finalize Signed-off-by: Min Min * set name of dockerfile template as unique Signed-off-by: Min Min * code review changes Signed-off-by: Min Min * code review changes Signed-off-by: Min Min * debug Signed-off-by: Min Min * debug on missing arg Signed-off-by: Min Min * dockerfile template Signed-off-by: Min Min * debug Signed-off-by: Min Min * modify list host ip interface Signed-off-by: liu deyi * change docker build command generate Signed-off-by: Min Min * debug Signed-off-by: Min Min * update the provider of privatekey Signed-off-by: liu deyi * Added _COMMIT_ID as workflow default parameter Signed-off-by: Min Min * update env config Signed-off-by: liu deyi * update env config Signed-off-by: liu deyi * CRUD for yaml template done Signed-off-by: Min Min * added create service from yaml template and reload service from yaml template Signed-off-by: Min Min * rebasing dockerfile_template Signed-off-by: Min Min * debug logs Signed-off-by: Min Min * debug replace yaml and webhook process logic Signed-off-by: Min Min * added get reference API Signed-off-by: Min Min * debug Signed-off-by: Min Min * Make template that is in-use not able to be deleted Signed-off-by: Min Min * optimize code Signed-off-by: liu deyi * changed update logic Signed-off-by: Min Min * filter the case where the label is empty Signed-off-by: liu deyi * optimize code Signed-off-by: liu deyi * update env yaml replace logic Signed-off-by: allenshen * added update yaml template varible values API Signed-off-by: Min Min * debugs Signed-off-by: Min Min * debugs Signed-off-by: Min Min * changed query reference logic Signed-off-by: Min Min * update preview values.yaml logic Signed-off-by: allenshen * changed logic for loading service from template and list yaml templates api response Signed-off-by: Min Min * fix panic error Signed-off-by: allenshen * service module updates Signed-off-by: Min Min * add ingress display to service list Signed-off-by: liu deyi * optimize code Signed-off-by: liu deyi * naming stuff Signed-off-by: Min Min * changed location Signed-off-by: Min Min * optimize code Signed-off-by: allenshen * optimize code Signed-off-by: liu deyi * optimize code Signed-off-by: allenshen * optimize code Signed-off-by: liu deyi * optimize code Signed-off-by: liu deyi * optimize code Signed-off-by: liu deyi * optimize code Signed-off-by: liu deyi * optimize code Signed-off-by: allenshen * optimize code Signed-off-by: liu deyi * optimize code Signed-off-by: allenshen * Modify the way to get the service Signed-off-by: liu deyi * debug coe Signed-off-by: liu deyi * debug code Signed-off-by: liu deyi * debug code Signed-off-by: liu deyi * debug code Signed-off-by: liu deyi * debug code Signed-off-by: liu deyi * debug code Signed-off-by: liu deyi * debug code Signed-off-by: liu deyi * remove debug code Signed-off-by: liu deyi * optimize code Signed-off-by: liu deyi * debug code Signed-off-by: liu deyi * debug code Signed-off-by: liu deyi * add Bootcamps info to readme Signed-off-by: landylee007 * add Bootcamps info to readme Signed-off-by: landylee007 * Update server.go * Update types.go * Update action.yml * add Bootcamps info to readme Signed-off-by: landylee007 * modify the number of pr list Signed-off-by: liu deyi * optimize create service logic Signed-off-by: allenshen * optmize code Signed-off-by: allenshen * optimize code Signed-off-by: allenshen * modify error message Signed-off-by: liu deyi * fix file download failure problem Signed-off-by: liu deyi * fix file download failure problem Signed-off-by: liu deyi * debug code Signed-off-by: liu deyi * debug code Signed-off-by: liu deyi * debug code Signed-off-by: liu deyi * remove code Signed-off-by: liu deyi * remove code Signed-off-by: liu deyi * fix artifact download bug Signed-off-by: liu deyi * fix artifact download bug Signed-off-by: liu deyi * fix artifact download bug Signed-off-by: liu deyi * fix artifact download bug Signed-off-by: liu deyi * fix artifact download bug Signed-off-by: liu deyi * fix artifact download bug Signed-off-by: liu deyi * fix artifact download bug Signed-off-by: liu deyi * remove debug code Signed-off-by: liu deyi * rename function name Signed-off-by: liu deyi * return err Signed-off-by: liu deyi * modify log download logic Signed-off-by: liu deyi * support the same service import Signed-off-by: liu deyi * optimize db index Signed-off-by: liu deyi * optimize host env logic Signed-off-by: liu deyi * optimize list service logic Signed-off-by: liu deyi * optimize list service logic Signed-off-by: liu deyi * optimize list service logic Signed-off-by: liu deyi * optimize workflow task logic Signed-off-by: liu deyi * fix bug Signed-off-by: allenshen * optimize update project logic Signed-off-by: liu deyi * optmize temp code Signed-off-by: allenshen * optimize update service logic Signed-off-by: liu deyi * optimize code Signed-off-by: allenshen * optimize code Signed-off-by: allenshen * optimize update service logic Signed-off-by: liu deyi * debug code Signed-off-by: liu deyi * debug code Signed-off-by: liu deyi * debug code Signed-off-by: liu deyi * debug code Signed-off-by: liu deyi * remove debug code Signed-off-by: liu deyi * remove debug code Signed-off-by: liu deyi * add debug log Signed-off-by: liu deyi * remove debug code Signed-off-by: liu deyi * only the currently existing services are returned in the project list Signed-off-by: liu deyi * only the currently existing services are returned in the project list Signed-off-by: liu deyi * debug code Signed-off-by: liu deyi * only the currently existing services are returned in the project list Signed-off-by: liu deyi * fix bind query error Signed-off-by: allenshen * remove blank Signed-off-by: liu deyi * Modify the primary key of the database Signed-off-by: liu deyi * fix service module bug Signed-off-by: allenshen * add function annotation Signed-off-by: liu deyi * optimize code Signed-off-by: liu deyi * fix index out of range bug Signed-off-by: liu deyi * resolve comments Signed-off-by: allenshen * Support to modify the order of helm services Signed-off-by: liu deyi * fix spell error Signed-off-by: allenshen * modify the helm service arrangement Signed-off-by: liu deyi * add error msg return Signed-off-by: liu deyi * remove ilyshin code Signed-off-by: liu deyi * remove permission code Signed-off-by: liu deyi * optimize service update logic Signed-off-by: allenshen * remove ilyshin code Signed-off-by: liu deyi * remove code Signed-off-by: liu deyi * remove ilyshin code Signed-off-by: liu deyi * fix spell errors Signed-off-by: allenshen * remove targer dir bofore copy Signed-off-by: allenshen * optimize code Signed-off-by: liu deyi * optimize code Signed-off-by: allenshen * fix conflict Signed-off-by: lou * fix conflict Signed-off-by: lou Co-authored-by: liu deyi Co-authored-by: allenshen Co-authored-by: lilianzhu Co-authored-by: Min Min Co-authored-by: Landy Co-authored-by: Landy --- pkg/cli/upgradeassistant/cmd/migrate/150.go | 2 +- .../aslan/core/code/service/branch.go | 8 - .../aslan/core/code/service/merge_request.go | 9 - .../aslan/core/code/service/namespace.go | 9 - .../aslan/core/code/service/project.go | 9 - .../aslan/core/code/service/tag.go | 8 - .../aslan/core/code/service/types.go | 51 -- .../common/repository/models/render_set.go | 19 +- .../models/services_in_external_env.go | 13 + .../repository/models/template/product.go | 21 +- .../core/common/repository/mongodb/service.go | 77 ++- .../mongodb/services_in_external_env.go | 139 ++++ .../repository/mongodb/template/product.go | 24 + .../aslan/core/common/service/environment.go | 13 +- .../core/common/service/ilyshin/client.go | 32 - .../core/common/service/ilyshin/webhook.go | 38 -- .../aslan/core/common/service/product.go | 38 +- .../aslan/core/common/service/render.go | 60 +- .../aslan/core/common/service/service.go | 22 + .../core/common/service/template_product.go | 8 + .../aslan/core/common/service/utils.go | 2 +- .../core/common/service/webhook/controller.go | 5 - .../aslan/core/common/service/workflow.go | 4 +- .../core/environment/handler/environment.go | 138 ++-- .../core/environment/handler/renderset.go | 37 +- .../aslan/core/environment/handler/router.go | 14 +- .../core/environment/service/environment.go | 606 +++++++++++------- .../service/environment_creator.go | 2 +- .../aslan/core/environment/service/image.go | 2 +- .../core/environment/service/renderset.go | 211 +++--- .../aslan/core/project/handler/router.go | 2 +- .../aslan/core/project/service/product.go | 7 +- pkg/microservice/aslan/core/service.go | 4 + .../aslan/core/service/service/helm.go | 130 ++-- .../aslan/core/service/service/loader.go | 256 -------- .../aslan/core/service/service/service.go | 101 ++- .../aslan/core/service/service/types.go | 9 +- .../aslan/core/workflow/handler/webhook.go | 3 - .../aslan/core/workflow/handler/workflow.go | 2 +- .../core/workflow/service/webhook/ilyshin.go | 290 --------- .../service/webhook/ilyshin_workflow_task.go | 152 ----- .../core/workflow/service/webhook/utils.go | 131 ---- .../core/workflow/service/workflow/gitlab.go | 47 -- .../service/workflow/pipeline_validation.go | 2 +- .../workflow/service/workflow/workflow.go | 88 ++- .../service/workflow/workflow_task.go | 25 + .../reaper/core/service/meta/const.go | 2 - .../reaper/core/service/meta/types.go | 2 +- .../reaper/core/service/reaper/git.go | 4 +- .../core/service/taskplugin/deploy.go | 14 +- .../core/service/types/environment.go | 23 +- .../warpdrive/core/service/types/renderset.go | 19 +- pkg/setting/consts.go | 2 - pkg/shared/codehost/codehost.go | 1 - pkg/tool/helmclient/helmclient.go | 20 +- pkg/tool/ilyshin/branch.go | 57 -- pkg/tool/ilyshin/client.go | 43 -- pkg/tool/ilyshin/commit.go | 61 -- pkg/tool/ilyshin/event_parsing.go | 179 ------ pkg/tool/ilyshin/group_project.go | 45 -- pkg/tool/ilyshin/merge_request.go | 115 ---- pkg/tool/ilyshin/project.go | 80 --- pkg/tool/ilyshin/repo.go | 122 ---- pkg/tool/ilyshin/tag.go | 53 -- pkg/tool/ilyshin/webhook.go | 100 --- 65 files changed, 1141 insertions(+), 2671 deletions(-) create mode 100644 pkg/microservice/aslan/core/common/repository/models/services_in_external_env.go create mode 100644 pkg/microservice/aslan/core/common/repository/mongodb/services_in_external_env.go delete mode 100644 pkg/microservice/aslan/core/common/service/ilyshin/client.go delete mode 100644 pkg/microservice/aslan/core/common/service/ilyshin/webhook.go delete mode 100644 pkg/microservice/aslan/core/workflow/service/webhook/ilyshin.go delete mode 100644 pkg/microservice/aslan/core/workflow/service/webhook/ilyshin_workflow_task.go delete mode 100644 pkg/tool/ilyshin/branch.go delete mode 100644 pkg/tool/ilyshin/client.go delete mode 100644 pkg/tool/ilyshin/commit.go delete mode 100644 pkg/tool/ilyshin/event_parsing.go delete mode 100644 pkg/tool/ilyshin/group_project.go delete mode 100644 pkg/tool/ilyshin/merge_request.go delete mode 100644 pkg/tool/ilyshin/project.go delete mode 100644 pkg/tool/ilyshin/repo.go delete mode 100644 pkg/tool/ilyshin/tag.go delete mode 100644 pkg/tool/ilyshin/webhook.go diff --git a/pkg/cli/upgradeassistant/cmd/migrate/150.go b/pkg/cli/upgradeassistant/cmd/migrate/150.go index 4d23841ac..a8ea77f05 100644 --- a/pkg/cli/upgradeassistant/cmd/migrate/150.go +++ b/pkg/cli/upgradeassistant/cmd/migrate/150.go @@ -151,5 +151,5 @@ func findImageByContainerName(flatMap map[string]interface{}, matchedPath []map[ } return nil } - return fmt.Errorf("faild to find image for contianer %s", container.Image) + return fmt.Errorf("failed to find image for contianer %s", container.Image) } diff --git a/pkg/microservice/aslan/core/code/service/branch.go b/pkg/microservice/aslan/core/code/service/branch.go index b11b33440..3945aa41c 100644 --- a/pkg/microservice/aslan/core/code/service/branch.go +++ b/pkg/microservice/aslan/core/code/service/branch.go @@ -28,7 +28,6 @@ import ( e "github.com/koderover/zadig/pkg/tool/errors" "github.com/koderover/zadig/pkg/tool/gerrit" "github.com/koderover/zadig/pkg/tool/git/gitlab" - "github.com/koderover/zadig/pkg/tool/ilyshin" ) func CodeHostListBranches(codeHostID int, projectName, namespace string, log *zap.SugaredLogger) ([]*Branch, error) { @@ -52,13 +51,6 @@ func CodeHostListBranches(codeHostID int, projectName, namespace string, log *za return nil, err } return ToBranches(brList), nil - } else if ch.Type == CodeHostIlyshin { - client := ilyshin.NewClient(ch.Address, ch.AccessToken) - brList, err := client.ListBranches(namespace, projectName, log) - if err != nil { - return nil, err - } - return ToBranches(brList), nil } else if ch.Type == gerrit.CodehostTypeGerrit { cli := gerrit.NewClient(ch.Address, ch.AccessToken) branches, err := cli.ListBranches(projectName) diff --git a/pkg/microservice/aslan/core/code/service/merge_request.go b/pkg/microservice/aslan/core/code/service/merge_request.go index fd5ca5544..4f0d78e0d 100644 --- a/pkg/microservice/aslan/core/code/service/merge_request.go +++ b/pkg/microservice/aslan/core/code/service/merge_request.go @@ -28,7 +28,6 @@ import ( e "github.com/koderover/zadig/pkg/tool/errors" "github.com/koderover/zadig/pkg/tool/gerrit" "github.com/koderover/zadig/pkg/tool/git/gitlab" - "github.com/koderover/zadig/pkg/tool/ilyshin" ) func CodeHostListPRs(codeHostID int, projectName, namespace, targetBr string, log *zap.SugaredLogger) ([]*PullRequest, error) { @@ -55,14 +54,6 @@ func CodeHostListPRs(codeHostID int, projectName, namespace, targetBr string, lo return ToPullRequests(prs), nil - } else if ch.Type == CodeHostIlyshin { - client := ilyshin.NewClient(ch.Address, ch.AccessToken) - prs, err := client.ListOpenedProjectMergeRequests(namespace, projectName, targetBr, log) - if err != nil { - log.Error(err) - return nil, e.ErrCodehostListPrs.AddDesc(err.Error()) - } - return ToPullRequests(prs), nil } else if ch.Type == gerrit.CodehostTypeGerrit { return nil, nil } else if ch.Type == CodeHostCodeHub { diff --git a/pkg/microservice/aslan/core/code/service/namespace.go b/pkg/microservice/aslan/core/code/service/namespace.go index 68eb68ec2..5b5923de0 100644 --- a/pkg/microservice/aslan/core/code/service/namespace.go +++ b/pkg/microservice/aslan/core/code/service/namespace.go @@ -28,7 +28,6 @@ import ( e "github.com/koderover/zadig/pkg/tool/errors" "github.com/koderover/zadig/pkg/tool/gerrit" "github.com/koderover/zadig/pkg/tool/git/gitlab" - "github.com/koderover/zadig/pkg/tool/ilyshin" ) const ( @@ -39,7 +38,6 @@ const ( page = 1 perPage = 100 CodeHostCodeHub = "codehub" - CodeHostIlyshin = "ilyshin" ) func CodeHostListNamespaces(codeHostID int, keyword string, log *zap.SugaredLogger) ([]*Namespace, error) { @@ -63,13 +61,6 @@ func CodeHostListNamespaces(codeHostID int, keyword string, log *zap.SugaredLogg return nil, err } return ToNamespaces(nsList), nil - } else if ch.Type == CodeHostIlyshin { - client := ilyshin.NewClient(ch.Address, ch.AccessToken) - nsList, err := client.ListNamespaces(keyword, log) - if err != nil { - return nil, err - } - return ToNamespaces(nsList), nil } else if ch.Type == gerrit.CodehostTypeGerrit { return []*Namespace{{ Name: gerrit.DefaultNamespace, diff --git a/pkg/microservice/aslan/core/code/service/project.go b/pkg/microservice/aslan/core/code/service/project.go index 1c724afbc..38103faf2 100644 --- a/pkg/microservice/aslan/core/code/service/project.go +++ b/pkg/microservice/aslan/core/code/service/project.go @@ -28,7 +28,6 @@ import ( e "github.com/koderover/zadig/pkg/tool/errors" "github.com/koderover/zadig/pkg/tool/gerrit" "github.com/koderover/zadig/pkg/tool/git/gitlab" - "github.com/koderover/zadig/pkg/tool/ilyshin" ) func CodeHostListProjects(codeHostID int, namespace, namespaceType, keyword string, log *zap.SugaredLogger) ([]*Project, error) { @@ -64,14 +63,6 @@ func CodeHostListProjects(codeHostID int, namespace, namespaceType, keyword stri } return ToProjects(projects), nil - } else if ch.Type == CodeHostIlyshin { - cli := ilyshin.NewClient(ch.Address, ch.AccessToken) - projects, err := cli.ListGroupProjects(namespace, keyword, log) - if err != nil { - log.Error(err) - return nil, e.ErrCodehostListProjects.AddDesc(err.Error()) - } - return ToProjects(projects), nil } else if ch.Type == gerrit.CodehostTypeGerrit { cli := gerrit.NewClient(ch.Address, ch.AccessToken) projects, err := cli.ListProjectsByKey(keyword) diff --git a/pkg/microservice/aslan/core/code/service/tag.go b/pkg/microservice/aslan/core/code/service/tag.go index 8c3edcaaf..90dd3cc31 100644 --- a/pkg/microservice/aslan/core/code/service/tag.go +++ b/pkg/microservice/aslan/core/code/service/tag.go @@ -28,7 +28,6 @@ import ( e "github.com/koderover/zadig/pkg/tool/errors" "github.com/koderover/zadig/pkg/tool/gerrit" "github.com/koderover/zadig/pkg/tool/git/gitlab" - "github.com/koderover/zadig/pkg/tool/ilyshin" ) func CodeHostListTags(codeHostID int, projectName string, namespace string, log *zap.SugaredLogger) ([]*Tag, error) { @@ -53,13 +52,6 @@ func CodeHostListTags(codeHostID int, projectName string, namespace string, log return nil, err } return ToTags(tags), nil - } else if ch.Type == CodeHostIlyshin { - client := ilyshin.NewClient(ch.Address, ch.AccessToken) - tags, err := client.ListTags(namespace, projectName, log) - if err != nil { - return nil, err - } - return ToTags(tags), nil } else if ch.Type == gerrit.CodehostTypeGerrit { client := gerrit.NewClient(ch.Address, ch.AccessToken) tags, err := client.ListTags(projectName) diff --git a/pkg/microservice/aslan/core/code/service/types.go b/pkg/microservice/aslan/core/code/service/types.go index 722c415a7..81528aaae 100644 --- a/pkg/microservice/aslan/core/code/service/types.go +++ b/pkg/microservice/aslan/core/code/service/types.go @@ -17,11 +17,8 @@ limitations under the License. package service import ( - "strings" - "github.com/andygrunwald/go-gerrit" "github.com/google/go-github/v35/github" - "github.com/koderover/zadig/pkg/tool/ilyshin" "github.com/xanzy/go-gitlab" "github.com/koderover/zadig/pkg/tool/codehub" @@ -106,14 +103,6 @@ func ToBranches(obj interface{}) []*Branch { Merged: o.Merged, }) } - case []*ilyshin.Branch: - for _, o := range os { - res = append(res, &Branch{ - Name: o.Name, - Protected: o.Protected, - Merged: o.Merged, - }) - } } return res @@ -152,20 +141,6 @@ func ToPullRequests(obj interface{}) []*PullRequest { AuthorUsername: o.Author.Username, }) } - case []*ilyshin.MergeRequest: - for _, o := range os { - res = append(res, &PullRequest{ - ID: o.IID, - TargetBranch: o.TargetBranch, - SourceBranch: o.SourceBranch, - ProjectID: o.ProjectID, - Title: o.Title, - State: o.State, - CreatedAt: o.CreatedAt.Unix(), - UpdatedAt: o.UpdatedAt.Unix(), - AuthorUsername: o.Author.Username, - }) - } } return res @@ -214,14 +189,6 @@ func ToNamespaces(obj interface{}) []*Namespace { ProjectUUID: o.ProjectUUID, }) } - case []*ilyshin.Project: - for _, o := range os { - res = append(res, &Namespace{ - Name: o.Namespace.Name, - Path: o.Namespace.Path, - Kind: GroupKind, - }) - } } return res @@ -271,17 +238,6 @@ func ToProjects(obj interface{}) []*Project { RepoID: project.RepoID, }) } - case []*ilyshin.Project: - for _, o := range os { - namespaces := strings.Split(o.PathWithNamespace, "/") - res = append(res, &Project{ - ID: o.ID, - Name: o.Path, - Namespace: namespaces[0], - Description: o.Description, - DefaultBranch: "master", - }) - } } return res @@ -319,13 +275,6 @@ func ToTags(obj interface{}) []*Tag { Name: o.Name, }) } - case []*ilyshin.Tag: - for _, o := range os { - res = append(res, &Tag{ - Name: o.Name, - Message: o.Message, - }) - } } return res diff --git a/pkg/microservice/aslan/core/common/repository/models/render_set.go b/pkg/microservice/aslan/core/common/repository/models/render_set.go index 5899120f2..f114671b1 100644 --- a/pkg/microservice/aslan/core/common/repository/models/render_set.go +++ b/pkg/microservice/aslan/core/common/repository/models/render_set.go @@ -28,15 +28,16 @@ type RenderSet struct { Name string `bson:"name" json:"name"` Revision int64 `bson:"revision" json:"revision"` // 可以为空,空时为产品模板默认的渲染集,非空时为环境的渲染集 - EnvName string `bson:"env_name,omitempty" json:"env_name,omitempty"` - ProductTmpl string `bson:"product_tmpl" json:"product_tmpl"` - Team string `bson:"team,omitempty" json:"team,omitempty"` - UpdateTime int64 `bson:"update_time" json:"update_time"` - UpdateBy string `bson:"update_by" json:"update_by"` - IsDefault bool `bson:"is_default" json:"is_default"` // 是否是默认配置 - KVs []*templatemodels.RenderKV `bson:"kvs,omitempty" json:"kvs,omitempty"` - ChartInfos []*templatemodels.RenderChart `bson:"chart_infos,omitempty" json:"chart_infos,omitempty"` - Description string `bson:"description,omitempty" json:"description,omitempty"` + EnvName string `bson:"env_name,omitempty" json:"env_name,omitempty"` + ProductTmpl string `bson:"product_tmpl" json:"product_tmpl"` + Team string `bson:"team,omitempty" json:"team,omitempty"` + UpdateTime int64 `bson:"update_time" json:"update_time"` + UpdateBy string `bson:"update_by" json:"update_by"` + IsDefault bool `bson:"is_default" json:"is_default"` // 是否是默认配置 + DefaultValues string `bson:"default_values,omitempty" json:"default_values,omitempty"` //环境默认变量 yaml content + KVs []*templatemodels.RenderKV `bson:"kvs,omitempty" json:"kvs,omitempty"` + ChartInfos []*templatemodels.RenderChart `bson:"chart_infos,omitempty" json:"chart_infos,omitempty"` + Description string `bson:"description,omitempty" json:"description,omitempty"` } func (RenderSet) TableName() string { diff --git a/pkg/microservice/aslan/core/common/repository/models/services_in_external_env.go b/pkg/microservice/aslan/core/common/repository/models/services_in_external_env.go new file mode 100644 index 000000000..42e2c66ce --- /dev/null +++ b/pkg/microservice/aslan/core/common/repository/models/services_in_external_env.go @@ -0,0 +1,13 @@ +package models + +type ServicesInExternalEnv struct { + ProductName string `bson:"product_name" json:"product_name"` + ServiceName string `bson:"service_name" json:"service_name"` + EnvName string `bson:"env_name" json:"env_name"` + Namespace string `bson:"namespace" json:"namespace"` + ClusterID string `bson:"cluster_id" json:"cluster_id"` +} + +func (ServicesInExternalEnv) TableName() string { + return "services_in_external_env" +} diff --git a/pkg/microservice/aslan/core/common/repository/models/template/product.go b/pkg/microservice/aslan/core/common/repository/models/template/product.go index f63570128..eadcc5b93 100644 --- a/pkg/microservice/aslan/core/common/repository/models/template/product.go +++ b/pkg/microservice/aslan/core/common/repository/models/template/product.go @@ -105,10 +105,7 @@ type GitRepoConfig struct { } type CustomYaml struct { - YamlSource string `bson:"yaml_source,omitempty" json:"yaml_source,omitempty"` - YamlContent string `bson:"yaml_content,omitempty" json:"yaml_content,omitempty"` - GitRepoConfig *GitRepoConfig `bson:"git_repo_config,omitempty" json:"git_repo_config,omitempty"` - ValuesPaths []string `bson:"values_paths,omitempty" json:"values_paths,omitempty"` + YamlContent string `bson:"yaml_content,omitempty" json:"yaml_content,omitempty"` } // RenderChart ... @@ -231,22 +228,6 @@ func (r *RenderKV) RemoveDupServices() { r.Services = result } -func (rc *RenderChart) DiffOverrideYaml(other *RenderChart) bool { - if rc.OverrideYaml == nil { - if other.OverrideYaml != nil { - return true - } - return false - } - if other.OverrideYaml == nil { - return true - } - if rc.OverrideYaml.YamlSource != other.OverrideYaml.YamlSource || rc.OverrideYaml.YamlContent != other.OverrideYaml.YamlContent { - return true - } - return false -} - func (rc *RenderChart) GetOverrideYaml() string { if rc.OverrideYaml == nil { return "" diff --git a/pkg/microservice/aslan/core/common/repository/mongodb/service.go b/pkg/microservice/aslan/core/common/repository/mongodb/service.go index 26bd34d25..572ef8acf 100644 --- a/pkg/microservice/aslan/core/common/repository/mongodb/service.go +++ b/pkg/microservice/aslan/core/common/repository/mongodb/service.go @@ -160,32 +160,6 @@ func (c *ServiceColl) ListMaxRevisionsForServices(services []*templatemodels.Ser return c.listMaxRevisions(pre, post) } -// TODO refactor mouuii -// ListExternalServicesBy list service only for external services ,other service type not use before refactor -func (c *ServiceColl) ListExternalWorkloadsBy(productName, envName string) ([]*models.Service, error) { - services := make([]*models.Service, 0) - query := bson.M{ - "status": bson.M{"$ne": setting.ProductStatusDeleting}, - } - if productName != "" { - query["product_name"] = productName - } - if envName != "" { - query["env_name"] = envName - } - ctx := context.Background() - cursor, err := c.Collection.Find(ctx, query) - if err != nil { - return nil, err - } - - err = cursor.All(ctx, &services) - if err != nil { - return nil, err - } - return services, nil -} - func (c *ServiceColl) ListMaxRevisionsByProduct(productName string) ([]*models.Service, error) { m := bson.M{ "product_name": productName, @@ -304,6 +278,57 @@ func (c *ServiceColl) Update(args *models.Service) error { return err } +// ListExternalServicesBy list service only for external services ,other service type not use before refactor +func (c *ServiceColl) ListExternalWorkloadsBy(productName, envName string, serviceNames ...string) ([]*models.Service, error) { + services := make([]*models.Service, 0) + query := bson.M{ + "status": bson.M{"$ne": setting.ProductStatusDeleting}, + } + if productName != "" { + query["product_name"] = productName + } + if envName != "" { + query["env_name"] = envName + } + + if len(serviceNames) > 0 { + query["service_name"] = bson.M{"$in": serviceNames} + } + ctx := context.Background() + cursor, err := c.Collection.Find(ctx, query) + if err != nil { + return nil, err + } + + err = cursor.All(ctx, &services) + if err != nil { + return nil, err + } + return services, nil +} + +func (c *ServiceColl) BatchUpdateExternalServicesStatus(productName, envName, status string, serviceNames []string) error { + if productName == "" { + return fmt.Errorf("productName is empty") + } + + if len(serviceNames) == 0 { + return fmt.Errorf("servicenNames is empty") + } + + query := bson.M{"product_name": productName, "service_name": bson.M{"$in": serviceNames}} + if envName != "" { + query["env_name"] = envName + } + + change := bson.M{"$set": bson.M{ + "status": status, + }} + + _, err := c.UpdateMany(context.TODO(), query, change) + return err +} + // UpdateExternalServicesStatus only used by external services func (c *ServiceColl) UpdateExternalServicesStatus(serviceName, productName, status, envName string) error { if serviceName == "" && envName == "" { diff --git a/pkg/microservice/aslan/core/common/repository/mongodb/services_in_external_env.go b/pkg/microservice/aslan/core/common/repository/mongodb/services_in_external_env.go new file mode 100644 index 000000000..56631326d --- /dev/null +++ b/pkg/microservice/aslan/core/common/repository/mongodb/services_in_external_env.go @@ -0,0 +1,139 @@ +package mongodb + +import ( + "context" + "errors" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" + + "github.com/koderover/zadig/pkg/microservice/aslan/config" + "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/models" + mongotool "github.com/koderover/zadig/pkg/tool/mongo" +) + +type ServicesInExternalEnvColl struct { + *mongo.Collection + + coll string +} + +func NewServicesInExternalEnvColl() *ServicesInExternalEnvColl { + name := models.ServicesInExternalEnv{}.TableName() + return &ServicesInExternalEnvColl{ + Collection: mongotool.Database(config.MongoDatabase()).Collection(name), + coll: name, + } +} + +func (c *ServicesInExternalEnvColl) GetCollectionName() string { + return c.coll +} + +func (c *ServicesInExternalEnvColl) EnsureIndex(ctx context.Context) error { + mods := []mongo.IndexModel{ + { + Keys: bson.D{ + bson.E{Key: "product_name", Value: 1}, + bson.E{Key: "env_name", Value: 1}, + bson.E{Key: "service_name", Value: 1}, + }, + Options: options.Index().SetUnique(true), + }, + { + Keys: bson.D{ + bson.E{Key: "namespace", Value: 1}, + bson.E{Key: "cluster_id", Value: 1}, + }, + Options: options.Index().SetUnique(false), + }, + } + + _, err := c.Indexes().CreateMany(ctx, mods) + + return err +} + +// Create ... +func (c *ServicesInExternalEnvColl) Create(args *models.ServicesInExternalEnv) error { + // avoid panic issue + if args == nil { + return errors.New("nil ServicesInExternalEnv") + } + + _, err := c.InsertOne(context.TODO(), args) + + return err +} + +type ServicesInExternalEnvArgs struct { + ProductName string + ServiceName string + EnvName string + Namespace string + ClusterID string + ExcludeEnvName string +} + +func (c *ServicesInExternalEnvColl) List(args *ServicesInExternalEnvArgs) ([]*models.ServicesInExternalEnv, error) { + if args == nil { + return nil, errors.New("nil ServicesInExternalEnvArgs") + } + query := bson.M{} + if args.ProductName != "" { + query["product_name"] = args.ProductName + } + + if args.EnvName != "" { + query["env_name"] = args.EnvName + } + + if args.ExcludeEnvName != "" { + query["env_name"] = bson.M{"$ne": args.ExcludeEnvName} + } + + if args.Namespace != "" { + query["namespace"] = args.Namespace + } + + if args.ClusterID != "" { + query["cluster_id"] = args.ClusterID + } + + resp := make([]*models.ServicesInExternalEnv, 0) + ctx := context.Background() + + cursor, err := c.Collection.Find(ctx, query) + if err != nil { + return nil, err + } + + err = cursor.All(ctx, &resp) + if err != nil { + return nil, err + } + + return resp, err +} + +func (c *ServicesInExternalEnvColl) Delete(args *ServicesInExternalEnvArgs) error { + if args == nil { + return errors.New("nil ServicesInExternalEnvArgs") + } + query := bson.M{} + if args.ProductName != "" { + query["product_name"] = args.ProductName + } + + if args.EnvName != "" { + query["env_name"] = args.EnvName + } + + if args.ServiceName != "" { + query["service_name"] = args.ServiceName + } + + _, err := c.DeleteMany(context.TODO(), query) + return err +} diff --git a/pkg/microservice/aslan/core/common/repository/mongodb/template/product.go b/pkg/microservice/aslan/core/common/repository/mongodb/template/product.go index ec911ff7e..8f76189c9 100644 --- a/pkg/microservice/aslan/core/common/repository/mongodb/template/product.go +++ b/pkg/microservice/aslan/core/common/repository/mongodb/template/product.go @@ -263,6 +263,30 @@ func (c *ProductColl) Update(productName string, args *template.Product) error { return err } +type ProductArgs struct { + ProductName string `json:"product_name"` + Services [][]string `json:"services"` + UpdateBy string `json:"update_by"` +} + +// UpdateServiceOrder existing ProductTmpl +func (c *ProductColl) UpdateServiceOrder(args *ProductArgs) error { + // avoid panic issue + if args == nil { + return errors.New("nil product args") + } + + query := bson.M{"product_name": args.ProductName} + change := bson.M{"$set": bson.M{ + "services": args.Services, + "update_time": time.Now().Unix(), + "update_by": args.UpdateBy, + }} + + _, err := c.UpdateOne(context.TODO(), query, change) + return err +} + // AddService adds a service to services[0] if it is not there. func (c *ProductColl) AddService(productName, serviceName string) error { diff --git a/pkg/microservice/aslan/core/common/service/environment.go b/pkg/microservice/aslan/core/common/service/environment.go index bb0e0d964..6212da278 100644 --- a/pkg/microservice/aslan/core/common/service/environment.go +++ b/pkg/microservice/aslan/core/common/service/environment.go @@ -18,7 +18,6 @@ package service import ( "encoding/json" - "fmt" "sort" "strings" @@ -131,12 +130,20 @@ func ListWorkloadsInEnv(envName, productName, filter string, perPage, page int, } productServiceNames := sets.NewString() for _, productService := range productServices { - productServiceNames.Insert(fmt.Sprintf("%s/%s", productService.WorkloadType, productService.ServiceName)) + productServiceNames.Insert(productService.ServiceName) + } + // add services in external env data + servicesInExternalEnv, _ := commonrepo.NewServicesInExternalEnvColl().List(&commonrepo.ServicesInExternalEnvArgs{ + ProductName: productName, + EnvName: envName, + }) + for _, serviceInExternalEnv := range servicesInExternalEnv { + productServiceNames.Insert(serviceInExternalEnv.ServiceName) } var res []*Workload for _, workload := range workloads { - if productServiceNames.Has(fmt.Sprintf("%s/%s", workload.Type, workload.Name)) { + if productServiceNames.Has(workload.Name) { res = append(res, workload) } } diff --git a/pkg/microservice/aslan/core/common/service/ilyshin/client.go b/pkg/microservice/aslan/core/common/service/ilyshin/client.go deleted file mode 100644 index d2fc77361..000000000 --- a/pkg/microservice/aslan/core/common/service/ilyshin/client.go +++ /dev/null @@ -1,32 +0,0 @@ -/* -Copyright 2021 The KodeRover 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 ilyshin - -import ( - "github.com/koderover/zadig/pkg/tool/ilyshin" -) - -type Client struct { - *ilyshin.Client -} - -func NewClient(address, accessToken string) *Client { - c := ilyshin.NewClient(address, accessToken) - return &Client{ - Client: c, - } -} diff --git a/pkg/microservice/aslan/core/common/service/ilyshin/webhook.go b/pkg/microservice/aslan/core/common/service/ilyshin/webhook.go deleted file mode 100644 index 4a8dd644b..000000000 --- a/pkg/microservice/aslan/core/common/service/ilyshin/webhook.go +++ /dev/null @@ -1,38 +0,0 @@ -/* -Copyright 2021 The KodeRover 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 ilyshin - -import ( - "strconv" - - "github.com/koderover/zadig/pkg/microservice/aslan/config" - gitservice "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/git" -) - -func (c *Client) CreateWebHook(owner, repo string) (string, error) { - projectHook, err := c.AddProjectHook(owner, repo, config.WebHookURL(), gitservice.GetHookSecret()) - - return strconv.Itoa(projectHook.ID), err -} - -func (c *Client) DeleteWebHook(owner, repo, hookID string) error { - hookIDInt, err := strconv.Atoi(hookID) - if err != nil { - return err - } - return c.DeleteProjectHook(owner, repo, hookIDInt) -} diff --git a/pkg/microservice/aslan/core/common/service/product.go b/pkg/microservice/aslan/core/common/service/product.go index a62713d36..9986f3575 100644 --- a/pkg/microservice/aslan/core/common/service/product.go +++ b/pkg/microservice/aslan/core/common/service/product.go @@ -24,6 +24,7 @@ import ( helmclient "github.com/mittwald/go-helm-client" "go.uber.org/zap" "k8s.io/apimachinery/pkg/labels" + "k8s.io/apimachinery/pkg/util/sets" "sigs.k8s.io/controller-runtime/pkg/client" "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/models" @@ -140,10 +141,41 @@ func DeleteProduct(username, envName, productName, requestID string, log *zap.Su log.Errorf("update workloads fail error:%s", err) } } - // 删除所有external的服务 - err = commonrepo.NewServiceColl().UpdateExternalServicesStatus("", productName, setting.ProductStatusDeleting, envName) + // 获取所有external的服务 + currentEnvServices, err := commonrepo.NewServiceColl().ListExternalWorkloadsBy(productName, envName) if err != nil { - log.Errorf("UpdateStatus external services error:%s", err) + log.Errorf("failed to list external workload, error:%s", err) + } + + externalEnvServices, err := commonrepo.NewServicesInExternalEnvColl().List(&commonrepo.ServicesInExternalEnvArgs{ + ProductName: productName, + ExcludeEnvName: envName, + }) + if err != nil { + log.Errorf("failed to list external service, error:%s", err) + } + + externalEnvServiceM := make(map[string]bool) + for _, externalEnvService := range externalEnvServices { + externalEnvServiceM[externalEnvService.ServiceName] = true + } + + deleteServices := sets.NewString() + for _, currentEnvService := range currentEnvServices { + if _, isExist := externalEnvServiceM[currentEnvService.ServiceName]; !isExist { + deleteServices.Insert(currentEnvService.ServiceName) + } + } + err = commonrepo.NewServiceColl().BatchUpdateExternalServicesStatus(productName, "", setting.ProductStatusDeleting, deleteServices.List()) + if err != nil { + log.Errorf("UpdateStatus external services error:%s", err) + } + // delete services_in_external_env data + if err = commonrepo.NewServicesInExternalEnvColl().Delete(&commonrepo.ServicesInExternalEnvArgs{ + ProductName: productName, + EnvName: envName, + }); err != nil { + log.Errorf("remove services in external env error:%s", err) } } diff --git a/pkg/microservice/aslan/core/common/service/render.go b/pkg/microservice/aslan/core/common/service/render.go index 3552b1e1b..a695162c6 100644 --- a/pkg/microservice/aslan/core/common/service/render.go +++ b/pkg/microservice/aslan/core/common/service/render.go @@ -49,16 +49,14 @@ type KVPair struct { } type RenderChartArg struct { - EnvName string `json:"envName,omitempty"` - ServiceName string `json:"serviceName,omitempty"` - ChartVersion string `json:"chartVersion,omitempty"` - YamlSource string `json:"yamlSource,omitempty"` - GitRepoConfig *RepoConfig `json:"gitRepoConfig,omitempty"` - OverrideValues []*KVPair `json:"overrideValues,omitempty"` - ValuesYAML string `json:"valuesYAML,omitempty"` + EnvName string `json:"envName,omitempty"` + ServiceName string `json:"serviceName,omitempty"` + ChartVersion string `json:"chartVersion,omitempty"` + OverrideValues []*KVPair `json:"overrideValues,omitempty"` + OverrideYaml string `json:"overrideYaml,omitempty"` } -func (args *RenderChartArg) toOverrideValueString() string { +func (args *RenderChartArg) ToOverrideValueString() string { if len(args.OverrideValues) == 0 { return "" } @@ -84,23 +82,9 @@ func (args *RenderChartArg) fromOverrideValueString(valueStr string) { } func (args *RenderChartArg) toCustomValuesYaml() *templatemodels.CustomYaml { - switch args.YamlSource { - case setting.ValuesYamlSourceFreeEdit: + if len(args.OverrideYaml) > 0 { return &templatemodels.CustomYaml{ - YamlSource: args.YamlSource, - YamlContent: args.ValuesYAML, - } - case setting.ValuesYamlSourceGitRepo: - return &templatemodels.CustomYaml{ - YamlSource: args.YamlSource, - YamlContent: args.ValuesYAML, - ValuesPaths: args.GitRepoConfig.ValuesPaths, - GitRepoConfig: &templatemodels.GitRepoConfig{ - CodehostID: args.GitRepoConfig.CodehostID, - Owner: args.GitRepoConfig.Owner, - Repo: args.GitRepoConfig.Repo, - Branch: args.GitRepoConfig.Branch, - }, + YamlContent: args.OverrideYaml, } } return nil @@ -110,31 +94,19 @@ func (args *RenderChartArg) fromCustomValueYaml(customValuesYaml *templatemodels if customValuesYaml == nil { return } - args.YamlSource = customValuesYaml.YamlSource - switch customValuesYaml.YamlSource { - case setting.ValuesYamlSourceFreeEdit: - args.ValuesYAML = customValuesYaml.YamlContent - case setting.ValuesYamlSourceGitRepo: - args.ValuesYAML = "" - if customValuesYaml.GitRepoConfig != nil { - args.GitRepoConfig = &RepoConfig{ - CodehostID: customValuesYaml.GitRepoConfig.CodehostID, - Owner: customValuesYaml.GitRepoConfig.Owner, - Repo: customValuesYaml.GitRepoConfig.Repo, - Branch: customValuesYaml.GitRepoConfig.Branch, - ValuesPaths: customValuesYaml.ValuesPaths, - } - } - - } + args.OverrideYaml = customValuesYaml.YamlContent } // FillRenderChartModel fill render chart model func (args *RenderChartArg) FillRenderChartModel(chart *templatemodels.RenderChart, version string) { chart.ServiceName = args.ServiceName chart.ChartVersion = version - chart.OverrideValues = args.toOverrideValueString() - chart.OverrideYaml = args.toCustomValuesYaml() + chart.OverrideValues = args.ToOverrideValueString() + if len(args.OverrideYaml) > 0 { + chart.OverrideYaml = args.toCustomValuesYaml() + } else { + chart.OverrideYaml = nil + } } // LoadFromRenderChartModel load from render chart model @@ -256,7 +228,7 @@ func CreateHelmRenderSet(args *commonmodels.RenderSet, log *zap.SugaredLogger) e if rs != nil && err == nil { // 已经存在渲染配置集 // 判断是否有修改 - if rs.HelmRenderDiff(args) { + if rs.DefaultValues != args.DefaultValues || rs.HelmRenderDiff(args) { args.IsDefault = rs.IsDefault } else { return nil diff --git a/pkg/microservice/aslan/core/common/service/service.go b/pkg/microservice/aslan/core/common/service/service.go index 6421572de..c4d6a0383 100644 --- a/pkg/microservice/aslan/core/common/service/service.go +++ b/pkg/microservice/aslan/core/common/service/service.go @@ -221,6 +221,28 @@ func ListWorkloadTemplate(productName, envName string, log *zap.SugaredLogger) ( return resp, e.ErrListTemplate.AddDesc(err.Error()) } + currentServiceNames := sets.NewString() + for _, service := range services { + currentServiceNames.Insert(service.ServiceName) + } + + servicesInExternalEnv, _ := commonrepo.NewServicesInExternalEnvColl().List(&commonrepo.ServicesInExternalEnvArgs{ + ProductName: productName, + EnvName: envName, + }) + + externalServiceNames := sets.NewString() + for _, serviceInExternalEnv := range servicesInExternalEnv { + if !currentServiceNames.Has(serviceInExternalEnv.ServiceName) { + externalServiceNames.Insert(serviceInExternalEnv.ServiceName) + } + } + + if len(externalServiceNames) > 0 { + newServices, _ := commonrepo.NewServiceColl().ListExternalWorkloadsBy(productName, "", externalServiceNames.List()...) + services = append(services, newServices...) + } + for _, serviceObject := range services { spmap := &ServiceProductMap{ Service: serviceObject.ServiceName, diff --git a/pkg/microservice/aslan/core/common/service/template_product.go b/pkg/microservice/aslan/core/common/service/template_product.go index 1f39e415d..df136cbe9 100644 --- a/pkg/microservice/aslan/core/common/service/template_product.go +++ b/pkg/microservice/aslan/core/common/service/template_product.go @@ -22,6 +22,7 @@ import ( "sync" "go.uber.org/zap" + "k8s.io/apimachinery/pkg/util/sets" configbase "github.com/koderover/zadig/pkg/config" "github.com/koderover/zadig/pkg/microservice/aslan/config" @@ -82,6 +83,13 @@ func GetProductTemplate(productName string, log *zap.SugaredLogger) (*template.P if err != nil { return resp, fmt.Errorf("ListExternalWorkloadsBy err : %s", err) } + serviceNamesSet := sets.NewString() + for _, service := range totalServices { + serviceNamesSet.Insert(service.ServiceName) + } + if len(resp.Services) > 0 { + resp.Services[0] = serviceNamesSet.List() + } } else { totalServices, err = commonrepo.NewServiceColl().ListMaxRevisionsByProduct(productName) if err != nil { diff --git a/pkg/microservice/aslan/core/common/service/utils.go b/pkg/microservice/aslan/core/common/service/utils.go index 010bdc95b..3b811390f 100644 --- a/pkg/microservice/aslan/core/common/service/utils.go +++ b/pkg/microservice/aslan/core/common/service/utils.go @@ -95,7 +95,7 @@ func GetGitlabAddress(URL string) (string, error) { // GetOwnerRepoBranchPath 获取gitlab路径中的owner、repo、branch和path func GetOwnerRepoBranchPath(URL string) (string, string, string, string, string, string, error) { if !strings.Contains(URL, "https") && !strings.Contains(URL, "http") { - return "", "", "", "", "", "", fmt.Errorf("url is illegal") + return "", "", "", "", "", "", fmt.Errorf("url is illegal:%s", URL) } //适配公网的gitlab if strings.Contains(URL, "-") { diff --git a/pkg/microservice/aslan/core/common/service/webhook/controller.go b/pkg/microservice/aslan/core/common/service/webhook/controller.go index c9e809614..0297b64c0 100644 --- a/pkg/microservice/aslan/core/common/service/webhook/controller.go +++ b/pkg/microservice/aslan/core/common/service/webhook/controller.go @@ -29,7 +29,6 @@ import ( "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/codehub" "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/github" "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/gitlab" - "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/ilyshin" "github.com/koderover/zadig/pkg/setting" "github.com/koderover/zadig/pkg/tool/log" ) @@ -132,8 +131,6 @@ func removeWebhook(t *task, logger *zap.Logger) { } case setting.SourceFromCodeHub: cl = codehub.NewClient(t.ak, t.sk, t.region) - case setting.SourceFromIlyshin: - cl = ilyshin.NewClient(t.address, t.token) default: t.err = fmt.Errorf("invaild source: %s", t.from) t.doneCh <- struct{}{} @@ -195,8 +192,6 @@ func addWebhook(t *task, logger *zap.Logger) { case setting.SourceFromCodeHub: cl = codehub.NewClient(t.ak, t.sk, t.region) - case setting.SourceFromIlyshin: - cl = ilyshin.NewClient(t.address, t.token) default: t.err = fmt.Errorf("invaild source: %s", t.from) t.doneCh <- struct{}{} diff --git a/pkg/microservice/aslan/core/common/service/workflow.go b/pkg/microservice/aslan/core/common/service/workflow.go index beb0c3516..36e82f91e 100644 --- a/pkg/microservice/aslan/core/common/service/workflow.go +++ b/pkg/microservice/aslan/core/common/service/workflow.go @@ -175,7 +175,7 @@ func ProcessWebhook(updatedHooks, currentHooks interface{}, name string, logger } switch ch.Type { - case setting.SourceFromGithub, setting.SourceFromGitlab, setting.SourceFromCodeHub, setting.SourceFromIlyshin: + case setting.SourceFromGithub, setting.SourceFromGitlab, setting.SourceFromCodeHub: err = webhook.NewClient().RemoveWebHook(&webhook.TaskOption{ Name: wh.name, Owner: wh.owner, @@ -209,7 +209,7 @@ func ProcessWebhook(updatedHooks, currentHooks interface{}, name string, logger } switch ch.Type { - case setting.SourceFromGithub, setting.SourceFromGitlab, setting.SourceFromCodeHub, setting.SourceFromIlyshin: + case setting.SourceFromGithub, setting.SourceFromGitlab, setting.SourceFromCodeHub: err = webhook.NewClient().AddWebHook(&webhook.TaskOption{ Name: wh.name, Owner: wh.owner, diff --git a/pkg/microservice/aslan/core/environment/handler/environment.go b/pkg/microservice/aslan/core/environment/handler/environment.go index 696575153..645b85d8f 100644 --- a/pkg/microservice/aslan/core/environment/handler/environment.go +++ b/pkg/microservice/aslan/core/environment/handler/environment.go @@ -63,6 +63,14 @@ func ListProducts(c *gin.Context) { ctx.Resp, ctx.Err = service.ListProducts(c.Query("projectName"), ctx.UserName, ctx.Logger) } +// GetProductStatus List product status +func GetProductStatus(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + + ctx.Resp, ctx.Err = service.GetProductStatus(c.Param("productName"), ctx.Logger) +} + func AutoCreateProduct(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() @@ -104,25 +112,34 @@ func CreateHelmProduct(c *gin.Context) { return } - args := new(service.CreateHelmProductArg) + productName := c.Param("productName") + + createArgs := make([]*service.CreateHelmProductArg, 0) data, err := c.GetRawData() if err != nil { - log.Errorf("CreateProduct c.GetRawData() err : %v", err) + log.Errorf("CreateHelmProduct c.GetRawData() err : %v", err) + } else if err = json.Unmarshal(data, &createArgs); err != nil { + log.Errorf("CreateHelmProduct json.Unmarshal err : %v", err) } - if err = json.Unmarshal(data, args); err != nil { - log.Errorf("CreateProduct json.Unmarshal err : %v", err) + if err != nil { + ctx.Err = e.ErrInvalidParam.AddErr(err) + return } - args.ProductName = c.Param("productName") - if args.EnvName == "" { - ctx.Err = e.ErrInvalidParam.AddDesc("envName can not be null!") - return + envNameList := make([]string, 0) + for _, arg := range createArgs { + if arg.EnvName == "" { + ctx.Err = e.ErrInvalidParam.AddDesc("envName is empty") + return + } + arg.ProductName = productName + envNameList = append(envNameList, arg.EnvName) } - internalhandler.InsertOperationLog(c, ctx.UserName, args.ProductName, "新增", "集成环境", args.EnvName, string(data), ctx.Logger) + internalhandler.InsertOperationLog(c, ctx.UserName, productName, "新增", "集成环境", strings.Join(envNameList, "-"), string(data), ctx.Logger) ctx.Err = service.CreateHelmProduct( - ctx.UserName, ctx.RequestID, args, ctx.Logger, + productName, ctx.UserName, ctx.RequestID, createArgs, ctx.Logger, ) } @@ -171,6 +188,8 @@ func UpdateProduct(c *gin.Context) { } if err = json.Unmarshal(data, args); err != nil { log.Errorf("UpdateProduct json.Unmarshal err : %v", err) + ctx.Err = e.ErrInvalidParam.AddDesc(err.Error()) + return } internalhandler.InsertOperationLog(c, ctx.UserName, productName, "更新", "集成环境", envName, string(data), ctx.Logger) c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(data)) @@ -215,21 +234,32 @@ func UpdateProductRecycleDay(c *gin.Context) { ctx.Err = service.UpdateProductRecycleDay(envName, productName, recycleDay) } -func UpdateHelmProduct(c *gin.Context) { +func EstimatedValues(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - envName := c.Query("envName") - updateType := c.Query("updateType") productName := c.Param("productName") + if productName == "" { + ctx.Err = e.ErrInvalidParam.AddDesc("productName can't be empty!") + return + } - ctx.Err = service.UpdateHelmProduct(productName, envName, updateType, ctx.UserName, ctx.RequestID, nil, ctx.Logger) - if ctx.Err != nil { - ctx.Logger.Errorf("failed to update product %s %s: %v", envName, productName, ctx.Err) + serviceName := c.Query("serviceName") + if serviceName == "" { + ctx.Err = e.ErrInvalidParam.AddDesc("serviceName can't be empty!") + return + } + + arg := new(service.EstimateValuesArg) + if err := c.ShouldBind(arg); err != nil { + ctx.Err = e.ErrInvalidParam.AddDesc(err.Error()) + return } + + ctx.Resp, ctx.Err = service.GeneEstimatedValues(productName, c.Query("envName"), serviceName, c.Query("scene"), c.Query("format"), arg, ctx.Logger) } -func UpdateHelmProductRenderCharts(c *gin.Context) { +func UpdateHelmProductRenderset(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() @@ -245,7 +275,7 @@ func UpdateHelmProductRenderCharts(c *gin.Context) { return } - arg := new(service.EnvRenderChartArg) + arg := new(service.EnvRendersetArg) data, err := c.GetRawData() if err != nil { log.Errorf("UpdateHelmProductVariable c.GetRawData() err : %v", err) @@ -255,37 +285,7 @@ func UpdateHelmProductRenderCharts(c *gin.Context) { } internalhandler.InsertOperationLog(c, ctx.UserName, c.Param("productName"), "更新", "更新环境变量", "", string(data), ctx.Logger) - ctx.Err = service.UpdateHelmProductRenderCharts(productName, envName, ctx.UserName, ctx.RequestID, arg.ChartValues, ctx.Logger) - if ctx.Err != nil { - ctx.Logger.Errorf("failed to update product Variable %s %s: %v", envName, productName, ctx.Err) - } -} - -func UpdateHelmProductVariable(c *gin.Context) { - ctx := internalhandler.NewContext(c) - defer func() { internalhandler.JSONResponse(c, ctx) }() - - envName := c.Query("envName") - productName := c.Param("productName") - - args := new(ChartInfoArgs) - data, err := c.GetRawData() - if err != nil { - log.Errorf("UpdateHelmProductVariable c.GetRawData() err : %v", err) - } - if err = json.Unmarshal(data, args); err != nil { - log.Errorf("UpdateHelmProductVariable json.Unmarshal err : %v", err) - } - internalhandler.InsertOperationLog(c, ctx.UserName, c.Param("productName"), "更新", "helm集成环境变量", "", string(data), ctx.Logger) - c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(data)) - - if err := c.BindJSON(args); err != nil { - ctx.Logger.Error(err) - ctx.Err = e.ErrInvalidParam.AddDesc(err.Error()) - return - } - - ctx.Err = service.UpdateHelmProductVariable(productName, envName, ctx.UserName, ctx.RequestID, args.ChartInfos, args.ChartInfos, ctx.Logger) + ctx.Err = service.UpdateHelmProductRenderset(productName, envName, ctx.UserName, ctx.RequestID, arg, ctx.Logger) if ctx.Err != nil { ctx.Logger.Errorf("failed to update product Variable %s %s: %v", envName, productName, ctx.Err) } @@ -317,30 +317,6 @@ func UpdateMultiHelmEnv(c *gin.Context) { ) } -func UpdateMultiHelmProduct(c *gin.Context) { - ctx := internalhandler.NewContext(c) - defer func() { internalhandler.JSONResponse(c, ctx) }() - - args := new(UpdateEnvs) - data, err := c.GetRawData() - if err != nil { - log.Errorf("UpdateMultiHelmProduct c.GetRawData() err : %v", err) - } - if err = json.Unmarshal(data, args); err != nil { - log.Errorf("UpdateMultiHelmProduct json.Unmarshal err : %v", err) - } - internalhandler.InsertOperationLog(c, ctx.UserName, c.Param("productName"), "更新helm环境", "集成环境", strings.Join(args.EnvNames, ","), string(data), ctx.Logger) - c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(data)) - - if err := c.BindJSON(args); err != nil { - ctx.Logger.Error(err) - ctx.Err = e.ErrInvalidParam.AddDesc(err.Error()) - return - } - - ctx.Resp = service.UpdateMultiHelmProduct(args.EnvNames, args.UpdateType, c.Param("productName"), ctx.RequestID, ctx.Logger) -} - func GetProduct(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() @@ -402,11 +378,13 @@ func GetEstimatedRenderCharts(c *gin.Context) { productName := c.Query("projectName") if productName == "" { ctx.Err = e.ErrInvalidParam.AddDesc("productName can't be empty!") + return } envName := c.Query("envName") if envName == "" { ctx.Err = e.ErrInvalidParam.AddDesc("envName can't be empty!") + return } ctx.Resp, ctx.Err = service.GetEstimatedRenderCharts(productName, envName, c.Query("serviceName"), ctx.Logger) @@ -520,6 +498,20 @@ func ListWorkloads(c *gin.Context) { for _, workload := range workloadStat.Workloads { workloadM[workload.Name] = workload } + + // add services in external env data + servicesInExternalEnv, _ := mongodb.NewServicesInExternalEnvColl().List(&mongodb.ServicesInExternalEnvArgs{ + Namespace: args.Namespace, + ClusterID: args.ClusterID, + }) + + for _, serviceInExternalEnv := range servicesInExternalEnv { + workloadM[serviceInExternalEnv.ServiceName] = commonmodels.Workload{ + EnvName: serviceInExternalEnv.EnvName, + ProductName: serviceInExternalEnv.ProductName, + } + } + for index, currentWorkload := range workloads { if existWorkload, ok := workloadM[currentWorkload.Name]; ok { workloads[index].EnvName = existWorkload.EnvName diff --git a/pkg/microservice/aslan/core/environment/handler/renderset.go b/pkg/microservice/aslan/core/environment/handler/renderset.go index 851f03327..85fa58548 100644 --- a/pkg/microservice/aslan/core/environment/handler/renderset.go +++ b/pkg/microservice/aslan/core/environment/handler/renderset.go @@ -17,15 +17,12 @@ limitations under the License. package handler import ( - "encoding/json" + "strings" "github.com/gin-gonic/gin" - - commonservice "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service" "github.com/koderover/zadig/pkg/microservice/aslan/core/environment/service" internalhandler "github.com/koderover/zadig/pkg/shared/handler" e "github.com/koderover/zadig/pkg/tool/errors" - "github.com/koderover/zadig/pkg/tool/log" ) func GetServiceRenderCharts(c *gin.Context) { @@ -45,7 +42,7 @@ func GetServiceRenderCharts(c *gin.Context) { ctx.Resp, ctx.Err = service.GetRenderCharts(c.Query("projectName"), c.Query("envName"), c.Query("serviceName"), ctx.Logger) } -func CreateOrUpdateRenderChart(c *gin.Context) { +func GetProductDefaultValues(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() @@ -59,17 +56,29 @@ func CreateOrUpdateRenderChart(c *gin.Context) { return } - data, err := c.GetRawData() - if err != nil { - log.Errorf("CreateOrUpdateRenderChart c.GetRawData() err : %v", err) + ctx.Resp, ctx.Err = service.GetDefaultValues(c.Query("productName"), c.Query("envName"), ctx.Logger) +} + +func GetYamlContent(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + + arg := &service.YamlContentRequestArg{} + + if err := c.ShouldBindQuery(arg); err != nil { + ctx.Err = e.ErrInvalidParam.AddErr(err) + return + } + if arg.CodehostID == 0 && len(arg.RepoLink) == 0 { + ctx.Err = e.ErrInvalidParam.AddDesc("neither codehost nor repo link is specified") + return } - args := new(commonservice.RenderChartArg) - if err = json.Unmarshal(data, args); err != nil { - log.Errorf("CreateOrUpdateRenderChart json.Unmarshal err : %v", err) - ctx.Err = e.ErrInvalidParam.AddDesc(err.Error()) + if len(arg.ValuesPaths) == 0 { + ctx.Err = e.ErrInvalidParam.AddDesc("paths can't be empty") + return } - internalhandler.InsertOperationLog(c, ctx.UserName, c.Param("productName"), "新增", "环境变量", c.Query("envName"), string(data), ctx.Logger) - ctx.Err = service.CreateOrUpdateChartValues(c.Query("projectName"), c.Query("envName"), args, ctx.UserName, ctx.RequestID, ctx.Logger) + pathArr := strings.Split(arg.ValuesPaths, ",") + ctx.Resp, ctx.Err = service.GetMergedYamlContent(arg, pathArr) } diff --git a/pkg/microservice/aslan/core/environment/handler/router.go b/pkg/microservice/aslan/core/environment/handler/router.go index 5005916b6..bc13c84ca 100644 --- a/pkg/microservice/aslan/core/environment/handler/router.go +++ b/pkg/microservice/aslan/core/environment/handler/router.go @@ -94,7 +94,9 @@ func (*Router) Inject(router *gin.RouterGroup) { environments := router.Group("environments") { environments.GET("", ListProducts) + environments.GET("/:productName/status", GetProductStatus) environments.POST("/:productName/auto", AutoCreateProduct) + environments.PUT("/:productName/autoUpdate", gin2.UpdateOperationLogStatus, AutoUpdateProduct) environments.POST("", gin2.UpdateOperationLogStatus, CreateProduct) @@ -103,7 +105,9 @@ func (*Router) Inject(router *gin.RouterGroup) { environments.POST("/:productName", gin2.UpdateOperationLogStatus, UpdateProduct) environments.PUT("/:productName/envRecycle", gin2.UpdateOperationLogStatus, UpdateProductRecycleDay) - environments.PUT("/:productName/renderchart", gin2.UpdateOperationLogStatus, UpdateHelmProductRenderCharts) + + environments.POST("/:productName/estimated-values", EstimatedValues) + environments.PUT("/:productName/renderset", gin2.UpdateOperationLogStatus, UpdateHelmProductRenderset) environments.GET("/:productName/helmChartVersions", GetHelmChartVersions) //environments.PUT("/:productName", gin2.UpdateOperationLogStatus, EnvShare) @@ -126,11 +130,6 @@ func (*Router) Inject(router *gin.RouterGroup) { environments.GET("/:productName/services/:serviceName/containers/:container/namespaces/:namespace", GetServiceContainer) environments.GET("/estimated-renderchart", GetEstimatedRenderCharts) - - // need to be deprecated - environments.PUT("/:productName/helmEnv", gin2.UpdateOperationLogStatus, UpdateHelmProduct) - environments.PUT("/:productName/helmEnvVariable", gin2.UpdateOperationLogStatus, UpdateHelmProductVariable) - environments.PUT("/:productName/updateMultiEnv", gin2.UpdateOperationLogStatus, UpdateMultiHelmProduct) } // --------------------------------------------------------------------------------------- @@ -139,7 +138,8 @@ func (*Router) Inject(router *gin.RouterGroup) { rendersets := router.Group("rendersets") { rendersets.GET("/renderchart", GetServiceRenderCharts) - rendersets.PUT("/renderchart", CreateOrUpdateRenderChart) // create or update renderchart when onBoarding + rendersets.GET("/default-values", GetProductDefaultValues) + rendersets.GET("/yamlContent", GetYamlContent) } // --------------------------------------------------------------------------------------- diff --git a/pkg/microservice/aslan/core/environment/service/environment.go b/pkg/microservice/aslan/core/environment/service/environment.go index 5f542f97c..6e635f9b2 100644 --- a/pkg/microservice/aslan/core/environment/service/environment.go +++ b/pkg/microservice/aslan/core/environment/service/environment.go @@ -46,6 +46,8 @@ import ( "github.com/koderover/zadig/pkg/microservice/aslan/config" commonmodels "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/models" "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/models/template" + templatemodels "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/models/template" + "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/mongodb" commonrepo "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/mongodb" templaterepo "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/mongodb/template" commonservice "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service" @@ -69,6 +71,14 @@ const ( UpdateTypeEnv = "envVar" ) +type usageScenario string + +const ( + usageScenarioCreateEnv = "createEnv" + usageScenarioUpdateEnv = "updateEnv" + usageScenarioUpdateRenderSet = "updateRenderSet" +) + type EnvStatus struct { EnvName string `json:"env_name,omitempty"` Status string `json:"status"` @@ -101,16 +111,28 @@ type ProductParams struct { PermissionUUIDs []string `json:"permissionUUIDs"` } +type EstimateValuesArg struct { + DefaultValues string `json:"defaultValues"` + OverrideYaml string `json:"overrideYaml"` + OverrideValues []*commonservice.KVPair `json:"overrideValues,omitempty"` +} + type EnvRenderChartArg struct { ChartValues []*commonservice.RenderChartArg `json:"chartValues"` } +type EnvRendersetArg struct { + DefaultValues string `json:"defaultValues"` + ChartValues []*commonservice.RenderChartArg `json:"chartValues"` +} + type CreateHelmProductArg struct { - ProductName string `json:"productName"` - EnvName string `json:"envName"` - Namespace string `json:"namespace"` - ClusterID string `json:"clusterID"` - ChartValues []*commonservice.RenderChartArg `json:"chartValues"` + ProductName string `json:"productName"` + EnvName string `json:"envName"` + Namespace string `json:"namespace"` + ClusterID string `json:"clusterID"` + DefaultValues string `json:"defaultValues"` + ChartValues []*commonservice.RenderChartArg `json:"chartValues"` } type UpdateMultiHelmProductArg struct { @@ -120,31 +142,32 @@ type UpdateMultiHelmProductArg struct { ReplacePolicy string `json:"replacePolicy"` // TODO logic not implemented } -//func UpdateProductPublic(productName string, args *ProductParams, log *zap.SugaredLogger) error { -// err := commonrepo.NewProductColl().UpdateIsPublic(args.EnvName, productName, args.IsPublic) -// if err != nil { -// log.Errorf("UpdateProductPublic error: %v", err) -// return fmt.Errorf("UpdateProductPublic error: %v", err) -// } -// -// poetryCtl := poetry.New(config.PoetryAPIServer()) -// if !args.IsPublic { //把公开设置成不公开 -// _, err := poetryCtl.AddEnvRolePermission(productName, args.EnvName, args.PermissionUUIDs, args.RoleID, log) -// if err != nil { -// log.Errorf("UpdateProductPublic AddEnvRole error: %v", err) -// return fmt.Errorf("UpdateProductPublic AddEnvRole error: %v", err) -// } -// return nil -// } -// //把不公开设成公开 删除原来环境绑定的角色 -// _, err = poetryCtl.DeleteEnvRolePermission(productName, args.EnvName, log) -// if err != nil { -// log.Errorf("UpdateProductPublic DeleteEnvRole error: %v", err) -// return fmt.Errorf("UpdateProductPublic DeleteEnvRole error: %v", err) -// } -// -// return nil -//} +type RawYamlResp struct { + YamlContent string `json:"yamlContent"` +} + +func GetProductStatus(productName string, log *zap.SugaredLogger) ([]*EnvStatus, error) { + products, err := commonrepo.NewProductColl().List(&commonrepo.ProductListOptions{Name: productName}) + if err != nil { + log.Errorf("Collection.Product.List List product error: %v", err) + return nil, e.ErrListProducts.AddDesc(err.Error()) + } + envStatusSlice := make([]*EnvStatus, 0) + for _, publicProduct := range products { + if publicProduct.ProductName != productName { + continue + } + envStatus := &EnvStatus{ + EnvName: publicProduct.EnvName, + Status: publicProduct.Status, + } + if len(publicProduct.Error) > 0 { + envStatus.ErrMessage = publicProduct.Error + } + envStatusSlice = append(envStatusSlice, envStatus) + } + return envStatusSlice, err +} func ListProducts(productNameParam string, userName string, log *zap.SugaredLogger) (resp []*ProductResp, err error) { products, err := commonrepo.NewProductColl().List(&commonrepo.ProductListOptions{Name: productNameParam, IsSortByProductName: true}) @@ -617,13 +640,13 @@ func UpdateProductV2(envName, productName, user, requestID string, force bool, k return nil } -func CreateHelmProduct(userName, requestID string, args *CreateHelmProductArg, log *zap.SugaredLogger) error { - templateProduct, err := templaterepo.NewProductColl().Find(args.ProductName) +func CreateHelmProduct(productName, userName, requestID string, args []*CreateHelmProductArg, log *zap.SugaredLogger) error { + templateProduct, err := templaterepo.NewProductColl().Find(productName) if err != nil || templateProduct == nil { if err != nil { - log.Errorf("failed to query product %s, err %s ", args.ProductName, err.Error()) + log.Errorf("failed to query product %s, err %s ", productName, err.Error()) } - return e.ErrCreateEnv.AddDesc(fmt.Sprintf("failed to query product %s ", args.ProductName)) + return e.ErrCreateEnv.AddDesc(fmt.Sprintf("failed to query product %s ", productName)) } err = commonservice.FillProductTemplateValuesYamls(templateProduct, log) @@ -631,22 +654,9 @@ func CreateHelmProduct(userName, requestID string, args *CreateHelmProductArg, l return e.ErrCreateEnv.AddDesc(err.Error()) } - productObj := &commonmodels.Product{ - ProductName: args.ProductName, - Revision: 1, - EnvName: args.EnvName, - UpdateBy: userName, - IsPublic: true, - ClusterID: args.ClusterID, - Namespace: commonservice.GetProductEnvNamespace(args.EnvName, args.ProductName, args.Namespace), - Source: setting.SourceFromHelm, - IsOpenSource: templateProduct.IsOpensource, - ChartInfos: templateProduct.ChartInfos, - IsForkedProduct: false, - } - + // generate service group data allServiceInfoMap := templateProduct.AllServiceInfoMap() - + var serviceGroup [][]*commonmodels.ProductService for _, names := range templateProduct.Services { servicesResp := make([]*commonmodels.ProductService, 0) for _, serviceName := range names { @@ -682,50 +692,64 @@ func CreateHelmProduct(userName, requestID string, args *CreateHelmProductArg, l } servicesResp = append(servicesResp, serviceResp) } - productObj.Services = append(productObj.Services, servicesResp) + serviceGroup = append(serviceGroup, servicesResp) } - // extract values.yaml from request and save into db - serviceList, err := commonrepo.NewServiceColl().ListMaxRevisionsByProduct(args.ProductName) - if err != nil { - log.Infof("query services from product: %s fail, error %s", args.ProductName, err.Error()) - return e.ErrCreateEnv.AddDesc("failed to query services") + errList := new(multierror.Error) + for _, arg := range args { + err = createSingleHelmProduct(templateProduct, serviceGroup, requestID, userName, arg, log) + if err != nil { + errList = multierror.Append(errList, err) + } } + return errList.ErrorOrNil() +} - serviceMap := make(map[string]*commonmodels.Service) - for _, singleService := range serviceList { - serviceMap[singleService.ServiceName] = singleService +func createSingleHelmProduct(templateProduct *template.Product, serviceGroup [][]*commonmodels.ProductService, requestID, userName string, arg *CreateHelmProductArg, log *zap.SugaredLogger) error { + productObj := &commonmodels.Product{ + ProductName: templateProduct.ProductName, + Revision: 1, + Enabled: false, + EnvName: arg.EnvName, + UpdateBy: userName, + Services: serviceGroup, + IsPublic: true, + ClusterID: arg.ClusterID, + Namespace: commonservice.GetProductEnvNamespace(arg.EnvName, arg.ProductName, arg.Namespace), + Source: setting.SourceFromHelm, + IsOpenSource: templateProduct.IsOpensource, + ChartInfos: templateProduct.ChartInfos, + IsForkedProduct: false, } customChartValueMap := make(map[string]*commonservice.RenderChartArg) - for _, singleCV := range args.ChartValues { + for _, singleCV := range arg.ChartValues { customChartValueMap[singleCV.ServiceName] = singleCV } for _, latestChart := range productObj.ChartInfos { if singleCV, ok := customChartValueMap[latestChart.ServiceName]; ok { - yamlContent, err := generateValuesYaml(singleCV, log) - if err != nil { - return e.ErrCreateEnv.AddDesc(fmt.Sprintf("failed to get yaml content for service: %s, err %v", singleCV.ServiceName, err.Error())) - } - singleCV.ValuesYAML = yamlContent singleCV.FillRenderChartModel(latestChart, latestChart.ChartVersion) } } + // default values + defaultValuesYaml := arg.DefaultValues + // insert renderset info into db if len(productObj.ChartInfos) > 0 { - err = commonservice.CreateHelmRenderSet(&commonmodels.RenderSet{ - Name: commonservice.GetProductEnvNamespace(args.EnvName, args.ProductName, args.Namespace), - EnvName: args.EnvName, - ProductTmpl: args.ProductName, - UpdateBy: userName, - IsDefault: false, - ChartInfos: productObj.ChartInfos, + err := commonservice.CreateHelmRenderSet(&commonmodels.RenderSet{ + Name: commonservice.GetProductEnvNamespace(arg.EnvName, arg.ProductName, arg.Namespace), + EnvName: arg.EnvName, + ProductTmpl: arg.ProductName, + UpdateBy: userName, + IsDefault: false, + DefaultValues: defaultValuesYaml, + ChartInfos: productObj.ChartInfos, }, log) if err != nil { - log.Errorf("rennderset create fail when creating helm product, productName: %s", args.ProductName) - return e.ErrCreateEnv.AddDesc(fmt.Sprintf("failed to save chart values, productName: %s", args.ProductName)) + log.Errorf("rennderset create fail when creating helm product, productName: %s", arg.ProductName) + return e.ErrCreateEnv.AddDesc(fmt.Sprintf("failed to save chart values, productName: %s", arg.ProductName)) } } @@ -766,7 +790,7 @@ func UpdateHelmProduct(productName, envName, updateType, username, requestID str } //对比当前环境中的环境变量和默认的环境变量 go func() { - err := updateProductGroup(productName, envName, updateType, productResp, currentProductService, overrideCharts, log) + err := updateProductGroup(username, productName, envName, updateType, productResp, currentProductService, overrideCharts, log) if err != nil { log.Errorf("[%s][P:%s] failed to update product %#v", envName, productName, err) // 发送更新产品失败消息给用户 @@ -802,18 +826,106 @@ func UpdateHelmProduct(productName, envName, updateType, username, requestID str return nil } +func prepareEstimatedData(productName, envName, serviceName, usageScenario, defaultValues string, log *zap.SugaredLogger) (string, string, error) { + var err error + templateService, err := commonrepo.NewServiceColl().Find(&commonrepo.ServiceFindOption{ + ServiceName: serviceName, + ProductName: productName, + Type: setting.HelmDeployType, + }) + if err != nil { + log.Errorf("failed to query service, name %s, err %s", serviceName, err) + return "", "", fmt.Errorf("failed to query service, name %s", serviceName) + } + + if usageScenario == usageScenarioCreateEnv { + return templateService.HelmChart.ValuesYaml, defaultValues, nil + } + + productInfo, err := commonrepo.NewProductColl().Find(&commonrepo.ProductFindOptions{ + Name: productName, + EnvName: envName, + }) + if err != nil { + return "", "", fmt.Errorf("failed to query product info, name %s", envName) + } + + // find chart info from cur render set + opt := &mongodb.RenderSetFindOption{Name: productInfo.Render.Name, Revision: productInfo.Render.Revision} + renderSet, err := mongodb.NewRenderSetColl().Find(opt) + if err != nil { + log.Errorf("renderset Find error, productName:%s, envName:%s, err:%s", productInfo.ProductName, productInfo.EnvName, err) + return "", "", fmt.Errorf("failed to query renderset info, name %s", productInfo.Render.Name) + } + + var targetChart *templatemodels.RenderChart + for _, chart := range renderSet.ChartInfos { + if chart.ServiceName == serviceName { + targetChart = chart + break + } + } + + if targetChart == nil { + return "", "", fmt.Errorf("failed to find chart info, name: %s", serviceName) + } + + switch usageScenario { + case usageScenarioUpdateEnv: + imageRelatedKey := sets.NewString() + if templateService != nil { + for _, container := range templateService.Containers { + if container.ImagePath != nil { + imageRelatedKey.Insert(container.ImagePath.Image, container.ImagePath.Repo, container.ImagePath.Tag) + } + } + } + // merge environment values + mergedBs, err := overrideValues([]byte(targetChart.ValuesYaml), []byte(templateService.HelmChart.ValuesYaml), imageRelatedKey) + if err != nil { + return "", "", errors.Wrapf(err, "failed to override values") + } + return string(mergedBs), renderSet.DefaultValues, nil + case usageScenarioUpdateRenderSet: + return targetChart.ValuesYaml, renderSet.DefaultValues, nil + default: + return "", "", fmt.Errorf("unrecognized usageScenario:%s", usageScenario) + } +} + +func GeneEstimatedValues(productName, envName, serviceName, scene, format string, arg *EstimateValuesArg, log *zap.SugaredLogger) (interface{}, error) { + chartValues, defaultValues, err := prepareEstimatedData(productName, envName, serviceName, scene, arg.DefaultValues, log) + if err != nil { + return nil, e.ErrUpdateRenderSet.AddDesc(fmt.Sprintf("failed to prepare data, err %s", err)) + } + + tempArg := &commonservice.RenderChartArg{OverrideValues: arg.OverrideValues} + mergeValues, err := helmtool.MergeOverrideValues(chartValues, defaultValues, arg.OverrideYaml, tempArg.ToOverrideValueString()) + if err != nil { + return nil, e.ErrUpdateRenderSet.AddDesc(fmt.Sprintf("failed to merge values, err %s", err)) + } + + switch format { + case "flatMap": + mapData, err := converter.YamlToFlatMap([]byte(mergeValues)) + if err != nil { + return nil, e.ErrUpdateRenderSet.AddDesc(fmt.Sprintf("failed to generate flat map , err %s", err)) + } + return mapData, nil + default: + return &RawYamlResp{YamlContent: mergeValues}, nil + } +} + // check if override values or yaml content changes func checkOverrideValuesChange(source *template.RenderChart, args *commonservice.RenderChartArg) bool { - tmpRenderCharts := &template.RenderChart{} - args.FillRenderChartModel(tmpRenderCharts, "") - if source.OverrideValues != tmpRenderCharts.OverrideValues || source.DiffOverrideYaml(tmpRenderCharts) { + if source.OverrideValues != args.ToOverrideValueString() || source.GetOverrideYaml() != args.OverrideYaml { return true } return false } -func UpdateHelmProductRenderCharts(productName, envName, userName, requestID string, renderCharts []*commonservice.RenderChartArg, log *zap.SugaredLogger) error { - +func UpdateHelmProductRenderset(productName, envName, userName, requestID string, args *EnvRendersetArg, log *zap.SugaredLogger) error { renderSetName := commonservice.GetProductEnvNamespace(envName, productName, "") opt := &commonrepo.RenderSetFindOption{Name: renderSetName} @@ -826,15 +938,18 @@ func UpdateHelmProductRenderCharts(productName, envName, userName, requestID str } // render charts need to be updated - updatedRcs := make([]*template.RenderChart, 0) + updatedRcList := make([]*template.RenderChart, 0) + updatedRCMap := make(map[string]*template.RenderChart) - for _, requestRenderChart := range renderCharts { - yamlContent, err := generateValuesYaml(requestRenderChart, log) - if err != nil { - return e.ErrUpdateEnv.AddDesc(fmt.Sprintf("failed to get yaml content for service: %s, err %v", requestRenderChart.ServiceName, err.Error())) + // default values change + if args.DefaultValues != productRenderset.DefaultValues { + for _, curRenderChart := range productRenderset.ChartInfos { + updatedRCMap[curRenderChart.ServiceName] = curRenderChart } - requestRenderChart.ValuesYAML = yamlContent + productRenderset.DefaultValues = args.DefaultValues + } + for _, requestRenderChart := range args.ChartValues { // update renderset info for _, curRenderChart := range productRenderset.ChartInfos { if curRenderChart.ServiceName != requestRenderChart.ServiceName { @@ -844,15 +959,19 @@ func UpdateHelmProductRenderCharts(productName, envName, userName, requestID str continue } requestRenderChart.FillRenderChartModel(curRenderChart, curRenderChart.ChartVersion) - updatedRcs = append(updatedRcs, curRenderChart) + updatedRCMap[curRenderChart.ServiceName] = curRenderChart break } } - return UpdateHelmProductVariable(productName, envName, userName, requestID, updatedRcs, productRenderset.ChartInfos, log) + for _, updatedRc := range updatedRCMap { + updatedRcList = append(updatedRcList, updatedRc) + } + + return UpdateHelmProductVariable(productName, envName, userName, requestID, updatedRcList, productRenderset, log) } -func UpdateHelmProductVariable(productName, envName, username, requestID string, updatedRcs, allRcs []*template.RenderChart, log *zap.SugaredLogger) error { +func UpdateHelmProductVariable(productName, envName, username, requestID string, updatedRcs []*template.RenderChart, renderset *commonmodels.RenderSet, log *zap.SugaredLogger) error { opt := &commonrepo.ProductFindOptions{Name: productName, EnvName: envName} productResp, err := commonrepo.NewProductColl().Find(opt) if err != nil { @@ -867,11 +986,12 @@ func UpdateHelmProductVariable(productName, envName, username, requestID string, if err = commonservice.CreateHelmRenderSet( &commonmodels.RenderSet{ - Name: productResp.Namespace, - EnvName: envName, - ProductTmpl: productName, - UpdateBy: username, - ChartInfos: allRcs, + Name: productResp.Namespace, + EnvName: envName, + ProductTmpl: productName, + UpdateBy: username, + DefaultValues: renderset.DefaultValues, + ChartInfos: renderset.ChartInfos, }, log, ); err != nil { @@ -890,10 +1010,10 @@ func UpdateHelmProductVariable(productName, envName, username, requestID string, } productResp.Render.Revision = renderSet.Revision - return updateHelmProductVariable(productResp, oldRenderVersion, username, requestID, log) + return updateHelmProductVariable(productResp, renderSet, oldRenderVersion, username, requestID, log) } -func updateHelmProductVariable(productResp *commonmodels.Product, oldRenderVersion int64, userName, requestID string, log *zap.SugaredLogger) error { +func updateHelmProductVariable(productResp *commonmodels.Product, renderset *commonmodels.RenderSet, oldRenderVersion int64, userName, requestID string, log *zap.SugaredLogger) error { envName, productName := productResp.EnvName, productResp.ProductName @@ -904,7 +1024,7 @@ func updateHelmProductVariable(productResp *commonmodels.Product, oldRenderVersi } go func() { - err := updateProductVariable(productName, envName, productResp, log) + err := updateProductVariable(productName, envName, productResp, renderset, log) if err != nil { log.Errorf("[%s][P:%s] failed to update product %#v", envName, productName, err) // 发送更新产品失败消息给用户 @@ -992,14 +1112,6 @@ func UpdateMultipleHelmEnv(requestID string, args *UpdateMultiHelmProductArg, lo serviceMap[singleService.ServiceName] = singleService } - for _, requestRenderChart := range args.ChartValues { - yamlContent, err := generateValuesYaml(requestRenderChart, log) - if err != nil { - return envStatuses, e.ErrUpdateEnv.AddDesc(fmt.Sprintf("failed to get yaml content for service: %s, err %v", requestRenderChart.ServiceName, err.Error())) - } - requestRenderChart.ValuesYAML = yamlContent - } - // extract values.yaml and update renderset for envName, _ := range productMap { renderSet, _, err := commonrepo.NewRenderSetColl().FindRenderSet(&commonrepo.RenderSetFindOption{ @@ -1038,55 +1150,6 @@ func UpdateMultipleHelmEnv(requestID string, args *UpdateMultiHelmProductArg, lo return envStatuses, nil } -// UpdateMultiHelmProduct TODO need to be deprecated -func UpdateMultiHelmProduct(envNames []string, updateType, productName string, requestID string, log *zap.SugaredLogger) []*EnvStatus { - mutexUpdateMultiHelm.Lock() - defer func() { - mutexUpdateMultiHelm.Unlock() - }() - - envStatuses := make([]*EnvStatus, 0) - productsRevison, err := ListProductsRevision(productName, "", log) - if err != nil { - log.Errorf("UpdateMultiHelmProduct ListProductsRevision err:%v", err) - return envStatuses - } - productMap := make(map[string]*ProductRevision) - for _, productRevison := range productsRevison { - if productRevison.ProductName == productName && sets.NewString(envNames...).Has(productRevison.EnvName) && productRevison.Updatable { - productMap[productRevison.EnvName] = productRevison - if len(productMap) == len(envNames) { - break - } - } - } - - for envName := range productMap { - err = UpdateHelmProduct(productName, envName, updateType, setting.SystemUser, requestID, nil, log) - if err != nil { - log.Errorf("UpdateMultiHelmProduct UpdateProductV2 err:%v", err) - return envStatuses - } - } - - productResps := make([]*ProductResp, 0) - for _, envName := range envNames { - productResp, err := GetProduct(setting.SystemUser, envName, productName, log) - if err == nil && productResp != nil { - productResps = append(productResps, productResp) - } - } - - for _, productResp := range productResps { - if productResp.Error != "" { - envStatuses = append(envStatuses, &EnvStatus{EnvName: productResp.EnvName, Status: setting.ProductStatusFailed, ErrMessage: productResp.Error}) - continue - } - envStatuses = append(envStatuses, &EnvStatus{EnvName: productResp.EnvName, Status: productResp.Status}) - } - return envStatuses -} - func GetProductInfo(username, envName, productName string, log *zap.SugaredLogger) (*commonmodels.Product, error) { opt := &commonrepo.ProductFindOptions{Name: productName, EnvName: envName} prod, err := commonrepo.NewProductColl().Find(opt) @@ -2030,8 +2093,8 @@ func FindHelmRenderSet(productName, renderName string, log *zap.SugaredLogger) ( return resp, nil } -func installOrUpgradeHelmChart(namespace string, renderChart *template.RenderChart, serviceObj *commonmodels.Service, timeout time.Duration, helmClient helmclient.Client) error { - mergedValuesYaml, err := helmtool.MergeOverrideValues(renderChart.ValuesYaml, renderChart.GetOverrideYaml(), renderChart.OverrideValues) +func installOrUpgradeHelmChart(namespace string, renderChart *template.RenderChart, defaultValues string, serviceObj *commonmodels.Service, timeout time.Duration, helmClient helmclient.Client) error { + mergedValuesYaml, err := helmtool.MergeOverrideValues(renderChart.ValuesYaml, defaultValues, renderChart.GetOverrideYaml(), renderChart.OverrideValues) if err != nil { err = errors.WithMessagef(err, "failed to merge override yaml %s and values %s", renderChart.GetOverrideYaml(), renderChart.OverrideValues) return err @@ -2072,10 +2135,9 @@ func installOrUpgradeHelmChartWithValues(namespace, valuesYaml string, renderCha return nil } -func installProductHelmCharts(user, envName, requestID string, args *commonmodels.Product, eventStart int64, helmClient helmclient.Client, log *zap.SugaredLogger) { +func installProductHelmCharts(user, envName, requestID string, args *commonmodels.Product, renderset *commonmodels.RenderSet, eventStart int64, helmClient helmclient.Client, log *zap.SugaredLogger) { var ( err error - wg sync.WaitGroup errList = &multierror.Error{} ) @@ -2102,43 +2164,51 @@ func installProductHelmCharts(user, envName, requestID string, args *commonmodel return } }() + chartInfoMap := make(map[string]*template.RenderChart) for _, renderChart := range args.ChartInfos { chartInfoMap[renderChart.ServiceName] = renderChart } + + serviceList := make([]interface{}, 0) + handler := func(data interface{}, logger *zap.SugaredLogger) error { + service := data.(*commonmodels.ProductService) + // 获取服务详情 + opt := &commonrepo.ServiceFindOption{ + ServiceName: service.ServiceName, + Type: service.Type, + Revision: service.Revision, + ProductName: args.ProductName, + ExcludeStatus: setting.ProductStatusDeleting, + } + serviceObj, err := commonrepo.NewServiceColl().Find(opt) + if err != nil { + return err + } + + renderChart := chartInfoMap[service.ServiceName] + err = installOrUpgradeHelmChart(args.Namespace, renderChart, renderset.DefaultValues, serviceObj, 0, helmClient) + if err != nil { + return err + } + return nil + } + for _, serviceGroups := range args.Services { for _, svc := range serviceGroups { - renderChart, ok := chartInfoMap[svc.ServiceName] + _, ok := chartInfoMap[svc.ServiceName] if !ok { continue } - - wg.Add(1) - go func(service *commonmodels.ProductService) { - defer wg.Done() - - // 获取服务详情 - opt := &commonrepo.ServiceFindOption{ - ServiceName: service.ServiceName, - Type: service.Type, - Revision: service.Revision, - ProductName: args.ProductName, - ExcludeStatus: setting.ProductStatusDeleting, - } - serviceObj, err := commonrepo.NewServiceColl().Find(opt) - if err != nil { - return - } - - err = installOrUpgradeHelmChart(args.Namespace, renderChart, serviceObj, Timeout*time.Second*10, helmClient) - if err != nil { - errList = multierror.Append(errList, err) - return - } - }(svc) + serviceList = append(serviceList, svc) } } - wg.Wait() + + serviceGroupErr := intervalExecutor(time.Millisecond*2500, serviceList, handler, log) + if serviceGroupErr != nil { + errList = multierror.Append(errList, serviceGroupErr...) + } + err = errList.ErrorOrNil() } @@ -2202,7 +2272,31 @@ func getUpdatedProductServices(updateProduct *commonmodels.Product, serviceRevis return updatedAllServices } -func updateProductGroup(productName, envName, updateType string, productResp *commonmodels.Product, currentProductServices [][]*commonmodels.ProductService, overrideCharts []*commonservice.RenderChartArg, log *zap.SugaredLogger) error { +func intervalExecutor(interval time.Duration, serviceList []interface{}, handler func(data interface{}, log *zap.SugaredLogger) error, log *zap.SugaredLogger) []error { + if len(serviceList) == 0 { + return nil + } + wg := sync.WaitGroup{} + wg.Add(len(serviceList)) + errList := make([]error, 0) + ticker := time.NewTicker(interval) + defer ticker.Stop() + + for _, data := range serviceList { + go func() { + defer wg.Done() + err := handler(data, log) + if err != nil { + errList = append(errList, err) + } + }() + <-ticker.C + } + wg.Wait() + return errList +} + +func updateProductGroup(username, productName, envName, updateType string, productResp *commonmodels.Product, currentProductServices [][]*commonmodels.ProductService, overrideCharts []*commonservice.RenderChartArg, log *zap.SugaredLogger) error { var ( renderChartMap = make(map[string]*template.RenderChart) productServiceMap = make(map[string]*commonmodels.ProductService) @@ -2224,10 +2318,8 @@ func updateProductGroup(productName, envName, updateType string, productResp *co } } - for _, serviceGroup := range productResp.Services { - for _, service := range serviceGroup { - productTemplServiceMap[service.ServiceName] = service - } + for _, service := range productResp.GetServiceMap() { + productTemplServiceMap[service.ServiceName] = service } // 找到环境里面还存在但是服务编排里面已经删除的服务卸载掉 @@ -2239,8 +2331,8 @@ func updateProductGroup(productName, envName, updateType string, productResp *co ReleaseName: util.GeneHelmReleaseName(namespace, serviceName), Namespace: namespace, Wait: true, - Force: true, - Timeout: Timeout * time.Second * 10, + //Force: true, + //Timeout: Timeout * time.Second * 10, }); err != nil { log.Errorf("helm uninstall release %s err:%v", fmt.Sprintf("%s-%s", namespace, serviceName), err) } @@ -2249,7 +2341,7 @@ func updateProductGroup(productName, envName, updateType string, productResp *co } //比较当前环境中的变量和系统默认的最新变量 - renderSet, err := diffRenderSet(productName, envName, updateType, productResp, overrideCharts, log) + renderSet, err := diffRenderSet(username, productName, envName, updateType, productResp, overrideCharts, log) if err != nil { return e.ErrUpdateEnv.AddDesc("对比环境中的value.yaml和系统默认的value.yaml失败") } @@ -2266,47 +2358,48 @@ func updateProductGroup(productName, envName, updateType string, productResp *co renderChartMap[renderChart.ServiceName] = renderChart } + handler := func(data interface{}, log *zap.SugaredLogger) error { + service := data.(*commonmodels.ProductService) + opt := &commonrepo.ServiceFindOption{ + ServiceName: service.ServiceName, + Type: service.Type, + Revision: service.Revision, + ProductName: service.ProductName, + ExcludeStatus: setting.ProductStatusDeleting, + } + serviceObj, err := commonrepo.NewServiceColl().Find(opt) + if err != nil { + log.Errorf("failed to find service with opt %+v, err: %s", opt, err) + return errors.Wrapf(err, "failed to find template servce %s", service.ServiceName) + } + renderChart := renderChartMap[service.ServiceName] + err = installOrUpgradeHelmChart(productResp.Namespace, renderChart, renderSet.DefaultValues, serviceObj, 0, helmClient) + if err != nil { + return errors.Wrapf(err, "failed to install or upgrade service %s", service.ServiceName) + } + return nil + } + errList := new(multierror.Error) for groupIndex, services := range productResp.Services { - var wg sync.WaitGroup + serviceList := make([]interface{}, 0) for _, svc := range services { - renderChart, ok := renderChartMap[svc.ServiceName] + _, ok := renderChartMap[svc.ServiceName] if !ok { continue } - // service is not in update list if !svcNameSet.Has(svc.ServiceName) { continue } + serviceList = append(serviceList, svc) + } - wg.Add(1) - go func(service *commonmodels.ProductService) { - defer wg.Done() - - opt := &commonrepo.ServiceFindOption{ - ServiceName: service.ServiceName, - Type: service.Type, - Revision: service.Revision, - ProductName: service.ProductName, - ExcludeStatus: setting.ProductStatusDeleting, - } - serviceObj, err := commonrepo.NewServiceColl().Find(opt) - if err != nil { - log.Errorf("Failed to find service with opt %+v, err: %s", opt, err) - errList = multierror.Append(errList, err) - return - } - - err = installOrUpgradeHelmChart(productResp.Namespace, renderChart, serviceObj, Timeout*time.Second*10, helmClient) - if err != nil { - errList = multierror.Append(errList, err) - return - } - }(svc) + serviceGroupErr := intervalExecutor(time.Millisecond*2500, serviceList, handler, log) + if serviceGroupErr != nil { + errList = multierror.Append(errList, serviceGroupErr...) } - wg.Wait() if err = commonrepo.NewProductColl().UpdateGroup(envName, productName, groupIndex, services); err != nil { log.Errorf("Failed to update service group %d, err: %s", groupIndex, err) errList = multierror.Append(errList, err) @@ -2323,7 +2416,7 @@ func updateProductGroup(productName, envName, updateType string, productResp *co } // diffRenderSet 对比环境中的renderSet的值和服务的最新的renderSet的值 -func diffRenderSet(productName, envName, updateType string, productResp *commonmodels.Product, overrideCharts []*commonservice.RenderChartArg, log *zap.SugaredLogger) (*commonmodels.RenderSet, error) { +func diffRenderSet(username, productName, envName, updateType string, productResp *commonmodels.Product, overrideCharts []*commonservice.RenderChartArg, log *zap.SugaredLogger) (*commonmodels.RenderSet, error) { productTemp, err := templaterepo.NewProductColl().Find(productName) if err != nil { log.Errorf("[ProductTmpl.find] err: %v", err) @@ -2350,7 +2443,7 @@ func diffRenderSet(productName, envName, updateType string, productResp *commonm } newChartInfos := make([]*template.RenderChart, 0) - renderSetName := productResp.Namespace + defaultValues := "" switch updateType { case UpdateTypeSystem: for _, serviceNameGroup := range productTemp.Services { @@ -2361,12 +2454,13 @@ func diffRenderSet(productName, envName, updateType string, productResp *commonm } } case UpdateTypeEnv: - renderSetOpt := &commonrepo.RenderSetFindOption{Name: renderSetName, Revision: productResp.Render.Revision} + renderSetOpt := &commonrepo.RenderSetFindOption{Name: productResp.Render.Name, Revision: productResp.Render.Revision} currentEnvRenderSet, err := commonrepo.NewRenderSetColl().Find(renderSetOpt) if err != nil { log.Errorf("[RenderSet.find] err: %v", err) return nil, err } + defaultValues = currentEnvRenderSet.DefaultValues // 环境里面的变量 currentEnvRenderSetMap := make(map[string]*template.RenderChart) @@ -2388,13 +2482,23 @@ func diffRenderSet(productName, envName, updateType string, productResp *commonm } } + serviceMap := productResp.GetServiceMap() for serviceName, latestChartInfo := range tmpLatestChartInfoMap { if currentChartInfo, ok := tmpCurrentChartInfoMap[serviceName]; ok { + serviceInfo := serviceMap[serviceName] + imageRelatedKey := sets.NewString() + if serviceInfo != nil { + for _, container := range serviceInfo.Containers { + if container.ImagePath != nil { + imageRelatedKey.Insert(container.ImagePath.Image, container.ImagePath.Repo, container.ImagePath.Tag) + } + } + } + //拿当前环境values.yaml的key的value去替换服务里面的values.yaml的相同的key的value - //TODO values.yaml should be the same in both currentChartInfo and latestChartInfo, since values.yaml can't be edited directly - newValuesYaml, err := overrideValues([]byte(currentChartInfo.ValuesYaml), []byte(latestChartInfo.ValuesYaml)) + newValuesYaml, err := overrideValues([]byte(currentChartInfo.ValuesYaml), []byte(latestChartInfo.ValuesYaml), imageRelatedKey) if err != nil { - log.Errorf("Failed to override values, err: %s", err) + log.Errorf("Failed to override values for service %s, err: %s", serviceName, err) } else { latestChartInfo.ValuesYaml = string(newValuesYaml) } @@ -2413,10 +2517,12 @@ func diffRenderSet(productName, envName, updateType string, productResp *commonm if err = commonservice.CreateHelmRenderSet( &commonmodels.RenderSet{ - Name: renderSetName, - EnvName: envName, - ProductTmpl: productName, - ChartInfos: newChartInfos, + Name: productResp.Render.Name, + EnvName: envName, + ProductTmpl: productName, + ChartInfos: newChartInfos, + DefaultValues: defaultValues, + UpdateBy: username, }, log, ); err != nil { @@ -2424,7 +2530,7 @@ func diffRenderSet(productName, envName, updateType string, productResp *commonm return nil, err } - renderSet, err := FindHelmRenderSet(productName, renderSetName, log) + renderSet, err := FindHelmRenderSet(productName, productResp.Render.Name, log) if err != nil { log.Errorf("[RenderSet.find] err: %v", err) return nil, err @@ -2432,7 +2538,9 @@ func diffRenderSet(productName, envName, updateType string, productResp *commonm return renderSet, nil } -func overrideValues(currentValuesYaml, latestValuesYaml []byte) ([]byte, error) { +// for keys exist in both yaml, current values will override latest values +// only for images +func overrideValues(currentValuesYaml, latestValuesYaml []byte, imageRelatedKey sets.String) ([]byte, error) { currentValuesMap := map[string]interface{}{} if err := yaml.Unmarshal(currentValuesYaml, ¤tValuesMap); err != nil { return nil, err @@ -2455,6 +2563,9 @@ func overrideValues(currentValuesYaml, latestValuesYaml []byte) ([]byte, error) replaceMap := make(map[string]interface{}) for key := range latestValuesFlatMap { + if !imageRelatedKey.Has(key) { + continue + } if currentValue, ok := currentValuesFlatMap[key]; ok { replaceMap[key] = currentValue } @@ -2476,7 +2587,7 @@ func overrideValues(currentValuesYaml, latestValuesYaml []byte) ([]byte, error) return yaml.Marshal(latestValuesMap) } -func updateProductVariable(productName, envName string, productResp *commonmodels.Product, log *zap.SugaredLogger) error { +func updateProductVariable(productName, envName string, productResp *commonmodels.Product, renderset *commonmodels.RenderSet, log *zap.SugaredLogger) error { restConfig, err := kube.GetRESTConfig(productResp.ClusterID) if err != nil { return e.ErrUpdateEnv.AddErr(err) @@ -2492,12 +2603,23 @@ func updateProductVariable(productName, envName string, productResp *commonmodel renderChartMap[renderChart.ServiceName] = renderChart } + handler := func(data interface{}, log *zap.SugaredLogger) error { + service := data.(*commonmodels.Service) + renderChart := renderChartMap[service.ServiceName] + err = installOrUpgradeHelmChart(productResp.Namespace, renderChart, renderset.DefaultValues, service, 0, helmClient) + if err != nil { + return errors.Wrapf(err, "failed to upgrade service %s", service.ServiceName) + } + return err + } + errList := new(multierror.Error) for groupIndex, services := range productResp.Services { + serviceList := make([]interface{}, 0) var wg sync.WaitGroup groupServices := make([]*commonmodels.ProductService, 0) for _, service := range services { - if renderChart, isExist := renderChartMap[service.ServiceName]; isExist { + if _, isExist := renderChartMap[service.ServiceName]; isExist { opt := &commonrepo.ServiceFindOption{ ServiceName: service.ServiceName, Type: service.Type, @@ -2507,19 +2629,15 @@ func updateProductVariable(productName, envName string, productResp *commonmodel } serviceObj, err := commonrepo.NewServiceColl().Find(opt) if err != nil { - log.Errorf("finded to find service %s, err %s", service.ServiceName, err.Error()) + log.Errorf("failed to find service %s, err %s", service.ServiceName, err.Error()) continue } - wg.Add(1) - go func(tmpRenderChart *template.RenderChart, currentService *commonmodels.Service) { - defer wg.Done() - - err = installOrUpgradeHelmChart(productResp.Namespace, renderChart, currentService, Timeout*time.Second*10, helmClient) - if err != nil { - errList = multierror.Append(errList, err) - return - } - }(renderChart, serviceObj) + serviceList = append(serviceList, serviceObj) + + groupServiceErr := intervalExecutor(time.Millisecond*2500, serviceList, handler, log) + if groupServiceErr != nil { + errList = multierror.Append(errList, groupServiceErr...) + } } groupServices = append(groupServices, service) } diff --git a/pkg/microservice/aslan/core/environment/service/environment_creator.go b/pkg/microservice/aslan/core/environment/service/environment_creator.go index 45a58c968..f8c5a8d64 100644 --- a/pkg/microservice/aslan/core/environment/service/environment_creator.go +++ b/pkg/microservice/aslan/core/environment/service/environment_creator.go @@ -217,7 +217,7 @@ func (creator *HelmProductCreator) Create(user, requestID string, args *models.P eventStart := time.Now().Unix() - go installProductHelmCharts(user, args.EnvName, requestID, args, eventStart, helmClient, log) + go installProductHelmCharts(user, args.EnvName, requestID, args, renderSet, eventStart, helmClient, log) return nil } diff --git a/pkg/microservice/aslan/core/environment/service/image.go b/pkg/microservice/aslan/core/environment/service/image.go index 34589fe24..f44cc3120 100644 --- a/pkg/microservice/aslan/core/environment/service/image.go +++ b/pkg/microservice/aslan/core/environment/service/image.go @@ -275,7 +275,7 @@ func updateContainerForHelmChart(serviceName, resType, image, containerName stri targetChart.ValuesYaml = replacedValuesYaml // merge override values and kvs into service's yaml - mergedValuesYaml, err = helmtool.MergeOverrideValues(replacedValuesYaml, targetChart.GetOverrideYaml(), targetChart.OverrideValues) + mergedValuesYaml, err = helmtool.MergeOverrideValues(replacedValuesYaml, renderSet.DefaultValues, targetChart.GetOverrideYaml(), targetChart.OverrideValues) if err != nil { return err } diff --git a/pkg/microservice/aslan/core/environment/service/renderset.go b/pkg/microservice/aslan/core/environment/service/renderset.go index 5bd11d007..f87764d21 100644 --- a/pkg/microservice/aslan/core/environment/service/renderset.go +++ b/pkg/microservice/aslan/core/environment/service/renderset.go @@ -21,21 +21,31 @@ import ( "strings" "sync" - "github.com/pkg/errors" + "go.mongodb.org/mongo-driver/mongo" "go.uber.org/zap" - "gopkg.in/yaml.v3" "k8s.io/apimachinery/pkg/util/sets" - commonmodels "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/models" "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/models/template" commonrepo "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/mongodb" commonservice "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service" fsservice "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/fs" - "github.com/koderover/zadig/pkg/setting" - e "github.com/koderover/zadig/pkg/tool/errors" yamlutil "github.com/koderover/zadig/pkg/util/yaml" + "github.com/pkg/errors" ) +type DefaultValuesResp struct { + DefaultValues string `json:"defaultValues"` +} + +type YamlContentRequestArg struct { + CodehostID int `json:"codehostID" form:"codehostID"` + Owner string `json:"owner" form:"owner"` + Repo string `json:"repo" form:"repo"` + Branch string `json:"branch" form:"branch"` + RepoLink string `json:"repoLink" form:"repoLink"` + ValuesPaths string `json:"valuesPaths" form:"valuesPaths"` +} + func GetRenderCharts(productName, envName, serviceName string, log *zap.SugaredLogger) ([]*commonservice.RenderChartArg, error) { renderSetName := commonservice.GetProductEnvNamespace(envName, productName, "") @@ -77,158 +87,81 @@ func GetRenderCharts(productName, envName, serviceName string, log *zap.SugaredL return ret, nil } -// validate yaml content -func validateYamlContent(yamlContent string) error { - tMap := map[string]interface{}{} - if err := yaml.Unmarshal([]byte(yamlContent), &tMap); err != nil { - if err != nil { - return errors.New("yaml content illegal") - } - } - return nil -} - -func generateValuesYaml(args *commonservice.RenderChartArg, log *zap.SugaredLogger) (string, error) { - if args.YamlSource == setting.ValuesYamlSourceFreeEdit { - return args.ValuesYAML, validateYamlContent(args.ValuesYAML) - } else if args.YamlSource == setting.ValuesYamlSourceGitRepo { - if args.GitRepoConfig == nil { - return "", errors.New("invalid repo config") - } - var ( - allValues []byte - fileContentMap sync.Map - wg sync.WaitGroup - err error - ) - - for index, filePath := range args.GitRepoConfig.ValuesPaths { - wg.Add(1) - go func(index int, path string) { - defer wg.Done() - fileContent, err1 := fsservice.DownloadFileFromSource( - &fsservice.DownloadFromSourceArgs{ - CodehostID: args.GitRepoConfig.CodehostID, - Owner: args.GitRepoConfig.Owner, - Repo: args.GitRepoConfig.Repo, - Path: path, - Branch: args.GitRepoConfig.Branch, - }) - if err1 != nil { - err = errors.Errorf("fail to download file from git, err: %s, path: %s, repo: %v", err1.Error(), path, *args.GitRepoConfig) - return - } - fileContentMap.Store(index, fileContent) - }(index, filePath) - } - wg.Wait() - - if err != nil { - return "", err - } - - allValueYamls := make([][]byte, len(args.GitRepoConfig.ValuesPaths), len(args.GitRepoConfig.ValuesPaths)) - for i := 0; i < len(args.GitRepoConfig.ValuesPaths); i++ { - contentObj, _ := fileContentMap.Load(i) - allValueYamls[i] = contentObj.([]byte) - } - allValues, err = yamlutil.Merge(allValueYamls) - if err != nil { - return "", errors.Errorf("failed to merge yaml files, repo: %v", *args.GitRepoConfig) - } - return string(allValues), nil - } - return "", nil -} - -func CreateOrUpdateChartValues(productName, envName string, args *commonservice.RenderChartArg, userName, requestID string, log *zap.SugaredLogger) error { +func GetDefaultValues(productName, envName string, log *zap.SugaredLogger) (*DefaultValuesResp, error) { + ret := &DefaultValuesResp{} - serviceName := args.ServiceName - - serviceOpt := &commonrepo.ServiceFindOption{ - ProductName: productName, - ServiceName: serviceName, - Type: setting.HelmDeployType, + productInfo, err := commonrepo.NewProductColl().Find(&commonrepo.ProductFindOptions{ + Name: productName, + EnvName: envName, + }) + if err == mongo.ErrNoDocuments { + return ret, nil } - serviceObj, err := commonrepo.NewServiceColl().Find(serviceOpt) if err != nil { - return e.ErrCreateRenderSet.AddDesc(fmt.Sprintf("failed to get service %s", err.Error())) - } - if serviceObj == nil { - return e.ErrCreateRenderSet.AddDesc("service not found") + log.Errorf("failed to query product info, productName %s envName %s err %s", productName, envName, err) + return nil, fmt.Errorf("failed to query product info, productName %s envName %s", productName, envName) } - if serviceObj.HelmChart == nil { - return e.ErrCreateRenderSet.AddDesc("missing helm chart info") + if productInfo.Render == nil { + return nil, fmt.Errorf("invalid product, nil render data") } - yamlContent, err := generateValuesYaml(args, log) - if err != nil { - return e.ErrCreateRenderSet.AddDesc(err.Error()) + opt := &commonrepo.RenderSetFindOption{ + Name: productInfo.Render.Name, + Revision: productInfo.Render.Revision, } - args.ValuesYAML = yamlContent - - renderSetName := commonservice.GetProductEnvNamespace(envName, productName, "") - - opt := &commonrepo.RenderSetFindOption{Name: renderSetName} - curRenderset, found, err := commonrepo.NewRenderSetColl().FindRenderSet(opt) + rendersetObj, existed, err := commonrepo.NewRenderSetColl().FindRenderSet(opt) if err != nil { - return e.ErrCreateRenderSet.AddDesc(fmt.Sprintf("failed to get renderset %s", err.Error())) - } - - if !found { - curRenderset = &commonmodels.RenderSet{ - Name: renderSetName, - EnvName: envName, - ProductTmpl: productName, - UpdateBy: userName, - IsDefault: false, - } - } - - //update or insert service values.yaml - var targetChartInfo *template.RenderChart - for _, singleChart := range curRenderset.ChartInfos { - if singleChart.ServiceName != serviceName { - continue - } - args.FillRenderChartModel(singleChart, singleChart.ChartVersion) - targetChartInfo = singleChart - break + log.Errorf("failed to query renderset info, name %s err %s", productInfo.Render.Name, err) + return nil, err } - if targetChartInfo == nil { - targetChartInfo = new(template.RenderChart) - targetChartInfo.ValuesYaml = serviceObj.HelmChart.ValuesYaml - args.FillRenderChartModel(targetChartInfo, serviceObj.HelmChart.Version) - curRenderset.ChartInfos = append(curRenderset.ChartInfos, targetChartInfo) + if !existed { + return ret, nil } + ret.DefaultValues = rendersetObj.DefaultValues + return ret, nil +} - //create new renderset with increased revision - err = commonservice.CreateHelmRenderSet( - curRenderset, - log, +func GetMergedYamlContent(arg *YamlContentRequestArg, paths []string) (string, error) { + var ( + fileContentMap sync.Map + wg sync.WaitGroup + err error ) - - if err != nil { - return e.ErrCreateRenderSet.AddDesc(err.Error()) + for i, filePath := range paths { + wg.Add(1) + go func(index int, path string) { + defer wg.Done() + fileContent, errDownload := fsservice.DownloadFileFromSource( + &fsservice.DownloadFromSourceArgs{ + CodehostID: arg.CodehostID, + Owner: arg.Owner, + Repo: arg.Repo, + Path: path, + Branch: arg.Branch, + RepoLink: arg.RepoLink, + }) + if errDownload != nil { + err = errors.Wrapf(errDownload, fmt.Sprintf("failed to download file from git, path %s", path)) + return + } + fileContentMap.Store(index, fileContent) + }(i, filePath) } - return err -} + wg.Wait() -func ensureHelmRenderSetArgs(args *commonmodels.RenderSet) error { - if args == nil { - return errors.New("nil RenderSet") + if err != nil { + return "", err } - if len(args.Name) == 0 { - return errors.New("empty render set name") + contentArr := make([][]byte, 0, len(paths)) + for i := 0; i < len(paths); i++ { + contentObj, _ := fileContentMap.Load(i) + contentArr = append(contentArr, contentObj.([]byte)) } - // 设置新的版本号 - rev, err := commonrepo.NewCounterColl().GetNextSeq("renderset:" + args.Name) + ret, err := yamlutil.Merge(contentArr) if err != nil { - return fmt.Errorf("get next render set revision error: %v", err) + return "", errors.Wrapf(err, "failed to merge files") } - - args.Revision = rev - return nil + return string(ret), nil } diff --git a/pkg/microservice/aslan/core/project/handler/router.go b/pkg/microservice/aslan/core/project/handler/router.go index d0131340c..d8a5c4d17 100644 --- a/pkg/microservice/aslan/core/project/handler/router.go +++ b/pkg/microservice/aslan/core/project/handler/router.go @@ -44,9 +44,9 @@ func (*Router) Inject(router *gin.RouterGroup) { product.POST("", gin2.UpdateOperationLogStatus, CreateProductTemplate) product.PUT("/:name", gin2.UpdateOperationLogStatus, UpdateProductTemplate) product.PUT("/:name/:status", gin2.UpdateOperationLogStatus, UpdateProductTmplStatus) + product.PATCH("/:name", gin2.UpdateOperationLogStatus, UpdateServiceOrchestration) product.PUT("", gin2.UpdateOperationLogStatus, UpdateProject) product.DELETE("/:name", gin2.UpdateOperationLogStatus, DeleteProductTemplate) - product.PATCH("/:name", UpdateServiceOrchestration) } openSource := router.Group("opensource") diff --git a/pkg/microservice/aslan/core/project/service/product.go b/pkg/microservice/aslan/core/project/service/product.go index cabd3fc5a..29010f333 100644 --- a/pkg/microservice/aslan/core/project/service/product.go +++ b/pkg/microservice/aslan/core/project/service/product.go @@ -393,7 +393,12 @@ func DeleteProductTemplate(userName, productName, requestID string, log *zap.Sug commonrepo.NewWorkLoadsStatColl().UpdateWorkloads(v) } }() - + // delete servicesInExternalEnv data + go func() { + _ = commonrepo.NewServicesInExternalEnvColl().Delete(&commonrepo.ServicesInExternalEnvArgs{ + ProductName: productName, + }) + }() return nil } diff --git a/pkg/microservice/aslan/core/service.go b/pkg/microservice/aslan/core/service.go index 90555c129..b0b15a8c4 100644 --- a/pkg/microservice/aslan/core/service.go +++ b/pkg/microservice/aslan/core/service.go @@ -199,6 +199,10 @@ func initDatabase() { commonrepo.NewWorkflowColl(), commonrepo.NewWorkflowStatColl(), commonrepo.NewWorkLoadsStatColl(), + commonrepo.NewServicesInExternalEnvColl(), + + templaterepo.NewChartColl(), + templaterepo.NewDockerfileTemplateColl(), templaterepo.NewChartColl(), templaterepo.NewDockerfileTemplateColl(), diff --git a/pkg/microservice/aslan/core/service/service/helm.go b/pkg/microservice/aslan/core/service/service/helm.go index 5cf4e4dd0..d0f1fa952 100644 --- a/pkg/microservice/aslan/core/service/service/helm.go +++ b/pkg/microservice/aslan/core/service/service/helm.go @@ -46,6 +46,7 @@ import ( "github.com/koderover/zadig/pkg/microservice/aslan/core/templatestore/repository/mongodb" "github.com/koderover/zadig/pkg/setting" "github.com/koderover/zadig/pkg/shared/codehost" + "github.com/koderover/zadig/pkg/shared/poetry" e "github.com/koderover/zadig/pkg/tool/errors" "github.com/koderover/zadig/pkg/tool/log" "github.com/koderover/zadig/pkg/types" @@ -53,19 +54,9 @@ import ( ) type HelmService struct { - Services []*models.Service `json:"services"` - FileInfos []*types.FileInfo `json:"file_infos"` -} - -type HelmServiceReq struct { - ProductName string `json:"product_name"` - CreateBy string `json:"create_by"` - CodehostID int `json:"codehost_id"` - RepoOwner string `json:"repo_owner"` - RepoName string `json:"repo_name"` - BranchName string `json:"branch_name"` - FilePaths []string `json:"file_paths"` - SrcPath string `json:"src_path"` + ServiceInfos []*models.Service `json:"service_infos"` + FileInfos []*types.FileInfo `json:"file_infos"` + Services [][]string `json:"services"` } type HelmServiceArgs struct { @@ -96,7 +87,7 @@ type Chart struct { type helmServiceCreationArgs struct { ChartName string ChartVersion string - ValuesYAML string + MergedValues string ServiceName string FilePath string ProductName string @@ -122,8 +113,9 @@ type ChartTemplateData struct { func ListHelmServices(productName string, log *zap.SugaredLogger) (*HelmService, error) { helmService := &HelmService{ - Services: []*models.Service{}, - FileInfos: []*types.FileInfo{}, + ServiceInfos: []*models.Service{}, + FileInfos: []*types.FileInfo{}, + Services: [][]string{}, } opt := &commonrepo.ServiceListOption{ @@ -136,7 +128,7 @@ func ListHelmServices(productName string, log *zap.SugaredLogger) (*HelmService, log.Errorf("[helmService.list] err:%v", err) return nil, e.ErrListTemplate.AddErr(err) } - helmService.Services = services + helmService.ServiceInfos = services if len(services) > 0 { fis, err := loadServiceFileInfos(services[0].ProductName, services[0].ServiceName, "") @@ -146,6 +138,13 @@ func ListHelmServices(productName string, log *zap.SugaredLogger) (*HelmService, } helmService.FileInfos = fis } + project, err := templaterepo.NewProductColl().Find(productName) + if err != nil { + log.Errorf("Failed to find project info, err: %s", err) + return nil, e.ErrListTemplate.AddErr(err) + } + helmService.Services = project.Services + return helmService, nil } @@ -266,21 +265,6 @@ func CreateOrUpdateHelmServiceFromChartTemplate(projectName string, args *HelmSe values = append(values, templateChartInfo.DefaultValuesYAML) } - for _, path := range templateArgs.ValuesPaths { - v, err := fsservice.DownloadFileFromSource(&fsservice.DownloadFromSourceArgs{ - CodehostID: templateArgs.CodehostID, - Owner: templateArgs.Owner, - Repo: templateArgs.Repo, - Path: path, - Branch: templateArgs.Branch, - }) - if err != nil { - return err - } - - values = append(values, v) - } - if len(templateArgs.ValuesYAML) > 0 { values = append(values, []byte(templateArgs.ValuesYAML)) } @@ -291,6 +275,11 @@ func CreateOrUpdateHelmServiceFromChartTemplate(projectName string, args *HelmSe // copy template to service path and update the values.yaml from := filepath.Join(localBase, base) to := filepath.Join(config.LocalServicePath(projectName, args.Name), args.Name) + // remove old files + if err = os.RemoveAll(to); err != nil { + logger.Errorf("Failed to remove dir %s, err: %s", to, err) + return err + } if err = copy.Copy(from, to); err != nil { logger.Errorf("Failed to copy file from %s to %s, err: %s", from, to, err) return err @@ -319,18 +308,13 @@ func CreateOrUpdateHelmServiceFromChartTemplate(projectName string, args *HelmSe &helmServiceCreationArgs{ ChartName: templateChartInfo.ChartName, ChartVersion: templateChartInfo.ChartVersion, - ValuesYAML: string(merged), + MergedValues: string(merged), ServiceName: args.Name, FilePath: to, ProductName: projectName, CreateBy: args.CreatedBy, - CodehostID: templateArgs.CodehostID, - Owner: templateArgs.Owner, - Repo: templateArgs.Repo, - Branch: templateArgs.Branch, Source: setting.SourceFromChartTemplate, HelmTemplateName: templateArgs.TemplateName, - ValuePaths: templateArgs.ValuesPaths, ValuesYaml: templateArgs.ValuesYAML, }, logger, @@ -352,16 +336,16 @@ func CreateOrUpdateHelmServiceFromChartTemplate(projectName string, args *HelmSe return nil } -func getCodehostType(repoArgs *CreateFromRepo, repoLink string) (string, error) { +func getCodehostType(repoArgs *CreateFromRepo, repoLink string) (string, *poetry.CodeHost, error) { if repoLink != "" { - return setting.SourceFromPublicRepo, nil + return setting.SourceFromPublicRepo, nil, nil } ch, err := codehost.GetCodeHostInfoByID(repoArgs.CodehostID) if err != nil { log.Errorf("Failed to get codeHost by id %d, err: %s", repoArgs.CodehostID, err.Error()) - return "", err + return "", ch, err } - return ch.Type, nil + return ch.Type, ch, nil } func CreateOrUpdateHelmServiceFromGitRepo(projectName string, args *HelmServiceCreationArgs, log *zap.SugaredLogger) error { @@ -383,7 +367,7 @@ func CreateOrUpdateHelmServiceFromGitRepo(projectName string, args *HelmServiceC repoLink = publicArgs.RepoLink } - source, err := getCodehostType(repoArgs, repoLink) + source, codehostInfo, err := getCodehostType(repoArgs, repoLink) if err != nil { log.Errorf("Failed to get source form repo data %+v, err: %s", *repoArgs, err.Error()) return err @@ -423,7 +407,7 @@ func CreateOrUpdateHelmServiceFromGitRepo(projectName string, args *HelmServiceC if err != nil { return serviceName, err } - valuesYAML, _, err = readValuesYAML(afero.NewIOFS(chartTree), filepath.Base(filePath), log) + valuesYAML, err = readValuesYAML(afero.NewIOFS(chartTree), filepath.Base(filePath), log) return serviceName, err }) if err != nil { @@ -441,12 +425,16 @@ func CreateOrUpdateHelmServiceFromGitRepo(projectName string, args *HelmServiceC return } + if source != setting.SourceFromPublicRepo && codehostInfo != nil { + repoLink = fmt.Sprintf("%s/%s/%s/%s/%s/%s", codehostInfo.Address, repoArgs.Owner, repoArgs.Repo, "tree", repoArgs.Branch, filePath) + } + svc, err := createOrUpdateHelmService( fsTree, &helmServiceCreationArgs{ ChartName: serviceName, ChartVersion: chartVersion, - ValuesYAML: string(valuesYAML), + MergedValues: string(valuesYAML), ServiceName: serviceName, FilePath: filePath, ProductName: projectName, @@ -588,6 +576,11 @@ func handleSingleService(projectName string, repoConfig *commonservice.RepoConfi serviceName = strings.TrimSuffix(serviceName, filepath.Ext(serviceName)) to := filepath.Join(config.LocalServicePath(projectName, serviceName), serviceName) + // remove old files + if err = os.RemoveAll(to); err != nil { + logger.Errorf("Failed to remove dir %s, err: %s", to, err) + return nil, err + } if err = copy.Copy(fromPath, to); err != nil { logger.Errorf("Failed to copy file from %s to %s, err: %s", fromPath, to, err) return nil, err @@ -611,7 +604,7 @@ func handleSingleService(projectName string, repoConfig *commonservice.RepoConfi &helmServiceCreationArgs{ ChartName: templateChartData.ChartName, ChartVersion: templateChartData.ChartVersion, - ValuesYAML: string(mergedValues), + MergedValues: string(mergedValues), ServiceName: serviceName, FilePath: to, ProductName: projectName, @@ -620,7 +613,7 @@ func handleSingleService(projectName string, repoConfig *commonservice.RepoConfi Source: setting.SourceFromChartTemplate, HelmTemplateName: templateChartData.TemplateName, ValuePaths: []string{path}, - ValuesYaml: string(templateChartData.DefaultValuesYAML), + ValuesYaml: string(valuesYAML), }, logger, ) @@ -651,20 +644,13 @@ func readChartYAML(chartTree fs.FS, base string, logger *zap.SugaredLogger) (str return chart.Name, chart.Version, nil } -func readValuesYAML(chartTree fs.FS, base string, logger *zap.SugaredLogger) ([]byte, map[string]interface{}, error) { +func readValuesYAML(chartTree fs.FS, base string, logger *zap.SugaredLogger) ([]byte, error) { content, err := fs.ReadFile(chartTree, filepath.Join(base, setting.ValuesYaml)) if err != nil { logger.Errorf("Failed to read %s, err: %s", setting.ValuesYaml, err) - return nil, nil, err - } - - valuesMap := make(map[string]interface{}) - if err = yaml.Unmarshal(content, &valuesMap); err != nil { - logger.Errorf("Failed to unmarshal yaml %s, err: %s", setting.ValuesYaml, err) - return nil, nil, err + return nil, err } - - return content, valuesMap, nil + return content, nil } func geneCreationDetail(args *helmServiceCreationArgs) interface{} { @@ -672,8 +658,7 @@ func geneCreationDetail(args *helmServiceCreationArgs) interface{} { case setting.SourceFromGitlab, setting.SourceFromGithub, setting.SourceFromGerrit, - setting.SourceFromCodeHub, - setting.SourceFromIlyshin: + setting.SourceFromCodeHub: return &models.CreateFromRepo{ GitRepoConfig: &templatemodels.GitRepoConfig{ CodehostID: args.CodehostID, @@ -689,24 +674,8 @@ func geneCreationDetail(args *helmServiceCreationArgs) interface{} { LoadPath: args.FilePath, } case setting.SourceFromChartTemplate: - var yamlData *template.CustomYaml - if args.CodehostID > 0 { - yamlData = &template.CustomYaml{ - YamlSource: setting.ValuesYamlSourceGitRepo, - YamlContent: "", - GitRepoConfig: &templatemodels.GitRepoConfig{ - CodehostID: args.CodehostID, - Owner: args.Owner, - Repo: args.Repo, - Branch: args.Branch, - }, - ValuesPaths: args.ValuePaths, - } - } else if len(args.ValuesYaml) > 0 { - yamlData = &template.CustomYaml{ - YamlSource: setting.ValuesYamlSourceFreeEdit, - YamlContent: args.ValuesYaml, - } + yamlData := &template.CustomYaml{ + YamlContent: args.ValuesYaml, } return &models.CreateFromChartTemplate{ @@ -725,12 +694,13 @@ func createOrUpdateHelmService(fsTree fs.FS, args *helmServiceCreationArgs, logg return nil, err } - values, valuesMap, err := readValuesYAML(fsTree, args.ServiceName, logger) + valuesYaml := args.MergedValues + valuesMap := make(map[string]interface{}) + err = yaml.Unmarshal([]byte(valuesYaml), &valuesMap) if err != nil { - logger.Errorf("Failed to read values.yaml, err %s", err) + logger.Errorf("Failed to unmarshall yaml, err %s", err) return nil, err } - valuesYaml := string(values) serviceTemplate := fmt.Sprintf(setting.ServiceTemplateCounterName, args.ServiceName, args.ProductName) rev, err := commonrepo.NewCounterColl().GetNextSeq(serviceTemplate) diff --git a/pkg/microservice/aslan/core/service/service/loader.go b/pkg/microservice/aslan/core/service/service/loader.go index 6fc46294e..4c9434afe 100644 --- a/pkg/microservice/aslan/core/service/service/loader.go +++ b/pkg/microservice/aslan/core/service/service/loader.go @@ -23,7 +23,6 @@ import ( "io/ioutil" "os" "path" - "path/filepath" "strings" "github.com/google/go-github/v35/github" @@ -40,7 +39,6 @@ import ( "github.com/koderover/zadig/pkg/tool/codehub" e "github.com/koderover/zadig/pkg/tool/errors" "github.com/koderover/zadig/pkg/tool/gerrit" - "github.com/koderover/zadig/pkg/tool/ilyshin" "github.com/koderover/zadig/pkg/tool/log" "github.com/koderover/zadig/pkg/util" ) @@ -67,8 +65,6 @@ func PreloadServiceFromCodeHost(codehostID int, repoOwner, repoName, repoUUID, b ret, err = preloadGerritService(ch, repoName, branchName, remoteName, path, isDir) case setting.SourceFromCodeHub: ret, err = preloadCodehubService(ch, repoName, repoUUID, branchName, path, isDir) - case setting.SourceFromIlyshin: - ret, err = preloadIlyshinService(ch, repoOwner, repoName, branchName, path, isDir) default: return nil, e.ErrPreloadServiceTemplate.AddDesc("Not supported code source") } @@ -90,8 +86,6 @@ func LoadServiceFromCodeHost(username string, codehostID int, repoOwner, repoNam return loadGerritService(username, ch, repoOwner, repoName, branchName, remoteName, args, log) case setting.SourceFromCodeHub: return loadCodehubService(username, ch, repoOwner, repoName, repoUUID, branchName, args, log) - case setting.SourceFromIlyshin: - return loadIlyshinService(username, ch, repoOwner, repoName, branchName, args, log) default: return e.ErrLoadServiceTemplate.AddDesc("unsupported code source") } @@ -113,8 +107,6 @@ func ValidateServiceUpdate(codehostID int, serviceName, repoOwner, repoName, rep return validateServiceUpdateGerrit(detail, serviceName, repoName, branchName, remoteName, path, isDir) case setting.SourceFromCodeHub: return validateServiceUpdateCodehub(detail, serviceName, repoName, repoUUID, branchName, path, isDir) - case setting.SourceFromIlyshin: - return validateServiceUpdateIlyshin(detail, serviceName, repoOwner, repoName, branchName, path, isDir) default: return e.ErrValidateServiceUpdate.AddDesc("Not supported code source") } @@ -246,64 +238,6 @@ func preloadCodehubService(detail *poetry.CodeHost, repoName, repoUUID, branchNa return ret, nil } -// 根据 repo 信息获取 ilyshin 可以加载的服务列表 -func preloadIlyshinService(detail *poetry.CodeHost, repoOwner, repoName, branchName, path string, isDir bool) ([]string, error) { - ret := make([]string, 0) - - ilyshinClient := ilyshin.NewClient(detail.Address, detail.AccessToken) - // 非文件夹情况下直接获取文件信息 - if !isDir { - if !isYaml(path) { - return ret, e.ErrPreloadServiceTemplate.AddDesc("File is not of type yaml or yml, select again") - } - fileInfo, err := ilyshinClient.GetFile(repoOwner, repoName, branchName, path) - if err != nil { - log.Errorf("Failed to get file info from ilyshin with path: %s, the error is %+v", path, err) - return ret, e.ErrPreloadServiceTemplate.AddDesc(err.Error()) - } - extension := filepath.Ext(fileInfo.FileName) - fileName := fileInfo.FileName[0 : len(fileInfo.FileName)-len(extension)] - ret = append(ret, fileName) - return ret, nil - } - - treeInfo, err := ilyshinClient.ListTree(repoOwner, repoName, branchName, path) - if err != nil { - log.Errorf("Failed to get dir content from ilyshin with path: %s, the error is: %+v", path, err) - return ret, e.ErrPreloadServiceTemplate.AddDesc(err.Error()) - } - if isValidIlyshinServiceDir(treeInfo) { - svcName := path - if path == "" { - svcName = repoName - } - pathList := strings.Split(svcName, "/") - folderName := pathList[len(pathList)-1] - ret = append(ret, folderName) - return ret, nil - } - isGrandparent := false - for _, entry := range treeInfo { - if entry.Type == "tree" { - subtreeInfo, err := ilyshinClient.ListTree(repoOwner, repoName, branchName, path) - if err != nil { - log.Errorf("Failed to get dir content from ilyshin with path: %s, the error is: %+v", path, err) - return ret, e.ErrPreloadServiceTemplate.AddDesc(err.Error()) - } - if isValidIlyshinServiceDir(subtreeInfo) { - isGrandparent = true - ret = append(ret, entry.Name) - } - } - } - if !isGrandparent { - log.Errorf("invalid folder selected since no yaml is presented in path: %s", path) - return ret, e.ErrPreloadServiceTemplate.AddDesc("所选路径下没有yaml,请重新选择") - } - - return ret, nil -} - // 根据repo信息从gerrit加载服务 func loadGerritService(username string, ch *poetry.CodeHost, repoOwner, repoName, branchName, remoteName string, args *LoadServiceReq, log *zap.SugaredLogger) error { base := path.Join(config.S3StoragePath(), repoName) @@ -569,124 +503,6 @@ func loadServiceFromCodehub(client *codehub.CodeHubClient, tree []*codehub.TreeN return err } -// 根据 repo 信息从 Ilyshin 加载服务 -func loadIlyshinService(username string, ch *poetry.CodeHost, repoOwner, repoName, branchName string, args *LoadServiceReq, log *zap.SugaredLogger) error { - ilyshinClient := ilyshin.NewClient(ch.Address, ch.AccessToken) - repoInfo := fmt.Sprintf("%s/%s", repoOwner, repoName) - if !args.LoadFromDir { - file, err := ilyshinClient.GetFile(repoOwner, repoName, branchName, args.LoadPath) - if err != nil { - log.Errorf("Failed to get file info for path: %s from ilyshin, the error is: %+v", args.LoadPath, err) - return e.ErrLoadServiceTemplate.AddDesc(err.Error()) - } - decodedContent, err := base64.StdEncoding.DecodeString(file.Content) - if err != nil { - log.Errorf("Failed to decode file, the error is: %+v", err) - return e.ErrLoadServiceTemplate.AddDesc(err.Error()) - } - srcPath := fmt.Sprintf("%s/%s/blob/%s/%s", ch.Address, repoInfo, branchName, args.LoadPath) - splittedYaml := SplitYaml(string(decodedContent)) - createSvcArgs := &models.Service{ - CodehostID: ch.ID, - RepoOwner: repoOwner, - RepoName: repoName, - BranchName: branchName, - LoadPath: args.LoadPath, - LoadFromDir: args.LoadFromDir, - KubeYamls: splittedYaml, - SrcPath: srcPath, - CreateBy: username, - ServiceName: getFileName(file.FileName), - Type: args.Type, - ProductName: args.ProductName, - Source: setting.SourceFromIlyshin, - Yaml: string(decodedContent), - Commit: &models.Commit{SHA: file.CommitID}, - Visibility: args.Visibility, - } - - _, err = CreateServiceTemplate(username, createSvcArgs, log) - if err != nil { - _, messageMap := e.ErrorMessage(err) - if description, ok := messageMap["description"]; ok { - return e.ErrLoadServiceTemplate.AddDesc(description.(string)) - } - return e.ErrLoadServiceTemplate.AddDesc("Load Service Error for unknown reason") - } - return nil - } - - treeInfo, err := ilyshinClient.ListTree(repoOwner, repoName, branchName, args.LoadPath) - if err != nil { - log.Errorf("Failed to get dir content from ilyshin with path: %s, the error is: %+v", args.LoadPath, err) - return e.ErrLoadServiceTemplate.AddDesc(err.Error()) - } - if isValidIlyshinServiceDir(treeInfo) { - return loadServiceFromIlyshin(ilyshinClient, treeInfo, ch, username, repoOwner, repoName, branchName, args.LoadPath, args, log) - } - for _, treeNode := range treeInfo { - if treeNode.Type == "tree" { - subtree, err := ilyshinClient.ListTree(repoOwner, repoName, branchName, args.LoadPath) - if err != nil { - log.Errorf("Failed to get dir content from ilyshin with path: %s, the error is %+v", treeNode.Path, err) - return e.ErrLoadServiceTemplate.AddDesc(err.Error()) - } - if isValidIlyshinServiceDir(subtree) { - if err := loadServiceFromIlyshin(ilyshinClient, subtree, ch, username, repoOwner, repoName, branchName, treeNode.Path, args, log); err != nil { - return err - } - } - } - } - return nil -} - -func loadServiceFromIlyshin(client *ilyshin.Client, tree []*ilyshin.TreeNode, ch *poetry.CodeHost, username, repoOwner, repoName, branchName, path string, args *LoadServiceReq, log *zap.SugaredLogger) error { - pathList := strings.Split(path, "/") - splittedYaml := []string{} - serviceName := pathList[len(pathList)-1] - repoInfo := fmt.Sprintf("%s/%s", repoOwner, repoName) - yamlList, sha, err := extractIlyshinYamls(client, tree, repoOwner, repoName, branchName) - if err != nil { - log.Errorf("Failed to extract yamls from ilyshin, the error is: %+v", err) - return e.ErrLoadServiceTemplate.AddDesc(err.Error()) - } - for _, yamlEntry := range yamlList { - splittedYaml = append(splittedYaml, SplitYaml(yamlEntry)...) - } - yml := joinYamls(yamlList) - srcPath := fmt.Sprintf("%s/%s/tree/%s/%s", ch.Address, repoInfo, branchName, path) - createSvcArgs := &models.Service{ - CodehostID: ch.ID, - RepoOwner: repoOwner, - RepoName: repoName, - BranchName: branchName, - LoadPath: path, - LoadFromDir: args.LoadFromDir, - KubeYamls: splittedYaml, - SrcPath: srcPath, - CreateBy: username, - ServiceName: serviceName, - Type: args.Type, - ProductName: args.ProductName, - Source: setting.SourceFromIlyshin, - Yaml: yml, - Commit: &models.Commit{SHA: sha}, - Visibility: args.Visibility, - } - - _, err = CreateServiceTemplate(username, createSvcArgs, log) - if err != nil { - _, messageMap := e.ErrorMessage(err) - if description, ok := messageMap["description"]; ok { - err = e.ErrLoadServiceTemplate.AddDesc(description.(string)) - } else { - err = e.ErrLoadServiceTemplate.AddDesc("Load Service Error for unknown reason") - } - } - return err -} - // 根据github repo决定服务是否可以更新这个repo地址 func validateServiceUpdateGithub(detail *poetry.CodeHost, serviceName, repoOwner, repoName, branchName, path string, isDir bool) error { ctx := context.Background() @@ -879,47 +695,6 @@ func validateServiceUpdateCodehub(detail *poetry.CodeHost, serviceName, repoName return e.ErrValidateServiceUpdate.AddDesc("所选路径中没有yaml,请重新选择") } -// 根据 ilyshin repo 决定服务是否可以更新这个 repo 地址 -func validateServiceUpdateIlyshin(detail *poetry.CodeHost, serviceName, repoOwner, repoName, branchName, path string, isDir bool) error { - ilyshinClient := ilyshin.NewClient(detail.Address, detail.AccessToken) - // 非文件夹情况下直接获取文件信息 - if !isDir { - if !isYaml(path) { - return e.ErrValidateServiceUpdate.AddDesc("File is not of type yaml or yml, select again") - } - fileInfo, err := ilyshinClient.GetFile(repoOwner, repoName, branchName, path) - if err != nil { - log.Errorf("Failed to get file info from ilyshin with path: %s, the error is %+v", path, err) - return e.ErrValidateServiceUpdate.AddDesc(err.Error()) - } - if getFileName(fileInfo.FileName) != serviceName { - log.Errorf("The loaded file name [%s] is the same as the service to be updated: [%s]", fileInfo.FileName, serviceName) - return e.ErrValidateServiceUpdate.AddDesc("文件名称和服务名称不一致") - } - return nil - } - - treeInfo, err := ilyshinClient.ListTree(repoOwner, repoName, branchName, path) - if err != nil { - log.Errorf("Failed to get dir content from gitlab with path: %s, the error is: %+v", path, err) - return e.ErrValidateServiceUpdate.AddDesc(err.Error()) - } - if isValidIlyshinServiceDir(treeInfo) { - svcName := path - if path == "" { - svcName = repoName - } - pathList := strings.Split(svcName, "/") - folderName := pathList[len(pathList)-1] - if folderName != serviceName { - log.Errorf("The loaded file name [%s] is the same as the service to be updated: [%s]", folderName, serviceName) - return e.ErrValidateServiceUpdate.AddDesc("文件夹名称和服务名称不一致") - } - return nil - } - return e.ErrValidateServiceUpdate.AddDesc("所选路径中没有yaml,请重新选择") -} - func isValidGithubServiceDir(child []*github.RepositoryContent) bool { for _, entry := range child { if entry.GetType() == "file" && isYaml(entry.GetName()) { @@ -938,15 +713,6 @@ func isValidGitlabServiceDir(child []*gitlab.TreeNode) bool { return false } -func isValidIlyshinServiceDir(child []*ilyshin.TreeNode) bool { - for _, entry := range child { - if entry.Type == "blob" && isYaml(entry.Name) { - return true - } - } - return false -} - func isValidGerritServiceDir(child []os.FileInfo) bool { for _, file := range child { if !file.IsDir() && isYaml(file.Name()) { @@ -999,25 +765,3 @@ func extractGerritYamls(basePath string, tree []os.FileInfo) ([]string, error) { } return ret, nil } - -func extractIlyshinYamls(client *ilyshin.Client, tree []*ilyshin.TreeNode, repoOwner, repoName, branchName string) ([]string, string, error) { - ret := []string{} - var sha string - for _, entry := range tree { - if isYaml(entry.Name) { - fileInfo, err := client.GetFile(repoOwner, repoName, branchName, entry.Path) - if err != nil { - log.Errorf("Failed to download ilyshin file: %s, the error is: %+v", entry.Path, err) - return nil, "", err - } - decodedFile, err := base64.StdEncoding.DecodeString(fileInfo.Content) - if err != nil { - log.Errorf("Failed to decode content from the given file of path: %s, the error is: %s", entry.Path, err) - return nil, "", err - } - ret = append(ret, string(decodedFile)) - sha = fileInfo.CommitID - } - } - return ret, sha, nil -} diff --git a/pkg/microservice/aslan/core/service/service/service.go b/pkg/microservice/aslan/core/service/service/service.go index 56373af0a..17cf5c53c 100644 --- a/pkg/microservice/aslan/core/service/service/service.go +++ b/pkg/microservice/aslan/core/service/service/service.go @@ -249,8 +249,7 @@ func GetServiceOption(args *commonmodels.Service, log *zap.SugaredLogger) (*Serv } if args.Source == setting.SourceFromGitlab || args.Source == setting.SourceFromGithub || - args.Source == setting.SourceFromGerrit || args.Source == setting.SourceFromCodeHub || - args.Source == setting.SourceFromIlyshin { + args.Source == setting.SourceFromGerrit || args.Source == setting.SourceFromCodeHub { serviceOption.Yaml = args.Yaml } return serviceOption, nil @@ -265,7 +264,7 @@ func CreateK8sWorkLoads(ctx context.Context, requestID, username string, product // 检查环境是否存在,envName和productName唯一 opt := &commonrepo.ProductFindOptions{Name: productName, EnvName: envName} if _, err := commonrepo.NewProductColl().Find(opt); err == nil { - log.Errorf("[%s][P:%s] duplicate envName in the same product", envName, productName) + log.Errorf("[%s][P:%s] duplicate envName in the same project", envName, productName) return e.ErrCreateEnv.AddDesc(e.DuplicateEnvErrMsg) } @@ -275,22 +274,32 @@ func CreateK8sWorkLoads(ctx context.Context, requestID, username string, product mu sync.Mutex ) - // pre judge workLoads same name serviceString := sets.NewString() services, _ := commonrepo.NewServiceColl().ListExternalWorkloadsBy(productName, "") for _, v := range services { serviceString.Insert(v.ServiceName) } - for _, workload := range workLoads { - if serviceString.Has(workload.Name) { - return e.ErrCreateTemplate.AddDesc(fmt.Sprintf("do not support import same service name: %s", workload.Name)) - } - } + //for _, workload := range workLoads { + // if serviceString.Has(workload.Name) { + // return e.ErrCreateTemplate.AddDesc(fmt.Sprintf("do not support import same service name: %s", workload.Name)) + // } + //} g := new(errgroup.Group) for _, workload := range workLoads { tempWorkload := workload g.Go(func() error { + // If the service is already included in the database service template, add it to the new association table + if serviceString.Has(tempWorkload.Name) { + return commonrepo.NewServicesInExternalEnvColl().Create(&commonmodels.ServicesInExternalEnv{ + ProductName: productName, + ServiceName: tempWorkload.Name, + EnvName: envName, + Namespace: namespace, + ClusterID: clusterID, + }) + } + var bs []byte switch tempWorkload.Type { case setting.Deployment: @@ -341,6 +350,7 @@ func CreateK8sWorkLoads(ctx context.Context, requestID, username string, product ClusterID: clusterID, EnvName: envName, Namespace: namespace, + UpdateBy: username, }, log); err != nil { return e.ErrCreateProduct.AddDesc("create product Error for unknown reason") } @@ -385,6 +395,19 @@ func UpdateWorkloads(ctx context.Context, requestID, username, productName, envN log.Errorf("[%s][%s]NewWorkLoadsStatColl().Find %s", args.ClusterID, args.Namespace, err) return err } + externalEnvServices, _ := commonrepo.NewServicesInExternalEnvColl().List(&commonrepo.ServicesInExternalEnvArgs{ + ProductName: productName, + EnvName: envName, + }) + + for _, externalEnvService := range externalEnvServices { + workloadStat.Workloads = append(workloadStat.Workloads, commonmodels.Workload{ + ProductName: externalEnvService.ProductName, + EnvName: externalEnvService.EnvName, + Name: externalEnvService.ServiceName, + }) + } + diff := map[string]*ServiceWorkloadsUpdateAction{} originSet := sets.NewString() uploadSet := sets.NewString() @@ -393,6 +416,7 @@ func UpdateWorkloads(ctx context.Context, requestID, username, productName, envN originSet.Insert(v.Name) } } + for _, v := range args.WorkLoads { uploadSet.Insert(v.Name) } @@ -414,12 +438,12 @@ func UpdateWorkloads(ctx context.Context, requestID, username, productName, envN } } // pre judge workLoads same name - services, _ := commonrepo.NewServiceColl().ListExternalWorkloadsBy(productName, "") - for _, v := range services { - if addString.Has(v.ServiceName) { - return e.ErrCreateTemplate.AddDesc(fmt.Sprintf("do not support import same service name: %s", v.ServiceName)) - } - } + //services, _ := commonrepo.NewServiceColl().ListExternalWorkloadsBy(productName, "") + //for _, v := range services { + // if addString.Has(v.ServiceName) { + // return e.ErrCreateTemplate.AddDesc(fmt.Sprintf("do not support import same service name: %s", v.ServiceName)) + // } + //} for _, v := range args.WorkLoads { if addString.Has(v.Name) { @@ -433,13 +457,34 @@ func UpdateWorkloads(ctx context.Context, requestID, username, productName, envN } } + otherExternalEnvServices, err := commonrepo.NewServicesInExternalEnvColl().List(&commonrepo.ServicesInExternalEnvArgs{ + ProductName: productName, + ExcludeEnvName: envName, + }) + if err != nil { + log.Errorf("failed to list external service, error:%s", err) + } + + externalEnvServiceM := make(map[string]bool) + for _, externalEnvService := range otherExternalEnvServices { + externalEnvServiceM[externalEnvService.ServiceName] = true + } for _, v := range diff { switch v.Operation { // 删除workload的引用 case "delete": - err = commonrepo.NewServiceColl().UpdateExternalServicesStatus(v.Name, productName, setting.ProductStatusDeleting, envName) - if err != nil { - log.Errorf("UpdateStatus external services error:%s", err) + if _, isExist := externalEnvServiceM[v.Name]; !isExist { + err = commonrepo.NewServiceColl().UpdateExternalServicesStatus(v.Name, productName, setting.ProductStatusDeleting, envName) + if err != nil { + log.Errorf("UpdateStatus external services error:%s", err) + } + } + if err = commonrepo.NewServicesInExternalEnvColl().Delete(&commonrepo.ServicesInExternalEnvArgs{ + ProductName: productName, + EnvName: envName, + ServiceName: v.Name, + }); err != nil { + log.Errorf("delete services in external env error:%s", err) } // 添加workload的引用 case "add": @@ -545,7 +590,7 @@ func CreateWorkloadTemplate(userName string, args *commonmodels.Service, log *za //获取项目里面的所有服务 if len(productTempl.Services) > 0 && !sets.NewString(productTempl.Services[0]...).Has(args.ServiceName) { productTempl.Services[0] = append(productTempl.Services[0], args.ServiceName) - } else { + } else if len(productTempl.Services) == 0 { productTempl.Services = [][]string{{args.ServiceName}} } //更新项目模板 @@ -556,7 +601,21 @@ func CreateWorkloadTemplate(userName string, args *commonmodels.Service, log *za } } } else { - return e.ErrCreateTemplate.AddDesc("do not support import same service name") + product, err := commonrepo.NewProductColl().Find(&commonrepo.ProductFindOptions{ + Name: args.ProductName, + EnvName: args.EnvName, + }) + if err != nil { + return err + } + return commonrepo.NewServicesInExternalEnvColl().Create(&commonmodels.ServicesInExternalEnv{ + ProductName: args.ProductName, + ServiceName: args.ServiceName, + EnvName: args.EnvName, + Namespace: product.Namespace, + ClusterID: product.ClusterID, + }) + //return e.ErrCreateTemplate.AddDesc("do not support import same service name") } if err := commonrepo.NewServiceColl().Delete(args.ServiceName, args.Type, args.ProductName, setting.ProductStatusDeleting, 0); err != nil { @@ -599,7 +658,7 @@ func CreateServiceTemplate(userName string, args *commonmodels.Service, log *zap } } // 配置来源为Gitlab,对比配置的ChangeLog是否变化 - if args.Source == setting.SourceFromGitlab || args.Source == setting.SourceFromGithub || args.Source == setting.SourceFromCodeHub || args.Source == setting.SourceFromIlyshin { + if args.Source == setting.SourceFromGitlab || args.Source == setting.SourceFromGithub || args.Source == setting.SourceFromCodeHub { if args.Commit != nil && serviceTmpl.Commit != nil && args.Commit.SHA == serviceTmpl.Commit.SHA { log.Infof("%s change log remains the same, quit creation", args.Source) return GetServiceOption(serviceTmpl, log) diff --git a/pkg/microservice/aslan/core/service/service/types.go b/pkg/microservice/aslan/core/service/service/types.go index 0edc04a48..a09a44779 100644 --- a/pkg/microservice/aslan/core/service/service/types.go +++ b/pkg/microservice/aslan/core/service/service/types.go @@ -79,13 +79,8 @@ type CreateFromPublicRepo struct { } type CreateFromChartTemplate struct { - CodehostID int `json:"codehostID,omitempty"` - Owner string `json:"owner,omitempty"` - Repo string `json:"repo,omitempty"` - Branch string `json:"branch,omitempty"` - TemplateName string `json:"templateName"` - ValuesPaths []string `json:"valuesPaths,omitempty"` - ValuesYAML string `json:"valuesYAML,omitempty"` + TemplateName string `json:"templateName"` + ValuesYAML string `json:"valuesYAML"` } func PublicRepoToPrivateRepoArgs(args *CreateFromPublicRepo) (*CreateFromRepo, error) { diff --git a/pkg/microservice/aslan/core/workflow/handler/webhook.go b/pkg/microservice/aslan/core/workflow/handler/webhook.go index 9179049c2..fb9b8a500 100644 --- a/pkg/microservice/aslan/core/workflow/handler/webhook.go +++ b/pkg/microservice/aslan/core/workflow/handler/webhook.go @@ -28,7 +28,6 @@ import ( "github.com/koderover/zadig/pkg/microservice/aslan/core/workflow/service/webhook" internalhandler "github.com/koderover/zadig/pkg/shared/handler" "github.com/koderover/zadig/pkg/tool/codehub" - "github.com/koderover/zadig/pkg/tool/ilyshin" ) // @Router /workflow/webhook [POST] @@ -51,8 +50,6 @@ func ProcessWebHook(c *gin.Context) { ctx.Err = webhook.ProcessGitlabHook(payload, c.Request, ctx.RequestID, ctx.Logger) } else if codehub.HookEventType(c.Request) != "" { ctx.Err = webhook.ProcessCodehubHook(payload, c.Request, ctx.RequestID, ctx.Logger) - } else if ilyshin.HookEventType(c.Request) != "" { - ctx.Err = webhook.ProcessIlyshinHook(payload, c.Request, ctx.RequestID, ctx.Logger) } else { ctx.Err = webhook.ProcessGerritHook(payload, c.Request, ctx.RequestID, ctx.Logger) } diff --git a/pkg/microservice/aslan/core/workflow/handler/workflow.go b/pkg/microservice/aslan/core/workflow/handler/workflow.go index 724265f21..e399babff 100644 --- a/pkg/microservice/aslan/core/workflow/handler/workflow.go +++ b/pkg/microservice/aslan/core/workflow/handler/workflow.go @@ -118,7 +118,7 @@ func ListWorkflows(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - ctx.Resp, ctx.Err = workflow.ListWorkflows(c.Query("type"), ctx.UserID, ctx.Logger) + ctx.Resp, ctx.Err = workflow.ListWorkflows(c.Query("type"), c.Query("productName"), ctx.UserID, ctx.Logger) } func ListTestWorkflows(c *gin.Context) { diff --git a/pkg/microservice/aslan/core/workflow/service/webhook/ilyshin.go b/pkg/microservice/aslan/core/workflow/service/webhook/ilyshin.go deleted file mode 100644 index 22fde0919..000000000 --- a/pkg/microservice/aslan/core/workflow/service/webhook/ilyshin.go +++ /dev/null @@ -1,290 +0,0 @@ -/* -Copyright 2021 The KodeRover 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 webhook - -import ( - "errors" - "fmt" - "net/http" - "strconv" - "strings" - "time" - - "github.com/hashicorp/go-multierror" - "go.uber.org/zap" - - "github.com/koderover/zadig/pkg/microservice/aslan/config" - commonmodels "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/models" - commonrepo "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/mongodb" - gitservice "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/git" - workflowservice "github.com/koderover/zadig/pkg/microservice/aslan/core/workflow/service/workflow" - "github.com/koderover/zadig/pkg/setting" - "github.com/koderover/zadig/pkg/shared/codehost" - e "github.com/koderover/zadig/pkg/tool/errors" - "github.com/koderover/zadig/pkg/tool/ilyshin" -) - -func ProcessIlyshinHook(payload []byte, req *http.Request, requestID string, log *zap.SugaredLogger) error { - token := req.Header.Get("X-CodeHub-Token") - secret := gitservice.GetHookSecret() - - if secret != "" && token != secret { - return errors.New("token is illegal") - } - - eventType := ilyshin.HookEventType(req) - event, err := ilyshin.ParseHook(eventType, payload) - if err != nil { - log.Warnf("unexpected event type: %s", eventType) - return nil - } - - forwardedProto := req.Header.Get("X-Forwarded-Proto") - forwardedHost := req.Header.Get("X-Forwarded-Host") - baseURI := fmt.Sprintf("%s://%s", forwardedProto, forwardedHost) - - var pushEvent *ilyshin.PushEvent - var errorList = &multierror.Error{} - switch event := event.(type) { - case *ilyshin.PushEvent: - pushEvent = event - if len(pushEvent.Commits) > 0 { - webhookUser := &commonmodels.WebHookUser{ - Domain: req.Header.Get("X-Forwarded-Host"), - UserName: pushEvent.Commits[0].Author.Name, - Email: pushEvent.Commits[0].Author.Email, - Source: setting.SourceFromIlyshin, - CreatedAt: time.Now().Unix(), - } - commonrepo.NewWebHookUserColl().Upsert(webhookUser) - } - - if err = updateServiceTemplateByIlyshinPushEvent(pushEvent, log); err != nil { - errorList = multierror.Append(errorList, err) - } - } - - //产品工作流webhook - if err = TriggerWorkflowByIlyshinEvent(event, baseURI, requestID, log); err != nil { - errorList = multierror.Append(errorList, err) - } - - return errorList.ErrorOrNil() -} - -func updateServiceTemplateByIlyshinPushEvent(event *ilyshin.PushEvent, log *zap.SugaredLogger) error { - log.Infof("EVENT: Ilyshin WEBHOOK UPDATING SERVICE TEMPLATE") - - address, err := GetAddress(event.Project.WebURL) - if err != nil { - log.Errorf("GetAddress failed, error: %s", err) - return err - } - - client, err := getIlyshinClientByAddress(address) - if err != nil { - return err - } - - diffs, err := client.Compare(event.ProjectID, event.Before, event.After) - if err != nil { - log.Errorf("Failed to get push event diffs, error: %s", err) - return err - } - serviceTmpls, err := GetIlyshinServiceTemplates() - if err != nil { - log.Errorf("Failed to get ilyshin service templates, error: %s", err) - return err - } - - errs := &multierror.Error{} - for _, service := range serviceTmpls { - srcPath := service.SrcPath - _, _, _, _, path, _, err := GetOwnerRepoBranchPath(srcPath) - if err != nil { - errs = multierror.Append(errs, err) - } - // 判断PushEvent的Diffs中是否包含该服务模板的src_path - affected := false - for _, diff := range diffs { - if strings.Contains(diff.OldPath, path) || strings.Contains(diff.NewPath, path) { - affected = true - break - } - } - if affected { - log.Infof("Started to sync service template %s from ilyshin %s", service.ServiceName, service.SrcPath) - service.CreateBy = "system" - err := SyncServiceTemplateFromIlyshin(service, log) - if err != nil { - log.Errorf("SyncServiceTemplateFromIlyshin failed, error: %s", err) - errs = multierror.Append(errs, err) - } - } else { - log.Infof("Service template %s from ilyshin %s is not affected, no sync", service.ServiceName, service.SrcPath) - } - - } - return errs.ErrorOrNil() -} - -func GetIlyshinServiceTemplates() ([]*commonmodels.Service, error) { - opt := &commonrepo.ServiceListOption{ - Type: setting.K8SDeployType, - Source: setting.SourceFromIlyshin, - } - return commonrepo.NewServiceColl().ListMaxRevisions(opt) -} - -// SyncServiceTemplateFromIlyshin Force to sync Service Template to latest commit and content, -// Notes: if remains the same, quit sync; if updates, revision +1 -func SyncServiceTemplateFromIlyshin(service *commonmodels.Service, log *zap.SugaredLogger) error { - // 判断一下 Source 字段,如果 Source 字段不是 ilyshin,直接返回 - if service.Source != setting.SourceFromIlyshin { - return fmt.Errorf("service template is not from ilyshin") - } - // 获取当前Commit的SHA - var before string - if service.Commit != nil { - before = service.Commit.SHA - } - // Sync最新的Commit的SHA - var after string - err := syncIlyshinLatestCommit(service, log) - if err != nil { - return err - } - after = service.Commit.SHA - // 判断一下是否需要 Sync 内容 - if before == after { - log.Infof("Before and after SHA: %s remains the same, no need to sync", before) - // 无需更新 - return nil - } - // 在 Ensure 过程中会检查 source,如果 source 为 ilyshin,则同步 ilyshin 内容到 service 中 - if err := fillServiceTmpl(setting.WebhookTaskCreator, service, log); err != nil { - log.Errorf("ensureServiceTmpl error: %+v", err) - return e.ErrValidateTemplate.AddDesc(err.Error()) - } - // 更新到数据库,revision+1 - if err := commonrepo.NewServiceColl().Create(service); err != nil { - log.Errorf("Failed to sync service %s from ilyshin path %s error: %v", service.ServiceName, service.SrcPath, err) - return e.ErrCreateTemplate.AddDesc(err.Error()) - } - log.Infof("End of sync service template %s from ilyshin path %s", service.ServiceName, service.SrcPath) - return nil -} - -func TriggerWorkflowByIlyshinEvent(event interface{}, baseURI, requestID string, log *zap.SugaredLogger) error { - // 1. find configured workflow - workflowList, err := commonrepo.NewWorkflowColl().List(&commonrepo.ListWorkflowOption{}) - if err != nil { - log.Errorf("failed to list workflow %v", err) - return err - } - - mErr := &multierror.Error{} - diffSrv := func(mergeEvent *ilyshin.MergeEvent, codehostId int) ([]string, error) { - return findIlyshinChangedFilesOfMergeRequest(mergeEvent, codehostId) - } - - for _, workflow := range workflowList { - if workflow.HookCtl == nil || !workflow.HookCtl.Enabled { - continue - } - - log.Debugf("find %d hooks in workflow %s", len(workflow.HookCtl.Items), workflow.Name) - for _, item := range workflow.HookCtl.Items { - if item.WorkflowArgs == nil { - continue - } - - // 2. match webhook - matcher := createIlyshinEventMatcher(event, diffSrv, workflow, log) - if matcher == nil { - continue - } - - matches, err := matcher.Match(item.MainRepo) - if err != nil { - mErr = multierror.Append(mErr, err) - continue - } - - if !matches { - log.Debugf("event not matches %v", item.MainRepo) - continue - } - - log.Infof("event match hook %v of %s", item.MainRepo, workflow.Name) - namespace := strings.Split(item.WorkflowArgs.Namespace, ",")[0] - opt := &commonrepo.ProductFindOptions{Name: workflow.ProductTmplName, EnvName: namespace} - var prod *commonmodels.Product - if prod, err = commonrepo.NewProductColl().Find(opt); err != nil { - log.Warnf("can't find environment %s-%s", item.WorkflowArgs.Namespace, workflow.ProductTmplName) - continue - } - - var mergeRequestID, commitID string - if ev, isPr := event.(*ilyshin.MergeEvent); isPr { - // 如果是merge request,且该webhook触发器配置了自动取消, - // 则需要确认该merge request在本次commit之前的commit触发的任务是否处理完,没有处理完则取消掉。 - mergeRequestID = strconv.Itoa(ev.ObjectAttributes.IID) - commitID = ev.ObjectAttributes.LastCommit.ID - autoCancelOpt := &AutoCancelOpt{ - MergeRequestID: mergeRequestID, - CommitID: commitID, - TaskType: config.WorkflowType, - MainRepo: item.MainRepo, - WorkflowArgs: item.WorkflowArgs, - } - err := AutoCancelTask(autoCancelOpt, log) - if err != nil { - log.Errorf("failed to auto cancel workflow task when receive event %v due to %v ", event, err) - mErr = multierror.Append(mErr, err) - } - } - - args := matcher.UpdateTaskArgs(prod, item.WorkflowArgs, item.MainRepo, requestID) - args.MergeRequestID = mergeRequestID - args.CommitID = commitID - args.Source = setting.SourceFromIlyshin - args.CodehostID = item.MainRepo.CodehostID - args.RepoOwner = item.MainRepo.RepoOwner - args.RepoName = item.MainRepo.RepoName - // 3. create task with args - if _, err := workflowservice.CreateWorkflowTask(args, setting.WebhookTaskCreator, log); err != nil { - log.Errorf("failed to create workflow task when receive push event %v due to %s ", event, err) - mErr = multierror.Append(mErr, err) - } else { - log.Infof("succeed to create task") - } - } - } - - return mErr.ErrorOrNil() -} - -func findIlyshinChangedFilesOfMergeRequest(event *ilyshin.MergeEvent, codehostID int) ([]string, error) { - detail, err := codehost.GetCodehostDetail(codehostID) - if err != nil { - return nil, fmt.Errorf("failed to find codehost %d: %s", codehostID, err) - } - - client := ilyshin.NewClient(detail.Address, detail.OauthToken) - return client.ListChangedFiles(event) -} diff --git a/pkg/microservice/aslan/core/workflow/service/webhook/ilyshin_workflow_task.go b/pkg/microservice/aslan/core/workflow/service/webhook/ilyshin_workflow_task.go deleted file mode 100644 index bea8048fc..000000000 --- a/pkg/microservice/aslan/core/workflow/service/webhook/ilyshin_workflow_task.go +++ /dev/null @@ -1,152 +0,0 @@ -/* -Copyright 2021 The KodeRover 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 webhook - -import ( - "go.uber.org/zap" - - "github.com/koderover/zadig/pkg/microservice/aslan/config" - commonmodels "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/models" - "github.com/koderover/zadig/pkg/shared/codehost" - "github.com/koderover/zadig/pkg/tool/ilyshin" - "github.com/koderover/zadig/pkg/types" -) - -type ilyshinMergeRequestDiffFunc func(event *ilyshin.MergeEvent, id int) ([]string, error) - -type ilyshinMergeEventMatcher struct { - diffFunc ilyshinMergeRequestDiffFunc - log *zap.SugaredLogger - workflow *commonmodels.Workflow - event *ilyshin.MergeEvent -} - -func (gmem *ilyshinMergeEventMatcher) Match(hookRepo commonmodels.MainHookRepo) (bool, error) { - ev := gmem.event - if (hookRepo.RepoOwner + "/" + hookRepo.RepoName) == ev.ObjectAttributes.Target.PathWithNamespace { - if EventConfigured(hookRepo, config.HookEventPr) && (hookRepo.Branch == ev.ObjectAttributes.TargetBranch) { - if ev.ObjectAttributes.State == "opened" { - var changedFiles []string - changedFiles, err := gmem.diffFunc(ev, hookRepo.CodehostID) - if err != nil { - gmem.log.Warnf("failed to get changes of event %v, err:%v", ev, err) - return false, err - } - gmem.log.Debugf("succeed to get %d changes in merge event", len(changedFiles)) - - return MatchChanges(hookRepo, changedFiles), nil - } - } - } - return false, nil -} - -func (gmem *ilyshinMergeEventMatcher) UpdateTaskArgs( - product *commonmodels.Product, args *commonmodels.WorkflowTaskArgs, hookRepo commonmodels.MainHookRepo, requestID string, -) *commonmodels.WorkflowTaskArgs { - factory := &workflowArgsFactory{ - workflow: gmem.workflow, - reqID: requestID, - } - - args = factory.Update(product, args, &types.Repository{ - CodehostID: hookRepo.CodehostID, - RepoName: hookRepo.RepoName, - RepoOwner: hookRepo.RepoOwner, - Branch: hookRepo.Branch, - PR: gmem.event.ObjectAttributes.IID, - }) - - return args -} - -func createIlyshinEventMatcher( - event interface{}, diffSrv ilyshinMergeRequestDiffFunc, workflow *commonmodels.Workflow, log *zap.SugaredLogger, -) gitEventMatcher { - switch evt := event.(type) { - case *ilyshin.PushEvent: - return &ilyshinPushEventMatcher{ - workflow: workflow, - log: log, - event: evt, - } - case *ilyshin.MergeEvent: - return &ilyshinMergeEventMatcher{ - diffFunc: diffSrv, - log: log, - event: evt, - workflow: workflow, - } - } - - return nil -} - -type ilyshinPushEventMatcher struct { - log *zap.SugaredLogger - workflow *commonmodels.Workflow - event *ilyshin.PushEvent -} - -func (gpem *ilyshinPushEventMatcher) Match(hookRepo commonmodels.MainHookRepo) (bool, error) { - ev := gpem.event - if (hookRepo.RepoOwner + "/" + hookRepo.RepoName) == ev.Project.PathWithNamespace { - if hookRepo.Branch == getBranchFromRef(ev.Ref) && EventConfigured(hookRepo, config.HookEventPush) { - var changedFiles []string - - detail, err := codehost.GetCodehostDetail(hookRepo.CodehostID) - if err != nil { - gpem.log.Errorf("GetCodehostDetail error: %v", err) - return false, err - } - - client := ilyshin.NewClient(detail.Address, detail.OauthToken) - // compare接口获取两个commit之间的最终的改动 - diffs, err := client.Compare(ev.ProjectID, ev.Before, ev.After) - if err != nil { - gpem.log.Errorf("Failed to get push event diffs, error: %v", err) - return false, err - } - for _, diff := range diffs { - changedFiles = append(changedFiles, diff.NewPath) - changedFiles = append(changedFiles, diff.OldPath) - } - - return MatchChanges(hookRepo, changedFiles), nil - } - } - - return false, nil -} - -func (gpem *ilyshinPushEventMatcher) UpdateTaskArgs( - product *commonmodels.Product, args *commonmodels.WorkflowTaskArgs, hookRepo commonmodels.MainHookRepo, requestID string, -) *commonmodels.WorkflowTaskArgs { - factory := &workflowArgsFactory{ - workflow: gpem.workflow, - reqID: requestID, - } - - factory.Update(product, args, &types.Repository{ - CodehostID: hookRepo.CodehostID, - RepoName: hookRepo.RepoName, - RepoOwner: hookRepo.RepoOwner, - Branch: hookRepo.Branch, - }) - - return args -} diff --git a/pkg/microservice/aslan/core/workflow/service/webhook/utils.go b/pkg/microservice/aslan/core/workflow/service/webhook/utils.go index 98fba1549..1434a232e 100644 --- a/pkg/microservice/aslan/core/workflow/service/webhook/utils.go +++ b/pkg/microservice/aslan/core/workflow/service/webhook/utils.go @@ -18,7 +18,6 @@ package webhook import ( "context" - "encoding/base64" "errors" "fmt" "path" @@ -41,7 +40,6 @@ import ( e "github.com/koderover/zadig/pkg/tool/errors" githubtool "github.com/koderover/zadig/pkg/tool/git/github" gitlabtool "github.com/koderover/zadig/pkg/tool/git/gitlab" - "github.com/koderover/zadig/pkg/tool/ilyshin" "github.com/koderover/zadig/pkg/tool/kube/serializer" "github.com/koderover/zadig/pkg/tool/log" "github.com/koderover/zadig/pkg/util" @@ -108,18 +106,6 @@ func fillServiceTmpl(userName string, args *commonmodels.Service, log *zap.Sugar log.Errorf("Sync content from gitlab failed, error: %v", err) return err } - } else if args.Source == setting.SourceFromIlyshin { - // Set args.Commit - if err := syncIlyshinLatestCommit(args, log); err != nil { - log.Errorf("Sync change log from ilyshin failed, error: %v", err) - return err - } - // 从 ilyshin 同步 args 指定的 Commit 下,指定目录中对应的 Yaml 文件 - // Set args.Yaml & args.KubeYamls - if err := syncContentFromIlyshin(userName, args); err != nil { - log.Errorf("Sync content from ilyshin failed, error: %v", err) - return err - } } else if args.Source == setting.SourceFromGithub { err := syncContentFromGithub(args, log) if err != nil { @@ -186,32 +172,6 @@ func syncLatestCommit(service *commonmodels.Service) error { return nil } -func syncIlyshinLatestCommit(service *commonmodels.Service, log *zap.SugaredLogger) error { - if service.SrcPath == "" { - return fmt.Errorf("url不能是空的") - } - - address, owner, repo, branch, path, _, err := GetOwnerRepoBranchPath(service.SrcPath) - if err != nil { - return fmt.Errorf("url 必须包含 owner/repo/tree/branch/path,具体请参考 Placeholder 提示") - } - - client, err := getIlyshinClientByAddress(address) - if err != nil { - return err - } - - commit, err := client.GetLatestCommit(owner, repo, branch, path, log) - if err != nil { - return err - } - service.Commit = &commonmodels.Commit{ - SHA: commit.ID, - Message: commit.Message, - } - return nil -} - func syncCodehubLatestCommit(service *commonmodels.Service) error { if service.SrcPath == "" { return fmt.Errorf("url不能是空的") @@ -253,21 +213,6 @@ func getCodehubClientByAddress(address string) (*codehub.Client, error) { return client, nil } -func getIlyshinClientByAddress(address string) (*ilyshin.Client, error) { - opt := &codehost.Option{ - Address: address, - CodeHostType: codehost.IlyshinProvider, - } - codehost, err := codehost.GetCodeHostInfo(opt) - if err != nil { - log.Error(err) - return nil, e.ErrCodehostListProjects.AddDesc("git client is nil") - } - client := ilyshin.NewClient(codehost.Address, codehost.AccessToken) - - return client, nil -} - func getGitlabClientByAddress(address string) (*gitlabtool.Client, error) { opt := &codehost.Option{ Address: address, @@ -384,82 +329,6 @@ func joinYamls(files []string) string { return strings.Join(files, setting.YamlFileSeperator) } -// IlyshinGetRawFiles ... -func IlyshinGetRawFiles(client *ilyshin.Client, owner, repo, ref, path, pathType string) (files []string, err error) { - files = make([]string, 0) - var errs *multierror.Error - if pathType == "tree" { - nodes, err := client.ListTree(owner, repo, ref, path) - if err != nil { - return files, err - } - for _, node := range nodes { - // if node type is "tree", it is a directory, skip it for now - if node.Type == "tree" { - continue - } - fileName := strings.ToLower(node.Name) - if !strings.HasSuffix(fileName, ".yaml") && !strings.HasSuffix(fileName, ".yml") { - continue - } - // if node type is "blob", it is a file - // Path is filepath of a node - content, err := client.GetRawFile(owner, repo, ref, node.Path) - if err != nil { - errs = multierror.Append(errs, err) - } - contentStr := string(content) - contentStr = util.ReplaceWrapLine(contentStr) - files = append(files, contentStr) - } - return files, errs.ErrorOrNil() - } - fileInfo, err := client.GetFile(owner, repo, ref, path) - if err != nil { - return files, err - } - decodedFile, err := base64.StdEncoding.DecodeString(fileInfo.Content) - if err != nil { - return files, err - } - files = append(files, string(decodedFile)) - return files, errs.ErrorOrNil() -} - -// syncContentFromIlyshin ... -// sync content with commit, args.Commit should not be nil -func syncContentFromIlyshin(userName string, args *commonmodels.Service) error { - if args.Commit == nil { - return nil - } - - address, owner, repo, branch, path, pathType, err := GetOwnerRepoBranchPath(args.SrcPath) - if err != nil { - return fmt.Errorf("url format failed") - } - - client, err := getIlyshinClientByAddress(address) - if err != nil { - return err - } - - files, err := IlyshinGetRawFiles(client, owner, repo, branch, path, pathType) - if err != nil { - return err - } - if userName != setting.WebhookTaskCreator { - if len(files) == 0 { - return fmt.Errorf("没有检索到yml,yaml类型文件,请检查目录是否正确") - } - } - // KubeYamls field is dynamicly synced. - // 根据gitlab sync的内容来设置args.KubeYamls - args.KubeYamls = files - // 拼装并设置args.Yaml - args.Yaml = joinYamls(files) - return nil -} - func syncContentFromGithub(args *commonmodels.Service, log *zap.SugaredLogger) error { // 根据pipeline中的filepath获取文件内容 address, owner, repo, branch, path, _, err := GetOwnerRepoBranchPath(args.SrcPath) diff --git a/pkg/microservice/aslan/core/workflow/service/workflow/gitlab.go b/pkg/microservice/aslan/core/workflow/service/workflow/gitlab.go index 58fc471b6..1d15a7d65 100644 --- a/pkg/microservice/aslan/core/workflow/service/workflow/gitlab.go +++ b/pkg/microservice/aslan/core/workflow/service/workflow/gitlab.go @@ -28,7 +28,6 @@ import ( "github.com/koderover/zadig/pkg/setting" "github.com/koderover/zadig/pkg/shared/codehost" "github.com/koderover/zadig/pkg/tool/gerrit" - "github.com/koderover/zadig/pkg/tool/ilyshin" ) // RepoCommit : Repository commit struct @@ -85,23 +84,6 @@ func QueryByBranch(id int, owner, name, branch string, log *zap.SugaredLogger) ( CreatedAt: &commitDate, Message: commit.Message, }, nil - } else if ch.Type == setting.SourceFromIlyshin { - client := ilyshin.NewClient(ch.Address, ch.AccessToken) - branches, err := client.ListBranches(owner, name, log) - if err != nil { - return nil, err - } - for _, br := range branches { - if br.Name == branch { - return &RepoCommit{ - ID: br.Commit.ID, - Title: br.Commit.Title, - AuthorName: br.Commit.AuthorName, - CreatedAt: br.Commit.CreatedAt, - Message: br.Commit.Message, - }, nil - } - } } return nil, errors.New(ch.Type + "is not supported yet") @@ -152,23 +134,6 @@ func QueryByTag(id int, owner, name, tag string, log *zap.SugaredLogger) (*RepoC CreatedAt: &commitDate, Message: commit.Message, }, nil - } else if ch.Type == setting.SourceFromIlyshin { - client := ilyshin.NewClient(ch.Address, ch.AccessToken) - tags, err := client.ListTags(owner, name, log) - if err != nil { - return nil, err - } - for _, tagInfo := range tags { - if tagInfo.Name == tag { - return &RepoCommit{ - ID: tagInfo.Commit.ID, - Title: tagInfo.Commit.Title, - AuthorName: tagInfo.Commit.AuthorName, - CreatedAt: tagInfo.Commit.CreatedAt, - Message: tagInfo.Commit.Message, - }, nil - } - } } return nil, errors.New(ch.Type + "is not supported yet") @@ -219,18 +184,6 @@ func GetLatestPrCommit(codehostID, pr int, namespace, projectName string, log *z CreatedAt: &tm, CheckoutRef: change.Revisions[change.CurrentRevision].Ref, }, nil - } else if ch.Type == setting.SourceFromIlyshin { - client := ilyshin.NewClient(ch.Address, ch.AccessToken) - commit, err := client.GetLatestPRCommitList(projectID, pr, log) - if err != nil { - return nil, err - } - return &PRCommit{ - ID: commit.ID, - Title: commit.Title, - AuthorName: commit.AuthorName, - CreatedAt: commit.CreatedAt, - }, nil } return GetLatestPRCommitList(cli, projectID, pr) } diff --git a/pkg/microservice/aslan/core/workflow/service/workflow/pipeline_validation.go b/pkg/microservice/aslan/core/workflow/service/workflow/pipeline_validation.go index 797cbd470..8eb8f220b 100644 --- a/pkg/microservice/aslan/core/workflow/service/workflow/pipeline_validation.go +++ b/pkg/microservice/aslan/core/workflow/service/workflow/pipeline_validation.go @@ -313,7 +313,7 @@ func setBuildInfo(build *types.Repository, log *zap.SugaredLogger) { log.Errorf("failed to get codehost detail %d %v", build.CodehostID, err) return } - if codeHostInfo.Type == codehost.GitLabProvider || codeHostInfo.Type == codehost.GerritProvider || codeHostInfo.Type == codehost.IlyshinProvider { + if codeHostInfo.Type == codehost.GitLabProvider || codeHostInfo.Type == codehost.GerritProvider { if build.CommitID == "" { var commit *RepoCommit var pr *PRCommit diff --git a/pkg/microservice/aslan/core/workflow/service/workflow/workflow.go b/pkg/microservice/aslan/core/workflow/service/workflow/workflow.go index fc4fdc885..3d535127d 100644 --- a/pkg/microservice/aslan/core/workflow/service/workflow/workflow.go +++ b/pkg/microservice/aslan/core/workflow/service/workflow/workflow.go @@ -45,6 +45,41 @@ type EnvStatus struct { ErrMessage string `json:"err_message"` } +type workflowCreateArg struct { + name string + envName string + buildStageEnabled bool + ArtifactStageEnabled bool +} + +type workflowCreateArgs struct { + productName string + argsMap map[string]*workflowCreateArg +} + +func (args *workflowCreateArgs) addWorkflowArg(envName string, buildStageEnabled, artifactStageEnabled bool) { + wName := fmt.Sprintf("%s-workflow-%s", args.productName, envName) + if artifactStageEnabled { + wName = fmt.Sprintf("%s-%s-workflow", args.productName, "ops") + } + args.argsMap[wName] = &workflowCreateArg{ + name: wName, + envName: envName, + buildStageEnabled: buildStageEnabled, + ArtifactStageEnabled: artifactStageEnabled, + } +} + +func (args *workflowCreateArgs) initDefaultWorkflows() { + args.addWorkflowArg("dev", true, false) + args.addWorkflowArg("qa", true, false) + args.addWorkflowArg("", false, true) +} + +func (args *workflowCreateArgs) clear() { + args.argsMap = make(map[string]*workflowCreateArg) +} + func AutoCreateWorkflow(productName string, log *zap.SugaredLogger) *EnvStatus { productTmpl, err := template.NewProductColl().Find(productName) if err != nil { @@ -58,20 +93,42 @@ func AutoCreateWorkflow(productName string, log *zap.SugaredLogger) *EnvStatus { mut.Unlock() }() - workflowNames := []string{productName + "-workflow-dev", productName + "-workflow-qa", productName + "-workflow-ops"} + createArgs := &workflowCreateArgs{ + productName: productName, + argsMap: make(map[string]*workflowCreateArg), + } + createArgs.initDefaultWorkflows() + + // helm project may have customized products, use the real created products + if productTmpl.ProductFeature != nil && productTmpl.ProductFeature.DeployType == setting.HelmDeployType { + productList, err := commonrepo.NewProductColl().List(&commonrepo.ProductListOptions{ + Name: productName, + }) + if err != nil { + log.Errorf("fialed to list products, projectName %s, err %s", productName, err) + } + createArgs.clear() + for _, product := range productList { + createArgs.addWorkflowArg(product.EnvName, true, false) + } + createArgs.addWorkflowArg("", false, true) + } + // 云主机场景不创建ops工作流 if productTmpl.ProductFeature != nil && productTmpl.ProductFeature.CreateEnvType == setting.SourceFromExternal { - workflowNames = []string{productName + "-workflow-dev"} + createArgs.clear() + createArgs.addWorkflowArg("dev", true, false) } workflowSlice := sets.NewString() - for _, workflowName := range workflowNames { + for workflowName, _ := range createArgs.argsMap { _, err := FindWorkflow(workflowName, log) if err == nil { workflowSlice.Insert(workflowName) } } - if len(workflowSlice) < len(workflowNames) { + + if len(workflowSlice) < len(createArgs.argsMap) { preSetResps, err := PreSetWorkflow(productName, log) if err != nil { errList = multierror.Append(errList, err) @@ -91,7 +148,7 @@ func AutoCreateWorkflow(productName string, log *zap.SugaredLogger) *EnvStatus { artifactModules = append(artifactModules, artifactModule) } - for _, workflowName := range workflowNames { + for workflowName, workflowArg := range createArgs.argsMap { if workflowSlice.Has(workflowName) { continue } @@ -104,24 +161,19 @@ func AutoCreateWorkflow(productName string, log *zap.SugaredLogger) *EnvStatus { workflow.Name = workflowName workflow.CreateBy = setting.SystemUser workflow.UpdateBy = setting.SystemUser - workflow.EnvName = "dev" + workflow.EnvName = workflowArg.envName workflow.BuildStage = &commonmodels.BuildStage{ - Enabled: true, + Enabled: workflowArg.buildStageEnabled, Modules: buildModules, } - if strings.Contains(workflowName, "qa") { - workflow.EnvName = "qa" - } - - if strings.Contains(workflowName, "ops") { - //如果是开启artifactStage,则关闭buildStage - workflow.BuildStage.Enabled = false + //如果是开启artifactStage,则关闭buildStage + if workflowArg.ArtifactStageEnabled { workflow.ArtifactStage = &commonmodels.ArtifactStage{ Enabled: true, Modules: artifactModules, } - workflow.EnvName = "ops" + workflow.EnvName = "ops" //TODO necessary to set a fake env name? } workflow.Schedules = &commonmodels.ScheduleCtrl{ @@ -158,7 +210,7 @@ func AutoCreateWorkflow(productName string, log *zap.SugaredLogger) *EnvStatus { return &EnvStatus{Status: setting.ProductStatusFailed, ErrMessage: err.Error()} } return &EnvStatus{Status: setting.ProductStatusCreating} - } else if len(workflowSlice) == len(workflowNames) { + } else if len(workflowSlice) == len(createArgs.argsMap) { return &EnvStatus{Status: setting.ProductStatusSuccess} } return nil @@ -420,8 +472,8 @@ func validateWorkflowHookNames(w *commonmodels.Workflow) error { return validateHookNames(names) } -func ListWorkflows(queryType, userID string, log *zap.SugaredLogger) ([]*commonmodels.Workflow, error) { - workflows, err := commonrepo.NewWorkflowColl().List(&commonrepo.ListWorkflowOption{}) +func ListWorkflows(queryType string, productName string, userID string, log *zap.SugaredLogger) ([]*commonmodels.Workflow, error) { + workflows, err := commonrepo.NewWorkflowColl().List(&commonrepo.ListWorkflowOption{ProductName: productName}) if err != nil { log.Errorf("Workflow.List error: %v", err) return workflows, e.ErrListWorkflow.AddDesc(err.Error()) diff --git a/pkg/microservice/aslan/core/workflow/service/workflow/workflow_task.go b/pkg/microservice/aslan/core/workflow/service/workflow/workflow_task.go index 4184d9aa5..b15e4f54a 100644 --- a/pkg/microservice/aslan/core/workflow/service/workflow/workflow_task.go +++ b/pkg/microservice/aslan/core/workflow/service/workflow/workflow_task.go @@ -126,6 +126,31 @@ func getProductTargetMap(prod *commonmodels.Product) map[string][]commonmodels.D resp := make(map[string][]commonmodels.DeployEnv) if prod.Source == setting.SourceFromExternal { services, _ := commonrepo.NewServiceColl().ListExternalWorkloadsBy(prod.ProductName, prod.EnvName) + + currentServiceNames := sets.NewString() + for _, service := range services { + currentServiceNames.Insert(service.ServiceName) + } + + servicesInExternalEnv, _ := commonrepo.NewServicesInExternalEnvColl().List(&commonrepo.ServicesInExternalEnvArgs{ + ProductName: prod.ProductName, + EnvName: prod.EnvName, + }) + + externalServiceNames := sets.NewString() + for _, serviceInExternalEnv := range servicesInExternalEnv { + if !currentServiceNames.Has(serviceInExternalEnv.ServiceName) { + externalServiceNames.Insert(serviceInExternalEnv.ServiceName) + } + } + + if len(externalServiceNames) > 0 { + newServices, _ := commonrepo.NewServiceColl().ListExternalWorkloadsBy(prod.ProductName, "", externalServiceNames.List()...) + for _, service := range newServices { + services = append(services, service) + } + } + for _, service := range services { for _, container := range service.Containers { env := service.ServiceName + "/" + container.Name diff --git a/pkg/microservice/reaper/core/service/meta/const.go b/pkg/microservice/reaper/core/service/meta/const.go index d7d8fb663..d0385d722 100644 --- a/pkg/microservice/reaper/core/service/meta/const.go +++ b/pkg/microservice/reaper/core/service/meta/const.go @@ -22,8 +22,6 @@ const ( // ProviderGitlab ... ProviderGitlab = "gitlab" - //ProviderIlyshin - ProviderIlyshin = "ilyshin" // ProviderGerrit ProviderGerrit = "gerrit" diff --git a/pkg/microservice/reaper/core/service/meta/types.go b/pkg/microservice/reaper/core/service/meta/types.go index 1720cc789..4a587d481 100644 --- a/pkg/microservice/reaper/core/service/meta/types.go +++ b/pkg/microservice/reaper/core/service/meta/types.go @@ -396,7 +396,7 @@ func (g *Git) HTTPSCloneURL(source, token, owner, name string) string { // e.g. //https://oauth2:ACCESS_TOKEN@somegitlab.com/owner/name.git func (g *Git) OAuthCloneURL(source, token, address, owner, name, scheme string) string { - if strings.ToLower(source) == ProviderGitlab || strings.ToLower(source) == ProviderIlyshin { + if strings.ToLower(source) == ProviderGitlab { // address 需要传过来 return fmt.Sprintf("%s://%s:%s@%s/%s/%s.git", scheme, OauthTokenPrefix, token, address, owner, name) } diff --git a/pkg/microservice/reaper/core/service/reaper/git.go b/pkg/microservice/reaper/core/service/reaper/git.go index 4dbc6c0b8..01fdeed92 100644 --- a/pkg/microservice/reaper/core/service/reaper/git.go +++ b/pkg/microservice/reaper/core/service/reaper/git.go @@ -100,8 +100,6 @@ func (r *Reaper) runGitCmds() error { } } else if repo.Source == meta.ProviderCodehub { tokens = append(tokens, repo.Password) - } else if repo.Source == meta.ProviderIlyshin { - cmds = append(cmds, &c.Command{Cmd: c.SetConfig("http.sslVerify", "false"), DisableTrace: true}) } tokens = append(tokens, repo.OauthToken) cmds = append(cmds, r.buildGitCommands(repo)...) @@ -172,7 +170,7 @@ func (r *Reaper) buildGitCommands(repo *meta.Repo) []*c.Command { cmds = append(cmds, &c.Command{Cmd: c.RemoteRemove(repo.RemoteName), DisableTrace: true, IgnoreError: true}) } - if repo.Source == meta.ProviderGitlab || repo.Source == meta.ProviderIlyshin { + if repo.Source == meta.ProviderGitlab { u, _ := url.Parse(repo.Address) cmds = append(cmds, &c.Command{ Cmd: c.RemoteAdd(repo.RemoteName, r.Ctx.Git.OAuthCloneURL(repo.Source, repo.OauthToken, u.Host, repo.Owner, repo.Name, u.Scheme)), diff --git a/pkg/microservice/warpdrive/core/service/taskplugin/deploy.go b/pkg/microservice/warpdrive/core/service/taskplugin/deploy.go index 663a3e530..d82c9e31a 100644 --- a/pkg/microservice/warpdrive/core/service/taskplugin/deploy.go +++ b/pkg/microservice/warpdrive/core/service/taskplugin/deploy.go @@ -403,6 +403,11 @@ func (p *DeployTaskPlugin) Run(ctx context.Context, pipelineTask *task.Task, _ * return } + if targetContainer.ImagePath == nil { + err = errors.Errorf("failed to get image path of %s from service %s", p.Task.ContainerName, p.Task.ServiceName) + return + } + for _, chartInfo := range renderInfo.ChartInfos { if chartInfo.ServiceName == p.Task.ServiceName { renderChart = chartInfo @@ -446,7 +451,7 @@ func (p *DeployTaskPlugin) Run(ctx context.Context, pipelineTask *task.Task, _ * } // merge override values and kvs into service's yaml - mergedValuesYaml, err = helmtool.MergeOverrideValues(serviceValuesYaml, renderChart.GetOverrideYaml(), renderChart.OverrideValues) + mergedValuesYaml, err = helmtool.MergeOverrideValues(serviceValuesYaml, renderInfo.DefaultValues, renderChart.GetOverrideYaml(), renderChart.OverrideValues) if err != nil { err = errors.WithMessagef( err, @@ -530,9 +535,10 @@ func (p *DeployTaskPlugin) Run(ctx context.Context, pipelineTask *task.Task, _ * // TODO too dangerous to override entire renderset! err = p.updateRenderSet(ctx, &types.RenderSet{ - Name: renderInfo.Name, - Revision: renderInfo.Revision, - ChartInfos: renderInfo.ChartInfos, + Name: renderInfo.Name, + Revision: renderInfo.Revision, + DefaultValues: renderInfo.DefaultValues, + ChartInfos: renderInfo.ChartInfos, }) if err != nil { err = errors.WithMessagef( diff --git a/pkg/microservice/warpdrive/core/service/types/environment.go b/pkg/microservice/warpdrive/core/service/types/environment.go index b8ac9e7ee..5de5d8602 100644 --- a/pkg/microservice/warpdrive/core/service/types/environment.go +++ b/pkg/microservice/warpdrive/core/service/types/environment.go @@ -67,7 +67,7 @@ type GitRepoConfig struct { Branch string `bson:"branch,omitempty"` } -type OverrideYaml struct { +type CustomYaml struct { YamlSource string `bson:"yaml_source,omitempty" json:"yaml_source,omitempty"` YamlContent string `bson:"yaml_content,omitempty" json:"yaml_content,omitempty"` GitRepoConfig *GitRepoConfig `bson:"git_repo_config,omitempty" json:"git_repo_config,omitempty"` @@ -75,11 +75,11 @@ type OverrideYaml struct { } type RenderChart struct { - ServiceName string `bson:"service_name,omitempty" json:"service_name,omitempty"` - ChartVersion string `bson:"chart_version,omitempty" json:"chart_version,omitempty"` - ValuesYaml string `bson:"values_yaml,omitempty" json:"values_yaml,omitempty"` - OverrideYaml *OverrideYaml `bson:"override_yaml,omitempty" json:"override_yaml,omitempty"` - OverrideValues string `bson:"override_values,omitempty" json:"override_values,omitempty"` + ServiceName string `bson:"service_name,omitempty" json:"service_name,omitempty"` + ChartVersion string `bson:"chart_version,omitempty" json:"chart_version,omitempty"` + ValuesYaml string `bson:"values_yaml,omitempty" json:"values_yaml,omitempty"` + OverrideYaml *CustomYaml `bson:"override_yaml,omitempty" json:"override_yaml,omitempty"` + OverrideValues string `bson:"override_values,omitempty" json:"override_values,omitempty"` } type ProductAuth struct { @@ -98,17 +98,6 @@ type Service struct { EnvConfigs []*EnvConfig `bson:"-" json:"env_configs,omitempty"` } -//type EnvConfig struct { -// EnvName string `json:"env_name"` -// HostIDs []string `json:"host_ids"` -//} -// -//// Container ... -//type Container struct { -// Name string `bson:"name" json:"name"` -// Image string `bson:"image" json:"image"` -//} - // Config ... type Config struct { ConfigName string `bson:"config_name" json:"config_name"` diff --git a/pkg/microservice/warpdrive/core/service/types/renderset.go b/pkg/microservice/warpdrive/core/service/types/renderset.go index 0552cad50..3d469a789 100644 --- a/pkg/microservice/warpdrive/core/service/types/renderset.go +++ b/pkg/microservice/warpdrive/core/service/types/renderset.go @@ -22,15 +22,16 @@ type RenderSet struct { Name string `bson:"name" json:"name"` Revision int64 `bson:"revision" json:"revision"` // 可以为空,空时为产品模板默认的渲染集,非空时为环境的渲染集 - EnvName string `bson:"env_name,omitempty" json:"env_name,omitempty"` - ProductTmpl string `bson:"product_tmpl" json:"product_tmpl"` - Team string `bson:"team,omitempty" json:"team,omitempty"` - UpdateTime int64 `bson:"update_time" json:"update_time"` - UpdateBy string `bson:"update_by" json:"update_by"` - IsDefault bool `bson:"is_default" json:"is_default"` // 是否是默认配置 - KVs []*RenderKV `bson:"kvs,omitempty" json:"kvs,omitempty"` - ChartInfos []*RenderChart `bson:"chart_infos,omitempty" json:"chart_infos,omitempty"` - Description string `bson:"description,omitempty" json:"description,omitempty"` + EnvName string `bson:"env_name,omitempty" json:"env_name,omitempty"` + ProductTmpl string `bson:"product_tmpl" json:"product_tmpl"` + Team string `bson:"team,omitempty" json:"team,omitempty"` + UpdateTime int64 `bson:"update_time" json:"update_time"` + UpdateBy string `bson:"update_by" json:"update_by"` + IsDefault bool `bson:"is_default" json:"is_default"` // 是否是默认配置 + DefaultValues string `bson:"default_values,omitempty" json:"default_values,omitempty"` //环境默认变量 ›yaml content + KVs []*RenderKV `bson:"kvs,omitempty" json:"kvs,omitempty"` + ChartInfos []*RenderChart `bson:"chart_infos,omitempty" json:"chart_infos,omitempty"` + Description string `bson:"description,omitempty" json:"description,omitempty"` } //// RenderChart ... diff --git a/pkg/setting/consts.go b/pkg/setting/consts.go index 198158280..3f28e61c3 100644 --- a/pkg/setting/consts.go +++ b/pkg/setting/consts.go @@ -232,8 +232,6 @@ const ( SourceFromGerrit = "gerrit" // SourceFromCodeHub 配置来源为codehub SourceFromCodeHub = "codehub" - // SourceFromIlyshin 配置来源为ilyshin - SourceFromIlyshin = "ilyshin" // SourceFromChartTemplate 配置来源为helmTemplate SourceFromChartTemplate = "chartTemplate" // SourceFromPublicRepo 配置来源为publicRepo diff --git a/pkg/shared/codehost/codehost.go b/pkg/shared/codehost/codehost.go index f86b08037..170a3ca07 100644 --- a/pkg/shared/codehost/codehost.go +++ b/pkg/shared/codehost/codehost.go @@ -29,7 +29,6 @@ const ( GitHubProvider = "github" GerritProvider = "gerrit" CodeHubProvider = "codehub" - IlyshinProvider = "ilyshin" ) type CodeHost struct { diff --git a/pkg/tool/helmclient/helmclient.go b/pkg/tool/helmclient/helmclient.go index f786d63c0..93a2a0fd6 100644 --- a/pkg/tool/helmclient/helmclient.go +++ b/pkg/tool/helmclient/helmclient.go @@ -46,21 +46,19 @@ type KV struct { Value string `json:"value"` } -// MergeOverrideValues merge values.yaml and override values -// overrideYaml used for -f option +// MergeOverrideValues merge override yaml and override kvs +// defaultValues overrideYaml used for -f option // overrideValues used for --set option -func MergeOverrideValues(valuesYaml, overrideYaml, overrideValues string) (string, error) { +func MergeOverrideValues(valuesYaml, defaultValues, overrideYaml, overrideValues string) (string, error) { - if overrideYaml == "" && overrideValues == "" { - return valuesYaml, nil - } - - // merge files for -f option - values, err := yamlutil.MergeAndUnmarshal([][]byte{[]byte(valuesYaml), []byte(overrideYaml)}) + // merge files for helm -f option + // precedence from low to high: valuesYaml defaultValues overrideYaml + valuesMap, err := yamlutil.MergeAndUnmarshal([][]byte{[]byte(valuesYaml), []byte(defaultValues), []byte(overrideYaml)}) if err != nil { return "", err } + // merge kv values for helm --set option if overrideValues != "" { kvList := make([]*KV, 0) err = json.Unmarshal([]byte(overrideValues), &kvList) @@ -72,13 +70,13 @@ func MergeOverrideValues(valuesYaml, overrideYaml, overrideValues string) (strin kvStr = append(kvStr, fmt.Sprintf("%s=%s", kv.Key, kv.Value)) } // override values for --set option - err = strvals.ParseInto(strings.Join(kvStr, ","), values) + err = strvals.ParseInto(strings.Join(kvStr, ","), valuesMap) if err != nil { return "", err } } - bs, err := yaml.Marshal(values) + bs, err := yaml.Marshal(valuesMap) if err != nil { return "", err } diff --git a/pkg/tool/ilyshin/branch.go b/pkg/tool/ilyshin/branch.go deleted file mode 100644 index aa168d3ee..000000000 --- a/pkg/tool/ilyshin/branch.go +++ /dev/null @@ -1,57 +0,0 @@ -/* -Copyright 2021 The KodeRover 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 ilyshin - -import ( - "fmt" - "net/url" - - "go.uber.org/zap" - - "github.com/koderover/zadig/pkg/tool/httpclient" -) - -type Branch struct { - Name string `json:"name"` - Protected bool `json:"protected"` - Merged bool `json:"merged"` - Default bool `json:"default"` - CanPush bool `json:"can_push"` - DevelopersCanPush bool `json:"developers_can_push"` - DevelopersCanMerge bool `json:"developers_can_merge"` - Commit *Commit `json:"commit"` -} - -func (c *Client) ListBranches(owner, repo string, log *zap.SugaredLogger) ([]*Branch, error) { - url := fmt.Sprintf("/api/v4/projects/%s/repository/branches", generateProjectName(owner, repo)) - qs := map[string]string{ - "per_page": "100", - } - - var err error - var branches []*Branch - if _, err = c.Get(url, httpclient.SetQueryParams(qs), httpclient.SetResult(&branches)); err != nil { - log.Errorf("Failed to list project branches, error: %s", err) - return branches, err - } - - return branches, nil -} - -func generateProjectName(owner, repo string) string { - return url.PathEscape(fmt.Sprintf("%s/%s", owner, repo)) -} diff --git a/pkg/tool/ilyshin/client.go b/pkg/tool/ilyshin/client.go deleted file mode 100644 index 03a9d3a41..000000000 --- a/pkg/tool/ilyshin/client.go +++ /dev/null @@ -1,43 +0,0 @@ -/* -Copyright 2021 The KodeRover 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 ilyshin - -import ( - "crypto/tls" - - "github.com/koderover/zadig/pkg/tool/httpclient" -) - -type Client struct { - *httpclient.Client - Address string - AccessToken string -} - -func NewClient(address, accessToken string) *Client { - c := httpclient.New( - httpclient.SetAuthScheme("Bearer"), - httpclient.SetAuthToken(accessToken), - httpclient.SetHostURL(address), - httpclient.SetTLSClientConfig(&tls.Config{InsecureSkipVerify: true}), - ) - return &Client{ - Client: c, - Address: address, - AccessToken: accessToken, - } -} diff --git a/pkg/tool/ilyshin/commit.go b/pkg/tool/ilyshin/commit.go deleted file mode 100644 index e90f7a76c..000000000 --- a/pkg/tool/ilyshin/commit.go +++ /dev/null @@ -1,61 +0,0 @@ -/* -Copyright 2021 The KodeRover 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 ilyshin - -import ( - "fmt" - "time" - - "go.uber.org/zap" - - "github.com/koderover/zadig/pkg/tool/httpclient" -) - -type Commit struct { - ID string `json:"id"` - ShortID string `json:"short_id"` - Title string `json:"title"` - Message string `json:"message"` - AuthorName string `json:"author_name"` - AuthorEmail string `json:"author_email"` - AuthoredDate *time.Time `json:"authored_date"` - CommitterName string `json:"committer_name"` - CommitterEmail string `json:"committer_email"` - CommittedDate *time.Time `json:"committed_date"` - CreatedAt *time.Time `json:"created_at"` -} - -func (c *Client) GetLatestCommit(owner, repo, branch, path string, log *zap.SugaredLogger) (*Commit, error) { - url := fmt.Sprintf("/api/v4/projects/%s/repository/commits", generateProjectName(owner, repo)) - qs := map[string]string{ - "per_page": "1", - "ref_name": branch, - "path": path, - } - - var err error - var commits []*Commit - if _, err = c.Get(url, httpclient.SetQueryParams(qs), httpclient.SetResult(&commits)); err != nil { - log.Errorf("Failed to list project commits, error: %s", err) - return nil, err - } - if len(commits) == 0 { - return nil, fmt.Errorf("not found commits") - } - - return commits[0], nil -} diff --git a/pkg/tool/ilyshin/event_parsing.go b/pkg/tool/ilyshin/event_parsing.go deleted file mode 100644 index ff06dc349..000000000 --- a/pkg/tool/ilyshin/event_parsing.go +++ /dev/null @@ -1,179 +0,0 @@ -/* -Copyright 2021 The KodeRover 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 ilyshin - -import ( - "encoding/json" - "fmt" - "net/http" - "time" -) - -type ProjectEvent struct { - ID int `json:"id"` - Name string `json:"name"` - Description string `json:"description"` - AvatarURL string `json:"avatar_url"` - GitSSHURL string `json:"git_ssh_url"` - GitHTTPURL string `json:"git_http_url"` - Namespace string `json:"namespace"` - PathWithNamespace string `json:"path_with_namespace"` - DefaultBranch string `json:"default_branch"` - Homepage string `json:"homepage"` - URL string `json:"url"` - SSHURL string `json:"ssh_url"` - HTTPURL string `json:"http_url"` - WebURL string `json:"web_url"` -} - -type Repository struct { - Name string `json:"name"` - Description string `json:"description"` - WebURL string `json:"web_url"` - AvatarURL string `json:"avatar_url"` - GitSSHURL string `json:"git_ssh_url"` - GitHTTPURL string `json:"git_http_url"` - Namespace string `json:"namespace"` - PathWithNamespace string `json:"path_with_namespace"` - DefaultBranch string `json:"default_branch"` - Homepage string `json:"homepage"` - URL string `json:"url"` - SSHURL string `json:"ssh_url"` - HTTPURL string `json:"http_url"` -} - -type ObjectAttributes struct { - ID int `json:"id"` - TargetBranch string `json:"target_branch"` - SourceBranch string `json:"source_branch"` - SourceProjectID int `json:"source_project_id"` - AuthorID int `json:"author_id"` - AssigneeID int `json:"assignee_id"` - AssigneeIDs []int `json:"assignee_ids"` - Title string `json:"title"` - StCommits []*Commit `json:"st_commits"` - MilestoneID int `json:"milestone_id"` - State string `json:"state"` - MergeStatus string `json:"merge_status"` - TargetProjectID int `json:"target_project_id"` - IID int `json:"iid"` - Description string `json:"description"` - Position int `json:"position"` - LockedAt string `json:"locked_at"` - UpdatedByID int `json:"updated_by_id"` - MergeError string `json:"merge_error"` - MergeWhenBuildSucceeds bool `json:"merge_when_build_succeeds"` - MergeUserID int `json:"merge_user_id"` - MergeCommitSHA string `json:"merge_commit_sha"` - DeletedAt string `json:"deleted_at"` - ApprovalsBeforeMerge string `json:"approvals_before_merge"` - RebaseCommitSHA string `json:"rebase_commit_sha"` - InProgressMergeCommitSHA string `json:"in_progress_merge_commit_sha"` - LockVersion int `json:"lock_version"` - TimeEstimate int `json:"time_estimate"` - Target *Repository `json:"target"` - LastCommit LastCommit `json:"last_commit"` - WorkInProgress bool `json:"work_in_progress"` - URL string `json:"url"` - Action string `json:"action"` - OldRev string `json:"oldrev"` -} - -type LastCommit struct { - ID string `json:"id"` - Message string `json:"message"` - Timestamp *time.Time `json:"timestamp"` - URL string `json:"url"` - Author Author `json:"author"` -} - -type MergeEvent struct { - ObjectKind string `json:"object_kind"` - Project ProjectEvent `json:"project"` - ObjectAttributes ObjectAttributes `json:"object_attributes"` -} - -type PushEvent struct { - ObjectKind string `json:"object_kind"` - Before string `json:"before"` - After string `json:"after"` - Ref string `json:"ref"` - CheckoutSHA string `json:"checkout_sha"` - UserID int `json:"user_id"` - UserName string `json:"user_name"` - UserUsername string `json:"user_username"` - UserEmail string `json:"user_email"` - UserAvatar string `json:"user_avatar"` - ProjectID int `json:"project_id"` - Project ProjectEvent `json:"project"` - Commits []Commits `json:"commits"` - TotalCommitsCount int `json:"total_commits_count"` -} - -type Commits struct { - ID string `json:"id"` - Message string `json:"message"` - Timestamp *time.Time `json:"timestamp"` - URL string `json:"url"` - Author Author `json:"author"` - Added []string `json:"added"` - Modified []string `json:"modified"` - Removed []string `json:"removed"` -} - -type Author struct { - Name string `json:"name"` - Email string `json:"email"` -} - -// EventType represents a ilyshin event type. -type EventType string - -// List of available event types. -const ( - EventTypeMergeRequest EventType = "Merge Request Hook" - EventTypePush EventType = "Push Hook" - EventTypeTagPush EventType = "Tag Push Hook" -) - -const eventTypeHeader = "X-CodeHub-Event" - -// HookEventType returns the event type for the given request. -func HookEventType(r *http.Request) EventType { - return EventType(r.Header.Get(eventTypeHeader)) -} - -func ParseHook(eventType EventType, payload []byte) (event interface{}, err error) { - return parseWebhook(eventType, payload) -} - -func parseWebhook(eventType EventType, payload []byte) (event interface{}, err error) { - switch eventType { - case EventTypeMergeRequest: - event = &MergeEvent{} - case EventTypePush: - event = &PushEvent{} - default: - return nil, fmt.Errorf("unexpected event type: %s", eventType) - } - - if err := json.Unmarshal(payload, event); err != nil { - return nil, err - } - - return event, nil -} diff --git a/pkg/tool/ilyshin/group_project.go b/pkg/tool/ilyshin/group_project.go deleted file mode 100644 index ffcb7ca35..000000000 --- a/pkg/tool/ilyshin/group_project.go +++ /dev/null @@ -1,45 +0,0 @@ -/* -Copyright 2021 The KodeRover 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 ilyshin - -import ( - "fmt" - - "go.uber.org/zap" - - "github.com/koderover/zadig/pkg/tool/httpclient" -) - -func (c *Client) ListGroupProjects(namespace, keyword string, log *zap.SugaredLogger) ([]*Project, error) { - url := fmt.Sprintf("/api/v4/groups/%s/projects", namespace) - qs := map[string]string{ - "order_by": "name", - "sort": "asc", - "per_page": "100", - } - if keyword != "" && len(keyword) > 2 { - qs["search"] = keyword - } - var err error - var gps []*Project - if _, err = c.Get(url, httpclient.SetQueryParams(qs), httpclient.SetResult(&gps)); err != nil { - log.Errorf("Failed to list group projects, error: %s", err) - return gps, err - } - - return gps, nil -} diff --git a/pkg/tool/ilyshin/merge_request.go b/pkg/tool/ilyshin/merge_request.go deleted file mode 100644 index 0b1668662..000000000 --- a/pkg/tool/ilyshin/merge_request.go +++ /dev/null @@ -1,115 +0,0 @@ -/* -Copyright 2021 The KodeRover 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 ilyshin - -import ( - "fmt" - "time" - - "go.uber.org/zap" - - "github.com/koderover/zadig/pkg/tool/httpclient" - "github.com/koderover/zadig/pkg/tool/log" -) - -type MergeRequest struct { - ID int `json:"id"` - IID int `json:"iid"` - ProjectID int `json:"project_id"` - Title string `json:"title"` - State string `json:"state"` - CreatedAt *time.Time `json:"created_at"` - UpdatedAt *time.Time `json:"updated_at"` - SourceBranch string `json:"source_branch"` - TargetBranch string `json:"target_branch"` - SourceProjectID int `json:"source_project_id"` - TargetProjectID int `json:"target_project_id"` - Description string `json:"description"` - Author *BasicUser `json:"author"` - Changes []Changes `json:"changes"` -} - -type Changes struct { - OldPath string `json:"old_path"` - NewPath string `json:"new_path"` - AMode string `json:"a_mode"` - BMode string `json:"b_mode"` - Diff string `json:"diff"` - NewFile bool `json:"new_file"` - RenamedFile bool `json:"renamed_file"` - DeletedFile bool `json:"deleted_file"` -} - -type BasicUser struct { - ID int `json:"id"` - Username string `json:"username"` - Name string `json:"name"` - State string `json:"state"` - CreatedAt *time.Time `json:"created_at"` - AvatarURL string `json:"avatar_url"` - WebURL string `json:"web_url"` -} - -func (c *Client) ListOpenedProjectMergeRequests(owner, repo, targetBranch string, log *zap.SugaredLogger) ([]*MergeRequest, error) { - url := fmt.Sprintf("/api/v4/projects/%s/isource/merge_requests", generateProjectName(owner, repo)) - qs := map[string]string{ - "state": "opened", - "per_page": "100", - } - if targetBranch != "" { - qs["target_branch"] = targetBranch - } - - var err error - var mergeRequests []*MergeRequest - if _, err = c.Get(url, httpclient.SetQueryParams(qs), httpclient.SetResult(&mergeRequests)); err != nil { - log.Errorf("Failed to list project mergeRequests, error: %s", err) - return mergeRequests, err - } - - return mergeRequests, nil -} - -func (c *Client) ListChangedFiles(event *MergeEvent) ([]string, error) { - files := make([]string, 0) - - url := fmt.Sprintf("/api/v4/projects/%d/merge_requests/%d/changes", event.ObjectAttributes.TargetProjectID, event.ObjectAttributes.IID) - var err error - var mergeRequest *MergeRequest - if _, err = c.Get(url, httpclient.SetResult(&mergeRequest)); err != nil { - log.Errorf("Failed to get project mergeRequest, error: %s", err) - return files, err - } - - for _, change := range mergeRequest.Changes { - files = append(files, change.NewPath) - files = append(files, change.OldPath) - } - - return files, nil -} - -func (c *Client) GetLatestPRCommitList(projectID string, pr int, log *zap.SugaredLogger) (*Commit, error) { - url := fmt.Sprintf("/api/v4/projects/%s/merge_requests/%d/commits", projectID, pr) - - var commit *Commit - if _, err := c.Get(url, httpclient.SetResult(&commit)); err != nil { - log.Errorf("Failed to get project mergeRequest commits, error: %s", err) - return commit, err - } - return commit, nil -} diff --git a/pkg/tool/ilyshin/project.go b/pkg/tool/ilyshin/project.go deleted file mode 100644 index d348a2da4..000000000 --- a/pkg/tool/ilyshin/project.go +++ /dev/null @@ -1,80 +0,0 @@ -/* -Copyright 2021 The KodeRover 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 ilyshin - -import ( - "fmt" - "time" - - "go.uber.org/zap" - "k8s.io/apimachinery/pkg/util/sets" - - "github.com/koderover/zadig/pkg/tool/httpclient" -) - -type Project struct { - ID int `json:"id"` - Description string `json:"description"` - Name string `json:"name"` - NameWithNamespace string `json:"name_with_namespace"` - Path string `json:"path"` - PathWithNamespace string `json:"path_with_namespace"` - CreatedAt *time.Time `json:"created_at,omitempty"` - Archived bool `json:"archived"` - DefaultBranch string `json:"default_branch"` - Namespace *ProjectNamespace `json:"namespace"` -} - -type ProjectNamespace struct { - ID int `json:"id"` - Name string `json:"name"` - Path string `json:"path"` - Kind string `json:"kind"` - FullPath string `json:"full_path"` -} - -func (c *Client) ListNamespaces(keyword string, log *zap.SugaredLogger) ([]*Project, error) { - url := fmt.Sprintf("/api/v4/projects") - qs := map[string]string{ - "order_by": "name", - "sort": "asc", - "project_type": "group", // group or project - "per_page": "100", - "simple": "true", - } - if keyword != "" && len(keyword) > 2 { - qs["search"] = keyword - } - var err error - var gps []*Project - if _, err = c.Get(url, httpclient.SetQueryParams(qs), httpclient.SetResult(&gps)); err != nil { - log.Errorf("Failed to list projects, error: %s", err) - return gps, err - } - - var resp []*Project - projectNames := sets.NewString() - for _, gp := range gps { - if projectNames.Has(gp.Namespace.Name) || gp.Namespace.Kind == "user" { - continue - } - - projectNames.Insert(gp.Namespace.Name) - resp = append(resp, gp) - } - return resp, nil -} diff --git a/pkg/tool/ilyshin/repo.go b/pkg/tool/ilyshin/repo.go deleted file mode 100644 index 1bd95db41..000000000 --- a/pkg/tool/ilyshin/repo.go +++ /dev/null @@ -1,122 +0,0 @@ -/* -Copyright 2021 The KodeRover 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 ilyshin - -import ( - "fmt" - - "github.com/koderover/zadig/pkg/tool/httpclient" - "github.com/koderover/zadig/pkg/tool/log" -) - -type TreeNode struct { - ID string `json:"id"` - Name string `json:"name"` - Type string `json:"type"` - Path string `json:"path"` - Mode string `json:"mode"` -} - -type File struct { - FileName string `json:"file_name"` - FilePath string `json:"file_path"` - Size int `json:"size"` - Encoding string `json:"encoding"` - Content string `json:"content"` - Ref string `json:"ref"` - BlobID string `json:"blob_id"` - CommitID string `json:"commit_id"` - SHA256 string `json:"content_sha256"` - LastCommitID string `json:"last_commit_id"` -} - -type Diff struct { - Diff string `json:"diff"` - NewPath string `json:"new_path"` - OldPath string `json:"old_path"` - AMode string `json:"a_mode"` - BMode string `json:"b_mode"` - NewFile bool `json:"new_file"` - RenamedFile bool `json:"renamed_file"` - DeletedFile bool `json:"deleted_file"` -} - -func (c *Client) ListTree(owner, repo string, ref string, path string) ([]*TreeNode, error) { - url := fmt.Sprintf("/api/v4/projects/%s/repository/tree", generateProjectName(owner, repo)) - qs := map[string]string{ - "ref": ref, - "path": path, - "per_page": "100", - } - - var err error - var treeNodes []*TreeNode - if _, err = c.Get(url, httpclient.SetQueryParams(qs), httpclient.SetResult(&treeNodes)); err != nil { - log.Errorf("Failed to list project tree nodes, error: %s", err) - return treeNodes, err - } - - return treeNodes, nil -} - -func (c *Client) GetRawFile(owner, repo string, sha string, fileName string) ([]byte, error) { - File, err := c.GetFile(owner, repo, sha, fileName) - if err != nil { - return nil, err - } - var resp []byte - url := fmt.Sprintf("/api/v4/projects/%s/repository/blobs/%s/raw", generateProjectName(owner, repo), File.BlobID) - if _, err = c.Get(url, httpclient.SetResult(&resp)); err != nil { - log.Errorf("Failed to get project blob raw, error: %s", err) - return resp, err - } - - return resp, nil -} - -func (c *Client) GetFile(owner, repo string, ref, path string) (*File, error) { - url := fmt.Sprintf("/api/v4/projects/%s/repository/files/%s", generateProjectName(owner, repo), path) - qs := map[string]string{ - "ref": ref, - } - - var err error - var file *File - if _, err = c.Get(url, httpclient.SetQueryParams(qs), httpclient.SetResult(&file)); err != nil { - log.Errorf("Failed to get project file content, error: %s", err) - return file, err - } - - return file, nil -} - -func (c *Client) Compare(projectID int, from, to string) ([]*Diff, error) { - url := fmt.Sprintf("/api/v4/projects/%d/repository/compare", projectID) - qs := map[string]string{ - "from": from, - "to": to, - } - - var err error - var diffs []*Diff - if _, err = c.Get(url, httpclient.SetQueryParams(qs), httpclient.SetResult(&diffs)); err != nil { - log.Errorf("Failed to compare content, error: %s", err) - return diffs, err - } - - return diffs, nil -} diff --git a/pkg/tool/ilyshin/tag.go b/pkg/tool/ilyshin/tag.go deleted file mode 100644 index cfbb81efd..000000000 --- a/pkg/tool/ilyshin/tag.go +++ /dev/null @@ -1,53 +0,0 @@ -/* -Copyright 2021 The KodeRover 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 ilyshin - -import ( - "fmt" - - "go.uber.org/zap" - - "github.com/koderover/zadig/pkg/tool/httpclient" -) - -type Tag struct { - Name string `json:"name"` - Message string `json:"message"` - Release *ReleaseNote `json:"release"` - Commit *Commit `json:"commit"` -} - -type ReleaseNote struct { - TagName string `json:"tag_name"` - Description string `json:"description"` -} - -func (c *Client) ListTags(owner, repo string, log *zap.SugaredLogger) ([]*Tag, error) { - url := fmt.Sprintf("/api/v4/projects/%s/repository/tags", generateProjectName(owner, repo)) - qs := map[string]string{ - "per_page": "100", - } - - var err error - var tags []*Tag - if _, err = c.Get(url, httpclient.SetQueryParams(qs), httpclient.SetResult(&tags)); err != nil { - log.Errorf("Failed to list project tags, error: %s", err) - return tags, err - } - - return tags, nil -} diff --git a/pkg/tool/ilyshin/webhook.go b/pkg/tool/ilyshin/webhook.go deleted file mode 100644 index 2d38c4d25..000000000 --- a/pkg/tool/ilyshin/webhook.go +++ /dev/null @@ -1,100 +0,0 @@ -/* -Copyright 2021 The KodeRover 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 ilyshin - -import ( - "fmt" - "time" - - "go.uber.org/zap" - - "github.com/koderover/zadig/pkg/tool/httpclient" - "github.com/koderover/zadig/pkg/tool/log" -) - -type ProjectHook struct { - ID int `json:"id"` - URL string `json:"url"` - ConfidentialNoteEvents bool `json:"confidential_note_events"` - ProjectID int `json:"project_id"` - PushEvents bool `json:"push_events"` - PushEventsBranchFilter string `json:"push_events_branch_filter"` - IssuesEvents bool `json:"issues_events"` - ConfidentialIssuesEvents bool `json:"confidential_issues_events"` - MergeRequestsEvents bool `json:"merge_requests_events"` - TagPushEvents bool `json:"tag_push_events"` - NoteEvents bool `json:"note_events"` - JobEvents bool `json:"job_events"` - PipelineEvents bool `json:"pipeline_events"` - WikiPageEvents bool `json:"wiki_page_events"` - DeploymentEvents bool `json:"deployment_events"` - ReleasesEvents bool `json:"releases_events"` - EnableSSLVerification bool `json:"enable_ssl_verification"` - CreatedAt *time.Time `json:"created_at"` -} - -type Hook struct { - URL string `url:"url,omitempty" json:"url,omitempty"` - Name string `url:"name,omitempty" json:"name,omitempty"` - Token string `url:"token,omitempty" json:"token,omitempty"` - PushEvents bool `url:"push_events,omitempty" json:"push_events,omitempty"` - MergeRequestsEvents bool `url:"merge_requests_events,omitempty" json:"merge_requests_events,omitempty"` - TagPushEvents bool `url:"tag_push_events,omitempty" json:"tag_push_events,omitempty"` - EnableSSLVerification bool `url:"enable_ssl_verification,omitempty" json:"enable_ssl_verification,omitempty"` -} - -func (c *Client) ListProjectHooks(owner, repo string, log *zap.SugaredLogger) ([]*ProjectHook, error) { - url := fmt.Sprintf("/api/v4/projects/%s/hooks", generateProjectName(owner, repo)) - qs := map[string]string{ - "per_page": "100", - } - - var err error - var projectHooks []*ProjectHook - if _, err = c.Get(url, httpclient.SetQueryParams(qs), httpclient.SetResult(&projectHooks)); err != nil { - log.Errorf("Failed to list project hooks, error: %s", err) - return projectHooks, err - } - - return projectHooks, nil -} - -func (c *Client) AddProjectHook(owner, repo, hookURL, token string) (*ProjectHook, error) { - url := fmt.Sprintf("/api/v4/projects/%s/hooks", generateProjectName(owner, repo)) - hook := &Hook{ - URL: hookURL, - Token: token, - MergeRequestsEvents: true, - PushEvents: true, - TagPushEvents: true, - } - var projectHook *ProjectHook - if _, err := c.Post(url, httpclient.SetBody(hook), httpclient.SetResult(&projectHook)); err != nil { - log.Errorf("Failed to create project hook, error: %s", err) - return projectHook, err - } - return projectHook, nil -} - -func (c *Client) DeleteProjectHook(owner, repo string, id int) error { - url := fmt.Sprintf("/api/v4/projects/%s/hooks/%d", generateProjectName(owner, repo), id) - if _, err := c.Delete(url); err != nil { - log.Errorf("Failed to delete project webhook, error: %s", err) - return err - } - return nil -} -- Gitee From 541d475a9b50d932da0121cb3f3ce8fa228bff73 Mon Sep 17 00:00:00 2001 From: panxunying <641770806@qq.com> Date: Wed, 3 Nov 2021 11:47:37 +0800 Subject: [PATCH 210/405] fix config convert error Signed-off-by: panxunying <641770806@qq.com> --- .../user/core/service/user/user.go | 25 ++++++++----------- .../client/systemconfig/systemconfig.go | 10 +++++--- 2 files changed, 16 insertions(+), 19 deletions(-) diff --git a/pkg/microservice/user/core/service/user/user.go b/pkg/microservice/user/core/service/user/user.go index 019e59574..e2a3704f4 100644 --- a/pkg/microservice/user/core/service/user/user.go +++ b/pkg/microservice/user/core/service/user/user.go @@ -4,7 +4,6 @@ import ( "fmt" "time" - "github.com/dexidp/dex/connector/ldap" ldapv3 "github.com/go-ldap/ldap/v3" "github.com/google/uuid" "go.uber.org/zap" @@ -72,45 +71,41 @@ func SearchAndSyncUser(ldapId string, logger *zap.SugaredLogger) error { logger.Error("can't find connector") return fmt.Errorf("can't find connector") } - config, ok := si.Config.(*ldap.Config) - if !ok { - return fmt.Errorf("connector config error") - } - l, err := ldapv3.Dial("tcp", config.Host) + l, err := ldapv3.Dial("tcp", si.Config.Host) if err != nil { - logger.Errorf("ldap dial host:%s error, error msg:%s", config.Host, err) + logger.Errorf("ldap dial host:%s error, error msg:%s", si.Config.Host, err) return err } defer l.Close() - err = l.Bind(config.BindDN, config.BindPW) + err = l.Bind(si.Config.BindDN, si.Config.BindPW) if err != nil { - logger.Errorf("ldap bind host:%s error, error msg:%s", config.Host, err) + logger.Errorf("ldap bind host:%s error, error msg:%s", si.Config.Host, err) return err } searchRequest := ldapv3.NewSearchRequest( - config.GroupSearch.BaseDN, + si.Config.GroupSearch.BaseDN, ldapv3.ScopeWholeSubtree, ldapv3.NeverDerefAliases, 0, 0, false, - config.GroupSearch.Filter, // The filter to apply - []string{config.UserSearch.NameAttr}, // A list attributes to retrieve + si.Config.GroupSearch.Filter, // The filter to apply + []string{si.Config.UserSearch.NameAttr}, // A list attributes to retrieve nil, ) sr, err := l.Search(searchRequest) if err != nil { - logger.Errorf("ldap search host:%s error, error msg:%s", config.Host, err) + logger.Errorf("ldap search host:%s error, error msg:%s", si.Config.Host, err) return err } syncUserMap := make(map[string]bool) for _, entry := range sr.Entries { - account := config.UserSearch.NameAttr + account := si.Config.UserSearch.NameAttr _, err := SyncUser(&SyncUserInfo{ Account: entry.GetAttributeValue(account), IdentityType: si.ID, }, logger) if err != nil { - logger.Errorf("ldap host:%s sync user error, error msg:%s", config.Host, err) + logger.Errorf("ldap host:%s sync user error, error msg:%s", si.Config.Host, err) return err } syncUserMap[account] = true diff --git a/pkg/shared/client/systemconfig/systemconfig.go b/pkg/shared/client/systemconfig/systemconfig.go index 6d98e516f..c13fae549 100644 --- a/pkg/shared/client/systemconfig/systemconfig.go +++ b/pkg/shared/client/systemconfig/systemconfig.go @@ -1,14 +1,16 @@ package systemconfig import ( + "github.com/dexidp/dex/connector/ldap" + "github.com/koderover/zadig/pkg/tool/httpclient" ) type Connector struct { - Type string `json:"type"` - ID string `json:"id"` - Name string `json:"name"` - Config interface{} `json:"config"` + Type string `json:"type"` + ID string `json:"id"` + Name string `json:"name"` + Config *ldap.Config `json:"config"` } func (c *Client) GetConnector(id string) (*Connector, error) { -- Gitee From ecf2a64a8e146c94858e01e0bed995f2af3a6472 Mon Sep 17 00:00:00 2001 From: panxunying <641770806@qq.com> Date: Wed, 3 Nov 2021 14:17:20 +0800 Subject: [PATCH 211/405] remove sync delete user Signed-off-by: panxunying <641770806@qq.com> --- .../user/core/service/user/user.go | 35 ------------------- 1 file changed, 35 deletions(-) diff --git a/pkg/microservice/user/core/service/user/user.go b/pkg/microservice/user/core/service/user/user.go index e2a3704f4..d1a45510b 100644 --- a/pkg/microservice/user/core/service/user/user.go +++ b/pkg/microservice/user/core/service/user/user.go @@ -97,7 +97,6 @@ func SearchAndSyncUser(ldapId string, logger *zap.SugaredLogger) error { logger.Errorf("ldap search host:%s error, error msg:%s", si.Config.Host, err) return err } - syncUserMap := make(map[string]bool) for _, entry := range sr.Entries { account := si.Config.UserSearch.NameAttr _, err := SyncUser(&SyncUserInfo{ @@ -108,40 +107,6 @@ func SearchAndSyncUser(ldapId string, logger *zap.SugaredLogger) error { logger.Errorf("ldap host:%s sync user error, error msg:%s", si.Config.Host, err) return err } - syncUserMap[account] = true - } - users, err := orm.ListUsersByIdentityType(si.ID, core.DB) - if err != nil { - logger.Errorf("ListUsers by identityType:%s error, error msg:%s", si.ID, err) - return err - } - var deletedUsers []string - for _, user := range users { - if ok := syncUserMap[user.Account]; !ok { - deletedUsers = append(deletedUsers, user.UID) - } - } - tx := core.DB.Begin() - defer func() { - if r := recover(); r != nil { - tx.Rollback() - } - }() - err = orm.DeleteUserByUids(deletedUsers, tx) - if err != nil { - tx.Rollback() - logger.Errorf("SearchAndSyncUser delete user by uids:%s error, error msg:%s", deletedUsers, err) - return fmt.Errorf("SearchAndSyncUser delete user by uids:%s error, error msg:%s", deletedUsers, err) - } - err = orm.DeleteUserLoginByUids(deletedUsers, tx) - if err != nil { - tx.Rollback() - logger.Errorf("SearchAndSyncUser delete userlogin by uids:%s error, error msg:%s", deletedUsers, err) - return fmt.Errorf("SearchAndSyncUser delete userlogin by uids:%s error, error msg:%s", deletedUsers, err) - } - err = tx.Commit().Error - if err != nil { - return err } return nil } -- Gitee From ef0b6ff858a35ae6657d367aee675503e391dabb Mon Sep 17 00:00:00 2001 From: Guang Jiong Lou <7991675+27149chen@users.noreply.github.com> Date: Wed, 3 Nov 2021 14:42:25 +0800 Subject: [PATCH 212/405] add account and identityType for rolebindings (#524) Signed-off-by: lou --- .../core/common/service/template_product.go | 27 +------------- .../picket/core/filter/service/rolebinding.go | 26 ++++++++----- pkg/shared/client/user/user.go | 10 +++-- pkg/shared/poetry/check.go | 37 ------------------- 4 files changed, 25 insertions(+), 75 deletions(-) delete mode 100644 pkg/shared/poetry/check.go diff --git a/pkg/microservice/aslan/core/common/service/template_product.go b/pkg/microservice/aslan/core/common/service/template_product.go index df136cbe9..b55da7432 100644 --- a/pkg/microservice/aslan/core/common/service/template_product.go +++ b/pkg/microservice/aslan/core/common/service/template_product.go @@ -18,7 +18,6 @@ package service import ( "fmt" - "strings" "sync" "go.uber.org/zap" @@ -31,10 +30,8 @@ import ( commonrepo "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/mongodb" templaterepo "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/mongodb/template" "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/collie" - "github.com/koderover/zadig/pkg/microservice/aslan/internal/cache" "github.com/koderover/zadig/pkg/setting" configclient "github.com/koderover/zadig/pkg/shared/config" - "github.com/koderover/zadig/pkg/shared/poetry" e "github.com/koderover/zadig/pkg/tool/errors" ) @@ -56,7 +53,7 @@ func GetProductTemplate(productName string, log *zap.SugaredLogger) (*template.P totalFreeStyles := make([]*collie.CiPipelineResource, 0) cl := configclient.New(configbase.ConfigServiceAddress()) - if enable, err := cl.CheckFeature(setting.ModernWorkflowType);err ==nil && enable{ + if enable, err := cl.CheckFeature(setting.ModernWorkflowType); err == nil && enable { // CI场景onboarding流程处于第二步时,需要返回ci工作流id,用于前端跳转 collieAPIAddress := config.CollieAPIAddress() cl := collie.New(collieAPIAddress) @@ -122,7 +119,7 @@ func GetProductTemplate(productName string, log *zap.SugaredLogger) (*template.P return resp, fmt.Errorf("Pipeline.List err : %v", err) } - if enable, err := cl.CheckFeature(setting.ModernWorkflowType);err ==nil && enable{ + if enable, err := cl.CheckFeature(setting.ModernWorkflowType); err == nil && enable { collieAPIAddress := config.CollieAPIAddress() cl := collie.New(collieAPIAddress) totalFreeStyles, err = cl.ListCIPipelines(productName, log) @@ -171,26 +168,6 @@ func GetProductTemplate(productName string, log *zap.SugaredLogger) (*template.P return resp, nil } -func GetFeatures(log *zap.SugaredLogger) (string, error) { - featuresByteKey := []byte("features") - featuresByteValue, err := cache.Get(featuresByteKey) - if err != nil { - poetryCtl := poetry.New(config.PoetryAPIServer()) - fs, err := poetryCtl.ListFeatures() - if err != nil { - return "", err - } - cacheValue := strings.Join(fs, ",") - // 一天过期 - if err = cache.Set(featuresByteKey, []byte(cacheValue), 86400); err != nil { - log.Errorf("getFeatures set cache err:%v", err) - } - return cacheValue, nil - } - - return string(featuresByteValue), nil -} - func FillProductTemplateVars(productTemplates []*template.Product, log *zap.SugaredLogger) error { var ( wg sync.WaitGroup diff --git a/pkg/microservice/picket/core/filter/service/rolebinding.go b/pkg/microservice/picket/core/filter/service/rolebinding.go index b46719be4..b8740c9e9 100644 --- a/pkg/microservice/picket/core/filter/service/rolebinding.go +++ b/pkg/microservice/picket/core/filter/service/rolebinding.go @@ -12,9 +12,11 @@ import ( type roleBinding struct { *policy.RoleBinding - Username string `json:"username"` - Email string `json:"email"` - Phone string `json:"phone"` + Username string `json:"username"` + Email string `json:"email"` + Phone string `json:"phone"` + IdentityType string `json:"identity_type"` + Account string `json:"account"` } func ListRoleBindings(header http.Header, qs url.Values, logger *zap.SugaredLogger) ([]*roleBinding, error) { @@ -25,10 +27,10 @@ func ListRoleBindings(header http.Header, qs url.Values, logger *zap.SugaredLogg } var uids []string - uidToRoleBinding := make(map[string]*roleBinding) + uidToRoleBinding := make(map[string][]*roleBinding) for _, rb := range rbs { uids = append(uids, rb.UID) - uidToRoleBinding[rb.UID] = &roleBinding{RoleBinding: rb} + uidToRoleBinding[rb.UID] = append(uidToRoleBinding[rb.UID], &roleBinding{RoleBinding: rb}) } users, err := user.New().ListUsers(&user.SearchArgs{UIDs: uids}) @@ -40,10 +42,16 @@ func ListRoleBindings(header http.Header, qs url.Values, logger *zap.SugaredLogg var res []*roleBinding for _, u := range users { if rb, ok := uidToRoleBinding[u.UID]; ok { - rb.Username = u.Name - rb.Email = u.Email - rb.Phone = u.Phone - res = append(res, rb) + for _, r := range rb { + r.Username = u.Name + r.Email = u.Email + r.Phone = u.Phone + r.IdentityType = u.IdentityType + r.Account = u.Account + + res = append(res, r) + } + } } diff --git a/pkg/shared/client/user/user.go b/pkg/shared/client/user/user.go index c080f6d2e..d51c371cd 100644 --- a/pkg/shared/client/user/user.go +++ b/pkg/shared/client/user/user.go @@ -5,10 +5,12 @@ import ( ) type User struct { - UID string `json:"uid"` - Name string `json:"name"` - Email string `json:"email"` - Phone string `json:"phone"` + UID string `json:"uid"` + Name string `json:"name"` + Email string `json:"email"` + Phone string `json:"phone"` + IdentityType string `json:"identity_type"` + Account string `json:"account"` } type usersResp struct { diff --git a/pkg/shared/poetry/check.go b/pkg/shared/poetry/check.go deleted file mode 100644 index d205c5121..000000000 --- a/pkg/shared/poetry/check.go +++ /dev/null @@ -1,37 +0,0 @@ -/* -Copyright 2021 The KodeRover 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 poetry - -import ( - "github.com/koderover/zadig/pkg/tool/httpclient" -) - -type features struct { - Features []string `json:"features"` -} - -func (c *Client) ListFeatures() ([]string, error) { - url := "/directory/check" - - fs := &features{} - _, err := c.Get(url, httpclient.SetResult(fs)) - if err != nil { - return nil, err - } - - return fs.Features, nil -} -- Gitee From fc51731686699267f5abb4e0aa2cbea052d68bcd Mon Sep 17 00:00:00 2001 From: panxunying <641770806@qq.com> Date: Wed, 3 Nov 2021 15:07:32 +0800 Subject: [PATCH 213/405] optimize Signed-off-by: panxunying <641770806@qq.com> --- pkg/microservice/user/core/service/user/user.go | 8 ++++---- pkg/shared/client/systemconfig/systemconfig.go | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pkg/microservice/user/core/service/user/user.go b/pkg/microservice/user/core/service/user/user.go index d1a45510b..648fa1029 100644 --- a/pkg/microservice/user/core/service/user/user.go +++ b/pkg/microservice/user/core/service/user/user.go @@ -62,10 +62,10 @@ type SyncUserInfo struct { func SearchAndSyncUser(ldapId string, logger *zap.SugaredLogger) error { systemConfigClient := systemconfig.New() - si, err := systemConfigClient.GetConnector(ldapId) + si, err := systemConfigClient.GetLDAPConnector(ldapId) if err != nil { - logger.Errorf("SearchAndSyncUser GetConnector error, error msg:%s", err) - return fmt.Errorf("SearchAndSyncUser GetConnector error, error msg:%s", err) + logger.Errorf("SearchAndSyncUser GetLDAPConnector error, error msg:%s", err) + return fmt.Errorf("SearchAndSyncUser GetLDAPConnector error, error msg:%s", err) } if si == nil || si.Config == nil { logger.Error("can't find connector") @@ -101,7 +101,7 @@ func SearchAndSyncUser(ldapId string, logger *zap.SugaredLogger) error { account := si.Config.UserSearch.NameAttr _, err := SyncUser(&SyncUserInfo{ Account: entry.GetAttributeValue(account), - IdentityType: si.ID, + IdentityType: si.ID, // ldap may have not only one instance, so use id as identityType }, logger) if err != nil { logger.Errorf("ldap host:%s sync user error, error msg:%s", si.Config.Host, err) diff --git a/pkg/shared/client/systemconfig/systemconfig.go b/pkg/shared/client/systemconfig/systemconfig.go index c13fae549..caf958e3d 100644 --- a/pkg/shared/client/systemconfig/systemconfig.go +++ b/pkg/shared/client/systemconfig/systemconfig.go @@ -13,7 +13,7 @@ type Connector struct { Config *ldap.Config `json:"config"` } -func (c *Client) GetConnector(id string) (*Connector, error) { +func (c *Client) GetLDAPConnector(id string) (*Connector, error) { url := "/connectors/" + id res := &Connector{} -- Gitee From 4e81b3cf0f9a3d397bb56c7f441f02c11ba2fbcc Mon Sep 17 00:00:00 2001 From: lou Date: Wed, 3 Nov 2021 17:19:22 +0800 Subject: [PATCH 214/405] fix auth mismatch Signed-off-by: lou --- pkg/microservice/policy/core/service/bundle/rego/authz.rego | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/microservice/policy/core/service/bundle/rego/authz.rego b/pkg/microservice/policy/core/service/bundle/rego/authz.rego index e5ad3d107..bac66f0b1 100644 --- a/pkg/microservice/policy/core/service/bundle/rego/authz.rego +++ b/pkg/microservice/policy/core/service/bundle/rego/authz.rego @@ -178,7 +178,7 @@ allowed_roles[role_ref] { allowed_roles[role_ref] { some i data.bindings.role_bindings[i].uid == "*" - project := data.bindings.role_bindings[i].bindings[_].namespace == project_name + data.bindings.role_bindings[i].bindings[_].namespace == project_name role_ref := data.bindings.role_bindings[i].bindings[j].role_refs[_] } -- Gitee From 79b67051b384a1454b061f2ea9978f35a170abc1 Mon Sep 17 00:00:00 2001 From: Guang Jiong Lou <7991675+27149chen@users.noreply.github.com> Date: Wed, 3 Nov 2021 21:23:45 +0800 Subject: [PATCH 215/405] fix get-hook-secert (#527) * fix get-hook-secert Signed-off-by: lou * fix hook secret Signed-off-by: lou --- .../aslan/core/common/service/git/hook.go | 15 ++++++--------- .../aslan/core/workflow/service/webhook/gitlab.go | 4 ++-- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/pkg/microservice/aslan/core/common/service/git/hook.go b/pkg/microservice/aslan/core/common/service/git/hook.go index a1d992191..08770cc51 100644 --- a/pkg/microservice/aslan/core/common/service/git/hook.go +++ b/pkg/microservice/aslan/core/common/service/git/hook.go @@ -17,17 +17,14 @@ limitations under the License. package git import ( - "github.com/koderover/zadig/pkg/tool/crypto" - "github.com/koderover/zadig/pkg/tool/log" -) + "crypto/sha256" + "encoding/hex" -const plainSecret = "webhook secret" + "github.com/koderover/zadig/pkg/config" +) func GetHookSecret() string { - token, err := crypto.AesEncrypt(plainSecret) - if err != nil { - log.DPanic(err) - } + hash := sha256.Sum256([]byte(config.SecretKey())) - return token + return hex.EncodeToString(hash[:]) } diff --git a/pkg/microservice/aslan/core/workflow/service/webhook/gitlab.go b/pkg/microservice/aslan/core/workflow/service/webhook/gitlab.go index 390139988..7fafcdec8 100644 --- a/pkg/microservice/aslan/core/workflow/service/webhook/gitlab.go +++ b/pkg/microservice/aslan/core/workflow/service/webhook/gitlab.go @@ -312,8 +312,8 @@ func updateServiceTemplateByPushEvent(event *EventPush, log *zap.SugaredLogger) func GetGitlabServiceTemplates() ([]*commonmodels.Service, error) { opt := &commonrepo.ServiceListOption{ - Type: setting.K8SDeployType, - Source: setting.SourceFromGitlab, + Type: setting.K8SDeployType, + Source: setting.SourceFromGitlab, } return commonrepo.NewServiceColl().ListMaxRevisions(opt) } -- Gitee From 7c1875bdf65430f7f65389d32305b02008d425d0 Mon Sep 17 00:00:00 2001 From: mouuii Date: Thu, 4 Nov 2021 10:03:15 +0800 Subject: [PATCH 216/405] poetry Signed-off-by: mouuii --- go.mod | 1 + go.sum | 1 + .../systemconfig/config/config.go | 9 + .../systemconfig/core/handler/emails.go | 79 +++++++++ .../systemconfig/core/handler/router.go | 12 ++ .../core/repository/models/email.go | 38 ++++ .../core/repository/mongo/email.go | 163 ++++++++++++++++++ pkg/microservice/systemconfig/core/service.go | 34 ++++ .../systemconfig/core/service/email.go | 40 +++++ 9 files changed, 377 insertions(+) create mode 100644 pkg/microservice/systemconfig/core/handler/emails.go create mode 100644 pkg/microservice/systemconfig/core/repository/models/email.go create mode 100644 pkg/microservice/systemconfig/core/repository/mongo/email.go create mode 100644 pkg/microservice/systemconfig/core/service/email.go diff --git a/go.mod b/go.mod index d17cc71d0..bd573294d 100644 --- a/go.mod +++ b/go.mod @@ -25,6 +25,7 @@ require ( github.com/garyburd/redigo v1.6.2 // indirect github.com/gin-contrib/sse v0.1.0 github.com/gin-gonic/gin v1.7.2 + github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8 // indirect github.com/go-ldap/ldap/v3 v3.3.0 github.com/go-resty/resty/v2 v2.6.0 github.com/gofrs/uuid v4.0.0+incompatible // indirect diff --git a/go.sum b/go.sum index e9ff3cff2..05dce6a47 100644 --- a/go.sum +++ b/go.sum @@ -550,6 +550,7 @@ github.com/gin-gonic/gin v1.7.2 h1:Tg03T9yM2xa8j6I3Z3oqLaQRSmKvxPd6g/2HJ6zICFA= github.com/gin-gonic/gin v1.7.2/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY= github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= +github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8 h1:DujepqpGd1hyOd7aW59XpK7Qymp8iy83xq74fLr21is= github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= github.com/go-asn1-ber/asn1-ber v1.5.1 h1:pDbRAunXzIUXfx4CB2QJFv5IuPiuoW+sWvr/Us009o8= github.com/go-asn1-ber/asn1-ber v1.5.1/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0= diff --git a/pkg/microservice/systemconfig/config/config.go b/pkg/microservice/systemconfig/config/config.go index 1dbf7ef9c..2430e9b96 100644 --- a/pkg/microservice/systemconfig/config/config.go +++ b/pkg/microservice/systemconfig/config/config.go @@ -4,6 +4,7 @@ import ( "github.com/spf13/viper" _ "github.com/koderover/zadig/pkg/config" + configbase "github.com/koderover/zadig/pkg/config" ) func MysqlDexDB() string { @@ -13,3 +14,11 @@ func MysqlDexDB() string { func Features() string { return viper.GetString(FeatureFlag) } + +func MongoURI() string { + return configbase.MongoURI() +} + +func MongoDatabase() string { + return configbase.MongoDatabase() +} diff --git a/pkg/microservice/systemconfig/core/handler/emails.go b/pkg/microservice/systemconfig/core/handler/emails.go new file mode 100644 index 000000000..f1a33ee00 --- /dev/null +++ b/pkg/microservice/systemconfig/core/handler/emails.go @@ -0,0 +1,79 @@ +package handler + +import ( + "github.com/gin-gonic/gin" + + "github.com/koderover/zadig/pkg/microservice/systemconfig/core/repository/models" + "github.com/koderover/zadig/pkg/microservice/systemconfig/core/service" + internalhandler "github.com/koderover/zadig/pkg/shared/handler" +) + +func GetEmailHost(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + ctx.Resp, ctx.Err = service.GetEmailHost(ctx.Logger) +} + +func CreateEmailHost(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + req := new(models.EmailHost) + if err := c.ShouldBindJSON(req); err != nil { + ctx.Err = err + return + } + ctx.Resp, ctx.Err = service.CreateEmailHost(req, ctx.Logger) +} + +func UpdateEmailHost(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + req := new(models.EmailHost) + if err := c.ShouldBindJSON(req); err != nil { + ctx.Err = err + return + } + ctx.Resp, ctx.Err = service.UpdateEmailHost(req, ctx.Logger) +} + +func DeleteEmailHost(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + ctx.Err = service.DeleteEmailHost(ctx.Logger) +} + +//// + +func GetEmailService(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + ctx.Resp, ctx.Err = service.GetEmailHost(ctx.Logger) +} + +func CreateEmailService(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + req := new(models.EmailHost) + if err := c.ShouldBindJSON(req); err != nil { + ctx.Err = err + return + } + ctx.Resp, ctx.Err = service.CreateEmailHost(req, ctx.Logger) +} + +func UpdateEmailService(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + req := new(models.EmailHost) + if err := c.ShouldBindJSON(req); err != nil { + ctx.Err = err + return + } + ctx.Resp, ctx.Err = service.UpdateEmailHost(req, ctx.Logger) +} + +func DeleteEmailService(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + ctx.Err = service.DeleteEmailHost(ctx.Logger) +} diff --git a/pkg/microservice/systemconfig/core/handler/router.go b/pkg/microservice/systemconfig/core/handler/router.go index 282f4cb12..f61b00ec9 100644 --- a/pkg/microservice/systemconfig/core/handler/router.go +++ b/pkg/microservice/systemconfig/core/handler/router.go @@ -35,4 +35,16 @@ func (*Router) Inject(router *gin.RouterGroup) { { features.GET("/:name", GetFeature) } + emails := router.Group("emails") + { + emails.GET("/host", GetEmailHost) + emails.POST("/host", CreateEmailHost) + emails.PATCH("/host", UpdateEmailHost) + emails.DELETE("/host", DeleteEmailHost) + + emails.GET("/service", GetEmailService) + emails.POST("/service", CreateEmailService) + emails.PATCH("/service", UpdateEmailService) + emails.DELETE("/service", DeleteEmailService) + } } diff --git a/pkg/microservice/systemconfig/core/repository/models/email.go b/pkg/microservice/systemconfig/core/repository/models/email.go new file mode 100644 index 000000000..8209f4e3b --- /dev/null +++ b/pkg/microservice/systemconfig/core/repository/models/email.go @@ -0,0 +1,38 @@ +package models + +import ( + "github.com/globalsign/mgo/bson" +) + +type EmailHost struct { + ID int `json:"id"` + Name string `json:"name"` + Port int `json:"port"` + Username string `json:"username"` + Password string `json:"password"` + IsTLS bool `json:"isTLS"` + OrganizationID int `json:"orgId"` + CreatedAt int64 `json:"created_at"` + UpdatedAt int64 `json:"updated_at"` +} + +func (EmailHost) TableName() string { + return "email_host" +} + +type EmailService struct { + ObjectID bson.ObjectId `bson:"_id,omitempty"` + ID int `bson:"id"` + Name string `bson:"name"` + Address string `bson:"address"` + DisplayName string `bson:"display_name"` + Theme string `bson:"theme"` + OrganizationID int `bson:"organization_id"` + CreatedAt int64 `bson:"created_at"` + UpdatedAt int64 `bson:"updated_at"` + DeletedAt int64 `bson:"deleted_at"` +} + +func (EmailService) TableName() string { + return "email_service" +} diff --git a/pkg/microservice/systemconfig/core/repository/mongo/email.go b/pkg/microservice/systemconfig/core/repository/mongo/email.go new file mode 100644 index 000000000..ca02e9778 --- /dev/null +++ b/pkg/microservice/systemconfig/core/repository/mongo/email.go @@ -0,0 +1,163 @@ +package mongo + +import ( + "context" + "time" + + "github.com/globalsign/mgo/bson" + "go.mongodb.org/mongo-driver/mongo" + + "github.com/koderover/zadig/pkg/microservice/systemconfig/config" + "github.com/koderover/zadig/pkg/microservice/systemconfig/core/repository/models" + "github.com/koderover/zadig/pkg/tool/log" + mongotool "github.com/koderover/zadig/pkg/tool/mongo" +) + +type EmailHostColl struct { + *mongo.Collection + + coll string +} + +type EmailServiceColl struct { + *mongo.Collection + + coll string +} + +func NewEmailServiceColl() *EmailServiceColl { + name := models.EmailHost{}.TableName() + coll := &EmailServiceColl{Collection: mongotool.Database(config.MongoDatabase()).Collection(name), coll: name} + + return coll +} + +func NewEmailHostColl() *EmailHostColl { + name := models.EmailHost{}.TableName() + coll := &EmailHostColl{Collection: mongotool.Database(config.MongoDatabase()).Collection(name), coll: name} + + return coll +} + +func (c *EmailServiceColl) GetCollectionName() string { + return c.coll +} +func (c *EmailServiceColl) EnsureIndex(ctx context.Context) error { + return nil +} + +func (c *EmailHostColl) GetCollectionName() string { + return c.coll +} +func (c *EmailHostColl) EnsureIndex(ctx context.Context) error { + return nil +} + +func (c *EmailHostColl) Find() (*models.EmailHost, error) { + emailHost := new(models.EmailHost) + query := bson.M{"deleted_at": 0} + + ctx := context.Background() + + err := c.Collection.FindOne(ctx, query).Decode(emailHost) + if err != nil { + log.Errorf("repository GetEmailHost err : %v", err) + return nil, err + } + return emailHost, nil +} + +func (c *EmailHostColl) Update(emailHost *models.EmailHost) (*models.EmailHost, error) { + query := bson.M{"organization_id": emailHost.OrganizationID, "deleted_at": 0} + change := bson.M{"$set": bson.M{ + "name": emailHost.Name, + "port": emailHost.Port, + "username": emailHost.Username, + "password": emailHost.Password, + "is_tls": emailHost.IsTLS, + "updated_at": time.Now().Unix(), + }} + + _, err := c.Collection.UpdateOne(context.TODO(), query, change) + if err != nil { + log.Error("repository Update EmailHostColl err : %v", err) + return nil, err + } + return emailHost, nil +} + +func (c *EmailHostColl) Delete() error { + query := bson.M{"deleted_at": 0} + change := bson.M{"$set": bson.M{ + "deleted_at": time.Now().Unix(), + }} + + _, err := c.Collection.UpdateOne(context.TODO(), query, change) + if err != nil { + log.Error("repository Delete EmailHostColl err : %v", err) + return err + } + return nil +} + +func (c *EmailHostColl) Add(emailHost *models.EmailHost) (*models.EmailHost, error) { + + _, err := c.Collection.InsertOne(context.TODO(), emailHost) + if err != nil { + log.Error("repository AddEmailHost err : %v", err) + return nil, err + } + return emailHost, nil +} + +func (c *EmailServiceColl) AddEmailService(iEmailService *models.EmailService) (*models.EmailService, error) { + + _, err := c.Collection.InsertOne(context.TODO(), iEmailService) + if err != nil { + log.Error("repository AddEmailService err : %v", err) + return nil, err + } + return iEmailService, nil +} + +func (c *EmailServiceColl) GetEmailService() (*models.EmailService, error) { + query := bson.M{"deleted_at": 0} + iEmailService := &models.EmailService{} + err := c.Collection.FindOne(context.TODO(), query).Decode(iEmailService) + if err != nil { + log.Error("repository GetEmailService err : %v", err) + return nil, err + } + return iEmailService, nil +} + +func (c *EmailServiceColl) UpdateEmailService(iEmailService *models.EmailService) (*models.EmailService, error) { + query := bson.M{"deleted_at": 0} + change := bson.M{"$set": bson.M{ + "name": iEmailService.Name, + "address": iEmailService.Address, + "display_name": iEmailService.DisplayName, + "theme": iEmailService.Theme, + "updated_at": time.Now().Unix(), + }} + + _, err := c.Collection.UpdateOne(context.TODO(), query, change) + if err != nil { + log.Error("repository UpdateEmailService err : %v", err) + return nil, err + } + return iEmailService, nil +} + +func (c *EmailServiceColl) DeleteEmailService() error { + query := bson.M{"deleted_at": 0} + change := bson.M{"$set": bson.M{ + "deleted_at": time.Now().Unix(), + }} + _, err := c.Collection.UpdateOne(context.TODO(), query, change) + if err != nil { + log.Error("repository DeleteEmailServiceByOrgID err : %v", err) + return err + } + return nil +} diff --git a/pkg/microservice/systemconfig/core/service.go b/pkg/microservice/systemconfig/core/service.go index e77858f84..e46d9786d 100644 --- a/pkg/microservice/systemconfig/core/service.go +++ b/pkg/microservice/systemconfig/core/service.go @@ -18,13 +18,18 @@ package core import ( "context" + "fmt" + "sync" + "time" configbase "github.com/koderover/zadig/pkg/config" "github.com/koderover/zadig/pkg/microservice/systemconfig/config" + "github.com/koderover/zadig/pkg/microservice/systemconfig/core/repository/mongo" "github.com/koderover/zadig/pkg/microservice/systemconfig/core/service/featuregates" "github.com/koderover/zadig/pkg/setting" gormtool "github.com/koderover/zadig/pkg/tool/gorm" "github.com/koderover/zadig/pkg/tool/log" + mongotool "github.com/koderover/zadig/pkg/tool/mongo" ) func Start(_ context.Context) { @@ -49,6 +54,35 @@ func initDatabase() { if err != nil { log.Panicf("Failed to open database %s", config.MysqlDexDB()) } + + ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) + defer cancel() + + mongotool.Init(ctx, config.MongoURI()) + if err := mongotool.Ping(ctx); err != nil { + panic(fmt.Errorf("failed to connect to mongo, error: %s", err)) + } + idxCtx, idxCancel := context.WithTimeout(ctx, 10*time.Minute) + defer idxCancel() + var wg sync.WaitGroup + for _, r := range []indexer{ + mongo.NewEmailHostColl(), + } { + + wg.Add(1) + go func(r indexer) { + defer wg.Done() + if err := r.EnsureIndex(idxCtx); err != nil { + panic(fmt.Errorf("failed to create index for %s, error: %s", r.GetCollectionName(), err)) + } + }(r) + } + wg.Wait() +} + +type indexer interface { + EnsureIndex(ctx context.Context) error + GetCollectionName() string } func Stop(_ context.Context) { diff --git a/pkg/microservice/systemconfig/core/service/email.go b/pkg/microservice/systemconfig/core/service/email.go new file mode 100644 index 000000000..e4f9ea5b5 --- /dev/null +++ b/pkg/microservice/systemconfig/core/service/email.go @@ -0,0 +1,40 @@ +package service + +import ( + "go.uber.org/zap" + + "github.com/koderover/zadig/pkg/microservice/systemconfig/core/repository/models" + "github.com/koderover/zadig/pkg/microservice/systemconfig/core/repository/mongo" +) + +func GetEmailHost(_ *zap.SugaredLogger) (*models.EmailHost, error) { + return mongo.NewEmailHostColl().Find() +} + +func CreateEmailHost(emailHost *models.EmailHost, _ *zap.SugaredLogger) (*models.EmailHost, error) { + return mongo.NewEmailHostColl().Add(emailHost) +} + +func UpdateEmailHost(host *models.EmailHost, _ *zap.SugaredLogger) (*models.EmailHost, error) { + return mongo.NewEmailHostColl().Update(host) +} + +func DeleteEmailHost(_ *zap.SugaredLogger) error { + return mongo.NewEmailHostColl().Delete() +} + +func GetEmailService(_ *zap.SugaredLogger) (*models.EmailService, error) { + return mongo.NewEmailServiceColl().GetEmailService() +} + +func CreateEmailService(service *models.EmailService, _ *zap.SugaredLogger) (*models.EmailService, error) { + return mongo.NewEmailServiceColl().AddEmailService(service) +} + +func UpdateEmailService(service *models.EmailService, _ *zap.SugaredLogger) (*models.EmailService, error) { + return mongo.NewEmailServiceColl().UpdateEmailService(service) +} + +func DeleteEmailService(_ *zap.SugaredLogger) error { + return mongo.NewEmailServiceColl().DeleteEmailService() +} -- Gitee From 4d9e7f1310f2e1d184448636756a66f9bdabbd5c Mon Sep 17 00:00:00 2001 From: mouuii Date: Thu, 4 Nov 2021 10:35:01 +0800 Subject: [PATCH 217/405] poetry Signed-off-by: mouuii --- pkg/microservice/systemconfig/core/handler/emails.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/pkg/microservice/systemconfig/core/handler/emails.go b/pkg/microservice/systemconfig/core/handler/emails.go index f1a33ee00..a1fcbea11 100644 --- a/pkg/microservice/systemconfig/core/handler/emails.go +++ b/pkg/microservice/systemconfig/core/handler/emails.go @@ -47,33 +47,33 @@ func DeleteEmailHost(c *gin.Context) { func GetEmailService(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - ctx.Resp, ctx.Err = service.GetEmailHost(ctx.Logger) + ctx.Resp, ctx.Err = service.GetEmailService(ctx.Logger) } func CreateEmailService(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - req := new(models.EmailHost) + req := new(models.EmailService) if err := c.ShouldBindJSON(req); err != nil { ctx.Err = err return } - ctx.Resp, ctx.Err = service.CreateEmailHost(req, ctx.Logger) + ctx.Resp, ctx.Err = service.CreateEmailService(req, ctx.Logger) } func UpdateEmailService(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - req := new(models.EmailHost) + req := new(models.EmailService) if err := c.ShouldBindJSON(req); err != nil { ctx.Err = err return } - ctx.Resp, ctx.Err = service.UpdateEmailHost(req, ctx.Logger) + ctx.Resp, ctx.Err = service.UpdateEmailService(req, ctx.Logger) } func DeleteEmailService(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - ctx.Err = service.DeleteEmailHost(ctx.Logger) + ctx.Err = service.DeleteEmailService(ctx.Logger) } -- Gitee From 59f2e5f16a1c3b7dfce6849fad5d28e30c041af2 Mon Sep 17 00:00:00 2001 From: panxunying <641770806@qq.com> Date: Thu, 4 Nov 2021 11:00:32 +0800 Subject: [PATCH 218/405] =?UTF-8?q?add=20signup=E3=80=81retrieve=E3=80=81d?= =?UTF-8?q?elete=E3=80=81reset?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: panxunying <641770806@qq.com> --- go.mod | 2 + go.sum | 4 + pkg/microservice/user/config/config.go | 16 ++ pkg/microservice/user/config/consts.go | 1 + pkg/microservice/user/core/handler/router.go | 2 + .../user/core/handler/user/user.go | 35 ++++ .../user/core/repository/orm/user.go | 10 ++ .../user/core/repository/orm/user_login.go | 10 ++ .../user/core/service/user/user.go | 155 ++++++++++++++++++ pkg/microservice/user/server/rest/router.go | 4 + pkg/microservice/user/server/server.go | 4 +- pkg/setting/consts.go | 19 ++- pkg/util/mail/mail.go | 50 ++++++ 13 files changed, 302 insertions(+), 10 deletions(-) create mode 100644 pkg/util/mail/mail.go diff --git a/go.mod b/go.mod index d17cc71d0..70860f4ee 100644 --- a/go.mod +++ b/go.mod @@ -69,6 +69,8 @@ require ( golang.org/x/net v0.0.0-20210520170846-37e1c6afe023 golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914 golang.org/x/sync v0.0.0-20210220032951-036812b2e83c + gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect + gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df gopkg.in/mholt/archiver.v3 v3.1.1 gopkg.in/natefinch/lumberjack.v2 v2.0.0 gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b diff --git a/go.sum b/go.sum index e9ff3cff2..15c88469d 100644 --- a/go.sum +++ b/go.sum @@ -2235,6 +2235,8 @@ google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+Rur google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc h1:2gGKlE2+asNV9m7xrywl36YYNnBG5ZQ0r/BOOxqPpmk= +gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc/go.mod h1:m7x9LTH6d71AHyAX77c9yqWCCa3UKHcVEj9y7hAtKDk= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20141024133853-64131543e789/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -2249,6 +2251,8 @@ gopkg.in/gcfg.v1 v1.2.0/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= +gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df h1:n7WqCuqOuCbNr617RXOY0AWRXxgwEyPp2z+p0+hgMuE= +gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df/go.mod h1:LRQQ+SO6ZHR7tOkpBDuZnXENFzX8qRjMDMyPD6BRkCw= gopkg.in/gorp.v1 v1.7.2 h1:j3DWlAyGVv8whO7AcIWznQ2Yj7yJkn34B8s63GViAAw= gopkg.in/gorp.v1 v1.7.2/go.mod h1:Wo3h+DBQZIxATwftsglhdD/62zRFPhGhTiu5jUJmCaw= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= diff --git a/pkg/microservice/user/config/config.go b/pkg/microservice/user/config/config.go index 5999c8177..a633c8b05 100644 --- a/pkg/microservice/user/config/config.go +++ b/pkg/microservice/user/config/config.go @@ -52,3 +52,19 @@ func MysqlUserDB() string { func TokenExpiresAt() int { return viper.GetInt(setting.ENVTokenExpiresAt) } + +func NoReplyEmailAddress() string { + return viper.GetString(setting.ENVNoReplyEmailAddress) +} + +func NoReplyEmailPassword() string { + return viper.GetString(setting.ENVNoReplyEmailPassword) +} + +func UserPort() string { + port := viper.GetString(setting.ENVUserPort) + if len(port) > 0 { + return port + } + return "80" +} diff --git a/pkg/microservice/user/config/consts.go b/pkg/microservice/user/config/consts.go index 4935cbe9a..96e4e9caa 100644 --- a/pkg/microservice/user/config/consts.go +++ b/pkg/microservice/user/config/consts.go @@ -23,6 +23,7 @@ import ( const ( AppState = setting.ProductName + "user" SystemIdentityType = "system" + FeiShuEmailHost = "smtp.feishu.cn" ) type LoginType int diff --git a/pkg/microservice/user/core/handler/router.go b/pkg/microservice/user/core/handler/router.go index 5b191c859..fdf7fbf85 100644 --- a/pkg/microservice/user/core/handler/router.go +++ b/pkg/microservice/user/core/handler/router.go @@ -36,6 +36,8 @@ func (*Router) Inject(router *gin.RouterGroup) { users.GET("/users/:uid", user.GetUser) + users.DELETE("/users/:uid", user.DeleteUser) + users.GET("/users/:uid/personal", user.GetPersonalUser) users.POST("/users/search", user.ListUsers) diff --git a/pkg/microservice/user/core/handler/user/user.go b/pkg/microservice/user/core/handler/user/user.go index 7694a6e97..f3a01fe7e 100644 --- a/pkg/microservice/user/core/handler/user/user.go +++ b/pkg/microservice/user/core/handler/user/user.go @@ -24,6 +24,12 @@ func GetUser(c *gin.Context) { ctx.Resp, ctx.Err = user.GetUser(c.Param("uid"), ctx.Logger) } +func DeleteUser(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + ctx.Err = user.DeleteUserByUID(c.Param("uid"), ctx.Logger) +} + func GetPersonalUser(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() @@ -66,6 +72,23 @@ func CreateUser(c *gin.Context) { ctx.Resp, ctx.Err = user.CreateUser(args, ctx.Logger) } +func SignUp(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + args := &user.User{} + if err := c.ShouldBindJSON(args); err != nil { + ctx.Err = err + return + } + ctx.Resp, ctx.Err = user.CreateUser(args, ctx.Logger) +} + +func Retrieve(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + ctx.Resp, ctx.Err = user.Retrieve(c.Query("account"), ctx.Logger) +} + func UpdatePassword(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() @@ -77,3 +100,15 @@ func UpdatePassword(c *gin.Context) { args.Uid = c.Param("uid") ctx.Err = user.UpdatePassword(args, ctx.Logger) } + +func Reset(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + args := &user.ResetParams{} + if err := c.ShouldBindJSON(args); err != nil { + ctx.Err = err + return + } + args.Uid = ctx.UserID + ctx.Err = user.Reset(args, ctx.Logger) +} diff --git a/pkg/microservice/user/core/repository/orm/user.go b/pkg/microservice/user/core/repository/orm/user.go index ba025eacf..27f4e55cd 100644 --- a/pkg/microservice/user/core/repository/orm/user.go +++ b/pkg/microservice/user/core/repository/orm/user.go @@ -99,6 +99,16 @@ func DeleteUserByUids(uids []string, db *gorm.DB) error { return nil } +// DeleteUserByUid Delete users based on uids +func DeleteUserByUid(uid string, db *gorm.DB) error { + var user models.User + err := db.Where("uid = ?", uid).Delete(&user).Error + if err != nil { + return err + } + return nil +} + // GetUsersCount gets user count func GetUsersCount(name string) (int64, error) { var ( diff --git a/pkg/microservice/user/core/repository/orm/user_login.go b/pkg/microservice/user/core/repository/orm/user_login.go index a46c517dc..b44af3821 100644 --- a/pkg/microservice/user/core/repository/orm/user_login.go +++ b/pkg/microservice/user/core/repository/orm/user_login.go @@ -38,6 +38,16 @@ func DeleteUserLoginByUids(uids []string, db *gorm.DB) error { return nil } +// DeleteUserLoginByUid Delete userLogin based on uids +func DeleteUserLoginByUid(uid string, db *gorm.DB) error { + var userLogin models.UserLogin + err := db.Where("uid = ?", uid).Delete(&userLogin).Error + if err != nil { + return err + } + return nil +} + // ListUserLogins Get a userLogin based on uid list func ListUserLogins(uids []string, db *gorm.DB) (*[]models.UserLogin, error) { var userLogins []models.UserLogin diff --git a/pkg/microservice/user/core/service/user/user.go b/pkg/microservice/user/core/service/user/user.go index 648fa1029..07d9ed925 100644 --- a/pkg/microservice/user/core/service/user/user.go +++ b/pkg/microservice/user/core/service/user/user.go @@ -2,18 +2,24 @@ package user import ( "fmt" + "net/url" "time" ldapv3 "github.com/go-ldap/ldap/v3" + "github.com/golang-jwt/jwt" "github.com/google/uuid" "go.uber.org/zap" "golang.org/x/crypto/bcrypt" + configbase "github.com/koderover/zadig/pkg/config" "github.com/koderover/zadig/pkg/microservice/user/config" "github.com/koderover/zadig/pkg/microservice/user/core" "github.com/koderover/zadig/pkg/microservice/user/core/repository/models" "github.com/koderover/zadig/pkg/microservice/user/core/repository/orm" + "github.com/koderover/zadig/pkg/microservice/user/core/service/login" + "github.com/koderover/zadig/pkg/setting" "github.com/koderover/zadig/pkg/shared/client/systemconfig" + "github.com/koderover/zadig/pkg/util/mail" ) type User struct { @@ -49,6 +55,11 @@ type Password struct { NewPassword string `json:"newPassword"` } +type ResetParams struct { + Uid string `json:"uid"` + Password string `json:"password"` +} + type UsersResp struct { Users []UserInfo `json:"users"` TotalCount int64 `json:"totalCount"` @@ -60,6 +71,10 @@ type SyncUserInfo struct { Name string `json:"name"` } +type RetrieveResp struct { + Email string `json:"email"` +} + func SearchAndSyncUser(ldapId string, logger *zap.SugaredLogger) error { systemConfigClient := systemconfig.New() si, err := systemConfigClient.GetLDAPConnector(ldapId) @@ -101,6 +116,7 @@ func SearchAndSyncUser(ldapId string, logger *zap.SugaredLogger) error { account := si.Config.UserSearch.NameAttr _, err := SyncUser(&SyncUserInfo{ Account: entry.GetAttributeValue(account), + Name: entry.GetAttributeValue(account), IdentityType: si.ID, // ldap may have not only one instance, so use id as identityType }, logger) if err != nil { @@ -238,6 +254,120 @@ func getLoginId(user *models.User, loginType config.LoginType) string { } +func DeleteUserByUID(uid string, logger *zap.SugaredLogger) error { + tx := core.DB.Begin() + defer func() { + if r := recover(); r != nil { + tx.Rollback() + } + }() + err := orm.DeleteUserByUid(uid, tx) + if err != nil { + tx.Rollback() + logger.Errorf("DeleteUserByUID DeleteUserByUid :%s error, error msg:%s", uid, err.Error()) + return err + } + err = orm.DeleteUserLoginByUid(uid, tx) + if err != nil { + tx.Rollback() + logger.Errorf("DeleteUserByUID DeleteUserLoginByUid:%s error, error msg:%s", uid, err.Error()) + return err + } + return tx.Commit().Error +} + +func getRetrieveHtmlTemplate() string { + return ` +
+
+ + + + + + +
hi,您好
+
+
+ +
+
+

非常感谢使用 Zadig,点击下面的链接完成重置密码。

+
+
+ + + + + + + + + +
{{.Url}}
如果您不想继续完成密码重置,请忽略该邮件,链接将在5分钟之后过期!
+
+
+ +
+

本邮件由 Zadig 系统自动发出,请勿直接回复。

+

Made By Zadig Team ♥ Happy Coding.

+
` +} + +func Retrieve(account string, logger *zap.SugaredLogger) (*RetrieveResp, error) { + user, err := orm.GetUser(account, config.SystemIdentityType, core.DB) + if err != nil { + logger.Errorf("Retrieve GetUser:%s error, error msg:%s ", account, err) + return nil, fmt.Errorf("Retrieve GetUser:%s error, error msg:%s ", account, err) + } + if user == nil { + return nil, fmt.Errorf("user not exist") + } + if len(user.Email) == 0 { + logger.Errorf("the account:%s has not email", account) + return nil, fmt.Errorf("the account has not email") + } + + token, err := login.CreateToken(&login.Claims{ + Name: user.Name, + Account: user.Account, + Uid: user.UID, + StandardClaims: jwt.StandardClaims{ + Audience: setting.ProductName, + ExpiresAt: time.Now().Add(5 * time.Minute).Unix(), + }, + }) + if err != nil { + logger.Errorf("Retrieve user:%s create token error, error msg:%s", user.Account, err) + return nil, err + } + v := url.Values{} + v.Add("idtoken", token) + retrieveURL := configbase.SystemAddress() + "/signin?" + v.Encode() + body, err := mail.RenderEmailTemplate(retrieveURL, getRetrieveHtmlTemplate()) + if err != nil { + logger.Errorf("Retrieve renderEmailTemplate error, error msg:%s ", err) + return nil, fmt.Errorf("Retrieve renderEmailTemplate error, error msg:%s ", err) + } + err = mail.SendEmail(&mail.EmailParams{ + From: config.NoReplyEmailAddress(), + To: user.Email, + Subject: "重置密码", + Host: config.FeiShuEmailHost, + UserName: config.NoReplyEmailAddress(), + Password: config.NoReplyEmailPassword(), + Port: 465, + Body: body, + }) + if err != nil { + logger.Errorf("Retrieve SendEmail error, error msg:%s ", err) + return nil, err + } + return &RetrieveResp{ + Email: user.Email, + }, nil +} + func CreateUser(args *User, logger *zap.SugaredLogger) (*models.User, error) { uid, _ := uuid.NewUUID() user := &models.User{ @@ -318,6 +448,30 @@ func UpdatePassword(args *Password, logger *zap.SugaredLogger) error { return nil } +func Reset(args *ResetParams, logger *zap.SugaredLogger) error { + user, err := orm.GetUserByUid(args.Uid, core.DB) + if err != nil { + logger.Errorf("Reset GetUserByUid:%s error, error msg:%s", args.Uid, err) + return err + } + if user == nil { + logger.Error("user not exist") + return fmt.Errorf("user not exist") + } + + hashedPassword, _ := bcrypt.GenerateFromPassword([]byte(args.Password), bcrypt.DefaultCost) + userLogin := &models.UserLogin{ + UID: user.UID, + Password: string(hashedPassword), + } + err = orm.UpdateUserLogin(user.UID, userLogin, core.DB) + if err != nil { + logger.Errorf("UpdatePassword UpdateUserLogin:%v error, error msg:%s", userLogin, err.Error()) + return err + } + return nil +} + func SyncUser(syncUserInfo *SyncUserInfo, logger *zap.SugaredLogger) (*models.User, error) { user, err := orm.GetUser(syncUserInfo.Account, syncUserInfo.IdentityType, core.DB) if err != nil { @@ -374,6 +528,7 @@ func SyncUser(syncUserInfo *SyncUserInfo, logger *zap.SugaredLogger) (*models.Us } err = tx.Commit().Error if err != nil { + logger.Errorf("SyncUser tx commit error, error msg:%s ", err) return nil, err } return user, nil diff --git a/pkg/microservice/user/server/rest/router.go b/pkg/microservice/user/server/rest/router.go index 27be0a983..1ec76974c 100644 --- a/pkg/microservice/user/server/rest/router.go +++ b/pkg/microservice/user/server/rest/router.go @@ -21,12 +21,16 @@ import ( "github.com/koderover/zadig/pkg/microservice/user/core/handler" "github.com/koderover/zadig/pkg/microservice/user/core/handler/login" + "github.com/koderover/zadig/pkg/microservice/user/core/handler/user" ) func (s *engine) injectRouterGroup(router *gin.RouterGroup) { { router.GET("login", login.Login) router.POST("login", login.LocalLogin) + router.POST("signup", user.SignUp) + router.GET("retrieve", user.Retrieve) + router.POST("reset", user.Reset) } for name, r := range map[string]injector{ "/api/v1": new(handler.Router), diff --git a/pkg/microservice/user/server/server.go b/pkg/microservice/user/server/server.go index aa0f55e5d..648b1196d 100644 --- a/pkg/microservice/user/server/server.go +++ b/pkg/microservice/user/server/server.go @@ -21,6 +21,7 @@ import ( "net/http" "time" + "github.com/koderover/zadig/pkg/microservice/user/config" "github.com/koderover/zadig/pkg/microservice/user/core" "github.com/koderover/zadig/pkg/microservice/user/server/rest" "github.com/koderover/zadig/pkg/tool/log" @@ -33,8 +34,7 @@ func Serve(ctx context.Context) error { log.Info("Start user system service") engine := rest.NewEngine() - server := &http.Server{Addr: ":80", Handler: engine} - + server := &http.Server{Addr: ":" + config.UserPort(), Handler: engine} stopChan := make(chan struct{}) go func() { defer close(stopChan) diff --git a/pkg/setting/consts.go b/pkg/setting/consts.go index 3f28e61c3..8603a63b3 100644 --- a/pkg/setting/consts.go +++ b/pkg/setting/consts.go @@ -104,14 +104,17 @@ const ( TestMode = "test" // user - ENVIssuerURL = "ISSUER_URL" - ENVClientID = "CLIENT_ID" - ENVClientSecret = "CLIENT_SECRET" - ENVRedirectURI = "REDIRECT_URI" - ENVSecretKey = "SECRET_KEY" - ENVMysqlUserDB = "MYSQL_USER_DB" - ENVScopes = "SCOPES" - ENVTokenExpiresAt = "TOKEN_EXPIRES_AT" + ENVIssuerURL = "ISSUER_URL" + ENVClientID = "CLIENT_ID" + ENVClientSecret = "CLIENT_SECRET" + ENVRedirectURI = "REDIRECT_URI" + ENVSecretKey = "SECRET_KEY" + ENVMysqlUserDB = "MYSQL_USER_DB" + ENVScopes = "SCOPES" + ENVTokenExpiresAt = "TOKEN_EXPIRES_AT" + ENVNoReplyEmailAddress = "NOREPLY_EMAIL_ADDRESS" + ENVNoReplyEmailPassword = "NOREPLY_EMAIL_PASSWORD" + ENVUserPort = "USER_PORT" // initconfig ENVAdminEmail = "ADMIN_EMAIL" diff --git a/pkg/util/mail/mail.go b/pkg/util/mail/mail.go new file mode 100644 index 000000000..ca8acdb1e --- /dev/null +++ b/pkg/util/mail/mail.go @@ -0,0 +1,50 @@ +package mail + +import ( + "bytes" + "html/template" + + "gopkg.in/gomail.v2" +) + +type EmailParams struct { + From string + To string + Subject string + Body string + Host string + Port int + UserName string + Password string +} + +func SendEmail(param *EmailParams) error { + m := gomail.NewMessage() + m.SetHeader("From", param.From) + m.SetHeader("To", param.To) + m.SetHeader("Subject", param.Subject) + m.SetBody("text/html", param.Body) + + d := gomail.NewDialer(param.Host, param.Port, param.UserName, param.Password) + + if err := d.DialAndSend(m); err != nil { + return err + } + return nil +} + +type GenerateUrl struct { + Url string +} + +func RenderEmailTemplate(url string, html string) (content string, err error) { + buf := new(bytes.Buffer) + t := template.Must(template.New("email").Funcs(template.FuncMap{}).Parse(html)) + + if err = t.Execute(buf, &GenerateUrl{ + Url: url, + }); err != nil { + return "", err + } + return buf.String(), nil +} -- Gitee From 9521fd32fad6a87378c0c398a16b0aa4886a4ac5 Mon Sep 17 00:00:00 2001 From: mouuii Date: Thu, 4 Nov 2021 13:57:21 +0800 Subject: [PATCH 219/405] poetry Signed-off-by: mouuii --- .../systemconfig/core/handler/jira.go | 43 +++++++++ .../systemconfig/core/handler/router.go | 8 ++ .../core/repository/models/jira.go | 21 +++++ .../core/repository/mongo/jira.go | 89 +++++++++++++++++++ .../systemconfig/core/service/jira.go | 24 +++++ 5 files changed, 185 insertions(+) create mode 100644 pkg/microservice/systemconfig/core/handler/jira.go create mode 100644 pkg/microservice/systemconfig/core/repository/models/jira.go create mode 100644 pkg/microservice/systemconfig/core/repository/mongo/jira.go create mode 100644 pkg/microservice/systemconfig/core/service/jira.go diff --git a/pkg/microservice/systemconfig/core/handler/jira.go b/pkg/microservice/systemconfig/core/handler/jira.go new file mode 100644 index 000000000..7354e4f4f --- /dev/null +++ b/pkg/microservice/systemconfig/core/handler/jira.go @@ -0,0 +1,43 @@ +package handler + +import ( + "github.com/gin-gonic/gin" + + "github.com/koderover/zadig/pkg/microservice/systemconfig/core/repository/models" + "github.com/koderover/zadig/pkg/microservice/systemconfig/core/service" + internalhandler "github.com/koderover/zadig/pkg/shared/handler" +) + +func DeleteJira(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + ctx.Err = service.DeleteEmailService(ctx.Logger) +} + +func GetJira(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + ctx.Resp, ctx.Err = service.GeJira(ctx.Logger) +} + +func CreateJira(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + req := new(models.Jira) + if err := c.ShouldBindJSON(req); err != nil { + ctx.Err = err + return + } + ctx.Resp, ctx.Err = service.CreateJira(req, ctx.Logger) +} + +func UpdateJira(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + req := new(models.Jira) + if err := c.ShouldBindJSON(req); err != nil { + ctx.Err = err + return + } + ctx.Resp, ctx.Err = service.UpdateJira(req, ctx.Logger) +} diff --git a/pkg/microservice/systemconfig/core/handler/router.go b/pkg/microservice/systemconfig/core/handler/router.go index f61b00ec9..359c4e940 100644 --- a/pkg/microservice/systemconfig/core/handler/router.go +++ b/pkg/microservice/systemconfig/core/handler/router.go @@ -47,4 +47,12 @@ func (*Router) Inject(router *gin.RouterGroup) { emails.PATCH("/service", UpdateEmailService) emails.DELETE("/service", DeleteEmailService) } + + jira := router.Group("jira") + { + jira.GET("", GetJira) + jira.POST("", CreateJira) + jira.PATCH("", UpdateJira) + jira.DELETE("", DeleteJira) + } } diff --git a/pkg/microservice/systemconfig/core/repository/models/jira.go b/pkg/microservice/systemconfig/core/repository/models/jira.go new file mode 100644 index 000000000..fd22eb186 --- /dev/null +++ b/pkg/microservice/systemconfig/core/repository/models/jira.go @@ -0,0 +1,21 @@ +package models + +import ( + "github.com/globalsign/mgo/bson" +) + +type Jira struct { + ObjectID bson.ObjectId `bson:"_id,omitempty"` + ID int64 `bson:"id"` + Host string `bson:"host"` + User string `bson:"user"` + AccessToken string `bson:"access_token"` + OrganizationID int `bson:"organization_id"` + CreatedAt int64 `bson:"created_at"` + UpdatedAt int64 `bson:"updated_at"` + DeletedAt int64 `bson:"deleted_at"` +} + +func (Jira) TableName() string { + return "jira" +} diff --git a/pkg/microservice/systemconfig/core/repository/mongo/jira.go b/pkg/microservice/systemconfig/core/repository/mongo/jira.go new file mode 100644 index 000000000..cf25ccfa0 --- /dev/null +++ b/pkg/microservice/systemconfig/core/repository/mongo/jira.go @@ -0,0 +1,89 @@ +package mongo + +import ( + "context" + "time" + + "go.mongodb.org/mongo-driver/mongo" + + "github.com/globalsign/mgo/bson" + + "github.com/koderover/zadig/pkg/microservice/systemconfig/config" + "github.com/koderover/zadig/pkg/microservice/systemconfig/core/repository/models" + "github.com/koderover/zadig/pkg/tool/log" + mongotool "github.com/koderover/zadig/pkg/tool/mongo" +) + +type JiraColl struct { + *mongo.Collection + + coll string +} + +func NewJiraColl() *JiraColl { + name := models.Jira{}.TableName() + coll := &JiraColl{Collection: mongotool.Database(config.MongoDatabase()).Collection(name), coll: name} + + return coll +} + +func (c *JiraColl) GetCollectionName() string { + return c.coll +} +func (c *JiraColl) EnsureIndex(ctx context.Context) error { + return nil +} + +func (c *JiraColl) AddJira(iJira *models.Jira) (*models.Jira, error) { + _, err := c.Collection.InsertOne(context.TODO(), iJira) + if err != nil { + log.Error("repository AddJira err : %v", err) + return nil, err + } + return iJira, nil +} + +func (c *JiraColl) UpdateJira(iJira *models.Jira) (*models.Jira, error) { + + query := bson.M{"deleted_at": 0} + change := bson.M{"$set": bson.M{ + "host": iJira.Host, + "user": iJira.User, + "access_token": iJira.AccessToken, + "updated_at": time.Now().Unix(), + }} + + _, err := c.Collection.UpdateOne(context.TODO(), query, change) + if err != nil { + log.Error("repository UpdateJira err : %v", err) + return nil, err + } + return iJira, nil +} + +func (c *JiraColl) DeleteJira() error { + + query := bson.M{"deleted_at": 0} + change := bson.M{"$set": bson.M{ + "deleted_at": time.Now().Unix(), + }} + + _, err := c.Collection.UpdateOne(context.TODO(), query, change) + if err != nil { + log.Error("repository DeleteJira err : %v", err) + return err + } + return nil +} + +func (c *JiraColl) GetJira() (*models.Jira, error) { + jira := &models.Jira{} + query := bson.M{"deleted_at": 0} + + err := c.Collection.FindOne(context.TODO(), query).Decode(jira) + if err != nil { + log.Error("repository GetJira err : %v", err) + return nil, err + } + return jira, nil +} diff --git a/pkg/microservice/systemconfig/core/service/jira.go b/pkg/microservice/systemconfig/core/service/jira.go new file mode 100644 index 000000000..b84a9aa85 --- /dev/null +++ b/pkg/microservice/systemconfig/core/service/jira.go @@ -0,0 +1,24 @@ +package service + +import ( + "go.uber.org/zap" + + "github.com/koderover/zadig/pkg/microservice/systemconfig/core/repository/models" + "github.com/koderover/zadig/pkg/microservice/systemconfig/core/repository/mongo" +) + +func GeJira(_ *zap.SugaredLogger) (*models.Jira, error) { + return mongo.NewJiraColl().GetJira() +} + +func CreateJira(jira *models.Jira, _ *zap.SugaredLogger) (*models.Jira, error) { + return mongo.NewJiraColl().AddJira(jira) +} + +func UpdateJira(jira *models.Jira, _ *zap.SugaredLogger) (*models.Jira, error) { + return mongo.NewJiraColl().UpdateJira(jira) +} + +func DeleteJira(_ *zap.SugaredLogger) error { + return mongo.NewEmailServiceColl().DeleteEmailService() +} -- Gitee From 96caa49ef0b1c85422978c953b0e59a280ef9bfc Mon Sep 17 00:00:00 2001 From: panxunying <641770806@qq.com> Date: Thu, 4 Nov 2021 14:36:50 +0800 Subject: [PATCH 220/405] optimize and add sort list user Signed-off-by: panxunying <641770806@qq.com> --- pkg/microservice/user/config/config.go | 10 ++-- .../user/core/repository/orm/user.go | 2 +- .../user/core/service/user/retrieve.html | 34 ++++++++++++ .../user/core/service/user/user.go | 52 ++++--------------- pkg/{util => tool}/mail/mail.go | 0 5 files changed, 51 insertions(+), 47 deletions(-) create mode 100644 pkg/microservice/user/core/service/user/retrieve.html rename pkg/{util => tool}/mail/mail.go (100%) diff --git a/pkg/microservice/user/config/config.go b/pkg/microservice/user/config/config.go index a633c8b05..1981dfdc2 100644 --- a/pkg/microservice/user/config/config.go +++ b/pkg/microservice/user/config/config.go @@ -25,6 +25,10 @@ import ( "github.com/koderover/zadig/pkg/setting" ) +func init() { + viper.SetDefault(setting.ENVUserPort, "80") +} + func IssuerURL() string { return viper.GetString(setting.ENVIssuerURL) } @@ -62,9 +66,5 @@ func NoReplyEmailPassword() string { } func UserPort() string { - port := viper.GetString(setting.ENVUserPort) - if len(port) > 0 { - return port - } - return "80" + return viper.GetString(setting.ENVUserPort) } diff --git a/pkg/microservice/user/core/repository/orm/user.go b/pkg/microservice/user/core/repository/orm/user.go index 27f4e55cd..994a89d90 100644 --- a/pkg/microservice/user/core/repository/orm/user.go +++ b/pkg/microservice/user/core/repository/orm/user.go @@ -48,7 +48,7 @@ func ListUsers(page int, perPage int, name string, db *gorm.DB) ([]models.User, err error ) - err = db.Where("name LIKE ?", "%"+name+"%").Offset((page - 1) * perPage).Limit(perPage).Find(&users).Error + err = db.Where("name LIKE ?", "%"+name+"%").Order("account ASC").Offset((page - 1) * perPage).Limit(perPage).Find(&users).Error if err != nil && err != gorm.ErrRecordNotFound { return nil, err diff --git a/pkg/microservice/user/core/service/user/retrieve.html b/pkg/microservice/user/core/service/user/retrieve.html new file mode 100644 index 000000000..87f024a4b --- /dev/null +++ b/pkg/microservice/user/core/service/user/retrieve.html @@ -0,0 +1,34 @@ +
+
+ + + + + + +
hi,您好
+
+
+ +
+
+

非常感谢使用 Zadig,点击下面的链接完成重置密码。

+
+
+ + + + + + + + + +
{{.Url}}
如果您不想继续完成密码重置,请忽略该邮件,链接将在5分钟之后过期!
+
+
+ +
+

本邮件由 Zadig 系统自动发出,请勿直接回复。

+

Made By Zadig Team ♥ Happy Coding.

+
\ No newline at end of file diff --git a/pkg/microservice/user/core/service/user/user.go b/pkg/microservice/user/core/service/user/user.go index 07d9ed925..8bab60479 100644 --- a/pkg/microservice/user/core/service/user/user.go +++ b/pkg/microservice/user/core/service/user/user.go @@ -1,6 +1,7 @@ package user import ( + _ "embed" "fmt" "net/url" "time" @@ -19,7 +20,7 @@ import ( "github.com/koderover/zadig/pkg/microservice/user/core/service/login" "github.com/koderover/zadig/pkg/setting" "github.com/koderover/zadig/pkg/shared/client/systemconfig" - "github.com/koderover/zadig/pkg/util/mail" + "github.com/koderover/zadig/pkg/tool/mail" ) type User struct { @@ -113,10 +114,14 @@ func SearchAndSyncUser(ldapId string, logger *zap.SugaredLogger) error { return err } for _, entry := range sr.Entries { - account := si.Config.UserSearch.NameAttr + account := si.Config.UserSearch.Username + name := account + if len(si.Config.UserSearch.NameAttr) != 0 { + name = si.Config.UserSearch.NameAttr + } _, err := SyncUser(&SyncUserInfo{ Account: entry.GetAttributeValue(account), - Name: entry.GetAttributeValue(account), + Name: name, IdentityType: si.ID, // ldap may have not only one instance, so use id as identityType }, logger) if err != nil { @@ -276,43 +281,8 @@ func DeleteUserByUID(uid string, logger *zap.SugaredLogger) error { return tx.Commit().Error } -func getRetrieveHtmlTemplate() string { - return ` -
-
- - - - - - -
hi,您好
-
-
- -
-
-

非常感谢使用 Zadig,点击下面的链接完成重置密码。

-
-
- - - - - - - - - -
{{.Url}}
如果您不想继续完成密码重置,请忽略该邮件,链接将在5分钟之后过期!
-
-
- -
-

本邮件由 Zadig 系统自动发出,请勿直接回复。

-

Made By Zadig Team ♥ Happy Coding.

-
` -} +//go:embed retrieve.html +var retrieveHemlTemplate []byte func Retrieve(account string, logger *zap.SugaredLogger) (*RetrieveResp, error) { user, err := orm.GetUser(account, config.SystemIdentityType, core.DB) @@ -344,7 +314,7 @@ func Retrieve(account string, logger *zap.SugaredLogger) (*RetrieveResp, error) v := url.Values{} v.Add("idtoken", token) retrieveURL := configbase.SystemAddress() + "/signin?" + v.Encode() - body, err := mail.RenderEmailTemplate(retrieveURL, getRetrieveHtmlTemplate()) + body, err := mail.RenderEmailTemplate(retrieveURL, string(retrieveHemlTemplate)) if err != nil { logger.Errorf("Retrieve renderEmailTemplate error, error msg:%s ", err) return nil, fmt.Errorf("Retrieve renderEmailTemplate error, error msg:%s ", err) diff --git a/pkg/util/mail/mail.go b/pkg/tool/mail/mail.go similarity index 100% rename from pkg/util/mail/mail.go rename to pkg/tool/mail/mail.go -- Gitee From 7017ad86c62ec912f1532c19afa702dce1f17356 Mon Sep 17 00:00:00 2001 From: mouuii Date: Thu, 4 Nov 2021 16:20:21 +0800 Subject: [PATCH 221/405] json Signed-off-by: mouuii --- .../core/repository/models/email.go | 35 +++++++++---------- .../core/repository/models/jira.go | 16 ++++----- 2 files changed, 25 insertions(+), 26 deletions(-) diff --git a/pkg/microservice/systemconfig/core/repository/models/email.go b/pkg/microservice/systemconfig/core/repository/models/email.go index 8209f4e3b..150705560 100644 --- a/pkg/microservice/systemconfig/core/repository/models/email.go +++ b/pkg/microservice/systemconfig/core/repository/models/email.go @@ -5,15 +5,14 @@ import ( ) type EmailHost struct { - ID int `json:"id"` - Name string `json:"name"` - Port int `json:"port"` - Username string `json:"username"` - Password string `json:"password"` - IsTLS bool `json:"isTLS"` - OrganizationID int `json:"orgId"` - CreatedAt int64 `json:"created_at"` - UpdatedAt int64 `json:"updated_at"` + ID int `json:"id" bson:"id"` + Name string `json:"name" bson:"name"` + Port int `json:"port" bson:"port"` + Username string `json:"username" bson:"username"` + Password string `json:"password" bson:"password"` + IsTLS bool `json:"isTLS" bson:"is_tls"` + CreatedAt int64 `json:"created_at" bson:"created_at"` + UpdatedAt int64 `json:"updated_at" bson:"updated_at"` } func (EmailHost) TableName() string { @@ -22,15 +21,15 @@ func (EmailHost) TableName() string { type EmailService struct { ObjectID bson.ObjectId `bson:"_id,omitempty"` - ID int `bson:"id"` - Name string `bson:"name"` - Address string `bson:"address"` - DisplayName string `bson:"display_name"` - Theme string `bson:"theme"` - OrganizationID int `bson:"organization_id"` - CreatedAt int64 `bson:"created_at"` - UpdatedAt int64 `bson:"updated_at"` - DeletedAt int64 `bson:"deleted_at"` + ID int `json:"id" bson:"id"` + Name string `json:"name" bson:"name"` + Address string `json:"address" bson:"address"` + DisplayName string `json:"display_name" bson:"display_name"` + Theme string `json:"theme" bson:"theme"` + OrganizationID int `json:"organization_id" bson:"organization_id"` + CreatedAt int64 `json:"created_at" bson:"created_at"` + UpdatedAt int64 `json:"updated_at" bson:"updated_at"` + DeletedAt int64 `json:"deleted_at" bson:"deleted_at"` } func (EmailService) TableName() string { diff --git a/pkg/microservice/systemconfig/core/repository/models/jira.go b/pkg/microservice/systemconfig/core/repository/models/jira.go index fd22eb186..2d29b6689 100644 --- a/pkg/microservice/systemconfig/core/repository/models/jira.go +++ b/pkg/microservice/systemconfig/core/repository/models/jira.go @@ -6,14 +6,14 @@ import ( type Jira struct { ObjectID bson.ObjectId `bson:"_id,omitempty"` - ID int64 `bson:"id"` - Host string `bson:"host"` - User string `bson:"user"` - AccessToken string `bson:"access_token"` - OrganizationID int `bson:"organization_id"` - CreatedAt int64 `bson:"created_at"` - UpdatedAt int64 `bson:"updated_at"` - DeletedAt int64 `bson:"deleted_at"` + ID int64 `json:"id" bson:"id"` + Host string `json:"host" bson:"host"` + User string `json:"user" bson:"user"` + AccessToken string `json:"access_token" bson:"access_token"` + OrganizationID int `json:"organization_id" bson:"organization_id"` + CreatedAt int64 `json:"created_at" bson:"created_at"` + UpdatedAt int64 `json:"updated_at" bson:"updated_at"` + DeletedAt int64 `json:"deleted_at" bson:"deleted_at"` } func (Jira) TableName() string { -- Gitee From f513b9a47c46e0222b88f255609596bd81cf01fd Mon Sep 17 00:00:00 2001 From: panxunying <641770806@qq.com> Date: Thu, 4 Nov 2021 16:37:23 +0800 Subject: [PATCH 222/405] remove user config Signed-off-by: panxunying <641770806@qq.com> --- pkg/microservice/user/config/config.go | 4 ---- pkg/microservice/user/server/server.go | 4 ++-- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/pkg/microservice/user/config/config.go b/pkg/microservice/user/config/config.go index 1981dfdc2..dcc74c8dd 100644 --- a/pkg/microservice/user/config/config.go +++ b/pkg/microservice/user/config/config.go @@ -64,7 +64,3 @@ func NoReplyEmailAddress() string { func NoReplyEmailPassword() string { return viper.GetString(setting.ENVNoReplyEmailPassword) } - -func UserPort() string { - return viper.GetString(setting.ENVUserPort) -} diff --git a/pkg/microservice/user/server/server.go b/pkg/microservice/user/server/server.go index 648b1196d..aa0f55e5d 100644 --- a/pkg/microservice/user/server/server.go +++ b/pkg/microservice/user/server/server.go @@ -21,7 +21,6 @@ import ( "net/http" "time" - "github.com/koderover/zadig/pkg/microservice/user/config" "github.com/koderover/zadig/pkg/microservice/user/core" "github.com/koderover/zadig/pkg/microservice/user/server/rest" "github.com/koderover/zadig/pkg/tool/log" @@ -34,7 +33,8 @@ func Serve(ctx context.Context) error { log.Info("Start user system service") engine := rest.NewEngine() - server := &http.Server{Addr: ":" + config.UserPort(), Handler: engine} + server := &http.Server{Addr: ":80", Handler: engine} + stopChan := make(chan struct{}) go func() { defer close(stopChan) -- Gitee From 9ec4f22220bd54828604ef57620cce4e02aad587 Mon Sep 17 00:00:00 2001 From: panxunying <641770806@qq.com> Date: Thu, 4 Nov 2021 16:45:13 +0800 Subject: [PATCH 223/405] Ldap sync user (#522) * add user-sync Signed-off-by: panxunying <641770806@qq.com> * optimize Signed-off-by: panxunying <641770806@qq.com> * optimize Signed-off-by: panxunying <641770806@qq.com> * add sync deleted user Signed-off-by: panxunying <641770806@qq.com> * fix config convert error Signed-off-by: panxunying <641770806@qq.com> * remove sync delete user Signed-off-by: panxunying <641770806@qq.com> * optimize Signed-off-by: panxunying <641770806@qq.com> --- .../user/core/repository/orm/user.go | 26 +++++++++++++ .../user/core/repository/orm/user_login.go | 10 +++++ .../user/core/service/user/user.go | 37 ++++++++----------- .../client/systemconfig/systemconfig.go | 12 +++--- 4 files changed, 59 insertions(+), 26 deletions(-) diff --git a/pkg/microservice/user/core/repository/orm/user.go b/pkg/microservice/user/core/repository/orm/user.go index 84e658bc2..ba025eacf 100644 --- a/pkg/microservice/user/core/repository/orm/user.go +++ b/pkg/microservice/user/core/repository/orm/user.go @@ -73,6 +73,32 @@ func ListUsersByUIDs(uids []string, db *gorm.DB) ([]models.User, error) { return users, nil } +// ListUsersByIdentityType gets a list of users based on identityType +func ListUsersByIdentityType(identityType string, db *gorm.DB) ([]models.User, error) { + var ( + users []models.User + err error + ) + + err = db.Find(&users, "identity_type = ?", identityType).Error + + if err != nil && err != gorm.ErrRecordNotFound { + return nil, err + } + + return users, nil +} + +// DeleteUserByUids Delete users based on uids +func DeleteUserByUids(uids []string, db *gorm.DB) error { + var user models.User + err := db.Where("uid in ?", uids).Delete(&user).Error + if err != nil { + return err + } + return nil +} + // GetUsersCount gets user count func GetUsersCount(name string) (int64, error) { var ( diff --git a/pkg/microservice/user/core/repository/orm/user_login.go b/pkg/microservice/user/core/repository/orm/user_login.go index 153a538a6..a46c517dc 100644 --- a/pkg/microservice/user/core/repository/orm/user_login.go +++ b/pkg/microservice/user/core/repository/orm/user_login.go @@ -28,6 +28,16 @@ func GetUserLogin(uid string, account string, loginType config.LoginType, db *go return &userLogin, nil } +// DeleteUserLoginByUids Delete userLogin based on uids +func DeleteUserLoginByUids(uids []string, db *gorm.DB) error { + var userLogin models.UserLogin + err := db.Where("uid in ?", uids).Delete(&userLogin).Error + if err != nil { + return err + } + return nil +} + // ListUserLogins Get a userLogin based on uid list func ListUserLogins(uids []string, db *gorm.DB) (*[]models.UserLogin, error) { var userLogins []models.UserLogin diff --git a/pkg/microservice/user/core/service/user/user.go b/pkg/microservice/user/core/service/user/user.go index 3ab8627ed..648fa1029 100644 --- a/pkg/microservice/user/core/service/user/user.go +++ b/pkg/microservice/user/core/service/user/user.go @@ -4,7 +4,6 @@ import ( "fmt" "time" - "github.com/dexidp/dex/connector/ldap" ldapv3 "github.com/go-ldap/ldap/v3" "github.com/google/uuid" "go.uber.org/zap" @@ -63,53 +62,49 @@ type SyncUserInfo struct { func SearchAndSyncUser(ldapId string, logger *zap.SugaredLogger) error { systemConfigClient := systemconfig.New() - si, err := systemConfigClient.GetConnector(ldapId) + si, err := systemConfigClient.GetLDAPConnector(ldapId) if err != nil { - logger.Errorf("SearchAndSyncUser GetConnector error, error msg:%s", err) - return fmt.Errorf("SearchAndSyncUser GetConnector error, error msg:%s", err) + logger.Errorf("SearchAndSyncUser GetLDAPConnector error, error msg:%s", err) + return fmt.Errorf("SearchAndSyncUser GetLDAPConnector error, error msg:%s", err) } if si == nil || si.Config == nil { logger.Error("can't find connector") return fmt.Errorf("can't find connector") } - config, ok := si.Config.(*ldap.Config) - if !ok { - return fmt.Errorf("connector config error") - } - l, err := ldapv3.Dial("tcp", config.Host) + l, err := ldapv3.Dial("tcp", si.Config.Host) if err != nil { - logger.Errorf("ldap dial host:%s error, error msg:%s", config.Host, err) + logger.Errorf("ldap dial host:%s error, error msg:%s", si.Config.Host, err) return err } defer l.Close() - err = l.Bind(config.BindDN, config.BindPW) + err = l.Bind(si.Config.BindDN, si.Config.BindPW) if err != nil { - logger.Errorf("ldap bind host:%s error, error msg:%s", config.Host, err) + logger.Errorf("ldap bind host:%s error, error msg:%s", si.Config.Host, err) return err } searchRequest := ldapv3.NewSearchRequest( - config.GroupSearch.BaseDN, + si.Config.GroupSearch.BaseDN, ldapv3.ScopeWholeSubtree, ldapv3.NeverDerefAliases, 0, 0, false, - config.GroupSearch.Filter, // The filter to apply - []string{config.UserSearch.NameAttr}, // A list attributes to retrieve + si.Config.GroupSearch.Filter, // The filter to apply + []string{si.Config.UserSearch.NameAttr}, // A list attributes to retrieve nil, ) sr, err := l.Search(searchRequest) if err != nil { - logger.Errorf("ldap search host:%s error, error msg:%s", config.Host, err) + logger.Errorf("ldap search host:%s error, error msg:%s", si.Config.Host, err) return err } - for _, entry := range sr.Entries { + account := si.Config.UserSearch.NameAttr _, err := SyncUser(&SyncUserInfo{ - Account: entry.GetAttributeValue(config.UserSearch.NameAttr), - IdentityType: si.ID, + Account: entry.GetAttributeValue(account), + IdentityType: si.ID, // ldap may have not only one instance, so use id as identityType }, logger) if err != nil { - logger.Errorf("ldap host:%s sync user error, error msg:%s", config.Host, err) + logger.Errorf("ldap host:%s sync user error, error msg:%s", si.Config.Host, err) return err } } @@ -161,7 +156,7 @@ func SearchUserByAccount(args *QueryArgs, logger *zap.SugaredLogger) (*UsersResp func SearchUsers(args *QueryArgs, logger *zap.SugaredLogger) (*UsersResp, error) { count, err := orm.GetUsersCount(args.Name) if err != nil { - logger.Errorf("SeachUsers GetUsersCount By account:%s error, error msg:%s", args.Account, err.Error()) + logger.Errorf("SeachUsers GetUsersCount By name:%s error, error msg:%s", args.Name, err.Error()) return nil, err } if count == 0 { diff --git a/pkg/shared/client/systemconfig/systemconfig.go b/pkg/shared/client/systemconfig/systemconfig.go index 6d98e516f..caf958e3d 100644 --- a/pkg/shared/client/systemconfig/systemconfig.go +++ b/pkg/shared/client/systemconfig/systemconfig.go @@ -1,17 +1,19 @@ package systemconfig import ( + "github.com/dexidp/dex/connector/ldap" + "github.com/koderover/zadig/pkg/tool/httpclient" ) type Connector struct { - Type string `json:"type"` - ID string `json:"id"` - Name string `json:"name"` - Config interface{} `json:"config"` + Type string `json:"type"` + ID string `json:"id"` + Name string `json:"name"` + Config *ldap.Config `json:"config"` } -func (c *Client) GetConnector(id string) (*Connector, error) { +func (c *Client) GetLDAPConnector(id string) (*Connector, error) { url := "/connectors/" + id res := &Connector{} -- Gitee From e88aad0d484a07b9fda3c0435d0627d186194691 Mon Sep 17 00:00:00 2001 From: mouuii Date: Thu, 4 Nov 2021 16:55:36 +0800 Subject: [PATCH 224/405] json Signed-off-by: mouuii --- .../systemconfig/core/handler/codehost.go | 20 +++++ .../systemconfig/core/handler/router.go | 4 + .../core/repository/models/codehost.go | 24 +++++ .../core/repository/models/email.go | 2 +- .../core/repository/mongo/codehost.go | 87 +++++++++++++++++++ .../core/repository/mongo/email.go | 2 +- .../systemconfig/core/service/codehost.go | 12 +++ 7 files changed, 149 insertions(+), 2 deletions(-) create mode 100644 pkg/microservice/systemconfig/core/handler/codehost.go create mode 100644 pkg/microservice/systemconfig/core/repository/models/codehost.go create mode 100644 pkg/microservice/systemconfig/core/repository/mongo/codehost.go create mode 100644 pkg/microservice/systemconfig/core/service/codehost.go diff --git a/pkg/microservice/systemconfig/core/handler/codehost.go b/pkg/microservice/systemconfig/core/handler/codehost.go new file mode 100644 index 000000000..564f97e01 --- /dev/null +++ b/pkg/microservice/systemconfig/core/handler/codehost.go @@ -0,0 +1,20 @@ +package handler + +import ( + "github.com/gin-gonic/gin" + + "github.com/koderover/zadig/pkg/microservice/systemconfig/core/repository/models" + "github.com/koderover/zadig/pkg/microservice/systemconfig/core/service" + internalhandler "github.com/koderover/zadig/pkg/shared/handler" +) + +func CreateCodehost(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + rep := new(models.CodeHost) + if err := c.ShouldBindJSON(rep); err != nil { + ctx.Err = err + return + } + ctx.Resp, ctx.Err = service.CreateCodehost(rep, ctx.Logger) +} diff --git a/pkg/microservice/systemconfig/core/handler/router.go b/pkg/microservice/systemconfig/core/handler/router.go index 359c4e940..33f3273cb 100644 --- a/pkg/microservice/systemconfig/core/handler/router.go +++ b/pkg/microservice/systemconfig/core/handler/router.go @@ -55,4 +55,8 @@ func (*Router) Inject(router *gin.RouterGroup) { jira.PATCH("", UpdateJira) jira.DELETE("", DeleteJira) } + codehost := router.Group("codehost") + { + codehost.POST("", CreateCodehost) + } } diff --git a/pkg/microservice/systemconfig/core/repository/models/codehost.go b/pkg/microservice/systemconfig/core/repository/models/codehost.go new file mode 100644 index 000000000..fd4e10c5e --- /dev/null +++ b/pkg/microservice/systemconfig/core/repository/models/codehost.go @@ -0,0 +1,24 @@ +package models + +type CodeHost struct { + ID int `json:"id"` + Name string `json:"name"` + Type string `json:"type"` + Address string `json:"address"` + IsReady bool `json:"ready"` + AccessToken string `json:"accessToken"` + RefreshToken string `json:"refreshToken"` + Namespace string `json:"namespace"` + OrganizationID int `json:"orgId"` + ApplicationId string `json:"applicationId"` + Region string `json:"region,omitempty"` + Username string `json:"username,omitempty"` + Password string `json:"password,omitempty"` + ClientSecret string `json:"clientSecret"` + CreatedAt int64 `json:"created_at"` + UpdatedAt int64 `json:"updated_at"` +} + +func (CodeHost) TableName() string { + return "code_host" +} diff --git a/pkg/microservice/systemconfig/core/repository/models/email.go b/pkg/microservice/systemconfig/core/repository/models/email.go index 150705560..7682584a4 100644 --- a/pkg/microservice/systemconfig/core/repository/models/email.go +++ b/pkg/microservice/systemconfig/core/repository/models/email.go @@ -10,7 +10,7 @@ type EmailHost struct { Port int `json:"port" bson:"port"` Username string `json:"username" bson:"username"` Password string `json:"password" bson:"password"` - IsTLS bool `json:"isTLS" bson:"is_tls"` + IsTLS bool `json:"isTLS" bson:"is_tls"` CreatedAt int64 `json:"created_at" bson:"created_at"` UpdatedAt int64 `json:"updated_at" bson:"updated_at"` } diff --git a/pkg/microservice/systemconfig/core/repository/mongo/codehost.go b/pkg/microservice/systemconfig/core/repository/mongo/codehost.go new file mode 100644 index 000000000..d6d719629 --- /dev/null +++ b/pkg/microservice/systemconfig/core/repository/mongo/codehost.go @@ -0,0 +1,87 @@ +package mongo + +import ( + "context" + "time" + + "go.mongodb.org/mongo-driver/mongo" + + "github.com/globalsign/mgo/bson" + + "github.com/koderover/zadig/pkg/microservice/systemconfig/config" + "github.com/koderover/zadig/pkg/microservice/systemconfig/core/repository/models" + "github.com/koderover/zadig/pkg/tool/log" + mongotool "github.com/koderover/zadig/pkg/tool/mongo" +) + +type CodehostColl struct { + *mongo.Collection + + coll string +} + +func NewCodehostColl() *CodehostColl { + name := models.CodeHost{}.TableName() + coll := &CodehostColl{Collection: mongotool.Database(config.MongoDatabase()).Collection(name), coll: name} + + return coll +} + +func (c *CodehostColl) GetCollectionName() string { + return c.coll +} +func (c *CodehostColl) EnsureIndex(ctx context.Context) error { + return nil +} + +func (c *CodehostColl) AddCodeHost(iCodeHost *models.CodeHost) (*models.CodeHost, error) { + + _, err := c.Collection.InsertOne(context.TODO(), iCodeHost) + if err != nil { + log.Error("repository AddCodeHost err : %v", err) + return nil, err + } + return iCodeHost, nil +} + +func (c *CodehostColl) DeleteCodeHostByID(ID int) error { + query := bson.M{"id": ID, "deleted_at": 0} + change := bson.M{"$set": bson.M{ + "deleted_at": time.Now().Unix(), + }} + + _, err := c.Collection.UpdateOne(context.TODO(), query, change) + if err != nil { + log.Error("repository DeleteCodeHostByID err : %v", err) + return err + } + return nil +} + +func (c *CodehostColl) GetCodeHostByID(ID int) (*models.CodeHost, error) { + + codehost := new(models.CodeHost) + query := bson.M{"id": ID, "deleted_at": 0} + err := c.Collection.FindOne(context.TODO(), query).Decode(codehost) + if err != nil { + log.Error("repository GetCodeHostByID err : %v", err) + return nil, err + } + + return codehost, nil +} + +func (c *CodehostColl) FindCodeHosts() ([]*models.CodeHost, error) { + codeHosts := make([]*models.CodeHost, 0) + query := bson.M{"deleted_at": 0} + + cursor, err := c.Collection.Find(context.TODO(), query) + if err != nil { + return nil, err + } + err = cursor.All(context.TODO(), &codeHosts) + if err != nil { + return nil, err + } + return codeHosts, nil +} diff --git a/pkg/microservice/systemconfig/core/repository/mongo/email.go b/pkg/microservice/systemconfig/core/repository/mongo/email.go index ca02e9778..5b3b47030 100644 --- a/pkg/microservice/systemconfig/core/repository/mongo/email.go +++ b/pkg/microservice/systemconfig/core/repository/mongo/email.go @@ -68,7 +68,7 @@ func (c *EmailHostColl) Find() (*models.EmailHost, error) { } func (c *EmailHostColl) Update(emailHost *models.EmailHost) (*models.EmailHost, error) { - query := bson.M{"organization_id": emailHost.OrganizationID, "deleted_at": 0} + query := bson.M{"deleted_at": 0} change := bson.M{"$set": bson.M{ "name": emailHost.Name, "port": emailHost.Port, diff --git a/pkg/microservice/systemconfig/core/service/codehost.go b/pkg/microservice/systemconfig/core/service/codehost.go new file mode 100644 index 000000000..e0b800fe3 --- /dev/null +++ b/pkg/microservice/systemconfig/core/service/codehost.go @@ -0,0 +1,12 @@ +package service + +import ( + "go.uber.org/zap" + + "github.com/koderover/zadig/pkg/microservice/systemconfig/core/repository/models" + "github.com/koderover/zadig/pkg/microservice/systemconfig/core/repository/mongo" +) + +func CreateCodehost(codehost *models.CodeHost, _ *zap.SugaredLogger) (*models.CodeHost, error) { + return mongo.NewCodehostColl().AddCodeHost(codehost) +} -- Gitee From a098b7786768a0683dfe84c6f5a6998db5193070 Mon Sep 17 00:00:00 2001 From: mouuii Date: Thu, 4 Nov 2021 17:04:01 +0800 Subject: [PATCH 225/405] json Signed-off-by: mouuii --- pkg/microservice/systemconfig/core/repository/models/jira.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/microservice/systemconfig/core/repository/models/jira.go b/pkg/microservice/systemconfig/core/repository/models/jira.go index 2d29b6689..9f7a2c08a 100644 --- a/pkg/microservice/systemconfig/core/repository/models/jira.go +++ b/pkg/microservice/systemconfig/core/repository/models/jira.go @@ -5,7 +5,7 @@ import ( ) type Jira struct { - ObjectID bson.ObjectId `bson:"_id,omitempty"` + ObjectID bson.ObjectId `json:"-" bson:"_id,omitempty"` ID int64 `json:"id" bson:"id"` Host string `json:"host" bson:"host"` User string `json:"user" bson:"user"` -- Gitee From 5fb880b48e8dc053f59925930486e79e7142caf0 Mon Sep 17 00:00:00 2001 From: mouuii Date: Thu, 4 Nov 2021 17:06:33 +0800 Subject: [PATCH 226/405] json Signed-off-by: mouuii --- .../systemconfig/core/repository/mongo/codehost.go | 4 +--- pkg/microservice/systemconfig/core/repository/mongo/email.go | 3 +-- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/pkg/microservice/systemconfig/core/repository/mongo/codehost.go b/pkg/microservice/systemconfig/core/repository/mongo/codehost.go index d6d719629..b6e7721dc 100644 --- a/pkg/microservice/systemconfig/core/repository/mongo/codehost.go +++ b/pkg/microservice/systemconfig/core/repository/mongo/codehost.go @@ -64,10 +64,8 @@ func (c *CodehostColl) GetCodeHostByID(ID int) (*models.CodeHost, error) { query := bson.M{"id": ID, "deleted_at": 0} err := c.Collection.FindOne(context.TODO(), query).Decode(codehost) if err != nil { - log.Error("repository GetCodeHostByID err : %v", err) - return nil, err + return nil, nil } - return codehost, nil } diff --git a/pkg/microservice/systemconfig/core/repository/mongo/email.go b/pkg/microservice/systemconfig/core/repository/mongo/email.go index 5b3b47030..0eeb7aeaf 100644 --- a/pkg/microservice/systemconfig/core/repository/mongo/email.go +++ b/pkg/microservice/systemconfig/core/repository/mongo/email.go @@ -61,8 +61,7 @@ func (c *EmailHostColl) Find() (*models.EmailHost, error) { err := c.Collection.FindOne(ctx, query).Decode(emailHost) if err != nil { - log.Errorf("repository GetEmailHost err : %v", err) - return nil, err + return nil, nil } return emailHost, nil } -- Gitee From 0004e42287edf0de4beca027ab2f7aeb696bff99 Mon Sep 17 00:00:00 2001 From: mouuii Date: Thu, 4 Nov 2021 17:13:37 +0800 Subject: [PATCH 227/405] json Signed-off-by: mouuii --- pkg/microservice/systemconfig/core/repository/mongo/email.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pkg/microservice/systemconfig/core/repository/mongo/email.go b/pkg/microservice/systemconfig/core/repository/mongo/email.go index 0eeb7aeaf..a2de89a71 100644 --- a/pkg/microservice/systemconfig/core/repository/mongo/email.go +++ b/pkg/microservice/systemconfig/core/repository/mongo/email.go @@ -124,8 +124,7 @@ func (c *EmailServiceColl) GetEmailService() (*models.EmailService, error) { iEmailService := &models.EmailService{} err := c.Collection.FindOne(context.TODO(), query).Decode(iEmailService) if err != nil { - log.Error("repository GetEmailService err : %v", err) - return nil, err + return nil, nil } return iEmailService, nil } -- Gitee From 9e586be77acefbeb6dfe4a6605f45defcaea2995 Mon Sep 17 00:00:00 2001 From: mouuii Date: Thu, 4 Nov 2021 17:44:30 +0800 Subject: [PATCH 228/405] json Signed-off-by: mouuii --- .../systemconfig/core/handler/jira.go | 2 +- .../core/repository/models/codehost.go | 32 +++++++++---------- .../core/repository/mongo/codehost.go | 4 +-- .../systemconfig/core/service/jira.go | 2 +- 4 files changed, 20 insertions(+), 20 deletions(-) diff --git a/pkg/microservice/systemconfig/core/handler/jira.go b/pkg/microservice/systemconfig/core/handler/jira.go index 7354e4f4f..e249fa83a 100644 --- a/pkg/microservice/systemconfig/core/handler/jira.go +++ b/pkg/microservice/systemconfig/core/handler/jira.go @@ -11,7 +11,7 @@ import ( func DeleteJira(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - ctx.Err = service.DeleteEmailService(ctx.Logger) + ctx.Err = service.DeleteJira(ctx.Logger) } func GetJira(c *gin.Context) { diff --git a/pkg/microservice/systemconfig/core/repository/models/codehost.go b/pkg/microservice/systemconfig/core/repository/models/codehost.go index fd4e10c5e..2de3e8230 100644 --- a/pkg/microservice/systemconfig/core/repository/models/codehost.go +++ b/pkg/microservice/systemconfig/core/repository/models/codehost.go @@ -1,22 +1,22 @@ package models type CodeHost struct { - ID int `json:"id"` - Name string `json:"name"` - Type string `json:"type"` - Address string `json:"address"` - IsReady bool `json:"ready"` - AccessToken string `json:"accessToken"` - RefreshToken string `json:"refreshToken"` - Namespace string `json:"namespace"` - OrganizationID int `json:"orgId"` - ApplicationId string `json:"applicationId"` - Region string `json:"region,omitempty"` - Username string `json:"username,omitempty"` - Password string `json:"password,omitempty"` - ClientSecret string `json:"clientSecret"` - CreatedAt int64 `json:"created_at"` - UpdatedAt int64 `json:"updated_at"` + ID int `bson:"id"json:"id"` + Name string `bson:"name"json:"name"` + Type string `bson:"type"json:"type"` + Address string `bson:"address"json:"address"` + IsReady bool `bson:"is_ready"json:"ready"` + AccessToken string `bson:"access_token"json:"accessToken"` + RefreshToken string `bson:"refresh_token"json:"refreshToken"` + Namespace string `bson:"namespace"json:"namespace"` + OrganizationID int `bson:"organization_id"json:"orgId"` + ApplicationId string `bson:"application_id"json:"applicationId"` + Region string `bson:"region"json:"region,omitempty"` + Username string `bson:"username"json:"username,omitempty"` + Password string `bson:"password"json:"password,omitempty"` + ClientSecret string `bson:"client_secret"json:"clientSecret"` + CreatedAt int64 `bson:"created_at"json:"created_at"` + UpdatedAt int64 `bson:"updated_at"json:"updated_at"` } func (CodeHost) TableName() string { diff --git a/pkg/microservice/systemconfig/core/repository/mongo/codehost.go b/pkg/microservice/systemconfig/core/repository/mongo/codehost.go index b6e7721dc..a493b32cd 100644 --- a/pkg/microservice/systemconfig/core/repository/mongo/codehost.go +++ b/pkg/microservice/systemconfig/core/repository/mongo/codehost.go @@ -44,8 +44,8 @@ func (c *CodehostColl) AddCodeHost(iCodeHost *models.CodeHost) (*models.CodeHost return iCodeHost, nil } -func (c *CodehostColl) DeleteCodeHostByID(ID int) error { - query := bson.M{"id": ID, "deleted_at": 0} +func (c *CodehostColl) DeleteCodeHost() error { + query := bson.M{"deleted_at": 0} change := bson.M{"$set": bson.M{ "deleted_at": time.Now().Unix(), }} diff --git a/pkg/microservice/systemconfig/core/service/jira.go b/pkg/microservice/systemconfig/core/service/jira.go index b84a9aa85..9d3e2e11b 100644 --- a/pkg/microservice/systemconfig/core/service/jira.go +++ b/pkg/microservice/systemconfig/core/service/jira.go @@ -20,5 +20,5 @@ func UpdateJira(jira *models.Jira, _ *zap.SugaredLogger) (*models.Jira, error) { } func DeleteJira(_ *zap.SugaredLogger) error { - return mongo.NewEmailServiceColl().DeleteEmailService() + return mongo.NewJiraColl().DeleteJira() } -- Gitee From 07da8483c04bbbbdd7dd6ad14abcaab2086e89f4 Mon Sep 17 00:00:00 2001 From: mouuii Date: Thu, 4 Nov 2021 17:48:00 +0800 Subject: [PATCH 229/405] json Signed-off-by: mouuii --- pkg/microservice/systemconfig/core/repository/mongo/jira.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pkg/microservice/systemconfig/core/repository/mongo/jira.go b/pkg/microservice/systemconfig/core/repository/mongo/jira.go index cf25ccfa0..034d1e377 100644 --- a/pkg/microservice/systemconfig/core/repository/mongo/jira.go +++ b/pkg/microservice/systemconfig/core/repository/mongo/jira.go @@ -82,8 +82,7 @@ func (c *JiraColl) GetJira() (*models.Jira, error) { err := c.Collection.FindOne(context.TODO(), query).Decode(jira) if err != nil { - log.Error("repository GetJira err : %v", err) - return nil, err + return nil, nil } return jira, nil } -- Gitee From a26e9add48944bc8d26537212be432661c1206b9 Mon Sep 17 00:00:00 2001 From: mouuii Date: Thu, 4 Nov 2021 17:51:31 +0800 Subject: [PATCH 230/405] json Signed-off-by: mouuii --- pkg/microservice/systemconfig/core/handler/codehost.go | 6 ++++++ pkg/microservice/systemconfig/core/service/codehost.go | 4 ++++ 2 files changed, 10 insertions(+) diff --git a/pkg/microservice/systemconfig/core/handler/codehost.go b/pkg/microservice/systemconfig/core/handler/codehost.go index 564f97e01..0bd2bf5ba 100644 --- a/pkg/microservice/systemconfig/core/handler/codehost.go +++ b/pkg/microservice/systemconfig/core/handler/codehost.go @@ -18,3 +18,9 @@ func CreateCodehost(c *gin.Context) { } ctx.Resp, ctx.Err = service.CreateCodehost(rep, ctx.Logger) } + +func FindCodehost(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + ctx.Resp, ctx.Err = service.FindCodehost(ctx.Logger) +} diff --git a/pkg/microservice/systemconfig/core/service/codehost.go b/pkg/microservice/systemconfig/core/service/codehost.go index e0b800fe3..b5f2febee 100644 --- a/pkg/microservice/systemconfig/core/service/codehost.go +++ b/pkg/microservice/systemconfig/core/service/codehost.go @@ -10,3 +10,7 @@ import ( func CreateCodehost(codehost *models.CodeHost, _ *zap.SugaredLogger) (*models.CodeHost, error) { return mongo.NewCodehostColl().AddCodeHost(codehost) } + +func FindCodehost(_ *zap.SugaredLogger) ([]*models.CodeHost, error) { + return mongo.NewCodehostColl().FindCodeHosts() +} -- Gitee From bf60c3216849c7cb6d944b3ad80ee6ab0e2c3dc7 Mon Sep 17 00:00:00 2001 From: mouuii Date: Thu, 4 Nov 2021 18:32:14 +0800 Subject: [PATCH 231/405] json Signed-off-by: mouuii --- pkg/microservice/systemconfig/core/handler/codehost.go | 2 +- pkg/microservice/systemconfig/core/handler/router.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/microservice/systemconfig/core/handler/codehost.go b/pkg/microservice/systemconfig/core/handler/codehost.go index 0bd2bf5ba..e6b2dd1d9 100644 --- a/pkg/microservice/systemconfig/core/handler/codehost.go +++ b/pkg/microservice/systemconfig/core/handler/codehost.go @@ -19,7 +19,7 @@ func CreateCodehost(c *gin.Context) { ctx.Resp, ctx.Err = service.CreateCodehost(rep, ctx.Logger) } -func FindCodehost(c *gin.Context) { +func ListCodehost(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() ctx.Resp, ctx.Err = service.FindCodehost(ctx.Logger) diff --git a/pkg/microservice/systemconfig/core/handler/router.go b/pkg/microservice/systemconfig/core/handler/router.go index 33f3273cb..c32b1eaab 100644 --- a/pkg/microservice/systemconfig/core/handler/router.go +++ b/pkg/microservice/systemconfig/core/handler/router.go @@ -57,6 +57,6 @@ func (*Router) Inject(router *gin.RouterGroup) { } codehost := router.Group("codehost") { - codehost.POST("", CreateCodehost) + codehost.POST("", ListCodehost) } } -- Gitee From 56bad1e7ea01819c336ccae99551e28f95e03e17 Mon Sep 17 00:00:00 2001 From: mouuii Date: Thu, 4 Nov 2021 18:50:35 +0800 Subject: [PATCH 232/405] json Signed-off-by: mouuii --- .../core/repository/models/codehost.go | 2 +- .../core/repository/models/email.go | 16 ++++++++-------- .../core/repository/models/jira.go | 18 +++++++++--------- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/pkg/microservice/systemconfig/core/repository/models/codehost.go b/pkg/microservice/systemconfig/core/repository/models/codehost.go index 2de3e8230..b05712839 100644 --- a/pkg/microservice/systemconfig/core/repository/models/codehost.go +++ b/pkg/microservice/systemconfig/core/repository/models/codehost.go @@ -1,7 +1,7 @@ package models type CodeHost struct { - ID int `bson:"id"json:"id"` + ID int `bson:"id"` Name string `bson:"name"json:"name"` Type string `bson:"type"json:"type"` Address string `bson:"address"json:"address"` diff --git a/pkg/microservice/systemconfig/core/repository/models/email.go b/pkg/microservice/systemconfig/core/repository/models/email.go index 7682584a4..78a643fe3 100644 --- a/pkg/microservice/systemconfig/core/repository/models/email.go +++ b/pkg/microservice/systemconfig/core/repository/models/email.go @@ -5,14 +5,14 @@ import ( ) type EmailHost struct { - ID int `json:"id" bson:"id"` - Name string `json:"name" bson:"name"` - Port int `json:"port" bson:"port"` - Username string `json:"username" bson:"username"` - Password string `json:"password" bson:"password"` - IsTLS bool `json:"isTLS" bson:"is_tls"` - CreatedAt int64 `json:"created_at" bson:"created_at"` - UpdatedAt int64 `json:"updated_at" bson:"updated_at"` + ID int `bson:"id" json:"id"` + Name string `bson:"name" json:"name"` + Port int `bson:"port" json:"port"` + Username string `bson:"username" json:"username"` + Password string `bson:"password" json:"password"` + IsTLS bool `bson:"is_tls" json:"isTLS"` + CreatedAt int64 `bson:"created_at" json:"created_at"` + UpdatedAt int64 `bson:"updated_at" json:"updated_at"` } func (EmailHost) TableName() string { diff --git a/pkg/microservice/systemconfig/core/repository/models/jira.go b/pkg/microservice/systemconfig/core/repository/models/jira.go index 9f7a2c08a..20a1ee695 100644 --- a/pkg/microservice/systemconfig/core/repository/models/jira.go +++ b/pkg/microservice/systemconfig/core/repository/models/jira.go @@ -5,15 +5,15 @@ import ( ) type Jira struct { - ObjectID bson.ObjectId `json:"-" bson:"_id,omitempty"` - ID int64 `json:"id" bson:"id"` - Host string `json:"host" bson:"host"` - User string `json:"user" bson:"user"` - AccessToken string `json:"access_token" bson:"access_token"` - OrganizationID int `json:"organization_id" bson:"organization_id"` - CreatedAt int64 `json:"created_at" bson:"created_at"` - UpdatedAt int64 `json:"updated_at" bson:"updated_at"` - DeletedAt int64 `json:"deleted_at" bson:"deleted_at"` + ObjectID bson.ObjectId `bson:"_id,omitempty"json:"-" ` + ID int64 `bson:"id"json:"id" ` + Host string `bson:"host"json:"host" ` + User string `bson:"user"json:"user" ` + AccessToken string `bson:"access_token" json:"access_token"` + OrganizationID int `bson:"organization_id"json:"organization_id"` + CreatedAt int64 `bson:"created_at"json:"created_at"` + UpdatedAt int64 `bson:"updated_at" json:"updated_at"` + DeletedAt int64 `bson:"deleted_at"json:"deleted_at"` } func (Jira) TableName() string { -- Gitee From 4608a8c21867369a8f82af8a98ef27fa5cf5db11 Mon Sep 17 00:00:00 2001 From: mouuii Date: Thu, 4 Nov 2021 18:51:36 +0800 Subject: [PATCH 233/405] json Signed-off-by: mouuii --- .../core/repository/models/email.go | 19 +++++++++---------- .../core/repository/models/jira.go | 17 ++++++++--------- 2 files changed, 17 insertions(+), 19 deletions(-) diff --git a/pkg/microservice/systemconfig/core/repository/models/email.go b/pkg/microservice/systemconfig/core/repository/models/email.go index 78a643fe3..938876867 100644 --- a/pkg/microservice/systemconfig/core/repository/models/email.go +++ b/pkg/microservice/systemconfig/core/repository/models/email.go @@ -20,16 +20,15 @@ func (EmailHost) TableName() string { } type EmailService struct { - ObjectID bson.ObjectId `bson:"_id,omitempty"` - ID int `json:"id" bson:"id"` - Name string `json:"name" bson:"name"` - Address string `json:"address" bson:"address"` - DisplayName string `json:"display_name" bson:"display_name"` - Theme string `json:"theme" bson:"theme"` - OrganizationID int `json:"organization_id" bson:"organization_id"` - CreatedAt int64 `json:"created_at" bson:"created_at"` - UpdatedAt int64 `json:"updated_at" bson:"updated_at"` - DeletedAt int64 `json:"deleted_at" bson:"deleted_at"` + ObjectID bson.ObjectId `bson:"_id,omitempty"` + ID int `json:"id" bson:"id"` + Name string `json:"name" bson:"name"` + Address string `json:"address" bson:"address"` + DisplayName string `json:"display_name" bson:"display_name"` + Theme string `json:"theme" bson:"theme"` + CreatedAt int64 `json:"created_at" bson:"created_at"` + UpdatedAt int64 `json:"updated_at" bson:"updated_at"` + DeletedAt int64 `json:"deleted_at" bson:"deleted_at"` } func (EmailService) TableName() string { diff --git a/pkg/microservice/systemconfig/core/repository/models/jira.go b/pkg/microservice/systemconfig/core/repository/models/jira.go index 20a1ee695..5c4b7c35e 100644 --- a/pkg/microservice/systemconfig/core/repository/models/jira.go +++ b/pkg/microservice/systemconfig/core/repository/models/jira.go @@ -5,15 +5,14 @@ import ( ) type Jira struct { - ObjectID bson.ObjectId `bson:"_id,omitempty"json:"-" ` - ID int64 `bson:"id"json:"id" ` - Host string `bson:"host"json:"host" ` - User string `bson:"user"json:"user" ` - AccessToken string `bson:"access_token" json:"access_token"` - OrganizationID int `bson:"organization_id"json:"organization_id"` - CreatedAt int64 `bson:"created_at"json:"created_at"` - UpdatedAt int64 `bson:"updated_at" json:"updated_at"` - DeletedAt int64 `bson:"deleted_at"json:"deleted_at"` + ObjectID bson.ObjectId `bson:"_id,omitempty"json:"-" ` + ID int64 `bson:"id"json:"id" ` + Host string `bson:"host"json:"host" ` + User string `bson:"user"json:"user" ` + AccessToken string `bson:"access_token" json:"access_token"` + CreatedAt int64 `bson:"created_at"json:"created_at"` + UpdatedAt int64 `bson:"updated_at" json:"updated_at"` + DeletedAt int64 `bson:"deleted_at"json:"deleted_at"` } func (Jira) TableName() string { -- Gitee From 3100ef43d1c758c6c4ea550a7725f6bb7437fefa Mon Sep 17 00:00:00 2001 From: panxunying <641770806@qq.com> Date: Thu, 4 Nov 2021 18:55:14 +0800 Subject: [PATCH 234/405] Init db (#535) * add initDBAndTables Signed-off-by: panxunying <641770806@qq.com> * optimize Signed-off-by: panxunying <641770806@qq.com> --- go.mod | 1 + pkg/microservice/user/core/service.go | 27 ++++++++++++++++++ .../user/core/service/init/mysql.sql | 28 +++++++++++++++++++ pkg/tool/gorm/client.go | 1 - 4 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 pkg/microservice/user/core/service/init/mysql.sql diff --git a/go.mod b/go.mod index 70860f4ee..2752cdd36 100644 --- a/go.mod +++ b/go.mod @@ -27,6 +27,7 @@ require ( github.com/gin-gonic/gin v1.7.2 github.com/go-ldap/ldap/v3 v3.3.0 github.com/go-resty/resty/v2 v2.6.0 + github.com/go-sql-driver/mysql v1.6.0 github.com/gofrs/uuid v4.0.0+incompatible // indirect github.com/golang-jwt/jwt v3.2.2+incompatible github.com/google/go-github/v35 v35.3.0 diff --git a/pkg/microservice/user/core/service.go b/pkg/microservice/user/core/service.go index 8a91a7f27..29d1af0c4 100644 --- a/pkg/microservice/user/core/service.go +++ b/pkg/microservice/user/core/service.go @@ -18,7 +18,11 @@ package core import ( "context" + "database/sql" + _ "embed" + "fmt" + _ "github.com/go-sql-driver/mysql" "gorm.io/gorm" "github.com/koderover/zadig/pkg/config" @@ -30,6 +34,28 @@ import ( var DB *gorm.DB +//go:embed service/init/mysql.sql +var mysql []byte + +func initDBAndTables() { + if len(mysql) == 0 { + return + } + db, err := sql.Open("mysql", fmt.Sprintf( + "%s:%s@tcp(%s)/?charset=utf8&multiStatements=true", + config.MysqlUser(), config.MysqlPassword(), config.MysqlHost(), + )) + if err != nil { + log.Panic(err) + } + defer db.Close() + _, err = db.Exec(string(mysql)) + + if err != nil { + log.Panic(err) + } +} + func Start(_ context.Context) { log.Init(&log.Config{ Level: config.LogLevel(), @@ -43,6 +69,7 @@ func Start(_ context.Context) { } func initDatabase() { + initDBAndTables() err := gormtool.Open(config.MysqlUser(), config.MysqlPassword(), config.MysqlHost(), diff --git a/pkg/microservice/user/core/service/init/mysql.sql b/pkg/microservice/user/core/service/init/mysql.sql new file mode 100644 index 000000000..bb77d2f97 --- /dev/null +++ b/pkg/microservice/user/core/service/init/mysql.sql @@ -0,0 +1,28 @@ +CREATE DATABASE IF NOT EXISTS user; +use user; +CREATE TABLE IF NOT EXISTS `user_login`( + `id` bigint(20) NOT NULL AUTO_INCREMENT, + `uid` varchar(64) NOT NULL DEFAULT '0' COMMENT '用户id', + `login_id` varchar(64) NOT NULL DEFAULT '0' COMMENT '用户登录id,如账号名', + `login_type` int(4) unsigned NOT NULL DEFAULT '0' COMMENT '登录类型,0.账号名', + `password` varchar(64) DEFAULT '' COMMENT '密码', + `last_login_time` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '最后登陆时间', + `created_at` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '创建时间', + `updated_at` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '更新时间', + UNIQUE KEY `login` (`uid`,`login_id`,`login_type`), + PRIMARY KEY (`id`), + KEY `idx_uid` (`uid`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 59 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '账号登陆表' ROW_FORMAT = Compact; + +CREATE TABLE IF NOT EXISTS `user`( + `uid` varchar(64) NOT NULL COMMENT '用户ID', + `account` varchar(32) NOT NULL DEFAULT '' COMMENT '用户账号', + `name` varchar(32) NOT NULL DEFAULT '' COMMENT '用户名', + `identity_type` varchar(32) NOT NULL DEFAULT 'unknown' COMMENT '用户来源', + `phone` varchar(16) NOT NULL DEFAULT '' COMMENT '手机号码', + `email` varchar(100) NOT NULL DEFAULT '' COMMENT '邮箱', + `created_at` int(11) unsigned NOT NULL COMMENT '创建时间', + `updated_at` int(11) unsigned NOT NULL COMMENT '修改时间', + UNIQUE KEY `account` (`account`,`identity_type`), + PRIMARY KEY (`uid`) +) ENGINE = InnoDB AUTO_INCREMENT = 59 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '用户信息表' ROW_FORMAT = Compact; \ No newline at end of file diff --git a/pkg/tool/gorm/client.go b/pkg/tool/gorm/client.go index aea8c5b7b..c5e65fb10 100644 --- a/pkg/tool/gorm/client.go +++ b/pkg/tool/gorm/client.go @@ -41,6 +41,5 @@ func openDB(username, password, host, db string) (*gorm.DB, error) { "%s:%s@tcp(%s)/%s?charset=utf8mb4&parseTime=True&loc=Local", username, password, host, db, ) - return gorm.Open(mysql.Open(dsn), &gorm.Config{}) } -- Gitee From 4b691a9f500b6e5fa6415059574eed7b23d32389 Mon Sep 17 00:00:00 2001 From: mouuii Date: Thu, 4 Nov 2021 19:03:36 +0800 Subject: [PATCH 235/405] json Signed-off-by: mouuii --- pkg/microservice/systemconfig/core/repository/models/email.go | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/microservice/systemconfig/core/repository/models/email.go b/pkg/microservice/systemconfig/core/repository/models/email.go index 938876867..8712bd0af 100644 --- a/pkg/microservice/systemconfig/core/repository/models/email.go +++ b/pkg/microservice/systemconfig/core/repository/models/email.go @@ -12,6 +12,7 @@ type EmailHost struct { Password string `bson:"password" json:"password"` IsTLS bool `bson:"is_tls" json:"isTLS"` CreatedAt int64 `bson:"created_at" json:"created_at"` + DeletedAt int64 `bson:"deleted_at" json:"deleted_at"` UpdatedAt int64 `bson:"updated_at" json:"updated_at"` } -- Gitee From 06151050735daa2a9567b4095988a38008aae7fb Mon Sep 17 00:00:00 2001 From: mouuii Date: Thu, 4 Nov 2021 19:06:10 +0800 Subject: [PATCH 236/405] json Signed-off-by: mouuii --- pkg/microservice/systemconfig/core/repository/mongo/email.go | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/microservice/systemconfig/core/repository/mongo/email.go b/pkg/microservice/systemconfig/core/repository/mongo/email.go index a2de89a71..02dbab5d0 100644 --- a/pkg/microservice/systemconfig/core/repository/mongo/email.go +++ b/pkg/microservice/systemconfig/core/repository/mongo/email.go @@ -63,6 +63,7 @@ func (c *EmailHostColl) Find() (*models.EmailHost, error) { if err != nil { return nil, nil } + emailHost.Password = "***" return emailHost, nil } -- Gitee From 086828414ebf90ac628662eaa9e8ba984916011f Mon Sep 17 00:00:00 2001 From: mouuii Date: Thu, 4 Nov 2021 19:29:46 +0800 Subject: [PATCH 237/405] json Signed-off-by: mouuii --- .../core/{ => email}/handler/emails.go | 18 ++++++------ .../core/{ => email}/service/email.go | 0 .../systemconfig/core/handler/router.go | 29 ++++++++++--------- .../core/{ => jira}/handler/jira.go | 10 +++---- .../core/{ => jira}/service/jira.go | 0 .../core/repository/models/email.go | 21 +++++--------- .../core/repository/models/jira.go | 19 +++++------- .../core/repository/mongo/codehost.go | 3 +- .../core/repository/mongo/email.go | 2 +- .../core/repository/mongo/jira.go | 3 +- 10 files changed, 48 insertions(+), 57 deletions(-) rename pkg/microservice/systemconfig/core/{ => email}/handler/emails.go (75%) rename pkg/microservice/systemconfig/core/{ => email}/service/email.go (100%) rename pkg/microservice/systemconfig/core/{ => jira}/handler/jira.go (75%) rename pkg/microservice/systemconfig/core/{ => jira}/service/jira.go (100%) diff --git a/pkg/microservice/systemconfig/core/handler/emails.go b/pkg/microservice/systemconfig/core/email/handler/emails.go similarity index 75% rename from pkg/microservice/systemconfig/core/handler/emails.go rename to pkg/microservice/systemconfig/core/email/handler/emails.go index a1fcbea11..6aa77c958 100644 --- a/pkg/microservice/systemconfig/core/handler/emails.go +++ b/pkg/microservice/systemconfig/core/email/handler/emails.go @@ -3,15 +3,15 @@ package handler import ( "github.com/gin-gonic/gin" + service2 "github.com/koderover/zadig/pkg/microservice/systemconfig/core/email/service" "github.com/koderover/zadig/pkg/microservice/systemconfig/core/repository/models" - "github.com/koderover/zadig/pkg/microservice/systemconfig/core/service" internalhandler "github.com/koderover/zadig/pkg/shared/handler" ) func GetEmailHost(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - ctx.Resp, ctx.Err = service.GetEmailHost(ctx.Logger) + ctx.Resp, ctx.Err = service2.GetEmailHost(ctx.Logger) } func CreateEmailHost(c *gin.Context) { @@ -22,7 +22,7 @@ func CreateEmailHost(c *gin.Context) { ctx.Err = err return } - ctx.Resp, ctx.Err = service.CreateEmailHost(req, ctx.Logger) + ctx.Resp, ctx.Err = service2.CreateEmailHost(req, ctx.Logger) } func UpdateEmailHost(c *gin.Context) { @@ -33,13 +33,13 @@ func UpdateEmailHost(c *gin.Context) { ctx.Err = err return } - ctx.Resp, ctx.Err = service.UpdateEmailHost(req, ctx.Logger) + ctx.Resp, ctx.Err = service2.UpdateEmailHost(req, ctx.Logger) } func DeleteEmailHost(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - ctx.Err = service.DeleteEmailHost(ctx.Logger) + ctx.Err = service2.DeleteEmailHost(ctx.Logger) } //// @@ -47,7 +47,7 @@ func DeleteEmailHost(c *gin.Context) { func GetEmailService(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - ctx.Resp, ctx.Err = service.GetEmailService(ctx.Logger) + ctx.Resp, ctx.Err = service2.GetEmailService(ctx.Logger) } func CreateEmailService(c *gin.Context) { @@ -58,7 +58,7 @@ func CreateEmailService(c *gin.Context) { ctx.Err = err return } - ctx.Resp, ctx.Err = service.CreateEmailService(req, ctx.Logger) + ctx.Resp, ctx.Err = service2.CreateEmailService(req, ctx.Logger) } func UpdateEmailService(c *gin.Context) { @@ -69,11 +69,11 @@ func UpdateEmailService(c *gin.Context) { ctx.Err = err return } - ctx.Resp, ctx.Err = service.UpdateEmailService(req, ctx.Logger) + ctx.Resp, ctx.Err = service2.UpdateEmailService(req, ctx.Logger) } func DeleteEmailService(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - ctx.Err = service.DeleteEmailService(ctx.Logger) + ctx.Err = service2.DeleteEmailService(ctx.Logger) } diff --git a/pkg/microservice/systemconfig/core/service/email.go b/pkg/microservice/systemconfig/core/email/service/email.go similarity index 100% rename from pkg/microservice/systemconfig/core/service/email.go rename to pkg/microservice/systemconfig/core/email/service/email.go diff --git a/pkg/microservice/systemconfig/core/handler/router.go b/pkg/microservice/systemconfig/core/handler/router.go index c32b1eaab..b0caf1fe0 100644 --- a/pkg/microservice/systemconfig/core/handler/router.go +++ b/pkg/microservice/systemconfig/core/handler/router.go @@ -18,6 +18,9 @@ package handler import ( "github.com/gin-gonic/gin" + + "github.com/koderover/zadig/pkg/microservice/systemconfig/core/email/handler" + handler2 "github.com/koderover/zadig/pkg/microservice/systemconfig/core/jira/handler" ) type Router struct{} @@ -37,23 +40,23 @@ func (*Router) Inject(router *gin.RouterGroup) { } emails := router.Group("emails") { - emails.GET("/host", GetEmailHost) - emails.POST("/host", CreateEmailHost) - emails.PATCH("/host", UpdateEmailHost) - emails.DELETE("/host", DeleteEmailHost) - - emails.GET("/service", GetEmailService) - emails.POST("/service", CreateEmailService) - emails.PATCH("/service", UpdateEmailService) - emails.DELETE("/service", DeleteEmailService) + emails.GET("/host", handler.GetEmailHost) + emails.POST("/host", handler.CreateEmailHost) + emails.PATCH("/host", handler.UpdateEmailHost) + emails.DELETE("/host", handler.DeleteEmailHost) + + emails.GET("/service", handler.GetEmailService) + emails.POST("/service", handler.CreateEmailService) + emails.PATCH("/service", handler.UpdateEmailService) + emails.DELETE("/service", handler.DeleteEmailService) } jira := router.Group("jira") { - jira.GET("", GetJira) - jira.POST("", CreateJira) - jira.PATCH("", UpdateJira) - jira.DELETE("", DeleteJira) + jira.GET("", handler2.GetJira) + jira.POST("", handler2.CreateJira) + jira.PATCH("", handler2.UpdateJira) + jira.DELETE("", handler2.DeleteJira) } codehost := router.Group("codehost") { diff --git a/pkg/microservice/systemconfig/core/handler/jira.go b/pkg/microservice/systemconfig/core/jira/handler/jira.go similarity index 75% rename from pkg/microservice/systemconfig/core/handler/jira.go rename to pkg/microservice/systemconfig/core/jira/handler/jira.go index e249fa83a..7a0074d40 100644 --- a/pkg/microservice/systemconfig/core/handler/jira.go +++ b/pkg/microservice/systemconfig/core/jira/handler/jira.go @@ -3,21 +3,21 @@ package handler import ( "github.com/gin-gonic/gin" + service2 "github.com/koderover/zadig/pkg/microservice/systemconfig/core/jira/service" "github.com/koderover/zadig/pkg/microservice/systemconfig/core/repository/models" - "github.com/koderover/zadig/pkg/microservice/systemconfig/core/service" internalhandler "github.com/koderover/zadig/pkg/shared/handler" ) func DeleteJira(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - ctx.Err = service.DeleteJira(ctx.Logger) + ctx.Err = service2.DeleteJira(ctx.Logger) } func GetJira(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - ctx.Resp, ctx.Err = service.GeJira(ctx.Logger) + ctx.Resp, ctx.Err = service2.GeJira(ctx.Logger) } func CreateJira(c *gin.Context) { @@ -28,7 +28,7 @@ func CreateJira(c *gin.Context) { ctx.Err = err return } - ctx.Resp, ctx.Err = service.CreateJira(req, ctx.Logger) + ctx.Resp, ctx.Err = service2.CreateJira(req, ctx.Logger) } func UpdateJira(c *gin.Context) { @@ -39,5 +39,5 @@ func UpdateJira(c *gin.Context) { ctx.Err = err return } - ctx.Resp, ctx.Err = service.UpdateJira(req, ctx.Logger) + ctx.Resp, ctx.Err = service2.UpdateJira(req, ctx.Logger) } diff --git a/pkg/microservice/systemconfig/core/service/jira.go b/pkg/microservice/systemconfig/core/jira/service/jira.go similarity index 100% rename from pkg/microservice/systemconfig/core/service/jira.go rename to pkg/microservice/systemconfig/core/jira/service/jira.go diff --git a/pkg/microservice/systemconfig/core/repository/models/email.go b/pkg/microservice/systemconfig/core/repository/models/email.go index 8712bd0af..69f7a93ab 100644 --- a/pkg/microservice/systemconfig/core/repository/models/email.go +++ b/pkg/microservice/systemconfig/core/repository/models/email.go @@ -1,9 +1,5 @@ package models -import ( - "github.com/globalsign/mgo/bson" -) - type EmailHost struct { ID int `bson:"id" json:"id"` Name string `bson:"name" json:"name"` @@ -21,15 +17,14 @@ func (EmailHost) TableName() string { } type EmailService struct { - ObjectID bson.ObjectId `bson:"_id,omitempty"` - ID int `json:"id" bson:"id"` - Name string `json:"name" bson:"name"` - Address string `json:"address" bson:"address"` - DisplayName string `json:"display_name" bson:"display_name"` - Theme string `json:"theme" bson:"theme"` - CreatedAt int64 `json:"created_at" bson:"created_at"` - UpdatedAt int64 `json:"updated_at" bson:"updated_at"` - DeletedAt int64 `json:"deleted_at" bson:"deleted_at"` + ID int `json:"id" bson:"id"` + Name string `json:"name" bson:"name"` + Address string `json:"address" bson:"address"` + DisplayName string `json:"display_name" bson:"display_name"` + Theme string `json:"theme" bson:"theme"` + CreatedAt int64 `json:"created_at" bson:"created_at"` + UpdatedAt int64 `json:"updated_at" bson:"updated_at"` + DeletedAt int64 `json:"deleted_at" bson:"deleted_at"` } func (EmailService) TableName() string { diff --git a/pkg/microservice/systemconfig/core/repository/models/jira.go b/pkg/microservice/systemconfig/core/repository/models/jira.go index 5c4b7c35e..02499db53 100644 --- a/pkg/microservice/systemconfig/core/repository/models/jira.go +++ b/pkg/microservice/systemconfig/core/repository/models/jira.go @@ -1,18 +1,13 @@ package models -import ( - "github.com/globalsign/mgo/bson" -) - type Jira struct { - ObjectID bson.ObjectId `bson:"_id,omitempty"json:"-" ` - ID int64 `bson:"id"json:"id" ` - Host string `bson:"host"json:"host" ` - User string `bson:"user"json:"user" ` - AccessToken string `bson:"access_token" json:"access_token"` - CreatedAt int64 `bson:"created_at"json:"created_at"` - UpdatedAt int64 `bson:"updated_at" json:"updated_at"` - DeletedAt int64 `bson:"deleted_at"json:"deleted_at"` + ID int64 `bson:"id"json:"id"` + Host string `bson:"host"json:"host"` + User string `bson:"user"json:"user"` + AccessToken string `bson:"access_token" json:"access_token"` + CreatedAt int64 `bson:"created_at"json:"created_at"` + UpdatedAt int64 `bson:"updated_at" json:"updated_at"` + DeletedAt int64 `bson:"deleted_at"json:"deleted_at"` } func (Jira) TableName() string { diff --git a/pkg/microservice/systemconfig/core/repository/mongo/codehost.go b/pkg/microservice/systemconfig/core/repository/mongo/codehost.go index a493b32cd..f589f7477 100644 --- a/pkg/microservice/systemconfig/core/repository/mongo/codehost.go +++ b/pkg/microservice/systemconfig/core/repository/mongo/codehost.go @@ -4,10 +4,9 @@ import ( "context" "time" + "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo" - "github.com/globalsign/mgo/bson" - "github.com/koderover/zadig/pkg/microservice/systemconfig/config" "github.com/koderover/zadig/pkg/microservice/systemconfig/core/repository/models" "github.com/koderover/zadig/pkg/tool/log" diff --git a/pkg/microservice/systemconfig/core/repository/mongo/email.go b/pkg/microservice/systemconfig/core/repository/mongo/email.go index 02dbab5d0..e9a57c4d2 100644 --- a/pkg/microservice/systemconfig/core/repository/mongo/email.go +++ b/pkg/microservice/systemconfig/core/repository/mongo/email.go @@ -4,7 +4,7 @@ import ( "context" "time" - "github.com/globalsign/mgo/bson" + "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo" "github.com/koderover/zadig/pkg/microservice/systemconfig/config" diff --git a/pkg/microservice/systemconfig/core/repository/mongo/jira.go b/pkg/microservice/systemconfig/core/repository/mongo/jira.go index 034d1e377..ef1ccf4dc 100644 --- a/pkg/microservice/systemconfig/core/repository/mongo/jira.go +++ b/pkg/microservice/systemconfig/core/repository/mongo/jira.go @@ -4,10 +4,9 @@ import ( "context" "time" + "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo" - "github.com/globalsign/mgo/bson" - "github.com/koderover/zadig/pkg/microservice/systemconfig/config" "github.com/koderover/zadig/pkg/microservice/systemconfig/core/repository/models" "github.com/koderover/zadig/pkg/tool/log" -- Gitee From 287cca7f45d2d6f178fad5e02a92ad99cd290b8c Mon Sep 17 00:00:00 2001 From: mouuii Date: Thu, 4 Nov 2021 19:43:39 +0800 Subject: [PATCH 238/405] json Signed-off-by: mouuii --- go.mod | 1 - go.sum | 1 - 2 files changed, 2 deletions(-) diff --git a/go.mod b/go.mod index bd573294d..d17cc71d0 100644 --- a/go.mod +++ b/go.mod @@ -25,7 +25,6 @@ require ( github.com/garyburd/redigo v1.6.2 // indirect github.com/gin-contrib/sse v0.1.0 github.com/gin-gonic/gin v1.7.2 - github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8 // indirect github.com/go-ldap/ldap/v3 v3.3.0 github.com/go-resty/resty/v2 v2.6.0 github.com/gofrs/uuid v4.0.0+incompatible // indirect diff --git a/go.sum b/go.sum index 05dce6a47..e9ff3cff2 100644 --- a/go.sum +++ b/go.sum @@ -550,7 +550,6 @@ github.com/gin-gonic/gin v1.7.2 h1:Tg03T9yM2xa8j6I3Z3oqLaQRSmKvxPd6g/2HJ6zICFA= github.com/gin-gonic/gin v1.7.2/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY= github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= -github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8 h1:DujepqpGd1hyOd7aW59XpK7Qymp8iy83xq74fLr21is= github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= github.com/go-asn1-ber/asn1-ber v1.5.1 h1:pDbRAunXzIUXfx4CB2QJFv5IuPiuoW+sWvr/Us009o8= github.com/go-asn1-ber/asn1-ber v1.5.1/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0= -- Gitee From f2f197a8a6ff7f7b254050a05b0d9c2b57048448 Mon Sep 17 00:00:00 2001 From: Guang Jiong Lou <7991675+27149chen@users.noreply.github.com> Date: Thu, 4 Nov 2021 20:37:25 +0800 Subject: [PATCH 239/405] add init dockerfile (#537) Signed-off-by: lou --- Makefile | 2 +- docker/service/init.Dockerfile | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 docker/service/init.Dockerfile diff --git a/Makefile b/Makefile index 0a9a6ec6d..08428072a 100644 --- a/Makefile +++ b/Makefile @@ -4,7 +4,7 @@ IMAGE_REPOSITORY = ccr.ccs.tencentyun.com/koderover-rc VERSION ?= $(shell date +'%Y%m%d%H%M%S') -TARGETS = aslan cron hub-agent hub-server jenkins-plugin podexec predator-plugin resource-server ua warpdrive policy user picket config +TARGETS = aslan cron hub-agent hub-server jenkins-plugin podexec predator-plugin resource-server ua warpdrive policy user picket config init REAPER_OS= focal xenial bionic ALL_IMAGES=$(TARGETS:=.image) diff --git a/docker/service/init.Dockerfile b/docker/service/init.Dockerfile new file mode 100644 index 000000000..d8acda07a --- /dev/null +++ b/docker/service/init.Dockerfile @@ -0,0 +1,10 @@ +#golang.Dockerfile + +RUN go build -o /init ./cmd/initconfig/main.go + +#alpine.Dockerfile + +WORKDIR /app +COPY --from=build /init /app/init + +ENTRYPOINT ["/app/init"] -- Gitee From 19d99fdd8369f421dcbe5a489c4f33bcbdece230 Mon Sep 17 00:00:00 2001 From: mouuii Date: Thu, 4 Nov 2021 20:40:46 +0800 Subject: [PATCH 240/405] json Signed-off-by: mouuii --- .../core/{ => codehost}/handler/codehost.go | 0 .../core/{ => codehost}/service/codehost.go | 0 .../email/handler/{emails.go => email.go} | 10 +++---- .../core/email/models/emailhost.go | 1 + .../email.go => email/models/emailservice.go} | 16 ---------- .../core/repository/models/codehost.go | 30 +++++++++---------- .../core/repository/models/jira.go | 12 ++++---- 7 files changed, 27 insertions(+), 42 deletions(-) rename pkg/microservice/systemconfig/core/{ => codehost}/handler/codehost.go (100%) rename pkg/microservice/systemconfig/core/{ => codehost}/service/codehost.go (100%) rename pkg/microservice/systemconfig/core/email/handler/{emails.go => email.go} (90%) create mode 100644 pkg/microservice/systemconfig/core/email/models/emailhost.go rename pkg/microservice/systemconfig/core/{repository/models/email.go => email/models/emailservice.go} (50%) diff --git a/pkg/microservice/systemconfig/core/handler/codehost.go b/pkg/microservice/systemconfig/core/codehost/handler/codehost.go similarity index 100% rename from pkg/microservice/systemconfig/core/handler/codehost.go rename to pkg/microservice/systemconfig/core/codehost/handler/codehost.go diff --git a/pkg/microservice/systemconfig/core/service/codehost.go b/pkg/microservice/systemconfig/core/codehost/service/codehost.go similarity index 100% rename from pkg/microservice/systemconfig/core/service/codehost.go rename to pkg/microservice/systemconfig/core/codehost/service/codehost.go diff --git a/pkg/microservice/systemconfig/core/email/handler/emails.go b/pkg/microservice/systemconfig/core/email/handler/email.go similarity index 90% rename from pkg/microservice/systemconfig/core/email/handler/emails.go rename to pkg/microservice/systemconfig/core/email/handler/email.go index 6aa77c958..0cf74ad9b 100644 --- a/pkg/microservice/systemconfig/core/email/handler/emails.go +++ b/pkg/microservice/systemconfig/core/email/handler/email.go @@ -3,8 +3,8 @@ package handler import ( "github.com/gin-gonic/gin" + models2 "github.com/koderover/zadig/pkg/microservice/systemconfig/core/email/models" service2 "github.com/koderover/zadig/pkg/microservice/systemconfig/core/email/service" - "github.com/koderover/zadig/pkg/microservice/systemconfig/core/repository/models" internalhandler "github.com/koderover/zadig/pkg/shared/handler" ) @@ -17,7 +17,7 @@ func GetEmailHost(c *gin.Context) { func CreateEmailHost(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - req := new(models.EmailHost) + req := new(models2.EmailHost) if err := c.ShouldBindJSON(req); err != nil { ctx.Err = err return @@ -28,7 +28,7 @@ func CreateEmailHost(c *gin.Context) { func UpdateEmailHost(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - req := new(models.EmailHost) + req := new(models2.EmailHost) if err := c.ShouldBindJSON(req); err != nil { ctx.Err = err return @@ -53,7 +53,7 @@ func GetEmailService(c *gin.Context) { func CreateEmailService(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - req := new(models.EmailService) + req := new(models2.EmailService) if err := c.ShouldBindJSON(req); err != nil { ctx.Err = err return @@ -64,7 +64,7 @@ func CreateEmailService(c *gin.Context) { func UpdateEmailService(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - req := new(models.EmailService) + req := new(models2.EmailService) if err := c.ShouldBindJSON(req); err != nil { ctx.Err = err return diff --git a/pkg/microservice/systemconfig/core/email/models/emailhost.go b/pkg/microservice/systemconfig/core/email/models/emailhost.go new file mode 100644 index 000000000..2640e7f93 --- /dev/null +++ b/pkg/microservice/systemconfig/core/email/models/emailhost.go @@ -0,0 +1 @@ +package models diff --git a/pkg/microservice/systemconfig/core/repository/models/email.go b/pkg/microservice/systemconfig/core/email/models/emailservice.go similarity index 50% rename from pkg/microservice/systemconfig/core/repository/models/email.go rename to pkg/microservice/systemconfig/core/email/models/emailservice.go index 69f7a93ab..44e61a39d 100644 --- a/pkg/microservice/systemconfig/core/repository/models/email.go +++ b/pkg/microservice/systemconfig/core/email/models/emailservice.go @@ -1,21 +1,5 @@ package models -type EmailHost struct { - ID int `bson:"id" json:"id"` - Name string `bson:"name" json:"name"` - Port int `bson:"port" json:"port"` - Username string `bson:"username" json:"username"` - Password string `bson:"password" json:"password"` - IsTLS bool `bson:"is_tls" json:"isTLS"` - CreatedAt int64 `bson:"created_at" json:"created_at"` - DeletedAt int64 `bson:"deleted_at" json:"deleted_at"` - UpdatedAt int64 `bson:"updated_at" json:"updated_at"` -} - -func (EmailHost) TableName() string { - return "email_host" -} - type EmailService struct { ID int `json:"id" bson:"id"` Name string `json:"name" bson:"name"` diff --git a/pkg/microservice/systemconfig/core/repository/models/codehost.go b/pkg/microservice/systemconfig/core/repository/models/codehost.go index b05712839..ba7d6269b 100644 --- a/pkg/microservice/systemconfig/core/repository/models/codehost.go +++ b/pkg/microservice/systemconfig/core/repository/models/codehost.go @@ -2,21 +2,21 @@ package models type CodeHost struct { ID int `bson:"id"` - Name string `bson:"name"json:"name"` - Type string `bson:"type"json:"type"` - Address string `bson:"address"json:"address"` - IsReady bool `bson:"is_ready"json:"ready"` - AccessToken string `bson:"access_token"json:"accessToken"` - RefreshToken string `bson:"refresh_token"json:"refreshToken"` - Namespace string `bson:"namespace"json:"namespace"` - OrganizationID int `bson:"organization_id"json:"orgId"` - ApplicationId string `bson:"application_id"json:"applicationId"` - Region string `bson:"region"json:"region,omitempty"` - Username string `bson:"username"json:"username,omitempty"` - Password string `bson:"password"json:"password,omitempty"` - ClientSecret string `bson:"client_secret"json:"clientSecret"` - CreatedAt int64 `bson:"created_at"json:"created_at"` - UpdatedAt int64 `bson:"updated_at"json:"updated_at"` + Name string `bson:"name" json:"name"` + Type string `bson:"type" json:"type"` + Address string `bson:"address" json:"address"` + IsReady bool `bson:"is_ready" json:"ready"` + AccessToken string `bson:"access_token" json:"accessToken"` + RefreshToken string `bson:"refresh_token" json:"refreshToken"` + Namespace string `bson:"namespace" json:"namespace"` + OrganizationID int `bson:"organization_id" json:"orgId"` + ApplicationId string `bson:"application_id" json:"applicationId"` + Region string `bson:"region" json:"region,omitempty"` + Username string `bson:"username" json:"username,omitempty"` + Password string `bson:"password" json:"password,omitempty"` + ClientSecret string `bson:"client_secret" json:"clientSecret"` + CreatedAt int64 `bson:"created_at" json:"created_at"` + UpdatedAt int64 `bson:"updated_at" json:"updated_at"` } func (CodeHost) TableName() string { diff --git a/pkg/microservice/systemconfig/core/repository/models/jira.go b/pkg/microservice/systemconfig/core/repository/models/jira.go index 02499db53..6038bf7bd 100644 --- a/pkg/microservice/systemconfig/core/repository/models/jira.go +++ b/pkg/microservice/systemconfig/core/repository/models/jira.go @@ -1,13 +1,13 @@ package models type Jira struct { - ID int64 `bson:"id"json:"id"` - Host string `bson:"host"json:"host"` - User string `bson:"user"json:"user"` + ID int64 `bson:"id" json:"id"` + Host string `bson:"host" json:"host"` + User string `bson:"user" json:"user"` AccessToken string `bson:"access_token" json:"access_token"` - CreatedAt int64 `bson:"created_at"json:"created_at"` - UpdatedAt int64 `bson:"updated_at" json:"updated_at"` - DeletedAt int64 `bson:"deleted_at"json:"deleted_at"` + CreatedAt int64 `bson:"created_at" json:"created_at"` + UpdatedAt int64 `bson:"updated_at" json:"updated_at"` + DeletedAt int64 `bson:"deleted_at" json:"deleted_at"` } func (Jira) TableName() string { -- Gitee From adee81a68aca4dde097f5c1d54dbf1f1e5a889ef Mon Sep 17 00:00:00 2001 From: mouuii Date: Thu, 4 Nov 2021 20:53:47 +0800 Subject: [PATCH 241/405] json Signed-off-by: mouuii --- .../core/codehost/handler/router.go | 22 +++++++++++++++++++ .../systemconfig/core/email/handler/router.go | 1 + .../systemconfig/core/jira/handler/router.go | 1 + 3 files changed, 24 insertions(+) create mode 100644 pkg/microservice/systemconfig/core/codehost/handler/router.go create mode 100644 pkg/microservice/systemconfig/core/email/handler/router.go create mode 100644 pkg/microservice/systemconfig/core/jira/handler/router.go diff --git a/pkg/microservice/systemconfig/core/codehost/handler/router.go b/pkg/microservice/systemconfig/core/codehost/handler/router.go new file mode 100644 index 000000000..9f844c7a5 --- /dev/null +++ b/pkg/microservice/systemconfig/core/codehost/handler/router.go @@ -0,0 +1,22 @@ +package handler + +import ( + "github.com/gin-gonic/gin" +) + +type Router struct{} + +func (*Router) Inject(router *gin.RouterGroup) { + emails := router.Group("emails") + { + emails.GET("/host", GetEmailHost) + emails.POST("/host", CreateEmailHost) + emails.PATCH("/host", UpdateEmailHost) + emails.DELETE("/host", DeleteEmailHost) + + emails.GET("/service", GetEmailService) + emails.POST("/service", CreateEmailService) + emails.PATCH("/service", UpdateEmailService) + emails.DELETE("/service", DeleteEmailService) + } +} diff --git a/pkg/microservice/systemconfig/core/email/handler/router.go b/pkg/microservice/systemconfig/core/email/handler/router.go new file mode 100644 index 000000000..abeebd162 --- /dev/null +++ b/pkg/microservice/systemconfig/core/email/handler/router.go @@ -0,0 +1 @@ +package handler diff --git a/pkg/microservice/systemconfig/core/jira/handler/router.go b/pkg/microservice/systemconfig/core/jira/handler/router.go new file mode 100644 index 000000000..abeebd162 --- /dev/null +++ b/pkg/microservice/systemconfig/core/jira/handler/router.go @@ -0,0 +1 @@ +package handler -- Gitee From a57280c36016d12484b77ae8296e997aec5252f2 Mon Sep 17 00:00:00 2001 From: mouuii Date: Thu, 4 Nov 2021 21:08:25 +0800 Subject: [PATCH 242/405] json Signed-off-by: mouuii --- .../core/codehost/handler/codehost.go | 2 +- .../core/codehost/handler/router.go | 12 ++------ .../systemconfig/core/email/handler/email.go | 28 +++++++++---------- .../systemconfig/core/email/handler/router.go | 21 ++++++++++++++ .../core/email/models/emailhost.go | 16 +++++++++++ .../core/email/models/emailservice.go | 14 +++++----- .../systemconfig/core/email/service/email.go | 2 +- .../systemconfig/core/handler/router.go | 27 ------------------ .../systemconfig/core/jira/handler/jira.go | 10 +++---- .../systemconfig/core/jira/handler/router.go | 17 +++++++++++ .../core/repository/mongo/email.go | 2 +- .../systemconfig/server/rest/router.go | 4 +++ 12 files changed, 89 insertions(+), 66 deletions(-) diff --git a/pkg/microservice/systemconfig/core/codehost/handler/codehost.go b/pkg/microservice/systemconfig/core/codehost/handler/codehost.go index e6b2dd1d9..96f34b9de 100644 --- a/pkg/microservice/systemconfig/core/codehost/handler/codehost.go +++ b/pkg/microservice/systemconfig/core/codehost/handler/codehost.go @@ -3,8 +3,8 @@ package handler import ( "github.com/gin-gonic/gin" + "github.com/koderover/zadig/pkg/microservice/systemconfig/core/codehost/service" "github.com/koderover/zadig/pkg/microservice/systemconfig/core/repository/models" - "github.com/koderover/zadig/pkg/microservice/systemconfig/core/service" internalhandler "github.com/koderover/zadig/pkg/shared/handler" ) diff --git a/pkg/microservice/systemconfig/core/codehost/handler/router.go b/pkg/microservice/systemconfig/core/codehost/handler/router.go index 9f844c7a5..5db3c015b 100644 --- a/pkg/microservice/systemconfig/core/codehost/handler/router.go +++ b/pkg/microservice/systemconfig/core/codehost/handler/router.go @@ -7,16 +7,8 @@ import ( type Router struct{} func (*Router) Inject(router *gin.RouterGroup) { - emails := router.Group("emails") + codehost := router.Group("codehost") { - emails.GET("/host", GetEmailHost) - emails.POST("/host", CreateEmailHost) - emails.PATCH("/host", UpdateEmailHost) - emails.DELETE("/host", DeleteEmailHost) - - emails.GET("/service", GetEmailService) - emails.POST("/service", CreateEmailService) - emails.PATCH("/service", UpdateEmailService) - emails.DELETE("/service", DeleteEmailService) + codehost.POST("", ListCodehost) } } diff --git a/pkg/microservice/systemconfig/core/email/handler/email.go b/pkg/microservice/systemconfig/core/email/handler/email.go index 0cf74ad9b..1aec123f6 100644 --- a/pkg/microservice/systemconfig/core/email/handler/email.go +++ b/pkg/microservice/systemconfig/core/email/handler/email.go @@ -3,43 +3,43 @@ package handler import ( "github.com/gin-gonic/gin" - models2 "github.com/koderover/zadig/pkg/microservice/systemconfig/core/email/models" - service2 "github.com/koderover/zadig/pkg/microservice/systemconfig/core/email/service" + "github.com/koderover/zadig/pkg/microservice/systemconfig/core/email/models" + "github.com/koderover/zadig/pkg/microservice/systemconfig/core/email/service" internalhandler "github.com/koderover/zadig/pkg/shared/handler" ) func GetEmailHost(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - ctx.Resp, ctx.Err = service2.GetEmailHost(ctx.Logger) + ctx.Resp, ctx.Err = service.GetEmailHost(ctx.Logger) } func CreateEmailHost(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - req := new(models2.EmailHost) + req := new(models.EmailHost) if err := c.ShouldBindJSON(req); err != nil { ctx.Err = err return } - ctx.Resp, ctx.Err = service2.CreateEmailHost(req, ctx.Logger) + ctx.Resp, ctx.Err = service.CreateEmailHost(req, ctx.Logger) } func UpdateEmailHost(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - req := new(models2.EmailHost) + req := new(models.EmailHost) if err := c.ShouldBindJSON(req); err != nil { ctx.Err = err return } - ctx.Resp, ctx.Err = service2.UpdateEmailHost(req, ctx.Logger) + ctx.Resp, ctx.Err = service.UpdateEmailHost(req, ctx.Logger) } func DeleteEmailHost(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - ctx.Err = service2.DeleteEmailHost(ctx.Logger) + ctx.Err = service.DeleteEmailHost(ctx.Logger) } //// @@ -47,33 +47,33 @@ func DeleteEmailHost(c *gin.Context) { func GetEmailService(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - ctx.Resp, ctx.Err = service2.GetEmailService(ctx.Logger) + ctx.Resp, ctx.Err = service.GetEmailService(ctx.Logger) } func CreateEmailService(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - req := new(models2.EmailService) + req := new(models.EmailService) if err := c.ShouldBindJSON(req); err != nil { ctx.Err = err return } - ctx.Resp, ctx.Err = service2.CreateEmailService(req, ctx.Logger) + ctx.Resp, ctx.Err = service.CreateEmailService(req, ctx.Logger) } func UpdateEmailService(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - req := new(models2.EmailService) + req := new(models.EmailService) if err := c.ShouldBindJSON(req); err != nil { ctx.Err = err return } - ctx.Resp, ctx.Err = service2.UpdateEmailService(req, ctx.Logger) + ctx.Resp, ctx.Err = service.UpdateEmailService(req, ctx.Logger) } func DeleteEmailService(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - ctx.Err = service2.DeleteEmailService(ctx.Logger) + ctx.Err = service.DeleteEmailService(ctx.Logger) } diff --git a/pkg/microservice/systemconfig/core/email/handler/router.go b/pkg/microservice/systemconfig/core/email/handler/router.go index abeebd162..9f844c7a5 100644 --- a/pkg/microservice/systemconfig/core/email/handler/router.go +++ b/pkg/microservice/systemconfig/core/email/handler/router.go @@ -1 +1,22 @@ package handler + +import ( + "github.com/gin-gonic/gin" +) + +type Router struct{} + +func (*Router) Inject(router *gin.RouterGroup) { + emails := router.Group("emails") + { + emails.GET("/host", GetEmailHost) + emails.POST("/host", CreateEmailHost) + emails.PATCH("/host", UpdateEmailHost) + emails.DELETE("/host", DeleteEmailHost) + + emails.GET("/service", GetEmailService) + emails.POST("/service", CreateEmailService) + emails.PATCH("/service", UpdateEmailService) + emails.DELETE("/service", DeleteEmailService) + } +} diff --git a/pkg/microservice/systemconfig/core/email/models/emailhost.go b/pkg/microservice/systemconfig/core/email/models/emailhost.go index 2640e7f93..4274ef570 100644 --- a/pkg/microservice/systemconfig/core/email/models/emailhost.go +++ b/pkg/microservice/systemconfig/core/email/models/emailhost.go @@ -1 +1,17 @@ package models + +type EmailHost struct { + ID int `bson:"id" json:"id"` + Name string `bson:"name" json:"name"` + Port int `bson:"port" json:"port"` + Username string `bson:"username" json:"username"` + Password string `bson:"password" json:"password"` + IsTLS bool `bson:"is_tls" json:"isTLS"` + CreatedAt int64 `bson:"created_at" json:"created_at"` + DeletedAt int64 `bson:"deleted_at" json:"deleted_at"` + UpdatedAt int64 `bson:"updated_at" json:"updated_at"` +} + +func (EmailHost) TableName() string { + return "email_host" +} diff --git a/pkg/microservice/systemconfig/core/email/models/emailservice.go b/pkg/microservice/systemconfig/core/email/models/emailservice.go index 44e61a39d..f8199cb87 100644 --- a/pkg/microservice/systemconfig/core/email/models/emailservice.go +++ b/pkg/microservice/systemconfig/core/email/models/emailservice.go @@ -1,14 +1,14 @@ package models type EmailService struct { - ID int `json:"id" bson:"id"` - Name string `json:"name" bson:"name"` - Address string `json:"address" bson:"address"` + ID int `json:"id" bson:"id"` + Name string `json:"name" bson:"name"` + Address string `json:"address" bson:"address"` DisplayName string `json:"display_name" bson:"display_name"` - Theme string `json:"theme" bson:"theme"` - CreatedAt int64 `json:"created_at" bson:"created_at"` - UpdatedAt int64 `json:"updated_at" bson:"updated_at"` - DeletedAt int64 `json:"deleted_at" bson:"deleted_at"` + Theme string `json:"theme" bson:"theme"` + CreatedAt int64 `json:"created_at" bson:"created_at"` + UpdatedAt int64 `json:"updated_at" bson:"updated_at"` + DeletedAt int64 `json:"deleted_at" bson:"deleted_at"` } func (EmailService) TableName() string { diff --git a/pkg/microservice/systemconfig/core/email/service/email.go b/pkg/microservice/systemconfig/core/email/service/email.go index e4f9ea5b5..3e4b4c406 100644 --- a/pkg/microservice/systemconfig/core/email/service/email.go +++ b/pkg/microservice/systemconfig/core/email/service/email.go @@ -3,7 +3,7 @@ package service import ( "go.uber.org/zap" - "github.com/koderover/zadig/pkg/microservice/systemconfig/core/repository/models" + "github.com/koderover/zadig/pkg/microservice/systemconfig/core/email/models" "github.com/koderover/zadig/pkg/microservice/systemconfig/core/repository/mongo" ) diff --git a/pkg/microservice/systemconfig/core/handler/router.go b/pkg/microservice/systemconfig/core/handler/router.go index b0caf1fe0..282f4cb12 100644 --- a/pkg/microservice/systemconfig/core/handler/router.go +++ b/pkg/microservice/systemconfig/core/handler/router.go @@ -18,9 +18,6 @@ package handler import ( "github.com/gin-gonic/gin" - - "github.com/koderover/zadig/pkg/microservice/systemconfig/core/email/handler" - handler2 "github.com/koderover/zadig/pkg/microservice/systemconfig/core/jira/handler" ) type Router struct{} @@ -38,28 +35,4 @@ func (*Router) Inject(router *gin.RouterGroup) { { features.GET("/:name", GetFeature) } - emails := router.Group("emails") - { - emails.GET("/host", handler.GetEmailHost) - emails.POST("/host", handler.CreateEmailHost) - emails.PATCH("/host", handler.UpdateEmailHost) - emails.DELETE("/host", handler.DeleteEmailHost) - - emails.GET("/service", handler.GetEmailService) - emails.POST("/service", handler.CreateEmailService) - emails.PATCH("/service", handler.UpdateEmailService) - emails.DELETE("/service", handler.DeleteEmailService) - } - - jira := router.Group("jira") - { - jira.GET("", handler2.GetJira) - jira.POST("", handler2.CreateJira) - jira.PATCH("", handler2.UpdateJira) - jira.DELETE("", handler2.DeleteJira) - } - codehost := router.Group("codehost") - { - codehost.POST("", ListCodehost) - } } diff --git a/pkg/microservice/systemconfig/core/jira/handler/jira.go b/pkg/microservice/systemconfig/core/jira/handler/jira.go index 7a0074d40..f084c7a44 100644 --- a/pkg/microservice/systemconfig/core/jira/handler/jira.go +++ b/pkg/microservice/systemconfig/core/jira/handler/jira.go @@ -3,7 +3,7 @@ package handler import ( "github.com/gin-gonic/gin" - service2 "github.com/koderover/zadig/pkg/microservice/systemconfig/core/jira/service" + "github.com/koderover/zadig/pkg/microservice/systemconfig/core/jira/service" "github.com/koderover/zadig/pkg/microservice/systemconfig/core/repository/models" internalhandler "github.com/koderover/zadig/pkg/shared/handler" ) @@ -11,13 +11,13 @@ import ( func DeleteJira(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - ctx.Err = service2.DeleteJira(ctx.Logger) + ctx.Err = service.DeleteJira(ctx.Logger) } func GetJira(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - ctx.Resp, ctx.Err = service2.GeJira(ctx.Logger) + ctx.Resp, ctx.Err = service.GeJira(ctx.Logger) } func CreateJira(c *gin.Context) { @@ -28,7 +28,7 @@ func CreateJira(c *gin.Context) { ctx.Err = err return } - ctx.Resp, ctx.Err = service2.CreateJira(req, ctx.Logger) + ctx.Resp, ctx.Err = service.CreateJira(req, ctx.Logger) } func UpdateJira(c *gin.Context) { @@ -39,5 +39,5 @@ func UpdateJira(c *gin.Context) { ctx.Err = err return } - ctx.Resp, ctx.Err = service2.UpdateJira(req, ctx.Logger) + ctx.Resp, ctx.Err = service.UpdateJira(req, ctx.Logger) } diff --git a/pkg/microservice/systemconfig/core/jira/handler/router.go b/pkg/microservice/systemconfig/core/jira/handler/router.go index abeebd162..b302096f7 100644 --- a/pkg/microservice/systemconfig/core/jira/handler/router.go +++ b/pkg/microservice/systemconfig/core/jira/handler/router.go @@ -1 +1,18 @@ package handler + +import ( + "github.com/gin-gonic/gin" +) + +type Router struct{} + +func (*Router) Inject(router *gin.RouterGroup) { + jira := router.Group("jira") + { + jira.GET("", GetJira) + jira.POST("", CreateJira) + jira.PATCH("", UpdateJira) + jira.DELETE("", DeleteJira) + } + +} diff --git a/pkg/microservice/systemconfig/core/repository/mongo/email.go b/pkg/microservice/systemconfig/core/repository/mongo/email.go index e9a57c4d2..f969cbefd 100644 --- a/pkg/microservice/systemconfig/core/repository/mongo/email.go +++ b/pkg/microservice/systemconfig/core/repository/mongo/email.go @@ -8,7 +8,7 @@ import ( "go.mongodb.org/mongo-driver/mongo" "github.com/koderover/zadig/pkg/microservice/systemconfig/config" - "github.com/koderover/zadig/pkg/microservice/systemconfig/core/repository/models" + "github.com/koderover/zadig/pkg/microservice/systemconfig/core/email/models" "github.com/koderover/zadig/pkg/tool/log" mongotool "github.com/koderover/zadig/pkg/tool/mongo" ) diff --git a/pkg/microservice/systemconfig/server/rest/router.go b/pkg/microservice/systemconfig/server/rest/router.go index c043ab8e1..4cd31ed56 100644 --- a/pkg/microservice/systemconfig/server/rest/router.go +++ b/pkg/microservice/systemconfig/server/rest/router.go @@ -19,12 +19,16 @@ package rest import ( "github.com/gin-gonic/gin" + emailHandler "github.com/koderover/zadig/pkg/microservice/systemconfig/core/email/handler" "github.com/koderover/zadig/pkg/microservice/systemconfig/core/handler" + jiraHandler "github.com/koderover/zadig/pkg/microservice/systemconfig/core/jira/handler" ) func (s *engine) injectRouterGroup(router *gin.RouterGroup) { for _, r := range []injector{ new(handler.Router), + new(emailHandler.Router), + new(jiraHandler.Router), } { r.Inject(router.Group("/api/v1")) } -- Gitee From d97428d6976d67fc1480d92d885e95bc6b8dcf9e Mon Sep 17 00:00:00 2001 From: mouuii Date: Thu, 4 Nov 2021 21:20:46 +0800 Subject: [PATCH 243/405] json Signed-off-by: mouuii --- pkg/microservice/systemconfig/server/rest/router.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pkg/microservice/systemconfig/server/rest/router.go b/pkg/microservice/systemconfig/server/rest/router.go index 4cd31ed56..ca654736e 100644 --- a/pkg/microservice/systemconfig/server/rest/router.go +++ b/pkg/microservice/systemconfig/server/rest/router.go @@ -19,6 +19,7 @@ package rest import ( "github.com/gin-gonic/gin" + codehosthandler "github.com/koderover/zadig/pkg/microservice/aslan/core/code/handler" emailHandler "github.com/koderover/zadig/pkg/microservice/systemconfig/core/email/handler" "github.com/koderover/zadig/pkg/microservice/systemconfig/core/handler" jiraHandler "github.com/koderover/zadig/pkg/microservice/systemconfig/core/jira/handler" @@ -29,6 +30,7 @@ func (s *engine) injectRouterGroup(router *gin.RouterGroup) { new(handler.Router), new(emailHandler.Router), new(jiraHandler.Router), + new(codehosthandler.Router), } { r.Inject(router.Group("/api/v1")) } -- Gitee From 183bc8cb3e3093f23ac3fc7abcbdb333e4bcd1a0 Mon Sep 17 00:00:00 2001 From: mouuii Date: Thu, 4 Nov 2021 21:48:46 +0800 Subject: [PATCH 244/405] json Signed-off-by: mouuii --- .../systemconfig/core/codehost/handler/codehost.go | 2 +- .../core/{ => codehost}/repository/models/codehost.go | 0 .../core/{ => codehost}/repository/mongo/codehost.go | 2 +- .../systemconfig/core/codehost/service/codehost.go | 4 ++-- pkg/microservice/systemconfig/core/email/handler/email.go | 2 +- .../core/email/{ => repository}/models/emailhost.go | 0 .../core/email/{ => repository}/models/emailservice.go | 0 .../systemconfig/core/{ => email}/repository/mongo/jira.go | 2 +- pkg/microservice/systemconfig/core/email/service/email.go | 2 +- pkg/microservice/systemconfig/core/jira/handler/jira.go | 2 +- .../systemconfig/core/{ => jira}/repository/models/jira.go | 0 pkg/microservice/systemconfig/core/jira/service/jira.go | 4 ++-- pkg/microservice/systemconfig/core/repository/mongo/email.go | 2 +- 13 files changed, 11 insertions(+), 11 deletions(-) rename pkg/microservice/systemconfig/core/{ => codehost}/repository/models/codehost.go (100%) rename pkg/microservice/systemconfig/core/{ => codehost}/repository/mongo/codehost.go (98%) rename pkg/microservice/systemconfig/core/email/{ => repository}/models/emailhost.go (100%) rename pkg/microservice/systemconfig/core/email/{ => repository}/models/emailservice.go (100%) rename pkg/microservice/systemconfig/core/{ => email}/repository/mongo/jira.go (98%) rename pkg/microservice/systemconfig/core/{ => jira}/repository/models/jira.go (100%) diff --git a/pkg/microservice/systemconfig/core/codehost/handler/codehost.go b/pkg/microservice/systemconfig/core/codehost/handler/codehost.go index 96f34b9de..8cdc2ad46 100644 --- a/pkg/microservice/systemconfig/core/codehost/handler/codehost.go +++ b/pkg/microservice/systemconfig/core/codehost/handler/codehost.go @@ -3,8 +3,8 @@ package handler import ( "github.com/gin-gonic/gin" + "github.com/koderover/zadig/pkg/microservice/systemconfig/core/codehost/repository/models" "github.com/koderover/zadig/pkg/microservice/systemconfig/core/codehost/service" - "github.com/koderover/zadig/pkg/microservice/systemconfig/core/repository/models" internalhandler "github.com/koderover/zadig/pkg/shared/handler" ) diff --git a/pkg/microservice/systemconfig/core/repository/models/codehost.go b/pkg/microservice/systemconfig/core/codehost/repository/models/codehost.go similarity index 100% rename from pkg/microservice/systemconfig/core/repository/models/codehost.go rename to pkg/microservice/systemconfig/core/codehost/repository/models/codehost.go diff --git a/pkg/microservice/systemconfig/core/repository/mongo/codehost.go b/pkg/microservice/systemconfig/core/codehost/repository/mongo/codehost.go similarity index 98% rename from pkg/microservice/systemconfig/core/repository/mongo/codehost.go rename to pkg/microservice/systemconfig/core/codehost/repository/mongo/codehost.go index f589f7477..15d629425 100644 --- a/pkg/microservice/systemconfig/core/repository/mongo/codehost.go +++ b/pkg/microservice/systemconfig/core/codehost/repository/mongo/codehost.go @@ -8,7 +8,7 @@ import ( "go.mongodb.org/mongo-driver/mongo" "github.com/koderover/zadig/pkg/microservice/systemconfig/config" - "github.com/koderover/zadig/pkg/microservice/systemconfig/core/repository/models" + "github.com/koderover/zadig/pkg/microservice/systemconfig/core/codehost/repository/models" "github.com/koderover/zadig/pkg/tool/log" mongotool "github.com/koderover/zadig/pkg/tool/mongo" ) diff --git a/pkg/microservice/systemconfig/core/codehost/service/codehost.go b/pkg/microservice/systemconfig/core/codehost/service/codehost.go index b5f2febee..5b0b3e280 100644 --- a/pkg/microservice/systemconfig/core/codehost/service/codehost.go +++ b/pkg/microservice/systemconfig/core/codehost/service/codehost.go @@ -3,8 +3,8 @@ package service import ( "go.uber.org/zap" - "github.com/koderover/zadig/pkg/microservice/systemconfig/core/repository/models" - "github.com/koderover/zadig/pkg/microservice/systemconfig/core/repository/mongo" + "github.com/koderover/zadig/pkg/microservice/systemconfig/core/codehost/repository/models" + "github.com/koderover/zadig/pkg/microservice/systemconfig/core/codehost/repository/mongo" ) func CreateCodehost(codehost *models.CodeHost, _ *zap.SugaredLogger) (*models.CodeHost, error) { diff --git a/pkg/microservice/systemconfig/core/email/handler/email.go b/pkg/microservice/systemconfig/core/email/handler/email.go index 1aec123f6..2dea69045 100644 --- a/pkg/microservice/systemconfig/core/email/handler/email.go +++ b/pkg/microservice/systemconfig/core/email/handler/email.go @@ -3,7 +3,7 @@ package handler import ( "github.com/gin-gonic/gin" - "github.com/koderover/zadig/pkg/microservice/systemconfig/core/email/models" + "github.com/koderover/zadig/pkg/microservice/systemconfig/core/email/repository/models" "github.com/koderover/zadig/pkg/microservice/systemconfig/core/email/service" internalhandler "github.com/koderover/zadig/pkg/shared/handler" ) diff --git a/pkg/microservice/systemconfig/core/email/models/emailhost.go b/pkg/microservice/systemconfig/core/email/repository/models/emailhost.go similarity index 100% rename from pkg/microservice/systemconfig/core/email/models/emailhost.go rename to pkg/microservice/systemconfig/core/email/repository/models/emailhost.go diff --git a/pkg/microservice/systemconfig/core/email/models/emailservice.go b/pkg/microservice/systemconfig/core/email/repository/models/emailservice.go similarity index 100% rename from pkg/microservice/systemconfig/core/email/models/emailservice.go rename to pkg/microservice/systemconfig/core/email/repository/models/emailservice.go diff --git a/pkg/microservice/systemconfig/core/repository/mongo/jira.go b/pkg/microservice/systemconfig/core/email/repository/mongo/jira.go similarity index 98% rename from pkg/microservice/systemconfig/core/repository/mongo/jira.go rename to pkg/microservice/systemconfig/core/email/repository/mongo/jira.go index ef1ccf4dc..e49a5fbdd 100644 --- a/pkg/microservice/systemconfig/core/repository/mongo/jira.go +++ b/pkg/microservice/systemconfig/core/email/repository/mongo/jira.go @@ -8,7 +8,7 @@ import ( "go.mongodb.org/mongo-driver/mongo" "github.com/koderover/zadig/pkg/microservice/systemconfig/config" - "github.com/koderover/zadig/pkg/microservice/systemconfig/core/repository/models" + "github.com/koderover/zadig/pkg/microservice/systemconfig/core/jira/repository/models" "github.com/koderover/zadig/pkg/tool/log" mongotool "github.com/koderover/zadig/pkg/tool/mongo" ) diff --git a/pkg/microservice/systemconfig/core/email/service/email.go b/pkg/microservice/systemconfig/core/email/service/email.go index 3e4b4c406..9395fa3ea 100644 --- a/pkg/microservice/systemconfig/core/email/service/email.go +++ b/pkg/microservice/systemconfig/core/email/service/email.go @@ -3,7 +3,7 @@ package service import ( "go.uber.org/zap" - "github.com/koderover/zadig/pkg/microservice/systemconfig/core/email/models" + "github.com/koderover/zadig/pkg/microservice/systemconfig/core/email/repository/models" "github.com/koderover/zadig/pkg/microservice/systemconfig/core/repository/mongo" ) diff --git a/pkg/microservice/systemconfig/core/jira/handler/jira.go b/pkg/microservice/systemconfig/core/jira/handler/jira.go index f084c7a44..4e8b64934 100644 --- a/pkg/microservice/systemconfig/core/jira/handler/jira.go +++ b/pkg/microservice/systemconfig/core/jira/handler/jira.go @@ -3,8 +3,8 @@ package handler import ( "github.com/gin-gonic/gin" + "github.com/koderover/zadig/pkg/microservice/systemconfig/core/jira/repository/models" "github.com/koderover/zadig/pkg/microservice/systemconfig/core/jira/service" - "github.com/koderover/zadig/pkg/microservice/systemconfig/core/repository/models" internalhandler "github.com/koderover/zadig/pkg/shared/handler" ) diff --git a/pkg/microservice/systemconfig/core/repository/models/jira.go b/pkg/microservice/systemconfig/core/jira/repository/models/jira.go similarity index 100% rename from pkg/microservice/systemconfig/core/repository/models/jira.go rename to pkg/microservice/systemconfig/core/jira/repository/models/jira.go diff --git a/pkg/microservice/systemconfig/core/jira/service/jira.go b/pkg/microservice/systemconfig/core/jira/service/jira.go index 9d3e2e11b..72cd90eb9 100644 --- a/pkg/microservice/systemconfig/core/jira/service/jira.go +++ b/pkg/microservice/systemconfig/core/jira/service/jira.go @@ -3,8 +3,8 @@ package service import ( "go.uber.org/zap" - "github.com/koderover/zadig/pkg/microservice/systemconfig/core/repository/models" - "github.com/koderover/zadig/pkg/microservice/systemconfig/core/repository/mongo" + "github.com/koderover/zadig/pkg/microservice/systemconfig/core/email/repository/mongo" + "github.com/koderover/zadig/pkg/microservice/systemconfig/core/jira/repository/models" ) func GeJira(_ *zap.SugaredLogger) (*models.Jira, error) { diff --git a/pkg/microservice/systemconfig/core/repository/mongo/email.go b/pkg/microservice/systemconfig/core/repository/mongo/email.go index f969cbefd..77b17a910 100644 --- a/pkg/microservice/systemconfig/core/repository/mongo/email.go +++ b/pkg/microservice/systemconfig/core/repository/mongo/email.go @@ -8,7 +8,7 @@ import ( "go.mongodb.org/mongo-driver/mongo" "github.com/koderover/zadig/pkg/microservice/systemconfig/config" - "github.com/koderover/zadig/pkg/microservice/systemconfig/core/email/models" + "github.com/koderover/zadig/pkg/microservice/systemconfig/core/email/repository/models" "github.com/koderover/zadig/pkg/tool/log" mongotool "github.com/koderover/zadig/pkg/tool/mongo" ) -- Gitee From cf372453482123dd4116cf6f70c35ccbbfce67e9 Mon Sep 17 00:00:00 2001 From: mouuii Date: Thu, 4 Nov 2021 21:52:16 +0800 Subject: [PATCH 245/405] refactor Signed-off-by: mouuii --- .../core/{ => email}/repository/mongo/email.go | 0 .../systemconfig/core/email/service/email.go | 18 +++++++++--------- .../{email => jira}/repository/mongo/jira.go | 0 .../systemconfig/core/jira/service/jira.go | 10 +++++----- pkg/microservice/systemconfig/core/service.go | 4 ++-- 5 files changed, 16 insertions(+), 16 deletions(-) rename pkg/microservice/systemconfig/core/{ => email}/repository/mongo/email.go (100%) rename pkg/microservice/systemconfig/core/{email => jira}/repository/mongo/jira.go (100%) diff --git a/pkg/microservice/systemconfig/core/repository/mongo/email.go b/pkg/microservice/systemconfig/core/email/repository/mongo/email.go similarity index 100% rename from pkg/microservice/systemconfig/core/repository/mongo/email.go rename to pkg/microservice/systemconfig/core/email/repository/mongo/email.go diff --git a/pkg/microservice/systemconfig/core/email/service/email.go b/pkg/microservice/systemconfig/core/email/service/email.go index 9395fa3ea..1321afad9 100644 --- a/pkg/microservice/systemconfig/core/email/service/email.go +++ b/pkg/microservice/systemconfig/core/email/service/email.go @@ -4,37 +4,37 @@ import ( "go.uber.org/zap" "github.com/koderover/zadig/pkg/microservice/systemconfig/core/email/repository/models" - "github.com/koderover/zadig/pkg/microservice/systemconfig/core/repository/mongo" + mongo2 "github.com/koderover/zadig/pkg/microservice/systemconfig/core/email/repository/mongo" ) func GetEmailHost(_ *zap.SugaredLogger) (*models.EmailHost, error) { - return mongo.NewEmailHostColl().Find() + return mongo2.NewEmailHostColl().Find() } func CreateEmailHost(emailHost *models.EmailHost, _ *zap.SugaredLogger) (*models.EmailHost, error) { - return mongo.NewEmailHostColl().Add(emailHost) + return mongo2.NewEmailHostColl().Add(emailHost) } func UpdateEmailHost(host *models.EmailHost, _ *zap.SugaredLogger) (*models.EmailHost, error) { - return mongo.NewEmailHostColl().Update(host) + return mongo2.NewEmailHostColl().Update(host) } func DeleteEmailHost(_ *zap.SugaredLogger) error { - return mongo.NewEmailHostColl().Delete() + return mongo2.NewEmailHostColl().Delete() } func GetEmailService(_ *zap.SugaredLogger) (*models.EmailService, error) { - return mongo.NewEmailServiceColl().GetEmailService() + return mongo2.NewEmailServiceColl().GetEmailService() } func CreateEmailService(service *models.EmailService, _ *zap.SugaredLogger) (*models.EmailService, error) { - return mongo.NewEmailServiceColl().AddEmailService(service) + return mongo2.NewEmailServiceColl().AddEmailService(service) } func UpdateEmailService(service *models.EmailService, _ *zap.SugaredLogger) (*models.EmailService, error) { - return mongo.NewEmailServiceColl().UpdateEmailService(service) + return mongo2.NewEmailServiceColl().UpdateEmailService(service) } func DeleteEmailService(_ *zap.SugaredLogger) error { - return mongo.NewEmailServiceColl().DeleteEmailService() + return mongo2.NewEmailServiceColl().DeleteEmailService() } diff --git a/pkg/microservice/systemconfig/core/email/repository/mongo/jira.go b/pkg/microservice/systemconfig/core/jira/repository/mongo/jira.go similarity index 100% rename from pkg/microservice/systemconfig/core/email/repository/mongo/jira.go rename to pkg/microservice/systemconfig/core/jira/repository/mongo/jira.go diff --git a/pkg/microservice/systemconfig/core/jira/service/jira.go b/pkg/microservice/systemconfig/core/jira/service/jira.go index 72cd90eb9..41a2c2401 100644 --- a/pkg/microservice/systemconfig/core/jira/service/jira.go +++ b/pkg/microservice/systemconfig/core/jira/service/jira.go @@ -3,22 +3,22 @@ package service import ( "go.uber.org/zap" - "github.com/koderover/zadig/pkg/microservice/systemconfig/core/email/repository/mongo" "github.com/koderover/zadig/pkg/microservice/systemconfig/core/jira/repository/models" + mongo2 "github.com/koderover/zadig/pkg/microservice/systemconfig/core/jira/repository/mongo" ) func GeJira(_ *zap.SugaredLogger) (*models.Jira, error) { - return mongo.NewJiraColl().GetJira() + return mongo2.NewJiraColl().GetJira() } func CreateJira(jira *models.Jira, _ *zap.SugaredLogger) (*models.Jira, error) { - return mongo.NewJiraColl().AddJira(jira) + return mongo2.NewJiraColl().AddJira(jira) } func UpdateJira(jira *models.Jira, _ *zap.SugaredLogger) (*models.Jira, error) { - return mongo.NewJiraColl().UpdateJira(jira) + return mongo2.NewJiraColl().UpdateJira(jira) } func DeleteJira(_ *zap.SugaredLogger) error { - return mongo.NewJiraColl().DeleteJira() + return mongo2.NewJiraColl().DeleteJira() } diff --git a/pkg/microservice/systemconfig/core/service.go b/pkg/microservice/systemconfig/core/service.go index e46d9786d..134251784 100644 --- a/pkg/microservice/systemconfig/core/service.go +++ b/pkg/microservice/systemconfig/core/service.go @@ -24,7 +24,7 @@ import ( configbase "github.com/koderover/zadig/pkg/config" "github.com/koderover/zadig/pkg/microservice/systemconfig/config" - "github.com/koderover/zadig/pkg/microservice/systemconfig/core/repository/mongo" + mongo2 "github.com/koderover/zadig/pkg/microservice/systemconfig/core/email/repository/mongo" "github.com/koderover/zadig/pkg/microservice/systemconfig/core/service/featuregates" "github.com/koderover/zadig/pkg/setting" gormtool "github.com/koderover/zadig/pkg/tool/gorm" @@ -66,7 +66,7 @@ func initDatabase() { defer idxCancel() var wg sync.WaitGroup for _, r := range []indexer{ - mongo.NewEmailHostColl(), + mongo2.NewEmailHostColl(), } { wg.Add(1) -- Gitee From c9800f6e42574974bf2a998b389e7c30e5b324e5 Mon Sep 17 00:00:00 2001 From: mouuii Date: Thu, 4 Nov 2021 21:58:50 +0800 Subject: [PATCH 246/405] refactor Signed-off-by: mouuii --- .../core/email/repository/mongo/emailhost.go | 91 +++++++++++++++++++ .../mongo/{email.go => emailservice.go} | 77 ---------------- 2 files changed, 91 insertions(+), 77 deletions(-) create mode 100644 pkg/microservice/systemconfig/core/email/repository/mongo/emailhost.go rename pkg/microservice/systemconfig/core/email/repository/mongo/{email.go => emailservice.go} (55%) diff --git a/pkg/microservice/systemconfig/core/email/repository/mongo/emailhost.go b/pkg/microservice/systemconfig/core/email/repository/mongo/emailhost.go new file mode 100644 index 000000000..d2ca4f3b8 --- /dev/null +++ b/pkg/microservice/systemconfig/core/email/repository/mongo/emailhost.go @@ -0,0 +1,91 @@ +package mongo + +import ( + "context" + "time" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo" + + "github.com/koderover/zadig/pkg/microservice/systemconfig/config" + "github.com/koderover/zadig/pkg/microservice/systemconfig/core/email/repository/models" + "github.com/koderover/zadig/pkg/tool/log" + mongotool "github.com/koderover/zadig/pkg/tool/mongo" +) + +type EmailHostColl struct { + *mongo.Collection + + coll string +} + +func NewEmailHostColl() *EmailHostColl { + name := models.EmailHost{}.TableName() + coll := &EmailHostColl{Collection: mongotool.Database(config.MongoDatabase()).Collection(name), coll: name} + + return coll +} + +func (c *EmailHostColl) GetCollectionName() string { + return c.coll +} +func (c *EmailHostColl) EnsureIndex(ctx context.Context) error { + return nil +} + +func (c *EmailHostColl) Find() (*models.EmailHost, error) { + emailHost := new(models.EmailHost) + query := bson.M{"deleted_at": 0} + + ctx := context.Background() + + err := c.Collection.FindOne(ctx, query).Decode(emailHost) + if err != nil { + return nil, nil + } + emailHost.Password = "***" + return emailHost, nil +} + +func (c *EmailHostColl) Update(emailHost *models.EmailHost) (*models.EmailHost, error) { + query := bson.M{"deleted_at": 0} + change := bson.M{"$set": bson.M{ + "name": emailHost.Name, + "port": emailHost.Port, + "username": emailHost.Username, + "password": emailHost.Password, + "is_tls": emailHost.IsTLS, + "updated_at": time.Now().Unix(), + }} + + _, err := c.Collection.UpdateOne(context.TODO(), query, change) + if err != nil { + log.Error("repository Update EmailHostColl err : %v", err) + return nil, err + } + return emailHost, nil +} + +func (c *EmailHostColl) Delete() error { + query := bson.M{"deleted_at": 0} + change := bson.M{"$set": bson.M{ + "deleted_at": time.Now().Unix(), + }} + + _, err := c.Collection.UpdateOne(context.TODO(), query, change) + if err != nil { + log.Error("repository Delete EmailHostColl err : %v", err) + return err + } + return nil +} + +func (c *EmailHostColl) Add(emailHost *models.EmailHost) (*models.EmailHost, error) { + + _, err := c.Collection.InsertOne(context.TODO(), emailHost) + if err != nil { + log.Error("repository AddEmailHost err : %v", err) + return nil, err + } + return emailHost, nil +} diff --git a/pkg/microservice/systemconfig/core/email/repository/mongo/email.go b/pkg/microservice/systemconfig/core/email/repository/mongo/emailservice.go similarity index 55% rename from pkg/microservice/systemconfig/core/email/repository/mongo/email.go rename to pkg/microservice/systemconfig/core/email/repository/mongo/emailservice.go index 77b17a910..b8f366a74 100644 --- a/pkg/microservice/systemconfig/core/email/repository/mongo/email.go +++ b/pkg/microservice/systemconfig/core/email/repository/mongo/emailservice.go @@ -13,12 +13,6 @@ import ( mongotool "github.com/koderover/zadig/pkg/tool/mongo" ) -type EmailHostColl struct { - *mongo.Collection - - coll string -} - type EmailServiceColl struct { *mongo.Collection @@ -32,13 +26,6 @@ func NewEmailServiceColl() *EmailServiceColl { return coll } -func NewEmailHostColl() *EmailHostColl { - name := models.EmailHost{}.TableName() - coll := &EmailHostColl{Collection: mongotool.Database(config.MongoDatabase()).Collection(name), coll: name} - - return coll -} - func (c *EmailServiceColl) GetCollectionName() string { return c.coll } @@ -46,70 +33,6 @@ func (c *EmailServiceColl) EnsureIndex(ctx context.Context) error { return nil } -func (c *EmailHostColl) GetCollectionName() string { - return c.coll -} -func (c *EmailHostColl) EnsureIndex(ctx context.Context) error { - return nil -} - -func (c *EmailHostColl) Find() (*models.EmailHost, error) { - emailHost := new(models.EmailHost) - query := bson.M{"deleted_at": 0} - - ctx := context.Background() - - err := c.Collection.FindOne(ctx, query).Decode(emailHost) - if err != nil { - return nil, nil - } - emailHost.Password = "***" - return emailHost, nil -} - -func (c *EmailHostColl) Update(emailHost *models.EmailHost) (*models.EmailHost, error) { - query := bson.M{"deleted_at": 0} - change := bson.M{"$set": bson.M{ - "name": emailHost.Name, - "port": emailHost.Port, - "username": emailHost.Username, - "password": emailHost.Password, - "is_tls": emailHost.IsTLS, - "updated_at": time.Now().Unix(), - }} - - _, err := c.Collection.UpdateOne(context.TODO(), query, change) - if err != nil { - log.Error("repository Update EmailHostColl err : %v", err) - return nil, err - } - return emailHost, nil -} - -func (c *EmailHostColl) Delete() error { - query := bson.M{"deleted_at": 0} - change := bson.M{"$set": bson.M{ - "deleted_at": time.Now().Unix(), - }} - - _, err := c.Collection.UpdateOne(context.TODO(), query, change) - if err != nil { - log.Error("repository Delete EmailHostColl err : %v", err) - return err - } - return nil -} - -func (c *EmailHostColl) Add(emailHost *models.EmailHost) (*models.EmailHost, error) { - - _, err := c.Collection.InsertOne(context.TODO(), emailHost) - if err != nil { - log.Error("repository AddEmailHost err : %v", err) - return nil, err - } - return emailHost, nil -} - func (c *EmailServiceColl) AddEmailService(iEmailService *models.EmailService) (*models.EmailService, error) { _, err := c.Collection.InsertOne(context.TODO(), iEmailService) -- Gitee From df84d2722257a4d861363186e5c5dd645699977e Mon Sep 17 00:00:00 2001 From: mouuii Date: Thu, 4 Nov 2021 22:10:10 +0800 Subject: [PATCH 247/405] refactor Signed-off-by: mouuii --- .../systemconfig/core/jira/service/jira.go | 10 +++++----- pkg/microservice/systemconfig/core/service.go | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/pkg/microservice/systemconfig/core/jira/service/jira.go b/pkg/microservice/systemconfig/core/jira/service/jira.go index 41a2c2401..59e75090d 100644 --- a/pkg/microservice/systemconfig/core/jira/service/jira.go +++ b/pkg/microservice/systemconfig/core/jira/service/jira.go @@ -4,21 +4,21 @@ import ( "go.uber.org/zap" "github.com/koderover/zadig/pkg/microservice/systemconfig/core/jira/repository/models" - mongo2 "github.com/koderover/zadig/pkg/microservice/systemconfig/core/jira/repository/mongo" + "github.com/koderover/zadig/pkg/microservice/systemconfig/core/jira/repository/mongo" ) func GeJira(_ *zap.SugaredLogger) (*models.Jira, error) { - return mongo2.NewJiraColl().GetJira() + return mongo.NewJiraColl().GetJira() } func CreateJira(jira *models.Jira, _ *zap.SugaredLogger) (*models.Jira, error) { - return mongo2.NewJiraColl().AddJira(jira) + return mongo.NewJiraColl().AddJira(jira) } func UpdateJira(jira *models.Jira, _ *zap.SugaredLogger) (*models.Jira, error) { - return mongo2.NewJiraColl().UpdateJira(jira) + return mongo.NewJiraColl().UpdateJira(jira) } func DeleteJira(_ *zap.SugaredLogger) error { - return mongo2.NewJiraColl().DeleteJira() + return mongo.NewJiraColl().DeleteJira() } diff --git a/pkg/microservice/systemconfig/core/service.go b/pkg/microservice/systemconfig/core/service.go index 134251784..94aeadd79 100644 --- a/pkg/microservice/systemconfig/core/service.go +++ b/pkg/microservice/systemconfig/core/service.go @@ -24,7 +24,7 @@ import ( configbase "github.com/koderover/zadig/pkg/config" "github.com/koderover/zadig/pkg/microservice/systemconfig/config" - mongo2 "github.com/koderover/zadig/pkg/microservice/systemconfig/core/email/repository/mongo" + "github.com/koderover/zadig/pkg/microservice/systemconfig/core/email/repository/mongo" "github.com/koderover/zadig/pkg/microservice/systemconfig/core/service/featuregates" "github.com/koderover/zadig/pkg/setting" gormtool "github.com/koderover/zadig/pkg/tool/gorm" @@ -66,7 +66,7 @@ func initDatabase() { defer idxCancel() var wg sync.WaitGroup for _, r := range []indexer{ - mongo2.NewEmailHostColl(), + mongo.NewEmailHostColl(), } { wg.Add(1) -- Gitee From 9cc5f78a3979089da4695345099f28136833c758 Mon Sep 17 00:00:00 2001 From: mouuii Date: Fri, 5 Nov 2021 10:49:20 +0800 Subject: [PATCH 248/405] refactor Signed-off-by: mouuii --- pkg/microservice/systemconfig/core/email/handler/email.go | 6 ++++++ .../systemconfig/core/email/handler/router.go | 2 ++ .../systemconfig/core/email/repository/mongo/emailhost.go | 1 - pkg/microservice/systemconfig/core/email/service/email.go | 8 ++++++++ 4 files changed, 16 insertions(+), 1 deletion(-) diff --git a/pkg/microservice/systemconfig/core/email/handler/email.go b/pkg/microservice/systemconfig/core/email/handler/email.go index 2dea69045..e7c911e76 100644 --- a/pkg/microservice/systemconfig/core/email/handler/email.go +++ b/pkg/microservice/systemconfig/core/email/handler/email.go @@ -14,6 +14,12 @@ func GetEmailHost(c *gin.Context) { ctx.Resp, ctx.Err = service.GetEmailHost(ctx.Logger) } +func InternalGetEmailHost(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + ctx.Resp, ctx.Err = service.InternalGetEmailHost(ctx.Logger) +} + func CreateEmailHost(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() diff --git a/pkg/microservice/systemconfig/core/email/handler/router.go b/pkg/microservice/systemconfig/core/email/handler/router.go index 9f844c7a5..f8e2a8ec1 100644 --- a/pkg/microservice/systemconfig/core/email/handler/router.go +++ b/pkg/microservice/systemconfig/core/email/handler/router.go @@ -14,6 +14,8 @@ func (*Router) Inject(router *gin.RouterGroup) { emails.PATCH("/host", UpdateEmailHost) emails.DELETE("/host", DeleteEmailHost) + emails.GET("/internal/host", InternalGetEmailHost) + emails.GET("/service", GetEmailService) emails.POST("/service", CreateEmailService) emails.PATCH("/service", UpdateEmailService) diff --git a/pkg/microservice/systemconfig/core/email/repository/mongo/emailhost.go b/pkg/microservice/systemconfig/core/email/repository/mongo/emailhost.go index d2ca4f3b8..e5caea073 100644 --- a/pkg/microservice/systemconfig/core/email/repository/mongo/emailhost.go +++ b/pkg/microservice/systemconfig/core/email/repository/mongo/emailhost.go @@ -43,7 +43,6 @@ func (c *EmailHostColl) Find() (*models.EmailHost, error) { if err != nil { return nil, nil } - emailHost.Password = "***" return emailHost, nil } diff --git a/pkg/microservice/systemconfig/core/email/service/email.go b/pkg/microservice/systemconfig/core/email/service/email.go index 1321afad9..333f7af01 100644 --- a/pkg/microservice/systemconfig/core/email/service/email.go +++ b/pkg/microservice/systemconfig/core/email/service/email.go @@ -11,6 +11,14 @@ func GetEmailHost(_ *zap.SugaredLogger) (*models.EmailHost, error) { return mongo2.NewEmailHostColl().Find() } +func InternalGetEmailHost(_ *zap.SugaredLogger) (*models.EmailHost, error) { + host, err := mongo2.NewEmailHostColl().Find() + if err != nil { + host.Password = "***" + } + return host, err +} + func CreateEmailHost(emailHost *models.EmailHost, _ *zap.SugaredLogger) (*models.EmailHost, error) { return mongo2.NewEmailHostColl().Add(emailHost) } -- Gitee From 3371a7a5bc4b04b4f45ad3dc95d1a439aed7b4fc Mon Sep 17 00:00:00 2001 From: mouuii Date: Fri, 5 Nov 2021 11:03:42 +0800 Subject: [PATCH 249/405] refactor Signed-off-by: mouuii --- .../systemconfig/core/email/service/email.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pkg/microservice/systemconfig/core/email/service/email.go b/pkg/microservice/systemconfig/core/email/service/email.go index 333f7af01..89e1c997a 100644 --- a/pkg/microservice/systemconfig/core/email/service/email.go +++ b/pkg/microservice/systemconfig/core/email/service/email.go @@ -8,17 +8,17 @@ import ( ) func GetEmailHost(_ *zap.SugaredLogger) (*models.EmailHost, error) { - return mongo2.NewEmailHostColl().Find() -} - -func InternalGetEmailHost(_ *zap.SugaredLogger) (*models.EmailHost, error) { host, err := mongo2.NewEmailHostColl().Find() - if err != nil { + if host != nil { host.Password = "***" } return host, err } +func InternalGetEmailHost(_ *zap.SugaredLogger) (*models.EmailHost, error) { + return mongo2.NewEmailHostColl().Find() +} + func CreateEmailHost(emailHost *models.EmailHost, _ *zap.SugaredLogger) (*models.EmailHost, error) { return mongo2.NewEmailHostColl().Add(emailHost) } -- Gitee From 1914b916bd232a287f3505a156f6f6785e3611b5 Mon Sep 17 00:00:00 2001 From: Guang Jiong Lou <7991675+27149chen@users.noreply.github.com> Date: Fri, 5 Nov 2021 11:19:50 +0800 Subject: [PATCH 250/405] create project with admins (#539) Signed-off-by: lou --- .../repository/models/template/product.go | 4 -- .../repository/mongodb/template/product.go | 3 -- .../picket/core/filter/handler/project.go | 9 +--- .../picket/core/filter/service/project.go | 43 ++++++++++++++----- .../core/repository/mongodb/role_binding.go | 17 +++++++- .../policy/core/service/role_binding.go | 26 ++++++++++- pkg/setting/consts.go | 1 + 7 files changed, 76 insertions(+), 27 deletions(-) diff --git a/pkg/microservice/aslan/core/common/repository/models/template/product.go b/pkg/microservice/aslan/core/common/repository/models/template/product.go index eadcc5b93..64940bca6 100644 --- a/pkg/microservice/aslan/core/common/repository/models/template/product.go +++ b/pkg/microservice/aslan/core/common/repository/models/template/product.go @@ -29,8 +29,6 @@ type Product struct { ProductName string `bson:"product_name" json:"product_name"` Revision int64 `bson:"revision" json:"revision"` CreateTime int64 `bson:"create_time" json:"create_time"` - Teams []*Team `bson:"teams" json:"teams"` - Team string `bson:"team" json:"team"` UpdateTime int64 `bson:"update_time" json:"update_time"` UpdateBy string `bson:"update_by" json:"update_by"` Enabled bool `bson:"enabled" json:"enabled"` @@ -41,8 +39,6 @@ type Product struct { Vars []*RenderKV `bson:"vars" json:"vars"` EnvVars []*EnvRenderKV `bson:"-" json:"env_vars,omitempty"` ChartInfos []*RenderChart `bson:"-" json:"chart_infos,omitempty"` - UserIDs []string `bson:"user_ids" json:"user_ids"` - TeamID int `bson:"team_id" json:"team_id"` Description string `bson:"description,omitempty" json:"desc,omitempty"` ProductFeature *ProductFeature `bson:"product_feature,omitempty" json:"product_feature,omitempty"` ImageSearchingRules []*ImageSearchingRule `bson:"image_searching_rules,omitempty" json:"image_searching_rules,omitempty"` diff --git a/pkg/microservice/aslan/core/common/repository/mongodb/template/product.go b/pkg/microservice/aslan/core/common/repository/mongodb/template/product.go index 8f76189c9..ca235b6ba 100644 --- a/pkg/microservice/aslan/core/common/repository/mongodb/template/product.go +++ b/pkg/microservice/aslan/core/common/repository/mongodb/template/product.go @@ -246,11 +246,8 @@ func (c *ProductColl) Update(productName string, args *template.Product) error { "services": args.Services, "update_time": time.Now().Unix(), "update_by": args.UpdateBy, - "teams": args.Teams, "enabled": args.Enabled, "description": args.Description, - "user_ids": args.UserIDs, - "team_id": args.TeamID, "timeout": args.Timeout, "shared_services": args.SharedServices, "image_searching_rules": args.ImageSearchingRules, diff --git a/pkg/microservice/picket/core/filter/handler/project.go b/pkg/microservice/picket/core/filter/handler/project.go index 5e8097f08..c52600547 100644 --- a/pkg/microservice/picket/core/filter/handler/project.go +++ b/pkg/microservice/picket/core/filter/handler/project.go @@ -16,23 +16,18 @@ func ListProjects(c *gin.Context) { ctx.Resp, ctx.Err = service.ListProjects(c.Request.Header, c.Request.URL.Query(), ctx.Logger) } -type CreateProjectReq struct { - Public bool `json:"public"` - ProductName string `json:"product_name"` -} - func CreateProject(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - args := new(CreateProjectReq) + args := &service.CreateProjectArgs{} if err := c.ShouldBindBodyWith(args, binding.JSON); err != nil { ctx.Err = e.ErrInvalidParam.AddErr(err).AddDesc("invalid CreateProjectReq") return } body := getReqBody(c) - ctx.Resp, ctx.Err = service.CreateProject(c.Request.Header, body, c.Request.URL.Query(), args.ProductName, args.Public, ctx.Logger) + ctx.Resp, ctx.Err = service.CreateProject(c.Request.Header, body, c.Request.URL.Query(), args, ctx.Logger) } func getReqBody(c *gin.Context) (body []byte) { diff --git a/pkg/microservice/picket/core/filter/service/project.go b/pkg/microservice/picket/core/filter/service/project.go index b76650b75..1b0d45c6a 100644 --- a/pkg/microservice/picket/core/filter/service/project.go +++ b/pkg/microservice/picket/core/filter/service/project.go @@ -15,30 +15,53 @@ import ( "github.com/koderover/zadig/pkg/tool/log" ) +type CreateProjectArgs struct { + Public bool `json:"public"` + ProductName string `json:"product_name"` + Admins []string `json:"admins"` +} + type allowedProjectsData struct { Result []string `json:"result"` } -func CreateProject(header http.Header, body []byte, qs url.Values, projectName string, public bool, logger *zap.SugaredLogger) ([]byte, error) { - // role binding - roleBindingName := fmt.Sprintf(setting.RoleBindingNameFmt, "*", setting.ReadOnly, projectName) - if public { - if err := policy.NewDefault().CreateOrUpdateRoleBinding(projectName, &policy.RoleBinding{ +func CreateProject(header http.Header, body []byte, qs url.Values, args *CreateProjectArgs, logger *zap.SugaredLogger) ([]byte, error) { + var rbs []*policy.RoleBinding + for _, uid := range args.Admins { + roleBindingName := fmt.Sprintf(setting.RoleBindingNameFmt, uid, setting.Admin, args.ProductName) + rbs = append(rbs, &policy.RoleBinding{ + Name: roleBindingName, + UID: uid, + Role: string(setting.Admin), + Public: true, + }) + } + + if args.Public { + roleBindingName := fmt.Sprintf(setting.RoleBindingNameFmt, "*", setting.ReadOnly, args.ProductName) + rbs = append(rbs, &policy.RoleBinding{ Name: roleBindingName, UID: "*", Role: string(setting.ReadOnly), Public: true, - }); err != nil { - logger.Errorf("Failed to create rolebinding %s, err: %s", roleBindingName, err) + }) + } + + policyClient := policy.NewDefault() + for _, rb := range rbs { + if err := policyClient.CreateOrUpdateRoleBinding(args.ProductName, rb); err != nil { + logger.Errorf("Failed to create rolebinding %s, err: %s", rb.Name, err) return nil, err } } res, err := aslan.New().CreateProject(header, qs, body) if err != nil { - logger.Errorf("Failed to create project %s, err: %s", projectName, err) - if err1 := policy.NewDefault().DeleteRoleBinding(roleBindingName, projectName); err1 != nil { - logger.Errorf("Failed to delete role binding, err: %s", err1) + logger.Errorf("Failed to create project %s, err: %s", args.ProductName, err) + for _, rb := range rbs { + if err1 := policyClient.DeleteRoleBinding(rb.Name, args.ProductName); err1 != nil { + logger.Errorf("Failed to create rolebinding %s, err: %s", rb.Name, err1) + } } return nil, err diff --git a/pkg/microservice/policy/core/repository/mongodb/role_binding.go b/pkg/microservice/policy/core/repository/mongodb/role_binding.go index 9174fdeb9..b3fae0bbb 100644 --- a/pkg/microservice/policy/core/repository/mongodb/role_binding.go +++ b/pkg/microservice/policy/core/repository/mongodb/role_binding.go @@ -29,6 +29,10 @@ import ( mongotool "github.com/koderover/zadig/pkg/tool/mongo" ) +type ListOptions struct { + RoleName, RoleNamespace string +} + type RoleBindingColl struct { *mongo.Collection @@ -61,11 +65,20 @@ func (c *RoleBindingColl) EnsureIndex(ctx context.Context) error { return err } -func (c *RoleBindingColl) List() ([]*models.RoleBinding, error) { +func (c *RoleBindingColl) List(opts ...*ListOptions) ([]*models.RoleBinding, error) { var res []*models.RoleBinding ctx := context.Background() - cursor, err := c.Collection.Find(ctx, bson.M{}) + query := bson.M{} + if len(opts) > 0 { + opt := opts[0] + if opt.RoleName != "" { + query["role_ref.name"] = opt.RoleName + query["role_ref.namespace"] = opt.RoleNamespace + } + } + + cursor, err := c.Collection.Find(ctx, query) if err != nil { return nil, err } diff --git a/pkg/microservice/policy/core/service/role_binding.go b/pkg/microservice/policy/core/service/role_binding.go index c3509eb48..44606ea10 100644 --- a/pkg/microservice/policy/core/service/role_binding.go +++ b/pkg/microservice/policy/core/service/role_binding.go @@ -77,7 +77,31 @@ func ListRoleBindings(ns, uid string, _ *zap.SugaredLogger) ([]*RoleBinding, err Name: v.Name, Role: v.RoleRef.Name, UID: v.Subjects[0].UID, - Public: v.Namespace == "", + Public: v.RoleRef.Namespace == "", + }) + } + + return roleBindings, nil +} + +func ListRoleBindingsByRole(ns, roleName string, publicRole bool, _ *zap.SugaredLogger) ([]*RoleBinding, error) { + var roleBindings []*RoleBinding + + roleNamespace := ns + if publicRole { + roleNamespace = "" + } + modelRoleBindings, err := mongodb.NewRoleBindingColl().List(&mongodb.ListOptions{RoleName: roleName, RoleNamespace: roleNamespace}) + if err != nil { + return nil, err + } + + for _, v := range modelRoleBindings { + roleBindings = append(roleBindings, &RoleBinding{ + Name: v.Name, + Role: v.RoleRef.Name, + UID: v.Subjects[0].UID, + Public: v.RoleRef.Namespace == "", }) } diff --git a/pkg/setting/consts.go b/pkg/setting/consts.go index 8603a63b3..0382b09ac 100644 --- a/pkg/setting/consts.go +++ b/pkg/setting/consts.go @@ -540,6 +540,7 @@ type RoleType string const ( Contributor RoleType = "contributor" ReadOnly RoleType = "readonly" + Admin RoleType = "admin" RoleBindingNameFmt string = "user:%s,role:%s,project:%s" ) -- Gitee From 2ee51fb15673b544c9e20ca5431bd67f0b13ad6c Mon Sep 17 00:00:00 2001 From: mouuii <49775493+mouuii@users.noreply.github.com> Date: Fri, 5 Nov 2021 12:46:19 +0800 Subject: [PATCH 251/405] refactor (#540) Signed-off-by: mouuii Co-authored-by: mouuii --- .../repository/{mongo => mongodb}/codehost.go | 2 +- .../core/codehost/service/codehost.go | 6 +++--- .../{mongo => mongodb}/emailhost.go | 2 +- .../{mongo => mongodb}/emailservice.go | 2 +- .../systemconfig/core/email/service/email.go | 20 +++++++++---------- .../repository/{mongo => mongodb}/jira.go | 2 +- .../systemconfig/core/jira/service/jira.go | 10 +++++----- pkg/microservice/systemconfig/core/service.go | 4 ++-- 8 files changed, 24 insertions(+), 24 deletions(-) rename pkg/microservice/systemconfig/core/codehost/repository/{mongo => mongodb}/codehost.go (99%) rename pkg/microservice/systemconfig/core/email/repository/{mongo => mongodb}/emailhost.go (99%) rename pkg/microservice/systemconfig/core/email/repository/{mongo => mongodb}/emailservice.go (99%) rename pkg/microservice/systemconfig/core/jira/repository/{mongo => mongodb}/jira.go (99%) diff --git a/pkg/microservice/systemconfig/core/codehost/repository/mongo/codehost.go b/pkg/microservice/systemconfig/core/codehost/repository/mongodb/codehost.go similarity index 99% rename from pkg/microservice/systemconfig/core/codehost/repository/mongo/codehost.go rename to pkg/microservice/systemconfig/core/codehost/repository/mongodb/codehost.go index 15d629425..cd592593f 100644 --- a/pkg/microservice/systemconfig/core/codehost/repository/mongo/codehost.go +++ b/pkg/microservice/systemconfig/core/codehost/repository/mongodb/codehost.go @@ -1,4 +1,4 @@ -package mongo +package mongodb import ( "context" diff --git a/pkg/microservice/systemconfig/core/codehost/service/codehost.go b/pkg/microservice/systemconfig/core/codehost/service/codehost.go index 5b0b3e280..16f740c0d 100644 --- a/pkg/microservice/systemconfig/core/codehost/service/codehost.go +++ b/pkg/microservice/systemconfig/core/codehost/service/codehost.go @@ -4,13 +4,13 @@ import ( "go.uber.org/zap" "github.com/koderover/zadig/pkg/microservice/systemconfig/core/codehost/repository/models" - "github.com/koderover/zadig/pkg/microservice/systemconfig/core/codehost/repository/mongo" + "github.com/koderover/zadig/pkg/microservice/systemconfig/core/codehost/repository/mongodb" ) func CreateCodehost(codehost *models.CodeHost, _ *zap.SugaredLogger) (*models.CodeHost, error) { - return mongo.NewCodehostColl().AddCodeHost(codehost) + return mongodb.NewCodehostColl().AddCodeHost(codehost) } func FindCodehost(_ *zap.SugaredLogger) ([]*models.CodeHost, error) { - return mongo.NewCodehostColl().FindCodeHosts() + return mongodb.NewCodehostColl().FindCodeHosts() } diff --git a/pkg/microservice/systemconfig/core/email/repository/mongo/emailhost.go b/pkg/microservice/systemconfig/core/email/repository/mongodb/emailhost.go similarity index 99% rename from pkg/microservice/systemconfig/core/email/repository/mongo/emailhost.go rename to pkg/microservice/systemconfig/core/email/repository/mongodb/emailhost.go index e5caea073..666b00e07 100644 --- a/pkg/microservice/systemconfig/core/email/repository/mongo/emailhost.go +++ b/pkg/microservice/systemconfig/core/email/repository/mongodb/emailhost.go @@ -1,4 +1,4 @@ -package mongo +package mongodb import ( "context" diff --git a/pkg/microservice/systemconfig/core/email/repository/mongo/emailservice.go b/pkg/microservice/systemconfig/core/email/repository/mongodb/emailservice.go similarity index 99% rename from pkg/microservice/systemconfig/core/email/repository/mongo/emailservice.go rename to pkg/microservice/systemconfig/core/email/repository/mongodb/emailservice.go index b8f366a74..14395a209 100644 --- a/pkg/microservice/systemconfig/core/email/repository/mongo/emailservice.go +++ b/pkg/microservice/systemconfig/core/email/repository/mongodb/emailservice.go @@ -1,4 +1,4 @@ -package mongo +package mongodb import ( "context" diff --git a/pkg/microservice/systemconfig/core/email/service/email.go b/pkg/microservice/systemconfig/core/email/service/email.go index 89e1c997a..75d6be879 100644 --- a/pkg/microservice/systemconfig/core/email/service/email.go +++ b/pkg/microservice/systemconfig/core/email/service/email.go @@ -4,11 +4,11 @@ import ( "go.uber.org/zap" "github.com/koderover/zadig/pkg/microservice/systemconfig/core/email/repository/models" - mongo2 "github.com/koderover/zadig/pkg/microservice/systemconfig/core/email/repository/mongo" + "github.com/koderover/zadig/pkg/microservice/systemconfig/core/email/repository/mongodb" ) func GetEmailHost(_ *zap.SugaredLogger) (*models.EmailHost, error) { - host, err := mongo2.NewEmailHostColl().Find() + host, err := mongodb.NewEmailHostColl().Find() if host != nil { host.Password = "***" } @@ -16,33 +16,33 @@ func GetEmailHost(_ *zap.SugaredLogger) (*models.EmailHost, error) { } func InternalGetEmailHost(_ *zap.SugaredLogger) (*models.EmailHost, error) { - return mongo2.NewEmailHostColl().Find() + return mongodb.NewEmailHostColl().Find() } func CreateEmailHost(emailHost *models.EmailHost, _ *zap.SugaredLogger) (*models.EmailHost, error) { - return mongo2.NewEmailHostColl().Add(emailHost) + return mongodb.NewEmailHostColl().Add(emailHost) } func UpdateEmailHost(host *models.EmailHost, _ *zap.SugaredLogger) (*models.EmailHost, error) { - return mongo2.NewEmailHostColl().Update(host) + return mongodb.NewEmailHostColl().Update(host) } func DeleteEmailHost(_ *zap.SugaredLogger) error { - return mongo2.NewEmailHostColl().Delete() + return mongodb.NewEmailHostColl().Delete() } func GetEmailService(_ *zap.SugaredLogger) (*models.EmailService, error) { - return mongo2.NewEmailServiceColl().GetEmailService() + return mongodb.NewEmailServiceColl().GetEmailService() } func CreateEmailService(service *models.EmailService, _ *zap.SugaredLogger) (*models.EmailService, error) { - return mongo2.NewEmailServiceColl().AddEmailService(service) + return mongodb.NewEmailServiceColl().AddEmailService(service) } func UpdateEmailService(service *models.EmailService, _ *zap.SugaredLogger) (*models.EmailService, error) { - return mongo2.NewEmailServiceColl().UpdateEmailService(service) + return mongodb.NewEmailServiceColl().UpdateEmailService(service) } func DeleteEmailService(_ *zap.SugaredLogger) error { - return mongo2.NewEmailServiceColl().DeleteEmailService() + return mongodb.NewEmailServiceColl().DeleteEmailService() } diff --git a/pkg/microservice/systemconfig/core/jira/repository/mongo/jira.go b/pkg/microservice/systemconfig/core/jira/repository/mongodb/jira.go similarity index 99% rename from pkg/microservice/systemconfig/core/jira/repository/mongo/jira.go rename to pkg/microservice/systemconfig/core/jira/repository/mongodb/jira.go index e49a5fbdd..acefdbd43 100644 --- a/pkg/microservice/systemconfig/core/jira/repository/mongo/jira.go +++ b/pkg/microservice/systemconfig/core/jira/repository/mongodb/jira.go @@ -1,4 +1,4 @@ -package mongo +package mongodb import ( "context" diff --git a/pkg/microservice/systemconfig/core/jira/service/jira.go b/pkg/microservice/systemconfig/core/jira/service/jira.go index 59e75090d..5428837ec 100644 --- a/pkg/microservice/systemconfig/core/jira/service/jira.go +++ b/pkg/microservice/systemconfig/core/jira/service/jira.go @@ -4,21 +4,21 @@ import ( "go.uber.org/zap" "github.com/koderover/zadig/pkg/microservice/systemconfig/core/jira/repository/models" - "github.com/koderover/zadig/pkg/microservice/systemconfig/core/jira/repository/mongo" + "github.com/koderover/zadig/pkg/microservice/systemconfig/core/jira/repository/mongodb" ) func GeJira(_ *zap.SugaredLogger) (*models.Jira, error) { - return mongo.NewJiraColl().GetJira() + return mongodb.NewJiraColl().GetJira() } func CreateJira(jira *models.Jira, _ *zap.SugaredLogger) (*models.Jira, error) { - return mongo.NewJiraColl().AddJira(jira) + return mongodb.NewJiraColl().AddJira(jira) } func UpdateJira(jira *models.Jira, _ *zap.SugaredLogger) (*models.Jira, error) { - return mongo.NewJiraColl().UpdateJira(jira) + return mongodb.NewJiraColl().UpdateJira(jira) } func DeleteJira(_ *zap.SugaredLogger) error { - return mongo.NewJiraColl().DeleteJira() + return mongodb.NewJiraColl().DeleteJira() } diff --git a/pkg/microservice/systemconfig/core/service.go b/pkg/microservice/systemconfig/core/service.go index 94aeadd79..c0aae5ba8 100644 --- a/pkg/microservice/systemconfig/core/service.go +++ b/pkg/microservice/systemconfig/core/service.go @@ -24,7 +24,7 @@ import ( configbase "github.com/koderover/zadig/pkg/config" "github.com/koderover/zadig/pkg/microservice/systemconfig/config" - "github.com/koderover/zadig/pkg/microservice/systemconfig/core/email/repository/mongo" + "github.com/koderover/zadig/pkg/microservice/systemconfig/core/email/repository/mongodb" "github.com/koderover/zadig/pkg/microservice/systemconfig/core/service/featuregates" "github.com/koderover/zadig/pkg/setting" gormtool "github.com/koderover/zadig/pkg/tool/gorm" @@ -66,7 +66,7 @@ func initDatabase() { defer idxCancel() var wg sync.WaitGroup for _, r := range []indexer{ - mongo.NewEmailHostColl(), + mongodb.NewEmailHostColl(), } { wg.Add(1) -- Gitee From e823d32cfc3d6db09e81d958b4d631411d648819 Mon Sep 17 00:00:00 2001 From: Guang Jiong Lou <7991675+27149chen@users.noreply.github.com> Date: Fri, 5 Nov 2021 13:46:44 +0800 Subject: [PATCH 252/405] add new public and admin apis (#541) Signed-off-by: lou --- .../policy/core/service/bundle/exemption_urls.go | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/pkg/microservice/policy/core/service/bundle/exemption_urls.go b/pkg/microservice/policy/core/service/bundle/exemption_urls.go index 6f68587dd..cf86b6ab0 100644 --- a/pkg/microservice/policy/core/service/bundle/exemption_urls.go +++ b/pkg/microservice/policy/core/service/bundle/exemption_urls.go @@ -42,7 +42,7 @@ var publicURLs = []*policyRule{ }, { Methods: []string{"GET", "POST"}, - Endpoints: []string{"login"}, + Endpoints: []string{"api/v1/login", "api/v1/signup", "api/v1/retrieve"}, }, { Methods: []string{"*"}, @@ -56,10 +56,6 @@ var publicURLs = []*policyRule{ Methods: []string{"GET"}, Endpoints: []string{"", "signin", "setup", "loading", "static/**", "v1/**", "mobile/**", "productpipelines/**"}, }, - { - Methods: []string{"GET"}, - Endpoints: []string{"api/directory/check"}, - }, { Methods: []string{"GET"}, Endpoints: []string{"api/directory/codehostss/?*/auth", "api/directory/codehosts/callback"}, @@ -201,7 +197,7 @@ var systemAdminURLs = []*policyRule{ Endpoints: []string{"api/aslan/system/proxy/config"}, }, { - Methods: []string{"GET"}, + Methods: []string{"GET", "DELETE"}, Endpoints: []string{"api/v1/users/?*"}, }, { -- Gitee From ee26041ec138a4917a6aba48dede4e6f8eb75ca6 Mon Sep 17 00:00:00 2001 From: panxunying <641770806@qq.com> Date: Fri, 5 Nov 2021 14:15:24 +0800 Subject: [PATCH 253/405] User email (#543) * change get email from systemconfig and update route api Signed-off-by: panxunying <641770806@qq.com> * optimize Signed-off-by: panxunying <641770806@qq.com> --- pkg/microservice/user/config/config.go | 8 -------- pkg/microservice/user/core/handler/router.go | 10 ++++++++++ .../user/core/service/user/user.go | 16 ++++++++++----- pkg/microservice/user/server/rest/router.go | 9 --------- pkg/setting/consts.go | 20 +++++++++---------- .../client/systemconfig/systemconfig.go | 19 ++++++++++++++++++ 6 files changed, 49 insertions(+), 33 deletions(-) diff --git a/pkg/microservice/user/config/config.go b/pkg/microservice/user/config/config.go index dcc74c8dd..3ca77a217 100644 --- a/pkg/microservice/user/config/config.go +++ b/pkg/microservice/user/config/config.go @@ -56,11 +56,3 @@ func MysqlUserDB() string { func TokenExpiresAt() int { return viper.GetInt(setting.ENVTokenExpiresAt) } - -func NoReplyEmailAddress() string { - return viper.GetString(setting.ENVNoReplyEmailAddress) -} - -func NoReplyEmailPassword() string { - return viper.GetString(setting.ENVNoReplyEmailPassword) -} diff --git a/pkg/microservice/user/core/handler/router.go b/pkg/microservice/user/core/handler/router.go index fdf7fbf85..1b35af75e 100644 --- a/pkg/microservice/user/core/handler/router.go +++ b/pkg/microservice/user/core/handler/router.go @@ -43,5 +43,15 @@ func (*Router) Inject(router *gin.RouterGroup) { users.POST("/users/search", user.ListUsers) users.POST("/users/ldap/:ldapId", user.SyncLdapUser) + + router.GET("login", login.Login) + + router.POST("login", login.LocalLogin) + + router.POST("signup", user.SignUp) + + router.GET("retrieve", user.Retrieve) + + router.POST("reset", user.Reset) } } diff --git a/pkg/microservice/user/core/service/user/user.go b/pkg/microservice/user/core/service/user/user.go index 8bab60479..b9aab9164 100644 --- a/pkg/microservice/user/core/service/user/user.go +++ b/pkg/microservice/user/core/service/user/user.go @@ -319,14 +319,20 @@ func Retrieve(account string, logger *zap.SugaredLogger) (*RetrieveResp, error) logger.Errorf("Retrieve renderEmailTemplate error, error msg:%s ", err) return nil, fmt.Errorf("Retrieve renderEmailTemplate error, error msg:%s ", err) } + systemConfigClient := systemconfig.New() + email, err := systemConfigClient.GetEmailHost() + if err != nil { + logger.Errorf("Retrieve GetEmailHost error, error msg:%s", err) + return nil, fmt.Errorf("Retrieve GetEmailHost error, error msg:%s ", err) + } err = mail.SendEmail(&mail.EmailParams{ - From: config.NoReplyEmailAddress(), + From: email.UserName, To: user.Email, Subject: "重置密码", - Host: config.FeiShuEmailHost, - UserName: config.NoReplyEmailAddress(), - Password: config.NoReplyEmailPassword(), - Port: 465, + Host: email.Name, + UserName: email.UserName, + Password: email.Password, + Port: email.Port, Body: body, }) if err != nil { diff --git a/pkg/microservice/user/server/rest/router.go b/pkg/microservice/user/server/rest/router.go index 1ec76974c..d811f5ba4 100644 --- a/pkg/microservice/user/server/rest/router.go +++ b/pkg/microservice/user/server/rest/router.go @@ -20,18 +20,9 @@ import ( "github.com/gin-gonic/gin" "github.com/koderover/zadig/pkg/microservice/user/core/handler" - "github.com/koderover/zadig/pkg/microservice/user/core/handler/login" - "github.com/koderover/zadig/pkg/microservice/user/core/handler/user" ) func (s *engine) injectRouterGroup(router *gin.RouterGroup) { - { - router.GET("login", login.Login) - router.POST("login", login.LocalLogin) - router.POST("signup", user.SignUp) - router.GET("retrieve", user.Retrieve) - router.POST("reset", user.Reset) - } for name, r := range map[string]injector{ "/api/v1": new(handler.Router), } { diff --git a/pkg/setting/consts.go b/pkg/setting/consts.go index 0382b09ac..26352978f 100644 --- a/pkg/setting/consts.go +++ b/pkg/setting/consts.go @@ -104,17 +104,15 @@ const ( TestMode = "test" // user - ENVIssuerURL = "ISSUER_URL" - ENVClientID = "CLIENT_ID" - ENVClientSecret = "CLIENT_SECRET" - ENVRedirectURI = "REDIRECT_URI" - ENVSecretKey = "SECRET_KEY" - ENVMysqlUserDB = "MYSQL_USER_DB" - ENVScopes = "SCOPES" - ENVTokenExpiresAt = "TOKEN_EXPIRES_AT" - ENVNoReplyEmailAddress = "NOREPLY_EMAIL_ADDRESS" - ENVNoReplyEmailPassword = "NOREPLY_EMAIL_PASSWORD" - ENVUserPort = "USER_PORT" + ENVIssuerURL = "ISSUER_URL" + ENVClientID = "CLIENT_ID" + ENVClientSecret = "CLIENT_SECRET" + ENVRedirectURI = "REDIRECT_URI" + ENVSecretKey = "SECRET_KEY" + ENVMysqlUserDB = "MYSQL_USER_DB" + ENVScopes = "SCOPES" + ENVTokenExpiresAt = "TOKEN_EXPIRES_AT" + ENVUserPort = "USER_PORT" // initconfig ENVAdminEmail = "ADMIN_EMAIL" diff --git a/pkg/shared/client/systemconfig/systemconfig.go b/pkg/shared/client/systemconfig/systemconfig.go index caf958e3d..818a03824 100644 --- a/pkg/shared/client/systemconfig/systemconfig.go +++ b/pkg/shared/client/systemconfig/systemconfig.go @@ -13,6 +13,13 @@ type Connector struct { Config *ldap.Config `json:"config"` } +type Email struct { + Name string `json:"name"` + Port int `json:"port"` + UserName string `json:"username"` + Password string `json:"password"` +} + func (c *Client) GetLDAPConnector(id string) (*Connector, error) { url := "/connectors/" + id @@ -24,3 +31,15 @@ func (c *Client) GetLDAPConnector(id string) (*Connector, error) { return res, err } + +func (c *Client) GetEmailHost() (*Email, error) { + url := "/emails/internal/host/" + + res := &Email{} + _, err := c.Get(url, httpclient.SetResult(res)) + if err != nil { + return nil, err + } + + return res, err +} -- Gitee From 7b9a455e09fb70483252a4289516321caed26e8f Mon Sep 17 00:00:00 2001 From: mouuii Date: Fri, 5 Nov 2021 14:43:59 +0800 Subject: [PATCH 254/405] add codehost Signed-off-by: mouuii --- .../core/codehost/handler/codehost.go | 22 ++++++++++--- .../core/codehost/handler/router.go | 4 ++- .../codehost/repository/mongodb/codehost.go | 31 +++++++++++++++++++ .../core/codehost/service/codehost.go | 12 +++++-- 4 files changed, 62 insertions(+), 7 deletions(-) diff --git a/pkg/microservice/systemconfig/core/codehost/handler/codehost.go b/pkg/microservice/systemconfig/core/codehost/handler/codehost.go index 8cdc2ad46..90f93654c 100644 --- a/pkg/microservice/systemconfig/core/codehost/handler/codehost.go +++ b/pkg/microservice/systemconfig/core/codehost/handler/codehost.go @@ -1,6 +1,8 @@ package handler import ( + "strconv" + "github.com/gin-gonic/gin" "github.com/koderover/zadig/pkg/microservice/systemconfig/core/codehost/repository/models" @@ -8,7 +10,7 @@ import ( internalhandler "github.com/koderover/zadig/pkg/shared/handler" ) -func CreateCodehost(c *gin.Context) { +func CreateCodeHost(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() rep := new(models.CodeHost) @@ -16,11 +18,23 @@ func CreateCodehost(c *gin.Context) { ctx.Err = err return } - ctx.Resp, ctx.Err = service.CreateCodehost(rep, ctx.Logger) + ctx.Resp, ctx.Err = service.CreateCodeHost(rep, ctx.Logger) +} + +func ListCodeHost(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + ctx.Resp, ctx.Err = service.FindCodeHost(ctx.Logger) } -func ListCodehost(c *gin.Context) { +func DeleteCodeHost(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - ctx.Resp, ctx.Err = service.FindCodehost(ctx.Logger) + idParam := c.Param("id") + id, err := strconv.Atoi(idParam) + if err != nil { + ctx.Err = err + return + } + ctx.Err = service.DeleteCodeHost(id, ctx.Logger) } diff --git a/pkg/microservice/systemconfig/core/codehost/handler/router.go b/pkg/microservice/systemconfig/core/codehost/handler/router.go index 5db3c015b..744879575 100644 --- a/pkg/microservice/systemconfig/core/codehost/handler/router.go +++ b/pkg/microservice/systemconfig/core/codehost/handler/router.go @@ -9,6 +9,8 @@ type Router struct{} func (*Router) Inject(router *gin.RouterGroup) { codehost := router.Group("codehost") { - codehost.POST("", ListCodehost) + codehost.GET("", ListCodeHost) + codehost.DELETE("/:id", DeleteCodeHost) + codehost.POST("", CreateCodeHost) } } diff --git a/pkg/microservice/systemconfig/core/codehost/repository/mongodb/codehost.go b/pkg/microservice/systemconfig/core/codehost/repository/mongodb/codehost.go index cd592593f..855df2c70 100644 --- a/pkg/microservice/systemconfig/core/codehost/repository/mongodb/codehost.go +++ b/pkg/microservice/systemconfig/core/codehost/repository/mongodb/codehost.go @@ -82,3 +82,34 @@ func (c *CodehostColl) FindCodeHosts() ([]*models.CodeHost, error) { } return codeHosts, nil } + +func (c *CodehostColl) DeleteCodeHostByID(ID int) error { + query := bson.M{"id": ID, "deleted_at": 0} + change := bson.M{"$set": bson.M{ + "deleted_at": time.Now().Unix(), + }} + _, err := c.Collection.UpdateOne(context.TODO(), query, change) + if err != nil { + log.Error("repository update fail") + return err + } + return nil +} + +func (c *CodehostColl) UpdateCodeHost(host *models.CodeHost) (*models.CodeHost, error) { + query := bson.M{"id": host.ID, "deleted_at": 0} + change := bson.M{"$set": bson.M{ + "name": host.Name, + "type": host.Type, + "address": host.Address, + "namespace": host.Namespace, + "application_id": host.ApplicationId, + "client_secret": host.ClientSecret, + "region": host.Region, + "username": host.Username, + "password": host.Password, + "updated_at": time.Now().Unix(), + }} + _, err := c.Collection.UpdateOne(context.TODO(), query, change) + return host, err +} diff --git a/pkg/microservice/systemconfig/core/codehost/service/codehost.go b/pkg/microservice/systemconfig/core/codehost/service/codehost.go index 16f740c0d..293e90bf5 100644 --- a/pkg/microservice/systemconfig/core/codehost/service/codehost.go +++ b/pkg/microservice/systemconfig/core/codehost/service/codehost.go @@ -7,10 +7,18 @@ import ( "github.com/koderover/zadig/pkg/microservice/systemconfig/core/codehost/repository/mongodb" ) -func CreateCodehost(codehost *models.CodeHost, _ *zap.SugaredLogger) (*models.CodeHost, error) { +func CreateCodeHost(codehost *models.CodeHost, _ *zap.SugaredLogger) (*models.CodeHost, error) { return mongodb.NewCodehostColl().AddCodeHost(codehost) } -func FindCodehost(_ *zap.SugaredLogger) ([]*models.CodeHost, error) { +func FindCodeHost(_ *zap.SugaredLogger) ([]*models.CodeHost, error) { return mongodb.NewCodehostColl().FindCodeHosts() } + +func DeleteCodeHost(id int, _ *zap.SugaredLogger) error { + return mongodb.NewCodehostColl().DeleteCodeHostByID(id) +} + +func UpdateCodeHost(host *models.CodeHost, _ *zap.SugaredLogger) (*models.CodeHost, error) { + return mongodb.NewCodehostColl().UpdateCodeHost(host) +} -- Gitee From 9676de9fc58c1f8b04de501c0c830f5abfc7cbae Mon Sep 17 00:00:00 2001 From: mouuii Date: Fri, 5 Nov 2021 15:08:44 +0800 Subject: [PATCH 255/405] add codehost Signed-off-by: mouuii --- .../core/codehost/handler/codehost.go | 30 +++++++++++++++++++ .../core/codehost/handler/router.go | 2 ++ .../core/codehost/service/codehost.go | 4 +++ 3 files changed, 36 insertions(+) diff --git a/pkg/microservice/systemconfig/core/codehost/handler/codehost.go b/pkg/microservice/systemconfig/core/codehost/handler/codehost.go index 90f93654c..b98565cce 100644 --- a/pkg/microservice/systemconfig/core/codehost/handler/codehost.go +++ b/pkg/microservice/systemconfig/core/codehost/handler/codehost.go @@ -38,3 +38,33 @@ func DeleteCodeHost(c *gin.Context) { } ctx.Err = service.DeleteCodeHost(id, ctx.Logger) } + +func GetCodeHost(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + idParam := c.Param("id") + id, err := strconv.Atoi(idParam) + if err != nil { + ctx.Err = err + return + } + ctx.Resp, ctx.Err = service.GetCodeHost(id, ctx.Logger) +} + +func UpdateCodeHost(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + idParam := c.Param("id") + id, err := strconv.Atoi(idParam) + if err != nil { + ctx.Err = err + return + } + req := &models.CodeHost{} + if err := c.ShouldBindJSON(req); err != nil { + ctx.Err = err + return + } + req.ID = id + ctx.Resp, ctx.Err = service.UpdateCodeHost(req, ctx.Logger) +} diff --git a/pkg/microservice/systemconfig/core/codehost/handler/router.go b/pkg/microservice/systemconfig/core/codehost/handler/router.go index 744879575..e29fa97d2 100644 --- a/pkg/microservice/systemconfig/core/codehost/handler/router.go +++ b/pkg/microservice/systemconfig/core/codehost/handler/router.go @@ -12,5 +12,7 @@ func (*Router) Inject(router *gin.RouterGroup) { codehost.GET("", ListCodeHost) codehost.DELETE("/:id", DeleteCodeHost) codehost.POST("", CreateCodeHost) + codehost.PATCH("/:id", UpdateCodeHost) + codehost.GET("/:id", GetCodeHost) } } diff --git a/pkg/microservice/systemconfig/core/codehost/service/codehost.go b/pkg/microservice/systemconfig/core/codehost/service/codehost.go index 293e90bf5..0cc0c7c56 100644 --- a/pkg/microservice/systemconfig/core/codehost/service/codehost.go +++ b/pkg/microservice/systemconfig/core/codehost/service/codehost.go @@ -22,3 +22,7 @@ func DeleteCodeHost(id int, _ *zap.SugaredLogger) error { func UpdateCodeHost(host *models.CodeHost, _ *zap.SugaredLogger) (*models.CodeHost, error) { return mongodb.NewCodehostColl().UpdateCodeHost(host) } + +func GetCodeHost(id int, _ *zap.SugaredLogger) (*models.CodeHost, error) { + return mongodb.NewCodehostColl().GetCodeHostByID(id) +} -- Gitee From fc5160eec4203b9e3d912e509f996f558ba917b3 Mon Sep 17 00:00:00 2001 From: mouuii <49775493+mouuii@users.noreply.github.com> Date: Fri, 5 Nov 2021 16:45:18 +0800 Subject: [PATCH 256/405] add check (#547) * add check Signed-off-by: mouuii * add check Signed-off-by: mouuii Co-authored-by: mouuii --- .../systemconfig/core/email/handler/email.go | 2 -- .../core/email/repository/mongodb/emailhost.go | 17 ++++++++++++++++- .../email/repository/mongodb/emailservice.go | 17 ++++++++++++++++- 3 files changed, 32 insertions(+), 4 deletions(-) diff --git a/pkg/microservice/systemconfig/core/email/handler/email.go b/pkg/microservice/systemconfig/core/email/handler/email.go index e7c911e76..fbb3432ca 100644 --- a/pkg/microservice/systemconfig/core/email/handler/email.go +++ b/pkg/microservice/systemconfig/core/email/handler/email.go @@ -48,8 +48,6 @@ func DeleteEmailHost(c *gin.Context) { ctx.Err = service.DeleteEmailHost(ctx.Logger) } -//// - func GetEmailService(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() diff --git a/pkg/microservice/systemconfig/core/email/repository/mongodb/emailhost.go b/pkg/microservice/systemconfig/core/email/repository/mongodb/emailhost.go index 666b00e07..9d16d3437 100644 --- a/pkg/microservice/systemconfig/core/email/repository/mongodb/emailhost.go +++ b/pkg/microservice/systemconfig/core/email/repository/mongodb/emailhost.go @@ -2,6 +2,7 @@ package mongodb import ( "context" + "errors" "time" "go.mongodb.org/mongo-driver/bson" @@ -80,8 +81,22 @@ func (c *EmailHostColl) Delete() error { } func (c *EmailHostColl) Add(emailHost *models.EmailHost) (*models.EmailHost, error) { + // TODO: tmp solution to avoid bug + var res []*models.EmailHost + query := bson.M{"deleted_at": 0} + cur, err := c.Collection.Find(context.TODO(), query) + if err != nil { + return nil, err + } + err = cur.All(context.TODO(), &res) + if err != nil { + return nil, err + } + if len(res) >= 1 { + return nil, errors.New("cant add more than one emailhost") + } - _, err := c.Collection.InsertOne(context.TODO(), emailHost) + _, err = c.Collection.InsertOne(context.TODO(), emailHost) if err != nil { log.Error("repository AddEmailHost err : %v", err) return nil, err diff --git a/pkg/microservice/systemconfig/core/email/repository/mongodb/emailservice.go b/pkg/microservice/systemconfig/core/email/repository/mongodb/emailservice.go index 14395a209..6f8c0b44c 100644 --- a/pkg/microservice/systemconfig/core/email/repository/mongodb/emailservice.go +++ b/pkg/microservice/systemconfig/core/email/repository/mongodb/emailservice.go @@ -2,6 +2,7 @@ package mongodb import ( "context" + "errors" "time" "go.mongodb.org/mongo-driver/bson" @@ -34,8 +35,22 @@ func (c *EmailServiceColl) EnsureIndex(ctx context.Context) error { } func (c *EmailServiceColl) AddEmailService(iEmailService *models.EmailService) (*models.EmailService, error) { + // TODO: tmp solution to avoid bug + var res []*models.EmailService + query := bson.M{"deleted_at": 0} + cur, err := c.Collection.Find(context.TODO(), query) + if err != nil { + return nil, err + } + err = cur.All(context.TODO(), &res) + if err != nil { + return nil, err + } + if len(res) >= 1 { + return nil, errors.New("cant add more than one emailservice") + } - _, err := c.Collection.InsertOne(context.TODO(), iEmailService) + _, err = c.Collection.InsertOne(context.TODO(), iEmailService) if err != nil { log.Error("repository AddEmailService err : %v", err) return nil, err -- Gitee From 8c1ee6fc27b729d33a03b1439e211e8355f0c5f0 Mon Sep 17 00:00:00 2001 From: Guang Jiong Lou <7991675+27149chen@users.noreply.github.com> Date: Fri, 5 Nov 2021 18:15:48 +0800 Subject: [PATCH 257/405] support token in qs (#548) Signed-off-by: lou --- .../aslan/core/environment/handler/policy.yaml | 2 +- .../policy/core/service/bundle/rego/authz.rego | 11 ++++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/pkg/microservice/aslan/core/environment/handler/policy.yaml b/pkg/microservice/aslan/core/environment/handler/policy.yaml index 1fe633c7b..5ff750e69 100644 --- a/pkg/microservice/aslan/core/environment/handler/policy.yaml +++ b/pkg/microservice/aslan/core/environment/handler/policy.yaml @@ -78,7 +78,7 @@ rules: endpoint: "/api/aslan/environment/environments/?*/services/?*/scale/?*" - method: POST endpoint: "/api/aslan/environment/environments/?*/services/?*/scaleNew/?*" - - method: PUT + - method: GET endpoint: " /api/podexec/?*/?*/?*/?*/podExec" - action: delete_environment alias: "删除集成环境" diff --git a/pkg/microservice/policy/core/service/bundle/rego/authz.rego b/pkg/microservice/policy/core/service/bundle/rego/authz.rego index bac66f0b1..48a8cdcd1 100644 --- a/pkg/microservice/policy/core/service/bundle/rego/authz.rego +++ b/pkg/microservice/policy/core/service/bundle/rego/authz.rego @@ -216,7 +216,7 @@ claims := payload { # }) } -bearer_token := t { +bearer_token_in_header := t { # Bearer tokens are contained inside of the HTTP Authorization header. This rule # parses the header and extracts the Bearer token value. If no Bearer token is # provided, the `bearer_token` value is undefined. @@ -225,6 +225,15 @@ bearer_token := t { t := substring(v, count("Bearer "), -1) } +bearer_token = t { + t := bearer_token_in_header +} + +bearer_token = t { + not bearer_token_in_header + t := input.parsed_query.token[0] +} + is_authenticated { claims claims.uid != "" -- Gitee From 8a2fa59767468f60b11618b727251b61e2f73ce4 Mon Sep 17 00:00:00 2001 From: lou Date: Fri, 5 Nov 2021 19:16:07 +0800 Subject: [PATCH 258/405] fix conflict Signed-off-by: lou --- .../repository/mongodb/template/product.go | 42 ---------------- .../core/common/service/config_payload.go | 1 - .../core/environment/handler/environment.go | 8 --- .../core/environment/service/environment.go | 49 ------------------- .../aslan/core/project/handler/product.go | 13 ----- .../aslan/core/project/service/product.go | 12 ----- .../aslan/core/service/handler/helm.go | 14 ------ .../aslan/core/service/handler/router.go | 6 --- .../aslan/core/service/service/helm.go | 1 - .../aslan/core/system/handler/s3.go | 17 ------- .../aslan/core/templatestore/service/yaml.go | 1 - 11 files changed, 164 deletions(-) diff --git a/pkg/microservice/aslan/core/common/repository/mongodb/template/product.go b/pkg/microservice/aslan/core/common/repository/mongodb/template/product.go index 45444f452..c5d232276 100644 --- a/pkg/microservice/aslan/core/common/repository/mongodb/template/product.go +++ b/pkg/microservice/aslan/core/common/repository/mongodb/template/product.go @@ -266,48 +266,6 @@ type ProductArgs struct { UpdateBy string `json:"update_by"` } -// UpdateServiceOrder existing ProductTmpl -func (c *ProductColl) UpdateServiceOrder(args *ProductArgs) error { - // avoid panic issue - if args == nil { - return errors.New("nil product args") - } - - query := bson.M{"product_name": args.ProductName} - change := bson.M{"$set": bson.M{ - "services": args.Services, - "update_time": time.Now().Unix(), - "update_by": args.UpdateBy, - }} - - _, err := c.UpdateOne(context.TODO(), query, change) - return err -} - -type ProductArgs struct { - ProductName string `json:"product_name"` - Services [][]string `json:"services"` - UpdateBy string `json:"update_by"` -} - -// UpdateServiceOrder existing ProductTmpl -func (c *ProductColl) UpdateServiceOrder(args *ProductArgs) error { - // avoid panic issue - if args == nil { - return errors.New("nil product args") - } - - query := bson.M{"product_name": args.ProductName} - change := bson.M{"$set": bson.M{ - "services": args.Services, - "update_time": time.Now().Unix(), - "update_by": args.UpdateBy, - }} - - _, err := c.UpdateOne(context.TODO(), query, change) - return err -} - // AddService adds a service to services[0] if it is not there. func (c *ProductColl) AddService(productName, serviceName string) error { diff --git a/pkg/microservice/aslan/core/common/service/config_payload.go b/pkg/microservice/aslan/core/common/service/config_payload.go index ec01b0c7d..7c15bd52d 100644 --- a/pkg/microservice/aslan/core/common/service/config_payload.go +++ b/pkg/microservice/aslan/core/common/service/config_payload.go @@ -26,7 +26,6 @@ import ( func GetConfigPayload(codeHostID int) *models.ConfigPayload { payload := &models.ConfigPayload{ - APIToken: config.PoetryAPIRootKey(), S3Storage: models.S3Config{ Ak: config.S3StorageAK(), Sk: config.S3StorageSK(), diff --git a/pkg/microservice/aslan/core/environment/handler/environment.go b/pkg/microservice/aslan/core/environment/handler/environment.go index f7de917f3..7e8edcbac 100644 --- a/pkg/microservice/aslan/core/environment/handler/environment.go +++ b/pkg/microservice/aslan/core/environment/handler/environment.go @@ -71,14 +71,6 @@ func GetProductStatus(c *gin.Context) { ctx.Resp, ctx.Err = service.GetProductStatus(c.Param("productName"), ctx.Logger) } -// GetProductStatus List product status -func GetProductStatus(c *gin.Context) { - ctx := internalhandler.NewContext(c) - defer func() { internalhandler.JSONResponse(c, ctx) }() - - ctx.Resp, ctx.Err = service.GetProductStatus(c.Param("productName"), ctx.Logger) -} - func AutoCreateProduct(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() diff --git a/pkg/microservice/aslan/core/environment/service/environment.go b/pkg/microservice/aslan/core/environment/service/environment.go index 8fcfa53ae..e8f7c584d 100644 --- a/pkg/microservice/aslan/core/environment/service/environment.go +++ b/pkg/microservice/aslan/core/environment/service/environment.go @@ -55,7 +55,6 @@ import ( "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/kube" "github.com/koderover/zadig/pkg/setting" "github.com/koderover/zadig/pkg/shared/kube/wrapper" - "github.com/koderover/zadig/pkg/shared/poetry" e "github.com/koderover/zadig/pkg/tool/errors" helmtool "github.com/koderover/zadig/pkg/tool/helmclient" "github.com/koderover/zadig/pkg/tool/kube/getter" @@ -150,13 +149,6 @@ type RawYamlResp struct { type intervalExecutorHandler func(data *commonmodels.Service, log *zap.SugaredLogger) error -func UpdateProductPublic(productName string, args *ProductParams, log *zap.SugaredLogger) error { - err := commonrepo.NewProductColl().UpdateIsPublic(args.EnvName, productName, args.IsPublic) - if err != nil { - log.Errorf("UpdateProductPublic error: %v", err) - return fmt.Errorf("UpdateProductPublic error: %v", err) - } - func GetProductStatus(productName string, log *zap.SugaredLogger) ([]*EnvStatus, error) { products, err := commonrepo.NewProductColl().List(&commonrepo.ProductListOptions{Name: productName}) if err != nil { @@ -164,15 +156,6 @@ func GetProductStatus(productName string, log *zap.SugaredLogger) ([]*EnvStatus, return nil, e.ErrListProducts.AddDesc(err.Error()) } - return nil -} - -func GetProductStatus(productName string, log *zap.SugaredLogger) ([]*EnvStatus, error) { - products, err := commonrepo.NewProductColl().List(&commonrepo.ProductListOptions{Name: productName}) - if err != nil { - log.Errorf("Collection.Product.List List product error: %v", err) - return nil, e.ErrListProducts.AddDesc(err.Error()) - } envStatusSlice := make([]*EnvStatus, 0) for _, publicProduct := range products { if publicProduct.ProductName != productName { @@ -190,38 +173,6 @@ func GetProductStatus(productName string, log *zap.SugaredLogger) ([]*EnvStatus, return envStatusSlice, err } -func ListProducts(productNameParam, envType string, userName string, userID int, superUser bool, log *zap.SugaredLogger) ([]*ProductResp, error) { - var ( - err error - testResp []*ProductResp - prodResp []*ProductResp - products = make([]*commonmodels.Product, 0) - productNameMap map[string][]int64 - productNamespaces = sets.NewString() - ) - resp := make([]*ProductResp, 0) - - poetryCtl := poetry.New(config.PoetryAPIServer(), config.PoetryAPIRootKey()) - - // 获取所有产品 - if superUser { - products, err = commonrepo.NewProductColl().List(&commonrepo.ProductListOptions{Name: productNameParam}) - if err != nil { - log.Errorf("[%s] Collections.Product.List error: %v", userName, err) - return resp, e.ErrListEnvs.AddDesc(err.Error()) - } - envStatus := &EnvStatus{ - EnvName: publicProduct.EnvName, - Status: publicProduct.Status, - } - if len(publicProduct.Error) > 0 { - envStatus.ErrMessage = publicProduct.Error - } - envStatusSlice = append(envStatusSlice, envStatus) - } - return envStatusSlice, err -} - func ListProducts(productNameParam string, userName string, log *zap.SugaredLogger) (resp []*ProductResp, err error) { products, err := commonrepo.NewProductColl().List(&commonrepo.ProductListOptions{Name: productNameParam, IsSortByProductName: true}) if err != nil { diff --git a/pkg/microservice/aslan/core/project/handler/product.go b/pkg/microservice/aslan/core/project/handler/product.go index 9a0973fd9..0729c3e2b 100644 --- a/pkg/microservice/aslan/core/project/handler/product.go +++ b/pkg/microservice/aslan/core/project/handler/product.go @@ -109,19 +109,6 @@ type updateServiceOrderArgs struct { Services [][]string `json:"services"` } -func UpdateServiceOrchestration(c *gin.Context) { - ctx := internalhandler.NewContext(c) - defer func() { internalhandler.JSONResponse(c, ctx) }() - - args := new(updateServiceOrderArgs) - if err := c.ShouldBindJSON(args); err != nil { - ctx.Err = e.ErrInvalidParam.AddDesc("invalid updateServiceOrder args") - return - } - - ctx.Err = projectservice.UpdateServiceOrchestration(ctx.User.Name, c.Param("name"), args.Services, ctx.Logger) -} - func UpdateProject(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() diff --git a/pkg/microservice/aslan/core/project/service/product.go b/pkg/microservice/aslan/core/project/service/product.go index 6cefd8ae5..29010f333 100644 --- a/pkg/microservice/aslan/core/project/service/product.go +++ b/pkg/microservice/aslan/core/project/service/product.go @@ -207,18 +207,6 @@ func UpdateProductTmplStatus(productName, onboardingStatus string, log *zap.Suga return nil } -func UpdateServiceOrchestration(username, name string, services [][]string, log *zap.SugaredLogger) error { - if err := templaterepo.NewProductColl().UpdateServiceOrder(&templaterepo.ProductArgs{ - ProductName: name, - Services: services, - UpdateBy: username, - }); err != nil { - log.Errorf("failed to update service order,err:%s", err) - return e.ErrUpdateProduct.AddDesc("failed to update service order") - } - return nil -} - // UpdateProject 更新项目 func UpdateProject(name string, args *template.Product, log *zap.SugaredLogger) (err error) { err = validateRule(args.CustomImageRule, args.CustomTarRule) diff --git a/pkg/microservice/aslan/core/service/handler/helm.go b/pkg/microservice/aslan/core/service/handler/helm.go index a45460522..8f19493f8 100644 --- a/pkg/microservice/aslan/core/service/handler/helm.go +++ b/pkg/microservice/aslan/core/service/handler/helm.go @@ -83,20 +83,6 @@ func CreateOrUpdateBulkHelmServices(c *gin.Context) { ctx.Resp, ctx.Err = svcservice.CreateOrUpdateBulkHelmService(c.Query("productName"), args, ctx.Logger) } -func CreateOrUpdateBulkHelmServices(c *gin.Context) { - ctx := internalhandler.NewContext(c) - defer func() { internalhandler.JSONResponse(c, ctx) }() - - args := new(svcservice.BulkHelmServiceCreationArgs) - if err := c.BindJSON(args); err != nil { - ctx.Err = e.ErrInvalidParam.AddDesc("invalid HelmService json args") - return - } - args.CreatedBy = ctx.Username - - ctx.Resp, ctx.Err = svcservice.CreateOrUpdateBulkHelmService(c.Query("productName"), args, ctx.Logger) -} - func UpdateHelmService(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() diff --git a/pkg/microservice/aslan/core/service/handler/router.go b/pkg/microservice/aslan/core/service/handler/router.go index 17bfbfa90..e83c94033 100644 --- a/pkg/microservice/aslan/core/service/handler/router.go +++ b/pkg/microservice/aslan/core/service/handler/router.go @@ -86,10 +86,4 @@ func (*Router) Inject(router *gin.RouterGroup) { template.POST("/load", LoadServiceFromYamlTemplate) template.POST("/reload", ReloadServiceFromYamlTemplate) } - - template := router.Group("template") - { - template.POST("/load", LoadServiceFromYamlTemplate) - template.POST("/reload", ReloadServiceFromYamlTemplate) - } } diff --git a/pkg/microservice/aslan/core/service/service/helm.go b/pkg/microservice/aslan/core/service/service/helm.go index 6f7eb8d13..543dbdf5c 100644 --- a/pkg/microservice/aslan/core/service/service/helm.go +++ b/pkg/microservice/aslan/core/service/service/helm.go @@ -38,7 +38,6 @@ import ( configbase "github.com/koderover/zadig/pkg/config" "github.com/koderover/zadig/pkg/microservice/aslan/config" "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/models" - "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/models/template" templatedata "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/models/template" templatemodels "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/models/template" commonrepo "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/mongodb" diff --git a/pkg/microservice/aslan/core/system/handler/s3.go b/pkg/microservice/aslan/core/system/handler/s3.go index 0e8f1c906..f8e534ad0 100644 --- a/pkg/microservice/aslan/core/system/handler/s3.go +++ b/pkg/microservice/aslan/core/system/handler/s3.go @@ -134,20 +134,3 @@ func ListTars(c *gin.Context) { ctx.Resp, ctx.Err = service.ListTars(c.Param("id"), c.Query("kind"), args.Names, ctx.Logger) } - -type ListTarsOption struct { - Names []string `json:"names"` -} - -func ListTars(c *gin.Context) { - ctx := internalhandler.NewContext(c) - defer func() { internalhandler.JSONResponse(c, ctx) }() - - args := new(ListTarsOption) - if err := c.ShouldBindJSON(args); err != nil { - ctx.Err = e.ErrInvalidParam.AddErr(err) - return - } - - ctx.Resp, ctx.Err = service.ListTars(c.Param("id"), c.Query("kind"), args.Names, ctx.Logger) -} diff --git a/pkg/microservice/aslan/core/templatestore/service/yaml.go b/pkg/microservice/aslan/core/templatestore/service/yaml.go index e565bd100..2fce6f55b 100644 --- a/pkg/microservice/aslan/core/templatestore/service/yaml.go +++ b/pkg/microservice/aslan/core/templatestore/service/yaml.go @@ -2,7 +2,6 @@ package service import ( "errors" - "fmt" "regexp" "strings" -- Gitee From 7c3b7388a8cb83d6fa9ee042d0af7c9a75841873 Mon Sep 17 00:00:00 2001 From: lou Date: Fri, 5 Nov 2021 19:38:39 +0800 Subject: [PATCH 259/405] update after review Signed-off-by: lou --- pkg/microservice/aslan/core/service/service/helm.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/pkg/microservice/aslan/core/service/service/helm.go b/pkg/microservice/aslan/core/service/service/helm.go index 543dbdf5c..7cc0ede39 100644 --- a/pkg/microservice/aslan/core/service/service/helm.go +++ b/pkg/microservice/aslan/core/service/service/helm.go @@ -374,8 +374,6 @@ func CreateOrUpdateHelmServiceFromGitRepo(projectName string, args *HelmServiceC } repoLink = publicArgs.RepoLink - } else { - } source, codehostInfo, err := getCodehostType(repoArgs, repoLink) -- Gitee From 29889885ee22a81ffa7529c7855369d75f1e4c1c Mon Sep 17 00:00:00 2001 From: Landy Date: Fri, 5 Nov 2021 19:54:49 +0800 Subject: [PATCH 260/405] Revert "Release 1.6.0" --- .../aslan/core/service/handler/helm.go | 2 +- .../aslan/core/service/service/helm.go | 67 +++++++++---------- 2 files changed, 33 insertions(+), 36 deletions(-) diff --git a/pkg/microservice/aslan/core/service/handler/helm.go b/pkg/microservice/aslan/core/service/handler/helm.go index 133933993..e2db50317 100644 --- a/pkg/microservice/aslan/core/service/handler/helm.go +++ b/pkg/microservice/aslan/core/service/handler/helm.go @@ -66,7 +66,7 @@ func CreateOrUpdateHelmService(c *gin.Context) { } args.CreatedBy = ctx.Username - ctx.Resp, ctx.Err = svcservice.CreateOrUpdateHelmService(c.Query("productName"), args, ctx.Logger) + ctx.Err = svcservice.CreateOrUpdateHelmService(c.Query("productName"), args, ctx.Logger) } func CreateOrUpdateBulkHelmServices(c *gin.Context) { diff --git a/pkg/microservice/aslan/core/service/service/helm.go b/pkg/microservice/aslan/core/service/service/helm.go index 50aa6e690..543dbdf5c 100644 --- a/pkg/microservice/aslan/core/service/service/helm.go +++ b/pkg/microservice/aslan/core/service/service/helm.go @@ -28,6 +28,7 @@ import ( "time" "github.com/27149chen/afero" + "github.com/hashicorp/go-multierror" "github.com/otiai10/copy" "github.com/pkg/errors" "go.uber.org/zap" @@ -242,26 +243,26 @@ func prepareChartTemplateData(templateName string, logger *zap.SugaredLogger) (* }, nil } -func CreateOrUpdateHelmService(projectName string, args *HelmServiceCreationArgs, logger *zap.SugaredLogger) (*BulkHelmServiceCreationResponse, error) { +func CreateOrUpdateHelmService(projectName string, args *HelmServiceCreationArgs, logger *zap.SugaredLogger) error { switch args.Source { case LoadFromRepo, LoadFromPublicRepo: return CreateOrUpdateHelmServiceFromGitRepo(projectName, args, logger) case LoadFromChartTemplate: return CreateOrUpdateHelmServiceFromChartTemplate(projectName, args, logger) default: - return nil, fmt.Errorf("invalid source") + return fmt.Errorf("invalid source") } } -func CreateOrUpdateHelmServiceFromChartTemplate(projectName string, args *HelmServiceCreationArgs, logger *zap.SugaredLogger) (*BulkHelmServiceCreationResponse, error) { +func CreateOrUpdateHelmServiceFromChartTemplate(projectName string, args *HelmServiceCreationArgs, logger *zap.SugaredLogger) error { templateArgs, ok := args.CreateFrom.(*CreateFromChartTemplate) if !ok { - return nil, fmt.Errorf("invalid argument") + return fmt.Errorf("invalid argument") } templateChartInfo, err := prepareChartTemplateData(templateArgs.TemplateName, logger) if err != nil { - return nil, err + return err } var values [][]byte @@ -269,7 +270,7 @@ func CreateOrUpdateHelmServiceFromChartTemplate(projectName string, args *HelmSe //render variables renderedYaml, err := renderVariablesToYaml(string(templateChartInfo.DefaultValuesYAML), projectName, args.Name, templateArgs.Variables) if err != nil { - return nil, err + return err } values = append(values, []byte(renderedYaml)) } @@ -287,29 +288,29 @@ func CreateOrUpdateHelmServiceFromChartTemplate(projectName string, args *HelmSe // remove old files if err = os.RemoveAll(to); err != nil { logger.Errorf("Failed to remove dir %s, err: %s", to, err) - return nil, err + return err } if err = copy.Copy(from, to); err != nil { logger.Errorf("Failed to copy file from %s to %s, err: %s", from, to, err) - return nil, err + return err } merged, err := yamlutil.Merge(values) if err != nil { logger.Errorf("Failed to merge values, err: %s", err) - return nil, err + return err } if err = os.WriteFile(filepath.Join(to, setting.ValuesYaml), merged, 0644); err != nil { logger.Errorf("Failed to write values, err: %s", err) - return nil, err + return err } fsTree := os.DirFS(config.LocalServicePath(projectName, args.Name)) ServiceS3Base := config.ObjectStorageServicePath(projectName, args.Name) if err = fsservice.ArchiveAndUploadFilesToS3(fsTree, args.Name, ServiceS3Base, logger); err != nil { logger.Errorf("Failed to upload files for service %s in project %s, err: %s", args.Name, projectName, err) - return nil, err + return err } svc, err := createOrUpdateHelmService( @@ -331,7 +332,7 @@ func CreateOrUpdateHelmServiceFromChartTemplate(projectName string, args *HelmSe ) if err != nil { logger.Errorf("Failed to create service %s in project %s, error: %s", args.Name, projectName, err) - return nil, err + return err } compareHelmVariable([]*templatemodels.RenderChart{ @@ -341,9 +342,7 @@ func CreateOrUpdateHelmServiceFromChartTemplate(projectName string, args *HelmSe }, }, projectName, args.CreatedBy, logger) - return &BulkHelmServiceCreationResponse{ - SuccessServices: []string{args.Name}, - }, nil + return nil } func getCodehostType(repoArgs *CreateFromRepo, repoLink string) (string, *poetry.CodeHost, error) { @@ -358,20 +357,20 @@ func getCodehostType(repoArgs *CreateFromRepo, repoLink string) (string, *poetry return ch.Type, ch, nil } -func CreateOrUpdateHelmServiceFromGitRepo(projectName string, args *HelmServiceCreationArgs, log *zap.SugaredLogger) (*BulkHelmServiceCreationResponse, error) { +func CreateOrUpdateHelmServiceFromGitRepo(projectName string, args *HelmServiceCreationArgs, log *zap.SugaredLogger) error { var err error var repoLink string repoArgs, ok := args.CreateFrom.(*CreateFromRepo) if !ok { publicArgs, ok := args.CreateFrom.(*CreateFromPublicRepo) if !ok { - return nil, fmt.Errorf("invalid argument") + return fmt.Errorf("invalid argument") } repoArgs, err = PublicRepoToPrivateRepoArgs(publicArgs) if err != nil { log.Errorf("Failed to parse repo args %+v, err: %s", publicArgs, err) - return nil, err + return err } repoLink = publicArgs.RepoLink @@ -379,41 +378,38 @@ func CreateOrUpdateHelmServiceFromGitRepo(projectName string, args *HelmServiceC } - response := &BulkHelmServiceCreationResponse{} source, codehostInfo, err := getCodehostType(repoArgs, repoLink) if err != nil { log.Errorf("Failed to get source form repo data %+v, err: %s", *repoArgs, err.Error()) - return nil, err + return err } helmRenderCharts := make([]*templatemodels.RenderChart, 0, len(repoArgs.Paths)) + var errs *multierror.Error var wg wait.Group var mux sync.RWMutex for _, p := range repoArgs.Paths { filePath := strings.TrimLeft(p, "/") wg.Start(func() { - var ( - serviceName string - chartVersion string - valuesYAML []byte - finalErr error - ) + var finalErr error + defer func() { - mux.Lock() if finalErr != nil { - response.FailedServices = append(response.FailedServices, &FailedService{ - Path: filePath, - Error: finalErr.Error(), - }) - } else { - response.SuccessServices = append(response.SuccessServices, serviceName) + mux.Lock() + errs = multierror.Append(errs, finalErr) + mux.Unlock() } - mux.Unlock() }() log.Infof("Loading chart under path %s", filePath) + var ( + serviceName string + chartVersion string + valuesYAML []byte + ) + fsTree, err := fsservice.DownloadFilesFromSource( &fsservice.DownloadFromSourceArgs{CodehostID: repoArgs.CodehostID, Owner: repoArgs.Owner, Repo: repoArgs.Repo, Path: filePath, Branch: repoArgs.Branch, RepoLink: repoLink}, func(chartTree afero.Fs) (string, error) { @@ -480,7 +476,8 @@ func CreateOrUpdateHelmServiceFromGitRepo(projectName string, args *HelmServiceC wg.Wait() compareHelmVariable(helmRenderCharts, projectName, args.CreatedBy, log) - return response, nil + + return errs.ErrorOrNil() } func CreateOrUpdateBulkHelmService(projectName string, args *BulkHelmServiceCreationArgs, logger *zap.SugaredLogger) (*BulkHelmServiceCreationResponse, error) { -- Gitee From 22324c21602ad08650513d7d93e3ec2ab97f878a Mon Sep 17 00:00:00 2001 From: allenshen Date: Fri, 5 Nov 2021 21:39:05 +0800 Subject: [PATCH 261/405] fix ua upgrad bug Signed-off-by: allenshen --- pkg/cli/upgradeassistant/internal/upgradepath/versions.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/cli/upgradeassistant/internal/upgradepath/versions.go b/pkg/cli/upgradeassistant/internal/upgradepath/versions.go index 562dfd396..476dca703 100644 --- a/pkg/cli/upgradeassistant/internal/upgradepath/versions.go +++ b/pkg/cli/upgradeassistant/internal/upgradepath/versions.go @@ -91,7 +91,7 @@ func init() { sort.Strings(versionList) - for i := 0; i < len(versionList)-2; i++ { + for i := 0; i < len(versionList)-1; i++ { lowVersion := versionList[i] highVersion := versionList[i+1] AddHandler(versionMap[lowVersion], versionMap[highVersion], defaultUpgradeHandler) -- Gitee From 47bf2b689ed4553550e4600c8d4306366ef7ba7b Mon Sep 17 00:00:00 2001 From: panxunying <641770806@qq.com> Date: Mon, 8 Nov 2021 11:25:13 +0800 Subject: [PATCH 262/405] optimize Signed-off-by: panxunying <641770806@qq.com> --- pkg/microservice/user/core/service/login/local.go | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/pkg/microservice/user/core/service/login/local.go b/pkg/microservice/user/core/service/login/local.go index ccb54d625..60906169b 100644 --- a/pkg/microservice/user/core/service/login/local.go +++ b/pkg/microservice/user/core/service/login/local.go @@ -49,9 +49,12 @@ func LocalLogin(args *LoginArgs, logger *zap.SugaredLogger) (*User, error) { } password := []byte(args.Password) err = bcrypt.CompareHashAndPassword([]byte(userLogin.Password), password) + if err == bcrypt.ErrMismatchedHashAndPassword { + return nil, fmt.Errorf("password is wrong") + } if err != nil { - logger.Errorf("LocalLogin user:%s check password error, error msg:%s", args.Account, err.Error()) - return nil, fmt.Errorf("check password error, error msg:%s", err.Error()) + logger.Errorf("LocalLogin user:%s check password error, error msg:%s", args.Account, err) + return nil, fmt.Errorf("check password error, error msg:%s", err) } userLogin.LastLoginTime = time.Now().Unix() err = orm.UpdateUserLogin(userLogin.UID, userLogin, core.DB) -- Gitee From 636a882b00b04eaf839839054ced4ca3a67e50b2 Mon Sep 17 00:00:00 2001 From: mouuii Date: Mon, 8 Nov 2021 13:38:39 +0800 Subject: [PATCH 263/405] bugfix Signed-off-by: mouuii --- .../systemconfig/core/codehost/repository/models/codehost.go | 2 +- .../systemconfig/core/email/repository/mongodb/emailservice.go | 2 +- pkg/microservice/systemconfig/server/rest/router.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pkg/microservice/systemconfig/core/codehost/repository/models/codehost.go b/pkg/microservice/systemconfig/core/codehost/repository/models/codehost.go index ba7d6269b..8ff1b9d90 100644 --- a/pkg/microservice/systemconfig/core/codehost/repository/models/codehost.go +++ b/pkg/microservice/systemconfig/core/codehost/repository/models/codehost.go @@ -5,7 +5,7 @@ type CodeHost struct { Name string `bson:"name" json:"name"` Type string `bson:"type" json:"type"` Address string `bson:"address" json:"address"` - IsReady bool `bson:"is_ready" json:"ready"` + IsReady string `bson:"is_ready" json:"ready"` AccessToken string `bson:"access_token" json:"accessToken"` RefreshToken string `bson:"refresh_token" json:"refreshToken"` Namespace string `bson:"namespace" json:"namespace"` diff --git a/pkg/microservice/systemconfig/core/email/repository/mongodb/emailservice.go b/pkg/microservice/systemconfig/core/email/repository/mongodb/emailservice.go index 6f8c0b44c..7ded08a24 100644 --- a/pkg/microservice/systemconfig/core/email/repository/mongodb/emailservice.go +++ b/pkg/microservice/systemconfig/core/email/repository/mongodb/emailservice.go @@ -21,7 +21,7 @@ type EmailServiceColl struct { } func NewEmailServiceColl() *EmailServiceColl { - name := models.EmailHost{}.TableName() + name := models.EmailService{}.TableName() coll := &EmailServiceColl{Collection: mongotool.Database(config.MongoDatabase()).Collection(name), coll: name} return coll diff --git a/pkg/microservice/systemconfig/server/rest/router.go b/pkg/microservice/systemconfig/server/rest/router.go index ca654736e..015f0c564 100644 --- a/pkg/microservice/systemconfig/server/rest/router.go +++ b/pkg/microservice/systemconfig/server/rest/router.go @@ -19,7 +19,7 @@ package rest import ( "github.com/gin-gonic/gin" - codehosthandler "github.com/koderover/zadig/pkg/microservice/aslan/core/code/handler" + codehosthandler "github.com/koderover/zadig/pkg/microservice/systemconfig/core/codehost/handler" emailHandler "github.com/koderover/zadig/pkg/microservice/systemconfig/core/email/handler" "github.com/koderover/zadig/pkg/microservice/systemconfig/core/handler" jiraHandler "github.com/koderover/zadig/pkg/microservice/systemconfig/core/jira/handler" -- Gitee From d2517d39cdb7b6e13363d977c8e9107e69e721b1 Mon Sep 17 00:00:00 2001 From: liu deyi Date: Mon, 8 Nov 2021 14:30:42 +0800 Subject: [PATCH 264/405] fix modify hosting env services bug Signed-off-by: liu deyi --- .../core/common/repository/mongodb/service.go | 18 +++++++++++ .../aslan/core/service/service/service.go | 31 +++++++++++-------- .../workflow/service/workflow/workflow.go | 8 +++-- 3 files changed, 42 insertions(+), 15 deletions(-) diff --git a/pkg/microservice/aslan/core/common/repository/mongodb/service.go b/pkg/microservice/aslan/core/common/repository/mongodb/service.go index 572ef8acf..30342b4c4 100644 --- a/pkg/microservice/aslan/core/common/repository/mongodb/service.go +++ b/pkg/microservice/aslan/core/common/repository/mongodb/service.go @@ -329,6 +329,24 @@ func (c *ServiceColl) BatchUpdateExternalServicesStatus(productName, envName, st return err } +// UpdateExternalServiceEnvName only used by external services +func (c *ServiceColl) UpdateExternalServiceEnvName(serviceName, productName, envName string) error { + if serviceName == "" { + return fmt.Errorf("serviceName is empty") + } + if productName == "" { + return fmt.Errorf("productName is empty") + } + + query := bson.M{"service_name": serviceName, "product_name": productName} + change := bson.M{"$set": bson.M{ + "env_name": envName, + }} + + _, err := c.UpdateOne(context.TODO(), query, change) + return err +} + // UpdateExternalServicesStatus only used by external services func (c *ServiceColl) UpdateExternalServicesStatus(serviceName, productName, status, envName string) error { if serviceName == "" && envName == "" { diff --git a/pkg/microservice/aslan/core/service/service/service.go b/pkg/microservice/aslan/core/service/service/service.go index 17cf5c53c..16034ecc1 100644 --- a/pkg/microservice/aslan/core/service/service/service.go +++ b/pkg/microservice/aslan/core/service/service/service.go @@ -437,13 +437,6 @@ func UpdateWorkloads(ctx context.Context, requestID, username, productName, envN } } } - // pre judge workLoads same name - //services, _ := commonrepo.NewServiceColl().ListExternalWorkloadsBy(productName, "") - //for _, v := range services { - // if addString.Has(v.ServiceName) { - // return e.ErrCreateTemplate.AddDesc(fmt.Sprintf("do not support import same service name: %s", v.ServiceName)) - // } - //} for _, v := range args.WorkLoads { if addString.Has(v.Name) { @@ -465,26 +458,38 @@ func UpdateWorkloads(ctx context.Context, requestID, username, productName, envN log.Errorf("failed to list external service, error:%s", err) } - externalEnvServiceM := make(map[string]bool) + externalEnvServiceM := make(map[string]*commonmodels.ServicesInExternalEnv) for _, externalEnvService := range otherExternalEnvServices { - externalEnvServiceM[externalEnvService.ServiceName] = true + externalEnvServiceM[externalEnvService.ServiceName] = externalEnvService } for _, v := range diff { switch v.Operation { // 删除workload的引用 case "delete": - if _, isExist := externalEnvServiceM[v.Name]; !isExist { - err = commonrepo.NewServiceColl().UpdateExternalServicesStatus(v.Name, productName, setting.ProductStatusDeleting, envName) - if err != nil { + if externalService, isExist := externalEnvServiceM[v.Name]; !isExist { + if err = commonrepo.NewServiceColl().UpdateExternalServicesStatus(v.Name, productName, setting.ProductStatusDeleting, envName); err != nil { log.Errorf("UpdateStatus external services error:%s", err) } + } else { + // Update the env name in the service + if err = commonrepo.NewServiceColl().UpdateExternalServiceEnvName(v.Name, productName, externalService.EnvName); err != nil { + log.Errorf("UpdateEnvName external services error:%s", err) + } + // Delete the reference in the original service + if err = commonrepo.NewServicesInExternalEnvColl().Delete(&commonrepo.ServicesInExternalEnvArgs{ + ProductName: externalService.ProductName, + EnvName: externalService.EnvName, + ServiceName: externalService.ServiceName, + }); err != nil { + log.Errorf("delete service in external env envName:%s error:%s", externalService.EnvName, err) + } } if err = commonrepo.NewServicesInExternalEnvColl().Delete(&commonrepo.ServicesInExternalEnvArgs{ ProductName: productName, EnvName: envName, ServiceName: v.Name, }); err != nil { - log.Errorf("delete services in external env error:%s", err) + log.Errorf("delete service in external env envName:%s error:%s", envName, err) } // 添加workload的引用 case "add": diff --git a/pkg/microservice/aslan/core/workflow/service/workflow/workflow.go b/pkg/microservice/aslan/core/workflow/service/workflow/workflow.go index f2c8a3574..647cbf2de 100644 --- a/pkg/microservice/aslan/core/workflow/service/workflow/workflow.go +++ b/pkg/microservice/aslan/core/workflow/service/workflow/workflow.go @@ -64,6 +64,10 @@ func (args *workflowCreateArgs) addWorkflowArg(envName string, buildStageEnabled if artifactStageEnabled { wName = fmt.Sprintf("%s-%s-workflow", args.productName, "ops") } + // The hosting env workflow name is not bound to the environment + if envName == "" { + wName = fmt.Sprintf("%s-workflow", args.productName) + } args.argsMap[wName] = &workflowCreateArg{ name: wName, envName: envName, @@ -116,10 +120,10 @@ func AutoCreateWorkflow(productName string, log *zap.SugaredLogger) *EnvStatus { createArgs.addWorkflowArg("", false, true) } - // 云主机场景不创建ops工作流 + // Only one workflow is created in the hosting environment if productTmpl.ProductFeature != nil && productTmpl.ProductFeature.CreateEnvType == setting.SourceFromExternal { createArgs.clear() - createArgs.addWorkflowArg("dev", true, false) + createArgs.addWorkflowArg("", true, false) } workflowSlice := sets.NewString() -- Gitee From 79af5e2e7013dff213de6abbd8d510fb76a393fc Mon Sep 17 00:00:00 2001 From: panxunying <641770806@qq.com> Date: Mon, 8 Nov 2021 14:47:06 +0800 Subject: [PATCH 265/405] optimize sync third party user Signed-off-by: panxunying <641770806@qq.com> --- pkg/microservice/user/core/handler/login/third_party.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pkg/microservice/user/core/handler/login/third_party.go b/pkg/microservice/user/core/handler/login/third_party.go index df86d6eac..633b0d8c4 100644 --- a/pkg/microservice/user/core/handler/login/third_party.go +++ b/pkg/microservice/user/core/handler/login/third_party.go @@ -103,8 +103,10 @@ func Callback(c *gin.Context) { ctx.Err = err return } + user, err := user.SyncUser(&user.SyncUserInfo{ Account: claims.Name, + Name: claims.Name, IdentityType: claims.FederatedClaims.ConnectorId, }, ctx.Logger) if err != nil { @@ -112,6 +114,7 @@ func Callback(c *gin.Context) { return } claims.Uid = user.UID + claims.Account = claims.Name claims.StandardClaims.ExpiresAt = time.Now().Add(time.Duration(config.TokenExpiresAt()) * time.Minute).Unix() userToken, err := login.CreateToken(claims) if err != nil { -- Gitee From 91fa6e28b280bba55ecc6d11ecfffb886d083ae2 Mon Sep 17 00:00:00 2001 From: mouuii Date: Mon, 8 Nov 2021 14:49:26 +0800 Subject: [PATCH 266/405] bugfix Signed-off-by: mouuii --- .../systemconfig/core/codehost/repository/models/codehost.go | 2 +- .../systemconfig/core/codehost/service/codehost.go | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/pkg/microservice/systemconfig/core/codehost/repository/models/codehost.go b/pkg/microservice/systemconfig/core/codehost/repository/models/codehost.go index 8ff1b9d90..ba7d6269b 100644 --- a/pkg/microservice/systemconfig/core/codehost/repository/models/codehost.go +++ b/pkg/microservice/systemconfig/core/codehost/repository/models/codehost.go @@ -5,7 +5,7 @@ type CodeHost struct { Name string `bson:"name" json:"name"` Type string `bson:"type" json:"type"` Address string `bson:"address" json:"address"` - IsReady string `bson:"is_ready" json:"ready"` + IsReady bool `bson:"is_ready" json:"ready"` AccessToken string `bson:"access_token" json:"accessToken"` RefreshToken string `bson:"refresh_token" json:"refreshToken"` Namespace string `bson:"namespace" json:"namespace"` diff --git a/pkg/microservice/systemconfig/core/codehost/service/codehost.go b/pkg/microservice/systemconfig/core/codehost/service/codehost.go index 0cc0c7c56..193f1dc63 100644 --- a/pkg/microservice/systemconfig/core/codehost/service/codehost.go +++ b/pkg/microservice/systemconfig/core/codehost/service/codehost.go @@ -8,6 +8,9 @@ import ( ) func CreateCodeHost(codehost *models.CodeHost, _ *zap.SugaredLogger) (*models.CodeHost, error) { + if codehost.Type == "codehub" { + codehost.IsReady = true + } return mongodb.NewCodehostColl().AddCodeHost(codehost) } -- Gitee From 4131061ebf8851de6f51012539524e6ac1c41992 Mon Sep 17 00:00:00 2001 From: mouuii Date: Mon, 8 Nov 2021 14:50:39 +0800 Subject: [PATCH 267/405] bugfix Signed-off-by: mouuii --- .../systemconfig/core/codehost/repository/models/codehost.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/microservice/systemconfig/core/codehost/repository/models/codehost.go b/pkg/microservice/systemconfig/core/codehost/repository/models/codehost.go index ba7d6269b..567431c7f 100644 --- a/pkg/microservice/systemconfig/core/codehost/repository/models/codehost.go +++ b/pkg/microservice/systemconfig/core/codehost/repository/models/codehost.go @@ -5,7 +5,7 @@ type CodeHost struct { Name string `bson:"name" json:"name"` Type string `bson:"type" json:"type"` Address string `bson:"address" json:"address"` - IsReady bool `bson:"is_ready" json:"ready"` + IsReadyV2 bool `bson:"is_ready_v2" json:"is_ready_v2"` AccessToken string `bson:"access_token" json:"accessToken"` RefreshToken string `bson:"refresh_token" json:"refreshToken"` Namespace string `bson:"namespace" json:"namespace"` -- Gitee From 469128182f73dd54dfd60eeec04c9bb7b9fc2e85 Mon Sep 17 00:00:00 2001 From: mouuii Date: Mon, 8 Nov 2021 14:50:57 +0800 Subject: [PATCH 268/405] bugfix Signed-off-by: mouuii --- pkg/microservice/systemconfig/core/codehost/service/codehost.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/microservice/systemconfig/core/codehost/service/codehost.go b/pkg/microservice/systemconfig/core/codehost/service/codehost.go index 193f1dc63..bab0bb0cf 100644 --- a/pkg/microservice/systemconfig/core/codehost/service/codehost.go +++ b/pkg/microservice/systemconfig/core/codehost/service/codehost.go @@ -9,7 +9,7 @@ import ( func CreateCodeHost(codehost *models.CodeHost, _ *zap.SugaredLogger) (*models.CodeHost, error) { if codehost.Type == "codehub" { - codehost.IsReady = true + codehost.IsReadyV2 = true } return mongodb.NewCodehostColl().AddCodeHost(codehost) } -- Gitee From cdc98906fc6c46e064a50d3ffdb7cac90f4fb1d2 Mon Sep 17 00:00:00 2001 From: mouuii Date: Mon, 8 Nov 2021 15:09:27 +0800 Subject: [PATCH 269/405] bugfix Signed-off-by: mouuii --- pkg/microservice/systemconfig/config/consts.go | 7 +++++++ .../core/codehost/repository/models/codehost.go | 2 +- .../core/codehost/repository/mongodb/codehost.go | 9 +++++++++ .../systemconfig/core/codehost/service/codehost.go | 2 +- 4 files changed, 18 insertions(+), 2 deletions(-) diff --git a/pkg/microservice/systemconfig/config/consts.go b/pkg/microservice/systemconfig/config/consts.go index 27f698e59..8acf347cb 100644 --- a/pkg/microservice/systemconfig/config/consts.go +++ b/pkg/microservice/systemconfig/config/consts.go @@ -4,3 +4,10 @@ const ( ENVMysqlDexDB = "MYSQL_DEX_DB" FeatureFlag = "feature-gates" ) + +var CodeHostMap = map[string]string{ + "1": "gitlab", + "2": "github", + "3": "gerrit", + "4": "codehub", +} diff --git a/pkg/microservice/systemconfig/core/codehost/repository/models/codehost.go b/pkg/microservice/systemconfig/core/codehost/repository/models/codehost.go index 567431c7f..8ff1b9d90 100644 --- a/pkg/microservice/systemconfig/core/codehost/repository/models/codehost.go +++ b/pkg/microservice/systemconfig/core/codehost/repository/models/codehost.go @@ -5,7 +5,7 @@ type CodeHost struct { Name string `bson:"name" json:"name"` Type string `bson:"type" json:"type"` Address string `bson:"address" json:"address"` - IsReadyV2 bool `bson:"is_ready_v2" json:"is_ready_v2"` + IsReady string `bson:"is_ready" json:"ready"` AccessToken string `bson:"access_token" json:"accessToken"` RefreshToken string `bson:"refresh_token" json:"refreshToken"` Namespace string `bson:"namespace" json:"namespace"` diff --git a/pkg/microservice/systemconfig/core/codehost/repository/mongodb/codehost.go b/pkg/microservice/systemconfig/core/codehost/repository/mongodb/codehost.go index 855df2c70..60e61623e 100644 --- a/pkg/microservice/systemconfig/core/codehost/repository/mongodb/codehost.go +++ b/pkg/microservice/systemconfig/core/codehost/repository/mongodb/codehost.go @@ -65,6 +65,9 @@ func (c *CodehostColl) GetCodeHostByID(ID int) (*models.CodeHost, error) { if err != nil { return nil, nil } + if v, ok := config.CodeHostMap[codehost.Type]; ok { + codehost.Type = v + } return codehost, nil } @@ -80,6 +83,12 @@ func (c *CodehostColl) FindCodeHosts() ([]*models.CodeHost, error) { if err != nil { return nil, err } + // NOTE: to adapt old data + for i, v := range codeHosts { + if v, ok := config.CodeHostMap[v.Type]; ok { + codeHosts[i].Type = v + } + } return codeHosts, nil } diff --git a/pkg/microservice/systemconfig/core/codehost/service/codehost.go b/pkg/microservice/systemconfig/core/codehost/service/codehost.go index bab0bb0cf..596a5a471 100644 --- a/pkg/microservice/systemconfig/core/codehost/service/codehost.go +++ b/pkg/microservice/systemconfig/core/codehost/service/codehost.go @@ -9,7 +9,7 @@ import ( func CreateCodeHost(codehost *models.CodeHost, _ *zap.SugaredLogger) (*models.CodeHost, error) { if codehost.Type == "codehub" { - codehost.IsReadyV2 = true + codehost.IsReady = "2" } return mongodb.NewCodehostColl().AddCodeHost(codehost) } -- Gitee From 613987aae3f1a80a8dafa2c3f4ba237a32552d21 Mon Sep 17 00:00:00 2001 From: mouuii Date: Mon, 8 Nov 2021 15:30:57 +0800 Subject: [PATCH 270/405] bugfix Signed-off-by: mouuii --- .../core/codehost/repository/mongodb/codehost.go | 14 ++++++++++++++ .../systemconfig/core/codehost/service/codehost.go | 5 +++++ 2 files changed, 19 insertions(+) diff --git a/pkg/microservice/systemconfig/core/codehost/repository/mongodb/codehost.go b/pkg/microservice/systemconfig/core/codehost/repository/mongodb/codehost.go index 60e61623e..561a60f73 100644 --- a/pkg/microservice/systemconfig/core/codehost/repository/mongodb/codehost.go +++ b/pkg/microservice/systemconfig/core/codehost/repository/mongodb/codehost.go @@ -92,6 +92,20 @@ func (c *CodehostColl) FindCodeHosts() ([]*models.CodeHost, error) { return codeHosts, nil } +func (c *CodehostColl) CodeHostList() ([]*models.CodeHost, error) { + codeHosts := make([]*models.CodeHost, 0) + + cursor, err := c.Collection.Find(context.TODO(), bson.M{}) + if err != nil { + return nil, err + } + err = cursor.All(context.TODO(), &codeHosts) + if err != nil { + return nil, err + } + return codeHosts, nil +} + func (c *CodehostColl) DeleteCodeHostByID(ID int) error { query := bson.M{"id": ID, "deleted_at": 0} change := bson.M{"$set": bson.M{ diff --git a/pkg/microservice/systemconfig/core/codehost/service/codehost.go b/pkg/microservice/systemconfig/core/codehost/service/codehost.go index 596a5a471..fbf137efc 100644 --- a/pkg/microservice/systemconfig/core/codehost/service/codehost.go +++ b/pkg/microservice/systemconfig/core/codehost/service/codehost.go @@ -11,6 +11,11 @@ func CreateCodeHost(codehost *models.CodeHost, _ *zap.SugaredLogger) (*models.Co if codehost.Type == "codehub" { codehost.IsReady = "2" } + list, err := mongodb.NewCodehostColl().CodeHostList() + if err != nil { + return nil, err + } + codehost.ID = len(list) + 1 return mongodb.NewCodehostColl().AddCodeHost(codehost) } -- Gitee From 41b439f9f4427c8b4ea4fd4e71c6440802cb9e51 Mon Sep 17 00:00:00 2001 From: mouuii Date: Mon, 8 Nov 2021 16:04:21 +0800 Subject: [PATCH 271/405] codehost auth Signed-off-by: mouuii --- .../core/codehost/handler/codehost.go | 37 +++++++++++++++++++ .../core/codehost/handler/router.go | 1 + 2 files changed, 38 insertions(+) diff --git a/pkg/microservice/systemconfig/core/codehost/handler/codehost.go b/pkg/microservice/systemconfig/core/codehost/handler/codehost.go index b98565cce..50fd5c4ce 100644 --- a/pkg/microservice/systemconfig/core/codehost/handler/codehost.go +++ b/pkg/microservice/systemconfig/core/codehost/handler/codehost.go @@ -1,9 +1,13 @@ package handler import ( + "fmt" + "net/http" + "net/url" "strconv" "github.com/gin-gonic/gin" + "golang.org/x/oauth2" "github.com/koderover/zadig/pkg/microservice/systemconfig/core/codehost/repository/models" "github.com/koderover/zadig/pkg/microservice/systemconfig/core/codehost/service" @@ -51,6 +55,39 @@ func GetCodeHost(c *gin.Context) { ctx.Resp, ctx.Err = service.GetCodeHost(id, ctx.Logger) } +func AuthCodeHost(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + provider := c.Query("provider") + redirect := c.Query("redirect") + redirectHost, err := url.Parse(redirect) + if err != nil { + ctx.Err = err + return + } + id := c.Param("id") + idInt, err := strconv.Atoi(id) + if err != nil { + ctx.Err = err + return + } + authStateString := fmt.Sprintf("%s%s%d%s%s", redirect, "&codeHostId=", id, "&provider=", provider) + codeHost, err := service.GetCodeHost(idInt, ctx.Logger) + if err != nil { + ctx.Err = err + return + } + callBackUrl := fmt.Sprintf("%s://%s%s", redirectHost.Scheme, redirectHost.Host, "/api/directory/codehosts/callback") + authConfig := &oauth2.Config{ + ClientID: codeHost.ApplicationId, + ClientSecret: codeHost.ClientSecret, + RedirectURL: callBackUrl, + //RedirectURL: "http://localhost:34001/directory/codehosts/callback", + } + redirectURL := authConfig.AuthCodeURL(authStateString) + http.Redirect(c.Writer, c.Request, redirectURL, http.StatusFound) +} + func UpdateCodeHost(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() diff --git a/pkg/microservice/systemconfig/core/codehost/handler/router.go b/pkg/microservice/systemconfig/core/codehost/handler/router.go index e29fa97d2..b17345289 100644 --- a/pkg/microservice/systemconfig/core/codehost/handler/router.go +++ b/pkg/microservice/systemconfig/core/codehost/handler/router.go @@ -14,5 +14,6 @@ func (*Router) Inject(router *gin.RouterGroup) { codehost.POST("", CreateCodeHost) codehost.PATCH("/:id", UpdateCodeHost) codehost.GET("/:id", GetCodeHost) + codehost.GET("/:id/auth", AuthCodeHost) } } -- Gitee From 461e5b15fb141db5d0b6ca524dc315b8a91b5787 Mon Sep 17 00:00:00 2001 From: mouuii Date: Mon, 8 Nov 2021 16:26:17 +0800 Subject: [PATCH 272/405] codehost auth Signed-off-by: mouuii --- pkg/shared/config/features.go | 120 +++++++++++++++++++++++++++++++++- 1 file changed, 117 insertions(+), 3 deletions(-) diff --git a/pkg/shared/config/features.go b/pkg/shared/config/features.go index 82ef1f211..bedd55b07 100644 --- a/pkg/shared/config/features.go +++ b/pkg/shared/config/features.go @@ -1,9 +1,12 @@ package config - import ( + "errors" "fmt" + "strings" + "github.com/koderover/zadig/pkg/microservice/systemconfig/core/codehost/repository/models" + "github.com/koderover/zadig/pkg/shared/codehost" "github.com/koderover/zadig/pkg/tool/httpclient" ) @@ -13,7 +16,7 @@ type feature struct { } func (c *Client) CheckFeature(featureName string) (bool, error) { - url := fmt.Sprintf("/api/v1/features/%s",featureName) + url := fmt.Sprintf("/api/v1/features/%s", featureName) fs := &feature{} _, err := c.Get(url, httpclient.SetResult(fs)) @@ -22,4 +25,115 @@ func (c *Client) CheckFeature(featureName string) (bool, error) { } return fs.Enabled, nil -} \ No newline at end of file +} + +func (c *Client) GetCodeHostList() ([]*models.CodeHost, error) { + url := fmt.Sprintf("/api/v1/codehost") + var list []*models.CodeHost + _, err := c.Post(url, httpclient.SetResult(&list)) + if err != nil { + return nil, err + } + return list, nil +} + +type Option struct { + CodeHostType string + Address string + Namespace string + CodeHostID int +} + +func (c *Client) GetCodeHostInfo(option *Option) (*models.CodeHost, error) { + codeHosts, err := c.GetCodeHostList() + if err != nil { + return nil, err + } + + for _, codeHost := range codeHosts { + if option.CodeHostID != 0 && codeHost.ID == option.CodeHostID { + return codeHost, nil + } else if option.CodeHostID == 0 && option.CodeHostType != "" { + switch option.CodeHostType { + case codehost.GitHubProvider: + ns := strings.ToLower(codeHost.Namespace) + if strings.Contains(option.Address, codeHost.Address) && strings.ToLower(option.Namespace) == ns { + return codeHost, nil + } + default: + if strings.Contains(option.Address, codeHost.Address) { + return codeHost, nil + } + } + } + } + + return nil, errors.New("not find codeHost") +} + +func (c *Client) GetCodeHostInfoByID(id int) (*models.CodeHost, error) { + return c.GetCodeHostInfo(&Option{CodeHostID: id}) +} + +type Detail struct { + ID int `json:"id"` + Name string `json:"name"` + Address string `json:"address"` + Owner string `json:"repoowner"` + Source string `json:"source"` + OauthToken string `json:"oauth_token"` + Region string `json:"region"` + Username string `json:"username"` + Password string `json:"password"` + AccessKey string `json:"applicationId"` + SecretKey string `json:"clientSecret"` +} + +func (c *Client) GetCodehostDetail(codehostID int) (*Detail, error) { + codehost, err := c.GetCodeHostInfo(&Option{CodeHostID: codehostID}) + if err != nil { + return nil, err + } + detail := &Detail{ + codehostID, + "", + codehost.Address, + codehost.Namespace, + codehost.Type, + codehost.AccessToken, + codehost.Region, + codehost.Username, + codehost.Password, + codehost.ApplicationId, + codehost.ClientSecret, + } + + return detail, nil +} + +func (c *Client) ListCodehostDetial() ([]*Detail, error) { + codehosts, err := c.GetCodeHostList() + if err != nil { + return nil, err + } + + var details []*Detail + + for _, codehost := range codehosts { + details = append(details, &Detail{ + codehost.ID, + "", + codehost.Address, + codehost.Namespace, + codehost.Type, + codehost.AccessToken, + codehost.Region, + codehost.Username, + codehost.Password, + codehost.ApplicationId, + codehost.ClientSecret, + }) + } + + return details, nil +} -- Gitee From fb004c60de1d87e9cb153e4e777f19c642f51b55 Mon Sep 17 00:00:00 2001 From: mouuii Date: Mon, 8 Nov 2021 16:37:11 +0800 Subject: [PATCH 273/405] codehost client Signed-off-by: mouuii --- pkg/shared/client/systemconfig/codehost.go | 121 +++++++++++++++++++++ pkg/shared/config/features.go | 115 -------------------- 2 files changed, 121 insertions(+), 115 deletions(-) create mode 100644 pkg/shared/client/systemconfig/codehost.go diff --git a/pkg/shared/client/systemconfig/codehost.go b/pkg/shared/client/systemconfig/codehost.go new file mode 100644 index 000000000..e2d88df9f --- /dev/null +++ b/pkg/shared/client/systemconfig/codehost.go @@ -0,0 +1,121 @@ +package systemconfig + +import ( + "errors" + "fmt" + "strings" + + "github.com/koderover/zadig/pkg/microservice/systemconfig/core/codehost/repository/models" + "github.com/koderover/zadig/pkg/shared/codehost" + "github.com/koderover/zadig/pkg/tool/httpclient" +) + +func GetCodeHostList() ([]*models.CodeHost, error) { + var list []*models.CodeHost + _, err := New().Post(fmt.Sprintf("/api/v1/codehost"), httpclient.SetResult(&list)) + if err != nil { + return nil, err + } + return list, nil +} + +type Option struct { + CodeHostType string + Address string + Namespace string + CodeHostID int +} + +func GetCodeHostInfo(option *Option) (*models.CodeHost, error) { + codeHosts, err := GetCodeHostList() + if err != nil { + return nil, err + } + + for _, codeHost := range codeHosts { + if option.CodeHostID != 0 && codeHost.ID == option.CodeHostID { + return codeHost, nil + } else if option.CodeHostID == 0 && option.CodeHostType != "" { + switch option.CodeHostType { + case codehost.GitHubProvider: + ns := strings.ToLower(codeHost.Namespace) + if strings.Contains(option.Address, codeHost.Address) && strings.ToLower(option.Namespace) == ns { + return codeHost, nil + } + default: + if strings.Contains(option.Address, codeHost.Address) { + return codeHost, nil + } + } + } + } + + return nil, errors.New("not find codeHost") +} + +func (c *Client) GetCodeHostInfoByID(id int) (*models.CodeHost, error) { + return GetCodeHostInfo(&Option{CodeHostID: id}) +} + +type Detail struct { + ID int `json:"id"` + Name string `json:"name"` + Address string `json:"address"` + Owner string `json:"repoowner"` + Source string `json:"source"` + OauthToken string `json:"oauth_token"` + Region string `json:"region"` + Username string `json:"username"` + Password string `json:"password"` + AccessKey string `json:"applicationId"` + SecretKey string `json:"clientSecret"` +} + +func (c *Client) GetCodehostDetail(codehostID int) (*Detail, error) { + codehost, err := GetCodeHostInfo(&Option{CodeHostID: codehostID}) + if err != nil { + return nil, err + } + detail := &Detail{ + codehostID, + "", + codehost.Address, + codehost.Namespace, + codehost.Type, + codehost.AccessToken, + codehost.Region, + codehost.Username, + codehost.Password, + codehost.ApplicationId, + codehost.ClientSecret, + } + + return detail, nil +} + +func (c *Client) ListCodehostDetial() ([]*Detail, error) { + codehosts, err := GetCodeHostList() + if err != nil { + return nil, err + } + + var details []*Detail + + for _, codehost := range codehosts { + details = append(details, &Detail{ + codehost.ID, + "", + codehost.Address, + codehost.Namespace, + codehost.Type, + codehost.AccessToken, + codehost.Region, + codehost.Username, + codehost.Password, + codehost.ApplicationId, + codehost.ClientSecret, + }) + } + + return details, nil +} diff --git a/pkg/shared/config/features.go b/pkg/shared/config/features.go index bedd55b07..9f542e102 100644 --- a/pkg/shared/config/features.go +++ b/pkg/shared/config/features.go @@ -1,12 +1,8 @@ package config import ( - "errors" "fmt" - "strings" - "github.com/koderover/zadig/pkg/microservice/systemconfig/core/codehost/repository/models" - "github.com/koderover/zadig/pkg/shared/codehost" "github.com/koderover/zadig/pkg/tool/httpclient" ) @@ -26,114 +22,3 @@ func (c *Client) CheckFeature(featureName string) (bool, error) { return fs.Enabled, nil } - -func (c *Client) GetCodeHostList() ([]*models.CodeHost, error) { - url := fmt.Sprintf("/api/v1/codehost") - var list []*models.CodeHost - _, err := c.Post(url, httpclient.SetResult(&list)) - if err != nil { - return nil, err - } - return list, nil -} - -type Option struct { - CodeHostType string - Address string - Namespace string - CodeHostID int -} - -func (c *Client) GetCodeHostInfo(option *Option) (*models.CodeHost, error) { - codeHosts, err := c.GetCodeHostList() - if err != nil { - return nil, err - } - - for _, codeHost := range codeHosts { - if option.CodeHostID != 0 && codeHost.ID == option.CodeHostID { - return codeHost, nil - } else if option.CodeHostID == 0 && option.CodeHostType != "" { - switch option.CodeHostType { - case codehost.GitHubProvider: - ns := strings.ToLower(codeHost.Namespace) - if strings.Contains(option.Address, codeHost.Address) && strings.ToLower(option.Namespace) == ns { - return codeHost, nil - } - default: - if strings.Contains(option.Address, codeHost.Address) { - return codeHost, nil - } - } - } - } - - return nil, errors.New("not find codeHost") -} - -func (c *Client) GetCodeHostInfoByID(id int) (*models.CodeHost, error) { - return c.GetCodeHostInfo(&Option{CodeHostID: id}) -} - -type Detail struct { - ID int `json:"id"` - Name string `json:"name"` - Address string `json:"address"` - Owner string `json:"repoowner"` - Source string `json:"source"` - OauthToken string `json:"oauth_token"` - Region string `json:"region"` - Username string `json:"username"` - Password string `json:"password"` - AccessKey string `json:"applicationId"` - SecretKey string `json:"clientSecret"` -} - -func (c *Client) GetCodehostDetail(codehostID int) (*Detail, error) { - codehost, err := c.GetCodeHostInfo(&Option{CodeHostID: codehostID}) - if err != nil { - return nil, err - } - detail := &Detail{ - codehostID, - "", - codehost.Address, - codehost.Namespace, - codehost.Type, - codehost.AccessToken, - codehost.Region, - codehost.Username, - codehost.Password, - codehost.ApplicationId, - codehost.ClientSecret, - } - - return detail, nil -} - -func (c *Client) ListCodehostDetial() ([]*Detail, error) { - codehosts, err := c.GetCodeHostList() - if err != nil { - return nil, err - } - - var details []*Detail - - for _, codehost := range codehosts { - details = append(details, &Detail{ - codehost.ID, - "", - codehost.Address, - codehost.Namespace, - codehost.Type, - codehost.AccessToken, - codehost.Region, - codehost.Username, - codehost.Password, - codehost.ApplicationId, - codehost.ClientSecret, - }) - } - - return details, nil -} -- Gitee From 6e5913650a45dd900c4b54d305e7aad7f83159c9 Mon Sep 17 00:00:00 2001 From: mouuii Date: Mon, 8 Nov 2021 16:59:50 +0800 Subject: [PATCH 274/405] codehost client Signed-off-by: mouuii --- pkg/shared/client/systemconfig/codehost.go | 30 +++++++++++++++------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/pkg/shared/client/systemconfig/codehost.go b/pkg/shared/client/systemconfig/codehost.go index e2d88df9f..81e0515a2 100644 --- a/pkg/shared/client/systemconfig/codehost.go +++ b/pkg/shared/client/systemconfig/codehost.go @@ -5,13 +5,25 @@ import ( "fmt" "strings" - "github.com/koderover/zadig/pkg/microservice/systemconfig/core/codehost/repository/models" "github.com/koderover/zadig/pkg/shared/codehost" "github.com/koderover/zadig/pkg/tool/httpclient" ) -func GetCodeHostList() ([]*models.CodeHost, error) { - var list []*models.CodeHost +type CodeHost struct { + ID int `json:"id"` + Address string `json:"address"` + Type string `json:"type"` + AccessToken string `json:"accessToken"` + Namespace string `json:"namespace"` + Region string `json:"region"` + AccessKey string `json:"applicationId"` + SecretKey string `json:"clientSecret"` + Username string `json:"username"` + Password string `json:"password"` +} + +func GetCodeHostList() ([]*CodeHost, error) { + var list []*CodeHost _, err := New().Post(fmt.Sprintf("/api/v1/codehost"), httpclient.SetResult(&list)) if err != nil { return nil, err @@ -26,7 +38,7 @@ type Option struct { CodeHostID int } -func GetCodeHostInfo(option *Option) (*models.CodeHost, error) { +func GetCodeHostInfo(option *Option) (*CodeHost, error) { codeHosts, err := GetCodeHostList() if err != nil { return nil, err @@ -53,7 +65,7 @@ func GetCodeHostInfo(option *Option) (*models.CodeHost, error) { return nil, errors.New("not find codeHost") } -func (c *Client) GetCodeHostInfoByID(id int) (*models.CodeHost, error) { +func (c *Client) GetCodeHostInfoByID(id int) (*CodeHost, error) { return GetCodeHostInfo(&Option{CodeHostID: id}) } @@ -86,8 +98,8 @@ func (c *Client) GetCodehostDetail(codehostID int) (*Detail, error) { codehost.Region, codehost.Username, codehost.Password, - codehost.ApplicationId, - codehost.ClientSecret, + codehost.AccessKey, + codehost.SecretKey, } return detail, nil @@ -112,8 +124,8 @@ func (c *Client) ListCodehostDetial() ([]*Detail, error) { codehost.Region, codehost.Username, codehost.Password, - codehost.ApplicationId, - codehost.ClientSecret, + codehost.AccessKey, + codehost.SecretKey, }) } -- Gitee From 4de0b59e6127f9ce4dfac2fdfdc4aa60fd61b3ba Mon Sep 17 00:00:00 2001 From: mouuii Date: Mon, 8 Nov 2021 17:03:37 +0800 Subject: [PATCH 275/405] add id json Signed-off-by: mouuii --- .../systemconfig/core/codehost/repository/models/codehost.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/microservice/systemconfig/core/codehost/repository/models/codehost.go b/pkg/microservice/systemconfig/core/codehost/repository/models/codehost.go index 8ff1b9d90..522440d04 100644 --- a/pkg/microservice/systemconfig/core/codehost/repository/models/codehost.go +++ b/pkg/microservice/systemconfig/core/codehost/repository/models/codehost.go @@ -1,7 +1,7 @@ package models type CodeHost struct { - ID int `bson:"id"` + ID int `bson:"id" json:"id"` Name string `bson:"name" json:"name"` Type string `bson:"type" json:"type"` Address string `bson:"address" json:"address"` -- Gitee From b63fa374d28c8fda205bd3d960026cca554f9df0 Mon Sep 17 00:00:00 2001 From: mouuii Date: Mon, 8 Nov 2021 17:16:40 +0800 Subject: [PATCH 276/405] replace client Signed-off-by: mouuii --- .../aslan/core/code/handler/codehost.go | 7 +++---- .../aslan/core/code/service/branch.go | 6 +++--- .../aslan/core/code/service/merge_request.go | 6 +++--- .../aslan/core/code/service/namespace.go | 6 +++--- .../aslan/core/code/service/project.go | 6 +++--- .../aslan/core/code/service/tag.go | 6 +++--- .../aslan/core/code/service/workspace.go | 5 ++--- .../core/common/service/command/git_cmd.go | 4 ++-- .../core/common/service/config_payload.go | 4 ++-- .../aslan/core/common/service/fs/git.go | 3 +-- .../aslan/core/common/service/gerrit/gerrit.go | 3 +-- .../core/common/service/scmnotify/client.go | 3 +-- .../aslan/core/common/service/service.go | 14 +++++++------- .../aslan/core/common/service/workflow.go | 5 ++--- .../aslan/core/service/service/helm.go | 3 +-- .../aslan/core/service/service/loader.go | 6 +++--- .../aslan/core/service/service/service.go | 16 ++++++++-------- .../core/workflow/service/webhook/gerrit.go | 8 ++++---- .../service/webhook/gerrit_workflow_task.go | 6 +++--- .../core/workflow/service/webhook/github.go | 10 +++++----- .../service/webhook/github_workflow_task.go | 3 +-- .../service/webhook/gitlab_workflow_task.go | 7 +++---- .../core/workflow/service/webhook/utils.go | 13 +++++++------ .../core/workflow/service/workflow/gerrit.go | 18 +++++++++--------- .../core/workflow/service/workflow/github.go | 3 +-- .../core/workflow/service/workflow/gitlab.go | 14 +++++++------- .../service/workflow/pipeline_validation.go | 9 +++++---- pkg/shared/client/systemconfig/codehost.go | 6 +++--- 28 files changed, 96 insertions(+), 104 deletions(-) diff --git a/pkg/microservice/aslan/core/code/handler/codehost.go b/pkg/microservice/aslan/core/code/handler/codehost.go index 85a7198e1..211114b36 100644 --- a/pkg/microservice/aslan/core/code/handler/codehost.go +++ b/pkg/microservice/aslan/core/code/handler/codehost.go @@ -24,9 +24,8 @@ import ( "github.com/koderover/zadig/pkg/microservice/aslan/core/code/service" "github.com/koderover/zadig/pkg/setting" - "github.com/koderover/zadig/pkg/shared/codehost" + "github.com/koderover/zadig/pkg/shared/client/systemconfig" internalhandler "github.com/koderover/zadig/pkg/shared/handler" - "github.com/koderover/zadig/pkg/shared/poetry" e "github.com/koderover/zadig/pkg/tool/errors" ) @@ -34,8 +33,8 @@ func GetCodeHostList(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - codeHostSlice := make([]*poetry.CodeHost, 0) - codeHosts, err := codehost.GetCodeHostList() + codeHostSlice := make([]*systemconfig.CodeHost, 0) + codeHosts, err := systemconfig.GetCodeHostList() ctx.Err = err for _, codeHost := range codeHosts { codeHost.AccessToken = setting.MaskValue diff --git a/pkg/microservice/aslan/core/code/service/branch.go b/pkg/microservice/aslan/core/code/service/branch.go index 3945aa41c..fecb306ac 100644 --- a/pkg/microservice/aslan/core/code/service/branch.go +++ b/pkg/microservice/aslan/core/code/service/branch.go @@ -23,7 +23,7 @@ import ( "github.com/koderover/zadig/pkg/microservice/aslan/config" git "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/github" - "github.com/koderover/zadig/pkg/shared/codehost" + "github.com/koderover/zadig/pkg/shared/client/systemconfig" "github.com/koderover/zadig/pkg/tool/codehub" e "github.com/koderover/zadig/pkg/tool/errors" "github.com/koderover/zadig/pkg/tool/gerrit" @@ -31,10 +31,10 @@ import ( ) func CodeHostListBranches(codeHostID int, projectName, namespace string, log *zap.SugaredLogger) ([]*Branch, error) { - opt := &codehost.Option{ + opt := &systemconfig.Option{ CodeHostID: codeHostID, } - ch, err := codehost.GetCodeHostInfo(opt) + ch, err := systemconfig.GetCodeHostInfo(opt) if err != nil { return nil, e.ErrCodehostListBranches.AddDesc("git client is nil") } diff --git a/pkg/microservice/aslan/core/code/service/merge_request.go b/pkg/microservice/aslan/core/code/service/merge_request.go index 4f0d78e0d..6d0633569 100644 --- a/pkg/microservice/aslan/core/code/service/merge_request.go +++ b/pkg/microservice/aslan/core/code/service/merge_request.go @@ -24,17 +24,17 @@ import ( "github.com/koderover/zadig/pkg/microservice/aslan/config" git "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/github" - "github.com/koderover/zadig/pkg/shared/codehost" + "github.com/koderover/zadig/pkg/shared/client/systemconfig" e "github.com/koderover/zadig/pkg/tool/errors" "github.com/koderover/zadig/pkg/tool/gerrit" "github.com/koderover/zadig/pkg/tool/git/gitlab" ) func CodeHostListPRs(codeHostID int, projectName, namespace, targetBr string, log *zap.SugaredLogger) ([]*PullRequest, error) { - opt := &codehost.Option{ + opt := &systemconfig.Option{ CodeHostID: codeHostID, } - ch, err := codehost.GetCodeHostInfo(opt) + ch, err := systemconfig.GetCodeHostInfo(opt) if err != nil { return nil, e.ErrCodehostListPrs.AddDesc("git client is nil") } diff --git a/pkg/microservice/aslan/core/code/service/namespace.go b/pkg/microservice/aslan/core/code/service/namespace.go index 5b5923de0..b8e679307 100644 --- a/pkg/microservice/aslan/core/code/service/namespace.go +++ b/pkg/microservice/aslan/core/code/service/namespace.go @@ -23,7 +23,7 @@ import ( "github.com/koderover/zadig/pkg/microservice/aslan/config" git "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/github" - "github.com/koderover/zadig/pkg/shared/codehost" + "github.com/koderover/zadig/pkg/shared/client/systemconfig" "github.com/koderover/zadig/pkg/tool/codehub" e "github.com/koderover/zadig/pkg/tool/errors" "github.com/koderover/zadig/pkg/tool/gerrit" @@ -41,10 +41,10 @@ const ( ) func CodeHostListNamespaces(codeHostID int, keyword string, log *zap.SugaredLogger) ([]*Namespace, error) { - opt := &codehost.Option{ + opt := &systemconfig.Option{ CodeHostID: codeHostID, } - ch, err := codehost.GetCodeHostInfo(opt) + ch, err := systemconfig.GetCodeHostInfo(opt) if err != nil { return nil, e.ErrCodehostListNamespaces.AddDesc("git client is nil") } diff --git a/pkg/microservice/aslan/core/code/service/project.go b/pkg/microservice/aslan/core/code/service/project.go index 38103faf2..316327e6d 100644 --- a/pkg/microservice/aslan/core/code/service/project.go +++ b/pkg/microservice/aslan/core/code/service/project.go @@ -23,7 +23,7 @@ import ( "github.com/koderover/zadig/pkg/microservice/aslan/config" git "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/github" - "github.com/koderover/zadig/pkg/shared/codehost" + "github.com/koderover/zadig/pkg/shared/client/systemconfig" "github.com/koderover/zadig/pkg/tool/codehub" e "github.com/koderover/zadig/pkg/tool/errors" "github.com/koderover/zadig/pkg/tool/gerrit" @@ -31,10 +31,10 @@ import ( ) func CodeHostListProjects(codeHostID int, namespace, namespaceType, keyword string, log *zap.SugaredLogger) ([]*Project, error) { - opt := &codehost.Option{ + opt := &systemconfig.Option{ CodeHostID: codeHostID, } - ch, err := codehost.GetCodeHostInfo(opt) + ch, err := systemconfig.GetCodeHostInfo(opt) if err != nil { log.Error(err) return nil, e.ErrCodehostListProjects.AddDesc("git client is nil") diff --git a/pkg/microservice/aslan/core/code/service/tag.go b/pkg/microservice/aslan/core/code/service/tag.go index 90dd3cc31..dc77ed549 100644 --- a/pkg/microservice/aslan/core/code/service/tag.go +++ b/pkg/microservice/aslan/core/code/service/tag.go @@ -23,7 +23,7 @@ import ( "github.com/koderover/zadig/pkg/microservice/aslan/config" git "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/github" - "github.com/koderover/zadig/pkg/shared/codehost" + "github.com/koderover/zadig/pkg/shared/client/systemconfig" "github.com/koderover/zadig/pkg/tool/codehub" e "github.com/koderover/zadig/pkg/tool/errors" "github.com/koderover/zadig/pkg/tool/gerrit" @@ -31,10 +31,10 @@ import ( ) func CodeHostListTags(codeHostID int, projectName string, namespace string, log *zap.SugaredLogger) ([]*Tag, error) { - opt := &codehost.Option{ + opt := &systemconfig.Option{ CodeHostID: codeHostID, } - ch, err := codehost.GetCodeHostInfo(opt) + ch, err := systemconfig.GetCodeHostInfo(opt) if err != nil { log.Error(err) return nil, e.ErrCodehostListTags.AddDesc("git client is nil") diff --git a/pkg/microservice/aslan/core/code/service/workspace.go b/pkg/microservice/aslan/core/code/service/workspace.go index 751e008ac..6eac61dc6 100644 --- a/pkg/microservice/aslan/core/code/service/workspace.go +++ b/pkg/microservice/aslan/core/code/service/workspace.go @@ -28,7 +28,6 @@ import ( "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/command" "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/fs" "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/git" - "github.com/koderover/zadig/pkg/shared/codehost" "github.com/koderover/zadig/pkg/tool/codehub" e "github.com/koderover/zadig/pkg/tool/errors" ) @@ -145,7 +144,7 @@ func GetGitRepoInfo(codehostID int, repoOwner, repoName, branchName, remoteName, if err := os.RemoveAll(base); err != nil { log.Errorf("dir remove err:%v", err) } - detail, err := codehost.GetCodehostDetail(codehostID) + detail, err := systemconfig.GetCodehostDetail(codehostID) if err != nil { log.Errorf("GetGitRepoInfo GetCodehostDetail err:%v", err) return fis, e.ErrListRepoDir.AddDesc(err.Error()) @@ -189,7 +188,7 @@ type CodehostFileInfo struct { func GetCodehubRepoInfo(codehostID int, repoUUID, branchName, path string, log *zap.SugaredLogger) ([]*CodehostFileInfo, error) { fileInfos := make([]*CodehostFileInfo, 0) - detail, err := codehost.GetCodehostDetail(codehostID) + detail, err := systemconfig.GetCodehostDetail(codehostID) if err != nil { log.Errorf("GetCodehubRepoInfo GetCodehostDetail err:%s", err) return fileInfos, e.ErrListWorkspace.AddDesc(err.Error()) diff --git a/pkg/microservice/aslan/core/common/service/command/git_cmd.go b/pkg/microservice/aslan/core/common/service/command/git_cmd.go index d47f3f8cb..f60a2170b 100644 --- a/pkg/microservice/aslan/core/common/service/command/git_cmd.go +++ b/pkg/microservice/aslan/core/common/service/command/git_cmd.go @@ -30,7 +30,7 @@ import ( "github.com/koderover/zadig/pkg/microservice/aslan/config" "github.com/koderover/zadig/pkg/setting" - "github.com/koderover/zadig/pkg/shared/codehost" + "github.com/koderover/zadig/pkg/shared/client/systemconfig" "github.com/koderover/zadig/pkg/tool/log" ) @@ -65,7 +65,7 @@ type Command struct { IgnoreError bool } -func RunGitCmds(codehostDetail *codehost.Detail, repoOwner, repoName, branchName, remoteName string) error { +func RunGitCmds(codehostDetail *systemconfig.Detail, repoOwner, repoName, branchName, remoteName string) error { var ( tokens []string repo *Repo diff --git a/pkg/microservice/aslan/core/common/service/config_payload.go b/pkg/microservice/aslan/core/common/service/config_payload.go index 7c15bd52d..8adf52d13 100644 --- a/pkg/microservice/aslan/core/common/service/config_payload.go +++ b/pkg/microservice/aslan/core/common/service/config_payload.go @@ -21,7 +21,7 @@ import ( "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/models" "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/mongodb" "github.com/koderover/zadig/pkg/setting" - "github.com/koderover/zadig/pkg/shared/codehost" + "github.com/koderover/zadig/pkg/shared/client/systemconfig" ) func GetConfigPayload(codeHostID int) *models.ConfigPayload { @@ -73,7 +73,7 @@ func GetConfigPayload(codeHostID int) *models.ConfigPayload { } if codeHostID > 0 { - ch, _ := codehost.GetCodeHostInfoByID(codeHostID) + ch, _ := systemconfig.GetCodeHostInfoByID(codeHostID) if ch != nil && ch.Type == setting.SourceFromGithub { payload.Github.AccessToken = ch.AccessToken } diff --git a/pkg/microservice/aslan/core/common/service/fs/git.go b/pkg/microservice/aslan/core/common/service/fs/git.go index 12b5c9003..a7dce1a06 100644 --- a/pkg/microservice/aslan/core/common/service/fs/git.go +++ b/pkg/microservice/aslan/core/common/service/fs/git.go @@ -27,7 +27,6 @@ import ( githubservice "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/github" gitlabservice "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/gitlab" "github.com/koderover/zadig/pkg/setting" - "github.com/koderover/zadig/pkg/shared/codehost" "github.com/koderover/zadig/pkg/tool/log" ) @@ -101,7 +100,7 @@ func GetPublicTreeGetter(repoLink string) (TreeGetter, error) { } func GetTreeGetter(codeHostID int) (TreeGetter, error) { - ch, err := codehost.GetCodeHostInfoByID(codeHostID) + ch, err := systemconfig.GetCodeHostInfoByID(codeHostID) if err != nil { log.Errorf("Failed to get codeHost by id %d, err: %s", codeHostID, err) return nil, err diff --git a/pkg/microservice/aslan/core/common/service/gerrit/gerrit.go b/pkg/microservice/aslan/core/common/service/gerrit/gerrit.go index 570681775..dc01a6a24 100644 --- a/pkg/microservice/aslan/core/common/service/gerrit/gerrit.go +++ b/pkg/microservice/aslan/core/common/service/gerrit/gerrit.go @@ -26,7 +26,6 @@ import ( "github.com/koderover/zadig/pkg/microservice/aslan/config" "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/models" - "github.com/koderover/zadig/pkg/shared/codehost" "github.com/koderover/zadig/pkg/tool/gerrit" ) @@ -37,7 +36,7 @@ func DeleteGerritWebhook(workflow *models.Workflow, log *zap.SugaredLogger) erro continue } - detail, err := codehost.GetCodeHostInfoByID(workflowWebhook.MainRepo.CodehostID) + detail, err := systemconfig.GetCodeHostInfoByID(workflowWebhook.MainRepo.CodehostID) if err != nil { log.Errorf("DeleteGerritWebhook GetCodehostDetail err:%v", err) continue diff --git a/pkg/microservice/aslan/core/common/service/scmnotify/client.go b/pkg/microservice/aslan/core/common/service/scmnotify/client.go index f7299ce33..7fcbc14a9 100644 --- a/pkg/microservice/aslan/core/common/service/scmnotify/client.go +++ b/pkg/microservice/aslan/core/common/service/scmnotify/client.go @@ -27,7 +27,6 @@ import ( "github.com/koderover/zadig/pkg/microservice/aslan/config" "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/models" - "github.com/koderover/zadig/pkg/shared/codehost" "github.com/koderover/zadig/pkg/tool/gerrit" gitlabtool "github.com/koderover/zadig/pkg/tool/git/gitlab" "github.com/koderover/zadig/pkg/tool/log" @@ -55,7 +54,7 @@ func (c *Client) Comment(notify *models.Notification) error { } } - codeHostDetail, err := codehost.GetCodeHostInfoByID(notify.CodehostID) + codeHostDetail, err := systemconfig.GetCodeHostInfoByID(notify.CodehostID) if err != nil { return errors.Wrapf(err, "codehost %d not found to comment", notify.CodehostID) } diff --git a/pkg/microservice/aslan/core/common/service/service.go b/pkg/microservice/aslan/core/common/service/service.go index 31d13b288..6bfed47c2 100644 --- a/pkg/microservice/aslan/core/common/service/service.go +++ b/pkg/microservice/aslan/core/common/service/service.go @@ -37,7 +37,7 @@ import ( templaterepo "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/mongodb/template" "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/webhook" "github.com/koderover/zadig/pkg/setting" - "github.com/koderover/zadig/pkg/shared/codehost" + "github.com/koderover/zadig/pkg/shared/client/systemconfig" "github.com/koderover/zadig/pkg/shared/poetry" e "github.com/koderover/zadig/pkg/tool/errors" "github.com/koderover/zadig/pkg/tool/log" @@ -131,7 +131,7 @@ func ListServiceTemplate(productName string, log *zap.SugaredLogger) (*ServiceTm return nil, e.ErrListTemplate.AddDesc(err.Error()) } - details, err := codehost.ListCodehostDetial() + details, err := systemconfig.ListCodehostDetial() if err != nil { log.Errorf("无法从原有数据中恢复加载信息, listCodehostDetail failed err: %+v", err) return nil, e.ErrListTemplate.AddDesc(err.Error()) @@ -162,8 +162,8 @@ func ListServiceTemplate(productName string, log *zap.SugaredLogger) (*ServiceTm return nil, err } - detail, err := codehost.GetCodeHostInfo( - &codehost.Option{CodeHostType: poetry.GitHubProvider, Address: address, Namespace: owner}) + detail, err := systemconfig.GetCodeHostInfo( + &systemconfig.Option{CodeHostType: poetry.GitHubProvider, Address: address, Namespace: owner}) if err != nil { log.Errorf("get github codeHostInfo failed, err:%v", err) return nil, err @@ -318,7 +318,7 @@ func GetServiceTemplate(serviceName, serviceType, productName, excludeStatus str if resp.Source == setting.SourceFromGitlab && resp.RepoName == "" { if gitlabAddress, err := GetGitlabAddress(resp.SrcPath); err == nil { - if details, err := codehost.ListCodehostDetial(); err == nil { + if details, err := systemconfig.ListCodehostDetial(); err == nil { for _, detail := range details { if strings.Contains(detail.Address, gitlabAddress) { resp.GerritCodeHostID = detail.ID @@ -355,8 +355,8 @@ func GetServiceTemplate(serviceName, serviceType, productName, excludeStatus str return nil, err } - detail, err := codehost.GetCodeHostInfo( - &codehost.Option{CodeHostType: poetry.GitHubProvider, Address: address, Namespace: owner, CodeHostID: resp.CodehostID}) + detail, err := systemconfig.GetCodeHostInfo( + &systemconfig.Option{CodeHostType: poetry.GitHubProvider, Address: address, Namespace: owner, CodeHostID: resp.CodehostID}) if err != nil { log.Errorf("get github codeHostInfo failed, err:%v", err) return nil, err diff --git a/pkg/microservice/aslan/core/common/service/workflow.go b/pkg/microservice/aslan/core/common/service/workflow.go index 36e82f91e..373e40975 100644 --- a/pkg/microservice/aslan/core/common/service/workflow.go +++ b/pkg/microservice/aslan/core/common/service/workflow.go @@ -30,7 +30,6 @@ import ( "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/gerrit" "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/webhook" "github.com/koderover/zadig/pkg/setting" - "github.com/koderover/zadig/pkg/shared/codehost" e "github.com/koderover/zadig/pkg/tool/errors" ) @@ -167,7 +166,7 @@ func ProcessWebhook(updatedHooks, currentHooks interface{}, name string, logger wg.Add(1) go func(wh hookItem) { defer wg.Done() - ch, err := codehost.GetCodeHostInfoByID(wh.codeHostID) + ch, err := systemconfig.GetCodeHostInfoByID(wh.codeHostID) if err != nil { logger.Errorf("Failed to get codeHost by id %d, err: %s", wh.codeHostID, err) errs = multierror.Append(errs, err) @@ -201,7 +200,7 @@ func ProcessWebhook(updatedHooks, currentHooks interface{}, name string, logger wg.Add(1) go func(wh hookItem) { defer wg.Done() - ch, err := codehost.GetCodeHostInfoByID(wh.codeHostID) + ch, err := systemconfig.GetCodeHostInfoByID(wh.codeHostID) if err != nil { logger.Errorf("Failed to get codeHost by id %d, err: %s", wh.codeHostID, err) errs = multierror.Append(errs, err) diff --git a/pkg/microservice/aslan/core/service/service/helm.go b/pkg/microservice/aslan/core/service/service/helm.go index 7cc0ede39..d7d108cf1 100644 --- a/pkg/microservice/aslan/core/service/service/helm.go +++ b/pkg/microservice/aslan/core/service/service/helm.go @@ -47,7 +47,6 @@ import ( templatestore "github.com/koderover/zadig/pkg/microservice/aslan/core/templatestore/repository/models" "github.com/koderover/zadig/pkg/microservice/aslan/core/templatestore/repository/mongodb" "github.com/koderover/zadig/pkg/setting" - "github.com/koderover/zadig/pkg/shared/codehost" "github.com/koderover/zadig/pkg/shared/poetry" e "github.com/koderover/zadig/pkg/tool/errors" "github.com/koderover/zadig/pkg/tool/log" @@ -349,7 +348,7 @@ func getCodehostType(repoArgs *CreateFromRepo, repoLink string) (string, *poetry if repoLink != "" { return setting.SourceFromPublicRepo, nil, nil } - ch, err := codehost.GetCodeHostInfoByID(repoArgs.CodehostID) + ch, err := systemconfig.GetCodeHostInfoByID(repoArgs.CodehostID) if err != nil { log.Errorf("Failed to get codeHost by id %d, err: %s", repoArgs.CodehostID, err.Error()) return "", ch, err diff --git a/pkg/microservice/aslan/core/service/service/loader.go b/pkg/microservice/aslan/core/service/service/loader.go index 4c9434afe..28393c1ba 100644 --- a/pkg/microservice/aslan/core/service/service/loader.go +++ b/pkg/microservice/aslan/core/service/service/loader.go @@ -53,7 +53,7 @@ type LoadServiceReq struct { func PreloadServiceFromCodeHost(codehostID int, repoOwner, repoName, repoUUID, branchName, remoteName, path string, isDir bool, log *zap.SugaredLogger) ([]string, error) { var ret []string - ch, err := codehost.GetCodeHostInfoByID(codehostID) + ch, err := systemconfig.GetCodeHostInfoByID(codehostID) if err != nil { log.Errorf("Failed to load codehost for preload service list, the error is: %+v", err) return nil, e.ErrPreloadServiceTemplate.AddDesc(err.Error()) @@ -74,7 +74,7 @@ func PreloadServiceFromCodeHost(codehostID int, repoOwner, repoName, repoUUID, b // LoadServiceFromCodeHost 根据提供的codehost信息加载服务 func LoadServiceFromCodeHost(username string, codehostID int, repoOwner, repoName, repoUUID, branchName, remoteName string, args *LoadServiceReq, log *zap.SugaredLogger) error { - ch, err := codehost.GetCodeHostInfoByID(codehostID) + ch, err := systemconfig.GetCodeHostInfoByID(codehostID) if err != nil { log.Errorf("Failed to load codehost for preload service list, the error is: %+v", err) return e.ErrLoadServiceTemplate.AddDesc(err.Error()) @@ -93,7 +93,7 @@ func LoadServiceFromCodeHost(username string, codehostID int, repoOwner, repoNam // ValidateServiceUpdate 根据服务名和提供的加载信息确认是否可以更新服务加载地址 func ValidateServiceUpdate(codehostID int, serviceName, repoOwner, repoName, repoUUID, branchName, remoteName, path string, isDir bool, log *zap.SugaredLogger) error { - detail, err := codehost.GetCodeHostInfoByID(codehostID) + detail, err := systemconfig.GetCodeHostInfoByID(codehostID) if err != nil { log.Errorf("Failed to load codehost for validate service update, the error is: %+v", err) return e.ErrValidateServiceUpdate.AddDesc(err.Error()) diff --git a/pkg/microservice/aslan/core/service/service/service.go b/pkg/microservice/aslan/core/service/service/service.go index 17cf5c53c..76165275a 100644 --- a/pkg/microservice/aslan/core/service/service/service.go +++ b/pkg/microservice/aslan/core/service/service/service.go @@ -46,7 +46,7 @@ import ( "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/kube" "github.com/koderover/zadig/pkg/microservice/aslan/core/environment/service" "github.com/koderover/zadig/pkg/setting" - "github.com/koderover/zadig/pkg/shared/codehost" + "github.com/koderover/zadig/pkg/shared/client/systemconfig" e "github.com/koderover/zadig/pkg/tool/errors" "github.com/koderover/zadig/pkg/tool/gerrit" "github.com/koderover/zadig/pkg/tool/httpclient" @@ -1279,10 +1279,10 @@ func getCronJobContainers(data string) ([]*commonmodels.Container, error) { } func updateGerritWebhookByService(lastService, currentService *commonmodels.Service) error { - var codehostDetail *codehost.Detail + var codehostDetail *systemconfig.Detail var err error if lastService != nil && lastService.Source == setting.SourceFromGerrit { - codehostDetail, err = codehost.GetCodehostDetail(lastService.GerritCodeHostID) + codehostDetail, err = systemconfig.GetCodehostDetail(lastService.GerritCodeHostID) if err != nil { log.Errorf("updateGerritWebhookByService GetCodehostDetail err:%v", err) return err @@ -1295,11 +1295,11 @@ func updateGerritWebhookByService(lastService, currentService *commonmodels.Serv log.Errorf("updateGerritWebhookByService deleteGerritWebhook err:%v", err) } } - var detail *codehost.Detail + var detail *systemconfig.Detail if lastService.GerritCodeHostID == currentService.GerritCodeHostID && codehostDetail != nil { detail = codehostDetail } else { - detail, _ = codehost.GetCodehostDetail(currentService.GerritCodeHostID) + detail, _ = systemconfig.GetCodehostDetail(currentService.GerritCodeHostID) } cl := gerrit.NewHTTPClient(detail.Address, detail.OauthToken) @@ -1322,7 +1322,7 @@ func updateGerritWebhookByService(lastService, currentService *commonmodels.Serv } func createGerritWebhookByService(codehostID int, serviceName, repoName, branchName string) error { - detail, err := codehost.GetCodehostDetail(codehostID) + detail, err := systemconfig.GetCodehostDetail(codehostID) if err != nil { log.Errorf("createGerritWebhookByService GetCodehostDetail err:%v", err) return err @@ -1347,7 +1347,7 @@ func createGerritWebhookByService(codehostID int, serviceName, repoName, branchN return nil } -func syncGerritLatestCommit(service *commonmodels.Service) (*codehost.Detail, error) { +func syncGerritLatestCommit(service *commonmodels.Service) (*systemconfig.Detail, error) { if service.GerritCodeHostID == 0 { return nil, fmt.Errorf("codehostId不能是空的") } @@ -1357,7 +1357,7 @@ func syncGerritLatestCommit(service *commonmodels.Service) (*codehost.Detail, er if service.GerritBranchName == "" { return nil, fmt.Errorf("branchName不能是空的") } - ch, _ := codehost.GetCodehostDetail(service.GerritCodeHostID) + ch, _ := systemconfig.GetCodehostDetail(service.GerritCodeHostID) gerritCli := gerrit.NewClient(ch.Address, ch.OauthToken) commit, err := gerritCli.GetCommitByBranch(service.GerritRepoName, service.GerritBranchName) diff --git a/pkg/microservice/aslan/core/workflow/service/webhook/gerrit.go b/pkg/microservice/aslan/core/workflow/service/webhook/gerrit.go index b3df30c12..3569bcbef 100644 --- a/pkg/microservice/aslan/core/workflow/service/webhook/gerrit.go +++ b/pkg/microservice/aslan/core/workflow/service/webhook/gerrit.go @@ -36,7 +36,7 @@ import ( "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/command" gerritservice "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/gerrit" "github.com/koderover/zadig/pkg/setting" - "github.com/koderover/zadig/pkg/shared/codehost" + "github.com/koderover/zadig/pkg/shared/client/systemconfig" e "github.com/koderover/zadig/pkg/tool/errors" "github.com/koderover/zadig/pkg/tool/gerrit" "github.com/koderover/zadig/pkg/util" @@ -94,7 +94,7 @@ func updateServiceTemplateByGerritEvent(uri string, log *zap.SugaredLogger) erro log.Errorf("updateServiceTemplateByGerritEvent GetServiceTemplate err:%v", err) errs = multierror.Append(errs, err) } - detail, err := codehost.GetCodehostDetail(service.GerritCodeHostID) + detail, err := systemconfig.GetCodehostDetail(service.GerritCodeHostID) if err != nil { log.Errorf("updateServiceTemplateByGerritEvent GetCodehostDetail err:%v", err) errs = multierror.Append(errs, err) @@ -228,7 +228,7 @@ func SyncServiceTemplateFromGerrit(service *commonmodels.Service, log *zap.Sugar return nil } -func syncGerritLatestCommit(service *commonmodels.Service) (*codehost.Detail, error) { +func syncGerritLatestCommit(service *commonmodels.Service) (*systemconfig.Detail, error) { if service.GerritCodeHostID == 0 { return nil, fmt.Errorf("codehostId不能是空的") } @@ -238,7 +238,7 @@ func syncGerritLatestCommit(service *commonmodels.Service) (*codehost.Detail, er if service.GerritBranchName == "" { return nil, fmt.Errorf("branchName不能是空的") } - detail, err := codehost.GetCodehostDetail(service.GerritCodeHostID) + detail, err := systemconfig.GetCodehostDetail(service.GerritCodeHostID) if err != nil { return nil, err } diff --git a/pkg/microservice/aslan/core/workflow/service/webhook/gerrit_workflow_task.go b/pkg/microservice/aslan/core/workflow/service/webhook/gerrit_workflow_task.go index 10843579f..86425582d 100644 --- a/pkg/microservice/aslan/core/workflow/service/webhook/gerrit_workflow_task.go +++ b/pkg/microservice/aslan/core/workflow/service/webhook/gerrit_workflow_task.go @@ -34,7 +34,7 @@ import ( "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/scmnotify" workflowservice "github.com/koderover/zadig/pkg/microservice/aslan/core/workflow/service/workflow" "github.com/koderover/zadig/pkg/setting" - "github.com/koderover/zadig/pkg/shared/codehost" + "github.com/koderover/zadig/pkg/shared/client/systemconfig" "github.com/koderover/zadig/pkg/tool/gerrit" "github.com/koderover/zadig/pkg/types" ) @@ -305,7 +305,7 @@ func TriggerWorkflowByGerritEvent(event *gerritTypeEvent, body []byte, uri, base if item.WorkflowArgs == nil { continue } - detail, err := codehost.GetCodehostDetail(item.MainRepo.CodehostID) + detail, err := systemconfig.GetCodehostDetail(item.MainRepo.CodehostID) if err != nil { log.Errorf("TriggerWorkflowByGerritEvent GetCodehostDetail err:%v", err) return err @@ -410,7 +410,7 @@ func addWebHookUser(match gerritEventMatcher, domain string) { } } -func checkLatestTaskStaus(pipelineName, mergeRequestID, commitID string, detail *codehost.Detail, log *zap.SugaredLogger) bool { +func checkLatestTaskStaus(pipelineName, mergeRequestID, commitID string, detail *systemconfig.Detail, log *zap.SugaredLogger) bool { opt := &commonrepo.ListTaskOption{ PipelineName: pipelineName, Type: config.WorkflowType, diff --git a/pkg/microservice/aslan/core/workflow/service/webhook/github.go b/pkg/microservice/aslan/core/workflow/service/webhook/github.go index 2d6e23cea..5e0c4ef3a 100644 --- a/pkg/microservice/aslan/core/workflow/service/webhook/github.go +++ b/pkg/microservice/aslan/core/workflow/service/webhook/github.go @@ -37,7 +37,7 @@ import ( gitservice "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/git" workflowservice "github.com/koderover/zadig/pkg/microservice/aslan/core/workflow/service/workflow" "github.com/koderover/zadig/pkg/setting" - "github.com/koderover/zadig/pkg/shared/codehost" + "github.com/koderover/zadig/pkg/shared/client/systemconfig" "github.com/koderover/zadig/pkg/shared/poetry" e "github.com/koderover/zadig/pkg/tool/errors" githubtool "github.com/koderover/zadig/pkg/tool/git/github" @@ -188,8 +188,8 @@ func prEventToPipelineTasks(event *github.PullRequestEvent, requestID string, lo log.Errorf("GetAddress failed, url: %s, err: %s", event.Repo.GetURL(), err) return nil, err } - ch, err := codehost.GetCodeHostInfo( - &codehost.Option{CodeHostType: poetry.GitHubProvider, Address: address, Namespace: owner}) + ch, err := systemconfig.GetCodeHostInfo( + &systemconfig.Option{CodeHostType: poetry.GitHubProvider, Address: address, Namespace: owner}) if err != nil { log.Errorf("GetCodeHostInfo failed, err: %v", err) return nil, err @@ -327,8 +327,8 @@ func pushEventToPipelineTasks(event *github.PushEvent, requestID string, log *za log.Errorf("GetAddress failed, url: %s, err: %s", event.Repo.GetURL(), err) return nil, err } - ch, err := codehost.GetCodeHostInfo( - &codehost.Option{CodeHostType: poetry.GitHubProvider, Address: address, Namespace: owner}) + ch, err := systemconfig.GetCodeHostInfo( + &systemconfig.Option{CodeHostType: poetry.GitHubProvider, Address: address, Namespace: owner}) if err != nil { log.Errorf("GetCodeHostInfo failed, err: %v", err) return nil, err diff --git a/pkg/microservice/aslan/core/workflow/service/webhook/github_workflow_task.go b/pkg/microservice/aslan/core/workflow/service/webhook/github_workflow_task.go index 55741d4b3..b2dab64d3 100644 --- a/pkg/microservice/aslan/core/workflow/service/webhook/github_workflow_task.go +++ b/pkg/microservice/aslan/core/workflow/service/webhook/github_workflow_task.go @@ -33,7 +33,6 @@ import ( git "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/github" workflowservice "github.com/koderover/zadig/pkg/microservice/aslan/core/workflow/service/workflow" "github.com/koderover/zadig/pkg/setting" - "github.com/koderover/zadig/pkg/shared/codehost" "github.com/koderover/zadig/pkg/types" ) @@ -340,7 +339,7 @@ func TriggerWorkflowByGithubEvent(event interface{}, baseURI, deliveryID, reques } func findChangedFilesOfPullRequest(event *github.PullRequestEvent, codehostID int) ([]string, error) { - detail, err := codehost.GetCodehostDetail(codehostID) + detail, err := systemconfig.GetCodehostDetail(codehostID) if err != nil { return nil, fmt.Errorf("failed to find codehost %d: %v", codehostID, err) } diff --git a/pkg/microservice/aslan/core/workflow/service/webhook/gitlab_workflow_task.go b/pkg/microservice/aslan/core/workflow/service/webhook/gitlab_workflow_task.go index a0ff10bbe..103d67d05 100644 --- a/pkg/microservice/aslan/core/workflow/service/webhook/gitlab_workflow_task.go +++ b/pkg/microservice/aslan/core/workflow/service/webhook/gitlab_workflow_task.go @@ -36,7 +36,6 @@ import ( environmentservice "github.com/koderover/zadig/pkg/microservice/aslan/core/environment/service" workflowservice "github.com/koderover/zadig/pkg/microservice/aslan/core/workflow/service/workflow" "github.com/koderover/zadig/pkg/setting" - "github.com/koderover/zadig/pkg/shared/codehost" e "github.com/koderover/zadig/pkg/tool/errors" gitlabtool "github.com/koderover/zadig/pkg/tool/git/gitlab" "github.com/koderover/zadig/pkg/tool/log" @@ -151,7 +150,7 @@ func (gpem *gitlabPushEventMatcher) Match(hookRepo *commonmodels.MainHookRepo) ( hookRepo.Branch = getBranchFromRef(ev.Ref) var changedFiles []string - detail, err := codehost.GetCodehostDetail(hookRepo.CodehostID) + detail, err := systemconfig.GetCodehostDetail(hookRepo.CodehostID) if err != nil { gpem.log.Errorf("GetCodehostDetail error: %s", err) return false, err @@ -323,7 +322,7 @@ func TriggerWorkflowByGitlabEvent(event interface{}, baseURI, requestID string, } func findChangedFilesOfMergeRequest(event *gitlab.MergeEvent, codehostID int) ([]string, error) { - detail, err := codehost.GetCodehostDetail(codehostID) + detail, err := systemconfig.GetCodehostDetail(codehostID) if err != nil { return nil, fmt.Errorf("failed to find codehost %d: %v", codehostID, err) } @@ -343,7 +342,7 @@ func InitDiffNote(ev *gitlab.MergeEvent, mainRepo *commonmodels.MainHookRepo, lo body := "KodeRover CI 检查中..." // 调用gitlab api获取相关数据 - detail, err := codehost.GetCodehostDetail(mainRepo.CodehostID) + detail, err := systemconfig.GetCodehostDetail(mainRepo.CodehostID) if err != nil { log.Errorf("GetCodehostDetail failed, codehost:%d, err:%v", mainRepo.CodehostID, err) return fmt.Errorf("failed to find codehost %d: %v", mainRepo.CodehostID, err) diff --git a/pkg/microservice/aslan/core/workflow/service/webhook/utils.go b/pkg/microservice/aslan/core/workflow/service/webhook/utils.go index 2b5531c67..a65bb34a6 100644 --- a/pkg/microservice/aslan/core/workflow/service/webhook/utils.go +++ b/pkg/microservice/aslan/core/workflow/service/webhook/utils.go @@ -35,6 +35,7 @@ import ( commonrepo "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/mongodb" "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/codehub" "github.com/koderover/zadig/pkg/setting" + "github.com/koderover/zadig/pkg/shared/client/systemconfig" "github.com/koderover/zadig/pkg/shared/codehost" "github.com/koderover/zadig/pkg/shared/poetry" e "github.com/koderover/zadig/pkg/tool/errors" @@ -199,11 +200,11 @@ func syncCodehubLatestCommit(service *commonmodels.Service) error { } func getCodehubClientByAddress(address string) (*codehub.Client, error) { - opt := &codehost.Option{ + opt := &systemconfig.Option{ Address: address, CodeHostType: codehost.CodeHubProvider, } - codehost, err := codehost.GetCodeHostInfo(opt) + codehost, err := systemconfig.GetCodeHostInfo(opt) if err != nil { log.Error(err) return nil, e.ErrCodehostListProjects.AddDesc("git client is nil") @@ -214,11 +215,11 @@ func getCodehubClientByAddress(address string) (*codehub.Client, error) { } func getGitlabClientByAddress(address string) (*gitlabtool.Client, error) { - opt := &codehost.Option{ + opt := &systemconfig.Option{ Address: address, CodeHostType: codehost.GitLabProvider, } - codehost, err := codehost.GetCodeHostInfo(opt) + codehost, err := systemconfig.GetCodeHostInfo(opt) if err != nil { log.Error(err) return nil, e.ErrCodehostListProjects.AddDesc("git client is nil") @@ -337,8 +338,8 @@ func syncContentFromGithub(args *commonmodels.Service, log *zap.SugaredLogger) e return errors.New("invalid url " + args.SrcPath) } - ch, err := codehost.GetCodeHostInfo( - &codehost.Option{CodeHostType: poetry.GitHubProvider, Address: address, Namespace: owner}) + ch, err := systemconfig.GetCodeHostInfo( + &systemconfig.Option{CodeHostType: poetry.GitHubProvider, Address: address, Namespace: owner}) if err != nil { log.Errorf("GetCodeHostInfo failed, srcPath:%s, err:%v", args.SrcPath, err) return err diff --git a/pkg/microservice/aslan/core/workflow/service/workflow/gerrit.go b/pkg/microservice/aslan/core/workflow/service/workflow/gerrit.go index b5be0c5ed..54d855498 100644 --- a/pkg/microservice/aslan/core/workflow/service/workflow/gerrit.go +++ b/pkg/microservice/aslan/core/workflow/service/workflow/gerrit.go @@ -24,7 +24,7 @@ import ( "github.com/koderover/zadig/pkg/microservice/aslan/config" commonmodels "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/models" "github.com/koderover/zadig/pkg/setting" - "github.com/koderover/zadig/pkg/shared/codehost" + "github.com/koderover/zadig/pkg/shared/client/systemconfig" "github.com/koderover/zadig/pkg/tool/gerrit" "github.com/koderover/zadig/pkg/tool/httpclient" ) @@ -36,10 +36,10 @@ func CreateGerritWebhook(workflow *commonmodels.Workflow, log *zap.SugaredLogger continue } - opt := &codehost.Option{ + opt := &systemconfig.Option{ CodeHostID: workflowWebhook.MainRepo.CodehostID, } - detail, err := codehost.GetCodeHostInfo(opt) + detail, err := systemconfig.GetCodeHostInfo(opt) if err != nil { return err } @@ -88,10 +88,10 @@ func UpdateGerritWebhook(currentWorkflow *commonmodels.Workflow, log *zap.Sugare continue } - opt := &codehost.Option{ + opt := &systemconfig.Option{ CodeHostID: oldWorkflowWebhook.MainRepo.CodehostID, } - detail, err := codehost.GetCodeHostInfo(opt) + detail, err := systemconfig.GetCodeHostInfo(opt) if err != nil { return err } @@ -113,10 +113,10 @@ func UpdateGerritWebhook(currentWorkflow *commonmodels.Workflow, log *zap.Sugare continue } - opt := &codehost.Option{ + opt := &systemconfig.Option{ CodeHostID: workflowWebhook.MainRepo.CodehostID, } - detail, err := codehost.GetCodeHostInfo(opt) + detail, err := systemconfig.GetCodeHostInfo(opt) if err != nil { return err } @@ -155,10 +155,10 @@ func DeleteGerritWebhook(workflow *commonmodels.Workflow, log *zap.SugaredLogger continue } - opt := &codehost.Option{ + opt := &systemconfig.Option{ CodeHostID: workflowWebhook.MainRepo.CodehostID, } - detail, err := codehost.GetCodeHostInfo(opt) + detail, err := systemconfig.GetCodeHostInfo(opt) if err != nil { return err } diff --git a/pkg/microservice/aslan/core/workflow/service/workflow/github.go b/pkg/microservice/aslan/core/workflow/service/workflow/github.go index 4a9382118..fe6b43490 100644 --- a/pkg/microservice/aslan/core/workflow/service/workflow/github.go +++ b/pkg/microservice/aslan/core/workflow/service/workflow/github.go @@ -27,7 +27,6 @@ import ( "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/models/task" "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/github" "github.com/koderover/zadig/pkg/setting" - "github.com/koderover/zadig/pkg/shared/codehost" e "github.com/koderover/zadig/pkg/tool/errors" ) @@ -85,7 +84,7 @@ func createGitCheck(pt *task.Task, log *zap.SugaredLogger) error { } log.Infof("Init GitHub status") - ch, err := codehost.GetCodeHostInfoByID(pt.TriggerBy.CodehostID) + ch, err := systemconfig.GetCodeHostInfoByID(pt.TriggerBy.CodehostID) if err != nil { log.Errorf("GetCodeHostInfoByID failed, err:%v", err) return e.ErrGithubUpdateStatus.AddErr(err) diff --git a/pkg/microservice/aslan/core/workflow/service/workflow/gitlab.go b/pkg/microservice/aslan/core/workflow/service/workflow/gitlab.go index 1d15a7d65..7b27cde00 100644 --- a/pkg/microservice/aslan/core/workflow/service/workflow/gitlab.go +++ b/pkg/microservice/aslan/core/workflow/service/workflow/gitlab.go @@ -26,7 +26,7 @@ import ( "go.uber.org/zap" "github.com/koderover/zadig/pkg/setting" - "github.com/koderover/zadig/pkg/shared/codehost" + "github.com/koderover/zadig/pkg/shared/client/systemconfig" "github.com/koderover/zadig/pkg/tool/gerrit" ) @@ -40,10 +40,10 @@ type RepoCommit struct { } func QueryByBranch(id int, owner, name, branch string, log *zap.SugaredLogger) (*RepoCommit, error) { - opt := &codehost.Option{ + opt := &systemconfig.Option{ CodeHostID: id, } - ch, err := codehost.GetCodeHostInfo(opt) + ch, err := systemconfig.GetCodeHostInfo(opt) if err != nil { return nil, err } @@ -90,10 +90,10 @@ func QueryByBranch(id int, owner, name, branch string, log *zap.SugaredLogger) ( } func QueryByTag(id int, owner, name, tag string, log *zap.SugaredLogger) (*RepoCommit, error) { - opt := &codehost.Option{ + opt := &systemconfig.Option{ CodeHostID: id, } - ch, err := codehost.GetCodeHostInfo(opt) + ch, err := systemconfig.GetCodeHostInfo(opt) if err != nil { return nil, err } @@ -150,10 +150,10 @@ type PRCommit struct { func GetLatestPrCommit(codehostID, pr int, namespace, projectName string, log *zap.SugaredLogger) (*PRCommit, error) { projectID := fmt.Sprintf("%s/%s", namespace, projectName) - opt := &codehost.Option{ + opt := &systemconfig.Option{ CodeHostID: codehostID, } - ch, err := codehost.GetCodeHostInfo(opt) + ch, err := systemconfig.GetCodeHostInfo(opt) if err != nil { return nil, err } diff --git a/pkg/microservice/aslan/core/workflow/service/workflow/pipeline_validation.go b/pkg/microservice/aslan/core/workflow/service/workflow/pipeline_validation.go index 8eb8f220b..2479d0b63 100644 --- a/pkg/microservice/aslan/core/workflow/service/workflow/pipeline_validation.go +++ b/pkg/microservice/aslan/core/workflow/service/workflow/pipeline_validation.go @@ -45,6 +45,7 @@ import ( git "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/github" "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/kube" "github.com/koderover/zadig/pkg/setting" + "github.com/koderover/zadig/pkg/shared/client/systemconfig" "github.com/koderover/zadig/pkg/shared/codehost" "github.com/koderover/zadig/pkg/shared/kube/wrapper" e "github.com/koderover/zadig/pkg/tool/errors" @@ -257,10 +258,10 @@ func FmtBuilds(builds []*types.Repository, log *zap.SugaredLogger) { log.Error("codehostID can't be empty") return } - opt := &codehost.Option{ + opt := &systemconfig.Option{ CodeHostID: cID, } - detail, err := codehost.GetCodeHostInfo(opt) + detail, err := systemconfig.GetCodeHostInfo(opt) if err != nil { log.Error(err) return @@ -305,10 +306,10 @@ func SetTriggerBuilds(builds []*types.Repository, buildArgs []*types.Repository, } func setBuildInfo(build *types.Repository, log *zap.SugaredLogger) { - opt := &codehost.Option{ + opt := &systemconfig.Option{ CodeHostID: build.CodehostID, } - codeHostInfo, err := codehost.GetCodeHostInfo(opt) + codeHostInfo, err := systemconfig.GetCodeHostInfo(opt) if err != nil { log.Errorf("failed to get codehost detail %d %v", build.CodehostID, err) return diff --git a/pkg/shared/client/systemconfig/codehost.go b/pkg/shared/client/systemconfig/codehost.go index 81e0515a2..f84e6eafa 100644 --- a/pkg/shared/client/systemconfig/codehost.go +++ b/pkg/shared/client/systemconfig/codehost.go @@ -65,7 +65,7 @@ func GetCodeHostInfo(option *Option) (*CodeHost, error) { return nil, errors.New("not find codeHost") } -func (c *Client) GetCodeHostInfoByID(id int) (*CodeHost, error) { +func GetCodeHostInfoByID(id int) (*CodeHost, error) { return GetCodeHostInfo(&Option{CodeHostID: id}) } @@ -83,7 +83,7 @@ type Detail struct { SecretKey string `json:"clientSecret"` } -func (c *Client) GetCodehostDetail(codehostID int) (*Detail, error) { +func GetCodehostDetail(codehostID int) (*Detail, error) { codehost, err := GetCodeHostInfo(&Option{CodeHostID: codehostID}) if err != nil { return nil, err @@ -105,7 +105,7 @@ func (c *Client) GetCodehostDetail(codehostID int) (*Detail, error) { return detail, nil } -func (c *Client) ListCodehostDetial() ([]*Detail, error) { +func ListCodehostDetial() ([]*Detail, error) { codehosts, err := GetCodeHostList() if err != nil { return nil, err -- Gitee From b6d0d21846782575f2256a72b2237fb08a86646f Mon Sep 17 00:00:00 2001 From: mouuii Date: Mon, 8 Nov 2021 17:19:36 +0800 Subject: [PATCH 277/405] add public Signed-off-by: mouuii --- pkg/microservice/policy/core/service/bundle/exemption_urls.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pkg/microservice/policy/core/service/bundle/exemption_urls.go b/pkg/microservice/policy/core/service/bundle/exemption_urls.go index cf86b6ab0..9719c9a80 100644 --- a/pkg/microservice/policy/core/service/bundle/exemption_urls.go +++ b/pkg/microservice/policy/core/service/bundle/exemption_urls.go @@ -44,6 +44,10 @@ var publicURLs = []*policyRule{ Methods: []string{"GET", "POST"}, Endpoints: []string{"api/v1/login", "api/v1/signup", "api/v1/retrieve"}, }, + { + Methods: []string{"GET"}, + Endpoints: []string{"api/v1/codehost/?*/auth"}, + }, { Methods: []string{"*"}, Endpoints: []string{"api/v1/callback"}, -- Gitee From 64309b668f991bd328e997fcd5344ef8147c5a15 Mon Sep 17 00:00:00 2001 From: mouuii Date: Mon, 8 Nov 2021 17:59:50 +0800 Subject: [PATCH 278/405] callback Signed-off-by: mouuii --- .../core/codehost/handler/codehost.go | 94 +++++++++++++++++++ .../core/codehost/handler/router.go | 3 +- 2 files changed, 96 insertions(+), 1 deletion(-) diff --git a/pkg/microservice/systemconfig/core/codehost/handler/codehost.go b/pkg/microservice/systemconfig/core/codehost/handler/codehost.go index 50fd5c4ce..688ef846d 100644 --- a/pkg/microservice/systemconfig/core/codehost/handler/codehost.go +++ b/pkg/microservice/systemconfig/core/codehost/handler/codehost.go @@ -5,6 +5,7 @@ import ( "net/http" "net/url" "strconv" + "strings" "github.com/gin-gonic/gin" "golang.org/x/oauth2" @@ -88,6 +89,99 @@ func AuthCodeHost(c *gin.Context) { http.Redirect(c.Writer, c.Request, redirectURL, http.StatusFound) } +func Callback(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + + //增加数据验证 + state := c.Query("state") + urlArray := strings.Split(state, "&codeHostId=") + frontEndUrl := urlArray[0] + if strings.Contains(frontEndUrl, "errCode") { + frontEndUrl = strings.Split(frontEndUrl, "?errCode")[0] + } + + gitlabError := c.Query("error") + if gitlabError != "" { + ctx.Logger.Warn("view code_host_get_call_back_gitlab user denied") + url := fmt.Sprintf("%s%s%d%s", frontEndUrl, "?errCode=", 10007, "&errMessage=access_denied") + http.Redirect(c.Writer, c.Request, url, http.StatusFound) + return + } + stateURL, err := url.Parse(state) + if err != nil { + url := fmt.Sprintf("%s%s%d%s", frontEndUrl, "?errCode=", 404, "&errMessage=failed_to_parse_redirect_url") + http.Redirect(c.Writer, c.Request, url, http.StatusFound) + return + } + codeHostArray := strings.Split(urlArray[1], "&provider=") + codeHostID, err := strconv.Atoi(codeHostArray[0]) + if err != nil { + ctx.Logger.Error("view code_host_get_call_back_gitlab codeHostID convert err : %v", err) + url := fmt.Sprintf("%s%s%d%s", frontEndUrl, "?errCode=", 404, "&errMessage=codeHostID convert failed") + http.Redirect(c.Writer, c.Request, url, http.StatusFound) + return + } + code := c.Query("code") + iCodehost, err := service.GetCodeHost(codeHostID, ctx.Logger) + if err != nil { + ctx.Logger.Error("view code_host_get_call_back_gitlab GetCodeHostByID err : %v", err) + url := fmt.Sprintf("%s%s%d%s", frontEndUrl, "?errCode=", 404, "&errMessage=get codehost failed") + http.Redirect(c.Writer, c.Request, url, http.StatusFound) + return + } + + codehost := new(models.CodeHost) + + callBackUrl := fmt.Sprintf("%s://%s%s", stateURL.Scheme, stateURL.Host, "/api/directory/codehosts/callback") + authConfig := &oauth2.Config{ + ClientID: iCodehost.ApplicationId, + ClientSecret: iCodehost.ClientSecret, + RedirectURL: callBackUrl, + //RedirectURL: "http://localhost:34001/directory/codehosts/callback", + } + if codeHostArray[1] == "gitlab" { + authConfig.Scopes = []string{"api", "read_user"} + authConfig.Endpoint = oauth2.Endpoint{ + AuthURL: fmt.Sprintf("%s%s", iCodehost.Address, "/oauth/authorize"), + TokenURL: fmt.Sprintf("%s%s", iCodehost.Address, "/oauth/token"), + } + } else if codeHostArray[1] == "github" { + authConfig.Scopes = []string{"repo", "user"} + authConfig.Endpoint = oauth2.Endpoint{ + AuthURL: fmt.Sprintf("%s%s", iCodehost.Address, "/login/oauth/authorize"), + TokenURL: fmt.Sprintf("%s%s", iCodehost.Address, "/login/oauth/access_token"), + } + } + + token, err := authConfig.Exchange(oauth2.NoContext, code) + if err != nil { + ctx.Logger.Error("view code_host_get_call_back_gitlab Exchange err : %v", err) + url := fmt.Sprintf("%s%s%d%s", frontEndUrl, "?errCode=", 10007, "&errMessage=exchange failed") + http.Redirect(c.Writer, c.Request, url, http.StatusFound) + return + } + + codehost.AccessToken = token.AccessToken + codehost.RefreshToken = token.RefreshToken + _, err = service.UpdateCodeHost(codehost, ctx.Logger) + if err != nil { + ctx.Logger.Error("view UpdateCodeHostByToken err : %v", err) + url := fmt.Sprintf("%s%s%d%s", frontEndUrl, "?errCode=", 404, "&errMessage=update codehost failed") + http.Redirect(c.Writer, c.Request, url, http.StatusFound) + return + } + + //跳转回前端 + redirectURL := "" + if strings.Contains(frontEndUrl, "?succeed") { + redirectURL = fmt.Sprintf("%s%s", strings.Split(frontEndUrl, "?succeed")[0], "?succeed=true") + } else { + redirectURL = fmt.Sprintf("%s%s", frontEndUrl, "?succeed=true") + } + http.Redirect(c.Writer, c.Request, redirectURL, http.StatusFound) +} + func UpdateCodeHost(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() diff --git a/pkg/microservice/systemconfig/core/codehost/handler/router.go b/pkg/microservice/systemconfig/core/codehost/handler/router.go index b17345289..ddfff52a5 100644 --- a/pkg/microservice/systemconfig/core/codehost/handler/router.go +++ b/pkg/microservice/systemconfig/core/codehost/handler/router.go @@ -7,8 +7,9 @@ import ( type Router struct{} func (*Router) Inject(router *gin.RouterGroup) { - codehost := router.Group("codehost") + codehost := router.Group("codehosts") { + codehost.GET("/callback", Callback) codehost.GET("", ListCodeHost) codehost.DELETE("/:id", DeleteCodeHost) codehost.POST("", CreateCodeHost) -- Gitee From a61ad6335465d16b11b565ddfe676316746ebc46 Mon Sep 17 00:00:00 2001 From: mouuii Date: Mon, 8 Nov 2021 18:00:19 +0800 Subject: [PATCH 279/405] callback Signed-off-by: mouuii --- pkg/microservice/systemconfig/core/codehost/handler/codehost.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/microservice/systemconfig/core/codehost/handler/codehost.go b/pkg/microservice/systemconfig/core/codehost/handler/codehost.go index 688ef846d..0a7ced856 100644 --- a/pkg/microservice/systemconfig/core/codehost/handler/codehost.go +++ b/pkg/microservice/systemconfig/core/codehost/handler/codehost.go @@ -78,7 +78,7 @@ func AuthCodeHost(c *gin.Context) { ctx.Err = err return } - callBackUrl := fmt.Sprintf("%s://%s%s", redirectHost.Scheme, redirectHost.Host, "/api/directory/codehosts/callback") + callBackUrl := fmt.Sprintf("%s://%s%s", redirectHost.Scheme, redirectHost.Host, "/api/v1/codehosts/callback") authConfig := &oauth2.Config{ ClientID: codeHost.ApplicationId, ClientSecret: codeHost.ClientSecret, -- Gitee From 803385b2b9c855525a9350bf0dba2a17a377b0fb Mon Sep 17 00:00:00 2001 From: mouuii Date: Mon, 8 Nov 2021 18:01:40 +0800 Subject: [PATCH 280/405] callback Signed-off-by: mouuii --- pkg/microservice/policy/core/service/bundle/exemption_urls.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/microservice/policy/core/service/bundle/exemption_urls.go b/pkg/microservice/policy/core/service/bundle/exemption_urls.go index 9719c9a80..7c4fff0db 100644 --- a/pkg/microservice/policy/core/service/bundle/exemption_urls.go +++ b/pkg/microservice/policy/core/service/bundle/exemption_urls.go @@ -46,7 +46,7 @@ var publicURLs = []*policyRule{ }, { Methods: []string{"GET"}, - Endpoints: []string{"api/v1/codehost/?*/auth"}, + Endpoints: []string{"api/v1/codehosts/?*/auth", "api/v1/codehosts/callback"}, }, { Methods: []string{"*"}, -- Gitee From 460c098aa52dcbad0e51201bc2a62c1c23f10c27 Mon Sep 17 00:00:00 2001 From: liu deyi Date: Mon, 8 Nov 2021 18:32:23 +0800 Subject: [PATCH 281/405] add external link interface Signed-off-by: liu deyi --- .../common/repository/models/external_link.go | 16 +++ .../repository/mongodb/external_link.go | 109 ++++++++++++++++++ pkg/microservice/aslan/core/service.go | 1 + .../core/system/handler/external_link.go | 81 +++++++++++++ .../aslan/core/system/handler/router.go | 10 ++ .../core/system/service/external_link.go | 45 ++++++++ pkg/tool/errors/http_errors.go | 8 ++ 7 files changed, 270 insertions(+) create mode 100644 pkg/microservice/aslan/core/common/repository/models/external_link.go create mode 100644 pkg/microservice/aslan/core/common/repository/mongodb/external_link.go create mode 100644 pkg/microservice/aslan/core/system/handler/external_link.go create mode 100644 pkg/microservice/aslan/core/system/service/external_link.go diff --git a/pkg/microservice/aslan/core/common/repository/models/external_link.go b/pkg/microservice/aslan/core/common/repository/models/external_link.go new file mode 100644 index 000000000..9afc405ba --- /dev/null +++ b/pkg/microservice/aslan/core/common/repository/models/external_link.go @@ -0,0 +1,16 @@ +package models + +import "go.mongodb.org/mongo-driver/bson/primitive" + +type ExternalLink struct { + ID primitive.ObjectID `bson:"_id,omitempty" json:"id,omitempty"` + Name string `bson:"name" json:"name"` + URL string `bson:"url" json:"url"` + CreateTime int64 `bson:"create_time" json:"create_time"` + UpdateTime int64 `bson:"update_time" json:"update_time"` + UpdateBy string `bson:"update_by" json:"update_by"` +} + +func (ExternalLink) TableName() string { + return "external_link" +} diff --git a/pkg/microservice/aslan/core/common/repository/mongodb/external_link.go b/pkg/microservice/aslan/core/common/repository/mongodb/external_link.go new file mode 100644 index 000000000..af87e978c --- /dev/null +++ b/pkg/microservice/aslan/core/common/repository/mongodb/external_link.go @@ -0,0 +1,109 @@ +package mongodb + +import ( + "context" + "errors" + "time" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/bson/primitive" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" + + "github.com/koderover/zadig/pkg/microservice/aslan/config" + "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/models" + mongotool "github.com/koderover/zadig/pkg/tool/mongo" +) + +type ExternalLinkColl struct { + *mongo.Collection + + coll string +} + +func NewExternalLinkColl() *ExternalLinkColl { + name := models.ExternalLink{}.TableName() + return &ExternalLinkColl{ + Collection: mongotool.Database(config.MongoDatabase()).Collection(name), + coll: name, + } +} + +func (c *ExternalLinkColl) GetCollectionName() string { + return c.coll +} + +func (c *ExternalLinkColl) EnsureIndex(ctx context.Context) error { + mod := mongo.IndexModel{ + Keys: bson.M{"name": 1, "url": 1}, + Options: options.Index().SetUnique(true), + } + + _, err := c.Indexes().CreateOne(ctx, mod) + return err +} + +func (c *ExternalLinkColl) List() ([]*models.ExternalLink, error) { + query := bson.M{} + resp := make([]*models.ExternalLink, 0) + ctx := context.Background() + + cursor, err := c.Collection.Find(ctx, query) + if err != nil { + return nil, err + } + + err = cursor.All(ctx, &resp) + if err != nil { + return nil, err + } + + return resp, err +} + +func (c *ExternalLinkColl) Create(args *models.ExternalLink) error { + if args == nil { + return errors.New("nil externalLink info") + } + + args.CreateTime = time.Now().Unix() + args.UpdateTime = time.Now().Unix() + + _, err := c.InsertOne(context.TODO(), args) + + return err +} + +func (c *ExternalLinkColl) Update(id string, args *models.ExternalLink) error { + if args == nil { + return errors.New("nil externalLink info") + } + + oid, err := primitive.ObjectIDFromHex(id) + if err != nil { + return err + } + + query := bson.M{"_id": oid} + change := bson.M{"$set": bson.M{ + "name": args.Name, + "url": args.URL, + "update_by": args.UpdateBy, + "update_time": time.Now().Unix(), + }} + + _, err = c.UpdateOne(context.TODO(), query, change) + return err +} + +func (c *ExternalLinkColl) Delete(id string) error { + oid, err := primitive.ObjectIDFromHex(id) + if err != nil { + return err + } + + query := bson.M{"_id": oid} + + _, err = c.DeleteOne(context.TODO(), query) + return err +} diff --git a/pkg/microservice/aslan/core/service.go b/pkg/microservice/aslan/core/service.go index b0b15a8c4..35d9c1f1a 100644 --- a/pkg/microservice/aslan/core/service.go +++ b/pkg/microservice/aslan/core/service.go @@ -200,6 +200,7 @@ func initDatabase() { commonrepo.NewWorkflowStatColl(), commonrepo.NewWorkLoadsStatColl(), commonrepo.NewServicesInExternalEnvColl(), + commonrepo.NewExternalLinkColl(), templaterepo.NewChartColl(), templaterepo.NewDockerfileTemplateColl(), diff --git a/pkg/microservice/aslan/core/system/handler/external_link.go b/pkg/microservice/aslan/core/system/handler/external_link.go new file mode 100644 index 000000000..5df1edd5c --- /dev/null +++ b/pkg/microservice/aslan/core/system/handler/external_link.go @@ -0,0 +1,81 @@ +package handler + +import ( + "bytes" + "encoding/json" + "fmt" + "io/ioutil" + + "github.com/gin-gonic/gin" + + commonmodels "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/models" + "github.com/koderover/zadig/pkg/microservice/aslan/core/system/service" + internalhandler "github.com/koderover/zadig/pkg/shared/handler" + e "github.com/koderover/zadig/pkg/tool/errors" + "github.com/koderover/zadig/pkg/tool/log" +) + +func ListExternalLinks(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + + ctx.Resp, ctx.Err = service.ListExternalLinks(ctx.Logger) +} + +func CreateExternalLink(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + + args := new(commonmodels.ExternalLink) + data, err := c.GetRawData() + if err != nil { + log.Errorf("CreateExternalLink c.GetRawData() err : %v", err) + } + if err = json.Unmarshal(data, args); err != nil { + log.Errorf("CreateExternalLink json.Unmarshal err : %v", err) + } + internalhandler.InsertOperationLog(c, ctx.UserName, "", "新增", "系统配置-快捷链接", fmt.Sprintf("name:%s url:%s", args.Name, args.URL), string(data), ctx.Logger) + + c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(data)) + + if err := c.ShouldBindJSON(&args); err != nil { + ctx.Err = e.ErrInvalidParam.AddDesc("invalid externalLink args") + return + } + args.UpdateBy = ctx.UserName + + ctx.Err = service.CreateExternalLink(args, ctx.Logger) +} + +func UpdateExternalLink(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + + args := new(commonmodels.ExternalLink) + data, err := c.GetRawData() + if err != nil { + log.Errorf("UpdateExternal c.GetRawData() err : %v", err) + } + if err = json.Unmarshal(data, args); err != nil { + log.Errorf("UpdateExternal json.Unmarshal err : %v", err) + } + internalhandler.InsertOperationLog(c, ctx.UserName, "", "更新", "系统配置-快捷链接", fmt.Sprintf("name:%s url:%s", args.Name, args.URL), string(data), ctx.Logger) + + c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(data)) + + if err := c.ShouldBindJSON(&args); err != nil { + ctx.Err = e.ErrInvalidParam.AddDesc("invalid externalLink args") + return + } + args.UpdateBy = ctx.UserName + + ctx.Err = service.UpdateExternalLink(c.Param("id"), args, ctx.Logger) +} + +func DeleteExternalLink(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + + internalhandler.InsertOperationLog(c, ctx.UserName, "", "删除", "系统配置-快捷链接", fmt.Sprintf("id:%s", c.Param("id")), "", ctx.Logger) + ctx.Err = service.DeleteExternalLink(c.Param("id"), ctx.Logger) +} diff --git a/pkg/microservice/aslan/core/system/handler/router.go b/pkg/microservice/aslan/core/system/handler/router.go index c72f6e133..9de790a64 100644 --- a/pkg/microservice/aslan/core/system/handler/router.go +++ b/pkg/microservice/aslan/core/system/handler/router.go @@ -186,4 +186,14 @@ func (*Router) Inject(router *gin.RouterGroup) { operation.PUT("/:id", UpdateOperationLog) } + // --------------------------------------------------------------------------------------- + // system external link + // --------------------------------------------------------------------------------------- + externalLink := router.Group("externalLink") + { + externalLink.GET("", ListExternalLinks) + externalLink.POST("", gin2.UpdateOperationLogStatus, CreateExternalLink) + externalLink.PUT("/:id", gin2.UpdateOperationLogStatus, UpdateExternalLink) + externalLink.DELETE("/:id", gin2.UpdateOperationLogStatus, DeleteExternalLink) + } } diff --git a/pkg/microservice/aslan/core/system/service/external_link.go b/pkg/microservice/aslan/core/system/service/external_link.go new file mode 100644 index 000000000..b468b2013 --- /dev/null +++ b/pkg/microservice/aslan/core/system/service/external_link.go @@ -0,0 +1,45 @@ +package service + +import ( + "go.uber.org/zap" + + commonmodels "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/models" + commonrepo "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/mongodb" + e "github.com/koderover/zadig/pkg/tool/errors" +) + +func ListExternalLinks(log *zap.SugaredLogger) ([]*commonmodels.ExternalLink, error) { + resp, err := commonrepo.NewExternalLinkColl().List() + if err != nil { + log.Errorf("ExternalLink.List error: %s", err) + return resp, e.ErrListExternalLink.AddErr(err) + } + return resp, nil +} + +func CreateExternalLink(args *commonmodels.ExternalLink, log *zap.SugaredLogger) error { + err := commonrepo.NewExternalLinkColl().Create(args) + if err != nil { + log.Errorf("ExternalLink.Create error: %s", err) + return e.ErrCreateExternalLink.AddErr(err) + } + return nil +} + +func UpdateExternalLink(id string, args *commonmodels.ExternalLink, log *zap.SugaredLogger) error { + err := commonrepo.NewExternalLinkColl().Update(id, args) + if err != nil { + log.Errorf("ExternalLink.Update %s error: %s", id, err) + return e.ErrUpdateExternalLink.AddErr(err) + } + return nil +} + +func DeleteExternalLink(id string, log *zap.SugaredLogger) error { + err := commonrepo.NewExternalLinkColl().Delete(id) + if err != nil { + log.Errorf("ExternalLink.Delete %s error: %s", id, err) + return e.ErrDeleteExternalLink.AddErr(err) + } + return nil +} diff --git a/pkg/tool/errors/http_errors.go b/pkg/tool/errors/http_errors.go index a1a2f8702..45554ea76 100644 --- a/pkg/tool/errors/http_errors.go +++ b/pkg/tool/errors/http_errors.go @@ -672,4 +672,12 @@ var ( ErrTestJenkinsConnection = NewHTTPError(6835, "用户名或者密码不正确") ErrListJobNames = NewHTTPError(6836, "获取job名称列表失败") ErrListJobBuildArgs = NewHTTPError(6837, "获取job构建参数列表失败") + + //----------------------------------------------------------------------------------------------- + // external link Error Range: 6840 - 6849 + //----------------------------------------------------------------------------------------------- + ErrCreateExternalLink = NewHTTPError(6841, "创建链接失败") + ErrUpdateExternalLink = NewHTTPError(6842, "更新链接失败") + ErrDeleteExternalLink = NewHTTPError(6843, "删除链接失败") + ErrListExternalLink = NewHTTPError(6844, "获取链接列表失败") ) -- Gitee From a258b67da6c6f0b2f449d491367fb54949f8e9ae Mon Sep 17 00:00:00 2001 From: lou Date: Mon, 8 Nov 2021 18:40:59 +0800 Subject: [PATCH 282/405] add refresh webhook secret api --- .../core/common/service/github/webhook.go | 19 ++++++++-- .../core/common/service/gitlab/webhook.go | 12 +++++++ pkg/tool/git/github/repositories.go | 23 ++++++++++++ pkg/tool/git/gitlab/project.go | 36 +++++++++++++++++++ 4 files changed, 88 insertions(+), 2 deletions(-) diff --git a/pkg/microservice/aslan/core/common/service/github/webhook.go b/pkg/microservice/aslan/core/common/service/github/webhook.go index ebd172285..7850b8051 100644 --- a/pkg/microservice/aslan/core/common/service/github/webhook.go +++ b/pkg/microservice/aslan/core/common/service/github/webhook.go @@ -31,14 +31,29 @@ func (c *Client) CreateWebHook(owner, repo string) (string, error) { Secret: gitservice.GetHookSecret(), Events: []string{git.PushEvent, git.PullRequestEvent, git.BranchOrTagCreateEvent, git.CheckRunEvent}, }) + if err != nil { + return "", err + } return strconv.Itoa(int(hook.GetID())), err } func (c *Client) DeleteWebHook(owner, repo, hookID string) error { - hookIDInt, err := strconv.Atoi(hookID) + hookIDInt, err := strconv.ParseInt(hookID, 10, 64) + if err != nil { + return err + } + return c.DeleteHook(context.TODO(), owner, repo, hookIDInt) +} + +func (c *Client) RefreshWebHookSecret(owner, repo, hookID string) error { + hookIDInt, err := strconv.ParseInt(hookID, 10, 64) if err != nil { return err } - return c.DeleteHook(context.TODO(), owner, repo, int64(hookIDInt)) + _, err = c.UpdateHook(context.TODO(), owner, repo, hookIDInt, &git.Hook{ + Secret: gitservice.GetHookSecret(), + }) + + return err } diff --git a/pkg/microservice/aslan/core/common/service/gitlab/webhook.go b/pkg/microservice/aslan/core/common/service/gitlab/webhook.go index cf6f76736..b2ecc88b3 100644 --- a/pkg/microservice/aslan/core/common/service/gitlab/webhook.go +++ b/pkg/microservice/aslan/core/common/service/gitlab/webhook.go @@ -44,3 +44,15 @@ func (c *Client) DeleteWebHook(owner, repo, hookID string) error { } return c.DeleteProjectHook(owner, repo, hookIDInt) } + +func (c *Client) RefreshWebHookSecret(owner, repo, hookID string) error { + hookIDInt, err := strconv.Atoi(hookID) + if err != nil { + return err + } + _, err = c.UpdateProjectHook(owner, repo, hookIDInt, &git.Hook{ + Secret: gitservice.GetHookSecret(), + }) + + return err +} diff --git a/pkg/tool/git/github/repositories.go b/pkg/tool/git/github/repositories.go index 77f4e7ce0..03f56b298 100644 --- a/pkg/tool/git/github/repositories.go +++ b/pkg/tool/git/github/repositories.go @@ -192,6 +192,29 @@ func (c *Client) CreateHook(ctx context.Context, owner, repo string, hook *git.H return nil, err } +func (c *Client) UpdateHook(ctx context.Context, owner, repo string, id int64, hook *git.Hook) (*github.Hook, error) { + h := &github.Hook{ + Config: map[string]interface{}{ + "secret": hook.Secret, + }, + } + if hook.URL != "" { + h.Config["url"] = hook.URL + } + if len(hook.Events) > 0 { + h.Events = hook.Events + } + if hook.Active != nil { + h.Active = hook.Active + } + updated, err := wrap(c.Repositories.EditHook(ctx, owner, repo, id, h)) + if h, ok := updated.(*github.Hook); ok { + return h, err + } + + return nil, err +} + func (c *Client) CreateStatus(ctx context.Context, owner, repo, ref string, status *github.RepoStatus) (*github.RepoStatus, error) { created, err := wrap(c.Repositories.CreateStatus(ctx, owner, repo, ref, status)) if s, ok := created.(*github.RepoStatus); ok { diff --git a/pkg/tool/git/gitlab/project.go b/pkg/tool/git/gitlab/project.go index bea1ea800..edfee8bd4 100644 --- a/pkg/tool/git/gitlab/project.go +++ b/pkg/tool/git/gitlab/project.go @@ -74,6 +74,27 @@ func (c *Client) AddProjectHook(owner, repo string, hook *git.Hook) (*gitlab.Pro return nil, err } +func (c *Client) UpdateProjectHook(owner, repo string, id int, hook *git.Hook) (*gitlab.ProjectHook, error) { + opts := &gitlab.EditProjectHookOptions{} + if hook.URL != "" { + opts.URL = gitlab.String(hook.URL) + } + if hook.Secret != "" { + opts.Token = gitlab.String(hook.Secret) + } + opts = addEventsToProjectHookEditOptions(hook.Events, opts) + updated, err := wrap(c.Projects.EditProjectHook(generateProjectName(owner, repo), id, opts)) + if err != nil { + return nil, err + } + + if h, ok := updated.(*gitlab.ProjectHook); ok { + return h, nil + } + + return nil, err +} + func (c *Client) DeleteProjectHook(owner, repo string, id int) error { err := wrapError(c.Projects.DeleteProjectHook(generateProjectName(owner, repo), id)) if httpclient.IsNotFound(err) { @@ -140,3 +161,18 @@ func addEventsToProjectHookOptions(events []string, opts *gitlab.AddProjectHookO return opts } + +func addEventsToProjectHookEditOptions(events []string, opts *gitlab.EditProjectHookOptions) *gitlab.EditProjectHookOptions { + for _, evt := range events { + switch evt { + case git.PushEvent: + opts.PushEvents = boolptr.True() + case git.PullRequestEvent: + opts.MergeRequestsEvents = boolptr.True() + case git.BranchOrTagCreateEvent: + opts.TagPushEvents = boolptr.True() + } + } + + return opts +} -- Gitee From 27b61b61d1fd0efb441cc9c8fe0791c2b121edd9 Mon Sep 17 00:00:00 2001 From: lou Date: Mon, 8 Nov 2021 20:23:34 +0800 Subject: [PATCH 283/405] update after review Signed-off-by: lou --- pkg/tool/git/github/repositories.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/pkg/tool/git/github/repositories.go b/pkg/tool/git/github/repositories.go index 03f56b298..bee1413b8 100644 --- a/pkg/tool/git/github/repositories.go +++ b/pkg/tool/git/github/repositories.go @@ -185,6 +185,10 @@ func (c *Client) CreateHook(ctx context.Context, owner, repo string, hook *git.H Active: hook.Active, } created, err := wrap(c.Repositories.CreateHook(ctx, owner, repo, h)) + if err != nil { + return nil, err + } + if h, ok := created.(*github.Hook); ok { return h, err } @@ -208,6 +212,10 @@ func (c *Client) UpdateHook(ctx context.Context, owner, repo string, id int64, h h.Active = hook.Active } updated, err := wrap(c.Repositories.EditHook(ctx, owner, repo, id, h)) + if err != nil { + return nil, err + } + if h, ok := updated.(*github.Hook); ok { return h, err } -- Gitee From 239af662a9ba86a1999c78909f21b43cd6e8e37c Mon Sep 17 00:00:00 2001 From: lou Date: Mon, 8 Nov 2021 20:57:37 +0800 Subject: [PATCH 284/405] update after review Signed-off-by: lou --- .../aslan/core/common/service/github/webhook.go | 2 +- pkg/tool/git/github/repositories.go | 16 ++++++++-------- pkg/tool/git/gitlab/project.go | 13 +++++++------ 3 files changed, 16 insertions(+), 15 deletions(-) diff --git a/pkg/microservice/aslan/core/common/service/github/webhook.go b/pkg/microservice/aslan/core/common/service/github/webhook.go index 7850b8051..433d8f57e 100644 --- a/pkg/microservice/aslan/core/common/service/github/webhook.go +++ b/pkg/microservice/aslan/core/common/service/github/webhook.go @@ -35,7 +35,7 @@ func (c *Client) CreateWebHook(owner, repo string) (string, error) { return "", err } - return strconv.Itoa(int(hook.GetID())), err + return strconv.Itoa(int(hook.GetID())), nil } func (c *Client) DeleteWebHook(owner, repo, hookID string) error { diff --git a/pkg/tool/git/github/repositories.go b/pkg/tool/git/github/repositories.go index bee1413b8..e28316b53 100644 --- a/pkg/tool/git/github/repositories.go +++ b/pkg/tool/git/github/repositories.go @@ -189,11 +189,11 @@ func (c *Client) CreateHook(ctx context.Context, owner, repo string, hook *git.H return nil, err } - if h, ok := created.(*github.Hook); ok { - return h, err + if h, ok := created.(*github.Hook); !ok { + return nil, fmt.Errorf("object is not a github Hook") + } else { + return h, nil } - - return nil, err } func (c *Client) UpdateHook(ctx context.Context, owner, repo string, id int64, hook *git.Hook) (*github.Hook, error) { @@ -216,11 +216,11 @@ func (c *Client) UpdateHook(ctx context.Context, owner, repo string, id int64, h return nil, err } - if h, ok := updated.(*github.Hook); ok { - return h, err + if h, ok := updated.(*github.Hook); !ok { + return nil, fmt.Errorf("object is not a github Hook") + } else { + return h, nil } - - return nil, err } func (c *Client) CreateStatus(ctx context.Context, owner, repo, ref string, status *github.RepoStatus) (*github.RepoStatus, error) { diff --git a/pkg/tool/git/gitlab/project.go b/pkg/tool/git/gitlab/project.go index edfee8bd4..2c5837499 100644 --- a/pkg/tool/git/gitlab/project.go +++ b/pkg/tool/git/gitlab/project.go @@ -17,6 +17,7 @@ limitations under the License. package gitlab import ( + "fmt" "strings" "github.com/xanzy/go-gitlab" @@ -67,11 +68,11 @@ func (c *Client) AddProjectHook(owner, repo string, hook *git.Hook) (*gitlab.Pro return nil, err } - if h, ok := created.(*gitlab.ProjectHook); ok { + if h, ok := created.(*gitlab.ProjectHook); !ok { + return nil, fmt.Errorf("object is not a gitlab Hook") + } else { return h, nil } - - return nil, err } func (c *Client) UpdateProjectHook(owner, repo string, id int, hook *git.Hook) (*gitlab.ProjectHook, error) { @@ -88,11 +89,11 @@ func (c *Client) UpdateProjectHook(owner, repo string, id int, hook *git.Hook) ( return nil, err } - if h, ok := updated.(*gitlab.ProjectHook); ok { + if h, ok := updated.(*gitlab.ProjectHook); !ok { + return nil, fmt.Errorf("object is not a gitlab Hook") + } else { return h, nil } - - return nil, err } func (c *Client) DeleteProjectHook(owner, repo string, id int) error { -- Gitee From 3f696e110a5a15685d234283830aab16f029cc9c Mon Sep 17 00:00:00 2001 From: liu deyi Date: Mon, 8 Nov 2021 21:12:51 +0800 Subject: [PATCH 285/405] optimize code Signed-off-by: liu deyi --- .../aslan/core/system/handler/external_link.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pkg/microservice/aslan/core/system/handler/external_link.go b/pkg/microservice/aslan/core/system/handler/external_link.go index 5df1edd5c..cbe7c44c0 100644 --- a/pkg/microservice/aslan/core/system/handler/external_link.go +++ b/pkg/microservice/aslan/core/system/handler/external_link.go @@ -29,10 +29,10 @@ func CreateExternalLink(c *gin.Context) { args := new(commonmodels.ExternalLink) data, err := c.GetRawData() if err != nil { - log.Errorf("CreateExternalLink c.GetRawData() err : %v", err) + log.Errorf("CreateExternalLink c.GetRawData() err : %s", err) } if err = json.Unmarshal(data, args); err != nil { - log.Errorf("CreateExternalLink json.Unmarshal err : %v", err) + log.Errorf("CreateExternalLink json.Unmarshal err : %s", err) } internalhandler.InsertOperationLog(c, ctx.UserName, "", "新增", "系统配置-快捷链接", fmt.Sprintf("name:%s url:%s", args.Name, args.URL), string(data), ctx.Logger) @@ -54,10 +54,10 @@ func UpdateExternalLink(c *gin.Context) { args := new(commonmodels.ExternalLink) data, err := c.GetRawData() if err != nil { - log.Errorf("UpdateExternal c.GetRawData() err : %v", err) + log.Errorf("UpdateExternal c.GetRawData() err : %s", err) } if err = json.Unmarshal(data, args); err != nil { - log.Errorf("UpdateExternal json.Unmarshal err : %v", err) + log.Errorf("UpdateExternal json.Unmarshal err : %s", err) } internalhandler.InsertOperationLog(c, ctx.UserName, "", "更新", "系统配置-快捷链接", fmt.Sprintf("name:%s url:%s", args.Name, args.URL), string(data), ctx.Logger) -- Gitee From 9d23190b8c5460d187fd419c1a453e60559549e2 Mon Sep 17 00:00:00 2001 From: lou Date: Mon, 8 Nov 2021 21:15:10 +0800 Subject: [PATCH 286/405] update after review --- pkg/tool/git/github/repositories.go | 14 ++++++++------ pkg/tool/git/gitlab/project.go | 14 ++++++++------ 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/pkg/tool/git/github/repositories.go b/pkg/tool/git/github/repositories.go index e28316b53..4d38997c9 100644 --- a/pkg/tool/git/github/repositories.go +++ b/pkg/tool/git/github/repositories.go @@ -189,11 +189,12 @@ func (c *Client) CreateHook(ctx context.Context, owner, repo string, hook *git.H return nil, err } - if h, ok := created.(*github.Hook); !ok { + res, ok := created.(*github.Hook) + if !ok { return nil, fmt.Errorf("object is not a github Hook") - } else { - return h, nil } + + return res, nil } func (c *Client) UpdateHook(ctx context.Context, owner, repo string, id int64, hook *git.Hook) (*github.Hook, error) { @@ -216,11 +217,12 @@ func (c *Client) UpdateHook(ctx context.Context, owner, repo string, id int64, h return nil, err } - if h, ok := updated.(*github.Hook); !ok { + res, ok := updated.(*github.Hook) + if !ok { return nil, fmt.Errorf("object is not a github Hook") - } else { - return h, nil } + + return res, nil } func (c *Client) CreateStatus(ctx context.Context, owner, repo, ref string, status *github.RepoStatus) (*github.RepoStatus, error) { diff --git a/pkg/tool/git/gitlab/project.go b/pkg/tool/git/gitlab/project.go index 2c5837499..36f29e0df 100644 --- a/pkg/tool/git/gitlab/project.go +++ b/pkg/tool/git/gitlab/project.go @@ -68,11 +68,12 @@ func (c *Client) AddProjectHook(owner, repo string, hook *git.Hook) (*gitlab.Pro return nil, err } - if h, ok := created.(*gitlab.ProjectHook); !ok { + res, ok := created.(*gitlab.ProjectHook) + if !ok { return nil, fmt.Errorf("object is not a gitlab Hook") - } else { - return h, nil } + + return res, nil } func (c *Client) UpdateProjectHook(owner, repo string, id int, hook *git.Hook) (*gitlab.ProjectHook, error) { @@ -89,11 +90,12 @@ func (c *Client) UpdateProjectHook(owner, repo string, id int, hook *git.Hook) ( return nil, err } - if h, ok := updated.(*gitlab.ProjectHook); !ok { + res, ok := updated.(*gitlab.ProjectHook) + if !ok { return nil, fmt.Errorf("object is not a gitlab Hook") - } else { - return h, nil } + + return res, nil } func (c *Client) DeleteProjectHook(owner, repo string, id int) error { -- Gitee From befc1095ee476f944de6bf5fc48b5ec09415d469 Mon Sep 17 00:00:00 2001 From: liu deyi Date: Mon, 8 Nov 2021 21:17:55 +0800 Subject: [PATCH 287/405] optimize code Signed-off-by: liu deyi --- .../aslan/core/common/repository/mongodb/external_link.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pkg/microservice/aslan/core/common/repository/mongodb/external_link.go b/pkg/microservice/aslan/core/common/repository/mongodb/external_link.go index af87e978c..c4473b8e8 100644 --- a/pkg/microservice/aslan/core/common/repository/mongodb/external_link.go +++ b/pkg/microservice/aslan/core/common/repository/mongodb/external_link.go @@ -35,7 +35,10 @@ func (c *ExternalLinkColl) GetCollectionName() string { func (c *ExternalLinkColl) EnsureIndex(ctx context.Context) error { mod := mongo.IndexModel{ - Keys: bson.M{"name": 1, "url": 1}, + Keys: bson.D{ + bson.E{Key: "name", Value: 1}, + bson.E{Key: "url", Value: 1}, + }, Options: options.Index().SetUnique(true), } -- Gitee From d7bec2ad126fd769b3f4ae4f4583282bba3a4d49 Mon Sep 17 00:00:00 2001 From: mouuii Date: Tue, 9 Nov 2021 16:15:45 +0800 Subject: [PATCH 288/405] codehost auth Signed-off-by: mouuii --- pkg/config/config.go | 4 + .../systemconfig/config/config.go | 4 + .../core/codehost/handler/codehost.go | 85 +++++++++++++------ .../codehost/repository/models/codehost.go | 1 + .../codehost/repository/mongodb/codehost.go | 12 +++ .../core/codehost/service/codehost.go | 4 + pkg/setting/consts.go | 1 + 7 files changed, 84 insertions(+), 27 deletions(-) diff --git a/pkg/config/config.go b/pkg/config/config.go index 42de9dce6..d6edc02e1 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -266,3 +266,7 @@ func AdminEmail() string { func AdminPassword() string { return viper.GetString(setting.ENVAdminPassword) } + +func HttpProxy() string { + return viper.GetString(setting.ENVHttpProxy) +} diff --git a/pkg/microservice/systemconfig/config/config.go b/pkg/microservice/systemconfig/config/config.go index 2430e9b96..23e2427da 100644 --- a/pkg/microservice/systemconfig/config/config.go +++ b/pkg/microservice/systemconfig/config/config.go @@ -22,3 +22,7 @@ func MongoURI() string { func MongoDatabase() string { return configbase.MongoDatabase() } + +func HttpPorxy() string { + return configbase.HttpProxy() +} diff --git a/pkg/microservice/systemconfig/core/codehost/handler/codehost.go b/pkg/microservice/systemconfig/core/codehost/handler/codehost.go index 0a7ced856..11b82230f 100644 --- a/pkg/microservice/systemconfig/core/codehost/handler/codehost.go +++ b/pkg/microservice/systemconfig/core/codehost/handler/codehost.go @@ -1,6 +1,7 @@ package handler import ( + "context" "fmt" "net/http" "net/url" @@ -10,6 +11,7 @@ import ( "github.com/gin-gonic/gin" "golang.org/x/oauth2" + "github.com/koderover/zadig/pkg/microservice/systemconfig/config" "github.com/koderover/zadig/pkg/microservice/systemconfig/core/codehost/repository/models" "github.com/koderover/zadig/pkg/microservice/systemconfig/core/codehost/service" internalhandler "github.com/koderover/zadig/pkg/shared/handler" @@ -72,7 +74,7 @@ func AuthCodeHost(c *gin.Context) { ctx.Err = err return } - authStateString := fmt.Sprintf("%s%s%d%s%s", redirect, "&codeHostId=", id, "&provider=", provider) + authStateString := fmt.Sprintf("%s%s%s%s%s", redirect, "&codeHostId=", id, "&provider=", provider) codeHost, err := service.GetCodeHost(idInt, ctx.Logger) if err != nil { ctx.Err = err @@ -85,8 +87,21 @@ func AuthCodeHost(c *gin.Context) { RedirectURL: callBackUrl, //RedirectURL: "http://localhost:34001/directory/codehosts/callback", } + if provider == "gitlab" { + authConfig.Scopes = []string{"api", "read_user"} + authConfig.Endpoint = oauth2.Endpoint{ + AuthURL: fmt.Sprintf("%s%s", codeHost.Address, "/oauth/authorize"), + TokenURL: fmt.Sprintf("%s%s", codeHost.Address, "/oauth/token"), + } + } else if provider == "github" { + authConfig.Scopes = []string{"repo", "user"} + authConfig.Endpoint = oauth2.Endpoint{ + AuthURL: fmt.Sprintf("%s%s", codeHost.Address, "/login/oauth/authorize"), + TokenURL: fmt.Sprintf("%s%s", codeHost.Address, "/login/oauth/access_token"), + } + } redirectURL := authConfig.AuthCodeURL(authStateString) - http.Redirect(c.Writer, c.Request, redirectURL, http.StatusFound) + c.Redirect(http.StatusFound, redirectURL) } func Callback(c *gin.Context) { @@ -103,37 +118,35 @@ func Callback(c *gin.Context) { gitlabError := c.Query("error") if gitlabError != "" { - ctx.Logger.Warn("view code_host_get_call_back_gitlab user denied") - url := fmt.Sprintf("%s%s%d%s", frontEndUrl, "?errCode=", 10007, "&errMessage=access_denied") - http.Redirect(c.Writer, c.Request, url, http.StatusFound) + ctx.Logger.Warn("code_host_get_call_back_gitlab user denied") + url := fmt.Sprintf("%s%s%s", frontEndUrl, "?", "&errMessage=access_denied") + c.Redirect(http.StatusFound, url) return } stateURL, err := url.Parse(state) if err != nil { - url := fmt.Sprintf("%s%s%d%s", frontEndUrl, "?errCode=", 404, "&errMessage=failed_to_parse_redirect_url") + url := fmt.Sprintf("%s%s%s", frontEndUrl, "?", "&errMessage=failed_to_parse_redirect_url") http.Redirect(c.Writer, c.Request, url, http.StatusFound) return } codeHostArray := strings.Split(urlArray[1], "&provider=") codeHostID, err := strconv.Atoi(codeHostArray[0]) if err != nil { - ctx.Logger.Error("view code_host_get_call_back_gitlab codeHostID convert err : %v", err) - url := fmt.Sprintf("%s%s%d%s", frontEndUrl, "?errCode=", 404, "&errMessage=codeHostID convert failed") - http.Redirect(c.Writer, c.Request, url, http.StatusFound) + ctx.Logger.Error("code_host_get_call_back_gitlab codeHostID convert err : %v", err) + url := fmt.Sprintf("%s%s%s", frontEndUrl, "?", "&errMessage=codeHostID convert failed") + c.Redirect(http.StatusFound, url) return } code := c.Query("code") iCodehost, err := service.GetCodeHost(codeHostID, ctx.Logger) if err != nil { - ctx.Logger.Error("view code_host_get_call_back_gitlab GetCodeHostByID err : %v", err) - url := fmt.Sprintf("%s%s%d%s", frontEndUrl, "?errCode=", 404, "&errMessage=get codehost failed") - http.Redirect(c.Writer, c.Request, url, http.StatusFound) + ctx.Logger.Errorf("code_host_get_call_back_gitlab GetCodeHostByID err: %v", err) + url := fmt.Sprintf("%s%s%s", frontEndUrl, "?", "&errMessage=get codehost failed") + c.Redirect(http.StatusFound, url) return } - codehost := new(models.CodeHost) - - callBackUrl := fmt.Sprintf("%s://%s%s", stateURL.Scheme, stateURL.Host, "/api/directory/codehosts/callback") + callBackUrl := fmt.Sprintf("%s://%s%s", stateURL.Scheme, stateURL.Host, "/api/v1/codehosts/callback") authConfig := &oauth2.Config{ ClientID: iCodehost.ApplicationId, ClientSecret: iCodehost.ClientSecret, @@ -153,22 +166,39 @@ func Callback(c *gin.Context) { TokenURL: fmt.Sprintf("%s%s", iCodehost.Address, "/login/oauth/access_token"), } } - - token, err := authConfig.Exchange(oauth2.NoContext, code) + dc := http.DefaultClient + // if http proxy env is set + if config.HttpPorxy() != "" { + p, err := url.Parse("http://proxy.proxy-env-dev:7890") + if err != nil { + ctx.Logger.Errorf("parse proxy err: %v", err) + url := fmt.Sprintf("%s%s%s", frontEndUrl, "?", "&errMessage=parse proxy err") + c.Redirect(http.StatusFound, url) + return + } + proxy := http.ProxyURL(p) + trans := &http.Transport{ + Proxy: proxy, + } + dc = &http.Client{Transport: trans} + } + ctxx := context.WithValue(context.Background(), oauth2.HTTPClient, dc) + token, err := authConfig.Exchange(ctxx, code) if err != nil { - ctx.Logger.Error("view code_host_get_call_back_gitlab Exchange err : %v", err) - url := fmt.Sprintf("%s%s%d%s", frontEndUrl, "?errCode=", 10007, "&errMessage=exchange failed") - http.Redirect(c.Writer, c.Request, url, http.StatusFound) + ctx.Logger.Errorf("code_host_get_call_back_gitlab Exchange err: %v", err) + url := fmt.Sprintf("%s%s%s", frontEndUrl, "?", "&errMessage=exchange failed") + c.Redirect(http.StatusFound, url) return } - codehost.AccessToken = token.AccessToken - codehost.RefreshToken = token.RefreshToken - _, err = service.UpdateCodeHost(codehost, ctx.Logger) + iCodehost.AccessToken = token.AccessToken + iCodehost.RefreshToken = token.RefreshToken + ctx.Logger.Infof("%+v", iCodehost) + _, err = service.UpdateCodeHostByToken(iCodehost, ctx.Logger) if err != nil { - ctx.Logger.Error("view UpdateCodeHostByToken err : %v", err) - url := fmt.Sprintf("%s%s%d%s", frontEndUrl, "?errCode=", 404, "&errMessage=update codehost failed") - http.Redirect(c.Writer, c.Request, url, http.StatusFound) + ctx.Logger.Errorf("view UpdateCodeHostByToken err: %v", err) + url := fmt.Sprintf("%s%s%s", frontEndUrl, "?", "&errMessage=update codehost failed") + c.Redirect(http.StatusFound, url) return } @@ -179,7 +209,8 @@ func Callback(c *gin.Context) { } else { redirectURL = fmt.Sprintf("%s%s", frontEndUrl, "?succeed=true") } - http.Redirect(c.Writer, c.Request, redirectURL, http.StatusFound) + c.Redirect(http.StatusFound, redirectURL) + } func UpdateCodeHost(c *gin.Context) { diff --git a/pkg/microservice/systemconfig/core/codehost/repository/models/codehost.go b/pkg/microservice/systemconfig/core/codehost/repository/models/codehost.go index 522440d04..845be7a2b 100644 --- a/pkg/microservice/systemconfig/core/codehost/repository/models/codehost.go +++ b/pkg/microservice/systemconfig/core/codehost/repository/models/codehost.go @@ -17,6 +17,7 @@ type CodeHost struct { ClientSecret string `bson:"client_secret" json:"clientSecret"` CreatedAt int64 `bson:"created_at" json:"created_at"` UpdatedAt int64 `bson:"updated_at" json:"updated_at"` + DeletedAt int64 `bson:"deleted_at" json:"deleted_at"` } func (CodeHost) TableName() string { diff --git a/pkg/microservice/systemconfig/core/codehost/repository/mongodb/codehost.go b/pkg/microservice/systemconfig/core/codehost/repository/mongodb/codehost.go index 561a60f73..95c81f05b 100644 --- a/pkg/microservice/systemconfig/core/codehost/repository/mongodb/codehost.go +++ b/pkg/microservice/systemconfig/core/codehost/repository/mongodb/codehost.go @@ -136,3 +136,15 @@ func (c *CodehostColl) UpdateCodeHost(host *models.CodeHost) (*models.CodeHost, _, err := c.Collection.UpdateOne(context.TODO(), query, change) return host, err } + +func (c *CodehostColl) UpdateCodeHostByToken(host *models.CodeHost) (*models.CodeHost, error) { + query := bson.M{"id": host.ID, "deleted_at": 0} + change := bson.M{"$set": bson.M{ + "is_ready": "2", + "access_token": host.AccessToken, + "updated_at": time.Now().Unix(), + "refresh_token": host.RefreshToken, + }} + _, err := c.Collection.UpdateOne(context.TODO(), query, change) + return host, err +} diff --git a/pkg/microservice/systemconfig/core/codehost/service/codehost.go b/pkg/microservice/systemconfig/core/codehost/service/codehost.go index fbf137efc..ea8793559 100644 --- a/pkg/microservice/systemconfig/core/codehost/service/codehost.go +++ b/pkg/microservice/systemconfig/core/codehost/service/codehost.go @@ -31,6 +31,10 @@ func UpdateCodeHost(host *models.CodeHost, _ *zap.SugaredLogger) (*models.CodeHo return mongodb.NewCodehostColl().UpdateCodeHost(host) } +func UpdateCodeHostByToken(host *models.CodeHost, _ *zap.SugaredLogger) (*models.CodeHost, error) { + return mongodb.NewCodehostColl().UpdateCodeHostByToken(host) +} + func GetCodeHost(id int, _ *zap.SugaredLogger) (*models.CodeHost, error) { return mongodb.NewCodehostColl().GetCodeHostByID(id) } diff --git a/pkg/setting/consts.go b/pkg/setting/consts.go index 26352978f..a5a1a3e4d 100644 --- a/pkg/setting/consts.go +++ b/pkg/setting/consts.go @@ -118,6 +118,7 @@ const ( ENVAdminEmail = "ADMIN_EMAIL" ENVAdminPassword = "ADMIN_PASSWORD" PresetAccount = "admin" + ENVHttpProxy = "HTTP_PROXY" ) // k8s concepts -- Gitee From ff984f0dca9b78c2dbfab7b842c70d384e9445ee Mon Sep 17 00:00:00 2001 From: mouuii Date: Tue, 9 Nov 2021 16:28:56 +0800 Subject: [PATCH 289/405] auth Signed-off-by: mouuii --- .../core/codehost/handler/codehost.go | 31 +++++++++---------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/pkg/microservice/systemconfig/core/codehost/handler/codehost.go b/pkg/microservice/systemconfig/core/codehost/handler/codehost.go index 11b82230f..fc18d63c7 100644 --- a/pkg/microservice/systemconfig/core/codehost/handler/codehost.go +++ b/pkg/microservice/systemconfig/core/codehost/handler/codehost.go @@ -11,7 +11,6 @@ import ( "github.com/gin-gonic/gin" "golang.org/x/oauth2" - "github.com/koderover/zadig/pkg/microservice/systemconfig/config" "github.com/koderover/zadig/pkg/microservice/systemconfig/core/codehost/repository/models" "github.com/koderover/zadig/pkg/microservice/systemconfig/core/codehost/service" internalhandler "github.com/koderover/zadig/pkg/shared/handler" @@ -168,20 +167,20 @@ func Callback(c *gin.Context) { } dc := http.DefaultClient // if http proxy env is set - if config.HttpPorxy() != "" { - p, err := url.Parse("http://proxy.proxy-env-dev:7890") - if err != nil { - ctx.Logger.Errorf("parse proxy err: %v", err) - url := fmt.Sprintf("%s%s%s", frontEndUrl, "?", "&errMessage=parse proxy err") - c.Redirect(http.StatusFound, url) - return - } - proxy := http.ProxyURL(p) - trans := &http.Transport{ - Proxy: proxy, - } - dc = &http.Client{Transport: trans} - } + //if config.HttpPorxy() != "" { + // p, err := url.Parse("***") + // if err != nil { + // ctx.Logger.Errorf("parse proxy err: %v", err) + // url := fmt.Sprintf("%s%s%s", frontEndUrl, "?", "&errMessage=parse proxy err") + // c.Redirect(http.StatusFound, url) + // return + // } + // proxy := http.ProxyURL(p) + // trans := &http.Transport{ + // Proxy: proxy, + // } + // dc = &http.Client{Transport: trans} + //} ctxx := context.WithValue(context.Background(), oauth2.HTTPClient, dc) token, err := authConfig.Exchange(ctxx, code) if err != nil { @@ -196,7 +195,7 @@ func Callback(c *gin.Context) { ctx.Logger.Infof("%+v", iCodehost) _, err = service.UpdateCodeHostByToken(iCodehost, ctx.Logger) if err != nil { - ctx.Logger.Errorf("view UpdateCodeHostByToken err: %v", err) + ctx.Logger.Errorf("UpdateCodeHostByToken err: %v", err) url := fmt.Sprintf("%s%s%s", frontEndUrl, "?", "&errMessage=update codehost failed") c.Redirect(http.StatusFound, url) return -- Gitee From 94b6d5a660afdb0587d8866d50aa345444ef6d07 Mon Sep 17 00:00:00 2001 From: mouuii Date: Tue, 9 Nov 2021 16:43:07 +0800 Subject: [PATCH 290/405] remove code Signed-off-by: mouuii --- pkg/config/config.go | 4 ---- pkg/microservice/systemconfig/config/config.go | 4 ---- .../core/codehost/handler/codehost.go | 15 --------------- pkg/setting/consts.go | 1 - 4 files changed, 24 deletions(-) diff --git a/pkg/config/config.go b/pkg/config/config.go index d6edc02e1..42de9dce6 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -266,7 +266,3 @@ func AdminEmail() string { func AdminPassword() string { return viper.GetString(setting.ENVAdminPassword) } - -func HttpProxy() string { - return viper.GetString(setting.ENVHttpProxy) -} diff --git a/pkg/microservice/systemconfig/config/config.go b/pkg/microservice/systemconfig/config/config.go index 23e2427da..2430e9b96 100644 --- a/pkg/microservice/systemconfig/config/config.go +++ b/pkg/microservice/systemconfig/config/config.go @@ -22,7 +22,3 @@ func MongoURI() string { func MongoDatabase() string { return configbase.MongoDatabase() } - -func HttpPorxy() string { - return configbase.HttpProxy() -} diff --git a/pkg/microservice/systemconfig/core/codehost/handler/codehost.go b/pkg/microservice/systemconfig/core/codehost/handler/codehost.go index fc18d63c7..e43af225b 100644 --- a/pkg/microservice/systemconfig/core/codehost/handler/codehost.go +++ b/pkg/microservice/systemconfig/core/codehost/handler/codehost.go @@ -166,21 +166,6 @@ func Callback(c *gin.Context) { } } dc := http.DefaultClient - // if http proxy env is set - //if config.HttpPorxy() != "" { - // p, err := url.Parse("***") - // if err != nil { - // ctx.Logger.Errorf("parse proxy err: %v", err) - // url := fmt.Sprintf("%s%s%s", frontEndUrl, "?", "&errMessage=parse proxy err") - // c.Redirect(http.StatusFound, url) - // return - // } - // proxy := http.ProxyURL(p) - // trans := &http.Transport{ - // Proxy: proxy, - // } - // dc = &http.Client{Transport: trans} - //} ctxx := context.WithValue(context.Background(), oauth2.HTTPClient, dc) token, err := authConfig.Exchange(ctxx, code) if err != nil { diff --git a/pkg/setting/consts.go b/pkg/setting/consts.go index a5a1a3e4d..26352978f 100644 --- a/pkg/setting/consts.go +++ b/pkg/setting/consts.go @@ -118,7 +118,6 @@ const ( ENVAdminEmail = "ADMIN_EMAIL" ENVAdminPassword = "ADMIN_PASSWORD" PresetAccount = "admin" - ENVHttpProxy = "HTTP_PROXY" ) // k8s concepts -- Gitee From 4eb5be01e64885d793fa559e5ec1b503d4d5d2d2 Mon Sep 17 00:00:00 2001 From: mouuii Date: Tue, 9 Nov 2021 16:50:01 +0800 Subject: [PATCH 291/405] log Signed-off-by: mouuii --- pkg/microservice/systemconfig/core/codehost/handler/codehost.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/microservice/systemconfig/core/codehost/handler/codehost.go b/pkg/microservice/systemconfig/core/codehost/handler/codehost.go index e43af225b..84ee1d60a 100644 --- a/pkg/microservice/systemconfig/core/codehost/handler/codehost.go +++ b/pkg/microservice/systemconfig/core/codehost/handler/codehost.go @@ -131,7 +131,7 @@ func Callback(c *gin.Context) { codeHostArray := strings.Split(urlArray[1], "&provider=") codeHostID, err := strconv.Atoi(codeHostArray[0]) if err != nil { - ctx.Logger.Error("code_host_get_call_back_gitlab codeHostID convert err : %v", err) + ctx.Logger.Errorf("code_host_get_call_back_gitlab codeHostID convert err : %v", err) url := fmt.Sprintf("%s%s%s", frontEndUrl, "?", "&errMessage=codeHostID convert failed") c.Redirect(http.StatusFound, url) return -- Gitee From 02c0cf847f7ebe68e953797bc2105de6970a8af0 Mon Sep 17 00:00:00 2001 From: mouuii Date: Tue, 9 Nov 2021 16:54:06 +0800 Subject: [PATCH 292/405] log Signed-off-by: mouuii --- pkg/microservice/systemconfig/core/codehost/handler/codehost.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/microservice/systemconfig/core/codehost/handler/codehost.go b/pkg/microservice/systemconfig/core/codehost/handler/codehost.go index 84ee1d60a..263924e95 100644 --- a/pkg/microservice/systemconfig/core/codehost/handler/codehost.go +++ b/pkg/microservice/systemconfig/core/codehost/handler/codehost.go @@ -180,7 +180,7 @@ func Callback(c *gin.Context) { ctx.Logger.Infof("%+v", iCodehost) _, err = service.UpdateCodeHostByToken(iCodehost, ctx.Logger) if err != nil { - ctx.Logger.Errorf("UpdateCodeHostByToken err: %v", err) + ctx.Logger.Errorf("UpdateCodeHostByToken err: %s", err) url := fmt.Sprintf("%s%s%s", frontEndUrl, "?", "&errMessage=update codehost failed") c.Redirect(http.StatusFound, url) return -- Gitee From aa7d7962e6e7eb6aa772380edd90a7f8d7363920 Mon Sep 17 00:00:00 2001 From: mouuii Date: Tue, 9 Nov 2021 17:16:50 +0800 Subject: [PATCH 293/405] refactor Signed-off-by: mouuii --- .../core/codehost/handler/codehost.go | 35 ++++++++++--------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/pkg/microservice/systemconfig/core/codehost/handler/codehost.go b/pkg/microservice/systemconfig/core/codehost/handler/codehost.go index 263924e95..1f8f0354f 100644 --- a/pkg/microservice/systemconfig/core/codehost/handler/codehost.go +++ b/pkg/microservice/systemconfig/core/codehost/handler/codehost.go @@ -86,19 +86,23 @@ func AuthCodeHost(c *gin.Context) { RedirectURL: callBackUrl, //RedirectURL: "http://localhost:34001/directory/codehosts/callback", } + var authUrl string + var tokenUrl string + var scopes []string if provider == "gitlab" { - authConfig.Scopes = []string{"api", "read_user"} - authConfig.Endpoint = oauth2.Endpoint{ - AuthURL: fmt.Sprintf("%s%s", codeHost.Address, "/oauth/authorize"), - TokenURL: fmt.Sprintf("%s%s", codeHost.Address, "/oauth/token"), - } + scopes = []string{"api", "read_user"} + authUrl = codeHost.Address + "/oauth/authorize" + tokenUrl = codeHost.Address + "/oauth/token" } else if provider == "github" { - authConfig.Scopes = []string{"repo", "user"} - authConfig.Endpoint = oauth2.Endpoint{ - AuthURL: fmt.Sprintf("%s%s", codeHost.Address, "/login/oauth/authorize"), - TokenURL: fmt.Sprintf("%s%s", codeHost.Address, "/login/oauth/access_token"), - } + scopes = []string{"repo", "user"} + authUrl = codeHost.Address + "/login/oauth/authorize" + tokenUrl = codeHost.Address + "/login/oauth/access_token" + } + authConfig.Endpoint = oauth2.Endpoint{ + AuthURL: authUrl, + TokenURL: tokenUrl, } + authConfig.Scopes = scopes redirectURL := authConfig.AuthCodeURL(authStateString) c.Redirect(http.StatusFound, redirectURL) } @@ -107,7 +111,6 @@ func Callback(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - //增加数据验证 state := c.Query("state") urlArray := strings.Split(state, "&codeHostId=") frontEndUrl := urlArray[0] @@ -117,7 +120,7 @@ func Callback(c *gin.Context) { gitlabError := c.Query("error") if gitlabError != "" { - ctx.Logger.Warn("code_host_get_call_back_gitlab user denied") + ctx.Logger.Warnf("code_host_get_call_back_gitlab user denied: %s", gitlabError) url := fmt.Sprintf("%s%s%s", frontEndUrl, "?", "&errMessage=access_denied") c.Redirect(http.StatusFound, url) return @@ -131,7 +134,7 @@ func Callback(c *gin.Context) { codeHostArray := strings.Split(urlArray[1], "&provider=") codeHostID, err := strconv.Atoi(codeHostArray[0]) if err != nil { - ctx.Logger.Errorf("code_host_get_call_back_gitlab codeHostID convert err : %v", err) + ctx.Logger.Errorf("code_host_get_call_back_gitlab codeHostID convert err : %s", err) url := fmt.Sprintf("%s%s%s", frontEndUrl, "?", "&errMessage=codeHostID convert failed") c.Redirect(http.StatusFound, url) return @@ -139,7 +142,7 @@ func Callback(c *gin.Context) { code := c.Query("code") iCodehost, err := service.GetCodeHost(codeHostID, ctx.Logger) if err != nil { - ctx.Logger.Errorf("code_host_get_call_back_gitlab GetCodeHostByID err: %v", err) + ctx.Logger.Errorf("code_host_get_call_back_gitlab GetCodeHostByID err: %s", err) url := fmt.Sprintf("%s%s%s", frontEndUrl, "?", "&errMessage=get codehost failed") c.Redirect(http.StatusFound, url) return @@ -169,7 +172,7 @@ func Callback(c *gin.Context) { ctxx := context.WithValue(context.Background(), oauth2.HTTPClient, dc) token, err := authConfig.Exchange(ctxx, code) if err != nil { - ctx.Logger.Errorf("code_host_get_call_back_gitlab Exchange err: %v", err) + ctx.Logger.Errorf("code_host_get_call_back_gitlab Exchange err: %s", err) url := fmt.Sprintf("%s%s%s", frontEndUrl, "?", "&errMessage=exchange failed") c.Redirect(http.StatusFound, url) return @@ -186,7 +189,7 @@ func Callback(c *gin.Context) { return } - //跳转回前端 + //redirect to front end redirectURL := "" if strings.Contains(frontEndUrl, "?succeed") { redirectURL = fmt.Sprintf("%s%s", strings.Split(frontEndUrl, "?succeed")[0], "?succeed=true") -- Gitee From 976d876c2afb1da6667549f41147073a24a8184b Mon Sep 17 00:00:00 2001 From: mouuii Date: Tue, 9 Nov 2021 17:18:07 +0800 Subject: [PATCH 294/405] refactor Signed-off-by: mouuii --- .../core/codehost/handler/codehost.go | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/pkg/microservice/systemconfig/core/codehost/handler/codehost.go b/pkg/microservice/systemconfig/core/codehost/handler/codehost.go index 1f8f0354f..ecb5834ac 100644 --- a/pkg/microservice/systemconfig/core/codehost/handler/codehost.go +++ b/pkg/microservice/systemconfig/core/codehost/handler/codehost.go @@ -80,12 +80,7 @@ func AuthCodeHost(c *gin.Context) { return } callBackUrl := fmt.Sprintf("%s://%s%s", redirectHost.Scheme, redirectHost.Host, "/api/v1/codehosts/callback") - authConfig := &oauth2.Config{ - ClientID: codeHost.ApplicationId, - ClientSecret: codeHost.ClientSecret, - RedirectURL: callBackUrl, - //RedirectURL: "http://localhost:34001/directory/codehosts/callback", - } + var authUrl string var tokenUrl string var scopes []string @@ -98,11 +93,16 @@ func AuthCodeHost(c *gin.Context) { authUrl = codeHost.Address + "/login/oauth/authorize" tokenUrl = codeHost.Address + "/login/oauth/access_token" } - authConfig.Endpoint = oauth2.Endpoint{ - AuthURL: authUrl, - TokenURL: tokenUrl, + authConfig := &oauth2.Config{ + ClientID: codeHost.ApplicationId, + ClientSecret: codeHost.ClientSecret, + RedirectURL: callBackUrl, + Endpoint: oauth2.Endpoint{ + AuthURL: authUrl, + TokenURL: tokenUrl, + }, + Scopes: scopes, } - authConfig.Scopes = scopes redirectURL := authConfig.AuthCodeURL(authStateString) c.Redirect(http.StatusFound, redirectURL) } -- Gitee From 71eb33b9b9153b2cde199abfc5718df816be0f82 Mon Sep 17 00:00:00 2001 From: mouuii Date: Tue, 9 Nov 2021 17:23:51 +0800 Subject: [PATCH 295/405] refactor Signed-off-by: mouuii --- pkg/microservice/systemconfig/core/codehost/handler/codehost.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/microservice/systemconfig/core/codehost/handler/codehost.go b/pkg/microservice/systemconfig/core/codehost/handler/codehost.go index ecb5834ac..775455b82 100644 --- a/pkg/microservice/systemconfig/core/codehost/handler/codehost.go +++ b/pkg/microservice/systemconfig/core/codehost/handler/codehost.go @@ -120,7 +120,7 @@ func Callback(c *gin.Context) { gitlabError := c.Query("error") if gitlabError != "" { - ctx.Logger.Warnf("code_host_get_call_back_gitlab user denied: %s", gitlabError) + ctx.Logger.Warnf("code_host_get_call_back_gitlab user denied err: %s", gitlabError) url := fmt.Sprintf("%s%s%s", frontEndUrl, "?", "&errMessage=access_denied") c.Redirect(http.StatusFound, url) return -- Gitee From 6222a3eeffe6850bcbdf3f1f79be11a01657b883 Mon Sep 17 00:00:00 2001 From: panxunying <641770806@qq.com> Date: Tue, 9 Nov 2021 17:27:33 +0800 Subject: [PATCH 296/405] add update user Signed-off-by: panxunying <641770806@qq.com> --- pkg/microservice/user/core/handler/router.go | 4 +++ .../user/core/handler/user/user.go | 28 +++++++++++++++++++ .../user/core/repository/orm/user.go | 8 ++++++ .../user/core/service/user/user.go | 22 +++++++++++++-- 4 files changed, 60 insertions(+), 2 deletions(-) diff --git a/pkg/microservice/user/core/handler/router.go b/pkg/microservice/user/core/handler/router.go index 1b35af75e..7f09d9c5a 100644 --- a/pkg/microservice/user/core/handler/router.go +++ b/pkg/microservice/user/core/handler/router.go @@ -34,6 +34,10 @@ func (*Router) Inject(router *gin.RouterGroup) { users.PUT("/users/:uid/password", user.UpdatePassword) + users.PUT("/users/:uid", user.UpdateUser) + + users.PUT("/users/:uid/personal", user.UpdatePersonalUser) + users.GET("/users/:uid", user.GetUser) users.DELETE("/users/:uid", user.DeleteUser) diff --git a/pkg/microservice/user/core/handler/user/user.go b/pkg/microservice/user/core/handler/user/user.go index f3a01fe7e..b94787bca 100644 --- a/pkg/microservice/user/core/handler/user/user.go +++ b/pkg/microservice/user/core/handler/user/user.go @@ -72,6 +72,34 @@ func CreateUser(c *gin.Context) { ctx.Resp, ctx.Err = user.CreateUser(args, ctx.Logger) } +func UpdateUser(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + args := &user.UpdateUserInfo{} + if err := c.ShouldBindJSON(args); err != nil { + ctx.Err = err + return + } + uid := c.Param("uid") + ctx.Err = user.UpdateUser(uid, args, ctx.Logger) +} + +func UpdatePersonalUser(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + args := &user.UpdateUserInfo{} + if err := c.ShouldBindJSON(args); err != nil { + ctx.Err = err + return + } + uid := c.Param("uid") + if ctx.UserID != uid { + ctx.Err = e.ErrForbidden + return + } + ctx.Err = user.UpdateUser(uid, args, ctx.Logger) +} + func SignUp(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() diff --git a/pkg/microservice/user/core/repository/orm/user.go b/pkg/microservice/user/core/repository/orm/user.go index 994a89d90..73aeb2835 100644 --- a/pkg/microservice/user/core/repository/orm/user.go +++ b/pkg/microservice/user/core/repository/orm/user.go @@ -125,3 +125,11 @@ func GetUsersCount(name string) (int64, error) { return count, nil } + +// UpdateUser update user info +func UpdateUser(uid string, user *models.User, db *gorm.DB) error { + if err := db.Model(&models.User{}).Where("uid = ?", uid).Updates(user).Error; err != nil { + return err + } + return nil +} diff --git a/pkg/microservice/user/core/service/user/user.go b/pkg/microservice/user/core/service/user/user.go index b9aab9164..3d17ef6a2 100644 --- a/pkg/microservice/user/core/service/user/user.go +++ b/pkg/microservice/user/core/service/user/user.go @@ -24,13 +24,20 @@ import ( ) type User struct { - Name string `json:"name,omitempty"` + Name string `json:"name"` Password string `json:"password"` - Email string `json:"email,omitempty"` + Email string `json:"email"` Account string `json:"account"` Phone string `json:"phone,omitempty"` } +type UpdateUserInfo struct { + Name string `json:"name"` + Email string `json:"email"` + Phone string `json:"phone,omitempty"` + IdentityType string `json:"identity_type"` +} + type QueryArgs struct { Name string `json:"name,omitempty"` Account string `json:"account,omitempty"` @@ -383,6 +390,17 @@ func CreateUser(args *User, logger *zap.SugaredLogger) (*models.User, error) { return user, tx.Commit().Error } +func UpdateUser(uid string, args *UpdateUserInfo, _ *zap.SugaredLogger) error { + user := &models.User{ + Name: args.Name, + Email: args.Email, + IdentityType: args.IdentityType, + Phone: args.Phone, + } + return orm.UpdateUser(uid, user, core.DB) + +} + func UpdatePassword(args *Password, logger *zap.SugaredLogger) error { user, err := orm.GetUserByUid(args.Uid, core.DB) if err != nil { -- Gitee From ae9d7e08ff20ed964afafbfb3ac00893a723e3ca Mon Sep 17 00:00:00 2001 From: panxunying <641770806@qq.com> Date: Tue, 9 Nov 2021 17:33:28 +0800 Subject: [PATCH 297/405] optimize Signed-off-by: panxunying <641770806@qq.com> --- pkg/microservice/user/core/service/user/user.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/microservice/user/core/service/user/user.go b/pkg/microservice/user/core/service/user/user.go index 3d17ef6a2..2f2b22e7b 100644 --- a/pkg/microservice/user/core/service/user/user.go +++ b/pkg/microservice/user/core/service/user/user.go @@ -32,8 +32,8 @@ type User struct { } type UpdateUserInfo struct { - Name string `json:"name"` - Email string `json:"email"` + Name string `json:"name,omitempty"` + Email string `json:"email,omitempty"` Phone string `json:"phone,omitempty"` IdentityType string `json:"identity_type"` } -- Gitee From 62173267ca2c336dc7ccc1e734b7adf727c34775 Mon Sep 17 00:00:00 2001 From: mouuii Date: Tue, 9 Nov 2021 17:35:14 +0800 Subject: [PATCH 298/405] build fail Signed-off-by: mouuii --- .../aslan/core/code/service/workspace.go | 1 + .../aslan/core/common/service/fs/git.go | 1 + .../core/common/service/gerrit/gerrit.go | 1 + .../core/common/service/scmnotify/client.go | 1 + .../aslan/core/common/service/workflow.go | 1 + .../aslan/core/service/service/helm.go | 5 ++-- .../aslan/core/service/service/loader.go | 27 +++++++++---------- .../aslan/core/service/service/new_loader.go | 8 +++--- .../service/webhook/github_workflow_task.go | 1 + .../service/webhook/gitlab_workflow_task.go | 1 + .../core/workflow/service/workflow/github.go | 1 + 11 files changed, 28 insertions(+), 20 deletions(-) diff --git a/pkg/microservice/aslan/core/code/service/workspace.go b/pkg/microservice/aslan/core/code/service/workspace.go index 6eac61dc6..434a18288 100644 --- a/pkg/microservice/aslan/core/code/service/workspace.go +++ b/pkg/microservice/aslan/core/code/service/workspace.go @@ -28,6 +28,7 @@ import ( "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/command" "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/fs" "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/git" + "github.com/koderover/zadig/pkg/shared/client/systemconfig" "github.com/koderover/zadig/pkg/tool/codehub" e "github.com/koderover/zadig/pkg/tool/errors" ) diff --git a/pkg/microservice/aslan/core/common/service/fs/git.go b/pkg/microservice/aslan/core/common/service/fs/git.go index a7dce1a06..0d76a793f 100644 --- a/pkg/microservice/aslan/core/common/service/fs/git.go +++ b/pkg/microservice/aslan/core/common/service/fs/git.go @@ -27,6 +27,7 @@ import ( githubservice "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/github" gitlabservice "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/gitlab" "github.com/koderover/zadig/pkg/setting" + "github.com/koderover/zadig/pkg/shared/client/systemconfig" "github.com/koderover/zadig/pkg/tool/log" ) diff --git a/pkg/microservice/aslan/core/common/service/gerrit/gerrit.go b/pkg/microservice/aslan/core/common/service/gerrit/gerrit.go index dc01a6a24..6f4fa71a5 100644 --- a/pkg/microservice/aslan/core/common/service/gerrit/gerrit.go +++ b/pkg/microservice/aslan/core/common/service/gerrit/gerrit.go @@ -26,6 +26,7 @@ import ( "github.com/koderover/zadig/pkg/microservice/aslan/config" "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/models" + "github.com/koderover/zadig/pkg/shared/client/systemconfig" "github.com/koderover/zadig/pkg/tool/gerrit" ) diff --git a/pkg/microservice/aslan/core/common/service/scmnotify/client.go b/pkg/microservice/aslan/core/common/service/scmnotify/client.go index 7fcbc14a9..c3c8b51f8 100644 --- a/pkg/microservice/aslan/core/common/service/scmnotify/client.go +++ b/pkg/microservice/aslan/core/common/service/scmnotify/client.go @@ -27,6 +27,7 @@ import ( "github.com/koderover/zadig/pkg/microservice/aslan/config" "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/models" + "github.com/koderover/zadig/pkg/shared/client/systemconfig" "github.com/koderover/zadig/pkg/tool/gerrit" gitlabtool "github.com/koderover/zadig/pkg/tool/git/gitlab" "github.com/koderover/zadig/pkg/tool/log" diff --git a/pkg/microservice/aslan/core/common/service/workflow.go b/pkg/microservice/aslan/core/common/service/workflow.go index 373e40975..eb174190e 100644 --- a/pkg/microservice/aslan/core/common/service/workflow.go +++ b/pkg/microservice/aslan/core/common/service/workflow.go @@ -30,6 +30,7 @@ import ( "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/gerrit" "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/webhook" "github.com/koderover/zadig/pkg/setting" + "github.com/koderover/zadig/pkg/shared/client/systemconfig" e "github.com/koderover/zadig/pkg/tool/errors" ) diff --git a/pkg/microservice/aslan/core/service/service/helm.go b/pkg/microservice/aslan/core/service/service/helm.go index d7d108cf1..a053a45c5 100644 --- a/pkg/microservice/aslan/core/service/service/helm.go +++ b/pkg/microservice/aslan/core/service/service/helm.go @@ -19,6 +19,7 @@ package service import ( "bytes" "fmt" + "io/fs" "os" "path/filepath" @@ -47,7 +48,7 @@ import ( templatestore "github.com/koderover/zadig/pkg/microservice/aslan/core/templatestore/repository/models" "github.com/koderover/zadig/pkg/microservice/aslan/core/templatestore/repository/mongodb" "github.com/koderover/zadig/pkg/setting" - "github.com/koderover/zadig/pkg/shared/poetry" + "github.com/koderover/zadig/pkg/shared/client/systemconfig" e "github.com/koderover/zadig/pkg/tool/errors" "github.com/koderover/zadig/pkg/tool/log" "github.com/koderover/zadig/pkg/types" @@ -344,7 +345,7 @@ func CreateOrUpdateHelmServiceFromChartTemplate(projectName string, args *HelmSe return nil } -func getCodehostType(repoArgs *CreateFromRepo, repoLink string) (string, *poetry.CodeHost, error) { +func getCodehostType(repoArgs *CreateFromRepo, repoLink string) (string, *systemconfig.CodeHost, error) { if repoLink != "" { return setting.SourceFromPublicRepo, nil, nil } diff --git a/pkg/microservice/aslan/core/service/service/loader.go b/pkg/microservice/aslan/core/service/service/loader.go index 28393c1ba..4043e2c95 100644 --- a/pkg/microservice/aslan/core/service/service/loader.go +++ b/pkg/microservice/aslan/core/service/service/loader.go @@ -34,8 +34,7 @@ import ( "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/models" "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/command" "github.com/koderover/zadig/pkg/setting" - "github.com/koderover/zadig/pkg/shared/codehost" - "github.com/koderover/zadig/pkg/shared/poetry" + "github.com/koderover/zadig/pkg/shared/client/systemconfig" "github.com/koderover/zadig/pkg/tool/codehub" e "github.com/koderover/zadig/pkg/tool/errors" "github.com/koderover/zadig/pkg/tool/gerrit" @@ -113,12 +112,12 @@ func ValidateServiceUpdate(codehostID int, serviceName, repoOwner, repoName, rep } // 根据repo信息获取gerrit可以加载的服务列表 -func preloadGerritService(detail *poetry.CodeHost, repoName, branchName, remoteName, loadPath string, isDir bool) ([]string, error) { +func preloadGerritService(detail *systemconfig.CodeHost, repoName, branchName, remoteName, loadPath string, isDir bool) ([]string, error) { ret := make([]string, 0) base := path.Join(config.S3StoragePath(), repoName) if _, err := os.Stat(base); os.IsNotExist(err) { - chDetail := &codehost.Detail{ + chDetail := &systemconfig.Detail{ ID: detail.ID, Name: "", Address: detail.Address, @@ -182,7 +181,7 @@ func preloadGerritService(detail *poetry.CodeHost, repoName, branchName, remoteN } // 根据 repo 信息获取 codehub 可以加载的服务列表 -func preloadCodehubService(detail *poetry.CodeHost, repoName, repoUUID, branchName, path string, isDir bool) ([]string, error) { +func preloadCodehubService(detail *systemconfig.CodeHost, repoName, repoUUID, branchName, path string, isDir bool) ([]string, error) { var ret []string codeHubClient := codehub.NewCodeHubClient(detail.AccessKey, detail.SecretKey, detail.Region) @@ -239,10 +238,10 @@ func preloadCodehubService(detail *poetry.CodeHost, repoName, repoUUID, branchNa } // 根据repo信息从gerrit加载服务 -func loadGerritService(username string, ch *poetry.CodeHost, repoOwner, repoName, branchName, remoteName string, args *LoadServiceReq, log *zap.SugaredLogger) error { +func loadGerritService(username string, ch *systemconfig.CodeHost, repoOwner, repoName, branchName, remoteName string, args *LoadServiceReq, log *zap.SugaredLogger) error { base := path.Join(config.S3StoragePath(), repoName) if _, err := os.Stat(base); os.IsNotExist(err) { - err = command.RunGitCmds(&codehost.Detail{Source: ch.Type, Address: ch.Address, OauthToken: ch.AccessToken}, repoOwner, repoName, branchName, remoteName) + err = command.RunGitCmds(&systemconfig.Detail{Source: ch.Type, Address: ch.Address, OauthToken: ch.AccessToken}, repoOwner, repoName, branchName, remoteName) if err != nil { return e.ErrLoadServiceTemplate.AddDesc(err.Error()) } @@ -378,7 +377,7 @@ func loadServiceFromGerrit(tree []os.FileInfo, id int, username, branchName, loa } // load codehub service -func loadCodehubService(username string, ch *poetry.CodeHost, repoOwner, repoName, repoUUID, branchName string, args *LoadServiceReq, log *zap.SugaredLogger) error { +func loadCodehubService(username string, ch *systemconfig.CodeHost, repoOwner, repoName, repoUUID, branchName string, args *LoadServiceReq, log *zap.SugaredLogger) error { codeHubClient := codehub.NewCodeHubClient(ch.AccessKey, ch.SecretKey, ch.Region) if !args.LoadFromDir { @@ -449,7 +448,7 @@ func loadCodehubService(username string, ch *poetry.CodeHost, repoOwner, repoNam return nil } -func loadServiceFromCodehub(client *codehub.CodeHubClient, tree []*codehub.TreeNode, ch *poetry.CodeHost, username, repoOwner, repoName, repoUUID, branchName, path string, args *LoadServiceReq, log *zap.SugaredLogger) error { +func loadServiceFromCodehub(client *codehub.CodeHubClient, tree []*codehub.TreeNode, ch *systemconfig.CodeHost, username, repoOwner, repoName, repoUUID, branchName, path string, args *LoadServiceReq, log *zap.SugaredLogger) error { pathList := strings.Split(path, "/") var splittedYaml []string serviceName := pathList[len(pathList)-1] @@ -504,7 +503,7 @@ func loadServiceFromCodehub(client *codehub.CodeHubClient, tree []*codehub.TreeN } // 根据github repo决定服务是否可以更新这个repo地址 -func validateServiceUpdateGithub(detail *poetry.CodeHost, serviceName, repoOwner, repoName, branchName, path string, isDir bool) error { +func validateServiceUpdateGithub(detail *systemconfig.CodeHost, serviceName, repoOwner, repoName, branchName, path string, isDir bool) error { ctx := context.Background() tokenSource := oauth2.StaticTokenSource( &oauth2.Token{AccessToken: detail.AccessToken}, @@ -551,7 +550,7 @@ func validateServiceUpdateGithub(detail *poetry.CodeHost, serviceName, repoOwner } // 根据gitlab repo决定服务是否可以更新这个repo地址 -func validateServiceUpdateGitlab(detail *poetry.CodeHost, serviceName, repoOwner, repoName, branchName, path string, isDir bool) error { +func validateServiceUpdateGitlab(detail *systemconfig.CodeHost, serviceName, repoOwner, repoName, branchName, path string, isDir bool) error { repoInfo := fmt.Sprintf("%s/%s", repoOwner, repoName) gitlabClient, err := gitlab.NewOAuthClient(detail.AccessToken, gitlab.WithBaseURL(detail.Address)) @@ -603,10 +602,10 @@ func validateServiceUpdateGitlab(detail *poetry.CodeHost, serviceName, repoOwner } // 根据gerrit repo决定服务是否可以更新这个repo地址 -func validateServiceUpdateGerrit(detail *poetry.CodeHost, serviceName, repoName, branchName, remoteName, loadPath string, isDir bool) error { +func validateServiceUpdateGerrit(detail *systemconfig.CodeHost, serviceName, repoName, branchName, remoteName, loadPath string, isDir bool) error { base := path.Join(config.S3StoragePath(), repoName) if _, err := os.Stat(base); os.IsNotExist(err) { - chDetail := &codehost.Detail{ + chDetail := &systemconfig.Detail{ ID: detail.ID, Name: "", Address: detail.Address, @@ -655,7 +654,7 @@ func validateServiceUpdateGerrit(detail *poetry.CodeHost, serviceName, repoName, return e.ErrValidateServiceUpdate.AddDesc("所选路径中没有yaml,请重新选择") } -func validateServiceUpdateCodehub(detail *poetry.CodeHost, serviceName, repoName, repoUUID, branchName, loadPath string, isDir bool) error { +func validateServiceUpdateCodehub(detail *systemconfig.CodeHost, serviceName, repoName, repoUUID, branchName, loadPath string, isDir bool) error { codeHubClient := codehub.NewCodeHubClient(detail.AccessKey, detail.SecretKey, detail.Region) // 非文件夹情况下直接获取文件信息 if !isDir { diff --git a/pkg/microservice/aslan/core/service/service/new_loader.go b/pkg/microservice/aslan/core/service/service/new_loader.go index 3c2a05765..181c18e25 100644 --- a/pkg/microservice/aslan/core/service/service/new_loader.go +++ b/pkg/microservice/aslan/core/service/service/new_loader.go @@ -30,13 +30,13 @@ import ( githubservice "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/github" gitlabservice "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/gitlab" "github.com/koderover/zadig/pkg/setting" - "github.com/koderover/zadig/pkg/shared/poetry" + "github.com/koderover/zadig/pkg/shared/client/systemconfig" e "github.com/koderover/zadig/pkg/tool/errors" "github.com/koderover/zadig/pkg/tool/log" "github.com/koderover/zadig/pkg/util" ) -func preloadService(ch *poetry.CodeHost, owner, repo, branch, path string, isDir bool, logger *zap.SugaredLogger) ([]string, error) { +func preloadService(ch *systemconfig.CodeHost, owner, repo, branch, path string, isDir bool, logger *zap.SugaredLogger) ([]string, error) { logger.Infof("Preloading service from %s with owner %s, repo %s, branch %s and path %s", ch.Type, owner, repo, branch, path) loader, err := getLoader(ch) @@ -95,7 +95,7 @@ type serviceInfo struct { yamls []string } -func loadService(username string, ch *poetry.CodeHost, owner, repo, branch string, args *LoadServiceReq, logger *zap.SugaredLogger) error { +func loadService(username string, ch *systemconfig.CodeHost, owner, repo, branch string, args *LoadServiceReq, logger *zap.SugaredLogger) error { logger.Infof("Loading service from %s with owner %s, repo %s, branch %s and path %s", ch.Type, owner, repo, branch, args.LoadPath) project, err := templaterepo.NewProductColl().Find(args.ProductName) @@ -236,7 +236,7 @@ type yamlLoader interface { GetTree(owner, repo, path, branch string) ([]*git.TreeNode, error) } -func getLoader(ch *poetry.CodeHost) (yamlLoader, error) { +func getLoader(ch *systemconfig.CodeHost) (yamlLoader, error) { switch ch.Type { case setting.SourceFromGithub: return githubservice.NewClient(ch.AccessToken, config.ProxyHTTPSAddr()), nil diff --git a/pkg/microservice/aslan/core/workflow/service/webhook/github_workflow_task.go b/pkg/microservice/aslan/core/workflow/service/webhook/github_workflow_task.go index b2dab64d3..4d882d9cc 100644 --- a/pkg/microservice/aslan/core/workflow/service/webhook/github_workflow_task.go +++ b/pkg/microservice/aslan/core/workflow/service/webhook/github_workflow_task.go @@ -33,6 +33,7 @@ import ( git "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/github" workflowservice "github.com/koderover/zadig/pkg/microservice/aslan/core/workflow/service/workflow" "github.com/koderover/zadig/pkg/setting" + "github.com/koderover/zadig/pkg/shared/client/systemconfig" "github.com/koderover/zadig/pkg/types" ) diff --git a/pkg/microservice/aslan/core/workflow/service/webhook/gitlab_workflow_task.go b/pkg/microservice/aslan/core/workflow/service/webhook/gitlab_workflow_task.go index 103d67d05..e83735d9d 100644 --- a/pkg/microservice/aslan/core/workflow/service/webhook/gitlab_workflow_task.go +++ b/pkg/microservice/aslan/core/workflow/service/webhook/gitlab_workflow_task.go @@ -36,6 +36,7 @@ import ( environmentservice "github.com/koderover/zadig/pkg/microservice/aslan/core/environment/service" workflowservice "github.com/koderover/zadig/pkg/microservice/aslan/core/workflow/service/workflow" "github.com/koderover/zadig/pkg/setting" + "github.com/koderover/zadig/pkg/shared/client/systemconfig" e "github.com/koderover/zadig/pkg/tool/errors" gitlabtool "github.com/koderover/zadig/pkg/tool/git/gitlab" "github.com/koderover/zadig/pkg/tool/log" diff --git a/pkg/microservice/aslan/core/workflow/service/workflow/github.go b/pkg/microservice/aslan/core/workflow/service/workflow/github.go index fe6b43490..0a347bc2e 100644 --- a/pkg/microservice/aslan/core/workflow/service/workflow/github.go +++ b/pkg/microservice/aslan/core/workflow/service/workflow/github.go @@ -27,6 +27,7 @@ import ( "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/models/task" "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/github" "github.com/koderover/zadig/pkg/setting" + "github.com/koderover/zadig/pkg/shared/client/systemconfig" e "github.com/koderover/zadig/pkg/tool/errors" ) -- Gitee From d67b237c4e5e372c418a963a7b8df3a1800fcea5 Mon Sep 17 00:00:00 2001 From: liu deyi Date: Tue, 9 Nov 2021 18:29:14 +0800 Subject: [PATCH 299/405] optimize db index Signed-off-by: liu deyi --- .../aslan/core/common/repository/mongodb/external_link.go | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/pkg/microservice/aslan/core/common/repository/mongodb/external_link.go b/pkg/microservice/aslan/core/common/repository/mongodb/external_link.go index a92a20a7d..5c6756138 100644 --- a/pkg/microservice/aslan/core/common/repository/mongodb/external_link.go +++ b/pkg/microservice/aslan/core/common/repository/mongodb/external_link.go @@ -35,10 +35,12 @@ func (c *ExternalLinkColl) GetCollectionName() string { func (c *ExternalLinkColl) EnsureIndex(ctx context.Context) error { mod := mongo.IndexModel{ - Keys: bson.M{"name": 1, "url": 1}, - Options: options.Index().SetUnique(false), + Keys: bson.D{ + bson.E{Key: "name", Value: 1}, + bson.E{Key: "url", Value: 1}, + }, + Options: options.Index().SetUnique(true), } - _, err := c.Indexes().CreateOne(ctx, mod) return err } -- Gitee From 528be9c5d2962e18208d67a9edba10c5098fd26c Mon Sep 17 00:00:00 2001 From: lou Date: Tue, 9 Nov 2021 19:06:39 +0800 Subject: [PATCH 300/405] add update path --- pkg/cli/upgradeassistant/cmd/migrate/170.go | 143 ++++++++++++++++++ .../internal/upgradepath/versions.go | 2 + .../core/common/repository/mongodb/webhook.go | 14 ++ .../core/common/service/github/webhook.go | 1 + .../core/common/service/gitlab/webhook.go | 1 + .../core/service/bundle/exemption_urls.go | 2 +- .../core/codehost/handler/codehost.go | 2 +- .../codehost/repository/models/codehost.go | 32 ++-- .../codehost/repository/mongodb/codehost.go | 14 +- .../core/codehost/service/codehost.go | 7 +- pkg/shared/client/systemconfig/codehost.go | 37 ++++- 11 files changed, 226 insertions(+), 29 deletions(-) create mode 100644 pkg/cli/upgradeassistant/cmd/migrate/170.go diff --git a/pkg/cli/upgradeassistant/cmd/migrate/170.go b/pkg/cli/upgradeassistant/cmd/migrate/170.go new file mode 100644 index 000000000..c0bbc2e2f --- /dev/null +++ b/pkg/cli/upgradeassistant/cmd/migrate/170.go @@ -0,0 +1,143 @@ +/* +Copyright 2021 The KodeRover 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 migrate + +import ( + "github.com/koderover/zadig/pkg/cli/upgradeassistant/internal/upgradepath" + "github.com/koderover/zadig/pkg/microservice/aslan/config" + "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/mongodb" + "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/github" + "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/gitlab" + "github.com/koderover/zadig/pkg/setting" + "github.com/koderover/zadig/pkg/shared/client/systemconfig" + "github.com/koderover/zadig/pkg/tool/log" +) + +func init() { + upgradepath.AddHandler(upgradepath.V160, upgradepath.V170, V160ToV170) + upgradepath.AddHandler(upgradepath.V170, upgradepath.V160, V170ToV160) +} + +// V160ToV170 refreshes the secret of all webhooks +func V160ToV170() error { + log.Info("Migrating data from 1.6.0 to 1.7.0") + + err := refreshWebHookSecret() + if err != nil { + log.Errorf("Failed to refresh webhook secret, err: %s", err) + return err + } + + return nil +} + +func V170ToV160() error { + log.Info("Rollback data from 1.7.0 to 1.6.0") + return nil +} + +type hookRefresher interface { + RefreshWebHookSecret(owner, repo, hookID string) error +} + +func refreshWebHookSecret() error { + hooks, err := mongodb.NewWebHookColl().List() + if err != nil { + log.Errorf("Failed to list webhooks, err: %s", err) + return err + } + + codeHosts, err := systemconfig.New().ListCodeHosts() + if err != nil { + log.Errorf("Failed to list codehosts, err: %s", err) + return err + } + + cs := toCodeHostSet(codeHosts) + for _, hook := range hooks { + var cl hookRefresher + ch, ok := cs[codeHostUniqueID{address: hook.Address, owner: hook.Owner}] + if !ok { + log.Warnf("Failed to get codehost for %s/%s", hook.Address, hook.Owner) + continue + } + + switch ch.Type { + case setting.SourceFromGithub: + cl = github.NewClient(ch.accessToken, config.ProxyHTTPSAddr()) + case setting.SourceFromGitlab: + cl, err = gitlab.NewClient(ch.address, ch.accessToken) + if err != nil { + log.Warnf("Failed to create gitlab client, err: %s", err) + continue + } + default: + log.Warnf("Invalid type: %s", ch.Type) + continue + } + + if err = cl.RefreshWebHookSecret(hook.Owner, hook.Repo, hook.HookID); err != nil { + log.Warnf("Failed to refresh webhook secret for hook %d in %s/%s, err: %s", hook.HookID, hook.Owner, hook.Repo, err) + continue + } + } + + return nil +} + +type codeHostUniqueID struct { + address, owner string +} + +type codeHostItem struct { + codeHostUniqueID + accessToken string + Type string +} + +type codeHostSet map[codeHostUniqueID]codeHostItem + +// NewCodeHostSet creates a HookSet from a list of values. +func NewCodeHostSet(items ...codeHostItem) codeHostSet { + ss := codeHostSet{} + ss.Insert(items...) + return ss +} + +// Insert adds items to the set. +func (s codeHostSet) Insert(items ...codeHostItem) codeHostSet { + for _, item := range items { + s[item.codeHostUniqueID] = item + } + return s +} + +func toCodeHostSet(codeHosts []*systemconfig.CodeHost) codeHostSet { + res := NewCodeHostSet() + for _, h := range codeHosts { + res.Insert(codeHostItem{ + codeHostUniqueID: codeHostUniqueID{ + address: h.Address, + owner: h.Namespace, + }, + accessToken: h.AccessToken, + Type: h.Type, + }) + } + + return res +} diff --git a/pkg/cli/upgradeassistant/internal/upgradepath/versions.go b/pkg/cli/upgradeassistant/internal/upgradepath/versions.go index 476dca703..0304cee03 100644 --- a/pkg/cli/upgradeassistant/internal/upgradepath/versions.go +++ b/pkg/cli/upgradeassistant/internal/upgradepath/versions.go @@ -29,6 +29,7 @@ const ( V140 V150 V160 + V170 ) var versionMap versions = map[string]int{ @@ -37,6 +38,7 @@ var versionMap versions = map[string]int{ "1.4.0": V140, "1.5.0": V150, "1.6.0": V160, + "1.7.0": V170, } type versions map[string]int diff --git a/pkg/microservice/aslan/core/common/repository/mongodb/webhook.go b/pkg/microservice/aslan/core/common/repository/mongodb/webhook.go index 39f153ba1..2f68b259f 100644 --- a/pkg/microservice/aslan/core/common/repository/mongodb/webhook.go +++ b/pkg/microservice/aslan/core/common/repository/mongodb/webhook.go @@ -119,6 +119,20 @@ func (c *WebHookColl) Delete(owner, repo, address string) error { return nil } +func (c *WebHookColl) List() ([]*models.WebHook, error) { + res := make([]*models.WebHook, 0) + cursor, err := c.Collection.Find(context.TODO(), bson.M{}) + if err != nil { + return nil, err + } + err = cursor.All(context.TODO(), &res) + if err != nil { + return nil, err + } + + return res, err +} + // Find find webhook func (c *WebHookColl) Find(owner, repo, address string) (*models.WebHook, error) { query := bson.M{"owner": owner, "repo": repo, "address": address} diff --git a/pkg/microservice/aslan/core/common/service/github/webhook.go b/pkg/microservice/aslan/core/common/service/github/webhook.go index 433d8f57e..4544ea736 100644 --- a/pkg/microservice/aslan/core/common/service/github/webhook.go +++ b/pkg/microservice/aslan/core/common/service/github/webhook.go @@ -52,6 +52,7 @@ func (c *Client) RefreshWebHookSecret(owner, repo, hookID string) error { return err } _, err = c.UpdateHook(context.TODO(), owner, repo, hookIDInt, &git.Hook{ + URL: config.WebHookURL(), Secret: gitservice.GetHookSecret(), }) diff --git a/pkg/microservice/aslan/core/common/service/gitlab/webhook.go b/pkg/microservice/aslan/core/common/service/gitlab/webhook.go index b2ecc88b3..7251fea98 100644 --- a/pkg/microservice/aslan/core/common/service/gitlab/webhook.go +++ b/pkg/microservice/aslan/core/common/service/gitlab/webhook.go @@ -51,6 +51,7 @@ func (c *Client) RefreshWebHookSecret(owner, repo, hookID string) error { return err } _, err = c.UpdateProjectHook(owner, repo, hookIDInt, &git.Hook{ + URL: config.WebHookURL(), Secret: gitservice.GetHookSecret(), }) diff --git a/pkg/microservice/policy/core/service/bundle/exemption_urls.go b/pkg/microservice/policy/core/service/bundle/exemption_urls.go index 7c4fff0db..b84f56319 100644 --- a/pkg/microservice/policy/core/service/bundle/exemption_urls.go +++ b/pkg/microservice/policy/core/service/bundle/exemption_urls.go @@ -201,7 +201,7 @@ var systemAdminURLs = []*policyRule{ Endpoints: []string{"api/aslan/system/proxy/config"}, }, { - Methods: []string{"GET", "DELETE"}, + Methods: []string{"*"}, Endpoints: []string{"api/v1/users/?*"}, }, { diff --git a/pkg/microservice/systemconfig/core/codehost/handler/codehost.go b/pkg/microservice/systemconfig/core/codehost/handler/codehost.go index 775455b82..05478b07f 100644 --- a/pkg/microservice/systemconfig/core/codehost/handler/codehost.go +++ b/pkg/microservice/systemconfig/core/codehost/handler/codehost.go @@ -30,7 +30,7 @@ func CreateCodeHost(c *gin.Context) { func ListCodeHost(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - ctx.Resp, ctx.Err = service.FindCodeHost(ctx.Logger) + ctx.Resp, ctx.Err = service.List(c.Query("address"), c.Query("owner"), ctx.Logger) } func DeleteCodeHost(c *gin.Context) { diff --git a/pkg/microservice/systemconfig/core/codehost/repository/models/codehost.go b/pkg/microservice/systemconfig/core/codehost/repository/models/codehost.go index 845be7a2b..bbbed219d 100644 --- a/pkg/microservice/systemconfig/core/codehost/repository/models/codehost.go +++ b/pkg/microservice/systemconfig/core/codehost/repository/models/codehost.go @@ -1,23 +1,21 @@ package models type CodeHost struct { - ID int `bson:"id" json:"id"` - Name string `bson:"name" json:"name"` - Type string `bson:"type" json:"type"` - Address string `bson:"address" json:"address"` - IsReady string `bson:"is_ready" json:"ready"` - AccessToken string `bson:"access_token" json:"accessToken"` - RefreshToken string `bson:"refresh_token" json:"refreshToken"` - Namespace string `bson:"namespace" json:"namespace"` - OrganizationID int `bson:"organization_id" json:"orgId"` - ApplicationId string `bson:"application_id" json:"applicationId"` - Region string `bson:"region" json:"region,omitempty"` - Username string `bson:"username" json:"username,omitempty"` - Password string `bson:"password" json:"password,omitempty"` - ClientSecret string `bson:"client_secret" json:"clientSecret"` - CreatedAt int64 `bson:"created_at" json:"created_at"` - UpdatedAt int64 `bson:"updated_at" json:"updated_at"` - DeletedAt int64 `bson:"deleted_at" json:"deleted_at"` + ID int `bson:"id" json:"id"` + Type string `bson:"type" json:"type"` + Address string `bson:"address" json:"address"` + IsReady string `bson:"is_ready" json:"ready"` + AccessToken string `bson:"access_token" json:"accessToken"` + RefreshToken string `bson:"refresh_token" json:"refreshToken"` + Namespace string `bson:"namespace" json:"namespace"` + ApplicationId string `bson:"application_id" json:"applicationId"` + Region string `bson:"region" json:"region,omitempty"` + Username string `bson:"username" json:"username,omitempty"` + Password string `bson:"password" json:"password,omitempty"` + ClientSecret string `bson:"client_secret" json:"clientSecret"` + CreatedAt int64 `bson:"created_at" json:"created_at"` + UpdatedAt int64 `bson:"updated_at" json:"updated_at"` + DeletedAt int64 `bson:"deleted_at" json:"deleted_at"` } func (CodeHost) TableName() string { diff --git a/pkg/microservice/systemconfig/core/codehost/repository/mongodb/codehost.go b/pkg/microservice/systemconfig/core/codehost/repository/mongodb/codehost.go index 95c81f05b..0bc5836e3 100644 --- a/pkg/microservice/systemconfig/core/codehost/repository/mongodb/codehost.go +++ b/pkg/microservice/systemconfig/core/codehost/repository/mongodb/codehost.go @@ -19,6 +19,11 @@ type CodehostColl struct { coll string } +type ListArgs struct { + Owner string `json:"owner"` + Address string `json:"address"` +} + func NewCodehostColl() *CodehostColl { name := models.CodeHost{}.TableName() coll := &CodehostColl{Collection: mongotool.Database(config.MongoDatabase()).Collection(name), coll: name} @@ -71,9 +76,15 @@ func (c *CodehostColl) GetCodeHostByID(ID int) (*models.CodeHost, error) { return codehost, nil } -func (c *CodehostColl) FindCodeHosts() ([]*models.CodeHost, error) { +func (c *CodehostColl) List(args *ListArgs) ([]*models.CodeHost, error) { codeHosts := make([]*models.CodeHost, 0) query := bson.M{"deleted_at": 0} + if args.Address != "" { + query["address"] = args.Address + } + if args.Owner != "" { + query["namespace"] = args.Owner + } cursor, err := c.Collection.Find(context.TODO(), query) if err != nil { @@ -122,7 +133,6 @@ func (c *CodehostColl) DeleteCodeHostByID(ID int) error { func (c *CodehostColl) UpdateCodeHost(host *models.CodeHost) (*models.CodeHost, error) { query := bson.M{"id": host.ID, "deleted_at": 0} change := bson.M{"$set": bson.M{ - "name": host.Name, "type": host.Type, "address": host.Address, "namespace": host.Namespace, diff --git a/pkg/microservice/systemconfig/core/codehost/service/codehost.go b/pkg/microservice/systemconfig/core/codehost/service/codehost.go index ea8793559..e2335d678 100644 --- a/pkg/microservice/systemconfig/core/codehost/service/codehost.go +++ b/pkg/microservice/systemconfig/core/codehost/service/codehost.go @@ -19,8 +19,11 @@ func CreateCodeHost(codehost *models.CodeHost, _ *zap.SugaredLogger) (*models.Co return mongodb.NewCodehostColl().AddCodeHost(codehost) } -func FindCodeHost(_ *zap.SugaredLogger) ([]*models.CodeHost, error) { - return mongodb.NewCodehostColl().FindCodeHosts() +func List(address, owner string, _ *zap.SugaredLogger) ([]*models.CodeHost, error) { + return mongodb.NewCodehostColl().List(&mongodb.ListArgs{ + Address: address, + Owner: owner, + }) } func DeleteCodeHost(id int, _ *zap.SugaredLogger) error { diff --git a/pkg/shared/client/systemconfig/codehost.go b/pkg/shared/client/systemconfig/codehost.go index f84e6eafa..ed3344f24 100644 --- a/pkg/shared/client/systemconfig/codehost.go +++ b/pkg/shared/client/systemconfig/codehost.go @@ -23,12 +23,7 @@ type CodeHost struct { } func GetCodeHostList() ([]*CodeHost, error) { - var list []*CodeHost - _, err := New().Post(fmt.Sprintf("/api/v1/codehost"), httpclient.SetResult(&list)) - if err != nil { - return nil, err - } - return list, nil + return New().ListCodeHosts() } type Option struct { @@ -131,3 +126,33 @@ func ListCodehostDetial() ([]*Detail, error) { return details, nil } + +func (c *Client) ListCodeHosts() ([]*CodeHost, error) { + url := "/codehosts" + + res := make([]*CodeHost, 0) + _, err := c.Get(url, httpclient.SetResult(&res)) + if err != nil { + return nil, err + } + + return res, nil +} + +func (c *Client) GetCodeHostByAddressAndOwner(address, owner string) (*CodeHost, error) { + url := "/codehosts" + + res := make([]*CodeHost, 0) + _, err := c.Get(url, httpclient.SetQueryParam("address", address), httpclient.SetQueryParam("owner", owner), httpclient.SetResult(&res)) + if err != nil { + return nil, err + } + + if len(res) == 0 { + return nil, fmt.Errorf("no codehost found") + } else if len(res) > 1 { + return nil, fmt.Errorf("more than one codehosts found") + } + + return res[0], nil +} -- Gitee From 43c898207f884dbb882112377674cbd30ff9342a Mon Sep 17 00:00:00 2001 From: mouuii Date: Tue, 9 Nov 2021 19:35:53 +0800 Subject: [PATCH 301/405] callback Signed-off-by: mouuii --- .../systemconfig/core/codehost/handler/codehost.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/microservice/systemconfig/core/codehost/handler/codehost.go b/pkg/microservice/systemconfig/core/codehost/handler/codehost.go index 775455b82..09a7e70ee 100644 --- a/pkg/microservice/systemconfig/core/codehost/handler/codehost.go +++ b/pkg/microservice/systemconfig/core/codehost/handler/codehost.go @@ -79,7 +79,7 @@ func AuthCodeHost(c *gin.Context) { ctx.Err = err return } - callBackUrl := fmt.Sprintf("%s://%s%s", redirectHost.Scheme, redirectHost.Host, "/api/v1/codehosts/callback") + callBackUrl := fmt.Sprintf("%s://%s%s", redirectHost.Scheme, redirectHost.Host, "/api/directory/codehosts/callback") var authUrl string var tokenUrl string @@ -148,7 +148,7 @@ func Callback(c *gin.Context) { return } - callBackUrl := fmt.Sprintf("%s://%s%s", stateURL.Scheme, stateURL.Host, "/api/v1/codehosts/callback") + callBackUrl := fmt.Sprintf("%s://%s%s", stateURL.Scheme, stateURL.Host, "/api/directory/codehosts/callback") authConfig := &oauth2.Config{ ClientID: iCodehost.ApplicationId, ClientSecret: iCodehost.ClientSecret, -- Gitee From 83613eaf4758d15926edfded8bd0df767d8812b7 Mon Sep 17 00:00:00 2001 From: panxunying <641770806@qq.com> Date: Tue, 9 Nov 2021 20:04:36 +0800 Subject: [PATCH 302/405] optimize Signed-off-by: panxunying <641770806@qq.com> --- pkg/microservice/user/core/service/user/user.go | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/pkg/microservice/user/core/service/user/user.go b/pkg/microservice/user/core/service/user/user.go index 2f2b22e7b..06c2aeeda 100644 --- a/pkg/microservice/user/core/service/user/user.go +++ b/pkg/microservice/user/core/service/user/user.go @@ -32,10 +32,9 @@ type User struct { } type UpdateUserInfo struct { - Name string `json:"name,omitempty"` - Email string `json:"email,omitempty"` - Phone string `json:"phone,omitempty"` - IdentityType string `json:"identity_type"` + Name string `json:"name,omitempty"` + Email string `json:"email,omitempty"` + Phone string `json:"phone,omitempty"` } type QueryArgs struct { @@ -392,10 +391,9 @@ func CreateUser(args *User, logger *zap.SugaredLogger) (*models.User, error) { func UpdateUser(uid string, args *UpdateUserInfo, _ *zap.SugaredLogger) error { user := &models.User{ - Name: args.Name, - Email: args.Email, - IdentityType: args.IdentityType, - Phone: args.Phone, + Name: args.Name, + Email: args.Email, + Phone: args.Phone, } return orm.UpdateUser(uid, user, core.DB) -- Gitee From 953d55f1e7d45fe0b88025904fa1ba4a582a14b9 Mon Sep 17 00:00:00 2001 From: lou Date: Tue, 9 Nov 2021 20:16:56 +0800 Subject: [PATCH 303/405] update after review Signed-off-by: lou --- version/version.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version/version.go b/version/version.go index 9d7035727..90ad69753 100644 --- a/version/version.go +++ b/version/version.go @@ -17,7 +17,7 @@ limitations under the License. package version var ( - Version = "1.6.0" + Version = "1.7.0" BuildNumber = "0" GitCommit = "" ) -- Gitee From 2c2a2eeb827622d66e150ce51aba8a1daed449f3 Mon Sep 17 00:00:00 2001 From: lou Date: Tue, 9 Nov 2021 21:11:06 +0800 Subject: [PATCH 304/405] improve codehost client Signed-off-by: lou --- .../aslan/core/code/handler/codehost.go | 2 +- .../aslan/core/code/service/branch.go | 5 +- .../aslan/core/code/service/merge_request.go | 5 +- .../aslan/core/code/service/namespace.go | 5 +- .../aslan/core/code/service/project.go | 5 +- .../aslan/core/code/service/tag.go | 5 +- .../aslan/core/code/service/workspace.go | 4 +- .../core/common/service/command/git_cmd.go | 6 +- .../core/common/service/config_payload.go | 2 +- .../aslan/core/common/service/fs/git.go | 2 +- .../core/common/service/gerrit/gerrit.go | 2 +- .../core/common/service/scmnotify/client.go | 2 +- .../aslan/core/common/service/service.go | 4 +- .../aslan/core/common/service/workflow.go | 4 +- .../aslan/core/service/service/helm.go | 3 +- .../aslan/core/service/service/loader.go | 28 ++----- .../aslan/core/service/service/service.go | 22 ++--- .../core/workflow/service/webhook/gerrit.go | 8 +- .../service/webhook/gerrit_workflow_task.go | 8 +- .../service/webhook/github_workflow_task.go | 4 +- .../service/webhook/gitlab_workflow_task.go | 14 ++-- .../core/workflow/service/workflow/gerrit.go | 20 +---- .../core/workflow/service/workflow/github.go | 4 +- .../core/workflow/service/workflow/gitlab.go | 15 +--- .../service/workflow/pipeline_validation.go | 10 +-- pkg/shared/client/systemconfig/codehost.go | 82 ++++--------------- 26 files changed, 80 insertions(+), 191 deletions(-) diff --git a/pkg/microservice/aslan/core/code/handler/codehost.go b/pkg/microservice/aslan/core/code/handler/codehost.go index 211114b36..5c2ac180e 100644 --- a/pkg/microservice/aslan/core/code/handler/codehost.go +++ b/pkg/microservice/aslan/core/code/handler/codehost.go @@ -34,7 +34,7 @@ func GetCodeHostList(c *gin.Context) { defer func() { internalhandler.JSONResponse(c, ctx) }() codeHostSlice := make([]*systemconfig.CodeHost, 0) - codeHosts, err := systemconfig.GetCodeHostList() + codeHosts, err := systemconfig.New().ListCodeHosts() ctx.Err = err for _, codeHost := range codeHosts { codeHost.AccessToken = setting.MaskValue diff --git a/pkg/microservice/aslan/core/code/service/branch.go b/pkg/microservice/aslan/core/code/service/branch.go index fecb306ac..91c2fcf8e 100644 --- a/pkg/microservice/aslan/core/code/service/branch.go +++ b/pkg/microservice/aslan/core/code/service/branch.go @@ -31,10 +31,7 @@ import ( ) func CodeHostListBranches(codeHostID int, projectName, namespace string, log *zap.SugaredLogger) ([]*Branch, error) { - opt := &systemconfig.Option{ - CodeHostID: codeHostID, - } - ch, err := systemconfig.GetCodeHostInfo(opt) + ch, err := systemconfig.New().GetCodeHost(codeHostID) if err != nil { return nil, e.ErrCodehostListBranches.AddDesc("git client is nil") } diff --git a/pkg/microservice/aslan/core/code/service/merge_request.go b/pkg/microservice/aslan/core/code/service/merge_request.go index 6d0633569..bbf8c40ef 100644 --- a/pkg/microservice/aslan/core/code/service/merge_request.go +++ b/pkg/microservice/aslan/core/code/service/merge_request.go @@ -31,10 +31,7 @@ import ( ) func CodeHostListPRs(codeHostID int, projectName, namespace, targetBr string, log *zap.SugaredLogger) ([]*PullRequest, error) { - opt := &systemconfig.Option{ - CodeHostID: codeHostID, - } - ch, err := systemconfig.GetCodeHostInfo(opt) + ch, err := systemconfig.New().GetCodeHost(codeHostID) if err != nil { return nil, e.ErrCodehostListPrs.AddDesc("git client is nil") } diff --git a/pkg/microservice/aslan/core/code/service/namespace.go b/pkg/microservice/aslan/core/code/service/namespace.go index b8e679307..4633e85b1 100644 --- a/pkg/microservice/aslan/core/code/service/namespace.go +++ b/pkg/microservice/aslan/core/code/service/namespace.go @@ -41,10 +41,7 @@ const ( ) func CodeHostListNamespaces(codeHostID int, keyword string, log *zap.SugaredLogger) ([]*Namespace, error) { - opt := &systemconfig.Option{ - CodeHostID: codeHostID, - } - ch, err := systemconfig.GetCodeHostInfo(opt) + ch, err := systemconfig.New().GetCodeHost(codeHostID) if err != nil { return nil, e.ErrCodehostListNamespaces.AddDesc("git client is nil") } diff --git a/pkg/microservice/aslan/core/code/service/project.go b/pkg/microservice/aslan/core/code/service/project.go index 316327e6d..3a210a1cf 100644 --- a/pkg/microservice/aslan/core/code/service/project.go +++ b/pkg/microservice/aslan/core/code/service/project.go @@ -31,10 +31,7 @@ import ( ) func CodeHostListProjects(codeHostID int, namespace, namespaceType, keyword string, log *zap.SugaredLogger) ([]*Project, error) { - opt := &systemconfig.Option{ - CodeHostID: codeHostID, - } - ch, err := systemconfig.GetCodeHostInfo(opt) + ch, err := systemconfig.New().GetCodeHost(codeHostID) if err != nil { log.Error(err) return nil, e.ErrCodehostListProjects.AddDesc("git client is nil") diff --git a/pkg/microservice/aslan/core/code/service/tag.go b/pkg/microservice/aslan/core/code/service/tag.go index dc77ed549..4b9af5a01 100644 --- a/pkg/microservice/aslan/core/code/service/tag.go +++ b/pkg/microservice/aslan/core/code/service/tag.go @@ -31,10 +31,7 @@ import ( ) func CodeHostListTags(codeHostID int, projectName string, namespace string, log *zap.SugaredLogger) ([]*Tag, error) { - opt := &systemconfig.Option{ - CodeHostID: codeHostID, - } - ch, err := systemconfig.GetCodeHostInfo(opt) + ch, err := systemconfig.New().GetCodeHost(codeHostID) if err != nil { log.Error(err) return nil, e.ErrCodehostListTags.AddDesc("git client is nil") diff --git a/pkg/microservice/aslan/core/code/service/workspace.go b/pkg/microservice/aslan/core/code/service/workspace.go index 434a18288..a3b30f5ff 100644 --- a/pkg/microservice/aslan/core/code/service/workspace.go +++ b/pkg/microservice/aslan/core/code/service/workspace.go @@ -145,7 +145,7 @@ func GetGitRepoInfo(codehostID int, repoOwner, repoName, branchName, remoteName, if err := os.RemoveAll(base); err != nil { log.Errorf("dir remove err:%v", err) } - detail, err := systemconfig.GetCodehostDetail(codehostID) + detail, err := systemconfig.New().GetCodeHost(codehostID) if err != nil { log.Errorf("GetGitRepoInfo GetCodehostDetail err:%v", err) return fis, e.ErrListRepoDir.AddDesc(err.Error()) @@ -189,7 +189,7 @@ type CodehostFileInfo struct { func GetCodehubRepoInfo(codehostID int, repoUUID, branchName, path string, log *zap.SugaredLogger) ([]*CodehostFileInfo, error) { fileInfos := make([]*CodehostFileInfo, 0) - detail, err := systemconfig.GetCodehostDetail(codehostID) + detail, err := systemconfig.New().GetCodeHost(codehostID) if err != nil { log.Errorf("GetCodehubRepoInfo GetCodehostDetail err:%s", err) return fileInfos, e.ErrListWorkspace.AddDesc(err.Error()) diff --git a/pkg/microservice/aslan/core/common/service/command/git_cmd.go b/pkg/microservice/aslan/core/common/service/command/git_cmd.go index f60a2170b..d28708bbc 100644 --- a/pkg/microservice/aslan/core/common/service/command/git_cmd.go +++ b/pkg/microservice/aslan/core/common/service/command/git_cmd.go @@ -65,7 +65,7 @@ type Command struct { IgnoreError bool } -func RunGitCmds(codehostDetail *systemconfig.Detail, repoOwner, repoName, branchName, remoteName string) error { +func RunGitCmds(codehostDetail *systemconfig.CodeHost, repoOwner, repoName, branchName, remoteName string) error { var ( tokens []string repo *Repo @@ -73,11 +73,11 @@ func RunGitCmds(codehostDetail *systemconfig.Detail, repoOwner, repoName, branch cmds = make([]*Command, 0) ) repo = &Repo{ - Source: codehostDetail.Source, + Source: codehostDetail.Type, Address: codehostDetail.Address, Name: repoName, Branch: branchName, - OauthToken: codehostDetail.OauthToken, + OauthToken: codehostDetail.AccessToken, RemoteName: remoteName, Owner: repoOwner, } diff --git a/pkg/microservice/aslan/core/common/service/config_payload.go b/pkg/microservice/aslan/core/common/service/config_payload.go index 8adf52d13..ac244fe38 100644 --- a/pkg/microservice/aslan/core/common/service/config_payload.go +++ b/pkg/microservice/aslan/core/common/service/config_payload.go @@ -73,7 +73,7 @@ func GetConfigPayload(codeHostID int) *models.ConfigPayload { } if codeHostID > 0 { - ch, _ := systemconfig.GetCodeHostInfoByID(codeHostID) + ch, _ := systemconfig.New().GetCodeHost(codeHostID) if ch != nil && ch.Type == setting.SourceFromGithub { payload.Github.AccessToken = ch.AccessToken } diff --git a/pkg/microservice/aslan/core/common/service/fs/git.go b/pkg/microservice/aslan/core/common/service/fs/git.go index 0d76a793f..4ab9082ae 100644 --- a/pkg/microservice/aslan/core/common/service/fs/git.go +++ b/pkg/microservice/aslan/core/common/service/fs/git.go @@ -101,7 +101,7 @@ func GetPublicTreeGetter(repoLink string) (TreeGetter, error) { } func GetTreeGetter(codeHostID int) (TreeGetter, error) { - ch, err := systemconfig.GetCodeHostInfoByID(codeHostID) + ch, err := systemconfig.New().GetCodeHost(codeHostID) if err != nil { log.Errorf("Failed to get codeHost by id %d, err: %s", codeHostID, err) return nil, err diff --git a/pkg/microservice/aslan/core/common/service/gerrit/gerrit.go b/pkg/microservice/aslan/core/common/service/gerrit/gerrit.go index 6f4fa71a5..516d4e17c 100644 --- a/pkg/microservice/aslan/core/common/service/gerrit/gerrit.go +++ b/pkg/microservice/aslan/core/common/service/gerrit/gerrit.go @@ -37,7 +37,7 @@ func DeleteGerritWebhook(workflow *models.Workflow, log *zap.SugaredLogger) erro continue } - detail, err := systemconfig.GetCodeHostInfoByID(workflowWebhook.MainRepo.CodehostID) + detail, err := systemconfig.New().GetCodeHost(workflowWebhook.MainRepo.CodehostID) if err != nil { log.Errorf("DeleteGerritWebhook GetCodehostDetail err:%v", err) continue diff --git a/pkg/microservice/aslan/core/common/service/scmnotify/client.go b/pkg/microservice/aslan/core/common/service/scmnotify/client.go index c3c8b51f8..39964c6b9 100644 --- a/pkg/microservice/aslan/core/common/service/scmnotify/client.go +++ b/pkg/microservice/aslan/core/common/service/scmnotify/client.go @@ -55,7 +55,7 @@ func (c *Client) Comment(notify *models.Notification) error { } } - codeHostDetail, err := systemconfig.GetCodeHostInfoByID(notify.CodehostID) + codeHostDetail, err := systemconfig.New().GetCodeHost(notify.CodehostID) if err != nil { return errors.Wrapf(err, "codehost %d not found to comment", notify.CodehostID) } diff --git a/pkg/microservice/aslan/core/common/service/service.go b/pkg/microservice/aslan/core/common/service/service.go index 6bfed47c2..bf031f69a 100644 --- a/pkg/microservice/aslan/core/common/service/service.go +++ b/pkg/microservice/aslan/core/common/service/service.go @@ -131,7 +131,7 @@ func ListServiceTemplate(productName string, log *zap.SugaredLogger) (*ServiceTm return nil, e.ErrListTemplate.AddDesc(err.Error()) } - details, err := systemconfig.ListCodehostDetial() + details, err := systemconfig.New().ListCodeHosts() if err != nil { log.Errorf("无法从原有数据中恢复加载信息, listCodehostDetail failed err: %+v", err) return nil, e.ErrListTemplate.AddDesc(err.Error()) @@ -318,7 +318,7 @@ func GetServiceTemplate(serviceName, serviceType, productName, excludeStatus str if resp.Source == setting.SourceFromGitlab && resp.RepoName == "" { if gitlabAddress, err := GetGitlabAddress(resp.SrcPath); err == nil { - if details, err := systemconfig.ListCodehostDetial(); err == nil { + if details, err := systemconfig.New().ListCodeHosts(); err == nil { for _, detail := range details { if strings.Contains(detail.Address, gitlabAddress) { resp.GerritCodeHostID = detail.ID diff --git a/pkg/microservice/aslan/core/common/service/workflow.go b/pkg/microservice/aslan/core/common/service/workflow.go index eb174190e..023d7c98d 100644 --- a/pkg/microservice/aslan/core/common/service/workflow.go +++ b/pkg/microservice/aslan/core/common/service/workflow.go @@ -167,7 +167,7 @@ func ProcessWebhook(updatedHooks, currentHooks interface{}, name string, logger wg.Add(1) go func(wh hookItem) { defer wg.Done() - ch, err := systemconfig.GetCodeHostInfoByID(wh.codeHostID) + ch, err := systemconfig.New().GetCodeHost(wh.codeHostID) if err != nil { logger.Errorf("Failed to get codeHost by id %d, err: %s", wh.codeHostID, err) errs = multierror.Append(errs, err) @@ -201,7 +201,7 @@ func ProcessWebhook(updatedHooks, currentHooks interface{}, name string, logger wg.Add(1) go func(wh hookItem) { defer wg.Done() - ch, err := systemconfig.GetCodeHostInfoByID(wh.codeHostID) + ch, err := systemconfig.New().GetCodeHost(wh.codeHostID) if err != nil { logger.Errorf("Failed to get codeHost by id %d, err: %s", wh.codeHostID, err) errs = multierror.Append(errs, err) diff --git a/pkg/microservice/aslan/core/service/service/helm.go b/pkg/microservice/aslan/core/service/service/helm.go index a053a45c5..2185e6de1 100644 --- a/pkg/microservice/aslan/core/service/service/helm.go +++ b/pkg/microservice/aslan/core/service/service/helm.go @@ -19,7 +19,6 @@ package service import ( "bytes" "fmt" - "io/fs" "os" "path/filepath" @@ -349,7 +348,7 @@ func getCodehostType(repoArgs *CreateFromRepo, repoLink string) (string, *system if repoLink != "" { return setting.SourceFromPublicRepo, nil, nil } - ch, err := systemconfig.GetCodeHostInfoByID(repoArgs.CodehostID) + ch, err := systemconfig.New().GetCodeHost(repoArgs.CodehostID) if err != nil { log.Errorf("Failed to get codeHost by id %d, err: %s", repoArgs.CodehostID, err.Error()) return "", ch, err diff --git a/pkg/microservice/aslan/core/service/service/loader.go b/pkg/microservice/aslan/core/service/service/loader.go index 4043e2c95..af9a2bf45 100644 --- a/pkg/microservice/aslan/core/service/service/loader.go +++ b/pkg/microservice/aslan/core/service/service/loader.go @@ -52,7 +52,7 @@ type LoadServiceReq struct { func PreloadServiceFromCodeHost(codehostID int, repoOwner, repoName, repoUUID, branchName, remoteName, path string, isDir bool, log *zap.SugaredLogger) ([]string, error) { var ret []string - ch, err := systemconfig.GetCodeHostInfoByID(codehostID) + ch, err := systemconfig.New().GetCodeHost(codehostID) if err != nil { log.Errorf("Failed to load codehost for preload service list, the error is: %+v", err) return nil, e.ErrPreloadServiceTemplate.AddDesc(err.Error()) @@ -73,7 +73,7 @@ func PreloadServiceFromCodeHost(codehostID int, repoOwner, repoName, repoUUID, b // LoadServiceFromCodeHost 根据提供的codehost信息加载服务 func LoadServiceFromCodeHost(username string, codehostID int, repoOwner, repoName, repoUUID, branchName, remoteName string, args *LoadServiceReq, log *zap.SugaredLogger) error { - ch, err := systemconfig.GetCodeHostInfoByID(codehostID) + ch, err := systemconfig.New().GetCodeHost(codehostID) if err != nil { log.Errorf("Failed to load codehost for preload service list, the error is: %+v", err) return e.ErrLoadServiceTemplate.AddDesc(err.Error()) @@ -92,7 +92,7 @@ func LoadServiceFromCodeHost(username string, codehostID int, repoOwner, repoNam // ValidateServiceUpdate 根据服务名和提供的加载信息确认是否可以更新服务加载地址 func ValidateServiceUpdate(codehostID int, serviceName, repoOwner, repoName, repoUUID, branchName, remoteName, path string, isDir bool, log *zap.SugaredLogger) error { - detail, err := systemconfig.GetCodeHostInfoByID(codehostID) + detail, err := systemconfig.New().GetCodeHost(codehostID) if err != nil { log.Errorf("Failed to load codehost for validate service update, the error is: %+v", err) return e.ErrValidateServiceUpdate.AddDesc(err.Error()) @@ -117,15 +117,7 @@ func preloadGerritService(detail *systemconfig.CodeHost, repoName, branchName, r base := path.Join(config.S3StoragePath(), repoName) if _, err := os.Stat(base); os.IsNotExist(err) { - chDetail := &systemconfig.Detail{ - ID: detail.ID, - Name: "", - Address: detail.Address, - Owner: detail.Namespace, - Source: detail.Type, - OauthToken: detail.AccessToken, - } - err = command.RunGitCmds(chDetail, setting.GerritDefaultOwner, repoName, branchName, remoteName) + err = command.RunGitCmds(detail, setting.GerritDefaultOwner, repoName, branchName, remoteName) if err != nil { return nil, e.ErrPreloadServiceTemplate.AddDesc(err.Error()) } @@ -241,7 +233,7 @@ func preloadCodehubService(detail *systemconfig.CodeHost, repoName, repoUUID, br func loadGerritService(username string, ch *systemconfig.CodeHost, repoOwner, repoName, branchName, remoteName string, args *LoadServiceReq, log *zap.SugaredLogger) error { base := path.Join(config.S3StoragePath(), repoName) if _, err := os.Stat(base); os.IsNotExist(err) { - err = command.RunGitCmds(&systemconfig.Detail{Source: ch.Type, Address: ch.Address, OauthToken: ch.AccessToken}, repoOwner, repoName, branchName, remoteName) + err = command.RunGitCmds(ch, repoOwner, repoName, branchName, remoteName) if err != nil { return e.ErrLoadServiceTemplate.AddDesc(err.Error()) } @@ -605,15 +597,7 @@ func validateServiceUpdateGitlab(detail *systemconfig.CodeHost, serviceName, rep func validateServiceUpdateGerrit(detail *systemconfig.CodeHost, serviceName, repoName, branchName, remoteName, loadPath string, isDir bool) error { base := path.Join(config.S3StoragePath(), repoName) if _, err := os.Stat(base); os.IsNotExist(err) { - chDetail := &systemconfig.Detail{ - ID: detail.ID, - Name: "", - Address: detail.Address, - Owner: detail.Namespace, - Source: detail.Type, - OauthToken: detail.AccessToken, - } - err = command.RunGitCmds(chDetail, setting.GerritDefaultOwner, repoName, branchName, remoteName) + err = command.RunGitCmds(detail, setting.GerritDefaultOwner, repoName, branchName, remoteName) if err != nil { return e.ErrValidateServiceUpdate.AddDesc(err.Error()) } diff --git a/pkg/microservice/aslan/core/service/service/service.go b/pkg/microservice/aslan/core/service/service/service.go index 711eb1ed3..73c3733f5 100644 --- a/pkg/microservice/aslan/core/service/service/service.go +++ b/pkg/microservice/aslan/core/service/service/service.go @@ -1284,15 +1284,15 @@ func getCronJobContainers(data string) ([]*commonmodels.Container, error) { } func updateGerritWebhookByService(lastService, currentService *commonmodels.Service) error { - var codehostDetail *systemconfig.Detail + var codehostDetail *systemconfig.CodeHost var err error if lastService != nil && lastService.Source == setting.SourceFromGerrit { - codehostDetail, err = systemconfig.GetCodehostDetail(lastService.GerritCodeHostID) + codehostDetail, err = systemconfig.New().GetCodeHost(lastService.GerritCodeHostID) if err != nil { log.Errorf("updateGerritWebhookByService GetCodehostDetail err:%v", err) return err } - cl := gerrit.NewHTTPClient(codehostDetail.Address, codehostDetail.OauthToken) + cl := gerrit.NewHTTPClient(codehostDetail.Address, codehostDetail.AccessToken) webhookURLPrefix := fmt.Sprintf("/%s/%s/%s", "a/config/server/webhooks~projects", gerrit.Escape(lastService.GerritRepoName), "remotes") _, _ = cl.Delete(fmt.Sprintf("%s/%s", webhookURLPrefix, gerrit.RemoteName)) _, err = cl.Delete(fmt.Sprintf("%s/%s", webhookURLPrefix, lastService.ServiceName)) @@ -1300,14 +1300,14 @@ func updateGerritWebhookByService(lastService, currentService *commonmodels.Serv log.Errorf("updateGerritWebhookByService deleteGerritWebhook err:%v", err) } } - var detail *systemconfig.Detail + var detail *systemconfig.CodeHost if lastService.GerritCodeHostID == currentService.GerritCodeHostID && codehostDetail != nil { detail = codehostDetail } else { - detail, _ = systemconfig.GetCodehostDetail(currentService.GerritCodeHostID) + detail, _ = systemconfig.New().GetCodeHost(currentService.GerritCodeHostID) } - cl := gerrit.NewHTTPClient(detail.Address, detail.OauthToken) + cl := gerrit.NewHTTPClient(detail.Address, detail.AccessToken) webhookURL := fmt.Sprintf("/%s/%s/%s/%s", "a/config/server/webhooks~projects", gerrit.Escape(currentService.GerritRepoName), "remotes", currentService.ServiceName) if _, err := cl.Get(webhookURL); err != nil { log.Errorf("updateGerritWebhookByService getGerritWebhook err:%v", err) @@ -1327,13 +1327,13 @@ func updateGerritWebhookByService(lastService, currentService *commonmodels.Serv } func createGerritWebhookByService(codehostID int, serviceName, repoName, branchName string) error { - detail, err := systemconfig.GetCodehostDetail(codehostID) + detail, err := systemconfig.New().GetCodeHost(codehostID) if err != nil { log.Errorf("createGerritWebhookByService GetCodehostDetail err:%v", err) return err } - cl := gerrit.NewHTTPClient(detail.Address, detail.OauthToken) + cl := gerrit.NewHTTPClient(detail.Address, detail.AccessToken) webhookURL := fmt.Sprintf("/%s/%s/%s/%s", "a/config/server/webhooks~projects", gerrit.Escape(repoName), "remotes", serviceName) if _, err := cl.Get(webhookURL); err != nil { log.Errorf("createGerritWebhookByService getGerritWebhook err:%v", err) @@ -1352,7 +1352,7 @@ func createGerritWebhookByService(codehostID int, serviceName, repoName, branchN return nil } -func syncGerritLatestCommit(service *commonmodels.Service) (*systemconfig.Detail, error) { +func syncGerritLatestCommit(service *commonmodels.Service) (*systemconfig.CodeHost, error) { if service.GerritCodeHostID == 0 { return nil, fmt.Errorf("codehostId不能是空的") } @@ -1362,9 +1362,9 @@ func syncGerritLatestCommit(service *commonmodels.Service) (*systemconfig.Detail if service.GerritBranchName == "" { return nil, fmt.Errorf("branchName不能是空的") } - ch, _ := systemconfig.GetCodehostDetail(service.GerritCodeHostID) + ch, _ := systemconfig.New().GetCodeHost(service.GerritCodeHostID) - gerritCli := gerrit.NewClient(ch.Address, ch.OauthToken) + gerritCli := gerrit.NewClient(ch.Address, ch.AccessToken) commit, err := gerritCli.GetCommitByBranch(service.GerritRepoName, service.GerritBranchName) if err != nil { return nil, err diff --git a/pkg/microservice/aslan/core/workflow/service/webhook/gerrit.go b/pkg/microservice/aslan/core/workflow/service/webhook/gerrit.go index 3569bcbef..34e733b1e 100644 --- a/pkg/microservice/aslan/core/workflow/service/webhook/gerrit.go +++ b/pkg/microservice/aslan/core/workflow/service/webhook/gerrit.go @@ -94,7 +94,7 @@ func updateServiceTemplateByGerritEvent(uri string, log *zap.SugaredLogger) erro log.Errorf("updateServiceTemplateByGerritEvent GetServiceTemplate err:%v", err) errs = multierror.Append(errs, err) } - detail, err := systemconfig.GetCodehostDetail(service.GerritCodeHostID) + detail, err := systemconfig.New().GetCodeHost(service.GerritCodeHostID) if err != nil { log.Errorf("updateServiceTemplateByGerritEvent GetCodehostDetail err:%v", err) errs = multierror.Append(errs, err) @@ -228,7 +228,7 @@ func SyncServiceTemplateFromGerrit(service *commonmodels.Service, log *zap.Sugar return nil } -func syncGerritLatestCommit(service *commonmodels.Service) (*systemconfig.Detail, error) { +func syncGerritLatestCommit(service *commonmodels.Service) (*systemconfig.CodeHost, error) { if service.GerritCodeHostID == 0 { return nil, fmt.Errorf("codehostId不能是空的") } @@ -238,12 +238,12 @@ func syncGerritLatestCommit(service *commonmodels.Service) (*systemconfig.Detail if service.GerritBranchName == "" { return nil, fmt.Errorf("branchName不能是空的") } - detail, err := systemconfig.GetCodehostDetail(service.GerritCodeHostID) + detail, err := systemconfig.New().GetCodeHost(service.GerritCodeHostID) if err != nil { return nil, err } - gerritCli := gerrit.NewClient(detail.Address, detail.OauthToken) + gerritCli := gerrit.NewClient(detail.Address, detail.AccessToken) commit, err := gerritCli.GetCommitByBranch(service.GerritRepoName, service.GerritBranchName) if err != nil { return detail, err diff --git a/pkg/microservice/aslan/core/workflow/service/webhook/gerrit_workflow_task.go b/pkg/microservice/aslan/core/workflow/service/webhook/gerrit_workflow_task.go index 86425582d..6ed9cd1a4 100644 --- a/pkg/microservice/aslan/core/workflow/service/webhook/gerrit_workflow_task.go +++ b/pkg/microservice/aslan/core/workflow/service/webhook/gerrit_workflow_task.go @@ -305,12 +305,12 @@ func TriggerWorkflowByGerritEvent(event *gerritTypeEvent, body []byte, uri, base if item.WorkflowArgs == nil { continue } - detail, err := systemconfig.GetCodehostDetail(item.MainRepo.CodehostID) + detail, err := systemconfig.New().GetCodeHost(item.MainRepo.CodehostID) if err != nil { log.Errorf("TriggerWorkflowByGerritEvent GetCodehostDetail err:%v", err) return err } - if detail.Source == gerrit.CodehostTypeGerrit { + if detail.Type == gerrit.CodehostTypeGerrit { log.Debugf("TriggerWorkflowByGerritEvent find gerrit hook in workflow %s", workflow.Name) matcher := createGerritEventMatcher(event, body, item, workflow, log) if matcher == nil { @@ -410,7 +410,7 @@ func addWebHookUser(match gerritEventMatcher, domain string) { } } -func checkLatestTaskStaus(pipelineName, mergeRequestID, commitID string, detail *systemconfig.Detail, log *zap.SugaredLogger) bool { +func checkLatestTaskStaus(pipelineName, mergeRequestID, commitID string, detail *systemconfig.CodeHost, log *zap.SugaredLogger) bool { opt := &commonrepo.ListTaskOption{ PipelineName: pipelineName, Type: config.WorkflowType, @@ -434,7 +434,7 @@ func checkLatestTaskStaus(pipelineName, mergeRequestID, commitID string, detail } // 比较本次patchset 和 上一个触发任务的patchset 的change file是否相同 - cli := gerrit.NewClient(detail.Address, detail.OauthToken) + cli := gerrit.NewClient(detail.Address, detail.AccessToken) isDiff, err := cli.CompareTwoPatchset(mergeRequestID, commitID, tasks[0].TriggerBy.CommitID) if err != nil { log.Errorf("CompareTwoPatchset failed, mergeRequestID:%s, patchsetID:%s, oldPatchsetID:%s, err:%v", mergeRequestID, commitID, tasks[0].TriggerBy.CommitID, err) diff --git a/pkg/microservice/aslan/core/workflow/service/webhook/github_workflow_task.go b/pkg/microservice/aslan/core/workflow/service/webhook/github_workflow_task.go index 4d882d9cc..3cd1f374f 100644 --- a/pkg/microservice/aslan/core/workflow/service/webhook/github_workflow_task.go +++ b/pkg/microservice/aslan/core/workflow/service/webhook/github_workflow_task.go @@ -340,12 +340,12 @@ func TriggerWorkflowByGithubEvent(event interface{}, baseURI, deliveryID, reques } func findChangedFilesOfPullRequest(event *github.PullRequestEvent, codehostID int) ([]string, error) { - detail, err := systemconfig.GetCodehostDetail(codehostID) + detail, err := systemconfig.New().GetCodeHost(codehostID) if err != nil { return nil, fmt.Errorf("failed to find codehost %d: %v", codehostID, err) } //pullrequest文件修改 - githubCli := git.NewClient(detail.OauthToken, config.ProxyHTTPSAddr()) + githubCli := git.NewClient(detail.AccessToken, config.ProxyHTTPSAddr()) commitComparison, _, err := githubCli.Repositories.CompareCommits(context.Background(), *event.PullRequest.Base.Repo.Owner.Login, *event.PullRequest.Base.Repo.Name, *event.PullRequest.Base.SHA, *event.PullRequest.Head.SHA) if err != nil { return nil, fmt.Errorf("failed to get changes from github, err: %v", err) diff --git a/pkg/microservice/aslan/core/workflow/service/webhook/gitlab_workflow_task.go b/pkg/microservice/aslan/core/workflow/service/webhook/gitlab_workflow_task.go index e83735d9d..d8fdc3a47 100644 --- a/pkg/microservice/aslan/core/workflow/service/webhook/gitlab_workflow_task.go +++ b/pkg/microservice/aslan/core/workflow/service/webhook/gitlab_workflow_task.go @@ -151,13 +151,13 @@ func (gpem *gitlabPushEventMatcher) Match(hookRepo *commonmodels.MainHookRepo) ( hookRepo.Branch = getBranchFromRef(ev.Ref) var changedFiles []string - detail, err := systemconfig.GetCodehostDetail(hookRepo.CodehostID) + detail, err := systemconfig.New().GetCodeHost(hookRepo.CodehostID) if err != nil { gpem.log.Errorf("GetCodehostDetail error: %s", err) return false, err } - client, err := gitlabtool.NewClient(detail.Address, detail.OauthToken) + client, err := gitlabtool.NewClient(detail.Address, detail.AccessToken) if err != nil { gpem.log.Errorf("NewClient error: %s", err) return false, err @@ -323,12 +323,12 @@ func TriggerWorkflowByGitlabEvent(event interface{}, baseURI, requestID string, } func findChangedFilesOfMergeRequest(event *gitlab.MergeEvent, codehostID int) ([]string, error) { - detail, err := systemconfig.GetCodehostDetail(codehostID) + detail, err := systemconfig.New().GetCodeHost(codehostID) if err != nil { return nil, fmt.Errorf("failed to find codehost %d: %v", codehostID, err) } - client, err := gitlabtool.NewClient(detail.Address, detail.OauthToken) + client, err := gitlabtool.NewClient(detail.Address, detail.AccessToken) if err != nil { log.Error(err) return nil, e.ErrCodehostListProjects.AddDesc(err.Error()) @@ -343,12 +343,12 @@ func InitDiffNote(ev *gitlab.MergeEvent, mainRepo *commonmodels.MainHookRepo, lo body := "KodeRover CI 检查中..." // 调用gitlab api获取相关数据 - detail, err := systemconfig.GetCodehostDetail(mainRepo.CodehostID) + detail, err := systemconfig.New().GetCodeHost(mainRepo.CodehostID) if err != nil { log.Errorf("GetCodehostDetail failed, codehost:%d, err:%v", mainRepo.CodehostID, err) return fmt.Errorf("failed to find codehost %d: %v", mainRepo.CodehostID, err) } - cli, _ := gitlab.NewOAuthClient(detail.OauthToken, gitlab.WithBaseURL(detail.Address)) + cli, _ := gitlab.NewOAuthClient(detail.AccessToken, gitlab.WithBaseURL(detail.Address)) opt := &commonrepo.DiffNoteFindOpt{ CodehostID: mainRepo.CodehostID, @@ -402,7 +402,7 @@ func InitDiffNote(ev *gitlab.MergeEvent, mainRepo *commonmodels.MainHookRepo, lo Source: "gitlab", ProjectID: mainRepo.RepoOwner + "/" + mainRepo.RepoName, Address: detail.Address, - OauthToken: detail.OauthToken, + OauthToken: detail.AccessToken, }, MergeRequestID: ev.ObjectAttributes.IID, CommitID: commitID, diff --git a/pkg/microservice/aslan/core/workflow/service/workflow/gerrit.go b/pkg/microservice/aslan/core/workflow/service/workflow/gerrit.go index 54d855498..dae225e4c 100644 --- a/pkg/microservice/aslan/core/workflow/service/workflow/gerrit.go +++ b/pkg/microservice/aslan/core/workflow/service/workflow/gerrit.go @@ -36,10 +36,7 @@ func CreateGerritWebhook(workflow *commonmodels.Workflow, log *zap.SugaredLogger continue } - opt := &systemconfig.Option{ - CodeHostID: workflowWebhook.MainRepo.CodehostID, - } - detail, err := systemconfig.GetCodeHostInfo(opt) + detail, err := systemconfig.New().GetCodeHost(workflowWebhook.MainRepo.CodehostID) if err != nil { return err } @@ -88,10 +85,7 @@ func UpdateGerritWebhook(currentWorkflow *commonmodels.Workflow, log *zap.Sugare continue } - opt := &systemconfig.Option{ - CodeHostID: oldWorkflowWebhook.MainRepo.CodehostID, - } - detail, err := systemconfig.GetCodeHostInfo(opt) + detail, err := systemconfig.New().GetCodeHost(oldWorkflowWebhook.MainRepo.CodehostID) if err != nil { return err } @@ -113,10 +107,7 @@ func UpdateGerritWebhook(currentWorkflow *commonmodels.Workflow, log *zap.Sugare continue } - opt := &systemconfig.Option{ - CodeHostID: workflowWebhook.MainRepo.CodehostID, - } - detail, err := systemconfig.GetCodeHostInfo(opt) + detail, err := systemconfig.New().GetCodeHost(workflowWebhook.MainRepo.CodehostID) if err != nil { return err } @@ -155,10 +146,7 @@ func DeleteGerritWebhook(workflow *commonmodels.Workflow, log *zap.SugaredLogger continue } - opt := &systemconfig.Option{ - CodeHostID: workflowWebhook.MainRepo.CodehostID, - } - detail, err := systemconfig.GetCodeHostInfo(opt) + detail, err := systemconfig.New().GetCodeHost(workflowWebhook.MainRepo.CodehostID) if err != nil { return err } diff --git a/pkg/microservice/aslan/core/workflow/service/workflow/github.go b/pkg/microservice/aslan/core/workflow/service/workflow/github.go index 0a347bc2e..57155407b 100644 --- a/pkg/microservice/aslan/core/workflow/service/workflow/github.go +++ b/pkg/microservice/aslan/core/workflow/service/workflow/github.go @@ -85,9 +85,9 @@ func createGitCheck(pt *task.Task, log *zap.SugaredLogger) error { } log.Infof("Init GitHub status") - ch, err := systemconfig.GetCodeHostInfoByID(pt.TriggerBy.CodehostID) + ch, err := systemconfig.New().GetCodeHost(pt.TriggerBy.CodehostID) if err != nil { - log.Errorf("GetCodeHostInfoByID failed, err:%v", err) + log.Errorf("Failed to get codeHost, err:%v", err) return e.ErrGithubUpdateStatus.AddErr(err) } gc := github.NewClient(ch.AccessToken, config.ProxyHTTPSAddr()) diff --git a/pkg/microservice/aslan/core/workflow/service/workflow/gitlab.go b/pkg/microservice/aslan/core/workflow/service/workflow/gitlab.go index 7b27cde00..21549bdea 100644 --- a/pkg/microservice/aslan/core/workflow/service/workflow/gitlab.go +++ b/pkg/microservice/aslan/core/workflow/service/workflow/gitlab.go @@ -40,10 +40,7 @@ type RepoCommit struct { } func QueryByBranch(id int, owner, name, branch string, log *zap.SugaredLogger) (*RepoCommit, error) { - opt := &systemconfig.Option{ - CodeHostID: id, - } - ch, err := systemconfig.GetCodeHostInfo(opt) + ch, err := systemconfig.New().GetCodeHost(id) if err != nil { return nil, err } @@ -90,10 +87,7 @@ func QueryByBranch(id int, owner, name, branch string, log *zap.SugaredLogger) ( } func QueryByTag(id int, owner, name, tag string, log *zap.SugaredLogger) (*RepoCommit, error) { - opt := &systemconfig.Option{ - CodeHostID: id, - } - ch, err := systemconfig.GetCodeHostInfo(opt) + ch, err := systemconfig.New().GetCodeHost(id) if err != nil { return nil, err } @@ -150,10 +144,7 @@ type PRCommit struct { func GetLatestPrCommit(codehostID, pr int, namespace, projectName string, log *zap.SugaredLogger) (*PRCommit, error) { projectID := fmt.Sprintf("%s/%s", namespace, projectName) - opt := &systemconfig.Option{ - CodeHostID: codehostID, - } - ch, err := systemconfig.GetCodeHostInfo(opt) + ch, err := systemconfig.New().GetCodeHost(codehostID) if err != nil { return nil, err } diff --git a/pkg/microservice/aslan/core/workflow/service/workflow/pipeline_validation.go b/pkg/microservice/aslan/core/workflow/service/workflow/pipeline_validation.go index 2479d0b63..689acf369 100644 --- a/pkg/microservice/aslan/core/workflow/service/workflow/pipeline_validation.go +++ b/pkg/microservice/aslan/core/workflow/service/workflow/pipeline_validation.go @@ -258,10 +258,7 @@ func FmtBuilds(builds []*types.Repository, log *zap.SugaredLogger) { log.Error("codehostID can't be empty") return } - opt := &systemconfig.Option{ - CodeHostID: cID, - } - detail, err := systemconfig.GetCodeHostInfo(opt) + detail, err := systemconfig.New().GetCodeHost(cID) if err != nil { log.Error(err) return @@ -306,10 +303,7 @@ func SetTriggerBuilds(builds []*types.Repository, buildArgs []*types.Repository, } func setBuildInfo(build *types.Repository, log *zap.SugaredLogger) { - opt := &systemconfig.Option{ - CodeHostID: build.CodehostID, - } - codeHostInfo, err := systemconfig.GetCodeHostInfo(opt) + codeHostInfo, err := systemconfig.New().GetCodeHost(build.CodehostID) if err != nil { log.Errorf("failed to get codehost detail %d %v", build.CodehostID, err) return diff --git a/pkg/shared/client/systemconfig/codehost.go b/pkg/shared/client/systemconfig/codehost.go index ed3344f24..2d754bb84 100644 --- a/pkg/shared/client/systemconfig/codehost.go +++ b/pkg/shared/client/systemconfig/codehost.go @@ -22,10 +22,6 @@ type CodeHost struct { Password string `json:"password"` } -func GetCodeHostList() ([]*CodeHost, error) { - return New().ListCodeHosts() -} - type Option struct { CodeHostType string Address string @@ -34,7 +30,7 @@ type Option struct { } func GetCodeHostInfo(option *Option) (*CodeHost, error) { - codeHosts, err := GetCodeHostList() + codeHosts, err := New().ListCodeHosts() if err != nil { return nil, err } @@ -60,71 +56,16 @@ func GetCodeHostInfo(option *Option) (*CodeHost, error) { return nil, errors.New("not find codeHost") } -func GetCodeHostInfoByID(id int) (*CodeHost, error) { - return GetCodeHostInfo(&Option{CodeHostID: id}) -} - -type Detail struct { - ID int `json:"id"` - Name string `json:"name"` - Address string `json:"address"` - Owner string `json:"repoowner"` - Source string `json:"source"` - OauthToken string `json:"oauth_token"` - Region string `json:"region"` - Username string `json:"username"` - Password string `json:"password"` - AccessKey string `json:"applicationId"` - SecretKey string `json:"clientSecret"` -} - -func GetCodehostDetail(codehostID int) (*Detail, error) { - codehost, err := GetCodeHostInfo(&Option{CodeHostID: codehostID}) - if err != nil { - return nil, err - } - detail := &Detail{ - codehostID, - "", - codehost.Address, - codehost.Namespace, - codehost.Type, - codehost.AccessToken, - codehost.Region, - codehost.Username, - codehost.Password, - codehost.AccessKey, - codehost.SecretKey, - } - - return detail, nil -} +func (c *Client) GetCodeHost(id int) (*CodeHost, error) { + url := fmt.Sprintf("/codehosts/%d", id) -func ListCodehostDetial() ([]*Detail, error) { - codehosts, err := GetCodeHostList() + res := &CodeHost{} + _, err := c.Get(url, httpclient.SetResult(res)) if err != nil { return nil, err } - var details []*Detail - - for _, codehost := range codehosts { - details = append(details, &Detail{ - codehost.ID, - "", - codehost.Address, - codehost.Namespace, - codehost.Type, - codehost.AccessToken, - codehost.Region, - codehost.Username, - codehost.Password, - codehost.AccessKey, - codehost.SecretKey, - }) - } - - return details, nil + return res, nil } func (c *Client) ListCodeHosts() ([]*CodeHost, error) { @@ -139,11 +80,18 @@ func (c *Client) ListCodeHosts() ([]*CodeHost, error) { return res, nil } -func (c *Client) GetCodeHostByAddressAndOwner(address, owner string) (*CodeHost, error) { +func (c *Client) GetCodeHostByAddressAndOwner(address, owner, source string) (*CodeHost, error) { url := "/codehosts" res := make([]*CodeHost, 0) - _, err := c.Get(url, httpclient.SetQueryParam("address", address), httpclient.SetQueryParam("owner", owner), httpclient.SetResult(&res)) + + req := map[string]string{ + "address": address, + "owner": owner, + "source": source, + } + + _, err := c.Get(url, httpclient.SetQueryParams(req), httpclient.SetResult(&res)) if err != nil { return nil, err } -- Gitee From cd336f5046b1bd4b1c60aca7f48ea4abe22af277 Mon Sep 17 00:00:00 2001 From: mouuii Date: Tue, 9 Nov 2021 21:13:54 +0800 Subject: [PATCH 305/405] hide secret Signed-off-by: mouuii --- .../picket/core/filter/handler/codehost.go | 15 ++++++++++++++ .../picket/core/filter/handler/router.go | 4 ++++ .../picket/core/filter/service/codehost.go | 20 +++++++++++++++++++ 3 files changed, 39 insertions(+) create mode 100644 pkg/microservice/picket/core/filter/handler/codehost.go create mode 100644 pkg/microservice/picket/core/filter/service/codehost.go diff --git a/pkg/microservice/picket/core/filter/handler/codehost.go b/pkg/microservice/picket/core/filter/handler/codehost.go new file mode 100644 index 000000000..a7a2fec88 --- /dev/null +++ b/pkg/microservice/picket/core/filter/handler/codehost.go @@ -0,0 +1,15 @@ +package handler + +import ( + "github.com/gin-gonic/gin" + + "github.com/koderover/zadig/pkg/microservice/picket/core/filter/service" + internalhandler "github.com/koderover/zadig/pkg/shared/handler" +) + +func ListCodeHost(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + + ctx.Resp, ctx.Err = service.ListCodeHost(ctx.Logger) +} diff --git a/pkg/microservice/picket/core/filter/handler/router.go b/pkg/microservice/picket/core/filter/handler/router.go index 5ec375405..421fdc1a5 100644 --- a/pkg/microservice/picket/core/filter/handler/router.go +++ b/pkg/microservice/picket/core/filter/handler/router.go @@ -40,4 +40,8 @@ func (*Router) Inject(router *gin.RouterGroup) { { rolebindings.GET("", ListRoleBindings) } + codehosts := router.Group("codehosts") + { + codehosts.GET("", ListCodeHost) + } } diff --git a/pkg/microservice/picket/core/filter/service/codehost.go b/pkg/microservice/picket/core/filter/service/codehost.go new file mode 100644 index 000000000..5a3a732bc --- /dev/null +++ b/pkg/microservice/picket/core/filter/service/codehost.go @@ -0,0 +1,20 @@ +package service + +import ( + "go.uber.org/zap" + + "github.com/koderover/zadig/pkg/shared/client/systemconfig" +) + +func ListCodeHost(_ *zap.SugaredLogger) ([]*systemconfig.CodeHost, error) { + list, err := systemconfig.GetCodeHostList() + if err != nil { + return nil, err + } + for k, _ := range list { + list[k].AccessKey = "***" + list[k].SecretKey = "***" + list[k].AccessToken = "***" + } + return list, nil +} -- Gitee From afb1794e86cbc3f59711c75e5d0ef63867a07b05 Mon Sep 17 00:00:00 2001 From: lou Date: Tue, 9 Nov 2021 22:12:53 +0800 Subject: [PATCH 306/405] poetry cleanup Signed-off-by: lou --- pkg/config/config.go | 13 -- pkg/microservice/aslan/config/config.go | 4 - .../core/common/repository/models/queue.go | 16 +- .../aslan/core/common/service/service.go | 5 +- .../aslan/core/common/service/utils.go | 7 - .../aslan/core/environment/service/product.go | 6 - .../aslan/core/system/service/capacity.go | 14 -- .../core/workflow/service/webhook/github.go | 5 +- .../core/workflow/service/webhook/utils.go | 8 +- .../workflow/service/workflow/nsq_handlers.go | 5 +- .../service/workflow/pipeline_controller.go | 2 +- .../service/workflow/pipeline_task.go | 4 +- .../service/workflow/pipeline_validation.go | 5 +- .../service/workflow/workflow_task.go | 4 +- pkg/microservice/aslan/server/rest/router.go | 2 +- pkg/microservice/podexec/config/config.go | 7 - .../core/codehost/handler/codehost.go | 2 +- .../codehost/repository/mongodb/codehost.go | 8 +- .../core/codehost/service/codehost.go | 3 +- pkg/microservice/warpdrive/config/config.go | 4 - .../warpdrive/core/service/taskplugin/jira.go | 6 +- .../core/service/types/task/config_payload.go | 4 +- pkg/setting/consts.go | 1 - pkg/setting/types.go | 5 - pkg/shared/client/systemconfig/codehost.go | 37 ++--- .../{poetry => client/systemconfig}/jira.go | 9 +- pkg/shared/codehost/codehost.go | 146 ------------------ pkg/shared/poetry/client.go | 44 ------ pkg/shared/poetry/codehost.go | 46 ------ 29 files changed, 48 insertions(+), 374 deletions(-) rename pkg/shared/{poetry => client/systemconfig}/jira.go (89%) delete mode 100644 pkg/shared/codehost/codehost.go delete mode 100644 pkg/shared/poetry/client.go delete mode 100644 pkg/shared/poetry/codehost.go diff --git a/pkg/config/config.go b/pkg/config/config.go index 42de9dce6..92c0d23fc 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -73,10 +73,6 @@ func RequestLogFile() string { return LogPath() + RequestLogName() } -func PoetryAPIRootKey() string { - return viper.GetString(setting.ENVPoetryAPIRootKey) -} - func GetServiceByCode(code int) *setting.ServiceInfo { return setting.Services[code] } @@ -146,15 +142,6 @@ func CollieServiceAddress() string { return GetServiceAddress(s.Name, s.Port) } -func PoetryServiceInfo() *setting.ServiceInfo { - return GetServiceByCode(setting.Poetry) -} - -func PoetryServiceAddress() string { - s := PoetryServiceInfo() - return GetServiceAddress(s.Name, s.Port) -} - func ConfigServiceInfo() *setting.ServiceInfo { return GetServiceByCode(setting.Config) } diff --git a/pkg/microservice/aslan/config/config.go b/pkg/microservice/aslan/config/config.go index d9243f8ce..818381138 100644 --- a/pkg/microservice/aslan/config/config.go +++ b/pkg/microservice/aslan/config/config.go @@ -74,10 +74,6 @@ func LogLevel() int { return viper.GetInt(setting.ENVLogLevel) } -func PoetryAPIServer() string { - return configbase.PoetryServiceAddress() -} - func CollieAPIAddress() string { return configbase.CollieServiceAddress() } diff --git a/pkg/microservice/aslan/core/common/repository/models/queue.go b/pkg/microservice/aslan/core/common/repository/models/queue.go index 20922d121..7801b2c46 100644 --- a/pkg/microservice/aslan/core/common/repository/models/queue.go +++ b/pkg/microservice/aslan/core/common/repository/models/queue.go @@ -64,12 +64,12 @@ type Queue struct { // TestArgs 测试任务参数 TestArgs *TestTaskArgs `bson:"test_args,omitempty" json:"test_args,omitempty"` // ServiceTaskArgs 脚本部署工作流任务参数 - ServiceTaskArgs *ServiceTaskArgs `bson:"service_args,omitempty" json:"service_args,omitempty"` - ConfigPayload *ConfigPayload `json:"config_payload,omitempty"` - Error string `bson:"error,omitempty" json:"error,omitempty"` - Services [][]*ProductService `bson:"services" json:"services"` - Render *RenderInfo `bson:"render" json:"render"` - StorageURI string `bson:"storage_uri,omitempty" json:"storage_uri,omitempty"` + ServiceTaskArgs *ServiceTaskArgs `bson:"service_args,omitempty" json:"service_args,omitempty"` + ConfigPayload *ConfigPayload `json:"config_payload,omitempty"` + Error string `bson:"error,omitempty" json:"error,omitempty"` + Services [][]*ProductService `bson:"services" json:"services"` + Render *RenderInfo `bson:"render" json:"render"` + StorageURI string `bson:"storage_uri,omitempty" json:"storage_uri,omitempty"` // interface{} 为types.TestReport TestReports map[string]interface{} `bson:"test_reports,omitempty" json:"test_reports,omitempty"` @@ -200,13 +200,13 @@ type RegistryConfig struct { type ReleaseConfig struct { // ReaperImage sets build job image - // e.g. xxx.com/poetry-resources/reaper-plugin:1.0.0 + // e.g. xxx.com/resources/reaper-plugin:1.0.0 ReaperImage string // ReaperBinaryFile sets download url of reaper binary file in build job // e.g. http://resource.koderover.com/reaper-20201014203000 ReaperBinaryFile string // PredatorImage sets docker build image - // e.g. xxx.com/poetry-resources/predator-plugin:v0.1.0 + // e.g. xxx.com/resources/predator-plugin:v0.1.0 PredatorImage string } diff --git a/pkg/microservice/aslan/core/common/service/service.go b/pkg/microservice/aslan/core/common/service/service.go index bf031f69a..780409314 100644 --- a/pkg/microservice/aslan/core/common/service/service.go +++ b/pkg/microservice/aslan/core/common/service/service.go @@ -38,7 +38,6 @@ import ( "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/webhook" "github.com/koderover/zadig/pkg/setting" "github.com/koderover/zadig/pkg/shared/client/systemconfig" - "github.com/koderover/zadig/pkg/shared/poetry" e "github.com/koderover/zadig/pkg/tool/errors" "github.com/koderover/zadig/pkg/tool/log" "github.com/koderover/zadig/pkg/util/converter" @@ -163,7 +162,7 @@ func ListServiceTemplate(productName string, log *zap.SugaredLogger) (*ServiceTm } detail, err := systemconfig.GetCodeHostInfo( - &systemconfig.Option{CodeHostType: poetry.GitHubProvider, Address: address, Namespace: owner}) + &systemconfig.Option{CodeHostType: systemconfig.GitHubProvider, Address: address, Namespace: owner}) if err != nil { log.Errorf("get github codeHostInfo failed, err:%v", err) return nil, err @@ -356,7 +355,7 @@ func GetServiceTemplate(serviceName, serviceType, productName, excludeStatus str } detail, err := systemconfig.GetCodeHostInfo( - &systemconfig.Option{CodeHostType: poetry.GitHubProvider, Address: address, Namespace: owner, CodeHostID: resp.CodehostID}) + &systemconfig.Option{CodeHostType: systemconfig.GitHubProvider, Address: address, Namespace: owner}) if err != nil { log.Errorf("get github codeHostInfo failed, err:%v", err) return nil, err diff --git a/pkg/microservice/aslan/core/common/service/utils.go b/pkg/microservice/aslan/core/common/service/utils.go index 3b811390f..a89404921 100644 --- a/pkg/microservice/aslan/core/common/service/utils.go +++ b/pkg/microservice/aslan/core/common/service/utils.go @@ -67,13 +67,6 @@ func SendFailedTaskMessage(username, productName, name, requestID string, workfl SendMessage(username, title, content, requestID, log) return } - - //// 如果是timer创建的任务,通知需要发送给该项目下有编辑工作流权限的用户 - //poetryClient := poetry.New(config.PoetryAPIServer()) - //users, _ := poetryClient.ListProductPermissionUsers(productName, perm, log) - //for _, user := range users { - // SendMessage(user, title, content, requestID, log) - //} } func SendErrorMessage(sender, title, requestID string, err error, log *zap.SugaredLogger) { diff --git a/pkg/microservice/aslan/core/environment/service/product.go b/pkg/microservice/aslan/core/environment/service/product.go index eef10e4b2..c91818eab 100644 --- a/pkg/microservice/aslan/core/environment/service/product.go +++ b/pkg/microservice/aslan/core/environment/service/product.go @@ -73,12 +73,6 @@ func CleanProductCronJob(requestID string, log *zap.SugaredLogger) { } } - //poetryClient := poetry.New(config.PoetryAPIServer()) - //users, _ := poetryClient.ListProductPermissionUsers("", "", log) - //for _, user := range users { - // commonservice.SendMessage(user, title, content, requestID, log) - //} - log.Warnf("[%s] product %s deleted", product.EnvName, product.ProductName) } } diff --git a/pkg/microservice/aslan/core/system/service/capacity.go b/pkg/microservice/aslan/core/system/service/capacity.go index 378589787..31419d113 100644 --- a/pkg/microservice/aslan/core/system/service/capacity.go +++ b/pkg/microservice/aslan/core/system/service/capacity.go @@ -170,20 +170,6 @@ func sendSyscapNotify(handleErr error, totalCleanTasks *int) { if handleErr != nil { content.Content = fmt.Sprintf("清理时间: %s, 状态: 失败, 内容: %v", now, handleErr) } - - //notifyInfo := &commonmodels.Notify{ - // Type: config.Message, - // Content: content, - // CreateTime: time.Now().Unix(), - // IsRead: false, - //} - - //poetryClient := poetry.New(config.PoetryAPIServer()) - //users, _ := poetryClient.ListProductPermissionUsers("", "", log.SugaredLogger()) - //for _, user := range users { - // notifyInfo.Receiver = user - // notify.NewNotifyClient().CreateNotify(user, notifyInfo) - //} } func handleWorkflowTaskRetentionCenter(strategy *commonmodels.CapacityStrategy, dryRun bool) error { diff --git a/pkg/microservice/aslan/core/workflow/service/webhook/github.go b/pkg/microservice/aslan/core/workflow/service/webhook/github.go index 5e0c4ef3a..26cc03b88 100644 --- a/pkg/microservice/aslan/core/workflow/service/webhook/github.go +++ b/pkg/microservice/aslan/core/workflow/service/webhook/github.go @@ -38,7 +38,6 @@ import ( workflowservice "github.com/koderover/zadig/pkg/microservice/aslan/core/workflow/service/workflow" "github.com/koderover/zadig/pkg/setting" "github.com/koderover/zadig/pkg/shared/client/systemconfig" - "github.com/koderover/zadig/pkg/shared/poetry" e "github.com/koderover/zadig/pkg/tool/errors" githubtool "github.com/koderover/zadig/pkg/tool/git/github" "github.com/koderover/zadig/pkg/types" @@ -189,7 +188,7 @@ func prEventToPipelineTasks(event *github.PullRequestEvent, requestID string, lo return nil, err } ch, err := systemconfig.GetCodeHostInfo( - &systemconfig.Option{CodeHostType: poetry.GitHubProvider, Address: address, Namespace: owner}) + &systemconfig.Option{CodeHostType: systemconfig.GitHubProvider, Address: address, Namespace: owner}) if err != nil { log.Errorf("GetCodeHostInfo failed, err: %v", err) return nil, err @@ -328,7 +327,7 @@ func pushEventToPipelineTasks(event *github.PushEvent, requestID string, log *za return nil, err } ch, err := systemconfig.GetCodeHostInfo( - &systemconfig.Option{CodeHostType: poetry.GitHubProvider, Address: address, Namespace: owner}) + &systemconfig.Option{CodeHostType: systemconfig.GitHubProvider, Address: address, Namespace: owner}) if err != nil { log.Errorf("GetCodeHostInfo failed, err: %v", err) return nil, err diff --git a/pkg/microservice/aslan/core/workflow/service/webhook/utils.go b/pkg/microservice/aslan/core/workflow/service/webhook/utils.go index a65bb34a6..57951755e 100644 --- a/pkg/microservice/aslan/core/workflow/service/webhook/utils.go +++ b/pkg/microservice/aslan/core/workflow/service/webhook/utils.go @@ -36,8 +36,6 @@ import ( "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/codehub" "github.com/koderover/zadig/pkg/setting" "github.com/koderover/zadig/pkg/shared/client/systemconfig" - "github.com/koderover/zadig/pkg/shared/codehost" - "github.com/koderover/zadig/pkg/shared/poetry" e "github.com/koderover/zadig/pkg/tool/errors" githubtool "github.com/koderover/zadig/pkg/tool/git/github" gitlabtool "github.com/koderover/zadig/pkg/tool/git/gitlab" @@ -202,7 +200,7 @@ func syncCodehubLatestCommit(service *commonmodels.Service) error { func getCodehubClientByAddress(address string) (*codehub.Client, error) { opt := &systemconfig.Option{ Address: address, - CodeHostType: codehost.CodeHubProvider, + CodeHostType: systemconfig.CodeHubProvider, } codehost, err := systemconfig.GetCodeHostInfo(opt) if err != nil { @@ -217,7 +215,7 @@ func getCodehubClientByAddress(address string) (*codehub.Client, error) { func getGitlabClientByAddress(address string) (*gitlabtool.Client, error) { opt := &systemconfig.Option{ Address: address, - CodeHostType: codehost.GitLabProvider, + CodeHostType: systemconfig.GitLabProvider, } codehost, err := systemconfig.GetCodeHostInfo(opt) if err != nil { @@ -339,7 +337,7 @@ func syncContentFromGithub(args *commonmodels.Service, log *zap.SugaredLogger) e } ch, err := systemconfig.GetCodeHostInfo( - &systemconfig.Option{CodeHostType: poetry.GitHubProvider, Address: address, Namespace: owner}) + &systemconfig.Option{CodeHostType: systemconfig.GitHubProvider, Address: address, Namespace: owner}) if err != nil { log.Errorf("GetCodeHostInfo failed, srcPath:%s, err:%v", args.SrcPath, err) return err diff --git a/pkg/microservice/aslan/core/workflow/service/workflow/nsq_handlers.go b/pkg/microservice/aslan/core/workflow/service/workflow/nsq_handlers.go index 01f804ac2..b71b9e887 100644 --- a/pkg/microservice/aslan/core/workflow/service/workflow/nsq_handlers.go +++ b/pkg/microservice/aslan/core/workflow/service/workflow/nsq_handlers.go @@ -46,7 +46,6 @@ import ( "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/registry" "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/s3" "github.com/koderover/zadig/pkg/setting" - "github.com/koderover/zadig/pkg/shared/poetry" "github.com/koderover/zadig/pkg/tool/git/gitlab" "github.com/koderover/zadig/pkg/tool/log" s3tool "github.com/koderover/zadig/pkg/tool/s3" @@ -64,12 +63,11 @@ type TaskAckHandler struct { deliveryArtifactColl *commonrepo.DeliveryArtifactColl deliveryActivityColl *commonrepo.DeliveryActivityColl TestTaskStatColl *commonrepo.TestTaskStatColl - PoetryClient *poetry.Client messages chan *nsq.Message log *zap.SugaredLogger } -func NewTaskAckHandler(poetryServer string, maxInFlight int, log *zap.SugaredLogger) *TaskAckHandler { +func NewTaskAckHandler(maxInFlight int, log *zap.SugaredLogger) *TaskAckHandler { return &TaskAckHandler{ queue: NewPipelineQueue(log), ptColl: commonrepo.NewTaskColl(), @@ -79,7 +77,6 @@ func NewTaskAckHandler(poetryServer string, maxInFlight int, log *zap.SugaredLog deliveryArtifactColl: commonrepo.NewDeliveryArtifactColl(), deliveryActivityColl: commonrepo.NewDeliveryActivityColl(), TestTaskStatColl: commonrepo.NewTestTaskStatColl(), - PoetryClient: poetry.New(poetryServer), messages: make(chan *nsq.Message, maxInFlight*10), log: log, } diff --git a/pkg/microservice/aslan/core/workflow/service/workflow/pipeline_controller.go b/pkg/microservice/aslan/core/workflow/service/workflow/pipeline_controller.go index f4c4cb969..d368d0b5a 100644 --- a/pkg/microservice/aslan/core/workflow/service/workflow/pipeline_controller.go +++ b/pkg/microservice/aslan/core/workflow/service/workflow/pipeline_controller.go @@ -43,7 +43,7 @@ func SubScribeNSQ() error { // init ack consumer ackConfig := nsqservice.Config() ackConfig.MaxInFlight = 50 - ackHandler := NewTaskAckHandler(config.PoetryAPIServer(), ackConfig.MaxInFlight, logger) + ackHandler := NewTaskAckHandler(ackConfig.MaxInFlight, logger) err := nsqservice.SubScribe(setting.TopicAck, "ack", 1, ackConfig, ackHandler) if err != nil { logger.Errorf("ack subscription failed, the error is: %v", err) diff --git a/pkg/microservice/aslan/core/workflow/service/workflow/pipeline_task.go b/pkg/microservice/aslan/core/workflow/service/workflow/pipeline_task.go index 0a47a9464..211402963 100644 --- a/pkg/microservice/aslan/core/workflow/service/workflow/pipeline_task.go +++ b/pkg/microservice/aslan/core/workflow/service/workflow/pipeline_task.go @@ -40,7 +40,7 @@ import ( "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/s3" "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/scmnotify" "github.com/koderover/zadig/pkg/setting" - "github.com/koderover/zadig/pkg/shared/poetry" + "github.com/koderover/zadig/pkg/shared/client/systemconfig" e "github.com/koderover/zadig/pkg/tool/errors" krkubeclient "github.com/koderover/zadig/pkg/tool/kube/client" "github.com/koderover/zadig/pkg/tool/kube/getter" @@ -165,7 +165,7 @@ func CreatePipelineTask(args *commonmodels.TaskArgs, log *zap.SugaredLogger) (*C } } - jiraInfo, _ := poetry.GetJiraInfo(config.PoetryAPIServer()) + jiraInfo, _ := systemconfig.New().GetJiraInfo() if jiraInfo != nil { jiraTask, err := AddPipelineJiraSubTask(pipeline, log) if err != nil { diff --git a/pkg/microservice/aslan/core/workflow/service/workflow/pipeline_validation.go b/pkg/microservice/aslan/core/workflow/service/workflow/pipeline_validation.go index 689acf369..580992490 100644 --- a/pkg/microservice/aslan/core/workflow/service/workflow/pipeline_validation.go +++ b/pkg/microservice/aslan/core/workflow/service/workflow/pipeline_validation.go @@ -46,7 +46,6 @@ import ( "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/kube" "github.com/koderover/zadig/pkg/setting" "github.com/koderover/zadig/pkg/shared/client/systemconfig" - "github.com/koderover/zadig/pkg/shared/codehost" "github.com/koderover/zadig/pkg/shared/kube/wrapper" e "github.com/koderover/zadig/pkg/tool/errors" "github.com/koderover/zadig/pkg/tool/kube/getter" @@ -308,7 +307,7 @@ func setBuildInfo(build *types.Repository, log *zap.SugaredLogger) { log.Errorf("failed to get codehost detail %d %v", build.CodehostID, err) return } - if codeHostInfo.Type == codehost.GitLabProvider || codeHostInfo.Type == codehost.GerritProvider { + if codeHostInfo.Type == systemconfig.GitLabProvider || codeHostInfo.Type == systemconfig.GerritProvider { if build.CommitID == "" { var commit *RepoCommit var pr *PRCommit @@ -343,7 +342,7 @@ func setBuildInfo(build *types.Repository, log *zap.SugaredLogger) { build.CommitMessage = commit.Message build.AuthorName = commit.AuthorName } - } else if codeHostInfo.Type == codehost.CodeHubProvider { + } else if codeHostInfo.Type == systemconfig.CodeHubProvider { codeHubClient := codehub.NewClient(codeHostInfo.AccessKey, codeHostInfo.SecretKey, codeHostInfo.Region) if build.CommitID == "" && build.Branch != "" { branchList, _ := codeHubClient.BranchList(build.RepoUUID) diff --git a/pkg/microservice/aslan/core/workflow/service/workflow/workflow_task.go b/pkg/microservice/aslan/core/workflow/service/workflow/workflow_task.go index b15e4f54a..368a43529 100644 --- a/pkg/microservice/aslan/core/workflow/service/workflow/workflow_task.go +++ b/pkg/microservice/aslan/core/workflow/service/workflow/workflow_task.go @@ -41,7 +41,7 @@ import ( "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/s3" "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/scmnotify" "github.com/koderover/zadig/pkg/setting" - "github.com/koderover/zadig/pkg/shared/poetry" + "github.com/koderover/zadig/pkg/shared/client/systemconfig" e "github.com/koderover/zadig/pkg/tool/errors" "github.com/koderover/zadig/pkg/tool/log" "github.com/koderover/zadig/pkg/types" @@ -602,7 +602,7 @@ func CreateWorkflowTask(args *commonmodels.WorkflowTaskArgs, taskCreator string, subTasks = append(subTasks, distributeTasks...) } - jiraInfo, _ := poetry.GetJiraInfo(config.PoetryAPIServer()) + jiraInfo, _ := systemconfig.New().GetJiraInfo() if jiraInfo != nil { jiraTask, err := AddJiraSubTask("", target.Name, target.ServiceName, args.ProductTmplName, log) if err != nil { diff --git a/pkg/microservice/aslan/server/rest/router.go b/pkg/microservice/aslan/server/rest/router.go index 989cfd364..960dd7909 100644 --- a/pkg/microservice/aslan/server/rest/router.go +++ b/pkg/microservice/aslan/server/rest/router.go @@ -63,7 +63,7 @@ func (s *engine) injectRouterGroup(router *gin.RouterGroup) { public.GET("/health", commonhandler.Health) } - // no auth required, should not be exposed via poetry-api-proxy or will fail + // no auth required router.GET("/api/hub/connect", multiclusterhandler.ClusterConnectFromAgent) router.GET("/api/kodespace/downloadUrl", commonhandler.GetToolDownloadURL) diff --git a/pkg/microservice/podexec/config/config.go b/pkg/microservice/podexec/config/config.go index c75b077e0..782d8b451 100644 --- a/pkg/microservice/podexec/config/config.go +++ b/pkg/microservice/podexec/config/config.go @@ -17,16 +17,9 @@ limitations under the License. package config import ( - "github.com/spf13/viper" - configbase "github.com/koderover/zadig/pkg/config" - "github.com/koderover/zadig/pkg/setting" ) -func PoetryAPIRootKey() string { - return viper.GetString(setting.ENVPoetryAPIRootKey) -} - func HubServerAddr() string { return configbase.HubServerServiceAddress() } diff --git a/pkg/microservice/systemconfig/core/codehost/handler/codehost.go b/pkg/microservice/systemconfig/core/codehost/handler/codehost.go index b4b242f07..2364b5a0a 100644 --- a/pkg/microservice/systemconfig/core/codehost/handler/codehost.go +++ b/pkg/microservice/systemconfig/core/codehost/handler/codehost.go @@ -30,7 +30,7 @@ func CreateCodeHost(c *gin.Context) { func ListCodeHost(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - ctx.Resp, ctx.Err = service.List(c.Query("address"), c.Query("owner"), ctx.Logger) + ctx.Resp, ctx.Err = service.List(c.Query("address"), c.Query("owner"), c.Query("source"), ctx.Logger) } func DeleteCodeHost(c *gin.Context) { diff --git a/pkg/microservice/systemconfig/core/codehost/repository/mongodb/codehost.go b/pkg/microservice/systemconfig/core/codehost/repository/mongodb/codehost.go index 0bc5836e3..2c9ea41a9 100644 --- a/pkg/microservice/systemconfig/core/codehost/repository/mongodb/codehost.go +++ b/pkg/microservice/systemconfig/core/codehost/repository/mongodb/codehost.go @@ -20,8 +20,9 @@ type CodehostColl struct { } type ListArgs struct { - Owner string `json:"owner"` - Address string `json:"address"` + Owner string + Address string + Source string } func NewCodehostColl() *CodehostColl { @@ -85,6 +86,9 @@ func (c *CodehostColl) List(args *ListArgs) ([]*models.CodeHost, error) { if args.Owner != "" { query["namespace"] = args.Owner } + if args.Source != "" { + query["type"] = args.Source + } cursor, err := c.Collection.Find(context.TODO(), query) if err != nil { diff --git a/pkg/microservice/systemconfig/core/codehost/service/codehost.go b/pkg/microservice/systemconfig/core/codehost/service/codehost.go index e2335d678..54a165c03 100644 --- a/pkg/microservice/systemconfig/core/codehost/service/codehost.go +++ b/pkg/microservice/systemconfig/core/codehost/service/codehost.go @@ -19,10 +19,11 @@ func CreateCodeHost(codehost *models.CodeHost, _ *zap.SugaredLogger) (*models.Co return mongodb.NewCodehostColl().AddCodeHost(codehost) } -func List(address, owner string, _ *zap.SugaredLogger) ([]*models.CodeHost, error) { +func List(address, owner, source string, _ *zap.SugaredLogger) ([]*models.CodeHost, error) { return mongodb.NewCodehostColl().List(&mongodb.ListArgs{ Address: address, Owner: owner, + Source: source, }) } diff --git a/pkg/microservice/warpdrive/config/config.go b/pkg/microservice/warpdrive/config/config.go index 2795735f4..c4f31d1c0 100644 --- a/pkg/microservice/warpdrive/config/config.go +++ b/pkg/microservice/warpdrive/config/config.go @@ -34,10 +34,6 @@ func NSQLookupAddrs() []string { return strings.Split(viper.GetString(setting.ENVNsqLookupAddrs), ",") } -func PoetryAPIRootKey() string { - return viper.GetString(setting.ENVPoetryAPIRootKey) -} - func ReleaseImageTimeout() string { return viper.GetString(setting.ReleaseImageTimeout) } diff --git a/pkg/microservice/warpdrive/core/service/taskplugin/jira.go b/pkg/microservice/warpdrive/core/service/taskplugin/jira.go index 892100fd0..d14c33c51 100644 --- a/pkg/microservice/warpdrive/core/service/taskplugin/jira.go +++ b/pkg/microservice/warpdrive/core/service/taskplugin/jira.go @@ -26,12 +26,11 @@ import ( "github.com/xanzy/go-gitlab" "go.uber.org/zap" - configbase "github.com/koderover/zadig/pkg/config" "github.com/koderover/zadig/pkg/microservice/warpdrive/config" wdgithub "github.com/koderover/zadig/pkg/microservice/warpdrive/core/service/taskplugin/github" "github.com/koderover/zadig/pkg/microservice/warpdrive/core/service/types/task" "github.com/koderover/zadig/pkg/setting" - "github.com/koderover/zadig/pkg/shared/poetry" + "github.com/koderover/zadig/pkg/shared/client/systemconfig" "github.com/koderover/zadig/pkg/tool/jira" "github.com/koderover/zadig/pkg/tool/log" "github.com/koderover/zadig/pkg/util" @@ -340,8 +339,7 @@ func (p *JiraPlugin) SetEndTime() { func (p *JiraPlugin) getJiraIssue(pipelineTask *task.Task, key string) (*task.JiraIssue, error) { jiraIssue := new(task.JiraIssue) - poetryClient := poetry.New(configbase.PoetryServiceAddress()) - jiraInfo, err := poetryClient.GetJiraInfo() + jiraInfo, err := systemconfig.New().GetJiraInfo() if err != nil { return nil, fmt.Errorf("getJiraInfo [%s] error: %v", key, err) } diff --git a/pkg/microservice/warpdrive/core/service/types/task/config_payload.go b/pkg/microservice/warpdrive/core/service/types/task/config_payload.go index 0dfdbcda7..3b3e6e0a8 100644 --- a/pkg/microservice/warpdrive/core/service/types/task/config_payload.go +++ b/pkg/microservice/warpdrive/core/service/types/task/config_payload.go @@ -121,13 +121,13 @@ type RegistryConfig struct { type ReleaseConfig struct { // ReaperImage sets build job image - // e.g. xxx.com/poetry-resources/reaper-plugin:1.0.0 + // e.g. xxx.com/resources/reaper-plugin:1.0.0 ReaperImage string // ReaperBinaryFile sets download url of reaper binary file in build job // e.g. http://resource.koderover.com/reaper-20201014203000 ReaperBinaryFile string // PredatorImage sets docker build image - // e.g. xxx.com/poetry-resources/predator-plugin:v0.1.0 + // e.g. xxx.com/resources/predator-plugin:v0.1.0 PredatorImage string } diff --git a/pkg/setting/consts.go b/pkg/setting/consts.go index 26352978f..e81dafee7 100644 --- a/pkg/setting/consts.go +++ b/pkg/setting/consts.go @@ -28,7 +28,6 @@ const ( ENVMongoDBConnectionString = "MONGODB_CONNECTION_STRING" ENVAslanDBName = "ASLAN_DB" ENVHubAgentImage = "HUB_AGENT_IMAGE" - ENVPoetryAPIRootKey = "POETRY_API_ROOT_KEY" ENVMysqlUser = "MYSQL_USER" ENVMysqlPassword = "MYSQL_PASSWORD" ENVMysqlHost = "MYSQL_HOST" diff --git a/pkg/setting/types.go b/pkg/setting/types.go index 746c65d1e..dfec91faa 100644 --- a/pkg/setting/types.go +++ b/pkg/setting/types.go @@ -42,7 +42,6 @@ const ( Cron // 5 HubServer // 6 PodExec // 7 - Poetry // 8 SonarQube // 9 WarpDrive // 10 Minio // 11 @@ -86,10 +85,6 @@ var Services = map[int]*ServiceInfo{ Name: "podexec", Port: 27000, }, - Poetry: { - Name: "poetry", - Port: 34001, - }, SonarQube: { Name: "sonarqube", Port: 80, diff --git a/pkg/shared/client/systemconfig/codehost.go b/pkg/shared/client/systemconfig/codehost.go index 2d754bb84..733fcf0bc 100644 --- a/pkg/shared/client/systemconfig/codehost.go +++ b/pkg/shared/client/systemconfig/codehost.go @@ -1,14 +1,18 @@ package systemconfig import ( - "errors" "fmt" - "strings" - "github.com/koderover/zadig/pkg/shared/codehost" "github.com/koderover/zadig/pkg/tool/httpclient" ) +const ( + GitLabProvider = "gitlab" + GitHubProvider = "github" + GerritProvider = "gerrit" + CodeHubProvider = "codehub" +) + type CodeHost struct { ID int `json:"id"` Address string `json:"address"` @@ -29,31 +33,8 @@ type Option struct { CodeHostID int } -func GetCodeHostInfo(option *Option) (*CodeHost, error) { - codeHosts, err := New().ListCodeHosts() - if err != nil { - return nil, err - } - - for _, codeHost := range codeHosts { - if option.CodeHostID != 0 && codeHost.ID == option.CodeHostID { - return codeHost, nil - } else if option.CodeHostID == 0 && option.CodeHostType != "" { - switch option.CodeHostType { - case codehost.GitHubProvider: - ns := strings.ToLower(codeHost.Namespace) - if strings.Contains(option.Address, codeHost.Address) && strings.ToLower(option.Namespace) == ns { - return codeHost, nil - } - default: - if strings.Contains(option.Address, codeHost.Address) { - return codeHost, nil - } - } - } - } - - return nil, errors.New("not find codeHost") +func GetCodeHostInfo(opt *Option) (*CodeHost, error) { + return New().GetCodeHostByAddressAndOwner(opt.Address, opt.Namespace, opt.CodeHostType) } func (c *Client) GetCodeHost(id int) (*CodeHost, error) { diff --git a/pkg/shared/poetry/jira.go b/pkg/shared/client/systemconfig/jira.go similarity index 89% rename from pkg/shared/poetry/jira.go rename to pkg/shared/client/systemconfig/jira.go index 088279953..1b975b595 100644 --- a/pkg/shared/poetry/jira.go +++ b/pkg/shared/client/systemconfig/jira.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package poetry +package systemconfig import ( "github.com/koderover/zadig/pkg/tool/httpclient" @@ -31,7 +31,7 @@ type JiraInfo struct { } func (c *Client) GetJiraInfo() (*JiraInfo, error) { - url := "/directory/jira" + url := "/jira" jira := &JiraInfo{} _, err := c.Get(url, httpclient.SetResult(jira)) @@ -41,8 +41,3 @@ func (c *Client) GetJiraInfo() (*JiraInfo, error) { return jira, nil } - -func GetJiraInfo(host string) (*JiraInfo, error) { - c := New(host) - return c.GetJiraInfo() -} diff --git a/pkg/shared/codehost/codehost.go b/pkg/shared/codehost/codehost.go deleted file mode 100644 index 263a05fd4..000000000 --- a/pkg/shared/codehost/codehost.go +++ /dev/null @@ -1,146 +0,0 @@ -/* -Copyright 2021 The KodeRover 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 codehost - -import ( - "errors" - "strings" - - "github.com/koderover/zadig/pkg/config" - "github.com/koderover/zadig/pkg/shared/poetry" -) - -const ( - GitLabProvider = "gitlab" - GitHubProvider = "github" - GerritProvider = "gerrit" - CodeHubProvider = "codehub" -) - -type CodeHost struct { - ID int `json:"id"` - Address string `json:"address"` - Type string `json:"type"` - AccessToken string `json:"accessToken"` - Namespace string `json:"namespace"` -} - -type Option struct { - CodeHostType string - Address string - Namespace string - CodeHostID int -} - -type Detail struct { - ID int `json:"id"` - Name string `json:"name"` - Address string `json:"address"` - Owner string `json:"repoowner"` - Source string `json:"source"` - OauthToken string `json:"oauth_token"` - Region string `json:"region"` - Username string `json:"username"` - Password string `json:"password"` - AccessKey string `json:"applicationId"` - SecretKey string `json:"clientSecret"` -} - -func GetCodeHostList() ([]*poetry.CodeHost, error) { - poetryClient := poetry.New(config.PoetryServiceAddress()) - return poetryClient.ListCodeHosts() -} - -func GetCodeHostInfo(option *Option) (*poetry.CodeHost, error) { - codeHosts, err := GetCodeHostList() - if err != nil { - return nil, err - } - - for _, codeHost := range codeHosts { - if option.CodeHostID != 0 && codeHost.ID == option.CodeHostID { - return codeHost, nil - } else if option.CodeHostID == 0 && option.CodeHostType != "" { - switch option.CodeHostType { - case GitHubProvider: - ns := strings.ToLower(codeHost.Namespace) - if strings.Contains(option.Address, codeHost.Address) && strings.ToLower(option.Namespace) == ns { - return codeHost, nil - } - default: - if strings.Contains(option.Address, codeHost.Address) { - return codeHost, nil - } - } - } - } - - return nil, errors.New("not find codeHost") -} - -func GetCodeHostInfoByID(id int) (*poetry.CodeHost, error) { - return GetCodeHostInfo(&Option{CodeHostID: id}) -} - -func GetCodehostDetail(codehostID int) (*Detail, error) { - codehost, err := GetCodeHostInfo(&Option{CodeHostID: codehostID}) - if err != nil { - return nil, err - } - detail := &Detail{ - codehostID, - "", - codehost.Address, - codehost.Namespace, - codehost.Type, - codehost.AccessToken, - codehost.Region, - codehost.Username, - codehost.Password, - codehost.AccessKey, - codehost.SecretKey, - } - - return detail, nil -} - -func ListCodehostDetial() ([]*Detail, error) { - codehosts, err := GetCodeHostList() - if err != nil { - return nil, err - } - - var details []*Detail - - for _, codehost := range codehosts { - details = append(details, &Detail{ - codehost.ID, - "", - codehost.Address, - codehost.Namespace, - codehost.Type, - codehost.AccessToken, - codehost.Region, - codehost.Username, - codehost.Password, - codehost.AccessKey, - codehost.SecretKey, - }) - } - - return details, nil -} diff --git a/pkg/shared/poetry/client.go b/pkg/shared/poetry/client.go deleted file mode 100644 index 47f93d43e..000000000 --- a/pkg/shared/poetry/client.go +++ /dev/null @@ -1,44 +0,0 @@ -/* -Copyright 2021 The KodeRover 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 poetry - -import ( - "github.com/koderover/zadig/pkg/tool/httpclient" -) - -const ( - GitLabProvider = "gitlab" - GitHubProvider = "github" - GerritProvider = "gerrit" -) - -type Client struct { - *httpclient.Client - - host string -} - -func New(host string) *Client { - c := httpclient.New( - httpclient.SetHostURL(host), - ) - - return &Client{ - Client: c, - host: host, - } -} diff --git a/pkg/shared/poetry/codehost.go b/pkg/shared/poetry/codehost.go deleted file mode 100644 index f095f9c63..000000000 --- a/pkg/shared/poetry/codehost.go +++ /dev/null @@ -1,46 +0,0 @@ -/* -Copyright 2021 The KodeRover 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 poetry - -import ( - "github.com/koderover/zadig/pkg/tool/httpclient" -) - -type CodeHost struct { - ID int `json:"id"` - Address string `json:"address"` - Type string `json:"type"` - AccessToken string `json:"accessToken"` - Namespace string `json:"namespace"` - Region string `json:"region"` - AccessKey string `json:"applicationId"` - SecretKey string `json:"clientSecret"` - Username string `json:"username"` - Password string `json:"password"` -} - -func (c *Client) ListCodeHosts() ([]*CodeHost, error) { - url := "/directory/codehostss/search" - - codeHosts := make([]*CodeHost, 0) - _, err := c.Get(url, httpclient.SetResult(&codeHosts)) - if err != nil { - return nil, err - } - - return codeHosts, nil -} -- Gitee From 3dd59baa64df937569f1fabdfd1a6a8e64467d34 Mon Sep 17 00:00:00 2001 From: liu deyi Date: Wed, 10 Nov 2021 10:22:46 +0800 Subject: [PATCH 307/405] optimize code Signed-off-by: liu deyi --- .../aslan/core/system/handler/external_link.go | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/pkg/microservice/aslan/core/system/handler/external_link.go b/pkg/microservice/aslan/core/system/handler/external_link.go index cbe7c44c0..ac32a51a7 100644 --- a/pkg/microservice/aslan/core/system/handler/external_link.go +++ b/pkg/microservice/aslan/core/system/handler/external_link.go @@ -11,7 +11,6 @@ import ( commonmodels "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/models" "github.com/koderover/zadig/pkg/microservice/aslan/core/system/service" internalhandler "github.com/koderover/zadig/pkg/shared/handler" - e "github.com/koderover/zadig/pkg/tool/errors" "github.com/koderover/zadig/pkg/tool/log" ) @@ -38,10 +37,10 @@ func CreateExternalLink(c *gin.Context) { c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(data)) - if err := c.ShouldBindJSON(&args); err != nil { - ctx.Err = e.ErrInvalidParam.AddDesc("invalid externalLink args") - return - } + //if err := c.ShouldBindJSON(&args); err != nil { + // ctx.Err = e.ErrInvalidParam.AddDesc("invalid externalLink args") + // return + //} args.UpdateBy = ctx.UserName ctx.Err = service.CreateExternalLink(args, ctx.Logger) @@ -63,10 +62,10 @@ func UpdateExternalLink(c *gin.Context) { c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(data)) - if err := c.ShouldBindJSON(&args); err != nil { - ctx.Err = e.ErrInvalidParam.AddDesc("invalid externalLink args") - return - } + //if err := c.ShouldBindJSON(&args); err != nil { + // ctx.Err = e.ErrInvalidParam.AddDesc("invalid externalLink args") + // return + //} args.UpdateBy = ctx.UserName ctx.Err = service.UpdateExternalLink(c.Param("id"), args, ctx.Logger) -- Gitee From d6441d479ab39a237658b4b5fa59ed6727f06aee Mon Sep 17 00:00:00 2001 From: liu deyi Date: Wed, 10 Nov 2021 10:35:05 +0800 Subject: [PATCH 308/405] optimize code Signed-off-by: liu deyi --- .../aslan/core/system/handler/external_link.go | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/pkg/microservice/aslan/core/system/handler/external_link.go b/pkg/microservice/aslan/core/system/handler/external_link.go index ac32a51a7..37c68a21e 100644 --- a/pkg/microservice/aslan/core/system/handler/external_link.go +++ b/pkg/microservice/aslan/core/system/handler/external_link.go @@ -6,6 +6,8 @@ import ( "fmt" "io/ioutil" + e "github.com/koderover/zadig/pkg/tool/errors" + "github.com/gin-gonic/gin" commonmodels "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/models" @@ -37,10 +39,10 @@ func CreateExternalLink(c *gin.Context) { c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(data)) - //if err := c.ShouldBindJSON(&args); err != nil { - // ctx.Err = e.ErrInvalidParam.AddDesc("invalid externalLink args") - // return - //} + if err := c.ShouldBindJSON(&args); err != nil { + ctx.Err = e.ErrInvalidParam.AddDesc("invalid externalLink args") + return + } args.UpdateBy = ctx.UserName ctx.Err = service.CreateExternalLink(args, ctx.Logger) @@ -62,10 +64,10 @@ func UpdateExternalLink(c *gin.Context) { c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(data)) - //if err := c.ShouldBindJSON(&args); err != nil { - // ctx.Err = e.ErrInvalidParam.AddDesc("invalid externalLink args") - // return - //} + if err := c.ShouldBindJSON(&args); err != nil { + ctx.Err = e.ErrInvalidParam.AddDesc("invalid externalLink args") + return + } args.UpdateBy = ctx.UserName ctx.Err = service.UpdateExternalLink(c.Param("id"), args, ctx.Logger) -- Gitee From f9ee1167f7ae50bbdc73a36827f23d5bbb6fb09b Mon Sep 17 00:00:00 2001 From: mouuii Date: Wed, 10 Nov 2021 10:49:13 +0800 Subject: [PATCH 309/405] build fail Signed-off-by: mouuii --- pkg/microservice/picket/core/filter/service/codehost.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/microservice/picket/core/filter/service/codehost.go b/pkg/microservice/picket/core/filter/service/codehost.go index 5a3a732bc..7ea6998f6 100644 --- a/pkg/microservice/picket/core/filter/service/codehost.go +++ b/pkg/microservice/picket/core/filter/service/codehost.go @@ -7,7 +7,7 @@ import ( ) func ListCodeHost(_ *zap.SugaredLogger) ([]*systemconfig.CodeHost, error) { - list, err := systemconfig.GetCodeHostList() + list, err := systemconfig.New().ListCodeHosts() if err != nil { return nil, err } -- Gitee From 53d8de2ce069eb34307447c751dd1ee16cd825af Mon Sep 17 00:00:00 2001 From: mouuii Date: Wed, 10 Nov 2021 11:46:08 +0800 Subject: [PATCH 310/405] move api Signed-off-by: mouuii --- .../picket/client/aslan/workflow.go | 22 ++++++ .../picket/core/filter/handler/dev.go | 68 +++++++++++++++++++ .../picket/core/filter/handler/router.go | 5 ++ .../picket/core/filter/service/dev.go | 18 +++++ 4 files changed, 113 insertions(+) create mode 100644 pkg/microservice/picket/core/filter/handler/dev.go create mode 100644 pkg/microservice/picket/core/filter/service/dev.go diff --git a/pkg/microservice/picket/client/aslan/workflow.go b/pkg/microservice/picket/client/aslan/workflow.go index f4ebc8c19..b5298ff39 100644 --- a/pkg/microservice/picket/client/aslan/workflow.go +++ b/pkg/microservice/picket/client/aslan/workflow.go @@ -18,3 +18,25 @@ func (c *Client) ListTestWorkflows(testName string, header http.Header, qs url.V return res.Body(), nil } + +func (c *Client) CreateWorkflowTask(header http.Header, qs url.Values, body []byte) ([]byte, error) { + url := "/workflow/workflowtask" + + res, err := c.Post(url, httpclient.SetHeadersFromHTTPHeader(header), httpclient.SetQueryParamsFromValues(qs), httpclient.SetBody(body)) + if err != nil { + return nil, err + } + + return res.Body(), nil +} + +func (c *Client) CancelWorkflowTask(header http.Header, qs url.Values, id string, name string) (statusCode int, err error) { + url := fmt.Sprintf("/workflow/workflowtask/id/%s/pipelines/%s", id, name) + + res, err := c.Delete(url, httpclient.SetHeadersFromHTTPHeader(header), httpclient.SetQueryParamsFromValues(qs)) + if err != nil { + return http.StatusInternalServerError, err + } + + return res.StatusCode(), nil +} diff --git a/pkg/microservice/picket/core/filter/handler/dev.go b/pkg/microservice/picket/core/filter/handler/dev.go new file mode 100644 index 000000000..e87b94d88 --- /dev/null +++ b/pkg/microservice/picket/core/filter/handler/dev.go @@ -0,0 +1,68 @@ +package handler + +import ( + "encoding/json" + "io/ioutil" + "net/http" + + "github.com/gin-gonic/gin" + + "github.com/koderover/zadig/pkg/microservice/picket/core/filter/service" + internalhandler "github.com/koderover/zadig/pkg/shared/handler" +) + +func CreateWorkflowTask(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + body, _ := ioutil.ReadAll(c.Request.Body) + res, err := service.CreateWorkflowTask(c.Request.Header, c.Request.URL.Query(), body, ctx.Logger) + if err != nil { + ctx.Err = err + return + } + // to avoid customer feel confused ,return workflow_name instead of pipline_name + var resp *CreateWorkflowTaskResp + err = json.Unmarshal(res, &resp) + if err != nil { + ctx.Err = err + return + } + resp.WorkflowName = resp.PipelineName + resp.PipelineName = "" + ctx.Resp = resp +} + +type CreateWorkflowTaskResp struct { + PipelineName string `json:"pipeline_name,omitempty"` + WorkflowName string `json:"workflow_name"` + TaskID int64 `json:"task_id"` +} + +type EndpointResponse struct { + ResultCode int `json:"resultCode"` + ErrorMsg string `json:"errorMsg"` +} + +func CancelWorkflowTask(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + id := c.Param("id") + name := c.Param("name") + statusCode, _ := service.CancelWorkflowTask(c.Request.Header, c.Request.URL.Query(), id, name, ctx.Logger) + var code int + var errorMsg string + if statusCode == http.StatusOK { + code = 0 + errorMsg = "success" + } else if statusCode == http.StatusForbidden { + code = statusCode + errorMsg = "forbidden" + } else { + code = statusCode + errorMsg = "fail" + } + ctx.Resp = EndpointResponse{ + ResultCode: code, + ErrorMsg: errorMsg, + } +} diff --git a/pkg/microservice/picket/core/filter/handler/router.go b/pkg/microservice/picket/core/filter/handler/router.go index 421fdc1a5..a0113a4cc 100644 --- a/pkg/microservice/picket/core/filter/handler/router.go +++ b/pkg/microservice/picket/core/filter/handler/router.go @@ -44,4 +44,9 @@ func (*Router) Inject(router *gin.RouterGroup) { { codehosts.GET("", ListCodeHost) } + dev := router.Group("dev") + { + dev.POST("/workflowTask", CreateWorkflowTask) + dev.DELETE("/workflowTask", CancelWorkflowTask) + } } diff --git a/pkg/microservice/picket/core/filter/service/dev.go b/pkg/microservice/picket/core/filter/service/dev.go new file mode 100644 index 000000000..59fe5af78 --- /dev/null +++ b/pkg/microservice/picket/core/filter/service/dev.go @@ -0,0 +1,18 @@ +package service + +import ( + "github.com/koderover/zadig/pkg/microservice/picket/client/aslan" + + "net/http" + "net/url" + + "go.uber.org/zap" +) + +func CreateWorkflowTask(header http.Header, qs url.Values, body []byte, _ *zap.SugaredLogger) ([]byte, error) { + return aslan.New().CreateWorkflowTask(header, qs, body) +} + +func CancelWorkflowTask(header http.Header, qs url.Values, id string, name string, _ *zap.SugaredLogger) (int, error) { + return aslan.New().CancelWorkflowTask(header, qs, id, name) +} -- Gitee From 874fcc2d5c1863f57cc3764d68b83aa57aec6ed3 Mon Sep 17 00:00:00 2001 From: mouuii Date: Wed, 10 Nov 2021 13:45:41 +0800 Subject: [PATCH 311/405] move api Signed-off-by: mouuii --- .../picket/client/aslan/workflow.go | 21 +++++++++++++ .../picket/core/filter/handler/dev.go | 31 +++++++++++++++++++ .../picket/core/filter/handler/router.go | 2 ++ .../picket/core/filter/service/dev.go | 8 +++++ 4 files changed, 62 insertions(+) diff --git a/pkg/microservice/picket/client/aslan/workflow.go b/pkg/microservice/picket/client/aslan/workflow.go index b5298ff39..f2031f880 100644 --- a/pkg/microservice/picket/client/aslan/workflow.go +++ b/pkg/microservice/picket/client/aslan/workflow.go @@ -40,3 +40,24 @@ func (c *Client) CancelWorkflowTask(header http.Header, qs url.Values, id string return res.StatusCode(), nil } + +func (c *Client) RestartWorkflowTask(header http.Header, qs url.Values, id string, name string) (statusCode int, err error) { + url := fmt.Sprintf("/workflow/workflowtask/id/%s/pipelines/%s/restart", id, name) + + res, err := c.Delete(url, httpclient.SetHeadersFromHTTPHeader(header), httpclient.SetQueryParamsFromValues(qs)) + if err != nil { + return http.StatusInternalServerError, err + } + + return res.StatusCode(), nil +} +func (c *Client) ListWorkflowTask(header http.Header, qs url.Values, commitId string) ([]byte, error) { + url := fmt.Sprintf("/workflow/v2/status/task/info?commitId=%s", commitId) + + res, err := c.Get(url, httpclient.SetHeadersFromHTTPHeader(header), httpclient.SetQueryParamsFromValues(qs)) + if err != nil { + return nil, err + } + + return res.Body(), nil +} diff --git a/pkg/microservice/picket/core/filter/handler/dev.go b/pkg/microservice/picket/core/filter/handler/dev.go index e87b94d88..5d3b1e8e4 100644 --- a/pkg/microservice/picket/core/filter/handler/dev.go +++ b/pkg/microservice/picket/core/filter/handler/dev.go @@ -66,3 +66,34 @@ func CancelWorkflowTask(c *gin.Context) { ErrorMsg: errorMsg, } } + +func RestartWorkflowTask(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + id := c.Param("id") + name := c.Param("name") + statusCode, _ := service.RestartWorkflowTask(c.Request.Header, c.Request.URL.Query(), id, name, ctx.Logger) + var code int + var errorMsg string + if statusCode == http.StatusOK { + code = 0 + errorMsg = "success" + } else if statusCode == http.StatusForbidden { + code = statusCode + errorMsg = "forbidden" + } else { + code = statusCode + errorMsg = "fail" + } + ctx.Resp = EndpointResponse{ + ResultCode: code, + ErrorMsg: errorMsg, + } +} + +func ListWorkflowTask(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + commitId := c.Param("commitId") + ctx.Resp, ctx.Err = service.ListWorkflowTask(c.Request.Header, c.Request.URL.Query(), commitId, ctx.Logger) +} diff --git a/pkg/microservice/picket/core/filter/handler/router.go b/pkg/microservice/picket/core/filter/handler/router.go index a0113a4cc..655575eb7 100644 --- a/pkg/microservice/picket/core/filter/handler/router.go +++ b/pkg/microservice/picket/core/filter/handler/router.go @@ -48,5 +48,7 @@ func (*Router) Inject(router *gin.RouterGroup) { { dev.POST("/workflowTask", CreateWorkflowTask) dev.DELETE("/workflowTask", CancelWorkflowTask) + dev.POST("/workflowTask/restart", RestartWorkflowTask) + dev.GET("/workflowTask", ListWorkflowTask) } } diff --git a/pkg/microservice/picket/core/filter/service/dev.go b/pkg/microservice/picket/core/filter/service/dev.go index 59fe5af78..a9398123d 100644 --- a/pkg/microservice/picket/core/filter/service/dev.go +++ b/pkg/microservice/picket/core/filter/service/dev.go @@ -16,3 +16,11 @@ func CreateWorkflowTask(header http.Header, qs url.Values, body []byte, _ *zap.S func CancelWorkflowTask(header http.Header, qs url.Values, id string, name string, _ *zap.SugaredLogger) (int, error) { return aslan.New().CancelWorkflowTask(header, qs, id, name) } + +func RestartWorkflowTask(header http.Header, qs url.Values, id string, name string, _ *zap.SugaredLogger) (int, error) { + return aslan.New().RestartWorkflowTask(header, qs, id, name) +} + +func ListWorkflowTask(header http.Header, qs url.Values, commitId string, _ *zap.SugaredLogger) ([]byte, error) { + return aslan.New().ListWorkflowTask(header, qs, commitId) +} -- Gitee From 9308e67a913ae2e9c9a2bc3d58324512f9c15a18 Mon Sep 17 00:00:00 2001 From: allenshen Date: Wed, 10 Nov 2021 13:47:40 +0800 Subject: [PATCH 312/405] fix log file acquire bug Signed-off-by: allenshen --- pkg/microservice/aslan/core/log/service/log.go | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/microservice/aslan/core/log/service/log.go b/pkg/microservice/aslan/core/log/service/log.go index c4e9ce00f..8d40b76e0 100644 --- a/pkg/microservice/aslan/core/log/service/log.go +++ b/pkg/microservice/aslan/core/log/service/log.go @@ -97,6 +97,7 @@ func getContainerLogFromS3(pipelineName, filenamePrefix string, taskID int64, lo log.Errorf("Failed to create s3 client, the error is: %+v", err) return "", err } + fileName += ".log" objectPrefix := storage.GetObjectPath(fileName) fileList, err := client.ListFiles(storage.Bucket, objectPrefix, false) if err != nil { -- Gitee From 8555ab8a6f718133d00dff921776b14e252da8cd Mon Sep 17 00:00:00 2001 From: mouuii Date: Wed, 10 Nov 2021 13:55:14 +0800 Subject: [PATCH 313/405] move api Signed-off-by: mouuii --- pkg/microservice/picket/client/aslan/workflow.go | 11 +++++++++++ pkg/microservice/picket/core/filter/handler/dev.go | 11 +++++++++++ pkg/microservice/picket/core/filter/handler/router.go | 1 + pkg/microservice/picket/core/filter/service/dev.go | 4 ++++ 4 files changed, 27 insertions(+) diff --git a/pkg/microservice/picket/client/aslan/workflow.go b/pkg/microservice/picket/client/aslan/workflow.go index f2031f880..333eb5b04 100644 --- a/pkg/microservice/picket/client/aslan/workflow.go +++ b/pkg/microservice/picket/client/aslan/workflow.go @@ -61,3 +61,14 @@ func (c *Client) ListWorkflowTask(header http.Header, qs url.Values, commitId st return res.Body(), nil } + +func (c *Client) ListDelivery(header http.Header, qs url.Values, productName, workflowName, taskId, perPage, page string) ([]byte, error) { + url := fmt.Sprintf("/delivery/releases?orgId=1&productName=%s&workflowName=%s&taskId=%s&per_page=%s&page=%s", productName, workflowName, taskId, perPage, page) + + res, err := c.Get(url, httpclient.SetHeadersFromHTTPHeader(header), httpclient.SetQueryParamsFromValues(qs)) + if err != nil { + return nil, err + } + + return res.Body(), nil +} diff --git a/pkg/microservice/picket/core/filter/handler/dev.go b/pkg/microservice/picket/core/filter/handler/dev.go index 5d3b1e8e4..a8bc57739 100644 --- a/pkg/microservice/picket/core/filter/handler/dev.go +++ b/pkg/microservice/picket/core/filter/handler/dev.go @@ -97,3 +97,14 @@ func ListWorkflowTask(c *gin.Context) { commitId := c.Param("commitId") ctx.Resp, ctx.Err = service.ListWorkflowTask(c.Request.Header, c.Request.URL.Query(), commitId, ctx.Logger) } + +func ListDelivery(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + productName := c.Query("productName") + workflowName := c.Query("workflowName") + taskIDStr := c.Query("taskId") + perPageStr := c.Query("perPage") + pageStr := c.Query("page") + ctx.Resp, ctx.Err = service.ListDelivery(c.Request.Header, c.Request.URL.Query(), productName, workflowName, taskIDStr, perPageStr, pageStr, ctx.Logger) +} diff --git a/pkg/microservice/picket/core/filter/handler/router.go b/pkg/microservice/picket/core/filter/handler/router.go index 655575eb7..c4fcfdcbc 100644 --- a/pkg/microservice/picket/core/filter/handler/router.go +++ b/pkg/microservice/picket/core/filter/handler/router.go @@ -50,5 +50,6 @@ func (*Router) Inject(router *gin.RouterGroup) { dev.DELETE("/workflowTask", CancelWorkflowTask) dev.POST("/workflowTask/restart", RestartWorkflowTask) dev.GET("/workflowTask", ListWorkflowTask) + dev.GET("/delivery", ListDelivery) } } diff --git a/pkg/microservice/picket/core/filter/service/dev.go b/pkg/microservice/picket/core/filter/service/dev.go index a9398123d..4b36d9198 100644 --- a/pkg/microservice/picket/core/filter/service/dev.go +++ b/pkg/microservice/picket/core/filter/service/dev.go @@ -24,3 +24,7 @@ func RestartWorkflowTask(header http.Header, qs url.Values, id string, name stri func ListWorkflowTask(header http.Header, qs url.Values, commitId string, _ *zap.SugaredLogger) ([]byte, error) { return aslan.New().ListWorkflowTask(header, qs, commitId) } + +func ListDelivery(header http.Header, qs url.Values, productName string, workflowName string, taskId string, perPage string, page string, _ *zap.SugaredLogger) ([]byte, error) { + return aslan.New().ListDelivery(header, qs, productName, workflowName, taskId, perPage, page) +} -- Gitee From 2d845523a8764602e3c2b59cf13b5fb22cf723df Mon Sep 17 00:00:00 2001 From: mouuii Date: Wed, 10 Nov 2021 15:12:40 +0800 Subject: [PATCH 314/405] upload Signed-off-by: mouuii --- pkg/cli/initconfig/cmd/init.go | 34 +++++++++++++++++-- pkg/cli/initconfig/cmd/rsa.go | 62 ++++++++++++++++++++++++++++++++++ pkg/config/config.go | 4 +++ pkg/setting/consts.go | 1 + 4 files changed, 99 insertions(+), 2 deletions(-) create mode 100644 pkg/cli/initconfig/cmd/rsa.go diff --git a/pkg/cli/initconfig/cmd/init.go b/pkg/cli/initconfig/cmd/init.go index 1ab3924cf..797f4ebe4 100644 --- a/pkg/cli/initconfig/cmd/init.go +++ b/pkg/cli/initconfig/cmd/init.go @@ -18,7 +18,12 @@ package cmd import ( _ "embed" + "encoding/base64" + "encoding/json" "fmt" + "net/http" + "strings" + "time" "github.com/spf13/cobra" "golang.org/x/sync/errgroup" @@ -66,8 +71,9 @@ func run() error { func initSystemConfig() error { email := config.AdminEmail() password := config.AdminPassword() + domain := config.AdminDomain() - uid, err := presetSystemAdmin(email, password) + uid, err := presetSystemAdmin(email, password, domain) if err != nil { log.Errorf("presetSystemAdmin err:%s", err) return err @@ -84,7 +90,7 @@ func initSystemConfig() error { return nil } -func presetSystemAdmin(email string, password string) (string, error) { +func presetSystemAdmin(email string, password, domain string) (string, error) { r, err := user.New().SearchUser(&user.SearchUserArgs{Account: setting.PresetAccount}) if err != nil { log.Errorf("SearchUser err:%s", err) @@ -104,9 +110,33 @@ func presetSystemAdmin(email string, password string) (string, error) { log.Infof("created admin err:%s", err) return "", err } + // report register + go reportRegister(domain, email) return user.Uid, nil } +type Operation struct { + Data string `json:"data"` +} + +func reportRegister(domain, email string) { + uploadStrFmt := ` + { + "domain":"%s", + "username":"admin", + "email":"%s", + "created_at":%d + }` + + encrypt := RSA_Encrypt([]byte(fmt.Sprintf(uploadStrFmt, domain, email, time.Now().Unix()))) + encodeString := base64.StdEncoding.EncodeToString(encrypt) + resp := Operation{Data: encodeString} + bs, _ := json.Marshal(resp) + http.Post("https://api.koderover.com/api/operation/admin/user", + "application/json", + strings.NewReader(string(bs))) +} + func presetRoleBinding(uid string) error { return policy.NewDefault().CreateOrUpdateSystemRoleBinding(&policy.RoleBinding{ Name: fmt.Sprintf(setting.RoleBindingNameFmt, setting.RoleAdmin, setting.PresetAccount, ""), diff --git a/pkg/cli/initconfig/cmd/rsa.go b/pkg/cli/initconfig/cmd/rsa.go new file mode 100644 index 000000000..9c48cdd88 --- /dev/null +++ b/pkg/cli/initconfig/cmd/rsa.go @@ -0,0 +1,62 @@ +package cmd + +import ( + "crypto/rand" + "crypto/rsa" + "crypto/x509" + "encoding/pem" + "errors" + "io/ioutil" +) + +var pub *rsa.PublicKey + +func RSA_Encrypt(plainText []byte) []byte { + if err := LoadPubKey(""); err != nil { + return nil + } + //对明文进行加密 + cipherText, err := rsa.EncryptPKCS1v15(rand.Reader, pub, plainText) + if err != nil { + panic(err) + } + //返回密文 + return cipherText +} + +// LoadPubKey ... +func LoadPubKey(filename string) (err error) { + var block *pem.Block + if filename == "" { + block, _ = pem.Decode(defaultPublicKey) + } else { + b, err := ioutil.ReadFile(filename) + if err != nil { + return err + } + block, _ = pem.Decode(b) + } + if block == nil { + return errors.New("public key error") + } + pubInterface, err := x509.ParsePKIXPublicKey(block.Bytes) + if err != nil { + return + } + pub = pubInterface.(*rsa.PublicKey) + return +} + +var defaultPublicKey = []byte(` +-----BEGIN RSA PUBLIC KEY----- +MIIBpTANBgkqhkiG9w0BAQEFAAOCAZIAMIIBjQKCAYQAz5IqagSbovHGXmUf7wTB +XrR+DZ0u3p5jsgJW08ISJl83t0rCCGMEtcsRXJU8bE2dIIfndNwvmBiqh13/WnJd ++jgyIm6i1ZfNmf/R8pEqVXpOAOuyoD3VLT9tfWvz9nPQbjVI+PsUHH7nVR0Jwxem +NsH/7MC2O15t+2DVC1533UlhjT/pKFDdTri0mgDrLZHp6gPF5d7/yQ7cPbzv6/0p +0UgIdStT7IhkDfsJDRmLAz09znv5tQQtHfJIMdAKxwHw9mExcL2gE40sOezrgj7m +srOnJd65N8anoMGxQqNv+ycAHB9aI1Yrtgue2KKzpI/Fneghd/ZavGVFWKDYoFP3 +531Ga/CiCwtKfM0vQezfLZKAo3qpb0Edy2BcDHhLwidmaFwh8ZlXuaHbNaF/FiVR +h7uu0/9B/gn81o2f+c8GSplWB5bALhQH8tJZnvmWZGI9OnrIlWmQZsuUBooTul9Q +ZJ/w3sE1Zoxa+Or1/eWijqtIfhukOJBNyGaj+esFg6uEeBgHAgMBAAE= +-----END RSA PUBLIC KEY----- +`) diff --git a/pkg/config/config.go b/pkg/config/config.go index 92c0d23fc..88104d3b5 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -253,3 +253,7 @@ func AdminEmail() string { func AdminPassword() string { return viper.GetString(setting.ENVAdminPassword) } + +func AdminDomain() string { + return viper.GetString(setting.ENVAdminDomain) +} diff --git a/pkg/setting/consts.go b/pkg/setting/consts.go index e81dafee7..58a817859 100644 --- a/pkg/setting/consts.go +++ b/pkg/setting/consts.go @@ -116,6 +116,7 @@ const ( // initconfig ENVAdminEmail = "ADMIN_EMAIL" ENVAdminPassword = "ADMIN_PASSWORD" + ENVAdminDomain = "ADMIN_DOMAIN" PresetAccount = "admin" ) -- Gitee From a80d5c7ff0fcb165a16a2faeb22dde16db7f5238 Mon Sep 17 00:00:00 2001 From: mouuii Date: Wed, 10 Nov 2021 15:47:09 +0800 Subject: [PATCH 315/405] domain Signed-off-by: mouuii --- pkg/cli/initconfig/cmd/init.go | 15 +++++++++++---- pkg/cli/initconfig/cmd/init_test.go | 9 +++++++++ pkg/cli/initconfig/cmd/rsa.go | 8 ++++---- 3 files changed, 24 insertions(+), 8 deletions(-) create mode 100644 pkg/cli/initconfig/cmd/init_test.go diff --git a/pkg/cli/initconfig/cmd/init.go b/pkg/cli/initconfig/cmd/init.go index 797f4ebe4..eb181b5be 100644 --- a/pkg/cli/initconfig/cmd/init.go +++ b/pkg/cli/initconfig/cmd/init.go @@ -111,7 +111,10 @@ func presetSystemAdmin(email string, password, domain string) (string, error) { return "", err } // report register - go reportRegister(domain, email) + err = reportRegister(domain, email) + if err != nil { + log.Infof("reportRegister err: %s", err) + } return user.Uid, nil } @@ -119,7 +122,7 @@ type Operation struct { Data string `json:"data"` } -func reportRegister(domain, email string) { +func reportRegister(domain, email string) error { uploadStrFmt := ` { "domain":"%s", @@ -128,13 +131,17 @@ func reportRegister(domain, email string) { "created_at":%d }` - encrypt := RSA_Encrypt([]byte(fmt.Sprintf(uploadStrFmt, domain, email, time.Now().Unix()))) + encrypt, err := RSA_Encrypt([]byte(fmt.Sprintf(uploadStrFmt, domain, email, time.Now().Unix()))) + if err != nil { + return err + } encodeString := base64.StdEncoding.EncodeToString(encrypt) resp := Operation{Data: encodeString} bs, _ := json.Marshal(resp) - http.Post("https://api.koderover.com/api/operation/admin/user", + _, err = http.Post("https://api.koderover.com/api/operation/admin/user", "application/json", strings.NewReader(string(bs))) + return err } func presetRoleBinding(uid string) error { diff --git a/pkg/cli/initconfig/cmd/init_test.go b/pkg/cli/initconfig/cmd/init_test.go new file mode 100644 index 000000000..a7902aecb --- /dev/null +++ b/pkg/cli/initconfig/cmd/init_test.go @@ -0,0 +1,9 @@ +package cmd + +import ( + "testing" +) + +func TestRegister(t *testing.T) { + reportRegister("test@register.com", "test") +} diff --git a/pkg/cli/initconfig/cmd/rsa.go b/pkg/cli/initconfig/cmd/rsa.go index 9c48cdd88..4b25a849c 100644 --- a/pkg/cli/initconfig/cmd/rsa.go +++ b/pkg/cli/initconfig/cmd/rsa.go @@ -11,17 +11,17 @@ import ( var pub *rsa.PublicKey -func RSA_Encrypt(plainText []byte) []byte { +func RSA_Encrypt(plainText []byte) ([]byte, error) { if err := LoadPubKey(""); err != nil { - return nil + return nil, err } //对明文进行加密 cipherText, err := rsa.EncryptPKCS1v15(rand.Reader, pub, plainText) if err != nil { - panic(err) + return nil, err } //返回密文 - return cipherText + return cipherText, nil } // LoadPubKey ... -- Gitee From 82f47a2c0a89af44b91ca97d4360126159bb95af Mon Sep 17 00:00:00 2001 From: liu deyi Date: Wed, 10 Nov 2021 15:52:45 +0800 Subject: [PATCH 316/405] optimize code Signed-off-by: liu deyi --- pkg/microservice/aslan/core/system/handler/external_link.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pkg/microservice/aslan/core/system/handler/external_link.go b/pkg/microservice/aslan/core/system/handler/external_link.go index 37c68a21e..cbe7c44c0 100644 --- a/pkg/microservice/aslan/core/system/handler/external_link.go +++ b/pkg/microservice/aslan/core/system/handler/external_link.go @@ -6,13 +6,12 @@ import ( "fmt" "io/ioutil" - e "github.com/koderover/zadig/pkg/tool/errors" - "github.com/gin-gonic/gin" commonmodels "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/models" "github.com/koderover/zadig/pkg/microservice/aslan/core/system/service" internalhandler "github.com/koderover/zadig/pkg/shared/handler" + e "github.com/koderover/zadig/pkg/tool/errors" "github.com/koderover/zadig/pkg/tool/log" ) -- Gitee From d25fb01290fb69bc3e1928e3edc0441a5e7f0a84 Mon Sep 17 00:00:00 2001 From: allenshen Date: Wed, 10 Nov 2021 15:54:50 +0800 Subject: [PATCH 317/405] optimize code Signed-off-by: allenshen --- .../aslan/core/log/service/log.go | 20 +++++++++---------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/pkg/microservice/aslan/core/log/service/log.go b/pkg/microservice/aslan/core/log/service/log.go index 8d40b76e0..290b6ba13 100644 --- a/pkg/microservice/aslan/core/log/service/log.go +++ b/pkg/microservice/aslan/core/log/service/log.go @@ -25,6 +25,8 @@ import ( "go.uber.org/zap" + "github.com/aws/aws-sdk-go/aws/awserr" + "github.com/aws/aws-sdk-go/service/s3" "github.com/koderover/zadig/pkg/microservice/aslan/config" commonrepo "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/mongodb" "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/kube" @@ -72,6 +74,7 @@ func GetWorkflowTestJobContainerLogs(pipelineName, serviceName, pipelineType str func getContainerLogFromS3(pipelineName, filenamePrefix string, taskID int64, log *zap.SugaredLogger) (string, error) { fileName := strings.Replace(strings.ToLower(filenamePrefix), "_", "-", -1) + fileName += ".log" tempFile, _ := util.GenerateTmpFile() defer func() { _ = os.Remove(tempFile) @@ -97,18 +100,13 @@ func getContainerLogFromS3(pipelineName, filenamePrefix string, taskID int64, lo log.Errorf("Failed to create s3 client, the error is: %+v", err) return "", err } - fileName += ".log" - objectPrefix := storage.GetObjectPath(fileName) - fileList, err := client.ListFiles(storage.Bucket, objectPrefix, false) - if err != nil { - log.Errorf("GetContainerLogFromS3 ListFiles err:%v", err) - return "", err - } - if len(fileList) == 0 { - return "", nil - } - err = client.Download(storage.Bucket, fileList[0], tempFile) + fullPath := storage.GetObjectPath(fileName) + err = client.Download(storage.Bucket, fullPath, tempFile) if err != nil { + //ignore error if log not exist + if e, ok := err.(awserr.Error); ok && e.Code() == s3.ErrCodeNoSuchKey { + return "", nil + } log.Errorf("GetContainerLogFromS3 Download err:%v", err) return "", err } -- Gitee From c26985343f5c89ad5fcc9f461e1b67cfc0846f72 Mon Sep 17 00:00:00 2001 From: mouuii Date: Wed, 10 Nov 2021 15:55:47 +0800 Subject: [PATCH 318/405] domain Signed-off-by: mouuii --- pkg/cli/initconfig/cmd/init.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/cli/initconfig/cmd/init.go b/pkg/cli/initconfig/cmd/init.go index eb181b5be..be542ae3b 100644 --- a/pkg/cli/initconfig/cmd/init.go +++ b/pkg/cli/initconfig/cmd/init.go @@ -71,7 +71,7 @@ func run() error { func initSystemConfig() error { email := config.AdminEmail() password := config.AdminPassword() - domain := config.AdminDomain() + domain := config.Domain() uid, err := presetSystemAdmin(email, password, domain) if err != nil { -- Gitee From 06ee185fa74806745836b2f5510dbfd5913474e4 Mon Sep 17 00:00:00 2001 From: mouuii Date: Wed, 10 Nov 2021 15:57:56 +0800 Subject: [PATCH 319/405] domain Signed-off-by: mouuii --- pkg/config/config.go | 4 ++-- pkg/setting/consts.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pkg/config/config.go b/pkg/config/config.go index 88104d3b5..ca1e0604f 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -254,6 +254,6 @@ func AdminPassword() string { return viper.GetString(setting.ENVAdminPassword) } -func AdminDomain() string { - return viper.GetString(setting.ENVAdminDomain) +func Domain() string { + return viper.GetString(setting.ENVDomain) } diff --git a/pkg/setting/consts.go b/pkg/setting/consts.go index 58a817859..0545b5568 100644 --- a/pkg/setting/consts.go +++ b/pkg/setting/consts.go @@ -116,7 +116,7 @@ const ( // initconfig ENVAdminEmail = "ADMIN_EMAIL" ENVAdminPassword = "ADMIN_PASSWORD" - ENVAdminDomain = "ADMIN_DOMAIN" + ENVDomain = "ADDRESS" PresetAccount = "admin" ) -- Gitee From dc0a780f832e6db10a24df94abdb57e9ce751381 Mon Sep 17 00:00:00 2001 From: mouuii Date: Wed, 10 Nov 2021 16:18:12 +0800 Subject: [PATCH 320/405] refactor Signed-off-by: mouuii --- .../picket/client/aslan/workflow.go | 2 +- .../picket/core/filter/handler/router.go | 8 -------- .../dev.go => public/handler/public.go} | 17 ++++++++--------- .../picket/core/public/handler/router.go | 19 +++++++++++++++++++ .../dev.go => public/service/public.go} | 4 ++-- pkg/microservice/picket/server/rest/router.go | 8 ++++++++ 6 files changed, 38 insertions(+), 20 deletions(-) rename pkg/microservice/picket/core/{filter/handler/dev.go => public/handler/public.go} (77%) create mode 100644 pkg/microservice/picket/core/public/handler/router.go rename pkg/microservice/picket/core/{filter/service/dev.go => public/service/public.go} (100%) diff --git a/pkg/microservice/picket/client/aslan/workflow.go b/pkg/microservice/picket/client/aslan/workflow.go index 333eb5b04..28e56d8b7 100644 --- a/pkg/microservice/picket/client/aslan/workflow.go +++ b/pkg/microservice/picket/client/aslan/workflow.go @@ -46,7 +46,7 @@ func (c *Client) RestartWorkflowTask(header http.Header, qs url.Values, id strin res, err := c.Delete(url, httpclient.SetHeadersFromHTTPHeader(header), httpclient.SetQueryParamsFromValues(qs)) if err != nil { - return http.StatusInternalServerError, err + return nil, err } return res.StatusCode(), nil diff --git a/pkg/microservice/picket/core/filter/handler/router.go b/pkg/microservice/picket/core/filter/handler/router.go index c4fcfdcbc..421fdc1a5 100644 --- a/pkg/microservice/picket/core/filter/handler/router.go +++ b/pkg/microservice/picket/core/filter/handler/router.go @@ -44,12 +44,4 @@ func (*Router) Inject(router *gin.RouterGroup) { { codehosts.GET("", ListCodeHost) } - dev := router.Group("dev") - { - dev.POST("/workflowTask", CreateWorkflowTask) - dev.DELETE("/workflowTask", CancelWorkflowTask) - dev.POST("/workflowTask/restart", RestartWorkflowTask) - dev.GET("/workflowTask", ListWorkflowTask) - dev.GET("/delivery", ListDelivery) - } } diff --git a/pkg/microservice/picket/core/filter/handler/dev.go b/pkg/microservice/picket/core/public/handler/public.go similarity index 77% rename from pkg/microservice/picket/core/filter/handler/dev.go rename to pkg/microservice/picket/core/public/handler/public.go index a8bc57739..bf76c92d4 100644 --- a/pkg/microservice/picket/core/filter/handler/dev.go +++ b/pkg/microservice/picket/core/public/handler/public.go @@ -2,20 +2,19 @@ package handler import ( "encoding/json" - "io/ioutil" "net/http" "github.com/gin-gonic/gin" - "github.com/koderover/zadig/pkg/microservice/picket/core/filter/service" + service2 "github.com/koderover/zadig/pkg/microservice/picket/core/public/service" internalhandler "github.com/koderover/zadig/pkg/shared/handler" ) func CreateWorkflowTask(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - body, _ := ioutil.ReadAll(c.Request.Body) - res, err := service.CreateWorkflowTask(c.Request.Header, c.Request.URL.Query(), body, ctx.Logger) + body, _ := c.GetRawData() + res, err := service2.CreateWorkflowTask(c.Request.Header, c.Request.URL.Query(), body, ctx.Logger) if err != nil { ctx.Err = err return @@ -48,7 +47,7 @@ func CancelWorkflowTask(c *gin.Context) { defer func() { internalhandler.JSONResponse(c, ctx) }() id := c.Param("id") name := c.Param("name") - statusCode, _ := service.CancelWorkflowTask(c.Request.Header, c.Request.URL.Query(), id, name, ctx.Logger) + statusCode, _ := service2.CancelWorkflowTask(c.Request.Header, c.Request.URL.Query(), id, name, ctx.Logger) var code int var errorMsg string if statusCode == http.StatusOK { @@ -72,7 +71,7 @@ func RestartWorkflowTask(c *gin.Context) { defer func() { internalhandler.JSONResponse(c, ctx) }() id := c.Param("id") name := c.Param("name") - statusCode, _ := service.RestartWorkflowTask(c.Request.Header, c.Request.URL.Query(), id, name, ctx.Logger) + statusCode, _ := service2.RestartWorkflowTask(c.Request.Header, c.Request.URL.Query(), id, name, ctx.Logger) var code int var errorMsg string if statusCode == http.StatusOK { @@ -94,8 +93,8 @@ func RestartWorkflowTask(c *gin.Context) { func ListWorkflowTask(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - commitId := c.Param("commitId") - ctx.Resp, ctx.Err = service.ListWorkflowTask(c.Request.Header, c.Request.URL.Query(), commitId, ctx.Logger) + commitId := c.Query("commitId") + ctx.Resp, ctx.Err = service2.ListWorkflowTask(c.Request.Header, c.Request.URL.Query(), commitId, ctx.Logger) } func ListDelivery(c *gin.Context) { @@ -106,5 +105,5 @@ func ListDelivery(c *gin.Context) { taskIDStr := c.Query("taskId") perPageStr := c.Query("perPage") pageStr := c.Query("page") - ctx.Resp, ctx.Err = service.ListDelivery(c.Request.Header, c.Request.URL.Query(), productName, workflowName, taskIDStr, perPageStr, pageStr, ctx.Logger) + ctx.Resp, ctx.Err = service2.ListDelivery(c.Request.Header, c.Request.URL.Query(), productName, workflowName, taskIDStr, perPageStr, pageStr, ctx.Logger) } diff --git a/pkg/microservice/picket/core/public/handler/router.go b/pkg/microservice/picket/core/public/handler/router.go new file mode 100644 index 000000000..7ae9cf8a7 --- /dev/null +++ b/pkg/microservice/picket/core/public/handler/router.go @@ -0,0 +1,19 @@ +package handler + +import ( + "github.com/gin-gonic/gin" +) + +type Router struct{} + +func (*Router) Inject(router *gin.RouterGroup) { + + dev := router.Group("") + { + dev.POST("/workflowTask/create", CreateWorkflowTask) + dev.DELETE("workflowTask/id/:id/pipelines/:name/cancel", CancelWorkflowTask) + dev.POST("/workflowTask/id/:id/pipelines/:name/restart", RestartWorkflowTask) + dev.GET("/workflowTask", ListWorkflowTask) + dev.GET("/dc/releases", ListDelivery) + } +} diff --git a/pkg/microservice/picket/core/filter/service/dev.go b/pkg/microservice/picket/core/public/service/public.go similarity index 100% rename from pkg/microservice/picket/core/filter/service/dev.go rename to pkg/microservice/picket/core/public/service/public.go index 4b36d9198..787ac43bb 100644 --- a/pkg/microservice/picket/core/filter/service/dev.go +++ b/pkg/microservice/picket/core/public/service/public.go @@ -1,12 +1,12 @@ package service import ( - "github.com/koderover/zadig/pkg/microservice/picket/client/aslan" - "net/http" "net/url" "go.uber.org/zap" + + "github.com/koderover/zadig/pkg/microservice/picket/client/aslan" ) func CreateWorkflowTask(header http.Header, qs url.Values, body []byte, _ *zap.SugaredLogger) ([]byte, error) { diff --git a/pkg/microservice/picket/server/rest/router.go b/pkg/microservice/picket/server/rest/router.go index 3253c5d48..ba02b80eb 100644 --- a/pkg/microservice/picket/server/rest/router.go +++ b/pkg/microservice/picket/server/rest/router.go @@ -21,6 +21,7 @@ import ( evaluationhandler "github.com/koderover/zadig/pkg/microservice/picket/core/evaluation/handler" filterhandler "github.com/koderover/zadig/pkg/microservice/picket/core/filter/handler" + publichandler "github.com/koderover/zadig/pkg/microservice/picket/core/public/handler" ) func (s *engine) injectRouterGroup(router *gin.RouterGroup) { @@ -30,6 +31,13 @@ func (s *engine) injectRouterGroup(router *gin.RouterGroup) { } { r.Inject(router.Group("/api/v1")) } + + for _, r := range []injector{ + new(publichandler.Router), + } { + r.Inject(router.Group("/public-api/v1")) + } + } type injector interface { -- Gitee From 9efe14a22edec2d779d6a6b70a25b946e247de49 Mon Sep 17 00:00:00 2001 From: mouuii Date: Wed, 10 Nov 2021 16:18:54 +0800 Subject: [PATCH 321/405] refactor Signed-off-by: mouuii --- pkg/microservice/picket/client/aslan/workflow.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/microservice/picket/client/aslan/workflow.go b/pkg/microservice/picket/client/aslan/workflow.go index 28e56d8b7..333eb5b04 100644 --- a/pkg/microservice/picket/client/aslan/workflow.go +++ b/pkg/microservice/picket/client/aslan/workflow.go @@ -46,7 +46,7 @@ func (c *Client) RestartWorkflowTask(header http.Header, qs url.Values, id strin res, err := c.Delete(url, httpclient.SetHeadersFromHTTPHeader(header), httpclient.SetQueryParamsFromValues(qs)) if err != nil { - return nil, err + return http.StatusInternalServerError, err } return res.StatusCode(), nil -- Gitee From 0eb434c73437bf91645c71f7526d619e1d8f83f3 Mon Sep 17 00:00:00 2001 From: mouuii Date: Wed, 10 Nov 2021 16:29:55 +0800 Subject: [PATCH 322/405] refactor Signed-off-by: mouuii --- pkg/cli/initconfig/cmd/init.go | 24 +++++++++++++++--------- pkg/cli/initconfig/cmd/rsa.go | 12 ++++++------ 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/pkg/cli/initconfig/cmd/init.go b/pkg/cli/initconfig/cmd/init.go index be542ae3b..8fdca9ac2 100644 --- a/pkg/cli/initconfig/cmd/init.go +++ b/pkg/cli/initconfig/cmd/init.go @@ -19,10 +19,7 @@ package cmd import ( _ "embed" "encoding/base64" - "encoding/json" "fmt" - "net/http" - "strings" "time" "github.com/spf13/cobra" @@ -34,11 +31,18 @@ import ( "github.com/koderover/zadig/pkg/setting" "github.com/koderover/zadig/pkg/shared/client/policy" "github.com/koderover/zadig/pkg/shared/client/user" + "github.com/koderover/zadig/pkg/tool/httpclient" "github.com/koderover/zadig/pkg/tool/log" ) func init() { rootCmd.AddCommand(initCmd) + log.Init(&log.Config{ + Level: config.LogLevel(), + Filename: config.LogFile(), + SendToFile: config.SendLogToFile(), + Development: config.Mode() != setting.ReleaseMode, + }) } //go:embed contributor.yaml @@ -113,7 +117,7 @@ func presetSystemAdmin(email string, password, domain string) (string, error) { // report register err = reportRegister(domain, email) if err != nil { - log.Infof("reportRegister err: %s", err) + log.Errorf("reportRegister err: %s", err) } return user.Uid, nil } @@ -131,16 +135,18 @@ func reportRegister(domain, email string) error { "created_at":%d }` - encrypt, err := RSA_Encrypt([]byte(fmt.Sprintf(uploadStrFmt, domain, email, time.Now().Unix()))) + encrypt, err := RSAEncrypt([]byte(fmt.Sprintf(uploadStrFmt, domain, email, time.Now().Unix()))) if err != nil { return err } encodeString := base64.StdEncoding.EncodeToString(encrypt) resp := Operation{Data: encodeString} - bs, _ := json.Marshal(resp) - _, err = http.Post("https://api.koderover.com/api/operation/admin/user", - "application/json", - strings.NewReader(string(bs))) + //bs, _ := json.Marshal(resp) + //_, err = http.Post("https://api.koderover.com/api/operation/admin/user", + // "application/json", + // strings.NewReader(string(bs))) + + _, err = httpclient.Post("https://api.koderover.com/api/operation/admin/user", httpclient.SetBody(resp), httpclient.ForceContentType("application/json")) return err } diff --git a/pkg/cli/initconfig/cmd/rsa.go b/pkg/cli/initconfig/cmd/rsa.go index 4b25a849c..0d299d768 100644 --- a/pkg/cli/initconfig/cmd/rsa.go +++ b/pkg/cli/initconfig/cmd/rsa.go @@ -6,12 +6,12 @@ import ( "crypto/x509" "encoding/pem" "errors" - "io/ioutil" + "os" ) var pub *rsa.PublicKey -func RSA_Encrypt(plainText []byte) ([]byte, error) { +func RSAEncrypt(plainText []byte) ([]byte, error) { if err := LoadPubKey(""); err != nil { return nil, err } @@ -28,9 +28,9 @@ func RSA_Encrypt(plainText []byte) ([]byte, error) { func LoadPubKey(filename string) (err error) { var block *pem.Block if filename == "" { - block, _ = pem.Decode(defaultPublicKey) + block, _ = pem.Decode([]byte(defaultPublicKey)) } else { - b, err := ioutil.ReadFile(filename) + b, err := os.ReadFile(filename) if err != nil { return err } @@ -47,7 +47,7 @@ func LoadPubKey(filename string) (err error) { return } -var defaultPublicKey = []byte(` +var defaultPublicKey = ` -----BEGIN RSA PUBLIC KEY----- MIIBpTANBgkqhkiG9w0BAQEFAAOCAZIAMIIBjQKCAYQAz5IqagSbovHGXmUf7wTB XrR+DZ0u3p5jsgJW08ISJl83t0rCCGMEtcsRXJU8bE2dIIfndNwvmBiqh13/WnJd @@ -59,4 +59,4 @@ srOnJd65N8anoMGxQqNv+ycAHB9aI1Yrtgue2KKzpI/Fneghd/ZavGVFWKDYoFP3 h7uu0/9B/gn81o2f+c8GSplWB5bALhQH8tJZnvmWZGI9OnrIlWmQZsuUBooTul9Q ZJ/w3sE1Zoxa+Or1/eWijqtIfhukOJBNyGaj+esFg6uEeBgHAgMBAAE= -----END RSA PUBLIC KEY----- -`) +` -- Gitee From b8507b59467b9d447a35cfe2e5e5c955a46b92a2 Mon Sep 17 00:00:00 2001 From: mouuii Date: Wed, 10 Nov 2021 16:30:17 +0800 Subject: [PATCH 323/405] refactor Signed-off-by: mouuii --- pkg/cli/initconfig/cmd/init.go | 11 +++-------- pkg/config/config.go | 4 ---- 2 files changed, 3 insertions(+), 12 deletions(-) diff --git a/pkg/cli/initconfig/cmd/init.go b/pkg/cli/initconfig/cmd/init.go index 8fdca9ac2..f3c984457 100644 --- a/pkg/cli/initconfig/cmd/init.go +++ b/pkg/cli/initconfig/cmd/init.go @@ -75,7 +75,7 @@ func run() error { func initSystemConfig() error { email := config.AdminEmail() password := config.AdminPassword() - domain := config.Domain() + domain := config.SystemAddress() uid, err := presetSystemAdmin(email, password, domain) if err != nil { @@ -140,13 +140,8 @@ func reportRegister(domain, email string) error { return err } encodeString := base64.StdEncoding.EncodeToString(encrypt) - resp := Operation{Data: encodeString} - //bs, _ := json.Marshal(resp) - //_, err = http.Post("https://api.koderover.com/api/operation/admin/user", - // "application/json", - // strings.NewReader(string(bs))) - - _, err = httpclient.Post("https://api.koderover.com/api/operation/admin/user", httpclient.SetBody(resp), httpclient.ForceContentType("application/json")) + reqBody := Operation{Data: encodeString} + _, err = httpclient.Post("https://api.koderover.com/api/operation/admin/user", httpclient.SetBody(reqBody), httpclient.ForceContentType("application/json")) return err } diff --git a/pkg/config/config.go b/pkg/config/config.go index ca1e0604f..92c0d23fc 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -253,7 +253,3 @@ func AdminEmail() string { func AdminPassword() string { return viper.GetString(setting.ENVAdminPassword) } - -func Domain() string { - return viper.GetString(setting.ENVDomain) -} -- Gitee From 87454ffc17bc6c5be421ae4544ffa0adb9c1a890 Mon Sep 17 00:00:00 2001 From: mouuii Date: Wed, 10 Nov 2021 16:31:04 +0800 Subject: [PATCH 324/405] refactor Signed-off-by: mouuii --- pkg/cli/initconfig/cmd/init_test.go | 9 --------- 1 file changed, 9 deletions(-) delete mode 100644 pkg/cli/initconfig/cmd/init_test.go diff --git a/pkg/cli/initconfig/cmd/init_test.go b/pkg/cli/initconfig/cmd/init_test.go deleted file mode 100644 index a7902aecb..000000000 --- a/pkg/cli/initconfig/cmd/init_test.go +++ /dev/null @@ -1,9 +0,0 @@ -package cmd - -import ( - "testing" -) - -func TestRegister(t *testing.T) { - reportRegister("test@register.com", "test") -} -- Gitee From 02e0aa8e6ededfc863f011d3f406104a9d90e95d Mon Sep 17 00:00:00 2001 From: mouuii Date: Wed, 10 Nov 2021 16:31:35 +0800 Subject: [PATCH 325/405] refactor Signed-off-by: mouuii --- pkg/setting/consts.go | 1 - 1 file changed, 1 deletion(-) diff --git a/pkg/setting/consts.go b/pkg/setting/consts.go index 0545b5568..e81dafee7 100644 --- a/pkg/setting/consts.go +++ b/pkg/setting/consts.go @@ -116,7 +116,6 @@ const ( // initconfig ENVAdminEmail = "ADMIN_EMAIL" ENVAdminPassword = "ADMIN_PASSWORD" - ENVDomain = "ADDRESS" PresetAccount = "admin" ) -- Gitee From 9e4d8dda7b730ee9aae3ca6cf513e3082123dfaa Mon Sep 17 00:00:00 2001 From: allenshen Date: Wed, 10 Nov 2021 16:36:51 +0800 Subject: [PATCH 326/405] update code Signed-off-by: allenshen --- .../aslan/core/log/service/log.go | 11 ++++------ pkg/tool/s3/client.go | 21 +++++++++++++++++++ 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/pkg/microservice/aslan/core/log/service/log.go b/pkg/microservice/aslan/core/log/service/log.go index 290b6ba13..73778bc93 100644 --- a/pkg/microservice/aslan/core/log/service/log.go +++ b/pkg/microservice/aslan/core/log/service/log.go @@ -25,8 +25,6 @@ import ( "go.uber.org/zap" - "github.com/aws/aws-sdk-go/aws/awserr" - "github.com/aws/aws-sdk-go/service/s3" "github.com/koderover/zadig/pkg/microservice/aslan/config" commonrepo "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/mongodb" "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/kube" @@ -101,12 +99,11 @@ func getContainerLogFromS3(pipelineName, filenamePrefix string, taskID int64, lo return "", err } fullPath := storage.GetObjectPath(fileName) - err = client.Download(storage.Bucket, fullPath, tempFile) + err = client.DownloadWithOption(storage.Bucket, fullPath, tempFile, &s3tool.DownloadOption{ + IgnoreNotExistError: true, + RetryNum: 3, + }) if err != nil { - //ignore error if log not exist - if e, ok := err.(awserr.Error); ok && e.Code() == s3.ErrCodeNoSuchKey { - return "", nil - } log.Errorf("GetContainerLogFromS3 Download err:%v", err) return "", err } diff --git a/pkg/tool/s3/client.go b/pkg/tool/s3/client.go index cdabe6c69..0128520c9 100644 --- a/pkg/tool/s3/client.go +++ b/pkg/tool/s3/client.go @@ -38,6 +38,15 @@ type Client struct { *s3.S3 } +type DownloadOption struct { + IgnoreNotExistError bool + RetryNum int +} + +var defaultDownloadOption = &DownloadOption{ + RetryNum: 3, +} + func NewClient(endpoint, ak, sk string, insecure, forcedPathStyle bool) (*Client, error) { creds := credentials.NewStaticCredentials(ak, sk, "") config := &aws.Config{ @@ -70,8 +79,17 @@ func (c *Client) ValidateBucket(bucketName string) error { return fmt.Errorf("validate s3 error: given bucket does not exist") } +func (c *Client) DownloadWithOption(bucketName, objectKey, dest string, option *DownloadOption) error { + return c.download(bucketName, objectKey, dest, option) +} + // Download the file to object storage func (c *Client) Download(bucketName, objectKey, dest string) error { + return c.download(bucketName, objectKey, dest, defaultDownloadOption) +} + +func (c *Client) download(bucketName, objectKey, dest string, option *DownloadOption) error { + retry := 0 var err error @@ -83,6 +101,9 @@ func (c *Client) Download(bucketName, objectKey, dest string) error { obj, err1 := c.GetObject(opt) if err1 != nil { if e, ok := err1.(awserr.Error); ok && e.Code() == s3.ErrCodeNoSuchKey { + if option.IgnoreNotExistError { + return nil + } return err1 } -- Gitee From 5de58c5c310a52e71a820b8ed956b678cdb00990 Mon Sep 17 00:00:00 2001 From: allenshen Date: Wed, 10 Nov 2021 16:42:55 +0800 Subject: [PATCH 327/405] update code Signed-off-by: allenshen --- pkg/tool/s3/client.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/tool/s3/client.go b/pkg/tool/s3/client.go index 0128520c9..9f8cd450b 100644 --- a/pkg/tool/s3/client.go +++ b/pkg/tool/s3/client.go @@ -93,7 +93,7 @@ func (c *Client) download(bucketName, objectKey, dest string, option *DownloadOp retry := 0 var err error - for retry < 3 { + for retry < option.RetryNum { opt := &s3.GetObjectInput{ Bucket: aws.String(bucketName), Key: aws.String(objectKey), -- Gitee From 3c97bbc94396c2d9f94aecb896a332e5bc25b352 Mon Sep 17 00:00:00 2001 From: lou Date: Wed, 10 Nov 2021 16:50:51 +0800 Subject: [PATCH 328/405] add api for checking if 3rd-party login is enabled Signed-off-by: lou --- .../user/core/handler/login/third_party.go | 7 +++ pkg/microservice/user/core/handler/router.go | 2 + .../user/core/service/login/third_party.go | 14 +++++ .../user/core/service/user/user.go | 27 +++++----- pkg/microservice/user/server/rest/router.go | 6 +-- pkg/shared/client/systemconfig/connector.go | 52 +++++++++++++++++++ .../{systemconfig.go => email.go} | 21 -------- 7 files changed, 93 insertions(+), 36 deletions(-) create mode 100644 pkg/microservice/user/core/service/login/third_party.go create mode 100644 pkg/shared/client/systemconfig/connector.go rename pkg/shared/client/systemconfig/{systemconfig.go => email.go} (50%) diff --git a/pkg/microservice/user/core/handler/login/third_party.go b/pkg/microservice/user/core/handler/login/third_party.go index 633b0d8c4..6b9dc2f64 100644 --- a/pkg/microservice/user/core/handler/login/third_party.go +++ b/pkg/microservice/user/core/handler/login/third_party.go @@ -42,6 +42,13 @@ func Login(c *gin.Context) { c.Redirect(http.StatusSeeOther, authCodeURL) } +func ThirdPartyLoginEnabled(c *gin.Context) { + ctx := internalhandler.NewContext(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + + ctx.Resp = login.ThirdPartyLoginEnabled() +} + func verifyAndDecode(ctx context.Context, code string) (*login.Claims, error) { oidcCtx := oidc.ClientContext(ctx, http.DefaultClient) oauth2Config := &oauth2.Config{ diff --git a/pkg/microservice/user/core/handler/router.go b/pkg/microservice/user/core/handler/router.go index 7f09d9c5a..7e12cc50b 100644 --- a/pkg/microservice/user/core/handler/router.go +++ b/pkg/microservice/user/core/handler/router.go @@ -50,6 +50,8 @@ func (*Router) Inject(router *gin.RouterGroup) { router.GET("login", login.Login) + router.GET("login-enabled", login.ThirdPartyLoginEnabled) + router.POST("login", login.LocalLogin) router.POST("signup", user.SignUp) diff --git a/pkg/microservice/user/core/service/login/third_party.go b/pkg/microservice/user/core/service/login/third_party.go new file mode 100644 index 000000000..10450db4e --- /dev/null +++ b/pkg/microservice/user/core/service/login/third_party.go @@ -0,0 +1,14 @@ +package login + +import "github.com/koderover/zadig/pkg/shared/client/systemconfig" + +type enabledStatus struct { + Enabled bool `json:"enabled"` +} + +func ThirdPartyLoginEnabled() *enabledStatus { + connectors, _ := systemconfig.New().ListConnectors() + return &enabledStatus{ + Enabled: len(connectors) > 0, + } +} diff --git a/pkg/microservice/user/core/service/user/user.go b/pkg/microservice/user/core/service/user/user.go index 06c2aeeda..d6b0aabe4 100644 --- a/pkg/microservice/user/core/service/user/user.go +++ b/pkg/microservice/user/core/service/user/user.go @@ -6,6 +6,7 @@ import ( "net/url" "time" + "github.com/dexidp/dex/connector/ldap" ldapv3 "github.com/go-ldap/ldap/v3" "github.com/golang-jwt/jwt" "github.com/google/uuid" @@ -93,37 +94,39 @@ func SearchAndSyncUser(ldapId string, logger *zap.SugaredLogger) error { logger.Error("can't find connector") return fmt.Errorf("can't find connector") } - l, err := ldapv3.Dial("tcp", si.Config.Host) + + config := si.Config.(*ldap.Config) + l, err := ldapv3.Dial("tcp", config.Host) if err != nil { - logger.Errorf("ldap dial host:%s error, error msg:%s", si.Config.Host, err) + logger.Errorf("ldap dial host:%s error, error msg:%s", config.Host, err) return err } defer l.Close() - err = l.Bind(si.Config.BindDN, si.Config.BindPW) + err = l.Bind(config.BindDN, config.BindPW) if err != nil { - logger.Errorf("ldap bind host:%s error, error msg:%s", si.Config.Host, err) + logger.Errorf("ldap bind host:%s error, error msg:%s", config.Host, err) return err } searchRequest := ldapv3.NewSearchRequest( - si.Config.GroupSearch.BaseDN, + config.GroupSearch.BaseDN, ldapv3.ScopeWholeSubtree, ldapv3.NeverDerefAliases, 0, 0, false, - si.Config.GroupSearch.Filter, // The filter to apply - []string{si.Config.UserSearch.NameAttr}, // A list attributes to retrieve + config.GroupSearch.Filter, // The filter to apply + []string{config.UserSearch.NameAttr}, // A list attributes to retrieve nil, ) sr, err := l.Search(searchRequest) if err != nil { - logger.Errorf("ldap search host:%s error, error msg:%s", si.Config.Host, err) + logger.Errorf("ldap search host:%s error, error msg:%s", config.Host, err) return err } for _, entry := range sr.Entries { - account := si.Config.UserSearch.Username + account := config.UserSearch.Username name := account - if len(si.Config.UserSearch.NameAttr) != 0 { - name = si.Config.UserSearch.NameAttr + if len(config.UserSearch.NameAttr) != 0 { + name = config.UserSearch.NameAttr } _, err := SyncUser(&SyncUserInfo{ Account: entry.GetAttributeValue(account), @@ -131,7 +134,7 @@ func SearchAndSyncUser(ldapId string, logger *zap.SugaredLogger) error { IdentityType: si.ID, // ldap may have not only one instance, so use id as identityType }, logger) if err != nil { - logger.Errorf("ldap host:%s sync user error, error msg:%s", si.Config.Host, err) + logger.Errorf("ldap host:%s sync user error, error msg:%s", config.Host, err) return err } } diff --git a/pkg/microservice/user/server/rest/router.go b/pkg/microservice/user/server/rest/router.go index d811f5ba4..51139f3a6 100644 --- a/pkg/microservice/user/server/rest/router.go +++ b/pkg/microservice/user/server/rest/router.go @@ -23,10 +23,10 @@ import ( ) func (s *engine) injectRouterGroup(router *gin.RouterGroup) { - for name, r := range map[string]injector{ - "/api/v1": new(handler.Router), + for _, r := range []injector{ + new(handler.Router), } { - r.Inject(router.Group(name)) + r.Inject(router.Group("/api/v1")) } } diff --git a/pkg/shared/client/systemconfig/connector.go b/pkg/shared/client/systemconfig/connector.go new file mode 100644 index 000000000..ad1359ffb --- /dev/null +++ b/pkg/shared/client/systemconfig/connector.go @@ -0,0 +1,52 @@ +package systemconfig + +import ( + "encoding/json" + + "github.com/dexidp/dex/connector/ldap" + + "github.com/koderover/zadig/pkg/tool/httpclient" +) + +type Connector struct { + Type string `json:"type"` + ID string `json:"id"` + Name string `json:"name"` + Config interface{} `json:"config"` +} + +func (c *Client) GetLDAPConnector(id string) (*Connector, error) { + url := "/connectors/" + id + + res := &Connector{} + _, err := c.Get(url, httpclient.SetResult(res)) + if err != nil { + return nil, err + } + + configData, err := json.Marshal(res.Config) + if err != nil { + return nil, err + } + + ldapConfig := &ldap.Config{} + if err = json.Unmarshal(configData, ldapConfig); err != nil { + return nil, err + } + + res.Config = ldapConfig + + return res, err +} + +func (c *Client) ListConnectors() ([]*Connector, error) { + url := "/connectors" + + res := make([]*Connector, 0) + _, err := c.Get(url, httpclient.SetResult(&res)) + if err != nil { + return nil, err + } + + return res, err +} diff --git a/pkg/shared/client/systemconfig/systemconfig.go b/pkg/shared/client/systemconfig/email.go similarity index 50% rename from pkg/shared/client/systemconfig/systemconfig.go rename to pkg/shared/client/systemconfig/email.go index 818a03824..721894144 100644 --- a/pkg/shared/client/systemconfig/systemconfig.go +++ b/pkg/shared/client/systemconfig/email.go @@ -1,18 +1,9 @@ package systemconfig import ( - "github.com/dexidp/dex/connector/ldap" - "github.com/koderover/zadig/pkg/tool/httpclient" ) -type Connector struct { - Type string `json:"type"` - ID string `json:"id"` - Name string `json:"name"` - Config *ldap.Config `json:"config"` -} - type Email struct { Name string `json:"name"` Port int `json:"port"` @@ -20,18 +11,6 @@ type Email struct { Password string `json:"password"` } -func (c *Client) GetLDAPConnector(id string) (*Connector, error) { - url := "/connectors/" + id - - res := &Connector{} - _, err := c.Get(url, httpclient.SetResult(res)) - if err != nil { - return nil, err - } - - return res, err -} - func (c *Client) GetEmailHost() (*Email, error) { url := "/emails/internal/host/" -- Gitee From eb2ceb60ee342f45047bb3965fd75cf47e33d50a Mon Sep 17 00:00:00 2001 From: mouuii Date: Wed, 10 Nov 2021 17:00:55 +0800 Subject: [PATCH 329/405] refactor Signed-off-by: mouuii --- pkg/cli/initconfig/cmd/init.go | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/pkg/cli/initconfig/cmd/init.go b/pkg/cli/initconfig/cmd/init.go index f3c984457..24a15d12b 100644 --- a/pkg/cli/initconfig/cmd/init.go +++ b/pkg/cli/initconfig/cmd/init.go @@ -38,10 +38,7 @@ import ( func init() { rootCmd.AddCommand(initCmd) log.Init(&log.Config{ - Level: config.LogLevel(), - Filename: config.LogFile(), - SendToFile: config.SendLogToFile(), - Development: config.Mode() != setting.ReleaseMode, + Level: config.LogLevel(), }) } @@ -111,7 +108,7 @@ func presetSystemAdmin(email string, password, domain string) (string, error) { Email: email, }) if err != nil { - log.Infof("created admin err:%s", err) + log.Errorf("created admin err:%s", err) return "", err } // report register @@ -141,7 +138,7 @@ func reportRegister(domain, email string) error { } encodeString := base64.StdEncoding.EncodeToString(encrypt) reqBody := Operation{Data: encodeString} - _, err = httpclient.Post("https://api.koderover.com/api/operation/admin/user", httpclient.SetBody(reqBody), httpclient.ForceContentType("application/json")) + _, err = httpclient.Post("https://api.koderover.com/api/operation/admin/user", httpclient.SetBody(reqBody)) return err } -- Gitee From 0b96bb4165af9c7881ae59f9d90ee5aba2b5d4e9 Mon Sep 17 00:00:00 2001 From: lou Date: Wed, 10 Nov 2021 17:03:28 +0800 Subject: [PATCH 330/405] update after review Signed-off-by: lou --- .../user/core/service/login/third_party.go | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/pkg/microservice/user/core/service/login/third_party.go b/pkg/microservice/user/core/service/login/third_party.go index 10450db4e..ba50713ed 100644 --- a/pkg/microservice/user/core/service/login/third_party.go +++ b/pkg/microservice/user/core/service/login/third_party.go @@ -1,13 +1,19 @@ package login -import "github.com/koderover/zadig/pkg/shared/client/systemconfig" +import ( + "github.com/koderover/zadig/pkg/shared/client/systemconfig" + "github.com/koderover/zadig/pkg/tool/log" +) type enabledStatus struct { Enabled bool `json:"enabled"` } func ThirdPartyLoginEnabled() *enabledStatus { - connectors, _ := systemconfig.New().ListConnectors() + connectors, err := systemconfig.New().ListConnectors() + if err != nil { + log.Warnf("Failed to list connectors, err: %s", err) + } return &enabledStatus{ Enabled: len(connectors) > 0, } -- Gitee From 19ff0d327457e3bf0388891e7096732eec640753 Mon Sep 17 00:00:00 2001 From: mouuii Date: Wed, 10 Nov 2021 17:08:48 +0800 Subject: [PATCH 331/405] refactor Signed-off-by: mouuii --- pkg/cli/initconfig/cmd/init.go | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/pkg/cli/initconfig/cmd/init.go b/pkg/cli/initconfig/cmd/init.go index 24a15d12b..d807c165f 100644 --- a/pkg/cli/initconfig/cmd/init.go +++ b/pkg/cli/initconfig/cmd/init.go @@ -19,6 +19,7 @@ package cmd import ( _ "embed" "encoding/base64" + "encoding/json" "fmt" "time" @@ -122,17 +123,22 @@ func presetSystemAdmin(email string, password, domain string) (string, error) { type Operation struct { Data string `json:"data"` } +type Register struct { + Domain string `json:"domain"` + Username string `json:"username"` + Email string `json:"email"` + CreatedAt int64 `json:"created_at"` +} func reportRegister(domain, email string) error { - uploadStrFmt := ` - { - "domain":"%s", - "username":"admin", - "email":"%s", - "created_at":%d - }` - - encrypt, err := RSAEncrypt([]byte(fmt.Sprintf(uploadStrFmt, domain, email, time.Now().Unix()))) + register := Register{ + Domain: domain, + Username: "admin", + Email: email, + CreatedAt: time.Now().Unix(), + } + registerByte, _ := json.Marshal(register) + encrypt, err := RSAEncrypt([]byte(registerByte)) if err != nil { return err } -- Gitee From ea87e84b6a1ba11b51c7380258f491aef54816a5 Mon Sep 17 00:00:00 2001 From: mouuii Date: Wed, 10 Nov 2021 17:09:58 +0800 Subject: [PATCH 332/405] refactor Signed-off-by: mouuii --- pkg/cli/initconfig/cmd/init.go | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/cli/initconfig/cmd/init.go b/pkg/cli/initconfig/cmd/init.go index d807c165f..1d0d67930 100644 --- a/pkg/cli/initconfig/cmd/init.go +++ b/pkg/cli/initconfig/cmd/init.go @@ -140,6 +140,7 @@ func reportRegister(domain, email string) error { registerByte, _ := json.Marshal(register) encrypt, err := RSAEncrypt([]byte(registerByte)) if err != nil { + log.Errorf("RSAEncrypt err: %s", err) return err } encodeString := base64.StdEncoding.EncodeToString(encrypt) -- Gitee From 61c56f2a7c72e7263335d3924317f86b98eadbba Mon Sep 17 00:00:00 2001 From: mouuii Date: Wed, 10 Nov 2021 17:57:20 +0800 Subject: [PATCH 333/405] refactor Signed-off-by: mouuii --- .../picket/core/public/handler/public.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/pkg/microservice/picket/core/public/handler/public.go b/pkg/microservice/picket/core/public/handler/public.go index bf76c92d4..800c0703a 100644 --- a/pkg/microservice/picket/core/public/handler/public.go +++ b/pkg/microservice/picket/core/public/handler/public.go @@ -6,7 +6,7 @@ import ( "github.com/gin-gonic/gin" - service2 "github.com/koderover/zadig/pkg/microservice/picket/core/public/service" + "github.com/koderover/zadig/pkg/microservice/picket/core/public/service" internalhandler "github.com/koderover/zadig/pkg/shared/handler" ) @@ -14,7 +14,7 @@ func CreateWorkflowTask(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() body, _ := c.GetRawData() - res, err := service2.CreateWorkflowTask(c.Request.Header, c.Request.URL.Query(), body, ctx.Logger) + res, err := service.CreateWorkflowTask(c.Request.Header, c.Request.URL.Query(), body, ctx.Logger) if err != nil { ctx.Err = err return @@ -47,7 +47,7 @@ func CancelWorkflowTask(c *gin.Context) { defer func() { internalhandler.JSONResponse(c, ctx) }() id := c.Param("id") name := c.Param("name") - statusCode, _ := service2.CancelWorkflowTask(c.Request.Header, c.Request.URL.Query(), id, name, ctx.Logger) + statusCode, _ := service.CancelWorkflowTask(c.Request.Header, c.Request.URL.Query(), id, name, ctx.Logger) var code int var errorMsg string if statusCode == http.StatusOK { @@ -71,7 +71,7 @@ func RestartWorkflowTask(c *gin.Context) { defer func() { internalhandler.JSONResponse(c, ctx) }() id := c.Param("id") name := c.Param("name") - statusCode, _ := service2.RestartWorkflowTask(c.Request.Header, c.Request.URL.Query(), id, name, ctx.Logger) + statusCode, _ := service.RestartWorkflowTask(c.Request.Header, c.Request.URL.Query(), id, name, ctx.Logger) var code int var errorMsg string if statusCode == http.StatusOK { @@ -94,7 +94,7 @@ func ListWorkflowTask(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() commitId := c.Query("commitId") - ctx.Resp, ctx.Err = service2.ListWorkflowTask(c.Request.Header, c.Request.URL.Query(), commitId, ctx.Logger) + ctx.Resp, ctx.Err = service.ListWorkflowTask(c.Request.Header, c.Request.URL.Query(), commitId, ctx.Logger) } func ListDelivery(c *gin.Context) { @@ -105,5 +105,5 @@ func ListDelivery(c *gin.Context) { taskIDStr := c.Query("taskId") perPageStr := c.Query("perPage") pageStr := c.Query("page") - ctx.Resp, ctx.Err = service2.ListDelivery(c.Request.Header, c.Request.URL.Query(), productName, workflowName, taskIDStr, perPageStr, pageStr, ctx.Logger) + ctx.Resp, ctx.Err = service.ListDelivery(c.Request.Header, c.Request.URL.Query(), productName, workflowName, taskIDStr, perPageStr, pageStr, ctx.Logger) } -- Gitee From 6e6e9870f6c73da8c8bf2e54e32e380371ca6705 Mon Sep 17 00:00:00 2001 From: mouuii Date: Wed, 10 Nov 2021 18:02:02 +0800 Subject: [PATCH 334/405] refactor Signed-off-by: mouuii --- pkg/microservice/picket/client/aslan/workflow.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pkg/microservice/picket/client/aslan/workflow.go b/pkg/microservice/picket/client/aslan/workflow.go index 333eb5b04..c02e7cd45 100644 --- a/pkg/microservice/picket/client/aslan/workflow.go +++ b/pkg/microservice/picket/client/aslan/workflow.go @@ -6,6 +6,7 @@ import ( "net/url" "github.com/koderover/zadig/pkg/tool/httpclient" + "github.com/koderover/zadig/pkg/tool/log" ) func (c *Client) ListTestWorkflows(testName string, header http.Header, qs url.Values) ([]byte, error) { @@ -46,6 +47,7 @@ func (c *Client) RestartWorkflowTask(header http.Header, qs url.Values, id strin res, err := c.Delete(url, httpclient.SetHeadersFromHTTPHeader(header), httpclient.SetQueryParamsFromValues(qs)) if err != nil { + log.Errorf("RestartWorkflowTask err: %s,res: %s", err, string(res.Body())) return http.StatusInternalServerError, err } -- Gitee From 8ee96b7af0517977aecfcc0079175390c257aa54 Mon Sep 17 00:00:00 2001 From: mouuii Date: Wed, 10 Nov 2021 18:06:03 +0800 Subject: [PATCH 335/405] refactor Signed-off-by: mouuii --- pkg/microservice/picket/client/aslan/workflow.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/microservice/picket/client/aslan/workflow.go b/pkg/microservice/picket/client/aslan/workflow.go index c02e7cd45..5bd8014ce 100644 --- a/pkg/microservice/picket/client/aslan/workflow.go +++ b/pkg/microservice/picket/client/aslan/workflow.go @@ -45,7 +45,7 @@ func (c *Client) CancelWorkflowTask(header http.Header, qs url.Values, id string func (c *Client) RestartWorkflowTask(header http.Header, qs url.Values, id string, name string) (statusCode int, err error) { url := fmt.Sprintf("/workflow/workflowtask/id/%s/pipelines/%s/restart", id, name) - res, err := c.Delete(url, httpclient.SetHeadersFromHTTPHeader(header), httpclient.SetQueryParamsFromValues(qs)) + res, err := c.Post(url, httpclient.SetHeadersFromHTTPHeader(header), httpclient.SetQueryParamsFromValues(qs)) if err != nil { log.Errorf("RestartWorkflowTask err: %s,res: %s", err, string(res.Body())) return http.StatusInternalServerError, err -- Gitee From 2ff7de4b61b8818cf4a69151ad39c9565afd2e87 Mon Sep 17 00:00:00 2001 From: mouuii Date: Wed, 10 Nov 2021 18:34:50 +0800 Subject: [PATCH 336/405] add policy Signed-off-by: mouuii --- .../aslan/core/delivery/handler/policy.yaml | 2 ++ .../aslan/core/workflow/handler/policy.yaml | 10 +++++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/pkg/microservice/aslan/core/delivery/handler/policy.yaml b/pkg/microservice/aslan/core/delivery/handler/policy.yaml index 38084a4f4..fe2625dba 100644 --- a/pkg/microservice/aslan/core/delivery/handler/policy.yaml +++ b/pkg/microservice/aslan/core/delivery/handler/policy.yaml @@ -8,6 +8,8 @@ rules: rules: - method: GET endpoint: "/api/aslan/delivery/releases" + - method: GET + endpoint: "/api/directory/dc/releases" - action: delete_delivery alias: "删除版本" description: "" diff --git a/pkg/microservice/aslan/core/workflow/handler/policy.yaml b/pkg/microservice/aslan/core/workflow/handler/policy.yaml index 6a488c637..8afcb9738 100644 --- a/pkg/microservice/aslan/core/workflow/handler/policy.yaml +++ b/pkg/microservice/aslan/core/workflow/handler/policy.yaml @@ -28,6 +28,8 @@ rules: endpoint: "/api/aslan/logs/log/workflow/?*/tasks/?*/tests/test/service/?*" - method: GET endpoint: "/api/aslan/testing/itreport/workflow/?*/id/?*/names/?*/service/?*" + - method: GET + endpoint: "/api/directory/workflowTask" - action: edit_workflow alias: "编辑工作流" description: "" @@ -42,6 +44,8 @@ rules: endpoint: "api/aslan/workflow/workflow" - method: PUT endpoint: "/api/aslan/workflow/workflow/old/?*/new/?*" + - method: POST + endpoint: "/api/directory/workflowTask/create" - action: delete_workflow alias: "删除工作流" description: "" @@ -59,4 +63,8 @@ rules: - method: POST endpoint: "/api/aslan/workflow/workflowtask/id/?*/pipelines/?*/restart" - method: DELETE - endpoint: "/api/aslan/workflow/workflowtask/id/?*/pipelines/?*" \ No newline at end of file + endpoint: "/api/aslan/workflow/workflowtask/id/?*/pipelines/?*" + - method: POST + endpoint: "/api/directory/workflowTask/id/?*/pipelines/?*/restart" + - method: POST + endpoint: "/api/directory/workflowTask/id/?*/pipelines/?*/cancel" \ No newline at end of file -- Gitee From 083b53f2c1c86e1ffc70170699d16a8c5ab7e8d9 Mon Sep 17 00:00:00 2001 From: mouuii Date: Wed, 10 Nov 2021 18:35:36 +0800 Subject: [PATCH 337/405] add policy Signed-off-by: mouuii --- pkg/microservice/aslan/core/workflow/handler/policy.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/microservice/aslan/core/workflow/handler/policy.yaml b/pkg/microservice/aslan/core/workflow/handler/policy.yaml index 8afcb9738..d3563eb39 100644 --- a/pkg/microservice/aslan/core/workflow/handler/policy.yaml +++ b/pkg/microservice/aslan/core/workflow/handler/policy.yaml @@ -67,4 +67,4 @@ rules: - method: POST endpoint: "/api/directory/workflowTask/id/?*/pipelines/?*/restart" - method: POST - endpoint: "/api/directory/workflowTask/id/?*/pipelines/?*/cancel" \ No newline at end of file + endpoint: "/api/directory/workflowTask/id/?*/pipelines/?*/cancel" -- Gitee From 460d040c7556e598030148fa94651dbd51a035b1 Mon Sep 17 00:00:00 2001 From: lou Date: Wed, 10 Nov 2021 19:35:44 +0800 Subject: [PATCH 338/405] add public urls Signed-off-by: lou --- .../aslan/internal/cache/cache.go | 51 ------------------- .../core/service/bundle/exemption_urls.go | 2 +- 2 files changed, 1 insertion(+), 52 deletions(-) delete mode 100644 pkg/microservice/aslan/internal/cache/cache.go diff --git a/pkg/microservice/aslan/internal/cache/cache.go b/pkg/microservice/aslan/internal/cache/cache.go deleted file mode 100644 index b62663558..000000000 --- a/pkg/microservice/aslan/internal/cache/cache.go +++ /dev/null @@ -1,51 +0,0 @@ -/* -Copyright 2021 The KodeRover 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 cache - -import ( - "sync" - - "github.com/coocood/freecache" -) - -const defaultSize = 1024 * 1024 * 10 // 10 Mi - -var once sync.Once -var cache *freecache.Cache - -// Set sets a key, value and expiration for a cache entry and stores it in the cache. -// If the key is larger than 65535 or value is larger than 1/1024 of the cache size, -// the entry will not be written to the cache. expireSeconds <= 0 means no expire, -// but it can be evicted when cache is full. -func Set(key, value []byte, expireSeconds int) error { - once.Do(func() { - cache = initCache(0) - }) - return cache.Set(key, value, expireSeconds) -} - -// Get returns the value or not found error. -func Get(key []byte) ([]byte, error) { - once.Do(func() { - cache = initCache(defaultSize) - }) - return cache.Get(key) -} - -func initCache(size int) *freecache.Cache { - return freecache.NewCache(size) -} diff --git a/pkg/microservice/policy/core/service/bundle/exemption_urls.go b/pkg/microservice/policy/core/service/bundle/exemption_urls.go index b84f56319..cb74c3c83 100644 --- a/pkg/microservice/policy/core/service/bundle/exemption_urls.go +++ b/pkg/microservice/policy/core/service/bundle/exemption_urls.go @@ -42,7 +42,7 @@ var publicURLs = []*policyRule{ }, { Methods: []string{"GET", "POST"}, - Endpoints: []string{"api/v1/login", "api/v1/signup", "api/v1/retrieve"}, + Endpoints: []string{"api/v1/login", "api/v1/signup", "api/v1/retrieve", "api/v1/login-enabled"}, }, { Methods: []string{"GET"}, -- Gitee From fee04c0c3725855e7928e017971474ae75a6be2a Mon Sep 17 00:00:00 2001 From: allenshen Date: Thu, 11 Nov 2021 11:58:17 +0800 Subject: [PATCH 339/405] fix helm deploy timeout bug Signed-off-by: allenshen --- .../core/service/taskplugin/deploy.go | 113 +++++++++++------- 1 file changed, 72 insertions(+), 41 deletions(-) diff --git a/pkg/microservice/warpdrive/core/service/taskplugin/deploy.go b/pkg/microservice/warpdrive/core/service/taskplugin/deploy.go index d82c9e31a..68b22aa8b 100644 --- a/pkg/microservice/warpdrive/core/service/taskplugin/deploy.go +++ b/pkg/microservice/warpdrive/core/service/taskplugin/deploy.go @@ -28,6 +28,7 @@ import ( "github.com/pkg/errors" "go.uber.org/zap" appsv1 "k8s.io/api/apps/v1" + v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/labels" "k8s.io/client-go/rest" "sigs.k8s.io/controller-runtime/pkg/client" @@ -139,22 +140,68 @@ type SelectorBuilder struct { EnvName string } -const ( - // ProductLabel ... - ProductLabel = "s-product" - // GroupLabel ... - GroupLabel = "s-group" - // ServiceLabel ... - ServiceLabel = "s-service" - // ConfigBackupLabel ... - ConfigBackupLabel = "config-backup" - // NamespaceLabel - EnvNameLabel = "s-env" - // EnvName ... - UpdateBy = "update-by" - UpdateByID = "update-by-id" - UpdateTime = "update-time" -) +type ResourceComponentSet struct { + Name string + Kind string + Containers []v1.Container + Annotations map[string]string +} + +func RcsListFromDeployments(source []*appsv1.Deployment) []*ResourceComponentSet { + rcsList := make([]*ResourceComponentSet, 0) + for _, deploy := range source { + rcsList = append(rcsList, &ResourceComponentSet{ + Name: deploy.Name, + Kind: setting.Deployment, + Containers: deploy.Spec.Template.Spec.Containers, + Annotations: deploy.Annotations, + }) + } + return rcsList +} + +func RcsListFromStatefulSets(source []*appsv1.StatefulSet) []*ResourceComponentSet { + rcsList := make([]*ResourceComponentSet, 0) + for _, sfs := range source { + rcsList = append(rcsList, &ResourceComponentSet{ + Name: sfs.Name, + Kind: setting.StatefulSet, + Containers: sfs.Spec.Template.Spec.Containers, + Annotations: sfs.Annotations, + }) + } + return rcsList +} + +// find affected resources(deployment+statefulSet) for helm install or upgrade +// resource type: deployment statefulSet +func (p *DeployTaskPlugin) findHelmAffectedResources(namespace, serviceName string, resList []*ResourceComponentSet) { + for _, res := range resList { + annotation := res.Annotations + if len(annotation) == 0 { + continue + } + // filter by services + if chartRelease, ok := annotation[setting.HelmReleaseNameAnnotation]; ok { + extractedServiceName := util.ExtraServiceName(chartRelease, namespace) + if extractedServiceName != serviceName { + continue + } + } + for _, container := range res.Containers { + resolvedImageUrl := resolveImageUrl(container.Image) + if resolvedImageUrl[setting.PathSearchComponentImage] == p.Task.ContainerName { + p.Log.Infof("%s find match container.name:%s container.image:%s", res.Kind, container.Name, container.Image) + p.Task.ReplaceResources = append(p.Task.ReplaceResources, task.Resource{ + Kind: res.Kind, + Container: container.Name, + Origin: container.Image, + Name: res.Name, + }) + } + } + } +} func (p *DeployTaskPlugin) Run(ctx context.Context, pipelineTask *task.Task, _ *task.PipelineCtx, _ string) { var ( @@ -335,34 +382,18 @@ func (p *DeployTaskPlugin) Run(ctx context.Context, pipelineTask *task.Task, _ * helmClient helmclient.Client ) - deployments, _ := getter.ListDeployments(p.Task.Namespace, nil, p.kubeClient) - for _, deploy := range deployments { - for _, container := range deploy.Spec.Template.Spec.Containers { - if strings.Contains(container.Image, p.Task.ContainerName) { - p.Log.Infof("deployments find match container.name:%s", container.Name) - p.Task.ReplaceResources = append(p.Task.ReplaceResources, task.Resource{ - Kind: setting.Deployment, - Container: container.Name, - Origin: container.Image, - Name: deploy.Name, - }) - } - } + deployments, err := getter.ListDeployments(p.Task.Namespace, nil, p.kubeClient) + if err != nil { + p.Log.Errorf("failed to list deployments in namespace %s, productName %s, err %s", p.Task.Namespace, p.Task.ProductName, err) + } else { + p.findHelmAffectedResources(p.Task.Namespace, p.Task.ServiceName, RcsListFromDeployments(deployments)) } statefulSets, _ := getter.ListStatefulSets(p.Task.Namespace, nil, p.kubeClient) - for _, sts := range statefulSets { - for _, container := range sts.Spec.Template.Spec.Containers { - if strings.Contains(container.Image, p.Task.ContainerName) { - p.Log.Infof("statefulSets find match container.name:%s", container.Name) - p.Task.ReplaceResources = append(p.Task.ReplaceResources, task.Resource{ - Kind: setting.StatefulSet, - Container: container.Name, - Origin: container.Image, - Name: sts.Name, - }) - } - } + if err != nil { + p.Log.Errorf("failed to list statefulsets in namespace %s, productName %s, err %s", p.Task.Namespace, p.Task.ProductName, err) + } else { + p.findHelmAffectedResources(p.Task.Namespace, p.Task.ServiceName, RcsListFromStatefulSets(statefulSets)) } p.Log.Infof("start helm deploy, productName %s serviceName %s containerName %s namespace %s", p.Task.ProductName, -- Gitee From c2446d9a2065746871ddbf11084dfeccffa6c389 Mon Sep 17 00:00:00 2001 From: panxunying <641770806@qq.com> Date: Thu, 11 Nov 2021 15:10:15 +0800 Subject: [PATCH 340/405] optimize Signed-off-by: panxunying <641770806@qq.com> --- .../user/core/handler/login/third_party.go | 6 +++--- pkg/microservice/user/core/service/login/local.go | 10 +++++++--- pkg/microservice/user/core/service/login/token.go | 4 ++-- pkg/microservice/user/core/service/user/user.go | 12 +++++++++--- 4 files changed, 21 insertions(+), 11 deletions(-) diff --git a/pkg/microservice/user/core/handler/login/third_party.go b/pkg/microservice/user/core/handler/login/third_party.go index 6b9dc2f64..afb951f6f 100644 --- a/pkg/microservice/user/core/handler/login/third_party.go +++ b/pkg/microservice/user/core/handler/login/third_party.go @@ -112,16 +112,16 @@ func Callback(c *gin.Context) { } user, err := user.SyncUser(&user.SyncUserInfo{ - Account: claims.Name, + Account: claims.FederatedClaims.UserId, Name: claims.Name, + Email: claims.Email, IdentityType: claims.FederatedClaims.ConnectorId, }, ctx.Logger) if err != nil { ctx.Err = err return } - claims.Uid = user.UID - claims.Account = claims.Name + claims.UID = user.UID claims.StandardClaims.ExpiresAt = time.Now().Add(time.Duration(config.TokenExpiresAt()) * time.Minute).Unix() userToken, err := login.CreateToken(claims) if err != nil { diff --git a/pkg/microservice/user/core/service/login/local.go b/pkg/microservice/user/core/service/login/local.go index 60906169b..6b0c1f004 100644 --- a/pkg/microservice/user/core/service/login/local.go +++ b/pkg/microservice/user/core/service/login/local.go @@ -63,13 +63,17 @@ func LocalLogin(args *LoginArgs, logger *zap.SugaredLogger) (*User, error) { return nil, err } token, err := CreateToken(&Claims{ - Name: user.Name, - Account: user.Account, - Uid: user.UID, + Name: user.Name, + UID: user.UID, + Email: user.Email, StandardClaims: jwt.StandardClaims{ Audience: setting.ProductName, ExpiresAt: time.Now().Add(24 * time.Hour).Unix(), }, + FederatedClaims: FederatedClaims{ + ConnectorId: user.IdentityType, + UserId: user.Account, + }, }) if err != nil { logger.Errorf("LocalLogin user:%s create token error, error msg:%s", args.Account, err.Error()) diff --git a/pkg/microservice/user/core/service/login/token.go b/pkg/microservice/user/core/service/login/token.go index 734e19b5a..dfa3d4fbf 100644 --- a/pkg/microservice/user/core/service/login/token.go +++ b/pkg/microservice/user/core/service/login/token.go @@ -8,8 +8,8 @@ import ( type Claims struct { Name string `json:"name"` - Account string `json:"account"` - Uid string `json:"uid"` + Email string `json:"email"` + UID string `json:"uid"` FederatedClaims FederatedClaims `json:"federated_claims"` jwt.StandardClaims } diff --git a/pkg/microservice/user/core/service/user/user.go b/pkg/microservice/user/core/service/user/user.go index d6b0aabe4..3048d56c9 100644 --- a/pkg/microservice/user/core/service/user/user.go +++ b/pkg/microservice/user/core/service/user/user.go @@ -77,6 +77,7 @@ type SyncUserInfo struct { Account string `json:"account"` IdentityType string `json:"identityType"` Name string `json:"name"` + Email string `json:"email"` } type RetrieveResp struct { @@ -131,6 +132,7 @@ func SearchAndSyncUser(ldapId string, logger *zap.SugaredLogger) error { _, err := SyncUser(&SyncUserInfo{ Account: entry.GetAttributeValue(account), Name: name, + Email: config.UserSearch.EmailAttr, IdentityType: si.ID, // ldap may have not only one instance, so use id as identityType }, logger) if err != nil { @@ -308,13 +310,17 @@ func Retrieve(account string, logger *zap.SugaredLogger) (*RetrieveResp, error) } token, err := login.CreateToken(&login.Claims{ - Name: user.Name, - Account: user.Account, - Uid: user.UID, + Name: user.Name, + UID: user.UID, + Email: user.Email, StandardClaims: jwt.StandardClaims{ Audience: setting.ProductName, ExpiresAt: time.Now().Add(5 * time.Minute).Unix(), }, + FederatedClaims: login.FederatedClaims{ + UserId: user.Account, + ConnectorId: user.IdentityType, + }, }) if err != nil { logger.Errorf("Retrieve user:%s create token error, error msg:%s", user.Account, err) -- Gitee From 3055c0a503a5d13717d96395ac812d45fb59e3ae Mon Sep 17 00:00:00 2001 From: mouuii Date: Thu, 11 Nov 2021 16:28:08 +0800 Subject: [PATCH 341/405] * Signed-off-by: mouuii --- pkg/microservice/aslan/core/project/service/project.go | 2 +- pkg/microservice/picket/core/filter/service/project.go | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/pkg/microservice/aslan/core/project/service/project.go b/pkg/microservice/aslan/core/project/service/project.go index 31f290392..2b35cd782 100644 --- a/pkg/microservice/aslan/core/project/service/project.go +++ b/pkg/microservice/aslan/core/project/service/project.go @@ -60,7 +60,7 @@ type ProjectMinimalRepresentation struct { } func (o *ProjectListOptions) InNames() []string { - if len(o.Names) == 0 || (len(o.Names) == 1 && o.Names[0] == allProjects) { + if len(o.Names) == 0 { return []string{} } diff --git a/pkg/microservice/picket/core/filter/service/project.go b/pkg/microservice/picket/core/filter/service/project.go index 1b0d45c6a..fded8d7b1 100644 --- a/pkg/microservice/picket/core/filter/service/project.go +++ b/pkg/microservice/picket/core/filter/service/project.go @@ -110,8 +110,10 @@ func ListProjects(header http.Header, qs url.Values, logger *zap.SugaredLogger) return []byte("[]"), nil } - for _, name := range names { - qs.Add("names", name) + if !(len(names) == 1 && names[0] == "*") { + for _, name := range names { + qs.Add("names", name) + } } aslanClient := aslan.New() -- Gitee From 22f33c33cf909835c9f3327990bd410f5d9e5413 Mon Sep 17 00:00:00 2001 From: mouuii Date: Thu, 11 Nov 2021 16:30:19 +0800 Subject: [PATCH 342/405] * Signed-off-by: mouuii --- pkg/microservice/aslan/core/project/service/project.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/pkg/microservice/aslan/core/project/service/project.go b/pkg/microservice/aslan/core/project/service/project.go index 2b35cd782..aafa38989 100644 --- a/pkg/microservice/aslan/core/project/service/project.go +++ b/pkg/microservice/aslan/core/project/service/project.go @@ -30,8 +30,6 @@ const ( VerbosityDetailed QueryVerbosity = "detailed" // all information VerbosityBrief QueryVerbosity = "brief" // short information or a summary VerbosityMinimal QueryVerbosity = "minimal" // very little information, usually only a resource identifier - - allProjects = "*" ) type ProjectListOptions struct { -- Gitee From 8da4abe2e24f152f5543b94ed2fe5a8ecbeae684 Mon Sep 17 00:00:00 2001 From: mouuii Date: Thu, 11 Nov 2021 17:47:19 +0800 Subject: [PATCH 343/405] * Signed-off-by: mouuii --- .../aslan/core/project/service/project.go | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/pkg/microservice/aslan/core/project/service/project.go b/pkg/microservice/aslan/core/project/service/project.go index aafa38989..314d9ef67 100644 --- a/pkg/microservice/aslan/core/project/service/project.go +++ b/pkg/microservice/aslan/core/project/service/project.go @@ -57,14 +57,6 @@ type ProjectMinimalRepresentation struct { Name string `json:"name"` } -func (o *ProjectListOptions) InNames() []string { - if len(o.Names) == 0 { - return []string{} - } - - return o.Names -} - func ListProjects(opts *ProjectListOptions, logger *zap.SugaredLogger) (interface{}, error) { switch opts.Verbosity { case VerbosityDetailed: @@ -150,7 +142,7 @@ func listBriefProjectInfos(opts *ProjectListOptions, logger *zap.SugaredLogger) func listMinimalProjectInfos(opts *ProjectListOptions, logger *zap.SugaredLogger) ([]*ProjectMinimalRepresentation, error) { var res []*ProjectMinimalRepresentation - names, err := templaterepo.NewProductColl().ListNames(opts.InNames()) + names, err := templaterepo.NewProductColl().ListNames(opts.Names) if err != nil { logger.Errorf("Failed to list project names, err: %s", err) return nil, err @@ -187,7 +179,7 @@ func listMinimalProjectInfos(opts *ProjectListOptions, logger *zap.SugaredLogger } func getProjectsWithEnvs(opts *ProjectListOptions) (sets.String, map[string][]string, error) { - nameWithEnvs, err := mongodb.NewProductColl().ListProjectsInNames(opts.InNames()) + nameWithEnvs, err := mongodb.NewProductColl().ListProjectsInNames(opts.Names) if err != nil { return nil, nil, err } @@ -203,7 +195,7 @@ func getProjectsWithEnvs(opts *ProjectListOptions) (sets.String, map[string][]st } func getProjects(opts *ProjectListOptions) (sets.String, map[string]*templaterepo.ProjectInfo, error) { - res, err := templaterepo.NewProductColl().ListProjectBriefs(opts.InNames()) + res, err := templaterepo.NewProductColl().ListProjectBriefs(opts.Names) if err != nil { return nil, nil, err } -- Gitee From 3bb1142b34258149abeba6d90f435a2d14127064 Mon Sep 17 00:00:00 2001 From: panxunying <641770806@qq.com> Date: Thu, 11 Nov 2021 20:16:57 +0800 Subject: [PATCH 344/405] optimize Signed-off-by: panxunying <641770806@qq.com> --- .../user/core/handler/login/third_party.go | 2 +- .../user/core/service/login/local.go | 7 ++++--- .../user/core/service/login/token.go | 9 +++++---- pkg/microservice/user/core/service/user/user.go | 16 ++++++++++++++-- 4 files changed, 24 insertions(+), 10 deletions(-) diff --git a/pkg/microservice/user/core/handler/login/third_party.go b/pkg/microservice/user/core/handler/login/third_party.go index afb951f6f..b9cd4a89b 100644 --- a/pkg/microservice/user/core/handler/login/third_party.go +++ b/pkg/microservice/user/core/handler/login/third_party.go @@ -112,7 +112,7 @@ func Callback(c *gin.Context) { } user, err := user.SyncUser(&user.SyncUserInfo{ - Account: claims.FederatedClaims.UserId, + Account: claims.PreferredUsername, Name: claims.Name, Email: claims.Email, IdentityType: claims.FederatedClaims.ConnectorId, diff --git a/pkg/microservice/user/core/service/login/local.go b/pkg/microservice/user/core/service/login/local.go index 6b0c1f004..83a8ecb55 100644 --- a/pkg/microservice/user/core/service/login/local.go +++ b/pkg/microservice/user/core/service/login/local.go @@ -63,9 +63,10 @@ func LocalLogin(args *LoginArgs, logger *zap.SugaredLogger) (*User, error) { return nil, err } token, err := CreateToken(&Claims{ - Name: user.Name, - UID: user.UID, - Email: user.Email, + Name: user.Name, + UID: user.UID, + Email: user.Email, + PreferredUsername: user.Account, StandardClaims: jwt.StandardClaims{ Audience: setting.ProductName, ExpiresAt: time.Now().Add(24 * time.Hour).Unix(), diff --git a/pkg/microservice/user/core/service/login/token.go b/pkg/microservice/user/core/service/login/token.go index dfa3d4fbf..bc24988e4 100644 --- a/pkg/microservice/user/core/service/login/token.go +++ b/pkg/microservice/user/core/service/login/token.go @@ -7,10 +7,11 @@ import ( ) type Claims struct { - Name string `json:"name"` - Email string `json:"email"` - UID string `json:"uid"` - FederatedClaims FederatedClaims `json:"federated_claims"` + Name string `json:"name"` + Email string `json:"email"` + UID string `json:"uid"` + PreferredUsername string `json:"preferred_username"` + FederatedClaims FederatedClaims `json:"federated_claims"` jwt.StandardClaims } diff --git a/pkg/microservice/user/core/service/user/user.go b/pkg/microservice/user/core/service/user/user.go index 3048d56c9..5bebb4687 100644 --- a/pkg/microservice/user/core/service/user/user.go +++ b/pkg/microservice/user/core/service/user/user.go @@ -131,8 +131,8 @@ func SearchAndSyncUser(ldapId string, logger *zap.SugaredLogger) error { } _, err := SyncUser(&SyncUserInfo{ Account: entry.GetAttributeValue(account), - Name: name, - Email: config.UserSearch.EmailAttr, + Name: entry.GetAttributeValue(name), + Email: entry.GetAttributeValue(config.UserSearch.EmailAttr), IdentityType: si.ID, // ldap may have not only one instance, so use id as identityType }, logger) if err != nil { @@ -491,6 +491,7 @@ func SyncUser(syncUserInfo *SyncUserInfo, logger *zap.SugaredLogger) (*models.Us UID: uid.String(), Name: syncUserInfo.Name, Account: syncUserInfo.Account, + Email: syncUserInfo.Email, IdentityType: syncUserInfo.IdentityType, } err = orm.CreateUser(user, tx) @@ -499,6 +500,17 @@ func SyncUser(syncUserInfo *SyncUserInfo, logger *zap.SugaredLogger) (*models.Us logger.Error("SyncUser create user:%s error, error msg:%s", syncUserInfo.Account, err.Error()) return nil, err } + } else { + err = orm.UpdateUser(user.UID, &models.User{ + Name: syncUserInfo.Name, + Account: syncUserInfo.Account, + Email: syncUserInfo.Email, + }, tx) + if err != nil { + tx.Rollback() + logger.Error("SyncUser update user:%s error, error msg:%s", syncUserInfo.Account, err.Error()) + return nil, err + } } userLogin, err := orm.GetUserLogin(user.UID, user.Account, config.AccountLoginType, tx) if err != nil { -- Gitee From a57afd38d800b0b13e350723e17e127894ea3967 Mon Sep 17 00:00:00 2001 From: lou Date: Thu, 11 Nov 2021 21:37:16 +0800 Subject: [PATCH 345/405] fix github webhook Signed-off-by: lou --- pkg/cli/upgradeassistant/cmd/migrate/170.go | 61 ++++++------------- .../core/workflow/service/webhook/github.go | 43 ++++++------- pkg/tool/git/github/repositories.go | 7 +-- 3 files changed, 37 insertions(+), 74 deletions(-) diff --git a/pkg/cli/upgradeassistant/cmd/migrate/170.go b/pkg/cli/upgradeassistant/cmd/migrate/170.go index c0bbc2e2f..71f721a05 100644 --- a/pkg/cli/upgradeassistant/cmd/migrate/170.go +++ b/pkg/cli/upgradeassistant/cmd/migrate/170.go @@ -67,20 +67,19 @@ func refreshWebHookSecret() error { return err } - cs := toCodeHostSet(codeHosts) for _, hook := range hooks { var cl hookRefresher - ch, ok := cs[codeHostUniqueID{address: hook.Address, owner: hook.Owner}] - if !ok { + ch := getCodeHostByAddressAndOwner(hook.Address, hook.Owner, codeHosts) + if ch == nil { log.Warnf("Failed to get codehost for %s/%s", hook.Address, hook.Owner) continue } switch ch.Type { case setting.SourceFromGithub: - cl = github.NewClient(ch.accessToken, config.ProxyHTTPSAddr()) + cl = github.NewClient(ch.AccessToken, config.ProxyHTTPSAddr()) case setting.SourceFromGitlab: - cl, err = gitlab.NewClient(ch.address, ch.accessToken) + cl, err = gitlab.NewClient(ch.Address, ch.AccessToken) if err != nil { log.Warnf("Failed to create gitlab client, err: %s", err) continue @@ -99,45 +98,19 @@ func refreshWebHookSecret() error { return nil } -type codeHostUniqueID struct { - address, owner string -} - -type codeHostItem struct { - codeHostUniqueID - accessToken string - Type string -} - -type codeHostSet map[codeHostUniqueID]codeHostItem - -// NewCodeHostSet creates a HookSet from a list of values. -func NewCodeHostSet(items ...codeHostItem) codeHostSet { - ss := codeHostSet{} - ss.Insert(items...) - return ss -} - -// Insert adds items to the set. -func (s codeHostSet) Insert(items ...codeHostItem) codeHostSet { - for _, item := range items { - s[item.codeHostUniqueID] = item - } - return s -} - -func toCodeHostSet(codeHosts []*systemconfig.CodeHost) codeHostSet { - res := NewCodeHostSet() - for _, h := range codeHosts { - res.Insert(codeHostItem{ - codeHostUniqueID: codeHostUniqueID{ - address: h.Address, - owner: h.Namespace, - }, - accessToken: h.AccessToken, - Type: h.Type, - }) +func getCodeHostByAddressAndOwner(address, owner string, all []*systemconfig.CodeHost) *systemconfig.CodeHost { + for _, one := range all { + if one.Address != address { + continue + } + // it is a limitation, we support only one gitlab account before + if one.Type == "gitlab" { + return one + } + if one.Namespace == owner { + return one + } } - return res + return nil } diff --git a/pkg/microservice/aslan/core/workflow/service/webhook/github.go b/pkg/microservice/aslan/core/workflow/service/webhook/github.go index 26cc03b88..07af078ca 100644 --- a/pkg/microservice/aslan/core/workflow/service/webhook/github.go +++ b/pkg/microservice/aslan/core/workflow/service/webhook/github.go @@ -49,32 +49,31 @@ const ( payloadFormParam = "payload" ) -func ProcessGithubHook(payload []byte, req *http.Request, requestID string, log *zap.SugaredLogger) (output string, err error) { +func ProcessGithubHook(payload []byte, req *http.Request, requestID string, log *zap.SugaredLogger) (string, error) { hookType := github.WebHookType(req) if hookType == "integration_installation" || hookType == "installation" || hookType == "ping" { - output = fmt.Sprintf("event %s received", hookType) - return + return fmt.Sprintf("event %s received", hookType), nil } hookSecret := gitservice.GetHookSecret() - if hookSecret == "" { var headers []string for header := range req.Header { headers = append(headers, fmt.Sprintf("%s: %s", header, req.Header.Get(header))) } - log.Infof("[Webhook] hook headers: \n %s", strings.Join(headers, "\n ")) } - err = validateSecret(payload, []byte(hookSecret), req) + err := validateSecret(payload, []byte(hookSecret), req) if err != nil { - return + log.Errorf("Failed to validate secret, err: %s", err) + return "", err } event, err := github.ParseWebHook(github.WebHookType(req), payload) if err != nil { - return + log.Errorf("Failed to parse webhook, err: %s", err) + return "", err } deliveryID := github.DeliveryID(req) @@ -85,15 +84,13 @@ func ProcessGithubHook(payload []byte, req *http.Request, requestID string, log switch et := event.(type) { case *github.PullRequestEvent: if *et.Action != "opened" && *et.Action != "synchronize" && *et.Action != "reopened" { - output = fmt.Sprintf("action %s is skipped", *et.Action) - return + return fmt.Sprintf("action %s is skipped", *et.Action), nil } tasks, err = prEventToPipelineTasks(et, requestID, log) if err != nil { log.Errorf("prEventToPipelineTasks error: %v", err) - err = e.ErrGithubWebHook.AddErr(err) - return + return "", e.ErrGithubWebHook.AddErr(err) } case *github.PushEvent: @@ -111,40 +108,34 @@ func ProcessGithubHook(payload []byte, req *http.Request, requestID string, log tasks, err = pushEventToPipelineTasks(et, requestID, log) if err != nil { - log.Infof("pushEventToPipelineTasks error: %v", err) - err = e.ErrGithubWebHook.AddErr(err) - return + log.Errorf("pushEventToPipelineTasks error: %v", err) + return "", e.ErrGithubWebHook.AddErr(err) } case *github.CheckRunEvent: // The action performed. Can be "created", "updated", "rerequested" or "requested_action". if *et.Action != "rerequested" { - output = fmt.Sprintf("action %s is skipped", *et.Action) - return + return fmt.Sprintf("action %s is skipped", *et.Action), nil } id := et.CheckRun.GetExternalID() items := strings.Split(id, "/") if len(items) != 2 { - err = fmt.Errorf("invalid CheckRun ExternalID %s", id) - return + return "", fmt.Errorf("invalid CheckRun ExternalID %s", id) } pipeName := items[0] var taskID int64 taskID, err = strconv.ParseInt(items[1], 10, 64) if err != nil { - err = fmt.Errorf("invalid taskID in CheckRun ExternalID %s", id) - return + return "", fmt.Errorf("invalid taskID in CheckRun ExternalID %s", id) } if err = workflowservice.RestartPipelineTaskV2("CheckRun", taskID, pipeName, config.SingleType, log); err != nil { - err = e.ErrGithubWebHook.AddErr(err) - return + return "", e.ErrGithubWebHook.AddErr(err) } default: - output = fmt.Sprintf("event %s not support", hookType) - return + return fmt.Sprintf("event %s not support", hookType), nil } for _, task := range tasks { @@ -158,7 +149,7 @@ func ProcessGithubHook(payload []byte, req *http.Request, requestID string, log log.Infof("[Webhook] %s triggered task %s:%d", deliveryID, task.PipelineName, resp.TaskID) } - return + return "", nil } func validateSecret(payload, secretKey []byte, r *http.Request) error { diff --git a/pkg/tool/git/github/repositories.go b/pkg/tool/git/github/repositories.go index 4d38997c9..5bba3419c 100644 --- a/pkg/tool/git/github/repositories.go +++ b/pkg/tool/git/github/repositories.go @@ -200,12 +200,11 @@ func (c *Client) CreateHook(ctx context.Context, owner, repo string, hook *git.H func (c *Client) UpdateHook(ctx context.Context, owner, repo string, id int64, hook *git.Hook) (*github.Hook, error) { h := &github.Hook{ Config: map[string]interface{}{ - "secret": hook.Secret, + "url": hook.URL, + "content_type": "json", + "secret": hook.Secret, }, } - if hook.URL != "" { - h.Config["url"] = hook.URL - } if len(hook.Events) > 0 { h.Events = hook.Events } -- Gitee From 6e3a8ff967bbabb44f8069f8ae75726d457c8410 Mon Sep 17 00:00:00 2001 From: allenshen Date: Fri, 12 Nov 2021 11:41:42 +0800 Subject: [PATCH 346/405] fix dockerfile panic error Signed-off-by: allenshen --- .../core/common/service/template_store.go | 27 +++++++ .../workflow/service/workflow/nsq_handlers.go | 74 +++++++++++-------- 2 files changed, 72 insertions(+), 29 deletions(-) create mode 100644 pkg/microservice/aslan/core/common/service/template_store.go diff --git a/pkg/microservice/aslan/core/common/service/template_store.go b/pkg/microservice/aslan/core/common/service/template_store.go new file mode 100644 index 000000000..b97b14a90 --- /dev/null +++ b/pkg/microservice/aslan/core/common/service/template_store.go @@ -0,0 +1,27 @@ +/* +Copyright 2021 The KodeRover 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 service + +import "github.com/koderover/zadig/pkg/microservice/aslan/core/templatestore/repository/mongodb" + +func GetDockerfileTemplateContent(id string) (string, error) { + dockerfileTemplate, err := mongodb.NewDockerfileTemplateColl().GetById(id) + if err != nil { + return "", err + } + return dockerfileTemplate.Content, nil +} diff --git a/pkg/microservice/aslan/core/workflow/service/workflow/nsq_handlers.go b/pkg/microservice/aslan/core/workflow/service/workflow/nsq_handlers.go index b71b9e887..ec167e968 100644 --- a/pkg/microservice/aslan/core/workflow/service/workflow/nsq_handlers.go +++ b/pkg/microservice/aslan/core/workflow/service/workflow/nsq_handlers.go @@ -49,6 +49,7 @@ import ( "github.com/koderover/zadig/pkg/tool/git/gitlab" "github.com/koderover/zadig/pkg/tool/log" s3tool "github.com/koderover/zadig/pkg/tool/s3" + "github.com/koderover/zadig/pkg/types" "github.com/koderover/zadig/pkg/util" ) @@ -212,6 +213,49 @@ func (h *TaskAckHandler) handle(message *nsq.Message) error { return nil } +func (h *TaskAckHandler) getDockerfileContent(build *types.Repository, ctx *task.DockerBuildCtx) string { + switch ctx.Source { + case setting.ServiceSourceTemplate: + content, err := commonservice.GetDockerfileTemplateContent(ctx.TemplateID) + if err != nil { + h.log.Errorf("Failed to get dockerfile template content, err: %v", err) + return "" + } + return content + default: + path := ctx.DockerFile + pathArray := strings.Split(path, "/") + dockerfilePath := path[len(pathArray[0])+1:] + if strings.Contains(build.Address, "gitlab") { + cli, err := gitlab.NewClient(build.Address, build.OauthToken) + if err != nil { + h.log.Errorf("Failed to get gitlab client, err: %v", err) + return "" + } + content, err := cli.GetRawFile(build.RepoOwner, build.RepoName, build.Branch, dockerfilePath) + if err != nil { + h.log.Errorf("uploadTaskData gitlab GetRawFile err:%v", err) + return "" + } + return string(content) + } else { + gitClient := git.NewClient(build.OauthToken, config.ProxyHTTPSAddr()) + fileContent, _, _, _ := gitClient.Repositories.GetContents(context.Background(), build.RepoOwner, build.RepoName, dockerfilePath, nil) + if fileContent != nil { + dockerfileContent := *fileContent.Content + dockerfileContent = dockerfileContent[:len(dockerfileContent)-2] + content, err := base64.StdEncoding.DecodeString(dockerfileContent) + if err != nil { + h.log.Errorf("uploadTaskData github GetRawFile err:%v", err) + return "" + } + return string(content) + } + } + return "" + } +} + func (h *TaskAckHandler) uploadTaskData(pt *task.Task) error { deliveryArtifacts := make([]*commonmodels.DeliveryArtifact, 0) if pt.Type == config.WorkflowType { @@ -289,35 +333,7 @@ func (h *TaskAckHandler) uploadTaskData(pt *task.Task) error { if buildInfo.JobCtx.DockerBuildCtx != nil { for _, build := range buildInfo.JobCtx.Builds { - path := buildInfo.JobCtx.DockerBuildCtx.DockerFile - pathArray := strings.Split(path, "/") - dockerfilePath := path[len(pathArray[0])+1:] - if strings.Contains(build.Address, "gitlab") { - cli, err := gitlab.NewClient(build.Address, build.OauthToken) - if err != nil { - h.log.Errorf("Failed to get gitlab client, err: %v", err) - continue - } - content, err := cli.GetRawFile(build.RepoOwner, build.RepoName, build.Branch, dockerfilePath) - if err != nil { - h.log.Errorf("uploadTaskData gitlab GetRawFile err:%v", err) - continue - } - deliveryArtifact.DockerFile = string(content) - } else { - gitClient := git.NewClient(build.OauthToken, config.ProxyHTTPSAddr()) - fileContent, _, _, _ := gitClient.Repositories.GetContents(context.Background(), build.RepoOwner, build.RepoName, dockerfilePath, nil) - if fileContent != nil { - dockerfileContent := *fileContent.Content - dockerfileContent = dockerfileContent[:len(dockerfileContent)-2] - content, err := base64.StdEncoding.DecodeString(dockerfileContent) - if err != nil { - h.log.Errorf("uploadTaskData github GetRawFile err:%v", err) - continue - } - deliveryArtifact.DockerFile = string(content) - } - } + deliveryArtifact.DockerFile = h.getDockerfileContent(build, buildInfo.JobCtx.DockerBuildCtx) } } deliveryArtifactArray = append(deliveryArtifactArray, deliveryArtifact) -- Gitee From e824773d89f048156b2594b0becca08e1d09fe21 Mon Sep 17 00:00:00 2001 From: lou Date: Fri, 12 Nov 2021 13:47:26 +0800 Subject: [PATCH 347/405] fix podexec permission --- pkg/microservice/aslan/core/environment/handler/policy.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/microservice/aslan/core/environment/handler/policy.yaml b/pkg/microservice/aslan/core/environment/handler/policy.yaml index 5ff750e69..45b7ef419 100644 --- a/pkg/microservice/aslan/core/environment/handler/policy.yaml +++ b/pkg/microservice/aslan/core/environment/handler/policy.yaml @@ -79,7 +79,7 @@ rules: - method: POST endpoint: "/api/aslan/environment/environments/?*/services/?*/scaleNew/?*" - method: GET - endpoint: " /api/podexec/?*/?*/?*/?*/podExec" + endpoint: "/api/podexec/?*/?*/?*/?*/podExec" - action: delete_environment alias: "删除集成环境" description: "" -- Gitee From 8f363429ded1401ed85499bf01300de78c8d085e Mon Sep 17 00:00:00 2001 From: mouuii Date: Fri, 12 Nov 2021 14:46:27 +0800 Subject: [PATCH 348/405] bug Signed-off-by: mouuii --- .../core/email/repository/models/emailhost.go | 1 - .../email/repository/models/emailservice.go | 1 - .../systemconfig/core/email/service/email.go | 20 +++++++++++++------ .../core/jira/repository/models/jira.go | 1 - .../systemconfig/core/jira/service/jira.go | 5 +++++ 5 files changed, 19 insertions(+), 9 deletions(-) diff --git a/pkg/microservice/systemconfig/core/email/repository/models/emailhost.go b/pkg/microservice/systemconfig/core/email/repository/models/emailhost.go index 4274ef570..9dff9ad78 100644 --- a/pkg/microservice/systemconfig/core/email/repository/models/emailhost.go +++ b/pkg/microservice/systemconfig/core/email/repository/models/emailhost.go @@ -1,7 +1,6 @@ package models type EmailHost struct { - ID int `bson:"id" json:"id"` Name string `bson:"name" json:"name"` Port int `bson:"port" json:"port"` Username string `bson:"username" json:"username"` diff --git a/pkg/microservice/systemconfig/core/email/repository/models/emailservice.go b/pkg/microservice/systemconfig/core/email/repository/models/emailservice.go index f8199cb87..148d7af10 100644 --- a/pkg/microservice/systemconfig/core/email/repository/models/emailservice.go +++ b/pkg/microservice/systemconfig/core/email/repository/models/emailservice.go @@ -1,7 +1,6 @@ package models type EmailService struct { - ID int `json:"id" bson:"id"` Name string `json:"name" bson:"name"` Address string `json:"address" bson:"address"` DisplayName string `json:"display_name" bson:"display_name"` diff --git a/pkg/microservice/systemconfig/core/email/service/email.go b/pkg/microservice/systemconfig/core/email/service/email.go index 75d6be879..4de7edc87 100644 --- a/pkg/microservice/systemconfig/core/email/service/email.go +++ b/pkg/microservice/systemconfig/core/email/service/email.go @@ -1,6 +1,8 @@ package service import ( + "time" + "go.uber.org/zap" "github.com/koderover/zadig/pkg/microservice/systemconfig/core/email/repository/models" @@ -20,11 +22,14 @@ func InternalGetEmailHost(_ *zap.SugaredLogger) (*models.EmailHost, error) { } func CreateEmailHost(emailHost *models.EmailHost, _ *zap.SugaredLogger) (*models.EmailHost, error) { + emailHost.CreatedAt = time.Now().Unix() + emailHost.UpdatedAt = time.Now().Unix() return mongodb.NewEmailHostColl().Add(emailHost) } -func UpdateEmailHost(host *models.EmailHost, _ *zap.SugaredLogger) (*models.EmailHost, error) { - return mongodb.NewEmailHostColl().Update(host) +func UpdateEmailHost(emailHost *models.EmailHost, _ *zap.SugaredLogger) (*models.EmailHost, error) { + emailHost.UpdatedAt = time.Now().Unix() + return mongodb.NewEmailHostColl().Update(emailHost) } func DeleteEmailHost(_ *zap.SugaredLogger) error { @@ -35,12 +40,15 @@ func GetEmailService(_ *zap.SugaredLogger) (*models.EmailService, error) { return mongodb.NewEmailServiceColl().GetEmailService() } -func CreateEmailService(service *models.EmailService, _ *zap.SugaredLogger) (*models.EmailService, error) { - return mongodb.NewEmailServiceColl().AddEmailService(service) +func CreateEmailService(emailService *models.EmailService, _ *zap.SugaredLogger) (*models.EmailService, error) { + emailService.CreatedAt = time.Now().Unix() + emailService.UpdatedAt = time.Now().Unix() + return mongodb.NewEmailServiceColl().AddEmailService(emailService) } -func UpdateEmailService(service *models.EmailService, _ *zap.SugaredLogger) (*models.EmailService, error) { - return mongodb.NewEmailServiceColl().UpdateEmailService(service) +func UpdateEmailService(emailService *models.EmailService, _ *zap.SugaredLogger) (*models.EmailService, error) { + emailService.UpdatedAt = time.Now().Unix() + return mongodb.NewEmailServiceColl().UpdateEmailService(emailService) } func DeleteEmailService(_ *zap.SugaredLogger) error { diff --git a/pkg/microservice/systemconfig/core/jira/repository/models/jira.go b/pkg/microservice/systemconfig/core/jira/repository/models/jira.go index 6038bf7bd..b43256695 100644 --- a/pkg/microservice/systemconfig/core/jira/repository/models/jira.go +++ b/pkg/microservice/systemconfig/core/jira/repository/models/jira.go @@ -1,7 +1,6 @@ package models type Jira struct { - ID int64 `bson:"id" json:"id"` Host string `bson:"host" json:"host"` User string `bson:"user" json:"user"` AccessToken string `bson:"access_token" json:"access_token"` diff --git a/pkg/microservice/systemconfig/core/jira/service/jira.go b/pkg/microservice/systemconfig/core/jira/service/jira.go index 5428837ec..0368497dc 100644 --- a/pkg/microservice/systemconfig/core/jira/service/jira.go +++ b/pkg/microservice/systemconfig/core/jira/service/jira.go @@ -1,6 +1,8 @@ package service import ( + "time" + "go.uber.org/zap" "github.com/koderover/zadig/pkg/microservice/systemconfig/core/jira/repository/models" @@ -12,10 +14,13 @@ func GeJira(_ *zap.SugaredLogger) (*models.Jira, error) { } func CreateJira(jira *models.Jira, _ *zap.SugaredLogger) (*models.Jira, error) { + jira.CreatedAt = time.Now().Unix() + jira.UpdatedAt = time.Now().Unix() return mongodb.NewJiraColl().AddJira(jira) } func UpdateJira(jira *models.Jira, _ *zap.SugaredLogger) (*models.Jira, error) { + jira.UpdatedAt = time.Now().Unix() return mongodb.NewJiraColl().UpdateJira(jira) } -- Gitee From 449755e3c11f3b644af3f820b66187537be6b2fa Mon Sep 17 00:00:00 2001 From: mouuii Date: Fri, 12 Nov 2021 14:59:41 +0800 Subject: [PATCH 349/405] bug Signed-off-by: mouuii --- pkg/microservice/systemconfig/core/codehost/service/codehost.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/microservice/systemconfig/core/codehost/service/codehost.go b/pkg/microservice/systemconfig/core/codehost/service/codehost.go index 54a165c03..8a3241216 100644 --- a/pkg/microservice/systemconfig/core/codehost/service/codehost.go +++ b/pkg/microservice/systemconfig/core/codehost/service/codehost.go @@ -8,7 +8,7 @@ import ( ) func CreateCodeHost(codehost *models.CodeHost, _ *zap.SugaredLogger) (*models.CodeHost, error) { - if codehost.Type == "codehub" { + if codehost.Type == "codehub" || codehost.Type == "gerrit" { codehost.IsReady = "2" } list, err := mongodb.NewCodehostColl().CodeHostList() -- Gitee From bb391e431e754e314967e842c819971a7c37ba03 Mon Sep 17 00:00:00 2001 From: mouuii Date: Fri, 12 Nov 2021 15:15:23 +0800 Subject: [PATCH 350/405] bug Signed-off-by: mouuii --- .../systemconfig/core/codehost/service/codehost.go | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/pkg/microservice/systemconfig/core/codehost/service/codehost.go b/pkg/microservice/systemconfig/core/codehost/service/codehost.go index 8a3241216..b27ff5b4a 100644 --- a/pkg/microservice/systemconfig/core/codehost/service/codehost.go +++ b/pkg/microservice/systemconfig/core/codehost/service/codehost.go @@ -1,6 +1,9 @@ package service import ( + "encoding/base64" + "fmt" + "go.uber.org/zap" "github.com/koderover/zadig/pkg/microservice/systemconfig/core/codehost/repository/models" @@ -8,9 +11,14 @@ import ( ) func CreateCodeHost(codehost *models.CodeHost, _ *zap.SugaredLogger) (*models.CodeHost, error) { - if codehost.Type == "codehub" || codehost.Type == "gerrit" { + if codehost.Type == "codehub" { + codehost.IsReady = "2" + } + if codehost.Type == "gerrit" { codehost.IsReady = "2" + codehost.AccessToken = base64.StdEncoding.EncodeToString([]byte(fmt.Sprintf("%s:%s", codehost.Username, codehost.Password))) } + list, err := mongodb.NewCodehostColl().CodeHostList() if err != nil { return nil, err -- Gitee From 113a2bbaeabe40628f58c50a8f8ebe7f1502ebb5 Mon Sep 17 00:00:00 2001 From: allenshen Date: Fri, 12 Nov 2021 15:19:46 +0800 Subject: [PATCH 351/405] optimize code Signed-off-by: allenshen --- .../core/service/taskplugin/deploy.go | 61 +++++++------------ pkg/shared/kube/wrapper/deployment.go | 12 ++++ pkg/shared/kube/wrapper/statefulset.go | 12 ++++ 3 files changed, 46 insertions(+), 39 deletions(-) diff --git a/pkg/microservice/warpdrive/core/service/taskplugin/deploy.go b/pkg/microservice/warpdrive/core/service/taskplugin/deploy.go index 68b22aa8b..ba9cb3bc7 100644 --- a/pkg/microservice/warpdrive/core/service/taskplugin/deploy.go +++ b/pkg/microservice/warpdrive/core/service/taskplugin/deploy.go @@ -28,7 +28,6 @@ import ( "github.com/pkg/errors" "go.uber.org/zap" appsv1 "k8s.io/api/apps/v1" - v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/labels" "k8s.io/client-go/rest" "sigs.k8s.io/controller-runtime/pkg/client" @@ -40,6 +39,7 @@ import ( "github.com/koderover/zadig/pkg/microservice/warpdrive/core/service/types" "github.com/koderover/zadig/pkg/microservice/warpdrive/core/service/types/task" "github.com/koderover/zadig/pkg/setting" + "github.com/koderover/zadig/pkg/shared/kube/resource" "github.com/koderover/zadig/pkg/shared/kube/wrapper" helmtool "github.com/koderover/zadig/pkg/tool/helmclient" "github.com/koderover/zadig/pkg/tool/httpclient" @@ -132,52 +132,34 @@ type EnvArgs struct { ProductName string `json:"product_name"` } -type SelectorBuilder struct { - ProductName string - GroupName string - ServiceName string - ConfigBackup string - EnvName string +type ResourceComponentSet interface { + GetName() string + GetAnnotations() map[string]string + Containers() []*resource.ContainerImage + GetKind() string } -type ResourceComponentSet struct { - Name string - Kind string - Containers []v1.Container - Annotations map[string]string -} - -func RcsListFromDeployments(source []*appsv1.Deployment) []*ResourceComponentSet { - rcsList := make([]*ResourceComponentSet, 0) +func RcsListFromDeployments(source []*appsv1.Deployment) []ResourceComponentSet { + rcsList := make([]ResourceComponentSet, 0, len(source)) for _, deploy := range source { - rcsList = append(rcsList, &ResourceComponentSet{ - Name: deploy.Name, - Kind: setting.Deployment, - Containers: deploy.Spec.Template.Spec.Containers, - Annotations: deploy.Annotations, - }) + rcsList = append(rcsList, wrapper.Deployment(deploy)) } return rcsList } -func RcsListFromStatefulSets(source []*appsv1.StatefulSet) []*ResourceComponentSet { - rcsList := make([]*ResourceComponentSet, 0) +func RcsListFromStatefulSets(source []*appsv1.StatefulSet) []ResourceComponentSet { + rcsList := make([]ResourceComponentSet, 0, len(source)) for _, sfs := range source { - rcsList = append(rcsList, &ResourceComponentSet{ - Name: sfs.Name, - Kind: setting.StatefulSet, - Containers: sfs.Spec.Template.Spec.Containers, - Annotations: sfs.Annotations, - }) + rcsList = append(rcsList, wrapper.StatefulSet(sfs)) } return rcsList } // find affected resources(deployment+statefulSet) for helm install or upgrade // resource type: deployment statefulSet -func (p *DeployTaskPlugin) findHelmAffectedResources(namespace, serviceName string, resList []*ResourceComponentSet) { +func (p *DeployTaskPlugin) findHelmAffectedResources(namespace, serviceName string, resList []ResourceComponentSet) { for _, res := range resList { - annotation := res.Annotations + annotation := res.GetAnnotations() if len(annotation) == 0 { continue } @@ -188,15 +170,15 @@ func (p *DeployTaskPlugin) findHelmAffectedResources(namespace, serviceName stri continue } } - for _, container := range res.Containers { + for _, container := range res.Containers() { resolvedImageUrl := resolveImageUrl(container.Image) if resolvedImageUrl[setting.PathSearchComponentImage] == p.Task.ContainerName { - p.Log.Infof("%s find match container.name:%s container.image:%s", res.Kind, container.Name, container.Image) + p.Log.Infof("%s find match container.name:%s container.image:%s", res.GetKind(), container.Name, container.Image) p.Task.ReplaceResources = append(p.Task.ReplaceResources, task.Resource{ - Kind: res.Kind, + Kind: res.GetKind(), Container: container.Name, Origin: container.Image, - Name: res.Name, + Name: res.GetName(), }) } } @@ -382,19 +364,20 @@ func (p *DeployTaskPlugin) Run(ctx context.Context, pipelineTask *task.Task, _ * helmClient helmclient.Client ) + rcsList := make([]ResourceComponentSet, 0) deployments, err := getter.ListDeployments(p.Task.Namespace, nil, p.kubeClient) if err != nil { p.Log.Errorf("failed to list deployments in namespace %s, productName %s, err %s", p.Task.Namespace, p.Task.ProductName, err) } else { - p.findHelmAffectedResources(p.Task.Namespace, p.Task.ServiceName, RcsListFromDeployments(deployments)) + rcsList = append(rcsList, RcsListFromDeployments(deployments)...) } - statefulSets, _ := getter.ListStatefulSets(p.Task.Namespace, nil, p.kubeClient) if err != nil { p.Log.Errorf("failed to list statefulsets in namespace %s, productName %s, err %s", p.Task.Namespace, p.Task.ProductName, err) } else { - p.findHelmAffectedResources(p.Task.Namespace, p.Task.ServiceName, RcsListFromStatefulSets(statefulSets)) + rcsList = append(rcsList, RcsListFromStatefulSets(statefulSets)...) } + p.findHelmAffectedResources(p.Task.Namespace, p.Task.ServiceName, rcsList) p.Log.Infof("start helm deploy, productName %s serviceName %s containerName %s namespace %s", p.Task.ProductName, p.Task.ServiceName, p.Task.ContainerName, p.Task.Namespace) diff --git a/pkg/shared/kube/wrapper/deployment.go b/pkg/shared/kube/wrapper/deployment.go index 5cd417f7a..24e624733 100644 --- a/pkg/shared/kube/wrapper/deployment.go +++ b/pkg/shared/kube/wrapper/deployment.go @@ -80,3 +80,15 @@ func (w *deployment) ImageInfos() (images []string) { } return } + +func (w *deployment) GetKind() string { + return w.Kind +} + +func (w *deployment) Containers() []*resource.ContainerImage { + containers := make([]*resource.ContainerImage, 0) + for _, c := range w.Spec.Template.Spec.Containers { + containers = append(containers, &resource.ContainerImage{Name: c.Name, Image: c.Image}) + } + return containers +} diff --git a/pkg/shared/kube/wrapper/statefulset.go b/pkg/shared/kube/wrapper/statefulset.go index 0ae9c3332..60e75bbf7 100644 --- a/pkg/shared/kube/wrapper/statefulset.go +++ b/pkg/shared/kube/wrapper/statefulset.go @@ -80,3 +80,15 @@ func (w *statefulSet) ImageInfos() (images []string) { } return } + +func (w *statefulSet) GetKind() string { + return w.Kind +} + +func (w *statefulSet) Containers() []*resource.ContainerImage { + containers := make([]*resource.ContainerImage, 0) + for _, c := range w.Spec.Template.Spec.Containers { + containers = append(containers, &resource.ContainerImage{Name: c.Name, Image: c.Image}) + } + return containers +} -- Gitee From f28343853d016992482ad58e893f11e0c066819c Mon Sep 17 00:00:00 2001 From: allenshen Date: Fri, 12 Nov 2021 15:22:14 +0800 Subject: [PATCH 352/405] optimize code Signed-off-by: allenshen --- pkg/microservice/warpdrive/core/service/taskplugin/deploy.go | 4 ++-- pkg/shared/kube/wrapper/deployment.go | 2 +- pkg/shared/kube/wrapper/statefulset.go | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pkg/microservice/warpdrive/core/service/taskplugin/deploy.go b/pkg/microservice/warpdrive/core/service/taskplugin/deploy.go index ba9cb3bc7..1748ab518 100644 --- a/pkg/microservice/warpdrive/core/service/taskplugin/deploy.go +++ b/pkg/microservice/warpdrive/core/service/taskplugin/deploy.go @@ -135,7 +135,7 @@ type EnvArgs struct { type ResourceComponentSet interface { GetName() string GetAnnotations() map[string]string - Containers() []*resource.ContainerImage + GetContainers() []*resource.ContainerImage GetKind() string } @@ -170,7 +170,7 @@ func (p *DeployTaskPlugin) findHelmAffectedResources(namespace, serviceName stri continue } } - for _, container := range res.Containers() { + for _, container := range res.GetContainers() { resolvedImageUrl := resolveImageUrl(container.Image) if resolvedImageUrl[setting.PathSearchComponentImage] == p.Task.ContainerName { p.Log.Infof("%s find match container.name:%s container.image:%s", res.GetKind(), container.Name, container.Image) diff --git a/pkg/shared/kube/wrapper/deployment.go b/pkg/shared/kube/wrapper/deployment.go index 24e624733..7bae2eb4d 100644 --- a/pkg/shared/kube/wrapper/deployment.go +++ b/pkg/shared/kube/wrapper/deployment.go @@ -85,7 +85,7 @@ func (w *deployment) GetKind() string { return w.Kind } -func (w *deployment) Containers() []*resource.ContainerImage { +func (w *deployment) GetContainers() []*resource.ContainerImage { containers := make([]*resource.ContainerImage, 0) for _, c := range w.Spec.Template.Spec.Containers { containers = append(containers, &resource.ContainerImage{Name: c.Name, Image: c.Image}) diff --git a/pkg/shared/kube/wrapper/statefulset.go b/pkg/shared/kube/wrapper/statefulset.go index 60e75bbf7..4a42be382 100644 --- a/pkg/shared/kube/wrapper/statefulset.go +++ b/pkg/shared/kube/wrapper/statefulset.go @@ -85,7 +85,7 @@ func (w *statefulSet) GetKind() string { return w.Kind } -func (w *statefulSet) Containers() []*resource.ContainerImage { +func (w *statefulSet) GetContainers() []*resource.ContainerImage { containers := make([]*resource.ContainerImage, 0) for _, c := range w.Spec.Template.Spec.Containers { containers = append(containers, &resource.ContainerImage{Name: c.Name, Image: c.Image}) -- Gitee From f39515dd6f7f89ffea01101216c2f801f086a252 Mon Sep 17 00:00:00 2001 From: allenshen Date: Fri, 12 Nov 2021 15:23:42 +0800 Subject: [PATCH 353/405] optimize code Signed-off-by: allenshen --- pkg/shared/kube/wrapper/deployment.go | 2 +- pkg/shared/kube/wrapper/statefulset.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/shared/kube/wrapper/deployment.go b/pkg/shared/kube/wrapper/deployment.go index 7bae2eb4d..6d0c5e79b 100644 --- a/pkg/shared/kube/wrapper/deployment.go +++ b/pkg/shared/kube/wrapper/deployment.go @@ -86,7 +86,7 @@ func (w *deployment) GetKind() string { } func (w *deployment) GetContainers() []*resource.ContainerImage { - containers := make([]*resource.ContainerImage, 0) + containers := make([]*resource.ContainerImage, 0, len(w.Spec.Template.Spec.Containers)) for _, c := range w.Spec.Template.Spec.Containers { containers = append(containers, &resource.ContainerImage{Name: c.Name, Image: c.Image}) } diff --git a/pkg/shared/kube/wrapper/statefulset.go b/pkg/shared/kube/wrapper/statefulset.go index 4a42be382..7f4bb459c 100644 --- a/pkg/shared/kube/wrapper/statefulset.go +++ b/pkg/shared/kube/wrapper/statefulset.go @@ -86,7 +86,7 @@ func (w *statefulSet) GetKind() string { } func (w *statefulSet) GetContainers() []*resource.ContainerImage { - containers := make([]*resource.ContainerImage, 0) + containers := make([]*resource.ContainerImage, 0, len(w.Spec.Template.Spec.Containers)) for _, c := range w.Spec.Template.Spec.Containers { containers = append(containers, &resource.ContainerImage{Name: c.Name, Image: c.Image}) } -- Gitee From 05d46f4ebb755f959dc021f41b401b3fc4b1f7d6 Mon Sep 17 00:00:00 2001 From: mouuii Date: Fri, 12 Nov 2021 15:24:55 +0800 Subject: [PATCH 354/405] bug Signed-off-by: mouuii --- .../systemconfig/core/codehost/service/codehost.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pkg/microservice/systemconfig/core/codehost/service/codehost.go b/pkg/microservice/systemconfig/core/codehost/service/codehost.go index b27ff5b4a..864ddda17 100644 --- a/pkg/microservice/systemconfig/core/codehost/service/codehost.go +++ b/pkg/microservice/systemconfig/core/codehost/service/codehost.go @@ -3,6 +3,7 @@ package service import ( "encoding/base64" "fmt" + "time" "go.uber.org/zap" @@ -18,6 +19,8 @@ func CreateCodeHost(codehost *models.CodeHost, _ *zap.SugaredLogger) (*models.Co codehost.IsReady = "2" codehost.AccessToken = base64.StdEncoding.EncodeToString([]byte(fmt.Sprintf("%s:%s", codehost.Username, codehost.Password))) } + codehost.CreatedAt = time.Now().Unix() + codehost.UpdatedAt = time.Now().Unix() list, err := mongodb.NewCodehostColl().CodeHostList() if err != nil { -- Gitee From c1e5bba053e164bf542995cd6fdd95d4e62a3b79 Mon Sep 17 00:00:00 2001 From: allenshen Date: Fri, 12 Nov 2021 15:56:04 +0800 Subject: [PATCH 355/405] optimize code Signed-off-by: allenshen --- .../aslan/core/workflow/service/workflow/nsq_handlers.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/pkg/microservice/aslan/core/workflow/service/workflow/nsq_handlers.go b/pkg/microservice/aslan/core/workflow/service/workflow/nsq_handlers.go index ec167e968..a33ee9741 100644 --- a/pkg/microservice/aslan/core/workflow/service/workflow/nsq_handlers.go +++ b/pkg/microservice/aslan/core/workflow/service/workflow/nsq_handlers.go @@ -222,9 +222,13 @@ func (h *TaskAckHandler) getDockerfileContent(build *types.Repository, ctx *task return "" } return content - default: + default: // TODO need rewrite path := ctx.DockerFile pathArray := strings.Split(path, "/") + if len(pathArray[0])+1 >= len(path) { + h.log.Errorf("Failed to get dockerfile content, build context: %+v", *ctx) + return "" + } dockerfilePath := path[len(pathArray[0])+1:] if strings.Contains(build.Address, "gitlab") { cli, err := gitlab.NewClient(build.Address, build.OauthToken) -- Gitee From 9f705550c28f8b9d26028b92ebccb00003681670 Mon Sep 17 00:00:00 2001 From: lou Date: Fri, 12 Nov 2021 15:56:38 +0800 Subject: [PATCH 356/405] fix permissions Signed-off-by: lou --- pkg/microservice/aslan/core/environment/handler/policy.yaml | 4 ++++ pkg/microservice/aslan/core/project/handler/policy.yaml | 6 ++++++ .../aslan/core/workflow/testing/handler/policy.yaml | 6 ++++++ .../policy/core/service/bundle/exemption_urls.go | 6 +++++- 4 files changed, 21 insertions(+), 1 deletion(-) diff --git a/pkg/microservice/aslan/core/environment/handler/policy.yaml b/pkg/microservice/aslan/core/environment/handler/policy.yaml index 45b7ef419..cef0b3b1b 100644 --- a/pkg/microservice/aslan/core/environment/handler/policy.yaml +++ b/pkg/microservice/aslan/core/environment/handler/policy.yaml @@ -42,6 +42,8 @@ rules: endpoint: "/api/aslan/environment/environments/?*/envRecycle" - method: PUT endpoint: "/api/aslan/environment/environments/?*/renderchart" + - method: PUT + endpoint: "/api/aslan/environment/environments/?*/renderset" - method: PUT endpoint: "/api/aslan/environment/environments/?*/multiHelmEnv" - method: PUT @@ -66,6 +68,8 @@ rules: endpoint: "/api/aslan/environment/export/service" - method: GET endpoint: "/api/aslan/environment/kube/pods/?*/events" + - method: GET + endpoint: "/api/aslan/environment/kube/events" - method: GET endpoint: "/api/aslan/environment/export/service" - method: GET diff --git a/pkg/microservice/aslan/core/project/handler/policy.yaml b/pkg/microservice/aslan/core/project/handler/policy.yaml index dbaf18ad8..810be08e5 100644 --- a/pkg/microservice/aslan/core/project/handler/policy.yaml +++ b/pkg/microservice/aslan/core/project/handler/policy.yaml @@ -50,6 +50,10 @@ rules: endpoint: "/api/aslan/service/pm/?*" - method: POST endpoint: "/api/aslan/service/services" + - method: GET + endpoint: "/api/aslan/service/loader/preload/?*/?*" + - method: POST + endpoint: "/api/aslan/service/loader/load/?*/?*" - action: delete_service alias: "删除服务" description: "" @@ -82,6 +86,8 @@ rules: endpoint: "/api/aslan/build/build" - method: POST endpoint: "/api/aslan/build/targets" + - method: POST + endpoint: "/api/aslan/build/build/targets" - action: delete_build alias: "删除构建配置" description: "" diff --git a/pkg/microservice/aslan/core/workflow/testing/handler/policy.yaml b/pkg/microservice/aslan/core/workflow/testing/handler/policy.yaml index 320fcdeda..f4f130846 100644 --- a/pkg/microservice/aslan/core/workflow/testing/handler/policy.yaml +++ b/pkg/microservice/aslan/core/workflow/testing/handler/policy.yaml @@ -32,3 +32,9 @@ rules: rules: - method: POST endpoint: "/api/aslan/testing/test" + - action: run_test + alias: "执行测试" + description: "" + rules: + - method: POST + endpoint: "/api/aslan/testing/testtask" diff --git a/pkg/microservice/policy/core/service/bundle/exemption_urls.go b/pkg/microservice/policy/core/service/bundle/exemption_urls.go index cb74c3c83..12938788f 100644 --- a/pkg/microservice/policy/core/service/bundle/exemption_urls.go +++ b/pkg/microservice/policy/core/service/bundle/exemption_urls.go @@ -58,7 +58,7 @@ var publicURLs = []*policyRule{ }, { Methods: []string{"GET"}, - Endpoints: []string{"", "signin", "setup", "loading", "static/**", "v1/**", "mobile/**", "productpipelines/**"}, + Endpoints: []string{"", "signin", "setup", "static/**", "v1/**", "mobile/**", "productpipelines/**", "favicon.ico"}, }, { Methods: []string{"GET"}, @@ -240,6 +240,10 @@ var projectAdminURLs = []*policyRule{ Methods: []string{"PUT"}, Endpoints: []string{"api/aslan/project/products"}, }, + { + Methods: []string{"PUT"}, + Endpoints: []string{"api/v1/picket/projects/?*"}, + }, { Methods: []string{"DELETE"}, Endpoints: []string{"api/aslan/project/products/?*"}, -- Gitee From 7498a9408855c5baa5f485df953d03265cdc10ca Mon Sep 17 00:00:00 2001 From: lou Date: Fri, 12 Nov 2021 16:45:57 +0800 Subject: [PATCH 357/405] fix project admin Signed-off-by: lou --- pkg/microservice/policy/core/service/bundle/rego/authz.rego | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/microservice/policy/core/service/bundle/rego/authz.rego b/pkg/microservice/policy/core/service/bundle/rego/authz.rego index 48a8cdcd1..81ce157bc 100644 --- a/pkg/microservice/policy/core/service/bundle/rego/authz.rego +++ b/pkg/microservice/policy/core/service/bundle/rego/authz.rego @@ -86,7 +86,7 @@ user_is_project_admin { allowed_roles[role] role.name == "admin" - role.namespace == project_name + #role.namespace == project_name } # public urls are visible for all users -- Gitee From b5dcfd43e3d5ad90abb31a333916bddd79234726 Mon Sep 17 00:00:00 2001 From: allenshen Date: Fri, 12 Nov 2021 17:17:05 +0800 Subject: [PATCH 358/405] change productName to projectName Signed-off-by: allenshen --- pkg/microservice/aslan/core/environment/handler/renderset.go | 2 +- pkg/microservice/aslan/core/service/handler/helm.go | 2 +- pkg/microservice/aslan/core/workflow/handler/build.go | 2 +- pkg/microservice/aslan/core/workflow/handler/workflow.go | 2 +- pkg/microservice/picket/core/public/handler/public.go | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pkg/microservice/aslan/core/environment/handler/renderset.go b/pkg/microservice/aslan/core/environment/handler/renderset.go index 85fa58548..50aff5726 100644 --- a/pkg/microservice/aslan/core/environment/handler/renderset.go +++ b/pkg/microservice/aslan/core/environment/handler/renderset.go @@ -56,7 +56,7 @@ func GetProductDefaultValues(c *gin.Context) { return } - ctx.Resp, ctx.Err = service.GetDefaultValues(c.Query("productName"), c.Query("envName"), ctx.Logger) + ctx.Resp, ctx.Err = service.GetDefaultValues(c.Query("projectName"), c.Query("envName"), ctx.Logger) } func GetYamlContent(c *gin.Context) { diff --git a/pkg/microservice/aslan/core/service/handler/helm.go b/pkg/microservice/aslan/core/service/handler/helm.go index 8f19493f8..5b7974c7a 100644 --- a/pkg/microservice/aslan/core/service/handler/helm.go +++ b/pkg/microservice/aslan/core/service/handler/helm.go @@ -80,7 +80,7 @@ func CreateOrUpdateBulkHelmServices(c *gin.Context) { } args.CreatedBy = ctx.UserName - ctx.Resp, ctx.Err = svcservice.CreateOrUpdateBulkHelmService(c.Query("productName"), args, ctx.Logger) + ctx.Resp, ctx.Err = svcservice.CreateOrUpdateBulkHelmService(c.Query("projectName"), args, ctx.Logger) } func UpdateHelmService(c *gin.Context) { diff --git a/pkg/microservice/aslan/core/workflow/handler/build.go b/pkg/microservice/aslan/core/workflow/handler/build.go index aeec1312c..37166728d 100644 --- a/pkg/microservice/aslan/core/workflow/handler/build.go +++ b/pkg/microservice/aslan/core/workflow/handler/build.go @@ -30,7 +30,7 @@ func BuildModuleToSubTasks(c *gin.Context) { args := &models.BuildModuleArgs{ BuildName: c.Param("name"), - ProductName: c.Query("productName"), + ProductName: c.Query("projectName"), } resp, err := workflow.BuildModuleToSubTasks(args, ctx.Logger) if err != nil { diff --git a/pkg/microservice/aslan/core/workflow/handler/workflow.go b/pkg/microservice/aslan/core/workflow/handler/workflow.go index e399babff..9f69a055a 100644 --- a/pkg/microservice/aslan/core/workflow/handler/workflow.go +++ b/pkg/microservice/aslan/core/workflow/handler/workflow.go @@ -118,7 +118,7 @@ func ListWorkflows(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - ctx.Resp, ctx.Err = workflow.ListWorkflows(c.Query("type"), c.Query("productName"), ctx.UserID, ctx.Logger) + ctx.Resp, ctx.Err = workflow.ListWorkflows(c.Query("type"), c.Query("projectName"), ctx.UserID, ctx.Logger) } func ListTestWorkflows(c *gin.Context) { diff --git a/pkg/microservice/picket/core/public/handler/public.go b/pkg/microservice/picket/core/public/handler/public.go index 800c0703a..5a868e42d 100644 --- a/pkg/microservice/picket/core/public/handler/public.go +++ b/pkg/microservice/picket/core/public/handler/public.go @@ -100,7 +100,7 @@ func ListWorkflowTask(c *gin.Context) { func ListDelivery(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() - productName := c.Query("productName") + productName := c.Query("projectName") workflowName := c.Query("workflowName") taskIDStr := c.Query("taskId") perPageStr := c.Query("perPage") -- Gitee From 73fe99a562e3dd389428aacff7964c20a115d6e8 Mon Sep 17 00:00:00 2001 From: mouuii Date: Fri, 12 Nov 2021 18:33:01 +0800 Subject: [PATCH 359/405] migrate Signed-off-by: mouuii --- pkg/cli/upgradeassistant/cmd/migrate/170.go | 26 +++++++- .../upgradeassistant/internal/mongo/mongo.go | 59 +++++++++++++++++++ .../systemconfig/config/consts.go | 7 --- .../codehost/repository/mongodb/codehost.go | 9 --- 4 files changed, 84 insertions(+), 17 deletions(-) create mode 100644 pkg/cli/upgradeassistant/internal/mongo/mongo.go diff --git a/pkg/cli/upgradeassistant/cmd/migrate/170.go b/pkg/cli/upgradeassistant/cmd/migrate/170.go index 71f721a05..a02c57e57 100644 --- a/pkg/cli/upgradeassistant/cmd/migrate/170.go +++ b/pkg/cli/upgradeassistant/cmd/migrate/170.go @@ -17,6 +17,7 @@ limitations under the License. package migrate import ( + "github.com/koderover/zadig/pkg/cli/upgradeassistant/internal/mongo" "github.com/koderover/zadig/pkg/cli/upgradeassistant/internal/upgradepath" "github.com/koderover/zadig/pkg/microservice/aslan/config" "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/mongodb" @@ -36,7 +37,13 @@ func init() { func V160ToV170() error { log.Info("Migrating data from 1.6.0 to 1.7.0") - err := refreshWebHookSecret() + err := changeCodehostType() + if err != nil { + log.Errorf("Failed to change codehost type, err: %s", err) + return err + } + + err = refreshWebHookSecret() if err != nil { log.Errorf("Failed to refresh webhook secret, err: %s", err) return err @@ -114,3 +121,20 @@ func getCodeHostByAddressAndOwner(address, owner string, all []*systemconfig.Cod return nil } + +func changeCodehostType() error { + // get all codehosts + codeHosts, err := systemconfig.New().ListCodeHosts() + if err != nil { + log.Errorf("fail to list codehosts, err: %s", err) + return err + } + // change type to readable string + for _, v := range codeHosts { + if err := mongo.NewCodehostColl().ChangeType(v.ID, v.Type); err != nil { + log.Errorf("fail to change id:%d type:%s , err: %s", v.ID, v.Type, err) + return err + } + } + return nil +} diff --git a/pkg/cli/upgradeassistant/internal/mongo/mongo.go b/pkg/cli/upgradeassistant/internal/mongo/mongo.go new file mode 100644 index 000000000..f9cde38cf --- /dev/null +++ b/pkg/cli/upgradeassistant/internal/mongo/mongo.go @@ -0,0 +1,59 @@ +package mongo + +import ( + "context" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo" + + "github.com/koderover/zadig/pkg/config" + "github.com/koderover/zadig/pkg/microservice/systemconfig/core/codehost/repository/models" + "github.com/koderover/zadig/pkg/tool/log" + mongotool "github.com/koderover/zadig/pkg/tool/mongo" +) + +func (c *CodehostColl) ChangeType(ID int, sourceType string) error { + query := bson.M{"id": ID} + + if sourceType == "1" { + sourceType = "gitlab" + } else if sourceType == "2" { + sourceType = "github" + } else if sourceType == "3" { + sourceType = "gerrit" + } else if sourceType == "4" { + sourceType = "codehub" + } else if sourceType == "5" { + sourceType = "ilyshin" + } + + change := bson.M{"$set": bson.M{ + "type": sourceType, + }} + _, err := c.Collection.UpdateOne(context.TODO(), query, change) + if err != nil { + log.Error("repository update fail") + return err + } + log.Infof("success to change id:%d to type:%s", ID, sourceType) + return nil +} + +type CodehostColl struct { + *mongo.Collection + + coll string +} + +type ListArgs struct { + Owner string + Address string + Source string +} + +func NewCodehostColl() *CodehostColl { + name := models.CodeHost{}.TableName() + coll := &CodehostColl{Collection: mongotool.Database(config.MongoDatabase()).Collection(name), coll: name} + + return coll +} diff --git a/pkg/microservice/systemconfig/config/consts.go b/pkg/microservice/systemconfig/config/consts.go index 8acf347cb..27f698e59 100644 --- a/pkg/microservice/systemconfig/config/consts.go +++ b/pkg/microservice/systemconfig/config/consts.go @@ -4,10 +4,3 @@ const ( ENVMysqlDexDB = "MYSQL_DEX_DB" FeatureFlag = "feature-gates" ) - -var CodeHostMap = map[string]string{ - "1": "gitlab", - "2": "github", - "3": "gerrit", - "4": "codehub", -} diff --git a/pkg/microservice/systemconfig/core/codehost/repository/mongodb/codehost.go b/pkg/microservice/systemconfig/core/codehost/repository/mongodb/codehost.go index 2c9ea41a9..65bfa37a4 100644 --- a/pkg/microservice/systemconfig/core/codehost/repository/mongodb/codehost.go +++ b/pkg/microservice/systemconfig/core/codehost/repository/mongodb/codehost.go @@ -71,9 +71,6 @@ func (c *CodehostColl) GetCodeHostByID(ID int) (*models.CodeHost, error) { if err != nil { return nil, nil } - if v, ok := config.CodeHostMap[codehost.Type]; ok { - codehost.Type = v - } return codehost, nil } @@ -98,12 +95,6 @@ func (c *CodehostColl) List(args *ListArgs) ([]*models.CodeHost, error) { if err != nil { return nil, err } - // NOTE: to adapt old data - for i, v := range codeHosts { - if v, ok := config.CodeHostMap[v.Type]; ok { - codeHosts[i].Type = v - } - } return codeHosts, nil } -- Gitee From 6613d88c225cd85ec43f4a949e06f3ca92608c25 Mon Sep 17 00:00:00 2001 From: mouuii Date: Fri, 12 Nov 2021 18:37:53 +0800 Subject: [PATCH 360/405] rollback Signed-off-by: mouuii --- pkg/cli/upgradeassistant/cmd/migrate/170.go | 22 +++++++++++++++ .../upgradeassistant/internal/mongo/mongo.go | 27 +++++++++++++++++++ 2 files changed, 49 insertions(+) diff --git a/pkg/cli/upgradeassistant/cmd/migrate/170.go b/pkg/cli/upgradeassistant/cmd/migrate/170.go index a02c57e57..3856fd4f1 100644 --- a/pkg/cli/upgradeassistant/cmd/migrate/170.go +++ b/pkg/cli/upgradeassistant/cmd/migrate/170.go @@ -54,6 +54,11 @@ func V160ToV170() error { func V170ToV160() error { log.Info("Rollback data from 1.7.0 to 1.6.0") + err := RollbackchangeCodehostType() + if err != nil { + log.Errorf("Failed to rollback codehost type, err: %s", err) + return err + } return nil } @@ -138,3 +143,20 @@ func changeCodehostType() error { } return nil } + +func RollbackchangeCodehostType() error { + // get all codehosts + codeHosts, err := systemconfig.New().ListCodeHosts() + if err != nil { + log.Errorf("fail to list codehosts, err: %s", err) + return err + } + // rollback change type to readable string + for _, v := range codeHosts { + if err := mongo.NewCodehostColl().ChangeType(v.ID, v.Type); err != nil { + log.Errorf("fail to rollback id:%d type:%s , err: %s", v.ID, v.Type, err) + return err + } + } + return nil +} diff --git a/pkg/cli/upgradeassistant/internal/mongo/mongo.go b/pkg/cli/upgradeassistant/internal/mongo/mongo.go index f9cde38cf..90180fd03 100644 --- a/pkg/cli/upgradeassistant/internal/mongo/mongo.go +++ b/pkg/cli/upgradeassistant/internal/mongo/mongo.go @@ -39,6 +39,33 @@ func (c *CodehostColl) ChangeType(ID int, sourceType string) error { return nil } +func (c *CodehostColl) RollbackChangeType(ID int, sourceType string) error { + query := bson.M{"id": ID} + + if sourceType == "gitlab" { + sourceType = "1" + } else if sourceType == "github" { + sourceType = "2" + } else if sourceType == "gerrit" { + sourceType = "3" + } else if sourceType == "codehub" { + sourceType = "4" + } else if sourceType == "ilyshin" { + sourceType = "5" + } + + change := bson.M{"$set": bson.M{ + "type": sourceType, + }} + _, err := c.Collection.UpdateOne(context.TODO(), query, change) + if err != nil { + log.Error("repository update fail") + return err + } + log.Infof("success to rollback id:%d to type:%s", ID, sourceType) + return nil +} + type CodehostColl struct { *mongo.Collection -- Gitee From 988d42cd7550f9e4ca0a7d1b9dcb3fe38d0dca77 Mon Sep 17 00:00:00 2001 From: allenshen Date: Fri, 5 Nov 2021 19:37:59 +0800 Subject: [PATCH 361/405] return service name to client after chart imported Signed-off-by: allenshen --- .../aslan/core/service/handler/helm.go | 2 +- .../aslan/core/service/service/helm.go | 67 ++++++++++--------- 2 files changed, 36 insertions(+), 33 deletions(-) diff --git a/pkg/microservice/aslan/core/service/handler/helm.go b/pkg/microservice/aslan/core/service/handler/helm.go index 5b7974c7a..0573b0989 100644 --- a/pkg/microservice/aslan/core/service/handler/helm.go +++ b/pkg/microservice/aslan/core/service/handler/helm.go @@ -66,7 +66,7 @@ func CreateOrUpdateHelmService(c *gin.Context) { } args.CreatedBy = ctx.UserName - ctx.Err = svcservice.CreateOrUpdateHelmService(c.Query("projectName"), args, ctx.Logger) + ctx.Resp, ctx.Err = svcservice.CreateOrUpdateHelmService(c.Query("projectName"), args, ctx.Logger) } func CreateOrUpdateBulkHelmServices(c *gin.Context) { diff --git a/pkg/microservice/aslan/core/service/service/helm.go b/pkg/microservice/aslan/core/service/service/helm.go index 2185e6de1..662fe9cb8 100644 --- a/pkg/microservice/aslan/core/service/service/helm.go +++ b/pkg/microservice/aslan/core/service/service/helm.go @@ -28,7 +28,6 @@ import ( "time" "github.com/27149chen/afero" - "github.com/hashicorp/go-multierror" "github.com/otiai10/copy" "github.com/pkg/errors" "go.uber.org/zap" @@ -242,26 +241,26 @@ func prepareChartTemplateData(templateName string, logger *zap.SugaredLogger) (* }, nil } -func CreateOrUpdateHelmService(projectName string, args *HelmServiceCreationArgs, logger *zap.SugaredLogger) error { +func CreateOrUpdateHelmService(projectName string, args *HelmServiceCreationArgs, logger *zap.SugaredLogger) (*BulkHelmServiceCreationResponse, error) { switch args.Source { case LoadFromRepo, LoadFromPublicRepo: return CreateOrUpdateHelmServiceFromGitRepo(projectName, args, logger) case LoadFromChartTemplate: return CreateOrUpdateHelmServiceFromChartTemplate(projectName, args, logger) default: - return fmt.Errorf("invalid source") + return nil, fmt.Errorf("invalid source") } } -func CreateOrUpdateHelmServiceFromChartTemplate(projectName string, args *HelmServiceCreationArgs, logger *zap.SugaredLogger) error { +func CreateOrUpdateHelmServiceFromChartTemplate(projectName string, args *HelmServiceCreationArgs, logger *zap.SugaredLogger) (*BulkHelmServiceCreationResponse, error) { templateArgs, ok := args.CreateFrom.(*CreateFromChartTemplate) if !ok { - return fmt.Errorf("invalid argument") + return nil, fmt.Errorf("invalid argument") } templateChartInfo, err := prepareChartTemplateData(templateArgs.TemplateName, logger) if err != nil { - return err + return nil, err } var values [][]byte @@ -269,7 +268,7 @@ func CreateOrUpdateHelmServiceFromChartTemplate(projectName string, args *HelmSe //render variables renderedYaml, err := renderVariablesToYaml(string(templateChartInfo.DefaultValuesYAML), projectName, args.Name, templateArgs.Variables) if err != nil { - return err + return nil, err } values = append(values, []byte(renderedYaml)) } @@ -287,29 +286,29 @@ func CreateOrUpdateHelmServiceFromChartTemplate(projectName string, args *HelmSe // remove old files if err = os.RemoveAll(to); err != nil { logger.Errorf("Failed to remove dir %s, err: %s", to, err) - return err + return nil, err } if err = copy.Copy(from, to); err != nil { logger.Errorf("Failed to copy file from %s to %s, err: %s", from, to, err) - return err + return nil, err } merged, err := yamlutil.Merge(values) if err != nil { logger.Errorf("Failed to merge values, err: %s", err) - return err + return nil, err } if err = os.WriteFile(filepath.Join(to, setting.ValuesYaml), merged, 0644); err != nil { logger.Errorf("Failed to write values, err: %s", err) - return err + return nil, err } fsTree := os.DirFS(config.LocalServicePath(projectName, args.Name)) ServiceS3Base := config.ObjectStorageServicePath(projectName, args.Name) if err = fsservice.ArchiveAndUploadFilesToS3(fsTree, args.Name, ServiceS3Base, logger); err != nil { logger.Errorf("Failed to upload files for service %s in project %s, err: %s", args.Name, projectName, err) - return err + return nil, err } svc, err := createOrUpdateHelmService( @@ -331,7 +330,7 @@ func CreateOrUpdateHelmServiceFromChartTemplate(projectName string, args *HelmSe ) if err != nil { logger.Errorf("Failed to create service %s in project %s, error: %s", args.Name, projectName, err) - return err + return nil, err } compareHelmVariable([]*templatemodels.RenderChart{ @@ -341,7 +340,9 @@ func CreateOrUpdateHelmServiceFromChartTemplate(projectName string, args *HelmSe }, }, projectName, args.CreatedBy, logger) - return nil + return &BulkHelmServiceCreationResponse{ + SuccessServices: []string{args.Name}, + }, nil } func getCodehostType(repoArgs *CreateFromRepo, repoLink string) (string, *systemconfig.CodeHost, error) { @@ -356,57 +357,60 @@ func getCodehostType(repoArgs *CreateFromRepo, repoLink string) (string, *system return ch.Type, ch, nil } -func CreateOrUpdateHelmServiceFromGitRepo(projectName string, args *HelmServiceCreationArgs, log *zap.SugaredLogger) error { +func CreateOrUpdateHelmServiceFromGitRepo(projectName string, args *HelmServiceCreationArgs, log *zap.SugaredLogger) (*BulkHelmServiceCreationResponse, error) { var err error var repoLink string repoArgs, ok := args.CreateFrom.(*CreateFromRepo) if !ok { publicArgs, ok := args.CreateFrom.(*CreateFromPublicRepo) if !ok { - return fmt.Errorf("invalid argument") + return nil, fmt.Errorf("invalid argument") } repoArgs, err = PublicRepoToPrivateRepoArgs(publicArgs) if err != nil { log.Errorf("Failed to parse repo args %+v, err: %s", publicArgs, err) - return err + return nil, err } repoLink = publicArgs.RepoLink } + response := &BulkHelmServiceCreationResponse{} source, codehostInfo, err := getCodehostType(repoArgs, repoLink) if err != nil { log.Errorf("Failed to get source form repo data %+v, err: %s", *repoArgs, err.Error()) - return err + return nil, err } helmRenderCharts := make([]*templatemodels.RenderChart, 0, len(repoArgs.Paths)) - var errs *multierror.Error var wg wait.Group var mux sync.RWMutex for _, p := range repoArgs.Paths { filePath := strings.TrimLeft(p, "/") wg.Start(func() { - var finalErr error - + var ( + serviceName string + chartVersion string + valuesYAML []byte + finalErr error + ) defer func() { + mux.Lock() if finalErr != nil { - mux.Lock() - errs = multierror.Append(errs, finalErr) - mux.Unlock() + response.FailedServices = append(response.FailedServices, &FailedService{ + Path: filePath, + Error: finalErr.Error(), + }) + } else { + response.SuccessServices = append(response.SuccessServices, serviceName) } + mux.Unlock() }() log.Infof("Loading chart under path %s", filePath) - var ( - serviceName string - chartVersion string - valuesYAML []byte - ) - fsTree, err := fsservice.DownloadFilesFromSource( &fsservice.DownloadFromSourceArgs{CodehostID: repoArgs.CodehostID, Owner: repoArgs.Owner, Repo: repoArgs.Repo, Path: filePath, Branch: repoArgs.Branch, RepoLink: repoLink}, func(chartTree afero.Fs) (string, error) { @@ -473,8 +477,7 @@ func CreateOrUpdateHelmServiceFromGitRepo(projectName string, args *HelmServiceC wg.Wait() compareHelmVariable(helmRenderCharts, projectName, args.CreatedBy, log) - - return errs.ErrorOrNil() + return response, nil } func CreateOrUpdateBulkHelmService(projectName string, args *BulkHelmServiceCreationArgs, logger *zap.SugaredLogger) (*BulkHelmServiceCreationResponse, error) { -- Gitee From 230e1c3fa35ccd65778d5322e9934156fc94c5a2 Mon Sep 17 00:00:00 2001 From: lou Date: Fri, 12 Nov 2021 21:06:38 +0800 Subject: [PATCH 362/405] fix permissions Signed-off-by: lou --- pkg/microservice/aslan/core/environment/handler/policy.yaml | 2 +- pkg/microservice/aslan/core/project/handler/policy.yaml | 4 ++-- .../aslan/core/workflow/testing/handler/policy.yaml | 2 ++ .../policy/core/service/bundle/exemption_urls.go | 6 +----- 4 files changed, 6 insertions(+), 8 deletions(-) diff --git a/pkg/microservice/aslan/core/environment/handler/policy.yaml b/pkg/microservice/aslan/core/environment/handler/policy.yaml index cef0b3b1b..0cb2d2796 100644 --- a/pkg/microservice/aslan/core/environment/handler/policy.yaml +++ b/pkg/microservice/aslan/core/environment/handler/policy.yaml @@ -59,7 +59,7 @@ rules: - method: DELETE endpoint: "/api/aslan/environment/kube/pods/?*" - method: POST - endpoint: "/api/aslan/environment/environments/?*/services/?*/restartNew" + endpoint: "/api/aslan/environment/environments/?*/services/?*/restart" - method: PUT endpoint: "/api/aslan/environment/configmaps" - method: POST diff --git a/pkg/microservice/aslan/core/project/handler/policy.yaml b/pkg/microservice/aslan/core/project/handler/policy.yaml index 810be08e5..c4e18781d 100644 --- a/pkg/microservice/aslan/core/project/handler/policy.yaml +++ b/pkg/microservice/aslan/core/project/handler/policy.yaml @@ -26,8 +26,6 @@ rules: alias: "编辑服务" description: "" rules: - - method: POST - endpoint: "/api/aslan/service/helm/services" - method: POST endpoint: "/api/aslan/service/helm/?*" - method: PUT @@ -54,6 +52,8 @@ rules: endpoint: "/api/aslan/service/loader/preload/?*/?*" - method: POST endpoint: "/api/aslan/service/loader/load/?*/?*" + - method: POST + endpoint: "/api/aslan/service/helm/services" - action: delete_service alias: "删除服务" description: "" diff --git a/pkg/microservice/aslan/core/workflow/testing/handler/policy.yaml b/pkg/microservice/aslan/core/workflow/testing/handler/policy.yaml index f4f130846..56b2c62ad 100644 --- a/pkg/microservice/aslan/core/workflow/testing/handler/policy.yaml +++ b/pkg/microservice/aslan/core/workflow/testing/handler/policy.yaml @@ -14,6 +14,8 @@ rules: endpoint: "/api/aslan/testing/testdetail" - method: GET endpoint: "/api/aslan/workflow/workflow/testName/?*" + - method: GET + endpoint: "/api/aslan/workflow/v2/tasks/workflow/workflow/?*/taskId/?*" - action: edit_test alias: "编辑测试" description: "" diff --git a/pkg/microservice/policy/core/service/bundle/exemption_urls.go b/pkg/microservice/policy/core/service/bundle/exemption_urls.go index 12938788f..60cf5a6b3 100644 --- a/pkg/microservice/policy/core/service/bundle/exemption_urls.go +++ b/pkg/microservice/policy/core/service/bundle/exemption_urls.go @@ -76,10 +76,6 @@ var systemAdminURLs = []*policyRule{ Methods: []string{"POST"}, Endpoints: []string{"api/v1/picket/projects"}, }, - { - Methods: []string{"DELETE"}, - Endpoints: []string{"api/aslan/project/products/?*"}, - }, { Methods: []string{"POST"}, Endpoints: []string{"api/aslan/cluster/clusters"}, @@ -241,7 +237,7 @@ var projectAdminURLs = []*policyRule{ Endpoints: []string{"api/aslan/project/products"}, }, { - Methods: []string{"PUT"}, + Methods: []string{"PUT", "DELETE"}, Endpoints: []string{"api/v1/picket/projects/?*"}, }, { -- Gitee From d1a6cc3e53b8199f93de0beead48c9abc4f5490d Mon Sep 17 00:00:00 2001 From: lou Date: Fri, 12 Nov 2021 21:10:11 +0800 Subject: [PATCH 363/405] typo Signed-off-by: lou --- pkg/microservice/picket/client/aslan/project.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/microservice/picket/client/aslan/project.go b/pkg/microservice/picket/client/aslan/project.go index 0fd20556b..d76f26d61 100644 --- a/pkg/microservice/picket/client/aslan/project.go +++ b/pkg/microservice/picket/client/aslan/project.go @@ -9,7 +9,7 @@ import ( ) func (c *Client) DeleteProject(header http.Header, qs url.Values, productName string) ([]byte, error) { - url := fmt.Sprintf("/project/prodects/%s", productName) + url := fmt.Sprintf("/project/projects/%s", productName) res, err := c.Delete(url, httpclient.SetHeadersFromHTTPHeader(header), httpclient.SetQueryParamsFromValues(qs)) if err != nil { -- Gitee From a016ac256866c49f715b62c52caf38506ca8d171 Mon Sep 17 00:00:00 2001 From: lou Date: Fri, 12 Nov 2021 21:14:20 +0800 Subject: [PATCH 364/405] typo Signed-off-by: lou --- pkg/microservice/picket/client/aslan/project.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/microservice/picket/client/aslan/project.go b/pkg/microservice/picket/client/aslan/project.go index d76f26d61..7aaf053e0 100644 --- a/pkg/microservice/picket/client/aslan/project.go +++ b/pkg/microservice/picket/client/aslan/project.go @@ -9,7 +9,7 @@ import ( ) func (c *Client) DeleteProject(header http.Header, qs url.Values, productName string) ([]byte, error) { - url := fmt.Sprintf("/project/projects/%s", productName) + url := fmt.Sprintf("/project/products/%s", productName) res, err := c.Delete(url, httpclient.SetHeadersFromHTTPHeader(header), httpclient.SetQueryParamsFromValues(qs)) if err != nil { -- Gitee From 5d195d6009df82f007adf47ad06580fda9c7b8b7 Mon Sep 17 00:00:00 2001 From: lou Date: Fri, 12 Nov 2021 22:00:46 +0800 Subject: [PATCH 365/405] add new filter for projects Signed-off-by: lou --- .../aslan/core/project/handler/project.go | 14 +++++-- .../aslan/core/project/service/project.go | 40 +++++++++++++++++-- 2 files changed, 47 insertions(+), 7 deletions(-) diff --git a/pkg/microservice/aslan/core/project/handler/project.go b/pkg/microservice/aslan/core/project/handler/project.go index f7836262e..c2747c35d 100644 --- a/pkg/microservice/aslan/core/project/handler/project.go +++ b/pkg/microservice/aslan/core/project/handler/project.go @@ -25,9 +25,10 @@ import ( ) type projectListArgs struct { - IgnoreNoEnvs bool `json:"ignoreNoEnvs" form:"ignoreNoEnvs"` - Verbosity string `json:"verbosity" form:"verbosity"` - Names []string `json:"names" form:"names"` + IgnoreNoEnvs bool `json:"ignoreNoEnvs" form:"ignoreNoEnvs"` + IgnoreNoVersions bool `json:"ignoreNoVersions" form:"ignoreNoVersions"` + Verbosity string `json:"verbosity" form:"verbosity"` + Names []string `json:"names" form:"names"` } func ListProjects(c *gin.Context) { @@ -47,7 +48,12 @@ func ListProjects(c *gin.Context) { } ctx.Resp, ctx.Err = projectservice.ListProjects( - &projectservice.ProjectListOptions{IgnoreNoEnvs: args.IgnoreNoEnvs, Verbosity: projectservice.QueryVerbosity(args.Verbosity), Names: args.Names}, + &projectservice.ProjectListOptions{ + IgnoreNoEnvs: args.IgnoreNoEnvs, + IgnoreNoVersions: args.IgnoreNoVersions, + Verbosity: projectservice.QueryVerbosity(args.Verbosity), + Names: args.Names, + }, ctx.Logger, ) } diff --git a/pkg/microservice/aslan/core/project/service/project.go b/pkg/microservice/aslan/core/project/service/project.go index 314d9ef67..05358d009 100644 --- a/pkg/microservice/aslan/core/project/service/project.go +++ b/pkg/microservice/aslan/core/project/service/project.go @@ -33,9 +33,10 @@ const ( ) type ProjectListOptions struct { - IgnoreNoEnvs bool - Verbosity QueryVerbosity - Names []string + IgnoreNoEnvs bool + IgnoreNoVersions bool + Verbosity QueryVerbosity + Names []string } type ProjectDetailedRepresentation struct { @@ -139,7 +140,40 @@ func listBriefProjectInfos(opts *ProjectListOptions, logger *zap.SugaredLogger) return res, nil } +func listMinimalProjectInfoForDelivery(opts *ProjectListOptions, logger *zap.SugaredLogger) ([]*ProjectMinimalRepresentation, error) { + var res []*ProjectMinimalRepresentation + names, err := templaterepo.NewProductColl().ListNames(opts.Names) + if err != nil { + logger.Errorf("Failed to list project names, err: %s", err) + return nil, err + } + + nameSet := sets.NewString() + for _, name := range names { + nameSet.Insert(name) + } + namesWithDelivery, err := mongodb.NewDeliveryVersionColl().FindProducts() + if err != nil { + logger.Errorf("Failed to list projects by delivery, err: %s", err) + return nil, err + } + + for _, name := range namesWithDelivery { + // namesWithDelivery may contain projects which are already deleted. + if !nameSet.Has(name) { + continue + } + res = append(res, &ProjectMinimalRepresentation{Name: name}) + } + + return res, nil +} + func listMinimalProjectInfos(opts *ProjectListOptions, logger *zap.SugaredLogger) ([]*ProjectMinimalRepresentation, error) { + if opts.IgnoreNoVersions { + return listMinimalProjectInfoForDelivery(opts, logger) + } + var res []*ProjectMinimalRepresentation names, err := templaterepo.NewProductColl().ListNames(opts.Names) -- Gitee From 87a1b86a395da9de93c73200914933e4081f9c30 Mon Sep 17 00:00:00 2001 From: lou Date: Fri, 12 Nov 2021 22:03:56 +0800 Subject: [PATCH 366/405] remove unused api Signed-off-by: lou --- .../aslan/core/delivery/handler/product.go | 7 ------- pkg/microservice/aslan/core/delivery/handler/router.go | 1 - .../aslan/core/delivery/service/product.go | 10 ---------- 3 files changed, 18 deletions(-) diff --git a/pkg/microservice/aslan/core/delivery/handler/product.go b/pkg/microservice/aslan/core/delivery/handler/product.go index ad252633a..43bf3bfda 100644 --- a/pkg/microservice/aslan/core/delivery/handler/product.go +++ b/pkg/microservice/aslan/core/delivery/handler/product.go @@ -24,13 +24,6 @@ import ( e "github.com/koderover/zadig/pkg/tool/errors" ) -func ListDeliveryProduct(c *gin.Context) { - ctx := internalhandler.NewContext(c) - defer func() { internalhandler.JSONResponse(c, ctx) }() - - ctx.Resp, ctx.Err = deliveryservice.FindDeliveryProduct(ctx.Logger) -} - func GetProductByDeliveryInfo(c *gin.Context) { ctx := internalhandler.NewContext(c) defer func() { internalhandler.JSONResponse(c, ctx) }() diff --git a/pkg/microservice/aslan/core/delivery/handler/router.go b/pkg/microservice/aslan/core/delivery/handler/router.go index 362ce68c5..889b7e7aa 100644 --- a/pkg/microservice/aslan/core/delivery/handler/router.go +++ b/pkg/microservice/aslan/core/delivery/handler/router.go @@ -37,7 +37,6 @@ func (*Router) Inject(router *gin.RouterGroup) { deliveryProduct := router.Group("products") { - deliveryProduct.GET("", ListDeliveryProduct) deliveryProduct.GET("/:releaseId", GetProductByDeliveryInfo) } diff --git a/pkg/microservice/aslan/core/delivery/service/product.go b/pkg/microservice/aslan/core/delivery/service/product.go index d9c4e5612..ece5c4adc 100644 --- a/pkg/microservice/aslan/core/delivery/service/product.go +++ b/pkg/microservice/aslan/core/delivery/service/product.go @@ -24,16 +24,6 @@ import ( e "github.com/koderover/zadig/pkg/tool/errors" ) -func FindDeliveryProduct(log *zap.SugaredLogger) ([]string, error) { - productNames, err := commonrepo.NewDeliveryVersionColl().FindProducts() - if err != nil { - log.Errorf("find FindDeliveryProduct error: %v", err) - return []string{}, e.ErrFindDeliveryProducts - } - - return productNames, err -} - func GetProductByDeliveryInfo(username, releaseID string, log *zap.SugaredLogger) (*commonmodels.Product, error) { version := new(commonrepo.DeliveryVersionArgs) version.ID = releaseID -- Gitee From 77f3c3352f6f9075ea9094dbfdc19f16e5c4684f Mon Sep 17 00:00:00 2001 From: mouuii Date: Mon, 15 Nov 2021 10:56:58 +0800 Subject: [PATCH 367/405] refactor show Signed-off-by: mouuii --- pkg/cli/initconfig/cmd/project-admin.yaml | 2 +- pkg/cli/initconfig/cmd/read-only.yaml | 2 +- pkg/microservice/policy/core/service/bundle/rego/authz.rego | 2 +- pkg/microservice/policy/core/service/role.go | 4 ++++ pkg/setting/consts.go | 4 ++-- 5 files changed, 9 insertions(+), 5 deletions(-) diff --git a/pkg/cli/initconfig/cmd/project-admin.yaml b/pkg/cli/initconfig/cmd/project-admin.yaml index b64adb5c0..68938e3f1 100644 --- a/pkg/cli/initconfig/cmd/project-admin.yaml +++ b/pkg/cli/initconfig/cmd/project-admin.yaml @@ -1,4 +1,4 @@ -name: admin +name: project-admin rules: - verbs: - "*" diff --git a/pkg/cli/initconfig/cmd/read-only.yaml b/pkg/cli/initconfig/cmd/read-only.yaml index c781fb94c..d6bd5d64b 100644 --- a/pkg/cli/initconfig/cmd/read-only.yaml +++ b/pkg/cli/initconfig/cmd/read-only.yaml @@ -1,4 +1,4 @@ -name: readonly +name: read-only rules: - verbs: - get_workflow diff --git a/pkg/microservice/policy/core/service/bundle/rego/authz.rego b/pkg/microservice/policy/core/service/bundle/rego/authz.rego index 81ce157bc..45fd16e0d 100644 --- a/pkg/microservice/policy/core/service/bundle/rego/authz.rego +++ b/pkg/microservice/policy/core/service/bundle/rego/authz.rego @@ -85,7 +85,7 @@ user_is_project_admin { some role allowed_roles[role] - role.name == "admin" + role.name == "project-admin" #role.namespace == project_name } diff --git a/pkg/microservice/policy/core/service/role.go b/pkg/microservice/policy/core/service/role.go index 1735b7f2c..d281d6871 100644 --- a/pkg/microservice/policy/core/service/role.go +++ b/pkg/microservice/policy/core/service/role.go @@ -23,6 +23,7 @@ import ( "github.com/koderover/zadig/pkg/microservice/policy/core/repository/models" "github.com/koderover/zadig/pkg/microservice/policy/core/repository/mongodb" + "github.com/koderover/zadig/pkg/setting" ) type Role struct { @@ -92,6 +93,9 @@ func ListRoles(projectName string, _ *zap.SugaredLogger) ([]*Role, error) { return nil, err } for _, v := range projectRoles { + if v.Name == string(setting.Contributor) { + continue + } roles = append(roles, &Role{ Name: v.Name, }) diff --git a/pkg/setting/consts.go b/pkg/setting/consts.go index e81dafee7..c8c77099e 100644 --- a/pkg/setting/consts.go +++ b/pkg/setting/consts.go @@ -536,8 +536,8 @@ type RoleType string const ( Contributor RoleType = "contributor" - ReadOnly RoleType = "readonly" - Admin RoleType = "admin" + ReadOnly RoleType = "read-only" + Admin RoleType = "project-admin" RoleBindingNameFmt string = "user:%s,role:%s,project:%s" ) -- Gitee From d4c28b687b75162a7b35c10a0d7bb8b98a9528ea Mon Sep 17 00:00:00 2001 From: lou Date: Mon, 15 Nov 2021 11:24:41 +0800 Subject: [PATCH 368/405] improve code Signed-off-by: lou --- .../aslan/core/project/service/project.go | 31 ++++++------------- 1 file changed, 10 insertions(+), 21 deletions(-) diff --git a/pkg/microservice/aslan/core/project/service/project.go b/pkg/microservice/aslan/core/project/service/project.go index 05358d009..42bdef1f8 100644 --- a/pkg/microservice/aslan/core/project/service/project.go +++ b/pkg/microservice/aslan/core/project/service/project.go @@ -140,18 +140,8 @@ func listBriefProjectInfos(opts *ProjectListOptions, logger *zap.SugaredLogger) return res, nil } -func listMinimalProjectInfoForDelivery(opts *ProjectListOptions, logger *zap.SugaredLogger) ([]*ProjectMinimalRepresentation, error) { +func listMinimalProjectInfoForDelivery(_ *ProjectListOptions, nameSet sets.String, logger *zap.SugaredLogger) ([]*ProjectMinimalRepresentation, error) { var res []*ProjectMinimalRepresentation - names, err := templaterepo.NewProductColl().ListNames(opts.Names) - if err != nil { - logger.Errorf("Failed to list project names, err: %s", err) - return nil, err - } - - nameSet := sets.NewString() - for _, name := range names { - nameSet.Insert(name) - } namesWithDelivery, err := mongodb.NewDeliveryVersionColl().FindProducts() if err != nil { logger.Errorf("Failed to list projects by delivery, err: %s", err) @@ -170,18 +160,22 @@ func listMinimalProjectInfoForDelivery(opts *ProjectListOptions, logger *zap.Sug } func listMinimalProjectInfos(opts *ProjectListOptions, logger *zap.SugaredLogger) ([]*ProjectMinimalRepresentation, error) { - if opts.IgnoreNoVersions { - return listMinimalProjectInfoForDelivery(opts, logger) - } - var res []*ProjectMinimalRepresentation - names, err := templaterepo.NewProductColl().ListNames(opts.Names) if err != nil { logger.Errorf("Failed to list project names, err: %s", err) return nil, err } + nameSet := sets.NewString() + for _, name := range names { + nameSet.Insert(name) + } + + if opts.IgnoreNoVersions { + return listMinimalProjectInfoForDelivery(opts, nameSet, logger) + } + if !opts.IgnoreNoEnvs { for _, name := range names { res = append(res, &ProjectMinimalRepresentation{Name: name}) @@ -190,11 +184,6 @@ func listMinimalProjectInfos(opts *ProjectListOptions, logger *zap.SugaredLogger return res, nil } - nameSet := sets.NewString() - for _, name := range names { - nameSet.Insert(name) - } - nameWithEnvSet, _, err := getProjectsWithEnvs(opts) if err != nil { logger.Errorf("Failed to list projects, err: %s", err) -- Gitee From 0ec3b5710b0c9484ea645afac1e7ae0dea9588e0 Mon Sep 17 00:00:00 2001 From: mouuii Date: Mon, 15 Nov 2021 13:52:53 +0800 Subject: [PATCH 369/405] refactor show Signed-off-by: mouuii --- pkg/microservice/policy/core/service/role.go | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/microservice/policy/core/service/role.go b/pkg/microservice/policy/core/service/role.go index d281d6871..d21a68219 100644 --- a/pkg/microservice/policy/core/service/role.go +++ b/pkg/microservice/policy/core/service/role.go @@ -93,6 +93,7 @@ func ListRoles(projectName string, _ *zap.SugaredLogger) ([]*Role, error) { return nil, err } for _, v := range projectRoles { + // front end doesn't need to see contributor role if v.Name == string(setting.Contributor) { continue } -- Gitee From 1ff0b42f4fd515165e15f34b654b27468ac8d4b3 Mon Sep 17 00:00:00 2001 From: mouuii Date: Mon, 15 Nov 2021 13:53:39 +0800 Subject: [PATCH 370/405] refactor show Signed-off-by: mouuii --- pkg/microservice/policy/core/service/role.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/microservice/policy/core/service/role.go b/pkg/microservice/policy/core/service/role.go index d21a68219..c8179e625 100644 --- a/pkg/microservice/policy/core/service/role.go +++ b/pkg/microservice/policy/core/service/role.go @@ -93,7 +93,7 @@ func ListRoles(projectName string, _ *zap.SugaredLogger) ([]*Role, error) { return nil, err } for _, v := range projectRoles { - // front end doesn't need to see contributor role + // frontend doesn't need to see contributor role if v.Name == string(setting.Contributor) { continue } -- Gitee From daa45337b549bcd3c3b7222d0ee479d20598c4e9 Mon Sep 17 00:00:00 2001 From: lou Date: Mon, 15 Nov 2021 17:06:45 +0800 Subject: [PATCH 371/405] update after review Signed-off-by: lou --- pkg/microservice/aslan/core/project/service/project.go | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/pkg/microservice/aslan/core/project/service/project.go b/pkg/microservice/aslan/core/project/service/project.go index 42bdef1f8..4c9e1fb92 100644 --- a/pkg/microservice/aslan/core/project/service/project.go +++ b/pkg/microservice/aslan/core/project/service/project.go @@ -167,11 +167,7 @@ func listMinimalProjectInfos(opts *ProjectListOptions, logger *zap.SugaredLogger return nil, err } - nameSet := sets.NewString() - for _, name := range names { - nameSet.Insert(name) - } - + nameSet := sets.NewString(names...) if opts.IgnoreNoVersions { return listMinimalProjectInfoForDelivery(opts, nameSet, logger) } -- Gitee From 00ce9eae09b34d4e2274fa02573fee9ac71a612b Mon Sep 17 00:00:00 2001 From: lou Date: Mon, 15 Nov 2021 17:08:58 +0800 Subject: [PATCH 372/405] fix users/search permission Signed-off-by: lou --- pkg/microservice/policy/core/service/bundle/exemption_urls.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/microservice/policy/core/service/bundle/exemption_urls.go b/pkg/microservice/policy/core/service/bundle/exemption_urls.go index 60cf5a6b3..9c56543b3 100644 --- a/pkg/microservice/policy/core/service/bundle/exemption_urls.go +++ b/pkg/microservice/policy/core/service/bundle/exemption_urls.go @@ -197,7 +197,7 @@ var systemAdminURLs = []*policyRule{ Endpoints: []string{"api/aslan/system/proxy/config"}, }, { - Methods: []string{"*"}, + Methods: []string{"GET", "PUT", "PATCH", "DELETE"}, Endpoints: []string{"api/v1/users/?*"}, }, { -- Gitee From ec8b10e6d372300e2b294d4da135abc4498e3e74 Mon Sep 17 00:00:00 2001 From: mouuii Date: Mon, 15 Nov 2021 17:14:40 +0800 Subject: [PATCH 373/405] refactor show Signed-off-by: mouuii --- pkg/cli/upgradeassistant/internal/mongo/mongo.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/pkg/cli/upgradeassistant/internal/mongo/mongo.go b/pkg/cli/upgradeassistant/internal/mongo/mongo.go index 90180fd03..015b24e0b 100644 --- a/pkg/cli/upgradeassistant/internal/mongo/mongo.go +++ b/pkg/cli/upgradeassistant/internal/mongo/mongo.go @@ -15,6 +15,7 @@ import ( func (c *CodehostColl) ChangeType(ID int, sourceType string) error { query := bson.M{"id": ID} + preType := sourceType if sourceType == "1" { sourceType = "gitlab" } else if sourceType == "2" { @@ -23,8 +24,6 @@ func (c *CodehostColl) ChangeType(ID int, sourceType string) error { sourceType = "gerrit" } else if sourceType == "4" { sourceType = "codehub" - } else if sourceType == "5" { - sourceType = "ilyshin" } change := bson.M{"$set": bson.M{ @@ -35,7 +34,7 @@ func (c *CodehostColl) ChangeType(ID int, sourceType string) error { log.Error("repository update fail") return err } - log.Infof("success to change id:%d to type:%s", ID, sourceType) + log.Infof("success to change id:%d type:%s to type:%s", ID, preType, sourceType) return nil } -- Gitee From ea571df39c4ddfa52e42fa87ff8531d4b1597eb3 Mon Sep 17 00:00:00 2001 From: mouuii Date: Mon, 15 Nov 2021 17:17:08 +0800 Subject: [PATCH 374/405] refactor show Signed-off-by: mouuii --- pkg/cli/upgradeassistant/internal/mongo/mongo.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/pkg/cli/upgradeassistant/internal/mongo/mongo.go b/pkg/cli/upgradeassistant/internal/mongo/mongo.go index 015b24e0b..0ebfce203 100644 --- a/pkg/cli/upgradeassistant/internal/mongo/mongo.go +++ b/pkg/cli/upgradeassistant/internal/mongo/mongo.go @@ -49,8 +49,6 @@ func (c *CodehostColl) RollbackChangeType(ID int, sourceType string) error { sourceType = "3" } else if sourceType == "codehub" { sourceType = "4" - } else if sourceType == "ilyshin" { - sourceType = "5" } change := bson.M{"$set": bson.M{ -- Gitee From 56e5f2747289d054d2d6ac9354571b43065752d6 Mon Sep 17 00:00:00 2001 From: liu deyi Date: Mon, 15 Nov 2021 17:45:59 +0800 Subject: [PATCH 375/405] fix auto create workflow name bug Signed-off-by: liu deyi --- .../aslan/core/workflow/service/workflow/workflow.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/microservice/aslan/core/workflow/service/workflow/workflow.go b/pkg/microservice/aslan/core/workflow/service/workflow/workflow.go index 3bcaff9d8..98387c829 100644 --- a/pkg/microservice/aslan/core/workflow/service/workflow/workflow.go +++ b/pkg/microservice/aslan/core/workflow/service/workflow/workflow.go @@ -63,7 +63,7 @@ func (args *workflowCreateArgs) addWorkflowArg(envName string, buildStageEnabled wName = fmt.Sprintf("%s-%s-workflow", args.productName, "ops") } // The hosting env workflow name is not bound to the environment - if envName == "" { + if !artifactStageEnabled && envName == "" { wName = fmt.Sprintf("%s-workflow", args.productName) } args.argsMap[wName] = &workflowCreateArg{ -- Gitee From 72c44183d595ceb6f405f0e316f44af2ab1484ba Mon Sep 17 00:00:00 2001 From: lou Date: Mon, 15 Nov 2021 18:49:25 +0800 Subject: [PATCH 376/405] webhook rollback Signed-off-by: lou --- pkg/cli/upgradeassistant/cmd/migrate/170.go | 33 +++++++++++-- .../repository/models/organization.go | 10 ++++ .../repository/mongodb/organization.go | 48 +++++++++++++++++++ .../core/common/service/github/webhook.go | 4 +- .../core/common/service/gitlab/webhook.go | 4 +- .../core/workflow/service/webhook/github.go | 2 +- 6 files changed, 92 insertions(+), 9 deletions(-) create mode 100644 pkg/cli/upgradeassistant/internal/repository/models/organization.go create mode 100644 pkg/cli/upgradeassistant/internal/repository/mongodb/organization.go diff --git a/pkg/cli/upgradeassistant/cmd/migrate/170.go b/pkg/cli/upgradeassistant/cmd/migrate/170.go index 71f721a05..629ad1d2e 100644 --- a/pkg/cli/upgradeassistant/cmd/migrate/170.go +++ b/pkg/cli/upgradeassistant/cmd/migrate/170.go @@ -17,9 +17,11 @@ limitations under the License. package migrate import ( + internalmongodb "github.com/koderover/zadig/pkg/cli/upgradeassistant/internal/repository/mongodb" "github.com/koderover/zadig/pkg/cli/upgradeassistant/internal/upgradepath" "github.com/koderover/zadig/pkg/microservice/aslan/config" "github.com/koderover/zadig/pkg/microservice/aslan/core/common/repository/mongodb" + gitservice "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/git" "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/github" "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/gitlab" "github.com/koderover/zadig/pkg/setting" @@ -36,7 +38,7 @@ func init() { func V160ToV170() error { log.Info("Migrating data from 1.6.0 to 1.7.0") - err := refreshWebHookSecret() + err := refreshWebHookSecret(gitservice.GetHookSecret()) if err != nil { log.Errorf("Failed to refresh webhook secret, err: %s", err) return err @@ -47,14 +49,27 @@ func V160ToV170() error { func V170ToV160() error { log.Info("Rollback data from 1.7.0 to 1.6.0") + + token := getWebHookTokenFromOrganization() + if token == "" { + return nil + } + + log.Info("Start to rollback all webhook secrets") + err := refreshWebHookSecret(token) + if err != nil { + log.Errorf("Failed to refresh webhook secret, err: %s", err) + return err + } + return nil } type hookRefresher interface { - RefreshWebHookSecret(owner, repo, hookID string) error + RefreshWebHookSecret(secret, owner, repo, hookID string) error } -func refreshWebHookSecret() error { +func refreshWebHookSecret(secret string) error { hooks, err := mongodb.NewWebHookColl().List() if err != nil { log.Errorf("Failed to list webhooks, err: %s", err) @@ -89,7 +104,7 @@ func refreshWebHookSecret() error { continue } - if err = cl.RefreshWebHookSecret(hook.Owner, hook.Repo, hook.HookID); err != nil { + if err = cl.RefreshWebHookSecret(secret, hook.Owner, hook.Repo, hook.HookID); err != nil { log.Warnf("Failed to refresh webhook secret for hook %d in %s/%s, err: %s", hook.HookID, hook.Owner, hook.Repo, err) continue } @@ -114,3 +129,13 @@ func getCodeHostByAddressAndOwner(address, owner string, all []*systemconfig.Cod return nil } + +func getWebHookTokenFromOrganization() string { + org, found, err := internalmongodb.NewOrganizationColl().Get(1) + if err != nil || !found { + log.Warnf("Failed to get organization, err: %s", err) + return "" + } + + return org.Token +} diff --git a/pkg/cli/upgradeassistant/internal/repository/models/organization.go b/pkg/cli/upgradeassistant/internal/repository/models/organization.go new file mode 100644 index 000000000..33b2ccd93 --- /dev/null +++ b/pkg/cli/upgradeassistant/internal/repository/models/organization.go @@ -0,0 +1,10 @@ +package models + +type Organization struct { + ID int `bson:"id" json:"id"` + Token string `bson:"token,omitempty" json:"token,omitempty"` +} + +func (Organization) TableName() string { + return "organization" +} diff --git a/pkg/cli/upgradeassistant/internal/repository/mongodb/organization.go b/pkg/cli/upgradeassistant/internal/repository/mongodb/organization.go new file mode 100644 index 000000000..c5740f195 --- /dev/null +++ b/pkg/cli/upgradeassistant/internal/repository/mongodb/organization.go @@ -0,0 +1,48 @@ +package mongodb + +import ( + "context" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo" + + "github.com/koderover/zadig/pkg/cli/upgradeassistant/internal/repository/models" + "github.com/koderover/zadig/pkg/config" + mongotool "github.com/koderover/zadig/pkg/tool/mongo" +) + +type OrganizationColl struct { + *mongo.Collection + + coll string +} + +func NewOrganizationColl() *OrganizationColl { + name := models.Organization{}.TableName() + return &OrganizationColl{ + Collection: mongotool.Database(config.MongoDatabase()).Collection(name), + coll: name, + } +} + +func (c *OrganizationColl) GetCollectionName() string { + return c.coll +} + +func (c *OrganizationColl) EnsureIndex(_ context.Context) error { + return nil +} + +func (c *OrganizationColl) Get(id int) (*models.Organization, bool, error) { + org := &models.Organization{} + query := bson.M{"id": id} + + err := c.FindOne(context.TODO(), query).Decode(org) + if err != nil { + if err == mongo.ErrNoDocuments { + return nil, false, nil + } + return nil, false, err + } + return org, true, nil +} diff --git a/pkg/microservice/aslan/core/common/service/github/webhook.go b/pkg/microservice/aslan/core/common/service/github/webhook.go index 4544ea736..645bf05d1 100644 --- a/pkg/microservice/aslan/core/common/service/github/webhook.go +++ b/pkg/microservice/aslan/core/common/service/github/webhook.go @@ -46,14 +46,14 @@ func (c *Client) DeleteWebHook(owner, repo, hookID string) error { return c.DeleteHook(context.TODO(), owner, repo, hookIDInt) } -func (c *Client) RefreshWebHookSecret(owner, repo, hookID string) error { +func (c *Client) RefreshWebHookSecret(secret, owner, repo, hookID string) error { hookIDInt, err := strconv.ParseInt(hookID, 10, 64) if err != nil { return err } _, err = c.UpdateHook(context.TODO(), owner, repo, hookIDInt, &git.Hook{ URL: config.WebHookURL(), - Secret: gitservice.GetHookSecret(), + Secret: secret, }) return err diff --git a/pkg/microservice/aslan/core/common/service/gitlab/webhook.go b/pkg/microservice/aslan/core/common/service/gitlab/webhook.go index 7251fea98..f1a1e772e 100644 --- a/pkg/microservice/aslan/core/common/service/gitlab/webhook.go +++ b/pkg/microservice/aslan/core/common/service/gitlab/webhook.go @@ -45,14 +45,14 @@ func (c *Client) DeleteWebHook(owner, repo, hookID string) error { return c.DeleteProjectHook(owner, repo, hookIDInt) } -func (c *Client) RefreshWebHookSecret(owner, repo, hookID string) error { +func (c *Client) RefreshWebHookSecret(secret, owner, repo, hookID string) error { hookIDInt, err := strconv.Atoi(hookID) if err != nil { return err } _, err = c.UpdateProjectHook(owner, repo, hookIDInt, &git.Hook{ URL: config.WebHookURL(), - Secret: gitservice.GetHookSecret(), + Secret: secret, }) return err diff --git a/pkg/microservice/aslan/core/workflow/service/webhook/github.go b/pkg/microservice/aslan/core/workflow/service/webhook/github.go index 07af078ca..195536612 100644 --- a/pkg/microservice/aslan/core/workflow/service/webhook/github.go +++ b/pkg/microservice/aslan/core/workflow/service/webhook/github.go @@ -173,7 +173,7 @@ func prEventToPipelineTasks(event *github.PullRequestEvent, requestID string, lo commitMessage = *event.PullRequest.Title ) - address, err := util.GetAddress(event.Repo.GetURL()) + address, err := util.GetAddress(event.Repo.GetHTMLURL()) if err != nil { log.Errorf("GetAddress failed, url: %s, err: %s", event.Repo.GetURL(), err) return nil, err -- Gitee From 98e848e9520c281c49943f786cf852d8cb40461b Mon Sep 17 00:00:00 2001 From: lou Date: Mon, 15 Nov 2021 19:06:32 +0800 Subject: [PATCH 377/405] fix all users role Signed-off-by: lou --- .../picket/core/filter/service/rolebinding.go | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/pkg/microservice/picket/core/filter/service/rolebinding.go b/pkg/microservice/picket/core/filter/service/rolebinding.go index b8740c9e9..9ec4293d6 100644 --- a/pkg/microservice/picket/core/filter/service/rolebinding.go +++ b/pkg/microservice/picket/core/filter/service/rolebinding.go @@ -10,6 +10,8 @@ import ( "github.com/koderover/zadig/pkg/shared/client/user" ) +const allUsers = "*" + type roleBinding struct { *policy.RoleBinding Username string `json:"username"` @@ -29,7 +31,9 @@ func ListRoleBindings(header http.Header, qs url.Values, logger *zap.SugaredLogg var uids []string uidToRoleBinding := make(map[string][]*roleBinding) for _, rb := range rbs { - uids = append(uids, rb.UID) + if rb.UID != allUsers { + uids = append(uids, rb.UID) + } uidToRoleBinding[rb.UID] = append(uidToRoleBinding[rb.UID], &roleBinding{RoleBinding: rb}) } @@ -55,5 +59,8 @@ func ListRoleBindings(header http.Header, qs url.Values, logger *zap.SugaredLogg } } + // add all 'allUsers' roles + res = append(res, uidToRoleBinding[allUsers]...) + return res, nil } -- Gitee From 4614a720729e1d8342ff42950a14cc4ecfbf8d05 Mon Sep 17 00:00:00 2001 From: panxunying <641770806@qq.com> Date: Mon, 15 Nov 2021 19:09:10 +0800 Subject: [PATCH 378/405] update third party params Signed-off-by: panxunying <641770806@qq.com> --- pkg/microservice/user/core/handler/login/third_party.go | 3 +++ pkg/microservice/user/core/service/user/user.go | 7 ++++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/pkg/microservice/user/core/handler/login/third_party.go b/pkg/microservice/user/core/handler/login/third_party.go index b9cd4a89b..c4b555a78 100644 --- a/pkg/microservice/user/core/handler/login/third_party.go +++ b/pkg/microservice/user/core/handler/login/third_party.go @@ -84,6 +84,9 @@ func verifyAndDecode(ctx context.Context, code string) (*login.Claims, error) { if err != nil { return nil, err } + if len(claims.Name) == 0 { + claims.Name = claims.PreferredUsername + } return &claims, nil } diff --git a/pkg/microservice/user/core/service/user/user.go b/pkg/microservice/user/core/service/user/user.go index 5bebb4687..f43ac7eca 100644 --- a/pkg/microservice/user/core/service/user/user.go +++ b/pkg/microservice/user/core/service/user/user.go @@ -113,8 +113,9 @@ func SearchAndSyncUser(ldapId string, logger *zap.SugaredLogger) error { searchRequest := ldapv3.NewSearchRequest( config.GroupSearch.BaseDN, ldapv3.ScopeWholeSubtree, ldapv3.NeverDerefAliases, 0, 0, false, - config.GroupSearch.Filter, // The filter to apply - []string{config.UserSearch.NameAttr}, // A list attributes to retrieve + config.GroupSearch.Filter, // The filter to apply + []string{config.GroupSearch.NameAttr, config.UserSearch.NameAttr, config.UserSearch.PreferredUsernameAttrAttr, + config.UserSearch.EmailAttr}, // A list attributes to retrieve nil, ) @@ -124,7 +125,7 @@ func SearchAndSyncUser(ldapId string, logger *zap.SugaredLogger) error { return err } for _, entry := range sr.Entries { - account := config.UserSearch.Username + account := config.UserSearch.PreferredUsernameAttrAttr name := account if len(config.UserSearch.NameAttr) != 0 { name = config.UserSearch.NameAttr -- Gitee From bee8e7030d0c1fce328a6b5d9fe3702ce37ac653 Mon Sep 17 00:00:00 2001 From: lou Date: Mon, 15 Nov 2021 19:13:09 +0800 Subject: [PATCH 379/405] update after review Signed-off-by: lou --- .../internal/repository/mongodb/organization.go | 8 -------- 1 file changed, 8 deletions(-) diff --git a/pkg/cli/upgradeassistant/internal/repository/mongodb/organization.go b/pkg/cli/upgradeassistant/internal/repository/mongodb/organization.go index c5740f195..41452b31c 100644 --- a/pkg/cli/upgradeassistant/internal/repository/mongodb/organization.go +++ b/pkg/cli/upgradeassistant/internal/repository/mongodb/organization.go @@ -25,14 +25,6 @@ func NewOrganizationColl() *OrganizationColl { } } -func (c *OrganizationColl) GetCollectionName() string { - return c.coll -} - -func (c *OrganizationColl) EnsureIndex(_ context.Context) error { - return nil -} - func (c *OrganizationColl) Get(id int) (*models.Organization, bool, error) { org := &models.Organization{} query := bson.M{"id": id} -- Gitee From caec6baa3060c8f7c3bbc706a5584b47f1b8fa24 Mon Sep 17 00:00:00 2001 From: mouuii Date: Mon, 15 Nov 2021 19:35:45 +0800 Subject: [PATCH 380/405] refactor show Signed-off-by: mouuii --- pkg/cli/upgradeassistant/cmd/migrate/170.go | 6 ++- .../upgradeassistant/internal/mongo/mongo.go | 38 ++++++++++++++++++- .../codehost/repository/mongodb/codehost.go | 2 +- 3 files changed, 41 insertions(+), 5 deletions(-) diff --git a/pkg/cli/upgradeassistant/cmd/migrate/170.go b/pkg/cli/upgradeassistant/cmd/migrate/170.go index 3856fd4f1..f97d29915 100644 --- a/pkg/cli/upgradeassistant/cmd/migrate/170.go +++ b/pkg/cli/upgradeassistant/cmd/migrate/170.go @@ -127,9 +127,10 @@ func getCodeHostByAddressAndOwner(address, owner string, all []*systemconfig.Cod return nil } +// change type "1,2,3,4" to "github,gitlab..." func changeCodehostType() error { // get all codehosts - codeHosts, err := systemconfig.New().ListCodeHosts() + codeHosts, err := mongo.NewCodehostColl().ListCodeHosts() if err != nil { log.Errorf("fail to list codehosts, err: %s", err) return err @@ -144,9 +145,10 @@ func changeCodehostType() error { return nil } +// rollback type "github,gitlab..." to "1,2..." func RollbackchangeCodehostType() error { // get all codehosts - codeHosts, err := systemconfig.New().ListCodeHosts() + codeHosts, err := mongo.NewCodehostColl().ListCodeHosts() if err != nil { log.Errorf("fail to list codehosts, err: %s", err) return err diff --git a/pkg/cli/upgradeassistant/internal/mongo/mongo.go b/pkg/cli/upgradeassistant/internal/mongo/mongo.go index 0ebfce203..bbc77e875 100644 --- a/pkg/cli/upgradeassistant/internal/mongo/mongo.go +++ b/pkg/cli/upgradeassistant/internal/mongo/mongo.go @@ -24,6 +24,8 @@ func (c *CodehostColl) ChangeType(ID int, sourceType string) error { sourceType = "gerrit" } else if sourceType == "4" { sourceType = "codehub" + } else { + return nil } change := bson.M{"$set": bson.M{ @@ -31,7 +33,7 @@ func (c *CodehostColl) ChangeType(ID int, sourceType string) error { }} _, err := c.Collection.UpdateOne(context.TODO(), query, change) if err != nil { - log.Error("repository update fail") + log.Errorf("repository update fail,err:%s", err) return err } log.Infof("success to change id:%d type:%s to type:%s", ID, preType, sourceType) @@ -56,13 +58,45 @@ func (c *CodehostColl) RollbackChangeType(ID int, sourceType string) error { }} _, err := c.Collection.UpdateOne(context.TODO(), query, change) if err != nil { - log.Error("repository update fail") + log.Errorf("repository update fail,err:%s", err) return err } log.Infof("success to rollback id:%d to type:%s", ID, sourceType) return nil } +type CodeHost struct { + ID int `bson:"id" json:"id"` + Type string `bson:"type" json:"type"` + Address string `bson:"address" json:"address"` + IsReady string `bson:"is_ready" json:"ready"` + AccessToken string `bson:"access_token" json:"accessToken"` + RefreshToken string `bson:"refresh_token" json:"refreshToken"` + Namespace string `bson:"namespace" json:"namespace"` + ApplicationId string `bson:"application_id" json:"applicationId"` + Region string `bson:"region" json:"region,omitempty"` + Username string `bson:"username" json:"username,omitempty"` + Password string `bson:"password" json:"password,omitempty"` + ClientSecret string `bson:"client_secret" json:"clientSecret"` + CreatedAt int64 `bson:"created_at" json:"created_at"` + UpdatedAt int64 `bson:"updated_at" json:"updated_at"` + DeletedAt int64 `bson:"deleted_at" json:"deleted_at"` +} + +func (c *CodehostColl) ListCodeHosts() ([]*CodeHost, error) { + codeHosts := make([]*CodeHost, 0) + + cursor, err := c.Collection.Find(context.TODO(), bson.M{}) + if err != nil { + return nil, err + } + err = cursor.All(context.TODO(), &codeHosts) + if err != nil { + return nil, err + } + return codeHosts, nil +} + type CodehostColl struct { *mongo.Collection diff --git a/pkg/microservice/systemconfig/core/codehost/repository/mongodb/codehost.go b/pkg/microservice/systemconfig/core/codehost/repository/mongodb/codehost.go index 65bfa37a4..5b7170bbf 100644 --- a/pkg/microservice/systemconfig/core/codehost/repository/mongodb/codehost.go +++ b/pkg/microservice/systemconfig/core/codehost/repository/mongodb/codehost.go @@ -119,7 +119,7 @@ func (c *CodehostColl) DeleteCodeHostByID(ID int) error { }} _, err := c.Collection.UpdateOne(context.TODO(), query, change) if err != nil { - log.Error("repository update fail") + log.Errorf("repository update fail,err:%s", err) return err } return nil -- Gitee From 45816ed9960869cf762d3846705d74102e0e9ee4 Mon Sep 17 00:00:00 2001 From: mouuii Date: Mon, 15 Nov 2021 19:37:06 +0800 Subject: [PATCH 381/405] refactor show Signed-off-by: mouuii --- pkg/cli/upgradeassistant/cmd/migrate/170.go | 10 +++++----- pkg/cli/upgradeassistant/internal/mongo/mongo.go | 2 ++ 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/pkg/cli/upgradeassistant/cmd/migrate/170.go b/pkg/cli/upgradeassistant/cmd/migrate/170.go index f97d29915..39e79538d 100644 --- a/pkg/cli/upgradeassistant/cmd/migrate/170.go +++ b/pkg/cli/upgradeassistant/cmd/migrate/170.go @@ -138,8 +138,8 @@ func changeCodehostType() error { // change type to readable string for _, v := range codeHosts { if err := mongo.NewCodehostColl().ChangeType(v.ID, v.Type); err != nil { - log.Errorf("fail to change id:%d type:%s , err: %s", v.ID, v.Type, err) - return err + log.Warnf("fail to change id:%d type:%s , err: %s", v.ID, v.Type, err) + continue } } return nil @@ -155,9 +155,9 @@ func RollbackchangeCodehostType() error { } // rollback change type to readable string for _, v := range codeHosts { - if err := mongo.NewCodehostColl().ChangeType(v.ID, v.Type); err != nil { - log.Errorf("fail to rollback id:%d type:%s , err: %s", v.ID, v.Type, err) - return err + if err := mongo.NewCodehostColl().RollbackChangeType(v.ID, v.Type); err != nil { + log.Warnf("fail to rollback id:%d type:%s , err: %s", v.ID, v.Type, err) + continue } } return nil diff --git a/pkg/cli/upgradeassistant/internal/mongo/mongo.go b/pkg/cli/upgradeassistant/internal/mongo/mongo.go index bbc77e875..5082a7233 100644 --- a/pkg/cli/upgradeassistant/internal/mongo/mongo.go +++ b/pkg/cli/upgradeassistant/internal/mongo/mongo.go @@ -51,6 +51,8 @@ func (c *CodehostColl) RollbackChangeType(ID int, sourceType string) error { sourceType = "3" } else if sourceType == "codehub" { sourceType = "4" + } else { + return nil } change := bson.M{"$set": bson.M{ -- Gitee From 2185ef3a51e57fc84225efae99d888aca881955c Mon Sep 17 00:00:00 2001 From: mouuii Date: Mon, 15 Nov 2021 19:51:46 +0800 Subject: [PATCH 382/405] add service policy yaml url Signed-off-by: mouuii --- .../aslan/core/project/handler/policy.yaml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/pkg/microservice/aslan/core/project/handler/policy.yaml b/pkg/microservice/aslan/core/project/handler/policy.yaml index c4e18781d..6aeb33612 100644 --- a/pkg/microservice/aslan/core/project/handler/policy.yaml +++ b/pkg/microservice/aslan/core/project/handler/policy.yaml @@ -40,6 +40,8 @@ rules: endpoint: "/api/aslan/project/products/?*" - method: PUT endpoint: "/api/aslan/project/products/?*/searching-rules" + - method: POST + endpoint: "/api/aslan/service/template/reload" - action: create_service alias: "新建服务" description: "" @@ -54,6 +56,16 @@ rules: endpoint: "/api/aslan/service/loader/load/?*/?*" - method: POST endpoint: "/api/aslan/service/helm/services" + - method: GET + endpoint: "/api/aslan/template/yaml" + - method: GET + endpoint: "/api/aslan/template/yaml/?*" + - method: POST + endpoint: "/api/aslan/service/template/load" + - method: GET + endpoint: "/api/aslan/template/charts/service-demo/variables" + - method: POST + endpoint: "/api/aslan/service/helm/services/bulk" - action: delete_service alias: "删除服务" description: "" -- Gitee From b4c82e1560ff91fcc91b621e211bd444474cced7 Mon Sep 17 00:00:00 2001 From: mouuii Date: Mon, 15 Nov 2021 20:02:07 +0800 Subject: [PATCH 383/405] add service policy yaml url Signed-off-by: mouuii --- .../aslan/core/environment/handler/policy.yaml | 18 ++++++++---------- .../aslan/core/project/handler/policy.yaml | 2 -- 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/pkg/microservice/aslan/core/environment/handler/policy.yaml b/pkg/microservice/aslan/core/environment/handler/policy.yaml index 0cb2d2796..d4a8ac99b 100644 --- a/pkg/microservice/aslan/core/environment/handler/policy.yaml +++ b/pkg/microservice/aslan/core/environment/handler/policy.yaml @@ -20,6 +20,14 @@ rules: endpoint: "/api/aslan/environment/kube/workloads" - method: GET endpoint: "/api/aslan/service/workloads" + - method: GET + endpoint: "/api/aslan/environment/export/service" + - method: GET + endpoint: "/api/aslan/environment/kube/pods/?*/events" + - method: GET + endpoint: "/api/aslan/environment/kube/events" + - method: GET + endpoint: "/api/aslan/logs/sse/pods/?*/containers/?*" - action: create_environment alias: "新建集成环境" description: "" @@ -64,16 +72,6 @@ rules: endpoint: "/api/aslan/environment/configmaps" - method: POST endpoint: "/api/aslan/environment/configmaps" - - method: GET - endpoint: "/api/aslan/environment/export/service" - - method: GET - endpoint: "/api/aslan/environment/kube/pods/?*/events" - - method: GET - endpoint: "/api/aslan/environment/kube/events" - - method: GET - endpoint: "/api/aslan/environment/export/service" - - method: GET - endpoint: "/api/aslan/logs/sse/pods/?*/containers/?*" - method: PUT endpoint: "/api/aslan/environment/environments/?*/services/?*/?*" - method: POST diff --git a/pkg/microservice/aslan/core/project/handler/policy.yaml b/pkg/microservice/aslan/core/project/handler/policy.yaml index 6aeb33612..01292e602 100644 --- a/pkg/microservice/aslan/core/project/handler/policy.yaml +++ b/pkg/microservice/aslan/core/project/handler/policy.yaml @@ -30,8 +30,6 @@ rules: endpoint: "/api/aslan/service/helm/?*" - method: PUT endpoint: "/api/aslan/service/services" - - method: PUT - endpoint: " /api/aslan/service/services/yaml/validator" - method: PUT endpoint: "/api/aslan/service/pm/?*" - method: PUT -- Gitee From c1823d3acb93801f51f883771ad0115e75242861 Mon Sep 17 00:00:00 2001 From: mouuii Date: Mon, 15 Nov 2021 20:02:50 +0800 Subject: [PATCH 384/405] add service policy yaml url Signed-off-by: mouuii --- pkg/microservice/aslan/core/project/handler/policy.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/microservice/aslan/core/project/handler/policy.yaml b/pkg/microservice/aslan/core/project/handler/policy.yaml index 01292e602..2ceecbcc7 100644 --- a/pkg/microservice/aslan/core/project/handler/policy.yaml +++ b/pkg/microservice/aslan/core/project/handler/policy.yaml @@ -61,7 +61,7 @@ rules: - method: POST endpoint: "/api/aslan/service/template/load" - method: GET - endpoint: "/api/aslan/template/charts/service-demo/variables" + endpoint: "/api/aslan/template/charts/?*/variables" - method: POST endpoint: "/api/aslan/service/helm/services/bulk" - action: delete_service -- Gitee From 2b5dc0db24c1d634501d1ef08de83ffed90a16d4 Mon Sep 17 00:00:00 2001 From: mouuii Date: Mon, 15 Nov 2021 20:11:06 +0800 Subject: [PATCH 385/405] config Signed-off-by: mouuii --- pkg/microservice/aslan/core/environment/handler/policy.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pkg/microservice/aslan/core/environment/handler/policy.yaml b/pkg/microservice/aslan/core/environment/handler/policy.yaml index d4a8ac99b..b09e4011e 100644 --- a/pkg/microservice/aslan/core/environment/handler/policy.yaml +++ b/pkg/microservice/aslan/core/environment/handler/policy.yaml @@ -22,6 +22,8 @@ rules: endpoint: "/api/aslan/service/workloads" - method: GET endpoint: "/api/aslan/environment/export/service" + - method: GET + endpoint: "/api/aslan/environment/configmaps" - method: GET endpoint: "/api/aslan/environment/kube/pods/?*/events" - method: GET -- Gitee From 33e43f6d8a63bfbaf2d46d0c5f34d63b74976168 Mon Sep 17 00:00:00 2001 From: mouuii Date: Mon, 15 Nov 2021 20:25:10 +0800 Subject: [PATCH 386/405] jira Signed-off-by: mouuii --- pkg/shared/client/systemconfig/jira.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/shared/client/systemconfig/jira.go b/pkg/shared/client/systemconfig/jira.go index 1b975b595..fb2698b80 100644 --- a/pkg/shared/client/systemconfig/jira.go +++ b/pkg/shared/client/systemconfig/jira.go @@ -24,7 +24,7 @@ type JiraInfo struct { ID int64 `json:"id"` Host string `json:"host"` User string `json:"user"` - AccessToken string `json:"accessToken"` + AccessToken string `json:"access_token"` OrganizationID int `json:"organizationId"` CreatedAt int64 `json:"created_at"` UpdatedAt int64 `json:"updated_at"` -- Gitee From 47ca13d937658702711de61963b9670d4a4f6e64 Mon Sep 17 00:00:00 2001 From: mouuii Date: Mon, 15 Nov 2021 20:37:09 +0800 Subject: [PATCH 387/405] code review Signed-off-by: mouuii --- pkg/cli/upgradeassistant/cmd/migrate/170.go | 4 ++-- .../internal/repository/mongodb/codehost.go | 17 ++--------------- 2 files changed, 4 insertions(+), 17 deletions(-) diff --git a/pkg/cli/upgradeassistant/cmd/migrate/170.go b/pkg/cli/upgradeassistant/cmd/migrate/170.go index 9671b6131..3dba7ae66 100644 --- a/pkg/cli/upgradeassistant/cmd/migrate/170.go +++ b/pkg/cli/upgradeassistant/cmd/migrate/170.go @@ -55,7 +55,7 @@ func V160ToV170() error { func V170ToV160() error { log.Info("Rollback data from 1.7.0 to 1.6.0") - err := RollbackchangeCodehostType() + err := rollbackChangeCodehostType() if err != nil { log.Errorf("Failed to rollback codehost type, err: %s", err) return err @@ -159,7 +159,7 @@ func changeCodehostType() error { } // rollback type "github,gitlab..." to "1,2..." -func RollbackchangeCodehostType() error { +func rollbackChangeCodehostType() error { // get all codehosts codeHosts, err := internalmongodb.NewCodehostColl().ListCodeHosts() if err != nil { diff --git a/pkg/cli/upgradeassistant/internal/repository/mongodb/codehost.go b/pkg/cli/upgradeassistant/internal/repository/mongodb/codehost.go index 213e647d6..0e7571a09 100644 --- a/pkg/cli/upgradeassistant/internal/repository/mongodb/codehost.go +++ b/pkg/cli/upgradeassistant/internal/repository/mongodb/codehost.go @@ -68,21 +68,8 @@ func (c *CodehostColl) RollbackChangeType(ID int, sourceType string) error { } type CodeHost struct { - ID int `bson:"id" json:"id"` - Type string `bson:"type" json:"type"` - Address string `bson:"address" json:"address"` - IsReady string `bson:"is_ready" json:"ready"` - AccessToken string `bson:"access_token" json:"accessToken"` - RefreshToken string `bson:"refresh_token" json:"refreshToken"` - Namespace string `bson:"namespace" json:"namespace"` - ApplicationId string `bson:"application_id" json:"applicationId"` - Region string `bson:"region" json:"region,omitempty"` - Username string `bson:"username" json:"username,omitempty"` - Password string `bson:"password" json:"password,omitempty"` - ClientSecret string `bson:"client_secret" json:"clientSecret"` - CreatedAt int64 `bson:"created_at" json:"created_at"` - UpdatedAt int64 `bson:"updated_at" json:"updated_at"` - DeletedAt int64 `bson:"deleted_at" json:"deleted_at"` + ID int `bson:"id" json:"id"` + Type string `bson:"type" json:"type"` } func (c *CodehostColl) ListCodeHosts() ([]*CodeHost, error) { -- Gitee From 3baae3dc7bc8c4609c8c7cceda6e2199e66a8cee Mon Sep 17 00:00:00 2001 From: mouuii Date: Mon, 15 Nov 2021 20:41:46 +0800 Subject: [PATCH 388/405] code review Signed-off-by: mouuii --- pkg/cli/upgradeassistant/cmd/migrate/170.go | 2 +- .../internal/repository/models/codehost.go | 10 ++++++++++ .../internal/repository/mongodb/codehost.go | 18 ++++++------------ 3 files changed, 17 insertions(+), 13 deletions(-) create mode 100644 pkg/cli/upgradeassistant/internal/repository/models/codehost.go diff --git a/pkg/cli/upgradeassistant/cmd/migrate/170.go b/pkg/cli/upgradeassistant/cmd/migrate/170.go index 3dba7ae66..ad2e8af04 100644 --- a/pkg/cli/upgradeassistant/cmd/migrate/170.go +++ b/pkg/cli/upgradeassistant/cmd/migrate/170.go @@ -168,7 +168,7 @@ func rollbackChangeCodehostType() error { } // rollback change type to readable string for _, v := range codeHosts { - if err := internalmongodb.NewCodehostColl().RollbackChangeType(v.ID, v.Type); err != nil { + if err := internalmongodb.NewCodehostColl().RollbackType(v.ID, v.Type); err != nil { log.Warnf("fail to rollback id:%d type:%s , err: %s", v.ID, v.Type, err) continue } diff --git a/pkg/cli/upgradeassistant/internal/repository/models/codehost.go b/pkg/cli/upgradeassistant/internal/repository/models/codehost.go new file mode 100644 index 000000000..57945fa66 --- /dev/null +++ b/pkg/cli/upgradeassistant/internal/repository/models/codehost.go @@ -0,0 +1,10 @@ +package models + +type CodeHost struct { + ID int `bson:"id" json:"id"` + Type string `bson:"type" json:"type"` +} + +func (CodeHost) TableName() string { + return "code_host" +} diff --git a/pkg/cli/upgradeassistant/internal/repository/mongodb/codehost.go b/pkg/cli/upgradeassistant/internal/repository/mongodb/codehost.go index 0e7571a09..b308b11d0 100644 --- a/pkg/cli/upgradeassistant/internal/repository/mongodb/codehost.go +++ b/pkg/cli/upgradeassistant/internal/repository/mongodb/codehost.go @@ -3,13 +3,12 @@ package mongodb import ( "context" - "go.mongodb.org/mongo-driver/bson" - "go.mongodb.org/mongo-driver/mongo" - + "github.com/koderover/zadig/pkg/cli/upgradeassistant/internal/repository/models" "github.com/koderover/zadig/pkg/config" - "github.com/koderover/zadig/pkg/microservice/systemconfig/core/codehost/repository/models" "github.com/koderover/zadig/pkg/tool/log" mongotool "github.com/koderover/zadig/pkg/tool/mongo" + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo" ) func (c *CodehostColl) ChangeType(ID int, sourceType string) error { @@ -40,7 +39,7 @@ func (c *CodehostColl) ChangeType(ID int, sourceType string) error { return nil } -func (c *CodehostColl) RollbackChangeType(ID int, sourceType string) error { +func (c *CodehostColl) RollbackType(ID int, sourceType string) error { query := bson.M{"id": ID} if sourceType == "gitlab" { @@ -67,13 +66,8 @@ func (c *CodehostColl) RollbackChangeType(ID int, sourceType string) error { return nil } -type CodeHost struct { - ID int `bson:"id" json:"id"` - Type string `bson:"type" json:"type"` -} - -func (c *CodehostColl) ListCodeHosts() ([]*CodeHost, error) { - codeHosts := make([]*CodeHost, 0) +func (c *CodehostColl) ListCodeHosts() ([]*models.CodeHost, error) { + codeHosts := make([]*models.CodeHost, 0) cursor, err := c.Collection.Find(context.TODO(), bson.M{}) if err != nil { -- Gitee From 5e78dd3e22eab23b03e39e1e2c7a00c84a946feb Mon Sep 17 00:00:00 2001 From: mouuii Date: Mon, 15 Nov 2021 20:42:50 +0800 Subject: [PATCH 389/405] code review Signed-off-by: mouuii --- pkg/cli/upgradeassistant/cmd/migrate/170.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/cli/upgradeassistant/cmd/migrate/170.go b/pkg/cli/upgradeassistant/cmd/migrate/170.go index ad2e8af04..e5c3848ff 100644 --- a/pkg/cli/upgradeassistant/cmd/migrate/170.go +++ b/pkg/cli/upgradeassistant/cmd/migrate/170.go @@ -55,7 +55,7 @@ func V160ToV170() error { func V170ToV160() error { log.Info("Rollback data from 1.7.0 to 1.6.0") - err := rollbackChangeCodehostType() + err := rollbackCodehostType() if err != nil { log.Errorf("Failed to rollback codehost type, err: %s", err) return err @@ -159,7 +159,7 @@ func changeCodehostType() error { } // rollback type "github,gitlab..." to "1,2..." -func rollbackChangeCodehostType() error { +func rollbackCodehostType() error { // get all codehosts codeHosts, err := internalmongodb.NewCodehostColl().ListCodeHosts() if err != nil { -- Gitee From 75548fffaac91681b9d794c2d8e59d333fcbb6dd Mon Sep 17 00:00:00 2001 From: mouuii Date: Mon, 15 Nov 2021 20:48:32 +0800 Subject: [PATCH 390/405] code review Signed-off-by: mouuii --- pkg/cli/upgradeassistant/cmd/migrate/170.go | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/pkg/cli/upgradeassistant/cmd/migrate/170.go b/pkg/cli/upgradeassistant/cmd/migrate/170.go index e5c3848ff..677d5c1b8 100644 --- a/pkg/cli/upgradeassistant/cmd/migrate/170.go +++ b/pkg/cli/upgradeassistant/cmd/migrate/170.go @@ -148,14 +148,15 @@ func changeCodehostType() error { log.Errorf("fail to list codehosts, err: %s", err) return err } + var finalErr error // change type to readable string for _, v := range codeHosts { if err := internalmongodb.NewCodehostColl().ChangeType(v.ID, v.Type); err != nil { log.Warnf("fail to change id:%d type:%s , err: %s", v.ID, v.Type, err) - continue + finalErr = err } } - return nil + return finalErr } // rollback type "github,gitlab..." to "1,2..." @@ -166,14 +167,16 @@ func rollbackCodehostType() error { log.Errorf("fail to list codehosts, err: %s", err) return err } + var finalErr error // rollback change type to readable string for _, v := range codeHosts { if err := internalmongodb.NewCodehostColl().RollbackType(v.ID, v.Type); err != nil { log.Warnf("fail to rollback id:%d type:%s , err: %s", v.ID, v.Type, err) + finalErr = err continue } } - return nil + return finalErr } func getWebHookTokenFromOrganization() string { -- Gitee From 0de88b8a7f76fc13c990e45e5e3e927211bf3132 Mon Sep 17 00:00:00 2001 From: lou Date: Mon, 15 Nov 2021 20:51:27 +0800 Subject: [PATCH 391/405] temporarily skip get workflow Signed-off-by: lou --- .../policy/core/service/bundle/rego/authz.rego | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/pkg/microservice/policy/core/service/bundle/rego/authz.rego b/pkg/microservice/policy/core/service/bundle/rego/authz.rego index 45fd16e0d..b3c0997d8 100644 --- a/pkg/microservice/policy/core/service/bundle/rego/authz.rego +++ b/pkg/microservice/policy/core/service/bundle/rego/authz.rego @@ -73,6 +73,13 @@ access_is_granted { glob.match(trim(grant.endpoint, "/"), ["/"], concat("/", input.parsed_path)) } +# Temporarily skip this endpoint, it will be fixed in 1.7.1 +access_is_granted { + concat("/", input.parsed_path) == "api/aslan/workflow/workflow" + http_request.method == "GET" + project_name == "" +} + user_is_admin { some role all_roles[role] -- Gitee From f62d17b7753e6fc4b90aa2e0ca7bfeddd56e509f Mon Sep 17 00:00:00 2001 From: allenshen Date: Mon, 15 Nov 2021 21:08:57 +0800 Subject: [PATCH 392/405] update code Signed-off-by: allenshen --- .../workflow/service/workflow/nsq_handlers.go | 62 ++++++++++--------- 1 file changed, 33 insertions(+), 29 deletions(-) diff --git a/pkg/microservice/aslan/core/workflow/service/workflow/nsq_handlers.go b/pkg/microservice/aslan/core/workflow/service/workflow/nsq_handlers.go index a33ee9741..5837a6b9f 100644 --- a/pkg/microservice/aslan/core/workflow/service/workflow/nsq_handlers.go +++ b/pkg/microservice/aslan/core/workflow/service/workflow/nsq_handlers.go @@ -18,10 +18,8 @@ package workflow import ( "context" - "encoding/base64" "encoding/json" "encoding/xml" - "errors" "fmt" "io/ioutil" "net/http" @@ -33,6 +31,7 @@ import ( dockerCli "github.com/docker/docker/client" "github.com/docker/go-connections/sockets" "github.com/nsqio/go-nsq" + "github.com/pkg/errors" "go.uber.org/zap" "github.com/koderover/zadig/pkg/microservice/aslan/config" @@ -46,6 +45,7 @@ import ( "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/registry" "github.com/koderover/zadig/pkg/microservice/aslan/core/common/service/s3" "github.com/koderover/zadig/pkg/setting" + "github.com/koderover/zadig/pkg/shared/client/systemconfig" "github.com/koderover/zadig/pkg/tool/git/gitlab" "github.com/koderover/zadig/pkg/tool/log" s3tool "github.com/koderover/zadig/pkg/tool/s3" @@ -213,16 +213,38 @@ func (h *TaskAckHandler) handle(message *nsq.Message) error { return nil } +// get docker file content from codehost +// TODO need to support codehub and gerrit +func getRawFileContent(codehostID int, repo, owner, branch, filePath string) ([]byte, error) { + ch, err := systemconfig.New().GetCodeHost(codehostID) + if err != nil { + return nil, errors.Wrapf(err, "Failed to get codeHost info %d", codehostID) + } + switch ch.Type { + case setting.SourceFromGitlab: + cli, err := gitlab.NewClient(ch.Address, ch.AccessToken) + if err != nil { + return nil, errors.Wrapf(err, "Failed to get gitlab client") + } + return cli.GetRawFile(repo, owner, branch, filePath) + case setting.SourceFromGithub: + gitClient := git.NewClient(ch.AccessToken, config.ProxyHTTPSAddr()) + return gitClient.GetFileContent(owner, repo, filePath, branch) + default: + return nil, fmt.Errorf("Failed to create client for codehostID: %d", codehostID) + } +} + func (h *TaskAckHandler) getDockerfileContent(build *types.Repository, ctx *task.DockerBuildCtx) string { switch ctx.Source { - case setting.ServiceSourceTemplate: + case setting.DockerfileSourceTemplate: content, err := commonservice.GetDockerfileTemplateContent(ctx.TemplateID) if err != nil { h.log.Errorf("Failed to get dockerfile template content, err: %v", err) return "" } return content - default: // TODO need rewrite + case setting.DockerfileSourceLocal: path := ctx.DockerFile pathArray := strings.Split(path, "/") if len(pathArray[0])+1 >= len(path) { @@ -230,32 +252,14 @@ func (h *TaskAckHandler) getDockerfileContent(build *types.Repository, ctx *task return "" } dockerfilePath := path[len(pathArray[0])+1:] - if strings.Contains(build.Address, "gitlab") { - cli, err := gitlab.NewClient(build.Address, build.OauthToken) - if err != nil { - h.log.Errorf("Failed to get gitlab client, err: %v", err) - return "" - } - content, err := cli.GetRawFile(build.RepoOwner, build.RepoName, build.Branch, dockerfilePath) - if err != nil { - h.log.Errorf("uploadTaskData gitlab GetRawFile err:%v", err) - return "" - } - return string(content) - } else { - gitClient := git.NewClient(build.OauthToken, config.ProxyHTTPSAddr()) - fileContent, _, _, _ := gitClient.Repositories.GetContents(context.Background(), build.RepoOwner, build.RepoName, dockerfilePath, nil) - if fileContent != nil { - dockerfileContent := *fileContent.Content - dockerfileContent = dockerfileContent[:len(dockerfileContent)-2] - content, err := base64.StdEncoding.DecodeString(dockerfileContent) - if err != nil { - h.log.Errorf("uploadTaskData github GetRawFile err:%v", err) - return "" - } - return string(content) - } + content, err := getRawFileContent(build.CodehostID, build.RepoName, build.RepoOwner, build.Branch, dockerfilePath) + if err != nil { + h.log.Errorf("Failed to get dockerfile content, err %s", err) + return "" } + return string(content) + default: // from local + h.log.Errorf("Failed to get dockerfile content, illegal source %s", ctx.Source) return "" } } -- Gitee From 645dea32cf38cd901647096dc95113e7cc58be4e Mon Sep 17 00:00:00 2001 From: lou Date: Mon, 15 Nov 2021 22:02:36 +0800 Subject: [PATCH 393/405] add policy rules Signed-off-by: lou --- .../aslan/core/environment/handler/policy.yaml | 8 ++++++++ .../aslan/core/workflow/handler/policy.yaml | 10 ++++++++++ 2 files changed, 18 insertions(+) diff --git a/pkg/microservice/aslan/core/environment/handler/policy.yaml b/pkg/microservice/aslan/core/environment/handler/policy.yaml index b09e4011e..12e3cde0e 100644 --- a/pkg/microservice/aslan/core/environment/handler/policy.yaml +++ b/pkg/microservice/aslan/core/environment/handler/policy.yaml @@ -30,6 +30,8 @@ rules: endpoint: "/api/aslan/environment/kube/events" - method: GET endpoint: "/api/aslan/logs/sse/pods/?*/containers/?*" + - method: GET + endpoint: "/api/aslan/project/products/?*/services" - action: create_environment alias: "新建集成环境" description: "" @@ -40,6 +42,10 @@ rules: endpoint: "/api/aslan/environment/environments/?*/helm" - method: POST endpoint: "/api/aslan/service/workloads" + - method: GET + endpoint: "/api/aslan/project/products/?*/services" + - method: GET + endpoint: "/api/aslan/delivery/releases" - action: config_environment alias: "配置集成环境" description: "" @@ -58,6 +64,8 @@ rules: endpoint: "/api/aslan/environment/environments/?*/multiHelmEnv" - method: PUT endpoint: "/api/aslan/service/workloads" + - method: GET + endpoint: "/api/aslan/project/products/?*/services" - action: manage_environment alias: "管理服务实例" description: "" diff --git a/pkg/microservice/aslan/core/workflow/handler/policy.yaml b/pkg/microservice/aslan/core/workflow/handler/policy.yaml index d3563eb39..ae49e38f8 100644 --- a/pkg/microservice/aslan/core/workflow/handler/policy.yaml +++ b/pkg/microservice/aslan/core/workflow/handler/policy.yaml @@ -36,6 +36,12 @@ rules: rules: - method: PUT endpoint: "api/aslan/workflow/workflow" + - method: GET + endpoint: "/api/aslan/environment/environments" + - method: GET + endpoint: "/api/aslan/workflow/workflow/preset/?*" + - method: GET + endpoint: "/api/aslan/testing/testdetail" - action: create_workflow alias: "新建工作流" description: "" @@ -46,6 +52,10 @@ rules: endpoint: "/api/aslan/workflow/workflow/old/?*/new/?*" - method: POST endpoint: "/api/directory/workflowTask/create" + - method: GET + endpoint: "/api/aslan/environment/environments" + - method: GET + endpoint: "/api/aslan/testing/testdetail" - action: delete_workflow alias: "删除工作流" description: "" -- Gitee From fbbd86bd6fd4c1088eb48be63b1ea91b515a90fb Mon Sep 17 00:00:00 2001 From: fansi Date: Mon, 15 Nov 2021 22:32:31 +0800 Subject: [PATCH 394/405] add missing policy rule Signed-off-by: fansi --- pkg/microservice/aslan/core/workflow/handler/policy.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pkg/microservice/aslan/core/workflow/handler/policy.yaml b/pkg/microservice/aslan/core/workflow/handler/policy.yaml index ae49e38f8..1dc34f8c3 100644 --- a/pkg/microservice/aslan/core/workflow/handler/policy.yaml +++ b/pkg/microservice/aslan/core/workflow/handler/policy.yaml @@ -78,3 +78,5 @@ rules: endpoint: "/api/directory/workflowTask/id/?*/pipelines/?*/restart" - method: POST endpoint: "/api/directory/workflowTask/id/?*/pipelines/?*/cancel" + - method: GET + endpoint: "/api/aslan/delivery/releases" -- Gitee From c25c3c9834dc07f887b6ba3ae2af407f5f0a94d1 Mon Sep 17 00:00:00 2001 From: Min Min Date: Tue, 16 Nov 2021 15:47:33 +0800 Subject: [PATCH 395/405] fixed conflict resolve problems Signed-off-by: Min Min --- pkg/microservice/aslan/core/templatestore/handler/yaml.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pkg/microservice/aslan/core/templatestore/handler/yaml.go b/pkg/microservice/aslan/core/templatestore/handler/yaml.go index 21717aa0b..0d71936d9 100644 --- a/pkg/microservice/aslan/core/templatestore/handler/yaml.go +++ b/pkg/microservice/aslan/core/templatestore/handler/yaml.go @@ -98,6 +98,10 @@ func GetYamlTemplateVariables(c *gin.Context) { defer func() { internalhandler.JSONResponse(c, ctx) }() req := &getYamlTemplateVariablesReq{} + if err := c.ShouldBindJSON(req); err != nil { + ctx.Err = err + return + } ctx.Resp, ctx.Err = templateservice.GetYamlVariables(req.Content, ctx.Logger) } -- Gitee From 07510b24d1f25dca4e11682b74e3cca24bbcdc80 Mon Sep 17 00:00:00 2001 From: mouuii Date: Tue, 16 Nov 2021 19:52:19 +0800 Subject: [PATCH 396/405] return err Signed-off-by: mouuii --- .../core/codehost/repository/mongodb/codehost.go | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/pkg/microservice/systemconfig/core/codehost/repository/mongodb/codehost.go b/pkg/microservice/systemconfig/core/codehost/repository/mongodb/codehost.go index 5b7170bbf..ac7b23491 100644 --- a/pkg/microservice/systemconfig/core/codehost/repository/mongodb/codehost.go +++ b/pkg/microservice/systemconfig/core/codehost/repository/mongodb/codehost.go @@ -68,10 +68,7 @@ func (c *CodehostColl) GetCodeHostByID(ID int) (*models.CodeHost, error) { codehost := new(models.CodeHost) query := bson.M{"id": ID, "deleted_at": 0} err := c.Collection.FindOne(context.TODO(), query).Decode(codehost) - if err != nil { - return nil, nil - } - return codehost, nil + return codehost, err } func (c *CodehostColl) List(args *ListArgs) ([]*models.CodeHost, error) { -- Gitee From 33b4e04174d8fb7a940ce1ec627460b96942b064 Mon Sep 17 00:00:00 2001 From: mouuii Date: Tue, 16 Nov 2021 20:02:01 +0800 Subject: [PATCH 397/405] return err Signed-off-by: mouuii --- .../core/codehost/repository/mongodb/codehost.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/pkg/microservice/systemconfig/core/codehost/repository/mongodb/codehost.go b/pkg/microservice/systemconfig/core/codehost/repository/mongodb/codehost.go index ac7b23491..5287ecf6d 100644 --- a/pkg/microservice/systemconfig/core/codehost/repository/mongodb/codehost.go +++ b/pkg/microservice/systemconfig/core/codehost/repository/mongodb/codehost.go @@ -67,8 +67,10 @@ func (c *CodehostColl) GetCodeHostByID(ID int) (*models.CodeHost, error) { codehost := new(models.CodeHost) query := bson.M{"id": ID, "deleted_at": 0} - err := c.Collection.FindOne(context.TODO(), query).Decode(codehost) - return codehost, err + if err := c.Collection.FindOne(context.TODO(), query).Decode(codehost); err != nil { + return nil, err + } + return codehost, nil } func (c *CodehostColl) List(args *ListArgs) ([]*models.CodeHost, error) { -- Gitee From ebb48431533e7e05967ff8c615d22badb5eba5c8 Mon Sep 17 00:00:00 2001 From: landylee007 Date: Tue, 16 Nov 2021 20:21:44 +0800 Subject: [PATCH 398/405] add biz labeler for v1.7.0 --- .github/labeler.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/.github/labeler.yml b/.github/labeler.yml index fa949ecb2..c31f7da47 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -2,6 +2,18 @@ service/aslan: - pkg/microservice/aslan/**/* +service/picket: +- pkg/microservice/picket/**/* + +service/user: +- pkg/microservice/user/**/* + +service/policy: +- pkg/microservice/policy/**/* + +service/config: +- pkg/microservice/systemconfig/**/* + service/cron: - pkg/microservice/cron/**/* -- Gitee From 55e539ff303b533516d26da0d53f0ded7caba9a3 Mon Sep 17 00:00:00 2001 From: landylee007 Date: Tue, 16 Nov 2021 20:41:40 +0800 Subject: [PATCH 399/405] add Zadig System ArchitectureOverview Signed-off-by: landylee007 --- README-zh-CN.md | 2 ++ README.md | 4 ++- System-Architecture-Overview-zh-CN.md | 39 ++++++++++++++++++++++++++ System-Architecture-Overview.md | 40 +++++++++++++++++++++++++++ Zadig-System-Architecture.svg | 1 + 5 files changed, 85 insertions(+), 1 deletion(-) create mode 100644 System-Architecture-Overview-zh-CN.md create mode 100644 System-Architecture-Overview.md create mode 100644 Zadig-System-Architecture.svg diff --git a/README-zh-CN.md b/README-zh-CN.md index beba21f0e..3bd629bac 100644 --- a/README-zh-CN.md +++ b/README-zh-CN.md @@ -42,6 +42,8 @@ Zadig 是一款面向开发者设计的云原生持续交付(Continuous Delivery ![业务架构图](./Zadig-Business-Architecture-zh.jpg) +想了解更多系统架构信息,参考 [系统架构简介](System-Architecture-Overview-zh-CN.md). + 产品特性介绍:
diff --git a/README.md b/README.md index 374fa483a..7ba402d46 100644 --- a/README.md +++ b/README.md @@ -41,10 +41,12 @@ Zadig is non-invasive, it does not exclude any of your existing development proc > Our vision is: Developer + Zadig = Business success -The architecture is as follows: +The business architecture is as follows: ![Business Architecture](./Zadig-Business-Architecture.jpg) +For more details about system architecture, see [Zadig System Architecture Overview](System-Architecture-Overview.md). + The Highlighted Features:
diff --git a/System-Architecture-Overview-zh-CN.md b/System-Architecture-Overview-zh-CN.md new file mode 100644 index 000000000..2584f4bff --- /dev/null +++ b/System-Architecture-Overview-zh-CN.md @@ -0,0 +1,39 @@ +# Zadig 系统架构简介 + +## 系统架构图 + +![Architecture_diagram](./Zadig-System-Architecture.svg) + +## 核心组件介绍 + +用户入口: +- zadig-portal:zadig 前端组件 +- kodespace:zadig 开发者命令行工具 +- Zadig Toolkit:vscode 开发者插件 + +API 网关: +- Gloo Edge:Zadig 的 API 网关组件 +- OPA:认证和授权组件 +- User:用户管理,Token 生成 +- Dex:Zadig 的身份认证服务,用于连接其他第三方认证系统,比如 AD,LDAP,OAuth2,GitHub,... + +Zadig 核心业务: +- Picket:数据聚合服务 +- Policy:OPA 数据源,策略注册中心 +- Aslan:项目,环境,服务,工作流,构建配置,系统配置等系统功能 +- Config: 系统配置 +- Workflow Runner: + - warpdrive:工作流引擎,负责 reaper、predator 实例的创建销毁等管理操作 + - reaper: 负责执行单个工作流作业中的构建、测试等任务 + - predator:负责执行单个工作流作业中的镜像分发任务 + - plugins:工作流插件 + - Jenkins-plugin: 用于触发 Jenkins job,显示状态和结果等 +- cron:定时任务,包括环境的回收,K8s 资源的清理等 +- nsq:消息队列(第三方组件) + +数据平面: +- mongodb:业务数据数据库 +- mysql:存储 dex 配置、用户信息的数据库 + +K8s 集群: +- Zadig 业务运行在各种云厂商的标准 K8s 集群 \ No newline at end of file diff --git a/System-Architecture-Overview.md b/System-Architecture-Overview.md new file mode 100644 index 000000000..b21bee19c --- /dev/null +++ b/System-Architecture-Overview.md @@ -0,0 +1,40 @@ +# Zadig System Architecture Overview + +## System Architecture + +![Architecture_diagram](./Zadig-System-Architecture.svg) + +## Main Components + +User Interface: +- zadig-portal:zadig web component +- kodespace:zadig command line tools +- Zadig Toolkit:vscode plugin + +API Gateway: +- Gloo Edge:Zadig API gateway +- OPA:Authentication and authorization +- User:User management, token generation +- Dex:Identity service for Zadig, acts as a portal to other identity providers like AD, LDAP, OAuth2, GitHub, ... + +Zadig Core: +- Picket:backend for frontend service. +- Policy: data source of OPA and policy registration center. +- Aslan:main service for all business logic. Project, environment, service, workflow, build, system management are all in this service. +- Config: system configuration center. + +- Workflow Runner: + - warpdrive:workflow engine, manages reaper and predator + - reaper: workflow runner. Used for building, testing tasks. + - predator:workflow runner. Used for distribute tasks. + - plugins:workflow plugins + - Jenkins-plugin: workflow runner. Used as connector to trigger Jenkins job and retrieve job information. +- cron:cronjob runner +- nsq:message queue + +Data Plane: +- mongodb:database for business data. +- mysql:dex configuration,database for user. + +Kubernetes Cluster: +- Zadig business runs on standard K8s clusters from cloud vendors diff --git a/Zadig-System-Architecture.svg b/Zadig-System-Architecture.svg new file mode 100644 index 000000000..edafbd980 --- /dev/null +++ b/Zadig-System-Architecture.svg @@ -0,0 +1 @@ +
User
Interface
User...
API
Gateway
API...
OAuth 2.0
OAuth 2.0
LDAP/AD
LDAP/AD
GitHub
GitHub
……
……
OpenID Provider
OpenID Provider
Zadig Core
Zadig...
Data Plane
Data Plane
MongoDB
MongoDB
MySQL
MySQL
Engineer (development, testing, SRE etc.)
Engineer (development, testing, SRE etc.)
Workflow Runner
Workflow Runner
warpdrive
warpdrive
Dind Replicas
Dind Replicas
dind
dind
dind
dind
NSQ
NSQ
Cron
Cron
workflow controller
workflow controller
project
project
service
service
environment
environment
cronjob controller
cronjob controller
Zadig Portal
Zadig Portal
Zadig Toolkit
Zadig Toolkit
Kodespace
Kodespace
reaper
reaper
predator
predat...
plugins
plugins
warpdrive
warpdr...
warpdrive
warpdr...
Picket
Picket
Aslan
Aslan
Dex
Dex
User
User
Gloo Edge
Gloo Edge
Opa
Opa
Kubernetes
Cluster
Kubern...
Ali ACK 
Ali ACK 
AWS EKS
AWS EKS
Tencent TKE
Tencent TKE
Huawei CCE
Huawei CCE
......
......
Config
Config
Policy
Policy
Viewer does not support full SVG 1.1
\ No newline at end of file -- Gitee From c94f211f0be8f8fc53f17c1cf27b8a32a0ca952e Mon Sep 17 00:00:00 2001 From: landylee007 Date: Tue, 16 Nov 2021 20:44:04 +0800 Subject: [PATCH 400/405] add Zadig System ArchitectureOverview Signed-off-by: landylee007 --- System-Architecture-Overview-zh-CN.md | 6 +++--- System-Architecture-Overview.md | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/System-Architecture-Overview-zh-CN.md b/System-Architecture-Overview-zh-CN.md index 2584f4bff..f43d9a59a 100644 --- a/System-Architecture-Overview-zh-CN.md +++ b/System-Architecture-Overview-zh-CN.md @@ -12,10 +12,10 @@ - Zadig Toolkit:vscode 开发者插件 API 网关: -- Gloo Edge:Zadig 的 API 网关组件 +- Gloo Edge:zadig 的 API 网关组件 - OPA:认证和授权组件 - User:用户管理,Token 生成 -- Dex:Zadig 的身份认证服务,用于连接其他第三方认证系统,比如 AD,LDAP,OAuth2,GitHub,... +- Dex:zadig 的身份认证服务,用于连接其他第三方认证系统,比如 AD,LDAP,OAuth2,GitHub,... Zadig 核心业务: - Picket:数据聚合服务 @@ -36,4 +36,4 @@ Zadig 核心业务: - mysql:存储 dex 配置、用户信息的数据库 K8s 集群: -- Zadig 业务运行在各种云厂商的标准 K8s 集群 \ No newline at end of file +- zadig 业务运行在各种云厂商的标准 K8s 集群 \ No newline at end of file diff --git a/System-Architecture-Overview.md b/System-Architecture-Overview.md index b21bee19c..9acb35edc 100644 --- a/System-Architecture-Overview.md +++ b/System-Architecture-Overview.md @@ -13,7 +13,7 @@ User Interface: API Gateway: - Gloo Edge:Zadig API gateway -- OPA:Authentication and authorization +- OPA:Authentication and authorization - User:User management, token generation - Dex:Identity service for Zadig, acts as a portal to other identity providers like AD, LDAP, OAuth2, GitHub, ... @@ -37,4 +37,4 @@ Data Plane: - mysql:dex configuration,database for user. Kubernetes Cluster: -- Zadig business runs on standard K8s clusters from cloud vendors +- zadig business runs on standard K8s clusters from cloud vendors -- Gitee From 203cd877c551b16b3d615bc6d3f3444248f55382 Mon Sep 17 00:00:00 2001 From: landylee007 Date: Tue, 16 Nov 2021 21:02:36 +0800 Subject: [PATCH 401/405] fix spelling Signed-off-by: landylee007 --- System-Architecture-Overview-zh-CN.md | 12 ++++++------ System-Architecture-Overview.md | 11 +++++------ 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/System-Architecture-Overview-zh-CN.md b/System-Architecture-Overview-zh-CN.md index f43d9a59a..d502216f2 100644 --- a/System-Architecture-Overview-zh-CN.md +++ b/System-Architecture-Overview-zh-CN.md @@ -15,12 +15,12 @@ API 网关: - Gloo Edge:zadig 的 API 网关组件 - OPA:认证和授权组件 - User:用户管理,Token 生成 -- Dex:zadig 的身份认证服务,用于连接其他第三方认证系统,比如 AD,LDAP,OAuth2,GitHub,... +- Dex:zadig 的身份认证服务,用于连接其他第三方认证系统,比如 AD / LDAP / OAuth2 / GitHub / .. Zadig 核心业务: - Picket:数据聚合服务 - Policy:OPA 数据源,策略注册中心 -- Aslan:项目,环境,服务,工作流,构建配置,系统配置等系统功能 +- Aslan:项目 / 环境 / 服务 / 工作流 / 构建配置 / 系统配置等系统功能 - Config: 系统配置 - Workflow Runner: - warpdrive:工作流引擎,负责 reaper、predator 实例的创建销毁等管理操作 @@ -28,12 +28,12 @@ Zadig 核心业务: - predator:负责执行单个工作流作业中的镜像分发任务 - plugins:工作流插件 - Jenkins-plugin: 用于触发 Jenkins job,显示状态和结果等 -- cron:定时任务,包括环境的回收,K8s 资源的清理等 -- nsq:消息队列(第三方组件) +- Cron:定时任务,包括环境的回收,K8s 资源的清理等 +- NSQ:消息队列(第三方组件) 数据平面: -- mongodb:业务数据数据库 -- mysql:存储 dex 配置、用户信息的数据库 +- MongoDB:业务数据数据库 +- MySQL:存储 dex 配置、用户信息的数据库 K8s 集群: - zadig 业务运行在各种云厂商的标准 K8s 集群 \ No newline at end of file diff --git a/System-Architecture-Overview.md b/System-Architecture-Overview.md index 9acb35edc..d272ba325 100644 --- a/System-Architecture-Overview.md +++ b/System-Architecture-Overview.md @@ -15,26 +15,25 @@ API Gateway: - Gloo Edge:Zadig API gateway - OPA:Authentication and authorization - User:User management, token generation -- Dex:Identity service for Zadig, acts as a portal to other identity providers like AD, LDAP, OAuth2, GitHub, ... +- Dex:Identity service for Zadig, acts as a portal to other identity providers like AD / LDAP / OAuth2 / GitHub / .. Zadig Core: - Picket:backend for frontend service. - Policy: data source of OPA and policy registration center. - Aslan:main service for all business logic. Project, environment, service, workflow, build, system management are all in this service. - Config: system configuration center. - - Workflow Runner: - warpdrive:workflow engine, manages reaper and predator - reaper: workflow runner. Used for building, testing tasks. - predator:workflow runner. Used for distribute tasks. - plugins:workflow plugins - Jenkins-plugin: workflow runner. Used as connector to trigger Jenkins job and retrieve job information. -- cron:cronjob runner -- nsq:message queue +- Cron:cronjob runner +- NSQ:message queue Data Plane: -- mongodb:database for business data. -- mysql:dex configuration,database for user. +- MongoDB:database for business data. +- MySQL:dex configuration,database for user. Kubernetes Cluster: - zadig business runs on standard K8s clusters from cloud vendors -- Gitee From 1097d0635d284b8575f10702b1d73d55f2e69ab1 Mon Sep 17 00:00:00 2001 From: landylee007 Date: Tue, 16 Nov 2021 21:26:25 +0800 Subject: [PATCH 402/405] add Zadig System ArchitectureOverview Signed-off-by: landylee007 --- Zadig-System-Architecture.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Zadig-System-Architecture.svg b/Zadig-System-Architecture.svg index edafbd980..c53a8eacd 100644 --- a/Zadig-System-Architecture.svg +++ b/Zadig-System-Architecture.svg @@ -1 +1 @@ -
User
Interface
User...
API
Gateway
API...
OAuth 2.0
OAuth 2.0
LDAP/AD
LDAP/AD
GitHub
GitHub
……
……
OpenID Provider
OpenID Provider
Zadig Core
Zadig...
Data Plane
Data Plane
MongoDB
MongoDB
MySQL
MySQL
Engineer (development, testing, SRE etc.)
Engineer (development, testing, SRE etc.)
Workflow Runner
Workflow Runner
warpdrive
warpdrive
Dind Replicas
Dind Replicas
dind
dind
dind
dind
NSQ
NSQ
Cron
Cron
workflow controller
workflow controller
project
project
service
service
environment
environment
cronjob controller
cronjob controller
Zadig Portal
Zadig Portal
Zadig Toolkit
Zadig Toolkit
Kodespace
Kodespace
reaper
reaper
predator
predat...
plugins
plugins
warpdrive
warpdr...
warpdrive
warpdr...
Picket
Picket
Aslan
Aslan
Dex
Dex
User
User
Gloo Edge
Gloo Edge
Opa
Opa
Kubernetes
Cluster
Kubern...
Ali ACK 
Ali ACK 
AWS EKS
AWS EKS
Tencent TKE
Tencent TKE
Huawei CCE
Huawei CCE
......
......
Config
Config
Policy
Policy
Viewer does not support full SVG 1.1
\ No newline at end of file +
User
Interface
User...
API
Gateway
API...
OAuth 2.0
OAuth 2.0
LDAP/AD
LDAP/AD
GitHub
GitHub
……
……
OpenID Provider
OpenID Provider
Zadig Core
Zadig...
Data Plane
Data Plane
MongoDB
MongoDB
MySQL
MySQL
Engineer (development, testing, SRE etc.)
Engineer (development, testing, SRE etc.)
Workflow Runner
Workflow Runner
warpdrive
warpdrive
Dind Replicas
Dind Replicas
dind
dind
dind
dind
NSQ
NSQ
Cron
Cron
workflow controller
workflow controller
project
project
service
service
environment
environment
cronjob controller
cronjob controller
Zadig Portal
Zadig Portal
Zadig Toolkit
Zadig Toolkit
Kodespace
Kodespace
reaper
reaper
predator
predat...
plugins
plugins
warpdrive
warpdr...
warpdrive
warpdr...
Picket
Picket
Aslan
Aslan
Dex
Dex
User
User
Gloo Edge
Gloo Edge
Opa
Opa
Kubernetes
Cluster
Kubern...
Ali ACK 
Ali ACK 
AWS EKS
AWS EKS
Tencent TKE
Tencent TKE
Huawei CCE
Huawei CCE
......
......
Config
Config
Policy
Policy
Viewer does not support full SVG 1.1
\ No newline at end of file -- Gitee From 036ee99513c541ea020a91f87cecad6d1102b555 Mon Sep 17 00:00:00 2001 From: landylee007 Date: Tue, 16 Nov 2021 21:29:09 +0800 Subject: [PATCH 403/405] add Zadig System ArchitectureOverview Signed-off-by: landylee007 --- System-Architecture-Overview-zh-CN.md | 2 +- System-Architecture-Overview.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/System-Architecture-Overview-zh-CN.md b/System-Architecture-Overview-zh-CN.md index d502216f2..91d8059a7 100644 --- a/System-Architecture-Overview-zh-CN.md +++ b/System-Architecture-Overview-zh-CN.md @@ -19,8 +19,8 @@ API 网关: Zadig 核心业务: - Picket:数据聚合服务 -- Policy:OPA 数据源,策略注册中心 - Aslan:项目 / 环境 / 服务 / 工作流 / 构建配置 / 系统配置等系统功能 +- Policy:OPA 数据源,策略注册中心 - Config: 系统配置 - Workflow Runner: - warpdrive:工作流引擎,负责 reaper、predator 实例的创建销毁等管理操作 diff --git a/System-Architecture-Overview.md b/System-Architecture-Overview.md index d272ba325..efff3056c 100644 --- a/System-Architecture-Overview.md +++ b/System-Architecture-Overview.md @@ -19,8 +19,8 @@ API Gateway: Zadig Core: - Picket:backend for frontend service. -- Policy: data source of OPA and policy registration center. - Aslan:main service for all business logic. Project, environment, service, workflow, build, system management are all in this service. +- Policy: data source of OPA and policy registration center. - Config: system configuration center. - Workflow Runner: - warpdrive:workflow engine, manages reaper and predator -- Gitee From 4ecf5aa5acfe92da164ab5fecc5ee0cae18203e4 Mon Sep 17 00:00:00 2001 From: landylee007 Date: Tue, 16 Nov 2021 21:32:31 +0800 Subject: [PATCH 404/405] add Zadig System ArchitectureOverview Signed-off-by: landylee007 --- System-Architecture-Overview-zh-CN.md | 6 +++--- System-Architecture-Overview.md | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/System-Architecture-Overview-zh-CN.md b/System-Architecture-Overview-zh-CN.md index 91d8059a7..ed04b632a 100644 --- a/System-Architecture-Overview-zh-CN.md +++ b/System-Architecture-Overview-zh-CN.md @@ -21,13 +21,13 @@ Zadig 核心业务: - Picket:数据聚合服务 - Aslan:项目 / 环境 / 服务 / 工作流 / 构建配置 / 系统配置等系统功能 - Policy:OPA 数据源,策略注册中心 -- Config: 系统配置 +- Config:系统配置 - Workflow Runner: - warpdrive:工作流引擎,负责 reaper、predator 实例的创建销毁等管理操作 - - reaper: 负责执行单个工作流作业中的构建、测试等任务 + - reaper:负责执行单个工作流作业中的构建、测试等任务 - predator:负责执行单个工作流作业中的镜像分发任务 - plugins:工作流插件 - - Jenkins-plugin: 用于触发 Jenkins job,显示状态和结果等 + - Jenkins-plugin:用于触发 Jenkins job,显示状态和结果等 - Cron:定时任务,包括环境的回收,K8s 资源的清理等 - NSQ:消息队列(第三方组件) diff --git a/System-Architecture-Overview.md b/System-Architecture-Overview.md index efff3056c..4180f5978 100644 --- a/System-Architecture-Overview.md +++ b/System-Architecture-Overview.md @@ -20,14 +20,14 @@ API Gateway: Zadig Core: - Picket:backend for frontend service. - Aslan:main service for all business logic. Project, environment, service, workflow, build, system management are all in this service. -- Policy: data source of OPA and policy registration center. -- Config: system configuration center. +- Policy:data source of OPA and policy registration center. +- Config:system configuration center. - Workflow Runner: - warpdrive:workflow engine, manages reaper and predator - - reaper: workflow runner. Used for building, testing tasks. + - reaper:workflow runner. Used for building, testing tasks. - predator:workflow runner. Used for distribute tasks. - plugins:workflow plugins - - Jenkins-plugin: workflow runner. Used as connector to trigger Jenkins job and retrieve job information. + - Jenkins-plugin:workflow runner. Used as connector to trigger Jenkins job and retrieve job information. - Cron:cronjob runner - NSQ:message queue -- Gitee From 32b5cd904d5f7417db5a68c93e02a13597e17a04 Mon Sep 17 00:00:00 2001 From: landylee007 Date: Tue, 16 Nov 2021 21:47:37 +0800 Subject: [PATCH 405/405] add Zadig System ArchitectureOverview Signed-off-by: landylee007 --- System-Architecture-Overview-zh-CN.md | 10 +++++----- System-Architecture-Overview.md | 6 +++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/System-Architecture-Overview-zh-CN.md b/System-Architecture-Overview-zh-CN.md index ed04b632a..4f10c078a 100644 --- a/System-Architecture-Overview-zh-CN.md +++ b/System-Architecture-Overview-zh-CN.md @@ -7,15 +7,15 @@ ## 核心组件介绍 用户入口: -- zadig-portal:zadig 前端组件 -- kodespace:zadig 开发者命令行工具 +- zadig-portal:Zadig 前端组件 +- kodespace:Zadig 开发者命令行工具 - Zadig Toolkit:vscode 开发者插件 API 网关: -- Gloo Edge:zadig 的 API 网关组件 +- Gloo Edge:Zadig 的 API 网关组件 - OPA:认证和授权组件 - User:用户管理,Token 生成 -- Dex:zadig 的身份认证服务,用于连接其他第三方认证系统,比如 AD / LDAP / OAuth2 / GitHub / .. +- Dex:Zadig 的身份认证服务,用于连接其他第三方认证系统,比如 AD / LDAP / OAuth2 / GitHub / .. Zadig 核心业务: - Picket:数据聚合服务 @@ -36,4 +36,4 @@ Zadig 核心业务: - MySQL:存储 dex 配置、用户信息的数据库 K8s 集群: -- zadig 业务运行在各种云厂商的标准 K8s 集群 \ No newline at end of file +- Zadig 业务运行在各种云厂商的标准 K8s 集群 \ No newline at end of file diff --git a/System-Architecture-Overview.md b/System-Architecture-Overview.md index 4180f5978..61e059779 100644 --- a/System-Architecture-Overview.md +++ b/System-Architecture-Overview.md @@ -7,8 +7,8 @@ ## Main Components User Interface: -- zadig-portal:zadig web component -- kodespace:zadig command line tools +- zadig-portal:Zadig web component +- kodespace:Zadig command line tools - Zadig Toolkit:vscode plugin API Gateway: @@ -36,4 +36,4 @@ Data Plane: - MySQL:dex configuration,database for user. Kubernetes Cluster: -- zadig business runs on standard K8s clusters from cloud vendors +- Zadig business runs on standard K8s clusters from cloud vendors -- Gitee