Package com.eqixiac.equinix.design.optimizer.wizard
OptimizationResult into an executable
DeploymentPlan - Cloud Routers,
provider connections, inter-metro backbone links, and routing protocols, with bandwidth-aware
profile selection and honestly-reconciled pricing.
The pipeline is plan → validate → execute:
- Plan -
DeploymentWizard.Builder(reached viafabric.deploymentWizard(result)) configures packages, topology, bandwidth strategy, ASN/BFD, notifications, and pricing;plan()produces an immutable plan. Nothing is provisioned by planning. - Validate -
PlanValidatorruns in three layers (structural/catalog checks, a live self-contained Cloud Router dry-run, and the connection endpoint dry-run where an endpoint already exists) and sorts every finding into three buckets that are never conflated: errors (validated now; a hard defect or genuine API rejection - invalidates the plan), deferred to provisioning (the connection endpoint dry-run that must wait for the A-side router to exist), and skipped (could not be attempted - offline gateway or a non-rejection API failure - each with a reason, never invalidating the plan).DeploymentPlan.dryRun()re-runs validation and returns a new plan with refreshed state. - Execute -
DeploymentPlan.execute(ExecutionInputs, ExecutionOptions)refuses an invalid plan (IllegalStateException), fails fast on missing customer authorization keys, then provisions in dependency order: Cloud Routers (awaitingPROVISIONED), provider connections (each pre-flighted with a live dry-run against its now-real router), backbone links, then routing protocols (DIRECT before BGP). Every failed step follows one failure policy (com.eqixiac.equinix.design.plan.FailurePolicy): abort and roll back by default, waiting for each asynchronous connection delete before deleting its Cloud Router and reporting anything left as an orphan with its uuid; or continue and report partial state. - Store, diff, reconcile - the plan is a JSON document (
save/load) with stable logical keys and a content id;diff()compares it with live Fabric state andreconcile(...)creates only what is missing, checkpointing every step so a crashed run resumes without duplicates. Seecom.eqixiac.equinix.design.plan.
The safety model is plan-only-until-execute: plans, dry-runs, repricing, value
realization, and export are all side-effect free; only execute() creates billable
resources, and only after validation, input checks, and per-connection pre-flights.
Cloud-to-cloud flows (Beta)
A workload that depends on two or more clouds implies a flow between each pair of them. Two cloud providers can carry such a flow over a native provider-to-provider link (AWS Interconnect - multicloud with a Google Cloud Partner Cross-Cloud Interconnect transport, or with an Oracle FastConnect interconnect virtual circuit) that uses no Equinix resource. The wizard plans and prices that link next to the Equinix path and never provisions it: this SDK calls no cloud-provider API.
| Strategy | Equinix connections for the flow | Native link on the plan |
|---|---|---|
COMPARE (default) | planned as under EQUINIX_ONLY |
ALTERNATIVE, when the catalog lists the planned region pair |
EQUINIX_ONLY | planned | none; the catalog is not read |
NATIVE_WHEN_AVAILABLE | omitted only where the replacement rule allows:
a GA environment with a covering size, no user site in the request, the cloud not
a request-level requirement, and no other workload using the connection |
REPLACEMENT where a connection was omitted, otherwise ALTERNATIVE |
NATIVE_ONLY | as NATIVE_WHEN_AVAILABLE |
as above; a flow with no usable environment is an UNAVAILABLE entry and a
Layer-1 validation error |
| Stage | Behavior |
|---|---|
| Plan | Region pairs are matched against
MulticloudEnvironmentCatalog, a bundled,
dated copy of provider documentation that goes stale; supply a newer one with
multicloudEnvironments(...). The requested bandwidth (the sum of the workloads'
effective bandwidths, Mbps) rounds up to the smallest size the environment lists. No
routing protocol, /30 subnet or redundancy group is planned for a link. |
| Price | Each link carries a
MulticloudLinkPricing: the
two-sided native quote (hourly list prices at 730 h per month; an unpublished size is
unpriced, never zero), the Equinix-path fixed cost for the same flow, and the break-even
sustained rate from MulticloudPathComparison.breakEvenSustainedMbps(...).
PlanPricing reports native figures in separate native* fields; none is
part of the Equinix totals. reprice(plan) refreshes both. |
| Validate | Recorded as skipped with a reason naming the link: nothing
can dry-run it now or at provisioning, so it is not deferred. Errors: a malformed
entry, or a NATIVE_ONLY flow without a usable environment. |
| Execute | No request is sent. DeploymentOutcome.getInformational()
carries one non-recoverable entry per link ("created outside Fabric: follow the
create-then-accept recipe"); it is not an error and does not affect
isFullySuccessful(). totalResourceCount() excludes links. |
Sub-packages: model (the plan and its parts),
enums (topology, bandwidth strategy, connection purpose, cloud-to-cloud strategy, native
link role).
- See Also:
-
ClassDescriptionEntry point for the Deployment Wizard.Fluent builder for configuring a deployment plan.Layered, plan-time validation for the Deployment Wizard.The classification of a single live-layer failure.Whether a live-layer failure is a genuine rejection (a plan defect) or an infeasibility (a skip).The outcome of validating a plan, in three distinct buckets - hard/rejection errors (which invalidate the plan), deferred validations (which do NOT - they run at provisioning), and skipped validations (which do NOT - they could not be attempted now, each with a reason) - plus the per-connection customer inputs a first-time customer must gather.