Skip to content

Commit 23259d8

Browse files
committed
wip
1 parent 4e9a3d5 commit 23259d8

26 files changed

+9789
-13866
lines changed

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ module github.com/scaleway/terraform-provider-scaleway/v2
33
go 1.24.0
44

55
require (
6+
github.com/alexedwards/argon2id v1.0.0
67
github.com/aws/aws-sdk-go-v2 v1.36.3
78
github.com/aws/aws-sdk-go-v2/config v1.29.9
89
github.com/aws/aws-sdk-go-v2/credentials v1.17.62

go.sum

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ github.com/ProtonMail/go-crypto v1.1.3 h1:nRBOetoydLeUb4nHajyO2bKqMLfWQ/ZPwkXqXx
2020
github.com/ProtonMail/go-crypto v1.1.3/go.mod h1:rA3QumHc/FZ8pAHreoekgiAbzpNsfQAosU5td4SnOrE=
2121
github.com/agext/levenshtein v1.2.3 h1:YB2fHEn0UJagG8T1rrWknE3ZQzWM06O8AMAatNn7lmo=
2222
github.com/agext/levenshtein v1.2.3/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558=
23+
github.com/alexedwards/argon2id v1.0.0 h1:wJzDx66hqWX7siL/SRUmgz3F8YMrd/nfX/xHHcQQP0w=
24+
github.com/alexedwards/argon2id v1.0.0/go.mod h1:tYKkqIjzXvZdzPvADMWOEZ+l6+BD6CtBXMj5fnJppiw=
2325
github.com/apparentlymart/go-textseg/v12 v12.0.0/go.mod h1:S/4uRK2UtaQttw1GenVJEynmyUenKwP++x/+DdGV/Ec=
2426
github.com/apparentlymart/go-textseg/v15 v15.0.0 h1:uYvfpb3DyLSCGWnctWKGj857c6ew1u1fNQOlOtuGxQY=
2527
github.com/apparentlymart/go-textseg/v15 v15.0.0/go.mod h1:K8XmNZdhEBkdlyDdvbmmsvpAG721bKi0joRfFdHIWJ4=
@@ -368,6 +370,7 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh
368370
golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
369371
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
370372
golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4=
373+
golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=
371374
golang.org/x/crypto v0.36.0 h1:AnAEvhDddvBdpY+uR+MyHmuZzzNqXSe/GvuDeob5L34=
372375
golang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc=
373376
golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df h1:UA2aFVmmsIlefxMk29Dp2juaUSth8Pyn3Tq5Y5mJGME=
@@ -376,6 +379,7 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB
376379
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
377380
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
378381
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
382+
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
379383
golang.org/x/mod v0.23.0 h1:Zb7khfcRGKk+kqfxFaP5tZqCnDZMjC5VtUBs87Hr6QM=
380384
golang.org/x/mod v0.23.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY=
381385
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
@@ -387,13 +391,16 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY
387391
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
388392
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
389393
golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY=
394+
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
395+
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
390396
golang.org/x/net v0.37.0 h1:1zLorHbz+LYj7MQlSf1+2tPIIgibq2eL5xkrGk6f+2c=
391397
golang.org/x/net v0.37.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8=
392398
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
393399
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
394400
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
395401
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
396402
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
403+
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
397404
golang.org/x/sync v0.12.0 h1:MHc5BpPuC30uJk597Ri8TV3CNZcTLu6B6z4lJy+g6Jw=
398405
golang.org/x/sync v0.12.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
399406
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -410,19 +417,28 @@ golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBc
410417
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
411418
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
412419
golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
420+
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
413421
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
422+
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
423+
golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
414424
golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik=
415425
golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
416426
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
417427
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
418428
golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc=
429+
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
430+
golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
431+
golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U=
419432
golang.org/x/term v0.30.0 h1:PQ39fJZ+mfadBm0y5WlL4vlM7Sx1Hgf13sMIY2+QS9Y=
420433
golang.org/x/term v0.30.0/go.mod h1:NYYFdzHoI5wRh/h5tDMdMqCqPJZEuNqVR5xJLd/n67g=
421434
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
422435
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
423436
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
424437
golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
425438
golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
439+
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
440+
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
441+
golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
426442
golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY=
427443
golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4=
428444
golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=
@@ -434,6 +450,7 @@ golang.org/x/tools v0.0.0-20200214201135-548b770e2dfa/go.mod h1:TB2adYChydJhpapK
434450
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
435451
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
436452
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
453+
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
437454
golang.org/x/tools v0.30.0 h1:BgcpHewrV5AUp2G9MebG4XPFI1E2W41zU1SaqVA9vJY=
438455
golang.org/x/tools v0.30.0/go.mod h1:c347cR/OJfw5TI+GfX7RUPNMdDRRbjvYTS0jPyvsVtY=
439456
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=

internal/dsf/strings.go

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

33
import (
4+
"fmt"
45
"strings"
56

7+
"github.com/alexedwards/argon2id"
68
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
79
)
810

@@ -13,3 +15,12 @@ func IgnoreCase(_, oldValue, newValue string, _ *schema.ResourceData) bool {
1315
func IgnoreCaseAndHyphen(_, oldValue, newValue string, _ *schema.ResourceData) bool {
1416
return strings.ReplaceAll(strings.ToLower(oldValue), "-", "_") == strings.ReplaceAll(strings.ToLower(newValue), "-", "_")
1517
}
18+
19+
func CompareArgon2idPasswordAndHash(_, oldValue, newValue string, _ *schema.ResourceData) bool {
20+
match, err := argon2id.ComparePasswordAndHash(newValue, oldValue)
21+
if err != nil {
22+
return false
23+
}
24+
fmt.Println(oldValue, newValue, match)
25+
return match
26+
}

internal/services/container/container.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package container
22

33
import (
44
"context"
5+
"fmt"
56

67
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
78
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
@@ -75,7 +76,9 @@ func ResourceContainer() *schema.Resource {
7576
Type: schema.TypeString,
7677
ValidateFunc: validation.StringLenBetween(0, 1000),
7778
},
78-
ValidateDiagFunc: validation.MapKeyLenBetween(0, 100),
79+
ValidateDiagFunc: validation.MapKeyLenBetween(0, 100),
80+
DiffSuppressFunc: dsf.CompareArgon2idPasswordAndHash,
81+
DiffSuppressOnRefresh: true,
7982
},
8083
"min_scale": {
8184
Type: schema.TypeInt,
@@ -358,6 +361,7 @@ func ResourceContainerRead(ctx context.Context, d *schema.ResourceData, m interf
358361
_ = d.Set("scaling_option", flattenScalingOption(co.ScalingOption))
359362
_ = d.Set("region", co.Region.String())
360363
_ = d.Set("local_storage_limit", int(co.LocalStorageLimit))
364+
_ = d.Set("secret_environment_variables", flattenContainerSecrets(co.SecretEnvironmentVariables))
361365

362366
return nil
363367
}
@@ -393,7 +397,10 @@ func ResourceContainerUpdate(ctx context.Context, d *schema.ResourceData, m inte
393397
}
394398

395399
if d.HasChanges("secret_environment_variables") {
400+
fmt.Println("##### SECRET ENV VARIABLES", d.Get("secret_environment_variables"))
401+
fmt.Println(d.GetChange("secret_environment_variables"))
396402
req.SecretEnvironmentVariables = expandContainerSecrets(d.Get("secret_environment_variables"))
403+
397404
}
398405

399406
if d.HasChanges("min_scale") {

internal/services/container/container_test.go

Lines changed: 52 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,15 @@ import (
44
"fmt"
55
"testing"
66

7+
"github.com/alexedwards/argon2id"
78
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
89
"github.com/hashicorp/terraform-plugin-sdk/v2/terraform"
910
containerSDK "github.com/scaleway/scaleway-sdk-go/api/container/v1beta1"
1011
"github.com/scaleway/terraform-provider-scaleway/v2/internal/acctest"
1112
"github.com/scaleway/terraform-provider-scaleway/v2/internal/httperrors"
1213
"github.com/scaleway/terraform-provider-scaleway/v2/internal/services/container"
1314
containerchecks "github.com/scaleway/terraform-provider-scaleway/v2/internal/services/container/testfuncs"
15+
"github.com/stretchr/testify/assert"
1416
)
1517

1618
func TestAccContainer_Basic(t *testing.T) {
@@ -150,7 +152,7 @@ func TestAccContainer_Env(t *testing.T) {
150152
acctest.CheckResourceAttrUUID("scaleway_container_namespace.main", "id"),
151153
acctest.CheckResourceAttrUUID("scaleway_container.main", "id"),
152154
resource.TestCheckResourceAttr("scaleway_container.main", "environment_variables.test", "test"),
153-
resource.TestCheckResourceAttr("scaleway_container.main", "secret_environment_variables.test_secret", "test_secret"),
155+
passwordMatchHash("scaleway_container.main", "secret_environment_variables.test_secret", "test_secret"),
154156
),
155157
},
156158
{
@@ -164,7 +166,7 @@ func TestAccContainer_Env(t *testing.T) {
164166
"foo" = "bar"
165167
}
166168
secret_environment_variables = {
167-
"foo_secret" = "bar_secret"
169+
"test_secret" = "bar_secret"
168170
}
169171
}
170172
`,
@@ -173,7 +175,7 @@ func TestAccContainer_Env(t *testing.T) {
173175
acctest.CheckResourceAttrUUID("scaleway_container_namespace.main", "id"),
174176
acctest.CheckResourceAttrUUID("scaleway_container.main", "id"),
175177
resource.TestCheckResourceAttr("scaleway_container.main", "environment_variables.foo", "bar"),
176-
resource.TestCheckResourceAttr("scaleway_container.main", "secret_environment_variables.foo_secret", "bar_secret"),
178+
passwordMatchHash("scaleway_container.main", "secret_environment_variables.test_secret", "bar_secret"),
177179
),
178180
},
179181
{
@@ -192,9 +194,9 @@ func TestAccContainer_Env(t *testing.T) {
192194
acctest.CheckResourceAttrUUID("scaleway_container_namespace.main", "id"),
193195
acctest.CheckResourceAttrUUID("scaleway_container.main", "id"),
194196
resource.TestCheckNoResourceAttr("scaleway_container.main", "environment_variables.%"),
195-
resource.TestCheckNoResourceAttr("scaleway_container.main", "secret_environment_variables.%"),
197+
//resource.TestCheckNoResourceAttr("scaleway_container.main", "secret_environment_variables.%"),
196198
resource.TestCheckNoResourceAttr("scaleway_container.main", "environment_variables.foo"),
197-
resource.TestCheckNoResourceAttr("scaleway_container.main", "secret_environment_variables.foo_secret"),
199+
//resource.TestCheckNoResourceAttr("scaleway_container.main", "secret_environment_variables.foo_secret"),
198200
),
199201
},
200202
},
@@ -601,3 +603,48 @@ func isContainerDestroyed(tt *acctest.TestTools) resource.TestCheckFunc {
601603
return nil
602604
}
603605
}
606+
607+
func passwordMatchHash(parent string, key string, password string) resource.TestCheckFunc {
608+
return func(state *terraform.State) error {
609+
rs, ok := state.RootModule().Resources[parent]
610+
if !ok {
611+
return fmt.Errorf("resource container not found: %s", parent)
612+
}
613+
614+
match, err := argon2id.ComparePasswordAndHash(password, rs.Primary.Attributes[key])
615+
if err != nil {
616+
fmt.Println("ARGON ERROR ", password, key, rs.Primary.Attributes[key])
617+
return err
618+
}
619+
620+
if !match {
621+
return fmt.Errorf("password and hash do not match")
622+
}
623+
624+
return nil
625+
}
626+
}
627+
628+
func TestArgon2idHashComparaison(t *testing.T) {
629+
630+
// hash, err := argon2id.CreateHash("test_secret", argon2id.DefaultParams)
631+
// assert.NoError(t, err)
632+
//
633+
// match, err := argon2id.ComparePasswordAndHash("test_secret", hash)
634+
// assert.NoError(t, err)
635+
// assert.True(t, match)
636+
//
637+
// param, _, _, err := argon2id.DecodeHash(hash)
638+
// assert.NoError(t, err)
639+
// hash2, err := argon2id.CreateHash("test_secret", param)
640+
// assert.NoError(t, err)
641+
// assert.Equal(t, hash, hash2)
642+
clearValue := "another_secret"
643+
match, err := argon2id.ComparePasswordAndHash(clearValue, "$argon2id$v=19$m=65536,t=1,p=2$5EPJN0EzdBNRJtB/gTDrpw$E23adF4qICdavSWkWex2RJI0w61ikJrt4Yjrqml3r2A")
644+
assert.NoError(t, err)
645+
assert.True(t, match)
646+
647+
match, err = argon2id.ComparePasswordAndHash("new_secret", "$argon2id$v=19$m=65536,t=1,p=2$ZSW4sMX8KTom5SHOvAWmtw$m104Wcu5wJMSQotr/QJiFJbGVNIZzhmi8/y7n2WMxNI")
648+
assert.NoError(t, err)
649+
assert.True(t, match)
650+
}

internal/services/container/helpers_container.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,19 @@ func flattenScalingOption(scalingOption *container.ContainerScalingOption) inter
289289
return flattenedScalingOption
290290
}
291291

292+
func flattenContainerSecrets(secrets []*container.SecretHashedValue) interface{} {
293+
if len(secrets) == 0 {
294+
return nil
295+
}
296+
297+
flattenedSecrets := make(map[string]interface{})
298+
for _, secret := range secrets {
299+
flattenedSecrets[secret.Key] = secret.HashedValue
300+
}
301+
302+
return flattenedSecrets
303+
}
304+
292305
func expandContainerSecrets(secretsRawMap interface{}) []*container.Secret {
293306
secretsMap := secretsRawMap.(map[string]interface{})
294307
secrets := make([]*container.Secret, 0, len(secretsMap))

0 commit comments

Comments
 (0)