Merge PR #33955 into octopus

* refs/pull/33955/head:
	mgr/cephadm: respect 'unmanaged' flag in spec
	mgr/orch: orch ls: show <no spec> or <unmanaged> as appropriate
	mgr/orch: orch ls: rename SPEC -> PLACEMENT
	mgr/orch: add 'unmanaged' property to ServiceSpec
	mgr/orch: combine 'orch daemon add <type> ...' into one command
	mgr/orch: combine 'orch apply <type> [<placement>]' into one command

Reviewed-by: Sebastian Wagner <swagner@suse.com>
This commit is contained in:
Sage Weil 2020-03-16 17:36:17 -05:00
commit ae9915f87a
3 changed files with 86 additions and 216 deletions

View File

@ -2210,6 +2210,11 @@ class CephadmOrchestrator(orchestrator.Orchestrator, MgrModule):
on the target label and count specified in the placement.
"""
daemon_type = spec.service_type
service_name = spec.service_name()
if spec.unmanaged:
self.log.debug('Skipping unmanaged service %s spec' % service_name)
return False
self.log.debug('Applying service %s spec' % service_name)
create_fns = {
'mon': self._create_mon,
'mgr': self._create_mgr,
@ -2233,8 +2238,6 @@ class CephadmOrchestrator(orchestrator.Orchestrator, MgrModule):
return trivial_result([])
config_func = config_fns.get(daemon_type, None)
service_name = spec.service_name()
self.log.debug('Applying service %s spec' % service_name)
daemons = self.cache.get_daemons_by_service(service_name)
hosts = HostAssignment(
spec=spec,

View File

@ -342,7 +342,7 @@ class OrchestratorCli(OrchestratorClientMixin, MgrModule):
now = datetime.datetime.utcnow()
table = PrettyTable(
['NAME', 'RUNNING', 'REFRESHED', 'AGE',
'SPEC',
'PLACEMENT',
'IMAGE NAME', 'IMAGE ID',
],
border=False)
@ -352,16 +352,22 @@ class OrchestratorCli(OrchestratorClientMixin, MgrModule):
table.align['AGE'] = 'l'
table.align['IMAGE NAME'] = 'l'
table.align['IMAGE ID'] = 'l'
table.align['SPEC'] = 'l'
table.align['PLACEMENT'] = 'l'
table.left_padding_width = 0
table.right_padding_width = 2
for s in sorted(services, key=lambda s: s.service_name):
if not s.spec:
pl = '<no spec>'
elif s.spec.unmanaged:
pl = '<unmanaged>'
else:
pl = s.spec.placement.pretty_str()
table.add_row((
s.service_name,
'%d/%d' % (s.running, s.size),
nice_delta(now, s.last_refresh, ' ago'),
nice_delta(now, s.created),
s.spec.placement.pretty_str() if s.spec else '-',
pl,
ukn(s.container_image_name),
ukn(s.container_image_id)[0:12],
))
@ -517,30 +523,33 @@ Usage:
return HandleCommandResult(stdout=table.get_string())
@_cli_write_command(
'orch daemon add mon',
'orch daemon add',
'name=daemon_type,type=CephChoices,strings=mon|mgr|rbd-mirror|crash|alertmanager|grafana|node-exporter|prometheus '
'name=placement,type=CephString,req=false',
'Start monitor daemon(s)')
def _daemon_add_mon(self, placement=None):
'Add daemon(s)')
def _daemon_add_misc(self, daemon_type, placement=None):
placement = PlacementSpec.from_string(placement)
placement.validate()
spec = ServiceSpec('mon', placement=placement)
spec = ServiceSpec(daemon_type, placement=placement)
completion = self.add_mon(spec)
self._orchestrator_wait([completion])
raise_if_exception(completion)
return HandleCommandResult(stdout=completion.result_str())
if daemon_type == 'mon':
completion = self.add_mon(spec)
elif daemon_type == 'mgr':
completion = self.add_mgr(spec)
elif daemon_type == 'rbd-mirror':
completion = self.add_rbd_mirror(spec)
elif daemon_type == 'crash':
completion = self.add_crash(spec)
elif daemon_type == 'alertmanager':
completion = self.add_alertmanager(spec)
elif daemon_type == 'grafana':
completion = self.add_grafana(spec)
elif daemon_type == 'node-exporter':
completion = self.add_node_exporter(spec)
elif daemon_type == 'prometheus':
completion = self.add_prometheus(spec)
@_cli_write_command(
'orch daemon add mgr',
'name=placement,type=CephString,req=false',
'Start rbd-mirror daemon(s)')
def _daemon_add_mgr(self, placement=None):
spec = ServiceSpec(
'mgr',
placement=PlacementSpec.from_string(placement),
)
completion = self.add_mgr(spec)
self._orchestrator_wait([completion])
raise_if_exception(completion)
return HandleCommandResult(stdout=completion.result_str())
@ -554,20 +563,6 @@ Usage:
raise_if_exception(completion)
return HandleCommandResult(stdout=completion.result_str())
@_cli_write_command(
'orch daemon add rbd-mirror',
'name=placement,type=CephString,req=false',
'Start rbd-mirror daemon(s)')
def _rbd_mirror_add(self, placement=None):
spec = ServiceSpec(
'rbd-mirror',
placement=PlacementSpec.from_string(placement),
)
completion = self.add_rbd_mirror(spec)
self._orchestrator_wait([completion])
raise_if_exception(completion)
return HandleCommandResult(stdout=completion.result_str())
@_cli_write_command(
'orch daemon add mds',
'name=fs_name,type=CephString '
@ -632,73 +627,6 @@ Usage:
raise_if_exception(completion)
return HandleCommandResult(stdout=completion.result_str())
@_cli_write_command(
'orch daemon add prometheus',
'name=placement,type=CephString,req=false',
'Add prometheus daemon(s)')
def _daemon_add_prometheus(self, placement=None):
spec = ServiceSpec(
'prometheus',
placement=PlacementSpec.from_string(placement),
)
completion = self.add_prometheus(spec)
self._orchestrator_wait([completion])
return HandleCommandResult(stdout=completion.result_str())
@_cli_write_command(
'orch daemon add node-exporter',
'name=placement,type=CephString,req=false',
'Add node-exporter daemon(s)')
def _daemon_add_node_exporter(self, placement=None):
spec = ServiceSpec(
'node-exporter',
placement=PlacementSpec.from_string(placement),
)
completion = self.add_node_exporter(spec)
self._orchestrator_wait([completion])
return HandleCommandResult(stdout=completion.result_str())
@_cli_write_command(
'orch daemon add crash',
'name=placement,type=CephString,req=false',
'Add node-exporter daemon(s)')
def _daemon_add_crash(self, placement=None):
spec = ServiceSpec(
'crash',
placement=PlacementSpec.from_string(placement),
)
completion = self.add_crash(spec)
self._orchestrator_wait([completion])
return HandleCommandResult(stdout=completion.result_str())
@_cli_write_command(
'orch daemon add grafana',
'name=placement,type=CephString,req=false',
'Add grafana daemon(s)')
def _daemon_add_grafana(self, placement=None):
# type: (Optional[str]) -> HandleCommandResult
spec = ServiceSpec(
'grafana',
placement=PlacementSpec.from_string(placement),
)
completion = self.add_grafana(spec)
self._orchestrator_wait([completion])
return HandleCommandResult(stdout=completion.result_str())
@_cli_write_command(
'orch daemon add alertmanager',
'name=placement,type=CephString,req=false',
'Add alertmanager daemon(s)')
def _daemon_add_alertmanager(self, placement=None):
# type: (Optional[str]) -> HandleCommandResult
spec = ServiceSpec(
'alertmanager',
placement=PlacementSpec.from_string(placement),
)
completion = self.add_alertmanager(spec)
self._orchestrator_wait([completion])
return HandleCommandResult(stdout=completion.result_str())
@_cli_write_command(
'orch',
"name=action,type=CephChoices,strings=start|stop|restart|redeploy|reconfig "
@ -766,31 +694,35 @@ Usage:
return HandleCommandResult(stdout=specs)
@_cli_write_command(
'orch apply mgr',
'name=placement,type=CephString,req=false',
'Update the size or placement of managers')
def _apply_mgr(self, placement=None):
'orch apply',
'name=service_type,type=CephChoices,strings=mon|mgr|rbd-mirror|crash|alertmanager|grafana|node-exporter|prometheus '
'name=placement,type=CephString,req=false '
'name=unmanaged,type=CephBool,req=false',
'Update the size or placement for a service')
def _apply_misc(self, service_type, placement=None, unmanaged=False):
placement = PlacementSpec.from_string(placement)
placement.validate()
spec = ServiceSpec('mgr', placement=placement)
spec = ServiceSpec(service_type, placement=placement,
unmanaged=unmanaged)
completion = self.apply_mgr(spec)
self._orchestrator_wait([completion])
raise_if_exception(completion)
return HandleCommandResult(stdout=completion.result_str())
if service_type == 'mgr':
completion = self.apply_mgr(spec)
elif service_type == 'mon':
completion = self.apply_mon(spec)
elif service_type == 'rbd-mirror':
completion = self.apply_rbd_mirror(spec)
elif service_type == 'crash':
completion = self.apply_crash(spec)
elif service_type == 'alertmanager':
completion = self.apply_alertmanager(spec)
elif service_type == 'grafana':
completion = self.apply_grafana(spec)
elif service_type == 'node-exporter':
completion = self.apply_node_exporter(spec)
elif service_type == 'prometheus':
completion = self.apply_prometheus(spec)
@_cli_write_command(
'orch apply mon',
'name=placement,type=CephString,req=false',
'Update the number of monitor instances')
def _apply_mon(self, placement=None):
placement = PlacementSpec.from_string(placement)
placement.validate()
spec = ServiceSpec('mon', placement=placement)
completion = self.apply_mon(spec)
self._orchestrator_wait([completion])
raise_if_exception(completion)
return HandleCommandResult(stdout=completion.result_str())
@ -798,44 +730,34 @@ Usage:
@_cli_write_command(
'orch apply mds',
'name=fs_name,type=CephString '
'name=placement,type=CephString,req=false',
'name=placement,type=CephString,req=false '
'name=unmanaged,type=CephBool,req=false',
'Update the number of MDS instances for the given fs_name')
def _apply_mds(self, fs_name, placement=None):
def _apply_mds(self, fs_name, placement=None, unmanaged=False):
placement = PlacementSpec.from_string(placement)
placement.validate()
spec = ServiceSpec(
'mds', fs_name,
placement=placement)
placement=placement,
unmanaged=unmanaged)
completion = self.apply_mds(spec)
self._orchestrator_wait([completion])
raise_if_exception(completion)
return HandleCommandResult(stdout=completion.result_str())
@_cli_write_command(
'orch apply rbd-mirror',
'name=placement,type=CephString,req=false',
'Update the number of rbd-mirror instances')
def _apply_rbd_mirror(self, placement=None):
spec = ServiceSpec(
'rbd-mirror',
placement=PlacementSpec.from_string(placement),
)
completion = self.apply_rbd_mirror(spec)
self._orchestrator_wait([completion])
raise_if_exception(completion)
return HandleCommandResult(stdout=completion.result_str())
@_cli_write_command(
'orch apply rgw',
'name=realm_name,type=CephString '
'name=zone_name,type=CephString '
'name=placement,type=CephString,req=false',
'name=placement,type=CephString,req=false '
'name=unmanaged,type=CephBool,req=false',
'Update the number of RGW instances for the given zone')
def _apply_rgw(self, zone_name, realm_name, placement=None):
def _apply_rgw(self, zone_name, realm_name, placement=None, unmanaged=False):
spec = RGWSpec(
rgw_realm=realm_name,
rgw_zone=zone_name,
placement=PlacementSpec.from_string(placement),
unmanaged=unmanaged,
)
completion = self.apply_rgw(spec)
self._orchestrator_wait([completion])
@ -845,82 +767,19 @@ Usage:
@_cli_write_command(
'orch apply nfs',
"name=svc_id,type=CephString "
'name=placement,type=CephString,req=false',
'name=placement,type=CephString,req=false '
'name=unmanaged,type=CephBool,req=false',
'Scale an NFS service')
def _apply_nfs(self, svc_id, placement=None):
def _apply_nfs(self, svc_id, placement=None, unmanaged=False):
spec = NFSServiceSpec(
svc_id,
placement=PlacementSpec.from_string(placement),
unmanaged=unmanaged,
)
completion = self.apply_nfs(spec)
self._orchestrator_wait([completion])
return HandleCommandResult(stdout=completion.result_str())
@_cli_write_command(
'orch apply prometheus',
'name=placement,type=CephString,req=false',
'Scale prometheus service')
def _apply_prometheus(self, placement=None):
spec = ServiceSpec(
'prometheus',
placement=PlacementSpec.from_string(placement),
)
completion = self.apply_prometheus(spec)
self._orchestrator_wait([completion])
return HandleCommandResult(stdout=completion.result_str())
@_cli_write_command(
'orch apply grafana',
'name=placement,type=CephString,req=false',
'Scale grafana service')
def _apply_grafana(self, placement=None):
spec = ServiceSpec(
'grafana',
placement=PlacementSpec.from_string(placement),
)
completion = self.apply_grafana(spec)
self._orchestrator_wait([completion])
return HandleCommandResult(stdout=completion.result_str())
@_cli_write_command(
'orch apply alertmanager',
'name=placement,type=CephString,req=false',
'Scale alertmanager service')
def _apply_alertmanager(self, placement=None):
spec = ServiceSpec(
'alertmanager',
placement=PlacementSpec.from_string(placement),
)
completion = self.apply_alertmanager(spec)
self._orchestrator_wait([completion])
return HandleCommandResult(stdout=completion.result_str())
@_cli_write_command(
'orch apply node-exporter',
'name=placement,type=CephString,req=false',
'Update node_exporter service')
def _apply_node_exporter(self, placement=None):
spec = ServiceSpec(
'node-exporter',
placement=PlacementSpec.from_string(placement),
)
completion = self.apply_node_exporter(spec)
self._orchestrator_wait([completion])
return HandleCommandResult(stdout=completion.result_str())
@_cli_write_command(
'orch apply crash',
'name=placement,type=CephString,req=false',
'Update node_exporter service')
def _apply_crash(self, placement=None):
spec = ServiceSpec(
'crash',
placement=PlacementSpec.from_string(placement),
)
completion = self.apply_crash(spec)
self._orchestrator_wait([completion])
return HandleCommandResult(stdout=completion.result_str())
@_cli_write_command(
'orch set backend',
"name=module_name,type=CephString,req=true",

View File

@ -304,15 +304,18 @@ class ServiceSpec(object):
"""
def __init__(self,
service_type, # type: str
service_type, # type: str
service_id=None, # type: Optional[str]
placement: Optional[PlacementSpec] = None,
count: Optional[int] = None):
placement=None, # type: Optional[PlacementSpec]
count=None, # type: Optional[int]
unmanaged=False, # type: bool
):
self.placement = PlacementSpec() if placement is None else placement # type: PlacementSpec
assert service_type
self.service_type = service_type
self.service_id = service_id
self.unmanaged = unmanaged
@classmethod
def from_json(cls, json_spec):
@ -384,9 +387,11 @@ def servicespec_validate_add(self: ServiceSpec):
class NFSServiceSpec(ServiceSpec):
def __init__(self, service_id, pool=None, namespace=None, placement=None,
service_type='nfs'):
service_type='nfs', unmanaged=False):
assert service_type == 'nfs'
super(NFSServiceSpec, self).__init__('nfs', service_id=service_id, placement=placement)
super(NFSServiceSpec, self).__init__(
'nfs', service_id=service_id,
placement=placement, unmanaged=unmanaged)
#: RADOS pool where NFS client recovery data is stored.
self.pool = pool
@ -413,13 +418,16 @@ class RGWSpec(ServiceSpec):
placement=None,
service_type='rgw',
rgw_frontend_port=None, # type: Optional[int]
unmanaged=False, # type: bool
):
assert service_type == 'rgw'
if service_id:
(rgw_realm, rgw_zone) = service_id.split('.', 1)
else:
service_id = '%s.%s' % (rgw_realm, rgw_zone)
super(RGWSpec, self).__init__('rgw', service_id=service_id, placement=placement)
super(RGWSpec, self).__init__(
'rgw', service_id=service_id,
placement=placement, unmanaged=unmanaged)
self.rgw_realm = rgw_realm
self.rgw_zone = rgw_zone