eqixiacEquinix Infrastructure as Code

Upgrade notes for 4.0 New in 4.0

Breaking changes between 3.0.0 and the 4.0 tree with their replacements, and behaviour fixes.

Status#

4.0.0 is in development. This page reflects the working tree on 2026-11-12 and will gain entries until the release. The authoritative list is the [Unreleased] section of CHANGELOG.md.

Release 3.0.0 renamed every package from api.equinix.javasdk to com.eqixiac.equinix and changed the Maven coordinates to com.eqixiac.equinix:equinix-sdk-java. A project on 2.x applies that rename before the changes on this page.

Breaking changes#

Fabric#

3.0.04.0Reason
AwsDirectConnectAdapter.of(account, region, profile) and the other three-argument adapter factoriesA metro code is the last argument: of(account, region, profile, "DC")Fabric rejects a service-provider Z-side without location.metroCode (HTTP 400 EQ-3142501)
AzureExpressRouteAdapter.of(key, region, profile, peeringType)of(key, profile, peeringType, metro)The service key fixes the region
zSideAccessPointServiceProfile(uuid, linkProtocol)zSideAccessPointServiceProfile(uuid, linkProtocol, metroCode)Same
connections().getStatistics(...), ports().getStatistics(...), ConnectionStatistic, PortStatisticfabric.metrics().forConnection(...), forPort(...)The statistics models had no operation behind them that matched the specification
ports().list() returns PaginatedList<Port>Returns List<Port>; search(...) pagesFollows the endpoint
PrecisionTimes.list() calls GET /timeServicesCalls POST /timeServices/searchNo GET /timeServices in the specification; 502 live
AccessPointType.XF_ICAccessPointType.ICSpecification 4.34.0
fabric.client.RequestBuilder, NatType, PortSettings and related modelsRemovedUnused or absent from the specification

Customer Portal#

3.0.04.0
WorkVisitLocation and its account, cage and cabinet modelsworkVisits().listLocations() returns LookupLocation
CasePriority, CaseStatus, MediaType enumsRemoved; absent from the specifications

Core#

3.0.04.0
Only client-credentials constructorsBearerTokenProvider constructors added on Equinix and every domain client. Additive.
No replay after 401One replay after a 401 with a new token. Behaviour change: a call that used to fail with EquinixAuthenticationException after token revocation can now succeed.
loadAll() trusts totalStops on an empty or repeated page

Design layer#

The Metro Optimizer was rebuilt around the DesignSpec document and a portfolio solver. The fluent builder remains, with the following changes to its methods.

3.0.04.0
.scoringWeights(ScoringWeights.builder()...).weights(Map<String, Double>) keyed by objective id, or a named profile through .strategy(...)
.constraints().monthlyBudget(min, max).monthlyBudget(max) or .monthlyBudget(BigDecimal max, String currency)
.addWorkload(...).profile(WorkloadProfile...), .requiresHighPowerDensity()Removed from the builder; see Metro Optimizer for the current workload inputs
Metros scored one at a timePortfolios of metros scored as a set; the result adds getRecommended(), getFrontier(), getSensitivity() and getPlacement()
Latency fallback one-way, unknown latency assumed 150 msAll latencies round-trip; an unknown latency stays unknown and is excluded from scoring

MCP server#

3.0.04.0
fabric_confirm_change executes when the client has no elicitation supportExecutes nothing, unless EQUINIX_MCP_ALLOW_UNCONFIRMED_MUTATIONS=true
Confirmation prompt shows a summaryShows every field the create will send
Mistyped spec values are droppedMistyped spec values are rejected

Fixes from live validation#

These fixes change behaviour without changing a signature. Remove any workaround for the old behaviour.

Area3.0.0 behaviour4.0 behaviour
IAM and STS hostRequests to api.equinix.com, answered 404access.eqix.equinix.com and sts.eqix.equinix.com
STS token exchangecamelCase form fields, rejected by the serviceRFC 8693 field names; snake_case responses read
STS public operationsTriggered an Equinix loginSent without credentials
Customer Portal pagingAttachments, finance accounts, reports and asset search stopped after page onepage envelope read
TimestampsOnly 1, 2, 3 or 6 fractional digits accepted; a 9-digit value failed the whole response0 to 9 digits and Z, +HH, +HHMM, +HH:MM offsets
Unknown response fieldsFailed the read on models without an ignore annotationIgnored on every model
Service-profile replaceNo If-Match headerSends the ETag of the preceding read
Stream alert-rule updatePATCHPUT
ServiceToken.getChangeLog()Always nullPopulated
Network Edge license uploadJSON bodymultipart/form-data
Order historyAccount and contact fields nullLive field names read
Metrics callsSent a limit the service rejectsNo limit
Live rate cardEvery lookup failed with 400 and fell back to reference prices silentlyTargeted queries; live prices used
Peering IntelligenceNo presence found for any networkQueries PeeringDB by network id; resolves facilities through live metro codes
Savings calculatorOmitted the cloud provider's port feeNets it out; AWS 1 Gbps in DC is USD 3081 per month net, not 3300
MCP portal_list_open_ticketsAlways failed with 400Works; reports truncation
Debug loggingCould write client_secret and tokensMasked
Live test credentials-D system properties, copied into Surefire reportsEnvironment variables

Additions#

  • fabric.beta(): the Fabric v4 Beta families
  • BearerTokenProvider and 401 recovery
  • DesignSpec, the portfolio solver, sensitivity analysis and workload placement
  • Native cloud-to-cloud links in the TCO and savings calculators, the Deployment Wizard and two MCP tools (Beta)
  • ActivationKey decoding and the Fabric provider-environment operations (Beta)
  • HealthStatus.getAllApiServices(), DeviceCore.getTiers(), Metric.getSummaryNode()
  • AccessPointBuilder.metro(...), CloudProviderConnectionAdapter.getMetroCode()
  • StsScope, ProjectIds, MetricQuery, CloudEventQuery

Procedure#

  1. Update the dependency version and compile. The compiler reports every removed type and changed signature.
  2. Add the metro code to each cloud adapter and service-profile Z-side.
  3. Replace statistics calls with metrics calls.
  4. Remove workarounds for the defects in the table above, such as a manual host override for IAM.
  5. Run your own dry-run suite against the sandbox or with the dryRun() builders before the first real create.