test(networkpolicy): add comprehensive helm-unittest test suite
Add 20+ unit tests for NetworkPolicy template covering: Creation conditions: - Not created by default (enabled: false) - Created when enabled: true - Fails with clear error when hostNetwork + NetworkPolicy enabled - Fails when DLNA + NetworkPolicy enabled Ingress rules: - Default allowExternal behavior (no 'from' restriction) - Restricted access with podSelector/namespaceSelector - Custom ingress rules application - Automatic Prometheus ingress when metrics enabled - Prometheus namespace selector when specified Egress rules: - DNS egress with default kube-system/kube-dns - Custom DNS namespace and pod selector - AllowAllEgress default behavior - Restricted egress modes (metadata, in-cluster) - Custom CIDR blocks - Custom egress rules application - DNS disabled scenario Policy configuration: - Correct policyTypes (Ingress, Egress) - Pod selector labels matching chart labels Tests ensure NetworkPolicy works correctly across all supported configurations and fails safely when misconfigured. Co-Authored-By: Claude <noreply@anthropic.com> Signed-off-by: Aleksei Sviridkin <f@lex.la>
This commit is contained in:
1 parent
32494dd1fd
commit
aaa9c91a8e
1 file changed
+297
@@ -0,0 +1,297 @@
|
|||||||
|
suite: test networkpolicy
|
||||||
|
templates:
|
||||||
|
- networkpolicy.yaml
|
||||||
|
tests:
|
||||||
|
- it: should not create NetworkPolicy by default
|
||||||
|
asserts:
|
||||||
|
- hasDocuments:
|
||||||
|
count: 0
|
||||||
|
|
||||||
|
- it: should create NetworkPolicy when enabled
|
||||||
|
set:
|
||||||
|
networkPolicy.enabled: true
|
||||||
|
asserts:
|
||||||
|
- hasDocuments:
|
||||||
|
count: 1
|
||||||
|
- isKind:
|
||||||
|
of: NetworkPolicy
|
||||||
|
- isAPIVersion:
|
||||||
|
of: networking.k8s.io/v1
|
||||||
|
- equal:
|
||||||
|
path: metadata.name
|
||||||
|
value: RELEASE-NAME-jellyfin
|
||||||
|
|
||||||
|
- it: should fail when NetworkPolicy enabled with DLNA
|
||||||
|
set:
|
||||||
|
networkPolicy.enabled: true
|
||||||
|
jellyfin.enableDLNA: true
|
||||||
|
asserts:
|
||||||
|
- failedTemplate:
|
||||||
|
errorMessage: "NetworkPolicy cannot be enabled when hostNetwork is enabled"
|
||||||
|
|
||||||
|
- it: should fail when NetworkPolicy enabled with hostNetwork
|
||||||
|
set:
|
||||||
|
networkPolicy.enabled: true
|
||||||
|
podPrivileges.hostNetwork: true
|
||||||
|
asserts:
|
||||||
|
- failedTemplate:
|
||||||
|
errorMessage: "NetworkPolicy cannot be enabled when hostNetwork is enabled"
|
||||||
|
|
||||||
|
- it: should have both Ingress and Egress policy types by default
|
||||||
|
set:
|
||||||
|
networkPolicy.enabled: true
|
||||||
|
asserts:
|
||||||
|
- contains:
|
||||||
|
path: spec.policyTypes
|
||||||
|
content: Ingress
|
||||||
|
- contains:
|
||||||
|
path: spec.policyTypes
|
||||||
|
content: Egress
|
||||||
|
|
||||||
|
- it: should allow external ingress by default
|
||||||
|
set:
|
||||||
|
networkPolicy.enabled: true
|
||||||
|
asserts:
|
||||||
|
- isNotNull:
|
||||||
|
path: spec.ingress
|
||||||
|
# When allowExternal is true, there should be no 'from' in first ingress rule
|
||||||
|
- isNull:
|
||||||
|
path: spec.ingress[0].from
|
||||||
|
|
||||||
|
- it: should restrict ingress when allowExternal is false
|
||||||
|
set:
|
||||||
|
networkPolicy.enabled: true
|
||||||
|
networkPolicy.ingress.allowExternal: false
|
||||||
|
networkPolicy.ingress.podSelector:
|
||||||
|
matchLabels:
|
||||||
|
app: test
|
||||||
|
asserts:
|
||||||
|
- isNotNull:
|
||||||
|
path: spec.ingress[0].from
|
||||||
|
- equal:
|
||||||
|
path: spec.ingress[0].from[0].podSelector.matchLabels.app
|
||||||
|
value: test
|
||||||
|
|
||||||
|
- it: should add namespace selector for ingress when specified
|
||||||
|
set:
|
||||||
|
networkPolicy.enabled: true
|
||||||
|
networkPolicy.ingress.allowExternal: false
|
||||||
|
networkPolicy.ingress.namespaceSelector:
|
||||||
|
matchLabels:
|
||||||
|
name: frontend
|
||||||
|
asserts:
|
||||||
|
- equal:
|
||||||
|
path: spec.ingress[0].from[0].namespaceSelector.matchLabels.name
|
||||||
|
value: frontend
|
||||||
|
|
||||||
|
- it: should create Prometheus ingress rule when metrics enabled
|
||||||
|
set:
|
||||||
|
networkPolicy.enabled: true
|
||||||
|
metrics.enabled: true
|
||||||
|
metrics.serviceMonitor.enabled: true
|
||||||
|
metrics.serviceMonitor.port: 8096
|
||||||
|
asserts:
|
||||||
|
- contains:
|
||||||
|
path: spec.ingress
|
||||||
|
content:
|
||||||
|
ports:
|
||||||
|
- protocol: TCP
|
||||||
|
port: 8096
|
||||||
|
from:
|
||||||
|
- podSelector:
|
||||||
|
app.kubernetes.io/name: prometheus
|
||||||
|
|
||||||
|
- it: should add Prometheus namespace selector when specified
|
||||||
|
set:
|
||||||
|
networkPolicy.enabled: true
|
||||||
|
metrics.enabled: true
|
||||||
|
metrics.serviceMonitor.enabled: true
|
||||||
|
networkPolicy.metrics.namespace: monitoring
|
||||||
|
asserts:
|
||||||
|
- isNotNull:
|
||||||
|
path: spec.ingress[1].from[0].namespaceSelector
|
||||||
|
- equal:
|
||||||
|
path: spec.ingress[1].from[0].namespaceSelector.matchLabels.kubernetes.io/metadata.name
|
||||||
|
value: monitoring
|
||||||
|
|
||||||
|
- it: should add custom ingress rules
|
||||||
|
set:
|
||||||
|
networkPolicy.enabled: true
|
||||||
|
networkPolicy.ingress.customRules:
|
||||||
|
- from:
|
||||||
|
- namespaceSelector:
|
||||||
|
matchLabels:
|
||||||
|
name: custom
|
||||||
|
ports:
|
||||||
|
- protocol: TCP
|
||||||
|
port: 9999
|
||||||
|
asserts:
|
||||||
|
- contains:
|
||||||
|
path: spec.ingress
|
||||||
|
content:
|
||||||
|
from:
|
||||||
|
- namespaceSelector:
|
||||||
|
matchLabels:
|
||||||
|
name: custom
|
||||||
|
ports:
|
||||||
|
- protocol: TCP
|
||||||
|
port: 9999
|
||||||
|
|
||||||
|
- it: should allow DNS egress by default
|
||||||
|
set:
|
||||||
|
networkPolicy.enabled: true
|
||||||
|
asserts:
|
||||||
|
- contains:
|
||||||
|
path: spec.egress
|
||||||
|
content:
|
||||||
|
to:
|
||||||
|
- namespaceSelector:
|
||||||
|
matchLabels:
|
||||||
|
kubernetes.io/metadata.name: kube-system
|
||||||
|
podSelector:
|
||||||
|
matchLabels:
|
||||||
|
k8s-app: kube-dns
|
||||||
|
ports:
|
||||||
|
- protocol: UDP
|
||||||
|
port: 53
|
||||||
|
- protocol: TCP
|
||||||
|
port: 53
|
||||||
|
|
||||||
|
- it: should allow custom DNS namespace
|
||||||
|
set:
|
||||||
|
networkPolicy.enabled: true
|
||||||
|
networkPolicy.egress.dnsNamespace: custom-dns-ns
|
||||||
|
asserts:
|
||||||
|
- equal:
|
||||||
|
path: spec.egress[0].to[0].namespaceSelector.matchLabels.kubernetes.io/metadata.name
|
||||||
|
value: custom-dns-ns
|
||||||
|
|
||||||
|
- it: should allow custom DNS pod selector
|
||||||
|
set:
|
||||||
|
networkPolicy.enabled: true
|
||||||
|
networkPolicy.egress.dnsPodSelector:
|
||||||
|
k8s-app: coredns
|
||||||
|
asserts:
|
||||||
|
- equal:
|
||||||
|
path: spec.egress[0].to[0].podSelector.matchLabels.k8s-app
|
||||||
|
value: coredns
|
||||||
|
|
||||||
|
- it: should allow all egress by default
|
||||||
|
set:
|
||||||
|
networkPolicy.enabled: true
|
||||||
|
asserts:
|
||||||
|
- contains:
|
||||||
|
path: spec.egress
|
||||||
|
content:
|
||||||
|
to:
|
||||||
|
- ipBlock:
|
||||||
|
cidr: 0.0.0.0/0
|
||||||
|
|
||||||
|
- it: should not allow all egress when allowAllEgress is false
|
||||||
|
set:
|
||||||
|
networkPolicy.enabled: true
|
||||||
|
networkPolicy.egress.allowAllEgress: false
|
||||||
|
asserts:
|
||||||
|
- notContains:
|
||||||
|
path: spec.egress
|
||||||
|
content:
|
||||||
|
to:
|
||||||
|
- ipBlock:
|
||||||
|
cidr: 0.0.0.0/0
|
||||||
|
|
||||||
|
- it: should allow HTTPS when restrictedEgress.allowMetadata is true
|
||||||
|
set:
|
||||||
|
networkPolicy.enabled: true
|
||||||
|
networkPolicy.egress.allowAllEgress: false
|
||||||
|
networkPolicy.egress.restrictedEgress.allowMetadata: true
|
||||||
|
asserts:
|
||||||
|
- contains:
|
||||||
|
path: spec.egress
|
||||||
|
content:
|
||||||
|
to:
|
||||||
|
- ipBlock:
|
||||||
|
cidr: 0.0.0.0/0
|
||||||
|
ports:
|
||||||
|
- protocol: TCP
|
||||||
|
port: 443
|
||||||
|
|
||||||
|
- it: should allow in-cluster communication when restrictedEgress.allowInCluster is true
|
||||||
|
set:
|
||||||
|
networkPolicy.enabled: true
|
||||||
|
networkPolicy.egress.allowAllEgress: false
|
||||||
|
networkPolicy.egress.restrictedEgress.allowInCluster: true
|
||||||
|
asserts:
|
||||||
|
- contains:
|
||||||
|
path: spec.egress
|
||||||
|
content:
|
||||||
|
to:
|
||||||
|
- podSelector: {}
|
||||||
|
|
||||||
|
- it: should add custom CIDR blocks
|
||||||
|
set:
|
||||||
|
networkPolicy.enabled: true
|
||||||
|
networkPolicy.egress.allowAllEgress: false
|
||||||
|
networkPolicy.egress.restrictedEgress.allowedCIDRs:
|
||||||
|
- 10.0.0.0/8
|
||||||
|
- 192.168.0.0/16
|
||||||
|
asserts:
|
||||||
|
- contains:
|
||||||
|
path: spec.egress
|
||||||
|
content:
|
||||||
|
to:
|
||||||
|
- ipBlock:
|
||||||
|
cidr: 10.0.0.0/8
|
||||||
|
- contains:
|
||||||
|
path: spec.egress
|
||||||
|
content:
|
||||||
|
to:
|
||||||
|
- ipBlock:
|
||||||
|
cidr: 192.168.0.0/16
|
||||||
|
|
||||||
|
- it: should add custom egress rules
|
||||||
|
set:
|
||||||
|
networkPolicy.enabled: true
|
||||||
|
networkPolicy.egress.customRules:
|
||||||
|
- to:
|
||||||
|
- podSelector:
|
||||||
|
matchLabels:
|
||||||
|
app: database
|
||||||
|
ports:
|
||||||
|
- protocol: TCP
|
||||||
|
port: 5432
|
||||||
|
asserts:
|
||||||
|
- contains:
|
||||||
|
path: spec.egress
|
||||||
|
content:
|
||||||
|
to:
|
||||||
|
- podSelector:
|
||||||
|
matchLabels:
|
||||||
|
app: database
|
||||||
|
ports:
|
||||||
|
- protocol: TCP
|
||||||
|
port: 5432
|
||||||
|
|
||||||
|
- it: should not create DNS egress when allowDNS is false
|
||||||
|
set:
|
||||||
|
networkPolicy.enabled: true
|
||||||
|
networkPolicy.egress.allowDNS: false
|
||||||
|
asserts:
|
||||||
|
- notContains:
|
||||||
|
path: spec.egress
|
||||||
|
content:
|
||||||
|
ports:
|
||||||
|
- protocol: UDP
|
||||||
|
port: 53
|
||||||
|
- protocol: TCP
|
||||||
|
port: 53
|
||||||
|
|
||||||
|
- it: should use correct pod selector labels
|
||||||
|
set:
|
||||||
|
networkPolicy.enabled: true
|
||||||
|
asserts:
|
||||||
|
- equal:
|
||||||
|
path: spec.podSelector.matchLabels.app\.kubernetes\.io/name
|
||||||
|
value: jellyfin
|
||||||
|
- equal:
|
||||||
|
path: spec.podSelector.matchLabels.app\.kubernetes\.io/instance
|
||||||
|
value: RELEASE-NAME
|
||||||
Reference in new issue
Block a user