]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/nfs: take optional virtual_ip for deploying ingress
authorSage Weil <sage@newdream.net>
Tue, 4 May 2021 17:09:38 +0000 (13:09 -0400)
committerSage Weil <sage@newdream.net>
Tue, 25 May 2021 14:15:45 +0000 (10:15 -0400)
For 'nfs cluster create', optionally take a virtual_ip to deploy ingress.

Signed-off-by: Sage Weil <sage@newdream.net>
src/pybind/mgr/nfs/cluster.py
src/pybind/mgr/nfs/module.py

index a409d2cb0672d0acaa978d46d4346280791f5425..8f8c4f6593a784db9a1bd8677e59a00a359a11b3 100644 (file)
@@ -3,7 +3,7 @@ import socket
 import json
 import re
 
-from ceph.deployment.service_spec import NFSServiceSpec, PlacementSpec
+from ceph.deployment.service_spec import NFSServiceSpec, PlacementSpec, IngressSpec
 
 import orchestrator
 
@@ -49,12 +49,32 @@ class NFSCluster:
     def _get_user_conf_obj_name(self):
         return f'userconf-nfs.{self.cluster_id}'
 
-    def _call_orch_apply_nfs(self, placement):
-        spec = NFSServiceSpec(service_type='nfs', service_id=self.cluster_id,
-                              pool=self.pool_name, namespace=self.pool_ns,
-                              placement=PlacementSpec.from_string(placement))
-        completion = self.mgr.apply_nfs(spec)
-        orchestrator.raise_if_exception(completion)
+    def _call_orch_apply_nfs(self, placement, virtual_ip=None):
+        if virtual_ip:
+            # nfs + ingress
+            # run NFS on non-standard port
+            spec = NFSServiceSpec(service_type='nfs', service_id=self.cluster_id,
+                                  pool=self.pool_name, namespace=self.pool_ns,
+                                  placement=PlacementSpec.from_string(placement),
+                                  # use non-default port so we don't conflict with ingress
+                                  port=12049)
+            completion = self.mgr.apply_nfs(spec)
+            orchestrator.raise_if_exception(completion)
+            ispec = IngressSpec(service_type='ingress',
+                                service_id='nfs.' + self.cluster_id,
+                                backend_service='nfs.' + self.cluster_id,
+                                frontend_port=2049,  # default nfs port
+                                monitor_port=9049,
+                                virtual_ip=virtual_ip)
+            completion = self.mgr.apply_ingress(ispec)
+            orchestrator.raise_if_exception(completion)
+        else:
+            # standalone nfs
+            spec = NFSServiceSpec(service_type='nfs', service_id=self.cluster_id,
+                                  pool=self.pool_name, namespace=self.pool_ns,
+                                  placement=PlacementSpec.from_string(placement))
+            completion = self.mgr.apply_nfs(spec)
+            orchestrator.raise_if_exception(completion)
 
     def create_empty_rados_obj(self):
         common_conf = self._get_common_conf_obj_name()
@@ -67,7 +87,7 @@ class NFSCluster:
                  f"{self.pool_ns}")
 
     @cluster_setter
-    def create_nfs_cluster(self, cluster_id, placement):
+    def create_nfs_cluster(self, cluster_id, placement, virtual_ip):
         try:
             invalid_str = re.search('[^A-Za-z0-9-_.]', cluster_id)
             if invalid_str:
@@ -79,7 +99,7 @@ class NFSCluster:
             self.create_empty_rados_obj()
 
             if cluster_id not in available_clusters(self.mgr):
-                self._call_orch_apply_nfs(placement)
+                self._call_orch_apply_nfs(placement, virtual_ip)
                 return 0, "NFS Cluster Created Successfully", ""
             return 0, "", f"{cluster_id} cluster already exists"
         except Exception as e:
@@ -91,6 +111,8 @@ class NFSCluster:
             cluster_list = available_clusters(self.mgr)
             if cluster_id in cluster_list:
                 self.mgr.export_mgr.delete_all_exports(cluster_id)
+                completion = self.mgr.remove_service('ingress.nfs.' + self.cluster_id)
+                orchestrator.raise_if_exception(completion)
                 completion = self.mgr.remove_service('nfs.' + self.cluster_id)
                 orchestrator.raise_if_exception(completion)
                 self.delete_config_obj()
index 4e597602f0059aa1b3700e66f3b7402a3edd0cf6..8d26f07e1935e1b62b28da389f90ad8b9ddd5bb9 100644 (file)
@@ -63,10 +63,13 @@ class Module(orchestrator.OrchestratorClientMixin, MgrModule):
         return self.export_mgr.update_export(export_config=inbuf)
 
     @CLICommand('nfs cluster create', perm='rw')
-    def _cmd_nfs_cluster_create(self, clusterid: str,
-                                placement: str = None) -> Tuple[int, str, str]:
+    def _cmd_nfs_cluster_create(self,
+                                clusterid: str,
+                                placement: Optional[str]=None,
+                                virtual_ip: Optional[str]=None) -> Tuple[int, str, str]:
         """Create an NFS Cluster"""
-        return self.nfs.create_nfs_cluster(cluster_id=clusterid, placement=placement)
+        return self.nfs.create_nfs_cluster(cluster_id=clusterid, placement=placement,
+                                           virtual_ip=virtual_ip)
 
     @CLICommand('nfs cluster rm', perm='rw')
     def _cmd_nfs_cluster_rm(self, clusterid: str) -> Tuple[int, str, str]: