Skip to content

Commit 030d451

Browse files
Merge pull request #170 from mmorejon/add-volumes-projected-detection
Add volumes projected detection
2 parents a42a96b + 1e73bc1 commit 030d451

File tree

4 files changed

+93
-19
lines changed

4 files changed

+93
-19
lines changed

pkg/onepassword/deployments_test.go

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,18 +9,30 @@ import (
99

1010
func TestIsDeploymentUsingSecretsUsingVolumes(t *testing.T) {
1111
secretNamesToSearch := map[string]*corev1.Secret{
12-
"onepassword-database-secret": {},
13-
"onepassword-api-key": {},
12+
"onepassword-database-secret": {},
13+
"onepassword-api-key": {},
14+
"onepassword-app-token": {},
15+
"onepassword-user-credentials": {},
1416
}
1517

1618
volumeSecretNames := []string{
1719
"onepassword-database-secret",
1820
"onepassword-api-key",
19-
"some_other_key",
2021
}
2122

23+
volumes := generateVolumes(volumeSecretNames)
24+
25+
volumeProjectedSecretNames := []string{
26+
"onepassword-app-token",
27+
"onepassword-user-credentials",
28+
}
29+
30+
volumeProjected := generateVolumesProjected(volumeProjectedSecretNames)
31+
32+
volumes = append(volumes, volumeProjected)
33+
2234
deployment := &appsv1.Deployment{}
23-
deployment.Spec.Template.Spec.Volumes = generateVolumes(volumeSecretNames)
35+
deployment.Spec.Template.Spec.Volumes = volumes
2436
if !IsDeploymentUsingSecrets(deployment, secretNamesToSearch) {
2537
t.Errorf("Expected that deployment was using secrets but they were not detected.")
2638
}

pkg/onepassword/object_generators_for_test.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,29 @@ func generateVolumes(names []string) []corev1.Volume {
1717
}
1818
return volumes
1919
}
20+
func generateVolumesProjected(names []string) corev1.Volume {
21+
volumesProjection := []corev1.VolumeProjection{}
22+
for i := 0; i < len(names); i++ {
23+
volumeProjection := corev1.VolumeProjection{
24+
Secret: &corev1.SecretProjection{
25+
LocalObjectReference: corev1.LocalObjectReference{
26+
Name: names[i],
27+
},
28+
},
29+
}
30+
volumesProjection = append(volumesProjection, volumeProjection)
31+
}
32+
volume := corev1.Volume{
33+
Name: "someName",
34+
VolumeSource: corev1.VolumeSource{
35+
Projected: &corev1.ProjectedVolumeSource{
36+
Sources: volumesProjection,
37+
},
38+
},
39+
}
40+
41+
return volume
42+
}
2043
func generateContainersWithSecretRefsFromEnv(names []string) []corev1.Container {
2144
containers := []corev1.Container{}
2245
for i := 0; i < len(names); i++ {

pkg/onepassword/volumes.go

Lines changed: 41 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,26 +4,55 @@ import corev1 "k8s.io/api/core/v1"
44

55
func AreVolumesUsingSecrets(volumes []corev1.Volume, secrets map[string]*corev1.Secret) bool {
66
for i := 0; i < len(volumes); i++ {
7-
if secret := volumes[i].Secret; secret != nil {
8-
secretName := secret.SecretName
9-
_, ok := secrets[secretName]
10-
if ok {
11-
return true
12-
}
7+
secret := IsVolumeUsingSecret(volumes[i], secrets)
8+
secretProjection := IsVolumeUsingSecretProjection(volumes[i], secrets)
9+
if secret == nil && secretProjection == nil {
10+
return false
1311
}
1412
}
15-
return false
13+
if len(volumes) == 0 {
14+
return false
15+
}
16+
return true
1617
}
1718

1819
func AppendUpdatedVolumeSecrets(volumes []corev1.Volume, secrets map[string]*corev1.Secret, updatedDeploymentSecrets map[string]*corev1.Secret) map[string]*corev1.Secret {
1920
for i := 0; i < len(volumes); i++ {
20-
if secret := volumes[i].Secret; secret != nil {
21-
secretName := secret.SecretName
22-
secret, ok := secrets[secretName]
23-
if ok {
24-
updatedDeploymentSecrets[secret.Name] = secret
21+
secret := IsVolumeUsingSecret(volumes[i], secrets)
22+
if secret != nil {
23+
updatedDeploymentSecrets[secret.Name] = secret
24+
} else {
25+
secretProjection := IsVolumeUsingSecretProjection(volumes[i], secrets)
26+
if secretProjection != nil {
27+
updatedDeploymentSecrets[secretProjection.Name] = secretProjection
2528
}
2629
}
2730
}
2831
return updatedDeploymentSecrets
2932
}
33+
34+
func IsVolumeUsingSecret(volume corev1.Volume, secrets map[string]*corev1.Secret) *corev1.Secret {
35+
if secret := volume.Secret; secret != nil {
36+
secretName := secret.SecretName
37+
secretFound, ok := secrets[secretName]
38+
if ok {
39+
return secretFound
40+
}
41+
}
42+
return nil
43+
}
44+
45+
func IsVolumeUsingSecretProjection(volume corev1.Volume, secrets map[string]*corev1.Secret) *corev1.Secret {
46+
if volume.Projected != nil {
47+
for i := 0; i < len(volume.Projected.Sources); i++ {
48+
if secret := volume.Projected.Sources[i].Secret; secret != nil {
49+
secretName := secret.Name
50+
secretFound, ok := secrets[secretName]
51+
if ok {
52+
return secretFound
53+
}
54+
}
55+
}
56+
}
57+
return nil
58+
}

pkg/onepassword/volumes_test.go

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,28 @@ import (
88

99
func TestAreVolmesUsingSecrets(t *testing.T) {
1010
secretNamesToSearch := map[string]*corev1.Secret{
11-
"onepassword-database-secret": {},
12-
"onepassword-api-key": {},
11+
"onepassword-database-secret": {},
12+
"onepassword-api-key": {},
13+
"onepassword-app-token": {},
14+
"onepassword-user-credentials": {},
1315
}
1416

1517
volumeSecretNames := []string{
1618
"onepassword-database-secret",
1719
"onepassword-api-key",
18-
"some_other_key",
1920
}
2021

2122
volumes := generateVolumes(volumeSecretNames)
2223

24+
volumeProjectedSecretNames := []string{
25+
"onepassword-app-token",
26+
"onepassword-user-credentials",
27+
}
28+
29+
volumeProjected := generateVolumesProjected(volumeProjectedSecretNames)
30+
31+
volumes = append(volumes, volumeProjected)
32+
2333
if !AreVolumesUsingSecrets(volumes, secretNamesToSearch) {
2434
t.Errorf("Expected that volumes were using secrets but they were not detected.")
2535
}

0 commit comments

Comments
 (0)