DesignSpec New in 4.0
DesignSpec, the input document of the design engines: sites, workloads, clouds, peers, constraints, objectives and commercial terms.
Role#
A DesignSpec holds the requirements of a design: site and user locations, workloads, required clouds and networks, constraints, objective weights and commercial terms. It names no metros and no connections. The engines derive those.
The document is immutable, carries a schemaVersion (currently "1"), and round-trips through JSON and YAML.
Structure#
| Section | Type | Content |
|---|---|---|
sites | SiteIntent | A label, and a metro code or coordinates; optional role, headcount and weight |
workloads | WorkloadIntent | A label, a workload type, bandwidth in Mbps, latency sensitivity, a latency ceiling in ms, the clouds it depends on, an optional pinned metro |
clouds | CloudIntent | An id, a provider or a service profile, a region, whether it is required, monthly egress and ingress in GB |
peers | PeerIntent | An ASN and a label |
constraints | DesignConstraints | Required and excluded metros and regions, compliance zones, geo zones, minimum redundancy, maximum site latency, minimum and maximum metro count |
objectives | DesignObjectives | A named weight profile, or explicit weights per objective |
commercial | CommercialTerms | Currency, monthly budget, contract term, growth rate, planning horizon |
labels | map | Free-form metadata |
YAML#
name: payments-platform
description: Two regions, AWS and Azure, PCI workloads in the EU
sites:
- label: New York HQ
metro: NY
role: headquarters
headcount: 500
- label: Frankfurt operations
metro: FR
role: data_center
clouds:
- id: aws
provider: aws
region: us-east-1
required: true
monthlyEgressGb: 40000
- id: azure
provider: azure
region: westeurope
required: true
workloads:
- label: card-authorisation
type: transactional
bandwidthMbps: 2000
maxLatencyMs: 25
clouds: [aws]
- label: settlement-dr
type: disaster_recovery
bandwidthMbps: 500
clouds: [azure]
constraints:
minimumRedundancy: multi_region
complianceZones: [eu_gdpr]
maxLatencyMs: 100
maxMetros: 4
objectives:
profile: balanced
commercial:
currency: USD
budgetMaxMonthly: 60000Enum values in a document are case-insensitive. Reading a document with an unknown property fails with an error that names the property.
Reading, validating and writing#
import com.eqixiac.equinix.design.spec.DesignSpec;
import com.eqixiac.equinix.design.spec.DesignSpecIO;
import com.eqixiac.equinix.design.spec.SpecIssue;
DesignSpec spec = DesignSpecIO.read(Path.of("designs/payments-platform.yaml"));
for (SpecIssue issue : spec.validate()) {
System.out.println(issue.severity() + " " + issue.path() + ": " + issue.message());
}
spec.requireValid(); // throws IllegalArgumentException when there are errors
System.out.println(spec.fingerprint()); // stable identity of the content
DesignSpecIO.write(spec, Path.of("designs/payments-platform.json"));validate() reports every problem with its path, for example a workload that names a cloud the document does not declare, a latitude outside the valid range, or minMetros above maxMetros. read and write choose JSON or YAML by file extension.
Building in code#
import com.eqixiac.equinix.design.optimizer.enums.RedundancyTier;
import com.eqixiac.equinix.design.optimizer.enums.SiteRole;
import com.eqixiac.equinix.design.optimizer.enums.WorkloadType;
import com.eqixiac.equinix.design.spec.CloudIntent;
import com.eqixiac.equinix.design.spec.CommercialTerms;
import com.eqixiac.equinix.design.spec.DesignConstraints;
import com.eqixiac.equinix.design.spec.DesignObjectives;
import com.eqixiac.equinix.design.spec.SiteIntent;
import com.eqixiac.equinix.design.spec.WorkloadIntent;
import com.eqixiac.equinix.fabric.model.implementation.cloud.CloudProviderType;
DesignSpec built = DesignSpec.builder()
.name("payments-platform")
.site(SiteIntent.builder().label("New York HQ").metro("NY").role(SiteRole.HEADQUARTERS).headcount(500).build())
.site(SiteIntent.builder().label("Singapore office").latitude(1.3521).longitude(103.8198).build())
.cloud(CloudIntent.builder().id("aws").provider(CloudProviderType.AWS).region("us-east-1")
.required(true).monthlyEgressGb(40_000d).build())
.workload(WorkloadIntent.builder().label("card-authorisation").type(WorkloadType.TRANSACTIONAL)
.bandwidthMbps(2000).maxLatencyMs(25d).clouds(List.of("aws")).build())
.constraints(DesignConstraints.builder()
.minimumRedundancy(RedundancyTier.MULTI_METRO).maxLatencyMs(100d).maxMetros(3).build())
.objectives(DesignObjectives.balanced())
.commercial(CommercialTerms.builder().currency("USD").budgetMaxMonthly(new BigDecimal("60000")).build())
.label("owner", "network-platform")
.build();
DesignSpec revised = built.toBuilder().description("Singapore added 2026-11").build();The fluent MetroOptimizer.Builder assembles the same document, and fabric.optimizeMetros()...toSpec() returns it.
Fingerprint#
fingerprint() is a hash of the canonical content. Two documents with the same content have the same fingerprint, whatever the property order or format. An OptimizationResult records the fingerprint of its spec (getSpecFingerprint()), and a DeploymentPlan carries it forward, so the design that a plan was derived from can be identified from the plan.
Objectives and weights#
objectives.profile names one of five built-in weight profiles, and objectives.weights sets explicit weights by objective id, which override the profile.
| Profile | Latency | Provider coverage | Cost | Resilience | Compliance |
|---|---|---|---|---|---|
balanced | 0.30 | 0.25 | 0.20 | 0.15 | 0.10 |
latency_first | 0.50 | 0.20 | 0.10 | 0.10 | 0.10 |
cost_first | 0.15 | 0.15 | 0.45 | 0.15 | 0.10 |
redundancy_first | 0.20 | 0.15 | 0.15 | 0.40 | 0.10 |
provider_coverage_first | 0.20 | 0.45 | 0.15 | 0.10 | 0.10 |
A weight must be a non-negative, finite number, and at least one weight must be above zero. The Metro Optimizer defines what each objective measures.
Use by the engines#
| Engine | Reads | Status |
|---|---|---|
| Metro Optimizer | The whole document | In the tree |
| Deployment Wizard | Through the OptimizationResult; designSpec(...) and specFingerprint(...) attach it to the plan | In the tree |
| Savings and TCO calculators | Their own builder inputs. CloudIntent.monthlyEgressGb is the volume the optimizer's cost model prices. | Spec input for the calculators is Planned |
| Peering Intelligence | Its own builder inputs. peers is carried in the document. | Spec input is Planned |
| MCP tools | JSON arguments of each tool | Spec input is Planned |
As of 2026-11-12 only the optimizer and the wizard take the document.