]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/cephadm/upgrade: normalize unqualified target image
authorSage Weil <sage@newdream.net>
Tue, 6 Apr 2021 13:36:31 +0000 (09:36 -0400)
committerSage Weil <sage@newdream.net>
Fri, 9 Apr 2021 20:53:37 +0000 (16:53 -0400)
If we get an unqualified target image, assume it's docker.io.  This
ensures that we're passing a fully-qualified target to docker|podman on
the various hosts and don't end up with something different based on the
per-host search path for unqualified image names.

Signed-off-by: Sage Weil <sage@newdream.net>
src/pybind/mgr/cephadm/module.py
src/pybind/mgr/cephadm/tests/test_upgrade.py
src/pybind/mgr/cephadm/upgrade.py

index 2e222dc53a6adbabd0a918f56838eaca3a61691a..f5d4307a8731364d9d27fa17a756166bac28a726 100644 (file)
@@ -313,6 +313,12 @@ class CephadmOrchestrator(orchestrator.Orchestrator, MgrModule,
             default=False,
             desc='Enable or disable the cephadm configuration analysis',
         ),
+        Option(
+            'default_registry',
+            type='str',
+            default='docker.io',
+            desc='Registry to which we should normalize unqualified image names',
+        ),
     ]
 
     def __init__(self, *args: Any, **kwargs: Any):
@@ -357,6 +363,7 @@ class CephadmOrchestrator(orchestrator.Orchestrator, MgrModule,
             self.registry_username: Optional[str] = None
             self.registry_password: Optional[str] = None
             self.use_repo_digest = True
+            self.default_registry = ''
 
         self._cons: Dict[str, Tuple[remoto.backends.BaseConnection,
                                     remoto.backends.LegacyModuleExecute]] = {}
index 7304ec41c36fbaf1749d8f501a79995cb5059c6a..9af6eb3399194265d370336a8fbb6f422145240f 100644 (file)
@@ -14,16 +14,16 @@ from .fixtures import _run_cephadm, wait, with_host, with_service
 def test_upgrade_start(cephadm_module: CephadmOrchestrator):
     with with_host(cephadm_module, 'test'):
         assert wait(cephadm_module, cephadm_module.upgrade_start(
-            'image_id', None)) == 'Initiating upgrade to image_id'
+            'image_id', None)) == 'Initiating upgrade to docker.io/image_id'
 
-        assert wait(cephadm_module, cephadm_module.upgrade_status()).target_image == 'image_id'
+        assert wait(cephadm_module, cephadm_module.upgrade_status()).target_image == 'docker.io/image_id'
 
-        assert wait(cephadm_module, cephadm_module.upgrade_pause()) == 'Paused upgrade to image_id'
+        assert wait(cephadm_module, cephadm_module.upgrade_pause()) == 'Paused upgrade to docker.io/image_id'
 
         assert wait(cephadm_module, cephadm_module.upgrade_resume()
-                    ) == 'Resumed upgrade to image_id'
+                    ) == 'Resumed upgrade to docker.io/image_id'
 
-        assert wait(cephadm_module, cephadm_module.upgrade_stop()) == 'Stopped upgrade to image_id'
+        assert wait(cephadm_module, cephadm_module.upgrade_stop()) == 'Stopped upgrade to docker.io/image_id'
 
 
 @mock.patch("cephadm.serve.CephadmServe._run_cephadm", _run_cephadm('{}'))
@@ -50,10 +50,10 @@ def test_upgrade_run(use_repo_digest, cephadm_module: CephadmOrchestrator):
                            }):
                 version_mock.return_value = 'ceph version 18.2.1 (somehash)'
                 assert wait(cephadm_module, cephadm_module.upgrade_start(
-                    'to_image', None)) == 'Initiating upgrade to to_image'
+                    'to_image', None)) == 'Initiating upgrade to docker.io/to_image'
 
                 assert wait(cephadm_module, cephadm_module.upgrade_status()
-                            ).target_image == 'to_image'
+                            ).target_image == 'docker.io/to_image'
 
                 def _versions_mock(cmd):
                     return json.dumps({
@@ -106,7 +106,7 @@ def test_upgrade_run(use_repo_digest, cephadm_module: CephadmOrchestrator):
                 if use_repo_digest:
                     assert image == 'to_image@repo_digest'
                 else:
-                    assert image == 'to_image'
+                    assert image == 'docker.io/to_image'
 
 
 def test_upgrade_state_null(cephadm_module: CephadmOrchestrator):
index 3f4c09991e8ebeb1f286545fcf057f839ab0146d..b92d20d1a10ee539345db8758dc914a7d1fb9175 100644 (file)
@@ -17,6 +17,20 @@ if TYPE_CHECKING:
 logger = logging.getLogger(__name__)
 
 
+def normalize_image_digest(digest: str, default_registry: str) -> str:
+    # normal case:
+    #   ceph/ceph -> docker.io/ceph/ceph
+    # edge cases that shouldn't ever come up:
+    #   ubuntu -> docker.io/ubuntu    (ubuntu alias for library/ubuntu)
+    # no change:
+    #   quay.ceph.io/ceph/ceph -> ceph
+    #   docker.io/ubuntu -> no change
+    bits = digest.split('/')
+    if '.' not in bits[0] or len(bits) < 3:
+        digest = 'docker.io/' + digest
+    return digest
+
+
 class UpgradeState:
     def __init__(self,
                  target_name: str,
@@ -171,7 +185,7 @@ class CephadmUpgrade:
                 raise OrchestratorError(version_error)
             target_name = self.mgr.container_image_base + ':v' + version
         elif image:
-            target_name = image
+            target_name = normalize_image_digest(image, self.mgr.default_registry)
         else:
             raise OrchestratorError('must specify either image or version')
         if self.upgrade_state: