]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
mgr/rook: Fix RGW creation
authorSebastian Wagner <sebastian.wagner@suse.com>
Mon, 22 Jul 2019 18:59:13 +0000 (20:59 +0200)
committerSebastian Wagner <sebastian.wagner@suse.com>
Wed, 31 Jul 2019 07:48:50 +0000 (09:48 +0200)
* Moved RGWSpec defaults to a new method

Signed-off-by: Sebastian Wagner <sebastian.wagner@suse.com>
src/pybind/mgr/ansible/module.py
src/pybind/mgr/orchestrator.py
src/pybind/mgr/orchestrator_cli/module.py
src/pybind/mgr/rook/rook_cluster.py

index b52c6b526f5e457f0ba739fef0477f34c99d2ed7..9b00401b8b537ae6824734326519da16070e2495 100644 (file)
@@ -711,6 +711,7 @@ class Module(MgrModule, orchestrator.Orchestrator):
             raise orchestrator.OrchestratorError("No hosts provided. "
                 "At least one destination host is needed to install the RGW "
                 "service")
+        spec.set_ansible_defaults()
         InventoryGroup("rgws", self.ar_client).update(hosts)
 
         # Limit playbook execution to certain hosts
@@ -719,6 +720,9 @@ class Module(MgrModule, orchestrator.Orchestrator):
         # Add the settings for this service
         extravars = {k:v for (k,v) in spec.__dict__.items() if k.startswith('rgw_')}
         extravars['rgw_zone'] = spec.name
+        extravars['rgw_multisite_endpoint_addr'] = spec.rgw_multisite_endpoint_addr
+        extravars['rgw_multisite_endpoints_list'] = spec.rgw_multisite_endpoints_list
+        extravars['rgw_frontend_port'] = str(spec.rgw_frontend_port)
 
         # Group hosts by resource (used in rm ops)
         resource_group = "rgw_zone_{}".format(spec.name)
index 9a08e4ff2b4d51b5ebffb2fe491d53cf65d92f47..30dc36e2b3b10117d8b217a2969662973dd58860 100644 (file)
@@ -695,41 +695,60 @@ class RGWSpec(StatelessServiceSpec):
     """
     # TODO: move all default values to a dedicated method. I don't want to overwrite
     # Rook's default values.
-    def __init__(self, hosts=None, rgw_multisite=True, rgw_zone="Default_Zone",
-              rgw_zonemaster=True, rgw_zonesecondary=False,
-              rgw_multisite_proto="http", rgw_frontend_port="8080",
-              rgw_zonegroup="Main", rgw_zone_user="zone.user",
-              rgw_realm="RGW_Realm", system_access_key=None,
-              system_secret_key=None):
-
-        super(RGWSpec, self).__init__(name=rgw_zone)
+    def __init__(self, hosts=None, rgw_multisite=None, rgw_zone=None,
+              rgw_zonemaster=None, rgw_zonesecondary=None,
+              rgw_multisite_proto=None, rgw_frontend_port=None,
+              rgw_zonegroup=None, rgw_zone_user=None,
+              rgw_realm=None, system_access_key=None,
+              system_secret_key=None, count=None):
+
+        super(RGWSpec, self).__init__(name=rgw_zone, count=count)
+
+        #: List of hosts where RGWs should run. Not for Rook.
         self.hosts = hosts
+
         self.rgw_multisite = rgw_multisite
         self.rgw_zonemaster = rgw_zonemaster
         self.rgw_zonesecondary = rgw_zonesecondary
         self.rgw_multisite_proto = rgw_multisite_proto
         self.rgw_frontend_port = rgw_frontend_port
 
-        if hosts and self.rgw_multisite:
-            self.rgw_multisite_endpoint_addr = hosts[0]
-
-            self.rgw_multisite_endpoints_list = ",".join(
-                ["{}://{}:{}".format(self.rgw_multisite_proto,
-                                    host,
-                                    self.rgw_frontend_port) for host in hosts])
-
         self.rgw_zonegroup = rgw_zonegroup
         self.rgw_zone_user = rgw_zone_user
         self.rgw_realm = rgw_realm
 
-        if system_access_key:
-            self.system_access_key = system_access_key
-        else:
-            self.system_access_key = self.genkey(20)
-        if system_secret_key:
-            self.system_secret_key = system_secret_key
-        else:
-            self.system_secret_key = self.genkey(40)
+        self.system_access_key = system_access_key
+        self.system_secret_key = system_secret_key
+
+    def set_ansible_defaults(self):
+        self.rgw_multisite = self.rgw_multisite if self.rgw_multisite is not None else True
+        self.rgw_zonemaster = self.rgw_zonemaster if self.rgw_zonemaster is not None else True
+        self.rgw_zonesecondary = self.rgw_zonesecondary \
+            if self.rgw_zonesecondary is not None else False
+        self.rgw_multisite_proto = self.rgw_multisite_proto \
+            if self.rgw_multisite_proto is not None else "http"
+        self.rgw_frontend_port = self.rgw_frontend_port \
+            if self.rgw_frontend_port is not None else 8080
+
+        self.rgw_zonegroup = self.rgw_zonegroup if self.rgw_zonegroup is not None else "Main"
+        self.rgw_zone_user = self.rgw_zone_user if self.rgw_zone_user is not None else "zone.user"
+        self.rgw_realm = self.rgw_realm if self.rgw_realm is not None else "RGW_Realm"
+
+        self.system_access_key = self.system_access_key \
+            if self.system_access_key is not None else self.genkey(20)
+        self.system_secret_key = self.system_secret_key \
+            if self.system_secret_key is not None else self.genkey(40)
+
+    @property
+    def rgw_multisite_endpoint_addr(self):
+        """Returns the first host. Not supported for Rook."""
+        return self.hosts[0]
+
+    @property
+    def rgw_multisite_endpoints_list(self):
+        return ",".join(["{}://{}:{}".format(self.rgw_multisite_proto,
+                             host,
+                             self.rgw_frontend_port) for host in self.hosts])
 
     def genkey(self, nchars):
         """ Returns a random string of nchars
index b8d5241fad1cf71df805a6246cd8f9afc34a35d9..cf8b5b784d1950e28dca4d87d0c70e786a5cb09e 100644 (file)
@@ -234,10 +234,10 @@ Usage:
         return HandleCommandResult(stdout=completion.result)
 
     @_write_cli('orchestrator rgw add',
-                'name=svc_arg,type=CephString,req=false',
+                'name=zone_name,type=CephString,req=false',
                 'Create an RGW service. A complete <rgw_spec> can be provided'\
                 ' using <-i> to customize completelly the RGW service')
-    def _rgw_add(self, svc_arg=None, inbuf=None):
+    def _rgw_add(self, zone_name=None, inbuf=None):
         usage = """
 Usage:
   ceph orchestrator rgw add -i <json_file>
@@ -250,16 +250,15 @@ Usage:
             except ValueError as e:
                 msg = 'Failed to read JSON input: {}'.format(str(e)) + usage
                 return HandleCommandResult(-errno.EINVAL, stderr=msg)
-        elif svc_arg:
-            rgw_spec = orchestrator.RGWSpec()
-            rgw_spec.zone_name = svc_arg
+        elif zone_name:
+            rgw_spec = orchestrator.RGWSpec(rgw_zone=zone_name)
         else:
             return HandleCommandResult(-errno.EINVAL, stderr=usage)
 
         completion = self.add_rgw(rgw_spec)
         self._orchestrator_wait([completion])
         orchestrator.raise_if_exception(completion)
-        return HandleCommandResult(stdout=completion.result)
+        return HandleCommandResult(stdout=str(completion.result))
 
     @_write_cli('orchestrator nfs add',
                 "name=svc_arg,type=CephString "
index 50193ef3f7b0c435ac3e513d9ee78caeb5e60c32..84a0063f17cfed26922ac37916ad34de6b623068 100644 (file)
@@ -251,6 +251,7 @@ class RookCluster(object):
             self.rook_api_post("cephnfses/", body=rook_nfsgw)
 
     def add_objectstore(self, spec):
+        # type: (orchestrator.RGWSpec) -> None
         rook_os = {
             "apiVersion": self.rook_env.api_name,
             "kind": "CephObjectStore",
@@ -273,13 +274,13 @@ class RookCluster(object):
                 },
                 "gateway": {
                     "type": "s3",
-                    "port": 80,
-                    "instances": 1,
+                    "port": spec.rgw_frontend_port if spec.rgw_frontend_port is not None else 80,
+                    "instances": spec.count,
                     "allNodes": False
                 }
             }
         }
-        
+
         with self.ignore_409("CephObjectStore '{0}' already exists".format(spec.name)):
             self.rook_api_post("cephobjectstores/", body=rook_os)