Skip to content

Commit

Permalink
remove message to manually upgrade data-plane (#259)
Browse files Browse the repository at this point in the history
Since the dev/data-plane is introducing upgrade for data-plane there is
no reason to left this message here.

fixes: #140
  • Loading branch information
rgildein committed Feb 28, 2024
1 parent 7e1e597 commit 2f9da2a
Show file tree
Hide file tree
Showing 4 changed files with 13 additions and 94 deletions.
16 changes: 7 additions & 9 deletions cou/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
from cou.steps import UpgradePlan
from cou.steps.analyze import Analysis
from cou.steps.execute import apply_step
from cou.steps.plan import generate_plan, manually_upgrade_data_plane
from cou.steps.plan import generate_plan
from cou.utils import print_and_debug, progress_indicator, prompt_input
from cou.utils.cli import interrupt_handler
from cou.utils.juju_utils import COUModel
Expand Down Expand Up @@ -105,13 +105,13 @@ async def continue_upgrade() -> bool:
return False


async def analyze_and_plan(args: CLIargs) -> tuple[Analysis, UpgradePlan]:
async def analyze_and_plan(args: CLIargs) -> UpgradePlan:
"""Analyze cloud and generate the upgrade plan with steps.
:param args: CLI arguments
:type args: CLIargs
:return: Generated analysis and upgrade plan.
:rtype: tuple[Analysis, UpgradePlan]
:return: Generated upgrade plan.
:rtype: UpgradePlan
"""
model = COUModel(args.model_name)
progress_indicator.start(f"Connecting to '{model.name}' model...")
Expand All @@ -128,7 +128,7 @@ async def analyze_and_plan(args: CLIargs) -> tuple[Analysis, UpgradePlan]:
upgrade_plan = await generate_plan(analysis_result, args)
progress_indicator.succeed()

return analysis_result, upgrade_plan
return upgrade_plan


async def get_upgrade_plan(args: CLIargs) -> None:
Expand All @@ -137,9 +137,8 @@ async def get_upgrade_plan(args: CLIargs) -> None:
:param args: CLI arguments
:type args: CLIargs
"""
analysis_result, upgrade_plan = await analyze_and_plan(args)
upgrade_plan = await analyze_and_plan(args)
print_and_debug(upgrade_plan)
manually_upgrade_data_plane(analysis_result)
print(
"Please note that the actual upgrade steps could be different if the cloud state "
"changes because the plan will be re-calculated at upgrade time."
Expand All @@ -152,7 +151,7 @@ async def run_upgrade(args: CLIargs) -> None:
:param args: CLI arguments
:type args: CLIargs
"""
analysis_result, upgrade_plan = await analyze_and_plan(args)
upgrade_plan = await analyze_and_plan(args)
print_and_debug(upgrade_plan)

if args.prompt and not await continue_upgrade():
Expand All @@ -168,7 +167,6 @@ async def run_upgrade(args: CLIargs) -> None:
print("Running cloud upgrade...")

await apply_step(upgrade_plan, args.prompt)
manually_upgrade_data_plane(analysis_result)
print("Upgrade completed.")


Expand Down
20 changes: 0 additions & 20 deletions cou/steps/plan.py
Original file line number Diff line number Diff line change
Expand Up @@ -511,23 +511,3 @@ def create_upgrade_group(
raise

return group_upgrade_plan


def manually_upgrade_data_plane(analysis_result: Analysis) -> None:
"""Warning message to upgrade data plane charms if necessary.
NOTE(gabrielcocenza) This function should be removed when cou starts
supporting data plan upgrades.
:param analysis_result: Analysis result.
:type analysis_result: Analysis
"""
if (
analysis_result.min_os_version_control_plane
and analysis_result.min_os_version_data_plane
and (
analysis_result.min_os_version_control_plane
> analysis_result.min_os_version_data_plane
)
):
data_plane_apps = ", ".join([app.name for app in analysis_result.apps_data_plane])
print(f"WARNING: Please upgrade manually the data plane apps: {data_plane_apps}")
38 changes: 0 additions & 38 deletions tests/unit/steps/test_steps_plan.py
Original file line number Diff line number Diff line change
Expand Up @@ -496,44 +496,6 @@ def test_create_upgrade_plan_failed(force):
cou_plan.create_upgrade_group([app], "victoria", "test", force, lambda *_: True)


@patch("builtins.print")
def test_plan_print_warn_manually_upgrade(mock_print, model):
nova_compute = MagicMock(spec_set=OpenStackApplication)()
nova_compute.name = "nova-compute"
nova_compute.current_os_release = OpenStackRelease("victoria")
nova_compute.series = "focal"
keystone = MagicMock(spec_set=OpenStackApplication)()
keystone.name = "keystone"
keystone.current_os_release = OpenStackRelease("wallaby")
keystone.series = "focal"

result = Analysis(
model=model,
apps_control_plane=[keystone],
apps_data_plane=[nova_compute],
)
cou_plan.manually_upgrade_data_plane(result)
mock_print.assert_called_with(
f"WARNING: Please upgrade manually the data plane apps: {nova_compute.name}"
)


@patch("builtins.print")
def test_analysis_not_print_warn_manually_upgrade(mock_print, model):
keystone = MagicMock(spec_set=OpenStackApplication)()
keystone.name = "keystone"
keystone.current_os_release = OpenStackRelease("wallaby")
keystone.series = "focal"

result = Analysis(
model=model,
apps_control_plane=[keystone],
apps_data_plane=[],
)
cou_plan.manually_upgrade_data_plane(result)
mock_print.assert_not_called()


@patch("cou.steps.plan.verify_data_plane_cli_azs")
@patch("cou.steps.plan.verify_data_plane_cli_machines")
def test_verify_data_plane_cli_no_input(
Expand Down
33 changes: 6 additions & 27 deletions tests/unit/test_cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -80,23 +80,18 @@ async def test_analyze_and_plan(mock_analyze, mock_generate_plan, cou_model, cli


@pytest.mark.asyncio
@patch("cou.cli.manually_upgrade_data_plane")
@patch("cou.cli.analyze_and_plan", new_callable=AsyncMock)
@patch("cou.cli.print_and_debug")
async def test_get_upgrade_plan(
mock_print_and_debug, mock_analyze_and_plan, mock_manually_upgrade, cli_args
):
async def test_get_upgrade_plan(mock_print_and_debug, mock_analyze_and_plan, cli_args):
"""Test get_upgrade_plan function."""
plan = UpgradePlan(description="Upgrade cloud from 'ussuri' to 'victoria'")
plan.add_step(PreUpgradeStep(description="backup mysql databases", parallel=False))
mock_analysis_result = MagicMock()

mock_analyze_and_plan.return_value = (mock_analysis_result, plan)
mock_analyze_and_plan.return_value = plan
await cli.get_upgrade_plan(cli_args)

mock_analyze_and_plan.assert_awaited_once_with(cli_args)
mock_print_and_debug.assert_called_once_with(plan)
mock_manually_upgrade.assert_called_once()


@pytest.mark.asyncio
Expand All @@ -108,7 +103,6 @@ async def test_get_upgrade_plan(
],
)
@patch("cou.cli.continue_upgrade", new_callable=AsyncMock)
@patch("cou.cli.manually_upgrade_data_plane")
@patch("cou.cli.analyze_and_plan", new_callable=AsyncMock)
@patch("cou.cli.apply_step")
@patch("builtins.print")
Expand All @@ -118,7 +112,6 @@ async def test_run_upgrade_quiet_no_prompt(
mock_print,
mock_apply_step,
mock_analyze_and_plan,
mock_manually_upgrade,
mock_continue_upgrade,
quiet,
expected_print_count,
Expand All @@ -131,102 +124,88 @@ async def test_run_upgrade_quiet_no_prompt(

plan = UpgradePlan(description="Upgrade cloud from 'ussuri' to 'victoria'")
plan.add_step(PreUpgradeStep(description="backup mysql databases", parallel=False))
mock_analysis_result = MagicMock()
mock_analyze_and_plan.return_value = (mock_analysis_result, plan)
mock_analyze_and_plan.return_value = plan

await cli.run_upgrade(cli_args)

mock_analyze_and_plan.assert_awaited_once_with(cli_args)
mock_print_and_debug.assert_called_once_with(plan)
mock_apply_step.assert_called_once_with(plan, False)
mock_print.call_count == expected_print_count
mock_manually_upgrade.assert_called_once()


@pytest.mark.asyncio
@patch("cou.cli.manually_upgrade_data_plane")
@patch("cou.cli.analyze_and_plan", new_callable=AsyncMock)
@patch("cou.cli.apply_step")
@patch("cou.cli.continue_upgrade")
async def test_run_upgrade_with_prompt_continue(
mock_continue_upgrade,
mock_apply_step,
mock_analyze_and_plan,
mock_manually_upgrade,
cli_args,
):
cli_args.prompt = True
cli_args.quiet = True

plan = UpgradePlan(description="Upgrade cloud from 'ussuri' to 'victoria'")
plan.add_step(PreUpgradeStep(description="backup mysql databases", parallel=False))
mock_analysis_result = MagicMock()
mock_analyze_and_plan.return_value = (mock_analysis_result, plan)
mock_analyze_and_plan.return_value = plan
mock_continue_upgrade.return_value = True

await cli.run_upgrade(cli_args)

mock_analyze_and_plan.assert_awaited_once_with(cli_args)
mock_continue_upgrade.assert_awaited_once_with()
mock_apply_step.assert_called_once_with(plan, True)
mock_manually_upgrade.assert_called_once()


@pytest.mark.asyncio
@patch("cou.cli.manually_upgrade_data_plane")
@patch("cou.cli.analyze_and_plan", new_callable=AsyncMock)
@patch("cou.cli.apply_step")
@patch("cou.cli.continue_upgrade")
async def test_run_upgrade_with_prompt_abort(
mock_continue_upgrade,
mock_apply_step,
mock_analyze_and_plan,
mock_manually_upgrade,
cli_args,
):
cli_args.auto_approve = False
cli_args.quiet = True

plan = UpgradePlan(description="Upgrade cloud from 'ussuri' to 'victoria'")
plan.add_step(PreUpgradeStep(description="backup mysql databases", parallel=False))
mock_analysis_result = MagicMock()
mock_analyze_and_plan.return_value = (mock_analysis_result, plan)
mock_analyze_and_plan.return_value = plan
mock_continue_upgrade.return_value = False

await cli.run_upgrade(cli_args)

mock_analyze_and_plan.assert_awaited_once_with(cli_args)
mock_continue_upgrade.assert_awaited_once_with()
mock_apply_step.assert_not_awaited()
mock_manually_upgrade.assert_not_called()


@pytest.mark.asyncio
@patch("cou.cli.manually_upgrade_data_plane")
@patch("cou.cli.analyze_and_plan", new_callable=AsyncMock)
@patch("cou.cli.apply_step")
@patch("cou.cli.continue_upgrade", new_callable=AsyncMock)
async def test_run_upgrade_with_no_prompt(
mock_continue_upgrade,
mock_apply_step,
mock_analyze_and_plan,
mock_manually_upgrade,
cli_args,
):
cli_args.prompt = False
cli_args.quiet = True

plan = UpgradePlan(description="Upgrade cloud from 'ussuri' to 'victoria'")
plan.add_step(PreUpgradeStep(description="backup mysql databases", parallel=False))
mock_analysis_result = MagicMock()
mock_analyze_and_plan.return_value = (mock_analysis_result, plan)
mock_analyze_and_plan.return_value = plan

await cli.run_upgrade(cli_args)

mock_analyze_and_plan.assert_awaited_once_with(cli_args)
mock_continue_upgrade.assert_not_awaited()
mock_apply_step.assert_called_once_with(plan, False)
mock_manually_upgrade.assert_called_once()


@pytest.mark.asyncio
Expand Down

0 comments on commit 2f9da2a

Please sign in to comment.