Skip to content

Commit f6e28c0

Browse files
authored
Merge pull request #156 from contentful-labs/MEC-1478-update-secrets-management
feat: [MEC-1478] use role to describe secret
2 parents 2da0475 + 1449497 commit f6e28c0

File tree

19 files changed

+1055
-792
lines changed

19 files changed

+1055
-792
lines changed

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ kind:
8888
# download controller-gen if necessary
8989
controller-gen:
9090
ifeq (, $(shell which controller-gen))
91-
go get sigs.k8s.io/controller-tools/cmd/controller-gen@v0.2.4
91+
go install sigs.k8s.io/controller-tools/cmd/controller-gen@v0.17.1
9292
CONTROLLER_GEN=$(GOBIN)/controller-gen
9393
else
9494
CONTROLLER_GEN=$(shell which controller-gen)

api/v1/syncedsecret_types.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,10 @@ type SyncedSecretSpec struct {
8080
// DataFrom
8181
// +optional
8282
DataFrom *DataFrom `json:"dataFrom,omitempty"`
83+
84+
// AWSAccountID
85+
// +optional
86+
AWSAccountID *string `json:"AWSAccountID,omitempty"`
8387
}
8488

8589
// SyncedSecretStatus defines the observed state of SyncedSecret

api/v1/zz_generated.deepcopy.go

Lines changed: 5 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

config/crd/bases/secrets.contentful.com_syncedsecrets.yaml

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,7 @@ apiVersion: apiextensions.k8s.io/v1
33
kind: CustomResourceDefinition
44
metadata:
55
annotations:
6-
controller-gen.kubebuilder.io/version: v0.11.1
7-
creationTimestamp: null
6+
controller-gen.kubebuilder.io/version: v0.17.1
87
name: syncedsecrets.secrets.contentful.com
98
spec:
109
group: secrets.contentful.com
@@ -21,20 +20,28 @@ spec:
2120
description: SyncedSecret is the Schema for the SyncedSecrets API
2221
properties:
2322
apiVersion:
24-
description: 'APIVersion defines the versioned schema of this representation
25-
of an object. Servers should convert recognized schemas to the latest
26-
internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
23+
description: |-
24+
APIVersion defines the versioned schema of this representation of an object.
25+
Servers should convert recognized schemas to the latest internal value, and
26+
may reject unrecognized values.
27+
More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources
2728
type: string
2829
kind:
29-
description: 'Kind is a string value representing the REST resource this
30-
object represents. Servers may infer this from the endpoint the client
31-
submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
30+
description: |-
31+
Kind is a string value representing the REST resource this object represents.
32+
Servers may infer this from the endpoint the client submits requests to.
33+
Cannot be updated.
34+
In CamelCase.
35+
More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
3236
type: string
3337
metadata:
3438
type: object
3539
spec:
3640
description: SyncedSecretSpec defines the desired state of SyncedSecret
3741
properties:
42+
AWSAccountID:
43+
description: AWSAccountID
44+
type: string
3845
IAMRole:
3946
description: IAMRole
4047
type: string

config/rbac/role.yaml

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
apiVersion: rbac.authorization.k8s.io/v1
33
kind: ClusterRole
44
metadata:
5-
creationTimestamp: null
65
name: manager-role
76
rules:
87
- apiGroups:
@@ -44,10 +43,3 @@ rules:
4443
- get
4544
- patch
4645
- update
47-
- apiGroups:
48-
- coordination.k8s.io
49-
resources:
50-
- leases
51-
verbs:
52-
- create
53-
- update

controllers/suite_test.go

Lines changed: 78 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ import (
2626
awsclient "github.com/aws/aws-sdk-go/aws/client"
2727
"github.com/aws/aws-sdk-go/aws/request"
2828
"github.com/aws/aws-sdk-go/aws/session"
29-
"sigs.k8s.io/controller-runtime/pkg/envtest/printer"
3029

3130
. "github.com/onsi/ginkgo"
3231
. "github.com/onsi/gomega"
@@ -40,6 +39,7 @@ import (
4039
"k8s.io/client-go/kubernetes/scheme"
4140
"k8s.io/client-go/rest"
4241
ctrl "sigs.k8s.io/controller-runtime"
42+
"sigs.k8s.io/controller-runtime/pkg/cache"
4343
"sigs.k8s.io/controller-runtime/pkg/client"
4444
"sigs.k8s.io/controller-runtime/pkg/envtest"
4545
logf "sigs.k8s.io/controller-runtime/pkg/log"
@@ -56,6 +56,8 @@ var k8sManager ctrl.Manager
5656
var testEnv *envtest.Environment
5757

5858
const TEST_NAMESPACE = "secret-sync-test"
59+
const TEST_NAMESPACE2 = "secret-sync-test2"
60+
const TEST_NAMESPACE3 = "secret-sync-test3"
5961

6062
var time_now = time.Now()
6163

@@ -64,8 +66,9 @@ var Secretsoutput *secretsmanager.ListSecretsOutput
6466
var MockSecretsOutput = mockSecretsOutput{}
6567

6668
type mockSecretsOutput struct {
67-
SecretsPageOutput *secretsmanager.ListSecretsOutput
68-
SecretsValueOutput *secretsmanager.GetSecretValueOutput
69+
SecretsPageOutput *secretsmanager.ListSecretsOutput
70+
SecretsValueOutput *secretsmanager.GetSecretValueOutput
71+
DescribeSecretOutput *secretsmanager.DescribeSecretOutput
6972
}
7073

7174
type mockSecretsManagerClient struct {
@@ -80,12 +83,25 @@ func _t(A time.Time) *time.Time {
8083
return &A
8184
}
8285

86+
func keyValue(key, value string) *secretsmanager.Tag {
87+
return &secretsmanager.Tag{
88+
Key: aws.String(key),
89+
Value: aws.String(value),
90+
}
91+
}
92+
8393
type mockRoleValidator struct{}
8494

8595
func (m *mockRoleValidator) IsWhitelisted(string, string) (bool, error) {
8696
return true, nil
8797
}
8898

99+
type mockNamespaceValidator struct{}
100+
101+
func (m *mockNamespaceValidator) HasNamespaceType(secretsmanager.DescribeSecretOutput, string) (bool, error) {
102+
return true, nil
103+
}
104+
89105
// TODO this needs to be more dynamic when an update comes by
90106
func (m *mockSecretsManagerClient) ListSecretsPages(input *secretsmanager.ListSecretsInput, fn func(*secretsmanager.ListSecretsOutput, bool) bool) error {
91107
fn(MockSecretsOutput.SecretsPageOutput, true)
@@ -96,12 +112,17 @@ func (m *mockSecretsManagerClient) GetSecretValue(*secretsmanager.GetSecretValue
96112
return MockSecretsOutput.SecretsValueOutput, nil
97113
}
98114

115+
func (m *mockSecretsManagerClient) DescribeSecret(*secretsmanager.DescribeSecretInput) (*secretsmanager.DescribeSecretOutput, error) {
116+
return MockSecretsOutput.DescribeSecretOutput, nil
117+
}
118+
99119
func TestAPIs(t *testing.T) {
100120
RegisterFailHandler(Fail)
101121

122+
// This is deprecated, we need to replace it: https://onsi.github.io/ginkgo/MIGRATING_TO_V2#migration-strategy-2
102123
RunSpecsWithDefaultAndCustomReporters(t,
103124
"Controller Suite",
104-
[]Reporter{printer.NewlineReporter{}})
125+
[]Reporter{})
105126
}
106127

107128
var _ = BeforeSuite(func(done Done) {
@@ -124,8 +145,9 @@ var _ = BeforeSuite(func(done Done) {
124145

125146
syncPeriod := 2 * time.Second
126147
k8sManager, err = ctrl.NewManager(cfg, ctrl.Options{
127-
Scheme: scheme.Scheme,
128-
SyncPeriod: &syncPeriod,
148+
Scheme: scheme.Scheme,
149+
Cache: cache.Options{SyncPeriod: &syncPeriod},
150+
// SyncPeriod: &syncPeriod,
129151
})
130152
Expect(err).ToNot(HaveOccurred())
131153
Expect(k8sManager).ToNot(BeNil())
@@ -154,6 +176,28 @@ var _ = BeforeSuite(func(done Done) {
154176
_s("AWSPREVIOUS"),
155177
},
156178
},
179+
}, {
180+
Name: _s("random/aws/secret004"),
181+
LastChangedDate: _t(time_now.AddDate(0, 0, -3)),
182+
SecretVersionsToStages: map[string][]*string{
183+
"005": {
184+
_s("AWSCURRENT"),
185+
},
186+
"004": {
187+
_s("AWSPREVIOUS"),
188+
},
189+
},
190+
}, {
191+
Name: _s("random/aws/secret005"),
192+
LastChangedDate: _t(time_now.AddDate(0, 0, -3)),
193+
SecretVersionsToStages: map[string][]*string{
194+
"006": {
195+
_s("AWSCURRENT"),
196+
},
197+
"005": {
198+
_s("AWSPREVIOUS"),
199+
},
200+
},
157201
},
158202
},
159203
}
@@ -163,6 +207,14 @@ var _ = BeforeSuite(func(done Done) {
163207
VersionId: _s(`005`),
164208
}
165209

210+
MockSecretsOutput.DescribeSecretOutput = &secretsmanager.DescribeSecretOutput{
211+
ARN: _s("arn:aws:secretsmanager:us-west-2:123456789012:secret:random/aws/secret003-abc"),
212+
Tags: []*secretsmanager.Tag{
213+
keyValue("k8s.contentful.com/namespace_type/secret-sync-test2", "1"),
214+
keyValue("k8s.contentful.com/namespace_type/secret-sync-test3", "1"),
215+
},
216+
}
217+
166218
// mock the manager setup
167219
Retry5Cfg := request.WithRetryer(aws.NewConfig(), awsclient.DefaultRetryer{NumMaxRetries: 5})
168220
err = (&SyncedSecretReconciler{
@@ -172,10 +224,11 @@ var _ = BeforeSuite(func(done Done) {
172224
GetSMClient: func(IAMRole string) (secretsmanageriface.SecretsManagerAPI, error) {
173225
return &smSvc, nil
174226
},
175-
RoleValidator: &mockRoleValidator{},
176-
gauges: map[string]prometheus.Gauge{},
177-
sync_state: map[string]bool{},
178-
PollInterval: 3 * time.Second,
227+
RoleValidator: &mockRoleValidator{},
228+
NamespaceValidator: &mockNamespaceValidator{},
229+
gauges: map[string]prometheus.Gauge{},
230+
sync_state: map[string]bool{},
231+
PollInterval: 3 * time.Second,
179232
}).SetupWithManager(k8sManager)
180233
Expect(err).ToNot(HaveOccurred())
181234

@@ -194,9 +247,24 @@ var _ = BeforeSuite(func(done Done) {
194247
Name: TEST_NAMESPACE,
195248
},
196249
}
250+
toCreate2 := &corev1.Namespace{
251+
ObjectMeta: metav1.ObjectMeta{
252+
Name: TEST_NAMESPACE2,
253+
},
254+
}
255+
toCreate3 := &corev1.Namespace{
256+
ObjectMeta: metav1.ObjectMeta{
257+
Name: TEST_NAMESPACE3,
258+
},
259+
}
197260

198261
err = k8sClient.Create(context.Background(), toCreate)
199262
Expect(err).To(BeNil())
263+
err = k8sClient.Create(context.Background(), toCreate2)
264+
Expect(err).To(BeNil())
265+
err = k8sClient.Create(context.Background(), toCreate3)
266+
Expect(err).To(BeNil())
267+
Expect(err).To(BeNil())
200268

201269
close(done)
202270
}, 60)

0 commit comments

Comments
 (0)