Skip to content

Commit 0990e4b

Browse files
S0okJuhalucinor
authored andcommitted
feat: Add delete project tool (#67)
* feat(identity): Add get-project, get-projects tool(#58) - Add get-project, get-projects tool - Test code are updated and passing * chore(identity): ruff format(#58) * chore(identity): ruff format(#58) * fix(identity): Remove _version.py(#58) * feat(identity): Add create project tool(#58) - Add create-project tool - Tests are updated ans passing * fix(identity): Fix unnecessary test codes(#?58) * feat(identity): Add delete project tool(#58)
1 parent 3d724b1 commit 0990e4b

File tree

2 files changed

+58
-0
lines changed

2 files changed

+58
-0
lines changed

src/openstack_mcp_server/tools/identity_tools.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ def register_tools(self, mcp: FastMCP):
2929
mcp.tool()(self.get_projects)
3030
mcp.tool()(self.get_project)
3131
mcp.tool()(self.create_project)
32+
mcp.tool()(self.delete_project)
3233

3334
def get_regions(self) -> list[Region]:
3435
"""
@@ -308,3 +309,13 @@ def create_project(
308309
domain_id=project.domain_id,
309310
parent_id=project.parent_id,
310311
)
312+
313+
def delete_project(self, id: str) -> None:
314+
"""
315+
Delete a project.
316+
317+
:param name: The name of the project.
318+
"""
319+
conn = get_openstack_conn()
320+
conn.identity.delete_project(project=id, ignore_missing=False)
321+
return None

tests/tools/test_identity_tools.py

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -936,3 +936,50 @@ def test_create_project_without_all_fields(
936936
domain_id=None,
937937
parent_id=None,
938938
)
939+
940+
def test_delete_project_success(self, mock_get_openstack_conn_identity):
941+
"""Test deleting a identity project successfully."""
942+
mock_conn = mock_get_openstack_conn_identity
943+
944+
# Test delete_project()
945+
identity_tools = self.get_identity_tools()
946+
result = identity_tools.delete_project(
947+
id="project1111111111111111111111111"
948+
)
949+
950+
# Verify results
951+
assert result is None
952+
953+
# Verify mock calls
954+
mock_conn.identity.delete_project.assert_called_once_with(
955+
project="project1111111111111111111111111",
956+
ignore_missing=False,
957+
)
958+
959+
def test_delete_project_not_found(self, mock_get_openstack_conn_identity):
960+
"""Test deleting a identity project that does not exist."""
961+
mock_conn = mock_get_openstack_conn_identity
962+
963+
# Configure mock to raise NotFoundException
964+
mock_conn.identity.delete_project.side_effect = (
965+
exceptions.NotFoundException(
966+
"Project 'project1111111111111111111111111' not found",
967+
)
968+
)
969+
970+
# Test delete_project()
971+
identity_tools = self.get_identity_tools()
972+
973+
with pytest.raises(
974+
exceptions.NotFoundException,
975+
match="Project 'project1111111111111111111111111' not found",
976+
):
977+
identity_tools.delete_project(
978+
id="project1111111111111111111111111"
979+
)
980+
981+
# Verify mock calls
982+
mock_conn.identity.delete_project.assert_called_once_with(
983+
project="project1111111111111111111111111",
984+
ignore_missing=False,
985+
)

0 commit comments

Comments
 (0)