@intentius/chant-lexicon-gcp 0.124.33 → 0.124.35
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/api/read-client.d.ts +7 -3
- package/dist/api/read-client.d.ts.map +1 -1
- package/dist/api/read-client.js +36 -15
- package/dist/composites/cloud-run-service.d.ts +2 -0
- package/dist/composites/cloud-run-service.d.ts.map +1 -1
- package/dist/composites/cloud-run-service.js +4 -1
- package/dist/deep-observe.d.ts.map +1 -1
- package/dist/deep-observe.js +125 -1
- package/dist/describe-resources.d.ts +4 -3
- package/dist/describe-resources.d.ts.map +1 -1
- package/dist/describe-resources.js +8 -7
- package/dist/health.js +1 -1
- package/dist/integrity.json +2 -2
- package/dist/manifest.json +1 -1
- package/dist/op/activities/gcp-apply.d.ts +62 -18
- package/dist/op/activities/gcp-apply.d.ts.map +1 -1
- package/dist/op/activities/gcp-apply.js +118 -18
- package/dist/op/activities/gcp-compute.d.ts +56 -0
- package/dist/op/activities/gcp-compute.d.ts.map +1 -0
- package/dist/op/activities/gcp-compute.js +313 -0
- package/dist/op/activities/gcp-iam.d.ts +82 -0
- package/dist/op/activities/gcp-iam.d.ts.map +1 -0
- package/dist/op/activities/gcp-iam.js +215 -0
- package/dist/op/activities/index.d.ts +1 -1
- package/dist/op/activities/index.d.ts.map +1 -1
- package/dist/op/activities/index.js +1 -1
- package/dist/serializer.d.ts.map +1 -1
- package/dist/serializer.js +36 -1
- package/package.json +2 -2
- package/src/api/read-client.ts +35 -16
- package/src/composites/cloud-run-service.ts +6 -0
- package/src/composites/composites.test.ts +7 -0
- package/src/deep-observe.test.ts +16 -1
- package/src/deep-observe.ts +125 -1
- package/src/describe-resources.test.ts +1 -1
- package/src/describe-resources.ts +8 -6
- package/src/health.ts +1 -1
- package/src/op/activities/gcp-apply.test.ts +53 -0
- package/src/op/activities/gcp-apply.ts +157 -24
- package/src/op/activities/gcp-compute.test.ts +212 -0
- package/src/op/activities/gcp-compute.ts +319 -0
- package/src/op/activities/gcp-iam.test.ts +152 -0
- package/src/op/activities/gcp-iam.ts +284 -0
- package/src/op/activities/index.ts +1 -0
- package/src/project-resolution.test.ts +41 -0
- package/src/serializer-pseudo.test.ts +38 -0
- package/src/serializer.ts +43 -3
|
@@ -22,7 +22,11 @@
|
|
|
22
22
|
*
|
|
23
23
|
* Coverage is exactly the applier's dispatch table (`MAPPERS`) — StorageBucket,
|
|
24
24
|
* PubSubTopic, PubSubSubscription, SecretManagerSecret, IAMServiceAccount,
|
|
25
|
-
* RunService
|
|
25
|
+
* RunService, IAMPolicyMember and the Cloud Run load balancer kinds
|
|
26
|
+
* (ComputeAddress, ComputeRegionNetworkEndpointGroup, ComputeBackendService,
|
|
27
|
+
* ComputeURLMap, ComputeTargetHTTPProxy, ComputeForwardingRule; #4233). An
|
|
28
|
+
* IAMPolicyMember is read through its target's policy and is present when the
|
|
29
|
+
* policy grants its member the role. The kubectl path could fetch any CNRM kind the cluster knew
|
|
26
30
|
* about, so this is narrower on paper. It is not narrower in practice for
|
|
27
31
|
* anything chant can act on: a kind with no mapper cannot be applied either, so
|
|
28
32
|
* observing it produced a live tree nothing could ever reconcile against.
|
|
@@ -42,8 +46,8 @@ export interface GcpReadClientOptions {
|
|
|
42
46
|
/** Injectable HTTP, so tests never touch the network. */
|
|
43
47
|
http?: GcpReadHttp;
|
|
44
48
|
}
|
|
45
|
-
/** Injectable HTTP client — mirrors the applier's `GcpHttp`. */
|
|
46
|
-
export type GcpReadHttp = (method: string, url: string) => Promise<{
|
|
49
|
+
/** Injectable HTTP client — mirrors the applier's `GcpHttp`. A body is sent only for a POST read (`:getIamPolicy`). */
|
|
50
|
+
export type GcpReadHttp = (method: string, url: string, body?: unknown) => Promise<{
|
|
47
51
|
status: number;
|
|
48
52
|
text: string;
|
|
49
53
|
}>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"read-client.d.ts","sourceRoot":"","sources":["../../src/api/read-client.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"read-client.d.ts","sourceRoot":"","sources":["../../src/api/read-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,OAAO,EAA6B,KAAK,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAE5F,kCAAkC;AAClC,MAAM,WAAW,oBAAoB;IACnC,+FAA+F;IAC/F,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yCAAyC;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,yDAAyD;IACzD,IAAI,CAAC,EAAE,WAAW,CAAC;CACpB;AAED,uHAAuH;AACvH,MAAM,MAAM,WAAW,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAUrH;;;;GAIG;AACH,qBAAa,YAAa,SAAQ,KAAK;IAGnC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM;IAF1B,YACE,OAAO,EAAE,MAAM,EACN,MAAM,CAAC,EAAE,MAAM,YAAA,EAIzB;CACF;AAED,mFAAmF;AACnF,wBAAgB,UAAU,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAEhD;AAED,4EAA4E;AAC5E,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAEtE;AAED;;;;;;GAMG;AACH,wBAAsB,WAAW,CAC/B,MAAM,EAAE,oBAAoB,EAC5B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAiDlC"}
|
package/dist/api/read-client.js
CHANGED
|
@@ -22,7 +22,11 @@
|
|
|
22
22
|
*
|
|
23
23
|
* Coverage is exactly the applier's dispatch table (`MAPPERS`) — StorageBucket,
|
|
24
24
|
* PubSubTopic, PubSubSubscription, SecretManagerSecret, IAMServiceAccount,
|
|
25
|
-
* RunService
|
|
25
|
+
* RunService, IAMPolicyMember and the Cloud Run load balancer kinds
|
|
26
|
+
* (ComputeAddress, ComputeRegionNetworkEndpointGroup, ComputeBackendService,
|
|
27
|
+
* ComputeURLMap, ComputeTargetHTTPProxy, ComputeForwardingRule; #4233). An
|
|
28
|
+
* IAMPolicyMember is read through its target's policy and is present when the
|
|
29
|
+
* policy grants its member the role. The kubectl path could fetch any CNRM kind the cluster knew
|
|
26
30
|
* about, so this is narrower on paper. It is not narrower in practice for
|
|
27
31
|
* anything chant can act on: a kind with no mapper cannot be applied either, so
|
|
28
32
|
* observing it produced a live tree nothing could ever reconcile against.
|
|
@@ -33,8 +37,11 @@
|
|
|
33
37
|
* non-goal and belongs with the applier.
|
|
34
38
|
*/
|
|
35
39
|
import { MAPPERS } from "../op/activities/gcp-apply.js";
|
|
36
|
-
const defaultHttp = async (method, url) => {
|
|
37
|
-
const res = await fetch(url, {
|
|
40
|
+
const defaultHttp = async (method, url, body) => {
|
|
41
|
+
const res = await fetch(url, {
|
|
42
|
+
method,
|
|
43
|
+
...(body === undefined ? {} : { headers: { "content-type": "application/json" }, body: JSON.stringify(body) }),
|
|
44
|
+
});
|
|
38
45
|
return { status: res.status, text: await res.text() };
|
|
39
46
|
};
|
|
40
47
|
/**
|
|
@@ -74,22 +81,36 @@ export async function getResource(client, kind, name, declared) {
|
|
|
74
81
|
metadata: { name },
|
|
75
82
|
spec: declared?.spec ?? declared ?? {},
|
|
76
83
|
};
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
}
|
|
81
|
-
catch (err) {
|
|
82
|
-
// A mapper that cannot plan from the declared spec cannot produce a URL, so
|
|
83
|
-
// there is nothing to read — a hole, never an absence.
|
|
84
|
-
throw new GcpReadError(`could not build a read URL for ${kind}/${name}: ${err instanceof Error ? err.message : String(err)}`);
|
|
84
|
+
const ctx = { base, project: client.project };
|
|
85
|
+
if (mapper.accepts && !mapper.accepts(resource, ctx)) {
|
|
86
|
+
throw new GcpReadError(`no REST read for ${kind}/${name}: its target has no endpoint chant can read`);
|
|
85
87
|
}
|
|
86
88
|
const http = client.http ?? defaultHttp;
|
|
87
89
|
let res;
|
|
88
|
-
|
|
89
|
-
|
|
90
|
+
if (mapper.custom) {
|
|
91
|
+
try {
|
|
92
|
+
res = await mapper.custom.read(resource, ctx, (method, url, body) => http(method, url, body));
|
|
93
|
+
}
|
|
94
|
+
catch (err) {
|
|
95
|
+
throw new GcpReadError(`could not read ${kind}/${name}: ${err instanceof Error ? err.message : String(err)}`);
|
|
96
|
+
}
|
|
90
97
|
}
|
|
91
|
-
|
|
92
|
-
|
|
98
|
+
else {
|
|
99
|
+
let getUrl;
|
|
100
|
+
try {
|
|
101
|
+
getUrl = mapper.plan(resource, ctx).getUrl;
|
|
102
|
+
}
|
|
103
|
+
catch (err) {
|
|
104
|
+
// A mapper that cannot plan from the declared spec cannot produce a URL, so
|
|
105
|
+
// there is nothing to read — a hole, never an absence.
|
|
106
|
+
throw new GcpReadError(`could not build a read URL for ${kind}/${name}: ${err instanceof Error ? err.message : String(err)}`);
|
|
107
|
+
}
|
|
108
|
+
try {
|
|
109
|
+
res = await http("GET", getUrl);
|
|
110
|
+
}
|
|
111
|
+
catch (err) {
|
|
112
|
+
throw new GcpReadError(err instanceof Error ? err.message : String(err));
|
|
113
|
+
}
|
|
93
114
|
}
|
|
94
115
|
if (res.status === 404)
|
|
95
116
|
throw new GcpReadError(`${kind}/${name} not found`, 404);
|
|
@@ -30,6 +30,8 @@ export interface CloudRunServiceProps {
|
|
|
30
30
|
name: string;
|
|
31
31
|
value: string;
|
|
32
32
|
}>;
|
|
33
|
+
/** Service account the service runs as: an email, or the account id of an IAMServiceAccount in the project. */
|
|
34
|
+
serviceAccount?: string;
|
|
33
35
|
/** Additional labels. */
|
|
34
36
|
labels?: Record<string, string>;
|
|
35
37
|
/** Namespace for all resources. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cloud-run-service.d.ts","sourceRoot":"","sources":["../../src/composites/cloud-run-service.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EACL,eAAe,IAAI,uBAAuB,EAC1C,eAAe,EAChB,MAAM,cAAc,CAAC;AAGtB,MAAM,WAAW,oBAAoB;IACnC,oBAAoB;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,uBAAuB;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iIAAiI;IACjI,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qDAAqD;IACrD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oCAAoC;IACpC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uCAAuC;IACvC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,8DAA8D;IAC9D,6BAA6B,CAAC,EAAE,MAAM,CAAC;IACvC,sCAAsC;IACtC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,wCAAwC;IACxC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,+DAA+D;IAC/D,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,6BAA6B;IAC7B,GAAG,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC7C,yBAAyB;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,mCAAmC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gEAAgE;IAChE,QAAQ,CAAC,EAAE;QACT,OAAO,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC,OAAO,uBAAuB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5E,SAAS,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC,OAAO,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;KACvE,CAAC;CACH;AAED;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,wBAAwB,
|
|
1
|
+
{"version":3,"file":"cloud-run-service.d.ts","sourceRoot":"","sources":["../../src/composites/cloud-run-service.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EACL,eAAe,IAAI,uBAAuB,EAC1C,eAAe,EAChB,MAAM,cAAc,CAAC;AAGtB,MAAM,WAAW,oBAAoB;IACnC,oBAAoB;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,uBAAuB;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iIAAiI;IACjI,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qDAAqD;IACrD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oCAAoC;IACpC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uCAAuC;IACvC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,8DAA8D;IAC9D,6BAA6B,CAAC,EAAE,MAAM,CAAC;IACvC,sCAAsC;IACtC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,wCAAwC;IACxC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,+DAA+D;IAC/D,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,6BAA6B;IAC7B,GAAG,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC7C,+GAA+G;IAC/G,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,yBAAyB;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,mCAAmC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gEAAgE;IAChE,QAAQ,CAAC,EAAE;QACT,OAAO,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC,OAAO,uBAAuB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5E,SAAS,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC,OAAO,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;KACvE,CAAC;CACH;AAED;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,wBAAwB,2FA8EP,CAAC"}
|
|
@@ -21,7 +21,7 @@ import { GCP } from "../pseudo.js";
|
|
|
21
21
|
* ```
|
|
22
22
|
*/
|
|
23
23
|
export const CloudRunServiceComposite = Composite((props) => {
|
|
24
|
-
const { name, image, location, projectId, port = 8080, cpuLimit = "1000m", memoryLimit = "512Mi", maxInstanceRequestConcurrency = 80, minInstanceCount = 0, maxInstanceCount = 100, publicAccess = false, env, labels: extraLabels = {}, namespace, defaults: defs, } = props;
|
|
24
|
+
const { name, image, location, projectId, port = 8080, cpuLimit = "1000m", memoryLimit = "512Mi", maxInstanceRequestConcurrency = 80, minInstanceCount = 0, maxInstanceCount = 100, publicAccess = false, env, serviceAccount, labels: extraLabels = {}, namespace, defaults: defs, } = props;
|
|
25
25
|
const commonLabels = {
|
|
26
26
|
"app.kubernetes.io/name": name,
|
|
27
27
|
"app.kubernetes.io/managed-by": "chant",
|
|
@@ -52,6 +52,9 @@ export const CloudRunServiceComposite = Composite((props) => {
|
|
|
52
52
|
maxInstanceCount,
|
|
53
53
|
},
|
|
54
54
|
containers,
|
|
55
|
+
...(serviceAccount && {
|
|
56
|
+
serviceAccountRef: serviceAccount.includes("@") ? { external: serviceAccount } : { name: serviceAccount },
|
|
57
|
+
}),
|
|
55
58
|
},
|
|
56
59
|
}, defs?.service));
|
|
57
60
|
const result = { service };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deep-observe.d.ts","sourceRoot":"","sources":["../src/deep-observe.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsDG;AAEH,OAAO,KAAK,EACV,qBAAqB,EAGtB,MAAM,0BAA0B,CAAC;AAKlC,OAAO,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AAajE,OAAO,EAAE,yBAAyB,EAAE,CAAC;AAErC,MAAM,WAAW,qBAAqB;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC,CAAC;IAC9E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAWtF;AAUD;6EAC6E;AAC7E,UAAU,aAAa;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;
|
|
1
|
+
{"version":3,"file":"deep-observe.d.ts","sourceRoot":"","sources":["../src/deep-observe.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsDG;AAEH,OAAO,KAAK,EACV,qBAAqB,EAGtB,MAAM,0BAA0B,CAAC;AAKlC,OAAO,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AAajE,OAAO,EAAE,yBAAyB,EAAE,CAAC;AAErC,MAAM,WAAW,qBAAqB;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC,CAAC;IAC9E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAWtF;AAUD;6EAC6E;AAC7E,UAAU,aAAa;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AA2LD;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CASnH;AAED;;;;;;GAMG;AACH,wBAAsB,uBAAuB,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,qBAAqB,CAAC,CA8F5G"}
|
package/dist/deep-observe.js
CHANGED
|
@@ -157,8 +157,132 @@ const CNRM_REFINERS = {
|
|
|
157
157
|
const m = ctx.restName ? /\/locations\/([^/]+)\//.exec(ctx.restName) : null;
|
|
158
158
|
if (m)
|
|
159
159
|
tree.location = m[1];
|
|
160
|
+
// #4240: v2 returns the account as an email; the declared side writes a
|
|
161
|
+
// `serviceAccountRef`, `name` for an account in the project.
|
|
162
|
+
const template = tree.template;
|
|
163
|
+
if (template && typeof template.serviceAccount === "string") {
|
|
164
|
+
const email = template.serviceAccount;
|
|
165
|
+
const suffix = `@${ctx.project}.iam.gserviceaccount.com`;
|
|
166
|
+
template.serviceAccountRef = email.endsWith(suffix) ? { name: email.slice(0, -suffix.length) } : { external: email };
|
|
167
|
+
delete template.serviceAccount;
|
|
168
|
+
}
|
|
169
|
+
},
|
|
170
|
+
// #4233: the inverse of gcp-compute.ts's body builders. Compute returns refs
|
|
171
|
+
// as full URLs and a region as a URL; CNRM writes `*Ref: { name }` and a
|
|
172
|
+
// bare `location` (`"global"` when the resource has no region).
|
|
173
|
+
IAMPolicyMember(tree) {
|
|
174
|
+
delete tree.etag;
|
|
175
|
+
delete tree.resource;
|
|
176
|
+
},
|
|
177
|
+
ComputeAddress(tree) {
|
|
178
|
+
computeLocation(tree);
|
|
179
|
+
},
|
|
180
|
+
ComputeRegionNetworkEndpointGroup(tree) {
|
|
181
|
+
if (typeof tree.region === "string")
|
|
182
|
+
tree.region = lastSegment(tree.region);
|
|
183
|
+
const cloudRun = tree.cloudRun;
|
|
184
|
+
if (cloudRun && typeof cloudRun.service === "string") {
|
|
185
|
+
cloudRun.serviceRef = { name: cloudRun.service };
|
|
186
|
+
delete cloudRun.service;
|
|
187
|
+
}
|
|
188
|
+
},
|
|
189
|
+
ComputeBackendService(tree) {
|
|
190
|
+
computeLocation(tree);
|
|
191
|
+
if (tree.enableCDN !== undefined) {
|
|
192
|
+
tree.enableCdn = tree.enableCDN;
|
|
193
|
+
delete tree.enableCDN;
|
|
194
|
+
}
|
|
195
|
+
const draining = tree.connectionDraining;
|
|
196
|
+
if (draining) {
|
|
197
|
+
if (draining.drainingTimeoutSec !== undefined)
|
|
198
|
+
tree.connectionDrainingTimeoutSec = draining.drainingTimeoutSec;
|
|
199
|
+
delete tree.connectionDraining;
|
|
200
|
+
}
|
|
201
|
+
if (Array.isArray(tree.backends)) {
|
|
202
|
+
tree.backend = tree.backends.map((b) => {
|
|
203
|
+
const { group, ...rest } = b;
|
|
204
|
+
return { ...rest, ...(typeof group === "string" ? { group: refOf(group) } : {}) };
|
|
205
|
+
});
|
|
206
|
+
delete tree.backends;
|
|
207
|
+
}
|
|
208
|
+
if (Array.isArray(tree.healthChecks)) {
|
|
209
|
+
tree.healthChecks = tree.healthChecks.map((h) => (typeof h === "string" ? { healthCheckRef: { name: lastSegment(h) } } : h));
|
|
210
|
+
}
|
|
211
|
+
if (typeof tree.securityPolicy === "string") {
|
|
212
|
+
tree.securityPolicyRef = { name: lastSegment(tree.securityPolicy) };
|
|
213
|
+
delete tree.securityPolicy;
|
|
214
|
+
}
|
|
215
|
+
},
|
|
216
|
+
ComputeURLMap(tree) {
|
|
217
|
+
computeLocation(tree);
|
|
218
|
+
if (typeof tree.defaultService === "string")
|
|
219
|
+
tree.defaultService = refOf(tree.defaultService);
|
|
220
|
+
if (Array.isArray(tree.hostRules)) {
|
|
221
|
+
tree.hostRule = tree.hostRules;
|
|
222
|
+
delete tree.hostRules;
|
|
223
|
+
}
|
|
224
|
+
if (Array.isArray(tree.pathMatchers)) {
|
|
225
|
+
tree.pathMatcher = tree.pathMatchers.map((m) => {
|
|
226
|
+
const { defaultService, pathRules, ...rest } = m;
|
|
227
|
+
return {
|
|
228
|
+
...rest,
|
|
229
|
+
...(typeof defaultService === "string" ? { defaultService: refOf(defaultService) } : {}),
|
|
230
|
+
...(Array.isArray(pathRules)
|
|
231
|
+
? {
|
|
232
|
+
pathRule: pathRules.map(({ service, ...r }) => ({
|
|
233
|
+
...r,
|
|
234
|
+
...(typeof service === "string" ? { service: refOf(service) } : {}),
|
|
235
|
+
})),
|
|
236
|
+
}
|
|
237
|
+
: {}),
|
|
238
|
+
};
|
|
239
|
+
});
|
|
240
|
+
delete tree.pathMatchers;
|
|
241
|
+
}
|
|
242
|
+
},
|
|
243
|
+
ComputeTargetHTTPProxy(tree) {
|
|
244
|
+
computeLocation(tree);
|
|
245
|
+
if (typeof tree.urlMap === "string") {
|
|
246
|
+
tree.urlMapRef = { name: lastSegment(tree.urlMap) };
|
|
247
|
+
delete tree.urlMap;
|
|
248
|
+
}
|
|
249
|
+
},
|
|
250
|
+
ComputeForwardingRule(tree) {
|
|
251
|
+
computeLocation(tree);
|
|
252
|
+
if (tree.IPProtocol !== undefined) {
|
|
253
|
+
tree.ipProtocol = tree.IPProtocol;
|
|
254
|
+
delete tree.IPProtocol;
|
|
255
|
+
}
|
|
256
|
+
if (typeof tree.target === "string")
|
|
257
|
+
tree.target = refOf(tree.target);
|
|
258
|
+
if (typeof tree.backendService === "string") {
|
|
259
|
+
tree.backendServiceRef = { name: lastSegment(tree.backendService) };
|
|
260
|
+
delete tree.backendService;
|
|
261
|
+
}
|
|
160
262
|
},
|
|
161
263
|
};
|
|
264
|
+
function lastSegment(url) {
|
|
265
|
+
return url.slice(url.lastIndexOf("/") + 1);
|
|
266
|
+
}
|
|
267
|
+
/** Compute's `region` URL as CNRM's `location`; no region means a global resource. */
|
|
268
|
+
function computeLocation(tree) {
|
|
269
|
+
tree.location = typeof tree.region === "string" ? lastSegment(tree.region) : "global";
|
|
270
|
+
delete tree.region;
|
|
271
|
+
}
|
|
272
|
+
/** The `*Ref` a compute URL names, by its collection (`.../backendServices/web` -> `{ backendServiceRef: { name: "web" } }`). */
|
|
273
|
+
const REF_KEY_BY_COLLECTION = {
|
|
274
|
+
networkEndpointGroups: "networkEndpointGroupRef",
|
|
275
|
+
backendServices: "backendServiceRef",
|
|
276
|
+
backendBuckets: "backendBucketRef",
|
|
277
|
+
targetHttpProxies: "targetHTTPProxyRef",
|
|
278
|
+
targetHttpsProxies: "targetHTTPSProxyRef",
|
|
279
|
+
instanceGroups: "instanceGroupRef",
|
|
280
|
+
};
|
|
281
|
+
function refOf(url) {
|
|
282
|
+
const parts = url.split("/");
|
|
283
|
+
const key = REF_KEY_BY_COLLECTION[parts[parts.length - 2] ?? ""];
|
|
284
|
+
return key ? { [key]: { name: parts[parts.length - 1] } } : url;
|
|
285
|
+
}
|
|
162
286
|
/**
|
|
163
287
|
* A REST payload as a CNRM-shaped property tree, in the declared side's
|
|
164
288
|
* vocabulary. The generic reshape runs first, then the full resource path is
|
|
@@ -213,7 +337,7 @@ export async function observeResourcesDeepGcp(options) {
|
|
|
213
337
|
let client;
|
|
214
338
|
try {
|
|
215
339
|
client = {
|
|
216
|
-
project: resolveReadProject(gvk.kind, name, metadata, manifestProjects),
|
|
340
|
+
project: resolveReadProject(gvk.kind, name, metadata, manifestProjects, props),
|
|
217
341
|
...(endpoint ? { endpoint } : {}),
|
|
218
342
|
};
|
|
219
343
|
}
|
|
@@ -82,14 +82,15 @@ export declare function deriveGVK(entityType: string): {
|
|
|
82
82
|
*/
|
|
83
83
|
export declare function manifestProjectAnnotations(buildOutput: string | undefined): Map<string, string>;
|
|
84
84
|
/**
|
|
85
|
-
* The project a read should target:
|
|
86
|
-
*
|
|
85
|
+
* The project a read should target: the entity's `projectRef.external`,
|
|
86
|
+
* `GOOGLE_CLOUD_PROJECT`, the entity's own annotation (via
|
|
87
|
+
* `resolveGcpProject`, the applier's rule), then the built
|
|
87
88
|
* manifest's merged annotation. Throws the applier's own error when nothing
|
|
88
89
|
* resolves, so the `no-binding` detail names both knobs.
|
|
89
90
|
*/
|
|
90
91
|
export declare function resolveReadProject(kind: string, name: string, metadata: {
|
|
91
92
|
annotations?: Record<string, string>;
|
|
92
|
-
} | undefined, manifestProjects: Map<string, string>): string;
|
|
93
|
+
} | undefined, manifestProjects: Map<string, string>, props?: Record<string, unknown>): string;
|
|
93
94
|
/**
|
|
94
95
|
* Status from a REST payload.
|
|
95
96
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"describe-resources.d.ts","sourceRoot":"","sources":["../src/describe-resources.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAsC,MAAM,0BAA0B,CAAC;AAsBtG;;gCAEgC;AAChC,UAAU,eAAe;IACvB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IACvC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE;QACP,UAAU,CAAC,EAAE,KAAK,CAAC;YAAE,IAAI,CAAC,EAAE,MAAM,CAAC;YAAC,MAAM,CAAC,EAAE,MAAM,CAAC;YAAC,KAAK,CAAC,EAAE,MAAM,CAAC;YAAC,MAAM,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QACxF,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;KACtB,CAAC;CACH;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAIpF;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,0BAA0B,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAgB/F;AAED
|
|
1
|
+
{"version":3,"file":"describe-resources.d.ts","sourceRoot":"","sources":["../src/describe-resources.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAsC,MAAM,0BAA0B,CAAC;AAsBtG;;gCAEgC;AAChC,UAAU,eAAe;IACvB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IACvC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE;QACP,UAAU,CAAC,EAAE,KAAK,CAAC;YAAE,IAAI,CAAC,EAAE,MAAM,CAAC;YAAC,MAAM,CAAC,EAAE,MAAM,CAAC;YAAC,KAAK,CAAC,EAAE,MAAM,CAAC;YAAC,MAAM,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QACxF,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;KACtB,CAAC;CACH;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAIpF;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,0BAA0B,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAgB/F;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GAAG,SAAS,EAC9D,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EACrC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,MAAM,CAQR;AAUD;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM,CAY3D;AAED,wBAAsB,iBAAiB,CAAC,OAAO,EAAE;IAC/C,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC,CAAC;IAC9E,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAwH7B"}
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
import { observation } from "@intentius/chant/observation";
|
|
39
39
|
import { hasOwnershipMarker, classifyOwnership, readOwnership } from "@intentius/chant/ownership";
|
|
40
40
|
import { getResource, mapperForKind, GcpReadError, isNotFound } from "./api/read-client.js";
|
|
41
|
-
import { resolveGcpProject, parseManifest } from "./op/activities/gcp-apply.js";
|
|
41
|
+
import { resolveGcpProject, parseManifest, projectRefProject } from "./op/activities/gcp-apply.js";
|
|
42
42
|
import { resolveGVK } from "./serializer.js";
|
|
43
43
|
/**
|
|
44
44
|
* chant's ownership marker as GCP labels.
|
|
@@ -85,7 +85,7 @@ export function manifestProjectAnnotations(buildOutput) {
|
|
|
85
85
|
return out;
|
|
86
86
|
try {
|
|
87
87
|
for (const doc of parseManifest(buildOutput, "<build output>")) {
|
|
88
|
-
const project = doc.metadata?.annotations?.["cnrm.cloud.google.com/project-id"];
|
|
88
|
+
const project = projectRefProject(doc.spec) ?? doc.metadata?.annotations?.["cnrm.cloud.google.com/project-id"];
|
|
89
89
|
if (doc.kind && doc.metadata?.name && typeof project === "string") {
|
|
90
90
|
out.set(`${doc.kind}/${doc.metadata.name}`, project);
|
|
91
91
|
}
|
|
@@ -99,14 +99,15 @@ export function manifestProjectAnnotations(buildOutput) {
|
|
|
99
99
|
return out;
|
|
100
100
|
}
|
|
101
101
|
/**
|
|
102
|
-
* The project a read should target:
|
|
103
|
-
*
|
|
102
|
+
* The project a read should target: the entity's `projectRef.external`,
|
|
103
|
+
* `GOOGLE_CLOUD_PROJECT`, the entity's own annotation (via
|
|
104
|
+
* `resolveGcpProject`, the applier's rule), then the built
|
|
104
105
|
* manifest's merged annotation. Throws the applier's own error when nothing
|
|
105
106
|
* resolves, so the `no-binding` detail names both knobs.
|
|
106
107
|
*/
|
|
107
|
-
export function resolveReadProject(kind, name, metadata, manifestProjects) {
|
|
108
|
+
export function resolveReadProject(kind, name, metadata, manifestProjects, props) {
|
|
108
109
|
try {
|
|
109
|
-
return resolveGcpProject({ kind, metadata });
|
|
110
|
+
return resolveGcpProject({ kind, metadata, ...(props ? { spec: props } : {}) });
|
|
110
111
|
}
|
|
111
112
|
catch (err) {
|
|
112
113
|
const fromManifest = manifestProjects.get(`${kind}/${name}`);
|
|
@@ -195,7 +196,7 @@ export async function describeResources(options) {
|
|
|
195
196
|
let client;
|
|
196
197
|
try {
|
|
197
198
|
client = {
|
|
198
|
-
project: resolveReadProject(gvk.kind, name, metadata, manifestProjects),
|
|
199
|
+
project: resolveReadProject(gvk.kind, name, metadata, manifestProjects, props),
|
|
199
200
|
...(endpoint ? { endpoint } : {}),
|
|
200
201
|
};
|
|
201
202
|
}
|
package/dist/health.js
CHANGED
|
@@ -60,7 +60,7 @@ export async function observeHealthGcp(options) {
|
|
|
60
60
|
}
|
|
61
61
|
let project;
|
|
62
62
|
try {
|
|
63
|
-
project = resolveReadProject(gvk.kind, name, metadata, manifestProjects);
|
|
63
|
+
project = resolveReadProject(gvk.kind, name, metadata, manifestProjects, props);
|
|
64
64
|
}
|
|
65
65
|
catch (err) {
|
|
66
66
|
unobserved[entityName] = { type: entityType, reason: "no-binding", detail: err instanceof Error ? err.message : String(err) };
|
package/dist/integrity.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"algorithm": "sha256",
|
|
3
3
|
"artifacts": {
|
|
4
|
-
"manifest.json": "
|
|
4
|
+
"manifest.json": "1df258f1ce42c92a75d16af8bb02fb96e2b8a35903feafb3991be4162737103f",
|
|
5
5
|
"meta.json": "75643660010c044c6f465bef2688a864ab30cc96fd9b68111969749748ac64ca",
|
|
6
6
|
"types/index.d.ts": "da1ebc6bcf83e1a018a773b59714194aeeb74ae1d5c1252b737b7e730ca98bd5",
|
|
7
7
|
"rules/hardcoded-project.ts": "6d5ae9efa74d73800eebe1a0a0d43c619ee0fdebe3347195df93fcbe63b34f0d",
|
|
@@ -40,5 +40,5 @@
|
|
|
40
40
|
"skills/chant-gcp-patterns.md": "4c6809fc7c37fa1879379ad4c0e2d114dec9497bc6eb9d1bca4e79fddea4f509",
|
|
41
41
|
"skills/chant-gcp-gke.md": "be277019da9a722c851e47cd2dfb9c9536668948c3535fb20db7697e934c4e2b"
|
|
42
42
|
},
|
|
43
|
-
"composite": "
|
|
43
|
+
"composite": "8f56e528b666ee71c8dde34f63317337bb6183280e11dd1925ac7c1e4117ca89"
|
|
44
44
|
}
|
package/dist/manifest.json
CHANGED
|
@@ -119,6 +119,33 @@ export interface ListSpec {
|
|
|
119
119
|
labels?: Record<string, string> | null;
|
|
120
120
|
}>;
|
|
121
121
|
}
|
|
122
|
+
/**
|
|
123
|
+
* Where a mapper works: the API base, the project, and the rest of the applied
|
|
124
|
+
* manifest, so a `*Ref` to a resource declared alongside can take that
|
|
125
|
+
* resource's scope. The read path has no manifest.
|
|
126
|
+
*/
|
|
127
|
+
export interface MapperCtx {
|
|
128
|
+
base: string;
|
|
129
|
+
project: string;
|
|
130
|
+
manifest?: readonly GcpResource[];
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* A kind whose apply is not GET-then-create (#4233). IAMPolicyMember is a
|
|
134
|
+
* member inside another resource's policy, so it reads, merges and writes that
|
|
135
|
+
* policy instead. `read` answers like a GET: 200 with a body when present, 404
|
|
136
|
+
* when not.
|
|
137
|
+
*/
|
|
138
|
+
export interface CustomOps {
|
|
139
|
+
apply(resource: GcpResource, ctx: MapperCtx, http: GcpHttp, signal?: AbortSignal): Promise<{
|
|
140
|
+
created: boolean;
|
|
141
|
+
updated: boolean;
|
|
142
|
+
}>;
|
|
143
|
+
delete(resource: GcpResource, ctx: MapperCtx, http: GcpHttp, signal?: AbortSignal): Promise<boolean>;
|
|
144
|
+
read(resource: GcpResource, ctx: MapperCtx, http: GcpHttp, signal?: AbortSignal): Promise<{
|
|
145
|
+
status: number;
|
|
146
|
+
text: string;
|
|
147
|
+
}>;
|
|
148
|
+
}
|
|
122
149
|
/** Maps one CNRM kind to its GCP REST operations. The unit of the dispatch table. */
|
|
123
150
|
export interface ResourceMapper {
|
|
124
151
|
/** CNRM kind this handles. */
|
|
@@ -126,10 +153,11 @@ export interface ResourceMapper {
|
|
|
126
153
|
/** Real-GCP API host, used when no `endpoint` override is given. */
|
|
127
154
|
defaultHost: string;
|
|
128
155
|
/** Build the GET + create plan for one resource against `base`. */
|
|
129
|
-
plan(resource: GcpResource, ctx:
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
156
|
+
plan(resource: GcpResource, ctx: MapperCtx): ApplyPlan;
|
|
157
|
+
/** False for a resource of this kind chant cannot act on (an IAM binding on a target with no policy endpoint): reported, not attempted. */
|
|
158
|
+
accepts?(resource: GcpResource, ctx: MapperCtx): boolean;
|
|
159
|
+
/** Present when apply, delete and read are not the plan's GET-then-create. */
|
|
160
|
+
custom?: CustomOps;
|
|
133
161
|
/** Present for async resources whose create returns a long-running operation. */
|
|
134
162
|
operation?: OperationSpec;
|
|
135
163
|
/** Present when the kind can be pruned (list live → delete chant-owned orphans). */
|
|
@@ -153,10 +181,23 @@ export declare function bucketInsertBody(cnrm: CnrmStorageBucket): BucketInsertB
|
|
|
153
181
|
export declare function pubSubTopicBody(resource: GcpResource): PubSubTopicBody;
|
|
154
182
|
export declare const storageBucketMapper: ResourceMapper;
|
|
155
183
|
export declare const pubSubTopicMapper: ResourceMapper;
|
|
156
|
-
/**
|
|
157
|
-
|
|
184
|
+
/**
|
|
185
|
+
* Map a CNRM RunService to a Cloud Run v2 Service body. Pure. CNRM names the
|
|
186
|
+
* service account with `template.serviceAccountRef`; v2 takes
|
|
187
|
+
* `template.serviceAccount` as an email (#4240).
|
|
188
|
+
*/
|
|
189
|
+
export declare function cloudRunServiceBody(resource: GcpResource, project?: string): {
|
|
158
190
|
template?: unknown;
|
|
159
191
|
};
|
|
192
|
+
/**
|
|
193
|
+
* The email a CNRM `serviceAccountRef` names: `external` as given (an email,
|
|
194
|
+
* or a `projects/<p>/serviceAccounts/<email>` path), `name` as an account id
|
|
195
|
+
* in the project.
|
|
196
|
+
*/
|
|
197
|
+
export declare function serviceAccountEmail(ref: {
|
|
198
|
+
name?: string;
|
|
199
|
+
external?: string;
|
|
200
|
+
} | undefined, project?: string): string | undefined;
|
|
160
201
|
export declare const cloudRunServiceMapper: ResourceMapper;
|
|
161
202
|
/**
|
|
162
203
|
* Map a CNRM PubSubSubscription to a Pub/Sub Subscription body, resolving the
|
|
@@ -178,6 +219,11 @@ export declare const MAPPERS: Record<string, ResourceMapper>;
|
|
|
178
219
|
* refs point outside the manifest and are ignored for ordering. Pure.
|
|
179
220
|
*/
|
|
180
221
|
export declare function referencedNames(resource: GcpResource): string[];
|
|
222
|
+
/** The local resources this resource references via `*Ref` fields, each with its kind when known. Pure. */
|
|
223
|
+
export declare function referencedResources(resource: GcpResource): Array<{
|
|
224
|
+
name: string;
|
|
225
|
+
kind?: string;
|
|
226
|
+
}>;
|
|
181
227
|
/**
|
|
182
228
|
* Topologically order resources so a referenced resource comes before the
|
|
183
229
|
* resource that references it (apply order; reverse for delete). Refs to names
|
|
@@ -197,6 +243,13 @@ export declare function resolveGcpEndpoint(args?: {
|
|
|
197
243
|
endpoint?: string;
|
|
198
244
|
}, env?: NodeJS.ProcessEnv): string | undefined;
|
|
199
245
|
/** Resolve the project: `GOOGLE_CLOUD_PROJECT` env, else the CNRM project-id annotation. Pure. */
|
|
246
|
+
/**
|
|
247
|
+
* The project a resource names in `spec.projectRef.external` (#4201): a
|
|
248
|
+
* project id or `projects/<id>`. A `GCP.ProjectId` pseudo-parameter there
|
|
249
|
+
* (`{ Ref: "GCP::ProjectId" }`, unresolved in discovery output) reads
|
|
250
|
+
* `GCP_PROJECT_ID`, as the serializer does.
|
|
251
|
+
*/
|
|
252
|
+
export declare function projectRefProject(spec: Record<string, unknown> | undefined, env?: NodeJS.ProcessEnv): string | undefined;
|
|
200
253
|
export declare function resolveGcpProject(resource: GcpResource, env?: NodeJS.ProcessEnv): string;
|
|
201
254
|
/** Injectable HTTP client — mirrors argo's injectable fetcher so tests avoid the network. */
|
|
202
255
|
export type GcpHttp = (method: string, url: string, body?: unknown, signal?: AbortSignal) => Promise<{
|
|
@@ -209,10 +262,7 @@ export type GcpHttp = (method: string, url: string, body?: unknown, signal?: Abo
|
|
|
209
262
|
* create it. Async create/update return an operation that is polled to
|
|
210
263
|
* completion. `http` is injectable for tests.
|
|
211
264
|
*/
|
|
212
|
-
export declare function applyResource(mapper: ResourceMapper, resource: GcpResource, ctx: {
|
|
213
|
-
base: string;
|
|
214
|
-
project: string;
|
|
215
|
-
}, http?: GcpHttp, signal?: AbortSignal): Promise<{
|
|
265
|
+
export declare function applyResource(mapper: ResourceMapper, resource: GcpResource, ctx: MapperCtx, http?: GcpHttp, signal?: AbortSignal): Promise<{
|
|
216
266
|
kind: string;
|
|
217
267
|
name: string;
|
|
218
268
|
created: boolean;
|
|
@@ -308,10 +358,7 @@ export interface GcpNotPrunable {
|
|
|
308
358
|
* Returns what it could not consider alongside what it deleted — a kind with no
|
|
309
359
|
* `list`, or whose list call failed, is reported rather than dropped (#1447).
|
|
310
360
|
*/
|
|
311
|
-
export declare function pruneOrphans(desired: GcpResource[], resolve: (mapper: ResourceMapper, resource?: GcpResource) => {
|
|
312
|
-
base: string;
|
|
313
|
-
project: string;
|
|
314
|
-
}, http?: GcpHttp, signal?: AbortSignal): Promise<{
|
|
361
|
+
export declare function pruneOrphans(desired: GcpResource[], resolve: (mapper: ResourceMapper, resource?: GcpResource) => MapperCtx, http?: GcpHttp, signal?: AbortSignal): Promise<{
|
|
315
362
|
pruned: Array<{
|
|
316
363
|
kind: string;
|
|
317
364
|
name: string;
|
|
@@ -354,10 +401,7 @@ export declare function gcpApply(args: GcpApplyArgs, signal?: AbortSignal, http?
|
|
|
354
401
|
* already gone. For async resources, `DELETE` returns a long-running operation
|
|
355
402
|
* that is polled to completion. `http` is injectable for tests.
|
|
356
403
|
*/
|
|
357
|
-
export declare function deleteResource(mapper: ResourceMapper, resource: GcpResource, ctx: {
|
|
358
|
-
base: string;
|
|
359
|
-
project: string;
|
|
360
|
-
}, http?: GcpHttp, signal?: AbortSignal): Promise<{
|
|
404
|
+
export declare function deleteResource(mapper: ResourceMapper, resource: GcpResource, ctx: MapperCtx, http?: GcpHttp, signal?: AbortSignal): Promise<{
|
|
361
405
|
kind: string;
|
|
362
406
|
name: string;
|
|
363
407
|
deleted: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gcp-apply.d.ts","sourceRoot":"","sources":["../../../src/op/activities/gcp-apply.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"gcp-apply.d.ts","sourceRoot":"","sources":["../../../src/op/activities/gcp-apply.ts"],"names":[],"mappings":"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"}
|