# type: (ServiceSpec) -> orchestrator.Completion
return self._add_daemon('mgr', spec, self._create_mgr)
- def _apply(self, spec):
+ def _apply(self, spec: ServiceSpec):
if spec.placement.is_empty():
# fill in default placement
defaults = {
self._kick_serve_loop()
return trivial_result("Scheduled %s update..." % spec.service_type)
+ def apply(self, specs: List[ServiceSpec]) -> AsyncCompletion:
+ return self._apply(specs)
+
def apply_mgr(self, spec):
return self._apply(spec)
"""
Loads all entries from the service_spec mon_store root.
"""
- specs = list()
- for spec in self.spec_store.find(service_name=service_name):
- specs.append('---')
- specs.append(yaml.safe_dump(spec.to_json()))
- return trivial_result(specs)
-
- def apply_service_config(self, spec_document: str) -> orchestrator.Completion:
- """
- Parse a multi document yaml file (represented in a inbuf object)
- and loads it with it's respective ServiceSpec to validate the
- initial input.
- If no errors are raised, save them.
- """
- content: Iterator[Any] = yaml.load_all(spec_document)
- # Load all specs from a multi document yaml file.
- loaded_specs: List[ServiceSpec] = list()
- for spec in content:
- # load ServiceSpec once to validate
- spec_o = ServiceSpec.from_json(spec)
- loaded_specs.append(spec_o)
- for spec in loaded_specs:
- self.spec_store.save(spec)
- self._kick_serve_loop()
- return trivial_result("ServiceSpecs saved")
+ return trivial_result(self.spec_store.find(service_name=service_name))
class BaseScheduler(object):
c = cephadm_module.apply_node_exporter(spec)
_save_spec.assert_called_with(spec)
assert wait(cephadm_module, c) == 'Scheduled node_exporter update...'
-
- @mock.patch("cephadm.module.CephadmOrchestrator._run_cephadm", _run_cephadm('{}'))
- @mock.patch("cephadm.module.SpecStore.save")
- @mock.patch("cephadm.module.yaml.load_all", return_value=[{'service_type': 'rgw', 'placement': {'count': 1}, 'spec': {'rgw_realm': 'realm1', 'rgw_zone': 'zone1'}}])
- @mock.patch("cephadm.module.ServiceSpec")
- def test_apply_service_config(self, _sspec, _yaml, _save_spec, cephadm_module):
- with self._with_host(cephadm_module, 'test'):
- c = cephadm_module.apply_service_config('dummy')
- _save_spec.assert_called_once()
- _sspec.from_json.assert_called_once()
- assert wait(cephadm_module, c) == 'ServiceSpecs saved'
-
from mgr_util import format_bytes, to_pretty_timedelta
try:
- from typing import List, Set, Optional, Dict
+ from typing import List, Set, Optional, Dict, Iterator
except ImportError:
pass # just for type checking.
raise_if_exception(completion)
return HandleCommandResult(stdout=completion.result_str())
- @_cli_write_command(
- 'orch apply',
- desc='Applies a Service Specification from a file. ceph orch apply -i $file')
- def _apply_services(self, inbuf):
- completion = self.apply_service_config(inbuf)
- 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 '
completion = self.list_specs(service_name=service_name)
self._orchestrator_wait([completion])
raise_if_exception(completion)
- specs = completion.result_str()
- return HandleCommandResult(stdout=specs)
+ specs = completion.result()
+ return HandleCommandResult(stdout=yaml.safe_dump_all(specs))
@_cli_write_command(
'orch apply',
- 'name=service_type,type=CephChoices,strings=mon|mgr|rbd-mirror|crash|alertmanager|grafana|node-exporter|prometheus '
+ 'name=service_type,type=CephChoices,strings=mon|mgr|rbd-mirror|crash|alertmanager|grafana|node-exporter|prometheus,req=false '
'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()
+ 'Update the size or placement for a service or apply a large yaml spec')
+ def _apply_misc(self, service_type=None, placement=None, unmanaged=False, inbuf=None):
+ usage = """Usage:
+ ceph orch apply -i <yaml spec>
+ ceph orch apply <service_type> <placement> [--unmanaged]
+ """
+ if inbuf:
+ if service_type or placement or unmanaged:
+ raise OrchestratorValidationError(usage)
+ content: Iterator = yaml.load_all(inbuf)
+ specs = [ServiceSpec.from_json(s) for s in content]
+ else:
+ placement = PlacementSpec.from_string(placement)
+ placement.validate()
- spec = ServiceSpec(service_type, placement=placement,
- unmanaged=unmanaged)
-
- 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)
+ specs = [ServiceSpec(service_type, placement=placement, unmanaged=unmanaged)]
+ completion = self.apply(specs)
self._orchestrator_wait([completion])
raise_if_exception(completion)
return HandleCommandResult(stdout=completion.result_str())