Skip to content

Commit 6da30fc

Browse files
committed
more e2e tests
1 parent b125af5 commit 6da30fc

9 files changed

Lines changed: 460 additions & 22 deletions

File tree

test/e2e/audit_policy_test.go

Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
//go:build e2e
2+
3+
package e2e
4+
5+
import (
6+
"context"
7+
"fmt"
8+
"os"
9+
"testing"
10+
11+
"github.com/SAP/crossplane-provider-hana/apis/admin/v1alpha1"
12+
"github.com/crossplane-contrib/xp-testing/pkg/resources"
13+
14+
"sigs.k8s.io/e2e-framework/klient/decoder"
15+
"sigs.k8s.io/e2e-framework/klient/k8s"
16+
k8sresources "sigs.k8s.io/e2e-framework/klient/k8s/resources"
17+
"sigs.k8s.io/e2e-framework/klient/wait"
18+
"sigs.k8s.io/e2e-framework/klient/wait/conditions"
19+
"sigs.k8s.io/e2e-framework/pkg/envconf"
20+
"sigs.k8s.io/e2e-framework/pkg/features"
21+
)
22+
23+
type AuditPolicyTestConfig struct {
24+
TestConfig *resources.ResourceTestConfig
25+
Resource *k8sresources.Resources
26+
Objects []k8s.Object
27+
}
28+
29+
func TestAuditPolicy(t *testing.T) {
30+
testConfig := resources.NewResourceTestConfig(nil, "AuditPolicy")
31+
32+
c := &AuditPolicyTestConfig{
33+
TestConfig: testConfig,
34+
}
35+
36+
fB := features.New(fmt.Sprintf("%v", testConfig.Kind))
37+
fB.WithLabel("kind", testConfig.Kind)
38+
fB.Setup(c.SetupAuditPolicy)
39+
40+
fB.Assess("create", testConfig.AssessCreate)
41+
42+
fB.Assess("update", c.assessUpdate)
43+
44+
fB.Assess("delete", testConfig.AssessDelete)
45+
46+
fB.Teardown(testConfig.Teardown)
47+
48+
testenv.Test(t, fB.Feature())
49+
}
50+
51+
func (c *AuditPolicyTestConfig) assessUpdate(ctx context.Context, t *testing.T, cfg *envconf.Config) context.Context {
52+
for _, obj := range c.Objects {
53+
if err := c.Resource.Get(ctx, obj.GetName(), obj.GetNamespace(), obj); err != nil {
54+
t.Errorf("failed to get audit policy: %v", err)
55+
return ctx
56+
}
57+
58+
auditPolicy, ok := obj.(*v1alpha1.AuditPolicy)
59+
if !ok {
60+
t.Errorf("failed to cast object to AuditPolicy: %v", obj)
61+
return ctx
62+
}
63+
64+
auditPolicy.Spec.ForProvider.AuditActions = append(auditPolicy.Spec.ForProvider.AuditActions,
65+
"REVOKE ANY",
66+
)
67+
res := cfg.Client().Resources()
68+
69+
err := res.Update(ctx, auditPolicy)
70+
if err != nil {
71+
t.Fatal(err)
72+
}
73+
74+
var fn = func(u k8s.Object) bool {
75+
return u.GetName() == auditPolicy.GetName() && u.GetNamespace() == auditPolicy.GetNamespace()
76+
}
77+
78+
var areAuditActionsUpToDate = func(observed, desired []string) bool {
79+
if len(observed) != len(desired) {
80+
return false
81+
}
82+
for i, action := range observed {
83+
if action != desired[i] {
84+
return false
85+
}
86+
}
87+
return true
88+
}
89+
90+
err = wait.For(
91+
conditions.New(res).ResourceMatch(auditPolicy, fn),
92+
)
93+
if err != nil {
94+
t.Error(err)
95+
}
96+
if err := res.Get(ctx, auditPolicy.GetName(), auditPolicy.GetNamespace(), auditPolicy); err != nil {
97+
t.Errorf("failed to get audit policy after update: %v", err)
98+
} else if !areAuditActionsUpToDate(auditPolicy.Spec.ForProvider.AuditActions, auditPolicy.Spec.ForProvider.AuditActions) {
99+
t.Errorf("audit policy update failed, expected audit actions to be [GRANT ANY, REVOKE ANY], got %v", auditPolicy.Spec.ForProvider.AuditActions)
100+
}
101+
}
102+
103+
return ctx
104+
}
105+
106+
// Setup creates the resource in the cluster
107+
func (c *AuditPolicyTestConfig) SetupAuditPolicy(ctx context.Context, t *testing.T, cfg *envconf.Config) context.Context {
108+
t.Logf("Apply AuditPolicy")
109+
110+
resources.ImportResources(ctx, t, cfg, c.TestConfig.ResourceDirectory)
111+
112+
objects := make([]k8s.Object, 0)
113+
err := decoder.DecodeEachFile(
114+
ctx, os.DirFS(c.TestConfig.ResourceDirectory), "*",
115+
func(ctx context.Context, obj k8s.Object) error {
116+
objects = append(objects, obj)
117+
return nil
118+
},
119+
decoder.MutateNamespace(cfg.Namespace()),
120+
)
121+
if err != nil {
122+
t.Errorf("failed to decode files: %v", err)
123+
return ctx
124+
}
125+
126+
if c.Resource, err = k8sresources.New(cfg.Client().RESTConfig()); err != nil {
127+
t.Errorf("failed to create resource client: %v", err)
128+
return ctx
129+
}
130+
131+
for _, obj := range objects {
132+
if _, ok := obj.(*v1alpha1.AuditPolicy); !ok {
133+
t.Errorf("failed to cast object to AuditPolicy: %v", obj)
134+
return ctx
135+
}
136+
137+
c.Objects = append(c.Objects, obj)
138+
}
139+
140+
return ctx
141+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
apiVersion: admin.hana.sap.crossplane.io/v1alpha1
2+
kind: AuditPolicy
3+
metadata:
4+
name: example-auditpolicy
5+
spec:
6+
forProvider:
7+
policyName: E2E_EXAMPLE_AUDIT_POLICY
8+
auditStatus: UNSUCCESSFUL
9+
auditLevel: INFO
10+
auditActions:
11+
- GRANT ANY
12+
auditTrailRetention: 30
13+
enabled: true
14+
providerConfigRef:
15+
name: example

test/e2e/crs/DbSchema/dbSchema.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ metadata:
44
name: example-schema
55
spec:
66
forProvider:
7-
schemaName: EXAMPLE
7+
schemaName: E2E_EXAMPLE_SCHEMA
88
owner: DBADMIN
99
providerConfigRef:
10-
name: example
10+
name: example

test/e2e/crs/Role/role.yaml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
apiVersion: admin.hana.sap.crossplane.io/v1alpha1
2+
kind: Role
3+
metadata:
4+
name: example-role
5+
spec:
6+
forProvider:
7+
roleName: E2E_EXAMPLE_ROLE
8+
providerConfigRef:
9+
name: example

test/e2e/crs/User/user.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,6 @@ spec:
1111
key: password
1212
name: e2e-test-user-secret
1313
namespace: default
14-
username: E2ETESTUSER
14+
username: E2E_EXAMPLE_USER
1515
providerConfigRef:
16-
name: example
16+
name: example
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
apiVersion: admin.hana.sap.crossplane.io/v1alpha1
2+
kind: Usergroup
3+
metadata:
4+
name: example-usergroup
5+
spec:
6+
forProvider:
7+
usergroupName: E2E_EXAMPLE_USERGROUP
8+
providerConfigRef:
9+
name: example

test/e2e/role_test.go

Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
//go:build e2e
2+
3+
package e2e
4+
5+
import (
6+
"context"
7+
"fmt"
8+
"os"
9+
"os/exec"
10+
"testing"
11+
12+
"github.com/SAP/crossplane-provider-hana/apis/admin/v1alpha1"
13+
"github.com/crossplane-contrib/xp-testing/pkg/resources"
14+
"github.com/google/go-cmp/cmp"
15+
"github.com/google/go-cmp/cmp/cmpopts"
16+
17+
"sigs.k8s.io/e2e-framework/klient/decoder"
18+
"sigs.k8s.io/e2e-framework/klient/k8s"
19+
k8sresources "sigs.k8s.io/e2e-framework/klient/k8s/resources"
20+
"sigs.k8s.io/e2e-framework/klient/wait"
21+
"sigs.k8s.io/e2e-framework/klient/wait/conditions"
22+
"sigs.k8s.io/e2e-framework/pkg/envconf"
23+
"sigs.k8s.io/e2e-framework/pkg/features"
24+
)
25+
26+
type RoleTestConfig struct {
27+
TestConfig *resources.ResourceTestConfig
28+
Resource *k8sresources.Resources
29+
Objects []k8s.Object
30+
}
31+
32+
func TestRole(t *testing.T) {
33+
testConfig := resources.NewResourceTestConfig(nil, "Role")
34+
35+
c := &RoleTestConfig{TestConfig: testConfig}
36+
37+
fB := features.New(fmt.Sprintf("%v", testConfig.Kind))
38+
fB.WithLabel("kind", testConfig.Kind)
39+
fB.Setup(c.SetupRole)
40+
41+
fB.Assess("create", testConfig.AssessCreate)
42+
43+
fB.Assess("update", c.assessUpdate)
44+
45+
fB.Assess("delete", testConfig.AssessDelete)
46+
47+
fB.Teardown(testConfig.Teardown)
48+
49+
testenv.Test(t, fB.Feature())
50+
}
51+
52+
func (c *RoleTestConfig) assessUpdate(ctx context.Context, t *testing.T, cfg *envconf.Config) context.Context {
53+
for _, obj := range c.Objects {
54+
if err := c.Resource.Get(ctx, obj.GetName(), obj.GetNamespace(), obj); err != nil {
55+
t.Errorf("failed to get role: %v", err)
56+
return ctx
57+
}
58+
59+
role, ok := obj.(*v1alpha1.Role)
60+
if !ok {
61+
t.Errorf("failed to cast object to Role: %v", obj)
62+
return ctx
63+
}
64+
65+
role.Spec.ForProvider.Privileges = append(role.Spec.ForProvider.Privileges,
66+
"AUDIT READ",
67+
)
68+
res := cfg.Client().Resources()
69+
70+
err := res.Update(ctx, role)
71+
if err != nil {
72+
t.Fatal(err)
73+
}
74+
75+
var fn = func(u k8s.Object) bool {
76+
return u.GetName() == role.GetName() && u.GetNamespace() == role.GetNamespace()
77+
}
78+
79+
err = wait.For(
80+
conditions.New(res).ResourceMatch(role, fn),
81+
)
82+
if err != nil {
83+
t.Error(err)
84+
}
85+
86+
less := func(a, b string) bool { return a < b }
87+
equalIgnoreOrder := cmp.Diff(role.Spec.ForProvider.Privileges, role.Status.AtProvider.Privileges, cmpopts.SortSlices(less)) == ""
88+
89+
if !equalIgnoreOrder {
90+
t.Errorf("failed to update role privileges: Status does not match Spec. Name: %s, Namespace: %s", role.Name, role.Namespace)
91+
92+
out, derr := exec.Command("kubectl", "describe", "role", role.Name, "-n", role.Namespace).CombinedOutput()
93+
if derr != nil {
94+
t.Errorf("failed to run kubectl describe: %v", derr)
95+
} else {
96+
t.Logf("kubectl describe role output:\n%s", string(out))
97+
}
98+
}
99+
}
100+
101+
return ctx
102+
}
103+
104+
// Setup creates the resource and secret in the cluster
105+
func (c *RoleTestConfig) SetupRole(ctx context.Context, t *testing.T, cfg *envconf.Config) context.Context {
106+
t.Logf("Apply Role")
107+
108+
resources.ImportResources(ctx, t, cfg, c.TestConfig.ResourceDirectory)
109+
110+
objects := make([]k8s.Object, 0)
111+
err := decoder.DecodeEachFile(
112+
ctx, os.DirFS(c.TestConfig.ResourceDirectory), "*",
113+
func(ctx context.Context, obj k8s.Object) error {
114+
objects = append(objects, obj)
115+
return nil
116+
},
117+
decoder.MutateNamespace(cfg.Namespace()),
118+
)
119+
if err != nil {
120+
t.Errorf("failed to decode files: %v", err)
121+
return ctx
122+
}
123+
124+
if c.Resource, err = k8sresources.New(cfg.Client().RESTConfig()); err != nil {
125+
t.Errorf("failed to create resource client: %v", err)
126+
return ctx
127+
}
128+
129+
for _, obj := range objects {
130+
if _, ok := obj.(*v1alpha1.Role); !ok {
131+
t.Errorf("failed to cast object to Role: %v", obj)
132+
return ctx
133+
}
134+
135+
c.Objects = append(c.Objects, obj)
136+
}
137+
138+
return ctx
139+
}

0 commit comments

Comments
 (0)