mantatech-sdk 0.5b0.dev65__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- manta/__init__.light.py +22 -0
- manta/__init__.py +83 -0
- manta/__main__.py +21 -0
- manta/apis/__init__.py +7 -0
- manta/apis/async_user_api.py +6458 -0
- manta/apis/graph.py +498 -0
- manta/apis/module.py +316 -0
- manta/apis/results.py +251 -0
- manta/apis/swarm.py +206 -0
- manta/apis/user_api.py +1016 -0
- manta/cli/__init__.py +1 -0
- manta/cli/commands/__init__.py +1 -0
- manta/cli/commands/base_handler.py +229 -0
- manta/cli/commands/doc.py +192 -0
- manta/cli/commands/install.py +346 -0
- manta/cli/commands/sdk.py +9 -0
- manta/cli/commands/sdk_cluster.py +211 -0
- manta/cli/commands/sdk_config.py +347 -0
- manta/cli/commands/sdk_globals.py +280 -0
- manta/cli/commands/sdk_logs.py +174 -0
- manta/cli/commands/sdk_main.py +167 -0
- manta/cli/commands/sdk_module.py +516 -0
- manta/cli/commands/sdk_nodes.py +168 -0
- manta/cli/commands/sdk_original.py +3873 -0
- manta/cli/commands/sdk_results.py +265 -0
- manta/cli/commands/sdk_swarm.py +454 -0
- manta/cli/commands/sdk_user.py +234 -0
- manta/cli/commands/status.py +292 -0
- manta/cli/component_detector.py +112 -0
- manta/cli/config_manager.py +445 -0
- manta/cli/main.py +265 -0
- manta/cli/utils/__init__.py +27 -0
- manta/cli/utils/converters.py +140 -0
- manta/clients/cluster_management_client.py +486 -0
- manta/clients/local_client.py +149 -0
- manta/clients/module_management_client.py +217 -0
- manta/clients/swarm_management_client.py +562 -0
- manta/clients/user_management_client.py +395 -0
- manta/clients/world_client.py +195 -0
- manta/light/__init__.py +31 -0
- manta/light/globals.py +245 -0
- manta/light/local.py +407 -0
- manta/light/logging_config.py +39 -0
- manta/light/path.py +116 -0
- manta/light/results.py +236 -0
- manta/light/task.py +100 -0
- manta/light/utils.py +217 -0
- manta/light/world.py +177 -0
- mantatech_sdk-0.5b0.dev65.dist-info/METADATA +1039 -0
- mantatech_sdk-0.5b0.dev65.dist-info/RECORD +54 -0
- mantatech_sdk-0.5b0.dev65.dist-info/WHEEL +5 -0
- mantatech_sdk-0.5b0.dev65.dist-info/entry_points.txt +2 -0
- mantatech_sdk-0.5b0.dev65.dist-info/licenses/LICENSE +683 -0
- mantatech_sdk-0.5b0.dev65.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
"""SDK log retrieval and streaming commands."""
|
|
2
|
+
|
|
3
|
+
import signal
|
|
4
|
+
import time
|
|
5
|
+
from typing import Optional
|
|
6
|
+
|
|
7
|
+
from rich.table import Table
|
|
8
|
+
|
|
9
|
+
from .base_handler import BaseSDKHandler
|
|
10
|
+
from ..utils.converters import enum_to_string, LOG_SEVERITY_MAP
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class SDKLogsHandler(BaseSDKHandler):
|
|
14
|
+
"""Handle log-related SDK commands."""
|
|
15
|
+
|
|
16
|
+
def add_subparsers(self, parent_parser):
|
|
17
|
+
"""Add logs command subparsers."""
|
|
18
|
+
self.parser = parent_parser # Store parser reference
|
|
19
|
+
subparsers = parent_parser.add_subparsers(
|
|
20
|
+
dest="logs_command", help="Log commands"
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
# Get logs command
|
|
24
|
+
get_parser = subparsers.add_parser("get", help="Get logs for a swarm or task")
|
|
25
|
+
get_parser.add_argument("target_id", help="Swarm ID or Task ID to get logs for")
|
|
26
|
+
get_parser.add_argument(
|
|
27
|
+
"--type",
|
|
28
|
+
choices=["swarm", "task"],
|
|
29
|
+
default="swarm",
|
|
30
|
+
help="Type of target (default: swarm)",
|
|
31
|
+
)
|
|
32
|
+
get_parser.add_argument("--lines", type=int, help="Number of lines to retrieve")
|
|
33
|
+
|
|
34
|
+
# Stream logs command
|
|
35
|
+
stream_parser = subparsers.add_parser("stream", help="Stream logs in real-time")
|
|
36
|
+
stream_parser.add_argument(
|
|
37
|
+
"target_id", help="Swarm ID or Task ID to stream logs for"
|
|
38
|
+
)
|
|
39
|
+
stream_parser.add_argument(
|
|
40
|
+
"--type",
|
|
41
|
+
choices=["swarm", "task"],
|
|
42
|
+
default="swarm",
|
|
43
|
+
help="Type of target (default: swarm)",
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
# Add profile override to all subcommands
|
|
47
|
+
for parser in [get_parser, stream_parser]:
|
|
48
|
+
parser.add_argument("--profile", help="Use specific profile")
|
|
49
|
+
|
|
50
|
+
def handle(self, args) -> int:
|
|
51
|
+
"""Handle logs commands."""
|
|
52
|
+
if not args.logs_command:
|
|
53
|
+
if hasattr(self, "parser"):
|
|
54
|
+
self.parser.print_help()
|
|
55
|
+
return 0 # Return 0 for help display
|
|
56
|
+
|
|
57
|
+
if args.logs_command == "get":
|
|
58
|
+
return self.get_logs(
|
|
59
|
+
args.target_id,
|
|
60
|
+
getattr(args, "type", "swarm"),
|
|
61
|
+
getattr(args, "lines", None),
|
|
62
|
+
)
|
|
63
|
+
elif args.logs_command == "stream":
|
|
64
|
+
return self.stream_logs(args.target_id, getattr(args, "type", "swarm"))
|
|
65
|
+
else:
|
|
66
|
+
self.print_error(f"Unknown logs command: {args.logs_command}")
|
|
67
|
+
return 1
|
|
68
|
+
|
|
69
|
+
def get_logs(
|
|
70
|
+
self, target_id: str, log_type: str = "swarm", lines: Optional[int] = None
|
|
71
|
+
) -> int:
|
|
72
|
+
"""Get logs for a swarm or task."""
|
|
73
|
+
api = self._get_user_api()
|
|
74
|
+
if not api:
|
|
75
|
+
return 1
|
|
76
|
+
|
|
77
|
+
try:
|
|
78
|
+
|
|
79
|
+
async def run():
|
|
80
|
+
if log_type == "swarm":
|
|
81
|
+
return await api.get_swarm_logs(target_id, lines=lines)
|
|
82
|
+
else:
|
|
83
|
+
return await api.get_task_logs(target_id, lines=lines)
|
|
84
|
+
|
|
85
|
+
logs = self._run_with_progress(
|
|
86
|
+
run, f"Fetching logs for {log_type} {target_id}..."
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
if logs is None:
|
|
90
|
+
return 1
|
|
91
|
+
|
|
92
|
+
if not logs:
|
|
93
|
+
self.print("No logs found.")
|
|
94
|
+
return 0
|
|
95
|
+
|
|
96
|
+
# Display logs
|
|
97
|
+
table = Table(title=f"Logs for {log_type.title()}: {target_id}")
|
|
98
|
+
table.add_column("Timestamp", style="cyan")
|
|
99
|
+
table.add_column("Level", style="blue")
|
|
100
|
+
table.add_column("Message", style="white")
|
|
101
|
+
|
|
102
|
+
for log_entry in logs:
|
|
103
|
+
# Convert log level if it's an enum
|
|
104
|
+
level = log_entry.get("level", "INFO")
|
|
105
|
+
if isinstance(level, int):
|
|
106
|
+
level = enum_to_string(level, LOG_SEVERITY_MAP)
|
|
107
|
+
|
|
108
|
+
table.add_row(
|
|
109
|
+
log_entry.get("timestamp", "Unknown"),
|
|
110
|
+
level,
|
|
111
|
+
log_entry.get("message", ""),
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
self.console.print(table)
|
|
115
|
+
|
|
116
|
+
return 0
|
|
117
|
+
|
|
118
|
+
except Exception as e:
|
|
119
|
+
self.print_error(f"Failed to get logs: {e}")
|
|
120
|
+
return 1
|
|
121
|
+
|
|
122
|
+
def stream_logs(self, target_id: str, log_type: str = "swarm") -> int:
|
|
123
|
+
"""Stream logs in real-time."""
|
|
124
|
+
api = self._get_user_api()
|
|
125
|
+
if not api:
|
|
126
|
+
return 1
|
|
127
|
+
|
|
128
|
+
self.print(f"Streaming logs for {log_type}: {target_id}")
|
|
129
|
+
self.print("Press Ctrl+C to stop streaming...")
|
|
130
|
+
|
|
131
|
+
try:
|
|
132
|
+
# Set up signal handler for graceful shutdown
|
|
133
|
+
shutdown_flag = False
|
|
134
|
+
|
|
135
|
+
def signal_handler(sig, frame):
|
|
136
|
+
nonlocal shutdown_flag
|
|
137
|
+
shutdown_flag = True
|
|
138
|
+
|
|
139
|
+
signal.signal(signal.SIGINT, signal_handler)
|
|
140
|
+
|
|
141
|
+
last_log_count = 0
|
|
142
|
+
|
|
143
|
+
while not shutdown_flag:
|
|
144
|
+
try:
|
|
145
|
+
|
|
146
|
+
async def get_logs():
|
|
147
|
+
if log_type == "swarm":
|
|
148
|
+
return await api.get_swarm_logs(target_id)
|
|
149
|
+
else:
|
|
150
|
+
return await api.get_task_logs(target_id)
|
|
151
|
+
|
|
152
|
+
logs = self._run_async(get_logs())
|
|
153
|
+
|
|
154
|
+
# Show new logs since last check
|
|
155
|
+
if logs and len(logs) > last_log_count:
|
|
156
|
+
new_logs = logs[last_log_count:]
|
|
157
|
+
|
|
158
|
+
for log_entry in new_logs:
|
|
159
|
+
timestamp = log_entry.get("timestamp", "unknown")
|
|
160
|
+
level = log_entry.get("level", "INFO")
|
|
161
|
+
message = log_entry.get("message", "")
|
|
162
|
+
self.print(f"[{timestamp}] {level}: {message}")
|
|
163
|
+
|
|
164
|
+
last_log_count = len(logs)
|
|
165
|
+
|
|
166
|
+
time.sleep(2) # Poll every 2 seconds for logs
|
|
167
|
+
|
|
168
|
+
except KeyboardInterrupt:
|
|
169
|
+
self.print("\nLog streaming stopped.")
|
|
170
|
+
return 130 # KeyboardInterrupt exit code
|
|
171
|
+
|
|
172
|
+
except Exception as e:
|
|
173
|
+
self.print_error(f"Log streaming failed: {e}")
|
|
174
|
+
return 1
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
"""Main SDK commands class that delegates to modular command handlers."""
|
|
2
|
+
|
|
3
|
+
from typing import Optional
|
|
4
|
+
|
|
5
|
+
from rich.console import Console
|
|
6
|
+
|
|
7
|
+
from ..config_manager import SDKConfigManager
|
|
8
|
+
|
|
9
|
+
# User commands removed - unified into config commands
|
|
10
|
+
from .sdk_module import SDKModuleHandler
|
|
11
|
+
from .sdk_swarm import SDKSwarmHandler
|
|
12
|
+
from .sdk_cluster import SDKClusterHandler
|
|
13
|
+
from .sdk_results import SDKResultsHandler
|
|
14
|
+
from .sdk_globals import SDKGlobalsHandler
|
|
15
|
+
|
|
16
|
+
# Removed SDKNodesHandler - node operations should use 'manta node' commands
|
|
17
|
+
from .sdk_logs import SDKLogsHandler
|
|
18
|
+
from .sdk_config import SDKConfigHandler
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class SDKCommands:
|
|
22
|
+
"""Main SDK commands class that delegates to modular handlers."""
|
|
23
|
+
|
|
24
|
+
def __init__(self, console: Optional[Console] = None):
|
|
25
|
+
"""Initialize with optional console (for backwards compatibility with CLI)."""
|
|
26
|
+
self.console = console or Console()
|
|
27
|
+
|
|
28
|
+
# Initialize config manager - will be properly instantiated when needed
|
|
29
|
+
self.config_manager = None
|
|
30
|
+
|
|
31
|
+
# Initialize handlers - will be created lazily
|
|
32
|
+
self._handlers = {}
|
|
33
|
+
|
|
34
|
+
def _ensure_managers(self):
|
|
35
|
+
"""Ensure config manager is initialized."""
|
|
36
|
+
if self.config_manager is None:
|
|
37
|
+
self.config_manager = SDKConfigManager()
|
|
38
|
+
|
|
39
|
+
def _get_handler(self, handler_name: str):
|
|
40
|
+
"""Get or create a command handler."""
|
|
41
|
+
if handler_name not in self._handlers:
|
|
42
|
+
self._ensure_managers()
|
|
43
|
+
|
|
44
|
+
handler_classes = {
|
|
45
|
+
# 'user' removed - unified into config
|
|
46
|
+
"module": SDKModuleHandler,
|
|
47
|
+
"swarm": SDKSwarmHandler,
|
|
48
|
+
"cluster": SDKClusterHandler,
|
|
49
|
+
"results": SDKResultsHandler,
|
|
50
|
+
"globals": SDKGlobalsHandler,
|
|
51
|
+
"logs": SDKLogsHandler,
|
|
52
|
+
"config": SDKConfigHandler,
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
if handler_name not in handler_classes:
|
|
56
|
+
raise ValueError(f"Unknown handler: {handler_name}")
|
|
57
|
+
|
|
58
|
+
handler_class = handler_classes[handler_name]
|
|
59
|
+
self._handlers[handler_name] = handler_class(
|
|
60
|
+
self.console, self.config_manager
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
return self._handlers[handler_name]
|
|
64
|
+
|
|
65
|
+
def handle(self, args) -> int:
|
|
66
|
+
"""Handle SDK commands by delegating to appropriate handlers."""
|
|
67
|
+
# Extract the primary command
|
|
68
|
+
if hasattr(args, "sdk_command"):
|
|
69
|
+
command = args.sdk_command
|
|
70
|
+
else:
|
|
71
|
+
# Fallback for direct usage
|
|
72
|
+
command = getattr(args, "command", None)
|
|
73
|
+
|
|
74
|
+
if not command:
|
|
75
|
+
self.console.print("[red]Error:[/red] No command specified")
|
|
76
|
+
return 1
|
|
77
|
+
|
|
78
|
+
# Set config override if specified
|
|
79
|
+
config_override = getattr(args, "config", None)
|
|
80
|
+
|
|
81
|
+
# Map commands to handlers
|
|
82
|
+
command_mapping = {
|
|
83
|
+
# 'user' removed - unified into config
|
|
84
|
+
"cluster": "cluster",
|
|
85
|
+
"module": "module",
|
|
86
|
+
"swarm": "swarm",
|
|
87
|
+
"results": "results",
|
|
88
|
+
"globals": "globals",
|
|
89
|
+
"logs": "logs",
|
|
90
|
+
"config": "config",
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
handler_name = command_mapping.get(command)
|
|
94
|
+
if not handler_name:
|
|
95
|
+
self.console.print(f"[red]Error:[/red] Unknown SDK command: {command}")
|
|
96
|
+
return 1
|
|
97
|
+
|
|
98
|
+
try:
|
|
99
|
+
handler = self._get_handler(handler_name)
|
|
100
|
+
|
|
101
|
+
# Set config override if specified
|
|
102
|
+
if config_override:
|
|
103
|
+
handler.set_profile_override(config_override)
|
|
104
|
+
|
|
105
|
+
return handler.handle(args)
|
|
106
|
+
|
|
107
|
+
except Exception as e:
|
|
108
|
+
self.console.print(f"[red]Error:[/red] Failed to execute command: {e}")
|
|
109
|
+
return 1
|
|
110
|
+
|
|
111
|
+
def add_subparsers(self, parent_parser):
|
|
112
|
+
"""Add all SDK subcommands to the parent parser."""
|
|
113
|
+
# Ensure managers are initialized for handler creation
|
|
114
|
+
self._ensure_managers()
|
|
115
|
+
|
|
116
|
+
# User commands removed - unified into config
|
|
117
|
+
|
|
118
|
+
# Module commands
|
|
119
|
+
module_parser = parent_parser.add_parser(
|
|
120
|
+
"module", help="Module management operations"
|
|
121
|
+
)
|
|
122
|
+
module_handler = self._get_handler("module")
|
|
123
|
+
module_handler.add_subparsers(module_parser)
|
|
124
|
+
|
|
125
|
+
# Swarm commands
|
|
126
|
+
swarm_parser = parent_parser.add_parser(
|
|
127
|
+
"swarm", help="Swarm deployment and management"
|
|
128
|
+
)
|
|
129
|
+
swarm_handler = self._get_handler("swarm")
|
|
130
|
+
swarm_handler.add_subparsers(swarm_parser)
|
|
131
|
+
|
|
132
|
+
# Cluster commands
|
|
133
|
+
cluster_parser = parent_parser.add_parser(
|
|
134
|
+
"cluster", help="Cluster information and management"
|
|
135
|
+
)
|
|
136
|
+
cluster_handler = self._get_handler("cluster")
|
|
137
|
+
cluster_handler.add_subparsers(cluster_parser)
|
|
138
|
+
|
|
139
|
+
# Results commands
|
|
140
|
+
results_parser = parent_parser.add_parser(
|
|
141
|
+
"results", help="Results retrieval and management"
|
|
142
|
+
)
|
|
143
|
+
results_handler = self._get_handler("results")
|
|
144
|
+
results_handler.add_subparsers(results_parser)
|
|
145
|
+
|
|
146
|
+
# Globals commands
|
|
147
|
+
globals_parser = parent_parser.add_parser(
|
|
148
|
+
"globals", help="Globals retrieval and management"
|
|
149
|
+
)
|
|
150
|
+
globals_handler = self._get_handler("globals")
|
|
151
|
+
globals_handler.add_subparsers(globals_parser)
|
|
152
|
+
|
|
153
|
+
# Node commands removed - use 'manta node' instead
|
|
154
|
+
|
|
155
|
+
# Logs commands
|
|
156
|
+
logs_parser = parent_parser.add_parser(
|
|
157
|
+
"logs", help="Log retrieval and streaming"
|
|
158
|
+
)
|
|
159
|
+
logs_handler = self._get_handler("logs")
|
|
160
|
+
logs_handler.add_subparsers(logs_parser)
|
|
161
|
+
|
|
162
|
+
# Config commands
|
|
163
|
+
config_parser = parent_parser.add_parser(
|
|
164
|
+
"config", help="Configuration management"
|
|
165
|
+
)
|
|
166
|
+
config_handler = self._get_handler("config")
|
|
167
|
+
config_handler.add_subparsers(config_parser)
|