@mark1russell7/kind 0.4.1 → 0.6.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 CHANGED
@@ -90,6 +90,9 @@ The tests read three real records of `/1` (`test/records/`): a cell that holds,
90
90
  - `listener_modified` counts each update of a listener, and `listener_in_place_updated` counts each update of its filter chains only.
91
91
  - Each change of the counters gives an `lds` line with the start of the poll before it. The first line of a poller has no poll before it, thus it is no update (`updatesOf`).
92
92
  - **The injector of each node** is the image of the harness, in the PID namespace of the node. `crictl` on the node gives the PID of a container, and `nsenter -n` enters the network namespace of its pod. The injector of the harness then applies its rules there.
93
+ - From 0.5.0, the target `servers` puts a rule in the namespace of each replica, with each client pod as a peer. A REJECT resets only the sender of the segment that it matches, thus the rule goes where the segments of the clients arrive.
94
+ - The rules of all replicas commit at one instant on CLOCK_MONOTONIC (`--at`, 700 ms after the start). Thus no client meets one replica with the rule and another without it. The clear uses the PIDs of the fault again, thus the heal comes soon after its hold.
95
+ - The lab reads the tables of each replica with their counters (`tables`): the nat table after the fault, and the filter table before the clear. A `tables` line in the record shows if the rule matched the clients beside the rules of istio-cni.
93
96
  - **The watcher** is a container on the network of the cluster. It watches the pods, the EndpointSlices and the events through the API, and it follows the log of each pod of the cell.
94
97
  - From 0.3.0, it also follows the sidecar of Istio (`istio-proxy`), and a pod line gives the state of the sidecar (`sc`). Each line of the sidecar becomes a `proxy` line, stamped at its arrival. Its own stamps are of the wall clock, thus no band reads them.
95
98
  - The access line of a call that succeeded at its first try is only counted, in a `proxy-ok` line each second. The record keeps each failure, each retry and each local reply, with its response flags and its upstream host.
@@ -118,15 +121,22 @@ A declaration that can be null changes the type `KindCell`. That is a breaking c
118
121
 
119
122
  From 0.3.0, a cell can name a mesh (`mesh`): Istio 1.31.3 in its cluster. This is the template `T15`, the lifecycle of T07 through two mesh hops.
120
123
 
121
- - **The field.** `mesh.flavor` is the install: `sidecar` is istiod only. `mesh.mode` is the data plane of the pods of the cell. The flavor `ambient` comes in step 3 of the plan, and the lab refuses it until then.
124
+ - **The field.** `mesh.flavor` is the install: `sidecar` is istiod only, and `ambient` is istiod, istio-cni and ztunnel. `mesh.mode` is the data plane of the pods of the cell.
122
125
  - **The cluster.** The cells of one kube-proxy mode, one node count and one mesh flavor share a cluster. `shardOf` keeps them together, and in each mode the cells with no mesh come first.
123
- - **The install.** `installMesh` writes the IstioOperator of the flavor (`istioOperator`), and `istioctl install` applies it with the kubeconfig of the cluster. Then the lab waits for istiod.
126
+ - **The install.** `installMesh` writes the IstioOperator of the flavor (`istioOperator`), and `istioctl install` applies it with the kubeconfig of the cluster. Then the lab waits for each workload of the flavor (`MESH_WORKLOADS`). A failed install gives the pods of istio-system and the log of istio-cni in its error.
124
127
  - **The values.** The profile is `minimal`, because the profile `default` also has an ingress gateway. The pod of istiod requests 256 MiB, with one replica and no autoscaler. The access log of each sidecar goes to its output as JSON (`ACCESS_LOG_FORMAT`).
125
128
  - **The images.** `ISTIO_IMAGES` pins istiod and the proxy by the digest of their index on Docker Hub. The lab pulls each one by its digest and tags it with that digest (`localPin`). Then `kind load` puts it on each node.
126
129
  - **No pull.** Each image is a full reference, thus the charts use it as it is. The init container of the injector gets the image of the proxy too. `imagePullPolicy` is `Never`, thus an image that the lab did not load fails the install.
127
130
  - **The namespace.** In the sidecar mode, the namespace of the cell has the label `istio-injection=enabled` (`namespaceObject`). The injector then puts a native sidecar in each pod: an init container that runs beside the app, because each kubelet is at least 1.33.
128
131
  - **The probes.** The injector changes the gRPC probe of grpc-go into an HTTP probe of pilot-agent. Then pilot-agent sends the gRPC check to the app, with the service of the probe.
129
132
 
133
+ From 0.5.0, the lab installs the flavor `ambient` too:
134
+
135
+ - **The values.** The profile is `ambient`: istiod, istio-cni and ztunnel on each node, and no gateway. `ISTIO_IMAGES` also pins istio-cni and ztunnel, and `MESH_IMAGES` gives the images of each flavor. The chart of ztunnel reads only its own `imagePullPolicy`, thus the operator sets it to `Never` there too.
136
+ - **The namespace.** In the ambient mode, the namespace of the cell has the label `istio.io/dataplane-mode=ambient`. Then istio-cni redirects the traffic of each pod to ztunnel in the network namespace of the pod. A pod has no sidecar.
137
+ - **The kernel.** istio-cni writes iptables rules in each pod and on each node. Thus `kind.yml` loads their modules first, and an ambient cell waits when one does not load.
138
+ - **The log of ztunnel.** For a cell in the ambient mode, the watcher follows each ztunnel pod in istio-system (`followsZtunnel`). Each line of its log becomes a `ztunnel` line, stamped at its arrival, and each ztunnel pod is a `ztunnel-pod` line. No band reads them.
139
+
130
140
  A new member of the union `Template` breaks a reader that switches on it. That is a breaking change before 1.0.0, thus the version is 0.3.0. The record format stays `/2`, with the optional field `mesh`. A judge before 0.3.0 cannot read a record of T15.
131
141
 
132
142
  ## The image
@@ -142,6 +152,8 @@ The lab image (`image/`) holds the service of a cell on `@mark1russell7/service`
142
152
  - **The seams** of the service are a flag file that fails its liveness check, and SIGUSR2. SIGUSR2 blocks its event loop for the time in a file.
143
153
  - **The clients** (`client.mjs`) send requests on new connections to the ClusterIP. Each request gives one line with its outcome: ok, 503, refused, reset, timeout or unreachable. From 0.1.3, each line also gives the local port of its connection (`lp`), a refused one's too. A conntrack entry is per port. Thus the requests on the port of a failure show the connection before it, and the pod that it went to.
144
154
  - **The gRPC clients** (`client-grpc.mjs`) hold one channel of grpc-js 1.14.6 to the ClusterIP, and send a call of `grpc.health.v1.Health/Check` each interval on it. Each call gives the line of a request of `client.mjs`, with the pod that answered (the header `x-pod`). A call that fails at once names the errno of the last connect: refused, reset or unreachable. A call of grpc-js has no deadline at its defaults. Thus a call with no answer in the timeout is a timeout, and the client cancels it.
155
+ - From 0.6.0, each socket of the channel also gives a `sock` line at its connect and at its close (`client-lines.ts`). Each line gives the local port of the socket (`lp`). The close line keeps the port of the connect, and it gives the code of the error of the socket (`err`), or null.
156
+ - From 0.6.0, SIGUSR1 stops the calls of the client, and SIGUSR2 starts them again. Each signal gives a `gap` line. The channel and its socket stay open in the gap. A listener of SIGUSR1 replaces the start of the inspector of Node at that signal.
145
157
 
146
158
  ## The triggers
147
159
 
@@ -156,12 +168,13 @@ The lab image (`image/`) holds the service of a cell on `@mark1russell7/service`
156
168
  | `crash` | SIGKILL of the process of the service, from the node |
157
169
  | `liveness-restart` | the flag file that fails the liveness check of the first replica |
158
170
  | `freeze-process` | SIGSTOP and SIGCONT: of kube-proxy on one node across a deletion (T07), or of Redis (T18) |
159
- | `rst`, `blackhole` | the injector of the harness in the namespace of Redis, with each replica as a peer |
171
+ | `rst`, `blackhole` | the injector of the harness in the namespace of Redis, with each replica as a peer. In T15, the injector in the namespace of each replica, with each client pod as a peer (the target `servers`) |
160
172
  | `peer-gone-without-close` | a black hole on Redis, then no Redis pod: its namespace goes away with its rules |
161
173
  | `app-stall` | the event loop of the first replica blocked |
162
174
  | `rollout` | no Redis pod, then a rolling update |
163
175
  | `cpu-throttle` | `cpu.max` in the cgroup of the container of the first replica |
164
176
  | `authorization-policy` | `kubectl apply` of a DENY AuthorizationPolicy on the server pods for the principal of an account (`account`, the account `default` of the clients when not given), then `kubectl delete` after the hold |
177
+ | `idle` | SIGUSR1 to the gRPC client of each client pod, and SIGUSR2 after the hold: a gap of the calls (the target `clients`). The restore sends SIGUSR2 again |
165
178
 
166
179
  A cgroup path that is not the scope of one container is refused. A write to the root of the node throttles or freezes each pod of the node.
167
180
 
@@ -209,6 +222,17 @@ From 0.4.0, a window can count from the heal (`heal`), the first act that ends t
209
222
  - A denial after the window, before the last update after the delete and one more call, is a `tail`. A denied call has no pod, because the sidecar answers it. Thus the judge reads the last update of each server sidecar.
210
223
  - `calibrationOf` gives the updates after the apply by node, and the updates after the delete (`heal`).
211
224
 
225
+ From 0.6.0, the prediction `ends` is the end of the socket of each client, from the `sock` lines. A client of the run is a client with an answer before the reference.
226
+
227
+ - With a band, the first close of a socket of each client after the reference must be in the band ± δ. It must be the socket of its last answer. The main value is the middle of these times, in `s`.
228
+ - With no band, no socket of a client can close after the reference. The first request of each client after the heal must be `ok` on the socket of its last answer. The main value is the count of the closes, in `{socket}`.
229
+ - With a window (`window`), the failed requests must also agree with that window. The observation lasts until each socket can end, and until each request of the window ended.
230
+ - The facts of a run give the first close of each client after the reference (`closes`).
231
+
232
+ A new member of the union `Prediction`, `ends`, and a new member of the union `TriggerKind`, `idle`, break a reader that switches on them. The union `Target` has the new member `clients` too. Each is a breaking change before 1.0.0, thus the version is 0.6.0. The record format stays `/2`, with the optional field `closes`: the lines `sock` and `gap` are new lines of a run.
233
+
234
+ A new member of the union `Target`, `servers`, breaks a reader that switches on it. `KindLab` also has a new method, `tables`, which each implementation must have. Each is a breaking change before 1.0.0, thus the version is 0.5.0. The record format stays `/2`: the lines `tables`, `ztunnel` and `ztunnel-pod` are new lines of a run.
235
+
212
236
  A new member of the union `TriggerKind` breaks a reader that switches on it. That is a breaking change before 1.0.0, thus the version is 0.4.0. The record format stays `/2`, with the optional fields `account`, `outcomes`, `updates` and `healUpdates`, and the reference `heal`.
213
237
 
214
238
  A preStop sleep that is longer than the grace is a command in the container (`sh -c "sleep 60"`). The API server refuses a sleep action that is longer than the grace.
package/build/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { $ as updatesOf, $t as Replica, A as TriggerV1, At as transitionOf, B as RunCheck, Bt as showBand, C as KindCellResult, Ct as rulesOf, D as PredictionV1, Dt as sliceEmptyOf, E as LoadSample, Et as sliceDropOf, F as KIND_NOISE, Ft as REDIS, G as judgeKind, Gt as KubeletProbe, H as checkRun, Ht as Declaration, I as KindDecision, It as SERVER, J as propagationOf, Jt as MeshMode, K as observationAfter, Kt as Mesh, L as KindVerdict, Lt as bandOf, M as upgrade, Mt as HEALTH_PORT, N as upgradeCell, Nt as LOG_LABEL, O as RunCheckV1, Ot as slicesOf, P as Deleted, Pt as PORT, Q as unitOf, Qt as Reference, R as LAST_SLACK, Rt as seconds, S as KindCellRecordV1, St as restartsAt, T as KindVerdictV1, Tt as signalsOf, U as deletionsOf, Ut as KindCell, V as RunFacts, Vt as Band, W as factsOf, Wt as KindRun, X as referenceOf, Xt as Prediction, Y as propagationSource, Yt as PodSettings, Z as reusesReset, Zt as RedisDeclaration, _ as ClusterManifest, _n as nodeNames, _t as outcomesOf, a as STAGES, an as Workload, at as Request, b as FORMAT_V1, bt as recordsOf, c as readRecord, cn as KindScenario, ct as backendsAt, d as calibrationOf, dn as NodeImage, dt as deletionOf, en as ResetReuse, et as Endpoint, f as cellsTable, fn as cidrOverlap, ft as dropOf, g as BandV1, gn as kubeProxyPatch, gt as kernelCounts, h as timeSpread, hn as kindConfig, ht as intakeOf, i as quantileOf, in as TriggerKind, it as RecordLine, j as judge, jt as CLIENT, k as RunFactsV1, kt as stoppingOf, l as Judged, ln as KubeProxyMode, lt as byClients, m as predictionText, mn as goDuration, mt as failuresOf, n as medianInterval, nn as Template, nt as PodLine, o as kindCellRecordSchema, on as KUBE_PROXY_MODES, ot as RulesLine, p as medianText, pn as cidrRange, pt as emptyOf, q as observationEnd, qt as MeshFlavor, r as middle, rn as Trigger, rt as PropagationSource, s as kindCellRecordV1Schema, sn as KindConfig, st as SliceLine, t as RELATIVE, tn as Stack, tt as Line, u as TimeSpread, un as NODE_IMAGES, ut as byNode, v as EnvironmentManifest, vn as scenario, vt as podsAt, w as KindCellV1, wt as signalOf, x as KindCellRecord, xt as requestsOf, y as FORMAT, yn as scenarioProblems, yt as podsOf, z as Propagated, zt as secondsOf } from "./judge-DMuI3aDn.js";
1
+ import { $ as updatesOf, $t as RedisDeclaration, A as TriggerV1, At as socketsOf, B as RunCheck, Bt as seconds, C as KindCellResult, Ct as restartsAt, D as PredictionV1, Dt as sliceDropOf, E as LoadSample, Et as signalsOf, F as KIND_NOISE, Ft as LOG_LABEL, G as judgeKind, Gt as KindCell, H as checkRun, Ht as showBand, I as KindDecision, It as PORT, J as propagationOf, Jt as Mesh, K as observationAfter, Kt as KindRun, L as KindVerdict, Lt as REDIS, M as upgrade, Mt as transitionOf, N as upgradeCell, Nt as CLIENT, O as RunCheckV1, Ot as sliceEmptyOf, P as Deleted, Pt as HEALTH_PORT, Q as unitOf, Qt as Prediction, R as LAST_SLACK, Rt as SERVER, S as KindCellRecordV1, Sn as scenarioProblems, St as requestsOf, T as KindVerdictV1, Tt as signalOf, U as deletionsOf, Ut as Band, V as RunFacts, Vt as secondsOf, W as factsOf, Wt as Declaration, X as referenceOf, Xt as MeshMode, Y as propagationSource, Yt as MeshFlavor, Z as reusesReset, Zt as PodSettings, _ as ClusterManifest, _n as goDuration, _t as kernelCounts, a as STAGES, an as Trigger, at as Request, b as FORMAT_V1, bn as nodeNames, bt as podsOf, c as readRecord, cn as Workload, ct as SocketLine, d as calibrationOf, dn as KindScenario, dt as byNode, en as Reference, et as Endpoint, f as cellsTable, fn as KubeProxyMode, ft as deletionOf, g as BandV1, gn as cidrRange, gt as intakeOf, h as timeSpread, hn as cidrOverlap, ht as failuresOf, i as quantileOf, in as Template, it as RecordLine, j as judge, jt as stoppingOf, k as RunFactsV1, kt as slicesOf, l as Judged, ln as KUBE_PROXY_MODES, lt as backendsAt, m as predictionText, mn as NodeImage, mt as emptyOf, n as medianInterval, nn as ResetReuse, nt as PodLine, o as kindCellRecordSchema, on as TriggerKind, ot as RulesLine, p as medianText, pn as NODE_IMAGES, pt as dropOf, q as observationEnd, qt as KubeletProbe, r as middle, rn as Stack, rt as PropagationSource, s as kindCellRecordV1Schema, sn as WindowPrediction, st as SliceLine, t as RELATIVE, tn as Replica, tt as Line, u as TimeSpread, un as KindConfig, ut as byClients, v as EnvironmentManifest, vn as kindConfig, vt as outcomesOf, w as KindCellV1, wt as rulesOf, x as KindCellRecord, xn as scenario, xt as recordsOf, y as FORMAT, yn as kubeProxyPatch, yt as podsAt, z as Propagated, zt as bandOf } from "./judge-B9kVpFE-.js";
2
2
  import { Quantity } from "@mark1russell7/quantity";
3
3
  import { CheckFn, Finding, HealthServer, Poll, Rule, Scenario, ServiceBuilder, ServiceDescription, Stage, Timing, TransportImpl, Verdict } from "@mark1russell7/service";
4
4
  import { RedisClient } from "@mark1russell7/service/redis";
@@ -111,8 +111,12 @@ export declare const hostsOf: (text: string, cluster: string) => ClusterHosts;
111
111
  * - `server` is the first replica of the service, in the sequence of its name.
112
112
  * - `redis` is the Redis pod.
113
113
  * - `kube-proxy` is kube-proxy on the first worker.
114
+ * - `servers` is each replica of the service. Only the injector takes it: a rule in the network
115
+ * namespace of each replica, with each client pod as a peer. A REJECT resets only the sender of
116
+ * the segment that it matches, thus the rule goes where the segments of the clients arrive.
117
+ * - `clients` is the process of each client pod. Only a signal takes it: the gap of the trigger `idle`.
114
118
  */
115
- type Target = "server" | "redis" | "kube-proxy";
119
+ type Target = "server" | "redis" | "kube-proxy" | "servers" | "clients";
116
120
  /** A step is one act of a fault, in the sequence of the plan. */
117
121
  type Step = {
118
122
  readonly do: "kubectl";
@@ -121,7 +125,7 @@ type Step = {
121
125
  } | {
122
126
  readonly do: "signal";
123
127
  readonly target: Target;
124
- readonly signal: "SIGKILL" | "SIGSTOP" | "SIGCONT";
128
+ readonly signal: "SIGKILL" | "SIGSTOP" | "SIGCONT" | "SIGUSR1" | "SIGUSR2";
125
129
  } | {
126
130
  readonly do: "pause";
127
131
  readonly target: Target;
@@ -200,15 +204,20 @@ export declare const labImage: () => Promise<string>;
200
204
  /** This version is the release of Istio of the lab: the tag of istioctl and of each image. */
201
205
  export declare const ISTIO_VERSION = "1.31.3";
202
206
  /**
203
- * These are the images of the flavor `sidecar`, pinned by the digest of their index on Docker Hub
204
- * (read on 2026-10-24). `gcr.io/istio-release` has no final tag of 1.31. The lab pulls each one by
205
- * its digest, tags it with that digest (`localPin`), and loads it into each node. Thus no node pulls
206
- * from a registry.
207
+ * These are the images of Istio, pinned by the digest of their index on Docker Hub (read on
208
+ * 2026-10-24). `gcr.io/istio-release` has no final tag of 1.31. The lab pulls each one by its digest,
209
+ * tags it with that digest (`localPin`), and loads it into each node. Thus no node pulls from a
210
+ * registry. The flavor `sidecar` needs istiod and the proxy. The flavor `ambient` also needs
211
+ * istio-cni and ztunnel (`MESH_IMAGES`).
207
212
  */
208
213
  export declare const ISTIO_IMAGES: {
209
214
  readonly pilot: string;
210
215
  readonly proxy: string;
216
+ readonly cni: string;
217
+ readonly ztunnel: string;
211
218
  };
219
+ /** These are the images that each flavor installs, by their names in `ISTIO_IMAGES`. */
220
+ export declare const MESH_IMAGES: Readonly<Record<MeshFlavor, ReadonlyArray<keyof typeof ISTIO_IMAGES>>>;
212
221
  /**
213
222
  * This format is the JSON access log of each sidecar. Each field is a command of the formatter of
214
223
  * Envoy v1.39.4. The fields give the status, the response flags and their details, and the gRPC
@@ -217,10 +226,12 @@ export declare const ISTIO_IMAGES: {
217
226
  * (`image/watch.mjs`).
218
227
  */
219
228
  export declare const ACCESS_LOG_FORMAT: Readonly<Record<string, string>>;
220
- /** These are the local tags of the images, after the pull by digest. */
229
+ /** These are the local tags of the images, after the pull by digest. The flavor `ambient` needs `cni` and `ztunnel`. */
221
230
  interface MeshImages {
222
231
  readonly pilot: string;
223
232
  readonly proxy: string;
233
+ readonly cni?: string | undefined;
234
+ readonly ztunnel?: string | undefined;
224
235
  }
225
236
  /**
226
237
  * This function gives the IstioOperator of a flavor. The values that are not the defaults of Istio:
@@ -232,12 +243,21 @@ interface MeshImages {
232
243
  * reports the whole runner, and no cell scales istiod.
233
244
  * - The access log of each sidecar goes to its output as JSON (`ACCESS_LOG_FORMAT`).
234
245
  *
235
- * The flavor `ambient` comes in a later step, thus it is refused.
246
+ * The flavor `ambient` has the profile `ambient`: istiod, istio-cni and ztunnel, and no gateway
247
+ * (manifests/profiles/ambient.yaml of Istio 1.31.3). Its two other images are full references too
248
+ * (templates/daemonset.yaml of the chart of istio-cni, lines 93–96, and of ztunnel, lines 65–68).
249
+ * The chart of istio-cni takes the pull policy of `global`. The template of ztunnel reads only its own
250
+ * `imagePullPolicy`, thus the operator sets it there too.
236
251
  */
237
252
  export declare const istioOperator: (flavor: MeshFlavor, images: MeshImages) => Record<string, unknown>;
253
+ /** These are the workloads of each flavor in istio-system that the install waits for. */
254
+ export declare const MESH_WORKLOADS: Readonly<Record<MeshFlavor, readonly string[]>>;
238
255
  /**
239
256
  * This function installs the mesh of a flavor in a cluster with `istioctl install` and the operator
240
- * of the flavor. Then it waits for istiod. The kubeconfig of the cluster goes to istioctl.
257
+ * of the flavor. Then it waits for each workload of the flavor. The kubeconfig of the cluster goes to
258
+ * istioctl. When the install fails, the error has the pods of istio-system and the last lines of the
259
+ * log of istio-cni. Thus the log of the job shows the cause, for example a module that the kernel of
260
+ * the runner does not have.
241
261
  */
242
262
  export declare const installMesh: (cluster: Cluster, flavor: MeshFlavor, images: MeshImages) => Promise<void>;
243
263
  /** This function gives the key of the mesh of a cell for its cluster: its flavor, or `none`. */
@@ -248,6 +268,8 @@ export declare const serverCluster: (namespace: string) => string;
248
268
  export declare const EDS_EVERY: Quantity;
249
269
  /** This time is the interval of the LDS poll of each server sidecar, the same as the poll of EDS. */
250
270
  export declare const LDS_EVERY: Quantity;
271
+ /** This function tells if the watcher follows the log of each ztunnel for a cell: a cell in ambient mode. */
272
+ export declare const followsZtunnel: (cell: Pick<KindCell, "mesh">) => boolean;
251
273
  /** This function tells if the lab polls the LDS updates of the server sidecars of a cell: a policy in a sidecar mesh. */
252
274
  export declare const pollsListeners: (cell: Pick<KindCell, "mesh" | "trigger">) => boolean;
253
275
  //#endregion
@@ -292,7 +314,14 @@ interface KindLab {
292
314
  take(): Line[];
293
315
  /** This method adds a listener of each line, and gives the function that removes it. */
294
316
  listen(listener: (line: Line) => void): () => void;
295
- watch(namespaces: readonly string[]): Promise<void>;
317
+ /**
318
+ * This method starts the watcher of the API on the namespaces. With `ztunnel`, it also follows the
319
+ * log of each ztunnel in istio-system: lines `ztunnel-pod` and `ztunnel`, which no tracker of the
320
+ * cell reads.
321
+ */
322
+ watch(namespaces: readonly string[], options?: {
323
+ readonly ztunnel?: boolean | undefined;
324
+ }): Promise<void>;
296
325
  probe(netns: readonly number[]): Promise<void>;
297
326
  stopProbe(): Promise<void>;
298
327
  /** This method asks each agent to poll the backends of a Service in the rules of its node, `every` apart, or to stop with null. */
@@ -312,6 +341,12 @@ interface KindLab {
312
341
  lds(spec: LdsSpec | null): Promise<void>;
313
342
  act(node: string, spec: Readonly<Record<string, unknown>>): Promise<Stamp>;
314
343
  inject(node: string, pid: number, args: readonly string[]): Promise<Stamp>;
344
+ /**
345
+ * This method gives the rules of one table of iptables in the network namespace of a PID, with
346
+ * their counters (`iptables-save -c`). The injector reads them. The method also adds them to the
347
+ * lines as a line `tables`: evidence of which rules matched.
348
+ */
349
+ tables(node: string, pid: number, table: string): Promise<string>;
315
350
  now(): Promise<number>;
316
351
  pidOf(node: string, namespace: string, pod: string, container: string): Promise<number>;
317
352
  netnsOf(node: string, pid: number): Promise<number>;
@@ -370,6 +405,8 @@ export declare const namespaceOf: (cell: Pick<KindCell, "name">) => string;
370
405
  /**
371
406
  * This function gives the Namespace object of a cell. In the sidecar mode of a mesh, the label
372
407
  * `istio-injection=enabled` makes the injector of Istio put a sidecar in each pod of the namespace.
408
+ * In the ambient mode, the label `istio.io/dataplane-mode=ambient` makes istio-cni redirect the
409
+ * traffic of each pod to ztunnel. The listeners of ztunnel are in the network namespace of the pod.
373
410
  */
374
411
  export declare const namespaceObject: (cell: Pick<KindCell, "mesh">, namespace: string) => Record<string, unknown>;
375
412
  /**
@@ -592,5 +629,5 @@ export declare const toolPath: (tool: Tool, key?: string, cache?: string) => str
592
629
  */
593
630
  export declare const ensureTool: (tool: Tool, key?: string, cache?: string) => Promise<string>;
594
631
  //#endregion
595
- export { type Band, type BandV1, CLIENT, type Cluster, type ClusterHosts, type ClusterManifest, type Credentials, type Declaration, type Deleted, type DeletionWindow, type EdsSpec, Endpoint, type EnvironmentManifest, FORMAT, FORMAT_V1, type FaultPlan, HEALTH_PORT, type Judged, KIND_NOISE, KUBE_PROXY_MODES, type KindCell, type KindCellRecord, type KindCellRecordV1, type KindCellResult, type KindCellV1, type KindConfig, type KindDecision, type KindLab, type KindRun, type KindScenario, type KindVerdict, type KindVerdictV1, type KubeProxyMode, type KubeletProbe, LAST_SLACK, LOG_LABEL, type LdsSpec, Line, type ListenerCounts, type LoadSample, type Mesh, type MeshFlavor, type MeshImages, type MeshMode, NODE_IMAGES, type NodeImage, PORT, type Parts, PodLine, type PodSettings, type Prediction, type PredictionV1, type Propagated, type Propagation, PropagationSource, REDIS, RELATIVE, RecordLine, type RedisDeclaration, type Reference, type Replica, Request, type ResetReuse, RulesLine, type RunCheck, type RunCheckV1, type RunFacts, type RunFactsV1, type RunOptions, SERVER, STAGES, type ServiceRule, SliceLine, type Stack, type Stamp, type Step, type Target, type Template, type TimeSpread, type Tool, type Trigger, type TriggerKind, type TriggerV1, type Verdicts, type Workload, backendsAt, bandOf, byClients, byNode, calibrationOf, cellsTable, checkRun, cidrOverlap, cidrRange, deletionOf, deletionsOf, dropOf, emptyOf, factsOf, failuresOf, goDuration, intakeOf, judge, judgeKind, kernelCounts, kindCellRecordSchema, kindCellRecordV1Schema, kindConfig, kubeProxyPatch, medianInterval, medianText, middle, nodeNames, observationAfter, observationEnd, outcomesOf, podsAt, podsOf, predictionText, propagationOf, propagationSource, quantileOf, readRecord, recordsOf, referenceOf, requestsOf, restartsAt, reusesReset, rulesOf, scenario, scenarioProblems, seconds, secondsOf, showBand, signalOf, signalsOf, sliceDropOf, sliceEmptyOf, slicesOf, stoppingOf, timeSpread, transitionOf, unitOf, updatesOf, upgrade, upgradeCell };
632
+ export { type Band, type BandV1, CLIENT, type Cluster, type ClusterHosts, type ClusterManifest, type Credentials, type Declaration, type Deleted, type DeletionWindow, type EdsSpec, Endpoint, type EnvironmentManifest, FORMAT, FORMAT_V1, type FaultPlan, HEALTH_PORT, type Judged, KIND_NOISE, KUBE_PROXY_MODES, type KindCell, type KindCellRecord, type KindCellRecordV1, type KindCellResult, type KindCellV1, type KindConfig, type KindDecision, type KindLab, type KindRun, type KindScenario, type KindVerdict, type KindVerdictV1, type KubeProxyMode, type KubeletProbe, LAST_SLACK, LOG_LABEL, type LdsSpec, Line, type ListenerCounts, type LoadSample, type Mesh, type MeshFlavor, type MeshImages, type MeshMode, NODE_IMAGES, type NodeImage, PORT, type Parts, PodLine, type PodSettings, type Prediction, type PredictionV1, type Propagated, type Propagation, PropagationSource, REDIS, RELATIVE, RecordLine, type RedisDeclaration, type Reference, type Replica, Request, type ResetReuse, RulesLine, type RunCheck, type RunCheckV1, type RunFacts, type RunFactsV1, type RunOptions, SERVER, STAGES, type ServiceRule, SliceLine, SocketLine, type Stack, type Stamp, type Step, type Target, type Template, type TimeSpread, type Tool, type Trigger, type TriggerKind, type TriggerV1, type Verdicts, type WindowPrediction, type Workload, backendsAt, bandOf, byClients, byNode, calibrationOf, cellsTable, checkRun, cidrOverlap, cidrRange, deletionOf, deletionsOf, dropOf, emptyOf, factsOf, failuresOf, goDuration, intakeOf, judge, judgeKind, kernelCounts, kindCellRecordSchema, kindCellRecordV1Schema, kindConfig, kubeProxyPatch, medianInterval, medianText, middle, nodeNames, observationAfter, observationEnd, outcomesOf, podsAt, podsOf, predictionText, propagationOf, propagationSource, quantileOf, readRecord, recordsOf, referenceOf, requestsOf, restartsAt, reusesReset, rulesOf, scenario, scenarioProblems, seconds, secondsOf, showBand, signalOf, signalsOf, sliceDropOf, sliceEmptyOf, slicesOf, socketsOf, stoppingOf, timeSpread, transitionOf, unitOf, updatesOf, upgrade, upgradeCell };
596
633
  //# sourceMappingURL=index.d.ts.map