Skip to content
Merged
11 changes: 11 additions & 0 deletions src/openstack_mcp_server/tools/identity_tools.py
Original file line number Diff line number Diff line change
Expand Up @@ -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]:
"""
Expand Down Expand Up @@ -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
47 changes: 47 additions & 0 deletions tests/tools/test_identity_tools.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
)