Skip to content

Commit

Permalink
mgr/cephadm: unit test for staggered upgrade param validation
Browse files Browse the repository at this point in the history
Signed-off-by: Adam King <adking@redhat.com>
  • Loading branch information
adk3798 committed Apr 13, 2022
1 parent dfee410 commit f545a08
Showing 1 changed file with 144 additions and 1 deletion.
145 changes: 144 additions & 1 deletion src/pybind/mgr/cephadm/tests/test_upgrade.py
Expand Up @@ -8,7 +8,9 @@
from cephadm.upgrade import CephadmUpgrade
from orchestrator import OrchestratorError, DaemonDescription
from .fixtures import _run_cephadm, wait, with_host, with_service, \
receive_agent_metadata
receive_agent_metadata, async_side_effect

from typing import List, Tuple, Optional


@mock.patch("cephadm.serve.CephadmServe._run_cephadm", _run_cephadm('{}'))
Expand Down Expand Up @@ -164,3 +166,144 @@ def test_enough_mds_for_ok_to_stop(get, get_daemons_by_service, cephadm_module:
get_daemons_by_service.side_effect = [[DaemonDescription(), DaemonDescription()]]
assert cephadm_module.upgrade._enough_mds_for_ok_to_stop(
DaemonDescription(daemon_type='mds', daemon_id='myfs.test.host1.gfknd', service_name='mds.myfs.test'))

@pytest.mark.parametrize(
"upgraded, not_upgraded, daemon_types, hosts, services, should_block",
# [ ([(type, host, id), ... ], [...], [daemon types], [hosts], [services], True/False), ... ]
[
( # valid, upgrade mgr daemons
[],
[('mgr', 'a', 'a.x'), ('mon', 'a', 'a')],
['mgr'],
None,
None,
False
),
( # invalid, can't upgrade mons until mgr is upgraded
[],
[('mgr', 'a', 'a.x'), ('mon', 'a', 'a')],
['mon'],
None,
None,
True
),
( # invalid, can't upgrade mon service until all mgr daemons are upgraded
[],
[('mgr', 'a', 'a.x'), ('mon', 'a', 'a')],
None,
None,
['mon'],
True
),
( # valid, upgrade mgr service
[],
[('mgr', 'a', 'a.x'), ('mon', 'a', 'a')],
None,
None,
['mgr'],
False
),
( # valid, mgr is already upgraded so can upgrade mons
[('mgr', 'a', 'a.x')],
[('mon', 'a', 'a')],
['mon'],
None,
None,
False
),
( # invalid, can't upgrade all daemons on b b/c un-upgraded mgr on a
[],
[('mgr', 'b', 'b.y'), ('mon', 'a', 'a')],
None,
['a'],
None,
True
),
( # valid, only daemon on b is a mgr
[],
[('mgr', 'a', 'a.x'), ('mgr', 'b', 'b.y'), ('mon', 'a', 'a')],
None,
['b'],
None,
False
),
( # invalid, can't upgrade mon on a while mgr on b is un-upgraded
[],
[('mgr', 'a', 'a.x'), ('mgr', 'b', 'b.y'), ('mon', 'a', 'a')],
None,
['a'],
None,
True
),
( # valid, only upgrading the mgr on a
[],
[('mgr', 'a', 'a.x'), ('mgr', 'b', 'b.y'), ('mon', 'a', 'a')],
['mgr'],
['a'],
None,
False
),
( # valid, mgr daemon not on b are upgraded
[('mgr', 'a', 'a.x')],
[('mgr', 'b', 'b.y'), ('mon', 'a', 'a')],
None,
['b'],
None,
False
),
( # valid, all the necessary hosts are covered, mgr on c is already upgraded
[('mgr', 'c', 'c.z')],
[('mgr', 'a', 'a.x'), ('mgr', 'b', 'b.y'), ('mon', 'a', 'a'), ('osd', 'c', '0')],
None,
['a', 'b'],
None,
False
),
( # invalid, can't upgrade mon on a while mgr on b is un-upgraded
[],
[('mgr', 'a', 'a.x'), ('mgr', 'b', 'b.y'), ('mon', 'a', 'a')],
['mgr', 'mon'],
['a'],
None,
True
),
]
)
@mock.patch("cephadm.module.HostCache.get_daemons")
@mock.patch("cephadm.serve.CephadmServe._get_container_image_info")
@mock.patch('cephadm.module.SpecStore.__getitem__')
def test_staggered_upgrade_validation(
get_spec,
get_image_info,
get_daemons,
upgraded: List[Tuple[str,str,str]],
not_upgraded: List[Tuple[str,str,str,str]],
daemon_types: Optional[str],
hosts: Optional[str],
services: Optional[str],
should_block: bool,
cephadm_module: CephadmOrchestrator,
):
def to_dds(ts: List[Tuple[str, str]], upgraded: bool) -> List[DaemonDescription]:
dds = []
digest = 'new_image@repo_digest' if upgraded else 'old_image@repo_digest'
for t in ts:
dds.append(DaemonDescription(daemon_type=t[0],
hostname=t[1],
daemon_id=t[2],
container_image_digests=[digest],
deployed_by=[digest],))
return dds
get_daemons.return_value = to_dds(upgraded, True) + to_dds(not_upgraded, False)
get_image_info.side_effect = async_side_effect(('new_id', 'ceph version 99.99.99 (hash)', ['new_image@repo_digest']))
class FakeSpecDesc():
def __init__(self, spec):
self.spec = spec
def _get_spec(s):
return FakeSpecDesc(ServiceSpec(s))
get_spec.side_effect = _get_spec
if should_block:
with pytest.raises(OrchestratorError):
cephadm_module.upgrade._validate_upgrade_filters('new_image_name', daemon_types, hosts, services)
else:
cephadm_module.upgrade._validate_upgrade_filters('new_image_name', daemon_types, hosts, services)

0 comments on commit f545a08

Please sign in to comment.