Skip to content

Commit 30d892d

Browse files
authored
Manager resource and null (zero) values (#19)
* Manager resource and null (zero) values Hirefire API changed how it handles null values in the manager resource, specifically: - notify* - *scale_timeout - *scale_limit Also, logdrain in the application resource now requires a specific format. Plus, updated readme to explain how to run terrafrom with a local build. * Run terraform with a dev version of the provider
1 parent 8088a7d commit 30d892d

File tree

11 files changed

+124
-60
lines changed

11 files changed

+124
-60
lines changed

.gitignore

+7-5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1-
terraform-provider-hirefire*
2-
terraform.tfstate*
3-
.terraform
4-
main.tf
5-
.env
1+
/terraform-provider-hirefire
2+
/terraform.tfstate*
3+
/.terraform.lock.hcl
4+
/.terraformrc
5+
/.terraform
6+
/main.tf
7+
/.env
68
/dist

README.md

+12-3
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,18 @@ Development
1313

1414
go build .
1515

16-
Then create a `main.tf` file and use Terraform as usual to experiment.
16+
Then, create a `.terraformrc` file with:
1717

18+
provider_installation {
19+
dev_overrides {
20+
"carwow/hirefire" = "<ABSOLUTE-PATH-TO-PROJECT>"
21+
}
22+
}
23+
24+
Finally, create a `main.tf` file (see `main.tf.example`) and call:
25+
26+
terraform init
27+
HIREFIRE_API_KEY=your-key TF_CLI_CONFIG_FILE=.terraformrc terraform apply
1828

1929
Testing
2030
---
@@ -45,8 +55,7 @@ or to run tests for a single resource:
4555
Release
4656
---
4757

48-
1. Update version in [docs/index.md] if necessary and commit.
49-
2. Push a tag for the new version. CircleCI will do the rest.
58+
Push a tag for the new version. CircleCI will do the rest.
5059

5160
[docs/index.md]: https://github.com/carwow/terraform-provider-hirefire/blob/main/docs/index.md
5261

client/client.go

+5
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,9 @@ func New(apiKey string) *Client {
3434
},
3535
}
3636

37+
// Uncomment to dump all HTTP requests and responses
38+
// req.Debug = true
39+
3740
client.Organization = &OrganizationResource{client: client}
3841
client.Account = &AccountResource{client: client}
3942
client.Application = &ApplicationResource{client: client}
@@ -89,6 +92,8 @@ func (c *Client) createResource(path string, wrapped interface{}) error {
8992
}
9093
if res.Response().StatusCode != 201 {
9194
return fmt.Errorf("%d: %s", res.Response().StatusCode, res.String())
95+
// Uncomment to dump full HTTP request and response with error message
96+
// return fmt.Errorf("%d: %s\n%s", res.Response().StatusCode, res.String(), res.Dump())
9297
}
9398

9499
err = res.ToJSON(&wrapped)

client/manager.go

+7-7
Original file line numberDiff line numberDiff line change
@@ -33,17 +33,17 @@ type Manager struct {
3333
DownscaleQuantity *int `json:"downscale_quantity"`
3434
UpscaleSensitivity *int `json:"upscale_sensitivity"`
3535
DownscaleSensitivity *int `json:"downscale_sensitivity"`
36-
UpscaleTimeout *int `json:"upscale_timeout"`
37-
DownscaleTimeout *int `json:"downscale_timeout"`
38-
UpscaleLimit *int `json:"upscale_limit"`
39-
DownscaleLimit *int `json:"downscale_limit"`
36+
UpscaleTimeout int `json:"upscale_timeout"`
37+
DownscaleTimeout int `json:"downscale_timeout"`
38+
UpscaleLimit int `json:"upscale_limit"`
39+
DownscaleLimit int `json:"downscale_limit"`
4040
ScaleUpOn503 *bool `json:"scale_up_on_503"`
4141
NewRelicApiKey *string `json:"new_relic_api_key"`
4242
NewRelicAccountId *string `json:"new_relic_account_id"`
4343
NewRelicAppId *string `json:"new_relic_app_id"`
44-
Notify *bool `json:"notify"`
45-
NotifyQuantity *int `json:"notify_quantity"`
46-
NotifyAfter *int `json:"notify_after"`
44+
Notify bool `json:"notify"`
45+
NotifyQuantity int `json:"notify_quantity"`
46+
NotifyAfter int `json:"notify_after"`
4747
}
4848

4949
type wrappedManager struct {

client/manager_test.go

+8-8
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ func TestGetManagerEverything(t *testing.T) {
7878
"downscale_sensitivity": 2,
7979
"upscale_timeout": 1,
8080
"downscale_timeout": 2,
81-
"upscale_limit": 1,
81+
"upscale_limit": 0,
8282
"downscale_limit": 2,
8383
"scale_up_on_503": true,
8484
"new_relic_api_key": "newrelic-api-key",
@@ -126,17 +126,17 @@ func TestGetManagerEverything(t *testing.T) {
126126
DownscaleQuantity: ptr.Int(1),
127127
UpscaleSensitivity: ptr.Int(1),
128128
DownscaleSensitivity: ptr.Int(2),
129-
UpscaleTimeout: ptr.Int(1),
130-
DownscaleTimeout: ptr.Int(2),
131-
UpscaleLimit: ptr.Int(1),
132-
DownscaleLimit: ptr.Int(2),
129+
UpscaleTimeout: 1,
130+
DownscaleTimeout: 2,
131+
UpscaleLimit: 0,
132+
DownscaleLimit: 2,
133133
ScaleUpOn503: ptr.Bool(true),
134134
NewRelicApiKey: ptr.String("newrelic-api-key"),
135135
NewRelicAccountId: ptr.String("newrelic-account-id"),
136136
NewRelicAppId: ptr.String("newrelic-app-id"),
137-
Notify: ptr.Bool(true),
138-
NotifyQuantity: ptr.Int(5),
139-
NotifyAfter: ptr.Int(10),
137+
Notify: true,
138+
NotifyQuantity: 5,
139+
NotifyAfter: 10,
140140
}
141141
assert.Equals(t, expected, manager)
142142
}

docs/index.md

-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ The HireFire provider is used to configure resources supported by the
99

1010
```hcl
1111
provider "hirefire" {
12-
version = "~> 0.3"
1312
api_key = "${var.hirefire_api_key}"
1413
}
1514
```

main.tf.example

+41
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
terraform {
2+
required_providers {
3+
hirefire = {
4+
source = "carwow/hirefire"
5+
}
6+
}
7+
}
8+
9+
provider "hirefire" {
10+
}
11+
12+
resource "hirefire_organization" "foobar" {
13+
name = "foobar"
14+
time_zone = "UTC"
15+
}
16+
17+
resource "hirefire_account" "foobar" {
18+
organization_id = hirefire_organization.foobar.id
19+
}
20+
21+
resource "hirefire_application" "foobar" {
22+
account_id = hirefire_account.foobar.id
23+
name = "foobar"
24+
}
25+
26+
resource "hirefire_manager" "foobar" {
27+
application_id = hirefire_application.foobar.id
28+
name = "foobar"
29+
type = "Manager::Worker::HireFire::JobQueue"
30+
enabled = false
31+
minimum = 1
32+
maximum = 10
33+
34+
ratio = 5
35+
upscale_sensitivity = 1
36+
downscale_sensitivity = 2
37+
upscale_timeout = 1
38+
downscale_timeout = 2
39+
upscale_limit = 1
40+
downscale_limit = 2
41+
}

resources/application/resource_test.go

+4-2
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ func TestAccApplication(t *testing.T) {
5353
func TestAccApplicationEverything(t *testing.T) {
5454
orgName := fmt.Sprintf("test-%s", helper.RandString(10))
5555
app := &client.Application{}
56+
logplexDrainToken := fmt.Sprintf("d.%s-%s-%s-%s-%s",
57+
helper.RandHex(8), helper.RandHex(4), helper.RandHex(4), helper.RandHex(4), helper.RandHex(12))
5658

5759
resource.Test(t, resource.TestCase{
5860
PreCheck: helper.PreCheck(t),
@@ -64,7 +66,7 @@ func TestAccApplicationEverything(t *testing.T) {
6466
*app = client.Application{
6567
Name: fmt.Sprintf("test-%s", helper.RandString(10)),
6668
CustomDomain: ptr.String(fmt.Sprintf("test-%s", helper.RandString(10))),
67-
LogplexDrainToken: ptr.String(fmt.Sprintf("test-%s", helper.RandString(10))),
69+
LogplexDrainToken: ptr.String(logplexDrainToken),
6870
Ssl: helper.RandBool(),
6971
RestartCrashedDynos: helper.RandBool(),
7072
NewIssueNotifications: helper.RandBool(),
@@ -79,7 +81,7 @@ func TestAccApplicationEverything(t *testing.T) {
7981
*app = client.Application{
8082
Name: fmt.Sprintf("test-%s", helper.RandString(10)),
8183
CustomDomain: ptr.String(fmt.Sprintf("test-%s", helper.RandString(10))),
82-
LogplexDrainToken: ptr.String(fmt.Sprintf("test-%s", helper.RandString(10))),
84+
LogplexDrainToken: ptr.String(logplexDrainToken),
8385
Ssl: helper.RandBool(),
8486
RestartCrashedDynos: helper.RandBool(),
8587
NewIssueNotifications: helper.RandBool(),

resources/manager/resource.go

+7-7
Original file line numberDiff line numberDiff line change
@@ -346,22 +346,22 @@ func getAttributes(d *schema.ResourceData) client.Manager {
346346

347347
if v, ok := d.GetOk("upscale_timeout"); ok {
348348
value := v.(int)
349-
manager.UpscaleTimeout = &value
349+
manager.UpscaleTimeout = value
350350
}
351351

352352
if v, ok := d.GetOk("downscale_timeout"); ok {
353353
value := v.(int)
354-
manager.DownscaleTimeout = &value
354+
manager.DownscaleTimeout = value
355355
}
356356

357357
if v, ok := d.GetOk("upscale_limit"); ok {
358358
value := v.(int)
359-
manager.UpscaleLimit = &value
359+
manager.UpscaleLimit = value
360360
}
361361

362362
if v, ok := d.GetOk("downscale_limit"); ok {
363363
value := v.(int)
364-
manager.DownscaleLimit = &value
364+
manager.DownscaleLimit = value
365365
}
366366

367367
if v, ok := d.GetOk("scale_up_on_503"); ok {
@@ -386,17 +386,17 @@ func getAttributes(d *schema.ResourceData) client.Manager {
386386

387387
if v, ok := d.GetOk("notify"); ok {
388388
value := v.(bool)
389-
manager.Notify = &value
389+
manager.Notify = value
390390
}
391391

392392
if v, ok := d.GetOk("notify_quantity"); ok {
393393
value := v.(int)
394-
manager.NotifyQuantity = &value
394+
manager.NotifyQuantity = value
395395
}
396396

397397
if v, ok := d.GetOk("notify_after"); ok {
398398
value := v.(int)
399-
manager.NotifyAfter = &value
399+
manager.NotifyAfter = value
400400
}
401401

402402
return manager

resources/manager/resource_test.go

+27-27
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@ func TestAccManager(t *testing.T) {
3535
Ratio: ptr.Int(100),
3636
UpscaleSensitivity: ptr.Int(1),
3737
DownscaleSensitivity: ptr.Int(2),
38-
UpscaleTimeout: ptr.Int(2),
39-
DownscaleTimeout: ptr.Int(5),
38+
UpscaleTimeout: 2,
39+
DownscaleTimeout: 5,
4040
}
4141
return config(orgName, manager)
4242
}(orgName, manager),
@@ -59,8 +59,8 @@ func TestAccManager(t *testing.T) {
5959
DownscaleQuantity: ptr.Int(1),
6060
UpscaleSensitivity: ptr.Int(2),
6161
DownscaleSensitivity: ptr.Int(1),
62-
UpscaleTimeout: ptr.Int(1),
63-
DownscaleTimeout: ptr.Int(2),
62+
UpscaleTimeout: 1,
63+
DownscaleTimeout: 2,
6464
}
6565
return config(orgName, manager)
6666
}(orgName, manager),
@@ -82,8 +82,8 @@ func TestAccManager(t *testing.T) {
8282
DownscaleQuantity: ptr.Int(1),
8383
UpscaleSensitivity: ptr.Int(2),
8484
DownscaleSensitivity: ptr.Int(1),
85-
UpscaleTimeout: ptr.Int(1),
86-
DownscaleTimeout: ptr.Int(2),
85+
UpscaleTimeout: 1,
86+
DownscaleTimeout: 2,
8787
}
8888
return config(orgName, manager)
8989
}(orgName, manager),
@@ -102,10 +102,10 @@ func TestAccManager(t *testing.T) {
102102
Ratio: ptr.Int(10),
103103
UpscaleSensitivity: ptr.Int(2),
104104
DownscaleSensitivity: ptr.Int(1),
105-
UpscaleTimeout: ptr.Int(1),
106-
DownscaleTimeout: ptr.Int(2),
107-
UpscaleLimit: ptr.Int(3),
108-
DownscaleLimit: ptr.Int(4),
105+
UpscaleTimeout: 0,
106+
DownscaleTimeout: 2,
107+
UpscaleLimit: 3,
108+
DownscaleLimit: 4,
109109
}
110110
return config(orgName, manager)
111111
}(orgName, manager),
@@ -169,8 +169,8 @@ func config(orgName string, manager *client.Manager) string {
169169
*manager.Ratio,
170170
*manager.UpscaleSensitivity,
171171
*manager.DownscaleSensitivity,
172-
*manager.UpscaleTimeout,
173-
*manager.DownscaleTimeout,
172+
manager.UpscaleTimeout,
173+
manager.DownscaleTimeout,
174174
))
175175
case "Manager::Web::Logplex::QueueTime":
176176
return configBase(orgName, manager, fmt.Sprintf(`
@@ -193,8 +193,8 @@ func config(orgName string, manager *client.Manager) string {
193193
*manager.DownscaleQuantity,
194194
*manager.UpscaleSensitivity,
195195
*manager.DownscaleSensitivity,
196-
*manager.UpscaleTimeout,
197-
*manager.DownscaleTimeout,
196+
manager.UpscaleTimeout,
197+
manager.DownscaleTimeout,
198198
))
199199
case "Manager::Web::Logplex::Load":
200200
return configBase(orgName, manager, fmt.Sprintf(`
@@ -215,8 +215,8 @@ func config(orgName string, manager *client.Manager) string {
215215
*manager.DownscaleQuantity,
216216
*manager.UpscaleSensitivity,
217217
*manager.DownscaleSensitivity,
218-
*manager.UpscaleTimeout,
219-
*manager.DownscaleTimeout,
218+
manager.UpscaleTimeout,
219+
manager.DownscaleTimeout,
220220
))
221221
case "Manager::Worker::HireFire::JobQueue":
222222
return configBase(orgName, manager, fmt.Sprintf(`
@@ -233,10 +233,10 @@ func config(orgName string, manager *client.Manager) string {
233233
*manager.Ratio,
234234
*manager.UpscaleSensitivity,
235235
*manager.DownscaleSensitivity,
236-
*manager.UpscaleTimeout,
237-
*manager.DownscaleTimeout,
238-
*manager.UpscaleLimit,
239-
*manager.DownscaleLimit,
236+
manager.UpscaleTimeout,
237+
manager.DownscaleTimeout,
238+
manager.UpscaleLimit,
239+
manager.DownscaleLimit,
240240
))
241241
default:
242242
return configBase(orgName, manager, "")
@@ -278,17 +278,17 @@ func checkAttributes(manager client.Manager) resource.TestCheckFunc {
278278
"downscale_quantity": helper.ItoaOrZero(manager.DownscaleQuantity),
279279
"upscale_sensitivity": helper.ItoaOrZero(manager.UpscaleSensitivity),
280280
"downscale_sensitivity": helper.ItoaOrZero(manager.DownscaleSensitivity),
281-
"upscale_timeout": helper.ItoaOrZero(manager.UpscaleTimeout),
282-
"downscale_timeout": helper.ItoaOrZero(manager.DownscaleTimeout),
283-
"upscale_limit": helper.ItoaOrZero(manager.UpscaleLimit),
284-
"downscale_limit": helper.ItoaOrZero(manager.DownscaleLimit),
281+
"upscale_timeout": strconv.Itoa(manager.UpscaleTimeout),
282+
"downscale_timeout": strconv.Itoa(manager.DownscaleTimeout),
283+
"upscale_limit": strconv.Itoa(manager.UpscaleLimit),
284+
"downscale_limit": strconv.Itoa(manager.DownscaleLimit),
285285
"scale_up_on_503": helper.BoolOrFalse(manager.ScaleUpOn503),
286286
"new_relic_api_key": helper.StringOrEmpty(manager.NewRelicApiKey),
287287
"new_relic_account_id": helper.StringOrEmpty(manager.NewRelicAccountId),
288288
"new_relic_app_id": helper.StringOrEmpty(manager.NewRelicAppId),
289-
"notify": helper.BoolOrFalse(manager.Notify),
290-
"notify_quantity": helper.ItoaOrZero(manager.NotifyQuantity),
291-
"notify_after": helper.ItoaOrZero(manager.NotifyAfter),
289+
"notify": strconv.FormatBool(manager.Notify),
290+
"notify_quantity": strconv.Itoa(manager.NotifyQuantity),
291+
"notify_after": strconv.Itoa(manager.NotifyAfter),
292292
})
293293
}
294294

testing/helper/helper.go

+6
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,12 @@ func RandString(size int) string {
8484
return acctest.RandString(size)
8585
}
8686

87+
func RandHex(size int) string {
88+
return acctest.RandStringFromCharSet(size, CharSetHex)
89+
}
90+
91+
const CharSetHex = "012346789abcdef"
92+
8793
func RandBool() bool {
8894
return rand.Intn(2) == 0
8995
}

0 commit comments

Comments
 (0)