diff --git a/src/openstack_mcp_server/tools/identity_tools.py b/src/openstack_mcp_server/tools/identity_tools.py index b639f8a..fe08e25 100644 --- a/src/openstack_mcp_server/tools/identity_tools.py +++ b/src/openstack_mcp_server/tools/identity_tools.py @@ -29,6 +29,7 @@ def register_tools(self, mcp: FastMCP): mcp.tool()(self.get_projects) mcp.tool()(self.get_project) mcp.tool()(self.create_project) + mcp.tool()(self.delete_project) def get_regions(self) -> list[Region]: """ @@ -308,3 +309,13 @@ def create_project( domain_id=project.domain_id, parent_id=project.parent_id, ) + + def delete_project(self, id: str) -> None: + """ + Delete a project. + + :param name: The name of the project. + """ + conn = get_openstack_conn() + conn.identity.delete_project(project=id, ignore_missing=False) + return None diff --git a/tests/tools/test_identity_tools.py b/tests/tools/test_identity_tools.py index ccb99e7..94fa649 100644 --- a/tests/tools/test_identity_tools.py +++ b/tests/tools/test_identity_tools.py @@ -936,3 +936,50 @@ def test_create_project_without_all_fields( domain_id=None, parent_id=None, ) + + def test_delete_project_success(self, mock_get_openstack_conn_identity): + """Test deleting a identity project successfully.""" + mock_conn = mock_get_openstack_conn_identity + + # Test delete_project() + identity_tools = self.get_identity_tools() + result = identity_tools.delete_project( + id="project1111111111111111111111111" + ) + + # Verify results + assert result is None + + # Verify mock calls + mock_conn.identity.delete_project.assert_called_once_with( + project="project1111111111111111111111111", + ignore_missing=False, + ) + + def test_delete_project_not_found(self, mock_get_openstack_conn_identity): + """Test deleting a identity project that does not exist.""" + mock_conn = mock_get_openstack_conn_identity + + # Configure mock to raise NotFoundException + mock_conn.identity.delete_project.side_effect = ( + exceptions.NotFoundException( + "Project 'project1111111111111111111111111' not found", + ) + ) + + # Test delete_project() + identity_tools = self.get_identity_tools() + + with pytest.raises( + exceptions.NotFoundException, + match="Project 'project1111111111111111111111111' not found", + ): + identity_tools.delete_project( + id="project1111111111111111111111111" + ) + + # Verify mock calls + mock_conn.identity.delete_project.assert_called_once_with( + project="project1111111111111111111111111", + ignore_missing=False, + )