in pkg/skoop/plugin/networkpolicy.go [199:267]
func (np *networkPolicy) checkEgressPolicyVerdict(policy *v1.NetworkPolicy, dstPod *corev1.Pod, dst model.Endpoint, protocol model.Protocol) (deny bool, err error) {
if !np.hasPolicyType(policy, v1.PolicyTypeEgress) {
return false, nil
}
for _, egressRule := range policy.Spec.Egress {
if !np.containsPortWithProtocol(dst.Port, protocol, egressRule.Ports) {
continue
}
for _, to := range egressRule.To {
if dstPod != nil {
if to.PodSelector != nil {
if dstPod.GetNamespace() != policy.GetNamespace() {
continue
}
selector, err := metav1.LabelSelectorAsSelector(to.PodSelector)
if err != nil {
return false, err
}
if selector.Empty() || selector.Matches(labels.Set(dstPod.Labels)) {
return false, nil
}
} else if to.NamespaceSelector != nil {
selector, err := metav1.LabelSelectorAsSelector(to.NamespaceSelector)
if err != nil {
return false, err
}
if selector.Empty() {
return false, nil
}
dstNamespace, err := np.k8sCli.CoreV1().Namespaces().Get(context.Background(), dstPod.GetNamespace(), metav1.GetOptions{})
if err != nil {
return false, err
}
if selector.Matches(labels.Set(dstNamespace.Labels)) {
return false, nil
}
}
}
if to.IPBlock != nil {
if dstPod != nil && np.inClusterAddrEmitCidrRule {
continue
}
contains, err := np.strCidrContainsIP(to.IPBlock.CIDR, dst.IP)
if err != nil {
return false, err
}
if contains {
var ipExcept bool
for _, exceptCIDR := range to.IPBlock.Except {
except, err := np.strCidrContainsIP(exceptCIDR, dst.IP)
if err != nil {
return false, err
}
if except {
ipExcept = true
break
}
}
if !ipExcept {
return false, nil
}
}
}
}
}
return true, nil
}