Class MulticloudLinkQuote

java.lang.Object
com.eqixiac.equinix.design.value.ratecard.MulticloudLinkQuote

public class MulticloudLinkQuote extends Object
The price of one native provider-to-provider multicloud link. Each provider bills its own side independently, so the quote is two-sided: getSideA() is what getProviderA() charges, getSideZ() is what getProviderZ() charges. Either side may be unpriced.

Beta: models products that reached general availability in 2026; see MulticloudLinkRequest.

Units

Both providers publish flat hourly rates. The rest of the value layer works in monthly recurring charges, so rate cards convert with the named constant HOURS_PER_MONTH (730 h = 365 d x 24 h / 12, the figure AWS uses in its own pricing examples) and state the conversion in the side's PriceQuote.getNote(). A 31-day month has 744 h, so a real invoice can exceed the modelled figure by up to 1.9 %.

Unpriced sides

A side with no verifiable price is absent (Optional.empty()), never zero, and getSideAUnpricedReason() / getSideZUnpricedReason() names what is missing. A present side with a zero amount is a known price of zero (for example the AWS free tier, which a card applies only on request).

Combined figure

combinedMonthly() is present only when both sides are priced and share one known currency. It runs through CurrencyReconciler: sides in different currencies are never summed and no FX rate is applied. monthlySubtotalsByCurrency() exposes the per-currency figures for reporting when the combined figure is withheld. A side whose monthly and one-time charges are both zero does not take part in the currency check, because zero is the same amount in every currency: a free-tier side quoted in USD combines with a negotiated side quoted in EUR.

  • Field Details

    • HOURS_PER_MONTH

      public static final int HOURS_PER_MONTH
      Hours per month used to convert an hourly rate to a monthly recurring charge: 365 x 24 / 12 = 730.
      See Also:
    • DEFAULT_PATH_TIER

      public static final int DEFAULT_PATH_TIER
      The path tier assumed when a request does not state one: 1, local connectivity scope.
      See Also:
    • MIN_PATH_TIER

      public static final int MIN_PATH_TIER
      The lowest AWS connectivity-scope tier.
      See Also:
    • MAX_PATH_TIER

      public static final int MAX_PATH_TIER
      The highest AWS connectivity-scope tier.
      See Also:
  • Constructor Details

    • MulticloudLinkQuote

      public MulticloudLinkQuote()
  • Method Details

    • getSideA

      public Optional<PriceQuote> getSideA()
      The monthly recurring and one-time charge billed by getProviderA().
      Returns:
      the side's quote, or empty when it could not be priced
    • getSideZ

      public Optional<PriceQuote> getSideZ()
      The monthly recurring and one-time charge billed by getProviderZ().
      Returns:
      the side's quote, or empty when it could not be priced
    • side

      public Optional<PriceQuote> side(CloudProviderType provider)
      The side billed by the given provider.
      Parameters:
      provider - one of the link's two providers
      Returns:
      that provider's side; empty when the provider is not an end of this link or its side is unpriced
    • isFullyPriced

      public boolean isFullyPriced()
      Whether both sides are priced. A fully priced quote can still have no combinedMonthly() when the two sides are in different currencies.
      Returns:
      true when neither side is empty
    • combinedMonthly

      public Optional<BigDecimal> combinedMonthly()
      The link's total monthly recurring charge: side A plus side Z.
      Returns:
      the sum, or empty when a side is unpriced, a side has no currency, or the two sides are in different currencies
    • combinedSetup

      public Optional<BigDecimal> combinedSetup()
      The link's total one-time charge: side A plus side Z.
      Returns:
      the sum, or empty under the same conditions as combinedMonthly()
    • combinedCurrency

      public Optional<String> combinedCurrency()
      The ISO 4217 code combinedMonthly() is expressed in: the currency of the non-zero sides, or of side A when both sides are zero.
      Returns:
      the currency code, or empty whenever combinedMonthly() is empty
    • isMixedCurrency

      public boolean isMixedCurrency()
      Whether both sides are priced, both carry a non-zero charge, and their known currencies differ.
      Returns:
      true when a combined figure is withheld because of a currency mismatch
    • monthlySubtotalsByCurrency

      public String monthlySubtotalsByCurrency()
      The priced sides' monthly charges grouped by currency, for example "USD 9000.90, EUR 12000.00". Intended for the message that explains a withheld combined figure.
      Returns:
      the per-currency subtotals, or an empty string when neither side is priced
    • unpricedSummary

      public Optional<String> unpricedSummary()
      A one-sentence description of what is unpriced, naming each empty side's provider and reason.
      Returns:
      the description, or empty when both sides are priced
    • fillUnpricedSidesFrom

      public MulticloudLinkQuote fillUnpricedSidesFrom(MulticloudLinkQuote other)
      Fills this quote's unpriced sides from another quote for the same link and returns the result; this instance is unchanged. A side already priced here is kept, so when quotes are merged in rate-card precedence order the earliest card that prices a side wins. Sides are matched by provider, so other may list the two providers in either order. Notes are concatenated without duplicates. A side neither quote prices keeps both reasons.
      Parameters:
      other - a quote for the same provider pair; null returns this quote
      Returns:
      the merged quote
      Throws:
      IllegalArgumentException - if other is for a different provider pair
    • monthlyFromHourly

      public static BigDecimal monthlyFromHourly(BigDecimal hourly)
      Converts a flat hourly rate to a monthly recurring charge at HOURS_PER_MONTH hours per month, rounded half-up to two decimal places.
      Parameters:
      hourly - the hourly rate; must not be null or negative
      Returns:
      hourly x 730
      Throws:
      IllegalArgumentException - if hourly is null or negative