kailash 0.8.3__py3-none-any.whl → 0.8.5__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.
- kailash/__init__.py +1 -7
- kailash/cli/__init__.py +11 -1
- kailash/cli/validation_audit.py +570 -0
- kailash/core/actors/supervisor.py +1 -1
- kailash/core/resilience/circuit_breaker.py +71 -1
- kailash/core/resilience/health_monitor.py +172 -0
- kailash/edge/compliance.py +33 -0
- kailash/edge/consistency.py +609 -0
- kailash/edge/coordination/__init__.py +30 -0
- kailash/edge/coordination/global_ordering.py +355 -0
- kailash/edge/coordination/leader_election.py +217 -0
- kailash/edge/coordination/partition_detector.py +296 -0
- kailash/edge/coordination/raft.py +485 -0
- kailash/edge/discovery.py +63 -1
- kailash/edge/migration/__init__.py +19 -0
- kailash/edge/migration/edge_migrator.py +832 -0
- kailash/edge/monitoring/__init__.py +21 -0
- kailash/edge/monitoring/edge_monitor.py +736 -0
- kailash/edge/prediction/__init__.py +10 -0
- kailash/edge/prediction/predictive_warmer.py +591 -0
- kailash/edge/resource/__init__.py +102 -0
- kailash/edge/resource/cloud_integration.py +796 -0
- kailash/edge/resource/cost_optimizer.py +949 -0
- kailash/edge/resource/docker_integration.py +919 -0
- kailash/edge/resource/kubernetes_integration.py +893 -0
- kailash/edge/resource/platform_integration.py +913 -0
- kailash/edge/resource/predictive_scaler.py +959 -0
- kailash/edge/resource/resource_analyzer.py +824 -0
- kailash/edge/resource/resource_pools.py +610 -0
- kailash/integrations/dataflow_edge.py +261 -0
- kailash/mcp_server/registry_integration.py +1 -1
- kailash/monitoring/__init__.py +18 -0
- kailash/monitoring/alerts.py +646 -0
- kailash/monitoring/metrics.py +677 -0
- kailash/nodes/__init__.py +2 -0
- kailash/nodes/ai/__init__.py +17 -0
- kailash/nodes/ai/a2a.py +1914 -43
- kailash/nodes/ai/a2a_backup.py +1807 -0
- kailash/nodes/ai/hybrid_search.py +972 -0
- kailash/nodes/ai/semantic_memory.py +558 -0
- kailash/nodes/ai/streaming_analytics.py +947 -0
- kailash/nodes/base.py +545 -0
- kailash/nodes/edge/__init__.py +36 -0
- kailash/nodes/edge/base.py +240 -0
- kailash/nodes/edge/cloud_node.py +710 -0
- kailash/nodes/edge/coordination.py +239 -0
- kailash/nodes/edge/docker_node.py +825 -0
- kailash/nodes/edge/edge_data.py +582 -0
- kailash/nodes/edge/edge_migration_node.py +392 -0
- kailash/nodes/edge/edge_monitoring_node.py +421 -0
- kailash/nodes/edge/edge_state.py +673 -0
- kailash/nodes/edge/edge_warming_node.py +393 -0
- kailash/nodes/edge/kubernetes_node.py +652 -0
- kailash/nodes/edge/platform_node.py +766 -0
- kailash/nodes/edge/resource_analyzer_node.py +378 -0
- kailash/nodes/edge/resource_optimizer_node.py +501 -0
- kailash/nodes/edge/resource_scaler_node.py +397 -0
- kailash/nodes/ports.py +676 -0
- kailash/runtime/local.py +344 -1
- kailash/runtime/validation/__init__.py +20 -0
- kailash/runtime/validation/connection_context.py +119 -0
- kailash/runtime/validation/enhanced_error_formatter.py +202 -0
- kailash/runtime/validation/error_categorizer.py +164 -0
- kailash/runtime/validation/metrics.py +380 -0
- kailash/runtime/validation/performance.py +615 -0
- kailash/runtime/validation/suggestion_engine.py +212 -0
- kailash/testing/fixtures.py +2 -2
- kailash/workflow/builder.py +234 -8
- kailash/workflow/contracts.py +418 -0
- kailash/workflow/edge_infrastructure.py +369 -0
- kailash/workflow/migration.py +3 -3
- kailash/workflow/type_inference.py +669 -0
- {kailash-0.8.3.dist-info → kailash-0.8.5.dist-info}/METADATA +44 -27
- {kailash-0.8.3.dist-info → kailash-0.8.5.dist-info}/RECORD +78 -28
- kailash/nexus/__init__.py +0 -21
- kailash/nexus/cli/__init__.py +0 -5
- kailash/nexus/cli/__main__.py +0 -6
- kailash/nexus/cli/main.py +0 -176
- kailash/nexus/factory.py +0 -413
- kailash/nexus/gateway.py +0 -545
- {kailash-0.8.3.dist-info → kailash-0.8.5.dist-info}/WHEEL +0 -0
- {kailash-0.8.3.dist-info → kailash-0.8.5.dist-info}/entry_points.txt +0 -0
- {kailash-0.8.3.dist-info → kailash-0.8.5.dist-info}/licenses/LICENSE +0 -0
- {kailash-0.8.3.dist-info → kailash-0.8.5.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,766 @@
|
|
1
|
+
"""Unified platform integration node for edge resource management."""
|
2
|
+
|
3
|
+
from typing import Any, Dict, List, Optional
|
4
|
+
|
5
|
+
from kailash.edge.resource.cloud_integration import CloudProvider
|
6
|
+
from kailash.edge.resource.platform_integration import (
|
7
|
+
PlatformConfig,
|
8
|
+
PlatformIntegration,
|
9
|
+
PlatformType,
|
10
|
+
ResourceRequest,
|
11
|
+
ResourceScope,
|
12
|
+
)
|
13
|
+
from kailash.nodes.base import NodeParameter, register_node
|
14
|
+
from kailash.nodes.base_async import AsyncNode
|
15
|
+
|
16
|
+
|
17
|
+
@register_node()
|
18
|
+
class PlatformNode(AsyncNode):
|
19
|
+
"""Node for unified platform integration and resource management."""
|
20
|
+
|
21
|
+
def __init__(self, **kwargs):
|
22
|
+
super().__init__(**kwargs)
|
23
|
+
self.platform_integration: Optional[PlatformIntegration] = None
|
24
|
+
|
25
|
+
@property
|
26
|
+
def input_parameters(self) -> Dict[str, NodeParameter]:
|
27
|
+
"""Define input parameters."""
|
28
|
+
return {
|
29
|
+
"operation": NodeParameter(
|
30
|
+
name="operation",
|
31
|
+
type=str,
|
32
|
+
required=True,
|
33
|
+
description="Operation to perform",
|
34
|
+
enum=[
|
35
|
+
"initialize",
|
36
|
+
"register_kubernetes",
|
37
|
+
"register_docker",
|
38
|
+
"register_cloud_provider",
|
39
|
+
"allocate_resource",
|
40
|
+
"deallocate_resource",
|
41
|
+
"get_resource_status",
|
42
|
+
"list_allocations",
|
43
|
+
"optimize_resources",
|
44
|
+
"scale_resources",
|
45
|
+
"get_platform_status",
|
46
|
+
"start_monitoring",
|
47
|
+
"stop_monitoring",
|
48
|
+
],
|
49
|
+
),
|
50
|
+
# Platform registration
|
51
|
+
"platform_type": NodeParameter(
|
52
|
+
name="platform_type",
|
53
|
+
type=str,
|
54
|
+
required=False,
|
55
|
+
description="Platform type",
|
56
|
+
enum=["kubernetes", "docker", "cloud", "edge_local"],
|
57
|
+
),
|
58
|
+
"priority": NodeParameter(
|
59
|
+
name="priority",
|
60
|
+
type=int,
|
61
|
+
required=False,
|
62
|
+
description="Platform priority (lower = higher priority)",
|
63
|
+
),
|
64
|
+
# Kubernetes registration
|
65
|
+
"kubeconfig_path": NodeParameter(
|
66
|
+
name="kubeconfig_path",
|
67
|
+
type=str,
|
68
|
+
required=False,
|
69
|
+
description="Path to kubeconfig file",
|
70
|
+
),
|
71
|
+
"context_name": NodeParameter(
|
72
|
+
name="context_name",
|
73
|
+
type=str,
|
74
|
+
required=False,
|
75
|
+
description="Kubernetes context name",
|
76
|
+
),
|
77
|
+
"namespace": NodeParameter(
|
78
|
+
name="namespace",
|
79
|
+
type=str,
|
80
|
+
required=False,
|
81
|
+
description="Kubernetes namespace",
|
82
|
+
),
|
83
|
+
# Docker registration
|
84
|
+
"docker_host": NodeParameter(
|
85
|
+
name="docker_host",
|
86
|
+
type=str,
|
87
|
+
required=False,
|
88
|
+
description="Docker daemon socket URL",
|
89
|
+
),
|
90
|
+
"api_version": NodeParameter(
|
91
|
+
name="api_version",
|
92
|
+
type=str,
|
93
|
+
required=False,
|
94
|
+
description="Docker API version",
|
95
|
+
),
|
96
|
+
"timeout": NodeParameter(
|
97
|
+
name="timeout",
|
98
|
+
type=int,
|
99
|
+
required=False,
|
100
|
+
description="API timeout in seconds",
|
101
|
+
),
|
102
|
+
# Cloud provider registration
|
103
|
+
"cloud_provider": NodeParameter(
|
104
|
+
name="cloud_provider",
|
105
|
+
type=str,
|
106
|
+
required=False,
|
107
|
+
description="Cloud provider",
|
108
|
+
enum=["aws", "gcp", "azure", "alibaba_cloud", "digital_ocean"],
|
109
|
+
),
|
110
|
+
"region": NodeParameter(
|
111
|
+
name="region", type=str, required=False, description="Cloud region"
|
112
|
+
),
|
113
|
+
"zone": NodeParameter(
|
114
|
+
name="zone",
|
115
|
+
type=str,
|
116
|
+
required=False,
|
117
|
+
description="Cloud availability zone",
|
118
|
+
),
|
119
|
+
"profile_name": NodeParameter(
|
120
|
+
name="profile_name",
|
121
|
+
type=str,
|
122
|
+
required=False,
|
123
|
+
description="AWS profile name",
|
124
|
+
),
|
125
|
+
"project_id": NodeParameter(
|
126
|
+
name="project_id",
|
127
|
+
type=str,
|
128
|
+
required=False,
|
129
|
+
description="GCP project ID",
|
130
|
+
),
|
131
|
+
"credentials_path": NodeParameter(
|
132
|
+
name="credentials_path",
|
133
|
+
type=str,
|
134
|
+
required=False,
|
135
|
+
description="Path to credentials file",
|
136
|
+
),
|
137
|
+
"subscription_id": NodeParameter(
|
138
|
+
name="subscription_id",
|
139
|
+
type=str,
|
140
|
+
required=False,
|
141
|
+
description="Azure subscription ID",
|
142
|
+
),
|
143
|
+
"resource_group": NodeParameter(
|
144
|
+
name="resource_group",
|
145
|
+
type=str,
|
146
|
+
required=False,
|
147
|
+
description="Azure resource group",
|
148
|
+
),
|
149
|
+
# Resource operations
|
150
|
+
"request_id": NodeParameter(
|
151
|
+
name="request_id",
|
152
|
+
type=str,
|
153
|
+
required=False,
|
154
|
+
description="Resource request ID",
|
155
|
+
),
|
156
|
+
"allocation_id": NodeParameter(
|
157
|
+
name="allocation_id",
|
158
|
+
type=str,
|
159
|
+
required=False,
|
160
|
+
description="Resource allocation ID",
|
161
|
+
),
|
162
|
+
"edge_node": NodeParameter(
|
163
|
+
name="edge_node", type=str, required=False, description="Edge node name"
|
164
|
+
),
|
165
|
+
"resource_type": NodeParameter(
|
166
|
+
name="resource_type",
|
167
|
+
type=str,
|
168
|
+
required=False,
|
169
|
+
description="Resource type",
|
170
|
+
),
|
171
|
+
"resource_spec": NodeParameter(
|
172
|
+
name="resource_spec",
|
173
|
+
type=dict,
|
174
|
+
required=False,
|
175
|
+
description="Resource specification",
|
176
|
+
),
|
177
|
+
"platform_preference": NodeParameter(
|
178
|
+
name="platform_preference",
|
179
|
+
type=str,
|
180
|
+
required=False,
|
181
|
+
description="Preferred platform for allocation",
|
182
|
+
enum=["kubernetes", "docker", "cloud", "edge_local"],
|
183
|
+
),
|
184
|
+
"scope": NodeParameter(
|
185
|
+
name="scope",
|
186
|
+
type=str,
|
187
|
+
required=False,
|
188
|
+
description="Resource scope",
|
189
|
+
enum=["node", "cluster", "region", "global"],
|
190
|
+
),
|
191
|
+
"tags": NodeParameter(
|
192
|
+
name="tags", type=dict, required=False, description="Resource tags"
|
193
|
+
),
|
194
|
+
# Scaling operations
|
195
|
+
"target_scale": NodeParameter(
|
196
|
+
name="target_scale",
|
197
|
+
type=int,
|
198
|
+
required=False,
|
199
|
+
description="Target scale for resources",
|
200
|
+
),
|
201
|
+
# Configuration
|
202
|
+
"auto_scaling_enabled": NodeParameter(
|
203
|
+
name="auto_scaling_enabled",
|
204
|
+
type=bool,
|
205
|
+
required=False,
|
206
|
+
description="Enable automatic scaling",
|
207
|
+
),
|
208
|
+
"auto_optimization_enabled": NodeParameter(
|
209
|
+
name="auto_optimization_enabled",
|
210
|
+
type=bool,
|
211
|
+
required=False,
|
212
|
+
description="Enable automatic optimization",
|
213
|
+
),
|
214
|
+
"monitoring_interval": NodeParameter(
|
215
|
+
name="monitoring_interval",
|
216
|
+
type=int,
|
217
|
+
required=False,
|
218
|
+
description="Monitoring interval in seconds",
|
219
|
+
),
|
220
|
+
"optimization_interval": NodeParameter(
|
221
|
+
name="optimization_interval",
|
222
|
+
type=int,
|
223
|
+
required=False,
|
224
|
+
description="Optimization interval in seconds",
|
225
|
+
),
|
226
|
+
}
|
227
|
+
|
228
|
+
@property
|
229
|
+
def output_parameters(self) -> Dict[str, NodeParameter]:
|
230
|
+
"""Define output parameters."""
|
231
|
+
return {
|
232
|
+
"status": NodeParameter(
|
233
|
+
name="status", type=str, description="Operation status"
|
234
|
+
),
|
235
|
+
"result": NodeParameter(
|
236
|
+
name="result", type=dict, description="Operation result"
|
237
|
+
),
|
238
|
+
"allocations": NodeParameter(
|
239
|
+
name="allocations",
|
240
|
+
type=list,
|
241
|
+
description="List of resource allocations",
|
242
|
+
),
|
243
|
+
"platform_status": NodeParameter(
|
244
|
+
name="platform_status",
|
245
|
+
type=dict,
|
246
|
+
description="Platform status information",
|
247
|
+
),
|
248
|
+
"optimization_results": NodeParameter(
|
249
|
+
name="optimization_results",
|
250
|
+
type=dict,
|
251
|
+
description="Resource optimization results",
|
252
|
+
),
|
253
|
+
"platform_initialized": NodeParameter(
|
254
|
+
name="platform_initialized",
|
255
|
+
type=bool,
|
256
|
+
description="Whether platform integration was initialized",
|
257
|
+
),
|
258
|
+
"platform_registered": NodeParameter(
|
259
|
+
name="platform_registered",
|
260
|
+
type=bool,
|
261
|
+
description="Whether platform was registered",
|
262
|
+
),
|
263
|
+
"resource_allocated": NodeParameter(
|
264
|
+
name="resource_allocated",
|
265
|
+
type=bool,
|
266
|
+
description="Whether resource was allocated",
|
267
|
+
),
|
268
|
+
"resource_deallocated": NodeParameter(
|
269
|
+
name="resource_deallocated",
|
270
|
+
type=bool,
|
271
|
+
description="Whether resource was deallocated",
|
272
|
+
),
|
273
|
+
"resource_scaled": NodeParameter(
|
274
|
+
name="resource_scaled",
|
275
|
+
type=bool,
|
276
|
+
description="Whether resource was scaled",
|
277
|
+
),
|
278
|
+
"resources_optimized": NodeParameter(
|
279
|
+
name="resources_optimized",
|
280
|
+
type=bool,
|
281
|
+
description="Whether resources were optimized",
|
282
|
+
),
|
283
|
+
"monitoring_started": NodeParameter(
|
284
|
+
name="monitoring_started",
|
285
|
+
type=bool,
|
286
|
+
description="Whether monitoring was started",
|
287
|
+
),
|
288
|
+
"monitoring_stopped": NodeParameter(
|
289
|
+
name="monitoring_stopped",
|
290
|
+
type=bool,
|
291
|
+
description="Whether monitoring was stopped",
|
292
|
+
),
|
293
|
+
}
|
294
|
+
|
295
|
+
def get_parameters(self) -> Dict[str, NodeParameter]:
|
296
|
+
"""Get all parameters for this node."""
|
297
|
+
return self.input_parameters
|
298
|
+
|
299
|
+
async def async_run(self, **kwargs) -> Dict[str, Any]:
|
300
|
+
"""Execute platform operation.
|
301
|
+
|
302
|
+
Args:
|
303
|
+
**kwargs: Operation parameters
|
304
|
+
|
305
|
+
Returns:
|
306
|
+
Operation result
|
307
|
+
"""
|
308
|
+
operation = kwargs.get("operation")
|
309
|
+
|
310
|
+
if not operation:
|
311
|
+
return {"status": "error", "error": "Operation is required"}
|
312
|
+
|
313
|
+
try:
|
314
|
+
if operation == "initialize":
|
315
|
+
return await self._initialize_platform(**kwargs)
|
316
|
+
elif operation == "register_kubernetes":
|
317
|
+
return await self._register_kubernetes(**kwargs)
|
318
|
+
elif operation == "register_docker":
|
319
|
+
return await self._register_docker(**kwargs)
|
320
|
+
elif operation == "register_cloud_provider":
|
321
|
+
return await self._register_cloud_provider(**kwargs)
|
322
|
+
elif operation == "allocate_resource":
|
323
|
+
return await self._allocate_resource(**kwargs)
|
324
|
+
elif operation == "deallocate_resource":
|
325
|
+
return await self._deallocate_resource(**kwargs)
|
326
|
+
elif operation == "get_resource_status":
|
327
|
+
return await self._get_resource_status(**kwargs)
|
328
|
+
elif operation == "list_allocations":
|
329
|
+
return await self._list_allocations(**kwargs)
|
330
|
+
elif operation == "optimize_resources":
|
331
|
+
return await self._optimize_resources(**kwargs)
|
332
|
+
elif operation == "scale_resources":
|
333
|
+
return await self._scale_resources(**kwargs)
|
334
|
+
elif operation == "get_platform_status":
|
335
|
+
return await self._get_platform_status(**kwargs)
|
336
|
+
elif operation == "start_monitoring":
|
337
|
+
return await self._start_monitoring(**kwargs)
|
338
|
+
elif operation == "stop_monitoring":
|
339
|
+
return await self._stop_monitoring(**kwargs)
|
340
|
+
else:
|
341
|
+
return {"status": "error", "error": f"Unknown operation: {operation}"}
|
342
|
+
|
343
|
+
except Exception as e:
|
344
|
+
return {"status": "error", "error": f"Platform operation failed: {str(e)}"}
|
345
|
+
|
346
|
+
async def _initialize_platform(self, **kwargs) -> Dict[str, Any]:
|
347
|
+
"""Initialize platform integration."""
|
348
|
+
try:
|
349
|
+
self.platform_integration = PlatformIntegration()
|
350
|
+
|
351
|
+
# Configure platform integration
|
352
|
+
if kwargs.get("auto_scaling_enabled") is not None:
|
353
|
+
self.platform_integration.auto_scaling_enabled = kwargs[
|
354
|
+
"auto_scaling_enabled"
|
355
|
+
]
|
356
|
+
if kwargs.get("auto_optimization_enabled") is not None:
|
357
|
+
self.platform_integration.auto_optimization_enabled = kwargs[
|
358
|
+
"auto_optimization_enabled"
|
359
|
+
]
|
360
|
+
if kwargs.get("monitoring_interval"):
|
361
|
+
self.platform_integration.monitoring_interval = kwargs[
|
362
|
+
"monitoring_interval"
|
363
|
+
]
|
364
|
+
if kwargs.get("optimization_interval"):
|
365
|
+
self.platform_integration.optimization_interval = kwargs[
|
366
|
+
"optimization_interval"
|
367
|
+
]
|
368
|
+
|
369
|
+
result = await self.platform_integration.initialize()
|
370
|
+
|
371
|
+
return {
|
372
|
+
"status": result.get("status", "unknown"),
|
373
|
+
"platform_initialized": result.get("status") == "success",
|
374
|
+
"result": result,
|
375
|
+
}
|
376
|
+
|
377
|
+
except Exception as e:
|
378
|
+
return {
|
379
|
+
"status": "error",
|
380
|
+
"platform_initialized": False,
|
381
|
+
"error": f"Failed to initialize platform integration: {str(e)}",
|
382
|
+
}
|
383
|
+
|
384
|
+
async def _register_kubernetes(self, **kwargs) -> Dict[str, Any]:
|
385
|
+
"""Register Kubernetes platform."""
|
386
|
+
if not self.platform_integration:
|
387
|
+
await self._initialize_platform(**kwargs)
|
388
|
+
|
389
|
+
kubeconfig_path = kwargs.get("kubeconfig_path")
|
390
|
+
context_name = kwargs.get("context_name")
|
391
|
+
namespace = kwargs.get("namespace", "default")
|
392
|
+
priority = kwargs.get("priority", 1)
|
393
|
+
|
394
|
+
try:
|
395
|
+
result = await self.platform_integration.register_kubernetes(
|
396
|
+
kubeconfig_path=kubeconfig_path,
|
397
|
+
context_name=context_name,
|
398
|
+
namespace=namespace,
|
399
|
+
priority=priority,
|
400
|
+
)
|
401
|
+
|
402
|
+
return {
|
403
|
+
"status": result.get("status", "unknown"),
|
404
|
+
"platform_registered": result.get("status") == "success",
|
405
|
+
"result": result,
|
406
|
+
}
|
407
|
+
|
408
|
+
except Exception as e:
|
409
|
+
return {
|
410
|
+
"status": "error",
|
411
|
+
"platform_registered": False,
|
412
|
+
"error": f"Failed to register Kubernetes: {str(e)}",
|
413
|
+
}
|
414
|
+
|
415
|
+
async def _register_docker(self, **kwargs) -> Dict[str, Any]:
|
416
|
+
"""Register Docker platform."""
|
417
|
+
if not self.platform_integration:
|
418
|
+
await self._initialize_platform(**kwargs)
|
419
|
+
|
420
|
+
docker_host = kwargs.get("docker_host")
|
421
|
+
api_version = kwargs.get("api_version", "auto")
|
422
|
+
timeout = kwargs.get("timeout", 60)
|
423
|
+
priority = kwargs.get("priority", 2)
|
424
|
+
|
425
|
+
try:
|
426
|
+
result = await self.platform_integration.register_docker(
|
427
|
+
docker_host=docker_host,
|
428
|
+
api_version=api_version,
|
429
|
+
timeout=timeout,
|
430
|
+
priority=priority,
|
431
|
+
)
|
432
|
+
|
433
|
+
return {
|
434
|
+
"status": result.get("status", "unknown"),
|
435
|
+
"platform_registered": result.get("status") == "success",
|
436
|
+
"result": result,
|
437
|
+
}
|
438
|
+
|
439
|
+
except Exception as e:
|
440
|
+
return {
|
441
|
+
"status": "error",
|
442
|
+
"platform_registered": False,
|
443
|
+
"error": f"Failed to register Docker: {str(e)}",
|
444
|
+
}
|
445
|
+
|
446
|
+
async def _register_cloud_provider(self, **kwargs) -> Dict[str, Any]:
|
447
|
+
"""Register cloud provider."""
|
448
|
+
if not self.platform_integration:
|
449
|
+
await self._initialize_platform(**kwargs)
|
450
|
+
|
451
|
+
cloud_provider = kwargs.get("cloud_provider")
|
452
|
+
priority = kwargs.get("priority", 3)
|
453
|
+
|
454
|
+
if not cloud_provider:
|
455
|
+
return {
|
456
|
+
"status": "error",
|
457
|
+
"platform_registered": False,
|
458
|
+
"error": "cloud_provider is required",
|
459
|
+
}
|
460
|
+
|
461
|
+
try:
|
462
|
+
# Build provider configuration
|
463
|
+
config = {}
|
464
|
+
|
465
|
+
if cloud_provider == "aws":
|
466
|
+
config["region"] = kwargs.get("region", "us-west-2")
|
467
|
+
config["profile_name"] = kwargs.get("profile_name")
|
468
|
+
elif cloud_provider == "gcp":
|
469
|
+
config["project_id"] = kwargs.get("project_id")
|
470
|
+
config["zone"] = kwargs.get("zone", "us-central1-a")
|
471
|
+
config["credentials_path"] = kwargs.get("credentials_path")
|
472
|
+
|
473
|
+
if not config["project_id"]:
|
474
|
+
return {
|
475
|
+
"status": "error",
|
476
|
+
"platform_registered": False,
|
477
|
+
"error": "project_id is required for GCP",
|
478
|
+
}
|
479
|
+
elif cloud_provider == "azure":
|
480
|
+
config["subscription_id"] = kwargs.get("subscription_id")
|
481
|
+
config["resource_group"] = kwargs.get("resource_group")
|
482
|
+
|
483
|
+
if not config["subscription_id"] or not config["resource_group"]:
|
484
|
+
return {
|
485
|
+
"status": "error",
|
486
|
+
"platform_registered": False,
|
487
|
+
"error": "subscription_id and resource_group are required for Azure",
|
488
|
+
}
|
489
|
+
|
490
|
+
result = await self.platform_integration.register_cloud_provider(
|
491
|
+
CloudProvider(cloud_provider), config, priority
|
492
|
+
)
|
493
|
+
|
494
|
+
return {
|
495
|
+
"status": result.get("status", "unknown"),
|
496
|
+
"platform_registered": result.get("status") == "success",
|
497
|
+
"result": result,
|
498
|
+
}
|
499
|
+
|
500
|
+
except Exception as e:
|
501
|
+
return {
|
502
|
+
"status": "error",
|
503
|
+
"platform_registered": False,
|
504
|
+
"error": f"Failed to register cloud provider: {str(e)}",
|
505
|
+
}
|
506
|
+
|
507
|
+
async def _allocate_resource(self, **kwargs) -> Dict[str, Any]:
|
508
|
+
"""Allocate resource."""
|
509
|
+
if not self.platform_integration:
|
510
|
+
await self._initialize_platform(**kwargs)
|
511
|
+
|
512
|
+
request_id = kwargs.get("request_id")
|
513
|
+
edge_node = kwargs.get("edge_node")
|
514
|
+
resource_type = kwargs.get("resource_type")
|
515
|
+
resource_spec = kwargs.get("resource_spec", {})
|
516
|
+
|
517
|
+
if not all([request_id, edge_node, resource_type]):
|
518
|
+
return {
|
519
|
+
"status": "error",
|
520
|
+
"resource_allocated": False,
|
521
|
+
"error": "request_id, edge_node, and resource_type are required",
|
522
|
+
}
|
523
|
+
|
524
|
+
try:
|
525
|
+
# Create resource request
|
526
|
+
platform_preference = None
|
527
|
+
if kwargs.get("platform_preference"):
|
528
|
+
platform_preference = PlatformType(kwargs["platform_preference"])
|
529
|
+
|
530
|
+
scope = ResourceScope.NODE
|
531
|
+
if kwargs.get("scope"):
|
532
|
+
scope = ResourceScope(kwargs["scope"])
|
533
|
+
|
534
|
+
request = ResourceRequest(
|
535
|
+
request_id=request_id,
|
536
|
+
edge_node=edge_node,
|
537
|
+
resource_type=resource_type,
|
538
|
+
resource_spec=resource_spec,
|
539
|
+
platform_preference=platform_preference,
|
540
|
+
scope=scope,
|
541
|
+
tags=kwargs.get("tags", {}),
|
542
|
+
)
|
543
|
+
|
544
|
+
result = await self.platform_integration.allocate_resource(request)
|
545
|
+
|
546
|
+
return {
|
547
|
+
"status": result.get("status", "unknown"),
|
548
|
+
"resource_allocated": result.get("status") == "success",
|
549
|
+
"result": result,
|
550
|
+
}
|
551
|
+
|
552
|
+
except Exception as e:
|
553
|
+
return {
|
554
|
+
"status": "error",
|
555
|
+
"resource_allocated": False,
|
556
|
+
"error": f"Failed to allocate resource: {str(e)}",
|
557
|
+
}
|
558
|
+
|
559
|
+
async def _deallocate_resource(self, **kwargs) -> Dict[str, Any]:
|
560
|
+
"""Deallocate resource."""
|
561
|
+
if not self.platform_integration:
|
562
|
+
await self._initialize_platform(**kwargs)
|
563
|
+
|
564
|
+
allocation_id = kwargs.get("allocation_id")
|
565
|
+
|
566
|
+
if not allocation_id:
|
567
|
+
return {
|
568
|
+
"status": "error",
|
569
|
+
"resource_deallocated": False,
|
570
|
+
"error": "allocation_id is required",
|
571
|
+
}
|
572
|
+
|
573
|
+
try:
|
574
|
+
result = await self.platform_integration.deallocate_resource(allocation_id)
|
575
|
+
|
576
|
+
return {
|
577
|
+
"status": result.get("status", "unknown"),
|
578
|
+
"resource_deallocated": result.get("status") == "success",
|
579
|
+
"result": result,
|
580
|
+
}
|
581
|
+
|
582
|
+
except Exception as e:
|
583
|
+
return {
|
584
|
+
"status": "error",
|
585
|
+
"resource_deallocated": False,
|
586
|
+
"error": f"Failed to deallocate resource: {str(e)}",
|
587
|
+
}
|
588
|
+
|
589
|
+
async def _get_resource_status(self, **kwargs) -> Dict[str, Any]:
|
590
|
+
"""Get resource status."""
|
591
|
+
if not self.platform_integration:
|
592
|
+
await self._initialize_platform(**kwargs)
|
593
|
+
|
594
|
+
allocation_id = kwargs.get("allocation_id")
|
595
|
+
|
596
|
+
if not allocation_id:
|
597
|
+
return {"status": "error", "error": "allocation_id is required"}
|
598
|
+
|
599
|
+
try:
|
600
|
+
result = await self.platform_integration.get_resource_status(allocation_id)
|
601
|
+
|
602
|
+
return {"status": result.get("status", "unknown"), "result": result}
|
603
|
+
|
604
|
+
except Exception as e:
|
605
|
+
return {
|
606
|
+
"status": "error",
|
607
|
+
"error": f"Failed to get resource status: {str(e)}",
|
608
|
+
}
|
609
|
+
|
610
|
+
async def _list_allocations(self, **kwargs) -> Dict[str, Any]:
|
611
|
+
"""List resource allocations."""
|
612
|
+
if not self.platform_integration:
|
613
|
+
await self._initialize_platform(**kwargs)
|
614
|
+
|
615
|
+
edge_node = kwargs.get("edge_node")
|
616
|
+
platform_type = None
|
617
|
+
if kwargs.get("platform_type"):
|
618
|
+
platform_type = PlatformType(kwargs["platform_type"])
|
619
|
+
|
620
|
+
try:
|
621
|
+
allocations = await self.platform_integration.list_allocations(
|
622
|
+
edge_node=edge_node, platform_type=platform_type
|
623
|
+
)
|
624
|
+
|
625
|
+
return {
|
626
|
+
"status": "success",
|
627
|
+
"allocations": allocations,
|
628
|
+
"result": {
|
629
|
+
"allocation_count": len(allocations),
|
630
|
+
"allocations": allocations,
|
631
|
+
},
|
632
|
+
}
|
633
|
+
|
634
|
+
except Exception as e:
|
635
|
+
return {
|
636
|
+
"status": "error",
|
637
|
+
"allocations": [],
|
638
|
+
"error": f"Failed to list allocations: {str(e)}",
|
639
|
+
}
|
640
|
+
|
641
|
+
async def _optimize_resources(self, **kwargs) -> Dict[str, Any]:
|
642
|
+
"""Optimize resources."""
|
643
|
+
if not self.platform_integration:
|
644
|
+
await self._initialize_platform(**kwargs)
|
645
|
+
|
646
|
+
scope = ResourceScope.CLUSTER
|
647
|
+
if kwargs.get("scope"):
|
648
|
+
scope = ResourceScope(kwargs["scope"])
|
649
|
+
|
650
|
+
try:
|
651
|
+
result = await self.platform_integration.optimize_resources(scope)
|
652
|
+
|
653
|
+
return {
|
654
|
+
"status": result.get("status", "unknown"),
|
655
|
+
"resources_optimized": result.get("status") == "success",
|
656
|
+
"optimization_results": result,
|
657
|
+
"result": result,
|
658
|
+
}
|
659
|
+
|
660
|
+
except Exception as e:
|
661
|
+
return {
|
662
|
+
"status": "error",
|
663
|
+
"resources_optimized": False,
|
664
|
+
"optimization_results": {},
|
665
|
+
"error": f"Failed to optimize resources: {str(e)}",
|
666
|
+
}
|
667
|
+
|
668
|
+
async def _scale_resources(self, **kwargs) -> Dict[str, Any]:
|
669
|
+
"""Scale resources."""
|
670
|
+
if not self.platform_integration:
|
671
|
+
await self._initialize_platform(**kwargs)
|
672
|
+
|
673
|
+
allocation_id = kwargs.get("allocation_id")
|
674
|
+
target_scale = kwargs.get("target_scale")
|
675
|
+
|
676
|
+
if not allocation_id or target_scale is None:
|
677
|
+
return {
|
678
|
+
"status": "error",
|
679
|
+
"resource_scaled": False,
|
680
|
+
"error": "allocation_id and target_scale are required",
|
681
|
+
}
|
682
|
+
|
683
|
+
try:
|
684
|
+
result = await self.platform_integration.scale_resources(
|
685
|
+
allocation_id, target_scale
|
686
|
+
)
|
687
|
+
|
688
|
+
return {
|
689
|
+
"status": result.get("status", "unknown"),
|
690
|
+
"resource_scaled": result.get("status") == "success",
|
691
|
+
"result": result,
|
692
|
+
}
|
693
|
+
|
694
|
+
except Exception as e:
|
695
|
+
return {
|
696
|
+
"status": "error",
|
697
|
+
"resource_scaled": False,
|
698
|
+
"error": f"Failed to scale resources: {str(e)}",
|
699
|
+
}
|
700
|
+
|
701
|
+
async def _get_platform_status(self, **kwargs) -> Dict[str, Any]:
|
702
|
+
"""Get platform status."""
|
703
|
+
if not self.platform_integration:
|
704
|
+
await self._initialize_platform(**kwargs)
|
705
|
+
|
706
|
+
try:
|
707
|
+
result = await self.platform_integration.get_platform_status()
|
708
|
+
|
709
|
+
return {
|
710
|
+
"status": result.get("status", "unknown"),
|
711
|
+
"platform_status": result.get("platforms", {}),
|
712
|
+
"result": result,
|
713
|
+
}
|
714
|
+
|
715
|
+
except Exception as e:
|
716
|
+
return {
|
717
|
+
"status": "error",
|
718
|
+
"platform_status": {},
|
719
|
+
"error": f"Failed to get platform status: {str(e)}",
|
720
|
+
}
|
721
|
+
|
722
|
+
async def _start_monitoring(self, **kwargs) -> Dict[str, Any]:
|
723
|
+
"""Start platform monitoring."""
|
724
|
+
if not self.platform_integration:
|
725
|
+
await self._initialize_platform(**kwargs)
|
726
|
+
|
727
|
+
try:
|
728
|
+
result = await self.platform_integration.start_monitoring()
|
729
|
+
|
730
|
+
return {
|
731
|
+
"status": result.get("status", "unknown"),
|
732
|
+
"monitoring_started": result.get("status") == "success",
|
733
|
+
"result": result,
|
734
|
+
}
|
735
|
+
|
736
|
+
except Exception as e:
|
737
|
+
return {
|
738
|
+
"status": "error",
|
739
|
+
"monitoring_started": False,
|
740
|
+
"error": f"Failed to start monitoring: {str(e)}",
|
741
|
+
}
|
742
|
+
|
743
|
+
async def _stop_monitoring(self, **kwargs) -> Dict[str, Any]:
|
744
|
+
"""Stop platform monitoring."""
|
745
|
+
if not self.platform_integration:
|
746
|
+
return {
|
747
|
+
"status": "error",
|
748
|
+
"monitoring_stopped": False,
|
749
|
+
"error": "Platform integration not initialized",
|
750
|
+
}
|
751
|
+
|
752
|
+
try:
|
753
|
+
result = await self.platform_integration.stop_monitoring()
|
754
|
+
|
755
|
+
return {
|
756
|
+
"status": result.get("status", "unknown"),
|
757
|
+
"monitoring_stopped": result.get("status") == "success",
|
758
|
+
"result": result,
|
759
|
+
}
|
760
|
+
|
761
|
+
except Exception as e:
|
762
|
+
return {
|
763
|
+
"status": "error",
|
764
|
+
"monitoring_stopped": False,
|
765
|
+
"error": f"Failed to stop monitoring: {str(e)}",
|
766
|
+
}
|