@itssergio91/sandman 0.2.0 → 0.3.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/README.md +54 -272
- package/dist/cli/commands/cli-contract.test.d.ts +2 -0
- package/dist/cli/commands/cli-contract.test.d.ts.map +1 -0
- package/dist/cli/commands/cli-contract.test.js +217 -0
- package/dist/cli/commands/cli-contract.test.js.map +1 -0
- package/dist/cli/commands/connect.d.ts +1 -0
- package/dist/cli/commands/connect.d.ts.map +1 -1
- package/dist/cli/commands/connect.js +67 -42
- package/dist/cli/commands/connect.js.map +1 -1
- package/dist/cli/commands/create.d.ts +7 -2
- package/dist/cli/commands/create.d.ts.map +1 -1
- package/dist/cli/commands/create.js +158 -46
- package/dist/cli/commands/create.js.map +1 -1
- package/dist/cli/commands/destroy.d.ts.map +1 -1
- package/dist/cli/commands/destroy.js +27 -23
- package/dist/cli/commands/destroy.js.map +1 -1
- package/dist/cli/commands/doctor.d.ts +8 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -0
- package/dist/cli/commands/doctor.js +124 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/enable.d.ts +1 -2
- package/dist/cli/commands/enable.d.ts.map +1 -1
- package/dist/cli/commands/enable.js +75 -46
- package/dist/cli/commands/enable.js.map +1 -1
- package/dist/cli/commands/init.d.ts +2 -2
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +49 -17
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/list.d.ts.map +1 -1
- package/dist/cli/commands/list.js +25 -18
- package/dist/cli/commands/list.js.map +1 -1
- package/dist/cli/commands/providers.d.ts +6 -0
- package/dist/cli/commands/providers.d.ts.map +1 -0
- package/dist/cli/commands/providers.js +20 -0
- package/dist/cli/commands/providers.js.map +1 -0
- package/dist/cli/commands/status.d.ts.map +1 -1
- package/dist/cli/commands/status.js +88 -50
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/env-name.d.ts +7 -0
- package/dist/cli/env-name.d.ts.map +1 -0
- package/dist/cli/env-name.js +9 -0
- package/dist/cli/env-name.js.map +1 -0
- package/dist/cli/env-name.test.d.ts +2 -0
- package/dist/cli/env-name.test.d.ts.map +1 -0
- package/dist/cli/env-name.test.js +38 -0
- package/dist/cli/env-name.test.js.map +1 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +43 -11
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/output.d.ts +28 -0
- package/dist/cli/output.d.ts.map +1 -0
- package/dist/cli/output.js +60 -0
- package/dist/cli/output.js.map +1 -0
- package/dist/cli/output.test.d.ts +2 -0
- package/dist/cli/output.test.d.ts.map +1 -0
- package/dist/cli/output.test.js +78 -0
- package/dist/cli/output.test.js.map +1 -0
- package/dist/cli/reap.d.ts +11 -0
- package/dist/cli/reap.d.ts.map +1 -0
- package/dist/cli/reap.js +32 -0
- package/dist/cli/reap.js.map +1 -0
- package/dist/cli/secrets.d.ts +8 -0
- package/dist/cli/secrets.d.ts.map +1 -0
- package/dist/cli/secrets.js +30 -0
- package/dist/cli/secrets.js.map +1 -0
- package/dist/core/state-store.d.ts +15 -1
- package/dist/core/state-store.d.ts.map +1 -1
- package/dist/core/state-store.js +168 -33
- package/dist/core/state-store.js.map +1 -1
- package/dist/core/state-store.test.js +40 -0
- package/dist/core/state-store.test.js.map +1 -1
- package/dist/index.js +0 -0
- package/dist/providers/aws/adapter.d.ts +13 -2
- package/dist/providers/aws/adapter.d.ts.map +1 -1
- package/dist/providers/aws/adapter.js +402 -63
- package/dist/providers/aws/adapter.js.map +1 -1
- package/dist/providers/aws/adapter.test.js +300 -191
- package/dist/providers/aws/adapter.test.js.map +1 -1
- package/dist/providers/base.d.ts +1 -9
- package/dist/providers/base.d.ts.map +1 -1
- package/dist/providers/base.js.map +1 -1
- package/dist/providers/base.test.js +12 -2
- package/dist/providers/base.test.js.map +1 -1
- package/dist/providers/catalog.d.ts +15 -0
- package/dist/providers/catalog.d.ts.map +1 -0
- package/dist/providers/catalog.js +53 -0
- package/dist/providers/catalog.js.map +1 -0
- package/dist/providers/cloudflare/adapter.d.ts +5 -2
- package/dist/providers/cloudflare/adapter.d.ts.map +1 -1
- package/dist/providers/cloudflare/adapter.js +17 -5
- package/dist/providers/cloudflare/adapter.js.map +1 -1
- package/dist/providers/cloudflare/adapter.test.js +4 -4
- package/dist/providers/cloudflare/adapter.test.js.map +1 -1
- package/dist/providers/enable-result.d.ts +9 -0
- package/dist/providers/enable-result.d.ts.map +1 -0
- package/dist/providers/enable-result.js +26 -0
- package/dist/providers/enable-result.js.map +1 -0
- package/dist/providers/gcp/adapter.d.ts +9 -3
- package/dist/providers/gcp/adapter.d.ts.map +1 -1
- package/dist/providers/gcp/adapter.js +115 -20
- package/dist/providers/gcp/adapter.js.map +1 -1
- package/dist/providers/gcp/adapter.test.js +52 -0
- package/dist/providers/gcp/adapter.test.js.map +1 -1
- package/dist/providers/index.d.ts +5 -2
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +13 -0
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/vercel/adapter.d.ts +5 -2
- package/dist/providers/vercel/adapter.d.ts.map +1 -1
- package/dist/providers/vercel/adapter.js +17 -5
- package/dist/providers/vercel/adapter.js.map +1 -1
- package/dist/providers/vercel/adapter.test.js +4 -4
- package/dist/providers/vercel/adapter.test.js.map +1 -1
- package/dist/types/index.d.ts +40 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +4 -0
- package/dist/types/index.js.map +1 -1
- package/dist/utils/cost-estimator.d.ts +2 -0
- package/dist/utils/cost-estimator.d.ts.map +1 -1
- package/dist/utils/cost-estimator.js +23 -0
- package/dist/utils/cost-estimator.js.map +1 -1
- package/dist/utils/cost-estimator.test.js +16 -1
- package/dist/utils/cost-estimator.test.js.map +1 -1
- package/dist/utils/logger.d.ts +8 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +12 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/ttl.d.ts +13 -0
- package/dist/utils/ttl.d.ts.map +1 -0
- package/dist/utils/ttl.js +35 -0
- package/dist/utils/ttl.js.map +1 -0
- package/dist/utils/ttl.test.d.ts +2 -0
- package/dist/utils/ttl.test.d.ts.map +1 -0
- package/dist/utils/ttl.test.js +27 -0
- package/dist/utils/ttl.test.js.map +1 -0
- package/package.json +12 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/providers/base.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/providers/base.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEvE,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAQ/C,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAK/C,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAOtD,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAKlD,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/providers/base.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/providers/base.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,YAAY,GAA2B;IAClD,OAAO,EAAE,wBAAwB;IACjC,OAAO,EAAE,wBAAwB;IACjC,QAAQ,EAAE,oBAAoB;IAC9B,GAAG,EAAE,oBAAoB;IACzB,MAAM,EAAE,uBAAuB;IAC/B,SAAS,EAAE,0BAA0B;IACrC,gBAAgB,EAAE,iCAAiC;CACpD,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAA2B;IAClD,GAAG,EAAE,KAAK;IACV,EAAE,EAAE,IAAI;IACR,MAAM,EAAE,QAAQ;IAChB,GAAG,EAAE,KAAK;CACX,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAA2B;IACzD,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,OAAO;IACd,EAAE,EAAE,IAAI;IACR,EAAE,EAAE,IAAI;IACR,EAAE,EAAE,IAAI;IACR,iBAAiB,EAAE,iBAAiB;CACrC,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAA2B;IACrD,SAAS,EAAE,WAAW;IACtB,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;IACZ,QAAQ,EAAE,UAAU;CACrB,CAAC"}
|
|
@@ -12,7 +12,12 @@ describe('ProviderAdapter (interface contract)', () => {
|
|
|
12
12
|
createdAt: new Date().toISOString(),
|
|
13
13
|
updatedAt: new Date().toISOString(),
|
|
14
14
|
}),
|
|
15
|
-
enableServices: async () => {
|
|
15
|
+
enableServices: async () => ({
|
|
16
|
+
mode: "cloud",
|
|
17
|
+
recorded: [],
|
|
18
|
+
provisioned: [],
|
|
19
|
+
localOnly: [],
|
|
20
|
+
}),
|
|
16
21
|
connect: async () => ({}),
|
|
17
22
|
destroyEnvironment: async () => { },
|
|
18
23
|
getStatus: async (env) => env,
|
|
@@ -36,7 +41,12 @@ describe('ProviderAdapter (interface contract)', () => {
|
|
|
36
41
|
createdAt: new Date().toISOString(),
|
|
37
42
|
updatedAt: new Date().toISOString(),
|
|
38
43
|
}),
|
|
39
|
-
enableServices: async () => {
|
|
44
|
+
enableServices: async () => ({
|
|
45
|
+
mode: "cloud",
|
|
46
|
+
recorded: [],
|
|
47
|
+
provisioned: [],
|
|
48
|
+
localOnly: [],
|
|
49
|
+
}),
|
|
40
50
|
connect: async () => ({}),
|
|
41
51
|
destroyEnvironment: async () => { },
|
|
42
52
|
getStatus: async (env) => env,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.test.js","sourceRoot":"","sources":["../../src/providers/base.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAI9C,QAAQ,CAAC,sCAAsC,EAAE,GAAG,EAAE;IACpD,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,OAAO,GAAoB;YAC/B,IAAI,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC;YACpB,iBAAiB,EAAE,KAAK,EAAE,IAAY,EAAE,EAAE,CAAC,CAAC;gBAC1C,IAAI;gBACJ,QAAQ,EAAE,KAAK;gBACf,MAAM,EAAE,QAAQ;gBAChB,QAAQ,EAAE,EAAE;gBACZ,SAAS,EAAE,EAAE;gBACb,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACnC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAC;YACF,cAAc,EAAE,KAAK,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"base.test.js","sourceRoot":"","sources":["../../src/providers/base.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { ProviderType } from "../types/index.js";
|
|
2
|
+
export type ProviderMaturity = "supported" | "experimental";
|
|
3
|
+
export interface ProviderInfo {
|
|
4
|
+
id: ProviderType;
|
|
5
|
+
maturity: ProviderMaturity;
|
|
6
|
+
services: string[];
|
|
7
|
+
auth: string;
|
|
8
|
+
notes: string;
|
|
9
|
+
}
|
|
10
|
+
export declare const PROVIDER_CATALOG: ProviderInfo[];
|
|
11
|
+
export declare const SERVICES_BY_PROVIDER: Record<ProviderType, string[]>;
|
|
12
|
+
export declare function getProviderInfo(id: string): ProviderInfo | undefined;
|
|
13
|
+
export declare function parseProvider(value: string): ProviderType | undefined;
|
|
14
|
+
export declare function experimentalWarning(id: ProviderType): string | undefined;
|
|
15
|
+
//# sourceMappingURL=catalog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../src/providers/catalog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAQjD,MAAM,MAAM,gBAAgB,GAAG,WAAW,GAAG,cAAc,CAAC;AAE5D,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,YAAY,CAAC;IACjB,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,eAAO,MAAM,gBAAgB,EAAE,YAAY,EA6B1C,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,YAAY,EAAE,MAAM,EAAE,CAK/D,CAAC;AAEF,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAEpE;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAGrE;AAED,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,YAAY,GAAG,MAAM,GAAG,SAAS,CAMxE"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { ProviderType } from "../types/index.js";
|
|
2
|
+
import { AWS_SERVICES, CLOUDFLARE_SERVICES, GCP_SERVICES, VERCEL_SERVICES, } from "./base.js";
|
|
3
|
+
export const PROVIDER_CATALOG = [
|
|
4
|
+
{
|
|
5
|
+
id: "aws",
|
|
6
|
+
maturity: "supported",
|
|
7
|
+
services: Object.keys(AWS_SERVICES),
|
|
8
|
+
auth: "aws configure, or AWS_ACCESS_KEY_ID + AWS_SECRET_ACCESS_KEY",
|
|
9
|
+
notes: "Provisions sandbox resources (S3, VPC, IAM, optional EC2) in an existing AWS account.",
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
id: "gcp",
|
|
13
|
+
maturity: "supported",
|
|
14
|
+
services: Object.keys(GCP_SERVICES),
|
|
15
|
+
auth: "gcloud auth application-default login, or GOOGLE_APPLICATION_CREDENTIALS",
|
|
16
|
+
notes: "Creates a GCP project and links billing when a billing account can be resolved. Requires a billing account for APIs to work.",
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
id: "cloudflare",
|
|
20
|
+
maturity: "experimental",
|
|
21
|
+
services: Object.keys(CLOUDFLARE_SERVICES),
|
|
22
|
+
auth: "CLOUDFLARE_API_TOKEN (+ optional CLOUDFLARE_ACCOUNT_ID)",
|
|
23
|
+
notes: "Authenticates and registers a local environment. Cloud resource provisioning is not implemented yet.",
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
id: "vercel",
|
|
27
|
+
maturity: "experimental",
|
|
28
|
+
services: Object.keys(VERCEL_SERVICES),
|
|
29
|
+
auth: "VERCEL_TOKEN (+ optional VERCEL_TEAM_ID)",
|
|
30
|
+
notes: "Authenticates and registers a local environment. Cloud resource provisioning is not implemented yet.",
|
|
31
|
+
},
|
|
32
|
+
];
|
|
33
|
+
export const SERVICES_BY_PROVIDER = {
|
|
34
|
+
aws: Object.keys(AWS_SERVICES),
|
|
35
|
+
gcp: Object.keys(GCP_SERVICES),
|
|
36
|
+
cloudflare: Object.keys(CLOUDFLARE_SERVICES),
|
|
37
|
+
vercel: Object.keys(VERCEL_SERVICES),
|
|
38
|
+
};
|
|
39
|
+
export function getProviderInfo(id) {
|
|
40
|
+
return PROVIDER_CATALOG.find((p) => p.id === id);
|
|
41
|
+
}
|
|
42
|
+
export function parseProvider(value) {
|
|
43
|
+
const parsed = ProviderType.safeParse(value);
|
|
44
|
+
return parsed.success ? parsed.data : undefined;
|
|
45
|
+
}
|
|
46
|
+
export function experimentalWarning(id) {
|
|
47
|
+
const info = getProviderInfo(id);
|
|
48
|
+
if (info?.maturity !== "experimental") {
|
|
49
|
+
return undefined;
|
|
50
|
+
}
|
|
51
|
+
return `${id} is experimental: ${info.notes}`;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=catalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/providers/catalog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EACL,YAAY,EACZ,mBAAmB,EACnB,YAAY,EACZ,eAAe,GAChB,MAAM,WAAW,CAAC;AAYnB,MAAM,CAAC,MAAM,gBAAgB,GAAmB;IAC9C;QACE,EAAE,EAAE,KAAK;QACT,QAAQ,EAAE,WAAW;QACrB,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC;QACnC,IAAI,EAAE,6DAA6D;QACnE,KAAK,EAAE,uFAAuF;KAC/F;IACD;QACE,EAAE,EAAE,KAAK;QACT,QAAQ,EAAE,WAAW;QACrB,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC;QACnC,IAAI,EAAE,0EAA0E;QAChF,KAAK,EAAE,8HAA8H;KACtI;IACD;QACE,EAAE,EAAE,YAAY;QAChB,QAAQ,EAAE,cAAc;QACxB,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC;QAC1C,IAAI,EAAE,yDAAyD;QAC/D,KAAK,EAAE,sGAAsG;KAC9G;IACD;QACE,EAAE,EAAE,QAAQ;QACZ,QAAQ,EAAE,cAAc;QACxB,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC;QACtC,IAAI,EAAE,0CAA0C;QAChD,KAAK,EAAE,sGAAsG;KAC9G;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAmC;IAClE,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC;IAC9B,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC;IAC9B,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC;IAC5C,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC;CACrC,CAAC;AAEF,MAAM,UAAU,eAAe,CAAC,EAAU;IACxC,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC7C,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,EAAgB;IAClD,MAAM,IAAI,GAAG,eAAe,CAAC,EAAE,CAAC,CAAC;IACjC,IAAI,IAAI,EAAE,QAAQ,KAAK,cAAc,EAAE,CAAC;QACtC,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,GAAG,EAAE,qBAAqB,IAAI,CAAC,KAAK,EAAE,CAAC;AAChD,CAAC"}
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
import { ProviderAdapter } from "../base.js";
|
|
2
|
-
import { EnvironmentRecord, ServiceName } from "../../types/index.js";
|
|
2
|
+
import { EnableResult, EnvironmentRecord, ServiceName } from "../../types/index.js";
|
|
3
3
|
export declare class CloudflareAdapter implements ProviderAdapter {
|
|
4
4
|
private accountId;
|
|
5
|
+
private region;
|
|
6
|
+
setRegion(region: string): void;
|
|
5
7
|
init(): Promise<void>;
|
|
6
8
|
createEnvironment(name: string): Promise<EnvironmentRecord>;
|
|
7
|
-
enableServices(env: EnvironmentRecord, services: ServiceName[]): Promise<
|
|
9
|
+
enableServices(env: EnvironmentRecord, services: ServiceName[]): Promise<EnableResult>;
|
|
10
|
+
whoami(): Promise<Record<string, string | null | undefined>>;
|
|
8
11
|
connect(env: EnvironmentRecord): Promise<Record<string, string>>;
|
|
9
12
|
destroyEnvironment(env: EnvironmentRecord): Promise<void>;
|
|
10
13
|
getStatus(env: EnvironmentRecord): Promise<EnvironmentRecord>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/providers/cloudflare/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAuB,MAAM,YAAY,CAAC;AAClE,OAAO,
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/providers/cloudflare/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAuB,MAAM,YAAY,CAAC;AAClE,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,WAAW,EACZ,MAAM,sBAAsB,CAAC;AAI9B,qBAAa,iBAAkB,YAAW,eAAe;IACvD,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,MAAM,CAAqB;IAEnC,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAIzB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA+CrB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAmB3D,cAAc,CAClB,GAAG,EAAE,iBAAiB,EACtB,QAAQ,EAAE,WAAW,EAAE,GACtB,OAAO,CAAC,YAAY,CAAC;IAYlB,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;IAQ5D,OAAO,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAehE,kBAAkB,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAOzD,SAAS,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC;CAGpE"}
|
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
import { CLOUDFLARE_SERVICES } from "../base.js";
|
|
2
|
+
import { localOnlyEnable } from "../enable-result.js";
|
|
3
|
+
import { logger } from "../../utils/logger.js";
|
|
2
4
|
export class CloudflareAdapter {
|
|
3
5
|
accountId = null;
|
|
6
|
+
region;
|
|
7
|
+
setRegion(region) {
|
|
8
|
+
this.region = region;
|
|
9
|
+
}
|
|
4
10
|
async init() {
|
|
5
11
|
const apiToken = process.env.CLOUDFLARE_API_TOKEN;
|
|
6
12
|
const accountId = process.env.CLOUDFLARE_ACCOUNT_ID;
|
|
@@ -44,6 +50,7 @@ export class CloudflareAdapter {
|
|
|
44
50
|
name,
|
|
45
51
|
provider: "cloudflare",
|
|
46
52
|
accountId: process.env.CLOUDFLARE_ACCOUNT_ID || undefined,
|
|
53
|
+
region: this.region,
|
|
47
54
|
status: "active",
|
|
48
55
|
services: [],
|
|
49
56
|
resources: {
|
|
@@ -57,7 +64,15 @@ export class CloudflareAdapter {
|
|
|
57
64
|
const enabledServices = services
|
|
58
65
|
.map((s) => CLOUDFLARE_SERVICES[s])
|
|
59
66
|
.filter(Boolean);
|
|
60
|
-
|
|
67
|
+
logger.info(`Enabling Cloudflare services: ${enabledServices.join(", ")}`);
|
|
68
|
+
return localOnlyEnable("cloudflare", services.filter((s) => CLOUDFLARE_SERVICES[s]), "cloudflare is experimental: enable records services locally and does not provision cloud resources.");
|
|
69
|
+
}
|
|
70
|
+
async whoami() {
|
|
71
|
+
return {
|
|
72
|
+
provider: "cloudflare",
|
|
73
|
+
accountId: this.accountId,
|
|
74
|
+
token: process.env.CLOUDFLARE_API_TOKEN ? "set" : "missing",
|
|
75
|
+
};
|
|
61
76
|
}
|
|
62
77
|
async connect(env) {
|
|
63
78
|
const result = {
|
|
@@ -66,16 +81,13 @@ export class CloudflareAdapter {
|
|
|
66
81
|
if (env.accountId) {
|
|
67
82
|
result.CLOUDFLARE_ACCOUNT_ID = env.accountId;
|
|
68
83
|
}
|
|
69
|
-
if (process.env.CLOUDFLARE_API_TOKEN) {
|
|
70
|
-
result.CLOUDFLARE_API_TOKEN = process.env.CLOUDFLARE_API_TOKEN;
|
|
71
|
-
}
|
|
72
84
|
if (env.resources.namespaceId) {
|
|
73
85
|
result.CLOUDFLARE_NAMESPACE_ID = env.resources.namespaceId;
|
|
74
86
|
}
|
|
75
87
|
return result;
|
|
76
88
|
}
|
|
77
89
|
async destroyEnvironment(env) {
|
|
78
|
-
|
|
90
|
+
logger.info(`Cleaning up Cloudflare resources for environment: ${env.name}`);
|
|
79
91
|
// Future: delete KV namespaces, R2 buckets, D1 databases via API
|
|
80
92
|
}
|
|
81
93
|
async getStatus(env) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../src/providers/cloudflare/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,mBAAmB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../src/providers/cloudflare/adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -76,7 +76,7 @@ describe("CloudflareAdapter", () => {
|
|
|
76
76
|
createdAt: new Date().toISOString(),
|
|
77
77
|
updatedAt: new Date().toISOString(),
|
|
78
78
|
};
|
|
79
|
-
const consoleSpy = vi.spyOn(console, "
|
|
79
|
+
const consoleSpy = vi.spyOn(console, "error").mockImplementation(() => { });
|
|
80
80
|
await adapter.enableServices(env, ["workers", "kv", "d1"]);
|
|
81
81
|
expect(consoleSpy).toHaveBeenCalledWith("Enabling Cloudflare services: workers, kv, d1");
|
|
82
82
|
consoleSpy.mockRestore();
|
|
@@ -91,7 +91,7 @@ describe("CloudflareAdapter", () => {
|
|
|
91
91
|
createdAt: new Date().toISOString(),
|
|
92
92
|
updatedAt: new Date().toISOString(),
|
|
93
93
|
};
|
|
94
|
-
const consoleSpy = vi.spyOn(console, "
|
|
94
|
+
const consoleSpy = vi.spyOn(console, "error").mockImplementation(() => { });
|
|
95
95
|
await adapter.enableServices(env, ["invalid-service"]);
|
|
96
96
|
expect(consoleSpy).toHaveBeenCalledWith("Enabling Cloudflare services: ");
|
|
97
97
|
consoleSpy.mockRestore();
|
|
@@ -114,7 +114,7 @@ describe("CloudflareAdapter", () => {
|
|
|
114
114
|
const creds = await adapter.connect(env);
|
|
115
115
|
expect(creds.provider).toBe("cloudflare");
|
|
116
116
|
expect(creds.CLOUDFLARE_ACCOUNT_ID).toBe("my-account");
|
|
117
|
-
expect(creds.CLOUDFLARE_API_TOKEN).
|
|
117
|
+
expect(creds.CLOUDFLARE_API_TOKEN).toBeUndefined();
|
|
118
118
|
expect(creds.CLOUDFLARE_NAMESPACE_ID).toBe("ns-123");
|
|
119
119
|
});
|
|
120
120
|
it("should work without optional fields", async () => {
|
|
@@ -143,7 +143,7 @@ describe("CloudflareAdapter", () => {
|
|
|
143
143
|
createdAt: new Date().toISOString(),
|
|
144
144
|
updatedAt: new Date().toISOString(),
|
|
145
145
|
};
|
|
146
|
-
const consoleSpy = vi.spyOn(console, "
|
|
146
|
+
const consoleSpy = vi.spyOn(console, "error").mockImplementation(() => { });
|
|
147
147
|
await adapter.destroyEnvironment(env);
|
|
148
148
|
expect(consoleSpy).toHaveBeenCalledWith("Cleaning up Cloudflare resources for environment: test");
|
|
149
149
|
consoleSpy.mockRestore();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.test.js","sourceRoot":"","sources":["../../../src/providers/cloudflare/adapter.test.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"adapter.test.js","sourceRoot":"","sources":["../../../src/providers/cloudflare/adapter.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { EnableResult, ServiceName } from "../types/index.js";
|
|
2
|
+
export declare function enableResult(opts: {
|
|
3
|
+
recorded: ServiceName[];
|
|
4
|
+
provisioned: ServiceName[];
|
|
5
|
+
localOnly: ServiceName[];
|
|
6
|
+
warnings?: string[];
|
|
7
|
+
}): EnableResult;
|
|
8
|
+
export declare function localOnlyEnable(provider: string, services: ServiceName[], reason: string): EnableResult;
|
|
9
|
+
//# sourceMappingURL=enable-result.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enable-result.d.ts","sourceRoot":"","sources":["../../src/providers/enable-result.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAE9D,wBAAgB,YAAY,CAAC,IAAI,EAAE;IACjC,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,WAAW,EAAE,WAAW,EAAE,CAAC;IAC3B,SAAS,EAAE,WAAW,EAAE,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB,GAAG,YAAY,CAef;AAED,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,WAAW,EAAE,EACvB,MAAM,EAAE,MAAM,GACb,YAAY,CAOd"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export function enableResult(opts) {
|
|
2
|
+
const { recorded, provisioned, localOnly, warnings } = opts;
|
|
3
|
+
let mode = "cloud";
|
|
4
|
+
if (localOnly.length > 0 && provisioned.length > 0) {
|
|
5
|
+
mode = "mixed";
|
|
6
|
+
}
|
|
7
|
+
else if (localOnly.length > 0) {
|
|
8
|
+
mode = "local-only";
|
|
9
|
+
}
|
|
10
|
+
return {
|
|
11
|
+
mode,
|
|
12
|
+
recorded,
|
|
13
|
+
provisioned,
|
|
14
|
+
localOnly,
|
|
15
|
+
...(warnings?.length ? { warnings } : {}),
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
export function localOnlyEnable(provider, services, reason) {
|
|
19
|
+
return enableResult({
|
|
20
|
+
recorded: services,
|
|
21
|
+
provisioned: [],
|
|
22
|
+
localOnly: services,
|
|
23
|
+
warnings: [reason],
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=enable-result.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enable-result.js","sourceRoot":"","sources":["../../src/providers/enable-result.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,YAAY,CAAC,IAK5B;IACC,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;IAC5D,IAAI,IAAI,GAAyB,OAAO,CAAC;IACzC,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnD,IAAI,GAAG,OAAO,CAAC;IACjB,CAAC;SAAM,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChC,IAAI,GAAG,YAAY,CAAC;IACtB,CAAC;IACD,OAAO;QACL,IAAI;QACJ,QAAQ;QACR,WAAW;QACX,SAAS;QACT,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC1C,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,QAAgB,EAChB,QAAuB,EACvB,MAAc;IAEd,OAAO,YAAY,CAAC;QAClB,QAAQ,EAAE,QAAQ;QAClB,WAAW,EAAE,EAAE;QACf,SAAS,EAAE,QAAQ;QACnB,QAAQ,EAAE,CAAC,MAAM,CAAC;KACnB,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1,17 +1,23 @@
|
|
|
1
1
|
import { ProviderAdapter } from "../base.js";
|
|
2
|
-
import { EnvironmentRecord, ServiceName } from "../../types/index.js";
|
|
2
|
+
import { EnableResult, EnvironmentRecord, ServiceName } from "../../types/index.js";
|
|
3
3
|
export declare class GcpAdapter implements ProviderAdapter {
|
|
4
4
|
private projectId;
|
|
5
5
|
private projectNumber;
|
|
6
6
|
private billingAccountId;
|
|
7
|
+
private region;
|
|
8
|
+
setRegion(region: string): void;
|
|
9
|
+
setBillingAccount(accountId: string): void;
|
|
10
|
+
getBillingAccount(): string | null;
|
|
7
11
|
init(): Promise<void>;
|
|
12
|
+
discoverBillingAccount(): Promise<string | null>;
|
|
13
|
+
whoami(): Promise<Record<string, string | null | undefined>>;
|
|
8
14
|
createEnvironment(name: string): Promise<EnvironmentRecord>;
|
|
15
|
+
private lookupBillingAccount;
|
|
9
16
|
private linkBillingAccount;
|
|
10
|
-
enableServices(env: EnvironmentRecord, services: ServiceName[]): Promise<
|
|
17
|
+
enableServices(env: EnvironmentRecord, services: ServiceName[]): Promise<EnableResult>;
|
|
11
18
|
connect(env: EnvironmentRecord): Promise<Record<string, string>>;
|
|
12
19
|
destroyEnvironment(env: EnvironmentRecord): Promise<void>;
|
|
13
20
|
getStatus(env: EnvironmentRecord): Promise<EnvironmentRecord>;
|
|
14
|
-
setBillingAccount(accountId: string): void;
|
|
15
21
|
getProjectId(): string | null;
|
|
16
22
|
getProjectNumber(): string | null;
|
|
17
23
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/providers/gcp/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAgB,MAAM,YAAY,CAAC;AAC3D,OAAO,
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/providers/gcp/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAgB,MAAM,YAAY,CAAC;AAC3D,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,WAAW,EACZ,MAAM,sBAAsB,CAAC;AAQ9B,qBAAa,UAAW,YAAW,eAAe;IAChD,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,gBAAgB,CAAuB;IAC/C,OAAO,CAAC,MAAM,CAAqB;IAEnC,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAI/B,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAI1C,iBAAiB,IAAI,MAAM,GAAG,IAAI;IAI5B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAiDrB,sBAAsB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAgBhD,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;IAS5D,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;YAuEnD,oBAAoB;YAuCpB,kBAAkB;IAsB1B,cAAc,CAClB,GAAG,EAAE,iBAAiB,EACtB,QAAQ,EAAE,WAAW,EAAE,GACtB,OAAO,CAAC,YAAY,CAAC;IA2ClB,OAAO,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAYhE,kBAAkB,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IA+BzD,SAAS,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAsDnE,YAAY,IAAI,MAAM,GAAG,IAAI;IAI7B,gBAAgB,IAAI,MAAM,GAAG,IAAI;CAGlC"}
|
|
@@ -1,8 +1,23 @@
|
|
|
1
1
|
import { GCP_SERVICES } from "../base.js";
|
|
2
|
+
import { enableResult } from "../enable-result.js";
|
|
3
|
+
import { logger } from "../../utils/logger.js";
|
|
4
|
+
function normalizeBillingAccountId(raw) {
|
|
5
|
+
return raw.replace(/^billingAccounts\//, "");
|
|
6
|
+
}
|
|
2
7
|
export class GcpAdapter {
|
|
3
8
|
projectId = null;
|
|
4
9
|
projectNumber = null;
|
|
5
10
|
billingAccountId = null;
|
|
11
|
+
region;
|
|
12
|
+
setRegion(region) {
|
|
13
|
+
this.region = region;
|
|
14
|
+
}
|
|
15
|
+
setBillingAccount(accountId) {
|
|
16
|
+
this.billingAccountId = normalizeBillingAccountId(accountId);
|
|
17
|
+
}
|
|
18
|
+
getBillingAccount() {
|
|
19
|
+
return this.billingAccountId;
|
|
20
|
+
}
|
|
6
21
|
async init() {
|
|
7
22
|
try {
|
|
8
23
|
const { ProjectsClient } = await import("@google-cloud/resource-manager");
|
|
@@ -24,6 +39,7 @@ export class GcpAdapter {
|
|
|
24
39
|
}
|
|
25
40
|
else if (projects.length > 0 && projects[0].projectId) {
|
|
26
41
|
this.projectId = projects[0].projectId;
|
|
42
|
+
logger.warn(`No GCP_PROJECT / GOOGLE_CLOUD_PROJECT set; using first accessible project "${this.projectId}". Set GCP_PROJECT to avoid targeting the wrong project.`);
|
|
27
43
|
}
|
|
28
44
|
else {
|
|
29
45
|
// Auth works but no projects - user needs to create one or set GCP_PROJECT
|
|
@@ -42,52 +58,120 @@ export class GcpAdapter {
|
|
|
42
58
|
throw error;
|
|
43
59
|
}
|
|
44
60
|
}
|
|
61
|
+
async discoverBillingAccount() {
|
|
62
|
+
if (this.billingAccountId) {
|
|
63
|
+
return this.billingAccountId;
|
|
64
|
+
}
|
|
65
|
+
const fromEnv = process.env.GCP_BILLING_ACCOUNT;
|
|
66
|
+
if (fromEnv) {
|
|
67
|
+
this.billingAccountId = normalizeBillingAccountId(fromEnv);
|
|
68
|
+
return this.billingAccountId;
|
|
69
|
+
}
|
|
70
|
+
const discovered = await this.lookupBillingAccount(this.projectId);
|
|
71
|
+
if (discovered) {
|
|
72
|
+
this.billingAccountId = discovered;
|
|
73
|
+
}
|
|
74
|
+
return this.billingAccountId;
|
|
75
|
+
}
|
|
76
|
+
async whoami() {
|
|
77
|
+
return {
|
|
78
|
+
provider: "gcp",
|
|
79
|
+
projectId: this.projectId,
|
|
80
|
+
region: this.region,
|
|
81
|
+
billingAccount: this.billingAccountId,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
45
84
|
async createEnvironment(name) {
|
|
46
85
|
if (!this.projectId) {
|
|
47
86
|
throw new Error("No GCP project configured. Set GCP_PROJECT environment variable or run 'gcloud config set project PROJECT_ID'");
|
|
48
87
|
}
|
|
49
|
-
|
|
88
|
+
const parentProjectId = this.projectId;
|
|
50
89
|
const timestamp = Date.now();
|
|
51
90
|
const sandmanProjectId = `sandman-${name}-${timestamp}`;
|
|
52
91
|
try {
|
|
53
92
|
const { ProjectsClient } = await import("@google-cloud/resource-manager");
|
|
54
93
|
const resourceManagerClient = new ProjectsClient();
|
|
55
|
-
// Create the project
|
|
56
94
|
const [operation] = await resourceManagerClient.createProject({
|
|
57
95
|
project: {
|
|
58
96
|
projectId: sandmanProjectId,
|
|
59
97
|
name: `Sandman Environment: ${name}`,
|
|
60
98
|
},
|
|
61
99
|
});
|
|
62
|
-
|
|
63
|
-
const [projectOperation] = await operation.promise();
|
|
64
|
-
// Get the project details to get the project number
|
|
100
|
+
await operation.promise();
|
|
65
101
|
const [project] = await resourceManagerClient.getProject({
|
|
66
102
|
name: `projects/${sandmanProjectId}`,
|
|
67
103
|
});
|
|
68
|
-
// Store the project ID and number
|
|
69
104
|
this.projectId = sandmanProjectId;
|
|
70
105
|
this.projectNumber = project.projectNumber?.toString() || null;
|
|
71
|
-
|
|
106
|
+
const billingId = this.billingAccountId ||
|
|
107
|
+
(await this.lookupBillingAccount(parentProjectId));
|
|
108
|
+
if (billingId) {
|
|
109
|
+
this.billingAccountId = billingId;
|
|
110
|
+
}
|
|
111
|
+
let billingError;
|
|
72
112
|
if (this.billingAccountId) {
|
|
73
|
-
|
|
113
|
+
try {
|
|
114
|
+
await this.linkBillingAccount(sandmanProjectId);
|
|
115
|
+
}
|
|
116
|
+
catch (error) {
|
|
117
|
+
billingError = error.message ?? String(error);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
billingError =
|
|
122
|
+
"No billing account linked. Pass --billing-account, set GCP_BILLING_ACCOUNT, or enable billing on the parent project. GCP APIs cannot be enabled until billing is linked.";
|
|
74
123
|
}
|
|
75
124
|
const now = new Date().toISOString();
|
|
76
125
|
return {
|
|
77
126
|
name,
|
|
78
127
|
provider: "gcp",
|
|
79
128
|
projectId: sandmanProjectId,
|
|
80
|
-
|
|
129
|
+
region: this.region,
|
|
130
|
+
billingAccount: this.billingAccountId || undefined,
|
|
131
|
+
status: billingError ? "failed" : "active",
|
|
81
132
|
services: [],
|
|
82
133
|
resources: {},
|
|
83
134
|
createdAt: now,
|
|
84
135
|
updatedAt: now,
|
|
136
|
+
error: billingError,
|
|
85
137
|
};
|
|
86
138
|
}
|
|
87
139
|
catch (error) {
|
|
88
140
|
throw new Error(`Failed to create GCP project: ${error.message ?? "Unknown error"}`);
|
|
89
141
|
}
|
|
90
142
|
}
|
|
143
|
+
async lookupBillingAccount(parentProjectId) {
|
|
144
|
+
try {
|
|
145
|
+
const { CloudBillingClient } = await import("@google-cloud/billing");
|
|
146
|
+
const billingClient = new CloudBillingClient();
|
|
147
|
+
if (parentProjectId) {
|
|
148
|
+
try {
|
|
149
|
+
const [info] = await billingClient.getProjectBillingInfo({
|
|
150
|
+
name: `projects/${parentProjectId}`,
|
|
151
|
+
});
|
|
152
|
+
const name = info?.billingAccountName;
|
|
153
|
+
if (info?.billingEnabled && name) {
|
|
154
|
+
return normalizeBillingAccountId(name);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
// Parent may not have billing; fall through to account list.
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
const [accounts] = await billingClient.listBillingAccounts({});
|
|
162
|
+
const open = (accounts ?? []).filter((account) => account.open);
|
|
163
|
+
if (open.length === 1 && open[0].name) {
|
|
164
|
+
return normalizeBillingAccountId(open[0].name);
|
|
165
|
+
}
|
|
166
|
+
if (open.length > 1) {
|
|
167
|
+
logger.warn(`Found ${open.length} open GCP billing accounts. Pass --billing-account to choose one.`);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
catch (error) {
|
|
171
|
+
logger.warn(`Could not discover a GCP billing account: ${error.message ?? String(error)}`);
|
|
172
|
+
}
|
|
173
|
+
return null;
|
|
174
|
+
}
|
|
91
175
|
async linkBillingAccount(projectId) {
|
|
92
176
|
if (!this.billingAccountId) {
|
|
93
177
|
return;
|
|
@@ -95,7 +179,6 @@ export class GcpAdapter {
|
|
|
95
179
|
try {
|
|
96
180
|
const { CloudBillingClient } = await import("@google-cloud/billing");
|
|
97
181
|
const billingClient = new CloudBillingClient();
|
|
98
|
-
// Update project billing info to link the billing account
|
|
99
182
|
await billingClient.updateProjectBillingInfo({
|
|
100
183
|
name: `projects/${projectId}`,
|
|
101
184
|
projectBillingInfo: {
|
|
@@ -114,18 +197,27 @@ export class GcpAdapter {
|
|
|
114
197
|
try {
|
|
115
198
|
const { ServiceUsageClient } = await import("@google-cloud/service-usage");
|
|
116
199
|
const serviceUsageClient = new ServiceUsageClient();
|
|
117
|
-
const
|
|
118
|
-
if (
|
|
119
|
-
return
|
|
200
|
+
const recorded = services.filter((s) => GCP_SERVICES[s]);
|
|
201
|
+
if (recorded.length === 0) {
|
|
202
|
+
return enableResult({
|
|
203
|
+
recorded: [],
|
|
204
|
+
provisioned: [],
|
|
205
|
+
localOnly: [],
|
|
206
|
+
});
|
|
120
207
|
}
|
|
121
|
-
|
|
122
|
-
|
|
208
|
+
const serviceNames = recorded.map((s) => GCP_SERVICES[s]);
|
|
209
|
+
logger.info(`Enabling GCP services: ${serviceNames.join(", ")}`);
|
|
123
210
|
for (const serviceName of serviceNames) {
|
|
124
211
|
const request = {
|
|
125
212
|
name: `projects/${env.projectId}/services/${serviceName}`,
|
|
126
213
|
};
|
|
127
214
|
await serviceUsageClient.enableService(request);
|
|
128
215
|
}
|
|
216
|
+
return enableResult({
|
|
217
|
+
recorded,
|
|
218
|
+
provisioned: recorded,
|
|
219
|
+
localOnly: [],
|
|
220
|
+
});
|
|
129
221
|
}
|
|
130
222
|
catch (error) {
|
|
131
223
|
throw new Error(`Failed to enable GCP services: ${error.message ?? "Unknown error"}`);
|
|
@@ -144,6 +236,9 @@ export class GcpAdapter {
|
|
|
144
236
|
if (!env.projectId) {
|
|
145
237
|
throw new Error("Project ID is required to destroy environment");
|
|
146
238
|
}
|
|
239
|
+
if (!env.projectId.startsWith("sandman-")) {
|
|
240
|
+
throw new Error(`Refusing to delete GCP project "${env.projectId}" because it was not created by Sandman (expected sandman- prefix).`);
|
|
241
|
+
}
|
|
147
242
|
try {
|
|
148
243
|
const { ProjectsClient } = await import("@google-cloud/resource-manager");
|
|
149
244
|
const resourceManagerClient = new ProjectsClient();
|
|
@@ -153,7 +248,7 @@ export class GcpAdapter {
|
|
|
153
248
|
});
|
|
154
249
|
// Wait for the operation to complete
|
|
155
250
|
await operation.promise();
|
|
156
|
-
|
|
251
|
+
logger.info(`Deleted GCP project: ${env.projectId}`);
|
|
157
252
|
}
|
|
158
253
|
catch (error) {
|
|
159
254
|
throw new Error(`Failed to delete GCP project: ${error.message ?? "Unknown error"}`);
|
|
@@ -179,7 +274,10 @@ export class GcpAdapter {
|
|
|
179
274
|
const lifecycleState = project.lifecycleState;
|
|
180
275
|
switch (lifecycleState) {
|
|
181
276
|
case "ACTIVE":
|
|
182
|
-
status =
|
|
277
|
+
status =
|
|
278
|
+
!env.billingAccount && /billing/i.test(env.error || "")
|
|
279
|
+
? "failed"
|
|
280
|
+
: "active";
|
|
183
281
|
break;
|
|
184
282
|
case "DELETE_REQUESTED":
|
|
185
283
|
case "DELETE_IN_PROGRESS":
|
|
@@ -206,9 +304,6 @@ export class GcpAdapter {
|
|
|
206
304
|
};
|
|
207
305
|
}
|
|
208
306
|
}
|
|
209
|
-
setBillingAccount(accountId) {
|
|
210
|
-
this.billingAccountId = accountId;
|
|
211
|
-
}
|
|
212
307
|
getProjectId() {
|
|
213
308
|
return this.projectId;
|
|
214
309
|
}
|