Skip to content

Commit 57f4eea

Browse files
johanotmurali-reddy
authored andcommitted
Implemented the use of both namespaceSelector and podSelector in network policy peers (cloudnativelabs#475) (cloudnativelabs#479)
* Moved code for evaluation of policy peers into separate func to avoid code duplication * Ensured fallback to policy namespace, if namespaceSelector is not set
1 parent 9934119 commit 57f4eea

File tree

1 file changed

+36
-36
lines changed

1 file changed

+36
-36
lines changed

pkg/controllers/netpol/network_policy_controller.go

Lines changed: 36 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1113,25 +1113,10 @@ func (npc *NetworkPolicyController) buildNetworkPoliciesInfo() (*[]networkPolicy
11131113
} else {
11141114
ingressRule.matchAllSource = false
11151115
var matchingPods []*api.Pod
1116-
var err error
11171116
for _, peer := range specIngressRule.From {
1118-
// spec must have either of PodSelector or NamespaceSelector
1119-
if peer.PodSelector != nil {
1120-
matchingPods, err = npc.ListPodsByNamespaceAndLabels(policy.Namespace,
1121-
peer.PodSelector.MatchLabels)
1122-
} else if peer.NamespaceSelector != nil {
1123-
namespaces, err := npc.ListNamespaceByLabels(peer.NamespaceSelector.MatchLabels)
1124-
if err != nil {
1125-
return nil, errors.New("Failed to build network policies info due to " + err.Error())
1126-
}
1127-
for _, namespace := range namespaces {
1128-
namespacePods, err := npc.ListPodsByNamespaceAndLabels(namespace.Name, nil)
1129-
if err != nil {
1130-
return nil, errors.New("Failed to build network policies info due to " + err.Error())
1131-
}
1132-
matchingPods = append(matchingPods, namespacePods...)
1133-
}
1134-
} else if peer.IPBlock != nil {
1117+
peerPods, err := npc.evalPeer(policy, peer)
1118+
matchingPods = append(matchingPods, peerPods...)
1119+
if peer.PodSelector == nil && peer.NamespaceSelector == nil && peer.IPBlock != nil {
11351120
ingressRule.cidrs = append(ingressRule.cidrs, peer.IPBlock.CIDR)
11361121
}
11371122
if err == nil {
@@ -1177,25 +1162,10 @@ func (npc *NetworkPolicyController) buildNetworkPoliciesInfo() (*[]networkPolicy
11771162
} else {
11781163
egressRule.matchAllDestinations = false
11791164
var matchingPods []*api.Pod
1180-
var err error
11811165
for _, peer := range specEgressRule.To {
1182-
// spec must have either of PodSelector or NamespaceSelector
1183-
if peer.PodSelector != nil {
1184-
matchingPods, err = npc.ListPodsByNamespaceAndLabels(policy.Namespace,
1185-
peer.PodSelector.MatchLabels)
1186-
} else if peer.NamespaceSelector != nil {
1187-
namespaces, err := npc.ListNamespaceByLabels(peer.NamespaceSelector.MatchLabels)
1188-
if err != nil {
1189-
return nil, errors.New("Failed to build network policies info due to " + err.Error())
1190-
}
1191-
for _, namespace := range namespaces {
1192-
namespacePods, err := npc.ListPodsByNamespaceAndLabels(namespace.Name, nil)
1193-
if err != nil {
1194-
return nil, errors.New("Failed to build network policies info due to " + err.Error())
1195-
}
1196-
matchingPods = append(matchingPods, namespacePods...)
1197-
}
1198-
} else if peer.IPBlock != nil {
1166+
peerPods, err := npc.evalPeer(policy, peer)
1167+
matchingPods = append(matchingPods, peerPods...)
1168+
if peer.PodSelector == nil && peer.NamespaceSelector == nil && peer.IPBlock != nil {
11991169
egressRule.cidrs = append(egressRule.cidrs, peer.IPBlock.CIDR)
12001170
}
12011171
if err == nil {
@@ -1218,6 +1188,36 @@ func (npc *NetworkPolicyController) buildNetworkPoliciesInfo() (*[]networkPolicy
12181188
return &NetworkPolicies, nil
12191189
}
12201190

1191+
func (npc *NetworkPolicyController) evalPeer(policy *networking.NetworkPolicy, peer networking.NetworkPolicyPeer) ([]*api.Pod, error) {
1192+
1193+
var matchingPods []*api.Pod
1194+
matchingPods = make([]*api.Pod, 0)
1195+
var err error
1196+
// spec can have both PodSelector AND NamespaceSelector
1197+
if peer.NamespaceSelector != nil {
1198+
namespaces, err := npc.ListNamespaceByLabels(peer.NamespaceSelector.MatchLabels)
1199+
if err != nil {
1200+
return nil, errors.New("Failed to build network policies info due to " + err.Error())
1201+
}
1202+
1203+
var podSelectorLabels map[string]string
1204+
if peer.PodSelector != nil {
1205+
podSelectorLabels = peer.PodSelector.MatchLabels
1206+
}
1207+
for _, namespace := range namespaces {
1208+
namespacePods, err := npc.ListPodsByNamespaceAndLabels(namespace.Name, podSelectorLabels)
1209+
if err != nil {
1210+
return nil, errors.New("Failed to build network policies info due to " + err.Error())
1211+
}
1212+
matchingPods = append(matchingPods, namespacePods...)
1213+
}
1214+
} else if peer.PodSelector != nil {
1215+
matchingPods, err = npc.ListPodsByNamespaceAndLabels(policy.Namespace, peer.PodSelector.MatchLabels)
1216+
}
1217+
1218+
return matchingPods, err
1219+
}
1220+
12211221
func (npc *NetworkPolicyController) ListPodsByNamespaceAndLabels(namespace string, labelsToMatch labels.Set) (ret []*api.Pod, err error) {
12221222
podLister := listers.NewPodLister(npc.podLister)
12231223
allMatchedNameSpacePods, err := podLister.Pods(namespace).List(labelsToMatch.AsSelector())

0 commit comments

Comments
 (0)