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
+ } ;
3
5
4
6
use either:: Either ;
5
7
use 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 } ;
16
19
use snafu:: { OptionExt , ResultExt , Snafu } ;
17
- use std:: convert:: TryFrom ;
18
- use std:: fmt:: { Debug , Display } ;
19
20
use tracing:: trace;
20
21
22
+ use crate :: {
23
+ kvp:: LabelSelectorExt ,
24
+ utils:: cluster_info:: { KubernetesClusterInfo , KubernetesClusterInfoOpts } ,
25
+ } ;
26
+
21
27
pub type Result < T , E = Error > = std:: result:: Result < T , E > ;
22
28
23
29
#[ derive( Debug , Snafu ) ]
@@ -78,9 +84,6 @@ pub enum Error {
78
84
79
85
#[ snafu( display( "unable to create kubernetes client" ) ) ]
80
86
CreateKubeClient { source : kube:: Error } ,
81
-
82
- #[ snafu( display( "unable to to resolve kubernetes cluster domain" ) ) ]
83
- ResolveKubernetesClusterDomain { source : cluster_domain:: Error } ,
84
87
}
85
88
86
89
/// This `Client` can be used to access Kubernetes.
@@ -93,13 +96,16 @@ pub struct Client {
93
96
delete_params : DeleteParams ,
94
97
/// Default namespace as defined in the kubeconfig this client has been created from.
95
98
pub default_namespace : String ,
99
+
100
+ pub kubernetes_cluster_info : KubernetesClusterInfo ,
96
101
}
97
102
98
103
impl Client {
99
104
pub fn new (
100
105
client : KubeClient ,
101
106
field_manager : Option < String > ,
102
107
default_namespace : String ,
108
+ kubernetes_cluster_info : KubernetesClusterInfo ,
103
109
) -> Self {
104
110
Client {
105
111
client,
@@ -113,6 +119,7 @@ impl Client {
113
119
} ,
114
120
delete_params : DeleteParams :: default ( ) ,
115
121
default_namespace,
122
+ kubernetes_cluster_info,
116
123
}
117
124
}
118
125
@@ -517,9 +524,11 @@ impl Client {
517
524
/// use stackable_operator::client::{Client, initialize_operator};
518
525
///
519
526
/// #[tokio::main]
520
- /// async fn main(){
527
+ /// async fn main() {
521
528
///
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.");
523
532
/// let watcher_config: watcher::Config =
524
533
/// watcher::Config::default().fields(&format!("metadata.name=nonexistent-pod"));
525
534
///
@@ -626,38 +635,45 @@ where
626
635
}
627
636
}
628
637
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 > {
636
642
let kubeconfig: Config = kube:: Config :: infer ( )
637
643
. await
638
644
. map_err ( kube:: Error :: InferConfig )
639
645
. context ( InferKubeConfigSnafu ) ?;
640
646
let default_namespace = kubeconfig. default_namespace . clone ( ) ;
641
647
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
+ ) )
643
656
}
644
657
645
658
#[ cfg( test) ]
646
659
mod tests {
660
+ use std:: { collections:: BTreeMap , time:: Duration } ;
661
+
647
662
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
+ } ;
655
671
use tokio:: time:: error:: Elapsed ;
656
672
657
673
#[ tokio:: test]
658
674
#[ ignore = "Tests depending on Kubernetes are not ran by default" ]
659
675
async fn k8s_test_wait_created ( ) {
660
- let client = super :: create_client ( None )
676
+ let client = super :: initialize_operator ( None , & Default :: default ( ) )
661
677
. await
662
678
. expect ( "KUBECONFIG variable must be configured." ) ;
663
679
@@ -735,7 +751,7 @@ mod tests {
735
751
#[ tokio:: test]
736
752
#[ ignore = "Tests depending on Kubernetes are not ran by default" ]
737
753
async fn k8s_test_wait_created_timeout ( ) {
738
- let client = super :: create_client ( None )
754
+ let client = super :: initialize_operator ( None , & Default :: default ( ) )
739
755
. await
740
756
. expect ( "KUBECONFIG variable must be configured." ) ;
741
757
@@ -755,7 +771,7 @@ mod tests {
755
771
#[ tokio:: test]
756
772
#[ ignore = "Tests depending on Kubernetes are not ran by default" ]
757
773
async fn k8s_test_list_with_label_selector ( ) {
758
- let client = super :: create_client ( None )
774
+ let client = super :: initialize_operator ( None , & Default :: default ( ) )
759
775
. await
760
776
. expect ( "KUBECONFIG variable must be configured." ) ;
761
777
0 commit comments