Skip to content

Commit 4f6c3c2

Browse files
authored
fix(container/function): improve secret_environment_variables states management (#3050)
* fix(containerNamespace): support secret_environment_variable state * fix(function): support secret_environment_variable state * fix(functionNamespace): support secret_environment_variable state
1 parent 78d3157 commit 4f6c3c2

21 files changed

+2330
-3952
lines changed

internal/services/container/container.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -397,7 +397,7 @@ func ResourceContainerUpdate(ctx context.Context, d *schema.ResourceData, m inte
397397

398398
if d.HasChanges("secret_environment_variables") {
399399
oldEnv, newEnv := d.GetChange("secret_environment_variables")
400-
req.SecretEnvironmentVariables = FilterSecretEnvsToPatch(expandContainerSecrets(oldEnv), expandContainerSecrets(newEnv))
400+
req.SecretEnvironmentVariables = filterSecretEnvsToPatch(expandContainerSecrets(oldEnv), expandContainerSecrets(newEnv))
401401
}
402402

403403
if d.HasChanges("min_scale") {

internal/services/container/container_test.go

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import (
1313
"github.com/scaleway/terraform-provider-scaleway/v2/internal/httperrors"
1414
"github.com/scaleway/terraform-provider-scaleway/v2/internal/services/container"
1515
containerchecks "github.com/scaleway/terraform-provider-scaleway/v2/internal/services/container/testfuncs"
16-
"github.com/stretchr/testify/assert"
1716
)
1817

1918
func TestAccContainer_Basic(t *testing.T) {
@@ -629,26 +628,3 @@ func passwordMatchHash(parent string, key string, password string) resource.Test
629628
return nil
630629
}
631630
}
632-
633-
func TestFilterSecretEnvsToPatch(t *testing.T) {
634-
testSecret := "test_secret"
635-
secretToDelete := "secret_to_delete"
636-
updatedSecret := "updated_secret"
637-
newSecret := "new_secret"
638-
639-
oldEnv := []*containerSDK.Secret{
640-
{Key: testSecret, Value: &testSecret},
641-
{Key: secretToDelete, Value: &secretToDelete},
642-
}
643-
newEnv := []*containerSDK.Secret{
644-
{Key: testSecret, Value: &updatedSecret},
645-
{Key: newSecret, Value: &newSecret},
646-
}
647-
648-
toPatch := container.FilterSecretEnvsToPatch(oldEnv, newEnv)
649-
assert.Equal(t, []*containerSDK.Secret{
650-
{Key: testSecret, Value: &updatedSecret},
651-
{Key: newSecret, Value: &newSecret},
652-
{Key: secretToDelete, Value: nil},
653-
}, toPatch)
654-
}

internal/services/container/helpers_container.go

Lines changed: 1 addition & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package container
33
import (
44
"context"
55
"errors"
6-
"fmt"
76
"slices"
87
"strings"
98
"time"
@@ -317,30 +316,6 @@ func expandContainerSecrets(secretsRawMap interface{}) []*container.Secret {
317316
return secrets
318317
}
319318

320-
func convertToMapStringInterface(raw interface{}) map[string]interface{} {
321-
out := make(map[string]interface{})
322-
if raw == nil {
323-
return out
324-
}
325-
326-
m, ok := raw.(map[interface{}]interface{})
327-
if ok {
328-
for k, v := range m {
329-
stringKey := fmt.Sprintf("%v", k)
330-
out[stringKey] = v
331-
}
332-
333-
return out
334-
}
335-
336-
m2, ok := raw.(map[string]interface{})
337-
if ok {
338-
return m2
339-
}
340-
341-
return out
342-
}
343-
344319
func isContainerDNSResolveError(err error) bool {
345320
responseError := &scw.ResponseError{}
346321

@@ -373,7 +348,7 @@ func retryCreateContainerDomain(ctx context.Context, containerAPI *container.API
373348
}
374349
}
375350

376-
func FilterSecretEnvsToPatch(oldEnv []*container.Secret, newEnv []*container.Secret) []*container.Secret {
351+
func filterSecretEnvsToPatch(oldEnv []*container.Secret, newEnv []*container.Secret) []*container.Secret {
377352
toPatch := []*container.Secret{}
378353
// create and update - ignore hashed values
379354
for _, env := range newEnv {
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package container
2+
3+
import (
4+
"testing"
5+
6+
containerSDK "github.com/scaleway/scaleway-sdk-go/api/container/v1beta1"
7+
"github.com/stretchr/testify/assert"
8+
)
9+
10+
func TestFilterSecretEnvsToPatch(t *testing.T) {
11+
testSecret := "test_secret"
12+
secretToDelete := "secret_to_delete"
13+
updatedSecret := "updated_secret"
14+
newSecret := "new_secret"
15+
16+
oldEnv := []*containerSDK.Secret{
17+
{Key: testSecret, Value: &testSecret},
18+
{Key: secretToDelete, Value: &secretToDelete},
19+
}
20+
newEnv := []*containerSDK.Secret{
21+
{Key: testSecret, Value: &updatedSecret},
22+
{Key: newSecret, Value: &newSecret},
23+
}
24+
25+
toPatch := filterSecretEnvsToPatch(oldEnv, newEnv)
26+
assert.Equal(t, []*containerSDK.Secret{
27+
{Key: testSecret, Value: &updatedSecret},
28+
{Key: newSecret, Value: &newSecret},
29+
{Key: secretToDelete, Value: nil},
30+
}, toPatch)
31+
}

internal/services/container/namespace.go

Lines changed: 8 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
container "github.com/scaleway/scaleway-sdk-go/api/container/v1beta1"
1010
registrySDK "github.com/scaleway/scaleway-sdk-go/api/registry/v1"
1111
"github.com/scaleway/scaleway-sdk-go/scw"
12+
"github.com/scaleway/terraform-provider-scaleway/v2/internal/dsf"
1213
"github.com/scaleway/terraform-provider-scaleway/v2/internal/httperrors"
1314
"github.com/scaleway/terraform-provider-scaleway/v2/internal/locality/regional"
1415
"github.com/scaleway/terraform-provider-scaleway/v2/internal/services/account"
@@ -73,7 +74,9 @@ func ResourceNamespace() *schema.Resource {
7374
Type: schema.TypeString,
7475
ValidateFunc: validation.StringLenBetween(0, 1000),
7576
},
76-
ValidateDiagFunc: validation.MapKeyLenBetween(0, 100),
77+
ValidateDiagFunc: validation.MapKeyLenBetween(0, 100),
78+
DiffSuppressFunc: dsf.CompareArgon2idPasswordAndHash,
79+
DiffSuppressOnRefresh: true,
7780
},
7881
"registry_endpoint": {
7982
Type: schema.TypeString,
@@ -160,6 +163,7 @@ func ResourceContainerNamespaceRead(ctx context.Context, d *schema.ResourceData,
160163
_ = d.Set("region", ns.Region)
161164
_ = d.Set("registry_endpoint", ns.RegistryEndpoint)
162165
_ = d.Set("registry_namespace_id", ns.RegistryNamespaceID)
166+
_ = d.Set("secret_environment_variables", flattenContainerSecrets(ns.SecretEnvironmentVariables))
163167

164168
return nil
165169
}
@@ -192,29 +196,9 @@ func ResourceContainerNamespaceUpdate(ctx context.Context, d *schema.ResourceDat
192196
req.EnvironmentVariables = types.ExpandMapPtrStringString(d.Get("environment_variables"))
193197
}
194198

195-
if d.HasChange("secret_environment_variables") {
196-
oldSecretsRaw, newSecretsRaw := d.GetChange("secret_environment_variables")
197-
198-
oldSecretsMap := convertToMapStringInterface(oldSecretsRaw)
199-
newSecretsMap := convertToMapStringInterface(newSecretsRaw)
200-
201-
oldSecrets := expandContainerSecrets(oldSecretsMap)
202-
newSecrets := expandContainerSecrets(newSecretsMap)
203-
204-
deletedSecrets := make([]*container.Secret, 0)
205-
206-
for _, oldSecret := range oldSecrets {
207-
if _, exists := newSecretsMap[oldSecret.Key]; !exists {
208-
deletedSecrets = append(deletedSecrets, &container.Secret{
209-
Key: oldSecret.Key,
210-
Value: nil,
211-
})
212-
}
213-
}
214-
215-
deletedSecrets = append(deletedSecrets, newSecrets...)
216-
217-
req.SecretEnvironmentVariables = deletedSecrets
199+
if d.HasChanges("secret_environment_variables") {
200+
oldEnv, newEnv := d.GetChange("secret_environment_variables")
201+
req.SecretEnvironmentVariables = filterSecretEnvsToPatch(expandContainerSecrets(oldEnv), expandContainerSecrets(newEnv))
218202
}
219203

220204
if _, err := api.UpdateNamespace(req, scw.WithContext(ctx)); err != nil {

internal/services/container/namespace_test.go

Lines changed: 14 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ func TestAccNamespace_Basic(t *testing.T) {
6767
resource.TestCheckResourceAttr("scaleway_container_namespace.main", "description", ""),
6868
resource.TestCheckResourceAttr("scaleway_container_namespace.main", "name", "test-cr-ns-01"),
6969
resource.TestCheckResourceAttr("scaleway_container_namespace.main", "environment_variables.test", "test"),
70-
resource.TestCheckResourceAttr("scaleway_container_namespace.main", "secret_environment_variables.test_secret", "test_secret"),
70+
passwordMatchHash("scaleway_container_namespace.main", "secret_environment_variables.test_secret", "test_secret"),
7171

7272
acctest.CheckResourceAttrUUID("scaleway_container_namespace.main", "id"),
7373
),
@@ -90,7 +90,7 @@ func TestAccNamespace_Basic(t *testing.T) {
9090
resource.TestCheckResourceAttr("scaleway_container_namespace.main", "description", ""),
9191
resource.TestCheckResourceAttr("scaleway_container_namespace.main", "name", "test-cr-ns-01"),
9292
resource.TestCheckResourceAttr("scaleway_container_namespace.main", "environment_variables.test", "test"),
93-
resource.TestCheckResourceAttr("scaleway_container_namespace.main", "secret_environment_variables.test_secret", "test_secret"),
93+
passwordMatchHash("scaleway_container_namespace.main", "secret_environment_variables.test_secret", "test_secret"),
9494
resource.TestCheckResourceAttr("scaleway_container_namespace.main", "tags.#", "2"),
9595
resource.TestCheckResourceAttr("scaleway_container_namespace.main", "tags.0", "tag1"),
9696
resource.TestCheckResourceAttr("scaleway_container_namespace.main", "tags.1", "tag2"),
@@ -127,7 +127,7 @@ func TestAccNamespace_Basic(t *testing.T) {
127127
isNamespacePresent(tt, "scaleway_container_namespace.main"),
128128
resource.TestCheckResourceAttr("scaleway_container_namespace.main", "name", "tf-env-test"),
129129
resource.TestCheckResourceAttr("scaleway_container_namespace.main", "environment_variables.test", "test"),
130-
resource.TestCheckResourceAttr("scaleway_container_namespace.main", "secret_environment_variables.test_secret", "test_secret"),
130+
passwordMatchHash("scaleway_container_namespace.main", "secret_environment_variables.test_secret", "test_secret"),
131131
resource.TestCheckResourceAttr("scaleway_container_namespace.main", "tags.#", "0"),
132132
acctest.CheckResourceAttrUUID("scaleway_container_namespace.main", "id"),
133133
),
@@ -148,7 +148,7 @@ func TestAccNamespace_Basic(t *testing.T) {
148148
isNamespacePresent(tt, "scaleway_container_namespace.main"),
149149
resource.TestCheckResourceAttr("scaleway_container_namespace.main", "name", "tf-env-test"),
150150
resource.TestCheckResourceAttr("scaleway_container_namespace.main", "environment_variables.foo", "bar"),
151-
resource.TestCheckResourceAttr("scaleway_container_namespace.main", "secret_environment_variables.foo_secret", "bar_secret"),
151+
passwordMatchHash("scaleway_container_namespace.main", "secret_environment_variables.foo_secret", "bar_secret"),
152152
resource.TestCheckResourceAttr("scaleway_container_namespace.main", "tags.#", "0"),
153153
acctest.CheckResourceAttrUUID("scaleway_container_namespace.main", "id"),
154154
),
@@ -189,24 +189,14 @@ func TestAccNamespace_SecretManagement(t *testing.T) {
189189
name = "test-secret-ns"
190190
secret_environment_variables = {
191191
"SECRET_1" = "value1"
192+
"SECRET_2" = "value2"
192193
}
193194
}
194195
`,
195196
Check: resource.ComposeTestCheckFunc(
196197
isNamespacePresent(tt, "scaleway_container_namespace.main"),
197-
resource.TestCheckResourceAttr("scaleway_container_namespace.main", "secret_environment_variables.SECRET_1", "value1"),
198-
),
199-
},
200-
{
201-
Config: `
202-
resource scaleway_container_namespace main {
203-
name = "test-secret-ns"
204-
secret_environment_variables = {}
205-
}
206-
`,
207-
Check: resource.ComposeTestCheckFunc(
208-
isNamespacePresent(tt, "scaleway_container_namespace.main"),
209-
resource.TestCheckNoResourceAttr("scaleway_container_namespace.main", "secret_environment_variables.SECRET_1"),
198+
passwordMatchHash("scaleway_container_namespace.main", "secret_environment_variables.SECRET_1", "value1"),
199+
passwordMatchHash("scaleway_container_namespace.main", "secret_environment_variables.SECRET_2", "value2"),
210200
),
211201
},
212202
{
@@ -215,44 +205,31 @@ func TestAccNamespace_SecretManagement(t *testing.T) {
215205
name = "test-secret-ns"
216206
secret_environment_variables = {
217207
"SECRET_1" = "value1"
218-
"SECRET_2" = "value2"
208+
"SECRET_2" = "updated_value2"
219209
}
220210
}
221211
`,
222212
Check: resource.ComposeTestCheckFunc(
223213
isNamespacePresent(tt, "scaleway_container_namespace.main"),
224-
resource.TestCheckResourceAttr("scaleway_container_namespace.main", "secret_environment_variables.SECRET_1", "value1"),
225-
resource.TestCheckResourceAttr("scaleway_container_namespace.main", "secret_environment_variables.SECRET_2", "value2"),
214+
passwordMatchHash("scaleway_container_namespace.main", "secret_environment_variables.SECRET_1", "value1"),
215+
passwordMatchHash("scaleway_container_namespace.main", "secret_environment_variables.SECRET_2", "updated_value2"),
226216
),
227217
},
228218
{
229219
Config: `
230220
resource scaleway_container_namespace main {
231221
name = "test-secret-ns"
232222
secret_environment_variables = {
233-
"SECRET_2" = "value2"
223+
"SECRET_KEY_1" = "value1"
224+
"SECRET_2" = "updated_value2"
234225
}
235226
}
236227
`,
237228
Check: resource.ComposeTestCheckFunc(
238229
isNamespacePresent(tt, "scaleway_container_namespace.main"),
230+
passwordMatchHash("scaleway_container_namespace.main", "secret_environment_variables.SECRET_KEY_1", "value1"),
239231
resource.TestCheckNoResourceAttr("scaleway_container_namespace.main", "secret_environment_variables.SECRET_1"),
240-
resource.TestCheckResourceAttr("scaleway_container_namespace.main", "secret_environment_variables.SECRET_2", "value2"),
241-
),
242-
},
243-
{
244-
Config: `
245-
resource scaleway_container_namespace main {
246-
name = "test-secret-ns"
247-
secret_environment_variables = {
248-
"SECRET_3" = "value3"
249-
}
250-
}
251-
`,
252-
Check: resource.ComposeTestCheckFunc(
253-
isNamespacePresent(tt, "scaleway_container_namespace.main"),
254-
resource.TestCheckNoResourceAttr("scaleway_container_namespace.main", "secret_environment_variables.SECRET_2"),
255-
resource.TestCheckResourceAttr("scaleway_container_namespace.main", "secret_environment_variables.SECRET_3", "value3"),
232+
passwordMatchHash("scaleway_container_namespace.main", "secret_environment_variables.SECRET_2", "updated_value2"),
256233
),
257234
},
258235
},

0 commit comments

Comments
 (0)