Class ConvertingRateCard
- All Implemented Interfaces:
RateCard
RateCard that answers every lookup in one target currency: a figure quoted in another currency is
converted through a CurrencyConverter and its note says from what, at which rate, from which source
and as of when. A figure whose currency no source covers is unpriced with that reason. The TCO and savings
models wrap their card in one so they compare in the same currency, with the same rates, as the optimiser's
RateCardCostModel. A figure converted at a bundled reference rate is tagged
PriceSource.ESTIMATE.-
Method Summary
Modifier and TypeMethodDescriptionamount(BigDecimal amount, String currency) Converts an amount to the target currency.cardName()A short name for this card in provenance trails and unpriced reasons; the simple class name by default.cloudRouter(String packageCode, MetroCode metro, Term term) Resolves the price of a single Fabric Cloud Router instance.cloudRouterLookup(String packageCode, MetroCode metro, Term term) RateCard.cloudRouter(String, MetroCode, Term)with the reason when it cannot be priced.colocation(ColocationItem item, MetroCode metro, Term term) Resolves the price of an Equinix colocation primitive - a cabinet, a kW of power, or a cross-connect (seeColocationItemfor the per-unit semantics).colocationLookup(ColocationItem item, MetroCode metro, Term term) RateCard.colocation(ColocationItem, MetroCode, Term)with the reason when it cannot be priced.connection(ConnectionType type, int bandwidthMbps, MetroCode metro, Term term) Resolves the price of a single Fabric connection / virtual connection.connectionLookup(ConnectionType type, int bandwidthMbps, MetroCode metro, Term term) RateCard.connection(ConnectionType, int, MetroCode, Term)with the reason when it cannot be priced.egress(CloudProviderType provider, String region, EgressPath path, Term term) Resolves the per-GB data-egress rate for a cloud provider over a given path.egressLookup(CloudProviderType provider, String region, EgressPath path, Term term) RateCard.egress(CloudProviderType, String, EgressPath, Term)with the reason when it cannot be priced.multicloudLink(MulticloudLinkRequest request) Resolves the two-sided price of a native provider-to-provider multicloud link (for example AWS Interconnect - multicloud paired with a Google Partner Cross-Cloud Interconnect transport).static ConvertingRateCardof(RateCard card, String target, CurrencyConverters.Chain converter) source()The dominant provenance of prices this card produces.target()toTarget(PriceLookup<PriceQuote> lookup) Converts a quote to the target currency.
-
Method Details
-
of
public static ConvertingRateCard of(RateCard card, String target, CurrencyConverters.Chain converter) - Parameters:
card- the card to wraptarget- the ISO 4217 code every answer is given inconverter- the converter- Returns:
- the converting card
-
target
- Returns:
- the target currency
-
converter
- Returns:
- the converter (for its fallback notes)
-
toTarget
Converts a quote to the target currency.- Parameters:
lookup- a lookup in any currency- Returns:
- the lookup in the target currency, or unpriced when no source has the rate
-
amount
Converts an amount to the target currency.- Parameters:
amount- the amountcurrency- its ISO 4217 code- Returns:
- the converted amount, or empty when no source has the rate
-
connection
public Optional<PriceQuote> connection(ConnectionType type, int bandwidthMbps, MetroCode metro, Term term) Description copied from interface:RateCardResolves the price of a single Fabric connection / virtual connection.Implementation contract. The matching strategy is implementation-specific, and a card whose data lacks an axis (metro, term, type) still returns its best figure - or empty - rather than failing; callers must not assume every card is sensitive to every parameter. Of the bundled cards:
CustomRateCardresolves the most specific declared entry (exact metro+term down to metro/term-agnostic, then a declared default);EquinixRateCardmatches bandwidth and type against the live catalogue, honours a requested metro strictly (a wrong-metro row is never returned), and prefers a term-matched row - a different-term row is only ever returned with a note naming the substitution;ReferenceRateCardmatches on bandwidth alone (smallest tabulated tier at or above the request, linearly extrapolated with anEXTRAPOLATEDnote above the top tier) and ignores type, metro, and term entirely.- Specified by:
connectionin interfaceRateCard- Parameters:
type- the connection type (e.g.EVPL_VC); may benullfor any typebandwidthMbps- the provisioned bandwidth in Mbpsmetro- the metro the connection originates in (may benullif metro-agnostic)term- the commitment term (may benullif term-agnostic)- Returns:
- the resolved quote, or
Optional.empty()if this card cannot price the connection
-
connectionLookup
public PriceLookup<PriceQuote> connectionLookup(ConnectionType type, int bandwidthMbps, MetroCode metro, Term term) Description copied from interface:RateCardRateCard.connection(ConnectionType, int, MetroCode, Term)with the reason when it cannot be priced. Cards override this to say exactly why (no metro, no live row, no declared rate); the default states that this card holds no figure.- Specified by:
connectionLookupin interfaceRateCard- Parameters:
type- the connection type; may benullbandwidthMbps- the bandwidth in Mbpsmetro- the metro; may benullterm- the term; may benull- Returns:
- the figure, or the reason there is none
-
cloudRouter
Description copied from interface:RateCardResolves the price of a single Fabric Cloud Router instance.Implementation contract. As with
RateCard.connection(ConnectionType, int, MetroCode, Term), matching is implementation-specific and cards without a metro/term axis return their best figure regardless. Of the bundled cards:CustomRateCardresolves the most specific declared(packageCode, metro, term)entry;EquinixRateCardmatches the package code and metro structurally against the row's own descriptor (exact package equality, the row's own metro code) and prefers a term-matched row, labelling any term substitution;ReferenceRateCardignores metro and term, and substitutes its STANDARD figure for an unlisted package with a note naming the substitution.- Specified by:
cloudRouterin interfaceRateCard- Parameters:
packageCode- the router package / tier code (e.g."STANDARD"); may benullfor anymetro- the metro the router is deployed in (may benullif metro-agnostic)term- the commitment term (may benullif term-agnostic)- Returns:
- the resolved quote, or
Optional.empty()if this card cannot price the router
-
cloudRouterLookup
Description copied from interface:RateCardRateCard.cloudRouter(String, MetroCode, Term)with the reason when it cannot be priced.- Specified by:
cloudRouterLookupin interfaceRateCard- Parameters:
packageCode- the router package; may benullmetro- the metro; may benullterm- the term; may benull- Returns:
- the figure, or the reason there is none
-
egress
public Optional<EgressRate> egress(CloudProviderType provider, String region, EgressPath path, Term term) Description copied from interface:RateCardResolves the per-GB data-egress rate for a cloud provider over a given path.Equinix does not sell cloud egress, so
EquinixRateCardreturnsOptional.empty()here (the default); egress rates come from aCustomRateCard(your figures), aReferenceRateCard(bundled indicative figures), or a provider-pricing-API card. The default returns empty so cards that do not model egress need not override it. Cards whose data has no region or term axis ignore those parameters - the custom and reference cards match on provider + path alone; only the provider-API adapters are region-sensitive.- Specified by:
egressin interfaceRateCard- Parameters:
provider- the cloud provider the data is leavingregion- the provider region (may benullfor a provider-wide rate)path- internet vs. private interconnectterm- the commitment term (may benull; ignored by term-agnostic cards)- Returns:
- the resolved egress rate, or
Optional.empty()if this card cannot price it
-
egressLookup
public PriceLookup<EgressRate> egressLookup(CloudProviderType provider, String region, EgressPath path, Term term) Description copied from interface:RateCardRateCard.egress(CloudProviderType, String, EgressPath, Term)with the reason when it cannot be priced.- Specified by:
egressLookupin interfaceRateCard- Parameters:
provider- the provider; may benullregion- the region; may benullpath- the path; may benullterm- the term; may benull- Returns:
- the rate, or the reason there is none
-
colocation
Description copied from interface:RateCardResolves the price of an Equinix colocation primitive - a cabinet, a kW of power, or a cross-connect (seeColocationItemfor the per-unit semantics). This lets the cost models incorporate the physical-infrastructure side of a colocation-vs-cloud comparison with the caller's real figures, not just the interconnection. Cards that do not model colocation returnOptional.empty()(the default);CustomRateCardprices whatever the caller declares.- Specified by:
colocationin interfaceRateCard- Parameters:
item- the colocation primitive to pricemetro- the metro (may benullif metro-agnostic)term- the commitment term- Returns:
- the resolved per-unit monthly quote, or
Optional.empty()if not priced
-
colocationLookup
Description copied from interface:RateCardRateCard.colocation(ColocationItem, MetroCode, Term)with the reason when it cannot be priced.- Specified by:
colocationLookupin interfaceRateCard- Parameters:
item- the colocation primitivemetro- the metro; may benullterm- the term; may benull- Returns:
- the figure, or the reason there is none
-
multicloudLink
Description copied from interface:RateCardResolves the two-sided price of a native provider-to-provider multicloud link (for example AWS Interconnect - multicloud paired with a Google Partner Cross-Cloud Interconnect transport). No Equinix resource is part of such a link. Each provider bills its own side, so the result is aMulticloudLinkQuotewith onePriceQuoteper side rather than a single figure.Beta: the products this models reached general availability in 2026 and their public price lists are incomplete.
Implementation contract. The default returns
Optional.empty(), so a card that does not model native links needs no change. An empty result means the card has no data for the provider pair. A present result may still have one or both sides unpriced: a side is priced only from a figure the card holds, and is otherwise left empty with a reason; callers must checkMulticloudLinkQuote.isFullyPriced()before treating the quote as a link price. Cards convert hourly rates to monthly atMulticloudLinkQuote.HOURS_PER_MONTHhours and state the conversion in the side's note. The per-GB charge on the link is a separate lookup:egress(provider, region, EgressPath.MULTICLOUD_INTERCONNECT, term).Of the bundled cards:
ReferenceRateCardprices only the figures published on the providers' pricing pages (each note carries the source URL and retrieval date) and applies the AWS free tier only when the request opts in;CustomRateCardprices the sides the caller declared; aRateCard.layered(...)chain resolves each side independently, the earliest card that prices a side winning;EquinixRateCardand the provider-API adapters return empty.- Specified by:
multicloudLinkin interfaceRateCard- Parameters:
request- the link to price: both providers and regions, bandwidth in Mbps, the AWS path tier (1-5), the term, and the AWS free-tier opt-in- Returns:
- the two-sided quote, or
Optional.empty()if this card has no data for the provider pair (orrequestisnull)
-
source
Description copied from interface:RateCardThe dominant provenance of prices this card produces. Aggregating cards reportPriceSource.COMPOSITE. -
cardName
-