From 850303b8b8281303075db1dc38a8f4bb08745412 Mon Sep 17 00:00:00 2001 From: Megan Marsh Date: Wed, 6 May 2020 14:16:35 -0700 Subject: [PATCH] get gcloud integration working on Windows --- builder/googlecompute/builder.go | 1 + builder/googlecompute/step_start_tunnel.go | 38 ++++++++++++++++++---- builder/googlecompute/tunnel_driver.go | 3 +- 3 files changed, 34 insertions(+), 8 deletions(-) diff --git a/builder/googlecompute/builder.go b/builder/googlecompute/builder.go index 3e8fae9da..f083066c4 100644 --- a/builder/googlecompute/builder.go +++ b/builder/googlecompute/builder.go @@ -70,6 +70,7 @@ func (b *Builder) Run(ctx context.Context, ui packer.Ui, hook packer.Hook) (pack IAPConf: &b.config.IAPConfig, CommConf: &b.config.Comm, AccountFile: b.config.AccountFile, + ProjectId: b.config.ProjectId, }, &communicator.StepConnect{ Config: &b.config.Comm, diff --git a/builder/googlecompute/step_start_tunnel.go b/builder/googlecompute/step_start_tunnel.go index 59393c49a..83447a6c9 100644 --- a/builder/googlecompute/step_start_tunnel.go +++ b/builder/googlecompute/step_start_tunnel.go @@ -5,12 +5,15 @@ package googlecompute import ( "bufio" + "bytes" "context" "fmt" "log" "os" + "runtime" "strconv" "strings" + "text/template" "time" "github.com/hashicorp/packer/common/net" @@ -65,6 +68,7 @@ type StepStartTunnel struct { IAPConf *IAPConfig CommConf *communicator.Config AccountFile string + ProjectId string tunnelDriver TunnelDriver } @@ -116,17 +120,37 @@ func (s *StepStartTunnel) createTempGcloudScript(args []string) (string, error) } - // authenticate to gcloud - _, err = writer.WriteString( - fmt.Sprintf("gcloud auth activate-service-account --key-file='%s'\n", - s.AccountFile)) - if err != nil { - return "", fmt.Errorf("Error preparing gcloud shell script: %s", err) + launchTemplate := ` +gcloud auth activate-service-account --key-file='{{.AccountFile}}' +gcloud config set project {{.ProjectID}} +{{.Args}} +` + if runtime.GOOS == "windows" { + launchTemplate = ` +call gcloud auth activate-service-account --key-file {{.AccountFile}} +call gcloud config set project {{.ProjectID}} +call {{.Args}} +` } // call command args = append([]string{"gcloud"}, args...) argString := strings.Join(args, " ") - if _, err := writer.WriteString(argString + "\n"); err != nil { + + var tpl = template.Must(template.New("createTunnel").Parse(launchTemplate)) + var b bytes.Buffer + + opts := map[string]string{ + "AccountFile": s.AccountFile, + "ProjectID": s.ProjectId, + "Args": argString, + } + + err = tpl.Execute(&b, opts) + if err != nil { + fmt.Println(err) + } + + if _, err := writer.WriteString(b.String()); err != nil { return "", fmt.Errorf("Error preparing gcloud shell script: %s", err) } diff --git a/builder/googlecompute/tunnel_driver.go b/builder/googlecompute/tunnel_driver.go index fee1cff76..cd067b1ea 100644 --- a/builder/googlecompute/tunnel_driver.go +++ b/builder/googlecompute/tunnel_driver.go @@ -75,7 +75,8 @@ func (t *TunnelDriverLinux) StartTunnel(cancelCtx context.Context, tempScriptFil // "not authorized" and "failed to connect to backend," but after // about a minute of retries this goes away and we're able to // connect. - if strings.Contains(lineStderr, "4033") { + // 4003: "failed to connect to backend". Network blip. + if strings.Contains(lineStderr, "4033") || strings.Contains(lineStderr, "4003") { return RetryableTunnelError{lineStderr} } else { log.Printf("NOT RETRYABLE: %s", lineStderr)