@intentius/chant-lexicon-k8s 0.57.0 → 0.58.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/api/sweep-types.d.ts +1 -2
- package/dist/api/sweep-types.d.ts.map +1 -1
- package/dist/composites/operator-stack.d.ts +19 -18
- package/dist/composites/operator-stack.d.ts.map +1 -1
- package/dist/config.d.ts +4 -4
- package/dist/deep-observe-hooks.d.ts +4 -4
- package/dist/deep-observe.d.ts +23 -16
- package/dist/deep-observe.d.ts.map +1 -1
- package/dist/export-resources.d.ts +1 -1
- package/dist/integrity.json +3 -3
- package/dist/lint/audit-catalog.d.ts.map +1 -1
- package/dist/lint/audit-lineage.d.ts +10 -0
- package/dist/lint/audit-lineage.d.ts.map +1 -0
- package/dist/manifest.json +1 -1
- package/dist/op/activities/argo.d.ts +4 -4
- package/dist/op/activities/argo.d.ts.map +1 -1
- package/dist/op/activities/index.d.ts +9 -7
- package/dist/op/activities/index.d.ts.map +1 -1
- package/dist/op/activities/kubectl.d.ts +7 -7
- package/dist/op/activities/kubectl.d.ts.map +1 -1
- package/dist/op/activities/wait-for-ready.d.ts +6 -5
- package/dist/op/activities/wait-for-ready.d.ts.map +1 -1
- package/dist/op/builders.d.ts +13 -13
- package/dist/skills/chant-k8s-argo.md +27 -13
- package/package.json +3 -3
- package/src/api/sweep-types.ts +1 -2
- package/src/composites/composites.test.ts +13 -2
- package/src/composites/operator-stack.ts +22 -20
- package/src/config.ts +4 -4
- package/src/crd/crd-sources.ts +4 -4
- package/src/deep-observe-hooks.ts +4 -4
- package/src/deep-observe.test.ts +219 -46
- package/src/deep-observe.ts +28 -21
- package/src/export-resources.ts +1 -1
- package/src/lint/audit-catalog.ts +5 -1
- package/src/lint/audit-lineage.ts +127 -0
- package/src/op/activities/argo.test.ts +7 -8
- package/src/op/activities/argo.ts +4 -4
- package/src/op/activities/index.ts +9 -7
- package/src/op/activities/kubectl.test.ts +5 -4
- package/src/op/activities/kubectl.ts +52 -67
- package/src/op/activities/wait-for-ready.test.ts +2 -2
- package/src/op/activities/wait-for-ready.ts +7 -7
- package/src/op/builders.ts +13 -13
- package/src/plugin.ts +1 -1
- package/src/serializer.test.ts +26 -0
- package/src/skills/chant-k8s-argo.md +27 -13
|
@@ -10,8 +10,7 @@
|
|
|
10
10
|
*
|
|
11
11
|
* It lives in its own module, with no imports of its own, because both
|
|
12
12
|
* consumers reach it from different directions — `../export-resources.ts`
|
|
13
|
-
* pulls in the whole import parser, and
|
|
14
|
-
* activity should not.
|
|
13
|
+
* pulls in the whole import parser, and the apply activity should not.
|
|
15
14
|
*/
|
|
16
15
|
export declare const DEFAULT_IMPORT_TYPES: readonly string[];
|
|
17
16
|
//# sourceMappingURL=sweep-types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sweep-types.d.ts","sourceRoot":"","sources":["../../src/api/sweep-types.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"sweep-types.d.ts","sourceRoot":"","sources":["../../src/api/sweep-types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,oBAAoB,EAAE,SAAS,MAAM,EAoBjD,CAAC"}
|
|
@@ -16,39 +16,40 @@
|
|
|
16
16
|
* (lease fencing, `chant operator status`, durable gate-as-fact semantics).
|
|
17
17
|
* `OperatorStack`'s container command is deliberately `chant run <name>`,
|
|
18
18
|
* the one-shot local tick `ConvergeOp` (#1484) already ships and tests
|
|
19
|
-
* against (`
|
|
19
|
+
* against (`packages/core/src/op/composites/converge-op.ts`'s own doc:
|
|
20
20
|
* "one-shot runnable locally for a single tick"). When #1485 lands, a
|
|
21
21
|
* caller can override `command` to shell out to `chant operator tick`
|
|
22
22
|
* instead — this composite doesn't need to change for that; only the
|
|
23
23
|
* command a caller passes does.
|
|
24
24
|
*
|
|
25
25
|
* `concurrencyPolicy: "Forbid"` is the k8s-native analogue of
|
|
26
|
-
* `ConvergeOp`'s own
|
|
27
|
-
*
|
|
26
|
+
* `ConvergeOp`'s own `schedule.overlap: "skip"` policy — never queue a
|
|
27
|
+
* second tick behind one still running.
|
|
28
28
|
*
|
|
29
29
|
* ## RBAC derivation
|
|
30
30
|
*
|
|
31
31
|
* `ConvergeOp` adds no authority an environment did not already grant
|
|
32
32
|
* (#1484's Autonomy table). `OperatorStack` re-derives the same bound at the
|
|
33
|
-
* k8s RBAC layer,
|
|
34
|
-
*
|
|
33
|
+
* k8s RBAC layer, from the Op configs alone (see the Layering note below for
|
|
34
|
+
* what this module imports and what it restates): for each hosted
|
|
35
35
|
* ConvergeOp, walk its `dispatchTargets` (the OpConfigs its rule table's
|
|
36
36
|
* `run()` actions may name) through `classifyOpVerbClass`
|
|
37
37
|
* (`packages/core/src/op/op-verb-class.ts`, #1954), then keep only the
|
|
38
38
|
* highest verb class this host's `dial` could ever actually free-run —
|
|
39
39
|
* exactly `convergeTick`'s own `verbClassAllowedToDispatch` gate and
|
|
40
|
-
* `
|
|
40
|
+
* `OPS014`'s build-time refusal, restated as an RBAC ceiling:
|
|
41
41
|
*
|
|
42
42
|
* - `dial: "observe"` never dispatches (report-only) → read-only RBAC,
|
|
43
43
|
* regardless of what the rule table's targets could otherwise do.
|
|
44
|
-
* - `dial: "reconcile"` only free-runs a read-only target (
|
|
44
|
+
* - `dial: "reconcile"` only free-runs a read-only target (OPS014 refuses a
|
|
45
45
|
* mutating dispatch under reconcile in v1) → read-only RBAC.
|
|
46
46
|
* - `dial: "apply"` free-runs read-only and mutating targets → RBAC gains
|
|
47
47
|
* create/update/patch, never delete.
|
|
48
48
|
* - A `dispatchTargets` entry that itself classifies `destructive` is
|
|
49
|
-
* refused outright, at construction —
|
|
50
|
-
* destructive `run()` target under any dial in v1 (
|
|
51
|
-
*
|
|
49
|
+
* refused outright, at construction — OPS014 already refuses a
|
|
50
|
+
* destructive `run()` target under any dial in v1 (a converge tick runs
|
|
51
|
+
* unattended, and a destructive dispatch needs a person's approval before
|
|
52
|
+
* it is attempted, not a gate read after the fact), so a `destructive` target
|
|
52
53
|
* reaching this composite is either a config bypassing that build check
|
|
53
54
|
* or a target `OperatorStack` should never grant permission toward.
|
|
54
55
|
* `never delete`, unconditionally, in v1 — no verb class here ever grants
|
|
@@ -61,11 +62,11 @@
|
|
|
61
62
|
*
|
|
62
63
|
* ## Layering
|
|
63
64
|
*
|
|
64
|
-
* `
|
|
65
|
-
*
|
|
66
|
-
*
|
|
67
|
-
*
|
|
68
|
-
*
|
|
65
|
+
* `OperatorStackConvergeHost` restates the handful of `ConvergeOp` fields
|
|
66
|
+
* this composite actually needs (`name`, `schedule`, `env`, `dial`)
|
|
67
|
+
* structurally rather than importing `ConvergeOpConfig`: the CronJob is
|
|
68
|
+
* built from a host description, not from an Op config, and a caller that
|
|
69
|
+
* has neither should still be able to describe one. `dispatchTargets` takes
|
|
69
70
|
* plain `OpConfig`-shaped values from `@intentius/chant/op` (a dependency
|
|
70
71
|
* this lexicon already has via the `@intentius/chant` peer dependency),
|
|
71
72
|
* the same type `classifyOpVerbClass` itself takes.
|
|
@@ -74,7 +75,7 @@ import type { OpConfig, OpVerbClass } from "@intentius/chant/op";
|
|
|
74
75
|
import { Namespace, CronJob, ServiceAccount, Role, RoleBinding } from "../generated/index.js";
|
|
75
76
|
/**
|
|
76
77
|
* Mirrors `ConvergeOp`'s own `ConvergeDial`
|
|
77
|
-
* (`
|
|
78
|
+
* (`packages/core/src/op/composites/converge-op.ts`) structurally — see
|
|
78
79
|
* this module's Layering doc for why it's restated rather than imported.
|
|
79
80
|
*/
|
|
80
81
|
export type OperatorDial = "observe" | "reconcile" | "apply";
|
|
@@ -96,7 +97,7 @@ export interface OperatorStackConvergeHost {
|
|
|
96
97
|
/**
|
|
97
98
|
* OpConfigs for every op this ConvergeOp's rule table may `run()` — the
|
|
98
99
|
* sibling `*.op.ts` declarations its `run()` actions name. Used to derive
|
|
99
|
-
* least-privilege RBAC the same way `
|
|
100
|
+
* least-privilege RBAC the same way `OPS014` derives its build-time
|
|
100
101
|
* refusals. Omit or leave empty when every rule only `report()`s; the
|
|
101
102
|
* host still gets read-only RBAC for its own observation.
|
|
102
103
|
*/
|
|
@@ -153,7 +154,7 @@ export declare const DEFAULT_RESOURCE_RULES: OperatorRbacResourceRule[];
|
|
|
153
154
|
* Derive the highest verb class a host's ServiceAccount actually needs:
|
|
154
155
|
* the max, across `dispatchTargets`, of each target's own class — but only
|
|
155
156
|
* counting a target `dial` could ever actually dispatch (one it can't just
|
|
156
|
-
* gets reported, per `
|
|
157
|
+
* gets reported, per `OPS014`/`convergeTick`, and needs no elevated grant).
|
|
157
158
|
* A `dispatchTargets` entry that classifies `destructive` is refused
|
|
158
159
|
* outright rather than silently ignored — see this module's RBAC
|
|
159
160
|
* derivation doc on why a destructive target reaching this composite is
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"operator-stack.d.ts","sourceRoot":"","sources":["../../src/composites/operator-stack.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"operator-stack.d.ts","sourceRoot":"","sources":["../../src/composites/operator-stack.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
CHANGED
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* K8s environment → cluster binding — chant #1100.
|
|
3
3
|
*
|
|
4
4
|
* Every cloud lexicon binds an environment to a scope: AWS resolves `<env>`
|
|
5
|
-
* to a CloudFormation stack, Azure treats `<env>` as the resource group
|
|
6
|
-
*
|
|
5
|
+
* to a CloudFormation stack, Azure treats `<env>` as the resource group.
|
|
6
|
+
* Before this, k8s bound
|
|
7
7
|
* nothing — `describeResources` shelled out to `kubectl get` with no
|
|
8
8
|
* `--context`, so `chant lifecycle diff prod --live` read whichever cluster
|
|
9
9
|
* `kubectl config current-context` happened to point at.
|
|
@@ -40,8 +40,8 @@
|
|
|
40
40
|
* and the missing binding.
|
|
41
41
|
*
|
|
42
42
|
* `ChantConfig` uses `.passthrough()` in its Zod schema so the `k8s` key is
|
|
43
|
-
* accepted at runtime without core changes, exactly like `
|
|
44
|
-
* (see `lexicons/
|
|
43
|
+
* accepted at runtime without core changes, exactly like the `terraform` key
|
|
44
|
+
* (see `lexicons/terraform/src/config.ts`). The type side is the declaration
|
|
45
45
|
* merge at the bottom of this file — without it the snippet above compiles
|
|
46
46
|
* only until someone adds `satisfies ChantConfig`, which every example
|
|
47
47
|
* project does and which is the only thing type-checking the rest of the
|
|
@@ -49,7 +49,8 @@ import type { DeepArrayElement, DeepNormalizationHooks } from "@intentius/chant/
|
|
|
49
49
|
* Kubernetes-defaulted fields, per entity type, as index-erased property
|
|
50
50
|
* paths. Subtracted only where source never declared the property
|
|
51
51
|
* (`side === "live" && counterpart === "absent"`) — cdk-real-drift's default
|
|
52
|
-
* subtraction, same convention as AWS
|
|
52
|
+
* subtraction, same convention as the AWS and Azure tables
|
|
53
|
+
* (`AWS_SERVICE_DEFAULTS`, `AZURE_SERVICE_DEFAULTS`).
|
|
53
54
|
*
|
|
54
55
|
* Sparse and evidence-based rather than derived from the generated schema:
|
|
55
56
|
* the k8s OpenAPI spec this lexicon's codegen consumes
|
|
@@ -58,9 +59,8 @@ import type { DeepArrayElement, DeepNormalizationHooks } from "@intentius/chant/
|
|
|
58
59
|
* actually expressible today. Widening this table is additive and needs no
|
|
59
60
|
* contract change.
|
|
60
61
|
*
|
|
61
|
-
* `spec.strategy` is listed whole
|
|
62
|
-
*
|
|
63
|
-
* only the leaf would still recurse into the object, and a nested default the
|
|
62
|
+
* `spec.strategy` is listed whole rather than as `spec.strategy.type`, because
|
|
63
|
+
* pruning only the leaf would still recurse into the object, and a nested default the
|
|
64
64
|
* table does not separately name (`rollingUpdate.maxSurge`/`maxUnavailable`,
|
|
65
65
|
* both `"25%"` when `spec.strategy` is omitted entirely) would leave behind an
|
|
66
66
|
* empty `strategy: {}` — a value distinct from no `strategy` key at all, and
|
package/dist/deep-observe.d.ts
CHANGED
|
@@ -9,10 +9,10 @@
|
|
|
9
9
|
*
|
|
10
10
|
* ## What managedFields decides, and what it does not
|
|
11
11
|
*
|
|
12
|
-
* AWS
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
12
|
+
* The AWS and Azure rows both prune by a **static, entityType-keyed** table
|
|
13
|
+
* (`AWS_SERVICE_DEFAULTS`, `AZURE_SERVICE_DEFAULTS`): an ARN always looks like
|
|
14
|
+
* an ARN, `provisioningState` is always server-populated. Neither needs the
|
|
15
|
+
* specific live object in hand — it is exactly
|
|
16
16
|
* what `./deep-observe-hooks.ts`'s `k8sDeepNormalizationHooks` is, and it
|
|
17
17
|
* covers Kubernetes' *equivalent* static noise (`status`,
|
|
18
18
|
* `metadata.{uid,resourceVersion,generation,creationTimestamp}`, a handful of
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
* was controller noise. It silenced exactly the case the deep read exists
|
|
32
32
|
* for — `kubectl label deploy web team=platform` is foreign-owned
|
|
33
33
|
* (`kubectl-edit`) and undeclared, and never appeared in fieldDrift. The
|
|
34
|
-
* policy now (recorded on #1202) is:
|
|
34
|
+
* policy now (recorded on #1202, refined by #2160) is:
|
|
35
35
|
*
|
|
36
36
|
* 1. **Chant-owned** (`chant`, `chant:<stack>` — chant #1075, matched on the
|
|
37
37
|
* family so a stack rename does not stop recognizing its own history) is
|
|
@@ -41,18 +41,25 @@
|
|
|
41
41
|
* write currently holds the field, and a foreign write that overrides a
|
|
42
42
|
* value chant's manifest asks for is the thing `lifecycle diff --live`
|
|
43
43
|
* exists to surface. It reports as `changed`.
|
|
44
|
-
* 3. **
|
|
45
|
-
*
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
-
*
|
|
44
|
+
* 3. **Undeclared** — a path outside the declaration's claimed-field set
|
|
45
|
+
* (`@intentius/chant/claimed-fields`) — is reported as unclaimed and
|
|
46
|
+
* is not drift at all. Before #2160 it was `undeclared` drift that the
|
|
47
|
+
* accepted baseline had to absorb one path at a time; the declaration
|
|
48
|
+
* answers on the first read instead, so an HPA that owns `spec.replicas`
|
|
49
|
+
* on a Deployment whose source is silent about replicas is quiet with
|
|
50
|
+
* nothing recorded anywhere.
|
|
49
51
|
*
|
|
50
|
-
* So ownership decides nothing about *whether* a path is compared
|
|
51
|
-
*
|
|
52
|
-
*
|
|
53
|
-
*
|
|
54
|
-
*
|
|
55
|
-
*
|
|
52
|
+
* So ownership decides nothing about *whether* a path is compared, and since
|
|
53
|
+
* #2160 it no longer decides the verdict either — the declaration does. What
|
|
54
|
+
* it contributes is `fieldOwners` (#1189), and that is worth more here than
|
|
55
|
+
* anywhere else: on every other substrate a held field can only be reported
|
|
56
|
+
* as "not chant's", while here it is reported as `hpa-controller`'s or
|
|
57
|
+
* `kubectl-edit`'s by name, which is the difference between a controller
|
|
58
|
+
* doing its job and somebody bypassing the pipeline. Core takes the manager
|
|
59
|
+
* where this reader supplies one and falls back to the claim where it does
|
|
60
|
+
* not (a path inside a key-addressed list, which no `fieldsV1` entry names in
|
|
61
|
+
* that form). The only fields subtracted because a foreign manager wrote them
|
|
62
|
+
* are the well-known system ones on the static allowlist.
|
|
56
63
|
*
|
|
57
64
|
* ## Resolving a managedFields entry against a live array
|
|
58
65
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deep-observe.d.ts","sourceRoot":"","sources":["../src/deep-observe.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"deep-observe.d.ts","sourceRoot":"","sources":["../src/deep-observe.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmGG;AAGH,OAAO,KAAK,EACV,qBAAqB,EAGtB,MAAM,0BAA0B,CAAC;AAIlC,OAAO,EAAE,kBAAkB,EAAE,KAAK,aAAa,EAAE,MAAM,iCAAiC,CAAC;AACzF,OAAO,EAAuB,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAQvE,OAAO,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AASjE,OAAO,EAAE,yBAAyB,EAAE,kBAAkB,EAAE,KAAK,aAAa,EAAE,CAAC;AAE7E,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;IAChB,sFAAsF;IACtF,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAQD;;;;;;;GAOG;AACH,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,qBAAqB,EAC9B,OAAO,GAAE,YAAkC,GAC1C,OAAO,CAAC,qBAAqB,CAAC,CAgHhC"}
|
|
@@ -25,7 +25,7 @@ import { DEFAULT_IMPORT_TYPES } from "./api/sweep-types.js";
|
|
|
25
25
|
* reachable by naming it with `--selector type=...`. Defined in
|
|
26
26
|
* `./api/sweep-types.ts` and re-exported here, its original home — chant
|
|
27
27
|
* #1075's ownership-scoped prune needs the same list without pulling the
|
|
28
|
-
* import parser
|
|
28
|
+
* import parser in behind the apply activity.
|
|
29
29
|
*/
|
|
30
30
|
export { DEFAULT_IMPORT_TYPES };
|
|
31
31
|
export declare function exportResources(options: {
|
package/dist/integrity.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"algorithm": "sha256",
|
|
3
3
|
"artifacts": {
|
|
4
|
-
"manifest.json": "
|
|
4
|
+
"manifest.json": "5c4819e96d62042f7bd66f276c2d447f93dcb92105f1fce9a0b820249803c09d",
|
|
5
5
|
"meta.json": "8b999bc142f448b0b627ecdc9e2388bbe672c8a1f7aae5303135624cf2fe65e3",
|
|
6
6
|
"types/index.d.ts": "5f67de738adb455805e72600948940af9c664283785fb68c9fd8f5ea90d42cc3",
|
|
7
7
|
"rules/argo-appset-single-project.ts": "afa9f310753aa2d475f35012b13135b2dfaebed2a35d44edbe185ebc07673674",
|
|
@@ -62,8 +62,8 @@
|
|
|
62
62
|
"skills/chant-k8s-eks.md": "9e953d6a2c39518c4b797a2bf54ff5b4a33530503e5b6d66e35921e8f952432f",
|
|
63
63
|
"skills/chant-k8s-gke.md": "8938840bf9ef5ed58d6333fdd773b3dd54ecaf25a9df35e58f7f5c3355d4928f",
|
|
64
64
|
"skills/chant-k8s-aks.md": "e18f0e2b055f72cd7a37deaf258d7027c2d4d3e286e8fd4975b27a1f981a3ad9",
|
|
65
|
-
"skills/chant-k8s-argo.md": "
|
|
65
|
+
"skills/chant-k8s-argo.md": "24c9a85b78a2fc5c6657424baac9cc6d6caff6f47605b8146b2c0082133181cf",
|
|
66
66
|
"skills/chant-k8s-flux.md": "9670efc2e9854bd14686b5adeb707396b9030a4dcaee6529b30abf56efe2c50c"
|
|
67
67
|
},
|
|
68
|
-
"composite": "
|
|
68
|
+
"composite": "293e1809032d42cf01169debcfa6fd95d04dd9e66b2c08779b9463fdec798f9f"
|
|
69
69
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit-catalog.d.ts","sourceRoot":"","sources":["../../src/lint/audit-catalog.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAqD,KAAK,QAAQ,
|
|
1
|
+
{"version":3,"file":"audit-catalog.d.ts","sourceRoot":"","sources":["../../src/lint/audit-catalog.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAqD,KAAK,QAAQ,EAAgB,MAAM,gCAAgC,CAAC;AAGhI,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAyCpD,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prior art for these audit rules: the open-source tools whose checks cover the
|
|
3
|
+
* same condition, credited per rule. See packages/core/src/audit/prior-art.ts for
|
|
4
|
+
* the registry, the relation vocabulary, and why this is credit rather than
|
|
5
|
+
* authority. Kept by hand; the prior-art sweep (scripts/prior-art-sweep.ts) reports
|
|
6
|
+
* when a credited tool's index no longer lists a rule cited here.
|
|
7
|
+
*/
|
|
8
|
+
import type { Lineage } from "@intentius/chant/audit/catalog";
|
|
9
|
+
export declare const k8sAuditLineage: Record<string, Lineage[]>;
|
|
10
|
+
//# sourceMappingURL=audit-lineage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-lineage.d.ts","sourceRoot":"","sources":["../../src/lint/audit-lineage.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAC;AAE9D,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,CAqHrD,CAAC"}
|
package/dist/manifest.json
CHANGED
|
@@ -10,8 +10,8 @@
|
|
|
10
10
|
* `ResourceFetcher` for `waitForReady`.
|
|
11
11
|
*
|
|
12
12
|
* It stays **dependency-light** — primitives-only signature (app name /
|
|
13
|
-
* namespace / server), no generated Argo CRD types — so
|
|
14
|
-
*
|
|
13
|
+
* namespace / server), no generated Argo CRD types — so importing the lexicon's
|
|
14
|
+
* activity module at run time stays cheap.
|
|
15
15
|
*/
|
|
16
16
|
export interface WaitForArgoSyncArgs {
|
|
17
17
|
/** Argo Application name. */
|
|
@@ -29,7 +29,7 @@ export interface WaitForArgoSyncArgs {
|
|
|
29
29
|
insecure?: boolean;
|
|
30
30
|
/** kubectl context (used when `server` is not set). */
|
|
31
31
|
context?: string;
|
|
32
|
-
/** Poll interval in ms (default 15000).
|
|
32
|
+
/** Poll interval in ms (default 15000). */
|
|
33
33
|
intervalMs?: number;
|
|
34
34
|
}
|
|
35
35
|
/** The two status fields the activity gates on. */
|
|
@@ -52,7 +52,7 @@ export declare const defaultArgoStatusFetcher: ArgoStatusFetcher;
|
|
|
52
52
|
* `ArgoSyncFailedError` if it reaches a terminal unhealthy state (Degraded /
|
|
53
53
|
* Missing).
|
|
54
54
|
*
|
|
55
|
-
* Delegates the poll loop
|
|
55
|
+
* Delegates the poll loop and the ready/terminal evaluation to the
|
|
56
56
|
* generic `waitForReady` using the shared `argoproj.io/Application` readiness
|
|
57
57
|
* spec. The Argo `ArgoStatusFetcher` is adapted into a `ResourceFetcher` that
|
|
58
58
|
* shapes `{health, sync}` into the `status.health.status` / `status.sync.status`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"argo.d.ts","sourceRoot":"","sources":["../../../src/op/activities/argo.ts"],"names":[],"mappings":"AAMA;;;;;;;;;;;;;;GAcG;AAEH,MAAM,WAAW,mBAAmB;IAClC,6BAA6B;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,oEAAoE;IACpE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kEAAkE;IAClE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,uDAAuD;IACvD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,
|
|
1
|
+
{"version":3,"file":"argo.d.ts","sourceRoot":"","sources":["../../../src/op/activities/argo.ts"],"names":[],"mappings":"AAMA;;;;;;;;;;;;;;GAcG;AAEH,MAAM,WAAW,mBAAmB;IAClC,6BAA6B;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,oEAAoE;IACpE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kEAAkE;IAClE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,uDAAuD;IACvD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2CAA2C;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,mDAAmD;AACnD,MAAM,WAAW,aAAa;IAC5B,4FAA4F;IAC5F,MAAM,EAAE,MAAM,CAAC;IACf,iDAAiD;IACjD,IAAI,EAAE,MAAM,CAAC;CACd;AAED,2EAA2E;AAC3E,MAAM,MAAM,iBAAiB,GAAG,CAC9B,IAAI,EAAE,mBAAmB,EACzB,MAAM,CAAC,EAAE,WAAW,KACjB,OAAO,CAAC,aAAa,CAAC,CAAC;AAE5B,4EAA4E;AAC5E,qBAAa,mBAAoB,SAAQ,KAAK;gBAChC,OAAO,EAAE,MAAM;CAI5B;AA4CD,oEAAoE;AACpE,eAAO,MAAM,wBAAwB,EAAE,iBACkC,CAAC;AAE1E;;;;;;;;;;;;;GAaG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,mBAAmB,EACzB,MAAM,CAAC,EAAE,WAAW,EACpB,OAAO,GAAE,iBAA4C,GACpD,OAAO,CAAC,aAAa,CAAC,CAkCxB"}
|
|
@@ -1,21 +1,23 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* k8s Op activities — resolved by the core activity registry when a project's
|
|
3
|
-
* `chant.config.ts` lists the `k8s` lexicon. Relocated from the
|
|
3
|
+
* `chant.config.ts` lists the `k8s` lexicon. Relocated from the hosting lexicon
|
|
4
4
|
* (#809) so Kubernetes-facing imperative activities live with their product:
|
|
5
5
|
* - kubectlApply — server-side apply a rendered manifest (and, since chant
|
|
6
6
|
* #1075, prune chant-owned objects it no longer declares; `applyManifest`
|
|
7
|
-
* is the same work with a report of what it did, which is what
|
|
8
|
-
*
|
|
7
|
+
* is the same work with a report of what it did, which is what core's
|
|
8
|
+
* `nativeApply` dispatcher calls for a kubectl target)
|
|
9
9
|
* - waitForArgoSync — block until an Argo CD Application is Healthy && Synced
|
|
10
10
|
*
|
|
11
11
|
* k3dUp / k3dDown moved again, to the k3d lexicon (chant #1410) — a lexicon
|
|
12
12
|
* owns its own product's activities, and k3d is its own product now. Projects
|
|
13
13
|
* using them list `k3d` in `lexicons`; loadActivities(["k3d"]) provides them.
|
|
14
14
|
*
|
|
15
|
-
* The step builders (kubectlApply, k3dUp, k3dDown) stay in core
|
|
16
|
-
*
|
|
17
|
-
* dependency-light — it shells out to a CLI and does not import the
|
|
18
|
-
* surface — so
|
|
15
|
+
* The step builders (kubectlApply, k3dUp, k3dDown) stay in core and reach
|
|
16
|
+
* authors through `@intentius/chant/op` like the other core builders. Each
|
|
17
|
+
* activity is dependency-light — it shells out to a CLI and does not import the
|
|
18
|
+
* k8s declarable surface — so `loadActivities`
|
|
19
|
+
* (`packages/core/src/op/activity-registry.ts`), which imports this module at
|
|
20
|
+
* run time, pulls in nothing expensive.
|
|
19
21
|
*/
|
|
20
22
|
export { kubectlApply, applyManifest, readManifestDocuments } from "./kubectl.js";
|
|
21
23
|
export type { KubectlApplyArgs, ApplyManifestResult, AppliedRef, ApplyDeleteMode } from "./kubectl.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/op/activities/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/op/activities/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAC/E,YAAY,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAMpG,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,YAAY,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAEhE,OAAO,EAAE,eAAe,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,MAAM,QAAQ,CAAC;AACxF,YAAY,EAAE,mBAAmB,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAC;AAEpF,OAAO,EACL,YAAY,EACZ,sBAAsB,EACtB,kBAAkB,EAClB,oBAAoB,EACpB,YAAY,EACZ,OAAO,EACP,aAAa,EACb,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,gBAAgB,EAChB,eAAe,EACf,aAAa,EACb,cAAc,EACd,cAAc,EACd,SAAS,GACV,MAAM,kBAAkB,CAAC;AAW1B,OAAO,EAAE,oBAAoB,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AACrG,YAAY,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC"}
|
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
*
|
|
4
4
|
* chant #1074 moved this off `kubectl apply -f`. The activity contract is
|
|
5
5
|
* unchanged (a manifest path, an optional context, `Promise<void>`, the
|
|
6
|
-
* `longInfra` profile
|
|
7
|
-
*
|
|
8
|
-
* reason.
|
|
6
|
+
* `longInfra` profile) because an Op step names the activity by its export
|
|
7
|
+
* name and core's registry resolves it there; what changed is underneath. The
|
|
8
|
+
* name is kept for the same reason.
|
|
9
9
|
*
|
|
10
10
|
* chant #1075 finished the job on two axes:
|
|
11
11
|
*
|
|
@@ -35,14 +35,14 @@ import { type K8sConnector } from "../../api/connect.js";
|
|
|
35
35
|
/**
|
|
36
36
|
* How the apply treats chant-owned objects that are no longer declared. The
|
|
37
37
|
* same three values `nativeApply` has always taken; `gated` differs from
|
|
38
|
-
* `owned-only` only in that
|
|
39
|
-
* the composite's business, not this activity's.
|
|
38
|
+
* `owned-only` only in that an approval gate runs before this activity does,
|
|
39
|
+
* which is the composite's business, not this activity's.
|
|
40
40
|
*/
|
|
41
41
|
export type ApplyDeleteMode = "never" | "owned-only" | "gated";
|
|
42
42
|
export interface KubectlApplyArgs {
|
|
43
43
|
/**
|
|
44
44
|
* Path to a manifest file, or a directory of them. With `documents` given,
|
|
45
|
-
* this becomes only the human-facing label the
|
|
45
|
+
* this becomes only the human-facing label the step's log lines carry
|
|
46
46
|
* (e.g. `kustomize:<dir>`), and nothing is read from disk.
|
|
47
47
|
*/
|
|
48
48
|
manifest: string;
|
|
@@ -151,7 +151,7 @@ export declare function resolveFieldManager(args: KubectlApplyArgs): Promise<str
|
|
|
151
151
|
export declare function applyManifest(args: KubectlApplyArgs, signal?: AbortSignal, connect?: K8sConnector): Promise<ApplyManifestResult>;
|
|
152
152
|
/**
|
|
153
153
|
* Apply every document in `args.manifest`.
|
|
154
|
-
* Uses longInfra profile
|
|
154
|
+
* Uses the longInfra profile: 20m timeout, three attempts backing off from 30s.
|
|
155
155
|
*/
|
|
156
156
|
export declare function kubectlApply(args: KubectlApplyArgs, signal?: AbortSignal, connect?: K8sConnector): Promise<void>;
|
|
157
157
|
//# sourceMappingURL=kubectl.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kubectl.d.ts","sourceRoot":"","sources":["../../../src/op/activities/kubectl.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;
|
|
1
|
+
{"version":3,"file":"kubectl.d.ts","sourceRoot":"","sources":["../../../src/op/activities/kubectl.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAWH,OAAO,KAAK,EAAa,SAAS,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,EAAuB,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAK3E;;;;;GAKG;AACH,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,YAAY,GAAG,OAAO,CAAC;AAE/D,MAAM,WAAW,gBAAgB;IAC/B;;;;OAIG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB;;;;;;;OAOG;IACH,SAAS,CAAC,EAAE,SAAS,EAAE,CAAC;IACxB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;;;OAIG;IACH,UAAU,CAAC,EAAE,eAAe,CAAC;IAC7B;;;;;;;OAOG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,sFAAsF;IACtF,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,oCAAoC;AACpC,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,sCAAsC;AACtC,MAAM,WAAW,mBAAmB;IAClC,qDAAqD;IACrD,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,sFAAsF;IACtF,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB;;;;;;;OAOG;IACH,QAAQ,CAAC,EAAE,UAAU,EAAE,CAAC;CACzB;AAED,+EAA+E;AAC/E,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAiB7E;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAEjF;AAqHD;;;;;;;GAOG;AACH,wBAAsB,aAAa,CACjC,IAAI,EAAE,gBAAgB,EACtB,MAAM,CAAC,EAAE,WAAW,EACpB,OAAO,GAAE,YAAkC,GAC1C,OAAO,CAAC,mBAAmB,CAAC,CAqD9B;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAChC,IAAI,EAAE,gBAAgB,EACtB,MAAM,CAAC,EAAE,WAAW,EACpB,OAAO,GAAE,YAAkC,GAC1C,OAAO,CAAC,IAAI,CAAC,CAEf"}
|
|
@@ -4,8 +4,8 @@ import { type K8sConnector } from "../../api/connect.js";
|
|
|
4
4
|
* ready, driven by a data-only **readiness spec** rather than per-CRD code.
|
|
5
5
|
*
|
|
6
6
|
* Like `waitForArgoSync`, this activity is intentionally **dependency-light**:
|
|
7
|
-
* its signature is primitives + a plain readiness spec, so
|
|
8
|
-
* loads
|
|
7
|
+
* its signature is primitives + a plain readiness spec, so the activity module
|
|
8
|
+
* loads without pulling in the generated CRD declarable surface. It reads the
|
|
9
9
|
* resource and evaluates the spec's predicates. It generalizes the bespoke
|
|
10
10
|
* `waitForArgoSync` / `waitForStack` waits — see #365.
|
|
11
11
|
*
|
|
@@ -99,7 +99,7 @@ export interface WaitForReadyArgs {
|
|
|
99
99
|
group?: string;
|
|
100
100
|
/** Explicit readiness spec — wins over the registry/default. */
|
|
101
101
|
spec?: ReadinessSpec;
|
|
102
|
-
/** Poll interval in ms (default 15000).
|
|
102
|
+
/** Poll interval in ms (default 15000). */
|
|
103
103
|
intervalMs?: number;
|
|
104
104
|
}
|
|
105
105
|
/** Pluggable resource reader — overridden in tests with a fake. */
|
|
@@ -121,8 +121,9 @@ export declare function apiResourceFetcher(connect?: K8sConnector): ResourceFetc
|
|
|
121
121
|
export declare const defaultResourceFetcher: ResourceFetcher;
|
|
122
122
|
/**
|
|
123
123
|
* Poll until the resource satisfies its readiness spec. Throws
|
|
124
|
-
* `ReadinessFailedError` on a terminal state
|
|
125
|
-
*
|
|
124
|
+
* `ReadinessFailedError` on a terminal state, which the `k8sWait` profile lists
|
|
125
|
+
* as non-retryable, so a resource that will never become ready fails on the
|
|
126
|
+
* first attempt instead of burning the profile's 15m timeout three times.
|
|
126
127
|
*
|
|
127
128
|
* @param fetcher injectable reader (defaults to kubectl). Tests pass a fake to
|
|
128
129
|
* drive not-ready → ready / terminal transitions.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wait-for-ready.d.ts","sourceRoot":"","sources":["../../../src/op/activities/wait-for-ready.ts"],"names":[],"mappings":"AACA,OAAO,EAAuB,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAE3E;;;;;;;;;;;;;;;;;GAiBG;AAIH,sEAAsE;AACtE,MAAM,WAAW,cAAc;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,4DAA4D;IAC5D,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,2DAA2D;AAC3D,MAAM,WAAW,SAAS;IACxB,mCAAmC;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,iDAAiD;IACjD,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IACnC,4CAA4C;IAC5C,KAAK,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;CAEhC;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,oBAAoB;IACnC,aAAa,EAAE,MAAM,CAAC;IACtB,4DAA4D;IAC5D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,2DAA2D;IAC3D,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,MAAM,cAAc,GAAG,cAAc,GAAG,SAAS,GAAG,oBAAoB,CAAC;AAE/E,MAAM,WAAW,aAAa;IAC5B,kDAAkD;IAClD,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,oEAAoE;IACpE,QAAQ,CAAC,EAAE,cAAc,EAAE,CAAC;IAC5B;;;OAGG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,EAAE,aAG/B,CAAC;AA4CF,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CA2C7D,CAAC;AAEF,kFAAkF;AAClF,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,aAAa,CAEnF;AAyDD,qFAAqF;AACrF,wBAAgB,OAAO,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,GAAG,OAAO,CAGlE;AAED,gFAAgF;AAChF,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,GAAG,cAAc,GAAG,SAAS,CAE3F;AAID,6EAA6E;AAC7E,qBAAa,oBAAqB,SAAQ,KAAK;gBACjC,OAAO,EAAE,MAAM;CAI5B;AAED,MAAM,WAAW,gBAAgB;IAC/B,gGAAgG;IAChG,IAAI,EAAE,MAAM,CAAC;IACb,qBAAqB;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,2CAA2C;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,6EAA6E;IAC7E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gEAAgE;IAChE,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,
|
|
1
|
+
{"version":3,"file":"wait-for-ready.d.ts","sourceRoot":"","sources":["../../../src/op/activities/wait-for-ready.ts"],"names":[],"mappings":"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"}
|
package/dist/op/builders.d.ts
CHANGED
|
@@ -18,20 +18,20 @@
|
|
|
18
18
|
* earlier step's declared output.
|
|
19
19
|
*
|
|
20
20
|
* `core`'s own `kubectlApply`/`waitForReady`/`ensureSecret` (in
|
|
21
|
-
* `@intentius/chant/op`,
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
21
|
+
* `@intentius/chant/op`, the lexicon-agnostic single-import barrel) are
|
|
22
|
+
* UNCHANGED and produce byte-identical `ActivityStep` output for the same
|
|
23
|
+
* inputs — these are purely additive. Deliberately not swapped into core's
|
|
24
|
+
* barrel: that would make `@intentius/chant` depend on this package (and on
|
|
25
|
+
* helm, for `helmInstall`) at runtime, so a project that never touches
|
|
26
|
+
* Kubernetes would install both just to import anything from `op`. That is
|
|
27
|
+
* exactly the "core stays product-agnostic" property the
|
|
28
28
|
* `op/activities/index.ts` module docs across this repo call out on purpose
|
|
29
|
-
* (activities
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
* already depends on; existing `@intentius/chant
|
|
34
|
-
*
|
|
29
|
+
* (activities live in per-product lexicons for this reason; the step-builder
|
|
30
|
+
* layer shouldn't reintroduce the coupling from the other direction). An
|
|
31
|
+
* author who wants the typed surface imports it from here —
|
|
32
|
+
* `@intentius/chant-lexicon-k8s` — which a project using `kubectlApply`
|
|
33
|
+
* already depends on; existing `@intentius/chant/op` imports keep working
|
|
34
|
+
* exactly as before, opting in only if the import is changed.
|
|
35
35
|
*/
|
|
36
36
|
import { type ActivityStep, type NamedActivityStep, type WithStepRefs } from "@intentius/chant/op";
|
|
37
37
|
import type { KubectlApplyArgs } from "./activities/kubectl.js";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
skill: chant-k8s-argo
|
|
3
|
-
description: Argo CD composites for GitOps reconciliation — ArgoAppFor, ArgoAppSetForRegions, AppProject scoping, cluster registration, and
|
|
3
|
+
description: Argo CD composites for GitOps reconciliation — ArgoAppFor, ArgoAppSetForRegions, AppProject scoping, cluster registration, and how a deploy splits between Argo and a chant Op
|
|
4
4
|
user-invocable: true
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -14,9 +14,9 @@ Chant authors typed infrastructure into manifests. Argo CD continuously reconcil
|
|
|
14
14
|
|---|---|---|
|
|
15
15
|
| **Chant** | Authoring typed infra → manifests | the lexicons |
|
|
16
16
|
| **Argo CD** | Continuously reconciling declarative manifests (the apply layer) | `ArgoAppFor` / `ArgoAppSetForRegions` |
|
|
17
|
-
| **
|
|
17
|
+
| **A chant Op** | Procedural steps Argo can't express: ordering, human gates, one-shot RPCs | an `Op` in the project, plus this lexicon's `waitForArgoSync` |
|
|
18
18
|
|
|
19
|
-
Rule of thumb: **if it's declarative and converges, let Argo reconcile it. If it's a procedure with ordering, gates, or out-of-band steps,
|
|
19
|
+
Rule of thumb: **if it's declarative and converges, let Argo reconcile it. If it's a procedure with ordering, gates, or out-of-band steps, write it as a chant Op and run it from CI or a steward.** Prefer Argo CD over Argo Workflows; the procedural layer stays an Op.
|
|
20
20
|
|
|
21
21
|
## Prerequisites
|
|
22
22
|
|
|
@@ -138,9 +138,9 @@ Produces a `Secret` labelled `argocd.argoproj.io/secret-type: cluster`. After th
|
|
|
138
138
|
|
|
139
139
|
---
|
|
140
140
|
|
|
141
|
-
##
|
|
141
|
+
## Splitting a deploy between Argo and an Op
|
|
142
142
|
|
|
143
|
-
When a deploy has both declarative and procedural parts, let each layer own what it's good at. Example
|
|
143
|
+
When a deploy has both declarative and procedural parts, let each layer own what it's good at. Example, the multi-region CockroachDB deploy:
|
|
144
144
|
|
|
145
145
|
| Step | Owner | Why |
|
|
146
146
|
|---|---|---|
|
|
@@ -148,16 +148,30 @@ When a deploy has both declarative and procedural parts, let each layer own what
|
|
|
148
148
|
| Install ESO / operators (Helm) | **Argo** | Declarative Helm source |
|
|
149
149
|
| Apply per-cluster K8s manifests | **Argo** (`ApplicationSet`) | One App per workload cluster |
|
|
150
150
|
| Wait for workloads Healthy | **Argo** (`Health=Healthy`) | Subsumed by Application health |
|
|
151
|
-
| Wait for DNS delegation | **
|
|
152
|
-
| Generate + push TLS certs | **
|
|
153
|
-
| `cockroach init`, configure regions | **
|
|
154
|
-
|
|
155
|
-
|
|
151
|
+
| Wait for DNS delegation | **an Op** | Out of band, and a human confirms it |
|
|
152
|
+
| Generate + push TLS certs | **an Op** | One-shot procedure, secrets not in git |
|
|
153
|
+
| `cockroach init`, configure regions | **an Op** | Ordered one-shot RPCs |
|
|
154
|
+
|
|
155
|
+
Argo owns the sync. The Op owns the ordering and the gates: its phases run in
|
|
156
|
+
sequence in one process (`packages/core/src/op/local-executor.ts`), and a `gate`
|
|
157
|
+
step reads the gate ledger, so a run that reaches a gate nobody has approved
|
|
158
|
+
records the pending fact, ends with status `gated` and exits 3. Someone runs
|
|
159
|
+
`chant approve <op> <gate>`, the next run reads the resolution and walks
|
|
160
|
+
through. CI is what runs the Op, on whatever cadence the Op's `schedule`
|
|
161
|
+
names.
|
|
162
|
+
|
|
163
|
+
To make a step wait on Argo, use this lexicon's `waitForArgoSync` activity. It is
|
|
164
|
+
exported from `lexicons/k8s/src/op/activities/index.ts`, and the core activity
|
|
165
|
+
registry resolves it by export name once `k8s` is in the project's `lexicons`.
|
|
166
|
+
Give the step core's `argoSync` profile
|
|
167
|
+
(`packages/core/src/op/activity-profiles.ts`): a 30m timeout, five attempts
|
|
168
|
+
backing off from 10s, and `ArgoSyncFailedError` marked non-retryable so a
|
|
169
|
+
terminally unhealthy Application fails fast instead of polling to the cap.
|
|
156
170
|
|
|
157
171
|
```typescript
|
|
158
|
-
// In
|
|
159
|
-
|
|
160
|
-
//
|
|
172
|
+
// In an Op phase:
|
|
173
|
+
activity("waitForArgoSync", { appName: "east-crdb", namespace: "argocd" }, "argoSync"),
|
|
174
|
+
// Later steps in the phase run once the workloads are Healthy.
|
|
161
175
|
```
|
|
162
176
|
|
|
163
177
|
`waitForArgoSync` is dependency-free — it polls the Application's status (`health=Healthy && sync=Synced`) and never imports the Argo CRD types.
|