Package com.eqixiac.equinix.design.optimizer.wizard


package com.eqixiac.equinix.design.optimizer.wizard
The Deployment Wizard: turns a metro 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 via fabric.deploymentWizard(result)) configures packages, topology, bandwidth strategy, ASN/BFD, notifications, and pricing; plan() produces an immutable plan. Nothing is provisioned by planning.
  • Validate - PlanValidator runs 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 (awaiting PROVISIONED), 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 and reconcile(...) creates only what is missing, checkpointing every step so a crashed run resumes without duplicates. See com.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.

CloudToCloudStrategy, set with DeploymentWizard.Builder.cloudToCloudStrategy(...)
StrategyEquinix connections for the flowNative link on the plan
COMPARE (default)planned as under EQUINIX_ONLY ALTERNATIVE, when the catalog lists the planned region pair
EQUINIX_ONLYplannednone; the catalog is not read
NATIVE_WHEN_AVAILABLEomitted 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_ONLYas NATIVE_WHEN_AVAILABLE as above; a flow with no usable environment is an UNAVAILABLE entry and a Layer-1 validation error
What each stage does with a PlannedMulticloudInterconnect
StageBehavior
PlanRegion 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.
PriceEach 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.
ValidateRecorded 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.
ExecuteNo 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: