From: Francisco Manuel Garcia Botella Date: Thu, 9 May 2024 11:12:49 +0000 (+0200) Subject: k8s: Add Ingress integration backup/restore X-Git-Tag: Release-15.0.3~60 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=796a17954c386e35665baff05e8b846f09704ced;p=thirdparty%2Fbacula.git k8s: Add Ingress integration backup/restore --- diff --git a/bacula/src/plugins/fd/kubernetes-backend/baculak8s/entities/k8sobjtype.py b/bacula/src/plugins/fd/kubernetes-backend/baculak8s/entities/k8sobjtype.py index 265b398ab..c024d59a3 100644 --- a/bacula/src/plugins/fd/kubernetes-backend/baculak8s/entities/k8sobjtype.py +++ b/bacula/src/plugins/fd/kubernetes-backend/baculak8s/entities/k8sobjtype.py @@ -27,6 +27,7 @@ class K8SObjType(object): K8SOBJ_DAEMONSET = 'ds' K8SOBJ_DEPLOYMENT = 'dp' K8SOBJ_ENDPOINT = 'ep' + K8SOBJ_INGRESS = 'ing' K8SOBJ_LIMITRANGE = 'lr' K8SOBJ_NAMESPACE = 'ns' K8SOBJ_POD = 'pod' @@ -54,6 +55,7 @@ class K8SObjType(object): K8SOBJ_DAEMONSET: 'daemonsets', K8SOBJ_DEPLOYMENT: 'deployments', K8SOBJ_ENDPOINT: 'endpoints', + K8SOBJ_INGRESS: 'ingress', K8SOBJ_LIMITRANGE: 'limitranges', K8SOBJ_NAMESPACE: K8SOBJ_NAMESPACE_Path, K8SOBJ_POD: 'pods', @@ -76,6 +78,7 @@ class K8SObjType(object): K8SOBJ_DAEMONSET: 'daemon_set', K8SOBJ_DEPLOYMENT: 'deployment', K8SOBJ_ENDPOINT: 'endpoint', + K8SOBJ_INGRESS: 'ingress', K8SOBJ_LIMITRANGE: 'limitrange', K8SOBJ_NAMESPACE: 'namespace', K8SOBJ_POD: 'pod', diff --git a/bacula/src/plugins/fd/kubernetes-backend/baculak8s/plugins/kubernetes_plugin.py b/bacula/src/plugins/fd/kubernetes-backend/baculak8s/plugins/kubernetes_plugin.py index 96d07dbf0..dc04c8b10 100644 --- a/bacula/src/plugins/fd/kubernetes-backend/baculak8s/plugins/kubernetes_plugin.py +++ b/bacula/src/plugins/fd/kubernetes-backend/baculak8s/plugins/kubernetes_plugin.py @@ -36,6 +36,7 @@ from baculak8s.plugins.k8sbackend.csi_snapshot import * from baculak8s.plugins.k8sbackend.daemonset import * from baculak8s.plugins.k8sbackend.deployment import * from baculak8s.plugins.k8sbackend.endpoints import * +from baculak8s.plugins.k8sbackend.ingress import * from baculak8s.plugins.k8sbackend.k8sfileinfo import NOW_TIMESTAMP from baculak8s.plugins.k8sbackend.limitrange import * from baculak8s.plugins.k8sbackend.namespaces import * @@ -118,6 +119,7 @@ class KubernetesPlugin(Plugin): self.storagev1api = None self.clientConfiguration = None self.clientAPI = None + self.networkv1api = None self.k8s = { K8SObjType.K8SOBJ_PVOLUME: {}, K8SObjType.K8SOBJ_NAMESPACE: {}, @@ -187,6 +189,7 @@ class KubernetesPlugin(Plugin): self.appsv1api = client.AppsV1Api(api_client=self.clientAPI) self.storagev1api = client.StorageV1Api(api_client=self.clientAPI) self.crd_api = client.CustomObjectsApi(api_client=self.clientAPI) # To manage csi snapshots + self.networkv1api = client.NetworkingV1Api(api_client=self.clientAPI) # To manage ingress logging.getLogger(requests.packages.urllib3.__package__).setLevel(logging.ERROR) logging.getLogger(client.rest.__package__).setLevel(logging.ERROR) @@ -409,6 +412,9 @@ class KubernetesPlugin(Plugin): return self.__execute(lambda: stateful_sets_list_namespaced(self.appsv1api, namespace, estimate, self.config['labels'])) + def get_ingresses(self, namespace, estimate=False): + return self.__execute(lambda: ingress_list_namespaced(self.networkv1api, namespace, estimate, + self.config['labels'])) def list_all_persistentvolumes_names(self): self.k8s[K8SObjType.K8SOBJ_PVOLUME] = self.__execute(lambda: persistentvolumes_list_all_names(self.corev1api)) return self.k8s[K8SObjType.K8SOBJ_PVOLUME] @@ -444,6 +450,7 @@ class KubernetesPlugin(Plugin): self.get_stateful_sets(namespace, estimate), self.get_deployments(namespace, estimate), self.get_replication_controller(namespace, estimate), + self.get_ingresses(namespace,estimate), ] return data @@ -503,6 +510,9 @@ class KubernetesPlugin(Plugin): def upload_stateful_set(self, file_info, file_content): return self.__execute(lambda: stateful_sets_restore_namespaced(self.appsv1api, file_info, file_content)) + def upload_ingress(self, file_info, file_content): + return self.__execute(lambda: ingress_restore_namespaced(self.networkv1api, file_info, file_content)) + def __restore_k8s_object(self, file_info, file_content_source=None): file_content = b'' if file_info.size != 0 and file_content_source is not None: @@ -606,6 +616,9 @@ class KubernetesPlugin(Plugin): return self.__exec_check_object( lambda: self.appsv1api.read_namespaced_stateful_set(k8sfile2objname(file_info.name), file_info.namespace)) + def _check_ingress(self, file_info): + return self.__exec_check_object(lambda: ingress_check(self.networkv1api, file_info)) + def _check_replication_controller(self, file_info): return self.__exec_check_object( lambda: self.corev1api.read_namespaced_replication_controller(k8sfile2objname(file_info.name), diff --git a/bacula/src/plugins/fd/kubernetes-backend/setup.py b/bacula/src/plugins/fd/kubernetes-backend/setup.py index 97bad4b2a..e73fce904 100644 --- a/bacula/src/plugins/fd/kubernetes-backend/setup.py +++ b/bacula/src/plugins/fd/kubernetes-backend/setup.py @@ -27,7 +27,7 @@ setup( version='2.2.0', author='Radoslaw Korzeniewski, Francisco Manuel Garcia Botella', author_email='radekk@korzeniewski.net, francisco.garcia@baculasystems.com', - packages=find_packages(exclude=('tests', 'tests.*')), + packages=find_packages(exclude=('tests', 'tests.*', 'docker')), # packages=packages, license="Bacula® - The Network Backup Solution", data_files=[