diff --git a/api/repo.go b/api/repo.go index ccb0ffa81..375bb11fa 100644 --- a/api/repo.go +++ b/api/repo.go @@ -77,6 +77,7 @@ func CreateRepo(c *gin.Context) { defaultBuildLimit := c.Value("defaultBuildLimit").(int64) defaultTimeout := c.Value("defaultTimeout").(int64) maxBuildLimit := c.Value("maxBuildLimit").(int64) + defaultRepoEvents := c.Value("defaultRepoEvents").([]string) // capture body from API request input := new(library.Repo) @@ -161,8 +162,20 @@ func CreateRepo(c *gin.Context) { if !input.GetAllowPull() && !input.GetAllowPush() && !input.GetAllowDeploy() && !input.GetAllowTag() && !input.GetAllowComment() { - // default event to push - r.SetAllowPush(true) + for _, event := range defaultRepoEvents { + switch event { + case constants.EventPull: + r.SetAllowPull(true) + case constants.EventPush: + r.SetAllowPush(true) + case constants.EventDeploy: + r.SetAllowDeploy(true) + case constants.EventTag: + r.SetAllowTag(true) + case constants.EventComment: + r.SetAllowComment(true) + } + } } else { r.SetAllowComment(input.GetAllowComment()) r.SetAllowDeploy(input.GetAllowDeploy()) diff --git a/cmd/vela-server/main.go b/cmd/vela-server/main.go index f011261d4..0dbe038fa 100644 --- a/cmd/vela-server/main.go +++ b/cmd/vela-server/main.go @@ -112,6 +112,12 @@ func main() { Usage: "override default build timeout (minutes)", Value: constants.BuildTimeoutDefault, }, + &cli.StringSliceFlag{ + EnvVars: []string{"VELA_DEFAULT_REPO_EVENTS"}, + Name: "default-repo-events", + Usage: "override default events for newly activated repositories", + Value: cli.NewStringSlice(constants.EventPush), + }, // Security Flags &cli.DurationFlag{ EnvVars: []string{"VELA_ACCESS_TOKEN_DURATION", "ACCESS_TOKEN_DURATION"}, diff --git a/cmd/vela-server/server.go b/cmd/vela-server/server.go index 114639501..d12338b2a 100644 --- a/cmd/vela-server/server.go +++ b/cmd/vela-server/server.go @@ -100,6 +100,7 @@ func server(c *cli.Context) error { middleware.WebhookValidation(!c.Bool("vela-disable-webhook-validation")), middleware.SecureCookie(c.Bool("vela-enable-secure-cookie")), middleware.Worker(c.Duration("worker-active-interval")), + middleware.DefaultRepoEvents(c.StringSlice("default-repo-events")), ) addr, err := url.Parse(c.String("server-addr")) diff --git a/cmd/vela-server/validate.go b/cmd/vela-server/validate.go index 70b06d90d..a29b4dcf1 100644 --- a/cmd/vela-server/validate.go +++ b/cmd/vela-server/validate.go @@ -6,6 +6,7 @@ package main import ( "fmt" + "github.com/go-vela/types/constants" "strings" "github.com/sirupsen/logrus" @@ -78,6 +79,18 @@ func validateCore(c *cli.Context) error { return fmt.Errorf("max-build-limit (VELA_MAX_BUILD_LIMIT) flag must be greater than 0") } + for _, event := range c.StringSlice("default-repo-events") { + switch event { + case constants.EventPull: + case constants.EventPush: + case constants.EventDeploy: + case constants.EventTag: + case constants.EventComment: + default: + return fmt.Errorf("default-repo-events (VELA_DEFAULT_REPO_EVENTS) has the unsupported value of %s", event) + } + } + return nil } diff --git a/router/middleware/default_repo_events.go b/router/middleware/default_repo_events.go new file mode 100644 index 000000000..65e5ed5b0 --- /dev/null +++ b/router/middleware/default_repo_events.go @@ -0,0 +1,18 @@ +// Copyright (c) 2022 Target Brands, Inc. All rights reserved. +// +// Use of this source code is governed by the LICENSE file in this repository. + +package middleware + +import ( + "github.com/gin-gonic/gin" +) + +// DefaultRepoEvents is a middleware function that attaches the defaultRepoEvents +// to enable the server to override the default repo event. +func DefaultRepoEvents(defaultRepoEvents []string) gin.HandlerFunc { + return func(c *gin.Context) { + c.Set("defaultRepoEvents", defaultRepoEvents) + c.Next() + } +} diff --git a/router/middleware/default_repo_events_test.go b/router/middleware/default_repo_events_test.go new file mode 100644 index 000000000..83cfc1703 --- /dev/null +++ b/router/middleware/default_repo_events_test.go @@ -0,0 +1,49 @@ +// Copyright (c) 2022 Target Brands, Inc. All rights reserved. +// +// Use of this source code is governed by the LICENSE file in this repository. + +package middleware + +import ( + "net/http" + "net/http/httptest" + "reflect" + "testing" + + "github.com/go-vela/types/constants" + + "github.com/gin-gonic/gin" +) + +func TestMiddleware_DefaultRepoEvents(t *testing.T) { + // setup types + var got []string + + want := []string{constants.EventPush} + + // setup context + gin.SetMode(gin.TestMode) + + resp := httptest.NewRecorder() + context, engine := gin.CreateTestContext(resp) + context.Request, _ = http.NewRequest(http.MethodGet, "/health", nil) + + // setup mock server + engine.Use(DefaultRepoEvents(want)) + engine.GET("/health", func(c *gin.Context) { + got = c.Value("defaultRepoEvents").([]string) + + c.Status(http.StatusOK) + }) + + // run test + engine.ServeHTTP(context.Writer, context.Request) + + if resp.Code != http.StatusOK { + t.Errorf("DefaultRepoEvents returned %v, want %v", resp.Code, http.StatusOK) + } + + if !reflect.DeepEqual(got, want) { + t.Errorf("DefaultRepoEvents is %v, want %v", got, want) + } +}