@@ -18,14 +18,13 @@ import (
1818 "testing"
1919
2020 "github.com/eclipse-che/che-operator/controllers/namespacecache"
21+ "k8s.io/apimachinery/pkg/api/errors"
2122
2223 "k8s.io/apimachinery/pkg/types"
2324
24- "github.com/eclipse-che/che-operator/pkg/deploy"
25- "k8s.io/apimachinery/pkg/api/errors"
26-
2725 "github.com/eclipse-che/che-operator/pkg/common/constants"
2826 "github.com/eclipse-che/che-operator/pkg/common/test"
27+ "github.com/eclipse-che/che-operator/pkg/deploy"
2928 "github.com/stretchr/testify/assert"
3029 corev1 "k8s.io/api/core/v1"
3130 "k8s.io/apimachinery/pkg/api/resource"
@@ -133,9 +132,135 @@ func TestSyncPVC(t *testing.T) {
133132 assert .Nil (t , err )
134133 assertSyncConfig (t , workspaceConfigReconciler , 0 , v1PvcGKV )
135134
136- // Check that destination PersistentVolumeClaim in a user namespace is deleted
135+ // Check that destination PersistentVolumeClaim in a user namespace is NOT deleted
137136 pvc = & corev1.PersistentVolumeClaim {}
138137 err = deployContext .ClusterAPI .Client .Get (context .TODO (), objectKeyInUserNs , pvc )
138+ assert .Nil (t , err )
139+ }
140+
141+ func TestSyncPVCShouldRetainIfAnnotationSetTrue (t * testing.T ) {
142+ deployContext := test .NewCtxBuilder ().WithObjects (
143+ & corev1.PersistentVolumeClaim {
144+ TypeMeta : metav1.TypeMeta {
145+ Kind : "PersistentVolumeClaim" ,
146+ APIVersion : "v1" ,
147+ },
148+ ObjectMeta : metav1.ObjectMeta {
149+ Name : objectName ,
150+ Namespace : eclipseCheNamespace ,
151+ Labels : map [string ]string {
152+ constants .KubernetesPartOfLabelKey : constants .CheEclipseOrg ,
153+ constants .KubernetesComponentLabelKey : constants .WorkspacesConfig ,
154+ },
155+ Annotations : map [string ]string {
156+ syncRetainOnDeleteAnnotation : "true" ,
157+ },
158+ },
159+ }).Build ()
160+
161+ workspaceConfigReconciler := NewWorkspacesConfigReconciler (
162+ deployContext .ClusterAPI .Client ,
163+ deployContext .ClusterAPI .Client ,
164+ deployContext .ClusterAPI .Scheme ,
165+ & namespacecache.NamespaceCache {
166+ Client : deployContext .ClusterAPI .Client ,
167+ KnownNamespaces : map [string ]namespacecache.NamespaceInfo {
168+ userNamespace : {
169+ IsWorkspaceNamespace : true ,
170+ Username : "user" ,
171+ CheCluster : & types.NamespacedName {Name : "eclipse-che" , Namespace : "eclipse-che" },
172+ },
173+ },
174+ Lock : sync.Mutex {},
175+ })
176+
177+ assertSyncConfig (t , workspaceConfigReconciler , 0 , v1PvcGKV )
178+
179+ // Sync PVC to a user namespace
180+ err := workspaceConfigReconciler .syncNamespace (context .TODO (), eclipseCheNamespace , userNamespace )
181+ assert .Nil (t , err )
182+ assertSyncConfig (t , workspaceConfigReconciler , 2 , v1PvcGKV )
183+
184+ // Check if PVC in a user namespace is created
185+ pvc := & corev1.PersistentVolumeClaim {}
186+ err = deployContext .ClusterAPI .Client .Get (context .TODO (), objectKeyInUserNs , pvc )
187+ assert .Nil (t , err )
188+ assert .Equal (t , "true" , pvc .Annotations [syncRetainOnDeleteAnnotation ])
189+
190+ // Delete src PVC
191+ err = deploy .DeleteIgnoreIfNotFound (context .TODO (), deployContext .ClusterAPI .Client , objectKeyInCheNs , & corev1.PersistentVolumeClaim {})
192+ assert .Nil (t , err )
193+
194+ // Sync PVC
195+ err = workspaceConfigReconciler .syncNamespace (context .TODO (), eclipseCheNamespace , userNamespace )
196+ assert .Nil (t , err )
197+ assertSyncConfig (t , workspaceConfigReconciler , 0 , v1PvcGKV )
198+
199+ // Check that destination PVC in a user namespace is NOT deleted
200+ err = deployContext .ClusterAPI .Client .Get (context .TODO (), objectKeyInUserNs , & corev1.PersistentVolumeClaim {})
201+ assert .NoError (t , err )
202+ }
203+
204+ func TestSyncPVCShouldNotRetainIfAnnotationSetFalse (t * testing.T ) {
205+ deployContext := test .NewCtxBuilder ().WithObjects (
206+ & corev1.PersistentVolumeClaim {
207+ TypeMeta : metav1.TypeMeta {
208+ Kind : "PersistentVolumeClaim" ,
209+ APIVersion : "v1" ,
210+ },
211+ ObjectMeta : metav1.ObjectMeta {
212+ Name : objectName ,
213+ Namespace : eclipseCheNamespace ,
214+ Labels : map [string ]string {
215+ constants .KubernetesPartOfLabelKey : constants .CheEclipseOrg ,
216+ constants .KubernetesComponentLabelKey : constants .WorkspacesConfig ,
217+ },
218+ Annotations : map [string ]string {
219+ syncRetainOnDeleteAnnotation : "false" ,
220+ },
221+ },
222+ }).Build ()
223+
224+ workspaceConfigReconciler := NewWorkspacesConfigReconciler (
225+ deployContext .ClusterAPI .Client ,
226+ deployContext .ClusterAPI .Client ,
227+ deployContext .ClusterAPI .Scheme ,
228+ & namespacecache.NamespaceCache {
229+ Client : deployContext .ClusterAPI .Client ,
230+ KnownNamespaces : map [string ]namespacecache.NamespaceInfo {
231+ userNamespace : {
232+ IsWorkspaceNamespace : true ,
233+ Username : "user" ,
234+ CheCluster : & types.NamespacedName {Name : "eclipse-che" , Namespace : "eclipse-che" },
235+ },
236+ },
237+ Lock : sync.Mutex {},
238+ })
239+
240+ assertSyncConfig (t , workspaceConfigReconciler , 0 , v1PvcGKV )
241+
242+ // Sync PVC to a user namespace
243+ err := workspaceConfigReconciler .syncNamespace (context .TODO (), eclipseCheNamespace , userNamespace )
244+ assert .Nil (t , err )
245+ assertSyncConfig (t , workspaceConfigReconciler , 2 , v1PvcGKV )
246+
247+ // Check if PVC in a user namespace is created
248+ pvc := & corev1.PersistentVolumeClaim {}
249+ err = deployContext .ClusterAPI .Client .Get (context .TODO (), objectKeyInUserNs , pvc )
250+ assert .Nil (t , err )
251+ assert .Equal (t , "false" , pvc .Annotations [syncRetainOnDeleteAnnotation ])
252+
253+ // Delete src PVC
254+ err = deploy .DeleteIgnoreIfNotFound (context .TODO (), deployContext .ClusterAPI .Client , objectKeyInCheNs , & corev1.PersistentVolumeClaim {})
255+ assert .Nil (t , err )
256+
257+ // Sync PVC
258+ err = workspaceConfigReconciler .syncNamespace (context .TODO (), eclipseCheNamespace , userNamespace )
259+ assert .Nil (t , err )
260+ assertSyncConfig (t , workspaceConfigReconciler , 0 , v1PvcGKV )
261+
262+ // Check that destination PVC in a user namespace is deleted
263+ err = deployContext .ClusterAPI .Client .Get (context .TODO (), objectKeyInUserNs , & corev1.PersistentVolumeClaim {})
139264 assert .NotNil (t , err )
140265 assert .True (t , errors .IsNotFound (err ))
141266}
0 commit comments