-
Notifications
You must be signed in to change notification settings - Fork 7
Expand file tree
/
Copy pathcompute_tools.py
More file actions
104 lines (87 loc) · 2.99 KB
/
compute_tools.py
File metadata and controls
104 lines (87 loc) · 2.99 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
from typing import Any
from fastmcp import FastMCP
from openstack_mcp_server.tools.response.compute import (
Flavor,
Server,
)
from .base import get_openstack_conn
class ComputeTools:
"""
A class to encapsulate Compute-related tools and utilities.
"""
def register_tools(self, mcp: FastMCP):
"""
Register Compute-related tools with the FastMCP instance.
"""
mcp.tool()(self.get_servers)
mcp.tool()(self.get_server)
mcp.tool()(self.create_server)
mcp.tool()(self.get_flavors)
def get_servers(self) -> list[Server]:
"""
Get the list of Compute servers.
:return: A list of Server objects.
"""
conn = get_openstack_conn()
server_list = []
for server in conn.compute.servers():
server_list.append(Server(**server))
return server_list
def get_server(self, id: str) -> Server:
"""
Get a specific Compute server.
:param id: The ID of the server to retrieve.
:return: A Server object.
"""
conn = get_openstack_conn()
server = conn.compute.get_server(id)
return Server(**server)
def create_server(
self,
name: str,
image: str,
flavor: int,
network: str,
key_name: str | None = None,
security_groups: list[str] | None = None,
user_data: str | None = None,
) -> Server:
"""
Create a new Compute server.
:param name: The name of the server.
:param image: The ID of the image to use.
:param flavor: The ID of the flavor to use.
:param network: The ID of the network to attach.
:param key_name: The name of the key pair to use.
:param security_groups: A list of security group names to attach.
:param user_data: User data to pass to the server.
:return: A Server object
"""
conn = get_openstack_conn()
server_params: dict[str, Any] = {
"name": name,
"flavorRef": flavor,
"imageRef": image,
"networks": [{"uuid": network}],
"key_name": key_name,
"security_groups": security_groups,
"user_data": user_data,
}
server_params = {
k: v for k, v in server_params.items() if v is not None
}
resp = conn.compute.create_server(**server_params)
# NOTE: The create_server method returns a server object with minimal information.
# To get the full server details, we need to fetch it again.
server = conn.compute.get_server(resp.id)
return Server(**server)
def get_flavors(self) -> list[Flavor]:
"""
Get flavors (server hardware configurations).
:return: A list of Flavor objects.
"""
conn = get_openstack_conn()
flavor_list = []
for flavor in conn.compute.flavors():
flavor_list.append(Flavor(**flavor))
return flavor_list