pkg/resolvers/policies_for_namespace.go (62 lines of code) (raw):
package resolvers
import (
"context"
"github.com/pkg/errors"
corev1 "k8s.io/api/core/v1"
networking "k8s.io/api/networking/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/labels"
"sigs.k8s.io/controller-runtime/pkg/client"
)
func (r *defaultPolicyReferenceResolver) getReferredPoliciesForNamespace(ctx context.Context, ns *corev1.Namespace, nsOld *corev1.Namespace) ([]networking.NetworkPolicy, error) {
var referredPolicies []networking.NetworkPolicy
for _, policyRef := range r.policyTracker.GetPoliciesWithNamespaceReferences().UnsortedList() {
policy := &networking.NetworkPolicy{}
if err := r.k8sClient.Get(ctx, policyRef, policy); err != nil {
if client.IgnoreNotFound(err) != nil {
return nil, errors.Wrap(err, "failed to get policies")
}
r.logger.Info("Tracked policy not found", "reference", policyRef)
continue
}
if r.isNamespaceReferredInPolicy(ns, policy) {
referredPolicies = append(referredPolicies, *policy)
continue
}
if nsOld != nil && r.isNamespaceReferredInPolicy(nsOld, policy) {
referredPolicies = append(referredPolicies, *policy)
}
}
return referredPolicies, nil
}
func (r *defaultPolicyReferenceResolver) isNamespaceReferredInPolicy(ns *corev1.Namespace, policy *networking.NetworkPolicy) bool {
for _, ingRule := range policy.Spec.Ingress {
for _, peer := range ingRule.From {
if r.isNameSpaceLabelMatchPeer(ns, &peer) {
return true
}
}
}
for _, egrRule := range policy.Spec.Egress {
for _, peer := range egrRule.To {
if r.isNameSpaceLabelMatchPeer(ns, &peer) {
return true
}
}
}
return false
}
func (r *defaultPolicyReferenceResolver) isNameSpaceLabelMatchPeer(ns *corev1.Namespace, peer *networking.NetworkPolicyPeer) bool {
if peer.NamespaceSelector == nil {
return false
}
nsSelector, err := metav1.LabelSelectorAsSelector(peer.NamespaceSelector)
if err != nil {
r.logger.Error(err, "unable to get namespace selector")
return false
}
if nsSelector.Matches(labels.Set(ns.Labels)) {
return true
}
return false
}