@itssergio91/sandman 0.1.2 → 0.2.0
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.
- package/dist/cli/commands/connect.d.ts +5 -1
- package/dist/cli/commands/connect.d.ts.map +1 -1
- package/dist/cli/commands/connect.js +22 -20
- package/dist/cli/commands/connect.js.map +1 -1
- package/dist/cli/commands/create.d.ts +3 -2
- package/dist/cli/commands/create.d.ts.map +1 -1
- package/dist/cli/commands/create.js +53 -16
- package/dist/cli/commands/create.js.map +1 -1
- package/dist/cli/commands/destroy.d.ts +1 -0
- package/dist/cli/commands/destroy.d.ts.map +1 -1
- package/dist/cli/commands/destroy.js +15 -6
- package/dist/cli/commands/destroy.js.map +1 -1
- package/dist/cli/commands/enable.d.ts +5 -1
- package/dist/cli/commands/enable.d.ts.map +1 -1
- package/dist/cli/commands/enable.js +29 -14
- package/dist/cli/commands/enable.js.map +1 -1
- package/dist/cli/commands/init.d.ts +6 -1
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +13 -6
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/status.d.ts +1 -1
- package/dist/cli/commands/status.d.ts.map +1 -1
- package/dist/cli/commands/status.js +34 -23
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +14 -9
- package/dist/cli/index.js.map +1 -1
- package/dist/core/state-store.d.ts +3 -3
- package/dist/core/state-store.d.ts.map +1 -1
- package/dist/core/state-store.js +1 -1
- package/dist/core/state-store.js.map +1 -1
- package/dist/providers/aws/adapter.d.ts +3 -0
- package/dist/providers/aws/adapter.d.ts.map +1 -1
- package/dist/providers/aws/adapter.js +331 -9
- package/dist/providers/aws/adapter.js.map +1 -1
- package/dist/providers/aws/adapter.test.js +107 -0
- package/dist/providers/aws/adapter.test.js.map +1 -1
- package/dist/providers/base.d.ts +2 -0
- package/dist/providers/base.d.ts.map +1 -1
- package/dist/providers/base.js +14 -0
- package/dist/providers/base.js.map +1 -1
- package/dist/providers/cloudflare/adapter.d.ts +12 -0
- package/dist/providers/cloudflare/adapter.d.ts.map +1 -0
- package/dist/providers/cloudflare/adapter.js +85 -0
- package/dist/providers/cloudflare/adapter.js.map +1 -0
- package/dist/providers/cloudflare/adapter.test.d.ts +2 -0
- package/dist/providers/cloudflare/adapter.test.d.ts.map +1 -0
- package/dist/providers/cloudflare/adapter.test.js +178 -0
- package/dist/providers/cloudflare/adapter.test.js.map +1 -0
- package/dist/providers/gcp/adapter.d.ts +3 -0
- package/dist/providers/gcp/adapter.d.ts.map +1 -1
- package/dist/providers/gcp/adapter.js +150 -18
- package/dist/providers/gcp/adapter.js.map +1 -1
- package/dist/providers/gcp/adapter.test.js +122 -15
- package/dist/providers/gcp/adapter.test.js.map +1 -1
- package/dist/providers/index.d.ts +4 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +13 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/vercel/adapter.d.ts +12 -0
- package/dist/providers/vercel/adapter.d.ts.map +1 -0
- package/dist/providers/vercel/adapter.js +74 -0
- package/dist/providers/vercel/adapter.js.map +1 -0
- package/dist/providers/vercel/adapter.test.d.ts +2 -0
- package/dist/providers/vercel/adapter.test.d.ts.map +1 -0
- package/dist/providers/vercel/adapter.test.js +166 -0
- package/dist/providers/vercel/adapter.test.js.map +1 -0
- package/dist/types/index.d.ts +21 -21
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +18 -4
- package/dist/types/index.js.map +1 -1
- package/dist/utils/cost-estimator.d.ts +36 -0
- package/dist/utils/cost-estimator.d.ts.map +1 -0
- package/dist/utils/cost-estimator.js +87 -0
- package/dist/utils/cost-estimator.js.map +1 -0
- package/dist/utils/cost-estimator.test.d.ts +2 -0
- package/dist/utils/cost-estimator.test.d.ts.map +1 -0
- package/dist/utils/cost-estimator.test.js +77 -0
- package/dist/utils/cost-estimator.test.js.map +1 -0
- package/package.json +1 -1
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { GCP_SERVICES } from "../base.js";
|
|
2
2
|
export class GcpAdapter {
|
|
3
3
|
projectId = null;
|
|
4
|
+
projectNumber = null;
|
|
4
5
|
billingAccountId = null;
|
|
5
6
|
async init() {
|
|
6
7
|
try {
|
|
@@ -42,25 +43,93 @@ export class GcpAdapter {
|
|
|
42
43
|
}
|
|
43
44
|
}
|
|
44
45
|
async createEnvironment(name) {
|
|
46
|
+
if (!this.projectId) {
|
|
47
|
+
throw new Error("No GCP project configured. Set GCP_PROJECT environment variable or run 'gcloud config set project PROJECT_ID'");
|
|
48
|
+
}
|
|
49
|
+
// Generate a unique project ID for the sandman environment
|
|
45
50
|
const timestamp = Date.now();
|
|
46
|
-
const
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
51
|
+
const sandmanProjectId = `sandman-${name}-${timestamp}`;
|
|
52
|
+
try {
|
|
53
|
+
const { ProjectsClient } = await import("@google-cloud/resource-manager");
|
|
54
|
+
const resourceManagerClient = new ProjectsClient();
|
|
55
|
+
// Create the project
|
|
56
|
+
const [operation] = await resourceManagerClient.createProject({
|
|
57
|
+
project: {
|
|
58
|
+
projectId: sandmanProjectId,
|
|
59
|
+
name: `Sandman Environment: ${name}`,
|
|
60
|
+
},
|
|
61
|
+
});
|
|
62
|
+
// Wait for the operation to complete
|
|
63
|
+
const [projectOperation] = await operation.promise();
|
|
64
|
+
// Get the project details to get the project number
|
|
65
|
+
const [project] = await resourceManagerClient.getProject({
|
|
66
|
+
name: `projects/${sandmanProjectId}`,
|
|
67
|
+
});
|
|
68
|
+
// Store the project ID and number
|
|
69
|
+
this.projectId = sandmanProjectId;
|
|
70
|
+
this.projectNumber = project.projectNumber?.toString() || null;
|
|
71
|
+
// Link billing account if provided
|
|
72
|
+
if (this.billingAccountId) {
|
|
73
|
+
await this.linkBillingAccount(sandmanProjectId);
|
|
74
|
+
}
|
|
75
|
+
const now = new Date().toISOString();
|
|
76
|
+
return {
|
|
77
|
+
name,
|
|
78
|
+
provider: "gcp",
|
|
79
|
+
projectId: sandmanProjectId,
|
|
80
|
+
status: "active",
|
|
81
|
+
services: [],
|
|
82
|
+
resources: {},
|
|
83
|
+
createdAt: now,
|
|
84
|
+
updatedAt: now,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
throw new Error(`Failed to create GCP project: ${error.message ?? "Unknown error"}`);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
async linkBillingAccount(projectId) {
|
|
92
|
+
if (!this.billingAccountId) {
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
try {
|
|
96
|
+
const { CloudBillingClient } = await import("@google-cloud/billing");
|
|
97
|
+
const billingClient = new CloudBillingClient();
|
|
98
|
+
// Update project billing info to link the billing account
|
|
99
|
+
await billingClient.updateProjectBillingInfo({
|
|
100
|
+
name: `projects/${projectId}`,
|
|
101
|
+
projectBillingInfo: {
|
|
102
|
+
billingAccountName: `billingAccounts/${this.billingAccountId}`,
|
|
103
|
+
},
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
throw new Error(`Failed to link billing account: ${error.message ?? "Unknown error"}`);
|
|
108
|
+
}
|
|
58
109
|
}
|
|
59
110
|
async enableServices(env, services) {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
111
|
+
if (!env.projectId) {
|
|
112
|
+
throw new Error("Project ID is required to enable services");
|
|
113
|
+
}
|
|
114
|
+
try {
|
|
115
|
+
const { ServiceUsageClient } = await import("@google-cloud/service-usage");
|
|
116
|
+
const serviceUsageClient = new ServiceUsageClient();
|
|
117
|
+
const serviceNames = services.map((s) => GCP_SERVICES[s]).filter(Boolean);
|
|
118
|
+
if (serviceNames.length === 0) {
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
console.log(`Enabling GCP services: ${serviceNames.join(", ")}`);
|
|
122
|
+
// Enable each service
|
|
123
|
+
for (const serviceName of serviceNames) {
|
|
124
|
+
const request = {
|
|
125
|
+
name: `projects/${env.projectId}/services/${serviceName}`,
|
|
126
|
+
};
|
|
127
|
+
await serviceUsageClient.enableService(request);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
throw new Error(`Failed to enable GCP services: ${error.message ?? "Unknown error"}`);
|
|
132
|
+
}
|
|
64
133
|
}
|
|
65
134
|
async connect(env) {
|
|
66
135
|
const result = {
|
|
@@ -72,10 +141,70 @@ export class GcpAdapter {
|
|
|
72
141
|
return result;
|
|
73
142
|
}
|
|
74
143
|
async destroyEnvironment(env) {
|
|
75
|
-
|
|
144
|
+
if (!env.projectId) {
|
|
145
|
+
throw new Error("Project ID is required to destroy environment");
|
|
146
|
+
}
|
|
147
|
+
try {
|
|
148
|
+
const { ProjectsClient } = await import("@google-cloud/resource-manager");
|
|
149
|
+
const resourceManagerClient = new ProjectsClient();
|
|
150
|
+
// Delete the project
|
|
151
|
+
const [operation] = await resourceManagerClient.deleteProject({
|
|
152
|
+
name: `projects/${env.projectId}`,
|
|
153
|
+
});
|
|
154
|
+
// Wait for the operation to complete
|
|
155
|
+
await operation.promise();
|
|
156
|
+
console.log(`Deleted GCP project: ${env.projectId}`);
|
|
157
|
+
}
|
|
158
|
+
catch (error) {
|
|
159
|
+
throw new Error(`Failed to delete GCP project: ${error.message ?? "Unknown error"}`);
|
|
160
|
+
}
|
|
76
161
|
}
|
|
77
162
|
async getStatus(env) {
|
|
78
|
-
|
|
163
|
+
if (!env.projectId) {
|
|
164
|
+
return {
|
|
165
|
+
...env,
|
|
166
|
+
status: "failed",
|
|
167
|
+
error: "Project ID not available",
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
try {
|
|
171
|
+
const { ProjectsClient } = await import("@google-cloud/resource-manager");
|
|
172
|
+
const resourceManagerClient = new ProjectsClient();
|
|
173
|
+
// Get the project to check its status
|
|
174
|
+
const [project] = await resourceManagerClient.getProject({
|
|
175
|
+
name: `projects/${env.projectId}`,
|
|
176
|
+
});
|
|
177
|
+
// Map GCP project lifecycle state to our status
|
|
178
|
+
let status = env.status;
|
|
179
|
+
const lifecycleState = project.lifecycleState;
|
|
180
|
+
switch (lifecycleState) {
|
|
181
|
+
case "ACTIVE":
|
|
182
|
+
status = "active";
|
|
183
|
+
break;
|
|
184
|
+
case "DELETE_REQUESTED":
|
|
185
|
+
case "DELETE_IN_PROGRESS":
|
|
186
|
+
status = "destroyed";
|
|
187
|
+
break;
|
|
188
|
+
case "FAILED":
|
|
189
|
+
status = "failed";
|
|
190
|
+
break;
|
|
191
|
+
default:
|
|
192
|
+
status = "pending";
|
|
193
|
+
}
|
|
194
|
+
return {
|
|
195
|
+
...env,
|
|
196
|
+
status,
|
|
197
|
+
updatedAt: new Date().toISOString(),
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
catch (error) {
|
|
201
|
+
// If we can't get the project, it might have been deleted
|
|
202
|
+
return {
|
|
203
|
+
...env,
|
|
204
|
+
status: "destroyed",
|
|
205
|
+
updatedAt: new Date().toISOString(),
|
|
206
|
+
};
|
|
207
|
+
}
|
|
79
208
|
}
|
|
80
209
|
setBillingAccount(accountId) {
|
|
81
210
|
this.billingAccountId = accountId;
|
|
@@ -83,5 +212,8 @@ export class GcpAdapter {
|
|
|
83
212
|
getProjectId() {
|
|
84
213
|
return this.projectId;
|
|
85
214
|
}
|
|
215
|
+
getProjectNumber() {
|
|
216
|
+
return this.projectNumber;
|
|
217
|
+
}
|
|
86
218
|
}
|
|
87
219
|
//# sourceMappingURL=adapter.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../src/providers/gcp/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,YAAY,EAAE,MAAM,YAAY,CAAC;AAG3D,MAAM,OAAO,UAAU;IACb,SAAS,GAAkB,IAAI,CAAC;IAChC,gBAAgB,GAAkB,IAAI,CAAC;IAE/C,KAAK,CAAC,IAAI;QACR,IAAI,CAAC;YACH,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,gCAAgC,CAAC,CAAC;YAC1E,MAAM,MAAM,GAAG,IAAI,cAAc,EAAE,CAAC;YAEpC,kDAAkD;YAClD,+CAA+C;YAC/C,MAAM,CAAC,QAAQ,CAAC,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;YAEhE,oBAAoB;YACpB,yBAAyB;YACzB,sDAAsD;YACtD,kCAAkC;YAClC,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;YAC3C,MAAM,aAAa,GACjB,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC;YAExE,IAAI,UAAU,EAAE,CAAC;gBACf,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC;YAC9B,CAAC;iBAAM,IAAI,aAAa,EAAE,CAAC;gBACzB,IAAI,CAAC,SAAS,GAAG,aAAa,CAAC;YACjC,CAAC;iBAAM,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;gBACxD,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YACzC,CAAC;iBAAM,CAAC;gBACN,2EAA2E;gBAC3E,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YACxB,CAAC;QACH,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,EAAE,EAAE,CAAC;gBAC1C,uCAAuC;gBACvC,MAAM,IAAI,KAAK,CACb,0EAA0E,CAC3E,CAAC;YACJ,CAAC;YACD,IACE,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,gBAAgB,CAAC;gBACzC,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,aAAa,CAAC,EACtC,CAAC;gBACD,MAAM,IAAI,KAAK,CACb,0EAA0E,CAC3E,CAAC;YACJ,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,IAAY;QAClC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../src/providers/gcp/adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
import { describe, it, expect, vi, beforeEach } from "vitest";
|
|
2
2
|
import { GcpAdapter } from "./adapter.js";
|
|
3
|
+
const mockEnableService = vi.fn();
|
|
4
|
+
const mockCreateProject = vi.fn();
|
|
5
|
+
const mockGetProject = vi.fn();
|
|
6
|
+
const mockDeleteProject = vi.fn();
|
|
7
|
+
const mockGetOperation = vi.fn();
|
|
3
8
|
vi.mock("@google-cloud/resource-manager", () => ({
|
|
4
9
|
ProjectsClient: vi.fn().mockImplementation(() => ({
|
|
5
10
|
searchProjects: vi
|
|
@@ -7,15 +12,32 @@ vi.mock("@google-cloud/resource-manager", () => ({
|
|
|
7
12
|
.mockResolvedValue([
|
|
8
13
|
[{ projectId: "test-project", name: "Test Project" }],
|
|
9
14
|
]),
|
|
10
|
-
getProject:
|
|
11
|
-
|
|
12
|
-
|
|
15
|
+
getProject: mockGetProject,
|
|
16
|
+
createProject: mockCreateProject,
|
|
17
|
+
deleteProject: mockDeleteProject,
|
|
18
|
+
})),
|
|
19
|
+
}));
|
|
20
|
+
vi.mock("@google-cloud/service-usage", () => ({
|
|
21
|
+
ServiceUsageClient: vi.fn().mockImplementation(() => ({
|
|
22
|
+
enableService: mockEnableService,
|
|
13
23
|
})),
|
|
14
24
|
}));
|
|
15
25
|
describe("GcpAdapter", () => {
|
|
16
26
|
let adapter;
|
|
17
27
|
beforeEach(() => {
|
|
18
28
|
vi.clearAllMocks();
|
|
29
|
+
mockEnableService.mockResolvedValue([{}]);
|
|
30
|
+
// Mock successful project creation
|
|
31
|
+
const mockOperation = {
|
|
32
|
+
promise: vi
|
|
33
|
+
.fn()
|
|
34
|
+
.mockResolvedValue([{ name: "projects/sandman-test-env-123456789" }]),
|
|
35
|
+
};
|
|
36
|
+
mockCreateProject.mockResolvedValue([mockOperation]);
|
|
37
|
+
mockGetProject.mockResolvedValue([
|
|
38
|
+
{ projectId: "sandman-test-env-123456789", projectNumber: "1234567890" },
|
|
39
|
+
]);
|
|
40
|
+
mockDeleteProject.mockResolvedValue([mockOperation]);
|
|
19
41
|
adapter = new GcpAdapter();
|
|
20
42
|
});
|
|
21
43
|
describe("init", () => {
|
|
@@ -39,15 +61,36 @@ describe("GcpAdapter", () => {
|
|
|
39
61
|
});
|
|
40
62
|
describe("createEnvironment", () => {
|
|
41
63
|
it("should create an environment record", async () => {
|
|
64
|
+
await adapter.init(); // Initialize first
|
|
42
65
|
const env = await adapter.createEnvironment("test-env");
|
|
43
66
|
expect(env.name).toBe("test-env");
|
|
44
67
|
expect(env.provider).toBe("gcp");
|
|
45
68
|
expect(env.status).toBe("active");
|
|
46
69
|
expect(env.projectId).toMatch(/^sandman-test-env-/);
|
|
47
70
|
});
|
|
71
|
+
it("should create actual GCP project via Resource Manager API", async () => {
|
|
72
|
+
await adapter.init(); // Initialize first
|
|
73
|
+
await adapter.createEnvironment("test-env");
|
|
74
|
+
expect(mockCreateProject).toHaveBeenCalledWith({
|
|
75
|
+
project: expect.objectContaining({
|
|
76
|
+
projectId: expect.stringMatching(/^sandman-test-env-/),
|
|
77
|
+
name: "Sandman Environment: test-env",
|
|
78
|
+
}),
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
it("should throw error when no project configured", async () => {
|
|
82
|
+
// Create a mock that returns no projects
|
|
83
|
+
const { ProjectsClient } = await import("@google-cloud/resource-manager");
|
|
84
|
+
ProjectsClient.mockImplementationOnce(() => ({
|
|
85
|
+
searchProjects: vi.fn().mockResolvedValue([[]]), // Empty projects array
|
|
86
|
+
}));
|
|
87
|
+
const freshAdapter = new GcpAdapter();
|
|
88
|
+
await freshAdapter.init();
|
|
89
|
+
await expect(freshAdapter.createEnvironment("test-env")).rejects.toThrow("No GCP project configured");
|
|
90
|
+
});
|
|
48
91
|
});
|
|
49
92
|
describe("enableServices", () => {
|
|
50
|
-
it("should
|
|
93
|
+
it("should call Service Usage API to enable services", async () => {
|
|
51
94
|
const env = {
|
|
52
95
|
name: "test",
|
|
53
96
|
provider: "gcp",
|
|
@@ -58,10 +101,42 @@ describe("GcpAdapter", () => {
|
|
|
58
101
|
createdAt: new Date().toISOString(),
|
|
59
102
|
updatedAt: new Date().toISOString(),
|
|
60
103
|
};
|
|
61
|
-
const consoleSpy = vi.spyOn(console, "log");
|
|
62
104
|
await adapter.enableServices(env, ["compute", "storage"]);
|
|
63
|
-
|
|
64
|
-
|
|
105
|
+
// Verify Service Usage API was called for each service
|
|
106
|
+
expect(mockEnableService).toHaveBeenCalledTimes(2);
|
|
107
|
+
expect(mockEnableService).toHaveBeenCalledWith({
|
|
108
|
+
name: "projects/test-project/services/compute.googleapis.com",
|
|
109
|
+
});
|
|
110
|
+
expect(mockEnableService).toHaveBeenCalledWith({
|
|
111
|
+
name: "projects/test-project/services/storage.googleapis.com",
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
it("should throw error when projectId is missing", async () => {
|
|
115
|
+
const env = {
|
|
116
|
+
name: "test",
|
|
117
|
+
provider: "gcp",
|
|
118
|
+
status: "active",
|
|
119
|
+
services: [],
|
|
120
|
+
resources: {},
|
|
121
|
+
projectId: undefined,
|
|
122
|
+
createdAt: new Date().toISOString(),
|
|
123
|
+
updatedAt: new Date().toISOString(),
|
|
124
|
+
};
|
|
125
|
+
await expect(adapter.enableServices(env, ["compute"])).rejects.toThrow("Project ID is required to enable services");
|
|
126
|
+
});
|
|
127
|
+
it("should handle API errors gracefully", async () => {
|
|
128
|
+
const env = {
|
|
129
|
+
name: "test",
|
|
130
|
+
provider: "gcp",
|
|
131
|
+
status: "active",
|
|
132
|
+
services: [],
|
|
133
|
+
resources: {},
|
|
134
|
+
projectId: "test-project",
|
|
135
|
+
createdAt: new Date().toISOString(),
|
|
136
|
+
updatedAt: new Date().toISOString(),
|
|
137
|
+
};
|
|
138
|
+
mockEnableService.mockRejectedValueOnce(new Error("API Error"));
|
|
139
|
+
await expect(adapter.enableServices(env, ["compute"])).rejects.toThrow("Failed to enable GCP services");
|
|
65
140
|
});
|
|
66
141
|
});
|
|
67
142
|
describe("connect", () => {
|
|
@@ -82,29 +157,45 @@ describe("GcpAdapter", () => {
|
|
|
82
157
|
});
|
|
83
158
|
});
|
|
84
159
|
describe("destroyEnvironment", () => {
|
|
85
|
-
it("should
|
|
160
|
+
it("should delete GCP project via Resource Manager API", async () => {
|
|
86
161
|
const env = {
|
|
87
162
|
name: "test",
|
|
88
163
|
provider: "gcp",
|
|
89
164
|
status: "active",
|
|
90
165
|
services: [],
|
|
91
166
|
resources: {},
|
|
92
|
-
projectId: "test-
|
|
167
|
+
projectId: "sandman-test-env-123456789",
|
|
93
168
|
createdAt: new Date().toISOString(),
|
|
94
169
|
updatedAt: new Date().toISOString(),
|
|
95
170
|
};
|
|
96
|
-
const consoleSpy = vi.spyOn(console, "log");
|
|
97
171
|
await adapter.destroyEnvironment(env);
|
|
98
|
-
expect(
|
|
99
|
-
|
|
172
|
+
expect(mockDeleteProject).toHaveBeenCalledWith({
|
|
173
|
+
name: "projects/sandman-test-env-123456789",
|
|
174
|
+
});
|
|
175
|
+
});
|
|
176
|
+
it("should throw error when projectId is missing", async () => {
|
|
177
|
+
const env = {
|
|
178
|
+
name: "test",
|
|
179
|
+
provider: "gcp",
|
|
180
|
+
status: "active",
|
|
181
|
+
services: [],
|
|
182
|
+
resources: {},
|
|
183
|
+
projectId: "",
|
|
184
|
+
createdAt: new Date().toISOString(),
|
|
185
|
+
updatedAt: new Date().toISOString(),
|
|
186
|
+
};
|
|
187
|
+
await expect(adapter.destroyEnvironment(env)).rejects.toThrow("Project ID is required to destroy environment");
|
|
100
188
|
});
|
|
101
189
|
});
|
|
102
190
|
describe("getStatus", () => {
|
|
103
|
-
it("should return
|
|
191
|
+
it("should return active status when project is ACTIVE", async () => {
|
|
192
|
+
mockGetProject.mockResolvedValueOnce([
|
|
193
|
+
{ projectId: "test-project", lifecycleState: "ACTIVE" },
|
|
194
|
+
]);
|
|
104
195
|
const env = {
|
|
105
196
|
name: "test",
|
|
106
197
|
provider: "gcp",
|
|
107
|
-
status: "
|
|
198
|
+
status: "pending",
|
|
108
199
|
services: ["compute"],
|
|
109
200
|
resources: {},
|
|
110
201
|
projectId: "test-project",
|
|
@@ -112,7 +203,23 @@ describe("GcpAdapter", () => {
|
|
|
112
203
|
updatedAt: "2026-01-01T00:00:00.000Z",
|
|
113
204
|
};
|
|
114
205
|
const result = await adapter.getStatus(env);
|
|
115
|
-
expect(result).
|
|
206
|
+
expect(result.status).toBe("active");
|
|
207
|
+
expect(result.projectId).toBe("test-project");
|
|
208
|
+
});
|
|
209
|
+
it("should return destroyed status when project is deleted", async () => {
|
|
210
|
+
mockGetProject.mockRejectedValueOnce(new Error("Project not found"));
|
|
211
|
+
const env = {
|
|
212
|
+
name: "test",
|
|
213
|
+
provider: "gcp",
|
|
214
|
+
status: "active",
|
|
215
|
+
services: [],
|
|
216
|
+
resources: {},
|
|
217
|
+
projectId: "test-project",
|
|
218
|
+
createdAt: "2026-01-01T00:00:00.000Z",
|
|
219
|
+
updatedAt: "2026-01-01T00:00:00.000Z",
|
|
220
|
+
};
|
|
221
|
+
const result = await adapter.getStatus(env);
|
|
222
|
+
expect(result.status).toBe("destroyed");
|
|
116
223
|
});
|
|
117
224
|
});
|
|
118
225
|
describe("setBillingAccount", () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.test.js","sourceRoot":"","sources":["../../../src/providers/gcp/adapter.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,EAAE,CAAC,IAAI,CAAC,gCAAgC,EAAE,GAAG,EAAE,CAAC,CAAC;IAC/C,cAAc,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC,CAAC;QAChD,cAAc,EAAE,EAAE;aACf,EAAE,EAAE;aACJ,iBAAiB,CAAC;YACjB,CAAC,EAAE,SAAS,EAAE,cAAc,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC;SACtD,CAAC;QACJ,UAAU,EAAE,
|
|
1
|
+
{"version":3,"file":"adapter.test.js","sourceRoot":"","sources":["../../../src/providers/gcp/adapter.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,wBAAgB,UAAU,CAAC,YAAY,EAAE,YAAY,GAAG,eAAe,CAOtE"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { AwsAdapter } from './aws/adapter.js';
|
|
2
|
+
import { GcpAdapter } from './gcp/adapter.js';
|
|
3
|
+
import { CloudflareAdapter } from './cloudflare/adapter.js';
|
|
4
|
+
import { VercelAdapter } from './vercel/adapter.js';
|
|
5
|
+
export function getAdapter(providerType) {
|
|
6
|
+
switch (providerType) {
|
|
7
|
+
case 'aws': return new AwsAdapter();
|
|
8
|
+
case 'gcp': return new GcpAdapter();
|
|
9
|
+
case 'cloudflare': return new CloudflareAdapter();
|
|
10
|
+
case 'vercel': return new VercelAdapter();
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAIpD,MAAM,UAAU,UAAU,CAAC,YAA0B;IACnD,QAAQ,YAAY,EAAE,CAAC;QACrB,KAAK,KAAK,CAAC,CAAC,OAAO,IAAI,UAAU,EAAE,CAAC;QACpC,KAAK,KAAK,CAAC,CAAC,OAAO,IAAI,UAAU,EAAE,CAAC;QACpC,KAAK,YAAY,CAAC,CAAC,OAAO,IAAI,iBAAiB,EAAE,CAAC;QAClD,KAAK,QAAQ,CAAC,CAAC,OAAO,IAAI,aAAa,EAAE,CAAC;IAC5C,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { ProviderAdapter } from "../base.js";
|
|
2
|
+
import { EnvironmentRecord, ServiceName } from "../../types/index.js";
|
|
3
|
+
export declare class VercelAdapter implements ProviderAdapter {
|
|
4
|
+
private teamId;
|
|
5
|
+
init(): Promise<void>;
|
|
6
|
+
createEnvironment(name: string): Promise<EnvironmentRecord>;
|
|
7
|
+
enableServices(env: EnvironmentRecord, services: ServiceName[]): Promise<void>;
|
|
8
|
+
connect(env: EnvironmentRecord): Promise<Record<string, string>>;
|
|
9
|
+
destroyEnvironment(env: EnvironmentRecord): Promise<void>;
|
|
10
|
+
getStatus(env: EnvironmentRecord): Promise<EnvironmentRecord>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/providers/vercel/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAmB,MAAM,YAAY,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEtE,qBAAa,aAAc,YAAW,eAAe;IACnD,OAAO,CAAC,MAAM,CAAuB;IAE/B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA+BrB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAkB3D,cAAc,CAClB,GAAG,EAAE,iBAAiB,EACtB,QAAQ,EAAE,WAAW,EAAE,GACtB,OAAO,CAAC,IAAI,CAAC;IAOV,OAAO,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAkBhE,kBAAkB,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAMzD,SAAS,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC;CAGpE"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { VERCEL_SERVICES } from "../base.js";
|
|
2
|
+
export class VercelAdapter {
|
|
3
|
+
teamId = null;
|
|
4
|
+
async init() {
|
|
5
|
+
const token = process.env.VERCEL_TOKEN;
|
|
6
|
+
if (!token) {
|
|
7
|
+
throw new Error("VERCEL_TOKEN environment variable is required. " +
|
|
8
|
+
"Create a token at https://vercel.com/account/tokens");
|
|
9
|
+
}
|
|
10
|
+
// Verify token by fetching the authenticated user
|
|
11
|
+
const response = await fetch("https://api.vercel.com/v2/user", {
|
|
12
|
+
headers: {
|
|
13
|
+
Authorization: `Bearer ${token}`,
|
|
14
|
+
"Content-Type": "application/json",
|
|
15
|
+
},
|
|
16
|
+
});
|
|
17
|
+
if (!response.ok) {
|
|
18
|
+
const body = (await response.json());
|
|
19
|
+
const msg = body.error?.message || response.statusText;
|
|
20
|
+
throw new Error(`Vercel authentication failed: ${msg}`);
|
|
21
|
+
}
|
|
22
|
+
// Optionally capture team ID for team-scoped deployments
|
|
23
|
+
const teamId = process.env.VERCEL_TEAM_ID;
|
|
24
|
+
if (teamId) {
|
|
25
|
+
this.teamId = teamId;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
async createEnvironment(name) {
|
|
29
|
+
const now = new Date().toISOString();
|
|
30
|
+
const projectName = `sandman-${name}-${Date.now()}`;
|
|
31
|
+
return {
|
|
32
|
+
name,
|
|
33
|
+
provider: "vercel",
|
|
34
|
+
projectId: projectName,
|
|
35
|
+
status: "active",
|
|
36
|
+
services: [],
|
|
37
|
+
resources: {
|
|
38
|
+
projectName,
|
|
39
|
+
},
|
|
40
|
+
createdAt: now,
|
|
41
|
+
updatedAt: now,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
async enableServices(env, services) {
|
|
45
|
+
const enabledServices = services
|
|
46
|
+
.map((s) => VERCEL_SERVICES[s])
|
|
47
|
+
.filter(Boolean);
|
|
48
|
+
console.log(`Enabling Vercel services: ${enabledServices.join(", ")}`);
|
|
49
|
+
}
|
|
50
|
+
async connect(env) {
|
|
51
|
+
const result = {
|
|
52
|
+
provider: "vercel",
|
|
53
|
+
};
|
|
54
|
+
if (process.env.VERCEL_TOKEN) {
|
|
55
|
+
result.VERCEL_TOKEN = process.env.VERCEL_TOKEN;
|
|
56
|
+
}
|
|
57
|
+
if (env.projectId) {
|
|
58
|
+
result.VERCEL_PROJECT_NAME = env.projectId;
|
|
59
|
+
}
|
|
60
|
+
if (process.env.VERCEL_TEAM_ID) {
|
|
61
|
+
result.VERCEL_TEAM_ID = process.env.VERCEL_TEAM_ID;
|
|
62
|
+
}
|
|
63
|
+
return result;
|
|
64
|
+
}
|
|
65
|
+
async destroyEnvironment(env) {
|
|
66
|
+
console.log(`Cleaning up Vercel resources for environment: ${env.name}`);
|
|
67
|
+
// Future: delete Vercel project via API
|
|
68
|
+
// DELETE /v9/projects/{projectId}
|
|
69
|
+
}
|
|
70
|
+
async getStatus(env) {
|
|
71
|
+
return env;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../src/providers/vercel/adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.test.d.ts","sourceRoot":"","sources":["../../../src/providers/vercel/adapter.test.ts"],"names":[],"mappings":""}
|