Changelog
All notable changes to this project are documented in this file.
The format follows Keep a Changelog, and this project adheres to Semantic Versioning.
Versioning & Branch Policy
| Branch | Version series | Status |
|---|---|---|
main | v1.x | Active development — GA release line |
legacy | v0.1.x | Maintenance — bug fixes and security patches only |
main— v1.x (current): GA release line. v1.0.0 stabilises thepkg/aruba/wrapper layer introduced in v0.2.0: flattened getter taxonomy, async polling helpers, automatic User-Agent injection, and the final*Request/*Response/*Commonnaming convention acrosspkg/types. See v1.0.0 below for migration details.legacy— v0.1.x (maintenance): Supported for 6 months after the v0.2.0 release date with bug-fix and security-patch releases only. No new features will be backported. Once the support window closes thelegacybranch will be archived.
[Unreleased]
[1.0.8] — 2026-07-27
Added
kvPrefixsupport in Vault credentials repository (internal/impl/auth/credentialsrepository/vault,pkg/aruba) —WithVaultCredentialsRepositorynow accepts akvPrefix stringparameter (inserted betweenkvMountandkvPath). The prefix is prepended to the secret path when calling the Vault KV v2GetAPI (<kvMount>/<kvPrefix>/<kvPath>), enabling secrets stored under a shared path prefix within a single KV mount. Passing an empty string preserves the previous behaviour — the path is constructed as<kvMount>/<kvPath>with no prefix segment.
[1.0.7] — 2026-07-20
Fixed
-
RegionalResourceMetadataRequest.Locationomitted from Update requests when region is unset (pkg/types,pkg/aruba) —Locationwas typed asLocationRequest(value, noomitempty), so the SDK always serialised"location":{"value":"..."}in every Create and Update request body. The SecurityRule Update endpoint (and potentially others) reject this field with400 Validation: Location Invalidwhen a location is included in an Update. Sending{"value":""}also fails — the field must be absent entirely. Fix:Locationis now*LocationRequestwithjson:"location,omitempty", andtoLocation()returnsnilwhen the region is empty (e.g. afterInRegion("")) so the field is omitted from the serialised JSON. Create behaviour is unchanged — a region is always set before Create sotoLocation()still returns a non-nil pointer and the location is included as before. -
SecurityRulePropertiesResponse.Portdeserialisation from object form (pkg/types,pkg/aruba) — The SecurityRule Get endpoint returnsportas a plain JSON string ("80"), but the Update endpoint returns it as a JSON object ({"value":"80"}). The field was typedstring, causing unmarshalling the Update response to fail with:json: cannot unmarshal object into Go struct field SecurityRulePropertiesResponse.properties.port of type string. Fix:PortinSecurityRulePropertiesResponseis nowFlexPort, a custom type whoseUnmarshalJSONaccepts both the string and object forms and normalises to a plain string.MarshalJSONstill emits a plain string so request bodies are unaffected.
[1.0.6] — 2026-07-14
Added
-
Cloud Server update delta setters (
pkg/aruba) — eight new fluent setters record association/attachment intent on a*CloudServerwrapper for use inUpdatecalls:AssociateSubnets,DisassociateSubnets,AssociateSecurityGroups,DisassociateSecurityGroups,AssociateElasticIPs,DisassociateElasticIPs,AttachDataVolumes,DetachDataVolumes. Repeated calls on the same setter append; queues are cleared after a successfulUpdate. -
Four new low-level API endpoints (
internal/clients/compute) —AssociateSubnets,AssociateSecurityGroups,AssociateElasticIPs,AttachDetachDataVolumesmap to the dedicated Aruba Cloud REST actions (associateDisassociateSubnets,associateDisassociateSecurityGroups,associateDisassociateElasticIPs,attachDetachDataVolumes), replacing the previous practice of bundling all changes into a single PUT that only honoured name/tag fields. -
Four new
pkg/typesrequest structs —CloudServerAssociateSubnetsRequest,CloudServerAssociateSecurityGroupsRequest,CloudServerAssociateElasticIPsRequest,CloudServerAttachDetachDataVolumesRequest.
Changed
-
CloudServersClient.Updateis now a smart dispatcher (pkg/aruba) — a singleUpdate(ctx, server)call inspects the wrapper's pending state and fans out to the correct API endpoint(s) in sequence:- name/tags differ from the last hydrated response →
PUT /cloudServers/:id - subnet delta queues non-empty →
POST …/associateDisassociateSubnets - security-group delta queues non-empty →
POST …/associateDisassociateSecurityGroups - elastic-IP delta queues non-empty →
POST …/associateDisassociateElasticIPs - data-volume delta queues non-empty →
POST …/attachDetachDataVolumes
If nothing changed,
Updateis a no-op (zero API calls). Sub-calls are sequential; if one fails, the wrapper reflects the state after the last successful call.The
CloudServersClient.Updatesignature is unchanged — this is a behaviour improvement only. The previousUpdatesilently sent all fields via PUT, which the platform ignored for everything except name and tags. - name/tags differ from the last hydrated response →
Removed
ManageSubnets,ManageSecurityGroups,ManageElasticIPs,ManageDataVolumes— the four action methods added as part of the in-progress v1.0.6 work are not included in the final design. The smartUpdatedispatcher supersedes them; client code (Terraform, acloud-cli) should use the delta setters +Updateinstead.
[1.0.5] — 2026-07-13
Fixed
- DBaaS Backup wire format (
pkg/types,pkg/aruba) —BackupPropertiesRequest.DatabaseandBackupPropertiesResponse.Databasewere typed asReferenceResourceCommon{URI string}, causing the SDK to send"database":{"uri":"..."}on the wire. The backup API requires"database":{"name":"<db-name>"}. Sending the wrong format produced a400 semanticerror: Specified Database name is not found. The newDatabaseNameRef{Name string}type is now used for both request and response. ThetoRequest()helper extracts the plain name from a URI path (last segment after/databases/) so existing callers usingFromDatabase(aruba.URI("…"))continue to work without change.
Added
DatabaseName()accessor onDBaaSBackup(pkg/aruba) — dedicated getter that always returns the bare database name.DatabaseURI()is preserved for backward compatibility but its return value is now the raw stored reference (a full URI when set viaFromDatabase, or the bare name after response hydration). PreferDatabaseName()when you only need the name.
[1.0.4] — 2026-06-08
Added
EnablePrivateCluster()on KaaS (pkg/aruba) — preferred boolean-flag setter for private cluster mode, following theHighlyAvailable()naming convention. Thin alias for the existingWithPrivateCluster().WithAPIServerAccessProfile(*types.KaaSAPIServerAccessProfilePropertiesRequest)is now markedDeprecated.
Fixed
APIServerAuthorizedIPRanges()returns a defensive copy — the getter previously returned the underlying slice directly, allowing callers to mutate internal wrapper state.
[1.0.3] — 2026-06-08
Added
- KaaS fluent API server access profile setters (
pkg/aruba) —WithPrivateCluster()andWithAuthorizedIPRanges(ranges ...string)let callers configure the API server access profile without importingpkg/types. (#323) - KaaS API server access profile getters —
APIServerPrivateCluster() boolandAPIServerAuthorizedIPRanges() []string.
[1.0.2] — 2026-06-06
Added
- Audit/lineage getters (
pkg/aruba) — every Family-A wrapper now exposesCreatedBy(),UpdatedBy(),CreatedUser(),UpdatedUser()viaresponseMetadataMixin. (#316)
Changed
- Examples (
examples/all-resources) now printCreatedBy/CreatedAtin summaries.
Documentation
- Documented the new lineage getters in getter-taxonomy tables (EN + IT).
[1.0.0] — 2026-05-29
Added
- Flattened getter taxonomy (
pkg/aruba) — consistent response-side scalar getters across all Family-A wrappers. pkg/aruba.Versionconstant — single source of truth for the SDK version string.- Automatic User-Agent injection (
Options.WithUserAgent) — every outbound request carriesUser-Agent: sdk-go@<version>by default. (#310)
Changed (Breaking)
All exported structs in pkg/types/ now carry a strict three-way suffix: *Request, *Response,
or *Common. This is a compile-time breaking change for code referencing pkg/types directly;
code using only pkg/aruba wrappers is unaffected.
See the root CHANGELOG.md for the full list of renamed types.
[0.3.0] — 2026-05-26
Changed (Breaking)
- Fluent setter vocabulary redesigned (
pkg/aruba) — all wrapper setters now follow a natural-language taxonomy. See the root CHANGELOG.md for the full rename table.
Added
List[T]embedshttpEnvelopeMixinfor HTTP-envelope accessors. (#298)RawJSON() []byte/RawYAML() []byteon every resource wrapper andList[T].- New doc page Working at Low Level (EN + IT).
[0.2.3] — 2026-05-22
Added
WaitUntilGone(ctx, opts...)on every deletable, pollable resource wrapper.- Typed
types.Statewith exportedState*constants.
Changed (Breaking)
WaitUntilStatessignature changed from[]stringto[]types.State.pkg/typesconvenience pointer helpers removed; useptr.To(...)fromk8s.io/utils/ptr.
[0.2.2] — 2026-05-22
Changed
billingPeriodwire field replaced by a structuredbillingPlanobject across billed resources.
Fixed
- DBaaS
Userpassword is now base64-encoded at the wire boundary.
[0.2.1] — 2026-05-16
Added
- Typed network
Refconstructors for all 10 network resources. (#268) *CloudServer.WithBillingPeriod(period)fluent setter. (#267)*KaaSnode-pool control setters (ClearNodePools,ReplaceNodePools,SetNodePools). (#279)
Fixed
List[T].Next/Prev/First/Lastpagination links wired for all 31 adapters. (#269 et al.)Job.WithEnabled(false)now correctly disables a job via Update. (#282)
[0.2.0] — 2026-05-13
Added
pkg/aruba/wrapper layer with 31 fluent resource types.List[T]generic paginated-collection type.- Async polling:
WaitUntilActive,WaitUntilStates,WaitUntilReady,WaitUntilNotUsed,WaitUntilUsed.
Changed (Breaking)
- All service-client CRUD interfaces replaced with wrapper-based signatures.
[0.1.28] — 2026-04-29
Fixed
VPCPeeringRouteRequestnow usesRegionalResourceMetadataRequest.CloudServerRequestomitsElasticIPandKeyPairfields when not set.
[0.1.27] — 2026-04-24
Fixed
- VPN tunnel, VPN route, and VPC peering route URL paths corrected.
Older releases
For releases prior to v0.1.27, see the full CHANGELOG.md on GitHub.