generated from hashicorp/terraform-provider-scaffolding
-
Notifications
You must be signed in to change notification settings - Fork 43
/
resource_packer_run_task.go
173 lines (156 loc) · 5.47 KB
/
resource_packer_run_task.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: MPL-2.0
package providersdkv2
import (
"context"
"fmt"
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
"github.com/hashicorp/terraform-provider-hcp/internal/clients"
"github.com/hashicorp/terraform-provider-hcp/internal/clients/packerv2"
)
func resourcePackerRunTask() *schema.Resource {
return &schema.Resource{
Description: fmt.Sprintf(`
The Packer Run Task resource allows you to regenerate the HMAC key for an HCP Packer Registry's run task.
If you do not need to regenerate the HMAC key, it is recommended to use the %s data source instead.`, "`hcp_packer_run_task`"),
CreateContext: resourcePackerRunTaskCreate,
ReadContext: resourcePackerRunTaskRead,
UpdateContext: resourcePackerRunTaskUpdate,
DeleteContext: resourcePackerRunTaskDelete,
Timeouts: &schema.ResourceTimeout{
Create: &defaultPackerTimeout,
Default: &defaultPackerTimeout,
Update: &defaultPackerTimeout,
Delete: &defaultPackerTimeout,
},
CustomizeDiff: resourcePackerRunTaskCustomizeDiff,
Schema: map[string]*schema.Schema{
// Optional inputs
"regenerate_hmac": {
Description: "If true, the HMAC Key (`hmac_key`) will be regenerated during `terraform apply`. While set to true, the key will be regenerated on every `terraform apply` until `regenerate_hmac` is set to false or removed from the config.",
Type: schema.TypeBool,
Optional: true,
Default: false,
},
"project_id": {
Description: `
The ID of the HCP project where the HCP Packer Registry is located.
If not specified, the project specified in the HCP Provider config block will be used, if configured.
If a project is not configured in the HCP Provider config block, the oldest project in the organization will be used.`,
Type: schema.TypeString,
Computed: true,
Optional: true,
ForceNew: true,
ValidateFunc: validation.IsUUID,
},
// Computed Values
"organization_id": {
Description: "The ID of the HCP organization where this channel is located. Always the same as the associated channel.",
Type: schema.TypeString,
Computed: true,
},
"endpoint_url": {
Description: "A unique HCP Packer URL, specific to your HCP organization and HCP Packer registry. The Terraform Cloud run task will send a payload to this URL for image validation.",
Type: schema.TypeString,
Computed: true,
},
"hmac_key": {
Description: "A secret key that lets HCP Packer verify the run task request.",
Sensitive: true,
Type: schema.TypeString,
Computed: true,
},
},
}
}
func resourcePackerRunTaskCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
client := meta.(*clients.Client)
loc, err := getAndUpdateLocationResourceData(d, client)
if err != nil {
return diag.FromErr(err)
}
resp, err := packerv2.GetRunTask(ctx, client, loc)
if err != nil {
return diag.FromErr(err)
}
d.SetId(loc.ProjectID)
if err := d.Set("endpoint_url", resp.APIURL); err != nil {
return diag.FromErr(err)
}
if err := d.Set("hmac_key", resp.HmacKey); err != nil {
return diag.FromErr(err)
}
regenerateHmac, ok := d.GetOk("regenerate_hmac")
if ok && regenerateHmac.(bool) {
resp, err := packerv2.RegenerateHMAC(ctx, client, loc)
if err != nil {
return diag.FromErr(err)
}
if err := d.Set("hmac_key", resp.HmacKey); err != nil {
return diag.FromErr(err)
}
// Always set `regenerate_hmac` to false so that it can be set to false by
// the user without generating a diff.
if err := d.Set("regenerate_hmac", false); err != nil {
return diag.FromErr(err)
}
}
return nil
}
func resourcePackerRunTaskRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
client := meta.(*clients.Client)
loc, err := getAndUpdateLocationResourceData(d, client)
if err != nil {
return diag.FromErr(err)
}
d.SetId(loc.ProjectID)
resp, err := packerv2.GetRunTask(ctx, client, loc)
if err != nil {
return diag.FromErr(err)
}
if err := d.Set("endpoint_url", resp.APIURL); err != nil {
return diag.FromErr(err)
}
if err := d.Set("hmac_key", resp.HmacKey); err != nil {
return diag.FromErr(err)
}
return nil
}
func resourcePackerRunTaskUpdate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
client := meta.(*clients.Client)
loc, err := getAndUpdateLocationResourceData(d, client)
if err != nil {
return diag.FromErr(err)
}
d.SetId(loc.ProjectID)
regenerateHmac, ok := d.GetOk("regenerate_hmac")
if ok && regenerateHmac.(bool) {
resp, err := packerv2.RegenerateHMAC(ctx, client, loc)
if err != nil {
return diag.FromErr(err)
}
if err := d.Set("hmac_key", resp.HmacKey); err != nil {
return diag.FromErr(err)
}
// Always set `regenerate_hmac` to false so that it can be set to false by
// the user without generating a diff.
if err := d.Set("regenerate_hmac", false); err != nil {
return diag.FromErr(err)
}
}
return nil
}
func resourcePackerRunTaskDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
// This is a no-op
return nil
}
func resourcePackerRunTaskCustomizeDiff(ctx context.Context, d *schema.ResourceDiff, meta interface{}) error {
if d.Get("regenerate_hmac").(bool) {
if err := d.SetNewComputed("hmac_key"); err != nil {
return err
}
}
return nil
}