From c09cd1ccd89d797cce6266b6d8186599b6d288ef Mon Sep 17 00:00:00 2001 From: Sebastian Wagner Date: Mon, 22 Jul 2019 20:59:13 +0200 Subject: [PATCH] mgr/rook: Fix RGW creation * Moved RGWSpec defaults to a new method Signed-off-by: Sebastian Wagner --- src/pybind/mgr/ansible/module.py | 4 ++ src/pybind/mgr/orchestrator.py | 67 +++++++++++++++-------- src/pybind/mgr/orchestrator_cli/module.py | 11 ++-- src/pybind/mgr/rook/rook_cluster.py | 7 ++- 4 files changed, 56 insertions(+), 33 deletions(-) diff --git a/src/pybind/mgr/ansible/module.py b/src/pybind/mgr/ansible/module.py index b52c6b526f5e4..9b00401b8b537 100644 --- a/src/pybind/mgr/ansible/module.py +++ b/src/pybind/mgr/ansible/module.py @@ -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) diff --git a/src/pybind/mgr/orchestrator.py b/src/pybind/mgr/orchestrator.py index 9a08e4ff2b4d5..30dc36e2b3b10 100644 --- a/src/pybind/mgr/orchestrator.py +++ b/src/pybind/mgr/orchestrator.py @@ -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 diff --git a/src/pybind/mgr/orchestrator_cli/module.py b/src/pybind/mgr/orchestrator_cli/module.py index b8d5241fad1cf..cf8b5b784d195 100644 --- a/src/pybind/mgr/orchestrator_cli/module.py +++ b/src/pybind/mgr/orchestrator_cli/module.py @@ -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 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 @@ -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 " diff --git a/src/pybind/mgr/rook/rook_cluster.py b/src/pybind/mgr/rook/rook_cluster.py index 50193ef3f7b0c..84a0063f17cfe 100644 --- a/src/pybind/mgr/rook/rook_cluster.py +++ b/src/pybind/mgr/rook/rook_cluster.py @@ -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) -- 2.39.5