Skip to content

Commit fa5eb95

Browse files
committed
Exception handling added for the uninstall_dev_env calls. The error reporting for the Platform Error cleaned up.
1 parent 4382ebe commit fa5eb95

File tree

13 files changed

+103
-34
lines changed

13 files changed

+103
-34
lines changed

dem/cli/command/create_cmd.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from dem.core.dev_env import DevEnv, DevEnv
66
from dem.core.tool_images import ToolImages
77
from dem.core.platform import Platform
8+
from dem.core.exceptions import PlatformError
89
from dem.cli.console import stdout, stderr
910
from dem.cli.tui.panel.tool_type_selector import ToolTypeSelectorPanel
1011
from dem.cli.tui.panel.tool_image_selector import ToolImageSelectorPanel
@@ -171,7 +172,11 @@ def create_dev_env(platform: Platform, dev_env_name: str) -> None:
171172
if dev_env_original.is_installed:
172173
typer.confirm("The Development Environment is installed, so it can't be overwritten. " + \
173174
"Uninstall it first?", abort=True)
174-
platform.uninstall_dev_env(dev_env_original)
175+
try:
176+
platform.uninstall_dev_env(dev_env_original)
177+
except PlatformError as e:
178+
stderr.print(f"[red]{str(e)}[/]")
179+
typer.Abort()
175180

176181
tool_image_list = get_tool_image_list(platform.tool_images)
177182
new_dev_env_descriptor = get_dev_env_descriptor_from_user(dev_env_name, tool_image_list)

dem/cli/command/delete_cmd.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ def execute(platform: Platform, dev_env_name: str) -> None:
2020
try:
2121
platform.uninstall_dev_env(dev_env_to_delete)
2222
except PlatformError as e:
23-
stderr.print(f"[red]Error: The deletion failed, because the Dev Env can't be uninstalled. {str(e)}[/]")
23+
stderr.print(f"[red]{str(e)}[/]")
2424
return
2525

2626
stdout.print("Deleting the Development Environment...")

dem/cli/command/init_cmd.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ def execute(platform: Platform, project_path: str) -> None:
3636
try:
3737
platform.uninstall_dev_env(local_dev_env)
3838
except PlatformError as e:
39-
stderr.print(f"[red]Error: The Dev Env can't be uninstalled. {str(e)}")
39+
stderr.print(f"[red]{str(e)}[/]")
4040
return
4141

4242
platform.local_dev_envs.remove(local_dev_env)

dem/cli/command/modify_cmd.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from dem.core.dev_env import DevEnv, DevEnv
66
from dem.core.tool_images import ToolImages
77
from dem.core.platform import Platform
8+
from dem.core.exceptions import PlatformError
89
from dem.cli.console import stderr, stdout
910
from dem.cli.tui.renderable.menu import SelectMenu
1011
from dem.cli.tui.panel.tool_type_selector import ToolTypeSelectorPanel
@@ -207,7 +208,11 @@ def execute(platform: Platform, dev_env_name: str, tool_type: str, tool_image: s
207208
elif dev_env.is_installed is True:
208209
stdout.print("[yellow]The Development Environment is installed, so it can't be modified.[/]")
209210
typer.confirm("Do you want to uninstall it first?", abort=True)
210-
platform.uninstall_dev_env(dev_env)
211+
try:
212+
platform.uninstall_dev_env(dev_env)
213+
except PlatformError as e:
214+
stderr.print(f"[red]{str(e)}[/]")
215+
return
211216

212217
if (tool_type or tool_image):
213218
modify_single_tool(platform, dev_env, tool_type, tool_image)

dem/cli/command/uninstall_cmd.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,6 @@ def execute(platform: Platform, dev_env_name: str) -> None:
2323
try:
2424
platform.uninstall_dev_env(dev_env_to_uninstall)
2525
except PlatformError as e:
26-
stderr.print(f"[red]Error: {str(e)}[/]")
26+
stderr.print(f"[red]{str(e)}[/]")
2727
else:
2828
stdout.print(f"[green]Successfully uninstalled the {dev_env_name}![/]")

dem/core/container_engine.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ def remove(self, image: str) -> None:
114114
except docker.errors.ImageNotFound:
115115
self.user_output.msg(f"[yellow]The {image} doesn't exist. Unable to remove it.[/]\n")
116116
except docker.errors.APIError:
117-
raise ContainerEngineError(f"The {image} is used by a container. Unable to remove it.[/]\n")
117+
raise ContainerEngineError(f"The {image} is used by a container. Unable to remove it.\n")
118118
else:
119119
self.user_output.msg(f"[green]Successfully removed the {image}![/]\n")
120120

dem/core/platform.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -166,11 +166,11 @@ def install_dev_env(self, dev_env_to_install: DevEnv) -> None:
166166
def uninstall_dev_env(self, dev_env_to_uninstall: DevEnv) -> None:
167167
""" Uninstall the Dev Env by removing the images not required anymore.
168168

169-
Exceptions:
170-
PlatformError -- if the uninstall fails
171-
172169
Args:
173170
dev_env_to_uninstall -- the Development Environment to uninstall
171+
172+
Exceptions:
173+
PlatformError -- if the uninstall fails
174174
"""
175175
all_required_tool_images = set()
176176
for dev_env in self.local_dev_envs:
@@ -188,7 +188,7 @@ def uninstall_dev_env(self, dev_env_to_uninstall: DevEnv) -> None:
188188
try:
189189
self.container_engine.remove(tool_image)
190190
except ContainerEngineError as e:
191-
raise PlatformError(f"Dev Env uninstall failed. {str(e)}")
191+
raise PlatformError(f"Dev Env uninstall failed. <-caused by- {str(e)}")
192192

193193
dev_env_to_uninstall.is_installed = False
194194
self.flush_descriptors()

tests/cli/test_create_cmd.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,38 @@ def test_create_dev_env_overwrite(mock_confirm, mock_get_tool_image_list,
124124
mock_get_dev_env_descriptor_from_user.assert_called_once_with(expected_dev_env_name,
125125
mock_tool_images)
126126

127+
@patch("dem.cli.command.create_cmd.typer.Abort")
128+
@patch("dem.cli.command.create_cmd.stderr.print")
129+
@patch("dem.cli.command.create_cmd.typer.confirm")
130+
def test_create_dev_env_overwrite_PlatformError(mock_confirm: MagicMock, mock_stderr_print: MagicMock,
131+
mock_Abort: MagicMock) -> None:
132+
# Test setup
133+
mock_platform = MagicMock()
134+
mock_dev_env_original = MagicMock()
135+
mock_dev_env_original.is_installed = True
136+
mock_platform.get_dev_env_by_name.return_value = mock_dev_env_original
137+
test_exception_text = "test_exception_text"
138+
mock_platform.uninstall_dev_env.side_effect = create_cmd.PlatformError(test_exception_text)
139+
mock_Abort.side_effect = Exception("")
140+
141+
test_dev_env_name = "test_dev_env"
142+
143+
# Run unit under test
144+
with pytest.raises(Exception):
145+
create_cmd.create_dev_env(mock_platform, test_dev_env_name)
146+
147+
# Check expectations
148+
mock_platform.get_dev_env_by_name.assert_called_once_with(test_dev_env_name)
149+
mock_confirm.assert_has_calls([
150+
call("The input name is already used by a Development Environment. Overwrite it?",
151+
abort=True),
152+
call("The Development Environment is installed, so it can't be overwritten. " + \
153+
"Uninstall it first?", abort=True)
154+
])
155+
mock_platform.uninstall_dev_env.assert_called_once_with(mock_dev_env_original)
156+
mock_stderr_print.assert_called_once_with(f"[red]Platform error: {test_exception_text}[/]")
157+
mock_Abort.assert_called_once()
158+
127159
@patch("dem.cli.command.create_cmd.get_dev_env_descriptor_from_user")
128160
@patch("dem.cli.command.create_cmd.typer.confirm")
129161
def test_create_dev_env_abort(mock_confirm, mock_get_dev_env_descriptor_from_user):

tests/cli/test_delete_cmd.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ def test_delete_uninstall_failed(mock_stderr_print: MagicMock, mock_confirm: Mag
6666
mock_confirm.assert_called_once_with("The Development Environment is installed. Do you want to uninstall it?",
6767
abort=True)
6868
mock_platform.uninstall_dev_env.assert_called_once_with(test_dev_env)
69-
mock_stderr_print.assert_called_once_with(f"[red]Error: The deletion failed, because the Dev Env can't be uninstalled. Platform error: {test_exception_text}[/]")
69+
mock_stderr_print.assert_called_once_with(f"[red]Platform error: {test_exception_text}[/]")
7070

7171
@patch("dem.cli.command.delete_cmd.stderr.print")
7272
def test_delete_not_existing(mock_stderr_print: MagicMock) -> None:

tests/cli/test_init_cmd.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,4 +133,4 @@ def test_execute_reinit_installed_uninstall_fails(mock_DevEnv, mock_confirm, moc
133133
mock_confirm.assert_has_calls([call("Would you like to re-init the Dev Env? All local changes will be lost!", abort=True),
134134
call("The Development Environment is installed, so it can't be deleted. Do you want to uninstall it first?", abort=True)])
135135
mock_platform.uninstall_dev_env.assert_called_once_with(mock_local_dev_env)
136-
mock_stderr_print.assert_called_once_with(f"[red]Error: The Dev Env can't be uninstalled. Platform error: {test_exception_text}")
136+
mock_stderr_print.assert_called_once_with(f"[red]Platform error: {test_exception_text}[/]")

0 commit comments

Comments
 (0)