-
Notifications
You must be signed in to change notification settings - Fork 11
Expand file tree
/
Copy pathlocalstack-cloud-pods.ts
More file actions
138 lines (123 loc) · 4.38 KB
/
localstack-cloud-pods.ts
File metadata and controls
138 lines (123 loc) · 4.38 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
135
136
137
138
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,
requireAuthToken,
requireLocalStackRunning,
requireLocalStackCli,
requireProFeature,
} from "../core/preflight";
import { withToolAnalytics } from "../core/analytics";
// Define the schema for tool parameters
export const schema = {
action: z
.enum(["save", "load", "delete"])
.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 remote LocalStack Cloud Pods with following actions: save, load, delete",
annotations: {
title: "LocalStack Cloud Pods",
readOnlyHint: false,
destructiveHint: true,
idempotentHint: false,
},
};
export default async function localstackCloudPods({
action,
pod_name,
}: InferSchema<typeof schema>) {
return withToolAnalytics("localstack-cloud-pods", { action, pod_name }, async () => {
const preflightError = await runPreflights([
requireAuthToken(),
requireLocalStackRunning(),
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.`);
}
default:
return ResponseBuilder.error("Unknown action", `Unsupported action: ${action}`);
}
});
}