Skip to content

Commit e13f923

Browse files
committed
strict regional secret id
1 parent c889407 commit e13f923

File tree

6 files changed

+1173
-291
lines changed

6 files changed

+1173
-291
lines changed

internal/locality/validation.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
11
package locality
22

33
import (
4+
"regexp"
5+
"strings"
6+
47
"github.com/hashicorp/go-cty/cty"
58
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
69
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
710
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
11+
"github.com/scaleway/scaleway-sdk-go/scw"
812
)
913

1014
// ValidateStringInSliceWithWarning helps to only returns warnings in case we got a non-public locality passed
@@ -25,3 +29,12 @@ func ValidateStringInSliceWithWarning(correctValues []string, field string) sche
2529
return res
2630
}
2731
}
32+
33+
func ValidateRegionalUUID() schema.SchemaValidateFunc {
34+
regions := make([]string, 0, len(scw.AllRegions))
35+
for _, region := range scw.AllRegions {
36+
regions = append(regions, region.String())
37+
}
38+
39+
return validation.StringMatch(regexp.MustCompile(`^`+strings.Join(regions, "|")+`/[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$`), "must be in the form region/UUID")
40+
}

internal/services/jobs/definition.go

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package jobs
22

33
import (
44
"context"
5+
"fmt"
56
"regexp"
67
"time"
78

@@ -13,6 +14,7 @@ import (
1314
"github.com/scaleway/scaleway-sdk-go/scw"
1415
"github.com/scaleway/terraform-provider-scaleway/v2/internal/dsf"
1516
"github.com/scaleway/terraform-provider-scaleway/v2/internal/httperrors"
17+
"github.com/scaleway/terraform-provider-scaleway/v2/internal/locality"
1618
"github.com/scaleway/terraform-provider-scaleway/v2/internal/locality/regional"
1719
"github.com/scaleway/terraform-provider-scaleway/v2/internal/services/account"
1820
"github.com/scaleway/terraform-provider-scaleway/v2/internal/types"
@@ -95,12 +97,20 @@ func ResourceDefinition() *schema.Resource {
9597
Type: schema.TypeSet,
9698
Optional: true,
9799
Description: "A reference to a Secret Manager secret.",
100+
//Set: func(v interface{}) int {
101+
// secret := v.(map[string]interface{})
102+
// if secret["file"] == nil {
103+
// return schema.HashString(secret["secret_id"].(string) + secret["secret_version"].(string) + secret["environment"].(string))
104+
// }
105+
// return schema.HashString(secret["secret_id"].(string) + secret["secret_version"].(string) + secret["file"].(string))
106+
//},
98107
Elem: &schema.Resource{
99108
Schema: map[string]*schema.Schema{
100109
"secret_id": {
101-
Type: schema.TypeString,
102-
Description: "The secret unique identifier, it could be formatted as UUID or region/UUID. The secret must be in the same region as the job definition.",
103-
Required: true,
110+
Type: schema.TypeString,
111+
Description: "The secret unique identifier, it must be in the form region/UUID. The region must be the same as the job definition.",
112+
Required: true,
113+
ValidateFunc: locality.ValidateRegionalUUID(),
104114
},
105115
"secret_reference_id": {
106116
Type: schema.TypeString,
@@ -136,7 +146,6 @@ func ResourceJobDefinitionCreate(ctx context.Context, d *schema.ResourceData, m
136146
if err != nil {
137147
return diag.FromErr(err)
138148
}
139-
140149
req := &jobs.CreateJobDefinitionRequest{
141150
Region: region,
142151
Name: types.ExpandOrGenerateString(d.Get("name").(string), "job"),
@@ -212,7 +221,8 @@ func ResourceJobDefinitionRead(ctx context.Context, d *schema.ResourceData, m in
212221

213222
for i, secret := range rawSecretRefs.Secrets {
214223
secretRef := make(map[string]interface{})
215-
secretRef["secret_id"] = secret.SecretManagerID
224+
secretRef["secret_id"] = fmt.Sprintf("%s/%s", definition.Region, secret.SecretManagerID)
225+
//secretRef["secret_id"] = secret.SecretManagerID
216226
secretRef["secret_reference_id"] = secret.SecretID
217227
secretRef["secret_version"] = secret.SecretManagerVersion
218228

internal/services/jobs/definition_test.go

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,37 @@ func TestAccJobDefinition_SecretReference(t *testing.T) {
245245
resource.TestCheckResourceAttr("scaleway_job_definition.main", "secret_reference.1.environment", "SOME_ENV"),
246246
),
247247
},
248+
{
249+
Config: `
250+
resource "scaleway_secret" "main" {
251+
name = "job-secret"
252+
path = "/one"
253+
}
254+
resource "scaleway_secret_version" "main" {
255+
secret_id = scaleway_secret.main.id
256+
data = "your_secret"
257+
}
258+
259+
resource scaleway_job_definition main {
260+
name = "test-jobs-job-definition-secret"
261+
cpu_limit = 120
262+
memory_limit = 256
263+
image_uri = "docker.io/alpine:latest"
264+
secret_reference {
265+
secret_id = scaleway_secret.main.id
266+
secret_version = "latest"
267+
file = "/home/dev/new_env"
268+
}
269+
}
270+
`,
271+
Check: resource.ComposeTestCheckFunc(
272+
testAccCheckJobDefinitionExists(tt, "scaleway_job_definition.main"),
273+
acctest.CheckResourceAttrUUID("scaleway_job_definition.main", "id"),
274+
resource.TestCheckResourceAttr("scaleway_job_definition.main", "name", "test-jobs-job-definition-secret"),
275+
resource.TestCheckResourceAttr("scaleway_job_definition.main", "secret_reference.#", "1"),
276+
resource.TestCheckResourceAttr("scaleway_job_definition.main", "secret_reference.0.file", "/home/dev/new_env"),
277+
),
278+
},
248279
},
249280
})
250281
}
@@ -371,11 +402,6 @@ func TestCreateJobDefinitionSecret(t *testing.T) {
371402
SecretVersion: "1",
372403
Environment: "SOME_ENV",
373404
},
374-
{
375-
SecretID: "11111111-1111-1111-1111-111111111111",
376-
SecretVersion: "1",
377-
File: "/home/dev/env",
378-
},
379405
{
380406
SecretID: "nl-ams/11111111-1111-1111-1111-111111111111",
381407
SecretVersion: "1",
@@ -388,5 +414,5 @@ func TestCreateJobDefinitionSecret(t *testing.T) {
388414
jobID := "22222222-2222-2222-2222-222222222222"
389415

390416
err := jobs.CreateJobDefinitionSecret(jobSecrets, api, region, jobID)
391-
assert.ErrorContains(t, err, fmt.Sprintf("the secret id %s does not appear to be in the same region as the job definition id %s", jobSecrets[2].SecretID, jobID))
417+
assert.ErrorContains(t, err, fmt.Sprintf("the secret id %s does not appear to be in the same region as the job definition id %s", jobSecrets[1].SecretID, jobID))
392418
}

internal/services/jobs/helpers.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -143,10 +143,10 @@ func CreateJobDefinitionSecret(jobSecrets []JobDefinitionSecret, api *jobs.API,
143143

144144
secretRegion, secretID, err := regional.ParseID(parsedSecretRef.SecretID)
145145
if err != nil {
146-
secretID = parsedSecretRef.SecretID
146+
return fmt.Errorf("the secret id %s is not a valid regional UUID", parsedSecretRef.SecretID)
147147
}
148148

149-
if secretRegion != "" && secretRegion != region {
149+
if secretRegion != region {
150150
return fmt.Errorf("the secret id %s does not appear to be in the same region as the job definition id %s", parsedSecretRef.SecretID, jobID)
151151
}
152152

0 commit comments

Comments
 (0)