All notable changes to the CUDly CLI are documented in this file. The format is based on Keep a Changelog.
archera-comparisoncommand: a read-only, default-off comparison of an Archera commitment plan (table or JSON). Seedocs/cli/archera-comparison.md(#2156).
-
Recommendations with no account ID or name are now reported in the drop summary when an account filter (
--include-accountsor--exclude-accounts) removes them (#1613). -
A dry run now refuses an EC2 Instance Savings Plan that has no instance family and no offering ID, the same way the real run does, instead of reporting success for a purchase the offering lookup would reject (#2164).
-
A purchase result with
Success=trueand a non-nilErroris now treated as a failure in the Ctrl-C summary, the audit-stop message, the per-service success/failed counts and the non-zero exit. The CSVSuccesscolumn keeps the raw provider flag; read theErrorcolumn alongside it (#2205). -
configure gcp: pressing Enter at a[r]un, [S]kip (default)?step now skips instead of creating the service account, granting roles, minting a key or runninggcloud auth login; typerto run a step (#1613). -
configure gcpkey cleanup: the minted key is now deleted when the upload panics, a second Ctrl-C aborts the cleanup, the local key file is removed first, and a possibly orphaned key is reported whenCreateKeyfails ambiguously (cancellation, timeout, 5xx or network error), with thegcloudcommands to list and delete it (#2117). -
--min-savings-pctnow rejects values below 0 or above 100 at validation. Previously a negative value was accepted as no filter and a value above 100 silently dropped every recommendation (#2161). -
Replaying or retrying an
--input-csvpurchase no longer re-buys an ElastiCache or MemoryDB reservation that the first run already bought: CSV rows now carry the AWS provider, and MemoryDB rows use the engine AWS reports for existing nodes whatever the CSV says, so the duplicate check matches them. CSV Savings Plan rows also now match--include-regionsand--exclude-regionson their plan region (#2228). -
configure-gcp: skipping (or giving an unknown answer at) the "Create Service Account" step no longer continues with the defaultcudly-service-account@<project>email that was never created. The wizard now asks for the existing service account email, validates it as a*.gserviceaccount.comaddress, and uses it for the role grant and key steps (#2211). -
When
--max-instances,--count-overrideor the duplicate-RI check lowers a recommendation's count,ProjectedCoverageandProjectedUtilizationare re-derived for the new count instead of reporting the figures sized for the original count. This applies to RI rows with a usage signal;ProjectedCoverageis only re-derived when existing coverage is known. Savings Plans and projections that were never computed are left as they are. The RedshiftNumberOfNodesnow follows the count, including after--coverageand--target-coveragesizing. RDSProjectedCoverageis a family-wide figure and is not re-derived yet; see issue #2214 (#2206). -
An explicit
--outputpath that already exists (file, directory or symlink) is now refused during validation instead of being silently truncated. Choose a new path or remove the old file; scripts that reuse one path must do the same. Auto-generated filenames are unaffected (#2050). -
--regionsnow also narrows EC2 Instance Savings Plan recommendations to the listed regions by the plan's own region (previously only--include-regionsdid); a plan with no known region is dropped. Compute, SageMaker and Database plans stay unfiltered. In--input-csvmode--regionsstill does not narrow Savings Plans (rows are used as supplied). -
A
--purchaserun now stops, and exits 1, when an audit record cannot be written durably (disk full, log removed or made unwritable mid-run) instead of warning and buying more with no audit trail. The audit log is also probed before each real purchase, so a log that broke after the start-of-run check stops the run before buying. The report and summary for what already ran are still written, and the message says how many recommendations were attempted and to verify in AWS before re-running. Applies to the main pipeline and--input-csv; dry runs still only warn (#2103). -
Stop silently disabling the extended-support exclusion when AWS queries fail. A failed engine lifecycle query or region listing now aborts the run before any purchase; an RDS recommendation in a region whose instance inventory could not be read aborts it too, while other regions proceed with a warning. The queries are skipped entirely under
--include-extended-supportor when no RDS recommendations are in scope (#2147). -
Ctrl-C now cancels the whole invocation instead of only setting a flag that was polled between purchases. The engine-version lifecycle queries, region discovery, recommendation fetch, coverage fetch and duplicate checks treat a canceled or expired context as terminal (the run stops and buys nothing) instead of continuing with empty lifecycle data, "no recommendations" or un-deduplicated counts. A purchase already in flight is not aborted: it finishes, is written to the audit log (before the delay between purchases, which the
--input-csvpath used to run first), and the report and an "interrupted: N of M attempted" summary are still produced. Errored purchases in an interrupted run are flagged "verify in AWS before re-running". Further Ctrl-Cs are absorbed; Ctrl-\ force-quits and may lose the in-flight audit record (#2151). -
Reject NaN and infinite values for
--coverage,--target-coverage,--min-pool-sizeand--min-savings-pctbefore any API call. NaN used to pass validation and silently switch--target-coverageruns to--coveragesizing (#2136). -
--include-accountsand--exclude-accountsare both exact now: they match the account name or ID exactly (case-insensitive, surrounding whitespace ignored) instead of by substring. Previously--include-accounts devalso selecteddevops-prod, so a purchase run could buy in accounts that were not named. Behavior change: anyone relying on substring matching must now list the full account names or IDs. An--exclude-accountsvalue that matches no account exactly but is part of account names now stops the run, naming those accounts, instead of being applied as a substring (#2237).
- BREAKING:
--input-csvnow requiresTermandPaymentOptioncolumns in addition toService,Region,ResourceTypeandCount.Termmust be1yror3yrandPaymentOptionmust beall-upfront,partial-upfrontorno-upfronton every row. CSVs with only the older four columns, or with a blank or unknown value, now fail to load with an error naming the missing column or the row. - Split the CLI out of the CUDly monorepo into its own module,
github.com/LeanerCloud/cloud-commitments-cli. The shared client and provider code it depends on now lives ingithub.com/LeanerCloud/cloud-commitments-go, pinned ingo.mod. History predating the split lives in the monorepo's changelog.