Dry run
dryRun and validate operations in Fabric, Internet Access, the design layer and the MCP server.
Semantics#
A dry run sends the same request to the same endpoint as a create or an update, with dryRun=true added. The service validates the payload against the account, the inventory and its business rules, and returns the entity it would create or change without provisioning or billing anything.
A dry run reserves nothing. A VLAN that was free during the dry run can be taken by another request before the create.
Fabric operations#
Fabric v4 defines nine operations with a dryRun query parameter.
| Operation | SDK call | Response |
|---|---|---|
| Create connection | connections().define(type)...dryRun().create() | The validated connection, without UUID or state |
| Update connection | connection.update()...dryRun().save() | The connection as it would be after the update |
| Create service token | serviceTokens().define(side)...dryRun().create() | The validated token |
| Update service token | serviceTokens().update(uuid)...dryRun().save() | The token as it would be after the update |
| Create port | ports().define()...dryRun().create() | The validated order. The dry run validates a procurement order and does not place it. |
| Update port | ports().update(uuid)...dryRun().save() | The port. The service wraps this dry-run response in a paginated envelope, unlike the real update. The SDK reads both. |
| Delete port | ports().delete(uuid, true) | The port that would be deleted |
| Create Cloud Router | cloudRouters().define()...dryRun().create() | The validated router |
| Create network | networks().define(type)...dryRun().create() | The validated network |
import com.eqixiac.equinix.fabric.enums.GatewayPackageCode;
import com.eqixiac.equinix.fabric.enums.NotificationType;
import com.eqixiac.equinix.fabric.model.CloudRouter;
import com.eqixiac.equinix.fabric.model.Connection;
CloudRouter validated = fabric.cloudRouters().define()
.name("fcr-dc-prod")
.inMetro("DC")
.withPackage(GatewayPackageCode.STANDARD)
.projectId(projectId)
.notification(NotificationType.ALL, List.of("noc@example.com"))
.dryRun()
.create();
Connection existing = fabric.connections().getByUuid(connectionUuid);
Connection afterResize = existing.update().bandwidth(500).dryRun().save();Each of the nine operations has two WireMock tests. One asserts dryRun=true on the expected endpoint. The other asserts that a request without dryRun() omits the parameter.
Validation operations#
Four operations validate a request without a dryRun parameter.
| Operation | SDK call |
|---|---|
POST /fabric/v4/connections/validate | fabric.connections().validate(filter), for example to check whether a VLAN is free on a port |
| Cloud Router routing-protocol validation | fabric.cloudRouters().validateRoutingProtocol(routerUuid, filter) |
| Activation-key validation Beta | fabric.serviceProfiles().validateActivationKey(profileUuid, environmentUuid, key) |
| Network Edge backup restore feasibility | See Network Edge |
Internet Access#
EIA v2 update and delete take a dryRun flag. The specification defines no dry run for EIA v2 create.
import com.eqixiac.equinix.internetaccess.model.json.creators.ChangeOperationUpdate;
List<ChangeOperationUpdate> ops = List.of(ChangeOperationUpdate.replace("/bandwidth", "500"));
internet.services().update("service-uuid", ops, true); // validate only
internet.services().delete("service-uuid", true); // validate the deleteDry run in the design layer and the MCP server#
DeploymentPlan.dryRun()validates a whole plan and returns a new plan with the validation state. Duringexecute(...)the plan dry-runs each provider connection against its Cloud Router, which exists by then, before it sends the create (Deployment Wizard).- The MCP tool
fabric_propose_changesends the dry run and issues a confirm token for a payload that passed (Safe Mutation Broker).
Live test tier#
The integration-dryrun Maven profile runs the dry-run and validate operations against a real account without creating anything. Port create, port delete and EIA delete are tested with WireMock only, because a defect that dropped the parameter in a live run would place an order or delete a resource that cannot be restored. Testing describes the tiers.