.. automethod:: Orchestrator.service_action
+.. autoclass:: ServiceSpec
+
OSD management
--------------
Stateless Services
------------------
-.. autoclass:: StatelessServiceSpec
-
.. automethod:: Orchestrator.add_mds
.. automethod:: Orchestrator.remove_mds
.. automethod:: Orchestrator.update_mds
extra_config=extra_config)
def update_mons(self, spec):
- # type: (orchestrator.StatefulServiceSpec) -> orchestrator.Completion
+ # type: (orchestrator.ServiceSpec) -> orchestrator.Completion
"""
Adjust the number of cluster managers.
"""
return self._update_mons(spec)
def _update_mons(self, spec):
- # type: (orchestrator.StatefulServiceSpec) -> orchestrator.Completion
+ # type: (orchestrator.ServiceSpec) -> orchestrator.Completion
"""
Adjust the number of cluster monitors.
"""
@with_services('mgr')
def update_mgrs(self, spec, services):
- # type: (orchestrator.StatefulServiceSpec, List[orchestrator.ServiceDescription]) -> orchestrator.Completion
+ # type: (orchestrator.ServiceSpec, List[orchestrator.ServiceDescription]) -> orchestrator.Completion
"""
Adjust the number of cluster managers.
"""
"""
def __init__(self,
- spec=None, # type: Optional[orchestrator.StatefulServiceSpec]
+ spec=None, # type: Optional[orchestrator.ServiceSpec]
scheduler=None, # type: Optional[BaseScheduler]
get_hosts_func=None, # type: Optional[Callable]
service_type=None, # type: Optional[str]
):
assert spec and get_hosts_func and service_type
- self.spec = spec # type: orchestrator.StatefulServiceSpec
+ self.spec = spec # type: orchestrator.ServiceSpec
self.scheduler = scheduler if scheduler else SimpleScheduler(self.spec.placement)
self.get_hosts_func = get_hosts_func
self.service_type = service_type
def load(self):
- # type: () -> orchestrator.StatefulServiceSpec
+ # type: () -> orchestrator.ServiceSpec
"""
Load nodes into the spec.placement.nodes container.
"""
pass
from orchestrator import ServiceDescription, InventoryNode, \
- StatelessServiceSpec, PlacementSpec, RGWSpec, StatefulServiceSpec, HostSpec
+ ServiceSpec, PlacementSpec, RGWSpec, HostSpec
from tests import mock
from .fixtures import cephadm_module, wait
def test_mon_update(self, _send_command, _get_connection, cephadm_module):
with self._with_host(cephadm_module, 'test'):
ps = PlacementSpec(hosts=['test:0.0.0.0=a'], count=1)
- c = cephadm_module.update_mons(StatefulServiceSpec(placement=ps))
+ c = cephadm_module.update_mons(ServiceSpec(placement=ps))
assert wait(cephadm_module, c) == ["Deployed mon.a on host 'test'"]
@mock.patch("cephadm.module.CephadmOrchestrator._run_cephadm", _run_cephadm('[]'))
def test_mgr_update(self, _send_command, _get_connection, cephadm_module):
with self._with_host(cephadm_module, 'test'):
ps = PlacementSpec(hosts=['test:0.0.0.0=a'], count=1)
- c = cephadm_module.update_mgrs(StatefulServiceSpec(placement=ps))
+ c = cephadm_module.update_mgrs(ServiceSpec(placement=ps))
[out] = wait(cephadm_module, c)
assert "Deployed mgr." in out
assert " on host 'test'" in out
def test_mds(self, _send_command, _get_connection, cephadm_module):
with self._with_host(cephadm_module, 'test'):
ps = PlacementSpec(hosts=['test'], count=1)
- c = cephadm_module.add_mds(StatelessServiceSpec('name', placement=ps))
+ c = cephadm_module.add_mds(ServiceSpec('name', placement=ps))
[out] = wait(cephadm_module, c)
assert "Deployed mds.name." in out
assert " on host 'test'" in out
def test_rbd_mirror(self, _send_command, _get_connection, cephadm_module):
with self._with_host(cephadm_module, 'test'):
ps = PlacementSpec(hosts=['test'], count=1)
- c = cephadm_module.add_rbd_mirror(StatelessServiceSpec(name='name', placement=ps))
+ c = cephadm_module.add_rbd_mirror(ServiceSpec(name='name', placement=ps))
[out] = wait(cephadm_module, c)
assert "Deployed rbd-mirror." in out
assert " on host 'test'" in out
raise NotImplementedError()
def update_mgrs(self, spec):
- # type: (StatefulServiceSpec) -> Completion
+ # type: (ServiceSpec) -> Completion
"""
Update the number of cluster managers.
raise NotImplementedError()
def update_mons(self, spec):
- # type: (StatefulServiceSpec) -> Completion
+ # type: (ServiceSpec) -> Completion
"""
Update the number of cluster monitors.
raise NotImplementedError()
def add_mds(self, spec):
- # type: (StatelessServiceSpec) -> Completion
+ # type: (ServiceSpec) -> Completion
"""Create a new MDS cluster"""
raise NotImplementedError()
raise NotImplementedError()
def update_mds(self, spec):
- # type: (StatelessServiceSpec) -> Completion
+ # type: (ServiceSpec) -> Completion
"""
Update / redeploy existing MDS cluster
Like for example changing the number of service instances.
raise NotImplementedError()
def add_rbd_mirror(self, spec):
- # type: (StatelessServiceSpec) -> Completion
+ # type: (ServiceSpec) -> Completion
"""Create rbd-mirror cluster"""
raise NotImplementedError()
raise NotImplementedError()
def update_rbd_mirror(self, spec):
- # type: (StatelessServiceSpec) -> Completion
+ # type: (ServiceSpec) -> Completion
"""
Update / redeploy rbd-mirror cluster
Like for example changing the number of service instances.
return cls(**data)
-class StatefulServiceSpec(object):
- """ Such as mgrs/mons
+class ServiceSpec(object):
"""
- # TODO: create base class for Stateless/Stateful service specs and propertly inherit
- def __init__(self, name=None, placement=None):
- # type: (Optional[str], Optional[PlacementSpec]) -> None
- self.placement = PlacementSpec() if placement is None else placement # type: PlacementSpec
- self.name = name
+ Details of service creation.
- # for backwards-compatibility
- if self.placement is not None and self.placement.count is not None:
- self.count = self.placement.count
- else:
- self.count = 1
+ Request to the orchestrator for a cluster of daemons
+ such as MDS, RGW, iscsi gateway, MONs, MGRs, Prometheus
+ This structure is supposed to be enough information to
+ start the services.
-class StatelessServiceSpec(object):
- # Request to orchestrator for a group of stateless services
- # such as MDS, RGW, nfs gateway, iscsi gateway
"""
- Details of stateless service creation.
- Request to orchestrator for a group of stateless services
- such as MDS, RGW or iscsi gateway
- """
- # This structure is supposed to be enough information to
- # start the services.
-
- def __init__(self, name, placement=None):
+ def __init__(self, name=None, placement=None):
+ # type: (Optional[str], Optional[PlacementSpec]) -> None
self.placement = PlacementSpec() if placement is None else placement # type: PlacementSpec
- #: Give this set of statelss services a name: typically it would
+ #: Give this set of stateless services a name: typically it would
#: be the name of a CephFS filesystem, RGW zone, etc. Must be unique
- #: within one ceph cluster.
- self.name = name # type: str
+ #: within one ceph cluster. Note: Not all clusters have a name
+ self.name = name # type: Optional[str]
- #: Count of service instances
- self.count = self.placement.count if self.placement is not None else 1 # for backwards-compatibility
+ if self.placement is not None and self.placement.count is not None:
+ #: Count of service instances. Deprecated.
+ self.count = self.placement.count # type: int
+ else:
+ self.count = 1
def validate_add(self):
if not self.name:
raise OrchestratorValidationError('Cannot add Service: Name required')
-class NFSServiceSpec(StatelessServiceSpec):
+class NFSServiceSpec(ServiceSpec):
def __init__(self, name, pool=None, namespace=None, placement=None):
super(NFSServiceSpec, self).__init__(name, placement)
raise OrchestratorValidationError('Cannot add NFS: No Pool specified')
-class RGWSpec(StatelessServiceSpec):
+class RGWSpec(ServiceSpec):
"""
Settings to configure a (multisite) Ceph RGW
"name=hosts,type=CephString,n=N,req=false",
'Create an rbd-mirror service')
def _rbd_mirror_add(self, num=None, hosts=None):
- spec = orchestrator.StatelessServiceSpec(
+ spec = orchestrator.ServiceSpec(
None,
placement=orchestrator.PlacementSpec(hosts=hosts, count=num))
completion = self.add_rbd_mirror(spec)
"name=label,type=CephString,req=false",
'Update the number of rbd-mirror instances')
def _rbd_mirror_update(self, num, label=None, hosts=[]):
- spec = orchestrator.StatelessServiceSpec(
+ spec = orchestrator.ServiceSpec(
None,
placement=orchestrator.PlacementSpec(hosts=hosts, count=num, label=label))
completion = self.update_rbd_mirror(spec)
"name=hosts,type=CephString,n=N,req=false",
'Create an MDS service')
def _mds_add(self, fs_name, num=None, hosts=None):
- spec = orchestrator.StatelessServiceSpec(
+ spec = orchestrator.ServiceSpec(
fs_name,
placement=orchestrator.PlacementSpec(hosts=hosts, count=num))
completion = self.add_mds(spec)
placement = orchestrator.PlacementSpec(label=label, count=num, hosts=hosts)
placement.validate()
- spec = orchestrator.StatelessServiceSpec(
+ spec = orchestrator.ServiceSpec(
fs_name,
placement=placement)
placement = orchestrator.PlacementSpec(label=label, count=num, hosts=hosts)
placement.validate()
- spec = orchestrator.StatefulServiceSpec(placement=placement)
+ spec = orchestrator.ServiceSpec(placement=placement)
completion = self.update_mgrs(spec)
self._orchestrator_wait([completion])
placement = orchestrator.PlacementSpec(label=label, count=num, hosts=hosts)
placement.validate()
- spec = orchestrator.StatefulServiceSpec(placement=placement)
+ spec = orchestrator.ServiceSpec(placement=placement)
completion = self.update_mons(spec)
self._orchestrator_wait([completion])
)
def add_mds(self, spec):
- # type: (orchestrator.StatelessServiceSpec) -> RookCompletion
+ # type: (orchestrator.ServiceSpec) -> RookCompletion
return self._service_add_decorate('MDS', spec,
self.rook_cluster.add_filesystem)
)
def update_mons(self, spec):
- # type: (orchestrator.StatefulServiceSpec) -> RookCompletion
+ # type: (orchestrator.ServiceSpec) -> RookCompletion
if spec.placement.hosts or spec.placement.label:
raise RuntimeError("Host list or label is not supported by rook.")
)
def update_mds(self, spec):
- # type: (orchestrator.StatelessServiceSpec) -> RookCompletion
+ # type: (orchestrator.ServiceSpec) -> RookCompletion
num = spec.count
return write_completion(
lambda: self.rook_cluster.update_mds_count(spec.name, num),
raise
def add_filesystem(self, spec):
- # type: (orchestrator.StatelessServiceSpec) -> None
+ # type: (orchestrator.ServiceSpec) -> None
# TODO use spec.placement
# TODO warn if spec.extended has entries we don't kow how
# to action.
@deferred_write("update_mgrs")
def update_mgrs(self, spec):
- # type: (orchestrator.StatefulServiceSpec) -> None
+ # type: (orchestrator.ServiceSpec) -> None
assert not spec.placement.hosts or len(spec.placement.hosts) == spec.placement.count
assert all([isinstance(h, str) for h in spec.placement.hosts])
@deferred_write("update_mons")
def update_mons(self, spec):
- # type: (orchestrator.StatefulServiceSpec) -> None
+ # type: (orchestrator.ServiceSpec) -> None
assert not spec.placement.hosts or len(spec.placement.hosts) == spec.placement.count
assert all([isinstance(h[0], str) for h in spec.placement.hosts])
return mgr.mon_command(command)
def create_mds(mgr, fs_name):
- spec = orchestrator.StatelessServiceSpec(fs_name)
+ spec = orchestrator.ServiceSpec(fs_name)
try:
completion = mgr.add_mds(spec)
mgr._orchestrator_wait([completion])