1- use crate :: kvp:: LabelSelectorExt ;
2- use crate :: utils:: cluster_domain:: { self , retrieve_cluster_domain, KUBERNETES_CLUSTER_DOMAIN } ;
1+ use std:: {
2+ convert:: TryFrom ,
3+ fmt:: { Debug , Display } ,
4+ } ;
35
46use either:: Either ;
57use futures:: StreamExt ;
6- use k8s_openapi:: apimachinery:: pkg:: apis:: meta:: v1:: LabelSelector ;
7- use k8s_openapi:: { ClusterResourceScope , NamespaceResourceScope } ;
8- use kube:: api:: { DeleteParams , ListParams , Patch , PatchParams , PostParams , Resource , ResourceExt } ;
9- use kube:: client:: Client as KubeClient ;
10- use kube:: core:: Status ;
11- use kube:: runtime:: wait:: delete:: delete_and_finalize;
12- use kube:: runtime:: { watcher, WatchStreamExt } ;
13- use kube:: { Api , Config } ;
14- use serde:: de:: DeserializeOwned ;
15- use serde:: Serialize ;
8+ use k8s_openapi:: {
9+ apimachinery:: pkg:: apis:: meta:: v1:: LabelSelector , ClusterResourceScope , NamespaceResourceScope ,
10+ } ;
11+ use kube:: {
12+ api:: { DeleteParams , ListParams , Patch , PatchParams , PostParams , Resource , ResourceExt } ,
13+ client:: Client as KubeClient ,
14+ core:: Status ,
15+ runtime:: { wait:: delete:: delete_and_finalize, watcher, WatchStreamExt } ,
16+ Api , Config ,
17+ } ;
18+ use serde:: { de:: DeserializeOwned , Serialize } ;
1619use snafu:: { OptionExt , ResultExt , Snafu } ;
17- use std:: convert:: TryFrom ;
18- use std:: fmt:: { Debug , Display } ;
1920use tracing:: trace;
2021
22+ use crate :: {
23+ kvp:: LabelSelectorExt ,
24+ utils:: cluster_info:: { KubernetesClusterInfo , KubernetesClusterInfoOpts } ,
25+ } ;
26+
2127pub type Result < T , E = Error > = std:: result:: Result < T , E > ;
2228
2329#[ derive( Debug , Snafu ) ]
@@ -78,9 +84,6 @@ pub enum Error {
7884
7985 #[ snafu( display( "unable to create kubernetes client" ) ) ]
8086 CreateKubeClient { source : kube:: Error } ,
81-
82- #[ snafu( display( "unable to to resolve kubernetes cluster domain" ) ) ]
83- ResolveKubernetesClusterDomain { source : cluster_domain:: Error } ,
8487}
8588
8689/// This `Client` can be used to access Kubernetes.
@@ -93,13 +96,16 @@ pub struct Client {
9396 delete_params : DeleteParams ,
9497 /// Default namespace as defined in the kubeconfig this client has been created from.
9598 pub default_namespace : String ,
99+
100+ pub kubernetes_cluster_info : KubernetesClusterInfo ,
96101}
97102
98103impl Client {
99104 pub fn new (
100105 client : KubeClient ,
101106 field_manager : Option < String > ,
102107 default_namespace : String ,
108+ kubernetes_cluster_info : KubernetesClusterInfo ,
103109 ) -> Self {
104110 Client {
105111 client,
@@ -113,6 +119,7 @@ impl Client {
113119 } ,
114120 delete_params : DeleteParams :: default ( ) ,
115121 default_namespace,
122+ kubernetes_cluster_info,
116123 }
117124 }
118125
@@ -517,9 +524,11 @@ impl Client {
517524 /// use stackable_operator::client::{Client, initialize_operator};
518525 ///
519526 /// #[tokio::main]
520- /// async fn main(){
527+ /// async fn main() {
521528 ///
522- /// let client: Client = initialize_operator(None).await.expect("Unable to construct client.");
529+ /// let client = initialize_operator(None, &Default::default())
530+ /// .await
531+ /// .expect("Unable to construct client.");
523532 /// let watcher_config: watcher::Config =
524533 /// watcher::Config::default().fields(&format!("metadata.name=nonexistent-pod"));
525534 ///
@@ -626,38 +635,45 @@ where
626635 }
627636}
628637
629- pub async fn initialize_operator ( field_manager : Option < String > ) -> Result < Client > {
630- let _ = KUBERNETES_CLUSTER_DOMAIN
631- . set ( retrieve_cluster_domain ( ) . context ( ResolveKubernetesClusterDomainSnafu ) ?) ;
632- create_client ( field_manager) . await
633- }
634-
635- async fn create_client ( field_manager : Option < String > ) -> Result < Client > {
638+ pub async fn initialize_operator (
639+ field_manager : Option < String > ,
640+ cluster_info_opts : & KubernetesClusterInfoOpts ,
641+ ) -> Result < Client > {
636642 let kubeconfig: Config = kube:: Config :: infer ( )
637643 . await
638644 . map_err ( kube:: Error :: InferConfig )
639645 . context ( InferKubeConfigSnafu ) ?;
640646 let default_namespace = kubeconfig. default_namespace . clone ( ) ;
641647 let client = kube:: Client :: try_from ( kubeconfig) . context ( CreateKubeClientSnafu ) ?;
642- Ok ( Client :: new ( client, field_manager, default_namespace) )
648+ let cluster_info = KubernetesClusterInfo :: new ( cluster_info_opts) ;
649+
650+ Ok ( Client :: new (
651+ client,
652+ field_manager,
653+ default_namespace,
654+ cluster_info,
655+ ) )
643656}
644657
645658#[ cfg( test) ]
646659mod tests {
660+ use std:: { collections:: BTreeMap , time:: Duration } ;
661+
647662 use futures:: StreamExt ;
648- use k8s_openapi:: api:: core:: v1:: { Container , Pod , PodSpec } ;
649- use k8s_openapi:: apimachinery:: pkg:: apis:: meta:: v1:: LabelSelector ;
650- use kube:: api:: { ObjectMeta , PostParams , ResourceExt } ;
651- use kube:: runtime:: watcher;
652- use kube:: runtime:: watcher:: Event ;
653- use std:: collections:: BTreeMap ;
654- use std:: time:: Duration ;
663+ use k8s_openapi:: {
664+ api:: core:: v1:: { Container , Pod , PodSpec } ,
665+ apimachinery:: pkg:: apis:: meta:: v1:: LabelSelector ,
666+ } ;
667+ use kube:: {
668+ api:: { ObjectMeta , PostParams , ResourceExt } ,
669+ runtime:: watcher:: { self , Event } ,
670+ } ;
655671 use tokio:: time:: error:: Elapsed ;
656672
657673 #[ tokio:: test]
658674 #[ ignore = "Tests depending on Kubernetes are not ran by default" ]
659675 async fn k8s_test_wait_created ( ) {
660- let client = super :: create_client ( None )
676+ let client = super :: initialize_operator ( None , & Default :: default ( ) )
661677 . await
662678 . expect ( "KUBECONFIG variable must be configured." ) ;
663679
@@ -735,7 +751,7 @@ mod tests {
735751 #[ tokio:: test]
736752 #[ ignore = "Tests depending on Kubernetes are not ran by default" ]
737753 async fn k8s_test_wait_created_timeout ( ) {
738- let client = super :: create_client ( None )
754+ let client = super :: initialize_operator ( None , & Default :: default ( ) )
739755 . await
740756 . expect ( "KUBECONFIG variable must be configured." ) ;
741757
@@ -755,7 +771,7 @@ mod tests {
755771 #[ tokio:: test]
756772 #[ ignore = "Tests depending on Kubernetes are not ran by default" ]
757773 async fn k8s_test_list_with_label_selector ( ) {
758- let client = super :: create_client ( None )
774+ let client = super :: initialize_operator ( None , & Default :: default ( ) )
759775 . await
760776 . expect ( "KUBECONFIG variable must be configured." ) ;
761777
0 commit comments