@codiac.io/codiac-cli 1.3.286 → 1.3.287
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 +382 -187
- package/dist/commands/asset/deploy.d.ts +35 -2
- package/dist/commands/asset/deploy.js +151 -6
- package/dist/commands/asset/deploy.js.map +1 -1
- package/dist/commands/asset/view.d.ts +11 -2
- package/dist/commands/asset/view.js +34 -117
- package/dist/commands/asset/view.js.map +1 -1
- package/dist/commands/config/add.js +5 -1
- package/dist/commands/config/add.js.map +1 -1
- package/dist/ops/k8s/asset-rollout-follower.d.ts +58 -0
- package/dist/ops/k8s/asset-rollout-follower.js +270 -0
- package/dist/ops/k8s/asset-rollout-follower.js.map +1 -0
- package/dist/uilogic/asset-rollout-status.d.ts +104 -0
- package/dist/uilogic/asset-rollout-status.js +378 -0
- package/dist/uilogic/asset-rollout-status.js.map +1 -0
- package/oclif.manifest.json +104 -9
- package/package.json +1 -1
|
@@ -0,0 +1,378 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.formatRolloutSummary = exports.evaluateRollout = exports.findPodProblem = exports.latestWarningForPod = exports.summarizeProbeMessage = exports.selectRolloutPods = exports.shortPodName = exports.describePodCondition = exports.describePodState = exports.podStateLabel = exports.podRestarts = exports.isPodReady = exports.isWarningEvent = exports.formatEventLine = exports.formatEventBody = exports.formatAge = exports.filterAssetEvents = exports.eventObjectName = exports.eventKey = exports.eventIdentity = exports.eventCount = exports.eventTimeMs = exports.DEFAULT_PROBE_FAILURE_THRESHOLD = exports.TERMINAL_WAITING_REASONS = void 0;
|
|
4
|
+
/** Pure (I/O-free) interpretation of Kubernetes pods, replica sets and events for an asset's rollout.
|
|
5
|
+
*
|
|
6
|
+
* Shared by `cod asset view -t status|events` (rendering) and `cod asset deploy --follow`
|
|
7
|
+
* (rendering + deciding when a rollout has settled), so both commands describe a pod the same way
|
|
8
|
+
* and the stop conditions can be unit tested without a cluster. */
|
|
9
|
+
/** Container `waiting` reasons that will not resolve on their own: the rollout is stuck until
|
|
10
|
+
* someone changes the image, config or code. Seeing one on a pod of the new rollout ends a follow. */
|
|
11
|
+
exports.TERMINAL_WAITING_REASONS = [
|
|
12
|
+
"CrashLoopBackOff",
|
|
13
|
+
"ImagePullBackOff",
|
|
14
|
+
"ErrImagePull",
|
|
15
|
+
"InvalidImageName",
|
|
16
|
+
"CreateContainerConfigError",
|
|
17
|
+
"CreateContainerError",
|
|
18
|
+
"RunContainerError",
|
|
19
|
+
];
|
|
20
|
+
/** Kubelet's default probe `failureThreshold` when the pod spec leaves it unset. */
|
|
21
|
+
exports.DEFAULT_PROBE_FAILURE_THRESHOLD = 3;
|
|
22
|
+
/** Label Kubernetes stamps on every pod/replica set to tie the pod to its template revision. */
|
|
23
|
+
const POD_TEMPLATE_HASH_LABEL = "pod-template-hash";
|
|
24
|
+
/** Annotation the Deployment controller stamps on each replica set with its rollout revision number. */
|
|
25
|
+
const DEPLOYMENT_REVISION_ANNOTATION = "deployment.kubernetes.io/revision";
|
|
26
|
+
// --------------------------------------------------------------------------------------------
|
|
27
|
+
// Events
|
|
28
|
+
// --------------------------------------------------------------------------------------------
|
|
29
|
+
/** Best-available timestamp of an event in epoch ms (0 when the event carries none). Covers both the
|
|
30
|
+
* core/v1 shape (`lastTimestamp`) and the events.k8s.io/v1 shape (`eventTime`, `series`). */
|
|
31
|
+
function eventTimeMs(e) {
|
|
32
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
33
|
+
const t = (_g = (_e = (_d = (_b = (_a = e === null || e === void 0 ? void 0 : e.lastTimestamp) !== null && _a !== void 0 ? _a : e === null || e === void 0 ? void 0 : e.eventTime) !== null && _b !== void 0 ? _b : (_c = e === null || e === void 0 ? void 0 : e.series) === null || _c === void 0 ? void 0 : _c.lastObservedTime) !== null && _d !== void 0 ? _d : e === null || e === void 0 ? void 0 : e.deprecatedLastTimestamp) !== null && _e !== void 0 ? _e : (_f = e === null || e === void 0 ? void 0 : e.metadata) === null || _f === void 0 ? void 0 : _f.creationTimestamp) !== null && _g !== void 0 ? _g : e === null || e === void 0 ? void 0 : e.firstTimestamp;
|
|
34
|
+
const ms = t ? new Date(t).getTime() : 0;
|
|
35
|
+
return isNaN(ms) ? 0 : ms;
|
|
36
|
+
}
|
|
37
|
+
exports.eventTimeMs = eventTimeMs;
|
|
38
|
+
/** Number of occurrences an (aggregated) event represents. */
|
|
39
|
+
function eventCount(e) {
|
|
40
|
+
var _a, _b, _c;
|
|
41
|
+
const n = (_c = (_a = e === null || e === void 0 ? void 0 : e.count) !== null && _a !== void 0 ? _a : (_b = e === null || e === void 0 ? void 0 : e.series) === null || _b === void 0 ? void 0 : _b.count) !== null && _c !== void 0 ? _c : e === null || e === void 0 ? void 0 : e.deprecatedCount;
|
|
42
|
+
return (typeof n === "number" && n > 0) ? n : 1;
|
|
43
|
+
}
|
|
44
|
+
exports.eventCount = eventCount;
|
|
45
|
+
/** Identity of an event object, regardless of how many times it has recurred. */
|
|
46
|
+
function eventIdentity(e) {
|
|
47
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j;
|
|
48
|
+
return (_b = (_a = e === null || e === void 0 ? void 0 : e.metadata) === null || _a === void 0 ? void 0 : _a.uid) !== null && _b !== void 0 ? _b : `${(_f = (_d = (_c = e === null || e === void 0 ? void 0 : e.involvedObject) === null || _c === void 0 ? void 0 : _c.name) !== null && _d !== void 0 ? _d : (_e = e === null || e === void 0 ? void 0 : e.regarding) === null || _e === void 0 ? void 0 : _e.name) !== null && _f !== void 0 ? _f : ""}/${(_g = e === null || e === void 0 ? void 0 : e.reason) !== null && _g !== void 0 ? _g : ""}/${(_j = (_h = e === null || e === void 0 ? void 0 : e.message) !== null && _h !== void 0 ? _h : e === null || e === void 0 ? void 0 : e.note) !== null && _j !== void 0 ? _j : ""}`;
|
|
49
|
+
}
|
|
50
|
+
exports.eventIdentity = eventIdentity;
|
|
51
|
+
/** Identity of an event *occurrence*: the same event object re-emitted with a higher count is a new
|
|
52
|
+
* occurrence (what `kubectl get events -w` reprints); an unchanged one is not. */
|
|
53
|
+
function eventKey(e) {
|
|
54
|
+
return `${eventIdentity(e)}#${eventCount(e)}`;
|
|
55
|
+
}
|
|
56
|
+
exports.eventKey = eventKey;
|
|
57
|
+
/** Name of the object an event is about (pod, replica set, deployment, ...). */
|
|
58
|
+
function eventObjectName(e) {
|
|
59
|
+
var _a, _b, _c, _d;
|
|
60
|
+
return ((_d = (_b = (_a = e === null || e === void 0 ? void 0 : e.involvedObject) === null || _a === void 0 ? void 0 : _a.name) !== null && _b !== void 0 ? _b : (_c = e === null || e === void 0 ? void 0 : e.regarding) === null || _c === void 0 ? void 0 : _c.name) !== null && _d !== void 0 ? _d : "");
|
|
61
|
+
}
|
|
62
|
+
exports.eventObjectName = eventObjectName;
|
|
63
|
+
/** Narrows a namespace's events to those about the given asset — its pods, replica sets, deployment,
|
|
64
|
+
* service and ingress are all named after it — sorted oldest first. When nothing matches, returns
|
|
65
|
+
* every namespace event instead (with `matchedAsset: false`) so a naming mismatch never hides
|
|
66
|
+
* real activity. */
|
|
67
|
+
function filterAssetEvents(all, asset, podNames) {
|
|
68
|
+
const pods = new Set(podNames !== null && podNames !== void 0 ? podNames : []);
|
|
69
|
+
const mine = (all !== null && all !== void 0 ? all : []).filter(e => {
|
|
70
|
+
const n = eventObjectName(e);
|
|
71
|
+
return n === asset || n.startsWith(`${asset}-`) || pods.has(n);
|
|
72
|
+
});
|
|
73
|
+
const chosen = (mine.length > 0 ? mine : (all !== null && all !== void 0 ? all : [])).slice().sort((a, b) => eventTimeMs(a) - eventTimeMs(b));
|
|
74
|
+
return { events: chosen, matchedAsset: mine.length > 0 };
|
|
75
|
+
}
|
|
76
|
+
exports.filterAssetEvents = filterAssetEvents;
|
|
77
|
+
/** Compact age such as `45s`, `3m`, `2h`, `4d` (`?` when unknown). */
|
|
78
|
+
function formatAge(ms, nowMs) {
|
|
79
|
+
if (!ms)
|
|
80
|
+
return "?";
|
|
81
|
+
const s = Math.max(0, Math.floor((nowMs - ms) / 1000));
|
|
82
|
+
if (s < 60)
|
|
83
|
+
return `${s}s`;
|
|
84
|
+
if (s < 3600)
|
|
85
|
+
return `${Math.floor(s / 60)}m`;
|
|
86
|
+
if (s < 86400)
|
|
87
|
+
return `${Math.floor(s / 3600)}h`;
|
|
88
|
+
return `${Math.floor(s / 86400)}d`;
|
|
89
|
+
}
|
|
90
|
+
exports.formatAge = formatAge;
|
|
91
|
+
/** One event as `type reason kind/name message (xN)`, without its age. */
|
|
92
|
+
function formatEventBody(e) {
|
|
93
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
94
|
+
const type = ((_a = e === null || e === void 0 ? void 0 : e.type) !== null && _a !== void 0 ? _a : "");
|
|
95
|
+
const reason = ((_b = e === null || e === void 0 ? void 0 : e.reason) !== null && _b !== void 0 ? _b : "");
|
|
96
|
+
const io = (_d = (_c = e === null || e === void 0 ? void 0 : e.involvedObject) !== null && _c !== void 0 ? _c : e === null || e === void 0 ? void 0 : e.regarding) !== null && _d !== void 0 ? _d : {};
|
|
97
|
+
const obj = `${(_e = io === null || io === void 0 ? void 0 : io.kind) !== null && _e !== void 0 ? _e : ""}/${(_f = io === null || io === void 0 ? void 0 : io.name) !== null && _f !== void 0 ? _f : ""}`;
|
|
98
|
+
const n = eventCount(e);
|
|
99
|
+
const count = n > 1 ? ` (x${n})` : "";
|
|
100
|
+
const msg = String((_h = (_g = e === null || e === void 0 ? void 0 : e.message) !== null && _g !== void 0 ? _g : e === null || e === void 0 ? void 0 : e.note) !== null && _h !== void 0 ? _h : "").replace(/\s+/g, " ").trim();
|
|
101
|
+
return `${type.padEnd(7)} ${reason.padEnd(22)} ${obj.padEnd(30)} ${msg}${count}`;
|
|
102
|
+
}
|
|
103
|
+
exports.formatEventBody = formatEventBody;
|
|
104
|
+
/** One event as a `kubectl get events`-style row, prefixed with its age. */
|
|
105
|
+
function formatEventLine(e, nowMs) {
|
|
106
|
+
return `${formatAge(eventTimeMs(e), nowMs).padStart(4)} ${formatEventBody(e)}`;
|
|
107
|
+
}
|
|
108
|
+
exports.formatEventLine = formatEventLine;
|
|
109
|
+
/** True for events Kubernetes flags as problems (rendered in the warning color). */
|
|
110
|
+
function isWarningEvent(e) {
|
|
111
|
+
return (e === null || e === void 0 ? void 0 : e.type) === "Warning";
|
|
112
|
+
}
|
|
113
|
+
exports.isWarningEvent = isWarningEvent;
|
|
114
|
+
// --------------------------------------------------------------------------------------------
|
|
115
|
+
// Pods
|
|
116
|
+
// --------------------------------------------------------------------------------------------
|
|
117
|
+
/** True once the pod's `Ready` condition is `True` (all containers passing readiness). */
|
|
118
|
+
function isPodReady(pod) {
|
|
119
|
+
var _a, _b;
|
|
120
|
+
return Boolean((_b = (_a = pod.status) === null || _a === void 0 ? void 0 : _a.conditions) === null || _b === void 0 ? void 0 : _b.find(c => c.type === "Ready" && c.status === "True"));
|
|
121
|
+
}
|
|
122
|
+
exports.isPodReady = isPodReady;
|
|
123
|
+
/** Every container status on the pod, init containers first (an init container stuck in
|
|
124
|
+
* ImagePullBackOff blocks the pod just as hard as the main container). */
|
|
125
|
+
function allContainerStatuses(pod) {
|
|
126
|
+
var _a, _b, _c, _d;
|
|
127
|
+
return [...((_b = (_a = pod.status) === null || _a === void 0 ? void 0 : _a.initContainerStatuses) !== null && _b !== void 0 ? _b : []), ...((_d = (_c = pod.status) === null || _c === void 0 ? void 0 : _c.containerStatuses) !== null && _d !== void 0 ? _d : [])];
|
|
128
|
+
}
|
|
129
|
+
/** Total container restarts across the pod. */
|
|
130
|
+
function podRestarts(pod) {
|
|
131
|
+
var _a, _b;
|
|
132
|
+
return ((_b = (_a = pod.status) === null || _a === void 0 ? void 0 : _a.containerStatuses) !== null && _b !== void 0 ? _b : []).reduce((sum, c) => { var _a; return sum + ((_a = c.restartCount) !== null && _a !== void 0 ? _a : 0); }, 0);
|
|
133
|
+
}
|
|
134
|
+
exports.podRestarts = podRestarts;
|
|
135
|
+
/** Short, stable label for a pod's state — the unit `--follow` prints a transition on, eg
|
|
136
|
+
* `Pending`, `Pending (ContainerCreating)`, `Running (not ready)`, `Ready`, `Waiting (CrashLoopBackOff)`,
|
|
137
|
+
* `Terminating`. Deliberately excludes timestamps and messages so it only changes when the state does. */
|
|
138
|
+
function podStateLabel(pod) {
|
|
139
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
|
|
140
|
+
if ((_a = pod.metadata) === null || _a === void 0 ? void 0 : _a.deletionTimestamp)
|
|
141
|
+
return "Terminating";
|
|
142
|
+
const phase = (_c = (_b = pod.status) === null || _b === void 0 ? void 0 : _b.phase) !== null && _c !== void 0 ? _c : "Unknown";
|
|
143
|
+
const waiting = (_f = (_e = (_d = allContainerStatuses(pod).find(c => { var _a, _b; return (_b = (_a = c.state) === null || _a === void 0 ? void 0 : _a.waiting) === null || _b === void 0 ? void 0 : _b.reason; })) === null || _d === void 0 ? void 0 : _d.state) === null || _e === void 0 ? void 0 : _e.waiting) === null || _f === void 0 ? void 0 : _f.reason;
|
|
144
|
+
if (waiting && exports.TERMINAL_WAITING_REASONS.includes(waiting))
|
|
145
|
+
return `Waiting (${waiting})`;
|
|
146
|
+
if (phase === "Running")
|
|
147
|
+
return isPodReady(pod) ? "Ready" : "Running (not ready)";
|
|
148
|
+
if (phase === "Pending") {
|
|
149
|
+
if (waiting)
|
|
150
|
+
return `Pending (${waiting})`;
|
|
151
|
+
const unschedulable = (_h = (_g = pod.status) === null || _g === void 0 ? void 0 : _g.conditions) === null || _h === void 0 ? void 0 : _h.find(c => c.type === "PodScheduled" && c.status === "False");
|
|
152
|
+
return unschedulable ? `Pending (${(_j = unschedulable.reason) !== null && _j !== void 0 ? _j : "Unschedulable"})` : "Pending";
|
|
153
|
+
}
|
|
154
|
+
if (phase === "Failed" && ((_k = pod.status) === null || _k === void 0 ? void 0 : _k.reason))
|
|
155
|
+
return `Failed (${pod.status.reason})`;
|
|
156
|
+
return phase;
|
|
157
|
+
}
|
|
158
|
+
exports.podStateLabel = podStateLabel;
|
|
159
|
+
/** Verbose pod state (phase + pod reason/message + first container's waiting/terminated detail) as
|
|
160
|
+
* rendered by `cod asset view -t status`. */
|
|
161
|
+
function describePodState(replica) {
|
|
162
|
+
var _a, _b, _c, _d, _e;
|
|
163
|
+
let state = "[no status found]";
|
|
164
|
+
if ((_a = replica.metadata) === null || _a === void 0 ? void 0 : _a.deletionTimestamp) {
|
|
165
|
+
state = "Terminating";
|
|
166
|
+
}
|
|
167
|
+
else if (replica.status) {
|
|
168
|
+
state = (_b = replica.status.phase) !== null && _b !== void 0 ? _b : "";
|
|
169
|
+
if (replica.status.reason)
|
|
170
|
+
state = state.concat(" (", replica.status.reason, ")");
|
|
171
|
+
if (replica.status.message)
|
|
172
|
+
state = state.concat(" ('", replica.status.message, "')");
|
|
173
|
+
const ctrStatus = (_c = replica.status.containerStatuses) === null || _c === void 0 ? void 0 : _c[0];
|
|
174
|
+
if ((_d = ctrStatus === null || ctrStatus === void 0 ? void 0 : ctrStatus.state) === null || _d === void 0 ? void 0 : _d.waiting) {
|
|
175
|
+
if (ctrStatus.state.waiting.reason)
|
|
176
|
+
state = state.concat(" (", ctrStatus.state.waiting.reason, ")");
|
|
177
|
+
if (ctrStatus.state.waiting.message)
|
|
178
|
+
state = state.concat(" ('", ctrStatus.state.waiting.message, "')");
|
|
179
|
+
}
|
|
180
|
+
else if ((_e = ctrStatus === null || ctrStatus === void 0 ? void 0 : ctrStatus.state) === null || _e === void 0 ? void 0 : _e.terminated) {
|
|
181
|
+
if (ctrStatus.state.terminated.reason)
|
|
182
|
+
state = state.concat(" (", ctrStatus.state.terminated.reason, ")");
|
|
183
|
+
if (ctrStatus.state.terminated.message)
|
|
184
|
+
state = state.concat(" (", ctrStatus.state.terminated.message, ")");
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
return state;
|
|
188
|
+
}
|
|
189
|
+
exports.describePodState = describePodState;
|
|
190
|
+
/** The pod's most recently transitioned condition, with reason/message and since-when, as rendered
|
|
191
|
+
* by `cod asset view -t status`. */
|
|
192
|
+
function describePodCondition(replica) {
|
|
193
|
+
var _a, _b;
|
|
194
|
+
const conds = (_b = (_a = replica.status) === null || _a === void 0 ? void 0 : _a.conditions) !== null && _b !== void 0 ? _b : [];
|
|
195
|
+
if (conds.length === 0)
|
|
196
|
+
return "";
|
|
197
|
+
const latest = conds.slice().sort((a, b) => { var _a, _b; return new Date((_a = b.lastTransitionTime) !== null && _a !== void 0 ? _a : 0).getTime() - new Date((_b = a.lastTransitionTime) !== null && _b !== void 0 ? _b : 0).getTime(); })[0];
|
|
198
|
+
let cond = latest.type;
|
|
199
|
+
if (latest.reason)
|
|
200
|
+
cond = cond.concat(" (", latest.reason, ")");
|
|
201
|
+
if (latest.message)
|
|
202
|
+
cond = cond.concat(" ('", latest.message, "')");
|
|
203
|
+
return cond.concat(` since (${latest.lastTransitionTime})`);
|
|
204
|
+
}
|
|
205
|
+
exports.describePodCondition = describePodCondition;
|
|
206
|
+
/** Suffix of a pod name starting at its template hash (`7c9d8-x2kq`), which is all that
|
|
207
|
+
* distinguishes replicas of the same asset. */
|
|
208
|
+
function shortPodName(pod) {
|
|
209
|
+
var _a, _b, _c, _d;
|
|
210
|
+
const name = (_b = (_a = pod.metadata) === null || _a === void 0 ? void 0 : _a.name) !== null && _b !== void 0 ? _b : "unnamed";
|
|
211
|
+
const hash = (_d = (_c = pod.metadata) === null || _c === void 0 ? void 0 : _c.labels) === null || _d === void 0 ? void 0 : _d[POD_TEMPLATE_HASH_LABEL];
|
|
212
|
+
const i = hash ? name.indexOf(hash) : -1;
|
|
213
|
+
return i >= 0 ? name.slice(i) : name;
|
|
214
|
+
}
|
|
215
|
+
exports.shortPodName = shortPodName;
|
|
216
|
+
function revisionOf(rs) {
|
|
217
|
+
var _a, _b, _c;
|
|
218
|
+
const r = parseInt((_c = (_b = (_a = rs.metadata) === null || _a === void 0 ? void 0 : _a.annotations) === null || _b === void 0 ? void 0 : _b[DEPLOYMENT_REVISION_ANNOTATION]) !== null && _c !== void 0 ? _c : "", 10);
|
|
219
|
+
return isNaN(r) ? -1 : r;
|
|
220
|
+
}
|
|
221
|
+
/** Picks the new rollout's pods out of every pod carrying the asset's label: when the Deployment is
|
|
222
|
+
* known, only pods of its newest replica set (highest revision) count, so old pods that are still
|
|
223
|
+
* draining never hold up — or fail — the verdict. Without a Deployment (eg a pod-only workload) every
|
|
224
|
+
* live pod counts. */
|
|
225
|
+
function selectRolloutPods(pods, replicaSets, deployment) {
|
|
226
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j;
|
|
227
|
+
const live = (pods !== null && pods !== void 0 ? pods : []).filter(p => { var _a; return !((_a = p.metadata) === null || _a === void 0 ? void 0 : _a.deletionTimestamp); });
|
|
228
|
+
if (!deployment) {
|
|
229
|
+
return { pods: live, desired: undefined, settled: true };
|
|
230
|
+
}
|
|
231
|
+
const desired = (_b = (_a = deployment.spec) === null || _a === void 0 ? void 0 : _a.replicas) !== null && _b !== void 0 ? _b : 1;
|
|
232
|
+
const generation = (_d = (_c = deployment.metadata) === null || _c === void 0 ? void 0 : _c.generation) !== null && _d !== void 0 ? _d : 0;
|
|
233
|
+
const observed = (_f = (_e = deployment.status) === null || _e === void 0 ? void 0 : _e.observedGeneration) !== null && _f !== void 0 ? _f : 0;
|
|
234
|
+
const settled = observed >= generation;
|
|
235
|
+
const uid = (_g = deployment.metadata) === null || _g === void 0 ? void 0 : _g.uid;
|
|
236
|
+
const owned = (replicaSets !== null && replicaSets !== void 0 ? replicaSets : []).filter(rs => { var _a, _b; return !uid || ((_b = (_a = rs.metadata) === null || _a === void 0 ? void 0 : _a.ownerReferences) !== null && _b !== void 0 ? _b : []).some(o => o.uid === uid); });
|
|
237
|
+
const newest = owned.slice().sort((a, b) => revisionOf(b) - revisionOf(a))[0];
|
|
238
|
+
const hash = (_j = (_h = newest === null || newest === void 0 ? void 0 : newest.metadata) === null || _h === void 0 ? void 0 : _h.labels) === null || _j === void 0 ? void 0 : _j[POD_TEMPLATE_HASH_LABEL];
|
|
239
|
+
const rolloutPods = hash ? live.filter(p => { var _a, _b; return ((_b = (_a = p.metadata) === null || _a === void 0 ? void 0 : _a.labels) === null || _b === void 0 ? void 0 : _b[POD_TEMPLATE_HASH_LABEL]) === hash; }) : live;
|
|
240
|
+
return { pods: rolloutPods, desired, settled };
|
|
241
|
+
}
|
|
242
|
+
exports.selectRolloutPods = selectRolloutPods;
|
|
243
|
+
function probeOf(pod, kind, containerName) {
|
|
244
|
+
var _a, _b, _c;
|
|
245
|
+
const ctrs = (_b = (_a = pod.spec) === null || _a === void 0 ? void 0 : _a.containers) !== null && _b !== void 0 ? _b : [];
|
|
246
|
+
const ctr = (_c = (containerName ? ctrs.find(c => c.name === containerName) : undefined)) !== null && _c !== void 0 ? _c : ctrs.find(c => (kind === "readiness" ? c.readinessProbe : c.startupProbe));
|
|
247
|
+
return kind === "readiness" ? ctr === null || ctr === void 0 ? void 0 : ctr.readinessProbe : ctr === null || ctr === void 0 ? void 0 : ctr.startupProbe;
|
|
248
|
+
}
|
|
249
|
+
/** Shortens kubelet's probe failure message, eg
|
|
250
|
+
* `Readiness probe failed: HTTP probe failed with statuscode: 503` → `Readiness probe failed: HTTP 503 /ready`. */
|
|
251
|
+
function summarizeProbeMessage(message, probe) {
|
|
252
|
+
var _a;
|
|
253
|
+
const msg = String(message !== null && message !== void 0 ? message : "").replace(/\s+/g, " ").trim();
|
|
254
|
+
const m = msg.match(/^(\w+ probe failed): HTTP probe failed with statuscode: (\d+)/i);
|
|
255
|
+
if (m) {
|
|
256
|
+
const path = (_a = probe === null || probe === void 0 ? void 0 : probe.httpGet) === null || _a === void 0 ? void 0 : _a.path;
|
|
257
|
+
return `${m[1]}: HTTP ${m[2]}${path ? " " + path : ""}`;
|
|
258
|
+
}
|
|
259
|
+
return msg;
|
|
260
|
+
}
|
|
261
|
+
exports.summarizeProbeMessage = summarizeProbeMessage;
|
|
262
|
+
/** Latest Warning event about the given pod, if any. */
|
|
263
|
+
function latestWarningForPod(podName, events) {
|
|
264
|
+
return (events !== null && events !== void 0 ? events : [])
|
|
265
|
+
.filter(e => isWarningEvent(e) && eventObjectName(e) === podName)
|
|
266
|
+
.sort((a, b) => eventTimeMs(b) - eventTimeMs(a))[0];
|
|
267
|
+
}
|
|
268
|
+
exports.latestWarningForPod = latestWarningForPod;
|
|
269
|
+
/** Decides whether a pod is stuck for good. Stuck means: phase `Failed`; a container waiting on one
|
|
270
|
+
* of {@link TERMINAL_WAITING_REASONS}; or a readiness/startup probe that has failed MORE times than
|
|
271
|
+
* its `failureThreshold` (default 3) while the pod is still not Ready. The reason includes the most
|
|
272
|
+
* relevant event message so the user sees *why* (eg the image pull error or the probe's HTTP status). */
|
|
273
|
+
function findPodProblem(pod, events) {
|
|
274
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
|
|
275
|
+
const name = (_b = (_a = pod.metadata) === null || _a === void 0 ? void 0 : _a.name) !== null && _b !== void 0 ? _b : "unnamed";
|
|
276
|
+
if ((_c = pod.metadata) === null || _c === void 0 ? void 0 : _c.deletionTimestamp)
|
|
277
|
+
return undefined;
|
|
278
|
+
const latestWarn = latestWarningForPod(name, events);
|
|
279
|
+
const withEvent = (head) => {
|
|
280
|
+
var _a, _b;
|
|
281
|
+
const detail = latestWarn ? String((_b = (_a = latestWarn.message) !== null && _a !== void 0 ? _a : latestWarn.note) !== null && _b !== void 0 ? _b : "").replace(/\s+/g, " ").trim() : "";
|
|
282
|
+
return detail ? `${head}: ${detail}` : head;
|
|
283
|
+
};
|
|
284
|
+
if (((_d = pod.status) === null || _d === void 0 ? void 0 : _d.phase) === "Failed") {
|
|
285
|
+
return { pod: name, reason: withEvent(`pod Failed${pod.status.reason ? " (" + pod.status.reason + ")" : ""}`) };
|
|
286
|
+
}
|
|
287
|
+
for (const cs of allContainerStatuses(pod)) {
|
|
288
|
+
const waiting = (_f = (_e = cs.state) === null || _e === void 0 ? void 0 : _e.waiting) === null || _f === void 0 ? void 0 : _f.reason;
|
|
289
|
+
if (waiting && exports.TERMINAL_WAITING_REASONS.includes(waiting)) {
|
|
290
|
+
const exitDetail = (waiting === "CrashLoopBackOff" && ((_g = cs.lastState) === null || _g === void 0 ? void 0 : _g.terminated))
|
|
291
|
+
? ` (last exit ${cs.lastState.terminated.exitCode}${cs.lastState.terminated.reason ? " " + cs.lastState.terminated.reason : ""})`
|
|
292
|
+
: "";
|
|
293
|
+
// Prefer the kubelet's event (eg `Failed to pull image "x:1": not found`) over the container's
|
|
294
|
+
// generic waiting message (`Back-off pulling image ...`); a bare BackOff event adds nothing.
|
|
295
|
+
const head = `${waiting}${exitDetail}`;
|
|
296
|
+
if (latestWarn && latestWarn.reason !== "BackOff")
|
|
297
|
+
return { pod: name, reason: withEvent(head) };
|
|
298
|
+
const msg = ((_j = (_h = cs.state) === null || _h === void 0 ? void 0 : _h.waiting) === null || _j === void 0 ? void 0 : _j.message) ? String(cs.state.waiting.message).replace(/\s+/g, " ").trim() : "";
|
|
299
|
+
return { pod: name, reason: msg ? `${head}: ${msg}` : head };
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
if (!isPodReady(pod)) {
|
|
303
|
+
for (const kind of ["startup", "readiness"]) {
|
|
304
|
+
const prefix = kind === "startup" ? "startup probe failed" : "readiness probe failed";
|
|
305
|
+
const probeEvents = (events !== null && events !== void 0 ? events : []).filter(e => { var _a, _b; return eventObjectName(e) === name && (e === null || e === void 0 ? void 0 : e.reason) === "Unhealthy" && String((_b = (_a = e === null || e === void 0 ? void 0 : e.message) !== null && _a !== void 0 ? _a : e === null || e === void 0 ? void 0 : e.note) !== null && _b !== void 0 ? _b : "").toLowerCase().startsWith(prefix); });
|
|
306
|
+
if (probeEvents.length === 0)
|
|
307
|
+
continue;
|
|
308
|
+
const failures = probeEvents.reduce((sum, e) => sum + eventCount(e), 0);
|
|
309
|
+
const probe = probeOf(pod, kind);
|
|
310
|
+
const threshold = (_k = probe === null || probe === void 0 ? void 0 : probe.failureThreshold) !== null && _k !== void 0 ? _k : exports.DEFAULT_PROBE_FAILURE_THRESHOLD;
|
|
311
|
+
if (failures > threshold) {
|
|
312
|
+
const latest = probeEvents.sort((a, b) => eventTimeMs(b) - eventTimeMs(a))[0];
|
|
313
|
+
return { pod: name, reason: summarizeProbeMessage(String((_m = (_l = latest === null || latest === void 0 ? void 0 : latest.message) !== null && _l !== void 0 ? _l : latest === null || latest === void 0 ? void 0 : latest.note) !== null && _m !== void 0 ? _m : prefix), probe) };
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
return undefined;
|
|
318
|
+
}
|
|
319
|
+
exports.findPodProblem = findPodProblem;
|
|
320
|
+
/** What a not-yet-ready rollout is currently waiting on, for the timeout summary: the latest Warning
|
|
321
|
+
* event about a rollout pod (eg FailedScheduling, a probe failure), else the least-advanced pod state. */
|
|
322
|
+
function describeWaitingOn(pods, events) {
|
|
323
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j;
|
|
324
|
+
const notReady = pods.filter(p => !isPodReady(p));
|
|
325
|
+
const warnings = notReady
|
|
326
|
+
.map(p => { var _a, _b, _c, _d; return ({ pod: (_b = (_a = p.metadata) === null || _a === void 0 ? void 0 : _a.name) !== null && _b !== void 0 ? _b : "", e: latestWarningForPod((_d = (_c = p.metadata) === null || _c === void 0 ? void 0 : _c.name) !== null && _d !== void 0 ? _d : "", events) }); })
|
|
327
|
+
.filter(x => x.e)
|
|
328
|
+
.sort((a, b) => eventTimeMs(b.e) - eventTimeMs(a.e));
|
|
329
|
+
if (warnings.length > 0) {
|
|
330
|
+
const w = warnings[0];
|
|
331
|
+
const probe = String((_a = w.e) === null || _a === void 0 ? void 0 : _a.reason) === "Unhealthy" ? probeOf(pods.find(p => { var _a; return ((_a = p.metadata) === null || _a === void 0 ? void 0 : _a.name) === w.pod; }), /startup/i.test(String((_b = w.e) === null || _b === void 0 ? void 0 : _b.message)) ? "startup" : "readiness") : undefined;
|
|
332
|
+
return { pod: w.pod, reason: summarizeProbeMessage(String((_h = (_f = (_d = (_c = w.e) === null || _c === void 0 ? void 0 : _c.message) !== null && _d !== void 0 ? _d : (_e = w.e) === null || _e === void 0 ? void 0 : _e.note) !== null && _f !== void 0 ? _f : (_g = w.e) === null || _g === void 0 ? void 0 : _g.reason) !== null && _h !== void 0 ? _h : ""), probe) };
|
|
333
|
+
}
|
|
334
|
+
if (notReady.length > 0)
|
|
335
|
+
return { pod: (_j = notReady[0].metadata) === null || _j === void 0 ? void 0 : _j.name, reason: podStateLabel(notReady[0]) };
|
|
336
|
+
return {};
|
|
337
|
+
}
|
|
338
|
+
/** Judges one observation of a rollout: `failed` as soon as any pod of the new rollout has a
|
|
339
|
+
* {@link findPodProblem}; `ready` once the controller has settled and every wanted replica of the new
|
|
340
|
+
* rollout is Ready (a workload scaled to zero is immediately ready); otherwise `progressing`. */
|
|
341
|
+
function evaluateRollout(selection, events) {
|
|
342
|
+
var _a, _b, _c;
|
|
343
|
+
const pods = (_a = selection.pods) !== null && _a !== void 0 ? _a : [];
|
|
344
|
+
const ready = pods.filter(isPodReady).length;
|
|
345
|
+
const desired = (_b = selection.desired) !== null && _b !== void 0 ? _b : pods.length;
|
|
346
|
+
for (const p of pods) {
|
|
347
|
+
const problem = findPodProblem(p, events);
|
|
348
|
+
if (problem)
|
|
349
|
+
return { state: "failed", ready, desired, reason: problem.reason, pod: problem.pod };
|
|
350
|
+
}
|
|
351
|
+
if (selection.settled) {
|
|
352
|
+
if (selection.desired === 0)
|
|
353
|
+
return { state: "ready", ready: 0, desired: 0 };
|
|
354
|
+
if (desired > 0 && ready >= desired)
|
|
355
|
+
return { state: "ready", ready, desired };
|
|
356
|
+
}
|
|
357
|
+
const waitingOn = selection.settled ? describeWaitingOn(pods, events) : { reason: "waiting for the new rollout to start" };
|
|
358
|
+
if (pods.length === 0 && selection.settled) {
|
|
359
|
+
return { state: "progressing", ready, desired, reason: (_c = waitingOn.reason) !== null && _c !== void 0 ? _c : "no pods created yet" };
|
|
360
|
+
}
|
|
361
|
+
return Object.assign({ state: "progressing", ready, desired }, waitingOn);
|
|
362
|
+
}
|
|
363
|
+
exports.evaluateRollout = evaluateRollout;
|
|
364
|
+
/** The one-line result of a follow, eg `✔ 2/2 pods ready in 41s`, `✖ 0/2 ready after 12s: ImagePullBackOff: ...`
|
|
365
|
+
* or (timeout) `✖ 1/2 ready after 300s: Readiness probe failed: HTTP 503 /ready`. */
|
|
366
|
+
function formatRolloutSummary(verdict, elapsedSeconds) {
|
|
367
|
+
const secs = Math.max(0, Math.round(elapsedSeconds));
|
|
368
|
+
if (verdict.state === "ready") {
|
|
369
|
+
return verdict.desired === 0
|
|
370
|
+
? `✔ scaled to 0 replicas; nothing to wait for (${secs}s)`
|
|
371
|
+
: `✔ ${verdict.ready}/${verdict.desired} pods ready in ${secs}s`;
|
|
372
|
+
}
|
|
373
|
+
const why = verdict.reason ? `: ${verdict.reason}` : (verdict.state === "progressing" ? ": still progressing" : "");
|
|
374
|
+
const where = (verdict.pod && verdict.reason && !verdict.reason.includes(verdict.pod)) ? ` [${verdict.pod}]` : "";
|
|
375
|
+
return `✖ ${verdict.ready}/${verdict.desired} ready after ${secs}s${why}${where}`;
|
|
376
|
+
}
|
|
377
|
+
exports.formatRolloutSummary = formatRolloutSummary;
|
|
378
|
+
//# sourceMappingURL=asset-rollout-status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"asset-rollout-status.js","sourceRoot":"","sources":["../../src/uilogic/asset-rollout-status.ts"],"names":[],"mappings":"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"}
|
package/oclif.manifest.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "1.3.
|
|
2
|
+
"version": "1.3.287",
|
|
3
3
|
"commands": {
|
|
4
4
|
"branch": {
|
|
5
5
|
"id": "branch",
|
|
@@ -1815,11 +1815,42 @@
|
|
|
1815
1815
|
],
|
|
1816
1816
|
"hiddenAliases": [],
|
|
1817
1817
|
"examples": [
|
|
1818
|
-
|
|
1819
|
-
|
|
1820
|
-
|
|
1821
|
-
|
|
1822
|
-
|
|
1818
|
+
{
|
|
1819
|
+
"description": "Deploy a specific version of an asset to a cabinet, prompting only for what is missing.",
|
|
1820
|
+
"command": "<%= config.bin %> <%= command.id %> -e my-enterprise -a my-service -u 1.0.0 -c dev"
|
|
1821
|
+
},
|
|
1822
|
+
{
|
|
1823
|
+
"description": "Deploy, then watch the new pods come up: prints pod state changes and new Kubernetes events, stops when every new pod is Ready, a pod is stuck (eg CrashLoopBackOff, ImagePullBackOff, failing readiness probe), or 5 minutes pass, and ends with a one-line summary. The exit code still reflects only the deploy itself.",
|
|
1824
|
+
"command": "<%= config.bin %> <%= command.id %> -e my-enterprise -a my-service -u 1.0.0 -c dev --follow"
|
|
1825
|
+
},
|
|
1826
|
+
{
|
|
1827
|
+
"description": "CI/CD: deploy non-interactively and report rollout health for up to 2 minutes (bounded; never waits on a TTY).",
|
|
1828
|
+
"command": "<%= config.bin %> <%= command.id %> -e my-enterprise -a my-service -u 1.0.0 -c prod --follow --follow-timeout-in-seconds 120 --silent"
|
|
1829
|
+
},
|
|
1830
|
+
{
|
|
1831
|
+
"description": "Deploy to every cabinet tagged \"staging\" (match any tag) and follow the rollout in each of them.",
|
|
1832
|
+
"command": "<%= config.bin %> <%= command.id %> -e my-enterprise -a my-service -u 1.0.0 -t staging -m any --follow"
|
|
1833
|
+
},
|
|
1834
|
+
{
|
|
1835
|
+
"description": "Tag the deployed asset version and the resulting enterprise snapshot after a successful deploy.",
|
|
1836
|
+
"command": "<%= config.bin %> <%= command.id %> -e my-enterprise -a my-service -u 1.0.0 -c dev -g stable tested -s released approved"
|
|
1837
|
+
},
|
|
1838
|
+
{
|
|
1839
|
+
"description": "Deploy even when the asset has deploy conditions that would otherwise skip this cabinet.",
|
|
1840
|
+
"command": "<%= config.bin %> <%= command.id %> -e my-enterprise -a my-service -u 1.0.0 -c dev --override-conditions"
|
|
1841
|
+
},
|
|
1842
|
+
{
|
|
1843
|
+
"description": "Non-interactive (scripted) deploy that applies an asset tag and a snapshot tag.",
|
|
1844
|
+
"command": "<%= config.bin %> <%= command.id %> -e my-enterprise -a my-service -u 1.0.0 -c dev --applyAssetTag certified --applySnapshotTag baseline --silent"
|
|
1845
|
+
},
|
|
1846
|
+
{
|
|
1847
|
+
"description": "Choose everything interactively, then print the equivalent non-interactive command before deploying.",
|
|
1848
|
+
"command": "<%= config.bin %> <%= command.id %> --follow --echo"
|
|
1849
|
+
},
|
|
1850
|
+
{
|
|
1851
|
+
"description": "Print the equivalent non-interactive command WITHOUT deploying (dry run for scripts).",
|
|
1852
|
+
"command": "<%= config.bin %> <%= command.id %> -e my-enterprise -a my-service -u 1.0.0 -c dev --follow --to-script"
|
|
1853
|
+
}
|
|
1823
1854
|
],
|
|
1824
1855
|
"flags": {
|
|
1825
1856
|
"help": {
|
|
@@ -1944,6 +1975,21 @@
|
|
|
1944
1975
|
"required": false,
|
|
1945
1976
|
"allowNo": false
|
|
1946
1977
|
},
|
|
1978
|
+
"follow": {
|
|
1979
|
+
"name": "follow",
|
|
1980
|
+
"type": "boolean",
|
|
1981
|
+
"char": "f",
|
|
1982
|
+
"description": "After a successful deploy, watch the new pods in each target cabinet — printing pod state changes and new Kubernetes events — until all are Ready, one is stuck (CrashLoopBackOff, ImagePullBackOff/ErrImagePull, CreateContainerConfigError, readiness/startup probe failing past its threshold), or the timeout passes. Reports health only: the exit code still reflects the deploy alone.",
|
|
1983
|
+
"required": false,
|
|
1984
|
+
"allowNo": false
|
|
1985
|
+
},
|
|
1986
|
+
"follow-timeout-in-seconds": {
|
|
1987
|
+
"name": "follow-timeout-in-seconds",
|
|
1988
|
+
"type": "option",
|
|
1989
|
+
"description": "Longest time --follow watches the rollout before summarizing what it is still waiting on (defaults to 300; implies --follow).",
|
|
1990
|
+
"required": false,
|
|
1991
|
+
"multiple": false
|
|
1992
|
+
},
|
|
1947
1993
|
"silent": {
|
|
1948
1994
|
"name": "silent",
|
|
1949
1995
|
"type": "boolean",
|
|
@@ -2511,6 +2557,36 @@
|
|
|
2511
2557
|
"asset:get"
|
|
2512
2558
|
],
|
|
2513
2559
|
"hiddenAliases": [],
|
|
2560
|
+
"examples": [
|
|
2561
|
+
{
|
|
2562
|
+
"description": "Pick the asset, cabinet and content type interactively.",
|
|
2563
|
+
"command": "<%= config.bin %> <%= command.id %>"
|
|
2564
|
+
},
|
|
2565
|
+
{
|
|
2566
|
+
"description": "Live pod status monitor for an asset in a cabinet (interactive terminals; ctrl-c to quit).",
|
|
2567
|
+
"command": "<%= config.bin %> <%= command.id %> -e my-enterprise -a my-api -n prod -c orders -t status"
|
|
2568
|
+
},
|
|
2569
|
+
{
|
|
2570
|
+
"description": "The 25 most recent Kubernetes events for the asset (scheduling, image pulls, probe failures, restarts), then exit.",
|
|
2571
|
+
"command": "<%= config.bin %> <%= command.id %> -e my-enterprise -a my-api -n prod -c orders -t events -l 25"
|
|
2572
|
+
},
|
|
2573
|
+
{
|
|
2574
|
+
"description": "Show recent events, then keep streaming new ones as they happen (ctrl-c to quit). -f and --follow are the same flag.",
|
|
2575
|
+
"command": "<%= config.bin %> <%= command.id %> -e my-enterprise -a my-api -n prod -c orders -t events -f"
|
|
2576
|
+
},
|
|
2577
|
+
{
|
|
2578
|
+
"description": "Tail the logs of any one replica, following new lines.",
|
|
2579
|
+
"command": "<%= config.bin %> <%= command.id %> -e my-enterprise -a my-api -n prod -c orders -t logs -r any -f"
|
|
2580
|
+
},
|
|
2581
|
+
{
|
|
2582
|
+
"description": "Non-interactive events dump for scripts and CI (writes to stdout; fails instead of prompting).",
|
|
2583
|
+
"command": "<%= config.bin %> <%= command.id %> -e my-enterprise -a my-api -n prod -c orders -t events --silent"
|
|
2584
|
+
},
|
|
2585
|
+
{
|
|
2586
|
+
"description": "Run a one-off command inside a replica.",
|
|
2587
|
+
"command": "<%= config.bin %> <%= command.id %> -e my-enterprise -a my-api -n prod -c orders -t exec -r any -- ls -la /app"
|
|
2588
|
+
}
|
|
2589
|
+
],
|
|
2514
2590
|
"flags": {
|
|
2515
2591
|
"help": {
|
|
2516
2592
|
"name": "help",
|
|
@@ -2584,8 +2660,11 @@
|
|
|
2584
2660
|
"name": "logsFollow",
|
|
2585
2661
|
"type": "boolean",
|
|
2586
2662
|
"char": "f",
|
|
2587
|
-
"description": "(
|
|
2588
|
-
"allowNo": false
|
|
2663
|
+
"description": "(type=logs or type=events; also accepted as --follow) Keep streaming new output — log lines, or Kubernetes events as they happen — until interrupted (ctrl-c).",
|
|
2664
|
+
"allowNo": false,
|
|
2665
|
+
"aliases": [
|
|
2666
|
+
"follow"
|
|
2667
|
+
]
|
|
2589
2668
|
},
|
|
2590
2669
|
"logsTail": {
|
|
2591
2670
|
"name": "logsTail",
|
|
@@ -4587,6 +4666,22 @@
|
|
|
4587
4666
|
"description": "Pin a value's type so Codiac doesn't infer it — keeps a boolean/numeric-looking string as a string, e.g. a Kubernetes env var value (which must be a string).",
|
|
4588
4667
|
"command": "cod config set -a my-asset -e prod -t helm --setting 'statefulSet.patch[1].value.env[5].value' --value 'false' --value-type string"
|
|
4589
4668
|
},
|
|
4669
|
+
{
|
|
4670
|
+
"description": "Rollout — zero-downtime deploys: never take an old pod down until its replacement is Ready (Codiac then surges one extra pod at a time, ie maxSurge 1, unless you set maxSurge). Pair it with a readiness probe (`cod asset probe create`) — without one, \"Ready\" only means \"started\". With no rollout settings, Codiac keeps its historical behavior: replace everything at once (maxUnavailable/maxSurge 100%).",
|
|
4671
|
+
"command": "cod config set -a my-asset -c orders -t footprint --setting rollout.maxUnavailable --value 0"
|
|
4672
|
+
},
|
|
4673
|
+
{
|
|
4674
|
+
"description": "Rollout — faster zero-downtime: alongside maxUnavailable 0, surge up to a quarter extra pods at a time (integer or 0%-100%). Set every rollout.* field at the SAME scope: a rollout set on a cabinet replaces one set on its environment entirely, and a field left unset falls back to 100%.",
|
|
4675
|
+
"command": "cod config set -a my-asset -c orders -t footprint --setting rollout.maxSurge --value 25%"
|
|
4676
|
+
},
|
|
4677
|
+
{
|
|
4678
|
+
"description": "Rollout — Recreate for singletons that must never run twice (a lock-holding queue consumer, a single-writer database): stop the old pod, then start the new one. Expect a brief gap; maxUnavailable/maxSurge are rejected with Recreate.",
|
|
4679
|
+
"command": "cod config set -a my-worker -c orders -t footprint --setting rollout.strategy --value Recreate"
|
|
4680
|
+
},
|
|
4681
|
+
{
|
|
4682
|
+
"description": "Rollout — zero-downtime for every cabinet in an environment, scripted, then deploy and watch the new pods become Ready.",
|
|
4683
|
+
"command": "cod config set -a my-asset -e prod -t footprint --setting rollout.maxUnavailable --value 0 --silent && cod asset deploy -a my-asset -u 1.4.2 -c orders --follow --silent"
|
|
4684
|
+
},
|
|
4590
4685
|
{
|
|
4591
4686
|
"description": "Apply a raw Kubernetes patch with `-t k8spatch`. The value is a JSON-Patch (RFC-6902) ARRAY of {op, path, value} operations targeting `deployment`, `service`, or `ingress` — it is NOT a partial manifest, so a top-level `spec.template...` shape is silently ignored. Always pass `--value-type string` so the JSON array is stored verbatim (not coerced). Here: pin the pod to a node pool via nodeSelector.",
|
|
4592
4687
|
"command": "cod config set -a my-asset -c dev -t k8spatch --setting deployment --value '[{\"op\":\"add\",\"path\":\"/spec/template/spec/nodeSelector\",\"value\":{\"workload\":\"extraction\"}}]' --value-type string"
|
|
@@ -4633,7 +4728,7 @@
|
|
|
4633
4728
|
"name": "type",
|
|
4634
4729
|
"type": "option",
|
|
4635
4730
|
"char": "t",
|
|
4636
|
-
"description": "Filters for the settings types that do not land in a config file (such as... env: OS environment variables, footprint: container footprint specs, helm: helm chart settings, label: container meta labels, annotation: container platform key-value pairs, k8spatch: JSON-Patch (RFC-6902) operations applied to the deployment/service/ingress — see examples).",
|
|
4731
|
+
"description": "Filters for the settings types that do not land in a config file (such as... env: OS environment variables, footprint: container footprint specs (replicas, cpu/memory, scaling.*, rollout.*), helm: helm chart settings, label: container meta labels, annotation: container platform key-value pairs, k8spatch: JSON-Patch (RFC-6902) operations applied to the deployment/service/ingress — see examples).",
|
|
4637
4732
|
"multiple": false,
|
|
4638
4733
|
"options": [
|
|
4639
4734
|
"annotation",
|
package/package.json
CHANGED