]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/cephadm: move _get_container_image_info to serve.py
authorSebastian Wagner <sebastian.wagner@suse.com>
Wed, 6 Jan 2021 13:38:35 +0000 (14:38 +0100)
committerSebastian Wagner <sebastian.wagner@suse.com>
Mon, 11 Jan 2021 13:59:35 +0000 (14:59 +0100)
Signed-off-by: Sebastian Wagner <sebastian.wagner@suse.com>
src/pybind/mgr/cephadm/module.py
src/pybind/mgr/cephadm/serve.py
src/pybind/mgr/cephadm/upgrade.py
src/pybind/mgr/cephadm/utils.py

index 639faebf787a2e21f78bb7cc1e33993b0a99395d..b438a564901bb9aea4b692463c475cc1ee93ba5d 100644 (file)
@@ -142,12 +142,6 @@ def host_exists(hostname_position: int = 1) -> Callable:
     return inner
 
 
-class ContainerInspectInfo(NamedTuple):
-    image_id: str
-    ceph_version: Optional[str]
-    repo_digest: Optional[str]
-
-
 class CephadmOrchestrator(orchestrator.Orchestrator, MgrModule,
                           metaclass=CLICommandMeta):
 
@@ -2231,39 +2225,6 @@ To check that the host is reachable:
     def apply_cephadm_exporter(self, spec: ServiceSpec) -> str:
         return self._apply(spec)
 
-    def _get_container_image_info(self, image_name: str) -> ContainerInspectInfo:
-        # pick a random host...
-        host = None
-        for host_name in self.inventory.keys():
-            host = host_name
-            break
-        if not host:
-            raise OrchestratorError('no hosts defined')
-        if self.cache.host_needs_registry_login(host) and self.registry_url:
-            self._registry_login(host, self.registry_url,
-                                 self.registry_username, self.registry_password)
-        out, err, code = CephadmServe(self)._run_cephadm(
-            host, '', 'pull', [],
-            image=image_name,
-            no_fsid=True,
-            error_ok=True)
-        if code:
-            raise OrchestratorError('Failed to pull %s on %s: %s' % (
-                image_name, host, '\n'.join(out)))
-        try:
-            j = json.loads('\n'.join(out))
-            r = ContainerInspectInfo(
-                j['image_id'],
-                j.get('ceph_version'),
-                j.get('repo_digest')
-            )
-            self.log.debug(f'image {image_name} -> {r}')
-            return r
-        except (ValueError, KeyError) as _:
-            msg = 'Failed to pull %s on %s: Cannot decode JSON' % (image_name, host)
-            self.log.exception('%s: \'%s\'' % (msg, '\n'.join(out)))
-            raise OrchestratorError(msg)
-
     @trivial_completion
     def upgrade_check(self, image: str, version: str) -> str:
         if self.inventory.get_host_with_state("maintenance"):
@@ -2276,7 +2237,7 @@ To check that the host is reachable:
         else:
             raise OrchestratorError('must specify either image or version')
 
-        image_info = self._get_container_image_info(target_name)
+        image_info = CephadmServe(self)._get_container_image_info(target_name)
         self.log.debug(f'image info {image} -> {image_info}')
         r: dict = {
             'target_name': target_name,
index 83d39712ad487920a5349acb8d059a7fbf13a70c..dc0deac21cca646bfe323c983084a9e638b9727a 100644 (file)
@@ -22,11 +22,11 @@ from orchestrator import OrchestratorError, set_exception_subject, OrchestratorE
 from cephadm.services.cephadmservice import CephadmDaemonSpec
 from cephadm.schedule import HostAssignment
 from cephadm.utils import forall_hosts, cephadmNoImage, is_repo_digest, \
-    CephadmNoImage, CEPH_UPGRADE_ORDER
+    CephadmNoImage, CEPH_UPGRADE_ORDER, ContainerInspectInfo
 from orchestrator._interface import daemon_type_to_service, service_to_daemon_types
 
 if TYPE_CHECKING:
-    from cephadm.module import CephadmOrchestrator, ContainerInspectInfo
+    from cephadm.module import CephadmOrchestrator
 
 logger = logging.getLogger(__name__)
 
@@ -38,6 +38,9 @@ class CephadmServe:
     This module contains functions that are executed in the
     serve() thread. Thus they don't block the CLI.
 
+    Please see the `Note regarding network calls from CLI handlers`
+    chapter in the cephadm developer guide.
+
     On the other hand, These function should *not* be called form
     CLI handlers, to avoid blocking the CLI
     """
@@ -691,7 +694,7 @@ class CephadmServe:
         digests: Dict[str, ContainerInspectInfo] = {}
         for container_image_ref in set(settings.values()):
             if not is_repo_digest(container_image_ref):
-                image_info = self.mgr._get_container_image_info(container_image_ref)
+                image_info = self._get_container_image_info(container_image_ref)
                 if image_info.repo_digest:
                     assert is_repo_digest(image_info.repo_digest), image_info
                 digests[container_image_ref] = image_info
@@ -960,3 +963,36 @@ class CephadmServe:
                     'cephadm exited with an error code: %d, stderr:%s' % (
                         code, '\n'.join(err)))
             return out, err, code
+
+    def _get_container_image_info(self, image_name: str) -> ContainerInspectInfo:
+        # pick a random host...
+        host = None
+        for host_name in self.mgr.inventory.keys():
+            host = host_name
+            break
+        if not host:
+            raise OrchestratorError('no hosts defined')
+        if self.mgr.cache.host_needs_registry_login(host) and self.mgr.registry_url:
+            self.mgr._registry_login(host, self.mgr.registry_url,
+                                     self.mgr.registry_username, self.mgr.registry_password)
+        out, err, code = self._run_cephadm(
+            host, '', 'pull', [],
+            image=image_name,
+            no_fsid=True,
+            error_ok=True)
+        if code:
+            raise OrchestratorError('Failed to pull %s on %s: %s' % (
+                image_name, host, '\n'.join(out)))
+        try:
+            j = json.loads('\n'.join(out))
+            r = ContainerInspectInfo(
+                j['image_id'],
+                j.get('ceph_version'),
+                j.get('repo_digest')
+            )
+            self.log.debug(f'image {image_name} -> {r}')
+            return r
+        except (ValueError, KeyError) as _:
+            msg = 'Failed to pull %s on %s: Cannot decode JSON' % (image_name, host)
+            self.log.exception('%s: \'%s\'' % (msg, '\n'.join(out)))
+            raise OrchestratorError(msg)
index 77727e45f54193a74e494431e6d4cd7cac898652..3a0f5cf346fcc8e3fc68602e99402c0b016b2d1c 100644 (file)
@@ -249,7 +249,7 @@ class CephadmUpgrade:
             # need to learn the container hash
             logger.info('Upgrade: First pull of %s' % target_image)
             try:
-                target_id, target_version, repo_digest = self.mgr._get_container_image_info(
+                target_id, target_version, repo_digest = CephadmServe(self.mgr)._get_container_image_info(
                     target_image)
             except OrchestratorError as e:
                 self._fail_upgrade('UPGRADE_FAILED_PULL', {
index 2cb7f8dd13bbde314c936afcd49796d7be475ebb..4b93e0b98e446e4b01d8fa3a5eec6e1d3c9d3dee 100644 (file)
@@ -3,7 +3,7 @@ import json
 import socket
 from enum import Enum
 from functools import wraps
-from typing import Callable, TypeVar, List, NewType, TYPE_CHECKING, Any
+from typing import Optional, Callable, TypeVar, List, NewType, TYPE_CHECKING, Any, NamedTuple
 from orchestrator import OrchestratorError
 
 if TYPE_CHECKING:
@@ -28,6 +28,12 @@ CEPH_UPGRADE_ORDER = ['mgr', 'mon', 'crash', 'osd', 'mds', 'rgw', 'rbd-mirror']
 cephadmNoImage = CephadmNoImage.token
 
 
+class ContainerInspectInfo(NamedTuple):
+    image_id: str
+    ceph_version: Optional[str]
+    repo_digest: Optional[str]
+
+
 def name_to_config_section(name: str) -> ConfEntity:
     """
     Map from daemon names to ceph entity names (as seen in config)