-
Notifications
You must be signed in to change notification settings - Fork 8
Expand file tree
/
Copy pathlocalstack-cloud-pods.ts
More file actions
134 lines (117 loc) · 4.32 KB
/
localstack-cloud-pods.ts
File metadata and controls
134 lines (117 loc) · 4.32 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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
import { z } from "zod";
import { type ToolMetadata, type InferSchema } from "xmcp";
import { ProFeature } from "../lib/localstack/license-checker";
import { CloudPodsApiClient } from "../lib/localstack/localstack.client";
import { ResponseBuilder } from "../core/response-builder";
import { runPreflights, requireLocalStackCli, requireProFeature } from "../core/preflight";
// Define the schema for tool parameters
export const schema = {
action: z.enum(["save", "load", "delete", "reset"]).describe("The Cloud Pods action to perform."),
pod_name: z
.string()
.refine((v) => v.trim().length > 0, {
message: "pod_name must not be empty or whitespace",
})
.refine((v) => /^[A-Za-z0-9._-]{1,128}$/.test(v), {
message:
"pod_name may only contain letters, numbers, '.', '_' or '-' and be at most 128 characters",
})
.optional()
.describe(
"The name of the Cloud Pod. This is required for 'save', 'load', and 'delete' actions."
),
};
// Define tool metadata
export const metadata: ToolMetadata = {
name: "localstack-cloud-pods",
description: "Manages LocalStack Cloud Pods with following actions: save, load, delete, reset",
annotations: {
title: "LocalStack Cloud Pods",
readOnlyHint: false,
destructiveHint: true,
idempotentHint: false,
},
};
export default async function localstackCloudPods({
action,
pod_name,
}: InferSchema<typeof schema>) {
const preflightError = await runPreflights([
requireLocalStackCli(),
requireProFeature(ProFeature.CLOUD_PODS),
]);
if (preflightError) return preflightError;
const client = new CloudPodsApiClient();
switch (action) {
case "save": {
if (!pod_name || pod_name.trim() === "") {
return ResponseBuilder.error(
"Missing Required Parameter",
"The `save` action requires the `pod_name` parameter to be specified."
);
}
const result = await client.savePod(pod_name);
if (!result.success) {
if (result.statusCode === 409) {
return ResponseBuilder.error(
"Cloud Pods Error",
`A Cloud Pod named '**${pod_name}**' already exists. Please choose a different name or delete the existing pod first.`
);
}
return ResponseBuilder.error("Cloud Pods Error", result.message);
}
return ResponseBuilder.success(`Cloud Pod '**${pod_name}**' was saved successfully.`);
}
case "load": {
if (!pod_name || pod_name.trim() === "") {
return ResponseBuilder.error(
"Missing Required Parameter",
"The `load` action requires the `pod_name` parameter to be specified."
);
}
const result = await client.loadPod(pod_name);
if (!result.success) {
if (result.statusCode === 404) {
return ResponseBuilder.error(
"Cloud Pods Error",
`A Cloud Pod named '**${pod_name}**' could not be found.`
);
}
return ResponseBuilder.error("Cloud Pods Error", result.message);
}
return ResponseBuilder.success(
`Cloud Pod '**${pod_name}**' was loaded. Your LocalStack instance has been restored to this snapshot.`
);
}
case "delete": {
if (!pod_name || pod_name.trim() === "") {
return ResponseBuilder.error(
"Missing Required Parameter",
"The `delete` action requires the `pod_name` parameter to be specified."
);
}
const result = await client.deletePod(pod_name);
if (!result.success) {
if (result.statusCode === 404) {
return ResponseBuilder.error(
"Cloud Pods Error",
`A Cloud Pod named '**${pod_name}**' could not be found.`
);
}
return ResponseBuilder.error("Cloud Pods Error", result.message);
}
return ResponseBuilder.success(`Cloud Pod '**${pod_name}**' has been permanently deleted.`);
}
case "reset": {
const result = await client.resetState();
if (!result.success) {
return ResponseBuilder.error("Cloud Pods Error", result.message);
}
return ResponseBuilder.markdown(
"⚠️ LocalStack state has been reset successfully. **All unsaved state has been permanently lost.**"
);
}
default:
return ResponseBuilder.error("Unknown action", `Unsupported action: ${action}`);
}
}