Merge pull request #135723 from danwinship/netpol-test-cleanup

minor Netpol test cleanups
This commit is contained in:
Kubernetes Prow Robot
2025-12-18 02:10:22 -08:00
committed by GitHub
3 changed files with 104 additions and 82 deletions

View File

@@ -80,7 +80,7 @@ func (k *kubeManager) initializeClusterFromModel(ctx context.Context, model *Mod
var createdPods []*v1.Pod
for _, ns := range model.Namespaces {
// no labels needed, we just need the default kubernetes.io/metadata.name label
namespace, err := k.framework.CreateNamespace(ctx, ns.BaseName, nil)
namespace, err := k.framework.CreateNamespace(ctx, ns.Name, nil)
if err != nil {
return err
}

View File

@@ -35,20 +35,15 @@ type Model struct {
Protocols []v1.Protocol
}
// NewWindowsModel returns a model specific to windows testing.
func NewWindowsModel(namespaceBaseNames []string, podNames []string, ports []int32) *Model {
return NewModel(namespaceBaseNames, podNames, ports, []v1.Protocol{v1.ProtocolTCP, v1.ProtocolUDP})
}
// NewModel instantiates a model based on:
// - namespaceBaseNames
// - namespaceNames
// - pods
// - ports to listen on
// - protocols to listen on
// The total number of pods is the number of namespaces x the number of pods per namespace.
// The number of containers per pod is the number of ports x the number of protocols.
// The *total* number of containers is namespaces x pods x ports x protocols.
func NewModel(namespaceBaseNames []string, podNames []string, ports []int32, protocols []v1.Protocol) *Model {
func NewModel(namespaceNames []string, podNames []string, ports []int32, protocols []v1.Protocol) *Model {
model := &Model{
PodNames: podNames,
Ports: ports,
@@ -57,7 +52,7 @@ func NewModel(namespaceBaseNames []string, podNames []string, ports []int32, pro
// build the entire "model" for the overall test, which means, building
// namespaces, pods, containers for each protocol.
for _, ns := range namespaceBaseNames {
for _, ns := range namespaceNames {
var pods []*Pod
for _, podName := range podNames {
var containers []*Container
@@ -75,8 +70,8 @@ func NewModel(namespaceBaseNames []string, podNames []string, ports []int32, pro
})
}
model.Namespaces = append(model.Namespaces, &Namespace{
BaseName: ns,
Pods: pods,
Name: ns,
Pods: pods,
})
}
return model
@@ -85,8 +80,8 @@ func NewModel(namespaceBaseNames []string, podNames []string, ports []int32, pro
// Namespace is the abstract representation of what matters to network policy
// tests for a namespace; i.e. it ignores kube implementation details
type Namespace struct {
BaseName string
Pods []*Pod
Name string
Pods []*Pod
}
// Pod is the abstract representation of what matters to network policy tests for

View File

@@ -146,11 +146,12 @@ var _ = common.SIGDescribe("Netpol", func() {
})
f.It("should support a 'default-deny-all' policy", feature.NetworkPolicy, func(ctx context.Context) {
policy := GenNetworkPolicyWithNameAndPodSelector("deny-all", metav1.LabelSelector{}, SetSpecIngressRules(), SetSpecEgressRules())
protocols := []v1.Protocol{protocolTCP}
ports := []int32{80}
k8s = initializeResources(ctx, f, protocols, ports)
nsX, _, _ := getK8sNamespaces(k8s)
policy := GenNetworkPolicyWithNameAndPodSelector("deny-all", metav1.LabelSelector{}, SetSpecIngressRules(), SetSpecEgressRules())
CreatePolicy(ctx, k8s, policy, nsX)
reachability := NewReachability(k8s.AllPodStrings(), true)
@@ -161,6 +162,11 @@ var _ = common.SIGDescribe("Netpol", func() {
})
f.It("should enforce policy to allow traffic from pods within server namespace based on PodSelector", feature.NetworkPolicy, func(ctx context.Context) {
protocols := []v1.Protocol{protocolTCP}
ports := []int32{80}
k8s = initializeResources(ctx, f, protocols, ports)
nsX, _, _ := getK8sNamespaces(k8s)
allowedPods := metav1.LabelSelector{
MatchLabels: map[string]string{
"pod": "b",
@@ -169,11 +175,6 @@ var _ = common.SIGDescribe("Netpol", func() {
ingressRule := networkingv1.NetworkPolicyIngressRule{}
ingressRule.From = append(ingressRule.From, networkingv1.NetworkPolicyPeer{PodSelector: &allowedPods})
policy := GenNetworkPolicyWithNameAndPodMatchLabel("x-a-allows-x-b", map[string]string{"pod": "a"}, SetSpecIngressRules(ingressRule))
protocols := []v1.Protocol{protocolTCP}
ports := []int32{80}
k8s = initializeResources(ctx, f, protocols, ports)
nsX, _, _ := getK8sNamespaces(k8s)
CreatePolicy(ctx, k8s, policy, nsX)
reachability := NewReachability(k8s.AllPodStrings(), true)
@@ -188,11 +189,11 @@ var _ = common.SIGDescribe("Netpol", func() {
ports := []int32{80}
k8s = initializeResources(ctx, f, protocols, ports)
nsX, _, _ := getK8sNamespaces(k8s)
ginkgo.By("having a deny all ingress policy", func() {
// Deny all Ingress traffic policy to pods on namespace nsX
policy := GenNetworkPolicyWithNameAndPodSelector("deny-all", metav1.LabelSelector{}, SetSpecIngressRules())
CreatePolicy(ctx, k8s, policy, nsX)
})
ginkgo.By("having a deny all ingress policy")
// Deny all Ingress traffic policy to pods on namespace nsX
policy := GenNetworkPolicyWithNameAndPodSelector("deny-all", metav1.LabelSelector{}, SetSpecIngressRules())
CreatePolicy(ctx, k8s, policy, nsX)
// Allow Ingress traffic only to pod x/a from any pod
ingressRule := networkingv1.NetworkPolicyIngressRule{}
@@ -213,6 +214,7 @@ var _ = common.SIGDescribe("Netpol", func() {
ports := []int32{80}
k8s = initializeResources(ctx, f, protocols, ports)
nsX, _, _ := getK8sNamespaces(k8s)
ingressRule := networkingv1.NetworkPolicyIngressRule{}
ingressRule.From = append(ingressRule.From, networkingv1.NetworkPolicyPeer{NamespaceSelector: &metav1.LabelSelector{MatchLabels: map[string]string{}}})
policy := GenNetworkPolicyWithNameAndPodMatchLabel("allow-from-another-ns", map[string]string{"pod": "a"}, SetSpecIngressRules(ingressRule))
@@ -227,6 +229,7 @@ var _ = common.SIGDescribe("Netpol", func() {
ports := []int32{80}
k8s = initializeResources(ctx, f, protocols, ports)
nsX, nsY, nsZ := getK8sNamespaces(k8s)
ingressRule := networkingv1.NetworkPolicyIngressRule{}
ingressRule.From = append(ingressRule.From, networkingv1.NetworkPolicyPeer{NamespaceSelector: &metav1.LabelSelector{MatchLabels: map[string]string{namespaceLabelKey: nsY}}})
policy := GenNetworkPolicyWithNameAndPodMatchLabel("allow-client-a-via-ns-selector", map[string]string{"pod": "a"}, SetSpecIngressRules(ingressRule))
@@ -241,6 +244,11 @@ var _ = common.SIGDescribe("Netpol", func() {
})
f.It("should enforce policy based on PodSelector with MatchExpressions", feature.NetworkPolicy, func(ctx context.Context) {
protocols := []v1.Protocol{protocolTCP}
ports := []int32{80}
k8s = initializeResources(ctx, f, protocols, ports)
nsX, _, _ := getK8sNamespaces(k8s)
allowedPods := metav1.LabelSelector{
MatchExpressions: []metav1.LabelSelectorRequirement{{
Key: "pod",
@@ -251,11 +259,6 @@ var _ = common.SIGDescribe("Netpol", func() {
ingressRule := networkingv1.NetworkPolicyIngressRule{}
ingressRule.From = append(ingressRule.From, networkingv1.NetworkPolicyPeer{PodSelector: &allowedPods})
policy := GenNetworkPolicyWithNameAndPodMatchLabel("x-a-allows-x-b", map[string]string{"pod": "a"}, SetSpecIngressRules(ingressRule))
protocols := []v1.Protocol{protocolTCP}
ports := []int32{80}
k8s = initializeResources(ctx, f, protocols, ports)
nsX, _, _ := getK8sNamespaces(k8s)
CreatePolicy(ctx, k8s, policy, nsX)
reachability := NewReachability(k8s.AllPodStrings(), true)
@@ -270,6 +273,7 @@ var _ = common.SIGDescribe("Netpol", func() {
ports := []int32{80}
k8s = initializeResources(ctx, f, protocols, ports)
nsX, nsY, nsZ := getK8sNamespaces(k8s)
allowedNamespaces := &metav1.LabelSelector{
MatchExpressions: []metav1.LabelSelectorRequirement{{
Key: namespaceLabelKey,
@@ -295,6 +299,7 @@ var _ = common.SIGDescribe("Netpol", func() {
ports := []int32{80}
k8s = initializeResources(ctx, f, protocols, ports)
nsX, _, _ := getK8sNamespaces(k8s)
allowedNamespaces := &metav1.LabelSelector{
MatchExpressions: []metav1.LabelSelectorRequirement{{
Key: namespaceLabelKey,
@@ -324,6 +329,7 @@ var _ = common.SIGDescribe("Netpol", func() {
ports := []int32{80}
k8s = initializeResources(ctx, f, protocols, ports)
nsX, nsY, nsZ := getK8sNamespaces(k8s)
allowedNamespaces := &metav1.LabelSelector{
MatchExpressions: []metav1.LabelSelectorRequirement{{
Key: namespaceLabelKey,
@@ -354,6 +360,7 @@ var _ = common.SIGDescribe("Netpol", func() {
ports := []int32{80}
k8s = initializeResources(ctx, f, protocols, ports)
nsX, nsY, nsZ := getK8sNamespaces(k8s)
allowedNamespaces := &metav1.LabelSelector{
MatchExpressions: []metav1.LabelSelectorRequirement{{
Key: namespaceLabelKey,
@@ -368,7 +375,6 @@ var _ = common.SIGDescribe("Netpol", func() {
Values: []string{"b", "c"},
}},
}
ingressRule := networkingv1.NetworkPolicyIngressRule{}
ingressRule.From = append(ingressRule.From, networkingv1.NetworkPolicyPeer{NamespaceSelector: allowedNamespaces, PodSelector: allowedPod})
policy := GenNetworkPolicyWithNameAndPodMatchLabel("allow-ns-y-z-pod-b-c", map[string]string{"pod": "a"}, SetSpecIngressRules(ingressRule))
@@ -387,6 +393,7 @@ var _ = common.SIGDescribe("Netpol", func() {
ports := []int32{80}
k8s = initializeResources(ctx, f, protocols, ports)
nsX, _, _ := getK8sNamespaces(k8s)
ingressRule := networkingv1.NetworkPolicyIngressRule{}
for _, label := range []map[string]string{{"pod": "b"}, {"pod": "c"}} {
ingressRule.From = append(ingressRule.From, networkingv1.NetworkPolicyPeer{PodSelector: &metav1.LabelSelector{MatchLabels: label}})
@@ -409,6 +416,7 @@ var _ = common.SIGDescribe("Netpol", func() {
ports := []int32{80}
k8s = initializeResources(ctx, f, protocols, ports)
nsX, nsY, _ := getK8sNamespaces(k8s)
allowedNamespaces := &metav1.LabelSelector{
MatchLabels: map[string]string{
namespaceLabelKey: nsY,
@@ -432,11 +440,12 @@ var _ = common.SIGDescribe("Netpol", func() {
})
f.It("should enforce policy based on Ports", feature.NetworkPolicy, func(ctx context.Context) {
ginkgo.By("Creating a network allowPort81Policy which only allows allow listed namespaces (y) to connect on exactly one port (81)")
protocols := []v1.Protocol{protocolTCP}
ports := []int32{81}
k8s = initializeResources(ctx, f, protocols, ports)
nsX, nsY, nsZ := getK8sNamespaces(k8s)
ginkgo.By("Creating a network allowPort81Policy which only allows allow listed namespaces (y) to connect on exactly one port (81)")
allowedLabels := &metav1.LabelSelector{
MatchLabels: map[string]string{
namespaceLabelKey: nsY,
@@ -457,11 +466,12 @@ var _ = common.SIGDescribe("Netpol", func() {
})
f.It("should enforce multiple, stacked policies with overlapping podSelectors", feature.NetworkPolicy, func(ctx context.Context) {
ginkgo.By("Creating a network allowPort81Policy which only allows allow listed namespaces (y) to connect on exactly one port (81)")
protocols := []v1.Protocol{protocolTCP}
ports := []int32{80, 81}
k8s = initializeResources(ctx, f, protocols, ports)
nsX, nsY, nsZ := getK8sNamespaces(k8s)
ginkgo.By("Creating a network allowPort81Policy which only allows allow listed namespaces (y) to connect on exactly one port (81)")
allowedLabels := &metav1.LabelSelector{
MatchLabels: map[string]string{
namespaceLabelKey: nsY,
@@ -490,7 +500,6 @@ var _ = common.SIGDescribe("Netpol", func() {
ingressRule = networkingv1.NetworkPolicyIngressRule{}
ingressRule.From = append(ingressRule.From, networkingv1.NetworkPolicyPeer{NamespaceSelector: allowedLabels})
ingressRule.Ports = append(ingressRule.Ports, networkingv1.NetworkPolicyPort{Port: &intstr.IntOrString{IntVal: 80}, Protocol: &protocolTCP})
allowPort80Policy := GenNetworkPolicyWithNameAndPodMatchLabel("allow-client-a-via-ns-selector-80", map[string]string{"pod": "a"}, SetSpecIngressRules(ingressRule))
CreatePolicy(ctx, k8s, allowPort80Policy, nsX)
@@ -499,12 +508,13 @@ var _ = common.SIGDescribe("Netpol", func() {
})
f.It("should support allow-all policy", feature.NetworkPolicy, func(ctx context.Context) {
ginkgo.By("Creating a network policy which allows all traffic.")
policy := GenNetworkPolicyWithNameAndPodMatchLabel("allow-all", map[string]string{}, SetSpecIngressRules(networkingv1.NetworkPolicyIngressRule{}))
protocols := []v1.Protocol{protocolTCP}
ports := []int32{80, 81}
k8s = initializeResources(ctx, f, protocols, ports)
nsX, _, _ := getK8sNamespaces(k8s)
ginkgo.By("Creating a network policy which allows all traffic.")
policy := GenNetworkPolicyWithNameAndPodMatchLabel("allow-all", map[string]string{}, SetSpecIngressRules(networkingv1.NetworkPolicyIngressRule{}))
CreatePolicy(ctx, k8s, policy, nsX)
ginkgo.By("Testing pods can connect to both ports when an 'allow-all' policy is present.")
@@ -514,16 +524,16 @@ var _ = common.SIGDescribe("Netpol", func() {
})
f.It("should allow ingress access on one named port", feature.NetworkPolicy, func(ctx context.Context) {
IngressRules := networkingv1.NetworkPolicyIngressRule{}
IngressRules.Ports = append(IngressRules.Ports, networkingv1.NetworkPolicyPort{Port: &intstr.IntOrString{Type: intstr.String, StrVal: "serve-81-tcp"}})
policy := GenNetworkPolicyWithNameAndPodMatchLabel("allow-all", map[string]string{}, SetSpecIngressRules(IngressRules))
protocols := []v1.Protocol{protocolTCP}
ports := []int32{80, 81}
k8s = initializeResources(ctx, f, protocols, ports)
nsX, _, _ := getK8sNamespaces(k8s)
CreatePolicy(ctx, k8s, policy, nsX)
ginkgo.By("Blocking all ports other then 81 in the entire namespace")
IngressRules := networkingv1.NetworkPolicyIngressRule{}
IngressRules.Ports = append(IngressRules.Ports, networkingv1.NetworkPolicyPort{Port: &intstr.IntOrString{Type: intstr.String, StrVal: "serve-81-tcp"}})
policy := GenNetworkPolicyWithNameAndPodMatchLabel("allow-all", map[string]string{}, SetSpecIngressRules(IngressRules))
CreatePolicy(ctx, k8s, policy, nsX)
reachabilityPort81 := NewReachability(k8s.AllPodStrings(), true)
ValidateOrFail(k8s, &TestCase{ToPort: 81, Protocol: v1.ProtocolTCP, Reachability: reachabilityPort81})
@@ -539,6 +549,7 @@ var _ = common.SIGDescribe("Netpol", func() {
ports := []int32{80, 81}
k8s = initializeResources(ctx, f, protocols, ports)
nsX, nsY, nsZ := getK8sNamespaces(k8s)
allowedLabels := &metav1.LabelSelector{
MatchLabels: map[string]string{
namespaceLabelKey: nsY,
@@ -565,15 +576,14 @@ var _ = common.SIGDescribe("Netpol", func() {
})
f.It("should allow egress access on one named port", feature.NetworkPolicy, func(ctx context.Context) {
ginkgo.By("validating egress from port 81 to port 80")
egressRule := networkingv1.NetworkPolicyEgressRule{}
egressRule.Ports = append(egressRule.Ports, networkingv1.NetworkPolicyPort{Port: &intstr.IntOrString{Type: intstr.String, StrVal: "serve-80-tcp"}})
policy := GenNetworkPolicyWithNameAndPodMatchLabel("allow-egress", map[string]string{}, SetSpecEgressRules(egressRule))
protocols := []v1.Protocol{protocolTCP}
ports := []int32{80, 81}
k8s = initializeResources(ctx, f, protocols, ports)
nsX, _, _ := getK8sNamespaces(k8s)
egressRule := networkingv1.NetworkPolicyEgressRule{}
egressRule.Ports = append(egressRule.Ports, networkingv1.NetworkPolicyPort{Port: &intstr.IntOrString{Type: intstr.String, StrVal: "serve-80-tcp"}})
policy := GenNetworkPolicyWithNameAndPodMatchLabel("allow-egress", map[string]string{}, SetSpecEgressRules(egressRule))
CreatePolicy(ctx, k8s, policy, nsX)
reachabilityPort80 := NewReachability(k8s.AllPodStrings(), true)
@@ -586,13 +596,14 @@ var _ = common.SIGDescribe("Netpol", func() {
})
f.It("should enforce updated policy", feature.NetworkPolicy, func(ctx context.Context) {
ginkgo.By("Using the simplest possible mutation: start with allow all, then switch to deny all")
// part 1) allow all
policy := GenNetworkPolicyWithNameAndPodMatchLabel("allow-all-mutate-to-deny-all", map[string]string{}, SetSpecIngressRules(networkingv1.NetworkPolicyIngressRule{}))
protocols := []v1.Protocol{protocolTCP}
ports := []int32{81}
k8s = initializeResources(ctx, f, protocols, ports)
nsX, _, _ := getK8sNamespaces(k8s)
ginkgo.By("Using the simplest possible mutation: start with allow all, then switch to deny all")
// part 1) allow all
policy := GenNetworkPolicyWithNameAndPodMatchLabel("allow-all-mutate-to-deny-all", map[string]string{}, SetSpecIngressRules(networkingv1.NetworkPolicyIngressRule{}))
CreatePolicy(ctx, k8s, policy, nsX)
reachability := NewReachability(k8s.AllPodStrings(), true)
@@ -672,6 +683,7 @@ var _ = common.SIGDescribe("Netpol", func() {
ports := []int32{80}
k8s = initializeResources(ctx, f, protocols, ports)
nsX, nsY, nsZ := getK8sNamespaces(k8s)
IngressRules := networkingv1.NetworkPolicyIngressRule{}
IngressRules.From = append(IngressRules.From, networkingv1.NetworkPolicyPeer{PodSelector: &metav1.LabelSelector{MatchLabels: map[string]string{}}})
policy := GenNetworkPolicyWithNameAndPodSelector("deny-empty-policy", metav1.LabelSelector{}, SetSpecIngressRules(IngressRules))
@@ -711,6 +723,7 @@ var _ = common.SIGDescribe("Netpol", func() {
ports := []int32{80}
k8s = initializeResources(ctx, f, protocols, ports)
nsX, _, _ := getK8sNamespaces(k8s)
policy := GenNetworkPolicyWithNameAndPodSelector("deny-egress-pod-a", metav1.LabelSelector{MatchLabels: map[string]string{"pod": "a"}}, SetSpecEgressRules())
CreatePolicy(ctx, k8s, policy, nsX)
@@ -725,6 +738,7 @@ var _ = common.SIGDescribe("Netpol", func() {
ports := []int32{80}
k8s = initializeResources(ctx, f, protocols, ports)
nsX, _, _ := getK8sNamespaces(k8s)
policy := GenNetworkPolicyWithNameAndPodSelector("deny-egress-ns-x", metav1.LabelSelector{}, SetSpecEgressRules())
CreatePolicy(ctx, k8s, policy, nsX)
@@ -735,6 +749,11 @@ var _ = common.SIGDescribe("Netpol", func() {
})
f.It("should work with Ingress, Egress specified together", feature.NetworkPolicy, func(ctx context.Context) {
protocols := []v1.Protocol{protocolTCP}
ports := []int32{80, 81}
k8s = initializeResources(ctx, f, protocols, ports)
nsX, _, _ := getK8sNamespaces(k8s)
allowedPodLabels := &metav1.LabelSelector{MatchLabels: map[string]string{"pod": "b"}}
ingressRule := networkingv1.NetworkPolicyIngressRule{}
ingressRule.From = append(ingressRule.From, networkingv1.NetworkPolicyPeer{PodSelector: allowedPodLabels})
@@ -752,10 +771,6 @@ var _ = common.SIGDescribe("Netpol", func() {
},
}
policy.Spec.PolicyTypes = []networkingv1.PolicyType{networkingv1.PolicyTypeEgress, networkingv1.PolicyTypeIngress}
protocols := []v1.Protocol{protocolTCP}
ports := []int32{80, 81}
k8s = initializeResources(ctx, f, protocols, ports)
nsX, _, _ := getK8sNamespaces(k8s)
CreatePolicy(ctx, k8s, policy, nsX)
reachabilityPort80 := NewReachability(k8s.AllPodStrings(), true)
@@ -873,6 +888,7 @@ var _ = common.SIGDescribe("Netpol", func() {
ports := []int32{80}
k8s = initializeResources(ctx, f, protocols, ports)
nsX, nsY, _ := getK8sNamespaces(k8s)
allowedNamespaces := &metav1.LabelSelector{
MatchLabels: map[string]string{
namespaceLabelKey: nsY,
@@ -899,6 +915,7 @@ var _ = common.SIGDescribe("Netpol", func() {
ports := []int32{80}
k8s = initializeResources(ctx, f, protocols, ports)
nsX, _, _ := getK8sNamespaces(k8s)
ingressRule := networkingv1.NetworkPolicyIngressRule{}
ingressRule.Ports = append(ingressRule.Ports, networkingv1.NetworkPolicyPort{Protocol: &protocolTCP})
policy := GenNetworkPolicyWithNameAndPodMatchLabel("allow-ingress-by-proto", map[string]string{"pod": "a"}, SetSpecIngressRules(ingressRule))
@@ -917,6 +934,7 @@ var _ = common.SIGDescribe("Netpol", func() {
ports := []int32{81}
k8s = initializeResources(ctx, f, protocols, ports)
nsX, _, _ := getK8sNamespaces(k8s)
IngressRules := networkingv1.NetworkPolicyIngressRule{}
IngressRules.Ports = append(IngressRules.Ports, networkingv1.NetworkPolicyPort{Port: &intstr.IntOrString{Type: intstr.Int, IntVal: 80}})
policyAllowOnlyPort80 := GenNetworkPolicyWithNameAndPodMatchLabel("allow-ingress-port-80", map[string]string{}, SetSpecIngressRules(IngressRules))
@@ -938,13 +956,14 @@ var _ = common.SIGDescribe("Netpol", func() {
})
f.It("should enforce multiple egress policies with egress allow-all policy taking precedence", feature.NetworkPolicy, func(ctx context.Context) {
egressRule := networkingv1.NetworkPolicyEgressRule{}
egressRule.Ports = append(egressRule.Ports, networkingv1.NetworkPolicyPort{Port: &intstr.IntOrString{Type: intstr.Int, IntVal: 80}})
policyAllowPort80 := GenNetworkPolicyWithNameAndPodMatchLabel("allow-egress-port-80", map[string]string{}, SetSpecEgressRules(egressRule))
protocols := []v1.Protocol{protocolTCP}
ports := []int32{81}
k8s = initializeResources(ctx, f, protocols, ports)
nsX, _, _ := getK8sNamespaces(k8s)
egressRule := networkingv1.NetworkPolicyEgressRule{}
egressRule.Ports = append(egressRule.Ports, networkingv1.NetworkPolicyPort{Port: &intstr.IntOrString{Type: intstr.Int, IntVal: 80}})
policyAllowPort80 := GenNetworkPolicyWithNameAndPodMatchLabel("allow-egress-port-80", map[string]string{}, SetSpecEgressRules(egressRule))
CreatePolicy(ctx, k8s, policyAllowPort80, nsX)
ginkgo.By("Making sure ingress doesn't work other than port 80")
@@ -963,14 +982,14 @@ var _ = common.SIGDescribe("Netpol", func() {
})
f.It("should stop enforcing policies after they are deleted", feature.NetworkPolicy, func(ctx context.Context) {
ginkgo.By("Creating a network policy for the server which denies all traffic.")
// Deny all traffic into and out of "x".
policy := GenNetworkPolicyWithNameAndPodSelector("deny-all", metav1.LabelSelector{}, SetSpecIngressRules(), SetSpecEgressRules())
protocols := []v1.Protocol{protocolTCP}
ports := []int32{80}
k8s = initializeResources(ctx, f, protocols, ports)
nsX, _, _ := getK8sNamespaces(k8s)
ginkgo.By("Creating a network policy for the server which denies all traffic.")
// Deny all traffic into and out of "x".
policy := GenNetworkPolicyWithNameAndPodSelector("deny-all", metav1.LabelSelector{}, SetSpecIngressRules(), SetSpecEgressRules())
CreatePolicy(ctx, k8s, policy, nsX)
reachability := NewReachability(k8s.AllPodStrings(), true)
@@ -996,6 +1015,7 @@ var _ = common.SIGDescribe("Netpol", func() {
ports := []int32{80}
k8s = initializeResources(ctx, f, protocols, ports)
nsX, nsY, _ := getK8sNamespaces(k8s)
podList, err := f.ClientSet.CoreV1().Pods(nsY).List(ctx, metav1.ListOptions{LabelSelector: "pod=b"})
framework.ExpectNoError(err, "Failing to list pods in namespace y")
pod := podList.Items[0]
@@ -1018,12 +1038,12 @@ var _ = common.SIGDescribe("Netpol", func() {
})
f.It("should enforce except clause while egress access to server in CIDR block", feature.NetworkPolicy, func(ctx context.Context) {
// Getting podServer's status to get podServer's IP, to create the CIDR with except clause
protocols := []v1.Protocol{protocolTCP}
ports := []int32{80}
k8s = initializeResources(ctx, f, protocols, ports)
nsX, _, _ := getK8sNamespaces(k8s)
// Getting podServer's status to get podServer's IP, to create the CIDR with except clause
podList, err := f.ClientSet.CoreV1().Pods(nsX).List(ctx, metav1.ListOptions{LabelSelector: "pod=b"})
framework.ExpectNoError(err, "Failing to find pod x/b")
podB := podList.Items[0]
@@ -1051,12 +1071,12 @@ var _ = common.SIGDescribe("Netpol", func() {
})
f.It("should ensure an IP overlapping both IPBlock.CIDR and IPBlock.Except is allowed", feature.NetworkPolicy, func(ctx context.Context) {
// Getting podServer's status to get podServer's IP, to create the CIDR with except clause
protocols := []v1.Protocol{protocolTCP}
ports := []int32{80}
k8s = initializeResources(ctx, f, protocols, ports)
nsX, _, _ := getK8sNamespaces(k8s)
// Getting podServer's status to get podServer's IP, to create the CIDR with except clause
podList, err := f.ClientSet.CoreV1().Pods(nsX).List(ctx, metav1.ListOptions{LabelSelector: "pod=b"})
framework.ExpectNoError(err, "Failing to find pod x/b")
podB := podList.Items[0]
@@ -1098,6 +1118,11 @@ var _ = common.SIGDescribe("Netpol", func() {
})
f.It("should enforce policies to check ingress and egress policies can be controlled independently based on PodSelector", feature.NetworkPolicy, func(ctx context.Context) {
protocols := []v1.Protocol{protocolTCP}
ports := []int32{80}
k8s = initializeResources(ctx, f, protocols, ports)
nsX, _, _ := getK8sNamespaces(k8s)
/*
Test steps:
1. Verify every pod in every namespace can talk to each other
@@ -1112,10 +1137,6 @@ var _ = common.SIGDescribe("Netpol", func() {
allowEgressPolicy := GenNetworkPolicyWithNameAndPodSelector("allow-egress-for-target",
metav1.LabelSelector{MatchLabels: targetLabels}, SetSpecEgressRules(networkingv1.NetworkPolicyEgressRule{}))
protocols := []v1.Protocol{protocolTCP}
ports := []int32{80}
k8s = initializeResources(ctx, f, protocols, ports)
nsX, _, _ := getK8sNamespaces(k8s)
CreatePolicy(ctx, k8s, allowEgressPolicy, nsX)
allowEgressReachability := NewReachability(k8s.AllPodStrings(), true)
@@ -1161,14 +1182,15 @@ var _ = common.SIGDescribe("Netpol", func() {
// security hole if you fail this test, because you are allowing TCP
// traffic that is supposed to be blocked.
f.It("should properly isolate pods that are selected by a policy allowing SCTP, even if the plugin doesn't support SCTP", feature.NetworkPolicy, func(ctx context.Context) {
ginkgo.By("Creating a network policy for the server which allows traffic only via SCTP on port 80.")
ingressRule := networkingv1.NetworkPolicyIngressRule{}
ingressRule.Ports = append(ingressRule.Ports, networkingv1.NetworkPolicyPort{Port: &intstr.IntOrString{IntVal: 80}, Protocol: &protocolSCTP})
policy := GenNetworkPolicyWithNameAndPodMatchLabel("allow-only-sctp-ingress-on-port-80", map[string]string{"pod": "a"}, SetSpecIngressRules(ingressRule))
protocols := []v1.Protocol{protocolTCP}
ports := []int32{81}
k8s = initializeResources(ctx, f, protocols, ports)
nsX, _, _ := getK8sNamespaces(k8s)
ginkgo.By("Creating a network policy for the server which allows traffic only via SCTP on port 80.")
ingressRule := networkingv1.NetworkPolicyIngressRule{}
ingressRule.Ports = append(ingressRule.Ports, networkingv1.NetworkPolicyPort{Port: &intstr.IntOrString{IntVal: 80}, Protocol: &protocolSCTP})
policy := GenNetworkPolicyWithNameAndPodMatchLabel("allow-only-sctp-ingress-on-port-80", map[string]string{"pod": "a"}, SetSpecIngressRules(ingressRule))
CreatePolicy(ctx, k8s, policy, nsX)
ginkgo.By("Trying to connect to TCP port 81, which should be blocked by implicit isolation.")
@@ -1178,13 +1200,14 @@ var _ = common.SIGDescribe("Netpol", func() {
})
f.It("should not allow access by TCP when a policy specifies only UDP", feature.NetworkPolicy, func(ctx context.Context) {
ingressRule := networkingv1.NetworkPolicyIngressRule{}
ingressRule.Ports = append(ingressRule.Ports, networkingv1.NetworkPolicyPort{Port: &intstr.IntOrString{IntVal: 81}, Protocol: &protocolUDP})
policy := GenNetworkPolicyWithNameAndPodMatchLabel("allow-only-udp-ingress-on-port-81", map[string]string{"pod": "a"}, SetSpecIngressRules(ingressRule))
protocols := []v1.Protocol{protocolTCP}
ports := []int32{81}
k8s = initializeResources(ctx, f, protocols, ports)
nsX, _, _ := getK8sNamespaces(k8s)
ingressRule := networkingv1.NetworkPolicyIngressRule{}
ingressRule.Ports = append(ingressRule.Ports, networkingv1.NetworkPolicyPort{Port: &intstr.IntOrString{IntVal: 81}, Protocol: &protocolUDP})
policy := GenNetworkPolicyWithNameAndPodMatchLabel("allow-only-udp-ingress-on-port-81", map[string]string{"pod": "a"}, SetSpecIngressRules(ingressRule))
CreatePolicy(ctx, k8s, policy, nsX)
ginkgo.By("Creating a network policy for the server which allows traffic only via UDP on port 81.")
@@ -1201,6 +1224,7 @@ var _ = common.SIGDescribe("Netpol", func() {
ports := []int32{80}
k8s = initializeResources(ctx, f, protocols, ports)
nsX, nsY, nsZ := getK8sNamespaces(k8s)
allowedLabels := &metav1.LabelSelector{
MatchLabels: map[string]string{
v1.LabelMetadataName: nsY,
@@ -1224,6 +1248,7 @@ var _ = common.SIGDescribe("Netpol", func() {
ports := []int32{80}
k8s = initializeResources(ctx, f, protocols, ports)
nsX, nsY, _ := getK8sNamespaces(k8s)
allowedNamespaces := &metav1.LabelSelector{
MatchExpressions: []metav1.LabelSelectorRequirement{{
Key: v1.LabelMetadataName,
@@ -1260,6 +1285,7 @@ var _ = common.SIGDescribe("Netpol [LinuxOnly]", func() {
ports := []int32{80}
k8s = initializeResources(ctx, f, protocols, ports)
nsX, _, _ := getK8sNamespaces(k8s)
policy := GenNetworkPolicyWithNameAndPodSelector("deny-all", metav1.LabelSelector{}, SetSpecIngressRules())
CreatePolicy(ctx, k8s, policy, nsX)
@@ -1270,17 +1296,17 @@ var _ = common.SIGDescribe("Netpol [LinuxOnly]", func() {
})
f.It("should enforce policy based on Ports", feature.NetworkPolicy, func(ctx context.Context) {
ginkgo.By("Creating a network policy allowPort81Policy which only allows allow listed namespaces (y) to connect on exactly one port (81)")
protocols := []v1.Protocol{protocolUDP}
ports := []int32{81}
k8s = initializeResources(ctx, f, protocols, ports)
nsX, nsY, nsZ := getK8sNamespaces(k8s)
ginkgo.By("Creating a network policy allowPort81Policy which only allows allow listed namespaces (y) to connect on exactly one port (81)")
allowedLabels := &metav1.LabelSelector{
MatchLabels: map[string]string{
namespaceLabelKey: nsY,
},
}
ingressRule := networkingv1.NetworkPolicyIngressRule{}
ingressRule.From = append(ingressRule.From, networkingv1.NetworkPolicyPeer{NamespaceSelector: allowedLabels})
ingressRule.Ports = append(ingressRule.Ports, networkingv1.NetworkPolicyPort{Port: &intstr.IntOrString{IntVal: 81}, Protocol: &protocolUDP})
@@ -1299,6 +1325,7 @@ var _ = common.SIGDescribe("Netpol [LinuxOnly]", func() {
ports := []int32{80}
k8s = initializeResources(ctx, f, protocols, ports)
nsX, nsY, _ := getK8sNamespaces(k8s)
allowedNamespaces := &metav1.LabelSelector{
MatchLabels: map[string]string{
namespaceLabelKey: nsY,
@@ -1329,7 +1356,7 @@ var _ = common.SIGDescribe("Netpol", feature.SCTPConnectivity, "[LinuxOnly]", fu
f.NamespacePodSecurityLevel = admissionapi.LevelBaseline
var k8s *kubeManager
ginkgo.BeforeEach(func() {
// Windows does not support network policies.
// Windows does not support SCTP
e2eskipper.SkipIfNodeOSDistroIs("windows")
})
@@ -1340,6 +1367,7 @@ var _ = common.SIGDescribe("Netpol", feature.SCTPConnectivity, "[LinuxOnly]", fu
ports := []int32{80}
k8s = initializeResources(ctx, f, protocols, ports)
nsX, _, _ := getK8sNamespaces(k8s)
policy := GenNetworkPolicyWithNameAndPodSelector("deny-all", metav1.LabelSelector{}, SetSpecIngressRules())
CreatePolicy(ctx, k8s, policy, nsX)
@@ -1350,11 +1378,12 @@ var _ = common.SIGDescribe("Netpol", feature.SCTPConnectivity, "[LinuxOnly]", fu
})
f.It("should enforce policy based on Ports", feature.NetworkPolicy, func(ctx context.Context) {
ginkgo.By("Creating a network allowPort81Policy which only allows allow listed namespaces (y) to connect on exactly one port (81)")
protocols := []v1.Protocol{protocolSCTP}
ports := []int32{81}
k8s = initializeResources(ctx, f, protocols, ports)
nsX, nsY, nsZ := getK8sNamespaces(k8s)
ginkgo.By("Creating a network allowPort81Policy which only allows allow listed namespaces (y) to connect on exactly one port (81)")
allowedLabels := &metav1.LabelSelector{
MatchLabels: map[string]string{
namespaceLabelKey: nsY,
@@ -1378,6 +1407,7 @@ var _ = common.SIGDescribe("Netpol", feature.SCTPConnectivity, "[LinuxOnly]", fu
ports := []int32{80}
k8s = initializeResources(ctx, f, protocols, ports)
nsX, nsY, _ := getK8sNamespaces(k8s)
allowedNamespaces := &metav1.LabelSelector{
MatchLabels: map[string]string{
namespaceLabelKey: nsY,
@@ -1402,10 +1432,10 @@ var _ = common.SIGDescribe("Netpol", feature.SCTPConnectivity, "[LinuxOnly]", fu
})
})
// getNamespaceBaseNames returns the set of base namespace names used by this test, taking a root ns as input.
// getNamespaceNames returns the set of base namespace names used by this test, taking a root ns as input.
// The framework will also append a unique suffix when creating the namespaces.
// This allows tests to run in parallel.
func getNamespaceBaseNames(rootNs string) []string {
func getNamespaceNames(rootNs string) []string {
if rootNs != "" {
rootNs += "-"
}
@@ -1418,9 +1448,6 @@ func getNamespaceBaseNames(rootNs string) []string {
// defaultModel creates a new "model" pod system under namespaces (x,y,z) which has pods a, b, and c. Thus resulting in the
// truth table matrix that is identical for all tests, comprising 81 total connections between 9 pods (x/a, x/b, x/c, ..., z/c).
func defaultModel(namespaces []string, protocols []v1.Protocol, ports []int32) *Model {
if framework.NodeOSDistroIs("windows") {
return NewWindowsModel(namespaces, []string{"a", "b", "c"}, ports)
}
return NewModel(namespaces, []string{"a", "b", "c"}, ports, protocols)
}
@@ -1436,9 +1463,9 @@ func initializeCluster(ctx context.Context, f *framework.Framework, protocols []
k8s := newKubeManager(f, dnsDomain)
rootNs := f.BaseName
namespaceBaseNames := getNamespaceBaseNames(rootNs)
namespaceNames := getNamespaceNames(rootNs)
model := defaultModel(namespaceBaseNames, protocols, ports)
model := defaultModel(namespaceNames, protocols, ports)
framework.Logf("initializing cluster: ensuring namespaces, pods and services exist and are ready")