@@ -441,3 +441,132 @@ var _ = Describe("FeatureStore Controller - Feast service TLS", func() {
441441 })
442442 })
443443})
444+
445+ var _ = Describe ("Test mountCustomCABundle functionality" , func () {
446+ const resourceName = "test-cabundle"
447+ const feastProject = "test_cabundle"
448+ const configMapName = "odh-trusted-ca-bundle"
449+ const caBundleAnnotation = "config.openshift.io/inject-trusted-cabundle"
450+ const tlsPathCustomCABundle = "/etc/pki/tls/custom-certs/ca-bundle.crt"
451+
452+ ctx := context .Background ()
453+ nsName := types.NamespacedName {
454+ Name : resourceName ,
455+ Namespace : "default" ,
456+ }
457+
458+ fs := & feastdevv1alpha1.FeatureStore {
459+ ObjectMeta : metav1.ObjectMeta {
460+ Name : resourceName ,
461+ Namespace : nsName .Namespace ,
462+ },
463+ Spec : feastdevv1alpha1.FeatureStoreSpec {
464+ FeastProject : feastProject ,
465+ Services : & feastdevv1alpha1.FeatureStoreServices {
466+ Registry : & feastdevv1alpha1.Registry {Local : & feastdevv1alpha1.LocalRegistryConfig {Server : & feastdevv1alpha1.ServerConfigs {}}},
467+ OnlineStore : & feastdevv1alpha1.OnlineStore {Server : & feastdevv1alpha1.ServerConfigs {}},
468+ OfflineStore : & feastdevv1alpha1.OfflineStore {Server : & feastdevv1alpha1.ServerConfigs {}},
469+ UI : & feastdevv1alpha1.ServerConfigs {},
470+ },
471+ },
472+ }
473+
474+ AfterEach (func () {
475+ By ("cleaning up FeatureStore and ConfigMap" )
476+ _ = k8sClient .Delete (ctx , & feastdevv1alpha1.FeatureStore {ObjectMeta : metav1.ObjectMeta {Name : resourceName , Namespace : nsName .Namespace }})
477+ _ = k8sClient .Delete (ctx , & corev1.ConfigMap {ObjectMeta : metav1.ObjectMeta {Name : configMapName , Namespace : nsName .Namespace }})
478+ })
479+
480+ It ("should mount CA bundle volume and mounts in containers when ConfigMap exists" , func () {
481+ cm := & corev1.ConfigMap {
482+ ObjectMeta : metav1.ObjectMeta {
483+ Name : configMapName ,
484+ Namespace : nsName .Namespace ,
485+ Labels : map [string ]string {
486+ caBundleAnnotation : "true" ,
487+ },
488+ },
489+ }
490+ Expect (k8sClient .Create (ctx , cm .DeepCopy ())).To (Succeed ())
491+ Expect (k8sClient .Create (ctx , fs .DeepCopy ())).To (Succeed ())
492+
493+ controllerReconciler := & FeatureStoreReconciler {
494+ Client : k8sClient ,
495+ Scheme : k8sClient .Scheme (),
496+ }
497+
498+ _ , err := controllerReconciler .Reconcile (ctx , reconcile.Request {
499+ NamespacedName : nsName ,
500+ })
501+ Expect (err ).NotTo (HaveOccurred ())
502+
503+ resource := & feastdevv1alpha1.FeatureStore {}
504+ err = k8sClient .Get (ctx , nsName , resource )
505+ Expect (err ).NotTo (HaveOccurred ())
506+
507+ feast := services.FeastServices {
508+ Handler : handler.FeastHandler {
509+ Client : controllerReconciler .Client ,
510+ Context : ctx ,
511+ Scheme : controllerReconciler .Scheme ,
512+ FeatureStore : resource ,
513+ },
514+ }
515+
516+ deploy := & appsv1.Deployment {}
517+ objMeta := feast .GetObjectMeta ()
518+ err = k8sClient .Get (ctx , types.NamespacedName {
519+ Name : objMeta .Name ,
520+ Namespace : objMeta .Namespace ,
521+ }, deploy )
522+ Expect (err ).NotTo (HaveOccurred ())
523+
524+ Expect (deploy .Spec .Template .Spec .Volumes ).To (ContainElement (HaveField ("Name" , configMapName )))
525+ for _ , container := range deploy .Spec .Template .Spec .Containers {
526+ Expect (container .VolumeMounts ).To (ContainElement (SatisfyAll (
527+ HaveField ("Name" , configMapName ),
528+ HaveField ("MountPath" , tlsPathCustomCABundle ),
529+ )))
530+ }
531+ })
532+
533+ It ("should not mount CA bundle volume or container mounts when ConfigMap is absent" , func () {
534+ Expect (k8sClient .Create (ctx , fs .DeepCopy ())).To (Succeed ())
535+
536+ controllerReconciler := & FeatureStoreReconciler {
537+ Client : k8sClient ,
538+ Scheme : k8sClient .Scheme (),
539+ }
540+
541+ _ , err := controllerReconciler .Reconcile (ctx , reconcile.Request {
542+ NamespacedName : nsName ,
543+ })
544+ Expect (err ).NotTo (HaveOccurred ())
545+
546+ resource := & feastdevv1alpha1.FeatureStore {}
547+ err = k8sClient .Get (ctx , nsName , resource )
548+ Expect (err ).NotTo (HaveOccurred ())
549+
550+ feast := services.FeastServices {
551+ Handler : handler.FeastHandler {
552+ Client : controllerReconciler .Client ,
553+ Context : ctx ,
554+ Scheme : controllerReconciler .Scheme ,
555+ FeatureStore : resource ,
556+ },
557+ }
558+
559+ deploy := & appsv1.Deployment {}
560+ objMeta := feast .GetObjectMeta ()
561+ err = k8sClient .Get (ctx , types.NamespacedName {
562+ Name : objMeta .Name ,
563+ Namespace : objMeta .Namespace ,
564+ }, deploy )
565+ Expect (err ).NotTo (HaveOccurred ())
566+
567+ Expect (deploy .Spec .Template .Spec .Volumes ).NotTo (ContainElement (HaveField ("Name" , configMapName )))
568+ for _ , container := range deploy .Spec .Template .Spec .Containers {
569+ Expect (container .VolumeMounts ).NotTo (ContainElement (HaveField ("Name" , configMapName )))
570+ }
571+ })
572+ })
0 commit comments