]> git.ipfire.org Git - thirdparty/bacula.git/commitdiff
k8s: Add Ingress integration backup/restore
authorFrancisco Manuel Garcia Botella <francisco.garcia@baculasystems.com>
Thu, 9 May 2024 11:12:49 +0000 (13:12 +0200)
committerEric Bollengier <eric@baculasystems.com>
Wed, 4 Dec 2024 08:10:17 +0000 (09:10 +0100)
bacula/src/plugins/fd/kubernetes-backend/baculak8s/entities/k8sobjtype.py
bacula/src/plugins/fd/kubernetes-backend/baculak8s/plugins/kubernetes_plugin.py
bacula/src/plugins/fd/kubernetes-backend/setup.py

index 265b398abb308c990e069eff9b9bc1990bdc1fe2..c024d59a30296af8db1349fefbd16f55eca91896 100644 (file)
@@ -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',
index 96d07dbf029f044f3666f30b63e5ff1705876da5..dc04c8b106b10cbba5e1744c3dd7fc686890b270 100644 (file)
@@ -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),
index 97bad4b2a3f25de468483feaa7bbaf9358a2dc40..e73fce90454eb925cb42c7e55f6910e6f64b35f0 100644 (file)
@@ -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=[