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):
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]] = {}
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('{}'))
}):
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({
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):
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,
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: