Skip to content

Commit 6c3c065

Browse files
kwiatekuspPrecel
andauthored
Test serverless with strict central network policies (#1533)
Co-authored-by: Filip Strozik <[email protected]>
1 parent c3c4cb6 commit 6c3c065

File tree

18 files changed

+362
-1
lines changed

18 files changed

+362
-1
lines changed
+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
name: 'Apply extra test fixture'
2+
description: 'Apply extra test fixture'
3+
4+
inputs:
5+
fixture_path:
6+
description: 'Path pointing to a folder containing manifests to apply (relative to project root)'
7+
required: true
8+
9+
runs:
10+
using: 'composite'
11+
steps:
12+
- name: Apply fixture
13+
run: |
14+
kubectl apply -f ${{ inputs.fixture_path }}
15+
shell: bash
16+

.github/workflows/_integration-tests.yaml

+15
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@ jobs:
2424
repository: ${{ github.event.pull_request.head.repo.full_name }}
2525
- uses: ./.github/actions/setup-go
2626
- uses: ./.github/actions/create-k3d-cluster
27+
- uses: actions/with-fixture
28+
with:
29+
fixture_path: tests/with-fixture/strict-network-policies
2730
- name: run test
2831
run: |
2932
make -C components/operator deploy
@@ -43,6 +46,9 @@ jobs:
4346
repository: ${{ github.event.pull_request.head.repo.full_name }}
4447
- uses: ./.github/actions/setup-go
4548
- uses: ./.github/actions/create-k3d-cluster
49+
- uses: actions/with-fixture
50+
with:
51+
fixture_path: tests/with-fixture/strict-network-policies
4652
- name: run test
4753
run: |
4854
make install-buildless-serverless-custom-operator
@@ -61,6 +67,9 @@ jobs:
6167
repository: ${{ github.event.pull_request.head.repo.full_name }}
6268
- uses: ./.github/actions/setup-go
6369
- uses: ./.github/actions/create-k3d-cluster
70+
- uses: actions/with-fixture
71+
with:
72+
fixture_path: tests/with-fixture/strict-network-policies
6473
- name: run test
6574
run: |
6675
make install-serverless-custom-operator
@@ -79,6 +88,9 @@ jobs:
7988
repository: ${{ github.event.pull_request.head.repo.full_name }}
8089
- uses: ./.github/actions/setup-go
8190
- uses: ./.github/actions/create-k3d-cluster
91+
- uses: actions/with-fixture
92+
with:
93+
fixture_path: tests/with-fixture/strict-network-policies
8294
- name: run tests
8395
run: |
8496
make install-serverless-custom-operator
@@ -116,6 +128,9 @@ jobs:
116128
btp_kyma_plan: '${{ secrets.BTP_KYMA_PLAN }}'
117129
btp_kyma_modules: "[]"
118130
btp_kyma_autoscaler_min: 4
131+
- uses: actions/with-fixture
132+
with:
133+
fixture_path: tests/with-fixture/strict-network-policies
119134
- name: run tests
120135
run: |
121136
make install-serverless-custom-operator

components/operator/controllers/serverless_controller_rbac.go

+2
Original file line numberDiff line numberDiff line change
@@ -36,3 +36,5 @@ package controllers
3636

3737
//+kubebuilder:rbac:groups=coordination.k8s.io,resources=leases,verbs=get;list;watch;create;update;patch;delete;deletecollection
3838
//+kubebuilder:rbac:groups=scheduling.k8s.io,resources=priorityclasses,verbs=get;list;watch;create;update;patch;delete;deletecollection
39+
40+
//+kubebuilder:rbac:groups=networking.k8s.io,resources=networkpolicies,verbs=get;list;watch;create;update;patch;delete;deletecollection

config/buildless-serverless/templates/deployment.yaml

+3
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@ spec:
2020
sidecar.istio.io/inject: "false"
2121
labels:
2222
control-plane: controller-manager
23+
networking.kyma-project.io/to-apiserver: allowed
24+
networking.kyma-project.io/from-serverless: allowed
25+
kyma-project.io/module: serverless
2326
spec:
2427
containers:
2528
- args:
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
kind: NetworkPolicy
2+
apiVersion: networking.k8s.io/v1
3+
metadata:
4+
namespace: {{ .Release.Namespace }}
5+
name: serverless.kyma-project.io--allow-all-egress-from-controllers
6+
spec:
7+
podSelector:
8+
matchLabels:
9+
kyma-project.io/module: serverless
10+
networking.kyma-project.io/from-serverless: allowed
11+
policyTypes:
12+
- Egress
13+
egress:
14+
- {}

config/operator/base/deployment/deployment.yaml

+1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ spec:
2121
control-plane: operator
2222
sidecar.istio.io/inject: "false"
2323
app.kubernetes.io/component: serverless-operator.kyma-project.io
24+
networking.kyma-project.io/to-apiserver: allowed
2425
spec:
2526
priorityClassName: "operator-priority"
2627
securityContext:

config/operator/base/rbac/role.yaml

+13
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,19 @@ rules:
138138
- patch
139139
- update
140140
- watch
141+
- apiGroups:
142+
- networking.k8s.io
143+
resources:
144+
- networkpolicies
145+
verbs:
146+
- create
147+
- delete
148+
- deletecollection
149+
- get
150+
- list
151+
- patch
152+
- update
153+
- watch
141154
- apiGroups:
142155
- operator.kyma-project.io
143156
resources:

config/serverless/charts/webhook/templates/deployment.yaml

+1
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ spec:
3131
{{- end }}
3232
labels:
3333
{{- include "tplValue" ( dict "value" .Values.commonLabels "context" . ) | nindent 8 }}
34+
networking.kyma-project.io/from-seed: allowed
3435
spec:
3536
serviceAccountName: {{ template "webhook.fullname" . }}
3637
volumes:
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
kind: NetworkPolicy
2+
apiVersion: networking.k8s.io/v1
3+
metadata:
4+
namespace: {{ .Release.Namespace }}
5+
name: {{ template "fullname" . }}.kyma-project.io--allow-all-egress-from-controllers
6+
spec:
7+
podSelector:
8+
matchLabels:
9+
kyma-project.io/module: serverless
10+
networking.kyma-project.io/from-serverless: allowed
11+
policyTypes:
12+
- Egress
13+
egress:
14+
- {}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
apiVersion: networking.k8s.io/v1
2+
kind: NetworkPolicy
3+
metadata:
4+
namespace: {{ .Release.Namespace }}
5+
name: {{ template "fullname" . }}.kyma-project.io--allow-to-registry-port
6+
spec:
7+
podSelector:
8+
matchLabels:
9+
kyma-project.io/module: {{ template "fullname" . }}
10+
app.kubernetes.io/name: docker-registry
11+
policyTypes:
12+
- Ingress
13+
ingress:
14+
- from:
15+
ports:
16+
- protocol: TCP
17+
port: {{ .Values.global.registryServicePort }}

config/serverless/values.yaml

+3-1
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,9 @@ deployment:
129129
timeoutSeconds: 10
130130
periodSeconds: 30
131131
pod:
132-
labels: {}
132+
labels:
133+
networking.kyma-project.io/to-apiserver: allowed
134+
networking.kyma-project.io/from-serverless: allowed
133135
annotations:
134136
sidecar.istio.io/inject: "false"
135137
prometheus.io/scrape: "false"

tests/serverless/internal/resources/git/gitserver.go

+1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package git
33
import (
44
"context"
55
"fmt"
6+
67
"github.com/kyma-project/serverless/tests/serverless/internal/resources"
78
"github.com/kyma-project/serverless/tests/serverless/internal/resources/app"
89
"github.com/kyma-project/serverless/tests/serverless/internal/utils"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
package networkpolicy
2+
3+
import (
4+
"context"
5+
6+
"github.com/kyma-project/serverless/tests/serverless/internal/utils"
7+
"github.com/pkg/errors"
8+
"github.com/sirupsen/logrus"
9+
networkingv1 "k8s.io/api/networking/v1"
10+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
11+
networkingclient "k8s.io/client-go/kubernetes/typed/networking/v1"
12+
)
13+
14+
const (
15+
componentLabel = "component"
16+
)
17+
18+
type NetworkPolicy struct {
19+
name string
20+
namespace string
21+
networkingCli networkingclient.NetworkPolicyInterface
22+
log *logrus.Entry
23+
spec networkingv1.NetworkPolicySpec
24+
}
25+
26+
func NewNetworkPolicy(name, namespace string, spec networkingv1.NetworkPolicySpec, networkPolicies networkingclient.NetworkPolicyInterface, log *logrus.Entry) NetworkPolicy {
27+
return NetworkPolicy{
28+
name: name,
29+
namespace: namespace,
30+
networkingCli: networkPolicies,
31+
log: log,
32+
spec: spec,
33+
}
34+
}
35+
36+
func (n NetworkPolicy) Create(spec networkingv1.NetworkPolicySpec) error {
37+
38+
networkPolicy := &networkingv1.NetworkPolicy{
39+
ObjectMeta: metav1.ObjectMeta{
40+
Name: n.name,
41+
Namespace: n.namespace,
42+
Labels: map[string]string{
43+
componentLabel: n.name,
44+
},
45+
},
46+
Spec: spec,
47+
}
48+
_, err := n.networkingCli.Create(context.Background(), networkPolicy, metav1.CreateOptions{})
49+
return errors.Wrapf(err, "while creating NetworkPolicy %s in namespace %s", n.name, n.namespace)
50+
}
51+
52+
func (n NetworkPolicy) Delete() error {
53+
return n.networkingCli.Delete(context.Background(), n.name, metav1.DeleteOptions{})
54+
}
55+
56+
func (n NetworkPolicy) LogResource() error {
57+
policy, err := n.Get()
58+
if err != nil {
59+
return err
60+
}
61+
62+
out, err := utils.PrettyMarshall(policy)
63+
if err != nil {
64+
return err
65+
}
66+
67+
n.log.Infof("%s", out)
68+
return nil
69+
}
70+
71+
func (n NetworkPolicy) Get() (*networkingv1.NetworkPolicy, error) {
72+
u, err := n.networkingCli.Get(context.Background(), n.name, metav1.GetOptions{})
73+
if err != nil {
74+
return nil, errors.Wrapf(err, "while getting %s", n.name)
75+
}
76+
77+
return u, nil
78+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
package networkpolicy
2+
3+
import (
4+
"github.com/kyma-project/serverless/tests/serverless/internal/executor"
5+
"github.com/sirupsen/logrus"
6+
networkingv1 "k8s.io/api/networking/v1"
7+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
8+
networkingclient "k8s.io/client-go/kubernetes/typed/networking/v1"
9+
)
10+
11+
type newNetworkPolicyStep struct {
12+
name string
13+
namespace string
14+
networkPolicies []*NetworkPolicy
15+
// resCli *resources.Resource
16+
log *logrus.Entry
17+
}
18+
19+
// Cleanup implements executor.Step.
20+
func (n newNetworkPolicyStep) Cleanup() error {
21+
for _, networkPolicy := range n.networkPolicies {
22+
err := networkPolicy.Delete()
23+
if err != nil {
24+
return err
25+
}
26+
}
27+
return nil
28+
}
29+
30+
// Name implements executor.Step.
31+
func (n newNetworkPolicyStep) Name() string {
32+
return n.name
33+
}
34+
35+
// OnError implements executor.Step.
36+
func (n newNetworkPolicyStep) OnError() error {
37+
for _, networkPolicy := range n.networkPolicies {
38+
err := networkPolicy.LogResource()
39+
if err != nil {
40+
return err
41+
}
42+
}
43+
return nil
44+
}
45+
46+
// Run implements executor.Step.
47+
func (n newNetworkPolicyStep) Run() error {
48+
for _, networkPolicy := range n.networkPolicies {
49+
err := networkPolicy.Create(networkPolicy.spec)
50+
if err != nil {
51+
return err
52+
}
53+
}
54+
return nil
55+
}
56+
57+
var _ executor.Step = newNetworkPolicyStep{}
58+
59+
func CreateNetworkPoliciesStep(log *logrus.Entry, name, namespace string, networkCli networkingclient.NetworkPolicyInterface) executor.Step {
60+
61+
allowEgressFromMockSpec := networkingv1.NetworkPolicySpec{
62+
PodSelector: metav1.LabelSelector{
63+
MatchLabels: map[string]string{
64+
"serverless.kyma-project.io/managed-by": "function-controller",
65+
},
66+
},
67+
PolicyTypes: []networkingv1.PolicyType{
68+
networkingv1.PolicyTypeEgress,
69+
},
70+
Egress: []networkingv1.NetworkPolicyEgressRule{
71+
networkingv1.NetworkPolicyEgressRule{},
72+
},
73+
}
74+
75+
allowIngressToMockSpec := networkingv1.NetworkPolicySpec{
76+
PodSelector: metav1.LabelSelector{
77+
MatchLabels: map[string]string{
78+
"app.kubernetes.io/name": "eventing-publisher-proxy",
79+
},
80+
},
81+
PolicyTypes: []networkingv1.PolicyType{
82+
networkingv1.PolicyTypeIngress,
83+
},
84+
Ingress: []networkingv1.NetworkPolicyIngressRule{
85+
networkingv1.NetworkPolicyIngressRule{},
86+
},
87+
}
88+
89+
allowEgressFromMock := NewNetworkPolicy("allow-all-egress-from-eventing-mock", "kyma-system", allowEgressFromMockSpec, networkCli, log)
90+
allowIngressToMock := NewNetworkPolicy("allow-all-ingress-from-eventing-mock", "kyma-system", allowIngressToMockSpec, networkCli, log)
91+
92+
return newNetworkPolicyStep{
93+
name: name,
94+
namespace: namespace,
95+
networkPolicies: []*NetworkPolicy{
96+
&allowEgressFromMock,
97+
&allowIngressToMock,
98+
},
99+
log: log,
100+
}
101+
102+
}

tests/serverless/internal/resources/runtimes/python.go

+3
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,9 @@ def main(event, context):
153153
},
154154
},
155155
Env: []v1.EnvVar{},
156+
Labels: map[string]string{
157+
"app.kubernetes.io/name": "eventing-publisher-proxy",
158+
},
156159
ResourceConfiguration: &serverlessv1alpha2.ResourceConfiguration{
157160
Function: &serverlessv1alpha2.ResourceRequirements{
158161
Profile: "L",

0 commit comments

Comments
 (0)