X-Git-Url: https://osm.etsi.org/gitweb/?p=osm%2FN2VC.git;a=blobdiff_plain;f=n2vc%2Fkubectl.py;h=bc8c3927d9537fbffb4e8bca3170def835c5683b;hp=61b2dc375b4925e42f039adc52f5a43f1f3b88ac;hb=83e558987289d47f338ecd989ee0997987673f4a;hpb=84ebb751f36f724b6ddd7d9925e43534b2420ab2;ds=sidebyside diff --git a/n2vc/kubectl.py b/n2vc/kubectl.py index 61b2dc3..bc8c392 100644 --- a/n2vc/kubectl.py +++ b/n2vc/kubectl.py @@ -12,26 +12,44 @@ # See the License for the specific language governing permissions and # limitations under the License. +import logging + from kubernetes import client, config from kubernetes.client.rest import ApiException -import logging + + +CORE_CLIENT = "core_v1" +STORAGE_CLIENT = "storage_v1" +RBAC_CLIENT = "rbac_v1" class Kubectl: def __init__(self, config_file=None): config.load_kube_config(config_file=config_file) + self._clients = { + "core_v1": client.CoreV1Api(), + "storage_v1": client.StorageV1Api(), + "rbac_v1": client.RbacAuthorizationV1Api(), + } + self._configuration = config.kube_config.Configuration() self.logger = logging.getLogger("Kubectl") + @property + def configuration(self): + return self._configuration + + @property + def clients(self): + return self._clients + def get_services(self, field_selector=None, label_selector=None): kwargs = {} if field_selector: kwargs["field_selector"] = field_selector if label_selector: kwargs["label_selector"] = label_selector - try: - v1 = client.CoreV1Api() - result = v1.list_service_for_all_namespaces(**kwargs) + result = self.clients[CORE_CLIENT].list_service_for_all_namespaces(**kwargs) return [ { "name": i.metadata.name, @@ -58,3 +76,32 @@ class Kubectl: except ApiException as e: self.logger.error("Error calling get services: {}".format(e)) raise e + + def get_default_storage_class(self) -> str: + """ + Default storage class + + :return: Returns the default storage class name, if exists. + If not, it returns the first storage class. + If there are not storage classes, returns None + """ + storage_classes = self.clients[STORAGE_CLIENT].list_storage_class() + selected_sc = None + default_sc_annotations = { + "storageclass.kubernetes.io/is-default-class": "true", + # Older clusters still use the beta annotation. + "storageclass.beta.kubernetes.io/is-default-class": "true", + } + for sc in storage_classes.items: + if not selected_sc: + # Select the first storage class in case there is no a default-class + selected_sc = sc.metadata.name + annotations = sc.metadata.annotations + if any( + k in annotations and annotations[k] == v + for k, v in default_sc_annotations.items() + ): + # Default storage + selected_sc = sc.metadata.name + break + return selected_sc