diff --git a/src/openstack_mcp_server/tools/image_tools.py b/src/openstack_mcp_server/tools/image_tools.py index d3544b3..fbe4f2d 100644 --- a/src/openstack_mcp_server/tools/image_tools.py +++ b/src/openstack_mcp_server/tools/image_tools.py @@ -18,6 +18,7 @@ def register_tools(self, mcp: FastMCP): mcp.tool()(self.get_images) mcp.tool()(self.create_image) + mcp.tool()(self.delete_image) def get_images( self, @@ -112,3 +113,13 @@ def create_image(self, image_data: CreateImage) -> Image: image = conn.get_image(created_image.id) return Image(**image) + + def delete_image(self, image_id: str) -> None: + """ + Delete an OpenStack image. + + :param image_id: The ID of the image to delete. + :return: None + """ + conn = get_openstack_conn() + conn.image.delete_image(image_id) diff --git a/tests/tools/test_image_tools.py b/tests/tools/test_image_tools.py index 0544ef5..2faa751 100644 --- a/tests/tools/test_image_tools.py +++ b/tests/tools/test_image_tools.py @@ -2,6 +2,10 @@ from unittest.mock import Mock +import pytest + +from openstack.exceptions import NotFoundException + from openstack_mcp_server.tools.image_tools import ImageTools from openstack_mcp_server.tools.request.image import CreateImage from openstack_mcp_server.tools.response.image import Image @@ -281,3 +285,27 @@ def test_create_image_success_with_import_options( assert mock_get_openstack_conn_image.get_image.called_once_with( mock_image["id"], ) + + def test_delete_image_success(self, mock_get_openstack_conn_image): + """Test deleting an image successfully.""" + mock_conn = mock_get_openstack_conn_image + image_id = "img-delete-123-456" + + mock_conn.image.delete_image.return_value = None + + image_tools = ImageTools() + result = image_tools.delete_image(image_id) + + assert result is None + mock_conn.image.delete_image.assert_called_once_with(image_id) + + def test_delete_image_not_found(self, mock_get_openstack_conn_image): + """Test deleting an image that does not exist.""" + mock_conn = mock_get_openstack_conn_image + image_id = "img-delete-123-456" + mock_conn.image.delete_image.side_effect = NotFoundException() + + image_tools = ImageTools() + with pytest.raises(NotFoundException): + image_tools.delete_image(image_id) + mock_conn.image.delete_image.assert_called_once_with(image_id)