rkubectl_kubeapi/
server.rs

1use 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            // resources.sort_by_key(|arl| arl.resources[0].group.as_deref());
19            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}