Skip to content

Commit

Permalink
versiongen: add generator of TF versions
Browse files Browse the repository at this point in the history
  • Loading branch information
radeksimko committed Aug 4, 2022
1 parent 2d308dd commit 2f9d18f
Show file tree
Hide file tree
Showing 4 changed files with 162 additions and 0 deletions.
1 change: 1 addition & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ go 1.14

require (
github.com/google/go-cmp v0.5.8
github.com/hashicorp/go-cleanhttp v0.5.1
github.com/hashicorp/go-version v1.6.0
github.com/hashicorp/hcl-lang v0.0.0-20220801150536-118ac453e267
github.com/hashicorp/hcl/v2 v2.13.0
Expand Down
1 change: 1 addition & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg=
github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
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-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=
github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=
Expand Down
129 changes: 129 additions & 0 deletions internal/versiongen/gen.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
package main

import (
"encoding/json"
"flag"
"fmt"
"io/ioutil"
"log"
"net/url"
"os"
"sort"
"text/template"
"time"

"github.com/hashicorp/go-cleanhttp"
"github.com/hashicorp/go-version"
)

var baseURL = "https://api.releases.hashicorp.com/v1"

type release struct {
Version *version.Version `json:"version"`
Created *time.Time `json:"timestamp_created"`
}

func main() {
var writePath string
flag.StringVar(&writePath, "w", "", "Path to write to")
flag.Parse()

output := os.Stdout
if writePath != "" {
f, err := os.OpenFile(writePath, os.O_RDWR|os.O_CREATE, 0o755)
if err != nil {
log.Fatal(err)
}
output = f
}

releases, err := GetTerraformReleases()
if err != nil {
log.Fatal(err)
}

sort.SliceStable(releases, func(i, j int) bool {
return releases[i].Version.GreaterThan(releases[j].Version)
})

outputTpl := `// Code generated by "versiongen"; DO NOT EDIT.
package schema
import (
"github.com/hashicorp/go-version"
)
var terraformVersions = version.Collection{
{{- range . }}
version.Must(version.NewVersion("{{ .Version }}")),
{{- end }}
}
`
tpl, err := template.New("output").Parse(outputTpl)
if err != nil {
log.Fatal(err)
}

err = tpl.Execute(output, releases)
if err != nil {
log.Fatal(err)
}
}

func GetTerraformReleases() ([]release, error) {
releases := make([]release, 0)

var after *time.Time
for {
r, err := getTerraformReleasesAfter(after)
if err != nil {
return releases, err
}
if len(r) == 0 {
break
}

releases = append(releases, r...)
after = r[len(r)-1].Created
}

return releases, nil
}

func getTerraformReleasesAfter(after *time.Time) ([]release, error) {
u, err := url.Parse(fmt.Sprintf("%s/releases/%s", baseURL, "terraform"))
if err != nil {
return nil, err
}

params := u.Query()
params.Set("limit", "20")
if after != nil {
params.Set("after", after.Format(time.RFC3339))
}
u.RawQuery = params.Encode()

client := cleanhttp.DefaultClient()
log.Printf("calling %q", u.String())
resp, err := client.Get(u.String())
if err != nil {
return nil, err
}

if resp.StatusCode != 200 {
return nil, fmt.Errorf("server returned %q", resp.Status)
}

b, err := ioutil.ReadAll(resp.Body)
if err != nil {
return nil, err
}

var releases []release
err = json.Unmarshal(b, &releases)
if err != nil {
return nil, err
}

return releases, nil
}
31 changes: 31 additions & 0 deletions internal/versiongen/gen_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package main

import (
"testing"
"time"

"github.com/google/go-cmp/cmp"
"github.com/hashicorp/go-version"
)

func TestGetTerraformReleases(t *testing.T) {
releases, err := GetTerraformReleases()
if err != nil {
t.Fatal(err)
}

expectedLength := 234
if expectedLength < len(releases) {
t.Fatalf("expected >= %d releases, %d given", expectedLength, len(releases))
}

expectedDate := time.Date(2017, 3, 1, 17, 36, 49, 0, time.UTC)
expectedOldestRelease := release{
Version: version.Must(version.NewVersion("0.6.4")),
Created: &expectedDate,
}
oldestRelease := releases[len(releases)-1]
if diff := cmp.Diff(expectedOldestRelease, oldestRelease); diff != "" {
t.Fatalf("unexpected oldest release: %s", diff)
}
}

0 comments on commit 2f9d18f

Please sign in to comment.