rkubectl_kubeapi/
server.rs1use futures_util::stream;
2use futures_util::stream::StreamExt;
3use futures_util::stream::TryStreamExt;
4
5use super::*;
6
7impl Kubeapi {
8 pub async fn server_api_groups(&self) -> kube::Result<metav1::APIGroupList> {
9 if let Some(groups) = self.cache.api_groups() {
10 Ok(groups)
11 } else {
12 self.get_server_api_groups().await
13 }
14 }
15
16 pub async fn server_api_resources(&self) -> kube::Result<Vec<metav1::APIResourceList>> {
17 if let Some(resources) = self.cache.api_resources() {
18 Ok(resources)
20 } else {
21 self.get_server_api_resources().await
22 }
23 }
24
25 async fn get_server_api_resources(&self) -> kube::Result<Vec<metav1::APIResourceList>> {
26 let client = self.client()?;
27 let core = client.list_core_api_versions().await?;
28 let core = stream::iter(&core.versions)
29 .then(|version| client.list_core_api_resources(version))
30 .try_collect::<Vec<_>>()
31 .await?;
32
33 let groups = client.list_api_groups().await?.groups;
34 let apiversions = groups.iter().filter_map(|group| {
35 group
36 .preferred_version
37 .as_ref()
38 .or_else(|| group.versions.first())
39 });
40 let groups = stream::iter(apiversions)
41 .then(|apiversion| client.list_api_group_resources(&apiversion.group_version))
42 .try_collect::<Vec<_>>()
43 .await?;
44
45 Ok(core.into_iter().chain(groups).collect())
46 }
47
48 async fn get_server_api_groups(&self) -> kube::Result<metav1::APIGroupList> {
49 let client = self.client()?;
50 let core = self.get_server_core_api_group().await?;
51 let mut groups = client.list_api_groups().await?;
52 groups.groups.insert(0, core);
53 Ok(groups)
54 }
55
56 async fn get_server_core_api_group(&self) -> kube::Result<metav1::APIGroup> {
57 let client = self.client()?;
58 let name = kube::discovery::ApiGroup::CORE_GROUP.to_string();
59 let core = client.list_core_api_versions().await?;
60
61 let versions = core
62 .versions
63 .into_iter()
64 .map(|version| metav1::GroupVersionForDiscovery {
65 group_version: format!("{name}{version}"),
66 version,
67 })
68 .collect::<Vec<_>>();
69
70 let core = metav1::APIGroup {
71 name,
72 preferred_version: Some(versions[0].clone()),
73 server_address_by_client_cidrs: Some(core.server_address_by_client_cidrs),
74 versions,
75 };
76
77 Ok(core)
78 }
79}