devlift-cli 0.1.2__tar.gz → 0.1.4__tar.gz
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.
- {devlift_cli-0.1.2 → devlift_cli-0.1.4}/PKG-INFO +1 -1
- {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/MANUAL.md +17 -11
- {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/__init__.py +1 -1
- {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/commands/clusters.py +25 -10
- {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/commands/eks.py +9 -1
- {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/skill/SKILL.md +76 -13
- {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/skill/reference/workflows.md +35 -3
- {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli.egg-info/PKG-INFO +1 -1
- {devlift_cli-0.1.2 → devlift_cli-0.1.4}/README.md +0 -0
- {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/__main__.py +0 -0
- {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/api/__init__.py +0 -0
- {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/api/approvals.py +0 -0
- {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/api/catalog.py +0 -0
- {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/api/client.py +0 -0
- {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/api/context.py +0 -0
- {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/api/deployments.py +0 -0
- {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/api/infra.py +0 -0
- {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/api/infra_list.py +0 -0
- {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/api/kong.py +0 -0
- {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/api/services.py +0 -0
- {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/api/vpc.py +0 -0
- {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/app.py +0 -0
- {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/auth/__init__.py +0 -0
- {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/auth/oauth.py +0 -0
- {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/auth/session.py +0 -0
- {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/auth/storage.py +0 -0
- {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/commands/__init__.py +0 -0
- {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/commands/approval.py +0 -0
- {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/commands/auth.py +0 -0
- {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/commands/catalog.py +0 -0
- {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/commands/deployment.py +0 -0
- {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/commands/dynamodb.py +0 -0
- {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/commands/kong.py +0 -0
- {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/commands/languages.py +0 -0
- {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/commands/manual.py +0 -0
- {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/commands/repositories.py +0 -0
- {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/commands/request.py +0 -0
- {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/commands/s3.py +0 -0
- {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/commands/skill.py +0 -0
- {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/commands/sqs.py +0 -0
- {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/config.py +0 -0
- {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/context.py +0 -0
- {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/data/placement/vance.json +0 -0
- {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/errors.py +0 -0
- {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/ops/__init__.py +0 -0
- {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/ops/approvals.py +0 -0
- {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/ops/eks.py +0 -0
- {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/ops/kong.py +0 -0
- {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/ops/placement.py +0 -0
- {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/ops/resources.py +0 -0
- {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/ops/status.py +0 -0
- {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/ops/wait.py +0 -0
- {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/render/__init__.py +0 -0
- {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/render/output.py +0 -0
- {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/resolve/__init__.py +0 -0
- {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/resolve/allowlist.py +0 -0
- {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/resolve/names.py +0 -0
- {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/skill/reference/commands.md +0 -0
- {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli/skill/reference/exit-codes.md +0 -0
- {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli.egg-info/SOURCES.txt +0 -0
- {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli.egg-info/dependency_links.txt +0 -0
- {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli.egg-info/entry_points.txt +0 -0
- {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli.egg-info/requires.txt +0 -0
- {devlift_cli-0.1.2 → devlift_cli-0.1.4}/devlift_cli.egg-info/top_level.txt +0 -0
- {devlift_cli-0.1.2 → devlift_cli-0.1.4}/pyproject.toml +0 -0
- {devlift_cli-0.1.2 → devlift_cli-0.1.4}/setup.cfg +0 -0
|
@@ -227,11 +227,13 @@ devlift clusters list [--app NAME] [--env ENV] [--region REGION] [--type eks|ecs
|
|
|
227
227
|
```
|
|
228
228
|
|
|
229
229
|
The clusters services run on, and the `--cluster` values for `eks create`.
|
|
230
|
-
Narrowed
|
|
231
|
-
the environments this deployment serves,
|
|
232
|
-
(section 5) says which of those offer EKS or ECS
|
|
233
|
-
|
|
234
|
-
|
|
230
|
+
Narrowed by three filters, the same ones a create goes through: the backend
|
|
231
|
+
reports only the environments this deployment serves, the placement allowlist
|
|
232
|
+
(section 5) says which of those offer EKS or ECS, and only a **registered**
|
|
233
|
+
cluster may take a new service. Anything outside those is real but can never
|
|
234
|
+
be chosen, so it is hidden and counted. `--all` drops all three and shows
|
|
235
|
+
everything the backend reports, for checking what exists rather than for
|
|
236
|
+
choosing.
|
|
235
237
|
|
|
236
238
|
```
|
|
237
239
|
devlift clusters list --type eks --app core --env stage
|
|
@@ -239,16 +241,20 @@ devlift clusters list --type eks --app core --env stage
|
|
|
239
241
|
|
|
240
242
|
```
|
|
241
243
|
22 of 25 hidden: not a placement this deployment offers; --all shows everything.
|
|
244
|
+
2 more hidden: not registered, so no service can be created on them.
|
|
242
245
|
|
|
243
|
-
Cluster
|
|
246
|
+
Cluster Type Environment Region Application Registered
|
|
244
247
|
acme-core-stage-mumbai-01-application-cluster EKS stage Mumbai core yes
|
|
245
|
-
…two more in the same placement, not registered
|
|
246
248
|
```
|
|
247
249
|
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
250
|
+
Everything listed is a cluster `eks create` would accept. A row whose
|
|
251
|
+
Application reads "tenant-level" belongs to no single product and is the
|
|
252
|
+
fallback for products with no cluster of their own.
|
|
253
|
+
|
|
254
|
+
**Name and code are two labels for one cluster.** The Cluster column and
|
|
255
|
+
`eks create` both show the name; the Code column and `eks show`'s
|
|
256
|
+
`cluster_code` show the backend's identifier. They look nothing alike, so do
|
|
257
|
+
not read a difference between them as two different clusters.
|
|
252
258
|
|
|
253
259
|
With exactly one registered cluster in a placement, `eks create` fills it in
|
|
254
260
|
silently. With several it asks, or wants `--cluster` under `--no-input`.
|
|
@@ -66,14 +66,17 @@ def clusters_list(
|
|
|
66
66
|
):
|
|
67
67
|
"""List the clusters a service can run on.
|
|
68
68
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
for
|
|
69
|
+
Three filters, the same ones every create goes through: placements this
|
|
70
|
+
deployment serves, placements the allowlist permits, and registration.
|
|
71
|
+
Only a registered cluster may take a new service, so an unregistered one
|
|
72
|
+
is never a candidate and is not listed. Everything shown here is a cluster
|
|
73
|
+
`eks create` would actually accept.
|
|
74
|
+
|
|
75
|
+
`--all` drops all three and shows everything the backend reports, which is
|
|
76
|
+
for checking what exists rather than for choosing.
|
|
77
|
+
|
|
78
|
+
A cluster with no application is tenant-level and is the fallback for
|
|
79
|
+
every product that has none of its own.
|
|
77
80
|
"""
|
|
78
81
|
inv: Invocation = ctx.obj
|
|
79
82
|
res = Resolver(inv.api, inv.profile.name)
|
|
@@ -95,8 +98,20 @@ def clusters_list(
|
|
|
95
98
|
if not show_all:
|
|
96
99
|
before = len(rows)
|
|
97
100
|
rows = _placeable(res, rows)
|
|
98
|
-
|
|
99
|
-
|
|
101
|
+
placement_hidden = before - len(rows)
|
|
102
|
+
|
|
103
|
+
# Unregistered clusters are not offerable, so listing them is worse than
|
|
104
|
+
# useless: a service cannot be created on one, and naming it invites a
|
|
105
|
+
# comparison against the registered cluster that reads as a discrepancy.
|
|
106
|
+
# `--all` still shows them, for someone checking what exists.
|
|
107
|
+
registered = [r for r in rows if r.get("is_registered")]
|
|
108
|
+
unregistered_hidden = len(rows) - len(registered)
|
|
109
|
+
rows = registered
|
|
110
|
+
|
|
111
|
+
if placement_hidden:
|
|
112
|
+
output.info(f"{placement_hidden} of {before} hidden: not a placement this deployment offers; --all shows everything.")
|
|
113
|
+
if unregistered_hidden:
|
|
114
|
+
output.info(f"{unregistered_hidden} more hidden: not registered, so no service can be created on them.")
|
|
100
115
|
inv.emit(rows, lambda d: rows_table(
|
|
101
116
|
["Cluster", "Type", "Environment", "Region", "Application", "Registered", "Status", "Code"],
|
|
102
117
|
[(r.get("cluster_name") or r.get("name"), r.get("cluster_type"), r.get("environment"),
|
|
@@ -119,7 +119,13 @@ def eks_show(
|
|
|
119
119
|
request = eff.draft
|
|
120
120
|
data = {
|
|
121
121
|
"service": eff.target.service_name, "service_config_code": eff.target.config_code,
|
|
122
|
-
"environment": live.get("environment"), "region": eff.target.region_name,
|
|
122
|
+
"environment": live.get("environment"), "region": eff.target.region_name,
|
|
123
|
+
# The NAME, the same identifier `eks create` and `clusters list` print.
|
|
124
|
+
# This used to report infrastructure_mst_code, so the two commands named
|
|
125
|
+
# one cluster two different ways and anyone comparing them concluded the
|
|
126
|
+
# service had moved. The code is still here, under its own key.
|
|
127
|
+
"cluster": eff.config.get("cluster_name") or live.get("infrastructure_mst_code"),
|
|
128
|
+
"cluster_code": live.get("infrastructure_mst_code"),
|
|
123
129
|
"type": eff.service.get("service_type"), "repository": eff.config.get("repository"),
|
|
124
130
|
"branches": eff.config.get("branches") or eff.config.get("selected_branches"),
|
|
125
131
|
"language": f"{eff.language_label or ''} {eff.language_version or ''}".strip() or None,
|
|
@@ -131,6 +137,8 @@ def eks_show(
|
|
|
131
137
|
output.err_console.print(kv_table([
|
|
132
138
|
("Service", d["service"]), ("Type", d["type"]), ("Environment", f"{d['environment']} / {d['region']}"),
|
|
133
139
|
("Cluster", d["cluster"]), ("Repository", d["repository"] or "–"),
|
|
140
|
+
# Kept out of the table: the code adds nothing a reader can act on,
|
|
141
|
+
# and showing both invites exactly the comparison this fixes.
|
|
134
142
|
("Branches", ", ".join(d["branches"] or []) or "–"), ("Language", d["language"] or "–"),
|
|
135
143
|
("Pending request", f"{d['pending_request']['code']} ({d['pending_request']['status']})" if d["pending_request"] else "none"),
|
|
136
144
|
], title=d["service"]))
|
|
@@ -160,19 +160,29 @@ are in `reference/workflows.md`.
|
|
|
160
160
|
and prints two tables on stderr: the service (placement, cluster it
|
|
161
161
|
picked, repository, branches, language) and the Configuration table with
|
|
162
162
|
a "From" column saying which values came from the language template.
|
|
163
|
-
3. **
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
with
|
|
163
|
+
3. **Reproduce both tables in your reply, then ask.** Paste them as the
|
|
164
|
+
command printed them, inside a code block, every row, in the same order,
|
|
165
|
+
with the "From" column intact. They are the summary. Do not replace them
|
|
166
|
+
with prose, do not show only the rows you think matter, and do not lead
|
|
167
|
+
with your own commentary: the user is about to approve these exact values
|
|
168
|
+
and cannot approve what they cannot see. Anything you want to point out
|
|
169
|
+
goes AFTER the tables, in a line or two.
|
|
170
|
+
|
|
171
|
+
Then ask: "These are the standard <language> values. Apply them, or tell
|
|
172
|
+
me what to change?" That reply is text and ends the turn — no dialog, no
|
|
173
|
+
tool call, because a dialog would hide the table they are deciding on. Do
|
|
174
|
+
not rerun with `-y` until they answer.
|
|
168
175
|
4. A change ("port 9000", "1 GiB memory limit", "turn on autoscaling 2 to 4")
|
|
169
176
|
becomes `--set` flags on the rerun: `--set port=9000`,
|
|
170
177
|
`--set memory_limit=1`, `--set hpa_enabled=true --set min_replicas=2
|
|
171
178
|
--set max_replicas=4`. Rerun without `-y` once more only if the change is
|
|
172
|
-
large; otherwise rerun with `-y
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
179
|
+
large; otherwise rerun with `-y`.
|
|
180
|
+
5. **Report what is now waiting to be reviewed, not the codes it returned.**
|
|
181
|
+
Run `devlift request show <service> --env <env> --no-input -o json` and
|
|
182
|
+
show what it lists: every row in the change set and the fields each one
|
|
183
|
+
changes. Say it is a **draft**, nothing is deployed, and name the next
|
|
184
|
+
step: `request submit`, then a reviewer's `approval approve`, then
|
|
185
|
+
`eks deploy`.
|
|
176
186
|
|
|
177
187
|
The same show-then-ask shape applies to every write: `eks edit` and the
|
|
178
188
|
update commands print Current | New, `kong route …` prints the route change,
|
|
@@ -181,12 +191,65 @@ the approved rows. The summary is printed on every dry run, in json mode too.
|
|
|
181
191
|
|
|
182
192
|
## Reporting back to the user
|
|
183
193
|
|
|
184
|
-
- After a dry run (exit 5)
|
|
185
|
-
the go-ahead.
|
|
186
|
-
|
|
187
|
-
|
|
194
|
+
- **After a dry run (exit 5), paste what the command printed, verbatim, in a
|
|
195
|
+
code block**, then ask for the go-ahead. Every row of every table, in order.
|
|
196
|
+
A summary you wrote yourself is not a substitute: the user is approving the
|
|
197
|
+
values in that output, so replacing it with "two differences worth your
|
|
198
|
+
call" hides the other twenty they are also agreeing to. Commentary is
|
|
199
|
+
welcome after it, never instead of it.
|
|
200
|
+
- **After a draft write, show what will go to review — not the codes.**
|
|
201
|
+
`eks create`, `eks edit` and `kong route …` all save a draft. The service
|
|
202
|
+
code, the configuration code and the queue code are plumbing: they belong in
|
|
203
|
+
your next tool call, not in a sentence a person reads. Run
|
|
204
|
+
`devlift request show <service> --env <env> --no-input -o json` and report
|
|
205
|
+
what it lists: every row in the change set, and for each one the fields it
|
|
206
|
+
changes. A service's settings and its Kong routes are **one change set**, so
|
|
207
|
+
a route added earlier will be submitted by this submit too, and the user has
|
|
208
|
+
to see that before they agree to it. Mention a code only if the user asks,
|
|
209
|
+
or when they need it to run a command themselves.
|
|
188
210
|
- A draft is not deployed. Say so, and name the next command
|
|
189
211
|
(`request submit`, then `approval approve`, then `eks deploy`).
|
|
212
|
+
- **After `request submit`, say three things.** That it is submitted and now
|
|
213
|
+
waiting for approval. How many rows moved and which kinds (settings,
|
|
214
|
+
gateway/Kong, variables) — the submit result's `requests[]` gives you both.
|
|
215
|
+
And who approves it next.
|
|
216
|
+
For that last one, do not guess and never write "if you have approval
|
|
217
|
+
rights": run `devlift request show <service> --env <env> --no-input -o json`
|
|
218
|
+
and read `you.can_approve`. If it is true, say plainly that they can approve
|
|
219
|
+
it themselves and offer `devlift approval approve <service> --env <env>`. If
|
|
220
|
+
it is false, say it needs a reviewer on that resource group. The user should
|
|
221
|
+
never have to work out their own permissions.
|
|
222
|
+
- **After `approval approve`, show the approved change in full.** This is the
|
|
223
|
+
last checkpoint before anything reaches a cluster, so a queue code and the
|
|
224
|
+
word "approved" are not enough. Run `devlift request show <service> --env
|
|
225
|
+
<env> --no-input -o json` and show its frozen diff — every row, Field, From,
|
|
226
|
+
To — so the user sees exactly what is now cleared to ship. Then read
|
|
227
|
+
`you.can_deploy` from that same output: if true, say they can deploy it and
|
|
228
|
+
offer `devlift eks deploy <service> --env <env>` (`--wait` follows it to the
|
|
229
|
+
end); if false, say a deployer has to run it. Check, never guess, exactly as
|
|
230
|
+
with approval.
|
|
231
|
+
- **After `eks deploy`, show what is shipping and where it has got to.** Run
|
|
232
|
+
`devlift deployment status <workflow-id> --no-input -o json` and show its
|
|
233
|
+
pipeline stages as the command gives them — each stage with its status and
|
|
234
|
+
timing — so the user can see which step is running rather than reading a
|
|
235
|
+
sentence about it. Say what is being deployed, which is the change that was
|
|
236
|
+
just approved, and keep the workflow id visible because every later check
|
|
237
|
+
needs it. Then name both follow-ups and the difference between them:
|
|
238
|
+
`deployment status <workflow-id> --wait` says when DevLift's own pipeline
|
|
239
|
+
finished, and `eks status <service> --env <env>` also asks ArgoCD whether the
|
|
240
|
+
pod is actually serving, which is the real "is it up" question. A finished
|
|
241
|
+
pipeline is not a running application.
|
|
242
|
+
- **Never compare a cluster code with a cluster name.** `eks show` returns both
|
|
243
|
+
`cluster` (the name, e.g. `acme-core-stage-mumbai-01-application-cluster`)
|
|
244
|
+
and `cluster_code` (e.g. `infra-acme-eks-staging-mumbai-app-01`). They are
|
|
245
|
+
two labels for the SAME cluster. Use `cluster` when you talk about it, and
|
|
246
|
+
never tell a user their services are on different clusters because the
|
|
247
|
+
strings differ — check with `devlift clusters list` before claiming any such
|
|
248
|
+
thing. That list is already narrowed to registered clusters a service can
|
|
249
|
+
actually be created on, so it is the authority.
|
|
250
|
+
- Resources behave differently. `s3`, `sqs` and `dynamodb` create and update
|
|
251
|
+
deploy straight away, so there report the resource name and the workflow id,
|
|
252
|
+
which is what `deployment status` needs.
|
|
190
253
|
- On exit 7 quote the message: it names the conflicting request or the rule
|
|
191
254
|
(one live request per service, one auth per Kong tag, a name that exists).
|
|
192
255
|
- On exit 2 stop and tell the user to sign in; on exit 4 say who to ask.
|
|
@@ -42,12 +42,18 @@ devlift repositories branches Regobs/orders --no-input -o json | jq -r '.[].name
|
|
|
42
42
|
devlift languages list --no-input -o json
|
|
43
43
|
devlift eks create --name orders --app core --env stage --region mumbai --type api \
|
|
44
44
|
--repo Regobs/orders --branch main --language go --version 1.24 --no-input -o json 2>&1 # exit 5: two tables (service, configuration with From column) on stderr
|
|
45
|
-
#
|
|
45
|
+
# PASTE BOTH TABLES VERBATIM into your reply, in a code block, every row, before anything else you write.
|
|
46
|
+
# They are the summary — a prose rewrite hides the values the user is about to approve. Commentary goes after them.
|
|
47
|
+
# Then ASK: "These are the standard Go values. Apply them, or tell me what to change?"
|
|
46
48
|
# a change becomes --set on the rerun, e.g. --set cpu_limit=0.5 --set hpa_enabled=true --set min_replicas=1 --set max_replicas=3
|
|
47
49
|
devlift eks create … --no-input -y -o json
|
|
48
50
|
# → {service_code, service_config_code, queue_code, queue_status: "draft", config}
|
|
51
|
+
devlift request show orders --env stage --no-input -o json # what now waits for review
|
|
49
52
|
```
|
|
50
|
-
|
|
53
|
+
Report what `request show` lists — the rows in the change set and the fields
|
|
54
|
+
each changes. Do NOT report service_code / service_config_code / queue_code:
|
|
55
|
+
they are plumbing for your next call, not something a person reads. Then tell
|
|
56
|
+
the user it is a draft, nothing is deployed, and continue with workflow 6.
|
|
51
57
|
`--type worker` drops health/service_path/ALB fields (no load balancer).
|
|
52
58
|
|
|
53
59
|
## 4. Change a running service's settings
|
|
@@ -74,22 +80,48 @@ the other auth → exit 7: pick another `--tag`.
|
|
|
74
80
|
## 6. Review lane (settings and routes move together)
|
|
75
81
|
|
|
76
82
|
```
|
|
83
|
+
devlift request show orders --env stage --no-input -o json # EVERYTHING that submit will send: settings AND Kong routes
|
|
77
84
|
devlift request list --service orders --env stage --no-input -o json # what exists, statuses, you.can_approve / can_deploy
|
|
78
85
|
devlift request submit orders --no-input -y -o json # → requests[] all "submit"; exit 7 if another author holds the lane
|
|
86
|
+
devlift request show orders --env stage --no-input -o json # after submit: you.can_approve says whether THIS user may approve it
|
|
79
87
|
devlift approval list --no-input -o json # reviewer inbox
|
|
80
88
|
devlift request show orders --no-input -o json # frozen diff for the reviewer
|
|
81
89
|
devlift approval approve orders --no-input -y -o json # → requests[] all "approved"
|
|
90
|
+
devlift request show orders --env stage --no-input -o json # after approve: the frozen diff to show, and you.can_deploy
|
|
82
91
|
# alternatives: approval request-changes orders --comment "…" -y ; approval reject orders --comment "…" -y ; approval revoke orders -y ; request withdraw orders -y
|
|
83
92
|
```
|
|
93
|
+
Before submitting, show the user what `request show` lists and get their
|
|
94
|
+
go-ahead. Submit moves the WHOLE change set, so a Kong route added earlier
|
|
95
|
+
ships with the settings change; someone who only remembers editing CPU must
|
|
96
|
+
not discover the route at approval time.
|
|
97
|
+
|
|
98
|
+
After submitting, report that it is waiting for approval, how many rows moved
|
|
99
|
+
and of which kinds, and who approves next. Read `you.can_approve` from
|
|
100
|
+
`request show` rather than writing "if you have approval rights" — the CLI
|
|
101
|
+
knows, so the user should not have to.
|
|
102
|
+
|
|
103
|
+
After approving, show the frozen diff in full (every row, Field | From | To):
|
|
104
|
+
approval is the last checkpoint before a cluster, and "approved" on its own
|
|
105
|
+
tells the user nothing about what they just cleared. Then read `you.can_deploy`
|
|
106
|
+
the same way to say whether they can ship it themselves.
|
|
107
|
+
|
|
84
108
|
Self-approval works only where the resource group's rule allows it (403 → exit 4 otherwise).
|
|
85
109
|
|
|
86
110
|
## 7. Deploy and verify
|
|
87
111
|
|
|
88
112
|
```
|
|
89
113
|
devlift eks deploy orders --env stage --no-input # lists approved rows, exit 5
|
|
90
|
-
devlift eks deploy orders --env stage --no-input -y
|
|
114
|
+
devlift eks deploy orders --env stage --no-input -y -o json # → {workflow_id, requests[]}
|
|
115
|
+
devlift deployment status <workflow_id> --no-input -o json # stages with status + timing, pr_url, resources
|
|
91
116
|
devlift eks status orders --env stage --no-input -o json # .deployment (stages, pr_url) and .application (ArgoCD state)
|
|
92
117
|
```
|
|
118
|
+
After deploying, show the pipeline stages as the command gives them, each with
|
|
119
|
+
its status and timing, plus what is shipping and the workflow id. Do not
|
|
120
|
+
replace the stage list with a sentence: the user wants to see which step is
|
|
121
|
+
running. Name both follow-ups and the difference — `deployment status --wait`
|
|
122
|
+
answers "did DevLift's pipeline finish", `eks status` also asks ArgoCD "is the
|
|
123
|
+
pod serving". A finished pipeline is not a running application.
|
|
124
|
+
|
|
93
125
|
Production: `--confirm-name orders` in place of relying on `-y`.
|
|
94
126
|
Read `.application.state`: `up` = healthy pod; `waiting_for_argocd` /
|
|
95
127
|
`starting` = keep polling (`--wait`); `not_configured` = no ArgoCD for that
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|