From 6583d8cad2a7ff17a46dd85a80202644353ebb98 Mon Sep 17 00:00:00 2001 From: Tim Birkett Date: Wed, 13 Nov 2019 16:42:55 +0000 Subject: [PATCH 1/6] Add status-name command line arg, config and tests --- cmd/server.go | 9 +++++++++ cmd/server_test.go | 1 + server/user_config.go | 1 + 3 files changed, 11 insertions(+) diff --git a/cmd/server.go b/cmd/server.go index 3bfb2a9115..bdbea3ce29 100644 --- a/cmd/server.go +++ b/cmd/server.go @@ -72,6 +72,7 @@ const ( SlackTokenFlag = "slack-token" SSLCertFileFlag = "ssl-cert-file" SSLKeyFileFlag = "ssl-key-file" + StatusName = "status-name" TFEHostnameFlag = "tfe-hostname" TFETokenFlag = "tfe-token" WriteGitCredsFlag = "write-git-creds" @@ -87,6 +88,7 @@ const ( DefaultLogLevel = "info" DefaultPort = 4141 DefaultTFEHostname = "app.terraform.io" + DefaultStatusName = "atlantis" ) var stringFlags = map[string]stringFlag{ @@ -202,6 +204,10 @@ var stringFlags = map[string]stringFlag{ SSLKeyFileFlag: { description: fmt.Sprintf("File containing x509 private key matching --%s.", SSLCertFileFlag), }, + StatusName: { + description: "Name used for updating the pull request status.", + defaultValue: DefaultStatusName, + }, TFEHostnameFlag: { description: "Hostname of your Terraform Enterprise installation. If using Terraform Cloud no need to set.", defaultValue: DefaultTFEHostname, @@ -454,6 +460,9 @@ func (s *ServerCmd) setDefaults(c *server.UserConfig) { if c.Port == 0 { c.Port = DefaultPort } + if c.StatusName == "" { + c.StatusName = DefaultStatusName + } if c.TFEHostname == "" { c.TFEHostname = DefaultTFEHostname } diff --git a/cmd/server_test.go b/cmd/server_test.go index fdf5efed95..ea1b43a309 100644 --- a/cmd/server_test.go +++ b/cmd/server_test.go @@ -392,6 +392,7 @@ func TestExecute_Defaults(t *testing.T) { Equals(t, "", passedConfig.SlackToken) Equals(t, "", passedConfig.SSLCertFile) Equals(t, "", passedConfig.SSLKeyFile) + Equals(t, "atlantis", passedConfig.StatusName) Equals(t, "app.terraform.io", passedConfig.TFEHostname) Equals(t, "", passedConfig.TFEToken) Equals(t, false, passedConfig.WriteGitCreds) diff --git a/server/user_config.go b/server/user_config.go index b3c101f27c..855dbe7b8a 100644 --- a/server/user_config.go +++ b/server/user_config.go @@ -44,6 +44,7 @@ type UserConfig struct { SlackToken string `mapstructure:"slack-token"` SSLCertFile string `mapstructure:"ssl-cert-file"` SSLKeyFile string `mapstructure:"ssl-key-file"` + StatusName string `mapstructure:"status-name"` TFEHostname string `mapstructure:"tfe-hostname"` TFEToken string `mapstructure:"tfe-token"` DefaultTFVersion string `mapstructure:"default-tf-version"` From 17c2b7eb3d0de5c1f10c2f0f2a1cc5c773277c1f Mon Sep 17 00:00:00 2001 From: Tim Birkett Date: Wed, 13 Nov 2019 16:59:28 +0000 Subject: [PATCH 2/6] Add further cmd tests --- cmd/server_test.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/cmd/server_test.go b/cmd/server_test.go index ea1b43a309..57bca21d9d 100644 --- a/cmd/server_test.go +++ b/cmd/server_test.go @@ -720,6 +720,7 @@ write-git-creds: true "TFE_HOSTNAME": "override-my-hostname", "TFE_TOKEN": "override-my-token", "WRITE_GIT_CREDS": "false", + "STATUS_NAME": "override-status-name", } { os.Setenv("ATLANTIS_"+name, value) // nolint: errcheck } @@ -763,6 +764,7 @@ write-git-creds: true Equals(t, "override-my-hostname", passedConfig.TFEHostname) Equals(t, "override-my-token", passedConfig.TFEToken) Equals(t, false, passedConfig.WriteGitCreds) + Equals(t, "override-status-name", passedConfig.StatusName) } func TestExecute_FlagConfigOverride(t *testing.T) { @@ -800,6 +802,7 @@ require-mergeable: true slack-token: slack-token ssl-cert-file: cert-file ssl-key-file: key-file +status-name: status-name tfe-hostname: my-hostname tfe-token: my-token write-git-creds: true @@ -839,6 +842,7 @@ write-git-creds: true cmd.SlackTokenFlag: "override-slack-token", cmd.SSLCertFileFlag: "override-cert-file", cmd.SSLKeyFileFlag: "override-key-file", + cmd.StatusName: "override-status-name", cmd.TFEHostnameFlag: "override-my-hostname", cmd.TFETokenFlag: "override-my-token", cmd.WriteGitCredsFlag: false, @@ -876,6 +880,7 @@ write-git-creds: true Equals(t, "override-slack-token", passedConfig.SlackToken) Equals(t, "override-cert-file", passedConfig.SSLCertFile) Equals(t, "override-key-file", passedConfig.SSLKeyFile) + Equals(t, "override-status-name", passedConfig.StatusName) Equals(t, "override-my-hostname", passedConfig.TFEHostname) Equals(t, "override-my-token", passedConfig.TFEToken) Equals(t, false, passedConfig.WriteGitCreds) @@ -918,6 +923,7 @@ func TestExecute_FlagEnvVarOverride(t *testing.T) { "SLACK_TOKEN": "slack-token", "SSL_CERT_FILE": "cert-file", "SSL_KEY_FILE": "key-file", + "STATUS_NAME": "status-name", "TFE_HOSTNAME": "my-hostname", "TFE_TOKEN": "my-token", "WRITE_GIT_CREDS": "true", @@ -965,6 +971,7 @@ func TestExecute_FlagEnvVarOverride(t *testing.T) { cmd.SlackTokenFlag: "override-slack-token", cmd.SSLCertFileFlag: "override-cert-file", cmd.SSLKeyFileFlag: "override-key-file", + cmd.StatusName: "override-status-name", cmd.TFEHostnameFlag: "override-my-hostname", cmd.TFETokenFlag: "override-my-token", cmd.WriteGitCredsFlag: false, @@ -1004,6 +1011,7 @@ func TestExecute_FlagEnvVarOverride(t *testing.T) { Equals(t, "override-slack-token", passedConfig.SlackToken) Equals(t, "override-cert-file", passedConfig.SSLCertFile) Equals(t, "override-key-file", passedConfig.SSLKeyFile) + Equals(t, "override-status-name", passedConfig.StatusName) Equals(t, "override-my-hostname", passedConfig.TFEHostname) Equals(t, "override-my-token", passedConfig.TFEToken) Equals(t, false, passedConfig.WriteGitCreds) From 5399493931d4b7634841d2ab32310e70eec76a8f Mon Sep 17 00:00:00 2001 From: Tim Birkett Date: Thu, 14 Nov 2019 10:58:05 +0000 Subject: [PATCH 3/6] Add StatusName to DefaultCommitStatusUpdater and update tests --- server/events/command_runner_test.go | 2 +- server/events/commit_status_updater.go | 7 ++++--- server/events/commit_status_updater_test.go | 10 +++++----- server/server.go | 2 +- 4 files changed, 11 insertions(+), 10 deletions(-) diff --git a/server/events/command_runner_test.go b/server/events/command_runner_test.go index 261184731f..25db650a3c 100644 --- a/server/events/command_runner_test.go +++ b/server/events/command_runner_test.go @@ -62,7 +62,7 @@ func setup(t *testing.T) *vcsmocks.MockClient { ThenReturn(pullLogger) ch = events.DefaultCommandRunner{ VCSClient: vcsClient, - CommitStatusUpdater: &events.DefaultCommitStatusUpdater{vcsClient}, + CommitStatusUpdater: &events.DefaultCommitStatusUpdater{vcsClient, "atlantis"}, EventParser: eventParsing, MarkdownRenderer: &events.MarkdownRenderer{}, GithubPullGetter: githubGetter, diff --git a/server/events/commit_status_updater.go b/server/events/commit_status_updater.go index 47e4846a52..5ee86161bb 100644 --- a/server/events/commit_status_updater.go +++ b/server/events/commit_status_updater.go @@ -40,10 +40,11 @@ type CommitStatusUpdater interface { // DefaultCommitStatusUpdater implements CommitStatusUpdater. type DefaultCommitStatusUpdater struct { Client vcs.Client + StatusName string } func (d *DefaultCommitStatusUpdater) UpdateCombined(repo models.Repo, pull models.PullRequest, status models.CommitStatus, command models.CommandName) error { - src := fmt.Sprintf("atlantis/%s", command.String()) + src := fmt.Sprintf("%s/%s", d.StatusName, command.String()) var descripWords string switch status { case models.PendingCommitStatus: @@ -58,7 +59,7 @@ func (d *DefaultCommitStatusUpdater) UpdateCombined(repo models.Repo, pull model } func (d *DefaultCommitStatusUpdater) UpdateCombinedCount(repo models.Repo, pull models.PullRequest, status models.CommitStatus, command models.CommandName, numSuccess int, numTotal int) error { - src := fmt.Sprintf("atlantis/%s", command.String()) + src := fmt.Sprintf("%s/%s", d.StatusName, command.String()) cmdVerb := "planned" if command == models.ApplyCommand { cmdVerb = "applied" @@ -71,7 +72,7 @@ func (d *DefaultCommitStatusUpdater) UpdateProject(ctx models.ProjectCommandCont if projectID == "" { projectID = fmt.Sprintf("%s/%s", ctx.RepoRelDir, ctx.Workspace) } - src := fmt.Sprintf("atlantis/%s: %s", cmdName.String(), projectID) + src := fmt.Sprintf("%s/%s: %s", d.StatusName, cmdName.String(), projectID) var descripWords string switch status { case models.PendingCommitStatus: diff --git a/server/events/commit_status_updater_test.go b/server/events/commit_status_updater_test.go index 152df23c1c..332901e6ef 100644 --- a/server/events/commit_status_updater_test.go +++ b/server/events/commit_status_updater_test.go @@ -66,7 +66,7 @@ func TestUpdateCombined(t *testing.T) { t.Run(c.expDescrip, func(t *testing.T) { RegisterMockTestingT(t) client := mocks.NewMockClient() - s := events.DefaultCommitStatusUpdater{Client: client} + s := events.DefaultCommitStatusUpdater{Client: client, StatusName: "atlantis"} err := s.UpdateCombined(models.Repo{}, models.PullRequest{}, c.status, c.command) Ok(t, err) @@ -132,11 +132,11 @@ func TestUpdateCombinedCount(t *testing.T) { t.Run(c.expDescrip, func(t *testing.T) { RegisterMockTestingT(t) client := mocks.NewMockClient() - s := events.DefaultCommitStatusUpdater{Client: client} + s := events.DefaultCommitStatusUpdater{Client: client, StatusName: "atlantis-test"} err := s.UpdateCombinedCount(models.Repo{}, models.PullRequest{}, c.status, c.command, c.numSuccess, c.numTotal) Ok(t, err) - expSrc := fmt.Sprintf("atlantis/%s", c.command) + expSrc := fmt.Sprintf("%s/%s", s.StatusName, c.command) client.VerifyWasCalledOnce().UpdateStatus(models.Repo{}, models.PullRequest{}, c.status, expSrc, c.expDescrip, "") }) } @@ -169,7 +169,7 @@ func TestDefaultCommitStatusUpdater_UpdateProjectSrc(t *testing.T) { for _, c := range cases { t.Run(c.expSrc, func(t *testing.T) { client := mocks.NewMockClient() - s := events.DefaultCommitStatusUpdater{Client: client} + s := events.DefaultCommitStatusUpdater{Client: client, StatusName: "atlantis"} err := s.UpdateProject(models.ProjectCommandContext{ ProjectName: c.projectName, RepoRelDir: c.repoRelDir, @@ -227,7 +227,7 @@ func TestDefaultCommitStatusUpdater_UpdateProject(t *testing.T) { for _, c := range cases { t.Run(c.expDescrip, func(t *testing.T) { client := mocks.NewMockClient() - s := events.DefaultCommitStatusUpdater{Client: client} + s := events.DefaultCommitStatusUpdater{Client: client, StatusName: "atlantis"} err := s.UpdateProject(models.ProjectCommandContext{ RepoRelDir: ".", Workspace: "default", diff --git a/server/server.go b/server/server.go index 7a9c4f3941..900831705d 100644 --- a/server/server.go +++ b/server/server.go @@ -205,7 +205,7 @@ func NewServer(userConfig UserConfig, config Config) (*Server, error) { return nil, errors.Wrap(err, "initializing webhooks") } vcsClient := vcs.NewClientProxy(githubClient, gitlabClient, bitbucketCloudClient, bitbucketServerClient, azuredevopsClient) - commitStatusUpdater := &events.DefaultCommitStatusUpdater{Client: vcsClient} + commitStatusUpdater := &events.DefaultCommitStatusUpdater{StatusName: userConfig.StatusName, Client: vcsClient} terraformClient, err := terraform.NewClient( logger, userConfig.DataDir, From 3c03db254e54abaa0469a4ca848fecdbcd7eb0f0 Mon Sep 17 00:00:00 2001 From: Tim Birkett Date: Thu, 14 Nov 2019 11:31:33 +0000 Subject: [PATCH 4/6] Minor change for styling purposes --- server/server.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/server.go b/server/server.go index 900831705d..8f983737bd 100644 --- a/server/server.go +++ b/server/server.go @@ -205,7 +205,7 @@ func NewServer(userConfig UserConfig, config Config) (*Server, error) { return nil, errors.Wrap(err, "initializing webhooks") } vcsClient := vcs.NewClientProxy(githubClient, gitlabClient, bitbucketCloudClient, bitbucketServerClient, azuredevopsClient) - commitStatusUpdater := &events.DefaultCommitStatusUpdater{StatusName: userConfig.StatusName, Client: vcsClient} + commitStatusUpdater := &events.DefaultCommitStatusUpdater{Client: vcsClient, StatusName: userConfig.StatusName} terraformClient, err := terraform.NewClient( logger, userConfig.DataDir, From 586c796691b7d1ce59052a019ed9307e2ce32753 Mon Sep 17 00:00:00 2001 From: Tim Birkett Date: Thu, 14 Nov 2019 11:38:21 +0000 Subject: [PATCH 5/6] Add documentation for --status-name --- runatlantis.io/docs/server-configuration.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/runatlantis.io/docs/server-configuration.md b/runatlantis.io/docs/server-configuration.md index a48fd87ee4..50336f0a92 100644 --- a/runatlantis.io/docs/server-configuration.md +++ b/runatlantis.io/docs/server-configuration.md @@ -421,7 +421,15 @@ Values are chosen in this order: atlantis server --ssl-cert-file="/etc/ssl/private/my-cert.key" ``` File containing x509 private key matching `--ssl-cert-file`. - + +* ### `--status-name` + ```bash + atlantis server --status-name="atlantis-dev" + ``` + Application name to use when updating a pull request status. + + This is useful when running multiple Atlantis servers against a single repository. + * ### `--tfe-hostname` ```bash atlantis server --tfe-hostname="my-terraform-enterprise.company.com" From c670c85ff4782123f728191b7376ff0a112f5398 Mon Sep 17 00:00:00 2001 From: Tim Birkett Date: Thu, 14 Nov 2019 11:47:39 +0000 Subject: [PATCH 6/6] run make fmt --- go.mod | 1 + go.sum | 4 ++++ server/events/commit_status_updater.go | 2 +- server/events/matchers/models_pullrequest.go | 1 + server/events/matchers/models_repo.go | 1 + server/events/matchers/ptr_to_logging_simplelogger.go | 1 + server/events/mock_workingdir_test.go | 5 +++-- server/events/project_command_runner_test.go | 5 +++-- server/events/runtime/env_step_runner.go | 3 ++- 9 files changed, 17 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 200bd34ed7..f4fa6d684c 100644 --- a/go.mod +++ b/go.mod @@ -59,6 +59,7 @@ require ( github.com/xanzy/go-gitlab v0.20.2-0.20190819195750-b1d195859ad0 golang.org/x/build v0.0.0-20190111050920-041ab4dc3f9d // indirect golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5 + golang.org/x/tools v0.0.0-20191113232020-e2727e816f5a // indirect gopkg.in/go-playground/assert.v1 v1.2.1 // indirect gopkg.in/go-playground/validator.v9 v9.20.2 gopkg.in/russross/blackfriday.v2 v2.0.0 diff --git a/go.sum b/go.sum index 98b92ed8ba..acca5361d2 100644 --- a/go.sum +++ b/go.sum @@ -413,7 +413,11 @@ golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3 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-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0 h1:Dh6fw+p6FyRl5x/FvNswO1ji0lIGzm3KP8Y9VkS9PTE= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20191113232020-e2727e816f5a h1:3IG7HNvPBDvrxpnTWA6zpeNCS5ydX6cdt6oOiGlC8qg= +golang.org/x/tools v0.0.0-20191113232020-e2727e816f5a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 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= diff --git a/server/events/commit_status_updater.go b/server/events/commit_status_updater.go index 5ee86161bb..f341bebc3f 100644 --- a/server/events/commit_status_updater.go +++ b/server/events/commit_status_updater.go @@ -39,7 +39,7 @@ type CommitStatusUpdater interface { // DefaultCommitStatusUpdater implements CommitStatusUpdater. type DefaultCommitStatusUpdater struct { - Client vcs.Client + Client vcs.Client StatusName string } diff --git a/server/events/matchers/models_pullrequest.go b/server/events/matchers/models_pullrequest.go index dd1fb0d4ee..37e4780130 100644 --- a/server/events/matchers/models_pullrequest.go +++ b/server/events/matchers/models_pullrequest.go @@ -3,6 +3,7 @@ package matchers import ( "reflect" + "github.com/petergtz/pegomock" models "github.com/runatlantis/atlantis/server/events/models" ) diff --git a/server/events/matchers/models_repo.go b/server/events/matchers/models_repo.go index 418f13cfcf..e985fd3a90 100644 --- a/server/events/matchers/models_repo.go +++ b/server/events/matchers/models_repo.go @@ -3,6 +3,7 @@ package matchers import ( "reflect" + "github.com/petergtz/pegomock" models "github.com/runatlantis/atlantis/server/events/models" ) diff --git a/server/events/matchers/ptr_to_logging_simplelogger.go b/server/events/matchers/ptr_to_logging_simplelogger.go index 04c72791bc..095fa65a72 100644 --- a/server/events/matchers/ptr_to_logging_simplelogger.go +++ b/server/events/matchers/ptr_to_logging_simplelogger.go @@ -3,6 +3,7 @@ package matchers import ( "reflect" + "github.com/petergtz/pegomock" logging "github.com/runatlantis/atlantis/server/logging" ) diff --git a/server/events/mock_workingdir_test.go b/server/events/mock_workingdir_test.go index c0b745f724..58d91d8d8b 100644 --- a/server/events/mock_workingdir_test.go +++ b/server/events/mock_workingdir_test.go @@ -4,11 +4,12 @@ package events import ( + "reflect" + "time" + pegomock "github.com/petergtz/pegomock" models "github.com/runatlantis/atlantis/server/events/models" logging "github.com/runatlantis/atlantis/server/logging" - "reflect" - "time" ) type MockWorkingDir struct { diff --git a/server/events/project_command_runner_test.go b/server/events/project_command_runner_test.go index 04be59abbf..9729d8f9a8 100644 --- a/server/events/project_command_runner_test.go +++ b/server/events/project_command_runner_test.go @@ -14,11 +14,12 @@ package events_test import ( - "github.com/hashicorp/go-version" - "github.com/runatlantis/atlantis/server/events/runtime" "os" "testing" + "github.com/hashicorp/go-version" + "github.com/runatlantis/atlantis/server/events/runtime" + . "github.com/petergtz/pegomock" "github.com/runatlantis/atlantis/server/events" "github.com/runatlantis/atlantis/server/events/mocks" diff --git a/server/events/runtime/env_step_runner.go b/server/events/runtime/env_step_runner.go index 28a8d481f2..e8ba3246c4 100644 --- a/server/events/runtime/env_step_runner.go +++ b/server/events/runtime/env_step_runner.go @@ -1,8 +1,9 @@ package runtime import ( - "github.com/runatlantis/atlantis/server/events/models" "strings" + + "github.com/runatlantis/atlantis/server/events/models" ) // EnvStepRunner set environment variables.