Skip to content

Commit 7c39a74

Browse files
committed
SecretKeyRef - CodeGen changes
- Introduced a new field config for secrets. - This will turn a given field into SecretKeyRef. - Initial approach to solve ElastiCache AuthToken usecase.
1 parent fe3ed9d commit 7c39a74

File tree

8 files changed

+59
-9
lines changed

8 files changed

+59
-9
lines changed

pkg/generate/code/set_sdk.go

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ func SetSDK(
165165
}
166166

167167
opConfig, override := cfg.OverrideValues(op.Name)
168-
168+
fieldConfigs := cfg.ResourceFields(r.Names.Original)
169169
for memberIndex, memberName := range inputShape.MemberNames() {
170170
if r.UnpacksAttributesMap() && memberName == "Attributes" {
171171
continue
@@ -190,6 +190,22 @@ func SetSDK(
190190
}
191191
}
192192

193+
fc, ok := fieldConfigs[memberName]
194+
if ok && fc.IsSecret {
195+
out += fmt.Sprintf("%sif %s.Spec.%s != nil {\n", indent, sourceVarName, memberName)
196+
out += fmt.Sprintf("%s%stmpSecret, err := rm.rr.SecretValueFromReference(ctx, %s.Spec.%s)\n", indent,
197+
indent, sourceVarName, memberName)
198+
out += fmt.Sprintf("%s%sif err != nil {\n", indent, indent)
199+
out += fmt.Sprintf("%s%s%sreturn nil, err\n", indent, indent, indent)
200+
out += fmt.Sprintf("%s%s}\n", indent, indent)
201+
out += fmt.Sprintf("%s%sif tmpSecret != \"\" {\n", indent, indent)
202+
out += fmt.Sprintf("%s%s%s%s.Set%s(%s)\n", indent, indent, indent,
203+
targetVarName, memberName, "tmpSecret")
204+
out += fmt.Sprintf("%s%s}\n", indent, indent)
205+
out += fmt.Sprintf("%s}\n", indent)
206+
continue
207+
}
208+
193209
if r.IsPrimaryARNField(memberName) {
194210
// if ko.Status.ACKResourceMetadata != nil && ko.Status.ACKResourceMetadata.ARN != nil {
195211
// res.SetTopicArn(string(*ko.Status.ACKResourceMetadata.ARN))

pkg/generate/code/set_sdk_test.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -896,7 +896,13 @@ func TestSetSDK_Elasticache_ReplicationGroup_Update_Override_Values(t *testing.T
896896
expected := `
897897
res.SetApplyImmediately(true)
898898
if r.ko.Spec.AuthToken != nil {
899-
res.SetAuthToken(*r.ko.Spec.AuthToken)
899+
tmpSecret, err := rm.rr.SecretValueFromReference(ctx, r.ko.Spec.AuthToken)
900+
if err != nil {
901+
return nil, err
902+
}
903+
if tmpSecret != "" {
904+
res.SetAuthToken(tmpSecret)
905+
}
900906
}
901907
if r.ko.Spec.AutoMinorVersionUpgrade != nil {
902908
res.SetAutoMinorVersionUpgrade(*r.ko.Spec.AutoMinorVersionUpgrade)

pkg/generate/config/field.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,9 @@ type FieldConfig struct {
136136
// that owns the resource. This is a special field that we direct to
137137
// storage in the common `Status.ACKResourceMetadata.OwnerAccountID` field.
138138
IsOwnerAccountID bool `json:"is_owner_account_id"`
139+
// IsSecret instructs the code generator that this field should be a
140+
// SecretKeyReference.
141+
IsSecret bool `json:"is_secret"`
139142
// From instructs the code generator that the value of the field should
140143
// be retrieved from the specified operation and member path
141144
From *SourceFieldConfig `json:"from,omitempty"`

pkg/generate/elasticache_test.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,3 +262,20 @@ func TestElasticache_Additional_ReplicationGroup_Status_RenameField(t *testing.T
262262
assert.Contains(crd.StatusFields, "AllowedScaleUpModifications")
263263
assert.Contains(crd.StatusFields, "AllowedScaleDownModifications")
264264
}
265+
266+
func TestElasticache_ValidateAuthTokenIsSecret(t *testing.T) {
267+
require := require.New(t)
268+
269+
g := testutil.NewGeneratorForService(t, "elasticache")
270+
crds, err := g.GetCRDs()
271+
272+
require.Nil(err)
273+
274+
crd := getCRDByName("ReplicationGroup", crds)
275+
require.NotNil(crd)
276+
277+
assert := assert.New(t)
278+
assert.Equal("*ackv1alpha1.SecretKeyReference", crd.SpecFields["AuthToken"].GoType)
279+
assert.Equal("ackv1alpha1.SecretKeyReference", crd.SpecFields["AuthToken"].GoTypeElem)
280+
assert.Equal("*ackv1alpha1.SecretKeyReference", crd.SpecFields["AuthToken"].GoTypeWithPkgName)
281+
}

pkg/generate/testdata/models/apis/elasticache/0000-00-00/generator.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,8 @@ resources:
5858
from:
5959
operation: DescribeEvents
6060
path: Events
61+
AuthToken:
62+
is_secret: true
6163
operations:
6264
ModifyReplicationGroup:
6365
override_values:

pkg/model/field.go

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,10 @@
1414
package model
1515

1616
import (
17-
awssdkmodel "github.com/aws/aws-sdk-go/private/model/api"
18-
1917
ackgenconfig "github.com/aws-controllers-k8s/code-generator/pkg/generate/config"
2018
"github.com/aws-controllers-k8s/code-generator/pkg/names"
2119
"github.com/aws-controllers-k8s/code-generator/pkg/util"
20+
awssdkmodel "github.com/aws/aws-sdk-go/private/model/api"
2221
)
2322

2423
// Field represents a single field in the CRD's Spec or Status objects
@@ -58,7 +57,12 @@ func newField(
5857
if shapeRef != nil {
5958
shape = shapeRef.Shape
6059
}
61-
if shape != nil {
60+
61+
if cfg != nil && cfg.IsSecret {
62+
gt = "*ackv1alpha1.SecretKeyReference"
63+
gte = "ackv1alpha1.SecretKeyReference"
64+
gtwp = "*ackv1alpha1.SecretKeyReference"
65+
} else if shape != nil {
6266
gte, gt, gtwp = cleanGoType(crd.sdkAPI, crd.cfg, shape)
6367
} else {
6468
gte = "string"

templates/pkg/resource/sdk.go.tpl

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ func (rm *resourceManager) sdkCreate(
5252
return customResp, customRespErr
5353
}
5454
{{- end }}
55-
input, err := rm.newCreateRequestPayload(r)
55+
input, err := rm.newCreateRequestPayload(ctx, r)
5656
if err != nil {
5757
return nil, err
5858
}
@@ -80,7 +80,8 @@ func (rm *resourceManager) sdkCreate(
8080
// newCreateRequestPayload returns an SDK-specific struct for the HTTP request
8181
// payload of the Create API call for the resource
8282
func (rm *resourceManager) newCreateRequestPayload(
83-
r *resource,
83+
ctx context.Context,
84+
r *resource,
8485
) (*svcsdk.{{ .CRD.Ops.Create.InputRef.Shape.ShapeName }}, error) {
8586
res := &svcsdk.{{ .CRD.Ops.Create.InputRef.Shape.ShapeName }}{}
8687
{{ GoCodeSetCreateInput .CRD "r.ko" "res" 1 }}

templates/pkg/resource/sdk_update.go.tpl

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ func (rm *resourceManager) sdkUpdate(
1313
}
1414
{{ end }}
1515

16-
input, err := rm.newUpdateRequestPayload(desired)
16+
input, err := rm.newUpdateRequestPayload(ctx, desired)
1717
if err != nil {
1818
return nil, err
1919
}
@@ -42,7 +42,8 @@ func (rm *resourceManager) sdkUpdate(
4242
// newUpdateRequestPayload returns an SDK-specific struct for the HTTP request
4343
// payload of the Update API call for the resource
4444
func (rm *resourceManager) newUpdateRequestPayload(
45-
r *resource,
45+
ctx context.Context,
46+
r *resource,
4647
) (*svcsdk.{{ .CRD.Ops.Update.InputRef.Shape.ShapeName }}, error) {
4748
res := &svcsdk.{{ .CRD.Ops.Update.InputRef.Shape.ShapeName }}{}
4849
{{ GoCodeSetUpdateInput .CRD "r.ko" "res" 1 }}

0 commit comments

Comments
 (0)