Skip to content

Commit 9e23f0e

Browse files
authored
Merge pull request #1022 from hashicorp/ntodd/tf-18527/support-tool-version-architectures
[TF-18527] Add Archs to AdminTerraformVersionCreateOptions
2 parents 98975f4 + 56eeb74 commit 9e23f0e

File tree

4 files changed

+58
-18
lines changed

4 files changed

+58
-18
lines changed

CHANGELOG.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
# Unreleased
22

33
## Enhancements
4-
* Add support for project level auto destroy settings @simonxmh [#1011](https://github.com/hashicorp/go-tfe/pull/1011)
54

5+
* Add support for project level auto destroy settings @simonxmh [#1011](https://github.com/hashicorp/go-tfe/pull/1011)
6+
* Add BETA support for Linux arm64 agents, which is EXPERIMENTAL, SUBJECT TO CHANGE, and may not be available to all users @natalie-todd [#1022](https://github.com/hashicorp/go-tfe/pull/1022)
7+
68
# v1.71.0
79

810
## Enhancements

admin_terraform_version.go

Lines changed: 38 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,19 @@ import (
77
"context"
88
"fmt"
99
"net/url"
10+
"reflect"
1011
"time"
1112
)
1213

1314
// Compile-time proof of interface implementation.
1415
var _ AdminTerraformVersions = (*adminTerraformVersions)(nil)
1516

17+
const (
18+
linux = "linux"
19+
amd64 = "amd64"
20+
arm64 = "arm64"
21+
)
22+
1623
// AdminTerraformVersions describes all the admin terraform versions related methods that
1724
// the Terraform Enterprise API supports.
1825
// Note that admin terraform versions are only available in Terraform Enterprise.
@@ -55,6 +62,13 @@ type AdminTerraformVersion struct {
5562
CreatedAt time.Time `jsonapi:"attr,created-at,iso8601"`
5663
}
5764

65+
type ToolVersionArchitecture struct {
66+
URL string `jsonapi:"attr,url"`
67+
Sha string `jsonapi:"attr,sha"`
68+
OS string `jsonapi:"attr,os"`
69+
Arch string `jsonapi:"attr,arch"`
70+
}
71+
5872
// AdminTerraformVersionsListOptions represents the options for listing
5973
// terraform versions.
6074
type AdminTerraformVersionsListOptions struct {
@@ -70,15 +84,16 @@ type AdminTerraformVersionsListOptions struct {
7084
// AdminTerraformVersionCreateOptions for creating a terraform version.
7185
// https://developer.hashicorp.com/terraform/enterprise/api-docs/admin/terraform-versions#request-body
7286
type AdminTerraformVersionCreateOptions struct {
73-
Type string `jsonapi:"primary,terraform-versions"`
74-
Version *string `jsonapi:"attr,version"` // Required
75-
URL *string `jsonapi:"attr,url"` // Required
76-
Sha *string `jsonapi:"attr,sha"` // Required
77-
Official *bool `jsonapi:"attr,official,omitempty"`
78-
Deprecated *bool `jsonapi:"attr,deprecated,omitempty"`
79-
DeprecatedReason *string `jsonapi:"attr,deprecated-reason,omitempty"`
80-
Enabled *bool `jsonapi:"attr,enabled,omitempty"`
81-
Beta *bool `jsonapi:"attr,beta,omitempty"`
87+
Type string `jsonapi:"primary,terraform-versions"`
88+
Version *string `jsonapi:"attr,version"` // Required
89+
URL *string `jsonapi:"attr,url"` // Required
90+
Sha *string `jsonapi:"attr,sha"` // Required
91+
Official *bool `jsonapi:"attr,official,omitempty"`
92+
Deprecated *bool `jsonapi:"attr,deprecated,omitempty"`
93+
DeprecatedReason *string `jsonapi:"attr,deprecated-reason,omitempty"`
94+
Enabled *bool `jsonapi:"attr,enabled,omitempty"`
95+
Beta *bool `jsonapi:"attr,beta,omitempty"`
96+
Archs []*ToolVersionArchitecture `jsonapi:"attr,archs,omitempty"`
8297
}
8398

8499
// AdminTerraformVersionUpdateOptions for updating terraform version.
@@ -194,18 +209,25 @@ func (a *adminTerraformVersions) Delete(ctx context.Context, id string) error {
194209
}
195210

196211
func (o AdminTerraformVersionCreateOptions) valid() error {
197-
if (o == AdminTerraformVersionCreateOptions{}) {
212+
if (reflect.DeepEqual(o, AdminTerraformVersionCreateOptions{})) {
198213
return ErrRequiredTFVerCreateOps
199214
}
200215
if !validString(o.Version) {
201216
return ErrRequiredVersion
202217
}
203-
if !validString(o.URL) {
204-
return ErrRequiredURL
218+
if !o.validArch() && (!validString(o.URL) || !validString(o.Sha)) {
219+
return ErrRequiredArchOrURLAndSha
205220
}
206-
if !validString(o.Sha) {
207-
return ErrRequiredSha
208-
}
209-
210221
return nil
211222
}
223+
224+
func (o AdminTerraformVersionCreateOptions) validArch() bool {
225+
var valid bool
226+
for _, a := range o.Archs {
227+
valid = validString(&a.URL) && validString(&a.Sha) && a.OS == linux && (a.Arch == amd64 || a.Arch == arm64)
228+
if valid {
229+
break
230+
}
231+
}
232+
return valid
233+
}

admin_terraform_version_integration_test.go

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,15 +103,22 @@ func TestAdminTerraformVersions_CreateDelete(t *testing.T) {
103103
version := genSafeRandomTerraformVersion()
104104

105105
t.Run("with valid options", func(t *testing.T) {
106+
sha := String(genSha(t))
106107
opts := AdminTerraformVersionCreateOptions{
107108
Version: String(version),
108109
URL: String("https://www.hashicorp.com"),
109-
Sha: String(genSha(t)),
110+
Sha: sha,
110111
Deprecated: Bool(true),
111112
DeprecatedReason: String("Test Reason"),
112113
Official: Bool(false),
113114
Enabled: Bool(false),
114115
Beta: Bool(false),
116+
Archs: []*ToolVersionArchitecture{{
117+
URL: "https://www.hashicorp.com",
118+
Sha: *sha,
119+
OS: linux,
120+
Arch: amd64,
121+
}},
115122
}
116123
tfv, err := client.Admin.TerraformVersions.Create(ctx, opts)
117124
require.NoError(t, err)
@@ -170,6 +177,7 @@ func TestAdminTerraformVersions_ReadUpdate(t *testing.T) {
170177

171178
t.Run("reads and updates", func(t *testing.T) {
172179
version := genSafeRandomTerraformVersion()
180+
sha := String(genSha(t))
173181
opts := AdminTerraformVersionCreateOptions{
174182
Version: String(version),
175183
URL: String("https://www.hashicorp.com"),
@@ -179,6 +187,12 @@ func TestAdminTerraformVersions_ReadUpdate(t *testing.T) {
179187
DeprecatedReason: String("Test Reason"),
180188
Enabled: Bool(false),
181189
Beta: Bool(false),
190+
Archs: []*ToolVersionArchitecture{{
191+
URL: "https://www.hashicorp.com",
192+
Sha: *sha,
193+
OS: linux,
194+
Arch: amd64,
195+
}},
182196
}
183197
tfv, err := client.Admin.TerraformVersions.Create(ctx, opts)
184198
require.NoError(t, err)

errors.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,8 @@ var (
274274

275275
ErrRequiredURL = errors.New("url is required")
276276

277+
ErrRequiredArchOrURLAndSha = errors.New("valid arch or url and sha is required")
278+
277279
ErrRequiredAPIURL = errors.New("API URL is required")
278280

279281
ErrRequiredHTTPURL = errors.New("HTTP URL is required")

0 commit comments

Comments
 (0)