Releases: butlerdotdev/butler-api
Release list
v0.22.0
Local provider type for the laptop path
- New
localprovider for ClusterBootstrap and ProviderConfig: installs Butler onto a kind-based management cluster and provisions tenant workers as containers via the Cluster API Docker provider (CAPD), for running Butler on a laptop with no hypervisor. - Adds
ProviderTypeLocal, an optionalLocalProviderConfig(kindNodeImageoverride), andClusterBootstrap.IsLocal(). credentialsRefis now optional on ProviderConfig (the local provider needs no credentials).
Validation
- A CEL rule on ProviderConfig requires a non-empty
credentialsRef.namefor every non-local provider and exempts local, so a credential-less non-local config is rejected at admission.
Known follow-up
ProviderConfig.CredentialsRef should become *SecretReference (tracked in #47) so credential-less local configs round-trip cleanly. Until then a local ProviderConfig shows a cosmetic not-Ready status; provisioning is unaffected.
v0.17.0
Adds InfrastructureAllocations status field to NetworkPoolStatus for tracking infrastructure IP usage within reserved ranges.
InfrastructureAllocationtype:ip(required),source(required),serviceRef(optionalNamespacedObjectReference)+listType=mapkeyed onipfor SSA merge semantics- Purely additive, backward-compatible change
PR: #41
v0.16.0
Multi-range tenant allocation support
Adds AllocationRange type and Ranges field to TenantAllocationConfig, enabling non-contiguous allocatable IP ranges within a single NetworkPool.
Changes
AllocationRangetype withStart/Endfields, max 16 per poolTenantAllocationConfig.Rangesfield supersedes deprecatedStart/EndGetEffectiveRanges()helper centralizing precedence logic- CRD schema updated (backwards compatible —
Start/Endrelaxed from required to optional)
Backwards compatibility
Existing manifests with start/end continue to work unchanged. Webhook validation for the new fields is implemented in butler-controller (separate release).
Closes #39.
v0.11.0
v0.9.4
v0.9.3
v0.9.2
fix: remove omitempty from WorkerNodesReady/WorkerNodesDesired status fields
Zero is a valid value for these int32 fields. With omitempty, 0 was dropped from JSON serialization, making it impossible for consumers to distinguish "0 ready" from "field not set".
v0.9.1
What's Changed
feat: add ImageURN and VMSize to AzureProviderConfig (#24)
- Added
vmSizefield for default Azure VM size (e.g.,Standard_D4s_v3) - Added
imageURNfield supporting three formats:- Standard URN:
publisher:offer:sku:version - Managed image resource ID:
/subscriptions/.../images/my-image - Shared gallery image ID:
/subscriptions/.../galleries/.../images/.../versions/...
- Standard URN:
Full Changelog: v0.9.0...v0.9.1
v0.9.0
What's Changed
feat: add LoadBalancerRequest CRD for cloud control plane load balancers
New LoadBalancerRequest CRD (shortName: lbr) for provisioning cloud-native load balancers as control plane endpoints during management cluster bootstrap.
LoadBalancerRequestSpec:
clusterName(immutable) — DNS-safe cluster name used for cloud resource namingproviderConfigRef(immutable) — references ProviderConfig with cloud credentialsport(default: 6443) — target port on backend instanceshealthCheckPort— optional separate health check porttargets— incrementally updated list of backend instances (IP, instanceID, instanceName)
LoadBalancerRequestStatus:
- Phase lifecycle:
Pending->Creating->Ready->Failed/Deleting endpoint— load balancer IP or DNS name (populated at Ready)resourceID— cloud resource identifier for cleanupregisteredTargets— count of registered backends- Standard
conditions(Provisioned,TargetsSynced)
kubectl UX:
- Print columns: Cluster, Phase, Endpoint, Targets, Age
Helper methods: IsReady(), IsFailed(), IsTerminating(), SetPhase(), SetFailure(), GetHealthCheckPort()
Constants: FinalizerLoadBalancerRequest
Full Changelog: v0.8.0...v0.9.0
v0.8.0
What's Changed
feat: cloud-aware bootstrap API types (#22)
ClusterBootstrap cloud provider support:
- Expanded provider enum to include
gcp,aws,azurealongsideharvester,nutanix,proxmox - VIP field is now optional for cloud providers (no kube-vip needed)
- VIP accepts DNS hostnames in addition to IP addresses for cloud LB endpoints
- Added
IsCloudProvider()helper method - Console addon now defaults to enabled
- Network validation updated: DNS-based VIPs skip MetalLB pool overlap checks
GCP ProviderConfig expansion:
- Added
zone,machineType,imageProject,imageFamily,image,serviceAccount,tagsfields - Added
gcpcredential key documentation (serviceAccountKey)
TenantCluster multi-OS and GCP support:
- Added
kairosandbottlerocketOS types to the enum - Added
sshAuthorizedKeytoOSSpecfor non-Talos workers - Added
GCPOverridefor per-cluster GCP settings (zone, machineType, image, imageFamily, subnetwork)
ButlerConfig addition:
- Added
sshAuthorizedKeyfor platform-default SSH key on non-Talos workers
Full Changelog: v0.7.0...v0.8.0