Spaces:
Runtime error
Runtime error
from typing import Optional | |
try: | |
import kubernetes | |
except ImportError: | |
raise ImportError( | |
"The `kubernetes` package is not installed. " | |
"Install using `pip install kubernetes` or `pip install phidata[k8s]`." | |
) | |
from phi.utils.log import logger | |
class K8sApiClient: | |
def __init__(self, context: Optional[str] = None, kubeconfig_path: Optional[str] = None): | |
super().__init__() | |
self.context: Optional[str] = context | |
self.kubeconfig_path: Optional[str] = kubeconfig_path | |
self.configuration: Optional[kubernetes.client.Configuration] = None | |
# kubernetes API clients | |
self._api_client: Optional[kubernetes.client.ApiClient] = None | |
self._apps_v1_api: Optional[kubernetes.client.AppsV1Api] = None | |
self._core_v1_api: Optional[kubernetes.client.CoreV1Api] = None | |
self._rbac_auth_v1_api: Optional[kubernetes.client.RbacAuthorizationV1Api] = None | |
self._storage_v1_api: Optional[kubernetes.client.StorageV1Api] = None | |
self._apiextensions_v1_api: Optional[kubernetes.client.ApiextensionsV1Api] = None | |
self._networking_v1_api: Optional[kubernetes.client.NetworkingV1Api] = None | |
self._custom_objects_api: Optional[kubernetes.client.CustomObjectsApi] = None | |
logger.debug(f"**-+-** K8sApiClient created for {self.context}") | |
def create_api_client(self) -> "kubernetes.client.ApiClient": | |
"""Create a kubernetes.client.ApiClient""" | |
logger.debug("Creating kubernetes.client.ApiClient") | |
try: | |
self.configuration = kubernetes.client.Configuration() | |
try: | |
kubernetes.config.load_kube_config( | |
config_file=self.kubeconfig_path, client_configuration=self.configuration, context=self.context | |
) | |
except kubernetes.config.ConfigException: | |
# Usually because the context is not in the kubeconfig | |
kubernetes.config.load_kube_config(client_configuration=self.configuration) | |
logger.debug(f"\thost: {self.configuration.host}") | |
self._api_client = kubernetes.client.ApiClient(self.configuration) | |
logger.debug(f"\tApiClient: {self._api_client}") | |
except Exception as e: | |
logger.error(e) | |
if self._api_client is None: | |
logger.error("Failed to create Kubernetes ApiClient") | |
exit(0) | |
return self._api_client | |
###################################################### | |
# K8s APIs are cached by the class | |
###################################################### | |
def api_client(self) -> "kubernetes.client.ApiClient": | |
if self._api_client is None: | |
self._api_client = self.create_api_client() | |
return self._api_client | |
def apps_v1_api(self) -> "kubernetes.client.AppsV1Api": | |
if self._apps_v1_api is None: | |
self._apps_v1_api = kubernetes.client.AppsV1Api(self.api_client) | |
return self._apps_v1_api | |
def core_v1_api(self) -> "kubernetes.client.CoreV1Api": | |
if self._core_v1_api is None: | |
self._core_v1_api = kubernetes.client.CoreV1Api(self.api_client) | |
return self._core_v1_api | |
def rbac_auth_v1_api(self) -> "kubernetes.client.RbacAuthorizationV1Api": | |
if self._rbac_auth_v1_api is None: | |
self._rbac_auth_v1_api = kubernetes.client.RbacAuthorizationV1Api(self.api_client) | |
return self._rbac_auth_v1_api | |
def storage_v1_api(self) -> "kubernetes.client.StorageV1Api": | |
if self._storage_v1_api is None: | |
self._storage_v1_api = kubernetes.client.StorageV1Api(self.api_client) | |
return self._storage_v1_api | |
def apiextensions_v1_api(self) -> "kubernetes.client.ApiextensionsV1Api": | |
if self._apiextensions_v1_api is None: | |
self._apiextensions_v1_api = kubernetes.client.ApiextensionsV1Api(self.api_client) | |
return self._apiextensions_v1_api | |
def networking_v1_api(self) -> "kubernetes.client.NetworkingV1Api": | |
if self._networking_v1_api is None: | |
self._networking_v1_api = kubernetes.client.NetworkingV1Api(self.api_client) | |
return self._networking_v1_api | |
def custom_objects_api(self) -> "kubernetes.client.CustomObjectsApi": | |
if self._custom_objects_api is None: | |
self._custom_objects_api = kubernetes.client.CustomObjectsApi(self.api_client) | |
return self._custom_objects_api | |