From aab21c62290dcc86554378906f6662c49499ae55 Mon Sep 17 00:00:00 2001 From: Gennady Lipenkov Date: Mon, 14 Mar 2022 19:50:31 +0300 Subject: [PATCH 1/5] Support 'offline mode': do not download terraform binary and use one from PATH Signed-off-by: Gennady Lipenkov --- internal/cmd/generate.go | 4 +++- internal/provider/generate.go | 32 +++++++++++++++++++++++++------- 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/internal/cmd/generate.go b/internal/cmd/generate.go index a653253c..4766090b 100644 --- a/internal/cmd/generate.go +++ b/internal/cmd/generate.go @@ -11,6 +11,7 @@ type generateCmd struct { commonCmd flagLegacySidebar bool + offline bool } func (cmd *generateCmd) Synopsis() string { @@ -24,6 +25,7 @@ func (cmd *generateCmd) Help() string { func (cmd *generateCmd) Flags() *flag.FlagSet { fs := flag.NewFlagSet("generate", flag.ExitOnError) fs.BoolVar(&cmd.flagLegacySidebar, "legacy-sidebar", false, "generate the legacy .erb sidebar file") + fs.BoolVar(&cmd.offline, "offline", false, "do not download terraform binary and find one in PATH") return fs } @@ -39,7 +41,7 @@ func (cmd *generateCmd) Run(args []string) int { } func (cmd *generateCmd) runInternal() error { - err := provider.Generate(cmd.ui, cmd.flagLegacySidebar) + err := provider.Generate(cmd.ui, cmd.flagLegacySidebar, cmd.offline) if err != nil { return fmt.Errorf("unable to generate website: %w", err) } diff --git a/internal/provider/generate.go b/internal/provider/generate.go index 280bab12..e1cd3244 100644 --- a/internal/provider/generate.go +++ b/internal/provider/generate.go @@ -11,13 +11,18 @@ import ( "strings" "github.com/hashicorp/go-version" + install "github.com/hashicorp/hc-install" + "github.com/hashicorp/hc-install/fs" "github.com/hashicorp/hc-install/product" "github.com/hashicorp/hc-install/releases" + "github.com/hashicorp/hc-install/src" "github.com/hashicorp/terraform-exec/tfexec" tfjson "github.com/hashicorp/terraform-json" "github.com/mitchellh/cli" ) +const defaultTerraformVersion = "1.0.5" + // TODO: convert these to flags? var ( providerName string @@ -74,6 +79,7 @@ var ( type generator struct { legacySidebar bool + offlineMode bool ui cli.Ui } @@ -86,9 +92,10 @@ func (g *generator) warnf(format string, a ...interface{}) { g.ui.Warn(fmt.Sprintf(format, a...)) } -func Generate(ui cli.Ui, legacySidebar bool) error { +func Generate(ui cli.Ui, legacySidebar, offline bool) error { g := &generator{ legacySidebar: legacySidebar, + offlineMode: offline, ui: ui, } @@ -498,13 +505,24 @@ provider %[1]q { return nil, err } - g.infof("getting Terraform binary") - installer := &releases.ExactVersion{ - Product: product.Terraform, - Version: version.Must(version.NewVersion("1.0.5")), - InstallDir: tmpDir, + i := install.NewInstaller() + src := []src.Source{} + + if g.offlineMode { + g.infof("use Terraform binary from PATH") + src = append(src, &fs.AnyVersion{ + Product: &product.Terraform, + }) + } else { + g.infof("getting Terraform binary") + src = append(src, &releases.ExactVersion{ + Product: product.Terraform, + Version: version.Must(version.NewVersion(defaultTerraformVersion)), + InstallDir: tmpDir, + }) } - tfBin, err := installer.Install(context.Background()) + + tfBin, err := i.Ensure(context.Background(), src) if err != nil { return nil, err } From 8a556aacfe7ce0c62f301903307bd122efc338db Mon Sep 17 00:00:00 2001 From: Gennady Lipenkov Date: Tue, 15 Mar 2022 19:13:46 +0300 Subject: [PATCH 2/5] unilaterally check for a Terraform binary first, then fall back to downloading the latest version; also support set exact version to download. Signed-off-by: Gennady Lipenkov --- go.mod | 2 ++ go.sum | 2 ++ internal/cmd/generate.go | 6 ++--- internal/provider/generate.go | 42 +++++++++++++++++++++-------------- 4 files changed, 32 insertions(+), 20 deletions(-) diff --git a/go.mod b/go.mod index 833aa372..99bf8ff8 100644 --- a/go.mod +++ b/go.mod @@ -23,8 +23,10 @@ require ( github.com/fatih/color v1.7.0 // indirect github.com/google/uuid v1.1.2 // indirect github.com/hashicorp/errwrap v1.0.0 // indirect + github.com/hashicorp/go-checkpoint v0.5.0 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect + github.com/hashicorp/go-uuid v1.0.0 // indirect github.com/huandu/xstrings v1.3.2 // indirect github.com/imdario/mergo v0.3.12 // indirect github.com/mattn/go-isatty v0.0.14 // indirect diff --git a/go.sum b/go.sum index 85b7fb68..d36d807b 100644 --- a/go.sum +++ b/go.sum @@ -50,6 +50,7 @@ github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= 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-checkpoint v0.5.0 h1:MFYpPZCnQqQTE18jFwSII6eUQrD/oxMFp3mlgcqk5mU= github.com/hashicorp/go-checkpoint v0.5.0/go.mod h1:7nfLNL10NsxqO4iWuW6tWW0HjZuDrwkBuEQsVcpCOgg= github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= @@ -57,6 +58,7 @@ github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/S 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-uuid v1.0.0 h1:RS8zrF7PhGwyNPOtxSClXXj9HA8feRnJzgnI1RJCSnM= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-version v1.3.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go-version v1.4.0 h1:aAQzgqIrRKRa7w75CKpbBxYsmUoPjzVm1W59ca1L0J4= diff --git a/internal/cmd/generate.go b/internal/cmd/generate.go index 4766090b..98b6b32a 100644 --- a/internal/cmd/generate.go +++ b/internal/cmd/generate.go @@ -11,7 +11,7 @@ type generateCmd struct { commonCmd flagLegacySidebar bool - offline bool + tfVersion string } func (cmd *generateCmd) Synopsis() string { @@ -25,7 +25,7 @@ func (cmd *generateCmd) Help() string { func (cmd *generateCmd) Flags() *flag.FlagSet { fs := flag.NewFlagSet("generate", flag.ExitOnError) fs.BoolVar(&cmd.flagLegacySidebar, "legacy-sidebar", false, "generate the legacy .erb sidebar file") - fs.BoolVar(&cmd.offline, "offline", false, "do not download terraform binary and find one in PATH") + fs.StringVar(&cmd.tfVersion, "tf-version", "", "terraform binary version to download") return fs } @@ -41,7 +41,7 @@ func (cmd *generateCmd) Run(args []string) int { } func (cmd *generateCmd) runInternal() error { - err := provider.Generate(cmd.ui, cmd.flagLegacySidebar, cmd.offline) + err := provider.Generate(cmd.ui, cmd.flagLegacySidebar, cmd.tfVersion) if err != nil { return fmt.Errorf("unable to generate website: %w", err) } diff --git a/internal/provider/generate.go b/internal/provider/generate.go index e1cd3244..51118903 100644 --- a/internal/provider/generate.go +++ b/internal/provider/generate.go @@ -12,6 +12,7 @@ import ( "github.com/hashicorp/go-version" install "github.com/hashicorp/hc-install" + "github.com/hashicorp/hc-install/checkpoint" "github.com/hashicorp/hc-install/fs" "github.com/hashicorp/hc-install/product" "github.com/hashicorp/hc-install/releases" @@ -79,7 +80,7 @@ var ( type generator struct { legacySidebar bool - offlineMode bool + tfVersion string ui cli.Ui } @@ -92,10 +93,10 @@ func (g *generator) warnf(format string, a ...interface{}) { g.ui.Warn(fmt.Sprintf(format, a...)) } -func Generate(ui cli.Ui, legacySidebar, offline bool) error { +func Generate(ui cli.Ui, legacySidebar bool, tfVersion string) error { g := &generator{ legacySidebar: legacySidebar, - offlineMode: offline, + tfVersion: tfVersion, ui: ui, } @@ -506,23 +507,30 @@ provider %[1]q { } i := install.NewInstaller() - src := []src.Source{} - - if g.offlineMode { - g.infof("use Terraform binary from PATH") - src = append(src, &fs.AnyVersion{ - Product: &product.Terraform, - }) + sources := []src.Source{} + if g.tfVersion != "" { + g.infof("download specific Terraform binary version %s", g.tfVersion) + sources = []src.Source{ + &releases.ExactVersion{ + Product: product.Terraform, + Version: version.Must(version.NewVersion(g.tfVersion)), + InstallDir: tmpDir, + }, + } } else { - g.infof("getting Terraform binary") - src = append(src, &releases.ExactVersion{ - Product: product.Terraform, - Version: version.Must(version.NewVersion(defaultTerraformVersion)), - InstallDir: tmpDir, - }) + g.infof("use Terraform binary from PATH then fallback to getting Terraform binary if not found locally") + sources = []src.Source{ + &fs.AnyVersion{ + Product: &product.Terraform, + }, + &checkpoint.LatestVersion{ + InstallDir: tmpDir, + Product: product.Terraform, + }, + } } - tfBin, err := i.Ensure(context.Background(), src) + tfBin, err := i.Ensure(context.Background(), sources) if err != nil { return nil, err } From eb9f67118eb71986c1c9237ad1503717fdb50cf5 Mon Sep 17 00:00:00 2001 From: GennadySpb Date: Tue, 15 Mar 2022 20:02:38 +0300 Subject: [PATCH 3/5] Update internal/provider/generate.go Co-authored-by: Brian Flad --- internal/provider/generate.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/internal/provider/generate.go b/internal/provider/generate.go index 51118903..a079d6e9 100644 --- a/internal/provider/generate.go +++ b/internal/provider/generate.go @@ -22,8 +22,6 @@ import ( "github.com/mitchellh/cli" ) -const defaultTerraformVersion = "1.0.5" - // TODO: convert these to flags? var ( providerName string From 31d01e59762ba371eeb39fa6e2ff5e19e0261dc6 Mon Sep 17 00:00:00 2001 From: GennadySpb Date: Tue, 15 Mar 2022 20:02:50 +0300 Subject: [PATCH 4/5] Update internal/provider/generate.go Co-authored-by: Brian Flad --- internal/provider/generate.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/provider/generate.go b/internal/provider/generate.go index a079d6e9..f5e1cef5 100644 --- a/internal/provider/generate.go +++ b/internal/provider/generate.go @@ -507,7 +507,7 @@ provider %[1]q { i := install.NewInstaller() sources := []src.Source{} if g.tfVersion != "" { - g.infof("download specific Terraform binary version %s", g.tfVersion) + g.infof("downloading Terraform CLI binary version from releases.hashicorp.com: %s", g.tfVersion) sources = []src.Source{ &releases.ExactVersion{ Product: product.Terraform, From 5ac9ef572bba8d0aed1c7743982e7df8fb401763 Mon Sep 17 00:00:00 2001 From: GennadySpb Date: Tue, 15 Mar 2022 20:03:34 +0300 Subject: [PATCH 5/5] Update internal/provider/generate.go Co-authored-by: Brian Flad --- internal/provider/generate.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/provider/generate.go b/internal/provider/generate.go index f5e1cef5..548b8437 100644 --- a/internal/provider/generate.go +++ b/internal/provider/generate.go @@ -516,7 +516,7 @@ provider %[1]q { }, } } else { - g.infof("use Terraform binary from PATH then fallback to getting Terraform binary if not found locally") + g.infof("using Terraform CLI binary from PATH if available, otherwise downloading latest Terraform CLI binary") sources = []src.Source{ &fs.AnyVersion{ Product: &product.Terraform,