Use consistent helper for getting secret names from pod

This commit is contained in:
Jordan Liggitt
2017-02-23 00:35:44 -05:00
parent 2e12711160
commit a5526304bc
7 changed files with 205 additions and 30 deletions

View File

@@ -118,3 +118,97 @@ func SetInitContainersStatusesAnnotations(pod *v1.Pod) error {
}
return nil
}
// VisitPodSecretNames invokes the visitor function with the name of every secret
// referenced by the pod spec. If visitor returns false, visiting is short-circuited.
// Transitive references (e.g. pod -> pvc -> pv -> secret) are not visited.
// Returns true if visiting completed, false if visiting was short-circuited.
func VisitPodSecretNames(pod *v1.Pod, visitor func(string) bool) bool {
for _, reference := range pod.Spec.ImagePullSecrets {
if !visitor(reference.Name) {
return false
}
}
for i := range pod.Spec.InitContainers {
if !visitContainerSecretNames(&pod.Spec.InitContainers[i], visitor) {
return false
}
}
for i := range pod.Spec.Containers {
if !visitContainerSecretNames(&pod.Spec.Containers[i], visitor) {
return false
}
}
var source *v1.VolumeSource
for i := range pod.Spec.Volumes {
source = &pod.Spec.Volumes[i].VolumeSource
switch {
// case source.AWSElasticBlockStore:
// case source.AzureDisk:
case source.AzureFile != nil:
if len(source.AzureFile.SecretName) > 0 && !visitor(source.Secret.SecretName) {
return false
}
case source.CephFS != nil:
if source.CephFS.SecretRef != nil && !visitor(source.CephFS.SecretRef.Name) {
return false
}
// case source.Cinder:
// case source.ConfigMap:
// case source.DownwardAPI:
// case source.EmptyDir:
// case source.FC:
case source.FlexVolume != nil:
if source.FlexVolume.SecretRef != nil && !visitor(source.FlexVolume.SecretRef.Name) {
return false
}
// case source.Flocker:
// case source.GCEPersistentDisk:
// case source.GitRepo:
// case source.Glusterfs:
// case source.HostPath:
// case source.ISCSI:
// case source.NFS:
// case source.PersistentVolumeClaim:
// case source.PhotonPersistentDisk:
case source.Projected != nil:
for j := range source.Projected.Sources {
if source.Projected.Sources[j].Secret != nil {
if !visitor(source.Projected.Sources[j].Secret.Name) {
return false
}
}
}
// case source.Quobyte:
case source.RBD != nil:
if source.RBD.SecretRef != nil && !visitor(source.RBD.SecretRef.Name) {
return false
}
case source.Secret != nil:
if !visitor(source.Secret.SecretName) {
return false
}
}
// case source.VsphereVolume:
}
return true
}
func visitContainerSecretNames(container *v1.Container, visitor func(string) bool) bool {
for _, env := range container.EnvFrom {
if env.SecretRef != nil {
if !visitor(env.SecretRef.Name) {
return false
}
}
}
for _, envVar := range container.Env {
if envVar.ValueFrom != nil && envVar.ValueFrom.SecretKeyRef != nil {
if !visitor(envVar.ValueFrom.SecretKeyRef.Name) {
return false
}
}
}
return true
}