|
| 1 | +# Changelog |
| 2 | + |
| 3 | +All notable changes to this project are documented here. |
| 4 | + |
| 5 | +The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and |
| 6 | +this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). |
| 7 | + |
| 8 | +## [Unreleased] |
| 9 | + |
| 10 | +### Planned |
| 11 | +- `VCENTER_TLS_VERIFY` flag (bool) for vCenter certs issued by a public |
| 12 | + CA. Enabling it uses `ssl.create_default_context()` with no `cafile`, |
| 13 | + which falls back to OpenSSL's system trust store. Chart exposes it as |
| 14 | + `vcenter.tlsVerify`. Existing `VCENTER_CA_BUNDLE` continues to cover |
| 15 | + the self-signed and self-hosted-CA cases unchanged. |
| 16 | + |
| 17 | +## [0.4.0] — 2026-04-21 |
| 18 | + |
| 19 | +### Added |
| 20 | +- Optional TLS verification against vCenter via `VCENTER_CA_BUNDLE`. |
| 21 | + When set, uses `ssl.create_default_context(cafile=...)`; otherwise falls |
| 22 | + back to the previous unverified behaviour and logs a warning. |
| 23 | +- `reconcile_pending_drains(host_states)` runs every poll. Picks up GPU |
| 24 | + nodes on in/entering-maintenance hosts that still have no state |
| 25 | + annotation — covers the case where `MAX_CONCURRENT_DRAINS` throttled the |
| 26 | + edge-trigger and the skipped host would otherwise never be retried. |
| 27 | +- `get_inventory_snapshot()` emits both `host_states` and a |
| 28 | + `vm_host_map` from a single `HostSystem` view walk. `reconcile_powered_off` |
| 29 | + now consults the map instead of making a per-node `get_vm_host` round-trip |
| 30 | + to vCenter on every poll. |
| 31 | +- Minimal Helm chart under `chart/`, published as OCI to |
| 32 | + `ghcr.io/varashi/charts/gpu-node-vsphere-maintenance-controller`. |
| 33 | +- GitHub Actions: `ci.yaml` (ruff, hadolint, helm lint, buildx smoke build) |
| 34 | + on pull requests; `release.yaml` on `v*.*.*` tag push builds multi-arch |
| 35 | + images (amd64, arm64), cosign-signs keyless via OIDC, attaches SBOM and |
| 36 | + build-provenance attestations, packages and pushes the Helm chart, and |
| 37 | + creates a GitHub Release with the body extracted from this file. |
| 38 | +- This `CHANGELOG.md`, seeded from the previous README "Version history". |
| 39 | + |
| 40 | +### Changed |
| 41 | +- Dockerfile pinned to `python:3.13-slim`. `pyVmomi==8.0.3.0.1` predates |
| 42 | + Python 3.14 and has not been tested against it upstream. |
| 43 | +- `startup_reconcile` delegates its "host already in maintenance at boot" |
| 44 | + branch to `reconcile_pending_drains` so the two paths share one |
| 45 | + implementation. |
| 46 | +- Example Deployment in the README sets `strategy.type: Recreate`. With |
| 47 | + `replicas: 1` this closes the brief double-run window that was previously |
| 48 | + only partially mitigated by idempotency at the state-machine level. |
| 49 | + |
| 50 | +### Fixed |
| 51 | +- Concurrent power-off race: a `PowerOff()` landing on an already-off VM |
| 52 | + previously bubbled an `InvalidPowerState` error through the generic |
| 53 | + exception catch and aborted the cycle mid-transition. Now treated as |
| 54 | + success, symmetric to the existing power-on handling. |
| 55 | + |
| 56 | +### Removed |
| 57 | +- `policy/poddisruptionbudgets` verb from the example ClusterRole. The |
| 58 | + controller never calls the PDB API — PDB-blocked evictions are handled |
| 59 | + via the 429 response on `pods/eviction`. |
| 60 | + |
| 61 | +## [0.3.0] — 2026-04-19 |
| 62 | + |
| 63 | +### Added |
| 64 | +- `GUEST_SHUTDOWN_TIMEOUT_SECONDS` (default `120`). `power_off_vm` now |
| 65 | + requests a graceful guest shutdown via VMware Tools and falls back to |
| 66 | + a hard `PowerOff()` on `ToolsUnavailable`, on any `VimFault` rejecting |
| 67 | + the shutdown, or after the timeout elapses. |
| 68 | + |
| 69 | +### Changed |
| 70 | +- `_try_migrate` distinguishes expected vSphere failures from bugs: |
| 71 | + `RuntimeError` (surfaced from `_wait_task`) and `vim.fault.VimFault` |
| 72 | + (e.g. `NoCompatibleHost`, `InsufficientResources`) log as one-line |
| 73 | + WARNINGs. Unexpected exceptions still log with a full traceback. |
| 74 | + |
| 75 | +## [0.2.3] — 2026-04 |
| 76 | + |
| 77 | +### Changed |
| 78 | +- Reconcile loop classifies transient kube-apiserver errors (408, 429, |
| 79 | + 5xx) and urllib3 transport blips as WARNING instead of ERROR + |
| 80 | + traceback. Genuine exceptions still log with the full traceback. |
| 81 | + |
| 82 | +## [0.2.2] |
| 83 | + |
| 84 | +### Added |
| 85 | +- OCI image labels. No code change; extracted to a dedicated GitHub repo. |
| 86 | + |
| 87 | +## [0.2.1] |
| 88 | + |
| 89 | +### Fixed |
| 90 | +- Concurrent power-on race with DRS handled explicitly. |
| 91 | +- Stale `powered-off` annotation: a VM already running elsewhere now |
| 92 | + transitions to `migrated` on the next poll. |
| 93 | + |
| 94 | +## [0.2.0] |
| 95 | + |
| 96 | +### Added |
| 97 | +- Cold-migrate to a free GPU-capable host after power-off, either via |
| 98 | + DRS full-automation `PowerOn()` or manual `RelocateVM`. |
| 99 | + |
| 100 | +## [0.1.1] |
| 101 | + |
| 102 | +### Fixed |
| 103 | +- `reconcile_powered_off` checked host state before uncordoning. |
| 104 | + |
| 105 | +## [0.1.0] |
| 106 | + |
| 107 | +### Added |
| 108 | +- Initial release: drain → power-off → wait-for-exit → power-on → |
| 109 | + uncordon, driven by edge-triggered `HostSystem.recentTask` polling. |
| 110 | + |
| 111 | +[Unreleased]: https://github.com/Varashi/gpu-node-vsphere-maintenance-controller/compare/v0.4.0...HEAD |
| 112 | +[0.4.0]: https://github.com/Varashi/gpu-node-vsphere-maintenance-controller/compare/v0.3.0...v0.4.0 |
| 113 | +[0.3.0]: https://github.com/Varashi/gpu-node-vsphere-maintenance-controller/compare/v0.2.3...v0.3.0 |
| 114 | +[0.2.3]: https://github.com/Varashi/gpu-node-vsphere-maintenance-controller/compare/v0.2.2...v0.2.3 |
| 115 | +[0.2.2]: https://github.com/Varashi/gpu-node-vsphere-maintenance-controller/compare/v0.2.1...v0.2.2 |
| 116 | +[0.2.1]: https://github.com/Varashi/gpu-node-vsphere-maintenance-controller/compare/v0.2.0...v0.2.1 |
| 117 | +[0.2.0]: https://github.com/Varashi/gpu-node-vsphere-maintenance-controller/compare/v0.1.1...v0.2.0 |
| 118 | +[0.1.1]: https://github.com/Varashi/gpu-node-vsphere-maintenance-controller/compare/v0.1.0...v0.1.1 |
| 119 | +[0.1.0]: https://github.com/Varashi/gpu-node-vsphere-maintenance-controller/releases/tag/v0.1.0 |
0 commit comments