コード例 #1
0
ファイル: inventory.py プロジェクト: steveftaylor/ceph
 def agent_config_successfully_delivered(
         self, daemon_spec: CephadmDaemonDeploySpec) -> None:
     # agent successfully received new config. Update config/deps
     assert daemon_spec.service_name == 'agent'
     self.update_daemon_config_deps(daemon_spec.host, daemon_spec.name(),
                                    daemon_spec.deps, datetime_now())
     self.agent_timestamp[daemon_spec.host] = datetime_now()
     self.agent_counter[daemon_spec.host] = 1
     self.save_host(daemon_spec.host)
コード例 #2
0
    def _create_daemon(
        self,
        daemon_spec: CephadmDaemonDeploySpec,
        reconfig: bool = False,
        osd_uuid_map: Optional[Dict[str, Any]] = None,
    ) -> str:

        with set_exception_subject('service',
                                   orchestrator.DaemonDescription(
                                       daemon_type=daemon_spec.daemon_type,
                                       daemon_id=daemon_spec.daemon_id,
                                       hostname=daemon_spec.host,
                                   ).service_id(),
                                   overwrite=True):

            try:
                image = ''
                start_time = datetime_now()
                ports: List[
                    int] = daemon_spec.ports if daemon_spec.ports else []

                if daemon_spec.daemon_type == 'container':
                    spec = cast(
                        CustomContainerSpec,
                        self.mgr.spec_store[daemon_spec.service_name].spec)
                    image = spec.image
                    if spec.ports:
                        ports.extend(spec.ports)

                if daemon_spec.daemon_type == 'cephadm-exporter':
                    if not reconfig:
                        assert daemon_spec.host
                        deploy_ok = self._deploy_cephadm_binary(
                            daemon_spec.host)
                        if not deploy_ok:
                            msg = f"Unable to deploy the cephadm binary to {daemon_spec.host}"
                            self.log.warning(msg)
                            return msg

                if daemon_spec.daemon_type == 'haproxy':
                    haspec = cast(
                        HA_RGWSpec,
                        self.mgr.spec_store[daemon_spec.service_name].spec)
                    if haspec.haproxy_container_image:
                        image = haspec.haproxy_container_image

                if daemon_spec.daemon_type == 'keepalived':
                    haspec = cast(
                        HA_RGWSpec,
                        self.mgr.spec_store[daemon_spec.service_name].spec)
                    if haspec.keepalived_container_image:
                        image = haspec.keepalived_container_image

                # TCP port to open in the host firewall
                if len(ports) > 0:
                    daemon_spec.extra_args.extend(
                        ['--tcp-ports', ' '.join(map(str, ports))])

                # osd deployments needs an --osd-uuid arg
                if daemon_spec.daemon_type == 'osd':
                    if not osd_uuid_map:
                        osd_uuid_map = self.mgr.get_osd_uuid_map()
                    osd_uuid = osd_uuid_map.get(daemon_spec.daemon_id)
                    if not osd_uuid:
                        raise OrchestratorError('osd.%s not in osdmap' %
                                                daemon_spec.daemon_id)
                    daemon_spec.extra_args.extend(['--osd-fsid', osd_uuid])

                if reconfig:
                    daemon_spec.extra_args.append('--reconfig')
                if self.mgr.allow_ptrace:
                    daemon_spec.extra_args.append('--allow-ptrace')

                if self.mgr.cache.host_needs_registry_login(
                        daemon_spec.host) and self.mgr.registry_url:
                    self._registry_login(daemon_spec.host,
                                         self.mgr.registry_url,
                                         self.mgr.registry_username,
                                         self.mgr.registry_password)

                daemon_spec.extra_args.extend(['--config-json', '-'])

                self.log.info('%s daemon %s on %s' %
                              ('Reconfiguring' if reconfig else 'Deploying',
                               daemon_spec.name(), daemon_spec.host))

                out, err, code = self._run_cephadm(
                    daemon_spec.host,
                    daemon_spec.name(),
                    'deploy', [
                        '--name',
                        daemon_spec.name(),
                    ] + daemon_spec.extra_args,
                    stdin=json.dumps(daemon_spec.final_config),
                    image=image)
                if not code and daemon_spec.host in self.mgr.cache.daemons:
                    # prime cached service state with what we (should have)
                    # just created
                    sd = daemon_spec.to_daemon_description(1, 'starting')
                    self.mgr.cache.add_daemon(daemon_spec.host, sd)
                    if daemon_spec.daemon_type in [
                            'grafana', 'iscsi', 'prometheus', 'alertmanager'
                    ]:
                        self.mgr.requires_post_actions.add(
                            daemon_spec.daemon_type)
                self.mgr.cache.invalidate_host_daemons(daemon_spec.host)
                self.mgr.cache.update_daemon_config_deps(
                    daemon_spec.host, daemon_spec.name(), daemon_spec.deps,
                    start_time)
                self.mgr.cache.save_host(daemon_spec.host)
                msg = "{} {} on host '{}'".format(
                    'Reconfigured' if reconfig else 'Deployed',
                    daemon_spec.name(), daemon_spec.host)
                if not code:
                    self.mgr.events.for_daemon(daemon_spec.name(),
                                               OrchestratorEvent.INFO, msg)
                else:
                    what = 'reconfigure' if reconfig else 'deploy'
                    self.mgr.events.for_daemon(daemon_spec.name(),
                                               OrchestratorEvent.ERROR,
                                               f'Failed to {what}: {err}')
                return msg
            except OrchestratorError:
                if not reconfig:
                    # we have to clean up the daemon. E.g. keyrings.
                    servict_type = daemon_type_to_service(
                        daemon_spec.daemon_type)
                    dd = daemon_spec.to_daemon_description(-1, 'failed')
                    self.mgr.cephadm_services[servict_type].post_remove(dd)
                raise