openvibers/openvibe.sources Commits

Sources: OVHcloud's dedicated-server catalogs (bare-metal and Eco) (#206)

OP OpenVibers committed 7 days ago · 1a4db956c6 · 7 files, +7007 −38

The api adapter's selector values may now be a $root. or $rec. path that carries its own selectors, so a plan can join to its default addon and that addon's product. Sources reads OVHcloud's public bare-metal (75 US plans) and Eco (34 US plans) catalogs, both keyless, with the monthly price, installation fee, CPU, RAM, disk and bandwidth. Seeded disabled for review.

Changes

ddiff --git a/README.md b/README.md
iindex c9a5281..89348d6 100644
---- a/README.md
++++ b/README.md
@@@ -144,16 +144,19 @@ match as text.
**Catalogs that keep plans, hardware and prices apart** (OVHcloud's public order catalog, `ovhcloud-vps`). A key may
carry a selector, `key[field=value,…]` (one to four conditions): `key` must be an array, and the path steps into its
first element whose fields equal every value, compared as text after `scalar()` (so `interval=1` matches the number 1).
--A value is literal text or `$rec.<path>`, read from the record itself. No match is null.
++A value is literal text, `$rec.<path>` (read from the record) or `$root.<path>` (read from the response), and either
++path may carry its own selectors. That reaches a plan's default addon and then that addon's own product without code
++per provider; no match is null.
```json
"where": { "planCode": { "pattern": "^vps-[0-9]{4}-model[0-9]+$" } },
"extra": { "vcpu": "$root.products[name=$rec.product].blobs.technical.cpu.cores",
++ "memory_gb": "$root.products[name=$root.addons[planCode=$rec.addonFamilies[name=memory].default].product].blobs.technical.memory.size",
"price_monthly": "pricings[mode=default,commitment=0,intervalUnit=month,interval=1].price" }
```
`max_bytes` (an integer from 1 KiB to 64 MiB) sets one endpoint's body cap instead of `SOURCES_MAX_BYTES`. OVHcloud's
--catalog is about 12 MB.
++VPS catalog is about 12 MB, its bare-metal catalog about 32 MB and its Eco catalog about 10 MB.
`timeout_ms` (an integer from 1 s to 120 s) sets one endpoint's deadline instead of `SOURCES_FETCH_TIMEOUT_MS`. NYC Open
Data computes the HPD per-building violation tally (`nyc-hpd-open-violations`) in 12 to 60 seconds.
@@@ -352,7 +355,7 @@ for the N-1 rollback window.
## Seeds
--[seeds/sources.json](seeds/sources.json) holds the 65 registered sources, each with its robots, terms and licence notes (the production rows are the record; the terms notes match them as of the 2026-10-23 review).
++[seeds/sources.json](seeds/sources.json) holds the 66 registered sources, each with its robots, terms and licence notes (the production rows are the record; the terms notes match them as of the 2026-10-23 review).
`npm run seed` creates the ones that do not exist yet, **all disabled**, and never changes an existing one; a person
enables a source after reading its terms (`PATCH /api/v1/sources/:key {"enabled": true}`), and the fetcher re-checks
robots.txt on every run. Production on 2026-10-22:
@@@ -365,7 +368,7 @@ robots.txt on every run. Production on 2026-10-22:
| deals | `dealnews-daily` (rss, `feed@3`: the offer's price, retailer, end date, category and editors' pick) | 1 of 1 |
| coupons | `dealnews-coupon-codes` (rss with `extract`: only items that state a code and the shop, as kind `coupon`); `staff-coupon-codes` (manual, with the evidence URL) | 2 of 2 |
| trade | `sec-xbrl-filings`, `ecb-euro-reference-rates` (rss); `sec-company-tickers`, `frankfurter-eur-rates` (api) | 4 of 4 |
--| hosting | `porkbun-tld-pricing`, `ovhcloud-vps`, `linode-types`, `aws-lightsail-bundles`, `vultr-plans` (api); `lowendspirit-offers`, `lowendtalk-offers`, `lowendbox-posts` (rss) | 5 of 8: `vultr-plans` is off (its API host's robots.txt disallows every path), and LowEndTalk's and LowEndBox's feeds answer 403 to the production host |
++| hosting | `porkbun-tld-pricing`, `ovhcloud-vps`, `ovhcloud-baremetal`, `linode-types`, `aws-lightsail-bundles`, `vultr-plans` (api); `lowendspirit-offers`, `lowendtalk-offers`, `lowendbox-posts` (rss) | 5 of 9: `vultr-plans` is off (its API host's robots.txt disallows every path), LowEndTalk's and LowEndBox's feeds answer 403 to the production host, and `ovhcloud-baremetal` is seeded disabled for review |
| crowdfunding | `opencollective-accounts` (api) | 1 of 1 |
| games | `steam-top-sellers`, `steam-new-releases`, `steam-specials` (api: the store's featured lists, in their order) | 3 of 3 |
ddiff --git a/seeds/sources.json b/seeds/sources.json
iindex 711a769..a0ef4b7 100644
---- a/seeds/sources.json
++++ b/seeds/sources.json
@@@ -1180,6 +1180,101 @@
"sensitivity": "none",
"default_indexability": "noindex"
},
++ {
++ "key": "ovhcloud-baremetal",
++ "name": "OVHcloud dedicated servers (US bare-metal and Eco catalogs)",
++ "type": "api",
++ "category": "hosting",
++ "homepage_url": "https://us.ovhcloud.com/bare-metal/",
++ "endpoints": [
++ {
++ "url": "https://api.us.ovhcloud.com/1.0/order/catalog/public/baremetalServers?ovhSubsidiary=US",
++ "format": "json",
++ "items_path": "plans",
++ "item_kind": "plan",
++ "max_bytes": 41943040,
++ "timeout_ms": 120000,
++ "where": {
++ "planCode": {
++ "pattern": "-us$"
++ }
++ },
++ "fields": {
++ "identity": "planCode",
++ "title": "invoiceName"
++ },
++ "extra_lists": {
++ "locations": "configurations[name=dedicated_datacenter].values"
++ },
++ "extra": {
++ "product": "product",
++ "currency": "$root.locale.currencyCode",
++ "range": "$root.products[name=$rec.product].blobs.technical.server.range",
++ "cpu_cores": "$root.products[name=$rec.product].blobs.technical.server.cpu.cores",
++ "cpu_sockets": "$root.products[name=$rec.product].blobs.technical.server.cpu.number",
++ "cpu_model": "$root.products[name=$rec.product].blobs.technical.server.cpu.model",
++ "cpu_brand": "$root.products[name=$rec.product].blobs.technical.server.cpu.brand",
++ "memory_gb": "$root.products[name=$root.addons[planCode=$rec.addonFamilies[name=memory].default].product].blobs.technical.memory.size",
++ "disk_capacity_gb": "$root.products[name=$root.addons[planCode=$rec.addonFamilies[name=storage].default].product].blobs.technical.storage.disks.0.capacity",
++ "disk_count": "$root.products[name=$root.addons[planCode=$rec.addonFamilies[name=storage].default].product].blobs.technical.storage.disks.0.number",
++ "disk_interface": "$root.products[name=$root.addons[planCode=$rec.addonFamilies[name=storage].default].product].blobs.technical.storage.disks.0.interface",
++ "disk_technology": "$root.products[name=$root.addons[planCode=$rec.addonFamilies[name=storage].default].product].blobs.technical.storage.disks.0.technology",
++ "bandwidth_mbps": "$root.products[name=$root.addons[planCode=$rec.addonFamilies[name=bandwidth].default].product].blobs.technical.bandwidth.level",
++ "bandwidth_limit": "$root.products[name=$root.addons[planCode=$rec.addonFamilies[name=bandwidth].default].product].blobs.technical.bandwidth.limit",
++ "price_monthly": "pricings[mode=default,commitment=0,intervalUnit=month,interval=1].price",
++ "setup_fee": "pricings[mode=default,commitment=0,intervalUnit=none,interval=0].price"
++ }
++ },
++ {
++ "url": "https://api.us.ovhcloud.com/1.0/order/catalog/public/eco?ovhSubsidiary=US",
++ "format": "json",
++ "items_path": "plans",
++ "item_kind": "plan",
++ "max_bytes": 16777216,
++ "timeout_ms": 60000,
++ "where": {
++ "planCode": {
++ "pattern": "-us$"
++ }
++ },
++ "fields": {
++ "identity": "planCode",
++ "title": "invoiceName"
++ },
++ "extra_lists": {
++ "locations": "configurations[name=dedicated_datacenter].values"
++ },
++ "extra": {
++ "product": "product",
++ "currency": "$root.locale.currencyCode",
++ "range": "$root.products[name=$rec.product].blobs.technical.server.range",
++ "cpu_cores": "$root.products[name=$rec.product].blobs.technical.server.cpu.cores",
++ "cpu_sockets": "$root.products[name=$rec.product].blobs.technical.server.cpu.number",
++ "cpu_model": "$root.products[name=$rec.product].blobs.technical.server.cpu.model",
++ "cpu_brand": "$root.products[name=$rec.product].blobs.technical.server.cpu.brand",
++ "memory_gb": "$root.products[name=$root.addons[planCode=$rec.addonFamilies[name=memory].default].product].blobs.technical.memory.size",
++ "disk_capacity_gb": "$root.products[name=$root.addons[planCode=$rec.addonFamilies[name=storage].default].product].blobs.technical.storage.disks.0.capacity",
++ "disk_count": "$root.products[name=$root.addons[planCode=$rec.addonFamilies[name=storage].default].product].blobs.technical.storage.disks.0.number",
++ "disk_interface": "$root.products[name=$root.addons[planCode=$rec.addonFamilies[name=storage].default].product].blobs.technical.storage.disks.0.interface",
++ "disk_technology": "$root.products[name=$root.addons[planCode=$rec.addonFamilies[name=storage].default].product].blobs.technical.storage.disks.0.technology",
++ "bandwidth_mbps": "$root.products[name=$root.addons[planCode=$rec.addonFamilies[name=bandwidth].default].product].blobs.technical.bandwidth.level",
++ "bandwidth_limit": "$root.products[name=$root.addons[planCode=$rec.addonFamilies[name=bandwidth].default].product].blobs.technical.bandwidth.limit",
++ "price_monthly": "pricings[mode=default,commitment=0,intervalUnit=month,interval=1].price",
++ "setup_fee": "pricings[mode=default,commitment=0,intervalUnit=none,interval=0].price"
++ }
++ }
++ ],
++ "robots_note": "robots.txt checked 2026-11-05 from the production host: https://api.us.ovhcloud.com/robots.txt answers 404 (nginx), and https://api.ovh.com/robots.txt redirects to https://api.eu.ovhcloud.com/robots.txt, also 404, so the API hosts publish no robots.txt rules; a 404 is treated as no restrictions (never guessed as a disallow). The fetcher re-checks robots.txt on every run. (us.ovhcloud.com and www.ovhcloud.com, the marketing sites, are different hosts and are not fetched.)",
++ "terms_note": "OVHcloud's API schema (https://api.us.ovhcloud.com/1.0/order.json, read 2026-11-05) marks GET /order/catalog/public/baremetalServers noAuthentication true with apiStatus 'Beta version', and GET /order/catalog/public/eco noAuthentication true with apiStatus 'Stable production version'; both answered keylessly. The US Terms of Service (effective 15 May 2025, https://us.ovhcloud.com/legal/terms-of-service/, read 2026-11-05) say 'Except as expressly authorized in this Agreement, You will not make any copies or duplicates of any OVHcloud Services without the prior written permission of OVHcloud' (the rented Services); no clause found bans reading the public catalog or automated API access. The Service Specific Terms, section 2 Dedicated Servers (https://us.ovhcloud.com/legal/service-specific-terms/, read 2026-11-05) say 'The fees, features, and basic hardware and software configurations are described and accessible online via the OVHcloud website'. The website terms (https://www.ovhcloud.com/en/terms-and-conditions/, read 2026-11-05) say 'Any partial or full reproduction or representation of the website or its components by any process whatsoever, for any purposes whatsoever, is prohibited without the express consent of OVH': we never fetch that website, and keep only facts (plan codes, names, specifications, prices, currency) from the API, each linked to OVHcloud as a dated observation, never its text or images. Two files a day, about 32 MB (bare metal) and 10 MB (Eco). Prices are the catalog's integers in hundred-millionths of a dollar (14700000000 is $147.00): default-mode phase 1, month 1 is the monthly price; default-mode phase 0, intervalUnit none is the installation fee (the site's Advance-1 2026 shows $204/month and $204 installation). Only plan codes ending -us are kept (US datacenters; -ca/-eu copies filtered). Re-verify before enabling; disable on any request from OVHcloud.",
++ "license_note": "Plan specifications and prices are OVHcloud's data (https://us.ovhcloud.com/bare-metal/prices/). No licence to republish them was found beyond the public catalog being offered without authentication. Attribute OVHcloud and link the dedicated-server price page; no endorsement implied.",
++ "min_interval_ms": 60000,
++ "poll_interval_sec": 86400,
++ "max_items": 200,
++ "enabled": false,
++ "review_required": true,
++ "sensitivity": "none",
++ "default_indexability": "noindex"
++ },
{
"key": "porkbun-tld-pricing",
"name": "Porkbun domain prices (every TLD it sells)",
ddiff --git a/server/adapters/api.js b/server/adapters/api.js
iindex 17c223c..32ba95b 100644
---- a/server/adapters/api.js
++++ b/server/adapters/api.js
@@@ -41,13 +41,17 @@
* A key may carry a selector, `key[field=value,…]` (one to four conditions): `key` must be an array, and
* the path steps into its first element whose fields equal every value (compared as text after
* `scalar()`, so `interval=1` matches the number 1). A value is literal text (letters, digits, spaces,
-- * `_ : @ + -`) or `$rec.<path>`, a plain dotted path read from the record itself. No match, a missing
-- * value or a non-array is undefined (the field is null). OVHcloud's catalog lists plans and their
-- * hardware separately and keeps every price variant in one array:
++ * `_ : @ + -`), `$rec.<path>` (read from the record) or `$root.<path>` (read from the response), and
++ * either path may itself carry selectors. That reaches an addon named by the record and then that
++ * addon's own product, without code per provider; OVHcloud's catalog keeps plans, their default
++ * addons, and the addons' products apart:
*
* "extra": { "vcpu": "$root.products[name=$rec.product].blobs.technical.cpu.cores",
++ * "memory_gb": "$root.products[name=$root.addons[planCode=$rec.addonFamilies[name=memory].default].product].blobs.technical.memory.size",
* "price": "pricings[mode=default,commitment=0,intervalUnit=month].price" }
*
++ * No match, a missing value or a non-array is undefined (the field is null).
++ *
* A `where` expectation may also be `{ "pattern": "<regular expression>" }` (at most 200 characters):
* the value must be text the expression matches, e.g. `{ "planCode": { "pattern": "^vps-[0-9]{4}-model[0-9]+$" } }`.
*
@@@ -82,13 +86,14 @@
const { parseXml, toText, toIsoDate, epochSecondsToIso, canonicalUrl, toId, ParseError } = require('./util');
const PARSER_VERSION = 'api@1';
--// A segment is `*` (the single child of an object), `{$key}` (the map key, only inside `$root.`),
--// or an ordinary key. PATH_RE is syntax only; keyPathViolation enforces where each token may sit.
--// A selector condition is `field=value`, the value literal text or `$rec.` and a plain dotted path.
--const SEL_COND = '[A-Za-z0-9_]+=(?:\\$rec(?:\\.[A-Za-z0-9_]+)+|[A-Za-z0-9_ :@+-]+)';
--const SELECTOR = `\\[${SEL_COND}(?:,${SEL_COND}){0,3}\\]`;
--const PATH_SEG = `(?:\\*|\\{\\$key\\}|[A-Za-z0-9_@:$-]+(?:${SELECTOR})?)`;
--const PATH_RE = new RegExp(`^${PATH_SEG}(?:\\.${PATH_SEG})*$`);
++// A segment is `*` (the single child of an object), `{$key}` (the map key, only inside a `$root.` path),
++// or a key, optionally with a selector. A selector condition's value is literal text or a
++// `$rec.`/`$root.` path that may itself carry selectors. The parser below enforces the syntax; the
++// walker only parses paths that already passed `pathValid()` when they came from the registry.
++const NAME_RE = /^[A-Za-z0-9_@:$-]+$/;
++const FIELD_RE = /^[A-Za-z0-9_]+$/;
++const LITERAL_RE = /^[A-Za-z0-9_ :@+-]+$/;
++const MAX_DEPTH = 8;
/** A path's segments: dots split it, except inside a selector (whose `$rec.` values have dots of their own). */
const SPLIT = new Map();
@@@ -108,41 +113,110 @@ function splitPath(path) {
return segs;
}
--/** `key[a=b,c=$rec.d]` → { name, conds: [[field, value]] }, or null for a plain segment. */
--function selectorOf(seg) {
-- const m = /^([^[]+)\[(.+)\]$/.exec(seg);
-- if (!m) return null;
-- return { name: m[1], conds: m[2].split(',').map((c) => [c.slice(0, c.indexOf('=')), c.slice(c.indexOf('=') + 1)]) };
++/** Split a selector's inner text on commas outside nested brackets. */
++function selectorConds(inner) {
++ const parts = [];
++ let depth = 0;
++ let start = 0;
++ for (let i = 0; i < inner.length; i++) {
++ const ch = inner[i];
++ if (ch === '[') depth++;
++ else if (ch === ']') { depth--; if (depth < 0) return null; }
++ else if (ch === ',' && depth === 0) { parts.push(inner.slice(start, i)); start = i + 1; }
++ }
++ if (depth !== 0) return null;
++ parts.push(inner.slice(start));
++ return parts;
++}
++
++/**
++ * `key[a=b,c=$rec.d]` → { name, conds: [[field, value]] }, or { bad: true } when malformed.
++ * Parsed once per path and cached: a catalog can walk the same mapping for hundreds of plans.
++ */
++const PATHS = new Map();
++function parsePath(path) {
++ let parsed = PATHS.get(path);
++ if (parsed) return parsed;
++ const segs = splitPath(path).map((seg) => {
++ if (seg === '*') return { kind: '*' };
++ if (seg === '{$key}') return { kind: '{$key}' };
++ const open = seg.indexOf('[');
++ if (open === -1) return NAME_RE.test(seg) ? { kind: 'key', name: seg } : { kind: 'bad' };
++ if (seg[seg.length - 1] !== ']') return { kind: 'bad' };
++ const name = seg.slice(0, open);
++ if (!NAME_RE.test(name)) return { kind: 'bad' };
++ const parts = selectorConds(seg.slice(open + 1, -1));
++ if (!parts || parts.length < 1 || parts.length > 4) return { kind: 'bad' };
++ const conds = [];
++ for (const part of parts) {
++ const eq = part.indexOf('=');
++ if (eq <= 0) return { kind: 'bad' };
++ const field = part.slice(0, eq);
++ const value = part.slice(eq + 1);
++ if (!FIELD_RE.test(field) || !value) return { kind: 'bad' };
++ conds.push([field, value]);
++ }
++ return { kind: 'sel', name, conds };
++ });
++ parsed = { segs };
++ if (PATHS.size < 2000) PATHS.set(path, parsed);
++ return parsed;
++}
++
++/** Is a path syntactically valid, including every selector and every nested reference in it? */
++function pathValid(path, depth = 0, top = true) {
++ if (typeof path !== 'string' || !path || depth > MAX_DEPTH) return false;
++ const { segs } = parsePath(path);
++ if (segs.some((seg) => seg.kind === 'bad')) return false;
++ if (top && segs[0].kind === 'key' && segs[0].name === '$rec') return false;
++ for (const seg of segs) {
++ if (seg.kind !== 'sel') continue;
++ for (const [, value] of seg.conds) {
++ if (value.startsWith('$rec.')) { if (!pathValid(value.slice(5), depth + 1, false)) return false; }
++ else if (value.startsWith('$root.')) { if (!pathValid(value.slice(6), depth + 1, false)) return false; }
++ else if (!LITERAL_RE.test(value)) return false;
++ }
++ }
++ return true;
++}
++
++/** A selector condition's value: literal text, a record path, or a response path. */
++function refValue(raw, key, rec, root, depth) {
++ if (raw.startsWith('$rec.')) return scalar(walk(rec, raw.slice(5), key, rec, root, depth + 1));
++ if (raw.startsWith('$root.')) return scalar(walk(root, raw.slice(6), key, rec, root, depth + 1));
++ return raw;
}
/**
* Walk a dot path: `*` steps into an object's single own property, `{$key}` uses the map key, and
* `key[field=value,…]` steps into the first element of the array `key` whose fields match.
*/
--function walk(obj, path, key, rec) {
++function walk(obj, path, key, rec, root = obj, depth = 0) {
++ if (depth > MAX_DEPTH) return undefined;
++ const { segs } = parsePath(path);
let cur = obj;
-- for (const seg of splitPath(path)) {
++ for (const seg of segs) {
if (cur == null || typeof cur !== 'object') return undefined;
-- if (seg === '*') {
++ if (seg.kind === '*') {
if (Array.isArray(cur)) return undefined;
const own = Object.keys(cur);
if (own.length !== 1) return undefined;
cur = cur[own[0]];
-- } else if (seg === '{$key}') {
++ } else if (seg.kind === '{$key}') {
if (key === undefined) return undefined;
cur = cur[key];
-- } else {
-- const sel = selectorOf(seg);
-- if (!sel) { cur = cur[seg]; continue; }
-- const list = cur[sel.name];
++ } else if (seg.kind === 'key') {
++ cur = cur[seg.name];
++ } else if (seg.kind === 'sel') {
++ const list = cur[seg.name];
if (!Array.isArray(list)) return undefined;
-- const wanted = sel.conds.map(([f, v]) => [f, v.startsWith('$rec.') ? scalar(walk(rec, v.slice('$rec.'.length), key, rec)) : v]);
++ const wanted = seg.conds.map(([f, v]) => [f, refValue(v, key, rec, root, depth)]);
if (wanted.some(([, v]) => v == null)) return undefined;
cur = list.find((el) => el && typeof el === 'object' && wanted.every(([f, v]) => {
const a = scalar(el[f]);
return a != null && String(a) === String(v);
}));
-- }
++ } else return undefined;
}
return cur;
}
@@@ -151,13 +225,13 @@ function walk(obj, path, key, rec) {
function getField(body, rec, key, p) {
if (!p) return rec;
if (p === '$key') return key;
-- if (p.startsWith('$root.')) return walk(body, p.slice('$root.'.length), key, rec);
-- return walk(rec, p, key, rec);
++ if (p.startsWith('$root.')) return walk(body, p.slice('$root.'.length), key, rec, body);
++ return walk(rec, p, key, rec, body);
}
function at(obj, path) {
if (!path) return obj;
-- return walk(obj, path, undefined);
++ return walk(obj, path, undefined, obj, obj);
}
/** A list the API gives → up to 20 of its scalars (a lone scalar → a list of one; nothing → []). */
@@@ -229,7 +303,7 @@ function checkConditions(where, label, shape) {
if (typeof where !== 'object' || Array.isArray(where)) return `${label} must be an object of path -> expected`;
if (Object.keys(where).length > 10) return `at most 10 ${label} conditions`;
for (const [p, expected] of Object.entries(where)) {
-- if (!PATH_RE.test(p)) return `${label}.${p} path is malformed`;
++ if (!pathValid(p)) return `${label}.${p} path is malformed`;
const kerr = keyPathViolation(p, shape);
if (kerr) return `${label}.${p}: ${kerr}`;
if (isPattern(expected)) {
@@@ -254,19 +328,19 @@ function checkMapping(ep, { bulk = false } = {}) {
if (!bulk && ep.duplicates !== undefined && !['first', 'last'].includes(ep.duplicates)) return 'duplicates must be first or last';
const shape = ep.items_shape || 'array';
if (!bulk && !['array', 'map'].includes(shape)) return 'items_shape must be array or map';
-- if (!bulk && ep.items_path !== undefined && ep.items_path !== '' && !PATH_RE.test(ep.items_path)) return 'items_path is malformed';
++ if (!bulk && ep.items_path !== undefined && ep.items_path !== '' && !pathValid(ep.items_path)) return 'items_path is malformed';
const fields = ep.fields || {};
if (!fields.identity && !fields.url) return 'fields.identity or fields.url is required';
for (const [k, p] of Object.entries(fields)) {
if (!['identity', 'url', 'title', 'summary', 'author', 'published_at', 'published_at_epoch', 'updated_at', 'updated_at_epoch'].includes(k)) return `unknown field ${k}`;
-- if (typeof p !== 'string' || !PATH_RE.test(p)) return `fields.${k} path is malformed`;
++ if (typeof p !== 'string' || !pathValid(p)) return `fields.${k} path is malformed`;
const kerr = keyPathViolation(p, shape);
if (kerr) return `fields.${k}: ${kerr}`;
}
const extra = ep.extra || {};
if (Object.keys(extra).length > 30) return 'at most 30 extra fields';
for (const [k, p] of Object.entries(extra)) {
-- if (!/^[a-z][a-z0-9_]{0,39}$/.test(k) || typeof p !== 'string' || !PATH_RE.test(p)) return `extra.${k} is malformed`;
++ if (!/^[a-z][a-z0-9_]{0,39}$/.test(k) || typeof p !== 'string' || !pathValid(p)) return `extra.${k} is malformed`;
const kerr = keyPathViolation(p, shape);
if (kerr) return `extra.${k}: ${kerr}`;
}
@@@ -274,7 +348,7 @@ function checkMapping(ep, { bulk = false } = {}) {
if (typeof lists !== 'object' || Array.isArray(lists)) return 'extra_lists must be an object of field -> path';
if (Object.keys(lists).length > 10) return 'at most 10 extra_lists fields';
for (const [k, p] of Object.entries(lists)) {
-- if (!/^[a-z][a-z0-9_]{0,39}$/.test(k) || typeof p !== 'string' || !PATH_RE.test(p)) return `extra_lists.${k} is malformed`;
++ if (!/^[a-z][a-z0-9_]{0,39}$/.test(k) || typeof p !== 'string' || !pathValid(p)) return `extra_lists.${k} is malformed`;
if (Object.prototype.hasOwnProperty.call(extra, k)) return `extra_lists.${k} is also an extra field`;
const kerr = keyPathViolation(p, shape);
if (kerr) return `extra_lists.${k}: ${kerr}`;
ddiff --git a/test/api-join.test.js b/test/api-join.test.js
iindex a1b998d..5f48deb 100644
---- a/test/api-join.test.js
++++ b/test/api-join.test.js
@@@ -218,4 +218,74 @@ t('an endpoint without the new keys parses exactly as before', () => {
assert.strictEqual(r.items[1].canonical_url, null);
});
++const DEDICATED = JSON.stringify({
++ locale: { currencyCode: 'USD' },
++ plans: [
++ {
++ planCode: 'srv-1', product: 'p-1',
++ addonFamilies: [{ name: 'memory', default: 'ram-32' }, { name: 'storage', default: 'disk-2x960' }],
++ pricings: [{ mode: 'default', commitment: 0, intervalUnit: 'month', interval: 1, price: 14700000000 }],
++ },
++ {
++ planCode: 'srv-2', product: 'p-2',
++ addonFamilies: [{ name: 'memory', default: 'ram-64' }, { name: 'storage', default: 'disk-1x480' }],
++ pricings: [],
++ },
++ ],
++ addons: [
++ { planCode: 'ram-32', product: 'ram-32-prod' }, { planCode: 'ram-64', product: 'ram-64-prod' },
++ { planCode: 'disk-2x960', product: 'disk-2x960-prod' }, { planCode: 'disk-1x480', product: 'disk-1x480-prod' },
++ ],
++ products: [
++ { name: 'p-1', blobs: { technical: { server: { cpu: { cores: 6, number: 1 } } } } },
++ { name: 'p-2', blobs: { technical: { server: { cpu: { cores: 24, number: 2 } } } } },
++ { name: 'ram-32-prod', blobs: { technical: { memory: { size: 32 } } } },
++ { name: 'ram-64-prod', blobs: { technical: { memory: { size: 64 } } } },
++ { name: 'disk-2x960-prod', blobs: { technical: { storage: { disks: [{ capacity: 960, number: 2, interface: 'NVMe' }] } } } },
++ { name: 'disk-1x480-prod', blobs: { technical: { storage: { disks: [{ capacity: 480, number: 1, interface: 'SATA' }] } } } },
++ ],
++});
++
++const nestedEndpoint = {
++ format: 'json', items_path: 'plans', fields: { identity: 'planCode' },
++ extra: {
++ cores: '$root.products[name=$rec.product].blobs.technical.server.cpu.cores',
++ sockets: '$root.products[name=$rec.product].blobs.technical.server.cpu.number',
++ memory: '$root.products[name=$root.addons[planCode=$rec.addonFamilies[name=memory].default].product].blobs.technical.memory.size',
++ disk: '$root.products[name=$root.addons[planCode=$rec.addonFamilies[name=storage].default].product].blobs.technical.storage.disks.0.capacity',
++ disks: '$root.products[name=$root.addons[planCode=$rec.addonFamilies[name=storage].default].product].blobs.technical.storage.disks.0.number',
++ price: 'pricings[mode=default,commitment=0,intervalUnit=month,interval=1].price',
++ },
++};
++
++t('a selector value may be a $root or $rec path with its own selector, so a plan reaches its addon and that addon\'s product', () => {
++ assert.strictEqual(api.checkMapping(nestedEndpoint), null);
++ const r = api.parse(DEDICATED, { url: 'https://x.example/', endpoint: nestedEndpoint });
++ assert.deepStrictEqual(r.items.map((i) => i.identity), ['srv-1', 'srv-2']);
++ assert.deepStrictEqual(r.items[0].fields, { cores: 6, sockets: 1, memory: 32, disk: 960, disks: 2, price: 14700000000 });
++ assert.deepStrictEqual(r.items[1].fields, { cores: 24, sockets: 2, memory: 64, disk: 480, disks: 1, price: null });
++ // A named family the record does not have, and an addon code that names no addon, both give null.
++ const missing = { ...nestedEndpoint, extra: {
++ missing_family: '$root.products[name=$root.addons[planCode=$rec.addonFamilies[name=gpu].default].product].blobs.technical.memory.size',
++ missing_addon: '$root.products[name=$root.addons[planCode=$rec.nope].product].blobs.technical.memory.size',
++ } };
++ assert.strictEqual(api.checkMapping(missing), null);
++ const m = api.parse(DEDICATED, { url: 'https://x.example/', endpoint: missing });
++ assert.deepStrictEqual(m.items.map((i) => i.fields), [{ missing_family: null, missing_addon: null }, { missing_family: null, missing_addon: null }]);
++});
++
++t('checkMapping refuses a malformed nested reference and stops at a bounded depth', () => {
++ const extra = (x) => api.checkMapping({ fields: { identity: 'id' }, extra: { x } });
++ assert.strictEqual(extra('$root.a[b=$root.c[d=$rec.e].f]'), null);
++ assert.strictEqual(extra('$root.a[b=$rec.c[name=d,e=f].g]'), null, 'a nested selector may carry two conditions');
++ assert.match(extra('$root.a[b=$rec].x'), /malformed/);
++ assert.match(extra('$root.a[b=$root].x'), /malformed/);
++ assert.match(extra('$root.a[b=$root.c[d=$rec.e].f'), /malformed/, 'the outer bracket is unclosed');
++ assert.match(extra('$root.a[b=$rec.c[name=d,e=f,g=h,i=j,j=k].x]'), /malformed/, 'a nested selector has at most four conditions');
++ assert.match(extra('$rec.a'), /malformed/, 'a top-level $rec path is not a registry path');
++ let deep = 'z';
++ for (let i = 0; i < 10; i++) deep = `y${i}[a=$rec.${deep}]`;
++ assert.match(extra('$root.' + deep), /malformed/, 'references are bounded');
++});
++
t.run();
ddiff --git a/test/fixtures/ovhcloud-baremetal.json b/test/fixtures/ovhcloud-baremetal.json
nnew file mode 100644
iindex 0000000..718bd4a
---- /dev/null
++++ b/test/fixtures/ovhcloud-baremetal.json
@@@ -0,0 +1,4274 @@
++{
++ "catalogId": 3775,
++ "locale": {
++ "currencyCode": "USD",
++ "subsidiary": "US",
++ "taxRate": 0
++ },
++ "plans": [
++ {
++ "planCode": "19infra032-se",
++ "invoiceName": "INFRA-3-SE",
++ "addonFamilies": [
++ {
++ "name": "memory",
++ "exclusive": true,
++ "mandatory": true,
++ "addons": [
++ "ram-128g-ecc-2933-infra-us"
++ ],
++ "default": "ram-128g-ecc-2933-infra-us"
++ },
++ {
++ "name": "bandwidth",
++ "exclusive": true,
++ "mandatory": true,
++ "addons": [
++ "bandwidth-guaranteed-2000-ultimate-2019v1-us",
++ "bandwidth-1000-burst-2gbps-infra-us"
++ ],
++ "default": "bandwidth-1000-burst-2gbps-infra-us"
++ },
++ {
++ "name": "storage",
++ "exclusive": true,
++ "mandatory": true,
++ "addons": [
++ "softraid-2x960nvme-infra-us"
++ ],
++ "default": "softraid-2x960nvme-infra-us"
++ }
++ ],
++ "product": "19infra03-custom",
++ "pricingType": "rental",
++ "consumptionConfiguration": null,
++ "pricings": [
++ {
++ "phase": 0,
++ "capacities": [
++ "installation"
++ ],
++ "commitment": 0,
++ "description": "rental (only applicable for 1 time)",
++ "interval": 0,
++ "intervalUnit": "none",
++ "quantity": {
++ "min": 1,
++ "max": 10
++ },
++ "repeat": {
++ "min": 1,
++ "max": 1
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ },
++ {
++ "phase": 1,
++ "capacities": [
++ "renew"
++ ],
++ "commitment": 0,
++ "description": "rental for 1 month",
++ "interval": 1,
++ "intervalUnit": "month",
++ "quantity": {
++ "min": 1,
++ "max": 10
++ },
++ "repeat": {
++ "min": 1,
++ "max": null
++ },
++ "price": 30100000000,
++ "formattedPrice": "$301.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ }
++ ],
++ "configurations": [
++ {
++ "name": "dedicated_datacenter",
++ "isCustom": false,
++ "isMandatory": true,
++ "values": [
++ "vin",
++ "hil"
++ ]
++ },
++ {
++ "name": "dedicated_os",
++ "isCustom": false,
++ "isMandatory": true,
++ "values": [
++ "none_64.en"
++ ]
++ },
++ {
++ "name": "region",
++ "isCustom": false,
++ "isMandatory": false,
++ "values": [
++ "united_states"
++ ]
++ }
++ ],
++ "family": null,
++ "blobs": {
++ "commercial": {
++ "range": "infrastructure"
++ }
++ }
++ },
++ {
++ "planCode": "20bv012-us",
++ "invoiceName": "BV-1",
++ "addonFamilies": [
++ {
++ "name": "bandwidth",
++ "exclusive": true,
++ "mandatory": true,
++ "addons": [
++ "bandwidth-500-bv-us"
++ ],
++ "default": "bandwidth-500-bv-us"
++ },
++ {
++ "name": "memory",
++ "exclusive": true,
++ "mandatory": true,
++ "addons": [
++ "ram-256g-bv-us"
++ ],
++ "default": "ram-256g-bv-us"
++ },
++ {
++ "name": "storage",
++ "exclusive": true,
++ "mandatory": true,
++ "addons": [
++ "hybridsoftraid-4x2000sa-2x240ssd-bv-us",
++ "softraid-2x240ssd-bv-us"
++ ],
++ "default": "softraid-2x240ssd-bv-us"
++ }
++ ],
++ "product": "20bv01",
++ "pricingType": "rental",
++ "consumptionConfiguration": null,
++ "pricings": [
++ {
++ "phase": 0,
++ "capacities": [
++ "installation"
++ ],
++ "commitment": 0,
++ "description": "rental (only applicable for 1 time)",
++ "interval": 0,
++ "intervalUnit": "none",
++ "quantity": {
++ "min": 1,
++ "max": 10
++ },
++ "repeat": {
++ "min": 1,
++ "max": 1
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ },
++ {
++ "phase": 1,
++ "capacities": [
++ "renew"
++ ],
++ "commitment": 0,
++ "description": "rental for 1 month",
++ "interval": 1,
++ "intervalUnit": "month",
++ "quantity": {
++ "min": 1,
++ "max": 10
++ },
++ "repeat": {
++ "min": 1,
++ "max": null
++ },
++ "price": 10900000000,
++ "formattedPrice": "$109.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ }
++ ],
++ "configurations": [
++ {
++ "name": "dedicated_datacenter",
++ "isCustom": false,
++ "isMandatory": true,
++ "values": [
++ "vin",
++ "hil"
++ ]
++ },
++ {
++ "name": "dedicated_os",
++ "isCustom": false,
++ "isMandatory": true,
++ "values": [
++ "none_64.en"
++ ]
++ },
++ {
++ "name": "region",
++ "isCustom": false,
++ "isMandatory": false,
++ "values": [
++ "united_states"
++ ]
++ }
++ ],
++ "family": null,
++ "blobs": {
++ "commercial": {
++ "range": "best-value"
++ }
++ }
++ },
++ {
++ "planCode": "20hg03-us",
++ "invoiceName": "HG-3",
++ "addonFamilies": [
++ {
++ "name": "bandwidth",
++ "exclusive": true,
++ "mandatory": true,
++ "addons": [
++ "bandwidth-guaranteed-3000-ultimate-2019v2-us",
++ "bandwidth-1000-burst-3gbps-hg-us",
++ "bandwidth-guaranteed-2000-ultimate-2019v1-us"
++ ],
++ "default": "bandwidth-1000-burst-3gbps-hg-us"
++ },
++ {
++ "name": "memory",
++ "exclusive": true,
++ "mandatory": true,
++ "addons": [
++ "ram-192g-hg3-us"
++ ],
++ "default": "ram-192g-hg3-us"
++ },
++ {
++ "name": "storage",
++ "exclusive": true,
++ "mandatory": true,
++ "addons": [
++ "softraid-2x6000sas-hg-us"
++ ],
++ "default": "softraid-2x6000sas-hg-us"
++ }
++ ],
++ "product": "20hg03-us",
++ "pricingType": "rental",
++ "consumptionConfiguration": null,
++ "pricings": [
++ {
++ "phase": 0,
++ "capacities": [
++ "installation"
++ ],
++ "commitment": 0,
++ "description": "rental (only applicable for 1 time)",
++ "interval": 0,
++ "intervalUnit": "none",
++ "quantity": {
++ "min": 1,
++ "max": 10
++ },
++ "repeat": {
++ "min": 1,
++ "max": 1
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ },
++ {
++ "phase": 1,
++ "capacities": [
++ "renew"
++ ],
++ "commitment": 0,
++ "description": "rental for 1 month",
++ "interval": 1,
++ "intervalUnit": "month",
++ "quantity": {
++ "min": 1,
++ "max": 10
++ },
++ "repeat": {
++ "min": 1,
++ "max": null
++ },
++ "price": 97500000000,
++ "formattedPrice": "$975.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ }
++ ],
++ "configurations": [
++ {
++ "name": "dedicated_datacenter",
++ "isCustom": false,
++ "isMandatory": true,
++ "values": [
++ "vin",
++ "hil"
++ ]
++ },
++ {
++ "name": "dedicated_os",
++ "isCustom": false,
++ "isMandatory": true,
++ "values": [
++ "none_64.en"
++ ]
++ },
++ {
++ "name": "region",
++ "isCustom": false,
++ "isMandatory": false,
++ "values": [
++ "united_states"
++ ]
++ }
++ ],
++ "family": null,
++ "blobs": {
++ "commercial": {
++ "range": "hg"
++ }
++ }
++ },
++ {
++ "planCode": "22bf062-us",
++ "invoiceName": "BFSTOR21-3",
++ "addonFamilies": [
++ {
++ "name": "memory",
++ "exclusive": true,
++ "mandatory": true,
++ "addons": [
++ "ram-48g-bf6-us"
++ ],
++ "default": "ram-48g-bf6-us"
++ },
++ {
++ "name": "storage",
++ "exclusive": true,
++ "mandatory": true,
++ "addons": [
++ "softraid-12x4000sas-bf6-us"
++ ],
++ "default": "softraid-12x4000sas-bf6-us"
++ },
++ {
++ "name": "bandwidth",
++ "exclusive": true,
++ "mandatory": true,
++ "addons": [
++ "bandwidth-500-included-bf-us"
++ ],
++ "default": "bandwidth-500-included-bf-us"
++ }
++ ],
++ "product": "22bf06",
++ "pricingType": "rental",
++ "consumptionConfiguration": null,
++ "pricings": [
++ {
++ "phase": 0,
++ "capacities": [
++ "installation"
++ ],
++ "commitment": 0,
++ "description": "rental (only applicable for 1 time)",
++ "interval": 0,
++ "intervalUnit": "none",
++ "quantity": {
++ "min": 1,
++ "max": 10
++ },
++ "repeat": {
++ "min": 1,
++ "max": 1
++ },
++ "price": 20900000000,
++ "formattedPrice": "$209.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ },
++ {
++ "phase": 1,
++ "capacities": [
++ "renew"
++ ],
++ "commitment": 0,
++ "description": "rental for 1 month",
++ "interval": 1,
++ "intervalUnit": "month",
++ "quantity": {
++ "min": 1,
++ "max": 10
++ },
++ "repeat": {
++ "min": 1,
++ "max": null
++ },
++ "price": 20900000000,
++ "formattedPrice": "$209.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ }
++ ],
++ "configurations": [
++ {
++ "name": "dedicated_datacenter",
++ "isCustom": false,
++ "isMandatory": true,
++ "values": [
++ "vin",
++ "hil"
++ ]
++ },
++ {
++ "name": "dedicated_os",
++ "isCustom": false,
++ "isMandatory": true,
++ "values": [
++ "none_64.en"
++ ]
++ },
++ {
++ "name": "region",
++ "isCustom": false,
++ "isMandatory": true,
++ "values": [
++ "united_states"
++ ]
++ }
++ ],
++ "family": null,
++ "blobs": {
++ "commercial": {
++ "name": "BFSTOR21-3"
++ }
++ }
++ },
++ {
++ "planCode": "24adv01-v3-eu",
++ "invoiceName": "ADVANCE-1 | AMD EPYC 4244P",
++ "addonFamilies": [
++ {
++ "name": "bandwidth",
++ "exclusive": true,
++ "mandatory": true,
++ "addons": [
++ "bandwidth-3000-adv-gen3-eu",
++ "bandwidth-4000-adv-gen3-eu",
++ "bandwidth-5000-adv-gen3-eu"
++ ],
++ "default": "bandwidth-3000-adv-gen3-eu"
++ },
++ {
++ "name": "storage",
++ "exclusive": true,
++ "mandatory": true,
++ "addons": [
++ "hybridsoftraid-2x960nvme-pcie-gen4-2x1920nvme-pcie-gen4-24adv01-v3-eu",
++ "hybridsoftraid-2x960nvme-pcie-gen4-2x3840nvme-pcie-gen4-24adv01-v3-eu",
++ "hybridsoftraid-2x960nvme-pcie-gen4-2x7680nvme-pcie-gen4-24adv01-v3-eu",
++ "softraid-2x960nvme-pcie-gen4-24adv01-v3-eu",
++ "softraid-4x960nvme-pcie-gen4-24adv01-v3-eu",
++ "softraid-4x1920nvme-pcie-gen4-24adv01-v3-eu",
++ "softraid-4x3840nvme-pcie-gen4-24adv01-v3-eu",
++ "softraid-4x7680nvme-pcie-gen4-24adv01-v3-eu"
++ ],
++ "default": "softraid-2x960nvme-pcie-gen4-24adv01-v3-eu"
++ },
++ {
++ "name": "memory",
++ "exclusive": true,
++ "mandatory": true,
++ "addons": [
++ "ram-32g-on-die-ecc-5200-24adv01-v3-eu",
++ "ram-64g-on-die-ecc-5200-24adv01-v3-eu",
++ "ram-128g-on-die-ecc-3600-24adv01-v3-eu",
++ "ram-192g-on-die-ecc-3600-24adv01-v3-eu"
++ ],
++ "default": "ram-32g-on-die-ecc-5200-24adv01-v3-eu"
++ }
++ ],
++ "product": "24adv01",
++ "pricingType": "rental",
++ "consumptionConfiguration": null,
++ "pricings": [
++ {
++ "phase": 0,
++ "capacities": [
++ "installation"
++ ],
++ "commitment": 0,
++ "description": "rental (only applicable for 1 time)",
++ "interval": 0,
++ "intervalUnit": "none",
++ "quantity": {
++ "min": 1,
++ "max": 10
++ },
++ "repeat": {
++ "min": 1,
++ "max": 1
++ },
++ "price": 14700000000,
++ "formattedPrice": "$147.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ },
++ {
++ "phase": 1,
++ "capacities": [
++ "renew"
++ ],
++ "commitment": 0,
++ "description": "rental for 1 month",
++ "interval": 1,
++ "intervalUnit": "month",
++ "quantity": {
++ "min": 1,
++ "max": 10
++ },
++ "repeat": {
++ "min": 1,
++ "max": null
++ },
++ "price": 14700000000,
++ "formattedPrice": "$147.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ }
++ ],
++ "configurations": [
++ {
++ "name": "dedicated_datacenter",
++ "isCustom": false,
++ "isMandatory": false,
++ "values": [
++ "fra",
++ "gra",
++ "lon",
++ "rbx",
++ "waw",
++ "sbg"
++ ]
++ },
++ {
++ "name": "dedicated_os",
++ "isCustom": false,
++ "isMandatory": true,
++ "values": [
++ "none_64.en"
++ ]
++ },
++ {
++ "name": "region",
++ "isCustom": false,
++ "isMandatory": true,
++ "values": [
++ "united_states"
++ ]
++ },
++ {
++ "name": "enable-backup",
++ "isCustom": false,
++ "isMandatory": false,
++ "values": [
++ "true",
++ "false"
++ ]
++ }
++ ],
++ "family": null,
++ "blobs": {
++ "commercial": {
++ "features": [
++ {
++ "name": "release-year",
++ "value": "2024"
++ },
++ {
++ "name": "baremetal-server-usecases",
++ "value": "hosting,bdd"
++ },
++ {
++ "name": "alternative-cpu",
++ "value": "26adv01-v7-eu"
++ },
++ {
++ "name": "last-generation",
++ "value": "false"
++ }
++ ],
++ "name": "ADVANCE-1"
++ }
++ }
++ },
++ {
++ "planCode": "24adv01-v3-us",
++ "invoiceName": "ADVANCE-1 | AMD EPYC 4244P",
++ "addonFamilies": [
++ {
++ "name": "bandwidth",
++ "exclusive": true,
++ "mandatory": true,
++ "addons": [
++ "bandwidth-5000-adv-gen3-us",
++ "bandwidth-3000-adv-gen3-us",
++ "bandwidth-4000-adv-gen3-us"
++ ],
++ "default": "bandwidth-3000-adv-gen3-us"
++ },
++ {
++ "name": "storage",
++ "exclusive": true,
++ "mandatory": true,
++ "addons": [
++ "hybridsoftraid-2x960nvme-pcie-gen4-2x1920nvme-pcie-gen4-24adv01-v3-us",
++ "hybridsoftraid-2x960nvme-pcie-gen4-2x3840nvme-pcie-gen4-24adv01-v3-us",
++ "hybridsoftraid-2x960nvme-pcie-gen4-2x7680nvme-pcie-gen4-24adv01-v3-us",
++ "softraid-2x960nvme-pcie-gen4-24adv01-v3-us",
++ "softraid-4x960nvme-pcie-gen4-24adv01-v3-us",
++ "softraid-4x1920nvme-pcie-gen4-24adv01-v3-us",
++ "softraid-4x3840nvme-pcie-gen4-24adv01-v3-us",
++ "softraid-4x7680nvme-pcie-gen4-24adv01-v3-us"
++ ],
++ "default": "softraid-2x960nvme-pcie-gen4-24adv01-v3-us"
++ },
++ {
++ "name": "memory",
++ "exclusive": true,
++ "mandatory": true,
++ "addons": [
++ "ram-32g-on-die-ecc-5200-24adv01-v3-us",
++ "ram-64g-on-die-ecc-5200-24adv01-v3-us",
++ "ram-128g-on-die-ecc-3600-24adv01-v3-us",
++ "ram-192g-on-die-ecc-3600-24adv01-v3-us"
++ ],
++ "default": "ram-32g-on-die-ecc-5200-24adv01-v3-us"
++ }
++ ],
++ "product": "24adv01",
++ "pricingType": "rental",
++ "consumptionConfiguration": null,
++ "pricings": [
++ {
++ "phase": 0,
++ "capacities": [
++ "installation"
++ ],
++ "commitment": 0,
++ "description": "rental (only applicable for 1 time)",
++ "interval": 0,
++ "intervalUnit": "none",
++ "quantity": {
++ "min": 1,
++ "max": 10
++ },
++ "repeat": {
++ "min": 1,
++ "max": 1
++ },
++ "price": 14700000000,
++ "formattedPrice": "$147.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ },
++ {
++ "phase": 1,
++ "capacities": [
++ "renew"
++ ],
++ "commitment": 0,
++ "description": "rental for 1 month",
++ "interval": 1,
++ "intervalUnit": "month",
++ "quantity": {
++ "min": 1,
++ "max": 10
++ },
++ "repeat": {
++ "min": 1,
++ "max": null
++ },
++ "price": 14700000000,
++ "formattedPrice": "$147.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ }
++ ],
++ "configurations": [
++ {
++ "name": "dedicated_datacenter",
++ "isCustom": false,
++ "isMandatory": false,
++ "values": [
++ "vin",
++ "hil"
++ ]
++ },
++ {
++ "name": "dedicated_os",
++ "isCustom": false,
++ "isMandatory": true,
++ "values": [
++ "none_64.en"
++ ]
++ },
++ {
++ "name": "region",
++ "isCustom": false,
++ "isMandatory": true,
++ "values": [
++ "united_states"
++ ]
++ },
++ {
++ "name": "enable-backup",
++ "isCustom": false,
++ "isMandatory": false,
++ "values": [
++ "true",
++ "false"
++ ]
++ }
++ ],
++ "family": null,
++ "blobs": {
++ "commercial": {
++ "features": [
++ {
++ "name": "release-year",
++ "value": "2024"
++ },
++ {
++ "name": "baremetal-server-usecases",
++ "value": "hosting,bdd"
++ },
++ {
++ "name": "alternative-cpu",
++ "value": "26adv01-v7-us"
++ },
++ {
++ "name": "last-generation",
++ "value": "false"
++ }
++ ],
++ "name": "ADVANCE-1"
++ }
++ }
++ },
++ {
++ "planCode": "26game02-v4-us",
++ "invoiceName": "GAME-2 | AMD RYZEN 9 9950X3D",
++ "addonFamilies": [
++ {
++ "name": "memory",
++ "exclusive": true,
++ "mandatory": true,
++ "addons": [
++ "ram-128g-on-die-ecc-3600-26game02-v4-us",
++ "ram-64g-on-die-ecc-5600-26game02-v4-us",
++ "ram-192g-on-die-ecc-3600-26game02-v4-us",
++ "ram-256g-on-die-ecc-3600-26game02-v4-us"
++ ],
++ "default": "ram-64g-on-die-ecc-5600-26game02-v4-us"
++ },
++ {
++ "name": "storage",
++ "exclusive": true,
++ "mandatory": true,
++ "addons": [
++ "softraid-2x960nvme-26game02-v4-us"
++ ],
++ "default": "softraid-2x960nvme-26game02-v4-us"
++ },
++ {
++ "name": "bandwidth",
++ "exclusive": true,
++ "mandatory": true,
++ "addons": [
++ "bandwidth-1000-game-gen4-us"
++ ],
++ "default": "bandwidth-1000-game-gen4-us"
++ }
++ ],
++ "product": "26game02",
++ "pricingType": "rental",
++ "consumptionConfiguration": null,
++ "pricings": [
++ {
++ "phase": 0,
++ "capacities": [
++ "installation"
++ ],
++ "commitment": 0,
++ "description": "rental (only applicable for 1 time)",
++ "interval": 0,
++ "intervalUnit": "none",
++ "quantity": {
++ "min": 1,
++ "max": 10
++ },
++ "repeat": {
++ "min": 1,
++ "max": 1
++ },
++ "price": 40100000000,
++ "formattedPrice": "$401.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [
++ {
++ "description": "Free setup fees for all customers",
++ "discount": {
++ "value": 40100000000,
++ "formattedValue": "$401.00 USD",
++ "tax": 0
++ },
++ "duration": null,
++ "context": "standard",
++ "customFieldValues": [],
++ "endDate": "2026-11-04T15:00:00-05:00",
++ "formattedValue": "",
++ "globalQuantity": null,
++ "isForTestingPurpose": false,
++ "isGlobalQuantityLimited": false,
++ "minimumDuration": 1,
++ "name": "2710_SpecialOffers_SetUpFee",
++ "quantity": null,
++ "startDate": "2026-10-21T14:30:50.51-04:00",
++ "tags": null,
++ "total": {
++ "value": 0,
++ "formattedValue": "$0.00 USD",
++ "tax": 0
++ },
++ "type": "percentage",
++ "value": 100
++ }
++ ],
++ "engagementConfiguration": null
++ },
++ {
++ "phase": 1,
++ "capacities": [
++ "renew"
++ ],
++ "commitment": 0,
++ "description": "rental for 1 month",
++ "interval": 1,
++ "intervalUnit": "month",
++ "quantity": {
++ "min": 1,
++ "max": 10
++ },
++ "repeat": {
++ "min": 1,
++ "max": null
++ },
++ "price": 40100000000,
++ "formattedPrice": "$401.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ }
++ ],
++ "configurations": [
++ {
++ "name": "dedicated_os",
++ "isCustom": false,
++ "isMandatory": true,
++ "values": [
++ "none_64.en"
++ ]
++ },
++ {
++ "name": "region",
++ "isCustom": false,
++ "isMandatory": true,
++ "values": [
++ "united_states"
++ ]
++ },
++ {
++ "name": "dedicated_datacenter",
++ "isCustom": false,
++ "isMandatory": true,
++ "values": [
++ "vin",
++ "hil"
++ ]
++ },
++ {
++ "name": "enable-backup",
++ "isCustom": false,
++ "isMandatory": false,
++ "values": [
++ "true",
++ "false"
++ ]
++ }
++ ],
++ "family": null,
++ "blobs": {
++ "commercial": {
++ "features": [
++ {
++ "name": "baremetal-server-usecases",
++ "value": "gaming"
++ },
++ {
++ "name": "release-year",
++ "value": "2026"
++ }
++ ],
++ "name": "GAME-2"
++ }
++ }
++ },
++ {
++ "planCode": "24hci-a1-v2-us",
++ "invoiceName": "HGR-HCI-a1",
++ "addonFamilies": [
++ {
++ "name": "bandwidth",
++ "exclusive": true,
++ "mandatory": true,
++ "addons": [
++ "bandwidth-10000-hgr-gen2-us",
++ "bandwidth-15000-hgr-gen2-us",
++ "bandwidth-20000-hgr-gen2-us",
++ "bandwidth-25000-hgr-gen2-us"
++ ],
++ "default": "bandwidth-10000-hgr-gen2-us"
++ },
++ {
++ "name": "memory",
++ "exclusive": true,
++ "mandatory": true,
++ "addons": [
++ "ram-256g-ecc-4800-24hci-a1-v2-us",
++ "ram-512g-ecc-4800-24hci-a1-v2-us",
++ "ram-1024g-ecc-4800-24hci-a1-v2-us",
++ "ram-1536g-ecc-4800-24hci-a1-v2-us",
++ "ram-2304g-ecc-4800-24hci-a1-v2-us"
++ ],
++ "default": "ram-256g-ecc-4800-24hci-a1-v2-us"
++ },
++ {
++ "name": "storage",
++ "exclusive": true,
++ "mandatory": true,
++ "addons": [
++ "softraid-6x3840nvme-24hci-a1-v2-us",
++ "softraid-12x3840nvme-24hci-a1-v2-us",
++ "softraid-18x3840nvme-24hci-a1-v2-us",
++ "softraid-24x3840nvme-24hci-a1-v2-us"
++ ],
++ "default": "softraid-6x3840nvme-24hci-a1-v2-us"
++ }
++ ],
++ "product": "24hci-a1",
++ "pricingType": "rental",
++ "consumptionConfiguration": null,
++ "pricings": [
++ {
++ "phase": 0,
++ "capacities": [
++ "installation"
++ ],
++ "commitment": 0,
++ "description": "rental (only applicable for 1 time)",
++ "interval": 0,
++ "intervalUnit": "none",
++ "quantity": {
++ "min": 1,
++ "max": 10
++ },
++ "repeat": {
++ "min": 1,
++ "max": 1
++ },
++ "price": 165500000000,
++ "formattedPrice": "$1655.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ },
++ {
++ "phase": 1,
++ "capacities": [
++ "renew"
++ ],
++ "commitment": 0,
++ "description": "rental for 1 month",
++ "interval": 1,
++ "intervalUnit": "month",
++ "quantity": {
++ "min": 1,
++ "max": 10
++ },
++ "repeat": {
++ "min": 1,
++ "max": null
++ },
++ "price": 165500000000,
++ "formattedPrice": "$1655.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ }
++ ],
++ "configurations": [
++ {
++ "name": "dedicated_datacenter",
++ "isCustom": false,
++ "isMandatory": false,
++ "values": [
++ "vin",
++ "hil"
++ ]
++ },
++ {
++ "name": "dedicated_os",
++ "isCustom": false,
++ "isMandatory": true,
++ "values": [
++ "none_64.en"
++ ]
++ },
++ {
++ "name": "region",
++ "isCustom": false,
++ "isMandatory": true,
++ "values": [
++ "united_states"
++ ]
++ },
++ {
++ "name": "enable-backup",
++ "isCustom": false,
++ "isMandatory": false,
++ "values": [
++ "true",
++ "false"
++ ]
++ }
++ ],
++ "family": null,
++ "blobs": {
++ "commercial": {
++ "features": [
++ {
++ "name": "baremetal-server-usecases",
++ "value": "virtualisation-containerisation-orchestration,hyperconverged-infrastructure,confidential-computing,hpc"
++ },
++ {
++ "name": "alternative-cpu",
++ "value": "26hci-a1-v2"
++ },
++ {
++ "name": "last-generation",
++ "value": "false"
++ },
++ {
++ "name": "release-year",
++ "value": "2024"
++ }
++ ],
++ "name": "HGR-HCI-a1"
++ }
++ }
++ },
++ {
++ "planCode": "23scaleamd01-v3-us",
++ "invoiceName": "Scale-a1",
++ "addonFamilies": [
++ {
++ "name": "bandwidth",
++ "exclusive": true,
++ "mandatory": true,
++ "addons": [
++ "bandwidth-20000-scale-gen2-us",
++ "bandwidth-25000-scale-gen2-us",
++ "bandwidth-15000-scale-gen2-us",
++ "bandwidth-5000-scale-gen2-us",
++ "bandwidth-10000-scale-gen2-us"
++ ],
++ "default": "bandwidth-5000-scale-gen2-us"
++ },
++ {
++ "name": "storage",
++ "exclusive": true,
++ "mandatory": true,
++ "addons": [
++ "noraid-0-23scaleamd01-v3-us",
++ "softraid-2x1920nvme-23scaleamd01-v3-us",
++ "softraid-2x3840nvme-23scaleamd01-v3-us",
++ "softraid-2x7680nvme-23scaleamd01-v3-us",
++ "softraid-4x1920nvme-23scaleamd01-v3-us",
++ "softraid-4x3840nvme-23scaleamd01-v3-us",
++ "softraid-4x7680nvme-23scaleamd01-v3-us",
++ "softraid-6x1920nvme-23scaleamd01-v3-us",
++ "softraid-6x3840nvme-23scaleamd01-v3-us",
++ "softraid-6x7680nvme-23scaleamd01-v3-us"
++ ],
++ "default": "noraid-0-23scaleamd01-v3-us"
++ },
++ {
++ "name": "memory",
++ "exclusive": true,
++ "mandatory": true,
++ "addons": [
++ "ram-128g-ecc-4800-23scaleamd01-v3-us",
++ "ram-256g-ecc-4800-23scaleamd01-v3-us",
++ "ram-512g-ecc-4800-23scaleamd01-v3-us",
++ "ram-1024g-ecc-4800-23scaleamd01-v3-us"
++ ],
++ "default": "ram-128g-ecc-4800-23scaleamd01-v3-us"
++ }
++ ],
++ "product": "23scaleamd01",
++ "pricingType": "rental",
++ "consumptionConfiguration": null,
++ "pricings": [
++ {
++ "phase": 0,
++ "capacities": [
++ "installation"
++ ],
++ "commitment": 0,
++ "description": "rental (only applicable for 1 time)",
++ "interval": 0,
++ "intervalUnit": "none",
++ "quantity": {
++ "min": 1,
++ "max": 10
++ },
++ "repeat": {
++ "min": 1,
++ "max": 1
++ },
++ "price": 68900000000,
++ "formattedPrice": "$689.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [
++ {
++ "description": "Free setup fees for all customers",
++ "discount": {
++ "value": 68900000000,
++ "formattedValue": "$689.00 USD",
++ "tax": 0
++ },
++ "duration": null,
++ "context": "standard",
++ "customFieldValues": [],
++ "endDate": "2026-11-04T15:00:00-05:00",
++ "formattedValue": "",
++ "globalQuantity": null,
++ "isForTestingPurpose": false,
++ "isGlobalQuantityLimited": false,
++ "minimumDuration": 1,
++ "name": "2710_SpecialOffers_SetUpFee",
++ "quantity": null,
++ "startDate": "2026-10-21T14:30:50.51-04:00",
++ "tags": null,
++ "total": {
++ "value": 0,
++ "formattedValue": "$0.00 USD",
++ "tax": 0
++ },
++ "type": "percentage",
++ "value": 100
++ }
++ ],
++ "engagementConfiguration": null
++ },
++ {
++ "phase": 1,
++ "capacities": [
++ "renew"
++ ],
++ "commitment": 0,
++ "description": "rental for 1 month",
++ "interval": 1,
++ "intervalUnit": "month",
++ "quantity": {
++ "min": 1,
++ "max": 10
++ },
++ "repeat": {
++ "min": 1,
++ "max": null
++ },
++ "price": 68900000000,
++ "formattedPrice": "$689.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ }
++ ],
++ "configurations": [
++ {
++ "name": "dedicated_datacenter",
++ "isCustom": false,
++ "isMandatory": false,
++ "values": [
++ "vin",
++ "hil"
++ ]
++ },
++ {
++ "name": "dedicated_os",
++ "isCustom": false,
++ "isMandatory": true,
++ "values": [
++ "none_64.en"
++ ]
++ },
++ {
++ "name": "region",
++ "isCustom": false,
++ "isMandatory": true,
++ "values": [
++ "united_states"
++ ]
++ },
++ {
++ "name": "enable-backup",
++ "isCustom": false,
++ "isMandatory": false,
++ "values": [
++ "true",
++ "false"
++ ]
++ }
++ ],
++ "family": null,
++ "blobs": {
++ "commercial": {
++ "features": [
++ {
++ "name": "release-year",
++ "value": "2024"
++ },
++ {
++ "name": "alternative-cpu",
++ "value": "26scaleamd01-v4-us"
++ },
++ {
++ "name": "last-generation",
++ "value": "false"
++ },
++ {
++ "name": "baremetal-server-usecases",
++ "value": "confidential-computing,vdi,virtualisation-containerisation-orchestration,bdd"
++ }
++ ],
++ "name": "Scale-a1"
++ }
++ }
++ },
++ {
++ "planCode": "26adv01-v7-us",
++ "invoiceName": "ADVANCE-1 | AMD EPYC 4245P",
++ "addonFamilies": [
++ {
++ "name": "storage",
++ "exclusive": true,
++ "mandatory": true,
++ "addons": [
++ "hybridsoftraid-2x960nvme-pcie-gen5-2x1920nvme-pcie-gen5-26adv01-v7-us",
++ "hybridsoftraid-2x960nvme-pcie-gen5-2x3840nvme-pcie-gen5-26adv01-v7-us",
++ "hybridsoftraid-2x960nvme-pcie-gen5-2x7680nvme-pcie-gen5-26adv01-v7-us",
++ "hybridsoftraid-2x960nvme-pcie-gen5-2x15360nvme-pcie-gen5-26adv01-v7-us",
++ "softraid-2x960nvme-pcie-gen5-26adv01-v7-us",
++ "softraid-4x960nvme-pcie-gen5-26adv01-v7-us",
++ "softraid-4x1920nvme-pcie-gen5-26adv01-v7-us",
++ "softraid-4x3840nvme-pcie-gen5-26adv01-v7-us",
++ "softraid-4x7680nvme-pcie-gen5-26adv01-v7-us"
++ ],
++ "default": "softraid-2x960nvme-pcie-gen5-26adv01-v7-us"
++ },
++ {
++ "name": "memory",
++ "exclusive": true,
++ "mandatory": true,
++ "addons": [
++ "ram-32g-ddr5-on-die-ecc-5600-26adv01-v7-us",
++ "ram-64g-ddr5-on-die-ecc-3600-26adv01-v7-us",
++ "ram-128g-ddr5-on-die-ecc-3600-26adv01-v7-us",
++ "ram-192g-ddr5-on-die-ecc-3600-26adv01-v7-us",
++ "ram-256g-ddr5-on-die-ecc-3600-26adv01-v7-us"
++ ],
++ "default": "ram-32g-ddr5-on-die-ecc-5600-26adv01-v7-us"
++ },
++ {
++ "name": "bandwidth",
++ "exclusive": true,
++ "mandatory": true,
++ "addons": [
++ "bandwidth-4000-adv-gen4-us",
++ "bandwidth-5000-adv-gen4-us",
++ "bandwidth-3000-adv-gen4-us"
++ ],
++ "default": "bandwidth-3000-adv-gen4-us"
++ }
++ ],
++ "product": "26adv01",
++ "pricingType": "rental",
++ "consumptionConfiguration": null,
++ "pricings": [
++ {
++ "phase": 0,
++ "capacities": [
++ "installation"
++ ],
++ "commitment": 0,
++ "description": "rental (only applicable for 1 time)",
++ "interval": 0,
++ "intervalUnit": "none",
++ "quantity": {
++ "min": 1,
++ "max": 10
++ },
++ "repeat": {
++ "min": 1,
++ "max": 1
++ },
++ "price": 20400000000,
++ "formattedPrice": "$204.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ },
++ {
++ "phase": 1,
++ "capacities": [
++ "renew"
++ ],
++ "commitment": 0,
++ "description": "rental for 1 month",
++ "interval": 1,
++ "intervalUnit": "month",
++ "quantity": {
++ "min": 1,
++ "max": 10
++ },
++ "repeat": {
++ "min": 1,
++ "max": null
++ },
++ "price": 20400000000,
++ "formattedPrice": "$204.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ }
++ ],
++ "configurations": [
++ {
++ "name": "dedicated_os",
++ "isCustom": false,
++ "isMandatory": true,
++ "values": [
++ "none_64.en"
++ ]
++ },
++ {
++ "name": "region",
++ "isCustom": false,
++ "isMandatory": true,
++ "values": [
++ "united_states"
++ ]
++ },
++ {
++ "name": "dedicated_datacenter",
++ "isCustom": false,
++ "isMandatory": true,
++ "values": [
++ "hil",
++ "vin"
++ ]
++ },
++ {
++ "name": "enable-backup",
++ "isCustom": false,
++ "isMandatory": false,
++ "values": [
++ "true",
++ "false"
++ ]
++ }
++ ],
++ "family": null,
++ "blobs": {
++ "commercial": {
++ "features": [
++ {
++ "name": "release-year",
++ "value": "2026"
++ },
++ {
++ "name": "baremetal-server-usecases",
++ "value": "hosting,bdd"
++ },
++ {
++ "name": "alternative-cpu",
++ "value": "24adv01-v3-us"
++ },
++ {
++ "name": "last-generation",
++ "value": "true"
++ }
++ ],
++ "name": "ADVANCE-1"
++ }
++ }
++ }
++ ],
++ "products": [
++ {
++ "name": "bandwidth-500",
++ "description": "500 Mbps unmetered public bandwidth",
++ "blobs": {
++ "technical": {
++ "bandwidth": {
++ "burst": 0,
++ "level": 500,
++ "limit": 0,
++ "guaranteed": false
++ }
++ }
++ },
++ "configurations": []
++ },
++ {
++ "name": "ram-48g-ecc-2400",
++ "description": "48GB DDR4 ECC 2400MHz",
++ "blobs": {
++ "technical": {
++ "memory": {
++ "ecc": true,
++ "size": 48,
++ "ramType": "DDR4",
++ "frequency": 2400
++ }
++ }
++ },
++ "configurations": []
++ },
++ {
++ "name": "softraid-12x4000sas",
++ "description": "12x HDD SAS 4TB Datacenter Class Soft RAID",
++ "blobs": {
++ "technical": {
++ "storage": {
++ "raid": "Soft RAID",
++ "disks": [
++ {
++ "specs": "3.5in",
++ "usage": "data",
++ "number": 12,
++ "capacity": 4000,
++ "interface": "SAS",
++ "technology": "HDD"
++ }
++ ],
++ "hotSwap": false,
++ "raidDetails": {
++ "type": "Soft RAID"
++ }
++ }
++ }
++ },
++ "configurations": []
++ },
++ {
++ "name": "ram-256g-ecc-1600",
++ "description": "256GB DDR3 ECC 1600MHz",
++ "blobs": {
++ "technical": {
++ "memory": {
++ "ecc": true,
++ "size": 256,
++ "ramType": "DDR3",
++ "frequency": 1600
++ }
++ }
++ },
++ "configurations": []
++ },
++ {
++ "name": "softraid-2x240ssd",
++ "description": "2x SSD SATA 240GB Datacenter Class Soft RAID",
++ "blobs": {
++ "technical": {
++ "storage": {
++ "raid": "Soft RAID",
++ "disks": [
++ {
++ "specs": "2.5in 7mm",
++ "usage": "data",
++ "number": 2,
++ "capacity": 240,
++ "interface": "SATA",
++ "technology": "SSD"
++ }
++ ],
++ "hotSwap": false,
++ "raidDetails": {
++ "type": "Soft RAID"
++ }
++ }
++ }
++ },
++ "configurations": []
++ },
++ {
++ "name": "softraid-2x960nvme",
++ "description": "2x SSD NVMe 960GB Datacenter Class Soft RAID",
++ "blobs": {
++ "technical": {
++ "storage": {
++ "raid": "Soft RAID",
++ "disks": [
++ {
++ "specs": "M.2 80",
++ "usage": "data",
++ "number": 2,
++ "capacity": 960,
++ "interface": "NVMe",
++ "technology": "SSD"
++ }
++ ],
++ "hotSwap": false,
++ "raidDetails": {
++ "type": "Soft RAID"
++ }
++ }
++ }
++ },
++ "configurations": []
++ },
++ {
++ "name": "bandwidth-1000-burst-3gbps",
++ "description": "1Gbps unmetered public bandwidth - 3Gbps burst",
++ "blobs": {
++ "technical": {
++ "bandwidth": {
++ "burst": 3000,
++ "level": 1000,
++ "limit": 0,
++ "guaranteed": false
++ }
++ }
++ },
++ "configurations": []
++ },
++ {
++ "name": "softraid-2x6000sas",
++ "description": "2x HDD SAS 6TB Datacenter Class Soft RAID",
++ "blobs": {
++ "technical": {
++ "storage": {
++ "raid": "Soft RAID",
++ "disks": [
++ {
++ "specs": "3.5in",
++ "number": 2,
++ "capacity": 6000,
++ "interface": "SAS",
++ "technology": "HDD"
++ }
++ ]
++ }
++ }
++ },
++ "configurations": []
++ },
++ {
++ "name": "ram-192g-ecc-2666",
++ "description": "RAM 192GB DDR4 ECC 2666MHz",
++ "blobs": {
++ "technical": {
++ "memory": {
++ "ecc": true,
++ "size": 192,
++ "ramType": "DDR4",
++ "frequency": 2666
++ }
++ }
++ },
++ "configurations": []
++ },
++ {
++ "name": "softraid-6x3840nvme",
++ "description": "6x SSD NVMe 3.84TB Enterprise Class Soft RAID",
++ "blobs": {
++ "technical": {
++ "storage": {
++ "raid": "Soft RAID",
++ "disks": [
++ {
++ "specs": "M.2 80",
++ "usage": "data",
++ "number": 6,
++ "capacity": 3840,
++ "interface": "NVMe",
++ "technology": "SSD"
++ }
++ ],
++ "hotSwap": true,
++ "raidDetails": {
++ "type": "Soft RAID"
++ }
++ }
++ }
++ },
++ "configurations": []
++ },
++ {
++ "name": "20bv01",
++ "description": "2x Intel Xeon E5-2660",
++ "blobs": {
++ "technical": {
++ "server": {
++ "cpu": {
++ "boost": 3,
++ "brand": "Intel",
++ "cores": 8,
++ "model": "Xeon E5-2660",
++ "score": 15000,
++ "number": 2,
++ "threads": 16,
++ "frequency": 2.2
++ },
++ "frame": {
++ "size": "1U",
++ "model": "OVH",
++ "dualPowerSupply": false
++ },
++ "range": "best-value",
++ "services": {
++ "sla": 99,
++ "antiddos": "standard"
++ }
++ }
++ }
++ },
++ "configurations": [
++ {
++ "name": "extra_reservation",
++ "isCustom": true,
++ "isMandatory": false,
++ "values": null
++ }
++ ]
++ },
++ {
++ "name": "20hg03-us",
++ "description": "2x Intel Xeon Gold 6132",
++ "blobs": {
++ "technical": {
++ "server": {
++ "cpu": {
++ "boost": 3.7,
++ "brand": "Intel",
++ "cores": 28,
++ "model": "2x Xeon Gold 6132",
++ "score": 16000,
++ "threads": 56,
++ "frequency": 2.6
++ },
++ "frame": {
++ "size": "1U",
++ "model": "Intel"
++ },
++ "range": "hg"
++ }
++ }
++ },
++ "configurations": []
++ },
++ {
++ "name": "22bf06",
++ "description": "Intel Xeon Silver 4110",
++ "blobs": {
++ "technical": {
++ "server": {
++ "cpu": {
++ "boost": 3,
++ "brand": "Intel",
++ "cores": 8,
++ "model": "Xeon Silver 4110",
++ "score": 10232,
++ "number": 1,
++ "threads": 16,
++ "frequency": 2.1
++ },
++ "frame": {
++ "size": "1U",
++ "model": "OVH",
++ "dualPowerSupply": false
++ },
++ "range": "rise",
++ "services": {
++ "sla": 99,
++ "antiddos": "standard"
++ }
++ }
++ }
++ },
++ "configurations": [
++ {
++ "name": "extra_reservation",
++ "isCustom": true,
++ "isMandatory": false,
++ "values": null
++ }
++ ]
++ },
++ {
++ "name": "bandwidth-1000",
++ "description": "1Gbps unmetered and guaranteed public bandwidth",
++ "blobs": {
++ "technical": {
++ "bandwidth": {
++ "burst": 0,
++ "level": 1000,
++ "limit": 0,
++ "guaranteed": true
++ }
++ }
++ },
++ "configurations": []
++ },
++ {
++ "name": "bandwidth-3000",
++ "description": "3Gbps unmetered public bandwidth",
++ "blobs": {
++ "technical": {
++ "bandwidth": {
++ "burst": 0,
++ "level": 3000,
++ "limit": 0,
++ "guaranteed": true
++ }
++ }
++ },
++ "configurations": []
++ },
++ {
++ "name": "bandwidth-5000",
++ "description": "5Gbps unmetered and guaranteed public bandwidth",
++ "blobs": {
++ "technical": {
++ "bandwidth": {
++ "burst": 0,
++ "level": 5000,
++ "limit": 0,
++ "guaranteed": true
++ }
++ }
++ },
++ "configurations": []
++ },
++ {
++ "name": "ram-64g-on-die-ecc-5600",
++ "description": "64GB DDR5 On-Die ECC 5600MHz",
++ "blobs": {
++ "technical": {
++ "memory": {
++ "ecc": false,
++ "size": 64,
++ "ramType": "DDR5",
++ "frequency": 5600
++ }
++ }
++ },
++ "configurations": []
++ },
++ {
++ "name": "bandwidth-10000",
++ "description": "10Gbps unmetered and guaranteed public bandwidth",
++ "blobs": {
++ "technical": {
++ "bandwidth": {
++ "burst": 0,
++ "level": 10000,
++ "limit": 0,
++ "guaranteed": true
++ }
++ }
++ },
++ "configurations": []
++ },
++ {
++ "name": "noraid-0",
++ "description": "No storage drive",
++ "blobs": {
++ "technical": {
++ "storage": {
++ "raid": "none",
++ "disks": [
++ {
++ "specs": "M.2 80",
++ "usage": "data",
++ "number": 0,
++ "capacity": 0,
++ "interface": "NVMe",
++ "technology": "SSD"
++ }
++ ],
++ "hotSwap": false,
++ "raidDetails": {
++ "type": "none"
++ }
++ }
++ }
++ },
++ "configurations": []
++ },
++ {
++ "name": "ram-128g-ecc-4800",
++ "description": "128GB DDR5 ECC 4800MHz",
++ "blobs": {
++ "technical": {
++ "memory": {
++ "ecc": true,
++ "size": 128,
++ "ramType": "DDR5",
++ "frequency": 4800
++ }
++ }
++ },
++ "configurations": []
++ },
++ {
++ "name": "ram-256g-ecc-4800",
++ "description": "256GB DDR5 ECC 4800MHz",
++ "blobs": {
++ "technical": {
++ "memory": {
++ "ecc": true,
++ "size": 256,
++ "ramType": "DDR5",
++ "frequency": 4800
++ }
++ }
++ },
++ "configurations": []
++ },
++ {
++ "name": "ram-32g-ddr5-on-die-ecc-5600",
++ "description": "32GB DDR5 On-Die ECC 5600MHz",
++ "blobs": {
++ "technical": {
++ "memory": {
++ "ecc": false,
++ "size": 32,
++ "ramType": "DDR5",
++ "frequency": 5600
++ }
++ }
++ },
++ "configurations": []
++ },
++ {
++ "name": "softraid-2x960nvme-pcie-gen5",
++ "description": "2x SSD NVMe 960GB Datacenter Class Soft RAID",
++ "blobs": {
++ "technical": {
++ "storage": {
++ "raid": "Soft RAID",
++ "disks": [
++ {
++ "specs": "M.2 80",
++ "usage": "data",
++ "number": 2,
++ "capacity": 960,
++ "interface": "NVMe",
++ "technology": "SSD",
++ "physicalInterface": "pcie-gen5"
++ }
++ ],
++ "hotSwap": false,
++ "raidDetails": {
++ "type": "Soft RAID"
++ }
++ }
++ }
++ },
++ "configurations": []
++ },
++ {
++ "name": "ram-32g-on-die-ecc-5200",
++ "description": "32GB DDR5 On-Die ECC 5200Hz",
++ "blobs": {
++ "technical": {
++ "memory": {
++ "ecc": false,
++ "size": 32,
++ "ramType": "DDR5",
++ "frequency": 5200
++ }
++ }
++ },
++ "configurations": []
++ },
++ {
++ "name": "softraid-2x960nvme-pcie-gen4",
++ "description": "2x SSD NVMe 960GB Enterprise Class Soft RAID",
++ "blobs": {
++ "technical": {
++ "storage": {
++ "raid": "Soft RAID",
++ "disks": [
++ {
++ "specs": "M.2 80",
++ "usage": "data",
++ "number": 2,
++ "capacity": 960,
++ "interface": "NVMe",
++ "technology": "SSD",
++ "physicalInterface": "pcie-gen4"
++ }
++ ],
++ "hotSwap": false,
++ "raidDetails": {
++ "type": "Soft RAID"
++ }
++ }
++ }
++ },
++ "configurations": []
++ },
++ {
++ "name": "24adv01",
++ "description": "AMD EPYC 4244P",
++ "blobs": {
++ "technical": {
++ "server": {
++ "cpu": {
++ "boost": 5.1,
++ "brand": "AMD",
++ "cores": 6,
++ "model": "EPYC 4244P",
++ "score": 27900,
++ "number": 1,
++ "threads": 12,
++ "frequency": 3.8
++ },
++ "frame": {
++ "size": "0.5U",
++ "model": "OVH",
++ "dualPowerSupply": false
++ },
++ "range": "advance",
++ "services": {
++ "sla": 99.95,
++ "antiddos": "standard"
++ }
++ }
++ }
++ },
++ "configurations": [
++ {
++ "name": "extra_reservation",
++ "isCustom": true,
++ "isMandatory": false,
++ "values": null
++ }
++ ]
++ },
++ {
++ "name": "26game02",
++ "description": "AMD RYZEN 9 9950X3D",
++ "blobs": {
++ "technical": {
++ "server": {
++ "cpu": {
++ "boost": 5.7,
++ "brand": "AMD",
++ "cores": 16,
++ "model": "RYZEN 9 9950X3D",
++ "score": 69700,
++ "number": 1,
++ "threads": 32,
++ "frequency": 4.3
++ },
++ "frame": {
++ "size": "0.5U",
++ "model": "OVH",
++ "dualPowerSupply": false
++ },
++ "range": "game",
++ "services": {
++ "sla": 99.95,
++ "antiddos": "standard"
++ }
++ }
++ }
++ },
++ "configurations": [
++ {
++ "name": "extra_reservation",
++ "isCustom": true,
++ "isMandatory": false,
++ "values": null
++ }
++ ]
++ },
++ {
++ "name": "24hci-a1",
++ "description": "2x AMD Epyc 9254",
++ "blobs": {
++ "technical": {
++ "server": {
++ "cpu": {
++ "boost": 3.9,
++ "brand": "AMD",
++ "cores": 24,
++ "model": "Epyc 9254",
++ "score": 100000,
++ "number": 2,
++ "threads": 48,
++ "frequency": 2.9
++ },
++ "frame": {
++ "size": "1U",
++ "model": "OVH",
++ "dualPowerSupply": true
++ },
++ "range": "hgr",
++ "network": {
++ "capacity": 25,
++ "interfaces": 4
++ },
++ "services": {
++ "sla": 99.99,
++ "antiddos": "standard"
++ }
++ }
++ }
++ },
++ "configurations": [
++ {
++ "name": "extra_reservation",
++ "isCustom": true,
++ "isMandatory": false,
++ "values": null
++ }
++ ]
++ },
++ {
++ "name": "23scaleamd01",
++ "description": "AMD EPYC GENOA 9124",
++ "blobs": {
++ "technical": {
++ "server": {
++ "cpu": {
++ "boost": 3.6,
++ "brand": "AMD",
++ "cores": 16,
++ "model": "EPYC GENOA 9124",
++ "score": 45900,
++ "number": 1,
++ "threads": 32,
++ "frequency": 3
++ },
++ "frame": {
++ "size": "1U",
++ "model": "OVH",
++ "dualPowerSupply": true
++ },
++ "range": "scale",
++ "services": {
++ "sla": 99.99,
++ "antiddos": "standard"
++ }
++ }
++ }
++ },
++ "configurations": [
++ {
++ "name": "extra_reservation",
++ "isCustom": true,
++ "isMandatory": false,
++ "values": null
++ }
++ ]
++ },
++ {
++ "name": "26adv01",
++ "description": "AMD EPYC 4245P",
++ "blobs": {
++ "technical": {
++ "server": {
++ "cpu": {
++ "boost": 5.4,
++ "brand": "AMD",
++ "cores": 6,
++ "model": "EPYC 4245P",
++ "score": 31075,
++ "number": 1,
++ "threads": 12,
++ "frequency": 3.9
++ },
++ "frame": {
++ "size": "0.5U",
++ "model": "OVH",
++ "dualPowerSupply": false
++ },
++ "range": "advance",
++ "services": {
++ "sla": 99.95,
++ "antiddos": "standard"
++ }
++ }
++ }
++ },
++ "configurations": [
++ {
++ "name": "extra_reservation",
++ "isCustom": true,
++ "isMandatory": false,
++ "values": null
++ }
++ ]
++ }
++ ],
++ "addons": [
++ {
++ "planCode": "bandwidth-500-included-bf-us",
++ "invoiceName": "Unlimited traffic - 500Mbps bandwidth",
++ "addonFamilies": [],
++ "product": "bandwidth-500",
++ "pricingType": "rental",
++ "consumptionConfiguration": null,
++ "pricings": [
++ {
++ "phase": 0,
++ "capacities": [
++ "installation"
++ ],
++ "commitment": 0,
++ "description": "rental (only applicable for 1 time)",
++ "interval": 0,
++ "intervalUnit": "none",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": 1
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ },
++ {
++ "phase": 1,
++ "capacities": [
++ "renew"
++ ],
++ "commitment": 0,
++ "description": "rental for 1 month",
++ "interval": 1,
++ "intervalUnit": "month",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": null
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ }
++ ],
++ "configurations": [],
++ "family": null,
++ "blobs": null
++ },
++ {
++ "planCode": "ram-48g-bf6-us",
++ "invoiceName": "48GB DDR4 ECC 2400MHz",
++ "addonFamilies": [],
++ "product": "ram-48g-ecc-2400",
++ "pricingType": "rental",
++ "consumptionConfiguration": null,
++ "pricings": [
++ {
++ "phase": 0,
++ "capacities": [
++ "installation"
++ ],
++ "commitment": 0,
++ "description": "rental (only applicable for 1 time)",
++ "interval": 0,
++ "intervalUnit": "none",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": 1
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ },
++ {
++ "phase": 1,
++ "capacities": [
++ "renew"
++ ],
++ "commitment": 0,
++ "description": "rental for 1 month",
++ "interval": 1,
++ "intervalUnit": "month",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": null
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ }
++ ],
++ "configurations": [],
++ "family": null,
++ "blobs": null
++ },
++ {
++ "planCode": "softraid-12x4000sas-bf6-us",
++ "invoiceName": "12x HDD SAS 4TB Datacenter Class Soft RAID",
++ "addonFamilies": [],
++ "product": "softraid-12x4000sas",
++ "pricingType": "rental",
++ "consumptionConfiguration": null,
++ "pricings": [
++ {
++ "phase": 0,
++ "capacities": [
++ "installation"
++ ],
++ "commitment": 0,
++ "description": "rental (only applicable for 1 time)",
++ "interval": 0,
++ "intervalUnit": "none",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": 1
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ },
++ {
++ "phase": 1,
++ "capacities": [
++ "renew"
++ ],
++ "commitment": 0,
++ "description": "rental for 1 month",
++ "interval": 1,
++ "intervalUnit": "month",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": null
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ }
++ ],
++ "configurations": [],
++ "family": null,
++ "blobs": null
++ },
++ {
++ "planCode": "bandwidth-500-bv-us",
++ "invoiceName": "500Mbps unmetered public bandwidth",
++ "addonFamilies": [],
++ "product": "bandwidth-500",
++ "pricingType": "rental",
++ "consumptionConfiguration": null,
++ "pricings": [
++ {
++ "phase": 0,
++ "capacities": [
++ "installation"
++ ],
++ "commitment": 0,
++ "description": "rental (only applicable for 1 time)",
++ "interval": 0,
++ "intervalUnit": "none",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": 1
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ },
++ {
++ "phase": 0,
++ "capacities": [
++ "upgrade"
++ ],
++ "commitment": 0,
++ "description": "rental (only applicable for 1 time)",
++ "interval": 0,
++ "intervalUnit": "none",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": 1
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ },
++ {
++ "phase": 1,
++ "capacities": [
++ "renew"
++ ],
++ "commitment": 0,
++ "description": "rental for 1 month",
++ "interval": 1,
++ "intervalUnit": "month",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": null
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ }
++ ],
++ "configurations": [],
++ "family": "public-bandwidth",
++ "blobs": null
++ },
++ {
++ "planCode": "ram-256g-bv-us",
++ "invoiceName": "256GB DDR3 ECC 1600MHz",
++ "addonFamilies": [],
++ "product": "ram-256g-ecc-1600",
++ "pricingType": "rental",
++ "consumptionConfiguration": null,
++ "pricings": [
++ {
++ "phase": 0,
++ "capacities": [
++ "installation"
++ ],
++ "commitment": 0,
++ "description": "rental (only applicable for 1 time)",
++ "interval": 0,
++ "intervalUnit": "none",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": 1
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ },
++ {
++ "phase": 1,
++ "capacities": [
++ "renew"
++ ],
++ "commitment": 0,
++ "description": "rental for 1 month",
++ "interval": 1,
++ "intervalUnit": "month",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": null
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ }
++ ],
++ "configurations": [],
++ "family": null,
++ "blobs": null
++ },
++ {
++ "planCode": "softraid-2x240ssd-bv-us",
++ "invoiceName": "2x SSD SATA 240GB Datacenter Class Soft RAID",
++ "addonFamilies": [],
++ "product": "softraid-2x240ssd",
++ "pricingType": "rental",
++ "consumptionConfiguration": null,
++ "pricings": [
++ {
++ "phase": 0,
++ "capacities": [
++ "installation"
++ ],
++ "commitment": 0,
++ "description": "rental (only applicable for 1 time)",
++ "interval": 0,
++ "intervalUnit": "none",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": 1
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ },
++ {
++ "phase": 1,
++ "capacities": [
++ "renew"
++ ],
++ "commitment": 0,
++ "description": "rental for 1 month",
++ "interval": 1,
++ "intervalUnit": "month",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": null
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ }
++ ],
++ "configurations": [],
++ "family": null,
++ "blobs": null
++ },
++ {
++ "planCode": "bandwidth-1000-burst-3gbps-hg-us",
++ "invoiceName": "1Gbps unmetered public bandwidth - 3Gbps burst",
++ "addonFamilies": [],
++ "product": "bandwidth-1000-burst-3gbps",
++ "pricingType": "rental",
++ "consumptionConfiguration": null,
++ "pricings": [
++ {
++ "phase": 0,
++ "capacities": [
++ "installation"
++ ],
++ "commitment": 0,
++ "description": "rental (only applicable for 1 time)",
++ "interval": 0,
++ "intervalUnit": "none",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": 1
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ },
++ {
++ "phase": 0,
++ "capacities": [
++ "upgrade"
++ ],
++ "commitment": 0,
++ "description": "rental (only applicable for 1 time)",
++ "interval": 0,
++ "intervalUnit": "none",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": 1
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ },
++ {
++ "phase": 1,
++ "capacities": [
++ "renew"
++ ],
++ "commitment": 0,
++ "description": "rental for 1 month",
++ "interval": 1,
++ "intervalUnit": "month",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": null
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ }
++ ],
++ "configurations": [],
++ "family": "public-bandwidth",
++ "blobs": null
++ },
++ {
++ "planCode": "softraid-2x6000sas-hg-us",
++ "invoiceName": "2x HDD SAS 6TB Datacenter Class Soft RAID",
++ "addonFamilies": [],
++ "product": "softraid-2x6000sas",
++ "pricingType": "rental",
++ "consumptionConfiguration": null,
++ "pricings": [
++ {
++ "phase": 0,
++ "capacities": [
++ "installation"
++ ],
++ "commitment": 0,
++ "description": "rental (only applicable for 1 time)",
++ "interval": 0,
++ "intervalUnit": "none",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": 1
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ },
++ {
++ "phase": 1,
++ "capacities": [
++ "renew"
++ ],
++ "commitment": 0,
++ "description": "rental for 1 month",
++ "interval": 1,
++ "intervalUnit": "month",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": null
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ }
++ ],
++ "configurations": [],
++ "family": null,
++ "blobs": null
++ },
++ {
++ "planCode": "ram-192g-hg3-us",
++ "invoiceName": "192GB DDR4 ECC 2666MHz",
++ "addonFamilies": [],
++ "product": "ram-192g-ecc-2666",
++ "pricingType": "rental",
++ "consumptionConfiguration": null,
++ "pricings": [
++ {
++ "phase": 0,
++ "capacities": [
++ "installation"
++ ],
++ "commitment": 0,
++ "description": "rental (only applicable for 1 time)",
++ "interval": 0,
++ "intervalUnit": "none",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": 1
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ },
++ {
++ "phase": 1,
++ "capacities": [
++ "renew"
++ ],
++ "commitment": 0,
++ "description": "rental for 1 month",
++ "interval": 1,
++ "intervalUnit": "month",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": null
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ }
++ ],
++ "configurations": [],
++ "family": null,
++ "blobs": null
++ },
++ {
++ "planCode": "ram-64g-on-die-ecc-5600-26game02-v4-us",
++ "invoiceName": "64GB DDR5 On-Die ECC 5600MHz",
++ "addonFamilies": [],
++ "product": "ram-64g-on-die-ecc-5600",
++ "pricingType": "rental",
++ "consumptionConfiguration": null,
++ "pricings": [
++ {
++ "phase": 0,
++ "capacities": [
++ "installation"
++ ],
++ "commitment": 0,
++ "description": "rental (only applicable for 1 time)",
++ "interval": 0,
++ "intervalUnit": "none",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": 1
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ },
++ {
++ "phase": 1,
++ "capacities": [
++ "renew"
++ ],
++ "commitment": 0,
++ "description": "rental for 1 month",
++ "interval": 1,
++ "intervalUnit": "month",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": null
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ }
++ ],
++ "configurations": [],
++ "family": null,
++ "blobs": null
++ },
++ {
++ "planCode": "softraid-2x960nvme-26game02-v4-us",
++ "invoiceName": "2x SSD NVMe 960GB Enterprise Class Soft RAID",
++ "addonFamilies": [],
++ "product": "softraid-2x960nvme",
++ "pricingType": "rental",
++ "consumptionConfiguration": null,
++ "pricings": [
++ {
++ "phase": 0,
++ "capacities": [
++ "installation"
++ ],
++ "commitment": 0,
++ "description": "rental (only applicable for 1 time)",
++ "interval": 0,
++ "intervalUnit": "none",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": 1
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ },
++ {
++ "phase": 1,
++ "capacities": [
++ "renew"
++ ],
++ "commitment": 0,
++ "description": "rental for 1 month",
++ "interval": 1,
++ "intervalUnit": "month",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": null
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ }
++ ],
++ "configurations": [],
++ "family": null,
++ "blobs": null
++ },
++ {
++ "planCode": "bandwidth-3000-adv-gen3-us",
++ "invoiceName": "3Gbps unmetered and guaranteed public bandwidth",
++ "addonFamilies": [],
++ "product": "bandwidth-3000",
++ "pricingType": "rental",
++ "consumptionConfiguration": null,
++ "pricings": [
++ {
++ "phase": 0,
++ "capacities": [
++ "installation"
++ ],
++ "commitment": 0,
++ "description": "rental (only applicable for 1 time)",
++ "interval": 0,
++ "intervalUnit": "none",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": 1
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ },
++ {
++ "phase": 0,
++ "capacities": [
++ "upgrade"
++ ],
++ "commitment": 0,
++ "description": "rental (only applicable for 1 time)",
++ "interval": 0,
++ "intervalUnit": "none",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": 1
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ },
++ {
++ "phase": 1,
++ "capacities": [
++ "renew"
++ ],
++ "commitment": 0,
++ "description": "rental for 1 month",
++ "interval": 1,
++ "intervalUnit": "month",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": null
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ }
++ ],
++ "configurations": [],
++ "family": "public-bandwidth",
++ "blobs": null
++ },
++ {
++ "planCode": "bandwidth-1000-game-gen4-us",
++ "invoiceName": "1Gbps unmetered public bandwidth",
++ "addonFamilies": [],
++ "product": "bandwidth-1000",
++ "pricingType": "rental",
++ "consumptionConfiguration": null,
++ "pricings": [
++ {
++ "phase": 0,
++ "capacities": [
++ "installation"
++ ],
++ "commitment": 0,
++ "description": "rental (only applicable for 1 time)",
++ "interval": 0,
++ "intervalUnit": "none",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": 1
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ },
++ {
++ "phase": 0,
++ "capacities": [
++ "upgrade"
++ ],
++ "commitment": 0,
++ "description": "rental (only applicable for 1 time)",
++ "interval": 0,
++ "intervalUnit": "none",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": 1
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ },
++ {
++ "phase": 1,
++ "capacities": [
++ "renew"
++ ],
++ "commitment": 0,
++ "description": "rental for 1 month",
++ "interval": 1,
++ "intervalUnit": "month",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": null
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ }
++ ],
++ "configurations": [],
++ "family": "public-bandwidth",
++ "blobs": null
++ },
++ {
++ "planCode": "bandwidth-10000-hgr-gen2-us",
++ "invoiceName": "10Gbps guaranteed unmetered public bandwidth",
++ "addonFamilies": [],
++ "product": "bandwidth-10000",
++ "pricingType": "rental",
++ "consumptionConfiguration": null,
++ "pricings": [
++ {
++ "phase": 0,
++ "capacities": [
++ "installation"
++ ],
++ "commitment": 0,
++ "description": "rental (only applicable for 1 time)",
++ "interval": 0,
++ "intervalUnit": "none",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": 1
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ },
++ {
++ "phase": 0,
++ "capacities": [
++ "upgrade"
++ ],
++ "commitment": 0,
++ "description": "rental (only applicable for 1 time)",
++ "interval": 0,
++ "intervalUnit": "none",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": 1
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ },
++ {
++ "phase": 1,
++ "capacities": [
++ "renew"
++ ],
++ "commitment": 0,
++ "description": "rental for 1 month",
++ "interval": 1,
++ "intervalUnit": "month",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": null
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ }
++ ],
++ "configurations": [],
++ "family": "public-bandwidth",
++ "blobs": null
++ },
++ {
++ "planCode": "bandwidth-5000-scale-gen2-us",
++ "invoiceName": "5Gbps guaranteed unmetered public bandwidth",
++ "addonFamilies": [],
++ "product": "bandwidth-5000",
++ "pricingType": "rental",
++ "consumptionConfiguration": null,
++ "pricings": [
++ {
++ "phase": 0,
++ "capacities": [
++ "installation"
++ ],
++ "commitment": 0,
++ "description": "rental (only applicable for 1 time)",
++ "interval": 0,
++ "intervalUnit": "none",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": 1
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ },
++ {
++ "phase": 0,
++ "capacities": [
++ "upgrade"
++ ],
++ "commitment": 0,
++ "description": "rental (only applicable for 1 time)",
++ "interval": 0,
++ "intervalUnit": "none",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": 1
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ },
++ {
++ "phase": 1,
++ "capacities": [
++ "renew"
++ ],
++ "commitment": 0,
++ "description": "rental for 1 month",
++ "interval": 1,
++ "intervalUnit": "month",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": null
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ }
++ ],
++ "configurations": [],
++ "family": "public-bandwidth",
++ "blobs": null
++ },
++ {
++ "planCode": "noraid-0-23scaleamd01-v3-us",
++ "invoiceName": "No storage drive",
++ "addonFamilies": [],
++ "product": "noraid-0",
++ "pricingType": "rental",
++ "consumptionConfiguration": null,
++ "pricings": [
++ {
++ "phase": 0,
++ "capacities": [
++ "installation"
++ ],
++ "commitment": 0,
++ "description": "rental (only applicable for 1 time)",
++ "interval": 0,
++ "intervalUnit": "none",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": 1
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ },
++ {
++ "phase": 0,
++ "capacities": [
++ "upgrade"
++ ],
++ "commitment": 0,
++ "description": "rental (only applicable for 1 time)",
++ "interval": 0,
++ "intervalUnit": "none",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": 1
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ },
++ {
++ "phase": 1,
++ "capacities": [
++ "renew"
++ ],
++ "commitment": 0,
++ "description": "rental for 1 month",
++ "interval": 1,
++ "intervalUnit": "month",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": null
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ }
++ ],
++ "configurations": [],
++ "family": "storage",
++ "blobs": null
++ },
++ {
++ "planCode": "ram-128g-ecc-4800-23scaleamd01-v3-us",
++ "invoiceName": "128GB DDR5 ECC 4800MHz",
++ "addonFamilies": [],
++ "product": "ram-128g-ecc-4800",
++ "pricingType": "rental",
++ "consumptionConfiguration": null,
++ "pricings": [
++ {
++ "phase": 0,
++ "capacities": [
++ "installation"
++ ],
++ "commitment": 0,
++ "description": "rental (only applicable for 1 time)",
++ "interval": 0,
++ "intervalUnit": "none",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": 1
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ },
++ {
++ "phase": 0,
++ "capacities": [
++ "upgrade"
++ ],
++ "commitment": 0,
++ "description": "rental (only applicable for 1 time)",
++ "interval": 0,
++ "intervalUnit": "none",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": 1
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ },
++ {
++ "phase": 1,
++ "capacities": [
++ "renew"
++ ],
++ "commitment": 0,
++ "description": "rental for 1 month",
++ "interval": 1,
++ "intervalUnit": "month",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": null
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ }
++ ],
++ "configurations": [],
++ "family": "memory",
++ "blobs": null
++ },
++ {
++ "planCode": "ram-256g-ecc-4800-24hci-a1-v2-us",
++ "invoiceName": "256GB DDR5 ECC 4800MHz",
++ "addonFamilies": [],
++ "product": "ram-256g-ecc-4800",
++ "pricingType": "rental",
++ "consumptionConfiguration": null,
++ "pricings": [
++ {
++ "phase": 0,
++ "capacities": [
++ "installation"
++ ],
++ "commitment": 0,
++ "description": "rental (only applicable for 1 time)",
++ "interval": 0,
++ "intervalUnit": "none",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": 1
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ },
++ {
++ "phase": 0,
++ "capacities": [
++ "upgrade"
++ ],
++ "commitment": 0,
++ "description": "rental (only applicable for 1 time)",
++ "interval": 0,
++ "intervalUnit": "none",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": 1
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ },
++ {
++ "phase": 1,
++ "capacities": [
++ "renew"
++ ],
++ "commitment": 0,
++ "description": "rental for 1 month",
++ "interval": 1,
++ "intervalUnit": "month",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": null
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ }
++ ],
++ "configurations": [],
++ "family": "memory",
++ "blobs": null
++ },
++ {
++ "planCode": "softraid-6x3840nvme-24hci-a1-v2-us",
++ "invoiceName": "6x SSD NVMe 3.84TB Enterprise Class Soft RAID",
++ "addonFamilies": [],
++ "product": "softraid-6x3840nvme",
++ "pricingType": "rental",
++ "consumptionConfiguration": null,
++ "pricings": [
++ {
++ "phase": 0,
++ "capacities": [
++ "installation"
++ ],
++ "commitment": 0,
++ "description": "rental (only applicable for 1 time)",
++ "interval": 0,
++ "intervalUnit": "none",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": 1
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ },
++ {
++ "phase": 0,
++ "capacities": [
++ "upgrade"
++ ],
++ "commitment": 0,
++ "description": "rental (only applicable for 1 time)",
++ "interval": 0,
++ "intervalUnit": "none",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": 1
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ },
++ {
++ "phase": 1,
++ "capacities": [
++ "renew"
++ ],
++ "commitment": 0,
++ "description": "rental for 1 month",
++ "interval": 1,
++ "intervalUnit": "month",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": null
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ }
++ ],
++ "configurations": [],
++ "family": "storage",
++ "blobs": null
++ },
++ {
++ "planCode": "ram-32g-ddr5-on-die-ecc-5600-26adv01-v7-us",
++ "invoiceName": "32GB DDR5 On-Die ECC 5600MHz",
++ "addonFamilies": [],
++ "product": "ram-32g-ddr5-on-die-ecc-5600",
++ "pricingType": "rental",
++ "consumptionConfiguration": null,
++ "pricings": [
++ {
++ "phase": 0,
++ "capacities": [
++ "installation"
++ ],
++ "commitment": 0,
++ "description": "rental (only applicable for 1 time)",
++ "interval": 0,
++ "intervalUnit": "none",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": 1
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ },
++ {
++ "phase": 0,
++ "capacities": [
++ "upgrade"
++ ],
++ "commitment": 0,
++ "description": "rental (only applicable for 1 time)",
++ "interval": 0,
++ "intervalUnit": "none",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": 1
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ },
++ {
++ "phase": 1,
++ "capacities": [
++ "renew"
++ ],
++ "commitment": 0,
++ "description": "rental for 1 month",
++ "interval": 1,
++ "intervalUnit": "month",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": null
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ }
++ ],
++ "configurations": [],
++ "family": "memory",
++ "blobs": null
++ },
++ {
++ "planCode": "softraid-2x960nvme-pcie-gen5-26adv01-v7-us",
++ "invoiceName": "2x SSD NVMe 960GB Datacenter Class Soft RAID",
++ "addonFamilies": [],
++ "product": "softraid-2x960nvme-pcie-gen5",
++ "pricingType": "rental",
++ "consumptionConfiguration": null,
++ "pricings": [
++ {
++ "phase": 0,
++ "capacities": [
++ "installation"
++ ],
++ "commitment": 0,
++ "description": "rental (only applicable for 1 time)",
++ "interval": 0,
++ "intervalUnit": "none",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": 1
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ },
++ {
++ "phase": 0,
++ "capacities": [
++ "upgrade"
++ ],
++ "commitment": 0,
++ "description": "rental (only applicable for 1 time)",
++ "interval": 0,
++ "intervalUnit": "none",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": 1
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ },
++ {
++ "phase": 1,
++ "capacities": [
++ "renew"
++ ],
++ "commitment": 0,
++ "description": "rental for 1 month",
++ "interval": 1,
++ "intervalUnit": "month",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": null
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ }
++ ],
++ "configurations": [],
++ "family": "storage",
++ "blobs": null
++ },
++ {
++ "planCode": "ram-32g-on-die-ecc-5200-24adv01-v3-us",
++ "invoiceName": "32GB DDR5 On-Die ECC 5200MHz",
++ "addonFamilies": [],
++ "product": "ram-32g-on-die-ecc-5200",
++ "pricingType": "rental",
++ "consumptionConfiguration": null,
++ "pricings": [
++ {
++ "phase": 0,
++ "capacities": [
++ "installation"
++ ],
++ "commitment": 0,
++ "description": "rental (only applicable for 1 time)",
++ "interval": 0,
++ "intervalUnit": "none",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": 1
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ },
++ {
++ "phase": 0,
++ "capacities": [
++ "upgrade"
++ ],
++ "commitment": 0,
++ "description": "rental (only applicable for 1 time)",
++ "interval": 0,
++ "intervalUnit": "none",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": 1
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ },
++ {
++ "phase": 1,
++ "capacities": [
++ "renew"
++ ],
++ "commitment": 0,
++ "description": "rental for 1 month",
++ "interval": 1,
++ "intervalUnit": "month",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": null
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ }
++ ],
++ "configurations": [],
++ "family": "memory",
++ "blobs": null
++ },
++ {
++ "planCode": "softraid-2x960nvme-pcie-gen4-24adv01-v3-us",
++ "invoiceName": "2x SSD NVMe 960GB Enterprise Class Soft RAID",
++ "addonFamilies": [],
++ "product": "softraid-2x960nvme-pcie-gen4",
++ "pricingType": "rental",
++ "consumptionConfiguration": null,
++ "pricings": [
++ {
++ "phase": 0,
++ "capacities": [
++ "installation"
++ ],
++ "commitment": 0,
++ "description": "rental (only applicable for 1 time)",
++ "interval": 0,
++ "intervalUnit": "none",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": 1
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ },
++ {
++ "phase": 0,
++ "capacities": [
++ "upgrade"
++ ],
++ "commitment": 0,
++ "description": "rental (only applicable for 1 time)",
++ "interval": 0,
++ "intervalUnit": "none",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": 1
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ },
++ {
++ "phase": 1,
++ "capacities": [
++ "renew"
++ ],
++ "commitment": 0,
++ "description": "rental for 1 month",
++ "interval": 1,
++ "intervalUnit": "month",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": null
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ }
++ ],
++ "configurations": [],
++ "family": "storage",
++ "blobs": null
++ },
++ {
++ "planCode": "bandwidth-3000-adv-gen4-us",
++ "invoiceName": "3Gbps unmetered and guaranteed public bandwidth",
++ "addonFamilies": [],
++ "product": "bandwidth-3000",
++ "pricingType": "rental",
++ "consumptionConfiguration": null,
++ "pricings": [
++ {
++ "phase": 0,
++ "capacities": [
++ "installation"
++ ],
++ "commitment": 0,
++ "description": "rental (only applicable for 1 time)",
++ "interval": 0,
++ "intervalUnit": "none",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": 1
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ },
++ {
++ "phase": 0,
++ "capacities": [
++ "upgrade"
++ ],
++ "commitment": 0,
++ "description": "rental (only applicable for 1 time)",
++ "interval": 0,
++ "intervalUnit": "none",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": 1
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ },
++ {
++ "phase": 1,
++ "capacities": [
++ "renew"
++ ],
++ "commitment": 0,
++ "description": "rental for 1 month",
++ "interval": 1,
++ "intervalUnit": "month",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": null
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ }
++ ],
++ "configurations": [],
++ "family": "public-bandwidth",
++ "blobs": null
++ }
++ ]
++}
\\ No newline at end of file
ddiff --git a/test/fixtures/ovhcloud-eco.json b/test/fixtures/ovhcloud-eco.json
nnew file mode 100644
iindex 0000000..ec1999c
---- /dev/null
++++ b/test/fixtures/ovhcloud-eco.json
@@@ -0,0 +1,2409 @@
++{
++ "catalogId": 3796,
++ "locale": {
++ "currencyCode": "USD",
++ "subsidiary": "US",
++ "taxRate": 0
++ },
++ "plans": [
++ {
++ "planCode": "24risegame012-ca",
++ "invoiceName": "RISE-GAME-1 | AMD Ryzen 5 5600X",
++ "addonFamilies": [
++ {
++ "name": "storage",
++ "exclusive": true,
++ "mandatory": true,
++ "addons": [
++ "softraid-2x512nvme-24risegame-ca"
++ ],
++ "default": "softraid-2x512nvme-24risegame-ca"
++ },
++ {
++ "name": "bandwidth",
++ "exclusive": true,
++ "mandatory": true,
++ "addons": [
++ "bandwidth-1000-rise-game-ca"
++ ],
++ "default": "bandwidth-1000-rise-game-ca"
++ },
++ {
++ "name": "memory",
++ "exclusive": true,
++ "mandatory": true,
++ "addons": [
++ "ram-32g-ecc-2400-24risegame01-ca",
++ "ram-64g-ecc-2400-24risegame01-ca"
++ ],
++ "default": "ram-32g-ecc-2400-24risegame01-ca"
++ }
++ ],
++ "product": "24risegame01",
++ "pricingType": "rental",
++ "consumptionConfiguration": null,
++ "pricings": [
++ {
++ "phase": 0,
++ "capacities": [
++ "installation"
++ ],
++ "commitment": 0,
++ "description": "rental (only applicable for 1 time)",
++ "interval": 0,
++ "intervalUnit": "none",
++ "quantity": {
++ "min": 1,
++ "max": 10
++ },
++ "repeat": {
++ "min": 1,
++ "max": 1
++ },
++ "price": 9000000000,
++ "formattedPrice": "$90.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ },
++ {
++ "phase": 1,
++ "capacities": [
++ "renew"
++ ],
++ "commitment": 0,
++ "description": "rental for 1 month",
++ "interval": 1,
++ "intervalUnit": "month",
++ "quantity": {
++ "min": 1,
++ "max": 10
++ },
++ "repeat": {
++ "min": 1,
++ "max": null
++ },
++ "price": 9000000000,
++ "formattedPrice": "$90.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ }
++ ],
++ "configurations": [
++ {
++ "name": "dedicated_datacenter",
++ "isCustom": false,
++ "isMandatory": false,
++ "values": [
++ "bhs"
++ ]
++ },
++ {
++ "name": "dedicated_os",
++ "isCustom": false,
++ "isMandatory": true,
++ "values": [
++ "none_64.en"
++ ]
++ },
++ {
++ "name": "region",
++ "isCustom": false,
++ "isMandatory": true,
++ "values": [
++ "united_states"
++ ]
++ }
++ ],
++ "family": null,
++ "blobs": {
++ "commercial": {
++ "features": [
++ {
++ "name": "baremetal-server-usecases",
++ "value": "gaming"
++ }
++ ],
++ "name": "RISE-GAME-1"
++ }
++ }
++ },
++ {
++ "planCode": "24risegame012-us",
++ "invoiceName": "RISE-GAME-1 | AMD Ryzen 5 5600X",
++ "addonFamilies": [
++ {
++ "name": "memory",
++ "exclusive": true,
++ "mandatory": true,
++ "addons": [
++ "ram-32g-ecc-2400-24risegame01-us",
++ "ram-64g-ecc-2400-24risegame01-us"
++ ],
++ "default": "ram-32g-ecc-2400-24risegame01-us"
++ },
++ {
++ "name": "storage",
++ "exclusive": true,
++ "mandatory": true,
++ "addons": [
++ "softraid-2x512nvme-24risegame-us"
++ ],
++ "default": "softraid-2x512nvme-24risegame-us"
++ },
++ {
++ "name": "bandwidth",
++ "exclusive": true,
++ "mandatory": true,
++ "addons": [
++ "bandwidth-1000-rise-game-us"
++ ],
++ "default": "bandwidth-1000-rise-game-us"
++ }
++ ],
++ "product": "24risegame01",
++ "pricingType": "rental",
++ "consumptionConfiguration": null,
++ "pricings": [
++ {
++ "phase": 0,
++ "capacities": [
++ "installation"
++ ],
++ "commitment": 0,
++ "description": "rental (only applicable for 1 time)",
++ "interval": 0,
++ "intervalUnit": "none",
++ "quantity": {
++ "min": 1,
++ "max": 10
++ },
++ "repeat": {
++ "min": 1,
++ "max": 1
++ },
++ "price": 9000000000,
++ "formattedPrice": "$90.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ },
++ {
++ "phase": 1,
++ "capacities": [
++ "renew"
++ ],
++ "commitment": 0,
++ "description": "rental for 1 month",
++ "interval": 1,
++ "intervalUnit": "month",
++ "quantity": {
++ "min": 1,
++ "max": 10
++ },
++ "repeat": {
++ "min": 1,
++ "max": null
++ },
++ "price": 9000000000,
++ "formattedPrice": "$90.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ }
++ ],
++ "configurations": [
++ {
++ "name": "dedicated_datacenter",
++ "isCustom": false,
++ "isMandatory": false,
++ "values": [
++ "vin",
++ "hil"
++ ]
++ },
++ {
++ "name": "dedicated_os",
++ "isCustom": false,
++ "isMandatory": true,
++ "values": [
++ "none_64.en"
++ ]
++ },
++ {
++ "name": "region",
++ "isCustom": false,
++ "isMandatory": true,
++ "values": [
++ "united_states"
++ ]
++ }
++ ],
++ "family": null,
++ "blobs": {
++ "commercial": {
++ "features": [
++ {
++ "name": "baremetal-server-usecases",
++ "value": "gaming"
++ }
++ ],
++ "name": "RISE-GAME-1"
++ }
++ }
++ },
++ {
++ "planCode": "26sk50a-v1-us",
++ "invoiceName": "KS-5-A | Intel Xeon E-2274G",
++ "addonFamilies": [
++ {
++ "name": "storage",
++ "exclusive": true,
++ "mandatory": true,
++ "addons": [
++ "softraid-2x960nvme-2x6000sa-26sk50a-v1-us",
++ "softraid-2x960nvme-26sk50a-v1-us",
++ "softraid-2x1920nvme-26sk50a-v1-us",
++ "softraid-3x1920nvme-26sk50a-v1-us",
++ "softraid-2x3840nvme-26sk50a-v1-us",
++ "softraid-3x6000sa-26sk50a-v1-us"
++ ],
++ "default": "softraid-2x960nvme-26sk50a-v1-us"
++ },
++ {
++ "name": "memory",
++ "exclusive": true,
++ "mandatory": true,
++ "addons": [
++ "ram-32g-ecc-2666-26sk50a-v1-us",
++ "ram-64g-ecc-2666-26sk50a-v1-us"
++ ],
++ "default": "ram-32g-ecc-2666-26sk50a-v1-us"
++ },
++ {
++ "name": "bandwidth",
++ "exclusive": true,
++ "mandatory": true,
++ "addons": [
++ "bandwidth-500-ks-gen0-us"
++ ],
++ "default": "bandwidth-500-ks-gen0-us"
++ }
++ ],
++ "product": "26sk50a",
++ "pricingType": "rental",
++ "consumptionConfiguration": null,
++ "pricings": [
++ {
++ "phase": 0,
++ "capacities": [
++ "installation"
++ ],
++ "commitment": 0,
++ "description": "rental (only applicable for 1 time)",
++ "interval": 0,
++ "intervalUnit": "none",
++ "quantity": {
++ "min": 1,
++ "max": 10
++ },
++ "repeat": {
++ "min": 1,
++ "max": 1
++ },
++ "price": 3000000000,
++ "formattedPrice": "$30.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ },
++ {
++ "phase": 1,
++ "capacities": [
++ "renew"
++ ],
++ "commitment": 0,
++ "description": "rental for 1 month",
++ "interval": 1,
++ "intervalUnit": "month",
++ "quantity": {
++ "min": 1,
++ "max": 10
++ },
++ "repeat": {
++ "min": 1,
++ "max": null
++ },
++ "price": 3000000000,
++ "formattedPrice": "$30.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ }
++ ],
++ "configurations": [
++ {
++ "name": "dedicated_os",
++ "isCustom": false,
++ "isMandatory": true,
++ "values": [
++ "none_64.en"
++ ]
++ },
++ {
++ "name": "region",
++ "isCustom": false,
++ "isMandatory": true,
++ "values": [
++ "united_states"
++ ]
++ },
++ {
++ "name": "enable-backup",
++ "isCustom": false,
++ "isMandatory": false,
++ "values": [
++ "true",
++ "false"
++ ]
++ },
++ {
++ "name": "dedicated_datacenter",
++ "isCustom": false,
++ "isMandatory": true,
++ "values": [
++ "hil",
++ "vin"
++ ]
++ }
++ ],
++ "family": null,
++ "blobs": {
++ "commercial": {
++ "features": [
++ {
++ "name": "baremetal-server-usecases",
++ "value": "bdd,dev-env,email"
++ }
++ ],
++ "name": "KS-5-A"
++ }
++ }
++ },
++ {
++ "planCode": "24rise092-us",
++ "invoiceName": "RISE-9 | AMD Epyc 7642",
++ "addonFamilies": [
++ {
++ "name": "memory",
++ "exclusive": true,
++ "mandatory": true,
++ "addons": [
++ "ram-256g-ecc-2933-24rise09-us",
++ "ram-512g-ecc-2933-24rise09-us",
++ "ram-1024g-ecc-2933-24rise09-us"
++ ],
++ "default": "ram-256g-ecc-2933-24rise09-us"
++ },
++ {
++ "name": "bandwidth",
++ "exclusive": true,
++ "mandatory": true,
++ "addons": [
++ "bandwidth-2000-24rise-us",
++ "bandwidth-1000-24rise-us",
++ "bandwidth-3000-24rise-us"
++ ],
++ "default": "bandwidth-1000-24rise-us"
++ },
++ {
++ "name": "storage",
++ "exclusive": true,
++ "mandatory": true,
++ "addons": [
++ "softraid-4x1920nvme-24rise-us",
++ "softraid-4x3840nvme-24rise-us",
++ "softraid-0disk-24rise-us",
++ "softraid-2x3840nvme-24rise-us",
++ "softraid-2x1920nvme-24rise-us"
++ ],
++ "default": "softraid-0disk-24rise-us"
++ }
++ ],
++ "product": "24rise09",
++ "pricingType": "rental",
++ "consumptionConfiguration": null,
++ "pricings": [
++ {
++ "phase": 0,
++ "capacities": [
++ "installation"
++ ],
++ "commitment": 0,
++ "description": "rental (only applicable for 1 time)",
++ "interval": 0,
++ "intervalUnit": "none",
++ "quantity": {
++ "min": 1,
++ "max": 10
++ },
++ "repeat": {
++ "min": 1,
++ "max": 1
++ },
++ "price": 26000000000,
++ "formattedPrice": "$260.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ },
++ {
++ "phase": 1,
++ "capacities": [
++ "renew"
++ ],
++ "commitment": 0,
++ "description": "rental for 1 month",
++ "interval": 1,
++ "intervalUnit": "month",
++ "quantity": {
++ "min": 1,
++ "max": 10
++ },
++ "repeat": {
++ "min": 1,
++ "max": null
++ },
++ "price": 26000000000,
++ "formattedPrice": "$260.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ }
++ ],
++ "configurations": [
++ {
++ "name": "dedicated_os",
++ "isCustom": false,
++ "isMandatory": true,
++ "values": [
++ "none_64.en"
++ ]
++ },
++ {
++ "name": "region",
++ "isCustom": false,
++ "isMandatory": true,
++ "values": [
++ "united_states"
++ ]
++ },
++ {
++ "name": "dedicated_datacenter",
++ "isCustom": false,
++ "isMandatory": true,
++ "values": [
++ "hil",
++ "vin"
++ ]
++ }
++ ],
++ "family": null,
++ "blobs": {
++ "commercial": {
++ "features": [
++ {
++ "name": "baremetal-server-usecases",
++ "value": "vdi,bdd,hpc,virtualisation-containerisation-orchestration"
++ }
++ ],
++ "name": "RISE-9"
++ }
++ }
++ },
++ {
++ "planCode": "24sys03-v1-us",
++ "invoiceName": "SYS-3 | Intel Xeon-E 2288G",
++ "addonFamilies": [
++ {
++ "name": "memory",
++ "exclusive": true,
++ "mandatory": true,
++ "addons": [
++ "ram-32g-ecc-2666-24sys03-v1-us",
++ "ram-64g-ecc-2666-24sys03-v1-us",
++ "ram-128g-ecc-2666-24sys03-v1-us"
++ ],
++ "default": "ram-32g-ecc-2666-24sys03-v1-us"
++ },
++ {
++ "name": "storage",
++ "exclusive": true,
++ "mandatory": true,
++ "addons": [
++ "softraid-2x960nvme-24sys03-v1-us",
++ "hybridsoftraid-2x6000sa-2x960nvme-24sys03-v1-us",
++ "softraid-2x1920nvme-24sys03-v1-us",
++ "softraid-3x1920nvme-24sys03-v1-us",
++ "softraid-3x4000sa-24sys03-v1-us"
++ ],
++ "default": "softraid-2x960nvme-24sys03-v1-us"
++ },
++ {
++ "name": "bandwidth",
++ "exclusive": true,
++ "mandatory": true,
++ "addons": [
++ "bandwidth-1000-24sys-us",
++ "bandwidth-2000-24sys-us"
++ ],
++ "default": "bandwidth-1000-24sys-us"
++ }
++ ],
++ "product": "24sys03",
++ "pricingType": "rental",
++ "consumptionConfiguration": null,
++ "pricings": [
++ {
++ "phase": 0,
++ "capacities": [
++ "installation"
++ ],
++ "commitment": 0,
++ "description": "rental (only applicable for 1 time)",
++ "interval": 0,
++ "intervalUnit": "none",
++ "quantity": {
++ "min": 1,
++ "max": 10
++ },
++ "repeat": {
++ "min": 1,
++ "max": 1
++ },
++ "price": 6000000000,
++ "formattedPrice": "$60.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ },
++ {
++ "phase": 1,
++ "capacities": [
++ "renew"
++ ],
++ "commitment": 0,
++ "description": "rental for 1 month",
++ "interval": 1,
++ "intervalUnit": "month",
++ "quantity": {
++ "min": 1,
++ "max": 10
++ },
++ "repeat": {
++ "min": 1,
++ "max": null
++ },
++ "price": 6000000000,
++ "formattedPrice": "$60.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ }
++ ],
++ "configurations": [
++ {
++ "name": "dedicated_datacenter",
++ "isCustom": false,
++ "isMandatory": false,
++ "values": [
++ "hil",
++ "vin"
++ ]
++ },
++ {
++ "name": "dedicated_os",
++ "isCustom": false,
++ "isMandatory": true,
++ "values": [
++ "none_64.en"
++ ]
++ },
++ {
++ "name": "region",
++ "isCustom": false,
++ "isMandatory": true,
++ "values": [
++ "united_states"
++ ]
++ }
++ ],
++ "family": null,
++ "blobs": {
++ "commercial": {
++ "features": [
++ {
++ "name": "baremetal-server-usecases",
++ "value": "hosting,dev-env"
++ }
++ ],
++ "name": "SYS-3"
++ }
++ }
++ },
++ {
++ "planCode": "24rise01-v2-us",
++ "invoiceName": "RISE-1 | Intel Xeon-E 2386G",
++ "addonFamilies": [
++ {
++ "name": "bandwidth",
++ "exclusive": true,
++ "mandatory": true,
++ "addons": [
++ "bandwidth-1000-unguaranteed-rise-gen2-us"
++ ],
++ "default": "bandwidth-1000-unguaranteed-rise-gen2-us"
++ },
++ {
++ "name": "storage",
++ "exclusive": true,
++ "mandatory": true,
++ "addons": [
++ "softraid-2x960nvme-24rise01-v2-us",
++ "softraid-2x512nvme-24rise01-v2-us",
++ "softraid-4x3840nvme-24rise01-v2-us",
++ "hybridsoftraid-2x6000sa-2x512nvme-24rise01-v2-us",
++ "softraid-2x1920nvme-24rise01-v2-us",
++ "softraid-2x3840nvme-24rise01-v2-us",
++ "softraid-2x4000sa-24rise01-v2-us",
++ "softraid-2x6000sa-24rise01-v2-us",
++ "softraid-3x1920nvme-24rise01-v2-us",
++ "softraid-3x3840nvme-24rise01-v2-us",
++ "softraid-4x960nvme-24rise01-v2-us"
++ ],
++ "default": "softraid-2x512nvme-24rise01-v2-us"
++ },
++ {
++ "name": "memory",
++ "exclusive": true,
++ "mandatory": true,
++ "addons": [
++ "ram-32g-ecc-3200-24rise01-v2-us",
++ "ram-64g-ecc-3200-24rise01-v2-us",
++ "ram-128g-ecc-2933-24rise01-v2-us"
++ ],
++ "default": "ram-32g-ecc-3200-24rise01-v2-us"
++ }
++ ],
++ "product": "24rise01",
++ "pricingType": "rental",
++ "consumptionConfiguration": null,
++ "pricings": [
++ {
++ "phase": 0,
++ "capacities": [
++ "installation"
++ ],
++ "commitment": 0,
++ "description": "rental (only applicable for 1 time)",
++ "interval": 0,
++ "intervalUnit": "none",
++ "quantity": {
++ "min": 1,
++ "max": 10
++ },
++ "repeat": {
++ "min": 1,
++ "max": 1
++ },
++ "price": 7000000000,
++ "formattedPrice": "$70.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ },
++ {
++ "phase": 1,
++ "capacities": [
++ "renew"
++ ],
++ "commitment": 0,
++ "description": "rental for 1 month",
++ "interval": 1,
++ "intervalUnit": "month",
++ "quantity": {
++ "min": 1,
++ "max": 10
++ },
++ "repeat": {
++ "min": 1,
++ "max": null
++ },
++ "price": 7000000000,
++ "formattedPrice": "$70.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ }
++ ],
++ "configurations": [
++ {
++ "name": "dedicated_datacenter",
++ "isCustom": false,
++ "isMandatory": false,
++ "values": [
++ "hil",
++ "vin"
++ ]
++ },
++ {
++ "name": "dedicated_os",
++ "isCustom": false,
++ "isMandatory": true,
++ "values": [
++ "none_64.en"
++ ]
++ },
++ {
++ "name": "region",
++ "isCustom": false,
++ "isMandatory": true,
++ "values": [
++ "united_states"
++ ]
++ }
++ ],
++ "family": null,
++ "blobs": {
++ "commercial": {
++ "features": [
++ {
++ "name": "baremetal-server-usecases",
++ "value": "hosting,confidential-computing,dev-env,email,bdd"
++ }
++ ],
++ "name": "RISE-1"
++ }
++ }
++ }
++ ],
++ "products": [
++ {
++ "name": "bandwidth-1000",
++ "description": "1Gbps unmetered and guaranteed public bandwidth",
++ "blobs": {
++ "technical": {
++ "bandwidth": {
++ "burst": 0,
++ "level": 1000,
++ "limit": 0,
++ "guaranteed": true
++ }
++ }
++ },
++ "configurations": []
++ },
++ {
++ "name": "bandwidth-500",
++ "description": "500 Mbps unmetered public bandwidth",
++ "blobs": {
++ "technical": {
++ "bandwidth": {
++ "burst": 0,
++ "level": 500,
++ "limit": 0,
++ "guaranteed": false
++ }
++ }
++ },
++ "configurations": []
++ },
++ {
++ "name": "ram-256g-ecc-2933",
++ "description": "256GB DDR4 ECC 2933MHz",
++ "blobs": {
++ "technical": {
++ "memory": {
++ "ecc": true,
++ "size": 256,
++ "ramType": "DDR4",
++ "frequency": 2933
++ }
++ }
++ },
++ "configurations": []
++ },
++ {
++ "name": "ram-32g-ecc-2400",
++ "description": "32GB DDR4 ECC 2400MHz",
++ "blobs": {
++ "technical": {
++ "memory": {
++ "ecc": true,
++ "size": 32,
++ "ramType": "DDR4",
++ "frequency": 2400
++ }
++ }
++ },
++ "configurations": []
++ },
++ {
++ "name": "ram-32g-ecc-2666",
++ "description": "32GB DDR4 ECC 2666MHz",
++ "blobs": {
++ "technical": {
++ "memory": {
++ "ecc": true,
++ "size": 32,
++ "ramType": "DDR4",
++ "frequency": 2666
++ }
++ }
++ },
++ "configurations": []
++ },
++ {
++ "name": "softraid-2x512nvme",
++ "description": "2x SSD NVMe 512GB Datacenter Class Soft RAID",
++ "blobs": {
++ "technical": {
++ "storage": {
++ "raid": "Soft RAID",
++ "disks": [
++ {
++ "specs": "M.2 80",
++ "usage": "data",
++ "number": 2,
++ "capacity": 512,
++ "interface": "NVMe",
++ "technology": "SSD"
++ }
++ ],
++ "hotSwap": false,
++ "raidDetails": {
++ "type": "Soft RAID"
++ }
++ }
++ }
++ },
++ "configurations": []
++ },
++ {
++ "name": "softraid-2x960nvme",
++ "description": "2x SSD NVMe 960GB Datacenter Class Soft RAID",
++ "blobs": {
++ "technical": {
++ "storage": {
++ "raid": "Soft RAID",
++ "disks": [
++ {
++ "specs": "M.2 80",
++ "usage": "data",
++ "number": 2,
++ "capacity": 960,
++ "interface": "NVMe",
++ "technology": "SSD"
++ }
++ ],
++ "hotSwap": false,
++ "raidDetails": {
++ "type": "Soft RAID"
++ }
++ }
++ }
++ },
++ "configurations": []
++ },
++ {
++ "name": "24risegame01",
++ "description": "AMD Ryzen 5 5600X",
++ "blobs": {
++ "technical": {
++ "server": {
++ "cpu": {
++ "boost": 4.6,
++ "brand": "AMD",
++ "cores": 6,
++ "model": "Ryzen 5 5600X",
++ "score": 22206,
++ "number": 1,
++ "threads": 12,
++ "frequency": 3.7
++ },
++ "frame": {
++ "size": "1U",
++ "model": "OVH",
++ "dualPowerSupply": false
++ },
++ "range": "rise",
++ "services": {
++ "sla": 99.95,
++ "antiddos": "game"
++ }
++ }
++ }
++ },
++ "configurations": [
++ {
++ "name": "extra_reservation",
++ "isCustom": true,
++ "isMandatory": false,
++ "values": null
++ }
++ ]
++ },
++ {
++ "name": "26sk50a",
++ "description": "Intel Xeon E-2274G",
++ "blobs": {
++ "technical": {
++ "server": {
++ "cpu": {
++ "boost": 4.9,
++ "brand": "Intel",
++ "cores": 4,
++ "model": "Xeon E-2274G",
++ "score": 11360,
++ "number": 1,
++ "threads": 8,
++ "frequency": 4
++ },
++ "frame": {
++ "size": "1U",
++ "model": "OVH",
++ "dualPowerSupply": false
++ },
++ "range": "kimsufi",
++ "services": {
++ "sla": 99.9,
++ "antiddos": "standard"
++ }
++ }
++ }
++ },
++ "configurations": [
++ {
++ "name": "extra_reservation",
++ "isCustom": true,
++ "isMandatory": false,
++ "values": null
++ }
++ ]
++ },
++ {
++ "name": "noraid-0",
++ "description": "No storage drive",
++ "blobs": {
++ "technical": {
++ "storage": {
++ "raid": "none",
++ "disks": [
++ {
++ "specs": "M.2 80",
++ "usage": "data",
++ "number": 0,
++ "capacity": 0,
++ "interface": "NVMe",
++ "technology": "SSD"
++ }
++ ],
++ "hotSwap": false,
++ "raidDetails": {
++ "type": "none"
++ }
++ }
++ }
++ },
++ "configurations": []
++ },
++ {
++ "name": "24rise09",
++ "description": "AMD Epyc 7642",
++ "blobs": {
++ "technical": {
++ "server": {
++ "cpu": {
++ "boost": 3.6,
++ "brand": "AMD",
++ "cores": 48,
++ "model": "Epyc 7642",
++ "number": 1,
++ "threads": 96,
++ "frequency": 2.3
++ },
++ "frame": {
++ "size": "1U",
++ "model": "OVH",
++ "dualPowerSupply": false
++ },
++ "range": "rise",
++ "services": {
++ "sla": 99.95,
++ "antiddos": "standard"
++ }
++ }
++ }
++ },
++ "configurations": [
++ {
++ "name": "extra_reservation",
++ "isCustom": true,
++ "isMandatory": false,
++ "values": null
++ }
++ ]
++ },
++ {
++ "name": "24sys03",
++ "description": "Intel Xeon-E 2288G",
++ "blobs": {
++ "technical": {
++ "server": {
++ "cpu": {
++ "boost": 5,
++ "brand": "Intel",
++ "cores": 8,
++ "model": "Xeon-E 2288G",
++ "score": 19000,
++ "number": 1,
++ "threads": 16,
++ "frequency": 3.7
++ },
++ "frame": {
++ "size": "1U",
++ "model": "OVH",
++ "dualPowerSupply": false
++ },
++ "range": "soyoustart",
++ "services": {
++ "sla": 99.9,
++ "antiddos": "standard"
++ }
++ }
++ }
++ },
++ "configurations": [
++ {
++ "name": "extra_reservation",
++ "isCustom": true,
++ "isMandatory": false,
++ "values": null
++ }
++ ]
++ },
++ {
++ "name": "ram-32g-ecc-3200",
++ "description": "32GB DDR4 ECC 3200MHz",
++ "blobs": {
++ "technical": {
++ "memory": {
++ "ecc": true,
++ "size": 32,
++ "ramType": "DDR4",
++ "frequency": 3200
++ }
++ }
++ },
++ "configurations": []
++ },
++ {
++ "name": "24rise01",
++ "description": "Intel Xeon-E 2386G",
++ "blobs": {
++ "technical": {
++ "server": {
++ "cpu": {
++ "boost": 4.7,
++ "brand": "Intel",
++ "cores": 6,
++ "model": "Xeon-E 2386G",
++ "score": 13976,
++ "number": 1,
++ "threads": 12,
++ "frequency": 3.5
++ },
++ "frame": {
++ "size": "0.5U",
++ "model": "OVH",
++ "dualPowerSupply": false
++ },
++ "range": "rise",
++ "services": {
++ "sla": 99.95,
++ "antiddos": "standard"
++ }
++ }
++ }
++ },
++ "configurations": [
++ {
++ "name": "extra_reservation",
++ "isCustom": true,
++ "isMandatory": false,
++ "values": null
++ }
++ ]
++ },
++ {
++ "name": "bandwidth-1000-unguaranteed",
++ "description": "1Gbps unmetered public bandwidth",
++ "blobs": {
++ "technical": {
++ "bandwidth": {
++ "burst": 0,
++ "level": 1000,
++ "limit": 0,
++ "guaranteed": false
++ }
++ }
++ },
++ "configurations": []
++ }
++ ],
++ "addons": [
++ {
++ "planCode": "bandwidth-1000-rise-game-us",
++ "invoiceName": "1Gbps unmetered public bandwidth",
++ "addonFamilies": [],
++ "product": "bandwidth-1000",
++ "pricingType": "rental",
++ "consumptionConfiguration": null,
++ "pricings": [
++ {
++ "phase": 0,
++ "capacities": [
++ "upgrade"
++ ],
++ "commitment": 0,
++ "description": "rental (only applicable for 1 time)",
++ "interval": 0,
++ "intervalUnit": "none",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": 1
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ },
++ {
++ "phase": 0,
++ "capacities": [
++ "installation"
++ ],
++ "commitment": 0,
++ "description": "rental (only applicable for 1 time)",
++ "interval": 0,
++ "intervalUnit": "none",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": 1
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ },
++ {
++ "phase": 1,
++ "capacities": [
++ "renew"
++ ],
++ "commitment": 0,
++ "description": "rental for 1 month",
++ "interval": 1,
++ "intervalUnit": "month",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": null
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ }
++ ],
++ "configurations": [],
++ "family": "public-bandwidth",
++ "blobs": null
++ },
++ {
++ "planCode": "ram-256g-ecc-2933-24rise09-us",
++ "invoiceName": "256GB DDR4 ECC 2933MHz",
++ "addonFamilies": [],
++ "product": "ram-256g-ecc-2933",
++ "pricingType": "rental",
++ "consumptionConfiguration": null,
++ "pricings": [
++ {
++ "phase": 0,
++ "capacities": [
++ "installation"
++ ],
++ "commitment": 0,
++ "description": "rental (only applicable for 1 time)",
++ "interval": 0,
++ "intervalUnit": "none",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": 1
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ },
++ {
++ "phase": 1,
++ "capacities": [
++ "renew"
++ ],
++ "commitment": 0,
++ "description": "rental for 1 month",
++ "interval": 1,
++ "intervalUnit": "month",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": null
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ }
++ ],
++ "configurations": [],
++ "family": null,
++ "blobs": null
++ },
++ {
++ "planCode": "ram-32g-ecc-2400-24risegame01-us",
++ "invoiceName": "32GB DDR4 ECC 2400MHz",
++ "addonFamilies": [],
++ "product": "ram-32g-ecc-2400",
++ "pricingType": "rental",
++ "consumptionConfiguration": null,
++ "pricings": [
++ {
++ "phase": 0,
++ "capacities": [
++ "installation"
++ ],
++ "commitment": 0,
++ "description": "rental (only applicable for 1 time)",
++ "interval": 0,
++ "intervalUnit": "none",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": 1
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ },
++ {
++ "phase": 1,
++ "capacities": [
++ "renew"
++ ],
++ "commitment": 0,
++ "description": "rental for 1 month",
++ "interval": 1,
++ "intervalUnit": "month",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": null
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ }
++ ],
++ "configurations": [],
++ "family": null,
++ "blobs": null
++ },
++ {
++ "planCode": "softraid-2x512nvme-24risegame-us",
++ "invoiceName": "2x SSD NVMe 512GB Enterprise Class Soft RAID",
++ "addonFamilies": [],
++ "product": "softraid-2x512nvme",
++ "pricingType": "rental",
++ "consumptionConfiguration": null,
++ "pricings": [
++ {
++ "phase": 0,
++ "capacities": [
++ "installation"
++ ],
++ "commitment": 0,
++ "description": "rental (only applicable for 1 time)",
++ "interval": 0,
++ "intervalUnit": "none",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": 1
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ },
++ {
++ "phase": 1,
++ "capacities": [
++ "renew"
++ ],
++ "commitment": 0,
++ "description": "rental for 1 month",
++ "interval": 1,
++ "intervalUnit": "month",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": null
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ }
++ ],
++ "configurations": [],
++ "family": null,
++ "blobs": null
++ },
++ {
++ "planCode": "ram-32g-ecc-2666-26sk50a-v1-us",
++ "invoiceName": "32GB DDR4 ECC 2666MHz",
++ "addonFamilies": [],
++ "product": "ram-32g-ecc-2666",
++ "pricingType": "rental",
++ "consumptionConfiguration": null,
++ "pricings": [
++ {
++ "phase": 0,
++ "capacities": [
++ "installation"
++ ],
++ "commitment": 0,
++ "description": "rental (only applicable for 1 time)",
++ "interval": 0,
++ "intervalUnit": "none",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": 1
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ },
++ {
++ "phase": 1,
++ "capacities": [
++ "renew"
++ ],
++ "commitment": 0,
++ "description": "rental for 1 month",
++ "interval": 1,
++ "intervalUnit": "month",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": null
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ }
++ ],
++ "configurations": [],
++ "family": null,
++ "blobs": null
++ },
++ {
++ "planCode": "softraid-2x960nvme-26sk50a-v1-us",
++ "invoiceName": "2x SSD NVMe 960GB Enterprise Class Soft RAID",
++ "addonFamilies": [],
++ "product": "softraid-2x960nvme",
++ "pricingType": "rental",
++ "consumptionConfiguration": null,
++ "pricings": [
++ {
++ "phase": 0,
++ "capacities": [
++ "installation"
++ ],
++ "commitment": 0,
++ "description": "rental (only applicable for 1 time)",
++ "interval": 0,
++ "intervalUnit": "none",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": 1
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ },
++ {
++ "phase": 1,
++ "capacities": [
++ "renew"
++ ],
++ "commitment": 0,
++ "description": "rental for 1 month",
++ "interval": 1,
++ "intervalUnit": "month",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": null
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ }
++ ],
++ "configurations": [],
++ "family": null,
++ "blobs": null
++ },
++ {
++ "planCode": "bandwidth-500-ks-gen0-us",
++ "invoiceName": "500Mbps unmetered public bandwidth",
++ "addonFamilies": [],
++ "product": "bandwidth-500",
++ "pricingType": "rental",
++ "consumptionConfiguration": null,
++ "pricings": [
++ {
++ "phase": 0,
++ "capacities": [
++ "installation"
++ ],
++ "commitment": 0,
++ "description": "rental (only applicable for 1 time)",
++ "interval": 0,
++ "intervalUnit": "none",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": 1
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ },
++ {
++ "phase": 0,
++ "capacities": [
++ "upgrade"
++ ],
++ "commitment": 0,
++ "description": "rental (only applicable for 1 time)",
++ "interval": 0,
++ "intervalUnit": "none",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": 1
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ },
++ {
++ "phase": 1,
++ "capacities": [
++ "renew"
++ ],
++ "commitment": 0,
++ "description": "rental for 1 month",
++ "interval": 1,
++ "intervalUnit": "month",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": null
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ }
++ ],
++ "configurations": [],
++ "family": "public-bandwidth",
++ "blobs": null
++ },
++ {
++ "planCode": "bandwidth-1000-24rise-us",
++ "invoiceName": "1Gbps unmetered and guaranteed public bandwidth",
++ "addonFamilies": [],
++ "product": "bandwidth-1000",
++ "pricingType": "rental",
++ "consumptionConfiguration": null,
++ "pricings": [
++ {
++ "phase": 0,
++ "capacities": [
++ "installation"
++ ],
++ "commitment": 0,
++ "description": "rental (only applicable for 1 time)",
++ "interval": 0,
++ "intervalUnit": "none",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": 1
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ },
++ {
++ "phase": 0,
++ "capacities": [
++ "upgrade"
++ ],
++ "commitment": 0,
++ "description": "rental (only applicable for 1 time)",
++ "interval": 0,
++ "intervalUnit": "none",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": 1
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ },
++ {
++ "phase": 1,
++ "capacities": [
++ "renew"
++ ],
++ "commitment": 0,
++ "description": "rental for 1 month",
++ "interval": 1,
++ "intervalUnit": "month",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": null
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ }
++ ],
++ "configurations": [],
++ "family": "public-bandwidth",
++ "blobs": null
++ },
++ {
++ "planCode": "softraid-0disk-24rise-us",
++ "invoiceName": "No storage drive",
++ "addonFamilies": [],
++ "product": "noraid-0",
++ "pricingType": "rental",
++ "consumptionConfiguration": null,
++ "pricings": [
++ {
++ "phase": 0,
++ "capacities": [
++ "installation"
++ ],
++ "commitment": 0,
++ "description": "rental (only applicable for 1 time)",
++ "interval": 0,
++ "intervalUnit": "none",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": 1
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ },
++ {
++ "phase": 1,
++ "capacities": [
++ "renew"
++ ],
++ "commitment": 0,
++ "description": "rental for 1 month",
++ "interval": 1,
++ "intervalUnit": "month",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": null
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ }
++ ],
++ "configurations": [],
++ "family": null,
++ "blobs": null
++ },
++ {
++ "planCode": "ram-32g-ecc-2666-24sys03-v1-us",
++ "invoiceName": "32GB DDR4 ECC 2666MHz",
++ "addonFamilies": [],
++ "product": "ram-32g-ecc-2666",
++ "pricingType": "rental",
++ "consumptionConfiguration": null,
++ "pricings": [
++ {
++ "phase": 0,
++ "capacities": [
++ "installation"
++ ],
++ "commitment": 0,
++ "description": "rental (only applicable for 1 time)",
++ "interval": 0,
++ "intervalUnit": "none",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": 1
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ },
++ {
++ "phase": 1,
++ "capacities": [
++ "renew"
++ ],
++ "commitment": 0,
++ "description": "rental for 1 month",
++ "interval": 1,
++ "intervalUnit": "month",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": null
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ }
++ ],
++ "configurations": [],
++ "family": null,
++ "blobs": null
++ },
++ {
++ "planCode": "softraid-2x960nvme-24sys03-v1-us",
++ "invoiceName": "2x SSD NVMe 960GB Enterprise Class Soft RAID",
++ "addonFamilies": [],
++ "product": "softraid-2x960nvme",
++ "pricingType": "rental",
++ "consumptionConfiguration": null,
++ "pricings": [
++ {
++ "phase": 0,
++ "capacities": [
++ "installation"
++ ],
++ "commitment": 0,
++ "description": "rental (only applicable for 1 time)",
++ "interval": 0,
++ "intervalUnit": "none",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": 1
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ },
++ {
++ "phase": 0,
++ "capacities": [
++ "upgrade"
++ ],
++ "commitment": 0,
++ "description": "rental (only applicable for 1 time)",
++ "interval": 0,
++ "intervalUnit": "none",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": 1
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ },
++ {
++ "phase": 1,
++ "capacities": [
++ "renew"
++ ],
++ "commitment": 0,
++ "description": "rental for 1 month",
++ "interval": 1,
++ "intervalUnit": "month",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": null
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ }
++ ],
++ "configurations": [],
++ "family": "storage",
++ "blobs": null
++ },
++ {
++ "planCode": "ram-32g-ecc-3200-24rise01-v2-us",
++ "invoiceName": "32GB DDR4 ECC 3200MHz",
++ "addonFamilies": [],
++ "product": "ram-32g-ecc-3200",
++ "pricingType": "rental",
++ "consumptionConfiguration": null,
++ "pricings": [
++ {
++ "phase": 0,
++ "capacities": [
++ "installation"
++ ],
++ "commitment": 0,
++ "description": "rental (only applicable for 1 time)",
++ "interval": 0,
++ "intervalUnit": "none",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": 1
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ },
++ {
++ "phase": 1,
++ "capacities": [
++ "renew"
++ ],
++ "commitment": 0,
++ "description": "rental for 1 month",
++ "interval": 1,
++ "intervalUnit": "month",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": null
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ }
++ ],
++ "configurations": [],
++ "family": null,
++ "blobs": null
++ },
++ {
++ "planCode": "softraid-2x512nvme-24rise01-v2-us",
++ "invoiceName": "2x SSD NVMe 512GB Datacenter Class Soft RAID",
++ "addonFamilies": [],
++ "product": "softraid-2x512nvme",
++ "pricingType": "rental",
++ "consumptionConfiguration": null,
++ "pricings": [
++ {
++ "phase": 0,
++ "capacities": [
++ "installation"
++ ],
++ "commitment": 0,
++ "description": "rental (only applicable for 1 time)",
++ "interval": 0,
++ "intervalUnit": "none",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": 1
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ },
++ {
++ "phase": 0,
++ "capacities": [
++ "upgrade"
++ ],
++ "commitment": 0,
++ "description": "rental (only applicable for 1 time)",
++ "interval": 0,
++ "intervalUnit": "none",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": 1
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ },
++ {
++ "phase": 1,
++ "capacities": [
++ "renew"
++ ],
++ "commitment": 0,
++ "description": "rental for 1 month",
++ "interval": 1,
++ "intervalUnit": "month",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": null
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ }
++ ],
++ "configurations": [],
++ "family": "storage",
++ "blobs": null
++ },
++ {
++ "planCode": "bandwidth-1000-unguaranteed-rise-gen2-us",
++ "invoiceName": "1Gbps unmetered public bandwidth",
++ "addonFamilies": [],
++ "product": "bandwidth-1000-unguaranteed",
++ "pricingType": "rental",
++ "consumptionConfiguration": null,
++ "pricings": [
++ {
++ "phase": 0,
++ "capacities": [
++ "installation"
++ ],
++ "commitment": 0,
++ "description": "rental (only applicable for 1 time)",
++ "interval": 0,
++ "intervalUnit": "none",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": 1
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ },
++ {
++ "phase": 0,
++ "capacities": [
++ "upgrade"
++ ],
++ "commitment": 0,
++ "description": "rental (only applicable for 1 time)",
++ "interval": 0,
++ "intervalUnit": "none",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": 1
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ },
++ {
++ "phase": 1,
++ "capacities": [
++ "renew"
++ ],
++ "commitment": 0,
++ "description": "rental for 1 month",
++ "interval": 1,
++ "intervalUnit": "month",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": null
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ }
++ ],
++ "configurations": [],
++ "family": "public-bandwidth",
++ "blobs": null
++ },
++ {
++ "planCode": "bandwidth-1000-24sys-us",
++ "invoiceName": "1Gbps unmetered and guaranteed public bandwidth",
++ "addonFamilies": [],
++ "product": "bandwidth-1000",
++ "pricingType": "rental",
++ "consumptionConfiguration": null,
++ "pricings": [
++ {
++ "phase": 0,
++ "capacities": [
++ "installation"
++ ],
++ "commitment": 0,
++ "description": "rental (only applicable for 1 time)",
++ "interval": 0,
++ "intervalUnit": "none",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": 1
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ },
++ {
++ "phase": 0,
++ "capacities": [
++ "upgrade"
++ ],
++ "commitment": 0,
++ "description": "rental (only applicable for 1 time)",
++ "interval": 0,
++ "intervalUnit": "none",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": 1
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ },
++ {
++ "phase": 1,
++ "capacities": [
++ "renew"
++ ],
++ "commitment": 0,
++ "description": "rental for 1 month",
++ "interval": 1,
++ "intervalUnit": "month",
++ "quantity": {
++ "min": 1,
++ "max": null
++ },
++ "repeat": {
++ "min": 1,
++ "max": null
++ },
++ "price": 0,
++ "formattedPrice": "$0.00 USD",
++ "tax": 0,
++ "mode": "default",
++ "strategy": "tiered",
++ "mustBeCompleted": false,
++ "type": "rental",
++ "promotions": [],
++ "engagementConfiguration": null
++ }
++ ],
++ "configurations": [],
++ "family": "public-bandwidth",
++ "blobs": null
++ }
++ ]
++}
\\ No newline at end of file
ddiff --git a/test/hosting-sources.test.js b/test/hosting-sources.test.js
iindex d13e3c8..728ce2f 100644
---- a/test/hosting-sources.test.js
++++ b/test/hosting-sources.test.js
@@@ -19,7 +19,7 @@ const seed = (key) => seeds.find((s) => s.key === key);
const endpoint = (key) => seed(key).endpoints[0];
t('both hosting seeds declare an api mapping the adapter accepts', () => {
-- for (const key of ['vultr-plans', 'linode-types', 'ovhcloud-vps']) {
++ for (const key of ['vultr-plans', 'linode-types', 'ovhcloud-vps', 'ovhcloud-baremetal']) {
const s = seed(key);
assert.ok(s, `${key} is seeded`);
assert.strictEqual(s.type, 'api');
@@@ -110,6 +110,50 @@ t('OVHcloud domain prices: one item per ending, the first year, renewal and tran
assert.strictEqual(by['co.uk'].transfer, 0, 'a free transfer stays 0; Host decides what 0 means per field');
});
++
++t('OVHcloud dedicated servers: the bare-metal and Eco catalogs, each plan joined to its default addons and their products', () => {
++ const s = seed('ovhcloud-baremetal');
++ assert.deepStrictEqual([s.type, s.category, s.enabled, s.review_required], ['api', 'hosting', false, true]);
++ assert.strictEqual(s.endpoints.length, 2, 'one endpoint for the bare-metal catalog and one for Eco');
++ assert.deepStrictEqual(s.endpoints.map((e) => e.max_bytes), [40 * 1024 * 1024, 16 * 1024 * 1024]);
++ for (const ep of s.endpoints) assert.strictEqual(api.checkMapping(ep), null);
++ assert.strictEqual(validateSource(s).max_items, 200);
++
++ const main = api.parse(fx('ovhcloud-baremetal.json'), { url: s.endpoints[0].url, endpoint: s.endpoints[0], maxItems: 200 });
++ assert.deepStrictEqual([main.items.length, main.meta.filtered, main.skipped], [8, 2, 0]);
++ assert.deepStrictEqual(main.items.map((i) => i.identity).sort(), [
++ '20bv012-us', '20hg03-us', '22bf062-us', '23scaleamd01-v3-us', '24adv01-v3-us', '24hci-a1-v2-us', '26adv01-v7-us', '26game02-v4-us',
++ ]);
++ const by = Object.fromEntries(main.items.map((i) => [i.identity, i.fields]));
++ assert.deepStrictEqual(by['24adv01-v3-us'], {
++ product: '24adv01', currency: 'USD', range: 'advance',
++ cpu_cores: 6, cpu_sockets: 1, cpu_model: 'EPYC 4244P', cpu_brand: 'AMD', memory_gb: 32,
++ disk_capacity_gb: 960, disk_count: 2, disk_interface: 'NVMe', disk_technology: 'SSD',
++ bandwidth_mbps: 3000, bandwidth_limit: 0, price_monthly: 14700000000, setup_fee: 14700000000,
++ locations: ['vin', 'hil'],
++ });
++ // A legacy plan: no installation fee in the catalog ($0), two sockets, SATA SSDs, and a different bandwidth.
++ assert.deepStrictEqual([by['20bv012-us'].setup_fee, by['20bv012-us'].cpu_sockets, by['20bv012-us'].memory_gb, by['20bv012-us'].disk_capacity_gb, by['20bv012-us'].disk_count, by['20bv012-us'].bandwidth_mbps, by['20bv012-us'].price_monthly],
++ [0, 2, 256, 240, 2, 500, 10900000000]);
++ // HG-3's product states no socket count (the CPU model says "2x"); the adapter keeps null rather than inventing one.
++ assert.deepStrictEqual([by['20hg03-us'].cpu_cores, by['20hg03-us'].cpu_sockets, by['20hg03-us'].memory_gb, by['20hg03-us'].disk_capacity_gb, by['20hg03-us'].disk_count, by['20hg03-us'].setup_fee, by['20hg03-us'].price_monthly],
++ [28, null, 192, 6000, 2, 0, 97500000000]);
++ // A Scale plan sold with no drives: capacity 0 and count 0 are the catalog's own facts, not a missing field.
++ assert.deepStrictEqual([by['23scaleamd01-v3-us'].disk_capacity_gb, by['23scaleamd01-v3-us'].disk_count], [0, 0]);
++ assert.deepStrictEqual([by['24hci-a1-v2-us'].cpu_cores, by['24hci-a1-v2-us'].cpu_sockets, by['24hci-a1-v2-us'].disk_capacity_gb, by['24hci-a1-v2-us'].disk_count], [24, 2, 3840, 6]);
++ // The -eu copy and the legacy special edition are filtered by the -us plan-code pattern.
++ assert.ok(!main.items.some((i) => /-(?:eu|ca|se)$/.test(i.identity)));
++
++ const eco = api.parse(fx('ovhcloud-eco.json'), { url: s.endpoints[1].url, endpoint: s.endpoints[1], maxItems: 200 });
++ assert.deepStrictEqual([eco.items.length, eco.meta.filtered, eco.skipped], [5, 1, 0]);
++ const eby = Object.fromEntries(eco.items.map((i) => [i.identity, i.fields]));
++ assert.deepStrictEqual([eby['26sk50a-v1-us'].price_monthly, eby['26sk50a-v1-us'].setup_fee, eby['26sk50a-v1-us'].memory_gb, eby['26sk50a-v1-us'].disk_capacity_gb, eby['26sk50a-v1-us'].disk_count],
++ [3000000000, 3000000000, 32, 960, 2]);
++ assert.deepStrictEqual([eby['24risegame012-us'].range, eby['24risegame012-us'].cpu_cores, eby['24risegame012-us'].disk_capacity_gb, eby['24risegame012-us'].bandwidth_mbps],
++ ['rise', 6, 512, 1000]);
++ assert.ok(!eco.items.some((i) => i.identity.endsWith('-ca')));
++});
++
t('the registry accepts category hosting and refuses an unknown category', () => {
const rec = validateSource(seed('vultr-plans'));
assert.strictEqual(rec.category, 'hosting');