@@ -85,6 +85,7 @@ public class KubernetesTestSupport extends FiberTestSupport {
85
85
public static final String PV = "PersistentVolume" ;
86
86
public static final String PVC = "PersistentVolumeClaim" ;
87
87
public static final String POD = "Pod" ;
88
+ public static final String PODLOG = "PodLog" ;
88
89
public static final String SERVICE = "Service" ;
89
90
public static final String SUBJECT_ACCESS_REVIEW = "SubjectAccessReview" ;
90
91
public static final String TOKEN_REVIEW = "TokenReview" ;
@@ -94,7 +95,7 @@ public class KubernetesTestSupport extends FiberTestSupport {
94
95
*
95
96
* @return a memento which can be used to restore the production factory
96
97
*/
97
- public Memento install () {
98
+ public Memento install () throws NoSuchFieldException {
98
99
support (CUSTOM_RESOURCE_DEFINITION , V1beta1CustomResourceDefinition .class );
99
100
support (SUBJECT_ACCESS_REVIEW , V1SubjectAccessReview .class );
100
101
support (TOKEN_REVIEW , V1TokenReview .class );
@@ -105,10 +106,11 @@ public Memento install() {
105
106
supportNamespaced (EVENT , V1Event .class , this ::createEventList );
106
107
supportNamespaced (JOB , V1Job .class , this ::createJobList );
107
108
supportNamespaced (POD , V1Pod .class , this ::createPodList );
109
+ supportNamespaced (PODLOG , String .class );
108
110
supportNamespaced (PVC , V1PersistentVolumeClaim .class , this ::createPVCList );
109
111
supportNamespaced (SERVICE , V1Service .class , this ::createServiceList );
110
112
111
- return new CallBuilderMemento ();
113
+ return new KubernetesTestSupportMemento ();
112
114
}
113
115
114
116
private V1ConfigMapList createConfigMapList (List <V1ConfigMap > items ) {
@@ -159,6 +161,11 @@ private <T> void support(
159
161
repositories .put (resourceName , new DataRepository <>(resourceClass , toList ));
160
162
}
161
163
164
+ private <T > void supportNamespaced (String resourceName , Class <T > resourceClass ) {
165
+ dataTypes .put (resourceClass , resourceName );
166
+ repositories .put (resourceName , new NamespacedDataRepository <>(resourceClass , null ));
167
+ }
168
+
162
169
private <T > void supportNamespaced (
163
170
String resourceName , Class <T > resourceClass , Function <List <T >, Object > toList ) {
164
171
dataTypes .put (resourceClass , resourceName );
@@ -184,6 +191,10 @@ public final <T> void defineResources(T... resources) {
184
191
for (T resource : resources ) getDataRepository (resource ).createResourceInNamespace (resource );
185
192
}
186
193
194
+ public void definePodLog (String name , String namespace , Object contents ) {
195
+ repositories .get (PODLOG ).createResourceInNamespace (name , namespace , contents );
196
+ }
197
+
187
198
@ SuppressWarnings ("unchecked" )
188
199
private <T > DataRepository <T > getDataRepository (T resource ) {
189
200
return (DataRepository <T >) repositories .get (dataTypes .get (resource .getClass ()));
@@ -228,19 +239,21 @@ public void runOnOperation(String resourceType, String name, String namespace, C
228
239
}
229
240
*/
230
241
231
- private class CallBuilderMemento implements Memento {
242
+ private class KubernetesTestSupportMemento implements Memento {
232
243
233
- {
234
- {
235
- CallBuilder .setStepFactory (new AsyncRequestStepFactoryImpl ());
236
- CallBuilder .setCallDispatcher (new CallDispatcherImpl ());
237
- }
244
+ private List <Memento > mementos = new ArrayList <>();
245
+
246
+ public KubernetesTestSupportMemento () throws NoSuchFieldException {
247
+ // mementos.add(installEngine());
248
+ CallBuilder .setStepFactory (new AsyncRequestStepFactoryImpl ());
249
+ CallBuilder .setCallDispatcher (new CallDispatcherImpl ());
238
250
}
239
251
240
252
@ Override
241
253
public void revert () {
242
254
CallBuilder .resetStepFactory ();
243
255
CallBuilder .resetCallDispatcher ();
256
+ for (Memento memento : mementos ) memento .revert ();
244
257
}
245
258
246
259
@ Override
@@ -307,6 +320,11 @@ void createResourceInNamespace(T resource) {
307
320
createResource (getMetadata (resource ).getNamespace (), resource );
308
321
}
309
322
323
+ @ SuppressWarnings ("unchecked" )
324
+ void createResourceInNamespace (String name , String namespace , Object resource ) {
325
+ data .put (name , (T ) resource );
326
+ }
327
+
310
328
T createResource (String namespace , T resource ) {
311
329
String name = getName (resource );
312
330
if (name != null ) {
@@ -346,7 +364,7 @@ private boolean hasLabel(V1ObjectMeta metadata, String selector) {
346
364
}
347
365
348
366
private boolean includesLabel (Map <String , String > labels , String key , String value ) {
349
- if (!labels .containsKey (key )) return false ;
367
+ if (labels == null || !labels .containsKey (key )) return false ;
350
368
return value == null || value .equals (labels .get (key ));
351
369
}
352
370
@@ -418,25 +436,30 @@ T replaceResource(String name, T resource) {
418
436
return resource ;
419
437
}
420
438
421
- V1Status deleteResource (String namespace , String name ) {
422
- if (!hasElementWithName (name )) throw new NotFoundException ();
439
+ V1Status deleteResource (String name , String namespace ) {
440
+ if (!hasElementWithName (name ))
441
+ throw new NotFoundException (getResourceName (), name , namespace );
423
442
data .remove (name );
424
443
425
444
return new V1Status ().code (200 );
426
445
}
427
446
447
+ private String getResourceName () {
448
+ return dataTypes .get (resourceType );
449
+ }
450
+
428
451
public V1Status deleteResourceCollection (String namespace ) {
429
452
data .clear ();
430
453
return new V1Status ().code (200 );
431
454
}
432
455
433
- public T readResource (String namespace , String name ) {
434
- if (!data .containsKey (name )) throw new NotFoundException ();
456
+ public T readResource (String name , String namespace ) {
457
+ if (!data .containsKey (name )) throw new NotFoundException (getResourceName (), name , namespace );
435
458
return data .get (name );
436
459
}
437
460
438
- public T patchResource (String namespace , String name , List <JsonObject > body ) {
439
- if (!data .containsKey (name )) throw new NotFoundException ();
461
+ public T patchResource (String name , String namespace , List <JsonObject > body ) {
462
+ if (!data .containsKey (name )) throw new NotFoundException (getResourceName (), name , namespace );
440
463
441
464
JsonPatch patch = Json .createPatch (toJsonArray (body ));
442
465
JsonStructure result = patch .apply (toJsonStructure (data .get (name )));
@@ -508,33 +531,38 @@ private class NamespacedDataRepository<T> extends DataRepository<T> {
508
531
this .listFactory = listFactory ;
509
532
}
510
533
534
+ @ Override
535
+ void createResourceInNamespace (String name , String namespace , Object resource ) {
536
+ inNamespace (namespace ).createResourceInNamespace (name , namespace , resource );
537
+ }
538
+
511
539
@ Override
512
540
T createResource (String namespace , T resource ) {
513
- return inNamespace (namespace ).createResource (null , resource );
541
+ return inNamespace (namespace ).createResource (namespace , resource );
514
542
}
515
543
516
544
private DataRepository <T > inNamespace (String namespace ) {
517
545
return repositories .computeIfAbsent (namespace , n -> new DataRepository <>(resourceType , this ));
518
546
}
519
547
520
548
@ Override
521
- V1Status deleteResource (String namespace , String name ) {
522
- return inNamespace (namespace ).deleteResource (null , name );
549
+ V1Status deleteResource (String name , String namespace ) {
550
+ return inNamespace (namespace ).deleteResource (name , namespace );
523
551
}
524
552
525
553
@ Override
526
554
public V1Status deleteResourceCollection (String namespace ) {
527
- return inNamespace (namespace ).deleteResourceCollection (null );
555
+ return inNamespace (namespace ).deleteResourceCollection (namespace );
528
556
}
529
557
530
558
@ Override
531
- public T readResource (String namespace , String name ) {
532
- return inNamespace (namespace ).readResource (null , name );
559
+ public T readResource (String name , String namespace ) {
560
+ return inNamespace (namespace ).readResource (name , namespace );
533
561
}
534
562
535
563
@ Override
536
- public T patchResource (String namespace , String name , List <JsonObject > body ) {
537
- return inNamespace (namespace ).patchResource (null , name , body );
564
+ public T patchResource (String name , String namespace , List <JsonObject > body ) {
565
+ return inNamespace (namespace ).patchResource (name , namespace , body );
538
566
}
539
567
540
568
@ Override
@@ -669,7 +697,7 @@ private <T> T replaceResource(DataRepository<T> dataRepository) {
669
697
}
670
698
671
699
private Object deleteResource (DataRepository dataRepository ) {
672
- return dataRepository .deleteResource (requestParams .namespace , requestParams .name );
700
+ return dataRepository .deleteResource (requestParams .name , requestParams .namespace );
673
701
}
674
702
675
703
@ SuppressWarnings ("unchecked" )
@@ -679,15 +707,15 @@ private List<JsonObject> asJsonObject(Object body) {
679
707
680
708
private Object patchResource (DataRepository dataRepository ) {
681
709
return dataRepository .patchResource (
682
- requestParams .namespace , requestParams .name , asJsonObject (requestParams .body ));
710
+ requestParams .name , requestParams .namespace , asJsonObject (requestParams .body ));
683
711
}
684
712
685
713
private Object listResources (DataRepository dataRepository ) {
686
714
return dataRepository .listResources (requestParams .namespace , fieldSelector , labelSelector );
687
715
}
688
716
689
717
private <T > T readResource (DataRepository <T > dataRepository ) {
690
- return dataRepository .readResource (requestParams .namespace , requestParams .name );
718
+ return dataRepository .readResource (requestParams .name , requestParams .namespace );
691
719
}
692
720
693
721
public Object deleteCollection (DataRepository dataRepository ) {
@@ -763,7 +791,11 @@ public HttpErrorException getException() {
763
791
}
764
792
}
765
793
766
- static class NotFoundException extends RuntimeException {}
794
+ class NotFoundException extends RuntimeException {
795
+ public NotFoundException (String resourceType , String name , String namespace ) {
796
+ super (String .format ("No %s named %s found in namespace %s" , resourceType , name , namespace ));
797
+ }
798
+ }
767
799
768
800
static class HttpErrorException extends RuntimeException {
769
801
private int status ;
0 commit comments