1313import java .util .List ;
1414import java .util .Optional ;
1515import java .util .function .Consumer ;
16+ import java .util .stream .Stream ;
1617
1718import org .junit .jupiter .api .BeforeEach ;
1819import org .junit .jupiter .api .Test ;
2425
2526import io .fabric8 .kubernetes .api .model .ConfigMap ;
2627import io .fabric8 .kubernetes .api .model .ConfigMapBuilder ;
28+ import io .fabric8 .kubernetes .api .model .KubernetesResourceList ;
2729import io .fabric8 .kubernetes .api .model .Secret ;
2830import io .fabric8 .kubernetes .api .model .SecretBuilder ;
2931import io .fabric8 .kubernetes .client .KubernetesClient ;
32+ import io .fabric8 .kubernetes .client .dsl .MixedOperation ;
33+ import io .fabric8 .kubernetes .client .dsl .Resource ;
3034import io .fabric8 .kubernetes .client .server .mock .EnableKubernetesMockClient ;
3135import io .fabric8 .kubernetes .client .server .mock .KubernetesMockServer ;
3236import io .javaoperatorsdk .operator .api .reconciler .Context ;
37+ import io .javaoperatorsdk .operator .api .reconciler .EventSourceContext ;
3338import io .javaoperatorsdk .operator .api .reconciler .UpdateControl ;
39+ import io .javaoperatorsdk .operator .processing .event .ResourceID ;
3440
3541import io .kroxylicious .kubernetes .api .common .Condition ;
3642import io .kroxylicious .kubernetes .api .v1alpha1 .KafkaService ;
4046import io .kroxylicious .kubernetes .operator .assertj .KafkaServiceStatusAssert ;
4147
4248import static org .assertj .core .api .Assertions .assertThat ;
49+ import static org .mockito .ArgumentMatchers .any ;
4350import static org .mockito .Mockito .mock ;
4451import static org .mockito .Mockito .when ;
4552
@@ -123,11 +130,11 @@ class KafkaServiceReconcilerTest {
123130
124131 // @formatter:on
125132
126- private KafkaServiceReconciler kafkaProtocolFilterReconciler ;
133+ private KafkaServiceReconciler kafkaServiceReconciler ;
127134
128135 @ BeforeEach
129136 void setUp () {
130- kafkaProtocolFilterReconciler = new KafkaServiceReconciler (Clock .systemUTC ());
137+ kafkaServiceReconciler = new KafkaServiceReconciler (Clock .systemUTC ());
131138 }
132139
133140 @ Test
@@ -372,7 +379,7 @@ private static void mockGetSecret(
372379 void shouldSetResolvedRefs (KafkaService kafkaService , Context <KafkaService > context , Consumer <ConditionListAssert > asserter ) {
373380
374381 // When
375- final UpdateControl <KafkaService > updateControl = kafkaProtocolFilterReconciler .reconcile (kafkaService , context );
382+ final UpdateControl <KafkaService > updateControl = kafkaServiceReconciler .reconcile (kafkaService , context );
376383
377384 // Then
378385 assertThat (updateControl ).isNotNull ();
@@ -382,4 +389,135 @@ void shouldSetResolvedRefs(KafkaService kafkaService, Context<KafkaService> cont
382389 .conditionList ();
383390 asserter .accept (c );
384391 }
392+
393+ @ Test
394+ void canMapFromKafkaServiceWithTrustAnchorToConfigMap () {
395+ // Given
396+ var mapper = KafkaServiceReconciler .kafkaServiceToConfigMap ();
397+
398+ // When
399+ var secondaryResourceIDs = mapper .toSecondaryResourceIDs (SERVICE );
400+
401+ // Then
402+ assertThat (secondaryResourceIDs ).containsExactly (ResourceID .fromResource (PEM_CONFIG_MAP ));
403+ }
404+
405+ @ Test
406+ void canMapFromKafkaServiceWithoutTrustAnchorToConfigMap () {
407+ // Given
408+ var mapper = KafkaServiceReconciler .kafkaServiceToConfigMap ();
409+ var serviceNoTrustAnchor = new KafkaServiceBuilder (SERVICE ).editSpec ().editTls ().withTrustAnchorRef (null ).endTls ().endSpec ().build ();
410+
411+ // When
412+ var secondaryResourceIDs = mapper .toSecondaryResourceIDs (serviceNoTrustAnchor );
413+
414+ // Then
415+ assertThat (secondaryResourceIDs ).isEmpty ();
416+ }
417+
418+ @ Test
419+ void canMapFromConfigMapToKafkaService () {
420+ // Given
421+ EventSourceContext <KafkaService > eventSourceContext = mock ();
422+ KubernetesClient client = mock ();
423+ when (eventSourceContext .getClient ()).thenReturn (client );
424+
425+ KubernetesResourceList <KafkaService > mockList = mockKafkaServiceListOperation (client );
426+ when (mockList .getItems ()).thenReturn (List .of (SERVICE ));
427+
428+ var mapper = KafkaServiceReconciler .configMapToKafkaService (eventSourceContext );
429+
430+ // When
431+ var primaryResourceIDs = mapper .toPrimaryResourceIDs (PEM_CONFIG_MAP );
432+
433+ // Then
434+ assertThat (primaryResourceIDs ).containsExactly (ResourceID .fromResource (SERVICE ));
435+ }
436+
437+ static Stream <Arguments > mappingToConfigMapToleratesKafkaServicesWithoutTls () {
438+ return Stream .of (
439+ Arguments .argumentSet ("without tls" , new KafkaServiceBuilder (SERVICE ).editSpec ().withTls (null ).endSpec ().build ()),
440+ Arguments .argumentSet ("with tls but without trust anchor" ,
441+ new KafkaServiceBuilder (SERVICE ).editSpec ().editTls ().withTrustAnchorRef (null ).endTls ().endSpec ().build ()));
442+ }
443+
444+ @ ParameterizedTest
445+ @ MethodSource
446+ void mappingToConfigMapToleratesKafkaServicesWithoutTls (KafkaService service ) {
447+ // Given
448+ EventSourceContext <KafkaService > eventSourceContext = mock ();
449+ KubernetesClient client = mock ();
450+ when (eventSourceContext .getClient ()).thenReturn (client );
451+
452+ KubernetesResourceList <KafkaService > mockList = mockKafkaServiceListOperation (client );
453+ when (mockList .getItems ()).thenReturn (List .of (service ));
454+
455+ // When
456+ var mapper = KafkaServiceReconciler .configMapToKafkaService (eventSourceContext );
457+
458+ // Then
459+ var primaryResourceIDs = mapper .toPrimaryResourceIDs (new ConfigMapBuilder ().withNewMetadata ().withName ("cm" ).endMetadata ().build ());
460+ assertThat (primaryResourceIDs ).isEmpty ();
461+ }
462+
463+ @ Test
464+ void canMapFromKafkaServiceWithClientCertToSecret () {
465+ // Given
466+ var mapper = KafkaServiceReconciler .kafkaServiceToSecret ();
467+
468+ // When
469+ var secondaryResourceIDs = mapper .toSecondaryResourceIDs (SERVICE );
470+
471+ // Then
472+ assertThat (secondaryResourceIDs ).containsExactly (ResourceID .fromResource (TLS_SECRET ));
473+ }
474+
475+ @ Test
476+ void canMapFromKafkaServiceWithoutClientCertToSecret () {
477+ // Given
478+ var mapper = KafkaServiceReconciler .kafkaServiceToSecret ();
479+ var serviceNoCert = new KafkaServiceBuilder (SERVICE ).editSpec ().editTls ().withCertificateRef (null ).endTls ().endSpec ().build ();
480+
481+ // When
482+ var secondaryResourceIDs = mapper .toSecondaryResourceIDs (serviceNoCert );
483+
484+ // Then
485+ assertThat (secondaryResourceIDs ).isEmpty ();
486+ }
487+
488+ static Stream <Arguments > mappingToSecretToleratesKafkaServicesWithoutTls () {
489+ return Stream .of (
490+ Arguments .argumentSet ("without tls" , new KafkaServiceBuilder (SERVICE ).editSpec ().withTls (null ).endSpec ().build ()),
491+ Arguments .argumentSet ("with tls but without client cert" ,
492+ new KafkaServiceBuilder (SERVICE ).editSpec ().editTls ().withCertificateRef (null ).endTls ().endSpec ().build ()));
493+ }
494+
495+ @ ParameterizedTest
496+ @ MethodSource
497+ void mappingToSecretToleratesKafkaServicesWithoutTls (KafkaService service ) {
498+ // Given
499+ EventSourceContext <KafkaService > eventSourceContext = mock ();
500+ KubernetesClient client = mock ();
501+ when (eventSourceContext .getClient ()).thenReturn (client );
502+
503+ KubernetesResourceList <KafkaService > mockList = mockKafkaServiceListOperation (client );
504+ when (mockList .getItems ()).thenReturn (List .of (service ));
505+
506+ // When
507+ var mapper = KafkaServiceReconciler .secretToKafkaService (eventSourceContext );
508+
509+ // Then
510+ var primaryResourceIDs = mapper .toPrimaryResourceIDs (new SecretBuilder ().withNewMetadata ().withName ("secret" ).endMetadata ().build ());
511+ assertThat (primaryResourceIDs ).isEmpty ();
512+ }
513+
514+ private KubernetesResourceList <KafkaService > mockKafkaServiceListOperation (KubernetesClient client ) {
515+ MixedOperation <KafkaService , KubernetesResourceList <KafkaService >, Resource <KafkaService >> mockOperation = mock ();
516+ when (client .resources (KafkaService .class )).thenReturn (mockOperation );
517+ KubernetesResourceList <KafkaService > mockList = mock ();
518+ when (mockOperation .list ()).thenReturn (mockList );
519+ when (mockOperation .inNamespace (any ())).thenReturn (mockOperation );
520+ return mockList ;
521+ }
522+
385523}
0 commit comments