@@ -17,16 +17,141 @@ limitations under the License.
1717package controller
1818
1919import (
20+ "context"
21+ "strings"
22+ "time"
23+
2024 . "github.com/onsi/ginkgo/v2"
25+ . "github.com/onsi/gomega"
26+ corev1 "k8s.io/api/core/v1"
27+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
28+ "sigs.k8s.io/controller-runtime/pkg/client"
29+
30+ corev1alpha1 "github.com/openmcp-project/mcp-operator/api/core/v1alpha1"
31+ pwcorev1alpha1 "github.com/openmcp-project/project-workspace-operator/api/core/v1alpha1"
32+
33+ v1 "github.com/openmcp-project/usage-operator/api/usage/v1"
34+ )
35+
36+ const (
37+ ProjectName = "project"
38+ WorkspaceName = "workspace"
39+ MCPName = "test-mcp"
40+
41+ ChargingTarget = "12345678"
42+
43+ timeout = time .Second * 10
44+ duration = time .Second * 10
45+ interval = time .Millisecond * 250
2146)
2247
23- var _ = Describe ("ManagedControlPlane Controller" , func () {
48+ var (
49+ projectNamespaceName string
50+ workspaceNamespaceName string
51+
52+ mcpUsageName string
53+ )
54+
55+ var _ = Describe ("ManagedControlPlane Controller" , Ordered , func () {
2456 Context ("When reconciling a resource" , func () {
57+ BeforeAll (func () {
58+ ctx := context .Background ()
59+ projectNamespaceName = "project-" + ProjectName
60+ workspaceNamespaceName = projectNamespaceName + "--ws-" + WorkspaceName
61+ namespaces := []corev1.Namespace {
62+ {
63+ ObjectMeta : metav1.ObjectMeta {
64+ Name : projectNamespaceName ,
65+ },
66+ },
67+ {
68+ ObjectMeta : metav1.ObjectMeta {
69+ Name : workspaceNamespaceName ,
70+ },
71+ },
72+ }
73+ Expect (k8sClient .Create (ctx , & namespaces [0 ])).To (Succeed ())
74+ Expect (k8sClient .Create (ctx , & namespaces [1 ])).To (Succeed ())
75+
76+ project := pwcorev1alpha1.Project {
77+ ObjectMeta : metav1.ObjectMeta {
78+ Name : ProjectName ,
79+ Labels : map [string ]string {
80+ "openmcp.cloud.sap/charging-target" : ChargingTarget ,
81+ },
82+ },
83+ }
84+ Expect (k8sClient .Create (ctx , & project )).To (Succeed ())
85+ workspace := pwcorev1alpha1.Workspace {
86+ ObjectMeta : metav1.ObjectMeta {
87+ Name : WorkspaceName ,
88+ Namespace : projectNamespaceName ,
89+ },
90+ }
91+ Expect (k8sClient .Create (ctx , & workspace )).To (Succeed ())
92+ mcp := corev1alpha1.ManagedControlPlane {
93+ ObjectMeta : metav1.ObjectMeta {
94+ Name : MCPName ,
95+ Namespace : workspaceNamespaceName ,
96+ },
97+ }
98+ Expect (k8sClient .Create (ctx , & mcp )).To (Succeed ())
99+ })
100+
101+ It ("should create a mcp usage resource based on a ManagedControlPlane resource" , func () {
102+ ctx := context .Background ()
103+
104+ var mcpUsages v1.MCPUsageList
105+ Eventually (func (g Gomega ) {
106+ g .Expect (k8sClient .List (ctx , & mcpUsages )).To (Succeed ())
107+
108+ g .Expect (mcpUsages .Items ).Should (HaveLen (1 ))
109+
110+ mcpUsageName = mcpUsages .Items [0 ].Name
111+
112+ g .Expect (mcpUsages .Items [0 ].Spec .ChargingTarget ).Should (Equal (ChargingTarget ))
113+ }, timeout , interval ).Should (Succeed ())
114+ })
115+
116+ It ("should have set the right charging target" , func () {
117+ ctx := context .Background ()
118+
119+ mcpUsage := v1.MCPUsage {
120+ ObjectMeta : metav1.ObjectMeta {
121+ Name : mcpUsageName ,
122+ },
123+ }
124+ Expect (k8sClient .Get (ctx , client .ObjectKeyFromObject (& mcpUsage ), & mcpUsage )).Should (Succeed ())
125+
126+ Expect (mcpUsage .Spec .ChargingTarget ).Should (Equal (ChargingTarget ))
127+ })
128+
129+ It ("should mark a mcp usage resource as deleted when ManagedControlPlane is deleted" , func () {
130+ ctx := context .Background ()
131+
132+ mcpUsage := v1.MCPUsage {
133+ ObjectMeta : metav1.ObjectMeta {
134+ Name : mcpUsageName ,
135+ },
136+ }
137+ Expect (k8sClient .Get (ctx , client .ObjectKeyFromObject (& mcpUsage ), & mcpUsage )).Should (Succeed ())
138+
139+ var mcp corev1alpha1.ManagedControlPlane
140+ Expect (k8sClient .Get (ctx , client.ObjectKey {
141+ Name : strings .ToLower (MCPName ),
142+ Namespace : workspaceNamespaceName ,
143+ }, & mcp )).Should (Succeed ())
144+ mcp .Status .Status = corev1alpha1 .MCPStatusDeleting
145+ Expect (k8sClient .Status ().Update (ctx , & mcp )).Should (Succeed ())
146+
147+ var mcpUsages v1.MCPUsageList
148+ Eventually (func (g Gomega ) {
149+ g .Expect (k8sClient .List (ctx , & mcpUsages )).To (Succeed ())
25150
26- It ( "should successfully reconcile the resource" , func () {
151+ g . Expect ( mcpUsages . Items ). Should ( HaveLen ( 1 ))
27152
28- // TODO(user): Add more specific assertions depending on your controller's reconciliation logic.
29- // Example: If you expect a certain status condition after reconciliation, verify it here.
153+ g . Expect ( mcpUsages . Items [ 0 ]. Spec . MCPDeletedAt . IsZero ()). Should ( BeFalse ())
154+ }, timeout , interval ). Should ( Succeed ())
30155 })
31156 })
32157})
0 commit comments