Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

remove message to manually upgrade data-plane #259

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading