From 1104902b46184cd138f715377aeb233b297899e3 Mon Sep 17 00:00:00 2001 From: Florian Sanders Date: Mon, 28 Oct 2024 15:35:26 +0100 Subject: [PATCH] feat(cc-pricing-product)!: adapt to support priceSystem currency Smart components: - The `addonFeatures` context parameter of the `cc-pricing-product.smart-addon` component is now optional as it should always have been (default value: `[]` meaning that all features are displayed by default). - The `zoneId` context parameter of both `cc-pricing-product.smart-addon` & `cc-pricing-product.smart-runtime` is now optional (default value: `'par'`). BREAKING CHANGE: the component no longer supports hard coded change rate Prices displayed in pricing components are no longer computed based on hard coded change rate. Prices related to the selected currency come from the API priceSytem endpoint. The component also relies on the new `state` prop for data coming from the API. This means that some types for the component properties have changed: - `currency` is now a `string` (ISO 4217 currency code), - `product` has been removed, - `state` has been added to replace `product`, - `product.state` is now `state.type`. The payload type of the `cc-pricing-product:add-plan` dispatched event has changed. Plans must now include a `priceId` property to be handled by the `cc-pricing-estimation` correctly. This also means that custom products / plans can no longer be added to the estimation because they are not part of the priceSystem and have no `priceId`. The payload type of the `cc-pricing-product:add-plan` dispatched event has changed. Plans must now include a `priceId` property to be handled by the `cc-pricing-estimation` correctly. This also means that custom products / plans can no longer be added to the estimation because they are not part of the priceSystem and have no `priceId`. Fixes #1167 Fixes #1109 Fixes #1174 Fixes #1176 --- .../cc-pricing-product/cc-pricing-product.js | 120 +- .../cc-pricing-product.smart-addon.js | 91 +- .../cc-pricing-product.smart-addon.md | 75 +- .../cc-pricing-product.smart-runtime.js | 98 +- .../cc-pricing-product.smart-runtime.md | 58 +- .../cc-pricing-product.stories.js | 176 +- .../cc-pricing-product.types.d.ts | 10 +- src/components/common.types.d.ts | 199 +- src/lib/api-helpers.js | 12 +- src/lib/product.js | 111 +- src/stories/fixtures/addon-plans.js | 33 +- src/stories/fixtures/price-system.js | 2050 +++- src/stories/fixtures/runtime-plans.js | 9330 ++++++++--------- src/translations/translations.en.js | 10 +- src/translations/translations.fr.js | 6 +- 15 files changed, 7283 insertions(+), 5096 deletions(-) diff --git a/src/components/cc-pricing-product/cc-pricing-product.js b/src/components/cc-pricing-product/cc-pricing-product.js index aa27107b2..3b11e0b83 100644 --- a/src/components/cc-pricing-product/cc-pricing-product.js +++ b/src/components/cc-pricing-product/cc-pricing-product.js @@ -11,6 +11,7 @@ import '../cc-notice/cc-notice.js'; // 800 seems like a good arbitrary value for the content we need to display. const BREAKPOINT = 800; +/** @type {Record string>} */ const FEATURES_I18N = { 'connection-limit': () => i18n('cc-pricing-product.feature.connection-limit'), cpu: () => i18n('cc-pricing-product.feature.cpu'), @@ -28,19 +29,18 @@ const FEATURES_I18N = { const AVAILABLE_FEATURES = Object.keys(FEATURES_I18N); const NUMBER_FEATURE_TYPES = ['bytes', 'number', 'number-cpu-runtime']; -/** @type {Currency} */ // FIXME: this code is duplicated across all pricing components (see issue #732 for more details) -const CURRENCY_EUR = { code: 'EUR', changeRate: 1 }; +const CURRENCY_EUR = 'EUR'; /** @type {Temporality[]} */ const DEFAULT_TEMPORALITY_LIST = [{ type: '30-days', digits: 2 }]; /** * @typedef {import('../common.types.js').ActionType} ActionType - * @typedef {import('../common.types.js').Currency} Currency * @typedef {import('./cc-pricing-product.types.js').PricingProductState} PricingProductState * @typedef {import('../common.types.js').Temporality} Temporality * @typedef {import('../common.types.js').Plan} Plan + * @typedef {import('../common.types.js').FormattedFeature} FormattedFeature */ /** @@ -73,8 +73,8 @@ export class CcPricingProduct extends LitElement { static get properties() { return { action: { type: String }, - currency: { type: Object }, - product: { type: Object }, + currency: { type: String }, + state: { type: Object }, temporalities: { type: Array }, }; } @@ -85,11 +85,11 @@ export class CcPricingProduct extends LitElement { /** @type {ActionType} Sets the type of action: "add" to display add buttons for each plan and "none" for no actions (defaults to "add"). */ this.action = 'add'; - /** @type {Currency} Sets the currency used to display the prices (defaults to euros). */ + /** @type {string} Sets the currency used to display the prices (defaults to `EUR`). */ this.currency = CURRENCY_EUR; /** @type {PricingProductState} Sets the state of the pricing product component. */ - this.product = { state: 'loading' }; + this.state = { type: 'loading' }; /** * @type {Temporality[]} Sets the time window(s) you want to display the prices in (defaults to 30 days with 2 fraction digits). @@ -104,15 +104,15 @@ export class CcPricingProduct extends LitElement { /** * Returns the translated string corresponding to a feature code. * - * @param {Feature} feature - the feature to translate - * @return {string|undefined} the translated feature name if a translation exists or nothing if the translation does not exist + * @param {FormattedFeature} feature - the feature to translate + * @return {string|void} the translated feature name if a translation exists or nothing if the translation does not exist */ _getFeatureName(feature) { if (feature == null) { return ''; } - if (FEATURES_I18N[feature.code] != null) { + if (feature.code in FEATURES_I18N) { return FEATURES_I18N[feature.code](); } @@ -124,13 +124,14 @@ export class CcPricingProduct extends LitElement { /** * Returns the formatted value corresponding to a feature * - * @param {feature} feature - the feature to get the formatted value from - * @return {string} the formatted value for the given feature or the feature value itself if it does not require any formatting + * @param {FormattedFeature} feature - the feature to get the formatted value from + * @return {string|Node|void} the formatted value for the given feature or the feature value itself if it does not require any formatting */ _getFeatureValue(feature) { if (feature == null) { return ''; } + switch (feature.type) { case 'boolean': return i18n('cc-pricing-product.type.boolean', { boolean: feature.value === 'true' }); @@ -146,11 +147,17 @@ export class CcPricingProduct extends LitElement { : i18n('cc-pricing-product.type.number', { number: Number(feature.value) }); case 'number-cpu-runtime': return i18n('cc-pricing-product.type.number-cpu-runtime', { + /** + * Narrowing the type would make the code less readable for no gain, improving the type to separate + * `number-cpu-runtime` from other types makes the code a lot more complex for almost no type safety gain + */ + // @ts-ignore cpu: feature.value.cpu, + // @ts-ignore shared: feature.value.shared, }); case 'string': - return feature.value; + return feature.value.toString(); } } @@ -162,23 +169,19 @@ export class CcPricingProduct extends LitElement { * @return {number} the computed price based on the given temporality */ _getPrice(type, hourlyPrice) { - if (type === 'second') { - return (hourlyPrice / 60 / 60) * this.currency.changeRate; - } - if (type === 'minute') { - return (hourlyPrice / 60) * this.currency.changeRate; - } - if (type === 'hour') { - return hourlyPrice * this.currency.changeRate; - } - if (type === '1000-minutes') { - return (hourlyPrice / 60) * 1000 * this.currency.changeRate; - } - if (type === 'day') { - return hourlyPrice * 24 * this.currency.changeRate; - } - if (type === '30-days') { - return hourlyPrice * 24 * 30 * this.currency.changeRate; + switch (type) { + case 'second': + return hourlyPrice / 60 / 60; + case 'minute': + return hourlyPrice / 60; + case 'hour': + return hourlyPrice; + case '1000-minutes': + return (hourlyPrice / 60) * 1000; + case 'day': + return hourlyPrice * 24; + case '30-days': + return hourlyPrice * 24 * 30; } } @@ -186,26 +189,22 @@ export class CcPricingProduct extends LitElement { * Returns the translated price label corresponding to a temporality * * @param {Temporality['type']} type - the temporality type - * @return {string} the translated label corresponding to the given temporality + * @return {string|Node} the translated label corresponding to the given temporality */ _getPriceLabel(type) { - if (type === 'second') { - return i18n('cc-pricing-product.price-name.second'); - } - if (type === 'minute') { - return i18n('cc-pricing-product.price-name.minute'); - } - if (type === 'hour') { - return i18n('cc-pricing-product.price-name.hour'); - } - if (type === '1000-minutes') { - return i18n('cc-pricing-product.price-name.1000-minutes'); - } - if (type === 'day') { - return i18n('cc-pricing-product.price-name.day'); - } - if (type === '30-days') { - return i18n('cc-pricing-product.price-name.30-days'); + switch (type) { + case 'second': + return i18n('cc-pricing-product.price-name.second'); + case 'minute': + return i18n('cc-pricing-product.price-name.minute'); + case 'hour': + return i18n('cc-pricing-product.price-name.hour'); + case '1000-minutes': + return i18n('cc-pricing-product.price-name.1000-minutes'); + case 'day': + return i18n('cc-pricing-product.price-name.day'); + case '30-days': + return i18n('cc-pricing-product.price-name.30-days'); } } @@ -216,11 +215,12 @@ export class CcPricingProduct extends LitElement { * @param {Temporality['type']} type - the temporality type * @param {number} hourlyPrice - the price to base the calculations on * @param {number} digits - the number of digits to be used for price rounding + * @returns {string|void} */ _getPriceValue(type, hourlyPrice, digits) { const price = this._getPrice(type, hourlyPrice); if (price != null) { - return i18n('cc-pricing-product.price', { price, code: this.currency.code, digits }); + return i18n('cc-pricing-product.price', { price, currency: this.currency, digits }); } } @@ -237,12 +237,12 @@ export class CcPricingProduct extends LitElement { render() { return html` - ${this.product.state === 'error' + ${this.state.type === 'error' ? html` ` : ''} - ${this.product.state === 'loading' ? html` ` : ''} - ${this.product.state === 'loaded' - ? this._renderProductPlans(this.product.name, this.product.plans, this.product.productFeatures) + ${this.state.type === 'loading' ? html` ` : ''} + ${this.state.type === 'loaded' + ? this._renderProductPlans(this.state.name, this.state.plans, this.state.productFeatures) : ''} `; } @@ -250,7 +250,7 @@ export class CcPricingProduct extends LitElement { /** * @param {string} productName - the name of the product * @param {Plan[]} productPlans - the list of plans attached to this product - * @param {Feature[]} productFeatures - the list of features to display + * @param {Array} productFeatures - the list of features to display */ _renderProductPlans(productName, productPlans, productFeatures) { // this component is not rerendering very often so we consider we can afford to sort plans and filter the features here. @@ -269,7 +269,7 @@ export class CcPricingProduct extends LitElement { /** * @param {string} productName * @param {Plan[]} sortedPlans - * @param {Feature[]} productFeatures + * @param {Array} productFeatures */ _renderBigPlans(productName, sortedPlans, productFeatures) { const temporality = this.temporalities ?? DEFAULT_TEMPORALITY_LIST; @@ -329,8 +329,8 @@ export class CcPricingProduct extends LitElement { } /** - * @param {Feature[]} planFeatures - * @param {Feature[]} productFeatures + * @param {Array} planFeatures + * @param {Array} productFeatures */ _renderBigPlanFeatures(planFeatures, productFeatures) { return productFeatures.map((feature) => { @@ -346,7 +346,7 @@ export class CcPricingProduct extends LitElement { /** * @param {string} productName * @param {Plan[]} sortedPlans - * @param {Feature[]} productFeatures + * @param {Array} productFeatures */ _renderSmallPlans(productName, sortedPlans, productFeatures) { const temporality = this.temporalities ?? DEFAULT_TEMPORALITY_LIST; @@ -394,8 +394,8 @@ export class CcPricingProduct extends LitElement { } /** - * @param {Feature[]} planFeatures - * @param {Feature[]} productFeatures + * @param {Array} planFeatures + * @param {Array} productFeatures */ _renderSmallPlanFeatures(planFeatures, productFeatures) { return productFeatures.map((feature) => { diff --git a/src/components/cc-pricing-product/cc-pricing-product.smart-addon.js b/src/components/cc-pricing-product/cc-pricing-product.smart-addon.js index 3b6d43873..126a75232 100644 --- a/src/components/cc-pricing-product/cc-pricing-product.smart-addon.js +++ b/src/components/cc-pricing-product/cc-pricing-product.smart-addon.js @@ -1,4 +1,6 @@ +// @ts-expect-error FIXME: remove when clever-client exports types import { getAllAddonProviders } from '@clevercloud/client/esm/api/v2/product.js'; +// @ts-expect-error FIXME: remove when clever-client exports types import { ONE_DAY } from '@clevercloud/client/esm/with-cache.js'; import { fetchPriceSystem } from '../../lib/api-helpers.js'; import { defineSmartComponent } from '../../lib/define-smart-component.js'; @@ -7,23 +9,44 @@ import { sendToApi } from '../../lib/send-to-api.js'; import '../cc-smart-container/cc-smart-container.js'; import './cc-pricing-product.js'; +/** + * @typedef {import('./cc-pricing-product.js').CcPricingProduct} CcPricingProduct + * @typedef {import('./cc-pricing-product.types.js').PricingProductStateLoaded} PricingProductStateLoaded + * @typedef {import('../../lib/send-to-api.types.js').ApiConfig} ApiConfig + * @typedef {import('../common.types.js').FormattedFeature} FormattedFeature + * @typedef {import('../common.types.js').RawAddonProvider} RawAddonProvider + * @typedef {import('../common.types.js').Zone} Zone + * @typedef {import('../common.types.js').Instance} Instance + */ + defineSmartComponent({ selector: 'cc-pricing-product[mode="addon"]', params: { - addonFeatures: { type: Array }, + apiConfig: { type: Object }, + addonFeatures: { type: Array, optional: true }, productId: { type: String }, - zoneId: { type: String }, + zoneId: { type: String, optional: true }, + currency: { type: String, optional: true }, }, + /** + * @param {Object} settings + * @param {CcPricingProduct} settings.component + * @param {{apiConfig: ApiConfig, productId: string, zoneId?: string, currency?: string, addonFeatures?: Array }} settings.context + * @param {(type: string, listener: (detail: any) => void) => void} settings.onEvent + * @param {Function} settings.updateComponent + * @param {AbortSignal} settings.signal + */ + // @ts-expect-error FIXME: remove once `onContextUpdate` is type with generics onContextUpdate({ context, updateComponent, signal }) { - const { productId, zoneId, addonFeatures } = context; + const { apiConfig, productId, zoneId = 'par', addonFeatures, currency = 'EUR' } = context; // Reset the component before loading - updateComponent('state', { state: 'loading' }); + updateComponent('state', { type: 'loading' }); - fetchAddonProduct({ zoneId, productId, addonFeatures, signal }) + fetchAddonProduct({ apiConfig, zoneId, productId, addonFeatures, currency, signal }) .then((productDetails) => { - updateComponent('product', { - state: 'loaded', + updateComponent('state', { + type: 'loaded', name: productDetails.name, productFeatures: productDetails.productFeatures, plans: productDetails.plans, @@ -31,25 +54,51 @@ defineSmartComponent({ }) .catch((error) => { console.error(error); - updateComponent('product', { state: 'error' }); + updateComponent('state', { type: 'error' }); }); }, }); -function fetchAddonProduct({ productId, zoneId, addonFeatures, signal }) { - return Promise.all([fetchAddonProvider({ productId, signal }), fetchPriceSystem({ zoneId, signal })]).then( - ([addonProvider, priceSystem]) => formatAddonProduct(addonProvider, priceSystem, addonFeatures), - ); +/** + * Fetches addon product information by combining addon provider and price system data. + * + * @param {Object} options - The options for fetching addon product. + * @param {ApiConfig} options.apiConfig - The API configuration. + * @param {string} options.productId - The ID of the product. + * @param {string} options.zoneId - The ID of the zone. + * @param {Array} options.addonFeatures - The features of the addon. + * @param {string} options.currency - The currency for pricing. + * @param {AbortSignal} options.signal - The abort signal for the fetch operation. + * @returns {Promise>} A promise that resolves to the formatted addon product. + */ +function fetchAddonProduct({ apiConfig, productId, zoneId, addonFeatures, currency, signal }) { + return Promise.all([ + fetchAddonProvider({ apiConfig, productId, signal }), + fetchPriceSystem({ apiConfig, zoneId, currency, signal }), + ]).then(([addonProvider, priceSystem]) => formatAddonProduct(addonProvider, priceSystem, addonFeatures)); } -function fetchAddonProvider({ signal, productId }) { +/** + * Fetches an addon provider based on the given product ID. + * + * @param {Object} options - The options for fetching the addon provider. + * @param {ApiConfig} options.apiConfig - The API configuration. + * @param {AbortSignal} options.signal - The abort signal for the fetch operation. + * @param {string} options.productId - The ID of the product to fetch the addon provider for. + * @returns {Promise} A promise that resolves to the addon provider object. + * @throws {Error} Throws an error if the addon provider is not found. + */ +function fetchAddonProvider({ apiConfig, signal, productId }) { return getAllAddonProviders() - .then(sendToApi({ cacheDelay: ONE_DAY, signal })) - .then((allAddonProviders) => { - const addonProvider = allAddonProviders.find((ap) => ap.id === productId); - if (addonProvider == null) { - throw new Error(`Unknown add-on provider ID: ${productId}`); - } - return addonProvider; - }); + .then(sendToApi({ apiConfig, cacheDelay: ONE_DAY, signal })) + .then( + /** @param {Array} allAddonProviders */ + (allAddonProviders) => { + const addonProvider = allAddonProviders.find((ap) => ap.id === productId); + if (addonProvider == null) { + throw new Error(`Unknown add-on provider ID: ${productId}`); + } + return addonProvider; + }, + ); } diff --git a/src/components/cc-pricing-product/cc-pricing-product.smart-addon.md b/src/components/cc-pricing-product/cc-pricing-product.smart-addon.md index 704b89ee5..87bc11ec1 100644 --- a/src/components/cc-pricing-product/cc-pricing-product.smart-addon.md +++ b/src/components/cc-pricing-product/cc-pricing-product.smart-addon.md @@ -14,32 +14,54 @@ title: '💡 Smart (add-on)' ## ⚙️ Params -| Name | Type | Details | Default | -|-----------------|-------------|--------------------------------------------------------------------------------------------------|---------| -| `productId` | `string` | id from [`/v2/products/addonproviders`](https://api.clever-cloud.com/v2/products/addonproviders) | | -| `zoneId` | `string` | Name from [`/v4/products/zones`](https://api.clever-cloud.com/v4/products/zones) | `par` | -| `addonFeatures` | `string[]` | List of feature codes as describe in the component API. | | +| Name | Type | Required | Details | Default | +|-----------------|----------------------|----------|--------------------------------------------------------------------------------------------------|------------------------------------------------| +| `addonFeatures` | `Array` | Yes | List of features used to filter and sort displayed features | | +| `apiConfig` | `ApiConfig` | No | Object with API configuration (target host) | `{ API_HOST: "https://api.clever-cloud.com" }` | +| `currency` | `string` | No | Currency code matching the ISO 4217 format | `EUR` | +| `productId` | `string` | Yes | id from [`/v2/products/addonproviders`](https://api.clever-cloud.com/v2/products/addonproviders) | | +| `zoneId` | `string` | No | Name from [`/v4/products/zones`](https://api.clever-cloud.com/v4/products/zones) | `par` | * When `addonFeatures` is not specified, all product features are listed in the order of the API. * Setting `addonFeatures` allows you to filter the features you want to display. * Setting `addonFeatures` allows you to control the display order of the features. +```ts +type FeatureCode = + | 'connection-limit' + | 'cpu' + | 'gpu' + | 'is-migratable' + | 'databases' + | 'dedicated' + | 'disk-size' + | 'has-logs' + | 'has-metrics' + | 'max-db-size' + | 'memory' + | 'version' + | string; +``` + ## 🌐 API endpoints -| Method | Type | Cache? | -|--------|:-----------------------------------|--------| -| `GET` | `/v2/products/addonproviders` | 1 day | -| `GET` | `/v4/billing/price-system?zone_id` | 1 day | +| Method | Type | Cache? | +|--------|--------------------------------------------------|--------| +| `GET` | `/v2/products/addonproviders` | 1 day | +| `GET` | `/v4/billing/price-system?zone_id¤cy` | 1 day | ## ⬇️️ Examples ### Simple -Simple example based on default zone. +Simple example based on default zone and default currency. ```html @@ -53,8 +75,27 @@ NOTE: Prices are the same on all zones right now. ```html + + +``` + +### Currency + +Simple example with custom currency. + +```html + @@ -67,10 +108,12 @@ It's also a good way to filter features. ```html ``` - diff --git a/src/components/cc-pricing-product/cc-pricing-product.smart-runtime.js b/src/components/cc-pricing-product/cc-pricing-product.smart-runtime.js index 72915d533..b9b16b402 100644 --- a/src/components/cc-pricing-product/cc-pricing-product.smart-runtime.js +++ b/src/components/cc-pricing-product/cc-pricing-product.smart-runtime.js @@ -1,4 +1,6 @@ +// @ts-expect-error FIXME: remove when clever-client exports types import { getAvailableInstances } from '@clevercloud/client/esm/api/v2/product.js'; +// @ts-expect-error FIXME: remove when clever-client exports types import { ONE_DAY } from '@clevercloud/client/esm/with-cache.js'; import { fetchPriceSystem } from '../../lib/api-helpers.js'; import { defineSmartComponent } from '../../lib/define-smart-component.js'; @@ -7,22 +9,41 @@ import { sendToApi } from '../../lib/send-to-api.js'; import '../cc-smart-container/cc-smart-container.js'; import './cc-pricing-product.js'; +/** + * @typedef {import('./cc-pricing-product.js').CcPricingProduct} CcPricingProduct + * @typedef {import('./cc-pricing-product.types.js').PricingProductStateLoaded} PricingProductStateLoaded + * @typedef {import('../../lib/send-to-api.types.js').ApiConfig} ApiConfig + * @typedef {import('../common.types.js').Zone} Zone + * @typedef {import('../common.types.js').Instance} Instance + */ + defineSmartComponent({ selector: 'cc-pricing-product[mode="runtime"]', params: { + apiConfig: { type: Object }, productId: { type: String }, - zoneId: { type: String }, + zoneId: { type: String, optional: true }, + currency: { type: String, optional: true }, }, + /** + * @param {Object} settings + * @param {CcPricingProduct} settings.component + * @param {{apiConfig: ApiConfig, productId: string, zoneId?: string, currency?: string }} settings.context + * @param {(type: string, listener: (detail: any) => void) => void} settings.onEvent + * @param {Function} settings.updateComponent + * @param {AbortSignal} settings.signal + */ + // @ts-expect-error FIXME: remove once `onContextUpdate` is type with generics onContextUpdate({ context, updateComponent, signal }) { - const { productId, zoneId } = context; + const { apiConfig, productId, zoneId = 'par', currency = 'EUR' } = context; // Reset the component before loading - updateComponent('state', { state: 'loading' }); + updateComponent('state', { type: 'loading' }); - fetchRuntimeProduct({ productId, zoneId, signal }) + fetchRuntimeProduct({ apiConfig, productId, zoneId, currency, signal }) .then((productDetails) => { - updateComponent('product', { - state: 'loaded', + updateComponent('state', { + type: 'loaded', name: productDetails.name, productFeatures: productDetails.productFeatures, plans: productDetails.plans, @@ -30,32 +51,57 @@ defineSmartComponent({ }) .catch((error) => { console.error(error); - updateComponent('product', { state: 'error' }); + updateComponent('state', { type: 'error' }); }); }, }); -function fetchRuntimeProduct({ productId, zoneId, signal }) { - return Promise.all([fetchRuntime({ productId, signal }), fetchPriceSystem({ zoneId, signal })]).then( - ([runtime, priceSystem]) => formatRuntimeProduct(runtime, priceSystem), - ); +/** + * Fetches runtime product information by combining runtime and price system data. + * @async + * @param {Object} options - The options for fetching the runtime product. + * @param {ApiConfig} options.apiConfig - The API configuration. + * @param {string} options.productId - The ID of the product. + * @param {string} options.zoneId - The ID of the zone. + * @param {string} options.currency - The currency for pricing. + * @param {AbortSignal} options.signal - The abort signal. + * @returns {Promise>} A promise that resolves to the formatted runtime product. + */ +function fetchRuntimeProduct({ apiConfig, productId, zoneId, currency, signal }) { + return Promise.all([ + fetchRuntime({ apiConfig, productId, signal }), + fetchPriceSystem({ apiConfig, zoneId, currency, signal }), + ]).then(([runtime, priceSystem]) => formatRuntimeProduct(runtime, priceSystem)); } -function fetchRuntime({ productId, signal }) { +/** + * Fetches runtime information for a specific product. + * @async + * @param {Object} options - The options for fetching the runtime. + * @param {ApiConfig} options.apiConfig - The API configuration. + * @param {string} options.productId - The ID of the product. + * @param {AbortSignal} options.signal - The abort signal. + * @returns {Promise} A promise that resolves to the runtime information. + * @throws {Error} Throws an error if the product is not found and is not a runner. + */ +function fetchRuntime({ apiConfig, productId, signal }) { return getAvailableInstances() - .then(sendToApi({ cacheDelay: ONE_DAY, signal })) - .then((allRuntimes) => { - const runtime = allRuntimes.find((f) => f.variant.slug === productId); - if (runtime == null) { - // For now, we have special cases for runners. - // If the API does not return the product, we provided some hard coded ones. - // This is only the list of plans with features, the prices come from the API. - const runnerProduct = getRunnerProduct(productId); - if (runnerProduct != null) { - return runnerProduct; + .then(sendToApi({ apiConfig, cacheDelay: ONE_DAY, signal })) + .then( + /** @param {Array} allRuntimes */ + (allRuntimes) => { + const runtime = allRuntimes.find((f) => f.variant.slug === productId); + if (runtime == null) { + // For now, we have special cases for runners. + // If the API does not return the product, we provided some hard coded ones. + // This is only the list of plans with features, the prices come from the API. + const runnerProduct = getRunnerProduct(productId); + if (runnerProduct != null) { + return runnerProduct; + } + throw new Error(`Unknown variant slug: ${productId}`); } - throw new Error(`Unknown variant slug: ${productId}`); - } - return runtime; - }); + return runtime; + }, + ); } diff --git a/src/components/cc-pricing-product/cc-pricing-product.smart-runtime.md b/src/components/cc-pricing-product/cc-pricing-product.smart-runtime.md index cbc5a0f73..e4108fce0 100644 --- a/src/components/cc-pricing-product/cc-pricing-product.smart-runtime.md +++ b/src/components/cc-pricing-product/cc-pricing-product.smart-runtime.md @@ -14,27 +14,32 @@ title: '💡 Smart (runtime)' ## ⚙️ Params -| Name | Type | Details | Default | -|-------------|-------------|--------------------------------------------------------------------------------------------------|---------| -| `productId` | `string` | Variant slug from [`/v2/products/instances`](https://api.clever-cloud.com/v2/products/instances) | | -| `zoneId` | `string` | Name from [`/v4/products/zones`](https://api.clever-cloud.com/v4/products/zones) | `par` | +| Name | Type | Required | Details | Default | +|-------------|-------------|----------|--------------------------------------------------------------------------------------------------|------------------------------------------------| +| `apiConfig` | `ApiConfig` | Yes | Object with API configuration (target host) | `{ API_HOST: "https://api.clever-cloud.com" }` | +| `currency` | `string` | No | Currency code matching the ISO 4217 format | `EUR` | +| `productId` | `string` | Yes | Variant slug from [`/v2/products/instances`](https://api.clever-cloud.com/v2/products/instances) | | +| `zoneId` | `string` | No | Name from [`/v4/products/zones`](https://api.clever-cloud.com/v4/products/zones) | `par` | ## 🌐 API endpoints -| Method | Type | Cache? | -|--------|:-----------------------------------|--------| -| `GET` | `/v2/products/instances` | 1 day | -| `GET` | `/v4/billing/price-system?zone_id` | 1 day | +| Method | Type | Cache? | +|--------|--------------------------------------------------|--------| +| `GET` | `/v2/products/instances` | 1 day | +| `GET` | `/v4/billing/price-system?zone_id¤cy` | 1 day | ## ⬇️️ Examples ### Simple -Simple example based on default zone. +Simple example based on default zone and default currency. ```html @@ -44,7 +49,10 @@ Simple example based on default zone. ```html @@ -54,7 +62,10 @@ Simple example based on default zone. ```html @@ -68,8 +79,27 @@ NOTE: Prices are the same on all zones right now. ```html + + +``` + +### Currency + +Simple example with custom currency. + +```html + diff --git a/src/components/cc-pricing-product/cc-pricing-product.stories.js b/src/components/cc-pricing-product/cc-pricing-product.stories.js index 705bbf589..dccf720af 100644 --- a/src/components/cc-pricing-product/cc-pricing-product.stories.js +++ b/src/components/cc-pricing-product/cc-pricing-product.stories.js @@ -1,8 +1,26 @@ import { getFullProductAddon } from '../../stories/fixtures/addon-plans.js'; +import { rawPriceSystemDollars } from '../../stories/fixtures/price-system.js'; import { getFullProductRuntime } from '../../stories/fixtures/runtime-plans.js'; import { makeStory, storyWait } from '../../stories/lib/make-story.js'; import './cc-pricing-product.js'; +export default { + tags: ['autodocs'], + title: '🛠 pricing/', + component: 'cc-pricing-product', +}; + +const conf = { + component: 'cc-pricing-product', +}; + +/** + * @typedef {import('./cc-pricing-product.js').CcPricingProduct} CcPricingProduct + * @typedef {import('../common.types.js').Plan} Plan + * @typedef {import('../common.types.js').FormattedFeature} FormattedFeature + */ + +/** @type {Array} */ const addonFeatures = [ 'connection-limit', 'cpu', @@ -18,6 +36,7 @@ const addonFeatures = [ // Feature order is not the same between plans // Some features will be ignored because they are not listed // Some features are missing for some plans +/** @type {Array} */ const fakeProductPlans = [ { name: 'ONE', @@ -77,21 +96,12 @@ const fakeProductPlans = [ }, ]; -export default { - tags: ['autodocs'], - title: '🛠 pricing/', - component: 'cc-pricing-product', -}; - -const conf = { - component: 'cc-pricing-product', -}; - export const defaultStory = makeStory(conf, { + /** @type {Array>} */ items: [ { - product: { - state: 'loaded', + state: { + type: 'loaded', ...getFullProductRuntime('ruby'), }, }, @@ -99,22 +109,26 @@ export const defaultStory = makeStory(conf, { }); export const loading = makeStory(conf, { - items: [{ product: { state: 'loading' } }], + /** @type {Array>} */ + items: [{ state: { type: 'loading' } }], }); export const error = makeStory(conf, { + /** @type {Array>} */ items: [ { - product: { state: 'error' }, + state: { type: 'error' }, }, ], }); export const dataLoadedWithFakeProduct = makeStory(conf, { + /** @type {Array>} */ items: [ { - product: { - state: 'loaded', + action: 'none', + state: { + type: 'loaded', name: 'fake database', plans: fakeProductPlans, productFeatures: [ @@ -131,8 +145,9 @@ export const dataLoadedWithFakeProduct = makeStory(conf, { }, }, { - product: { - state: 'loaded', + action: 'none', + state: { + type: 'loaded', name: 'fake runtime', plans: fakeProductPlans, productFeatures: [ @@ -152,10 +167,11 @@ export const dataLoadedWithFakeProduct = makeStory(conf, { }); export const dataLoadedWithRuntimePhp = makeStory(conf, { + /** @type {Array>} */ items: [ { - product: { - state: 'loaded', + state: { + type: 'loaded', ...getFullProductRuntime('php'), }, }, @@ -163,10 +179,11 @@ export const dataLoadedWithRuntimePhp = makeStory(conf, { }); export const dataLoadedWithRuntimePythonAndMl = makeStory(conf, { + /** @type {Array>} */ items: [ { - product: { - state: 'loaded', + state: { + type: 'loaded', ...getFullProductRuntime('ml_python'), }, }, @@ -174,10 +191,11 @@ export const dataLoadedWithRuntimePythonAndMl = makeStory(conf, { }); export const dataLoadedWithRuntimeNode = makeStory(conf, { + /** @type {Array>} */ items: [ { - product: { - state: 'loaded', + state: { + type: 'loaded', ...getFullProductRuntime('node'), }, }, @@ -185,10 +203,11 @@ export const dataLoadedWithRuntimeNode = makeStory(conf, { }); export const dataLoadedWithAddonElasticsearch = makeStory(conf, { + /** @type {Array>} */ items: [ { - product: { - state: 'loaded', + state: { + type: 'loaded', ...getFullProductAddon('es-addon', addonFeatures), }, }, @@ -196,10 +215,11 @@ export const dataLoadedWithAddonElasticsearch = makeStory(conf, { }); export const dataLoadedWithAddonMongodb = makeStory(conf, { + /** @type {Array>} */ items: [ { - product: { - state: 'loaded', + state: { + type: 'loaded', ...getFullProductAddon('mongodb-addon', addonFeatures), }, }, @@ -207,10 +227,11 @@ export const dataLoadedWithAddonMongodb = makeStory(conf, { }); export const dataLoadedWithAddonMysql = makeStory(conf, { + /** @type {Array>} */ items: [ { - product: { - state: 'loaded', + state: { + type: 'loaded', ...getFullProductAddon('mysql-addon', addonFeatures), }, }, @@ -218,10 +239,11 @@ export const dataLoadedWithAddonMysql = makeStory(conf, { }); export const dataLoadedWithAddonPostgresql = makeStory(conf, { + /** @type {Array>} */ items: [ { - product: { - state: 'loaded', + state: { + type: 'loaded', ...getFullProductAddon('postgresql-addon', addonFeatures), }, }, @@ -229,10 +251,11 @@ export const dataLoadedWithAddonPostgresql = makeStory(conf, { }); export const dataLoadedWithAddonRedis = makeStory(conf, { + /** @type {Array>} */ items: [ { - product: { - state: 'loaded', + state: { + type: 'loaded', ...getFullProductAddon('redis-addon', addonFeatures), }, }, @@ -240,11 +263,12 @@ export const dataLoadedWithAddonRedis = makeStory(conf, { }); export const dataLoadedWithNoAction = makeStory(conf, { + /** @type {Array>} */ items: [ { action: 'none', - product: { - state: 'loaded', + state: { + type: 'loaded', ...getFullProductAddon('postgresql-addon', addonFeatures), }, }, @@ -252,22 +276,24 @@ export const dataLoadedWithNoAction = makeStory(conf, { }); export const dataLoadedWithDollars = makeStory(conf, { + /** @type {Array>} */ items: [ { - currency: { code: 'USD', changeRate: 1.1802 }, - product: { - state: 'loaded', - ...getFullProductAddon('postgresql-addon', addonFeatures), + currency: 'USD', + state: { + type: 'loaded', + ...getFullProductAddon('postgresql-addon', addonFeatures, rawPriceSystemDollars), }, }, ], }); export const dataLoadedWithTemporalitySecond7Digits = makeStory(conf, { + /** @type {Array>} */ items: [ { - product: { - state: 'loaded', + state: { + type: 'loaded', ...getFullProductRuntime('node'), }, temporalities: [{ type: 'second', digits: 7 }], @@ -276,10 +302,11 @@ export const dataLoadedWithTemporalitySecond7Digits = makeStory(conf, { }); export const dataLoadedWithTemporalityMinute5Digits = makeStory(conf, { + /** @type {Array>} */ items: [ { - product: { - state: 'loaded', + state: { + type: 'loaded', ...getFullProductRuntime('node'), }, temporalities: [{ type: 'minute', digits: 5 }], @@ -288,10 +315,11 @@ export const dataLoadedWithTemporalityMinute5Digits = makeStory(conf, { }); export const dataLoadedWithTemporalityHour3Digits = makeStory(conf, { + /** @type {Array>} */ items: [ { - product: { - state: 'loaded', + state: { + type: 'loaded', ...getFullProductRuntime('node'), }, temporalities: [{ type: 'hour', digits: 3 }], @@ -300,10 +328,11 @@ export const dataLoadedWithTemporalityHour3Digits = makeStory(conf, { }); export const dataLoadedWithTemporality1000Minutes2Digits = makeStory(conf, { + /** @type {Array>} */ items: [ { - product: { - state: 'loaded', + state: { + type: 'loaded', ...getFullProductRuntime('node'), }, temporalities: [{ type: '1000-minutes' }], @@ -312,10 +341,11 @@ export const dataLoadedWithTemporality1000Minutes2Digits = makeStory(conf, { }); export const dataLoadedWithTemporalityDay2Digits = makeStory(conf, { + /** @type {Array>} */ items: [ { - product: { - state: 'loaded', + state: { + type: 'loaded', ...getFullProductRuntime('node'), }, temporalities: [{ type: 'day', digits: 2 }], @@ -324,10 +354,11 @@ export const dataLoadedWithTemporalityDay2Digits = makeStory(conf, { }); export const dataLoadedWithTemporality30Days1Digit = makeStory(conf, { + /** @type {Array>} */ items: [ { - product: { - state: 'loaded', + state: { + type: 'loaded', ...getFullProductRuntime('node'), }, temporalities: [{ type: '30-days', digits: 1 }], @@ -336,10 +367,11 @@ export const dataLoadedWithTemporality30Days1Digit = makeStory(conf, { }); export const dataLoadedWithTemporalityAll = makeStory(conf, { + /** @type {Array>} */ items: [ { - product: { - state: 'loaded', + state: { + type: 'loaded', ...getFullProductRuntime('node'), }, temporalities: [ @@ -355,32 +387,42 @@ export const dataLoadedWithTemporalityAll = makeStory(conf, { }); export const simulationWithLoaded = makeStory(conf, { + /** @type {Array>} */ items: [ { - product: { state: 'loading' }, + state: { type: 'loading' }, }, ], simulations: [ - storyWait(2000, ([component]) => { - component.product = { - state: 'loaded', - ...getFullProductRuntime('node'), - }; - }), + storyWait( + 2000, + /** @param {Array} components */ + ([component]) => { + component.state = { + type: 'loaded', + ...getFullProductRuntime('node'), + }; + }, + ), ], }); export const simulationWithError = makeStory(conf, { + /** @type {Array>} */ items: [ { - product: { state: 'loading' }, + state: { type: 'loading' }, }, ], simulations: [ - storyWait(2000, ([component]) => { - component.product = { - state: 'error', - }; - }), + storyWait( + 2000, + /** @param {Array} components */ + ([component]) => { + component.state = { + type: 'error', + }; + }, + ), ], }); diff --git a/src/components/cc-pricing-product/cc-pricing-product.types.d.ts b/src/components/cc-pricing-product/cc-pricing-product.types.d.ts index f81c64d9d..675148fc5 100644 --- a/src/components/cc-pricing-product/cc-pricing-product.types.d.ts +++ b/src/components/cc-pricing-product/cc-pricing-product.types.d.ts @@ -1,16 +1,16 @@ -import { Feature, Plan } from '../common.types.js'; +import { FormattedFeature, Plan } from '../common.types.js'; interface PricingProductStateLoading { - state: 'loading'; + type: 'loading'; } interface PricingProductStateError { - state: 'error'; + type: 'error'; } interface PricingProductStateLoaded { - state: 'loaded'; - productFeatures: Feature[]; + type: 'loaded'; + productFeatures: FormattedFeature[]; name: string; plans: Plan[]; } diff --git a/src/components/common.types.d.ts b/src/components/common.types.d.ts index 31b1dc069..4e5c26f65 100644 --- a/src/components/common.types.d.ts +++ b/src/components/common.types.d.ts @@ -21,11 +21,6 @@ interface AddonPlan { name: string; } -interface AddonProvider { - name: string; - logoUrl: string; -} - export interface Scalability { minFlavor: Flavor; maxFlavor: Flavor; @@ -117,27 +112,34 @@ interface Marker { } interface Plan { - productName: string; + productName?: string; name: string; price: number; // price in euros for 1 hour - features: Feature[]; - quantity: number; + priceId?: string; + features: FormattedFeature[]; + quantity?: number; } -interface Feature { + +export interface FormattedFeature { + // `string & {}` means any string other than the ones listed before. Without this, you get no autocomplete because string and 'toto' overlap. code: | 'connection-limit' | 'cpu' + | 'gpu' + | 'is-migratable' | 'databases' + | 'dedicated' | 'disk-size' - | 'gpu' | 'has-logs' | 'has-metrics' | 'max-db-size' | 'memory' - | 'version'; - type: 'boolean' | 'shared' | 'bytes' | 'number' | 'runtime' | 'string'; - value?: number | string; // Only required for a plan feature + | 'version' + | (string & {}); + // `string & {}` means any string other than the ones listed before. Without this, you get no autocomplete because string and 'toto' overlap. + type: 'boolean' | 'shared' | 'boolean-shared' | 'bytes' | 'number' | 'runtime' | 'number-cpu-runtime' | 'string'; + value?: number | string | { cpu: number; shared: boolean; nice: number }; name?: string; } @@ -247,3 +249,174 @@ export interface NotificationOptions { timeout?: number; closeable?: boolean; } + +// FIXME: this should be provided by the client +export interface Instance { + type: string; + version: string; + name: string; + variant: { + id: string; + slug: string; + name: string; + deployType: string; + logo: string; + }; + description: string; + enabled: boolean; + comingSoon: boolean; + maxInstances: number; + tags: Array; + deployments: Array; + flavors: Array<{ + name: string; + mem: number; + cpus: number; + gpus: number; + disk: number; + price: number; + available: boolean; + microservice: boolean; + machine_learning: boolean; + nice: number; + price_id: string; + memory: { + unit: string; + value: number; + formatted: string; + }; + }>; + defaultFlavor: { + name: string; + mem: number; + cpus: number; + gpus: number; + disk: number; + price: number; + available: boolean; + microservice: boolean; + machine_learning: boolean; + nice: number; + price_id: string; + memory: { + unit: string; + value: number; + formatted: string; + }; + }; + buildFlavor: { + name: string; + mem: number; + cpus: number; + gpus: number; + disk: number; + price: number; + available: boolean; + microservice: boolean; + machine_learning: boolean; + nice: number; + price_id: string; + memory: { + unit: string; + value: number; + formatted: string; + }; + }; +} + +// FIXME: this should be provided by the client +export interface PriceSystem { + id?: string; + owner_id?: string; + start_date: string; + end_date: string; + zone_id: string; + currency: string; + runtime: Array<{ + runtime_policy_id: string; + source: string; + flavor: string; + time_unit: string; + price: number; + slug_id: string; + }>; + countable: Array<{ + countable_policy_id: string; + service: string; + data_unit: string; + data_quantity_for_price: { + secability: string; + quantity: number; + }; + time_interval_for_price: { + secability: string; + interval: string; + }; + first_x_free: number; + price_plans: Array<{ + plan_id: string; + max_quantity: number; + price: number; + }>; + }>; +} + +export type AddonProvider = Pick; + +// FIXME: this should be provided by the client +export interface RawAddonProvider { + id: string; + name: string; + website: string; + supportEmail: string; + googlePlusName: string; + twitterName: string; + analyticsId: string; + shortDesc: string; + longDesc: string; + logoUrl: string; + status: string; + openInNewTab: boolean; + canUpgrade: boolean; + regions: Array; + plans: { + id: string; + name: string; + slug: string; + price: number; + price_id: string; + features: { + name: string; + type: 'BOOLEAN' | 'BOOLEAN_SHARED' | 'NUMBER_CPU_RUNTIME' | 'OBJECT' | 'SHARED' | 'BYTES' | 'NUMBER' | 'STRING'; + value: string; + computable_value: string; + name_code: + | 'connection-limit' + | 'cpu' + | 'databases' + | 'disk-size' + | 'has-logs' + | 'has-metrics' + | 'max-db-size' + | 'memory' + | 'version' + | string; + }[]; + zones: Array; + }[]; + features: { + name: string; + type: 'BOOLEAN' | 'BOOLEAN_SHARED' | 'SHARED' | 'OBJECT' | 'BYTES' | 'NUMBER' | 'RUNTIME' | 'STRING'; + name_code: + | 'connection-limit' + | 'cpu' + | 'databases' + | 'disk-size' + | 'has-logs' + | 'has-metrics' + | 'max-db-size' + | 'memory' + | 'version' + | string; + }[]; +} diff --git a/src/lib/api-helpers.js b/src/lib/api-helpers.js index 3029328fc..058f11ba7 100644 --- a/src/lib/api-helpers.js +++ b/src/lib/api-helpers.js @@ -16,6 +16,7 @@ import { asyncMap } from './utils.js'; /** * @typedef {import('./send-to-api.types.js').ApiConfig} ApiConfig * @typedef {import('../components/common.types.js').Invoice} Invoice + * @typedef {import('./product.js').PriceSystem} PriceSystem */ /** @@ -131,6 +132,7 @@ function getPaymentUrl(ownerId, invoiceNumber) { * GET /v4/billing/price-system * @param {object} params * @param {String} params.zone_id + * @param {String} params.currency */ export function getPriceSystem(params) { // no multipath for /self or /organisations/{id} @@ -138,7 +140,7 @@ export function getPriceSystem(params) { method: 'get', url: `/v4/billing/price-system`, headers: { Accept: 'application/json' }, - queryParams: pickNonNull(params, ['zone_id']), + queryParams: pickNonNull(params, ['zone_id', 'currency']), // no body }); } @@ -146,13 +148,15 @@ export function getPriceSystem(params) { /** * * @param {object} params + * @param {ApiConfig} [params.apiConfig] * @param {AbortSignal} params.signal * @param {string} params.zoneId - * @return {Promise<*>} + * @param {string} params.currency + * @return {Promise} */ -export function fetchPriceSystem({ signal, zoneId }) { +export function fetchPriceSystem({ apiConfig, signal, zoneId, currency }) { // eslint-disable-next-line camelcase - return getPriceSystem({ zone_id: zoneId }).then(sendToApi({ signal, cacheDelay: ONE_DAY })); + return getPriceSystem({ zone_id: zoneId, currency }).then(sendToApi({ apiConfig, signal, cacheDelay: ONE_DAY })); } // TODO: move to clever-client diff --git a/src/lib/product.js b/src/lib/product.js index 6a0fe79ca..8b4b79492 100644 --- a/src/lib/product.js +++ b/src/lib/product.js @@ -1,3 +1,21 @@ +/** + * @typedef {import('../components/common.types.js').AddonProvider} AddonProvider + * @typedef {import('../components/common.types.js').RawAddonProvider} RawAddonProvider + * @typedef {import('../components/common.types.js').PriceSystem} PriceSystem + * @typedef {import('../components/common.types.js').FormattedFeature} FormattedFeature + * @typedef {import('../components/common.types.js').Plan} Plan + * @typedef {import('../components/common.types.js').Instance} Instance + * @typedef {import('../components/cc-pricing-product/cc-pricing-product.types.js').PricingProductStateLoaded} PricingProductStateLoaded + */ + +/** + * Formats an add-on product with its features and plans. + * + * @param {RawAddonProvider} addonProvider + * @param {PriceSystem} priceSystem + * @param {Array} selectedFeatures + * @returns {Omit} + */ export function formatAddonProduct(addonProvider, priceSystem, selectedFeatures) { // We filter out add-ons that are not attached to any zone. This is sometimes done on dev plans to disable them. const addonPlansWithZones = addonProvider.plans.filter((plan) => plan.zones.length > 0); @@ -103,6 +121,13 @@ function formatProductConsumptionIntervals(priceSystem, serviceName) { return { secability, intervals }; } +/** + * Formats add-on features based on provider features and selected features. + * + * @param {RawAddonProvider['features']|RawAddonProvider['plans'][number]['features']} providerFeatures - Array of provider feature objects. + * @param {Array} [selectedFeatures] - Array of selected feature codes. + * @returns {Array} Formatted addon features. + */ function formatAddonFeatures(providerFeatures, selectedFeatures) { // If selectedFeatures is not specified, we just use the features as is const featureCodes = @@ -116,29 +141,49 @@ function formatAddonFeatures(providerFeatures, selectedFeatures) { }) .filter((feature) => feature != null) .map((feature) => { - return { + /** @type {FormattedFeature} */ + const formattedFeature = { code: feature.name_code, - type: feature.type.toLowerCase(), - // Only used when we format plan features + type: /** @type {FormattedFeature['type']} */ (feature.type.toLowerCase()), + // @ts-ignore Only used when we format plan features value: feature.computable_value ?? '', name: feature.name, }; + + return formattedFeature; }); } +/** + * Formats add-on plans based on provided plans, price system, and selected features. + * + * @param {RawAddonProvider['plans']} allPlans - Array of all available plans. + * @param {PriceSystem} priceSystem - The price system object containing pricing information. + * @param {Array} selectedFeatures - Array of selected feature codes. + * @returns {Pick[]} Formatted add-on plans with name, price, and features. + */ function formatAddonPlans(allPlans, priceSystem, selectedFeatures) { return allPlans.map((plan) => { const priceItem = priceSystem.runtime.find( (runtime) => runtime.slug_id.toLowerCase() === plan.price_id.toLowerCase(), ); + return { name: plan.name, price: priceItem?.price ?? 0, features: formatAddonFeatures(plan.features, selectedFeatures), + priceId: priceItem?.slug_id, }; }); } +/** + * Formats a runtime product with its features and plans. + * + * @param {Instance} runtime - The runtime object containing variant and flavors information. + * @param {PriceSystem} priceSystem - The price system object containing pricing information. + * @returns {Omit} Formatted runtime product with name, features, and plans. + */ export function formatRuntimeProduct(runtime, priceSystem) { const features = formatRuntimeFeatures(runtime); return { @@ -148,7 +193,14 @@ export function formatRuntimeProduct(runtime, priceSystem) { }; } +/** + * Formats runtime features based on the provided runtime object. + * + * @param {Instance} runtime - The runtime object containing variant information. + * @returns {Array} An array of feature objects with code and type properties. + */ function formatRuntimeFeatures(runtime) { + /** @type {Array} */ const features = [ { code: 'cpu', type: 'number-cpu-runtime' }, { code: 'memory', type: 'bytes' }, @@ -159,6 +211,14 @@ function formatRuntimeFeatures(runtime) { return features; } +/** + * Formats runtime plans based on the provided flavors, price system, and features. + * + * @param {Instance['flavors']} allFlavors - Array of all available flavors. + * @param {PriceSystem} priceSystem - The price system object containing pricing information. + * @param {Array} features - Array of formatted features. + * @returns {Pick[]} Formatted runtime plans with name, price, and features. + */ function formatRuntimePlans(allFlavors, priceSystem, features) { return allFlavors.map((flavor) => { const priceItem = priceSystem.runtime.find( @@ -168,19 +228,32 @@ function formatRuntimePlans(allFlavors, priceSystem, features) { name: flavor.name, price: priceItem?.price ?? 0, features: formatRuntimeFeatureValues(features, flavor), + priceId: priceItem.slug_id, }; }); } +/** + * Formats runtime feature values based on the provided features and flavor. + * + * @param {Array} allFeatures - Array of all formatted features. + * @param {Instance['flavors'][number]} flavor - The flavor object containing feature values. + * @returns {Array} An array of feature objects with added value property. + */ function formatRuntimeFeatureValues(allFeatures, flavor) { - return allFeatures.map((feature) => { - return { - ...feature, - value: getRuntimeFeatureValue(feature.code, flavor), - }; - }); + return allFeatures.map((feature) => ({ + ...feature, + value: getRuntimeFeatureValue(feature.code, flavor), + })); } +/** + * Gets the runtime feature value based on the feature code and flavor. + * + * @param {FormattedFeature['code']} featureCode - The code of the feature to get the value for. + * @param {Instance['flavors'][number]} flavor - The flavor object containing feature details. + * @returns {FormattedFeature['value']} The feature value based on the feature code. + */ function getRuntimeFeatureValue(featureCode, flavor) { switch (featureCode) { case 'cpu': @@ -193,10 +266,19 @@ function getRuntimeFeatureValue(featureCode, flavor) { return flavor.memory.value; case 'gpu': return flavor.gpus; + default: + return null; } } +/** + * Returns a runner product based on the provided product ID. + * + * @param {string} productId - The ID of the product to retrieve ('jenkins-runner' or 'heptapod-runner'). + * @returns {Partial|void} The runner product object if a valid product ID is provided, undefined otherwise. + */ export function getRunnerProduct(productId) { + /** @type {Partial} */ const baseProduct = { type: 'docker', // Fake date @@ -261,6 +343,17 @@ export function getRunnerProduct(productId) { } } +/** + * Generates a runner flavor object with the specified parameters. + * + * @param {string} prefix - The prefix for the price_id. + * @param {string} name - The name of the flavor. + * @param {number} cpus - The number of CPUs for the flavor. + * @param {number} memory - The amount of memory in GB for the flavor. + * @param {boolean} [microservice=false] - Whether the flavor is a microservice. + * @param {number} [nice=0] - The nice value for the flavor. + * @returns {Instance['flavors'][number]} The runner flavor object. + */ function getRunnerFlavor(prefix, name, cpus, memory, microservice = false, nice = 0) { return { name, diff --git a/src/stories/fixtures/addon-plans.js b/src/stories/fixtures/addon-plans.js index 3a47e6d3f..6851b8584 100644 --- a/src/stories/fixtures/addon-plans.js +++ b/src/stories/fixtures/addon-plans.js @@ -1,8 +1,16 @@ import { formatAddonProduct } from '../../lib/product.js'; -import { rawPriceSystem } from './price-system.js'; +import { rawPriceSystemEuro } from './price-system.js'; -/* eslint-disable quote-props */ -const rawAddonProviders = [ +/** + * @typedef {import('../../components/common.types.js').FormattedFeature} FormattedFeature + * @typedef {import('../../components/common.types.js').RawAddonProvider} RawAddonProvider + * @typedef {import('../../components/common.types.js').PriceSystem} PriceSystem + */ + +/* prettier-ignore */ +/* eslint-disable quote-props, camelcase */ +/** @satisfies {Array} */ +const rawAddonProviders = /** @type {const} */ ([ { 'id': 'cellar-addon', 'name': 'Cellar S3 storage', @@ -6886,15 +6894,24 @@ const rawAddonProviders = [ }, ], }, -]; -/* eslint-enable quote-props */ +]); +/* eslint-enable quote-props, camelcase */ -export function getFullProductAddon (addonProviderId, addonFeatures) { +/** + * @param {typeof rawAddonProviders[number]['id']} addonProviderId + * @param {Array} [addonFeatures] + * @param {PriceSystem} [rawPriceSystem] (default: rawPriceSystemEuro) + */ +export function getFullProductAddon(addonProviderId, addonFeatures, rawPriceSystem = rawPriceSystemEuro) { const rawAddonProvider = rawAddonProviders.find((addonProvider) => addonProvider.id === addonProviderId); return formatAddonProduct(rawAddonProvider, rawPriceSystem, addonFeatures); } -export function getProductAddon (addonProviderId) { - const { plans, productFeatures } = getFullProductAddon(addonProviderId); +/** + * @param {typeof rawAddonProviders[number]['id']} addonProviderId + * @param {PriceSystem} [rawPriceSystem] (default: rawPriceSystemEuro) + */ +export function getProductAddon(addonProviderId, rawPriceSystem = rawPriceSystemEuro) { + const { plans, productFeatures } = getFullProductAddon(addonProviderId, null, rawPriceSystem); return { plans, productFeatures }; } diff --git a/src/stories/fixtures/price-system.js b/src/stories/fixtures/price-system.js index 32b220b34..c4113b666 100644 --- a/src/stories/fixtures/price-system.js +++ b/src/stories/fixtures/price-system.js @@ -1,5 +1,10 @@ -/* eslint-disable quote-props */ -export const rawPriceSystem = { +/* eslint-disable */ +/** + * @typedef {import("../../components/common.types.js").PriceSystem} PriceSystem + */ + +/** @type {PriceSystem} */ +export const rawPriceSystemEuro = { 'id': '00000000-0000-4000-0000-000000000000', 'owner_id': null, 'zone_id': null, @@ -1696,5 +1701,2044 @@ export const rawPriceSystem = { ], }, ], - 'runtime_options': [], }; + + +/** @type {PriceSystem} */ +export const rawPriceSystemDollars = { + "zone_id" : "par", + "currency" : "USD", + "start_date": null, + "end_date": null, + "runtime" : [ + { + "runtime_policy_id" : "35f60502-1c42-4a32-a877-02ed89f7a813", + "source" : "adc", + "flavor" : "custom_adc_0e77c36b-b1e2-456b-afce-0e361a6e2d60", + "time_unit" : "PT1H", + "price" : 0E-20, + "slug_id" : "adc.custom_adc_0e77c36b-b1e2-456b-afce-0e361a6e2d60" + }, + { + "runtime_policy_id" : "25964eec-f27a-4ec4-b8a2-0cfc52de803f", + "source" : "adc", + "flavor" : "custom_adc_2bc56d14-3fb8-471d-a502-982c1ad48269", + "time_unit" : "PT1H", + "price" : 0E-20, + "slug_id" : "adc.custom_adc_2bc56d14-3fb8-471d-a502-982c1ad48269" + }, + { + "runtime_policy_id" : "0f42e385-2446-4671-9e7b-360f2efb3800", + "source" : "adc", + "flavor" : "custom_adc_552485cc-d41f-42a7-8b88-d762e04b7e69", + "time_unit" : "PT1H", + "price" : 0E-20, + "slug_id" : "adc.custom_adc_552485cc-d41f-42a7-8b88-d762e04b7e69" + }, + { + "runtime_policy_id" : "1e492ec5-5cd3-4fe2-bb33-3e76077a6e62", + "source" : "adc", + "flavor" : "custom_adc_581b5fe3-4900-460d-8c73-a2928870ee79", + "time_unit" : "PT1H", + "price" : 0E-20, + "slug_id" : "adc.custom_adc_581b5fe3-4900-460d-8c73-a2928870ee79" + }, + { + "runtime_policy_id" : "72df5a85-fee4-4e0d-9ff3-b8cd826d5761", + "source" : "adc", + "flavor" : "custom_adc_62ab89c8-c637-4713-a35f-eb79c719c536", + "time_unit" : "PT1H", + "price" : 0E-20, + "slug_id" : "adc.custom_adc_62ab89c8-c637-4713-a35f-eb79c719c536" + }, + { + "runtime_policy_id" : "15d0a007-72d1-4dab-ba79-cd0a6605b3d2", + "source" : "adc", + "flavor" : "custom_adc_691e2d06-434b-4ffe-b433-b20a165f1ebd", + "time_unit" : "PT1H", + "price" : 0E-20, + "slug_id" : "adc.custom_adc_691e2d06-434b-4ffe-b433-b20a165f1ebd" + }, + { + "runtime_policy_id" : "c626ee70-7ca5-4fa3-87dc-a87faacccdea", + "source" : "adc", + "flavor" : "custom_adc_6c5ff02e-8d75-4f71-9313-18b2406849d2", + "time_unit" : "PT1H", + "price" : 0E-20, + "slug_id" : "adc.custom_adc_6c5ff02e-8d75-4f71-9313-18b2406849d2" + }, + { + "runtime_policy_id" : "62b97a8a-dc44-40fa-9794-58e2e48bed58", + "source" : "adc", + "flavor" : "custom_adc_755cca66-fa5d-4bff-b3f2-e341bfc805d0", + "time_unit" : "PT1H", + "price" : 0E-20, + "slug_id" : "adc.custom_adc_755cca66-fa5d-4bff-b3f2-e341bfc805d0" + }, + { + "runtime_policy_id" : "3fa5cec3-f776-40b1-9e79-8d08b6808beb", + "source" : "adc", + "flavor" : "custom_adc_77e3c852-f365-44df-b799-8da62e3c601a", + "time_unit" : "PT1H", + "price" : 0E-20, + "slug_id" : "adc.custom_adc_77e3c852-f365-44df-b799-8da62e3c601a" + }, + { + "runtime_policy_id" : "ec3653b5-a3be-4113-97f9-9b6a4c2b97e5", + "source" : "adc", + "flavor" : "custom_adc_79d644cf-8704-4332-a550-7067c7b4e4d8", + "time_unit" : "PT1H", + "price" : 0E-20, + "slug_id" : "adc.custom_adc_79d644cf-8704-4332-a550-7067c7b4e4d8" + }, + { + "runtime_policy_id" : "49e1ee48-fbcc-4c9b-95bd-9b4c76334193", + "source" : "adc", + "flavor" : "custom_adc_7c5ee008-7c90-4f54-bc39-e4c6c01f6528", + "time_unit" : "PT1H", + "price" : 0E-20, + "slug_id" : "adc.custom_adc_7c5ee008-7c90-4f54-bc39-e4c6c01f6528" + }, + { + "runtime_policy_id" : "5db5eec8-454e-4873-aa6d-cf5a49fe86e0", + "source" : "adc", + "flavor" : "custom_adc_7c7145d1-c756-4fb8-9a05-fa742678dd09", + "time_unit" : "PT1H", + "price" : 0E-20, + "slug_id" : "adc.custom_adc_7c7145d1-c756-4fb8-9a05-fa742678dd09" + }, + { + "runtime_policy_id" : "5eb6a72d-d146-4094-9653-96b25b393af3", + "source" : "adc", + "flavor" : "custom_adc_85053cd6-aecf-4cc0-935c-4d000545354c", + "time_unit" : "PT1H", + "price" : 0E-20, + "slug_id" : "adc.custom_adc_85053cd6-aecf-4cc0-935c-4d000545354c" + }, + { + "runtime_policy_id" : "ce3262e9-9f54-458e-abd6-22e025dec84d", + "source" : "adc", + "flavor" : "custom_adc_8963bd27-6733-405d-b0b1-75fed5a6e620", + "time_unit" : "PT1H", + "price" : 0E-20, + "slug_id" : "adc.custom_adc_8963bd27-6733-405d-b0b1-75fed5a6e620" + }, + { + "runtime_policy_id" : "dd7880ee-ba59-4582-b010-2c6754561dcd", + "source" : "adc", + "flavor" : "custom_adc_90b76988-9a99-4238-9ffe-788c7b438d1f", + "time_unit" : "PT1H", + "price" : 0E-20, + "slug_id" : "adc.custom_adc_90b76988-9a99-4238-9ffe-788c7b438d1f" + }, + { + "runtime_policy_id" : "edf3128d-7fae-4e36-b764-66e2a4cf4a8c", + "source" : "adc", + "flavor" : "custom_adc_9421ab39-5f54-4577-a87e-8a6067cedd2f", + "time_unit" : "PT1H", + "price" : 0E-20, + "slug_id" : "adc.custom_adc_9421ab39-5f54-4577-a87e-8a6067cedd2f" + }, + { + "runtime_policy_id" : "1eede8fc-77d3-4193-9fda-dbbb4a62b728", + "source" : "adc", + "flavor" : "custom_adc_b14da9e0-2485-49ee-9592-d36d6a141051", + "time_unit" : "PT1H", + "price" : 0E-20, + "slug_id" : "adc.custom_adc_b14da9e0-2485-49ee-9592-d36d6a141051" + }, + { + "runtime_policy_id" : "155ab0a1-2a0c-4226-bf4f-94774cdea36d", + "source" : "adc", + "flavor" : "custom_adc_b2ce4b62-aeab-4709-a5c7-41a63f351fdc", + "time_unit" : "PT1H", + "price" : 0E-20, + "slug_id" : "adc.custom_adc_b2ce4b62-aeab-4709-a5c7-41a63f351fdc" + }, + { + "runtime_policy_id" : "ce38163b-e5f5-4ced-a85d-c6e25ffa8531", + "source" : "adc", + "flavor" : "custom_adc_c8a6a778-392f-456a-82e5-cf69cef06554", + "time_unit" : "PT1H", + "price" : 0E-20, + "slug_id" : "adc.custom_adc_c8a6a778-392f-456a-82e5-cf69cef06554" + }, + { + "runtime_policy_id" : "89db7079-b662-4d15-ae74-fd807a66d8c3", + "source" : "adc", + "flavor" : "custom_adc_cf05ef1e-ee96-4d20-8e70-9ddc5ba861a7", + "time_unit" : "PT1H", + "price" : 0E-20, + "slug_id" : "adc.custom_adc_cf05ef1e-ee96-4d20-8e70-9ddc5ba861a7" + }, + { + "runtime_policy_id" : "76f56e81-f943-435d-8e6a-4ad48a081932", + "source" : "adc", + "flavor" : "custom_adc_da70c817-1eaa-4503-82d3-1678dea0824c", + "time_unit" : "PT1H", + "price" : 0E-20, + "slug_id" : "adc.custom_adc_da70c817-1eaa-4503-82d3-1678dea0824c" + }, + { + "runtime_policy_id" : "4c78a945-cb9f-4c50-aa7c-e907cd3205f8", + "source" : "adc", + "flavor" : "custom_adc_f0930b81-04b0-4e89-adbb-5f70e3eb9666", + "time_unit" : "PT1H", + "price" : 0E-20, + "slug_id" : "adc.custom_adc_f0930b81-04b0-4e89-adbb-5f70e3eb9666" + }, + { + "runtime_policy_id" : "ef81ff87-1680-45f0-a0bb-7590fcc7a468", + "source" : "adc", + "flavor" : "custom_adc_f096ff8b-f0e9-44d6-91c7-a201248080ce", + "time_unit" : "PT1H", + "price" : 0E-20, + "slug_id" : "adc.custom_adc_f096ff8b-f0e9-44d6-91c7-a201248080ce" + }, + { + "runtime_policy_id" : "8f993167-c14f-43ec-afa0-100e61f277ae", + "source" : "adc", + "flavor" : "custom_adc_f0c2e11c-8129-449b-93f3-4e78d3addcd6", + "time_unit" : "PT1H", + "price" : 0E-20, + "slug_id" : "adc.custom_adc_f0c2e11c-8129-449b-93f3-4e78d3addcd6" + }, + { + "runtime_policy_id" : "4c9d0033-c513-4efa-bbca-02bafdd3000f", + "source" : "adc", + "flavor" : "custom_adc_fb7dd069-641e-4eda-9686-f73a36f6f607", + "time_unit" : "PT1H", + "price" : 0E-20, + "slug_id" : "adc.custom_adc_fb7dd069-641e-4eda-9686-f73a36f6f607" + }, + { + "runtime_policy_id" : "6b9a90b8-76ae-4073-bb7a-f4731a7b2496", + "source" : "apps", + "flavor" : "2xl", + "time_unit" : "PT1H", + "price" : 1.00000000000000000000, + "slug_id" : "apps.2XL" + }, + { + "runtime_policy_id" : "30a19a82-2ade-4c58-b02a-5d4ae423a56e", + "source" : "apps", + "flavor" : "3xl", + "time_unit" : "PT1H", + "price" : 1.33333333333333000000, + "slug_id" : "apps.3XL" + }, + { + "runtime_policy_id" : "0df5b3c9-3d84-42c8-a792-005c11962ac8", + "source" : "apps", + "flavor" : "heptapod-runner-2xl", + "time_unit" : "PT1H", + "price" : 2.75000000000000000000, + "slug_id" : "heptapod-runner.2XL" + }, + { + "runtime_policy_id" : "ee1ca444-1c87-4ea6-bcd3-3bf062a14ed8", + "source" : "apps", + "flavor" : "heptapod-runner-3xl", + "time_unit" : "PT1H", + "price" : 4.00000000000000000000, + "slug_id" : "heptapod-runner.3XL" + }, + { + "runtime_policy_id" : "180cc859-453c-4fbb-85c5-9246904e4354", + "source" : "apps", + "flavor" : "heptapod-runner-l", + "time_unit" : "PT1H", + "price" : 1.25000000000000000000, + "slug_id" : "heptapod-runner.L" + }, + { + "runtime_policy_id" : "5768b2ba-fdf4-4a1b-9704-61cca8f15c86", + "source" : "apps", + "flavor" : "heptapod-runner-m", + "time_unit" : "PT1H", + "price" : 0.83333333333333300000, + "slug_id" : "heptapod-runner.M" + }, + { + "runtime_policy_id" : "ac1e2731-7f34-4ff8-89bd-379274f70169", + "source" : "apps", + "flavor" : "heptapod-runner-s", + "time_unit" : "PT1H", + "price" : 0.41666666666666700000, + "slug_id" : "heptapod-runner.S" + }, + { + "runtime_policy_id" : "f1899ce6-ef51-4cf9-b4f2-da5257733827", + "source" : "apps", + "flavor" : "heptapod-runner-xl", + "time_unit" : "PT1H", + "price" : 1.66666666666667000000, + "slug_id" : "heptapod-runner.XL" + }, + { + "runtime_policy_id" : "b16bb6a2-9293-4d3a-9161-62c065f7ad71", + "source" : "apps", + "flavor" : "heptapod-runner-xs", + "time_unit" : "PT1H", + "price" : 0.16666666666666700000, + "slug_id" : "heptapod-runner.XS" + }, + { + "runtime_policy_id" : "c0c7c4b5-6957-4dba-a127-7a93550665c1", + "source" : "apps", + "flavor" : "jenkins-runner-2xl", + "time_unit" : "PT1H", + "price" : 2.75000000000000000000, + "slug_id" : "jenkins-runner.2XL" + }, + { + "runtime_policy_id" : "e848845b-a9b9-492b-91db-dabe2751bd82", + "source" : "apps", + "flavor" : "jenkins-runner-3xl", + "time_unit" : "PT1H", + "price" : 4.00000000000000000000, + "slug_id" : "jenkins-runner.3XL" + }, + { + "runtime_policy_id" : "342a2c78-28f1-40a6-9f66-acc76aa0670a", + "source" : "apps", + "flavor" : "jenkins-runner-l", + "time_unit" : "PT1H", + "price" : 1.25000000000000000000, + "slug_id" : "jenkins-runner.L" + }, + { + "runtime_policy_id" : "592fb889-b149-4986-8c5e-bdcdcf542274", + "source" : "apps", + "flavor" : "jenkins-runner-m", + "time_unit" : "PT1H", + "price" : 0.83333333333333300000, + "slug_id" : "jenkins-runner.M" + }, + { + "runtime_policy_id" : "c8c41d5d-f092-46e7-a50e-b1b524c4b26b", + "source" : "apps", + "flavor" : "jenkins-runner-s", + "time_unit" : "PT1H", + "price" : 0.41666666666666700000, + "slug_id" : "jenkins-runner.S" + }, + { + "runtime_policy_id" : "476792e6-67af-471e-a839-973817a19196", + "source" : "apps", + "flavor" : "jenkins-runner-xl", + "time_unit" : "PT1H", + "price" : 1.66666666666667000000, + "slug_id" : "jenkins-runner.XL" + }, + { + "runtime_policy_id" : "ecb79948-04f9-441d-8018-f104ca960121", + "source" : "apps", + "flavor" : "jenkins-runner-xs", + "time_unit" : "PT1H", + "price" : 0.16666666666666700000, + "slug_id" : "jenkins-runner.XS" + }, + { + "runtime_policy_id" : "b79da4de-2fc2-44a7-bac7-b3ad3b13dccc", + "source" : "apps", + "flavor" : "l", + "time_unit" : "PT1H", + "price" : 0.31666666666666700000, + "slug_id" : "apps.L" + }, + { + "runtime_policy_id" : "13b2a1a5-ade9-4486-8a40-ed3480baf737", + "source" : "apps", + "flavor" : "m", + "time_unit" : "PT1H", + "price" : 0.15833333333333300000, + "slug_id" : "apps.M" + }, + { + "runtime_policy_id" : "d619f928-c72e-4ea7-8ea1-3df0f6fc32a3", + "source" : "apps", + "flavor" : "ml_2xl", + "time_unit" : "PT1H", + "price" : 2.18747610000000000000, + "slug_id" : "apps.ML_2XL" + }, + { + "runtime_policy_id" : "625fbb13-8f20-4d04-8e94-e0bc39f2b24c", + "source" : "apps", + "flavor" : "ml_3xl", + "time_unit" : "PT1H", + "price" : 2.50001010000000000000, + "slug_id" : "apps.ML_3XL" + }, + { + "runtime_policy_id" : "40aaa012-fbbc-4ed9-a2fe-f0c4440d7c04", + "source" : "apps", + "flavor" : "ml_l", + "time_unit" : "PT1H", + "price" : 1.56249540000000000000, + "slug_id" : "apps.ML_L" + }, + { + "runtime_policy_id" : "e76eb617-8b72-48f2-b258-963f6af99cd8", + "source" : "apps", + "flavor" : "ml_m", + "time_unit" : "PT1H", + "price" : 1.24996140000000000000, + "slug_id" : "apps.ML_M" + }, + { + "runtime_policy_id" : "62fc27e6-46ec-4831-8ce9-f52650cd058a", + "source" : "apps", + "flavor" : "ml_s", + "time_unit" : "PT1H", + "price" : 0.93751470000000000000, + "slug_id" : "apps.ML_S" + }, + { + "runtime_policy_id" : "19801a9b-0ee8-4629-8fe7-23295c799e9f", + "source" : "apps", + "flavor" : "ml_xl", + "time_unit" : "PT1H", + "price" : 1.87502940000000000000, + "slug_id" : "apps.ML_XL" + }, + { + "runtime_policy_id" : "e18f1c0b-0d2f-4cff-ad41-c73e21d5b092", + "source" : "apps", + "flavor" : "ml_xs", + "time_unit" : "PT1H", + "price" : 0.62498070000000000000, + "slug_id" : "apps.ML_XS" + }, + { + "runtime_policy_id" : "0defdd17-f505-49d3-8208-e691519e52c5", + "source" : "apps", + "flavor" : "ml_xxl", + "time_unit" : "PT1H", + "price" : 2.18747610000000000000, + "slug_id" : "apps.ML_XXL" + }, + { + "runtime_policy_id" : "8269fbdc-cf6a-4af2-b7d4-eaf9f4874903", + "source" : "apps", + "flavor" : "nano", + "time_unit" : "PT1H", + "price" : 0.01249999999695000000, + "slug_id" : "apps.nano" + }, + { + "runtime_policy_id" : "7849eb0f-ef18-45af-9d4a-cec5d0a496aa", + "source" : "apps", + "flavor" : "pico", + "time_unit" : "PT1H", + "price" : 0.00937500000426000000, + "slug_id" : "apps.pico" + }, + { + "runtime_policy_id" : "e4324897-afbd-41a4-aadd-bbf5d3fcc19b", + "source" : "apps", + "flavor" : "s", + "time_unit" : "PT1H", + "price" : 0.06666666666666670000, + "slug_id" : "apps.S" + }, + { + "runtime_policy_id" : "96522f28-c58c-46a0-b5e2-aef7da99fdb0", + "source" : "apps", + "flavor" : "solo", + "time_unit" : "PT1H", + "price" : 0.02999628000000000000, + "slug_id" : "apps.Solo" + }, + { + "runtime_policy_id" : "14112a30-fc95-4805-9900-d88ccf3298d0", + "source" : "apps", + "flavor" : "xl", + "time_unit" : "PT1H", + "price" : 0.63333333333333300000, + "slug_id" : "apps.XL" + }, + { + "runtime_policy_id" : "e85b2fdb-9533-4c06-b090-36094319e5cc", + "source" : "apps", + "flavor" : "xs", + "time_unit" : "PT1H", + "price" : 0.03333333333333330000, + "slug_id" : "apps.XS" + }, + { + "runtime_policy_id" : "6fbeaff9-18a9-4a44-882b-617ef7676b17", + "source" : "elasticsearch", + "flavor" : "3xl", + "time_unit" : "PT1H", + "price" : 2.66666666666667000000, + "slug_id" : "elasticsearch.3XL" + }, + { + "runtime_policy_id" : "088aa0ce-a9f4-46fe-87a9-9e6dfd4137d6", + "source" : "elasticsearch", + "flavor" : "4xl", + "time_unit" : "PT1H", + "price" : 5.33333333333333000000, + "slug_id" : "elasticsearch.4XL" + }, + { + "runtime_policy_id" : "4ed4b0a2-6a2d-4bdf-b770-98a2b59d000e", + "source" : "elasticsearch", + "flavor" : "5xl", + "time_unit" : "PT1H", + "price" : 10.66666666666670000000, + "slug_id" : "elasticsearch.5XL" + }, + { + "runtime_policy_id" : "9fa58ecb-f911-42aa-8c6f-91b94d3d300f", + "source" : "elasticsearch", + "flavor" : "antman", + "time_unit" : "PT1H", + "price" : 0.02291666666666670000, + "slug_id" : "elasticsearch.ANTMAN" + }, + { + "runtime_policy_id" : "7bdbeee8-3816-4b8e-b22f-c891b67ac97f", + "source" : "elasticsearch", + "flavor" : "blackwidow", + "time_unit" : "PT1H", + "price" : 0.12500000000000000000, + "slug_id" : "elasticsearch.BLACKWIDOW" + }, + { + "runtime_policy_id" : "3391e390-5d2d-4588-bddf-fd21bbaaaf8b", + "source" : "elasticsearch", + "flavor" : "custom_elasticsearch_038ec851-c234-4935-8ab5-983cdb5a78ff", + "time_unit" : "PT1H", + "price" : 0.02916666666666670000, + "slug_id" : "elasticsearch.custom_elasticsearch_038ec851-c234-4935-8ab5-983cdb5a78ff" + }, + { + "runtime_policy_id" : "df9ace67-dd90-4872-bd9e-7db53525052e", + "source" : "elasticsearch", + "flavor" : "fst", + "time_unit" : "PT1H", + "price" : 0.25000000000000000000, + "slug_id" : "elasticsearch.FST" + }, + { + "runtime_policy_id" : "453c22c1-552d-43e2-902d-f0639f7743f6", + "source" : "elasticsearch", + "flavor" : "hulk", + "time_unit" : "PT1H", + "price" : 0.27083333333333400000, + "slug_id" : "elasticsearch.HULK" + }, + { + "runtime_policy_id" : "eb805aa9-f041-41a1-a480-4d18ebb011f5", + "source" : "elasticsearch", + "flavor" : "l", + "time_unit" : "PT1H", + "price" : 0.33333333333333300000, + "slug_id" : "elasticsearch.L" + }, + { + "runtime_policy_id" : "eebd1bf3-606a-477d-931d-bb8edd2e4363", + "source" : "elasticsearch", + "flavor" : "m", + "time_unit" : "PT1H", + "price" : 0.16666666666666700000, + "slug_id" : "elasticsearch.M" + }, + { + "runtime_policy_id" : "72d83389-1973-4e36-ad49-e8a33810fbbf", + "source" : "elasticsearch", + "flavor" : "psylocke", + "time_unit" : "PT1H", + "price" : 0.37500000000000000000, + "slug_id" : "elasticsearch.PSYLOCKE" + }, + { + "runtime_policy_id" : "e7cef3f0-5af5-4076-ab7f-5cff7678516e", + "source" : "elasticsearch", + "flavor" : "rocketraccoon", + "time_unit" : "PT1H", + "price" : 0.07812499500000000000, + "slug_id" : "elasticsearch.ROCKETRACCOON" + }, + { + "runtime_policy_id" : "0194837a-46e6-4293-a8d8-06155e3f8a96", + "source" : "elasticsearch", + "flavor" : "s", + "time_unit" : "PT1H", + "price" : 0.08125000000000000000, + "slug_id" : "elasticsearch.S" + }, + { + "runtime_policy_id" : "851c9237-b1da-4531-a14d-c05b28071d65", + "source" : "elasticsearch", + "flavor" : "storm", + "time_unit" : "PT1H", + "price" : 0.16666666666666600000, + "slug_id" : "elasticsearch.STORM" + }, + { + "runtime_policy_id" : "685d25ab-92ba-4ae4-87c4-0a70b10d93ac", + "source" : "elasticsearch", + "flavor" : "thing", + "time_unit" : "PT1H", + "price" : 0.58333333333333300000, + "slug_id" : "elasticsearch.THING" + }, + { + "runtime_policy_id" : "27032c93-1613-4e6d-a27a-380d35340403", + "source" : "elasticsearch", + "flavor" : "xl", + "time_unit" : "PT1H", + "price" : 0.66666666666666700000, + "slug_id" : "elasticsearch.XL" + }, + { + "runtime_policy_id" : "7d6d7778-516e-4277-98b7-c67ffe8044ce", + "source" : "elasticsearch", + "flavor" : "xs", + "time_unit" : "PT1H", + "price" : 0.03958333333333330000, + "slug_id" : "elasticsearch.XS" + }, + { + "runtime_policy_id" : "349263d4-5bed-4f90-a629-7df249ba4bae", + "source" : "elasticsearch", + "flavor" : "xxl", + "time_unit" : "PT1H", + "price" : 1.33333333333333000000, + "slug_id" : "elasticsearch.XXL" + }, + { + "runtime_policy_id" : "bec0dee0-8cc4-4f1c-813b-ee83030e7e05", + "source" : "elasticsearch", + "flavor" : "xxxl", + "time_unit" : "PT1H", + "price" : 2.66666666666667000000, + "slug_id" : "elasticsearch.XXXL" + }, + { + "runtime_policy_id" : "988d961f-7727-4bd5-baf9-1ad540e0c4bb", + "source" : "es", + "flavor" : "3xl", + "time_unit" : "PT1H", + "price" : 2.66666666666665000000, + "slug_id" : "es.3XL" + }, + { + "runtime_policy_id" : "419784ce-e4ba-4292-a27e-100271bf6773", + "source" : "es", + "flavor" : "4xl", + "time_unit" : "PT1H", + "price" : 5.33333333333333000000, + "slug_id" : "es.4XL" + }, + { + "runtime_policy_id" : "db352e98-5a82-4a58-88df-68e2fc7d69ce", + "source" : "es", + "flavor" : "5xl", + "time_unit" : "PT1H", + "price" : 10.66666666666670000000, + "slug_id" : "es.5XL" + }, + { + "runtime_policy_id" : "181d688e-16a6-4c2e-82e2-4bbf1340560e", + "source" : "es", + "flavor" : "l", + "time_unit" : "PT1H", + "price" : 0.33333333333333300000, + "slug_id" : "es.l" + }, + { + "runtime_policy_id" : "2a6844e4-d211-4e2c-81d8-72cf68411be9", + "source" : "es", + "flavor" : "m", + "time_unit" : "PT1H", + "price" : 0.16666666666666600000, + "slug_id" : "es.m" + }, + { + "runtime_policy_id" : "7909974b-ae5a-4f36-9ea6-407d6bb7dadf", + "source" : "es", + "flavor" : "ROCKETRACCOON", + "time_unit" : "PT1H", + "price" : 0.07812499500000000000, + "slug_id" : "es.ROCKETRACCOON" + }, + { + "runtime_policy_id" : "5c9ff89b-3341-4011-8d2d-c4e98896eeeb", + "source" : "es", + "flavor" : "s", + "time_unit" : "PT1H", + "price" : 0.08124999999999990000, + "slug_id" : "es.s" + }, + { + "runtime_policy_id" : "c2344624-1954-471f-bf18-4bc67689e7d0", + "source" : "es", + "flavor" : "xl", + "time_unit" : "PT1H", + "price" : 0.66666666666666600000, + "slug_id" : "es.xl" + }, + { + "runtime_policy_id" : "091b0a89-68c9-4719-8dd2-199d02d1e8f7", + "source" : "es", + "flavor" : "xs", + "time_unit" : "PT1H", + "price" : 0.03958333333333320000, + "slug_id" : "es.xs" + }, + { + "runtime_policy_id" : "712bc88d-6b62-4b01-a44f-6d0adb8eca9e", + "source" : "es", + "flavor" : "xxl", + "time_unit" : "PT1H", + "price" : 1.33333333333333000000, + "slug_id" : "es.xxl" + }, + { + "runtime_policy_id" : "ee33396d-6594-4960-81ec-c29cfb9b670c", + "source" : "jenkins", + "flavor" : "l", + "time_unit" : "PT1H", + "price" : 0.37500000000000000000, + "slug_id" : "jenkins.L" + }, + { + "runtime_policy_id" : "e03bfb15-617a-42d2-8fae-48c85fbb8541", + "source" : "jenkins", + "flavor" : "m", + "time_unit" : "PT1H", + "price" : 0.18750000000000000000, + "slug_id" : "jenkins.M" + }, + { + "runtime_policy_id" : "79112d26-0841-416f-a1df-0239cafabf86", + "source" : "jenkins", + "flavor" : "old_l", + "time_unit" : "PT1H", + "price" : 0.31250000000000000000, + "slug_id" : "jenkins.OLD_L" + }, + { + "runtime_policy_id" : "45fd3d18-cbd0-4347-b9dd-ed66cca0aae5", + "source" : "jenkins", + "flavor" : "old_m", + "time_unit" : "PT1H", + "price" : 0.16666666666666700000, + "slug_id" : "jenkins.OLD_M" + }, + { + "runtime_policy_id" : "75ddcf52-6e9f-4ba1-92ce-14f1d4398250", + "source" : "jenkins", + "flavor" : "old_s", + "time_unit" : "PT1H", + "price" : 0.02083333333333330000, + "slug_id" : "jenkins.OLD_S" + }, + { + "runtime_policy_id" : "996b6f01-d281-421e-833a-05a89c690b44", + "source" : "jenkins", + "flavor" : "old_xl", + "time_unit" : "PT1H", + "price" : 0.41666666666666700000, + "slug_id" : "jenkins.OLD_XL" + }, + { + "runtime_policy_id" : "48a68c2b-6805-44ed-a33c-56800c1ca554", + "source" : "jenkins", + "flavor" : "s", + "time_unit" : "PT1H", + "price" : 0.09375000000000000000, + "slug_id" : "jenkins.S" + }, + { + "runtime_policy_id" : "23c8e85d-2f2e-49d6-a4f0-bc3ea690f75d", + "source" : "jenkins", + "flavor" : "xl", + "time_unit" : "PT1H", + "price" : 0.75000000000000000000, + "slug_id" : "jenkins.XL" + }, + { + "runtime_policy_id" : "db370271-c8e1-466c-824c-9dcf824c8494", + "source" : "jenkins", + "flavor" : "xs", + "time_unit" : "PT1H", + "price" : 0.04166666666666670000, + "slug_id" : "jenkins.XS" + }, + { + "runtime_policy_id" : "60ce315a-fb24-4203-813f-beea3fc0d40c", + "source" : "kafka", + "flavor" : "a_l", + "time_unit" : "PT1H", + "price" : 1.62499999999999000000, + "slug_id" : "kafka.A_L" + }, + { + "runtime_policy_id" : "5fb5584c-4fa4-4add-8dfa-4f1bc7034f3a", + "source" : "kafka", + "flavor" : "a_m", + "time_unit" : "PT1H", + "price" : 1.50000000000000000000, + "slug_id" : "kafka.A_M" + }, + { + "runtime_policy_id" : "c59a7067-705b-4980-91d5-e4e0527a93e0", + "source" : "kafka", + "flavor" : "a_s", + "time_unit" : "PT1H", + "price" : 1.41666666666667000000, + "slug_id" : "kafka.A_S" + }, + { + "runtime_policy_id" : "f3a3a080-d6d2-40c0-b9aa-e185d467ed6f", + "source" : "kafka", + "flavor" : "m", + "time_unit" : "PT1H", + "price" : 0.27083333333333400000, + "slug_id" : "kafka.M" + }, + { + "runtime_policy_id" : "4ee03c2a-d062-4eff-95b1-86431bf6bc85", + "source" : "kafka", + "flavor" : "s", + "time_unit" : "PT1H", + "price" : 0.23958333333333300000, + "slug_id" : "kafka.S" + }, + { + "runtime_policy_id" : "e29a8bc6-dfdd-49b0-a6e8-991aa206b88e", + "source" : "kafka", + "flavor" : "tc_l", + "time_unit" : "PT1H", + "price" : 1.08333333333333000000, + "slug_id" : "kafka.TC_L" + }, + { + "runtime_policy_id" : "71d86c5b-5522-466b-b09d-f0e2c35e6ff8", + "source" : "kafka", + "flavor" : "tc_m", + "time_unit" : "PT1H", + "price" : 1.00000000000000000000, + "slug_id" : "kafka.TC_M" + }, + { + "runtime_policy_id" : "9a0207b9-8de6-41b7-ba00-d5f4b61db6da", + "source" : "kafka", + "flavor" : "tc_s", + "time_unit" : "PT1H", + "price" : 0.93750000000000000000, + "slug_id" : "kafka.TC_S" + }, + { + "runtime_policy_id" : "bed3e8cf-1622-400e-9594-58219bb3b163", + "source" : "kafka", + "flavor" : "tj_l", + "time_unit" : "PT1H", + "price" : 2.16666666666666000000, + "slug_id" : "kafka.TJ_L" + }, + { + "runtime_policy_id" : "dba86552-12e6-4172-89fb-31d248dc046e", + "source" : "kafka", + "flavor" : "tj_m", + "time_unit" : "PT1H", + "price" : 1.99999999999999000000, + "slug_id" : "kafka.TJ_M" + }, + { + "runtime_policy_id" : "9bf5f307-41c8-473c-a66a-6655addaedfd", + "source" : "kafka", + "flavor" : "tj_s", + "time_unit" : "PT1H", + "price" : 1.91666666666667000000, + "slug_id" : "kafka.TJ_S" + }, + { + "runtime_policy_id" : "5a13e16c-1e38-4a25-8787-f6896700fb19", + "source" : "kafka", + "flavor" : "tj_xl", + "time_unit" : "PT1H", + "price" : 2.35416666666666000000, + "slug_id" : "kafka.TJ_XL" + }, + { + "runtime_policy_id" : "863b10cf-0e27-4330-a339-da4e69429589", + "source" : "kafka", + "flavor" : "tm_l", + "time_unit" : "PT1H", + "price" : 0.31250000000000000000, + "slug_id" : "kafka.TM_L" + }, + { + "runtime_policy_id" : "2c02161f-2540-4b4d-8e5c-17fa82302c92", + "source" : "kafka", + "flavor" : "tm_m", + "time_unit" : "PT1H", + "price" : 0.27083333333333400000, + "slug_id" : "kafka.TM_M" + }, + { + "runtime_policy_id" : "ad301404-02e3-496e-bdeb-9029fd5b72eb", + "source" : "kafka", + "flavor" : "tm_s", + "time_unit" : "PT1H", + "price" : 0.23958333333333300000, + "slug_id" : "kafka.TM_S" + }, + { + "runtime_policy_id" : "b957a101-2ce8-466d-96f0-51515b33b6fb", + "source" : "kafka", + "flavor" : "tt_l", + "time_unit" : "PT1H", + "price" : 0.54166666666666700000, + "slug_id" : "kafka.TT_L" + }, + { + "runtime_policy_id" : "332140f5-e7f4-4b8f-95a7-d8bfe35aee07", + "source" : "kafka", + "flavor" : "tt_m", + "time_unit" : "PT1H", + "price" : 0.49999999999999900000, + "slug_id" : "kafka.TT_M" + }, + { + "runtime_policy_id" : "5a35eca7-aba0-4234-b40d-d5ada22d93e5", + "source" : "kafka", + "flavor" : "tt_s", + "time_unit" : "PT1H", + "price" : 0.46875000000000000000, + "slug_id" : "kafka.TT_S" + }, + { + "runtime_policy_id" : "04a5a316-6d34-401e-a5a7-3a7b8273dec4", + "source" : "mongodb", + "flavor" : "biggunnera", + "time_unit" : "PT1H", + "price" : 0.37500000000000000000, + "slug_id" : "mongodb.BIGGUNNERA" + }, + { + "runtime_policy_id" : "26376aa9-5dc3-48f5-bfde-915ad486190e", + "source" : "mongodb", + "flavor" : "gunnera", + "time_unit" : "PT1H", + "price" : 0.46875000000000000000, + "slug_id" : "mongodb.GUNNERA" + }, + { + "runtime_policy_id" : "52c15bd1-47ab-4484-a9b0-bad41c6ecc7a", + "source" : "mongodb", + "flavor" : "hazelnut", + "time_unit" : "PT1H", + "price" : 0.06250000000000000000, + "slug_id" : "mongodb.HAZELNUT" + }, + { + "runtime_policy_id" : "53570c8d-5b01-4298-9da2-fcb8ffa155bb", + "source" : "mongodb", + "flavor" : "l", + "time_unit" : "PT1H", + "price" : 0.72916666666666700000, + "slug_id" : "mongodb.L" + }, + { + "runtime_policy_id" : "d9a1ec28-b063-488d-8524-27217cd68eeb", + "source" : "mongodb", + "flavor" : "l_big", + "time_unit" : "PT1H", + "price" : 0.62916666666666700000, + "slug_id" : "mongodb.L_BIG" + }, + { + "runtime_policy_id" : "c2f57b09-343e-4734-8e94-e66b0cf8655d", + "source" : "mongodb", + "flavor" : "l_med", + "time_unit" : "PT1H", + "price" : 0.52500000000000000000, + "slug_id" : "mongodb.L_MED" + }, + { + "runtime_policy_id" : "21f62ac8-d6fe-45e7-badc-580eae5953a6", + "source" : "mongodb", + "flavor" : "l_sml", + "time_unit" : "PT1H", + "price" : 0.42083333333333300000, + "slug_id" : "mongodb.L_SML" + }, + { + "runtime_policy_id" : "27c97c37-7607-48de-8947-953c0efc7a53", + "source" : "mongodb", + "flavor" : "m_big", + "time_unit" : "PT1H", + "price" : 0.25833333333333300000, + "slug_id" : "mongodb.M_BIG" + }, + { + "runtime_policy_id" : "5e666158-3eee-4037-a3d5-de608e7c7419", + "source" : "mongodb", + "flavor" : "m_hug", + "time_unit" : "PT1H", + "price" : 0.36250000000000000000, + "slug_id" : "mongodb.M_HUG" + }, + { + "runtime_policy_id" : "932c7bf6-9a89-4e7f-b1ab-bbc94d0e7726", + "source" : "mongodb", + "flavor" : "m_med", + "time_unit" : "PT1H", + "price" : 0.23750000000000000000, + "slug_id" : "mongodb.M_MED" + }, + { + "runtime_policy_id" : "e82405cc-4ca1-49bd-807e-0c6ebea42b26", + "source" : "mongodb", + "flavor" : "m_sml", + "time_unit" : "PT1H", + "price" : 0.20625000000000000000, + "slug_id" : "mongodb.M_SML" + }, + { + "runtime_policy_id" : "9f3b79fb-7c21-4437-ac00-5126b7e526d4", + "source" : "mongodb", + "flavor" : "s_big", + "time_unit" : "PT1H", + "price" : 0.12291666666666700000, + "slug_id" : "mongodb.S_BIG" + }, + { + "runtime_policy_id" : "a3723262-fce5-42b3-b7eb-948296c67d2b", + "source" : "mongodb", + "flavor" : "shamrock", + "time_unit" : "PT1H", + "price" : 0.12500000000000000000, + "slug_id" : "mongodb.SHAMROCK" + }, + { + "runtime_policy_id" : "3e4c5211-1ebc-4d5b-975f-ad37e2dea6c3", + "source" : "mongodb", + "flavor" : "s_hug", + "time_unit" : "PT1H", + "price" : 0.15416666666666700000, + "slug_id" : "mongodb.S_HUG" + }, + { + "runtime_policy_id" : "b66ec0a7-d20f-47f9-89d2-44f1e97fc7a5", + "source" : "mongodb", + "flavor" : "s_med", + "time_unit" : "PT1H", + "price" : 0.10208333333333300000, + "slug_id" : "mongodb.S_MED" + }, + { + "runtime_policy_id" : "8f4882ce-927a-4fca-a2dd-99cd72e173ce", + "source" : "mongodb", + "flavor" : "s_sml", + "time_unit" : "PT1H", + "price" : 0.08645833333333330000, + "slug_id" : "mongodb.S_SML" + }, + { + "runtime_policy_id" : "f085791a-0ddc-4379-aca0-ee74027cce66", + "source" : "mongodb", + "flavor" : "vine", + "time_unit" : "PT1H", + "price" : 0.23437500000000000000, + "slug_id" : "mongodb.VINE" + }, + { + "runtime_policy_id" : "b7ba1ab6-0ff9-4410-acd1-724ca4aa6651", + "source" : "mongodb", + "flavor" : "xl_big", + "time_unit" : "PT1H", + "price" : 1.29166666666667000000, + "slug_id" : "mongodb.XL_BIG" + }, + { + "runtime_policy_id" : "18bacdce-1ced-457e-9286-08853afb00e9", + "source" : "mongodb", + "flavor" : "xl_med", + "time_unit" : "PT1H", + "price" : 1.13541666666667000000, + "slug_id" : "mongodb.XL_MED" + }, + { + "runtime_policy_id" : "98856d67-7ecb-47e4-8514-83602bb6e53d", + "source" : "mongodb", + "flavor" : "xl_sml", + "time_unit" : "PT1H", + "price" : 0.97916666666666700000, + "slug_id" : "mongodb.XL_SML" + }, + { + "runtime_policy_id" : "8c905e62-b0a4-4073-b1fa-28062ad5222f", + "source" : "mongodb", + "flavor" : "xs_big", + "time_unit" : "PT1H", + "price" : 0.06250000000000010000, + "slug_id" : "mongodb.XS_BIG" + }, + { + "runtime_policy_id" : "d6c1cea2-397f-4863-a0eb-bb600960bd47", + "source" : "mongodb", + "flavor" : "xs_med", + "time_unit" : "PT1H", + "price" : 0.04687500000000000000, + "slug_id" : "mongodb.XS_MED" + }, + { + "runtime_policy_id" : "f7f61278-7816-4a51-bfb8-7437bcb9d557", + "source" : "mongodb", + "flavor" : "xs_sml", + "time_unit" : "PT1H", + "price" : 0.03645833333333340000, + "slug_id" : "mongodb.XS_SML" + }, + { + "runtime_policy_id" : "03c6d922-c5a6-4d4e-9087-dbedde3c8e1c", + "source" : "mongodb", + "flavor" : "xxl_big", + "time_unit" : "PT1H", + "price" : 2.33750000000000000000, + "slug_id" : "mongodb.XXL_BIG" + }, + { + "runtime_policy_id" : "2529d4b7-9015-401f-b682-4b337540ea6f", + "source" : "mongodb", + "flavor" : "xxl_med", + "time_unit" : "PT1H", + "price" : 2.23958333333334000000, + "slug_id" : "mongodb.XXL_MED" + }, + { + "runtime_policy_id" : "26d07ad1-6b48-414e-8c3b-2db545d172db", + "source" : "mongodb", + "flavor" : "xxl_sml", + "time_unit" : "PT1H", + "price" : 2.02500000000000000000, + "slug_id" : "mongodb.XXL_SML" + }, + { + "runtime_policy_id" : "bdfa3eff-5741-4e54-b7de-a408186f1f8c", + "source" : "mysql", + "flavor" : "l", + "time_unit" : "PT1H", + "price" : 0.62500000000000100000, + "slug_id" : "mysql.L" + }, + { + "runtime_policy_id" : "53d68da1-23f5-485f-8a26-ae02f83c6cd7", + "source" : "mysql", + "flavor" : "l_big", + "time_unit" : "PT1H", + "price" : 0.54166666666666700000, + "slug_id" : "mysql.L_BIG" + }, + { + "runtime_policy_id" : "5fb0c754-c7b5-4015-8910-5366ac705316", + "source" : "mysql", + "flavor" : "l_med", + "time_unit" : "PT1H", + "price" : 0.50000000000000000000, + "slug_id" : "mysql.L_MED" + }, + { + "runtime_policy_id" : "33162a91-4b10-400e-b212-b8fe88d5caca", + "source" : "mysql", + "flavor" : "l_sml", + "time_unit" : "PT1H", + "price" : 0.45833333333333300000, + "slug_id" : "mysql.L_SML" + }, + { + "runtime_policy_id" : "2b13fb7b-cb8e-4e3a-8340-7c00e048ad99", + "source" : "mysql", + "flavor" : "m", + "time_unit" : "PT1H", + "price" : 0.09375000000000000000, + "slug_id" : "mysql.M" + }, + { + "runtime_policy_id" : "63b3e26d-c57c-4fa4-b185-812b9df98214", + "source" : "mysql", + "flavor" : "maj_digital", + "time_unit" : "PT1H", + "price" : 0E-20, + "slug_id" : "mysql.MAJ_DIGITAL" + }, + { + "runtime_policy_id" : "3ac250a5-34b5-4023-b227-042c4c1e3b13", + "source" : "mysql", + "flavor" : "m_big", + "time_unit" : "PT1H", + "price" : 0.28333333333333300000, + "slug_id" : "mysql.M_BIG" + }, + { + "runtime_policy_id" : "a3e5f1db-efe0-40cc-a172-9480d6d44fb7", + "source" : "mysql", + "flavor" : "ml", + "time_unit" : "PT1H", + "price" : 0.22916666666666700000, + "slug_id" : "mysql.ML" + }, + { + "runtime_policy_id" : "c90e7350-b862-402b-90cc-4fa628bc1d22", + "source" : "mysql", + "flavor" : "m_med", + "time_unit" : "PT1H", + "price" : 0.24166666666666700000, + "slug_id" : "mysql.M_MED" + }, + { + "runtime_policy_id" : "43b49702-a699-44ca-a4f2-3483947f00e0", + "source" : "mysql", + "flavor" : "m_sml", + "time_unit" : "PT1H", + "price" : 0.22083333333333300000, + "slug_id" : "mysql.M_SML" + }, + { + "runtime_policy_id" : "daa9ceac-0148-4aa6-b423-0453963c7bde", + "source" : "mysql", + "flavor" : "s", + "time_unit" : "PT1H", + "price" : 0.03125000000000000000, + "slug_id" : "mysql.S" + }, + { + "runtime_policy_id" : "533596c6-7f1e-47f7-ac76-4faeb0510881", + "source" : "mysql", + "flavor" : "s_big", + "time_unit" : "PT1H", + "price" : 0.11458333333333300000, + "slug_id" : "mysql.S_BIG" + }, + { + "runtime_policy_id" : "195f418e-dad5-4e85-ae62-53edaa303bf7", + "source" : "mysql", + "flavor" : "simbiose", + "time_unit" : "PT1H", + "price" : 0E-20, + "slug_id" : "mysql.SIMBIOSE" + }, + { + "runtime_policy_id" : "519e23c2-bdac-40d5-bb6f-57de5289a613", + "source" : "mysql", + "flavor" : "s_med", + "time_unit" : "PT1H", + "price" : 0.10937500000000000000, + "slug_id" : "mysql.S_MED" + }, + { + "runtime_policy_id" : "925365d8-015c-40fb-a53c-9a758e0b93fb", + "source" : "mysql", + "flavor" : "s_sml", + "time_unit" : "PT1H", + "price" : 0.10416666666666700000, + "slug_id" : "mysql.S_SML" + }, + { + "runtime_policy_id" : "1ded039e-1325-4e23-b38e-1332ea543a4d", + "source" : "mysql", + "flavor" : "xl_big", + "time_unit" : "PT1H", + "price" : 1.23333333333333000000, + "slug_id" : "mysql.XL_BIG" + }, + { + "runtime_policy_id" : "b37b66a0-7a40-461f-b097-2653f585bec2", + "source" : "mysql", + "flavor" : "xl_med", + "time_unit" : "PT1H", + "price" : 1.06666666666667000000, + "slug_id" : "mysql.XL_MED" + }, + { + "runtime_policy_id" : "c7378a47-c648-4366-a230-1d17cc10fec5", + "source" : "mysql", + "flavor" : "xl_sml", + "time_unit" : "PT1H", + "price" : 0.98333333333333300000, + "slug_id" : "mysql.XL_SML" + }, + { + "runtime_policy_id" : "dc183aad-dec9-4662-b26e-60eb2870f147", + "source" : "mysql", + "flavor" : "xs_big", + "time_unit" : "PT1H", + "price" : 0.06250000000000000000, + "slug_id" : "mysql.XS_BIG" + }, + { + "runtime_policy_id" : "8b85e34b-bdb6-40e6-93c0-ad0efcc7249b", + "source" : "mysql", + "flavor" : "xs_med", + "time_unit" : "PT1H", + "price" : 0.05416666666666670000, + "slug_id" : "mysql.XS_MED" + }, + { + "runtime_policy_id" : "fe08dc57-ee0a-4152-8b62-b00413f3d375", + "source" : "mysql", + "flavor" : "xs_sml", + "time_unit" : "PT1H", + "price" : 0.04895833333333330000, + "slug_id" : "mysql.XS_SML" + }, + { + "runtime_policy_id" : "e97d45b7-dfa7-418f-b733-08c48caa3ba7", + "source" : "mysql", + "flavor" : "xs_tny", + "time_unit" : "PT1H", + "price" : 0.03125000000000000000, + "slug_id" : "mysql.XS_TNY" + }, + { + "runtime_policy_id" : "88f88699-c0f7-4cea-a4d6-c69dd02a13d8", + "source" : "mysql", + "flavor" : "xxl_big", + "time_unit" : "PT1H", + "price" : 2.60000000000000000000, + "slug_id" : "mysql.XXL_BIG" + }, + { + "runtime_policy_id" : "2bcd9198-08b7-4bc3-ac72-a442cb110a12", + "source" : "mysql", + "flavor" : "xxl_hug", + "time_unit" : "PT1H", + "price" : 2.93333333333333000000, + "slug_id" : "mysql.XXL_HUG" + }, + { + "runtime_policy_id" : "8d19562c-ec5e-41a8-878e-ea59afc02d30", + "source" : "mysql", + "flavor" : "xxl_med", + "time_unit" : "PT1H", + "price" : 2.26666666666667000000, + "slug_id" : "mysql.XXL_MED" + }, + { + "runtime_policy_id" : "6474efef-bac1-4975-a661-b75ec06818f5", + "source" : "mysql", + "flavor" : "xxl_sml", + "time_unit" : "PT1H", + "price" : 2.10000000000000000000, + "slug_id" : "mysql.XXL_SML" + }, + { + "runtime_policy_id" : "be2ce473-b554-4801-b943-cb923b3d4f7c", + "source" : "mysql", + "flavor" : "xxs_big", + "time_unit" : "PT1H", + "price" : 0.01416666666666670000, + "slug_id" : "mysql.XXS_BIG" + }, + { + "runtime_policy_id" : "f696e048-5f95-4bed-b58f-8f3e3a483758", + "source" : "mysql", + "flavor" : "xxs_med", + "time_unit" : "PT1H", + "price" : 0.01229166666666670000, + "slug_id" : "mysql.XXS_MED" + }, + { + "runtime_policy_id" : "4cf60085-7637-48b0-ab19-bd0ab8c76f95", + "source" : "mysql", + "flavor" : "xxs_sml", + "time_unit" : "PT1H", + "price" : 0.01041666666666670000, + "slug_id" : "mysql.XXS_SML" + }, + { + "runtime_policy_id" : "dae60bd7-4d12-4557-b280-a5f8092c9426", + "source" : "postgresql", + "flavor" : "l", + "time_unit" : "PT1H", + "price" : 0.49999999999999900000, + "slug_id" : "postgresql.L" + }, + { + "runtime_policy_id" : "ae62b037-aeef-452a-94f1-8d0ae0f110bf", + "source" : "postgresql", + "flavor" : "l_big", + "time_unit" : "PT1H", + "price" : 0.45416666666666700000, + "slug_id" : "postgresql.L_BIG" + }, + { + "runtime_policy_id" : "ac7f1493-edbd-4e2a-a914-8f6575c2cb74", + "source" : "postgresql", + "flavor" : "l_gnt", + "time_unit" : "PT1H", + "price" : 0.83333333333333300000, + "slug_id" : "postgresql.L_GNT" + }, + { + "runtime_policy_id" : "f0173ae3-aaa0-4048-95ee-0771e06770ad", + "source" : "postgresql", + "flavor" : "lm", + "time_unit" : "PT1H", + "price" : 0.20833333333333400000, + "slug_id" : "postgresql.LM" + }, + { + "runtime_policy_id" : "dc988c63-88e2-43d4-9cf4-7517910ab8b0", + "source" : "postgresql", + "flavor" : "l_med", + "time_unit" : "PT1H", + "price" : 0.41250000000000000000, + "slug_id" : "postgresql.L_MED" + }, + { + "runtime_policy_id" : "bb3b7d55-011e-4524-a226-bdea7b6fb9ab", + "source" : "postgresql", + "flavor" : "l_sml", + "time_unit" : "PT1H", + "price" : 0.37083333333333300000, + "slug_id" : "postgresql.L_SML" + }, + { + "runtime_policy_id" : "e2277111-537c-47ef-bac3-3d8cea6146c8", + "source" : "postgresql", + "flavor" : "m", + "time_unit" : "PT1H", + "price" : 0.06250000000000010000, + "slug_id" : "postgresql.M" + }, + { + "runtime_policy_id" : "c994dc62-98db-4306-b0a3-2f56fce042cb", + "source" : "postgresql", + "flavor" : "m_big", + "time_unit" : "PT1H", + "price" : 0.24583333333333300000, + "slug_id" : "postgresql.M_BIG" + }, + { + "runtime_policy_id" : "882eae95-ea27-40f1-90d4-b76a41f9f7bd", + "source" : "postgresql", + "flavor" : "m_med", + "time_unit" : "PT1H", + "price" : 0.20416666666666700000, + "slug_id" : "postgresql.M_MED" + }, + { + "runtime_policy_id" : "430fe379-5c05-46e0-8d2e-3a156ce136de", + "source" : "postgresql", + "flavor" : "m_sml", + "time_unit" : "PT1H", + "price" : 0.18333333333333300000, + "slug_id" : "postgresql.M_SML" + }, + { + "runtime_policy_id" : "1d0346a8-4f1c-491e-af87-84edc8bda823", + "source" : "postgresql", + "flavor" : "s", + "time_unit" : "PT1H", + "price" : 0.02083333333333330000, + "slug_id" : "postgresql.S" + }, + { + "runtime_policy_id" : "e8a2aee2-3ec8-4064-ac5b-ef11dccce248", + "source" : "postgresql", + "flavor" : "s_big", + "time_unit" : "PT1H", + "price" : 0.09791666666666670000, + "slug_id" : "postgresql.S_BIG" + }, + { + "runtime_policy_id" : "ae9551b5-23be-4686-8ac6-505334ee5efe", + "source" : "postgresql", + "flavor" : "s_hug", + "time_unit" : "PT1H", + "price" : 0.13333333333333300000, + "slug_id" : "postgresql.S_HUG" + }, + { + "runtime_policy_id" : "d31e4775-07b8-4599-9b49-cb2af5b9b7b3", + "source" : "postgresql", + "flavor" : "s_med", + "time_unit" : "PT1H", + "price" : 0.09166666666666670000, + "slug_id" : "postgresql.S_MED" + }, + { + "runtime_policy_id" : "4c516573-a311-477d-ba08-04aef2a05d83", + "source" : "postgresql", + "flavor" : "s_sml", + "time_unit" : "PT1H", + "price" : 0.08541666666666670000, + "slug_id" : "postgresql.S_SML" + }, + { + "runtime_policy_id" : "c44ec94f-2a11-4872-b8a5-a8477ed221dd", + "source" : "postgresql", + "flavor" : "xl", + "time_unit" : "PT1H", + "price" : 1.45833333333333000000, + "slug_id" : "postgresql.XL" + }, + { + "runtime_policy_id" : "c14c13ae-e45a-44e3-ba5a-cc3dec8cd641", + "source" : "postgresql", + "flavor" : "xl_big", + "time_unit" : "PT1H", + "price" : 1.00000000000000000000, + "slug_id" : "postgresql.XL_BIG" + }, + { + "runtime_policy_id" : "5dcc1a68-3e2b-44ec-84fe-0e71ff7e9983", + "source" : "postgresql", + "flavor" : "xl_gnt", + "time_unit" : "PT1H", + "price" : 1.33333333333333000000, + "slug_id" : "postgresql.XL_GNT" + }, + { + "runtime_policy_id" : "21c691db-7b16-439b-8445-a5dbaa34743f", + "source" : "postgresql", + "flavor" : "xl_hug", + "time_unit" : "PT1H", + "price" : 1.16666666666667000000, + "slug_id" : "postgresql.XL_HUG" + }, + { + "runtime_policy_id" : "371b310c-2127-428f-b441-2a1a48c17a04", + "source" : "postgresql", + "flavor" : "xl_med", + "time_unit" : "PT1H", + "price" : 0.83333333333333300000, + "slug_id" : "postgresql.XL_MED" + }, + { + "runtime_policy_id" : "999c466c-614c-4878-b72c-774f3d00c819", + "source" : "postgresql", + "flavor" : "xl_sml", + "time_unit" : "PT1H", + "price" : 0.75000000000000000000, + "slug_id" : "postgresql.XL_SML" + }, + { + "runtime_policy_id" : "fcc87349-ac32-49c9-9140-812b467635c6", + "source" : "postgresql", + "flavor" : "xm", + "time_unit" : "PT1H", + "price" : 0E-20, + "slug_id" : "postgresql.XM" + }, + { + "runtime_policy_id" : "b14c9662-d833-41f8-87ac-65d1aea7fe2f", + "source" : "postgresql", + "flavor" : "xs_big", + "time_unit" : "PT1H", + "price" : 0.05208333333333330000, + "slug_id" : "postgresql.XS_BIG" + }, + { + "runtime_policy_id" : "8bcdedb6-a6e3-42c7-8ddd-cd626451767a", + "source" : "postgresql", + "flavor" : "xs_med", + "time_unit" : "PT1H", + "price" : 0.04687500000000000000, + "slug_id" : "postgresql.XS_MED" + }, + { + "runtime_policy_id" : "ece61f87-b1a6-4b7b-91bc-fe50007a1eda", + "source" : "postgresql", + "flavor" : "xs_sml", + "time_unit" : "PT1H", + "price" : 0.04062500000000000000, + "slug_id" : "postgresql.XS_SML" + }, + { + "runtime_policy_id" : "91cc08bc-9194-4eec-b518-209460a667fe", + "source" : "postgresql", + "flavor" : "xs_tny", + "time_unit" : "PT1H", + "price" : 0.03125000000000000000, + "slug_id" : "postgresql.XS_TNY" + }, + { + "runtime_policy_id" : "56304a0a-8295-42c8-9b39-e1b03c1431cf", + "source" : "postgresql", + "flavor" : "xxl_big", + "time_unit" : "PT1H", + "price" : 2.08333333333333000000, + "slug_id" : "postgresql.XXL_BIG" + }, + { + "runtime_policy_id" : "e36dab43-da30-403e-b73e-abc0209ea653", + "source" : "postgresql", + "flavor" : "xxl_hug", + "time_unit" : "PT1H", + "price" : 2.41666666666667000000, + "slug_id" : "postgresql.XXL_HUG" + }, + { + "runtime_policy_id" : "25750c14-f5ba-4ef0-ac6e-cf40973d7c85", + "source" : "postgresql", + "flavor" : "xxl_med", + "time_unit" : "PT1H", + "price" : 1.75000000000000000000, + "slug_id" : "postgresql.XXL_MED" + }, + { + "runtime_policy_id" : "78ebf644-e8e4-46b9-a977-eb4a7d359120", + "source" : "postgresql", + "flavor" : "xxl_sml", + "time_unit" : "PT1H", + "price" : 1.58333333333333000000, + "slug_id" : "postgresql.XXL_SML" + }, + { + "runtime_policy_id" : "50799369-fe66-47bb-b72c-4918483b6fb2", + "source" : "postgresql", + "flavor" : "xxs_big", + "time_unit" : "PT1H", + "price" : 0.01604166666666660000, + "slug_id" : "postgresql.XXS_BIG" + }, + { + "runtime_policy_id" : "f9136500-c019-4d35-926b-d87e84d79265", + "source" : "postgresql", + "flavor" : "xxs_med", + "time_unit" : "PT1H", + "price" : 0.01416666666666670000, + "slug_id" : "postgresql.XXS_MED" + }, + { + "runtime_policy_id" : "bd95ac12-5bf0-4009-863b-41fb40715fc3", + "source" : "postgresql", + "flavor" : "xxs_sml", + "time_unit" : "PT1H", + "price" : 0.01093750000000000000, + "slug_id" : "postgresql.XXS_SML" + }, + { + "runtime_policy_id" : "4bb79d48-af1c-4fff-bcfa-50a4cdd5d487", + "source" : "postgresql", + "flavor" : "xxxl_big", + "time_unit" : "PT1H", + "price" : 4.18750000000000000000, + "slug_id" : "postgresql.XXXL_BIG" + }, + { + "runtime_policy_id" : "2b74228a-5e56-4b81-8e10-2f977d0ef6fc", + "source" : "postgresql", + "flavor" : "xxxl_med", + "time_unit" : "PT1H", + "price" : 3.93750000000000000000, + "slug_id" : "postgresql.XXXL_MED" + }, + { + "runtime_policy_id" : "bf461eaa-885b-435c-b4e1-b45b9878d3a7", + "source" : "postgresql", + "flavor" : "xxxl_sml", + "time_unit" : "PT1H", + "price" : 3.60416666666667000000, + "slug_id" : "postgresql.XXXL_SML" + }, + { + "runtime_policy_id" : "cebc5cd4-ec72-4163-b0b9-302f077271af", + "source" : "redis", + "flavor" : "custom", + "time_unit" : "PT1H", + "price" : 1.04166666666667000000, + "slug_id" : "redis.CUSTOM" + }, + { + "runtime_policy_id" : "90ad73b5-93c9-4ffe-9ebc-4f3881b2ee87", + "source" : "redis", + "flavor" : "l", + "time_unit" : "PT1H", + "price" : 0.10845833333333300000, + "slug_id" : "redis.L" + }, + { + "runtime_policy_id" : "565b8089-41db-4b67-b15c-7e2b804ed1cd", + "source" : "redis", + "flavor" : "l_mono", + "time_unit" : "PT1H", + "price" : 0.03958333333333330000, + "slug_id" : "redis.l_mono" + }, + { + "runtime_policy_id" : "8778ce74-bb2c-4e13-9a64-b7abda29671f", + "source" : "redis", + "flavor" : "m", + "time_unit" : "PT1H", + "price" : 0.03335416666666670000, + "slug_id" : "redis.M" + }, + { + "runtime_policy_id" : "ccee59e8-5ea9-4c83-ae58-997b3d2385b2", + "source" : "redis", + "flavor" : "m_mono", + "time_unit" : "PT1H", + "price" : 0.02604166666666670000, + "slug_id" : "redis.m_mono" + }, + { + "runtime_policy_id" : "b88ce93f-c864-45f0-b7b6-449bbb212752", + "source" : "redis", + "flavor" : "s", + "time_unit" : "PT1H", + "price" : 0.02187500000000000000, + "slug_id" : "redis.S" + }, + { + "runtime_policy_id" : "f99aa16e-bcbe-4d66-888b-bd25bc5fa6e7", + "source" : "redis", + "flavor" : "s_mono", + "time_unit" : "PT1H", + "price" : 0.01041666666666670000, + "slug_id" : "redis.s_mono" + }, + { + "runtime_policy_id" : "b77ac92b-f59a-4323-b6e4-3119ce04b9d1", + "source" : "redis", + "flavor" : "xl", + "time_unit" : "PT1H", + "price" : 0.19520833333333300000, + "slug_id" : "redis.XL" + }, + { + "runtime_policy_id" : "ee3574d2-c7dc-4587-929d-5cd322d08b9f", + "source" : "redis", + "flavor" : "xl_mono", + "time_unit" : "PT1H", + "price" : 0.05000000000000000000, + "slug_id" : "redis.xl_mono" + }, + { + "runtime_policy_id" : "43bb63ca-caad-4fd6-8958-e2a057f11488", + "source" : "redis", + "flavor" : "xxl", + "time_unit" : "PT1H", + "price" : 0.47677083333333300000, + "slug_id" : "redis.XXL" + }, + { + "runtime_policy_id" : "ba65e000-603c-4e91-973a-bf38b7945f1f", + "source" : "redis", + "flavor" : "xxl_mono", + "time_unit" : "PT1H", + "price" : 0.11979166666666700000, + "slug_id" : "redis.xxl_mono" + }, + { + "runtime_policy_id" : "56304c0e-1869-41bb-b3a5-671d5251221c", + "source" : "redis", + "flavor" : "xxxl", + "time_unit" : "PT1H", + "price" : 0.62500000000000000000, + "slug_id" : "redis.XXXL" + }, + { + "runtime_policy_id" : "37b06f98-16a2-4c52-a5ba-6fab55fa139c", + "source" : "redis", + "flavor" : "xxxl_mono", + "time_unit" : "PT1H", + "price" : 0.22500000000000000000, + "slug_id" : "redis.xxxl_mono" + }, + { + "runtime_policy_id" : "fd30d11d-fe7a-4f94-886b-7bca1ac865d6", + "source" : "redis", + "flavor" : "xxxxl_mono", + "time_unit" : "PT1H", + "price" : 0.44166666666666700000, + "slug_id" : "redis.xxxxl_mono" + }, + { + "runtime_policy_id" : "19071456-694a-4bf4-9106-12a26c7792f6", + "source" : "adc", + "flavor" : "custom_adc_058b7efc-e62d-43de-a5d5-d6c13ac80dd7", + "time_unit" : "PT1H", + "price" : 0E-20, + "slug_id" : "adc.custom_adc_058b7efc-e62d-43de-a5d5-d6c13ac80dd7" + } + ], + "countable" : [ + { + "countable_policy_id" : "5f250960-04ae-4ef0-9dc7-b302c3bf0db0", + "service" : "heptapod.public_active_users", + "data_unit" : "User", + "data_quantity_for_price" : { + "secability" : "insecable", + "quantity" : 100 + }, + "time_interval_for_price" : { + "secability" : "insecable", + "interval" : "PT720H" + }, + "first_x_free" : 0, + "price_plans" : [ + { + "plan_id" : "8d90e40f-646e-4799-a189-c681141cf597", + "max_quantity" : 101, + "price" : 0E-20 + }, + { + "plan_id" : "e1348c27-42ef-470f-a9a6-2ba83261cea5", + "max_quantity" : null, + "price" : 12.00000000000000000000 + } + ] + }, + { + "countable_policy_id" : "49a6b6a6-2ebb-4290-8f7a-dbf8ad9c0d2b", + "service" : "pulsar_storage_size", + "data_unit" : "B", + "data_quantity_for_price" : { + "secability" : "secable", + "quantity" : 1000000000 + }, + "time_interval_for_price" : { + "secability" : "secable", + "interval" : "PT1H" + }, + "first_x_free" : 0, + "price_plans" : [ + { + "plan_id" : "0780473c-14b0-4068-9832-42fc6f557c3c", + "max_quantity" : 256000000, + "price" : 0E-20 + }, + { + "plan_id" : "484b1a34-b669-4f67-859f-52a94ec51c72", + "max_quantity" : 50000000000, + "price" : 0.00041666666666666700 + }, + { + "plan_id" : "1e779463-fb30-4199-bbd2-3b2d2e42e7e9", + "max_quantity" : 250000000000, + "price" : 0.00031250000000000000 + }, + { + "plan_id" : "0e14c92d-edda-4689-9316-d6fc9bf5fc13", + "max_quantity" : 1000000000000, + "price" : 0.00025000000000000000 + }, + { + "plan_id" : "6a216ec9-5932-46bf-a8ee-629c77ba441f", + "max_quantity" : null, + "price" : 0.00020833333333333300 + } + ] + }, + { + "countable_policy_id" : "6fb475fb-b6ed-4828-b72e-4910824f8b10", + "service" : "cellar.storage", + "data_unit" : "B", + "data_quantity_for_price" : { + "secability" : "secable", + "quantity" : 1000000000 + }, + "time_interval_for_price" : { + "secability" : "secable", + "interval" : "PT1H" + }, + "first_x_free" : 0, + "price_plans" : [ + { + "plan_id" : "f712e3ca-7f8f-4784-8c22-9251066cf2af", + "max_quantity" : 100000000, + "price" : 0E-20 + }, + { + "plan_id" : "49fe45f1-981c-4932-832c-f610864059a0", + "max_quantity" : 1000000000000, + "price" : 0.00004266666666666670 + }, + { + "plan_id" : "c31f0ed6-6aa0-457a-b7f6-e488b535e501", + "max_quantity" : 25000000000000, + "price" : 0.00003200000000000000 + }, + { + "plan_id" : "8fef0a55-ac63-4b62-8a15-f5d36ccaf834", + "max_quantity" : null, + "price" : 0.00002133333333333330 + } + ] + }, + { + "countable_policy_id" : "4217ef39-35f2-40ea-9c9a-98c1c2d35d8d", + "service" : "cellar.outbound", + "data_unit" : "B", + "data_quantity_for_price" : { + "secability" : "secable", + "quantity" : 1000000000 + }, + "time_interval_for_price" : null, + "first_x_free" : 0, + "price_plans" : [ + { + "plan_id" : "a2a54233-6aa7-4705-a924-8943adbfac63", + "max_quantity" : 10000000000000, + "price" : 0.13500000000000000000 + }, + { + "plan_id" : "00d9d207-6354-429f-ae4c-1ed105d15967", + "max_quantity" : null, + "price" : 0.10500000000000000000 + } + ] + }, + { + "countable_policy_id" : "bfc7a3d9-25dd-46a2-be41-05f5d13f0816", + "service" : "heptapod.private_active_users", + "data_unit" : "User", + "data_quantity_for_price" : { + "secability" : "insecable", + "quantity" : 1 + }, + "time_interval_for_price" : { + "secability" : "insecable", + "interval" : "PT720H" + }, + "first_x_free" : 0, + "price_plans" : [ + { + "plan_id" : "4ee22c61-1d9e-4d2a-b714-2bbec3e32a4c", + "max_quantity" : null, + "price" : 10.50000000000000000000 + } + ] + }, + { + "countable_policy_id" : "8a1c20b9-07b1-47bc-807c-65f412945067", + "service" : "fsbucket.storage", + "data_unit" : "B", + "data_quantity_for_price" : { + "secability" : "secable", + "quantity" : 1000000000 + }, + "time_interval_for_price" : { + "secability" : "secable", + "interval" : "PT1H" + }, + "first_x_free" : 0, + "price_plans" : [ + { + "plan_id" : "1d8b8b2e-0552-480f-8b8c-ab2fb04a5786", + "max_quantity" : 100000000, + "price" : 0E-20 + }, + { + "plan_id" : "d45b817d-0c67-4ce0-9ada-acf4aa9c46f9", + "max_quantity" : null, + "price" : 0.00343750000000000000 + } + ] + }, + { + "countable_policy_id" : "b889b746-e446-4dce-912a-ea93c4a8a989", + "service" : "pulsar_throughput_out", + "data_unit" : "B", + "data_quantity_for_price" : { + "secability" : "secable", + "quantity" : 1000000000 + }, + "time_interval_for_price" : null, + "first_x_free" : 0, + "price_plans" : [ + { + "plan_id" : "63689060-6c40-414a-85cf-add1a16c8036", + "max_quantity" : 500000000, + "price" : 0E-20 + }, + { + "plan_id" : "d4914efe-0793-45c6-8834-c5f5e3b1c087", + "max_quantity" : 100000000000, + "price" : 0E-20 + }, + { + "plan_id" : "cc41a344-b668-400f-aadf-c7389d2d66ee", + "max_quantity" : 500000000000, + "price" : 0.00004583333333333330 + }, + { + "plan_id" : "7578a312-d902-4d12-95e3-d763c208bcf1", + "max_quantity" : 5000000000000, + "price" : 0E-20 + }, + { + "plan_id" : "048b5682-70ab-4342-9175-e2a1e45ee1f4", + "max_quantity" : null, + "price" : 0E-20 + } + ] + }, + { + "countable_policy_id" : "aa1cc588-7787-48b3-bbe4-7c7c77f41906", + "service" : "pulsar_throughput_in", + "data_unit" : "B", + "data_quantity_for_price" : { + "secability" : "secable", + "quantity" : 1000000000 + }, + "time_interval_for_price" : null, + "first_x_free" : 0, + "price_plans" : [ + { + "plan_id" : "32c670e4-bd6f-4ae3-801a-a2464cceeabf", + "max_quantity" : 500000000, + "price" : 0E-20 + }, + { + "plan_id" : "ef70a987-5740-4f17-8544-cf7e6a4ce985", + "max_quantity" : 100000000000, + "price" : 0.00166666666666667000 + }, + { + "plan_id" : "79bfd606-55ce-439f-a17f-317491cf534b", + "max_quantity" : 500000000000, + "price" : 0.00104166666666667000 + }, + { + "plan_id" : "ef41c15b-3c57-4ddf-947b-89dde3094180", + "max_quantity" : 5000000000000, + "price" : 0.00083333333333333300 + }, + { + "plan_id" : "b9577656-65af-442d-bf02-d70fc56141e6", + "max_quantity" : null, + "price" : 0.00062500000000000000 + } + ] + }, + { + "countable_policy_id" : "cfbf3355-14e7-451e-bf21-a65113f6dd53", + "service" : "heptapod.storage", + "data_unit" : "B", + "data_quantity_for_price" : { + "secability" : "secable", + "quantity" : 1000000000 + }, + "time_interval_for_price" : { + "secability" : "secable", + "interval" : "PT1H" + }, + "first_x_free" : 0, + "price_plans" : [ + { + "plan_id" : "53e1a7c5-99a2-4fb2-9de2-6a645c3eebb6", + "max_quantity" : 1000000000, + "price" : 0E-20 + }, + { + "plan_id" : "0b20edef-d26d-4cb7-ac3e-bf99f66b5fd0", + "max_quantity" : null, + "price" : 0.00004166666666666670 + } + ] + } + ] +} diff --git a/src/stories/fixtures/runtime-plans.js b/src/stories/fixtures/runtime-plans.js index 72284d86e..4ebf357a9 100644 --- a/src/stories/fixtures/runtime-plans.js +++ b/src/stories/fixtures/runtime-plans.js @@ -1,5025 +1,4671 @@ import { formatRuntimeProduct } from '../../lib/product.js'; -import { rawPriceSystem } from './price-system.js'; +import { rawPriceSystemEuro } from './price-system.js'; -/* eslint-disable quote-props */ -const rawInstances = [ +/** + * @typedef {import('../../components/common.types.js').Instance} Instance + * @typedef {import('../../components/common.types.js').PriceSystem} PriceSystem + */ + +/* eslint-disable quote-props, camelcase */ +/** @satisfies {Array} */ +const rawInstances = /** @type {const} */ ([ { - 'type': 'ml_python', - 'version': '20190626', - 'name': 'Python Runner for ML', - 'variant': { - 'id': '5ff2a771-2c19-4eba-b251-c7b2acec2482', - 'slug': 'ml_python', - 'name': 'Python Runner for ML', - 'deployType': 'ml_python', - 'logo': 'https://assets.clever-cloud.com/logos/python-ml.svg', + type: 'ml_python', + version: '20190626', + name: 'Python Runner for ML', + variant: { + id: '5ff2a771-2c19-4eba-b251-c7b2acec2482', + slug: 'ml_python', + name: 'Python Runner for ML', + deployType: 'ml_python', + logo: 'https://assets.clever-cloud.com/logos/python-ml.svg', }, - 'description': 'Python image for ML scripts', - 'enabled': true, - 'comingSoon': false, - 'maxInstances': 40, - 'tags': [], - 'deployments': [ - 'git', - ], - 'flavors': [ - { - 'name': 'ML_XS', - 'mem': 6144, - 'cpus': 8, - 'gpus': 1, - 'disk': null, - 'price': 7.159, - 'available': true, - 'microservice': false, - 'machine_learning': true, - 'nice': 0, - 'price_id': 'apps.ML_XS', - 'memory': { - 'unit': 'B', - 'value': 6442450944, - 'formatted': '6144 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'ML_S', - 'mem': 14336, - 'cpus': 8, - 'gpus': 1, - 'disk': null, - 'price': 10.739, - 'available': true, - 'microservice': false, - 'machine_learning': true, - 'nice': 0, - 'price_id': 'apps.ML_S', - 'memory': { - 'unit': 'B', - 'value': 15032385536, - 'formatted': '14336 MiB', - }, - 'rbdimage': null, + description: 'Python image for ML scripts', + enabled: true, + comingSoon: false, + maxInstances: 40, + tags: [], + deployments: ['git'], + flavors: [ + { + name: 'ML_XS', + mem: 6144, + cpus: 8, + gpus: 1, + disk: null, + price: 7.159, + available: true, + microservice: false, + machine_learning: true, + nice: 0, + price_id: 'apps.ML_XS', + memory: { + unit: 'B', + value: 6442450944, + formatted: '6144 MiB', + }, + }, + { + name: 'ML_S', + mem: 14336, + cpus: 8, + gpus: 1, + disk: null, + price: 10.739, + available: true, + microservice: false, + machine_learning: true, + nice: 0, + price_id: 'apps.ML_S', + memory: { + unit: 'B', + value: 15032385536, + formatted: '14336 MiB', + }, }, ], - 'defaultFlavor': { - 'name': 'ML_S', - 'mem': 14336, - 'cpus': 8, - 'gpus': 1, - 'disk': null, - 'price': 10.739, - 'available': true, - 'microservice': false, - 'machine_learning': true, - 'nice': 0, - 'price_id': 'apps.ML_S', - 'memory': { - 'unit': 'B', - 'value': 15032385536, - 'formatted': '14336 MiB', - }, - 'rbdimage': null, + defaultFlavor: { + name: 'ML_S', + mem: 14336, + cpus: 8, + gpus: 1, + disk: null, + price: 10.739, + available: true, + microservice: false, + machine_learning: true, + nice: 0, + price_id: 'apps.ML_S', + memory: { + unit: 'B', + value: 15032385536, + formatted: '14336 MiB', + }, }, - 'buildFlavor': { - 'name': 'ML_L', - 'mem': 26624, - 'cpus': 16, - 'gpus': 2, - 'disk': null, - 'price': 17.898, - 'available': true, - 'microservice': false, - 'machine_learning': true, - 'nice': 0, - 'price_id': 'apps.ML_L', - 'memory': { - 'unit': 'B', - 'value': 27917287424, - 'formatted': '26624 MiB', - }, - 'rbdimage': null, + buildFlavor: { + name: 'ML_L', + mem: 26624, + cpus: 16, + gpus: 2, + disk: null, + price: 17.898, + available: true, + microservice: false, + machine_learning: true, + nice: 0, + price_id: 'apps.ML_L', + memory: { + unit: 'B', + value: 27917287424, + formatted: '26624 MiB', + }, }, }, { - 'type': 'ml_python', - 'version': '20190626', - 'name': 'Python Webapp for ML', - 'variant': { - 'id': '9d4a021f-c211-4872-92d8-dfd78d071117', - 'slug': 'ml_python_web', - 'name': 'Python Webapp for ML', - 'deployType': 'ml_python', - 'logo': 'https://assets.clever-cloud.com/logos/python-ml.svg', + type: 'ml_python', + version: '20190626', + name: 'Python Webapp for ML', + variant: { + id: '9d4a021f-c211-4872-92d8-dfd78d071117', + slug: 'ml_python_web', + name: 'Python Webapp for ML', + deployType: 'ml_python', + logo: 'https://assets.clever-cloud.com/logos/python-ml.svg', }, - 'description': 'Python image for ML scripts', - 'enabled': true, - 'comingSoon': false, - 'maxInstances': 40, - 'tags': [], - 'deployments': [ - 'git', - ], - 'flavors': [ - { - 'name': 'ML_XS', - 'mem': 6144, - 'cpus': 8, - 'gpus': 1, - 'disk': null, - 'price': 7.159, - 'available': true, - 'microservice': false, - 'machine_learning': true, - 'nice': 0, - 'price_id': 'apps.ML_XS', - 'memory': { - 'unit': 'B', - 'value': 6442450944, - 'formatted': '6144 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'ML_S', - 'mem': 14336, - 'cpus': 8, - 'gpus': 1, - 'disk': null, - 'price': 10.739, - 'available': true, - 'microservice': false, - 'machine_learning': true, - 'nice': 0, - 'price_id': 'apps.ML_S', - 'memory': { - 'unit': 'B', - 'value': 15032385536, - 'formatted': '14336 MiB', - }, - 'rbdimage': null, + description: 'Python image for ML scripts', + enabled: true, + comingSoon: false, + maxInstances: 40, + tags: [], + deployments: ['git'], + flavors: [ + { + name: 'ML_XS', + mem: 6144, + cpus: 8, + gpus: 1, + disk: null, + price: 7.159, + available: true, + microservice: false, + machine_learning: true, + nice: 0, + price_id: 'apps.ML_XS', + memory: { + unit: 'B', + value: 6442450944, + formatted: '6144 MiB', + }, + }, + { + name: 'ML_S', + mem: 14336, + cpus: 8, + gpus: 1, + disk: null, + price: 10.739, + available: true, + microservice: false, + machine_learning: true, + nice: 0, + price_id: 'apps.ML_S', + memory: { + unit: 'B', + value: 15032385536, + formatted: '14336 MiB', + }, }, ], - 'defaultFlavor': { - 'name': 'ML_S', - 'mem': 14336, - 'cpus': 8, - 'gpus': 1, - 'disk': null, - 'price': 10.739, - 'available': true, - 'microservice': false, - 'machine_learning': true, - 'nice': 0, - 'price_id': 'apps.ML_S', - 'memory': { - 'unit': 'B', - 'value': 15032385536, - 'formatted': '14336 MiB', - }, - 'rbdimage': null, + defaultFlavor: { + name: 'ML_S', + mem: 14336, + cpus: 8, + gpus: 1, + disk: null, + price: 10.739, + available: true, + microservice: false, + machine_learning: true, + nice: 0, + price_id: 'apps.ML_S', + memory: { + unit: 'B', + value: 15032385536, + formatted: '14336 MiB', + }, }, - 'buildFlavor': { - 'name': 'ML_L', - 'mem': 26624, - 'cpus': 16, - 'gpus': 2, - 'disk': null, - 'price': 17.898, - 'available': true, - 'microservice': false, - 'machine_learning': true, - 'nice': 0, - 'price_id': 'apps.ML_L', - 'memory': { - 'unit': 'B', - 'value': 27917287424, - 'formatted': '26624 MiB', - }, - 'rbdimage': null, + buildFlavor: { + name: 'ML_L', + mem: 26624, + cpus: 16, + gpus: 2, + disk: null, + price: 17.898, + available: true, + microservice: false, + machine_learning: true, + nice: 0, + price_id: 'apps.ML_L', + memory: { + unit: 'B', + value: 27917287424, + formatted: '26624 MiB', + }, }, }, { - 'type': 'ml_python', - 'version': '20190626', - 'name': 'Java Runner for ML', - 'variant': { - 'id': 'cefe616e-ca82-4fd2-a8ba-d4ef4e350f85', - 'slug': 'ml_java', - 'name': 'Java Runner for ML', - 'deployType': 'java', - 'logo': 'https://assets.clever-cloud.com/logos/java-jar.svg', + type: 'ml_python', + version: '20190626', + name: 'Java Runner for ML', + variant: { + id: 'cefe616e-ca82-4fd2-a8ba-d4ef4e350f85', + slug: 'ml_java', + name: 'Java Runner for ML', + deployType: 'java', + logo: 'https://assets.clever-cloud.com/logos/java-jar.svg', }, - 'description': 'Python image for ML scripts', - 'enabled': true, - 'comingSoon': false, - 'maxInstances': 40, - 'tags': [], - 'deployments': [ - 'git', - ], - 'flavors': [ - { - 'name': 'ML_XS', - 'mem': 6144, - 'cpus': 8, - 'gpus': 1, - 'disk': null, - 'price': 7.159, - 'available': true, - 'microservice': false, - 'machine_learning': true, - 'nice': 0, - 'price_id': 'apps.ML_XS', - 'memory': { - 'unit': 'B', - 'value': 6442450944, - 'formatted': '6144 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'ML_S', - 'mem': 14336, - 'cpus': 8, - 'gpus': 1, - 'disk': null, - 'price': 10.739, - 'available': true, - 'microservice': false, - 'machine_learning': true, - 'nice': 0, - 'price_id': 'apps.ML_S', - 'memory': { - 'unit': 'B', - 'value': 15032385536, - 'formatted': '14336 MiB', - }, - 'rbdimage': null, + description: 'Python image for ML scripts', + enabled: true, + comingSoon: false, + maxInstances: 40, + tags: [], + deployments: ['git'], + flavors: [ + { + name: 'ML_XS', + mem: 6144, + cpus: 8, + gpus: 1, + disk: null, + price: 7.159, + available: true, + microservice: false, + machine_learning: true, + nice: 0, + price_id: 'apps.ML_XS', + memory: { + unit: 'B', + value: 6442450944, + formatted: '6144 MiB', + }, + }, + { + name: 'ML_S', + mem: 14336, + cpus: 8, + gpus: 1, + disk: null, + price: 10.739, + available: true, + microservice: false, + machine_learning: true, + nice: 0, + price_id: 'apps.ML_S', + memory: { + unit: 'B', + value: 15032385536, + formatted: '14336 MiB', + }, }, ], - 'defaultFlavor': { - 'name': 'ML_S', - 'mem': 14336, - 'cpus': 8, - 'gpus': 1, - 'disk': null, - 'price': 10.739, - 'available': true, - 'microservice': false, - 'machine_learning': true, - 'nice': 0, - 'price_id': 'apps.ML_S', - 'memory': { - 'unit': 'B', - 'value': 15032385536, - 'formatted': '14336 MiB', - }, - 'rbdimage': null, + defaultFlavor: { + name: 'ML_S', + mem: 14336, + cpus: 8, + gpus: 1, + disk: null, + price: 10.739, + available: true, + microservice: false, + machine_learning: true, + nice: 0, + price_id: 'apps.ML_S', + memory: { + unit: 'B', + value: 15032385536, + formatted: '14336 MiB', + }, }, - 'buildFlavor': { - 'name': 'ML_L', - 'mem': 26624, - 'cpus': 16, - 'gpus': 2, - 'disk': null, - 'price': 17.898, - 'available': true, - 'microservice': false, - 'machine_learning': true, - 'nice': 0, - 'price_id': 'apps.ML_L', - 'memory': { - 'unit': 'B', - 'value': 27917287424, - 'formatted': '26624 MiB', - }, - 'rbdimage': null, + buildFlavor: { + name: 'ML_L', + mem: 26624, + cpus: 16, + gpus: 2, + disk: null, + price: 17.898, + available: true, + microservice: false, + machine_learning: true, + nice: 0, + price_id: 'apps.ML_L', + memory: { + unit: 'B', + value: 27917287424, + formatted: '26624 MiB', + }, }, }, { - 'type': 'ml_python', - 'version': '20190626', - 'name': 'Java Webapp for ML', - 'variant': { - 'id': 'c81ef03d-c9ee-4544-bbde-9fbe816bea98', - 'slug': 'ml_java_web', - 'name': 'Java Webapp for ML', - 'deployType': 'java', - 'logo': 'https://assets.clever-cloud.com/logos/java-jar.svg', + type: 'ml_python', + version: '20190626', + name: 'Java Webapp for ML', + variant: { + id: 'c81ef03d-c9ee-4544-bbde-9fbe816bea98', + slug: 'ml_java_web', + name: 'Java Webapp for ML', + deployType: 'java', + logo: 'https://assets.clever-cloud.com/logos/java-jar.svg', }, - 'description': 'Python image for ML scripts', - 'enabled': true, - 'comingSoon': false, - 'maxInstances': 40, - 'tags': [], - 'deployments': [ - 'git', - ], - 'flavors': [ - { - 'name': 'ML_XS', - 'mem': 6144, - 'cpus': 8, - 'gpus': 1, - 'disk': null, - 'price': 7.159, - 'available': true, - 'microservice': false, - 'machine_learning': true, - 'nice': 0, - 'price_id': 'apps.ML_XS', - 'memory': { - 'unit': 'B', - 'value': 6442450944, - 'formatted': '6144 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'ML_S', - 'mem': 14336, - 'cpus': 8, - 'gpus': 1, - 'disk': null, - 'price': 10.739, - 'available': true, - 'microservice': false, - 'machine_learning': true, - 'nice': 0, - 'price_id': 'apps.ML_S', - 'memory': { - 'unit': 'B', - 'value': 15032385536, - 'formatted': '14336 MiB', - }, - 'rbdimage': null, + description: 'Python image for ML scripts', + enabled: true, + comingSoon: false, + maxInstances: 40, + tags: [], + deployments: ['git'], + flavors: [ + { + name: 'ML_XS', + mem: 6144, + cpus: 8, + gpus: 1, + disk: null, + price: 7.159, + available: true, + microservice: false, + machine_learning: true, + nice: 0, + price_id: 'apps.ML_XS', + memory: { + unit: 'B', + value: 6442450944, + formatted: '6144 MiB', + }, + }, + { + name: 'ML_S', + mem: 14336, + cpus: 8, + gpus: 1, + disk: null, + price: 10.739, + available: true, + microservice: false, + machine_learning: true, + nice: 0, + price_id: 'apps.ML_S', + memory: { + unit: 'B', + value: 15032385536, + formatted: '14336 MiB', + }, }, ], - 'defaultFlavor': { - 'name': 'ML_S', - 'mem': 14336, - 'cpus': 8, - 'gpus': 1, - 'disk': null, - 'price': 10.739, - 'available': true, - 'microservice': false, - 'machine_learning': true, - 'nice': 0, - 'price_id': 'apps.ML_S', - 'memory': { - 'unit': 'B', - 'value': 15032385536, - 'formatted': '14336 MiB', - }, - 'rbdimage': null, + defaultFlavor: { + name: 'ML_S', + mem: 14336, + cpus: 8, + gpus: 1, + disk: null, + price: 10.739, + available: true, + microservice: false, + machine_learning: true, + nice: 0, + price_id: 'apps.ML_S', + memory: { + unit: 'B', + value: 15032385536, + formatted: '14336 MiB', + }, }, - 'buildFlavor': { - 'name': 'ML_L', - 'mem': 26624, - 'cpus': 16, - 'gpus': 2, - 'disk': null, - 'price': 17.898, - 'available': true, - 'microservice': false, - 'machine_learning': true, - 'nice': 0, - 'price_id': 'apps.ML_L', - 'memory': { - 'unit': 'B', - 'value': 27917287424, - 'formatted': '26624 MiB', - }, - 'rbdimage': null, + buildFlavor: { + name: 'ML_L', + mem: 26624, + cpus: 16, + gpus: 2, + disk: null, + price: 17.898, + available: true, + microservice: false, + machine_learning: true, + nice: 0, + price_id: 'apps.ML_L', + memory: { + unit: 'B', + value: 27917287424, + formatted: '26624 MiB', + }, }, }, { - 'type': 'ml_docker', - 'version': '20190703', - 'name': 'Docker Runner for ML', - 'variant': { - 'id': 'e93c3d0c-a374-45b9-aa7f-4d3ecfb6e49b', - 'slug': 'ml_docker', - 'name': 'Docker Runner for ML', - 'deployType': 'docker', - 'logo': 'https://assets.clever-cloud.com/logos/docker.svg', + type: 'ml_docker', + version: '20190703', + name: 'Docker Runner for ML', + variant: { + id: 'e93c3d0c-a374-45b9-aa7f-4d3ecfb6e49b', + slug: 'ml_docker', + name: 'Docker Runner for ML', + deployType: 'docker', + logo: 'https://assets.clever-cloud.com/logos/docker.svg', }, - 'description': 'Docker for ML', - 'enabled': true, - 'comingSoon': false, - 'maxInstances': 40, - 'tags': [], - 'deployments': [ - 'git', - ], - 'flavors': [ - { - 'name': 'ML_XS', - 'mem': 6144, - 'cpus': 8, - 'gpus': 1, - 'disk': null, - 'price': 7.159, - 'available': true, - 'microservice': false, - 'machine_learning': true, - 'nice': 0, - 'price_id': 'apps.ML_XS', - 'memory': { - 'unit': 'B', - 'value': 6442450944, - 'formatted': '6144 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'ML_S', - 'mem': 14336, - 'cpus': 8, - 'gpus': 1, - 'disk': null, - 'price': 10.739, - 'available': true, - 'microservice': false, - 'machine_learning': true, - 'nice': 0, - 'price_id': 'apps.ML_S', - 'memory': { - 'unit': 'B', - 'value': 15032385536, - 'formatted': '14336 MiB', - }, - 'rbdimage': null, + description: 'Docker for ML', + enabled: true, + comingSoon: false, + maxInstances: 40, + tags: [], + deployments: ['git'], + flavors: [ + { + name: 'ML_XS', + mem: 6144, + cpus: 8, + gpus: 1, + disk: null, + price: 7.159, + available: true, + microservice: false, + machine_learning: true, + nice: 0, + price_id: 'apps.ML_XS', + memory: { + unit: 'B', + value: 6442450944, + formatted: '6144 MiB', + }, + }, + { + name: 'ML_S', + mem: 14336, + cpus: 8, + gpus: 1, + disk: null, + price: 10.739, + available: true, + microservice: false, + machine_learning: true, + nice: 0, + price_id: 'apps.ML_S', + memory: { + unit: 'B', + value: 15032385536, + formatted: '14336 MiB', + }, }, ], - 'defaultFlavor': { - 'name': 'ML_S', - 'mem': 14336, - 'cpus': 8, - 'gpus': 1, - 'disk': null, - 'price': 10.739, - 'available': true, - 'microservice': false, - 'machine_learning': true, - 'nice': 0, - 'price_id': 'apps.ML_S', - 'memory': { - 'unit': 'B', - 'value': 15032385536, - 'formatted': '14336 MiB', - }, - 'rbdimage': null, + defaultFlavor: { + name: 'ML_S', + mem: 14336, + cpus: 8, + gpus: 1, + disk: null, + price: 10.739, + available: true, + microservice: false, + machine_learning: true, + nice: 0, + price_id: 'apps.ML_S', + memory: { + unit: 'B', + value: 15032385536, + formatted: '14336 MiB', + }, }, - 'buildFlavor': { - 'name': 'ML_L', - 'mem': 26624, - 'cpus': 16, - 'gpus': 2, - 'disk': null, - 'price': 17.898, - 'available': true, - 'microservice': false, - 'machine_learning': true, - 'nice': 0, - 'price_id': 'apps.ML_L', - 'memory': { - 'unit': 'B', - 'value': 27917287424, - 'formatted': '26624 MiB', - }, - 'rbdimage': null, + buildFlavor: { + name: 'ML_L', + mem: 26624, + cpus: 16, + gpus: 2, + disk: null, + price: 17.898, + available: true, + microservice: false, + machine_learning: true, + nice: 0, + price_id: 'apps.ML_L', + memory: { + unit: 'B', + value: 27917287424, + formatted: '26624 MiB', + }, }, }, { - 'type': 'ml_docker', - 'version': '20190703', - 'name': 'Docker Webapp for ML', - 'variant': { - 'id': '7a2c7450-4eff-4c56-b6a9-50ceb5841440', - 'slug': 'ml_docker_web', - 'name': 'Docker Webapp for ML', - 'deployType': 'docker', - 'logo': 'https://assets.clever-cloud.com/logos/docker.svg', + type: 'ml_docker', + version: '20190703', + name: 'Docker Webapp for ML', + variant: { + id: '7a2c7450-4eff-4c56-b6a9-50ceb5841440', + slug: 'ml_docker_web', + name: 'Docker Webapp for ML', + deployType: 'docker', + logo: 'https://assets.clever-cloud.com/logos/docker.svg', }, - 'description': 'Docker for ML', - 'enabled': true, - 'comingSoon': false, - 'maxInstances': 40, - 'tags': [], - 'deployments': [ - 'git', - ], - 'flavors': [ - { - 'name': 'ML_XS', - 'mem': 6144, - 'cpus': 8, - 'gpus': 1, - 'disk': null, - 'price': 7.159, - 'available': true, - 'microservice': false, - 'machine_learning': true, - 'nice': 0, - 'price_id': 'apps.ML_XS', - 'memory': { - 'unit': 'B', - 'value': 6442450944, - 'formatted': '6144 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'ML_S', - 'mem': 14336, - 'cpus': 8, - 'gpus': 1, - 'disk': null, - 'price': 10.739, - 'available': true, - 'microservice': false, - 'machine_learning': true, - 'nice': 0, - 'price_id': 'apps.ML_S', - 'memory': { - 'unit': 'B', - 'value': 15032385536, - 'formatted': '14336 MiB', - }, - 'rbdimage': null, + description: 'Docker for ML', + enabled: true, + comingSoon: false, + maxInstances: 40, + tags: [], + deployments: ['git'], + flavors: [ + { + name: 'ML_XS', + mem: 6144, + cpus: 8, + gpus: 1, + disk: null, + price: 7.159, + available: true, + microservice: false, + machine_learning: true, + nice: 0, + price_id: 'apps.ML_XS', + memory: { + unit: 'B', + value: 6442450944, + formatted: '6144 MiB', + }, + }, + { + name: 'ML_S', + mem: 14336, + cpus: 8, + gpus: 1, + disk: null, + price: 10.739, + available: true, + microservice: false, + machine_learning: true, + nice: 0, + price_id: 'apps.ML_S', + memory: { + unit: 'B', + value: 15032385536, + formatted: '14336 MiB', + }, }, ], - 'defaultFlavor': { - 'name': 'ML_S', - 'mem': 14336, - 'cpus': 8, - 'gpus': 1, - 'disk': null, - 'price': 10.739, - 'available': true, - 'microservice': false, - 'machine_learning': true, - 'nice': 0, - 'price_id': 'apps.ML_S', - 'memory': { - 'unit': 'B', - 'value': 15032385536, - 'formatted': '14336 MiB', - }, - 'rbdimage': null, + defaultFlavor: { + name: 'ML_S', + mem: 14336, + cpus: 8, + gpus: 1, + disk: null, + price: 10.739, + available: true, + microservice: false, + machine_learning: true, + nice: 0, + price_id: 'apps.ML_S', + memory: { + unit: 'B', + value: 15032385536, + formatted: '14336 MiB', + }, }, - 'buildFlavor': { - 'name': 'ML_L', - 'mem': 26624, - 'cpus': 16, - 'gpus': 2, - 'disk': null, - 'price': 17.898, - 'available': true, - 'microservice': false, - 'machine_learning': true, - 'nice': 0, - 'price_id': 'apps.ML_L', - 'memory': { - 'unit': 'B', - 'value': 27917287424, - 'formatted': '26624 MiB', - }, - 'rbdimage': null, + buildFlavor: { + name: 'ML_L', + mem: 26624, + cpus: 16, + gpus: 2, + disk: null, + price: 17.898, + available: true, + microservice: false, + machine_learning: true, + nice: 0, + price_id: 'apps.ML_L', + memory: { + unit: 'B', + value: 27917287424, + formatted: '26624 MiB', + }, }, }, { - 'type': 'dotnet', - 'version': '20210421', - 'name': '.NET core', - 'variant': { - 'id': '08af642a-e48c-40d0-9fc0-124ee9dc0535', - 'slug': 'dotnet', - 'name': '.NET core', - 'deployType': 'dotnet', - 'logo': 'https://assets.clever-cloud.com/logos/dotnet.svg', + type: 'dotnet', + version: '20210421', + name: '.NET core', + variant: { + id: '08af642a-e48c-40d0-9fc0-124ee9dc0535', + slug: 'dotnet', + name: '.NET core', + deployType: 'dotnet', + logo: 'https://assets.clever-cloud.com/logos/dotnet.svg', }, - 'description': '.NET Core', - 'enabled': true, - 'comingSoon': false, - 'maxInstances': 40, - 'tags': [ - '.net', - 'core', - 'asp', - ], - 'deployments': [ - 'git', - ], - 'flavors': [ - { - 'name': 'pico', - 'mem': 256, - 'cpus': 1, - 'gpus': 0, - 'disk': null, - 'price': 0.1073883162, - 'available': true, - 'microservice': true, - 'machine_learning': false, - 'nice': 5, - 'price_id': 'apps.pico', - 'memory': { - 'unit': 'B', - 'value': 268435456, - 'formatted': '256 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'nano', - 'mem': 512, - 'cpus': 1, - 'gpus': 0, - 'disk': null, - 'price': 0.1431844215, - 'available': true, - 'microservice': true, - 'machine_learning': false, - 'nice': 5, - 'price_id': 'apps.nano', - 'memory': { - 'unit': 'B', - 'value': 536870912, - 'formatted': '512 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'XS', - 'mem': 1024, - 'cpus': 1, - 'gpus': 0, - 'disk': null, - 'price': 0.3436, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.XS', - 'memory': { - 'unit': 'B', - 'value': 1073741824, - 'formatted': '1024 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'S', - 'mem': 2048, - 'cpus': 2, - 'gpus': 0, - 'disk': null, - 'price': 0.6873, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.S', - 'memory': { - 'unit': 'B', - 'value': 2147483648, - 'formatted': '2048 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'M', - 'mem': 4096, - 'cpus': 4, - 'gpus': 0, - 'disk': null, - 'price': 1.7182, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.M', - 'memory': { - 'unit': 'B', - 'value': 4294967296, - 'formatted': '4096 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'L', - 'mem': 8192, - 'cpus': 6, - 'gpus': 0, - 'disk': null, - 'price': 3.4364, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.L', - 'memory': { - 'unit': 'B', - 'value': 8589934592, - 'formatted': '8192 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'XL', - 'mem': 16384, - 'cpus': 8, - 'gpus': 0, - 'disk': null, - 'price': 6.8729, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.XL', - 'memory': { - 'unit': 'B', - 'value': 17179869184, - 'formatted': '16384 MiB', - }, - 'rbdimage': null, - }, - { - 'name': '2XL', - 'mem': 24576, - 'cpus': 12, - 'gpus': 0, - 'disk': null, - 'price': 13.7458, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.2XL', - 'memory': { - 'unit': 'B', - 'value': 25769803776, - 'formatted': '24576 MiB', - }, - 'rbdimage': null, - }, - { - 'name': '3XL', - 'mem': 32768, - 'cpus': 16, - 'gpus': 0, - 'disk': null, - 'price': 27.4915, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.3XL', - 'memory': { - 'unit': 'B', - 'value': 34359738368, - 'formatted': '32768 MiB', - }, - 'rbdimage': null, + description: '.NET Core', + enabled: true, + comingSoon: false, + maxInstances: 40, + tags: ['.net', 'core', 'asp'], + deployments: ['git'], + flavors: [ + { + name: 'pico', + mem: 256, + cpus: 1, + gpus: 0, + disk: null, + price: 0.1073883162, + available: true, + microservice: true, + machine_learning: false, + nice: 5, + price_id: 'apps.pico', + memory: { + unit: 'B', + value: 268435456, + formatted: '256 MiB', + }, + }, + { + name: 'nano', + mem: 512, + cpus: 1, + gpus: 0, + disk: null, + price: 0.1431844215, + available: true, + microservice: true, + machine_learning: false, + nice: 5, + price_id: 'apps.nano', + memory: { + unit: 'B', + value: 536870912, + formatted: '512 MiB', + }, + }, + { + name: 'XS', + mem: 1024, + cpus: 1, + gpus: 0, + disk: null, + price: 0.3436, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.XS', + memory: { + unit: 'B', + value: 1073741824, + formatted: '1024 MiB', + }, + }, + { + name: 'S', + mem: 2048, + cpus: 2, + gpus: 0, + disk: null, + price: 0.6873, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.S', + memory: { + unit: 'B', + value: 2147483648, + formatted: '2048 MiB', + }, + }, + { + name: 'M', + mem: 4096, + cpus: 4, + gpus: 0, + disk: null, + price: 1.7182, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.M', + memory: { + unit: 'B', + value: 4294967296, + formatted: '4096 MiB', + }, + }, + { + name: 'L', + mem: 8192, + cpus: 6, + gpus: 0, + disk: null, + price: 3.4364, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.L', + memory: { + unit: 'B', + value: 8589934592, + formatted: '8192 MiB', + }, + }, + { + name: 'XL', + mem: 16384, + cpus: 8, + gpus: 0, + disk: null, + price: 6.8729, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.XL', + memory: { + unit: 'B', + value: 17179869184, + formatted: '16384 MiB', + }, + }, + { + name: '2XL', + mem: 24576, + cpus: 12, + gpus: 0, + disk: null, + price: 13.7458, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.2XL', + memory: { + unit: 'B', + value: 25769803776, + formatted: '24576 MiB', + }, + }, + { + name: '3XL', + mem: 32768, + cpus: 16, + gpus: 0, + disk: null, + price: 27.4915, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.3XL', + memory: { + unit: 'B', + value: 34359738368, + formatted: '32768 MiB', + }, }, ], - 'defaultFlavor': { - 'name': 'XS', - 'mem': 1024, - 'cpus': 1, - 'gpus': 0, - 'disk': null, - 'price': 0.3436, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.XS', - 'memory': { - 'unit': 'B', - 'value': 1073741824, - 'formatted': '1024 MiB', - }, - 'rbdimage': null, + defaultFlavor: { + name: 'XS', + mem: 1024, + cpus: 1, + gpus: 0, + disk: null, + price: 0.3436, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.XS', + memory: { + unit: 'B', + value: 1073741824, + formatted: '1024 MiB', + }, }, - 'buildFlavor': { - 'name': 'M', - 'mem': 4096, - 'cpus': 4, - 'gpus': 0, - 'disk': null, - 'price': 1.7182, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.M', - 'memory': { - 'unit': 'B', - 'value': 4294967296, - 'formatted': '4096 MiB', - }, - 'rbdimage': null, + buildFlavor: { + name: 'M', + mem: 4096, + cpus: 4, + gpus: 0, + disk: null, + price: 1.7182, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.M', + memory: { + unit: 'B', + value: 4294967296, + formatted: '4096 MiB', + }, }, }, { - 'type': 'erlang', - 'version': '20210421', - 'name': 'Elixir', - 'variant': { - 'id': '9e23b9a8-d40e-41ad-9739-5d31b81e200e', - 'slug': 'elixir', - 'name': 'Elixir', - 'deployType': 'erlang', - 'logo': 'https://assets.clever-cloud.com/logos/elixir.svg', + type: 'erlang', + version: '20210421', + name: 'Elixir', + variant: { + id: '9e23b9a8-d40e-41ad-9739-5d31b81e200e', + slug: 'elixir', + name: 'Elixir', + deployType: 'erlang', + logo: 'https://assets.clever-cloud.com/logos/elixir.svg', }, - 'description': 'Erlang applications', - 'enabled': true, - 'comingSoon': false, - 'maxInstances': 40, - 'tags': [], - 'deployments': [ - 'git', - ], - 'flavors': [ - { - 'name': 'pico', - 'mem': 256, - 'cpus': 1, - 'gpus': 0, - 'disk': null, - 'price': 0.1073883162, - 'available': true, - 'microservice': true, - 'machine_learning': false, - 'nice': 5, - 'price_id': 'apps.pico', - 'memory': { - 'unit': 'B', - 'value': 268435456, - 'formatted': '256 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'nano', - 'mem': 512, - 'cpus': 1, - 'gpus': 0, - 'disk': null, - 'price': 0.1431844215, - 'available': true, - 'microservice': true, - 'machine_learning': false, - 'nice': 5, - 'price_id': 'apps.nano', - 'memory': { - 'unit': 'B', - 'value': 536870912, - 'formatted': '512 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'XS', - 'mem': 1024, - 'cpus': 1, - 'gpus': 0, - 'disk': null, - 'price': 0.3436, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.XS', - 'memory': { - 'unit': 'B', - 'value': 1073741824, - 'formatted': '1024 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'S', - 'mem': 2048, - 'cpus': 2, - 'gpus': 0, - 'disk': null, - 'price': 0.6873, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.S', - 'memory': { - 'unit': 'B', - 'value': 2147483648, - 'formatted': '2048 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'M', - 'mem': 4096, - 'cpus': 4, - 'gpus': 0, - 'disk': null, - 'price': 1.7182, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.M', - 'memory': { - 'unit': 'B', - 'value': 4294967296, - 'formatted': '4096 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'L', - 'mem': 8192, - 'cpus': 6, - 'gpus': 0, - 'disk': null, - 'price': 3.4364, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.L', - 'memory': { - 'unit': 'B', - 'value': 8589934592, - 'formatted': '8192 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'XL', - 'mem': 16384, - 'cpus': 8, - 'gpus': 0, - 'disk': null, - 'price': 6.8729, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.XL', - 'memory': { - 'unit': 'B', - 'value': 17179869184, - 'formatted': '16384 MiB', - }, - 'rbdimage': null, - }, - { - 'name': '2XL', - 'mem': 24576, - 'cpus': 12, - 'gpus': 0, - 'disk': null, - 'price': 13.7458, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.2XL', - 'memory': { - 'unit': 'B', - 'value': 25769803776, - 'formatted': '24576 MiB', - }, - 'rbdimage': null, - }, - { - 'name': '3XL', - 'mem': 32768, - 'cpus': 16, - 'gpus': 0, - 'disk': null, - 'price': 27.4915, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.3XL', - 'memory': { - 'unit': 'B', - 'value': 34359738368, - 'formatted': '32768 MiB', - }, - 'rbdimage': null, + description: 'Erlang applications', + enabled: true, + comingSoon: false, + maxInstances: 40, + tags: [], + deployments: ['git'], + flavors: [ + { + name: 'pico', + mem: 256, + cpus: 1, + gpus: 0, + disk: null, + price: 0.1073883162, + available: true, + microservice: true, + machine_learning: false, + nice: 5, + price_id: 'apps.pico', + memory: { + unit: 'B', + value: 268435456, + formatted: '256 MiB', + }, + }, + { + name: 'nano', + mem: 512, + cpus: 1, + gpus: 0, + disk: null, + price: 0.1431844215, + available: true, + microservice: true, + machine_learning: false, + nice: 5, + price_id: 'apps.nano', + memory: { + unit: 'B', + value: 536870912, + formatted: '512 MiB', + }, + }, + { + name: 'XS', + mem: 1024, + cpus: 1, + gpus: 0, + disk: null, + price: 0.3436, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.XS', + memory: { + unit: 'B', + value: 1073741824, + formatted: '1024 MiB', + }, + }, + { + name: 'S', + mem: 2048, + cpus: 2, + gpus: 0, + disk: null, + price: 0.6873, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.S', + memory: { + unit: 'B', + value: 2147483648, + formatted: '2048 MiB', + }, + }, + { + name: 'M', + mem: 4096, + cpus: 4, + gpus: 0, + disk: null, + price: 1.7182, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.M', + memory: { + unit: 'B', + value: 4294967296, + formatted: '4096 MiB', + }, + }, + { + name: 'L', + mem: 8192, + cpus: 6, + gpus: 0, + disk: null, + price: 3.4364, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.L', + memory: { + unit: 'B', + value: 8589934592, + formatted: '8192 MiB', + }, + }, + { + name: 'XL', + mem: 16384, + cpus: 8, + gpus: 0, + disk: null, + price: 6.8729, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.XL', + memory: { + unit: 'B', + value: 17179869184, + formatted: '16384 MiB', + }, + }, + { + name: '2XL', + mem: 24576, + cpus: 12, + gpus: 0, + disk: null, + price: 13.7458, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.2XL', + memory: { + unit: 'B', + value: 25769803776, + formatted: '24576 MiB', + }, + }, + { + name: '3XL', + mem: 32768, + cpus: 16, + gpus: 0, + disk: null, + price: 27.4915, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.3XL', + memory: { + unit: 'B', + value: 34359738368, + formatted: '32768 MiB', + }, }, ], - 'defaultFlavor': { - 'name': 'XS', - 'mem': 1024, - 'cpus': 1, - 'gpus': 0, - 'disk': null, - 'price': 0.3436, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.XS', - 'memory': { - 'unit': 'B', - 'value': 1073741824, - 'formatted': '1024 MiB', - }, - 'rbdimage': null, + defaultFlavor: { + name: 'XS', + mem: 1024, + cpus: 1, + gpus: 0, + disk: null, + price: 0.3436, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.XS', + memory: { + unit: 'B', + value: 1073741824, + formatted: '1024 MiB', + }, }, - 'buildFlavor': { - 'name': 'M', - 'mem': 4096, - 'cpus': 4, - 'gpus': 0, - 'disk': null, - 'price': 1.7182, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.M', - 'memory': { - 'unit': 'B', - 'value': 4294967296, - 'formatted': '4096 MiB', - }, - 'rbdimage': null, + buildFlavor: { + name: 'M', + mem: 4096, + cpus: 4, + gpus: 0, + disk: null, + price: 1.7182, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.M', + memory: { + unit: 'B', + value: 4294967296, + formatted: '4096 MiB', + }, }, }, { - 'type': 'go', - 'version': '20210421', - 'name': 'Go', - 'variant': { - 'id': 'b7e506a9-241e-49b9-85d4-df74d85e0178', - 'slug': 'go', - 'name': 'Go', - 'deployType': 'go', - 'logo': 'https://assets.clever-cloud.com/logos/go.svg', + type: 'go', + version: '20210421', + name: 'Go', + variant: { + id: 'b7e506a9-241e-49b9-85d4-df74d85e0178', + slug: 'go', + name: 'Go', + deployType: 'go', + logo: 'https://assets.clever-cloud.com/logos/go.svg', }, - 'description': 'go', - 'enabled': true, - 'comingSoon': false, - 'maxInstances': 40, - 'tags': [], - 'deployments': [ - 'git', - ], - 'flavors': [ - { - 'name': 'pico', - 'mem': 256, - 'cpus': 1, - 'gpus': 0, - 'disk': null, - 'price': 0.1073883162, - 'available': true, - 'microservice': true, - 'machine_learning': false, - 'nice': 5, - 'price_id': 'apps.pico', - 'memory': { - 'unit': 'B', - 'value': 268435456, - 'formatted': '256 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'nano', - 'mem': 512, - 'cpus': 1, - 'gpus': 0, - 'disk': null, - 'price': 0.1431844215, - 'available': true, - 'microservice': true, - 'machine_learning': false, - 'nice': 5, - 'price_id': 'apps.nano', - 'memory': { - 'unit': 'B', - 'value': 536870912, - 'formatted': '512 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'XS', - 'mem': 1024, - 'cpus': 1, - 'gpus': 0, - 'disk': null, - 'price': 0.3436, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.XS', - 'memory': { - 'unit': 'B', - 'value': 1073741824, - 'formatted': '1024 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'S', - 'mem': 2048, - 'cpus': 2, - 'gpus': 0, - 'disk': null, - 'price': 0.6873, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.S', - 'memory': { - 'unit': 'B', - 'value': 2147483648, - 'formatted': '2048 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'M', - 'mem': 4096, - 'cpus': 4, - 'gpus': 0, - 'disk': null, - 'price': 1.7182, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.M', - 'memory': { - 'unit': 'B', - 'value': 4294967296, - 'formatted': '4096 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'L', - 'mem': 8192, - 'cpus': 6, - 'gpus': 0, - 'disk': null, - 'price': 3.4364, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.L', - 'memory': { - 'unit': 'B', - 'value': 8589934592, - 'formatted': '8192 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'XL', - 'mem': 16384, - 'cpus': 8, - 'gpus': 0, - 'disk': null, - 'price': 6.8729, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.XL', - 'memory': { - 'unit': 'B', - 'value': 17179869184, - 'formatted': '16384 MiB', - }, - 'rbdimage': null, - }, - { - 'name': '2XL', - 'mem': 24576, - 'cpus': 12, - 'gpus': 0, - 'disk': null, - 'price': 13.7458, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.2XL', - 'memory': { - 'unit': 'B', - 'value': 25769803776, - 'formatted': '24576 MiB', - }, - 'rbdimage': null, - }, - { - 'name': '3XL', - 'mem': 32768, - 'cpus': 16, - 'gpus': 0, - 'disk': null, - 'price': 27.4915, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.3XL', - 'memory': { - 'unit': 'B', - 'value': 34359738368, - 'formatted': '32768 MiB', - }, - 'rbdimage': null, + description: 'go', + enabled: true, + comingSoon: false, + maxInstances: 40, + tags: [], + deployments: ['git'], + flavors: [ + { + name: 'pico', + mem: 256, + cpus: 1, + gpus: 0, + disk: null, + price: 0.1073883162, + available: true, + microservice: true, + machine_learning: false, + nice: 5, + price_id: 'apps.pico', + memory: { + unit: 'B', + value: 268435456, + formatted: '256 MiB', + }, + }, + { + name: 'nano', + mem: 512, + cpus: 1, + gpus: 0, + disk: null, + price: 0.1431844215, + available: true, + microservice: true, + machine_learning: false, + nice: 5, + price_id: 'apps.nano', + memory: { + unit: 'B', + value: 536870912, + formatted: '512 MiB', + }, + }, + { + name: 'XS', + mem: 1024, + cpus: 1, + gpus: 0, + disk: null, + price: 0.3436, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.XS', + memory: { + unit: 'B', + value: 1073741824, + formatted: '1024 MiB', + }, + }, + { + name: 'S', + mem: 2048, + cpus: 2, + gpus: 0, + disk: null, + price: 0.6873, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.S', + memory: { + unit: 'B', + value: 2147483648, + formatted: '2048 MiB', + }, + }, + { + name: 'M', + mem: 4096, + cpus: 4, + gpus: 0, + disk: null, + price: 1.7182, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.M', + memory: { + unit: 'B', + value: 4294967296, + formatted: '4096 MiB', + }, + }, + { + name: 'L', + mem: 8192, + cpus: 6, + gpus: 0, + disk: null, + price: 3.4364, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.L', + memory: { + unit: 'B', + value: 8589934592, + formatted: '8192 MiB', + }, + }, + { + name: 'XL', + mem: 16384, + cpus: 8, + gpus: 0, + disk: null, + price: 6.8729, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.XL', + memory: { + unit: 'B', + value: 17179869184, + formatted: '16384 MiB', + }, + }, + { + name: '2XL', + mem: 24576, + cpus: 12, + gpus: 0, + disk: null, + price: 13.7458, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.2XL', + memory: { + unit: 'B', + value: 25769803776, + formatted: '24576 MiB', + }, + }, + { + name: '3XL', + mem: 32768, + cpus: 16, + gpus: 0, + disk: null, + price: 27.4915, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.3XL', + memory: { + unit: 'B', + value: 34359738368, + formatted: '32768 MiB', + }, }, ], - 'defaultFlavor': { - 'name': 'XS', - 'mem': 1024, - 'cpus': 1, - 'gpus': 0, - 'disk': null, - 'price': 0.3436, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.XS', - 'memory': { - 'unit': 'B', - 'value': 1073741824, - 'formatted': '1024 MiB', - }, - 'rbdimage': null, + defaultFlavor: { + name: 'XS', + mem: 1024, + cpus: 1, + gpus: 0, + disk: null, + price: 0.3436, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.XS', + memory: { + unit: 'B', + value: 1073741824, + formatted: '1024 MiB', + }, }, - 'buildFlavor': { - 'name': 'S', - 'mem': 2048, - 'cpus': 2, - 'gpus': 0, - 'disk': null, - 'price': 0.6873, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.S', - 'memory': { - 'unit': 'B', - 'value': 2147483648, - 'formatted': '2048 MiB', - }, - 'rbdimage': null, + buildFlavor: { + name: 'S', + mem: 2048, + cpus: 2, + gpus: 0, + disk: null, + price: 0.6873, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.S', + memory: { + unit: 'B', + value: 2147483648, + formatted: '2048 MiB', + }, }, }, { - 'type': 'node', - 'version': '20210421', - 'name': 'Meteor.js', - 'variant': { - 'id': '4afcf49b-6819-4bba-a062-ab2c11278b9d', - 'slug': 'meteor', - 'name': 'Meteor.js', - 'deployType': 'node', - 'logo': 'https://assets.clever-cloud.com/logos/meteor.svg', + type: 'node', + version: '20210421', + name: 'Meteor.js', + variant: { + id: '4afcf49b-6819-4bba-a062-ab2c11278b9d', + slug: 'meteor', + name: 'Meteor.js', + deployType: 'node', + logo: 'https://assets.clever-cloud.com/logos/meteor.svg', }, - 'description': 'node', - 'enabled': true, - 'comingSoon': false, - 'maxInstances': 40, - 'tags': [ - 'javascript', - 'node', - ], - 'deployments': [ - 'git', - ], - 'flavors': [ - { - 'name': 'pico', - 'mem': 256, - 'cpus': 1, - 'gpus': 0, - 'disk': null, - 'price': 0.1073883162, - 'available': true, - 'microservice': true, - 'machine_learning': false, - 'nice': 5, - 'price_id': 'apps.pico', - 'memory': { - 'unit': 'B', - 'value': 268435456, - 'formatted': '256 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'nano', - 'mem': 512, - 'cpus': 1, - 'gpus': 0, - 'disk': null, - 'price': 0.1431844215, - 'available': true, - 'microservice': true, - 'machine_learning': false, - 'nice': 5, - 'price_id': 'apps.nano', - 'memory': { - 'unit': 'B', - 'value': 536870912, - 'formatted': '512 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'XS', - 'mem': 1024, - 'cpus': 1, - 'gpus': 0, - 'disk': null, - 'price': 0.3436, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.XS', - 'memory': { - 'unit': 'B', - 'value': 1073741824, - 'formatted': '1024 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'S', - 'mem': 2048, - 'cpus': 2, - 'gpus': 0, - 'disk': null, - 'price': 0.6873, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.S', - 'memory': { - 'unit': 'B', - 'value': 2147483648, - 'formatted': '2048 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'M', - 'mem': 4096, - 'cpus': 4, - 'gpus': 0, - 'disk': null, - 'price': 1.7182, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.M', - 'memory': { - 'unit': 'B', - 'value': 4294967296, - 'formatted': '4096 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'L', - 'mem': 8192, - 'cpus': 6, - 'gpus': 0, - 'disk': null, - 'price': 3.4364, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.L', - 'memory': { - 'unit': 'B', - 'value': 8589934592, - 'formatted': '8192 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'XL', - 'mem': 16384, - 'cpus': 8, - 'gpus': 0, - 'disk': null, - 'price': 6.8729, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.XL', - 'memory': { - 'unit': 'B', - 'value': 17179869184, - 'formatted': '16384 MiB', - }, - 'rbdimage': null, - }, - { - 'name': '2XL', - 'mem': 24576, - 'cpus': 12, - 'gpus': 0, - 'disk': null, - 'price': 13.7458, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.2XL', - 'memory': { - 'unit': 'B', - 'value': 25769803776, - 'formatted': '24576 MiB', - }, - 'rbdimage': null, - }, - { - 'name': '3XL', - 'mem': 32768, - 'cpus': 16, - 'gpus': 0, - 'disk': null, - 'price': 27.4915, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.3XL', - 'memory': { - 'unit': 'B', - 'value': 34359738368, - 'formatted': '32768 MiB', - }, - 'rbdimage': null, + description: 'node', + enabled: true, + comingSoon: false, + maxInstances: 40, + tags: ['javascript', 'node'], + deployments: ['git'], + flavors: [ + { + name: 'pico', + mem: 256, + cpus: 1, + gpus: 0, + disk: null, + price: 0.1073883162, + available: true, + microservice: true, + machine_learning: false, + nice: 5, + price_id: 'apps.pico', + memory: { + unit: 'B', + value: 268435456, + formatted: '256 MiB', + }, + }, + { + name: 'nano', + mem: 512, + cpus: 1, + gpus: 0, + disk: null, + price: 0.1431844215, + available: true, + microservice: true, + machine_learning: false, + nice: 5, + price_id: 'apps.nano', + memory: { + unit: 'B', + value: 536870912, + formatted: '512 MiB', + }, + }, + { + name: 'XS', + mem: 1024, + cpus: 1, + gpus: 0, + disk: null, + price: 0.3436, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.XS', + memory: { + unit: 'B', + value: 1073741824, + formatted: '1024 MiB', + }, + }, + { + name: 'S', + mem: 2048, + cpus: 2, + gpus: 0, + disk: null, + price: 0.6873, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.S', + memory: { + unit: 'B', + value: 2147483648, + formatted: '2048 MiB', + }, + }, + { + name: 'M', + mem: 4096, + cpus: 4, + gpus: 0, + disk: null, + price: 1.7182, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.M', + memory: { + unit: 'B', + value: 4294967296, + formatted: '4096 MiB', + }, + }, + { + name: 'L', + mem: 8192, + cpus: 6, + gpus: 0, + disk: null, + price: 3.4364, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.L', + memory: { + unit: 'B', + value: 8589934592, + formatted: '8192 MiB', + }, + }, + { + name: 'XL', + mem: 16384, + cpus: 8, + gpus: 0, + disk: null, + price: 6.8729, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.XL', + memory: { + unit: 'B', + value: 17179869184, + formatted: '16384 MiB', + }, + }, + { + name: '2XL', + mem: 24576, + cpus: 12, + gpus: 0, + disk: null, + price: 13.7458, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.2XL', + memory: { + unit: 'B', + value: 25769803776, + formatted: '24576 MiB', + }, + }, + { + name: '3XL', + mem: 32768, + cpus: 16, + gpus: 0, + disk: null, + price: 27.4915, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.3XL', + memory: { + unit: 'B', + value: 34359738368, + formatted: '32768 MiB', + }, }, ], - 'defaultFlavor': { - 'name': 'XS', - 'mem': 1024, - 'cpus': 1, - 'gpus': 0, - 'disk': null, - 'price': 0.3436, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.XS', - 'memory': { - 'unit': 'B', - 'value': 1073741824, - 'formatted': '1024 MiB', - }, - 'rbdimage': null, + defaultFlavor: { + name: 'XS', + mem: 1024, + cpus: 1, + gpus: 0, + disk: null, + price: 0.3436, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.XS', + memory: { + unit: 'B', + value: 1073741824, + formatted: '1024 MiB', + }, }, - 'buildFlavor': { - 'name': 'S', - 'mem': 2048, - 'cpus': 2, - 'gpus': 0, - 'disk': null, - 'price': 0.6873, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.S', - 'memory': { - 'unit': 'B', - 'value': 2147483648, - 'formatted': '2048 MiB', - }, - 'rbdimage': null, + buildFlavor: { + name: 'S', + mem: 2048, + cpus: 2, + gpus: 0, + disk: null, + price: 0.6873, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.S', + memory: { + unit: 'B', + value: 2147483648, + formatted: '2048 MiB', + }, }, }, { - 'type': 'node', - 'version': '20210421', - 'name': 'Node', - 'variant': { - 'id': '395103fb-d6e2-4fdd-93bc-bc99146f1ea2', - 'slug': 'node', - 'name': 'Node', - 'deployType': 'node', - 'logo': 'https://assets.clever-cloud.com/logos/nodejs.svg', + type: 'node', + version: '20210421', + name: 'Node', + variant: { + id: '395103fb-d6e2-4fdd-93bc-bc99146f1ea2', + slug: 'node', + name: 'Node', + deployType: 'node', + logo: 'https://assets.clever-cloud.com/logos/nodejs.svg', }, - 'description': 'node', - 'enabled': true, - 'comingSoon': false, - 'maxInstances': 40, - 'tags': [ - 'javascript', - 'node', - ], - 'deployments': [ - 'git', - ], - 'flavors': [ - { - 'name': 'pico', - 'mem': 256, - 'cpus': 1, - 'gpus': 0, - 'disk': null, - 'price': 0.1073883162, - 'available': true, - 'microservice': true, - 'machine_learning': false, - 'nice': 5, - 'price_id': 'apps.pico', - 'memory': { - 'unit': 'B', - 'value': 268435456, - 'formatted': '256 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'nano', - 'mem': 512, - 'cpus': 1, - 'gpus': 0, - 'disk': null, - 'price': 0.1431844215, - 'available': true, - 'microservice': true, - 'machine_learning': false, - 'nice': 5, - 'price_id': 'apps.nano', - 'memory': { - 'unit': 'B', - 'value': 536870912, - 'formatted': '512 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'XS', - 'mem': 1024, - 'cpus': 1, - 'gpus': 0, - 'disk': null, - 'price': 0.3436, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.XS', - 'memory': { - 'unit': 'B', - 'value': 1073741824, - 'formatted': '1024 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'S', - 'mem': 2048, - 'cpus': 2, - 'gpus': 0, - 'disk': null, - 'price': 0.6873, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.S', - 'memory': { - 'unit': 'B', - 'value': 2147483648, - 'formatted': '2048 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'M', - 'mem': 4096, - 'cpus': 4, - 'gpus': 0, - 'disk': null, - 'price': 1.7182, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.M', - 'memory': { - 'unit': 'B', - 'value': 4294967296, - 'formatted': '4096 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'L', - 'mem': 8192, - 'cpus': 6, - 'gpus': 0, - 'disk': null, - 'price': 3.4364, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.L', - 'memory': { - 'unit': 'B', - 'value': 8589934592, - 'formatted': '8192 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'XL', - 'mem': 16384, - 'cpus': 8, - 'gpus': 0, - 'disk': null, - 'price': 6.8729, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.XL', - 'memory': { - 'unit': 'B', - 'value': 17179869184, - 'formatted': '16384 MiB', - }, - 'rbdimage': null, - }, - { - 'name': '2XL', - 'mem': 24576, - 'cpus': 12, - 'gpus': 0, - 'disk': null, - 'price': 13.7458, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.2XL', - 'memory': { - 'unit': 'B', - 'value': 25769803776, - 'formatted': '24576 MiB', - }, - 'rbdimage': null, - }, - { - 'name': '3XL', - 'mem': 32768, - 'cpus': 16, - 'gpus': 0, - 'disk': null, - 'price': 27.4915, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.3XL', - 'memory': { - 'unit': 'B', - 'value': 34359738368, - 'formatted': '32768 MiB', - }, - 'rbdimage': null, + description: 'node', + enabled: true, + comingSoon: false, + maxInstances: 40, + tags: ['javascript', 'node'], + deployments: ['git'], + flavors: [ + { + name: 'pico', + mem: 256, + cpus: 1, + gpus: 0, + disk: null, + price: 0.1073883162, + available: true, + microservice: true, + machine_learning: false, + nice: 5, + price_id: 'apps.pico', + memory: { + unit: 'B', + value: 268435456, + formatted: '256 MiB', + }, + }, + { + name: 'nano', + mem: 512, + cpus: 1, + gpus: 0, + disk: null, + price: 0.1431844215, + available: true, + microservice: true, + machine_learning: false, + nice: 5, + price_id: 'apps.nano', + memory: { + unit: 'B', + value: 536870912, + formatted: '512 MiB', + }, + }, + { + name: 'XS', + mem: 1024, + cpus: 1, + gpus: 0, + disk: null, + price: 0.3436, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.XS', + memory: { + unit: 'B', + value: 1073741824, + formatted: '1024 MiB', + }, + }, + { + name: 'S', + mem: 2048, + cpus: 2, + gpus: 0, + disk: null, + price: 0.6873, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.S', + memory: { + unit: 'B', + value: 2147483648, + formatted: '2048 MiB', + }, + }, + { + name: 'M', + mem: 4096, + cpus: 4, + gpus: 0, + disk: null, + price: 1.7182, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.M', + memory: { + unit: 'B', + value: 4294967296, + formatted: '4096 MiB', + }, + }, + { + name: 'L', + mem: 8192, + cpus: 6, + gpus: 0, + disk: null, + price: 3.4364, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.L', + memory: { + unit: 'B', + value: 8589934592, + formatted: '8192 MiB', + }, + }, + { + name: 'XL', + mem: 16384, + cpus: 8, + gpus: 0, + disk: null, + price: 6.8729, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.XL', + memory: { + unit: 'B', + value: 17179869184, + formatted: '16384 MiB', + }, + }, + { + name: '2XL', + mem: 24576, + cpus: 12, + gpus: 0, + disk: null, + price: 13.7458, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.2XL', + memory: { + unit: 'B', + value: 25769803776, + formatted: '24576 MiB', + }, + }, + { + name: '3XL', + mem: 32768, + cpus: 16, + gpus: 0, + disk: null, + price: 27.4915, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.3XL', + memory: { + unit: 'B', + value: 34359738368, + formatted: '32768 MiB', + }, }, ], - 'defaultFlavor': { - 'name': 'XS', - 'mem': 1024, - 'cpus': 1, - 'gpus': 0, - 'disk': null, - 'price': 0.3436, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.XS', - 'memory': { - 'unit': 'B', - 'value': 1073741824, - 'formatted': '1024 MiB', - }, - 'rbdimage': null, + defaultFlavor: { + name: 'XS', + mem: 1024, + cpus: 1, + gpus: 0, + disk: null, + price: 0.3436, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.XS', + memory: { + unit: 'B', + value: 1073741824, + formatted: '1024 MiB', + }, }, - 'buildFlavor': { - 'name': 'S', - 'mem': 2048, - 'cpus': 2, - 'gpus': 0, - 'disk': null, - 'price': 0.6873, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.S', - 'memory': { - 'unit': 'B', - 'value': 2147483648, - 'formatted': '2048 MiB', - }, - 'rbdimage': null, + buildFlavor: { + name: 'S', + mem: 2048, + cpus: 2, + gpus: 0, + disk: null, + price: 0.6873, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.S', + memory: { + unit: 'B', + value: 2147483648, + formatted: '2048 MiB', + }, }, }, { - 'type': 'haskell', - 'version': '20210421', - 'name': 'Haskell', - 'variant': { - 'id': '558bab39-508c-4a04-96ca-d1fb4d6a60b4', - 'slug': 'haskell', - 'name': 'Haskell', - 'deployType': 'haskell', - 'logo': 'https://assets.clever-cloud.com/logos/haskell.svg', + type: 'haskell', + version: '20210421', + name: 'Haskell', + variant: { + id: '558bab39-508c-4a04-96ca-d1fb4d6a60b4', + slug: 'haskell', + name: 'Haskell', + deployType: 'haskell', + logo: 'https://assets.clever-cloud.com/logos/haskell.svg', }, - 'description': 'Haskell', - 'enabled': true, - 'comingSoon': false, - 'maxInstances': 40, - 'tags': [], - 'deployments': [ - 'git', - ], - 'flavors': [ - { - 'name': 'pico', - 'mem': 256, - 'cpus': 1, - 'gpus': 0, - 'disk': null, - 'price': 0.1073883162, - 'available': true, - 'microservice': true, - 'machine_learning': false, - 'nice': 5, - 'price_id': 'apps.pico', - 'memory': { - 'unit': 'B', - 'value': 268435456, - 'formatted': '256 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'nano', - 'mem': 512, - 'cpus': 1, - 'gpus': 0, - 'disk': null, - 'price': 0.1431844215, - 'available': true, - 'microservice': true, - 'machine_learning': false, - 'nice': 5, - 'price_id': 'apps.nano', - 'memory': { - 'unit': 'B', - 'value': 536870912, - 'formatted': '512 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'XS', - 'mem': 1024, - 'cpus': 1, - 'gpus': 0, - 'disk': null, - 'price': 0.3436, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.XS', - 'memory': { - 'unit': 'B', - 'value': 1073741824, - 'formatted': '1024 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'S', - 'mem': 2048, - 'cpus': 2, - 'gpus': 0, - 'disk': null, - 'price': 0.6873, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.S', - 'memory': { - 'unit': 'B', - 'value': 2147483648, - 'formatted': '2048 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'M', - 'mem': 4096, - 'cpus': 4, - 'gpus': 0, - 'disk': null, - 'price': 1.7182, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.M', - 'memory': { - 'unit': 'B', - 'value': 4294967296, - 'formatted': '4096 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'L', - 'mem': 8192, - 'cpus': 6, - 'gpus': 0, - 'disk': null, - 'price': 3.4364, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.L', - 'memory': { - 'unit': 'B', - 'value': 8589934592, - 'formatted': '8192 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'XL', - 'mem': 16384, - 'cpus': 8, - 'gpus': 0, - 'disk': null, - 'price': 6.8729, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.XL', - 'memory': { - 'unit': 'B', - 'value': 17179869184, - 'formatted': '16384 MiB', - }, - 'rbdimage': null, - }, - { - 'name': '2XL', - 'mem': 24576, - 'cpus': 12, - 'gpus': 0, - 'disk': null, - 'price': 13.7458, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.2XL', - 'memory': { - 'unit': 'B', - 'value': 25769803776, - 'formatted': '24576 MiB', - }, - 'rbdimage': null, - }, - { - 'name': '3XL', - 'mem': 32768, - 'cpus': 16, - 'gpus': 0, - 'disk': null, - 'price': 27.4915, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.3XL', - 'memory': { - 'unit': 'B', - 'value': 34359738368, - 'formatted': '32768 MiB', - }, - 'rbdimage': null, + description: 'Haskell', + enabled: true, + comingSoon: false, + maxInstances: 40, + tags: [], + deployments: ['git'], + flavors: [ + { + name: 'pico', + mem: 256, + cpus: 1, + gpus: 0, + disk: null, + price: 0.1073883162, + available: true, + microservice: true, + machine_learning: false, + nice: 5, + price_id: 'apps.pico', + memory: { + unit: 'B', + value: 268435456, + formatted: '256 MiB', + }, + }, + { + name: 'nano', + mem: 512, + cpus: 1, + gpus: 0, + disk: null, + price: 0.1431844215, + available: true, + microservice: true, + machine_learning: false, + nice: 5, + price_id: 'apps.nano', + memory: { + unit: 'B', + value: 536870912, + formatted: '512 MiB', + }, + }, + { + name: 'XS', + mem: 1024, + cpus: 1, + gpus: 0, + disk: null, + price: 0.3436, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.XS', + memory: { + unit: 'B', + value: 1073741824, + formatted: '1024 MiB', + }, + }, + { + name: 'S', + mem: 2048, + cpus: 2, + gpus: 0, + disk: null, + price: 0.6873, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.S', + memory: { + unit: 'B', + value: 2147483648, + formatted: '2048 MiB', + }, + }, + { + name: 'M', + mem: 4096, + cpus: 4, + gpus: 0, + disk: null, + price: 1.7182, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.M', + memory: { + unit: 'B', + value: 4294967296, + formatted: '4096 MiB', + }, + }, + { + name: 'L', + mem: 8192, + cpus: 6, + gpus: 0, + disk: null, + price: 3.4364, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.L', + memory: { + unit: 'B', + value: 8589934592, + formatted: '8192 MiB', + }, + }, + { + name: 'XL', + mem: 16384, + cpus: 8, + gpus: 0, + disk: null, + price: 6.8729, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.XL', + memory: { + unit: 'B', + value: 17179869184, + formatted: '16384 MiB', + }, + }, + { + name: '2XL', + mem: 24576, + cpus: 12, + gpus: 0, + disk: null, + price: 13.7458, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.2XL', + memory: { + unit: 'B', + value: 25769803776, + formatted: '24576 MiB', + }, + }, + { + name: '3XL', + mem: 32768, + cpus: 16, + gpus: 0, + disk: null, + price: 27.4915, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.3XL', + memory: { + unit: 'B', + value: 34359738368, + formatted: '32768 MiB', + }, }, ], - 'defaultFlavor': { - 'name': 'XS', - 'mem': 1024, - 'cpus': 1, - 'gpus': 0, - 'disk': null, - 'price': 0.3436, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.XS', - 'memory': { - 'unit': 'B', - 'value': 1073741824, - 'formatted': '1024 MiB', - }, - 'rbdimage': null, + defaultFlavor: { + name: 'XS', + mem: 1024, + cpus: 1, + gpus: 0, + disk: null, + price: 0.3436, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.XS', + memory: { + unit: 'B', + value: 1073741824, + formatted: '1024 MiB', + }, }, - 'buildFlavor': { - 'name': 'L', - 'mem': 8192, - 'cpus': 6, - 'gpus': 0, - 'disk': null, - 'price': 3.4364, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.L', - 'memory': { - 'unit': 'B', - 'value': 8589934592, - 'formatted': '8192 MiB', - }, - 'rbdimage': null, + buildFlavor: { + name: 'L', + mem: 8192, + cpus: 6, + gpus: 0, + disk: null, + price: 3.4364, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.L', + memory: { + unit: 'B', + value: 8589934592, + formatted: '8192 MiB', + }, }, }, { - 'type': 'python', - 'version': '20210421', - 'name': 'Python', - 'variant': { - 'id': '049c84e1-56a4-4a6a-8940-7ba7e0f57c61', - 'slug': 'python', - 'name': 'Python', - 'deployType': 'python', - 'logo': 'https://assets.clever-cloud.com/logos/python.svg', + type: 'python', + version: '20210421', + name: 'Python', + variant: { + id: '049c84e1-56a4-4a6a-8940-7ba7e0f57c61', + slug: 'python', + name: 'Python', + deployType: 'python', + logo: 'https://assets.clever-cloud.com/logos/python.svg', }, - 'description': 'Python scaler type', - 'enabled': true, - 'comingSoon': false, - 'maxInstances': 40, - 'tags': [ - 'python', - ], - 'deployments': [ - 'git', - ], - 'flavors': [ - { - 'name': 'pico', - 'mem': 256, - 'cpus': 1, - 'gpus': 0, - 'disk': null, - 'price': 0.1073883162, - 'available': true, - 'microservice': true, - 'machine_learning': false, - 'nice': 5, - 'price_id': 'apps.pico', - 'memory': { - 'unit': 'B', - 'value': 268435456, - 'formatted': '256 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'nano', - 'mem': 512, - 'cpus': 1, - 'gpus': 0, - 'disk': null, - 'price': 0.1431844215, - 'available': true, - 'microservice': true, - 'machine_learning': false, - 'nice': 5, - 'price_id': 'apps.nano', - 'memory': { - 'unit': 'B', - 'value': 536870912, - 'formatted': '512 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'XS', - 'mem': 1024, - 'cpus': 1, - 'gpus': 0, - 'disk': null, - 'price': 0.3436, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.XS', - 'memory': { - 'unit': 'B', - 'value': 1073741824, - 'formatted': '1024 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'S', - 'mem': 2048, - 'cpus': 2, - 'gpus': 0, - 'disk': null, - 'price': 0.6873, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.S', - 'memory': { - 'unit': 'B', - 'value': 2147483648, - 'formatted': '2048 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'M', - 'mem': 4096, - 'cpus': 4, - 'gpus': 0, - 'disk': null, - 'price': 1.7182, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.M', - 'memory': { - 'unit': 'B', - 'value': 4294967296, - 'formatted': '4096 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'L', - 'mem': 8192, - 'cpus': 6, - 'gpus': 0, - 'disk': null, - 'price': 3.4364, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.L', - 'memory': { - 'unit': 'B', - 'value': 8589934592, - 'formatted': '8192 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'XL', - 'mem': 16384, - 'cpus': 8, - 'gpus': 0, - 'disk': null, - 'price': 6.8729, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.XL', - 'memory': { - 'unit': 'B', - 'value': 17179869184, - 'formatted': '16384 MiB', - }, - 'rbdimage': null, - }, - { - 'name': '2XL', - 'mem': 24576, - 'cpus': 12, - 'gpus': 0, - 'disk': null, - 'price': 13.7458, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.2XL', - 'memory': { - 'unit': 'B', - 'value': 25769803776, - 'formatted': '24576 MiB', - }, - 'rbdimage': null, - }, - { - 'name': '3XL', - 'mem': 32768, - 'cpus': 16, - 'gpus': 0, - 'disk': null, - 'price': 27.4915, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.3XL', - 'memory': { - 'unit': 'B', - 'value': 34359738368, - 'formatted': '32768 MiB', - }, - 'rbdimage': null, + description: 'Python scaler type', + enabled: true, + comingSoon: false, + maxInstances: 40, + tags: ['python'], + deployments: ['git'], + flavors: [ + { + name: 'pico', + mem: 256, + cpus: 1, + gpus: 0, + disk: null, + price: 0.1073883162, + available: true, + microservice: true, + machine_learning: false, + nice: 5, + price_id: 'apps.pico', + memory: { + unit: 'B', + value: 268435456, + formatted: '256 MiB', + }, + }, + { + name: 'nano', + mem: 512, + cpus: 1, + gpus: 0, + disk: null, + price: 0.1431844215, + available: true, + microservice: true, + machine_learning: false, + nice: 5, + price_id: 'apps.nano', + memory: { + unit: 'B', + value: 536870912, + formatted: '512 MiB', + }, + }, + { + name: 'XS', + mem: 1024, + cpus: 1, + gpus: 0, + disk: null, + price: 0.3436, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.XS', + memory: { + unit: 'B', + value: 1073741824, + formatted: '1024 MiB', + }, + }, + { + name: 'S', + mem: 2048, + cpus: 2, + gpus: 0, + disk: null, + price: 0.6873, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.S', + memory: { + unit: 'B', + value: 2147483648, + formatted: '2048 MiB', + }, + }, + { + name: 'M', + mem: 4096, + cpus: 4, + gpus: 0, + disk: null, + price: 1.7182, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.M', + memory: { + unit: 'B', + value: 4294967296, + formatted: '4096 MiB', + }, + }, + { + name: 'L', + mem: 8192, + cpus: 6, + gpus: 0, + disk: null, + price: 3.4364, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.L', + memory: { + unit: 'B', + value: 8589934592, + formatted: '8192 MiB', + }, + }, + { + name: 'XL', + mem: 16384, + cpus: 8, + gpus: 0, + disk: null, + price: 6.8729, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.XL', + memory: { + unit: 'B', + value: 17179869184, + formatted: '16384 MiB', + }, + }, + { + name: '2XL', + mem: 24576, + cpus: 12, + gpus: 0, + disk: null, + price: 13.7458, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.2XL', + memory: { + unit: 'B', + value: 25769803776, + formatted: '24576 MiB', + }, + }, + { + name: '3XL', + mem: 32768, + cpus: 16, + gpus: 0, + disk: null, + price: 27.4915, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.3XL', + memory: { + unit: 'B', + value: 34359738368, + formatted: '32768 MiB', + }, }, ], - 'defaultFlavor': { - 'name': 'XS', - 'mem': 1024, - 'cpus': 1, - 'gpus': 0, - 'disk': null, - 'price': 0.3436, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.XS', - 'memory': { - 'unit': 'B', - 'value': 1073741824, - 'formatted': '1024 MiB', - }, - 'rbdimage': null, + defaultFlavor: { + name: 'XS', + mem: 1024, + cpus: 1, + gpus: 0, + disk: null, + price: 0.3436, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.XS', + memory: { + unit: 'B', + value: 1073741824, + formatted: '1024 MiB', + }, }, - 'buildFlavor': { - 'name': 'S', - 'mem': 2048, - 'cpus': 2, - 'gpus': 0, - 'disk': null, - 'price': 0.6873, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.S', - 'memory': { - 'unit': 'B', - 'value': 2147483648, - 'formatted': '2048 MiB', - }, - 'rbdimage': null, + buildFlavor: { + name: 'S', + mem: 2048, + cpus: 2, + gpus: 0, + disk: null, + price: 0.6873, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.S', + memory: { + unit: 'B', + value: 2147483648, + formatted: '2048 MiB', + }, }, }, { - 'type': 'php', - 'version': '20210421', - 'name': 'PHP', - 'variant': { - 'id': 'ca6c9c85-63f8-4075-b136-583d3f581a52', - 'slug': 'php', - 'name': 'PHP', - 'deployType': 'php', - 'logo': 'https://assets.clever-cloud.com/logos/php.svg', + type: 'php', + version: '20210421', + name: 'PHP', + variant: { + id: 'ca6c9c85-63f8-4075-b136-583d3f581a52', + slug: 'php', + name: 'PHP', + deployType: 'php', + logo: 'https://assets.clever-cloud.com/logos/php.svg', }, - 'description': 'Multi PHP', - 'enabled': true, - 'comingSoon': false, - 'maxInstances': 40, - 'tags': [], - 'deployments': [ - 'git', - 'ftp', - ], - 'flavors': [ - { - 'name': 'nano', - 'mem': 512, - 'cpus': 1, - 'gpus': 0, - 'disk': null, - 'price': 0.1431844215, - 'available': true, - 'microservice': true, - 'machine_learning': false, - 'nice': 5, - 'price_id': 'apps.nano', - 'memory': { - 'unit': 'B', - 'value': 536870912, - 'formatted': '512 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'XS', - 'mem': 1024, - 'cpus': 1, - 'gpus': 0, - 'disk': null, - 'price': 0.3436, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.XS', - 'memory': { - 'unit': 'B', - 'value': 1073741824, - 'formatted': '1024 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'S', - 'mem': 2048, - 'cpus': 2, - 'gpus': 0, - 'disk': null, - 'price': 0.6873, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.S', - 'memory': { - 'unit': 'B', - 'value': 2147483648, - 'formatted': '2048 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'M', - 'mem': 4096, - 'cpus': 4, - 'gpus': 0, - 'disk': null, - 'price': 1.7182, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.M', - 'memory': { - 'unit': 'B', - 'value': 4294967296, - 'formatted': '4096 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'L', - 'mem': 8192, - 'cpus': 6, - 'gpus': 0, - 'disk': null, - 'price': 3.4364, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.L', - 'memory': { - 'unit': 'B', - 'value': 8589934592, - 'formatted': '8192 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'XL', - 'mem': 16384, - 'cpus': 8, - 'gpus': 0, - 'disk': null, - 'price': 6.8729, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.XL', - 'memory': { - 'unit': 'B', - 'value': 17179869184, - 'formatted': '16384 MiB', - }, - 'rbdimage': null, - }, - { - 'name': '2XL', - 'mem': 24576, - 'cpus': 12, - 'gpus': 0, - 'disk': null, - 'price': 13.7458, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.2XL', - 'memory': { - 'unit': 'B', - 'value': 25769803776, - 'formatted': '24576 MiB', - }, - 'rbdimage': null, - }, - { - 'name': '3XL', - 'mem': 32768, - 'cpus': 16, - 'gpus': 0, - 'disk': null, - 'price': 27.4915, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.3XL', - 'memory': { - 'unit': 'B', - 'value': 34359738368, - 'formatted': '32768 MiB', - }, - 'rbdimage': null, + description: 'Multi PHP', + enabled: true, + comingSoon: false, + maxInstances: 40, + tags: [], + deployments: ['git', 'ftp'], + flavors: [ + { + name: 'nano', + mem: 512, + cpus: 1, + gpus: 0, + disk: null, + price: 0.1431844215, + available: true, + microservice: true, + machine_learning: false, + nice: 5, + price_id: 'apps.nano', + memory: { + unit: 'B', + value: 536870912, + formatted: '512 MiB', + }, + }, + { + name: 'XS', + mem: 1024, + cpus: 1, + gpus: 0, + disk: null, + price: 0.3436, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.XS', + memory: { + unit: 'B', + value: 1073741824, + formatted: '1024 MiB', + }, + }, + { + name: 'S', + mem: 2048, + cpus: 2, + gpus: 0, + disk: null, + price: 0.6873, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.S', + memory: { + unit: 'B', + value: 2147483648, + formatted: '2048 MiB', + }, + }, + { + name: 'M', + mem: 4096, + cpus: 4, + gpus: 0, + disk: null, + price: 1.7182, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.M', + memory: { + unit: 'B', + value: 4294967296, + formatted: '4096 MiB', + }, + }, + { + name: 'L', + mem: 8192, + cpus: 6, + gpus: 0, + disk: null, + price: 3.4364, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.L', + memory: { + unit: 'B', + value: 8589934592, + formatted: '8192 MiB', + }, + }, + { + name: 'XL', + mem: 16384, + cpus: 8, + gpus: 0, + disk: null, + price: 6.8729, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.XL', + memory: { + unit: 'B', + value: 17179869184, + formatted: '16384 MiB', + }, + }, + { + name: '2XL', + mem: 24576, + cpus: 12, + gpus: 0, + disk: null, + price: 13.7458, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.2XL', + memory: { + unit: 'B', + value: 25769803776, + formatted: '24576 MiB', + }, + }, + { + name: '3XL', + mem: 32768, + cpus: 16, + gpus: 0, + disk: null, + price: 27.4915, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.3XL', + memory: { + unit: 'B', + value: 34359738368, + formatted: '32768 MiB', + }, }, ], - 'defaultFlavor': { - 'name': 'XS', - 'mem': 1024, - 'cpus': 1, - 'gpus': 0, - 'disk': null, - 'price': 0.3436, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.XS', - 'memory': { - 'unit': 'B', - 'value': 1073741824, - 'formatted': '1024 MiB', - }, - 'rbdimage': null, + defaultFlavor: { + name: 'XS', + mem: 1024, + cpus: 1, + gpus: 0, + disk: null, + price: 0.3436, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.XS', + memory: { + unit: 'B', + value: 1073741824, + formatted: '1024 MiB', + }, }, - 'buildFlavor': { - 'name': 'M', - 'mem': 4096, - 'cpus': 4, - 'gpus': 0, - 'disk': null, - 'price': 1.7182, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.M', - 'memory': { - 'unit': 'B', - 'value': 4294967296, - 'formatted': '4096 MiB', - }, - 'rbdimage': null, + buildFlavor: { + name: 'M', + mem: 4096, + cpus: 4, + gpus: 0, + disk: null, + price: 1.7182, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.M', + memory: { + unit: 'B', + value: 4294967296, + formatted: '4096 MiB', + }, }, }, { - 'type': 'php', - 'version': '20210421', - 'name': 'Static', - 'variant': { - 'id': '3b8cc37b-b874-4169-b64e-7eace63dfb7b', - 'slug': 'static-apache', - 'name': 'Static', - 'deployType': 'php', - 'logo': 'https://assets.clever-cloud.com/logos/apache.svg', + type: 'php', + version: '20210421', + name: 'Static', + variant: { + id: '3b8cc37b-b874-4169-b64e-7eace63dfb7b', + slug: 'static-apache', + name: 'Static', + deployType: 'php', + logo: 'https://assets.clever-cloud.com/logos/apache.svg', }, - 'description': 'Multi PHP', - 'enabled': true, - 'comingSoon': false, - 'maxInstances': 40, - 'tags': [], - 'deployments': [ - 'git', - 'ftp', - ], - 'flavors': [ - { - 'name': 'nano', - 'mem': 512, - 'cpus': 1, - 'gpus': 0, - 'disk': null, - 'price': 0.1431844215, - 'available': true, - 'microservice': true, - 'machine_learning': false, - 'nice': 5, - 'price_id': 'apps.nano', - 'memory': { - 'unit': 'B', - 'value': 536870912, - 'formatted': '512 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'XS', - 'mem': 1024, - 'cpus': 1, - 'gpus': 0, - 'disk': null, - 'price': 0.3436, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.XS', - 'memory': { - 'unit': 'B', - 'value': 1073741824, - 'formatted': '1024 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'S', - 'mem': 2048, - 'cpus': 2, - 'gpus': 0, - 'disk': null, - 'price': 0.6873, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.S', - 'memory': { - 'unit': 'B', - 'value': 2147483648, - 'formatted': '2048 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'M', - 'mem': 4096, - 'cpus': 4, - 'gpus': 0, - 'disk': null, - 'price': 1.7182, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.M', - 'memory': { - 'unit': 'B', - 'value': 4294967296, - 'formatted': '4096 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'L', - 'mem': 8192, - 'cpus': 6, - 'gpus': 0, - 'disk': null, - 'price': 3.4364, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.L', - 'memory': { - 'unit': 'B', - 'value': 8589934592, - 'formatted': '8192 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'XL', - 'mem': 16384, - 'cpus': 8, - 'gpus': 0, - 'disk': null, - 'price': 6.8729, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.XL', - 'memory': { - 'unit': 'B', - 'value': 17179869184, - 'formatted': '16384 MiB', - }, - 'rbdimage': null, - }, - { - 'name': '2XL', - 'mem': 24576, - 'cpus': 12, - 'gpus': 0, - 'disk': null, - 'price': 13.7458, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.2XL', - 'memory': { - 'unit': 'B', - 'value': 25769803776, - 'formatted': '24576 MiB', - }, - 'rbdimage': null, - }, - { - 'name': '3XL', - 'mem': 32768, - 'cpus': 16, - 'gpus': 0, - 'disk': null, - 'price': 27.4915, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.3XL', - 'memory': { - 'unit': 'B', - 'value': 34359738368, - 'formatted': '32768 MiB', - }, - 'rbdimage': null, + description: 'Multi PHP', + enabled: true, + comingSoon: false, + maxInstances: 40, + tags: [], + deployments: ['git', 'ftp'], + flavors: [ + { + name: 'nano', + mem: 512, + cpus: 1, + gpus: 0, + disk: null, + price: 0.1431844215, + available: true, + microservice: true, + machine_learning: false, + nice: 5, + price_id: 'apps.nano', + memory: { + unit: 'B', + value: 536870912, + formatted: '512 MiB', + }, + }, + { + name: 'XS', + mem: 1024, + cpus: 1, + gpus: 0, + disk: null, + price: 0.3436, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.XS', + memory: { + unit: 'B', + value: 1073741824, + formatted: '1024 MiB', + }, + }, + { + name: 'S', + mem: 2048, + cpus: 2, + gpus: 0, + disk: null, + price: 0.6873, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.S', + memory: { + unit: 'B', + value: 2147483648, + formatted: '2048 MiB', + }, + }, + { + name: 'M', + mem: 4096, + cpus: 4, + gpus: 0, + disk: null, + price: 1.7182, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.M', + memory: { + unit: 'B', + value: 4294967296, + formatted: '4096 MiB', + }, + }, + { + name: 'L', + mem: 8192, + cpus: 6, + gpus: 0, + disk: null, + price: 3.4364, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.L', + memory: { + unit: 'B', + value: 8589934592, + formatted: '8192 MiB', + }, + }, + { + name: 'XL', + mem: 16384, + cpus: 8, + gpus: 0, + disk: null, + price: 6.8729, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.XL', + memory: { + unit: 'B', + value: 17179869184, + formatted: '16384 MiB', + }, + }, + { + name: '2XL', + mem: 24576, + cpus: 12, + gpus: 0, + disk: null, + price: 13.7458, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.2XL', + memory: { + unit: 'B', + value: 25769803776, + formatted: '24576 MiB', + }, + }, + { + name: '3XL', + mem: 32768, + cpus: 16, + gpus: 0, + disk: null, + price: 27.4915, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.3XL', + memory: { + unit: 'B', + value: 34359738368, + formatted: '32768 MiB', + }, }, ], - 'defaultFlavor': { - 'name': 'XS', - 'mem': 1024, - 'cpus': 1, - 'gpus': 0, - 'disk': null, - 'price': 0.3436, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.XS', - 'memory': { - 'unit': 'B', - 'value': 1073741824, - 'formatted': '1024 MiB', - }, - 'rbdimage': null, + defaultFlavor: { + name: 'XS', + mem: 1024, + cpus: 1, + gpus: 0, + disk: null, + price: 0.3436, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.XS', + memory: { + unit: 'B', + value: 1073741824, + formatted: '1024 MiB', + }, }, - 'buildFlavor': { - 'name': 'M', - 'mem': 4096, - 'cpus': 4, - 'gpus': 0, - 'disk': null, - 'price': 1.7182, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.M', - 'memory': { - 'unit': 'B', - 'value': 4294967296, - 'formatted': '4096 MiB', - }, - 'rbdimage': null, + buildFlavor: { + name: 'M', + mem: 4096, + cpus: 4, + gpus: 0, + disk: null, + price: 1.7182, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.M', + memory: { + unit: 'B', + value: 4294967296, + formatted: '4096 MiB', + }, }, }, { - 'type': 'rust', - 'version': '20210421', - 'name': 'Rust', - 'variant': { - 'id': '5036303b-a732-489a-9e50-56233eeb1752', - 'slug': 'rust', - 'name': 'Rust', - 'deployType': 'rust', - 'logo': 'https://assets.clever-cloud.com/logos/rust.svg', + type: 'rust', + version: '20210421', + name: 'Rust', + variant: { + id: '5036303b-a732-489a-9e50-56233eeb1752', + slug: 'rust', + name: 'Rust', + deployType: 'rust', + logo: 'https://assets.clever-cloud.com/logos/rust.svg', }, - 'description': 'Rust', - 'enabled': true, - 'comingSoon': false, - 'maxInstances': 40, - 'tags': [], - 'deployments': [ - 'git', - ], - 'flavors': [ - { - 'name': 'pico', - 'mem': 256, - 'cpus': 1, - 'gpus': 0, - 'disk': null, - 'price': 0.1073883162, - 'available': true, - 'microservice': true, - 'machine_learning': false, - 'nice': 5, - 'price_id': 'apps.pico', - 'memory': { - 'unit': 'B', - 'value': 268435456, - 'formatted': '256 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'nano', - 'mem': 512, - 'cpus': 1, - 'gpus': 0, - 'disk': null, - 'price': 0.1431844215, - 'available': true, - 'microservice': true, - 'machine_learning': false, - 'nice': 5, - 'price_id': 'apps.nano', - 'memory': { - 'unit': 'B', - 'value': 536870912, - 'formatted': '512 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'XS', - 'mem': 1024, - 'cpus': 1, - 'gpus': 0, - 'disk': null, - 'price': 0.3436, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.XS', - 'memory': { - 'unit': 'B', - 'value': 1073741824, - 'formatted': '1024 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'S', - 'mem': 2048, - 'cpus': 2, - 'gpus': 0, - 'disk': null, - 'price': 0.6873, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.S', - 'memory': { - 'unit': 'B', - 'value': 2147483648, - 'formatted': '2048 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'M', - 'mem': 4096, - 'cpus': 4, - 'gpus': 0, - 'disk': null, - 'price': 1.7182, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.M', - 'memory': { - 'unit': 'B', - 'value': 4294967296, - 'formatted': '4096 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'L', - 'mem': 8192, - 'cpus': 6, - 'gpus': 0, - 'disk': null, - 'price': 3.4364, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.L', - 'memory': { - 'unit': 'B', - 'value': 8589934592, - 'formatted': '8192 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'XL', - 'mem': 16384, - 'cpus': 8, - 'gpus': 0, - 'disk': null, - 'price': 6.8729, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.XL', - 'memory': { - 'unit': 'B', - 'value': 17179869184, - 'formatted': '16384 MiB', - }, - 'rbdimage': null, - }, - { - 'name': '2XL', - 'mem': 24576, - 'cpus': 12, - 'gpus': 0, - 'disk': null, - 'price': 13.7458, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.2XL', - 'memory': { - 'unit': 'B', - 'value': 25769803776, - 'formatted': '24576 MiB', - }, - 'rbdimage': null, - }, - { - 'name': '3XL', - 'mem': 32768, - 'cpus': 16, - 'gpus': 0, - 'disk': null, - 'price': 27.4915, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.3XL', - 'memory': { - 'unit': 'B', - 'value': 34359738368, - 'formatted': '32768 MiB', - }, - 'rbdimage': null, + description: 'Rust', + enabled: true, + comingSoon: false, + maxInstances: 40, + tags: [], + deployments: ['git'], + flavors: [ + { + name: 'pico', + mem: 256, + cpus: 1, + gpus: 0, + disk: null, + price: 0.1073883162, + available: true, + microservice: true, + machine_learning: false, + nice: 5, + price_id: 'apps.pico', + memory: { + unit: 'B', + value: 268435456, + formatted: '256 MiB', + }, + }, + { + name: 'nano', + mem: 512, + cpus: 1, + gpus: 0, + disk: null, + price: 0.1431844215, + available: true, + microservice: true, + machine_learning: false, + nice: 5, + price_id: 'apps.nano', + memory: { + unit: 'B', + value: 536870912, + formatted: '512 MiB', + }, + }, + { + name: 'XS', + mem: 1024, + cpus: 1, + gpus: 0, + disk: null, + price: 0.3436, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.XS', + memory: { + unit: 'B', + value: 1073741824, + formatted: '1024 MiB', + }, + }, + { + name: 'S', + mem: 2048, + cpus: 2, + gpus: 0, + disk: null, + price: 0.6873, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.S', + memory: { + unit: 'B', + value: 2147483648, + formatted: '2048 MiB', + }, + }, + { + name: 'M', + mem: 4096, + cpus: 4, + gpus: 0, + disk: null, + price: 1.7182, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.M', + memory: { + unit: 'B', + value: 4294967296, + formatted: '4096 MiB', + }, + }, + { + name: 'L', + mem: 8192, + cpus: 6, + gpus: 0, + disk: null, + price: 3.4364, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.L', + memory: { + unit: 'B', + value: 8589934592, + formatted: '8192 MiB', + }, + }, + { + name: 'XL', + mem: 16384, + cpus: 8, + gpus: 0, + disk: null, + price: 6.8729, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.XL', + memory: { + unit: 'B', + value: 17179869184, + formatted: '16384 MiB', + }, + }, + { + name: '2XL', + mem: 24576, + cpus: 12, + gpus: 0, + disk: null, + price: 13.7458, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.2XL', + memory: { + unit: 'B', + value: 25769803776, + formatted: '24576 MiB', + }, + }, + { + name: '3XL', + mem: 32768, + cpus: 16, + gpus: 0, + disk: null, + price: 27.4915, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.3XL', + memory: { + unit: 'B', + value: 34359738368, + formatted: '32768 MiB', + }, }, ], - 'defaultFlavor': { - 'name': 'XS', - 'mem': 1024, - 'cpus': 1, - 'gpus': 0, - 'disk': null, - 'price': 0.3436, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.XS', - 'memory': { - 'unit': 'B', - 'value': 1073741824, - 'formatted': '1024 MiB', - }, - 'rbdimage': null, + defaultFlavor: { + name: 'XS', + mem: 1024, + cpus: 1, + gpus: 0, + disk: null, + price: 0.3436, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.XS', + memory: { + unit: 'B', + value: 1073741824, + formatted: '1024 MiB', + }, }, - 'buildFlavor': { - 'name': 'M', - 'mem': 4096, - 'cpus': 4, - 'gpus': 0, - 'disk': null, - 'price': 1.7182, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.M', - 'memory': { - 'unit': 'B', - 'value': 4294967296, - 'formatted': '4096 MiB', - }, - 'rbdimage': null, + buildFlavor: { + name: 'M', + mem: 4096, + cpus: 4, + gpus: 0, + disk: null, + price: 1.7182, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.M', + memory: { + unit: 'B', + value: 4294967296, + formatted: '4096 MiB', + }, }, }, { - 'type': 'docker', - 'version': '20210422', - 'name': 'Docker', - 'variant': { - 'id': 'd5ff282b-dd1a-4c9a-a0c8-c9524b1370e9', - 'slug': 'docker', - 'name': 'Docker', - 'deployType': 'docker', - 'logo': 'https://assets.clever-cloud.com/logos/docker.svg', + type: 'docker', + version: '20210422', + name: 'Docker', + variant: { + id: 'd5ff282b-dd1a-4c9a-a0c8-c9524b1370e9', + slug: 'docker', + name: 'Docker', + deployType: 'docker', + logo: 'https://assets.clever-cloud.com/logos/docker.svg', }, - 'description': 'Docker', - 'enabled': true, - 'comingSoon': false, - 'maxInstances': 40, - 'tags': [], - 'deployments': [ - 'git', - ], - 'flavors': [ - { - 'name': 'nano', - 'mem': 512, - 'cpus': 1, - 'gpus': 0, - 'disk': null, - 'price': 0.1431844215, - 'available': true, - 'microservice': true, - 'machine_learning': false, - 'nice': 5, - 'price_id': 'apps.nano', - 'memory': { - 'unit': 'B', - 'value': 536870912, - 'formatted': '512 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'XS', - 'mem': 1024, - 'cpus': 1, - 'gpus': 0, - 'disk': null, - 'price': 0.3436, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.XS', - 'memory': { - 'unit': 'B', - 'value': 1073741824, - 'formatted': '1024 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'S', - 'mem': 2048, - 'cpus': 2, - 'gpus': 0, - 'disk': null, - 'price': 0.6873, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.S', - 'memory': { - 'unit': 'B', - 'value': 2147483648, - 'formatted': '2048 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'M', - 'mem': 4096, - 'cpus': 4, - 'gpus': 0, - 'disk': null, - 'price': 1.7182, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.M', - 'memory': { - 'unit': 'B', - 'value': 4294967296, - 'formatted': '4096 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'L', - 'mem': 8192, - 'cpus': 6, - 'gpus': 0, - 'disk': null, - 'price': 3.4364, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.L', - 'memory': { - 'unit': 'B', - 'value': 8589934592, - 'formatted': '8192 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'XL', - 'mem': 16384, - 'cpus': 8, - 'gpus': 0, - 'disk': null, - 'price': 6.8729, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.XL', - 'memory': { - 'unit': 'B', - 'value': 17179869184, - 'formatted': '16384 MiB', - }, - 'rbdimage': null, - }, - { - 'name': '2XL', - 'mem': 24576, - 'cpus': 12, - 'gpus': 0, - 'disk': null, - 'price': 13.7458, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.2XL', - 'memory': { - 'unit': 'B', - 'value': 25769803776, - 'formatted': '24576 MiB', - }, - 'rbdimage': null, - }, - { - 'name': '3XL', - 'mem': 32768, - 'cpus': 16, - 'gpus': 0, - 'disk': null, - 'price': 27.4915, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.3XL', - 'memory': { - 'unit': 'B', - 'value': 34359738368, - 'formatted': '32768 MiB', - }, - 'rbdimage': null, + description: 'Docker', + enabled: true, + comingSoon: false, + maxInstances: 40, + tags: [], + deployments: ['git'], + flavors: [ + { + name: 'nano', + mem: 512, + cpus: 1, + gpus: 0, + disk: null, + price: 0.1431844215, + available: true, + microservice: true, + machine_learning: false, + nice: 5, + price_id: 'apps.nano', + memory: { + unit: 'B', + value: 536870912, + formatted: '512 MiB', + }, + }, + { + name: 'XS', + mem: 1024, + cpus: 1, + gpus: 0, + disk: null, + price: 0.3436, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.XS', + memory: { + unit: 'B', + value: 1073741824, + formatted: '1024 MiB', + }, + }, + { + name: 'S', + mem: 2048, + cpus: 2, + gpus: 0, + disk: null, + price: 0.6873, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.S', + memory: { + unit: 'B', + value: 2147483648, + formatted: '2048 MiB', + }, + }, + { + name: 'M', + mem: 4096, + cpus: 4, + gpus: 0, + disk: null, + price: 1.7182, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.M', + memory: { + unit: 'B', + value: 4294967296, + formatted: '4096 MiB', + }, + }, + { + name: 'L', + mem: 8192, + cpus: 6, + gpus: 0, + disk: null, + price: 3.4364, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.L', + memory: { + unit: 'B', + value: 8589934592, + formatted: '8192 MiB', + }, + }, + { + name: 'XL', + mem: 16384, + cpus: 8, + gpus: 0, + disk: null, + price: 6.8729, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.XL', + memory: { + unit: 'B', + value: 17179869184, + formatted: '16384 MiB', + }, + }, + { + name: '2XL', + mem: 24576, + cpus: 12, + gpus: 0, + disk: null, + price: 13.7458, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.2XL', + memory: { + unit: 'B', + value: 25769803776, + formatted: '24576 MiB', + }, + }, + { + name: '3XL', + mem: 32768, + cpus: 16, + gpus: 0, + disk: null, + price: 27.4915, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.3XL', + memory: { + unit: 'B', + value: 34359738368, + formatted: '32768 MiB', + }, }, ], - 'defaultFlavor': { - 'name': 'XS', - 'mem': 1024, - 'cpus': 1, - 'gpus': 0, - 'disk': null, - 'price': 0.3436, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.XS', - 'memory': { - 'unit': 'B', - 'value': 1073741824, - 'formatted': '1024 MiB', - }, - 'rbdimage': null, + defaultFlavor: { + name: 'XS', + mem: 1024, + cpus: 1, + gpus: 0, + disk: null, + price: 0.3436, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.XS', + memory: { + unit: 'B', + value: 1073741824, + formatted: '1024 MiB', + }, }, - 'buildFlavor': { - 'name': 'S', - 'mem': 2048, - 'cpus': 2, - 'gpus': 0, - 'disk': null, - 'price': 0.6873, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.S', - 'memory': { - 'unit': 'B', - 'value': 2147483648, - 'formatted': '2048 MiB', - }, - 'rbdimage': null, + buildFlavor: { + name: 'S', + mem: 2048, + cpus: 2, + gpus: 0, + disk: null, + price: 0.6873, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.S', + memory: { + unit: 'B', + value: 2147483648, + formatted: '2048 MiB', + }, }, }, { - 'type': 'ruby', - 'version': '20210421', - 'name': 'Ruby', - 'variant': { - 'id': '9395c197-fb6d-4b5e-97c6-cc389140ef26', - 'slug': 'ruby', - 'name': 'Ruby', - 'deployType': 'ruby', - 'logo': 'https://assets.clever-cloud.com/logos/ruby.svg', + type: 'ruby', + version: '20210421', + name: 'Ruby', + variant: { + id: '9395c197-fb6d-4b5e-97c6-cc389140ef26', + slug: 'ruby', + name: 'Ruby', + deployType: 'ruby', + logo: 'https://assets.clever-cloud.com/logos/ruby.svg', }, - 'description': 'ruby', - 'enabled': true, - 'comingSoon': false, - 'maxInstances': 40, - 'tags': [ - 'ruby', - ], - 'deployments': [ - 'git', - ], - 'flavors': [ - { - 'name': 'pico', - 'mem': 256, - 'cpus': 1, - 'gpus': 0, - 'disk': null, - 'price': 0.1073883162, - 'available': true, - 'microservice': true, - 'machine_learning': false, - 'nice': 5, - 'price_id': 'apps.pico', - 'memory': { - 'unit': 'B', - 'value': 268435456, - 'formatted': '256 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'nano', - 'mem': 512, - 'cpus': 1, - 'gpus': 0, - 'disk': null, - 'price': 0.1431844215, - 'available': true, - 'microservice': true, - 'machine_learning': false, - 'nice': 5, - 'price_id': 'apps.nano', - 'memory': { - 'unit': 'B', - 'value': 536870912, - 'formatted': '512 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'XS', - 'mem': 1024, - 'cpus': 1, - 'gpus': 0, - 'disk': null, - 'price': 0.3436, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.XS', - 'memory': { - 'unit': 'B', - 'value': 1073741824, - 'formatted': '1024 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'S', - 'mem': 2048, - 'cpus': 2, - 'gpus': 0, - 'disk': null, - 'price': 0.6873, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.S', - 'memory': { - 'unit': 'B', - 'value': 2147483648, - 'formatted': '2048 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'M', - 'mem': 4096, - 'cpus': 4, - 'gpus': 0, - 'disk': null, - 'price': 1.7182, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.M', - 'memory': { - 'unit': 'B', - 'value': 4294967296, - 'formatted': '4096 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'L', - 'mem': 8192, - 'cpus': 6, - 'gpus': 0, - 'disk': null, - 'price': 3.4364, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.L', - 'memory': { - 'unit': 'B', - 'value': 8589934592, - 'formatted': '8192 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'XL', - 'mem': 16384, - 'cpus': 8, - 'gpus': 0, - 'disk': null, - 'price': 6.8729, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.XL', - 'memory': { - 'unit': 'B', - 'value': 17179869184, - 'formatted': '16384 MiB', - }, - 'rbdimage': null, - }, - { - 'name': '2XL', - 'mem': 24576, - 'cpus': 12, - 'gpus': 0, - 'disk': null, - 'price': 13.7458, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.2XL', - 'memory': { - 'unit': 'B', - 'value': 25769803776, - 'formatted': '24576 MiB', - }, - 'rbdimage': null, - }, - { - 'name': '3XL', - 'mem': 32768, - 'cpus': 16, - 'gpus': 0, - 'disk': null, - 'price': 27.4915, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.3XL', - 'memory': { - 'unit': 'B', - 'value': 34359738368, - 'formatted': '32768 MiB', - }, - 'rbdimage': null, + description: 'ruby', + enabled: true, + comingSoon: false, + maxInstances: 40, + tags: ['ruby'], + deployments: ['git'], + flavors: [ + { + name: 'pico', + mem: 256, + cpus: 1, + gpus: 0, + disk: null, + price: 0.1073883162, + available: true, + microservice: true, + machine_learning: false, + nice: 5, + price_id: 'apps.pico', + memory: { + unit: 'B', + value: 268435456, + formatted: '256 MiB', + }, + }, + { + name: 'nano', + mem: 512, + cpus: 1, + gpus: 0, + disk: null, + price: 0.1431844215, + available: true, + microservice: true, + machine_learning: false, + nice: 5, + price_id: 'apps.nano', + memory: { + unit: 'B', + value: 536870912, + formatted: '512 MiB', + }, + }, + { + name: 'XS', + mem: 1024, + cpus: 1, + gpus: 0, + disk: null, + price: 0.3436, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.XS', + memory: { + unit: 'B', + value: 1073741824, + formatted: '1024 MiB', + }, + }, + { + name: 'S', + mem: 2048, + cpus: 2, + gpus: 0, + disk: null, + price: 0.6873, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.S', + memory: { + unit: 'B', + value: 2147483648, + formatted: '2048 MiB', + }, + }, + { + name: 'M', + mem: 4096, + cpus: 4, + gpus: 0, + disk: null, + price: 1.7182, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.M', + memory: { + unit: 'B', + value: 4294967296, + formatted: '4096 MiB', + }, + }, + { + name: 'L', + mem: 8192, + cpus: 6, + gpus: 0, + disk: null, + price: 3.4364, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.L', + memory: { + unit: 'B', + value: 8589934592, + formatted: '8192 MiB', + }, + }, + { + name: 'XL', + mem: 16384, + cpus: 8, + gpus: 0, + disk: null, + price: 6.8729, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.XL', + memory: { + unit: 'B', + value: 17179869184, + formatted: '16384 MiB', + }, + }, + { + name: '2XL', + mem: 24576, + cpus: 12, + gpus: 0, + disk: null, + price: 13.7458, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.2XL', + memory: { + unit: 'B', + value: 25769803776, + formatted: '24576 MiB', + }, + }, + { + name: '3XL', + mem: 32768, + cpus: 16, + gpus: 0, + disk: null, + price: 27.4915, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.3XL', + memory: { + unit: 'B', + value: 34359738368, + formatted: '32768 MiB', + }, }, ], - 'defaultFlavor': { - 'name': 'XS', - 'mem': 1024, - 'cpus': 1, - 'gpus': 0, - 'disk': null, - 'price': 0.3436, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.XS', - 'memory': { - 'unit': 'B', - 'value': 1073741824, - 'formatted': '1024 MiB', - }, - 'rbdimage': null, + defaultFlavor: { + name: 'XS', + mem: 1024, + cpus: 1, + gpus: 0, + disk: null, + price: 0.3436, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.XS', + memory: { + unit: 'B', + value: 1073741824, + formatted: '1024 MiB', + }, }, - 'buildFlavor': { - 'name': 'M', - 'mem': 4096, - 'cpus': 4, - 'gpus': 0, - 'disk': null, - 'price': 1.7182, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.M', - 'memory': { - 'unit': 'B', - 'value': 4294967296, - 'formatted': '4096 MiB', - }, - 'rbdimage': null, + buildFlavor: { + name: 'M', + mem: 4096, + cpus: 4, + gpus: 0, + disk: null, + price: 1.7182, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.M', + memory: { + unit: 'B', + value: 4294967296, + formatted: '4096 MiB', + }, }, }, { - 'type': 'java', - 'version': '20210421', - 'name': 'Java + Play! 1', - 'variant': { - 'id': '3112d076-1e33-4f06-9efe-9a766619a2ba', - 'slug': 'play1', - 'name': 'Java + Play! 1', - 'deployType': 'java', - 'logo': 'https://assets.clever-cloud.com/logos/play1.svg', + type: 'java', + version: '20210421', + name: 'Java + Play! 1', + variant: { + id: '3112d076-1e33-4f06-9efe-9a766619a2ba', + slug: 'play1', + name: 'Java + Play! 1', + deployType: 'java', + logo: 'https://assets.clever-cloud.com/logos/play1.svg', }, - 'description': 'java', - 'enabled': true, - 'comingSoon': false, - 'maxInstances': 40, - 'tags': [ - 'java', - 'jvm', - 'war', - 'jar', - 'sbt', - 'maven', - 'mvn', - 'gradle', - 'play', - ], - 'deployments': [ - 'git', - ], - 'flavors': [ - { - 'name': 'pico', - 'mem': 256, - 'cpus': 1, - 'gpus': 0, - 'disk': null, - 'price': 0.1073883162, - 'available': true, - 'microservice': true, - 'machine_learning': false, - 'nice': 5, - 'price_id': 'apps.pico', - 'memory': { - 'unit': 'B', - 'value': 268435456, - 'formatted': '256 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'nano', - 'mem': 512, - 'cpus': 1, - 'gpus': 0, - 'disk': null, - 'price': 0.1431844215, - 'available': true, - 'microservice': true, - 'machine_learning': false, - 'nice': 5, - 'price_id': 'apps.nano', - 'memory': { - 'unit': 'B', - 'value': 536870912, - 'formatted': '512 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'XS', - 'mem': 1024, - 'cpus': 1, - 'gpus': 0, - 'disk': null, - 'price': 0.3436, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.XS', - 'memory': { - 'unit': 'B', - 'value': 1073741824, - 'formatted': '1024 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'S', - 'mem': 2048, - 'cpus': 2, - 'gpus': 0, - 'disk': null, - 'price': 0.6873, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.S', - 'memory': { - 'unit': 'B', - 'value': 2147483648, - 'formatted': '2048 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'M', - 'mem': 4096, - 'cpus': 4, - 'gpus': 0, - 'disk': null, - 'price': 1.7182, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.M', - 'memory': { - 'unit': 'B', - 'value': 4294967296, - 'formatted': '4096 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'L', - 'mem': 8192, - 'cpus': 6, - 'gpus': 0, - 'disk': null, - 'price': 3.4364, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.L', - 'memory': { - 'unit': 'B', - 'value': 8589934592, - 'formatted': '8192 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'XL', - 'mem': 16384, - 'cpus': 8, - 'gpus': 0, - 'disk': null, - 'price': 6.8729, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.XL', - 'memory': { - 'unit': 'B', - 'value': 17179869184, - 'formatted': '16384 MiB', - }, - 'rbdimage': null, - }, - { - 'name': '2XL', - 'mem': 24576, - 'cpus': 12, - 'gpus': 0, - 'disk': null, - 'price': 13.7458, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.2XL', - 'memory': { - 'unit': 'B', - 'value': 25769803776, - 'formatted': '24576 MiB', - }, - 'rbdimage': null, - }, - { - 'name': '3XL', - 'mem': 32768, - 'cpus': 16, - 'gpus': 0, - 'disk': null, - 'price': 27.4915, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.3XL', - 'memory': { - 'unit': 'B', - 'value': 34359738368, - 'formatted': '32768 MiB', - }, - 'rbdimage': null, + description: 'java', + enabled: true, + comingSoon: false, + maxInstances: 40, + tags: ['java', 'jvm', 'war', 'jar', 'sbt', 'maven', 'mvn', 'gradle', 'play'], + deployments: ['git'], + flavors: [ + { + name: 'pico', + mem: 256, + cpus: 1, + gpus: 0, + disk: null, + price: 0.1073883162, + available: true, + microservice: true, + machine_learning: false, + nice: 5, + price_id: 'apps.pico', + memory: { + unit: 'B', + value: 268435456, + formatted: '256 MiB', + }, + }, + { + name: 'nano', + mem: 512, + cpus: 1, + gpus: 0, + disk: null, + price: 0.1431844215, + available: true, + microservice: true, + machine_learning: false, + nice: 5, + price_id: 'apps.nano', + memory: { + unit: 'B', + value: 536870912, + formatted: '512 MiB', + }, + }, + { + name: 'XS', + mem: 1024, + cpus: 1, + gpus: 0, + disk: null, + price: 0.3436, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.XS', + memory: { + unit: 'B', + value: 1073741824, + formatted: '1024 MiB', + }, + }, + { + name: 'S', + mem: 2048, + cpus: 2, + gpus: 0, + disk: null, + price: 0.6873, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.S', + memory: { + unit: 'B', + value: 2147483648, + formatted: '2048 MiB', + }, + }, + { + name: 'M', + mem: 4096, + cpus: 4, + gpus: 0, + disk: null, + price: 1.7182, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.M', + memory: { + unit: 'B', + value: 4294967296, + formatted: '4096 MiB', + }, + }, + { + name: 'L', + mem: 8192, + cpus: 6, + gpus: 0, + disk: null, + price: 3.4364, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.L', + memory: { + unit: 'B', + value: 8589934592, + formatted: '8192 MiB', + }, + }, + { + name: 'XL', + mem: 16384, + cpus: 8, + gpus: 0, + disk: null, + price: 6.8729, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.XL', + memory: { + unit: 'B', + value: 17179869184, + formatted: '16384 MiB', + }, + }, + { + name: '2XL', + mem: 24576, + cpus: 12, + gpus: 0, + disk: null, + price: 13.7458, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.2XL', + memory: { + unit: 'B', + value: 25769803776, + formatted: '24576 MiB', + }, + }, + { + name: '3XL', + mem: 32768, + cpus: 16, + gpus: 0, + disk: null, + price: 27.4915, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.3XL', + memory: { + unit: 'B', + value: 34359738368, + formatted: '32768 MiB', + }, }, ], - 'defaultFlavor': { - 'name': 'XS', - 'mem': 1024, - 'cpus': 1, - 'gpus': 0, - 'disk': null, - 'price': 0.3436, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.XS', - 'memory': { - 'unit': 'B', - 'value': 1073741824, - 'formatted': '1024 MiB', - }, - 'rbdimage': null, + defaultFlavor: { + name: 'XS', + mem: 1024, + cpus: 1, + gpus: 0, + disk: null, + price: 0.3436, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.XS', + memory: { + unit: 'B', + value: 1073741824, + formatted: '1024 MiB', + }, }, - 'buildFlavor': { - 'name': 'M', - 'mem': 4096, - 'cpus': 4, - 'gpus': 0, - 'disk': null, - 'price': 1.7182, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.M', - 'memory': { - 'unit': 'B', - 'value': 4294967296, - 'formatted': '4096 MiB', - }, - 'rbdimage': null, + buildFlavor: { + name: 'M', + mem: 4096, + cpus: 4, + gpus: 0, + disk: null, + price: 1.7182, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.M', + memory: { + unit: 'B', + value: 4294967296, + formatted: '4096 MiB', + }, }, }, { - 'type': 'java', - 'version': '20210421', - 'name': 'Java or Scala + Play! 2', - 'variant': { - 'id': 'ea6625a2-3ff6-4662-b724-280fc2f400b9', - 'slug': 'play2', - 'name': 'Java or Scala + Play! 2', - 'deployType': 'java', - 'logo': 'https://assets.clever-cloud.com/logos/play2.svg', + type: 'java', + version: '20210421', + name: 'Java or Scala + Play! 2', + variant: { + id: 'ea6625a2-3ff6-4662-b724-280fc2f400b9', + slug: 'play2', + name: 'Java or Scala + Play! 2', + deployType: 'java', + logo: 'https://assets.clever-cloud.com/logos/play2.svg', }, - 'description': 'java', - 'enabled': true, - 'comingSoon': false, - 'maxInstances': 40, - 'tags': [ - 'java', - 'jvm', - 'war', - 'jar', - 'sbt', - 'maven', - 'mvn', - 'gradle', - 'play', - ], - 'deployments': [ - 'git', - ], - 'flavors': [ - { - 'name': 'pico', - 'mem': 256, - 'cpus': 1, - 'gpus': 0, - 'disk': null, - 'price': 0.1073883162, - 'available': true, - 'microservice': true, - 'machine_learning': false, - 'nice': 5, - 'price_id': 'apps.pico', - 'memory': { - 'unit': 'B', - 'value': 268435456, - 'formatted': '256 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'nano', - 'mem': 512, - 'cpus': 1, - 'gpus': 0, - 'disk': null, - 'price': 0.1431844215, - 'available': true, - 'microservice': true, - 'machine_learning': false, - 'nice': 5, - 'price_id': 'apps.nano', - 'memory': { - 'unit': 'B', - 'value': 536870912, - 'formatted': '512 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'XS', - 'mem': 1024, - 'cpus': 1, - 'gpus': 0, - 'disk': null, - 'price': 0.3436, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.XS', - 'memory': { - 'unit': 'B', - 'value': 1073741824, - 'formatted': '1024 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'S', - 'mem': 2048, - 'cpus': 2, - 'gpus': 0, - 'disk': null, - 'price': 0.6873, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.S', - 'memory': { - 'unit': 'B', - 'value': 2147483648, - 'formatted': '2048 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'M', - 'mem': 4096, - 'cpus': 4, - 'gpus': 0, - 'disk': null, - 'price': 1.7182, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.M', - 'memory': { - 'unit': 'B', - 'value': 4294967296, - 'formatted': '4096 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'L', - 'mem': 8192, - 'cpus': 6, - 'gpus': 0, - 'disk': null, - 'price': 3.4364, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.L', - 'memory': { - 'unit': 'B', - 'value': 8589934592, - 'formatted': '8192 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'XL', - 'mem': 16384, - 'cpus': 8, - 'gpus': 0, - 'disk': null, - 'price': 6.8729, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.XL', - 'memory': { - 'unit': 'B', - 'value': 17179869184, - 'formatted': '16384 MiB', - }, - 'rbdimage': null, - }, - { - 'name': '2XL', - 'mem': 24576, - 'cpus': 12, - 'gpus': 0, - 'disk': null, - 'price': 13.7458, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.2XL', - 'memory': { - 'unit': 'B', - 'value': 25769803776, - 'formatted': '24576 MiB', - }, - 'rbdimage': null, - }, - { - 'name': '3XL', - 'mem': 32768, - 'cpus': 16, - 'gpus': 0, - 'disk': null, - 'price': 27.4915, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.3XL', - 'memory': { - 'unit': 'B', - 'value': 34359738368, - 'formatted': '32768 MiB', - }, - 'rbdimage': null, + description: 'java', + enabled: true, + comingSoon: false, + maxInstances: 40, + tags: ['java', 'jvm', 'war', 'jar', 'sbt', 'maven', 'mvn', 'gradle', 'play'], + deployments: ['git'], + flavors: [ + { + name: 'pico', + mem: 256, + cpus: 1, + gpus: 0, + disk: null, + price: 0.1073883162, + available: true, + microservice: true, + machine_learning: false, + nice: 5, + price_id: 'apps.pico', + memory: { + unit: 'B', + value: 268435456, + formatted: '256 MiB', + }, + }, + { + name: 'nano', + mem: 512, + cpus: 1, + gpus: 0, + disk: null, + price: 0.1431844215, + available: true, + microservice: true, + machine_learning: false, + nice: 5, + price_id: 'apps.nano', + memory: { + unit: 'B', + value: 536870912, + formatted: '512 MiB', + }, + }, + { + name: 'XS', + mem: 1024, + cpus: 1, + gpus: 0, + disk: null, + price: 0.3436, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.XS', + memory: { + unit: 'B', + value: 1073741824, + formatted: '1024 MiB', + }, + }, + { + name: 'S', + mem: 2048, + cpus: 2, + gpus: 0, + disk: null, + price: 0.6873, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.S', + memory: { + unit: 'B', + value: 2147483648, + formatted: '2048 MiB', + }, + }, + { + name: 'M', + mem: 4096, + cpus: 4, + gpus: 0, + disk: null, + price: 1.7182, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.M', + memory: { + unit: 'B', + value: 4294967296, + formatted: '4096 MiB', + }, + }, + { + name: 'L', + mem: 8192, + cpus: 6, + gpus: 0, + disk: null, + price: 3.4364, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.L', + memory: { + unit: 'B', + value: 8589934592, + formatted: '8192 MiB', + }, + }, + { + name: 'XL', + mem: 16384, + cpus: 8, + gpus: 0, + disk: null, + price: 6.8729, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.XL', + memory: { + unit: 'B', + value: 17179869184, + formatted: '16384 MiB', + }, + }, + { + name: '2XL', + mem: 24576, + cpus: 12, + gpus: 0, + disk: null, + price: 13.7458, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.2XL', + memory: { + unit: 'B', + value: 25769803776, + formatted: '24576 MiB', + }, + }, + { + name: '3XL', + mem: 32768, + cpus: 16, + gpus: 0, + disk: null, + price: 27.4915, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.3XL', + memory: { + unit: 'B', + value: 34359738368, + formatted: '32768 MiB', + }, }, ], - 'defaultFlavor': { - 'name': 'XS', - 'mem': 1024, - 'cpus': 1, - 'gpus': 0, - 'disk': null, - 'price': 0.3436, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.XS', - 'memory': { - 'unit': 'B', - 'value': 1073741824, - 'formatted': '1024 MiB', - }, - 'rbdimage': null, + defaultFlavor: { + name: 'XS', + mem: 1024, + cpus: 1, + gpus: 0, + disk: null, + price: 0.3436, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.XS', + memory: { + unit: 'B', + value: 1073741824, + formatted: '1024 MiB', + }, }, - 'buildFlavor': { - 'name': 'M', - 'mem': 4096, - 'cpus': 4, - 'gpus': 0, - 'disk': null, - 'price': 1.7182, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.M', - 'memory': { - 'unit': 'B', - 'value': 4294967296, - 'formatted': '4096 MiB', - }, - 'rbdimage': null, + buildFlavor: { + name: 'M', + mem: 4096, + cpus: 4, + gpus: 0, + disk: null, + price: 1.7182, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.M', + memory: { + unit: 'B', + value: 4294967296, + formatted: '4096 MiB', + }, }, }, { - 'type': 'java', - 'version': '20210421', - 'name': 'Java or Groovy + Gradle', - 'variant': { - 'id': '5163834d-b343-4006-bfdb-ece9d30fbb51', - 'slug': 'gradle', - 'name': 'Java or Groovy + Gradle', - 'deployType': 'java', - 'logo': 'https://assets.clever-cloud.com/logos/gradle.svg', + type: 'java', + version: '20210421', + name: 'Java or Groovy + Gradle', + variant: { + id: '5163834d-b343-4006-bfdb-ece9d30fbb51', + slug: 'gradle', + name: 'Java or Groovy + Gradle', + deployType: 'java', + logo: 'https://assets.clever-cloud.com/logos/gradle.svg', }, - 'description': 'java', - 'enabled': true, - 'comingSoon': false, - 'maxInstances': 40, - 'tags': [ - 'java', - 'jvm', - 'war', - 'jar', - 'sbt', - 'maven', - 'mvn', - 'gradle', - 'play', - ], - 'deployments': [ - 'git', - ], - 'flavors': [ - { - 'name': 'pico', - 'mem': 256, - 'cpus': 1, - 'gpus': 0, - 'disk': null, - 'price': 0.1073883162, - 'available': true, - 'microservice': true, - 'machine_learning': false, - 'nice': 5, - 'price_id': 'apps.pico', - 'memory': { - 'unit': 'B', - 'value': 268435456, - 'formatted': '256 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'nano', - 'mem': 512, - 'cpus': 1, - 'gpus': 0, - 'disk': null, - 'price': 0.1431844215, - 'available': true, - 'microservice': true, - 'machine_learning': false, - 'nice': 5, - 'price_id': 'apps.nano', - 'memory': { - 'unit': 'B', - 'value': 536870912, - 'formatted': '512 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'XS', - 'mem': 1024, - 'cpus': 1, - 'gpus': 0, - 'disk': null, - 'price': 0.3436, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.XS', - 'memory': { - 'unit': 'B', - 'value': 1073741824, - 'formatted': '1024 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'S', - 'mem': 2048, - 'cpus': 2, - 'gpus': 0, - 'disk': null, - 'price': 0.6873, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.S', - 'memory': { - 'unit': 'B', - 'value': 2147483648, - 'formatted': '2048 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'M', - 'mem': 4096, - 'cpus': 4, - 'gpus': 0, - 'disk': null, - 'price': 1.7182, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.M', - 'memory': { - 'unit': 'B', - 'value': 4294967296, - 'formatted': '4096 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'L', - 'mem': 8192, - 'cpus': 6, - 'gpus': 0, - 'disk': null, - 'price': 3.4364, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.L', - 'memory': { - 'unit': 'B', - 'value': 8589934592, - 'formatted': '8192 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'XL', - 'mem': 16384, - 'cpus': 8, - 'gpus': 0, - 'disk': null, - 'price': 6.8729, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.XL', - 'memory': { - 'unit': 'B', - 'value': 17179869184, - 'formatted': '16384 MiB', - }, - 'rbdimage': null, - }, - { - 'name': '2XL', - 'mem': 24576, - 'cpus': 12, - 'gpus': 0, - 'disk': null, - 'price': 13.7458, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.2XL', - 'memory': { - 'unit': 'B', - 'value': 25769803776, - 'formatted': '24576 MiB', - }, - 'rbdimage': null, - }, - { - 'name': '3XL', - 'mem': 32768, - 'cpus': 16, - 'gpus': 0, - 'disk': null, - 'price': 27.4915, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.3XL', - 'memory': { - 'unit': 'B', - 'value': 34359738368, - 'formatted': '32768 MiB', - }, - 'rbdimage': null, + description: 'java', + enabled: true, + comingSoon: false, + maxInstances: 40, + tags: ['java', 'jvm', 'war', 'jar', 'sbt', 'maven', 'mvn', 'gradle', 'play'], + deployments: ['git'], + flavors: [ + { + name: 'pico', + mem: 256, + cpus: 1, + gpus: 0, + disk: null, + price: 0.1073883162, + available: true, + microservice: true, + machine_learning: false, + nice: 5, + price_id: 'apps.pico', + memory: { + unit: 'B', + value: 268435456, + formatted: '256 MiB', + }, + }, + { + name: 'nano', + mem: 512, + cpus: 1, + gpus: 0, + disk: null, + price: 0.1431844215, + available: true, + microservice: true, + machine_learning: false, + nice: 5, + price_id: 'apps.nano', + memory: { + unit: 'B', + value: 536870912, + formatted: '512 MiB', + }, + }, + { + name: 'XS', + mem: 1024, + cpus: 1, + gpus: 0, + disk: null, + price: 0.3436, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.XS', + memory: { + unit: 'B', + value: 1073741824, + formatted: '1024 MiB', + }, + }, + { + name: 'S', + mem: 2048, + cpus: 2, + gpus: 0, + disk: null, + price: 0.6873, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.S', + memory: { + unit: 'B', + value: 2147483648, + formatted: '2048 MiB', + }, + }, + { + name: 'M', + mem: 4096, + cpus: 4, + gpus: 0, + disk: null, + price: 1.7182, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.M', + memory: { + unit: 'B', + value: 4294967296, + formatted: '4096 MiB', + }, + }, + { + name: 'L', + mem: 8192, + cpus: 6, + gpus: 0, + disk: null, + price: 3.4364, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.L', + memory: { + unit: 'B', + value: 8589934592, + formatted: '8192 MiB', + }, + }, + { + name: 'XL', + mem: 16384, + cpus: 8, + gpus: 0, + disk: null, + price: 6.8729, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.XL', + memory: { + unit: 'B', + value: 17179869184, + formatted: '16384 MiB', + }, + }, + { + name: '2XL', + mem: 24576, + cpus: 12, + gpus: 0, + disk: null, + price: 13.7458, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.2XL', + memory: { + unit: 'B', + value: 25769803776, + formatted: '24576 MiB', + }, + }, + { + name: '3XL', + mem: 32768, + cpus: 16, + gpus: 0, + disk: null, + price: 27.4915, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.3XL', + memory: { + unit: 'B', + value: 34359738368, + formatted: '32768 MiB', + }, }, ], - 'defaultFlavor': { - 'name': 'XS', - 'mem': 1024, - 'cpus': 1, - 'gpus': 0, - 'disk': null, - 'price': 0.3436, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.XS', - 'memory': { - 'unit': 'B', - 'value': 1073741824, - 'formatted': '1024 MiB', - }, - 'rbdimage': null, + defaultFlavor: { + name: 'XS', + mem: 1024, + cpus: 1, + gpus: 0, + disk: null, + price: 0.3436, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.XS', + memory: { + unit: 'B', + value: 1073741824, + formatted: '1024 MiB', + }, }, - 'buildFlavor': { - 'name': 'M', - 'mem': 4096, - 'cpus': 4, - 'gpus': 0, - 'disk': null, - 'price': 1.7182, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.M', - 'memory': { - 'unit': 'B', - 'value': 4294967296, - 'formatted': '4096 MiB', - }, - 'rbdimage': null, + buildFlavor: { + name: 'M', + mem: 4096, + cpus: 4, + gpus: 0, + disk: null, + price: 1.7182, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.M', + memory: { + unit: 'B', + value: 4294967296, + formatted: '4096 MiB', + }, }, }, { - 'type': 'java', - 'version': '20210421', - 'name': 'Java + JAR', - 'variant': { - 'id': '879bf2c4-54b2-4b84-83f6-704d90c08062', - 'slug': 'jar', - 'name': 'Java + JAR', - 'deployType': 'java', - 'logo': 'https://assets.clever-cloud.com/logos/java-jar.svg', + type: 'java', + version: '20210421', + name: 'Java + JAR', + variant: { + id: '879bf2c4-54b2-4b84-83f6-704d90c08062', + slug: 'jar', + name: 'Java + JAR', + deployType: 'java', + logo: 'https://assets.clever-cloud.com/logos/java-jar.svg', }, - 'description': 'java', - 'enabled': true, - 'comingSoon': false, - 'maxInstances': 40, - 'tags': [ - 'java', - 'jvm', - 'war', - 'jar', - 'sbt', - 'maven', - 'mvn', - 'gradle', - 'play', - ], - 'deployments': [ - 'git', - ], - 'flavors': [ - { - 'name': 'pico', - 'mem': 256, - 'cpus': 1, - 'gpus': 0, - 'disk': null, - 'price': 0.1073883162, - 'available': true, - 'microservice': true, - 'machine_learning': false, - 'nice': 5, - 'price_id': 'apps.pico', - 'memory': { - 'unit': 'B', - 'value': 268435456, - 'formatted': '256 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'nano', - 'mem': 512, - 'cpus': 1, - 'gpus': 0, - 'disk': null, - 'price': 0.1431844215, - 'available': true, - 'microservice': true, - 'machine_learning': false, - 'nice': 5, - 'price_id': 'apps.nano', - 'memory': { - 'unit': 'B', - 'value': 536870912, - 'formatted': '512 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'XS', - 'mem': 1024, - 'cpus': 1, - 'gpus': 0, - 'disk': null, - 'price': 0.3436, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.XS', - 'memory': { - 'unit': 'B', - 'value': 1073741824, - 'formatted': '1024 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'S', - 'mem': 2048, - 'cpus': 2, - 'gpus': 0, - 'disk': null, - 'price': 0.6873, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.S', - 'memory': { - 'unit': 'B', - 'value': 2147483648, - 'formatted': '2048 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'M', - 'mem': 4096, - 'cpus': 4, - 'gpus': 0, - 'disk': null, - 'price': 1.7182, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.M', - 'memory': { - 'unit': 'B', - 'value': 4294967296, - 'formatted': '4096 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'L', - 'mem': 8192, - 'cpus': 6, - 'gpus': 0, - 'disk': null, - 'price': 3.4364, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.L', - 'memory': { - 'unit': 'B', - 'value': 8589934592, - 'formatted': '8192 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'XL', - 'mem': 16384, - 'cpus': 8, - 'gpus': 0, - 'disk': null, - 'price': 6.8729, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.XL', - 'memory': { - 'unit': 'B', - 'value': 17179869184, - 'formatted': '16384 MiB', - }, - 'rbdimage': null, - }, - { - 'name': '2XL', - 'mem': 24576, - 'cpus': 12, - 'gpus': 0, - 'disk': null, - 'price': 13.7458, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.2XL', - 'memory': { - 'unit': 'B', - 'value': 25769803776, - 'formatted': '24576 MiB', - }, - 'rbdimage': null, - }, - { - 'name': '3XL', - 'mem': 32768, - 'cpus': 16, - 'gpus': 0, - 'disk': null, - 'price': 27.4915, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.3XL', - 'memory': { - 'unit': 'B', - 'value': 34359738368, - 'formatted': '32768 MiB', - }, - 'rbdimage': null, + description: 'java', + enabled: true, + comingSoon: false, + maxInstances: 40, + tags: ['java', 'jvm', 'war', 'jar', 'sbt', 'maven', 'mvn', 'gradle', 'play'], + deployments: ['git'], + flavors: [ + { + name: 'pico', + mem: 256, + cpus: 1, + gpus: 0, + disk: null, + price: 0.1073883162, + available: true, + microservice: true, + machine_learning: false, + nice: 5, + price_id: 'apps.pico', + memory: { + unit: 'B', + value: 268435456, + formatted: '256 MiB', + }, + }, + { + name: 'nano', + mem: 512, + cpus: 1, + gpus: 0, + disk: null, + price: 0.1431844215, + available: true, + microservice: true, + machine_learning: false, + nice: 5, + price_id: 'apps.nano', + memory: { + unit: 'B', + value: 536870912, + formatted: '512 MiB', + }, + }, + { + name: 'XS', + mem: 1024, + cpus: 1, + gpus: 0, + disk: null, + price: 0.3436, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.XS', + memory: { + unit: 'B', + value: 1073741824, + formatted: '1024 MiB', + }, + }, + { + name: 'S', + mem: 2048, + cpus: 2, + gpus: 0, + disk: null, + price: 0.6873, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.S', + memory: { + unit: 'B', + value: 2147483648, + formatted: '2048 MiB', + }, + }, + { + name: 'M', + mem: 4096, + cpus: 4, + gpus: 0, + disk: null, + price: 1.7182, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.M', + memory: { + unit: 'B', + value: 4294967296, + formatted: '4096 MiB', + }, + }, + { + name: 'L', + mem: 8192, + cpus: 6, + gpus: 0, + disk: null, + price: 3.4364, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.L', + memory: { + unit: 'B', + value: 8589934592, + formatted: '8192 MiB', + }, + }, + { + name: 'XL', + mem: 16384, + cpus: 8, + gpus: 0, + disk: null, + price: 6.8729, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.XL', + memory: { + unit: 'B', + value: 17179869184, + formatted: '16384 MiB', + }, + }, + { + name: '2XL', + mem: 24576, + cpus: 12, + gpus: 0, + disk: null, + price: 13.7458, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.2XL', + memory: { + unit: 'B', + value: 25769803776, + formatted: '24576 MiB', + }, + }, + { + name: '3XL', + mem: 32768, + cpus: 16, + gpus: 0, + disk: null, + price: 27.4915, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.3XL', + memory: { + unit: 'B', + value: 34359738368, + formatted: '32768 MiB', + }, }, ], - 'defaultFlavor': { - 'name': 'XS', - 'mem': 1024, - 'cpus': 1, - 'gpus': 0, - 'disk': null, - 'price': 0.3436, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.XS', - 'memory': { - 'unit': 'B', - 'value': 1073741824, - 'formatted': '1024 MiB', - }, - 'rbdimage': null, + defaultFlavor: { + name: 'XS', + mem: 1024, + cpus: 1, + gpus: 0, + disk: null, + price: 0.3436, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.XS', + memory: { + unit: 'B', + value: 1073741824, + formatted: '1024 MiB', + }, }, - 'buildFlavor': { - 'name': 'M', - 'mem': 4096, - 'cpus': 4, - 'gpus': 0, - 'disk': null, - 'price': 1.7182, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.M', - 'memory': { - 'unit': 'B', - 'value': 4294967296, - 'formatted': '4096 MiB', - }, - 'rbdimage': null, + buildFlavor: { + name: 'M', + mem: 4096, + cpus: 4, + gpus: 0, + disk: null, + price: 1.7182, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.M', + memory: { + unit: 'B', + value: 4294967296, + formatted: '4096 MiB', + }, }, }, { - 'type': 'java', - 'version': '20210421', - 'name': 'Java + Maven', - 'variant': { - 'id': 'af524b51-b5a8-4b7f-bd60-d80fa3925b34', - 'slug': 'maven', - 'name': 'Java + Maven', - 'deployType': 'java', - 'logo': 'https://assets.clever-cloud.com/logos/maven.svg', + type: 'java', + version: '20210421', + name: 'Java + Maven', + variant: { + id: 'af524b51-b5a8-4b7f-bd60-d80fa3925b34', + slug: 'maven', + name: 'Java + Maven', + deployType: 'java', + logo: 'https://assets.clever-cloud.com/logos/maven.svg', }, - 'description': 'java', - 'enabled': true, - 'comingSoon': false, - 'maxInstances': 40, - 'tags': [ - 'java', - 'jvm', - 'war', - 'jar', - 'sbt', - 'maven', - 'mvn', - 'gradle', - 'play', - ], - 'deployments': [ - 'git', - ], - 'flavors': [ - { - 'name': 'pico', - 'mem': 256, - 'cpus': 1, - 'gpus': 0, - 'disk': null, - 'price': 0.1073883162, - 'available': true, - 'microservice': true, - 'machine_learning': false, - 'nice': 5, - 'price_id': 'apps.pico', - 'memory': { - 'unit': 'B', - 'value': 268435456, - 'formatted': '256 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'nano', - 'mem': 512, - 'cpus': 1, - 'gpus': 0, - 'disk': null, - 'price': 0.1431844215, - 'available': true, - 'microservice': true, - 'machine_learning': false, - 'nice': 5, - 'price_id': 'apps.nano', - 'memory': { - 'unit': 'B', - 'value': 536870912, - 'formatted': '512 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'XS', - 'mem': 1024, - 'cpus': 1, - 'gpus': 0, - 'disk': null, - 'price': 0.3436, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.XS', - 'memory': { - 'unit': 'B', - 'value': 1073741824, - 'formatted': '1024 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'S', - 'mem': 2048, - 'cpus': 2, - 'gpus': 0, - 'disk': null, - 'price': 0.6873, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.S', - 'memory': { - 'unit': 'B', - 'value': 2147483648, - 'formatted': '2048 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'M', - 'mem': 4096, - 'cpus': 4, - 'gpus': 0, - 'disk': null, - 'price': 1.7182, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.M', - 'memory': { - 'unit': 'B', - 'value': 4294967296, - 'formatted': '4096 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'L', - 'mem': 8192, - 'cpus': 6, - 'gpus': 0, - 'disk': null, - 'price': 3.4364, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.L', - 'memory': { - 'unit': 'B', - 'value': 8589934592, - 'formatted': '8192 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'XL', - 'mem': 16384, - 'cpus': 8, - 'gpus': 0, - 'disk': null, - 'price': 6.8729, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.XL', - 'memory': { - 'unit': 'B', - 'value': 17179869184, - 'formatted': '16384 MiB', - }, - 'rbdimage': null, - }, - { - 'name': '2XL', - 'mem': 24576, - 'cpus': 12, - 'gpus': 0, - 'disk': null, - 'price': 13.7458, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.2XL', - 'memory': { - 'unit': 'B', - 'value': 25769803776, - 'formatted': '24576 MiB', - }, - 'rbdimage': null, - }, - { - 'name': '3XL', - 'mem': 32768, - 'cpus': 16, - 'gpus': 0, - 'disk': null, - 'price': 27.4915, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.3XL', - 'memory': { - 'unit': 'B', - 'value': 34359738368, - 'formatted': '32768 MiB', - }, - 'rbdimage': null, + description: 'java', + enabled: true, + comingSoon: false, + maxInstances: 40, + tags: ['java', 'jvm', 'war', 'jar', 'sbt', 'maven', 'mvn', 'gradle', 'play'], + deployments: ['git'], + flavors: [ + { + name: 'pico', + mem: 256, + cpus: 1, + gpus: 0, + disk: null, + price: 0.1073883162, + available: true, + microservice: true, + machine_learning: false, + nice: 5, + price_id: 'apps.pico', + memory: { + unit: 'B', + value: 268435456, + formatted: '256 MiB', + }, + }, + { + name: 'nano', + mem: 512, + cpus: 1, + gpus: 0, + disk: null, + price: 0.1431844215, + available: true, + microservice: true, + machine_learning: false, + nice: 5, + price_id: 'apps.nano', + memory: { + unit: 'B', + value: 536870912, + formatted: '512 MiB', + }, + }, + { + name: 'XS', + mem: 1024, + cpus: 1, + gpus: 0, + disk: null, + price: 0.3436, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.XS', + memory: { + unit: 'B', + value: 1073741824, + formatted: '1024 MiB', + }, + }, + { + name: 'S', + mem: 2048, + cpus: 2, + gpus: 0, + disk: null, + price: 0.6873, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.S', + memory: { + unit: 'B', + value: 2147483648, + formatted: '2048 MiB', + }, + }, + { + name: 'M', + mem: 4096, + cpus: 4, + gpus: 0, + disk: null, + price: 1.7182, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.M', + memory: { + unit: 'B', + value: 4294967296, + formatted: '4096 MiB', + }, + }, + { + name: 'L', + mem: 8192, + cpus: 6, + gpus: 0, + disk: null, + price: 3.4364, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.L', + memory: { + unit: 'B', + value: 8589934592, + formatted: '8192 MiB', + }, + }, + { + name: 'XL', + mem: 16384, + cpus: 8, + gpus: 0, + disk: null, + price: 6.8729, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.XL', + memory: { + unit: 'B', + value: 17179869184, + formatted: '16384 MiB', + }, + }, + { + name: '2XL', + mem: 24576, + cpus: 12, + gpus: 0, + disk: null, + price: 13.7458, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.2XL', + memory: { + unit: 'B', + value: 25769803776, + formatted: '24576 MiB', + }, + }, + { + name: '3XL', + mem: 32768, + cpus: 16, + gpus: 0, + disk: null, + price: 27.4915, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.3XL', + memory: { + unit: 'B', + value: 34359738368, + formatted: '32768 MiB', + }, }, ], - 'defaultFlavor': { - 'name': 'XS', - 'mem': 1024, - 'cpus': 1, - 'gpus': 0, - 'disk': null, - 'price': 0.3436, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.XS', - 'memory': { - 'unit': 'B', - 'value': 1073741824, - 'formatted': '1024 MiB', - }, - 'rbdimage': null, + defaultFlavor: { + name: 'XS', + mem: 1024, + cpus: 1, + gpus: 0, + disk: null, + price: 0.3436, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.XS', + memory: { + unit: 'B', + value: 1073741824, + formatted: '1024 MiB', + }, }, - 'buildFlavor': { - 'name': 'M', - 'mem': 4096, - 'cpus': 4, - 'gpus': 0, - 'disk': null, - 'price': 1.7182, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.M', - 'memory': { - 'unit': 'B', - 'value': 4294967296, - 'formatted': '4096 MiB', - }, - 'rbdimage': null, + buildFlavor: { + name: 'M', + mem: 4096, + cpus: 4, + gpus: 0, + disk: null, + price: 1.7182, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.M', + memory: { + unit: 'B', + value: 4294967296, + formatted: '4096 MiB', + }, }, }, { - 'type': 'java', - 'version': '20210421', - 'name': 'Scala + SBT', - 'variant': { - 'id': '75eccbb4-3477-4846-95c5-7471a6bde653', - 'slug': 'sbt', - 'name': 'Scala + SBT', - 'deployType': 'java', - 'logo': 'https://assets.clever-cloud.com/logos/scala.svg', + type: 'java', + version: '20210421', + name: 'Scala + SBT', + variant: { + id: '75eccbb4-3477-4846-95c5-7471a6bde653', + slug: 'sbt', + name: 'Scala + SBT', + deployType: 'java', + logo: 'https://assets.clever-cloud.com/logos/scala.svg', }, - 'description': 'java', - 'enabled': true, - 'comingSoon': false, - 'maxInstances': 40, - 'tags': [ - 'java', - 'jvm', - 'war', - 'jar', - 'sbt', - 'maven', - 'mvn', - 'gradle', - 'play', - ], - 'deployments': [ - 'git', - ], - 'flavors': [ - { - 'name': 'pico', - 'mem': 256, - 'cpus': 1, - 'gpus': 0, - 'disk': null, - 'price': 0.1073883162, - 'available': true, - 'microservice': true, - 'machine_learning': false, - 'nice': 5, - 'price_id': 'apps.pico', - 'memory': { - 'unit': 'B', - 'value': 268435456, - 'formatted': '256 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'nano', - 'mem': 512, - 'cpus': 1, - 'gpus': 0, - 'disk': null, - 'price': 0.1431844215, - 'available': true, - 'microservice': true, - 'machine_learning': false, - 'nice': 5, - 'price_id': 'apps.nano', - 'memory': { - 'unit': 'B', - 'value': 536870912, - 'formatted': '512 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'XS', - 'mem': 1024, - 'cpus': 1, - 'gpus': 0, - 'disk': null, - 'price': 0.3436, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.XS', - 'memory': { - 'unit': 'B', - 'value': 1073741824, - 'formatted': '1024 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'S', - 'mem': 2048, - 'cpus': 2, - 'gpus': 0, - 'disk': null, - 'price': 0.6873, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.S', - 'memory': { - 'unit': 'B', - 'value': 2147483648, - 'formatted': '2048 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'M', - 'mem': 4096, - 'cpus': 4, - 'gpus': 0, - 'disk': null, - 'price': 1.7182, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.M', - 'memory': { - 'unit': 'B', - 'value': 4294967296, - 'formatted': '4096 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'L', - 'mem': 8192, - 'cpus': 6, - 'gpus': 0, - 'disk': null, - 'price': 3.4364, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.L', - 'memory': { - 'unit': 'B', - 'value': 8589934592, - 'formatted': '8192 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'XL', - 'mem': 16384, - 'cpus': 8, - 'gpus': 0, - 'disk': null, - 'price': 6.8729, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.XL', - 'memory': { - 'unit': 'B', - 'value': 17179869184, - 'formatted': '16384 MiB', - }, - 'rbdimage': null, - }, - { - 'name': '2XL', - 'mem': 24576, - 'cpus': 12, - 'gpus': 0, - 'disk': null, - 'price': 13.7458, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.2XL', - 'memory': { - 'unit': 'B', - 'value': 25769803776, - 'formatted': '24576 MiB', - }, - 'rbdimage': null, - }, - { - 'name': '3XL', - 'mem': 32768, - 'cpus': 16, - 'gpus': 0, - 'disk': null, - 'price': 27.4915, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.3XL', - 'memory': { - 'unit': 'B', - 'value': 34359738368, - 'formatted': '32768 MiB', - }, - 'rbdimage': null, + description: 'java', + enabled: true, + comingSoon: false, + maxInstances: 40, + tags: ['java', 'jvm', 'war', 'jar', 'sbt', 'maven', 'mvn', 'gradle', 'play'], + deployments: ['git'], + flavors: [ + { + name: 'pico', + mem: 256, + cpus: 1, + gpus: 0, + disk: null, + price: 0.1073883162, + available: true, + microservice: true, + machine_learning: false, + nice: 5, + price_id: 'apps.pico', + memory: { + unit: 'B', + value: 268435456, + formatted: '256 MiB', + }, + }, + { + name: 'nano', + mem: 512, + cpus: 1, + gpus: 0, + disk: null, + price: 0.1431844215, + available: true, + microservice: true, + machine_learning: false, + nice: 5, + price_id: 'apps.nano', + memory: { + unit: 'B', + value: 536870912, + formatted: '512 MiB', + }, + }, + { + name: 'XS', + mem: 1024, + cpus: 1, + gpus: 0, + disk: null, + price: 0.3436, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.XS', + memory: { + unit: 'B', + value: 1073741824, + formatted: '1024 MiB', + }, + }, + { + name: 'S', + mem: 2048, + cpus: 2, + gpus: 0, + disk: null, + price: 0.6873, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.S', + memory: { + unit: 'B', + value: 2147483648, + formatted: '2048 MiB', + }, + }, + { + name: 'M', + mem: 4096, + cpus: 4, + gpus: 0, + disk: null, + price: 1.7182, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.M', + memory: { + unit: 'B', + value: 4294967296, + formatted: '4096 MiB', + }, + }, + { + name: 'L', + mem: 8192, + cpus: 6, + gpus: 0, + disk: null, + price: 3.4364, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.L', + memory: { + unit: 'B', + value: 8589934592, + formatted: '8192 MiB', + }, + }, + { + name: 'XL', + mem: 16384, + cpus: 8, + gpus: 0, + disk: null, + price: 6.8729, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.XL', + memory: { + unit: 'B', + value: 17179869184, + formatted: '16384 MiB', + }, + }, + { + name: '2XL', + mem: 24576, + cpus: 12, + gpus: 0, + disk: null, + price: 13.7458, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.2XL', + memory: { + unit: 'B', + value: 25769803776, + formatted: '24576 MiB', + }, + }, + { + name: '3XL', + mem: 32768, + cpus: 16, + gpus: 0, + disk: null, + price: 27.4915, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.3XL', + memory: { + unit: 'B', + value: 34359738368, + formatted: '32768 MiB', + }, }, ], - 'defaultFlavor': { - 'name': 'XS', - 'mem': 1024, - 'cpus': 1, - 'gpus': 0, - 'disk': null, - 'price': 0.3436, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.XS', - 'memory': { - 'unit': 'B', - 'value': 1073741824, - 'formatted': '1024 MiB', - }, - 'rbdimage': null, + defaultFlavor: { + name: 'XS', + mem: 1024, + cpus: 1, + gpus: 0, + disk: null, + price: 0.3436, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.XS', + memory: { + unit: 'B', + value: 1073741824, + formatted: '1024 MiB', + }, }, - 'buildFlavor': { - 'name': 'M', - 'mem': 4096, - 'cpus': 4, - 'gpus': 0, - 'disk': null, - 'price': 1.7182, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.M', - 'memory': { - 'unit': 'B', - 'value': 4294967296, - 'formatted': '4096 MiB', - }, - 'rbdimage': null, + buildFlavor: { + name: 'M', + mem: 4096, + cpus: 4, + gpus: 0, + disk: null, + price: 1.7182, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.M', + memory: { + unit: 'B', + value: 4294967296, + formatted: '4096 MiB', + }, }, }, { - 'type': 'java', - 'version': '20210421', - 'name': 'Java + WAR', - 'variant': { - 'id': '05d5db48-b35d-4bf4-b41b-3d6c25f48b69', - 'slug': 'war', - 'name': 'Java + WAR', - 'deployType': 'java', - 'logo': 'https://assets.clever-cloud.com/logos/java-war.svg', + type: 'java', + version: '20210421', + name: 'Java + WAR', + variant: { + id: '05d5db48-b35d-4bf4-b41b-3d6c25f48b69', + slug: 'war', + name: 'Java + WAR', + deployType: 'java', + logo: 'https://assets.clever-cloud.com/logos/java-war.svg', }, - 'description': 'java', - 'enabled': true, - 'comingSoon': false, - 'maxInstances': 40, - 'tags': [ - 'java', - 'jvm', - 'war', - 'jar', - 'sbt', - 'maven', - 'mvn', - 'gradle', - 'play', - ], - 'deployments': [ - 'git', - ], - 'flavors': [ - { - 'name': 'pico', - 'mem': 256, - 'cpus': 1, - 'gpus': 0, - 'disk': null, - 'price': 0.1073883162, - 'available': true, - 'microservice': true, - 'machine_learning': false, - 'nice': 5, - 'price_id': 'apps.pico', - 'memory': { - 'unit': 'B', - 'value': 268435456, - 'formatted': '256 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'nano', - 'mem': 512, - 'cpus': 1, - 'gpus': 0, - 'disk': null, - 'price': 0.1431844215, - 'available': true, - 'microservice': true, - 'machine_learning': false, - 'nice': 5, - 'price_id': 'apps.nano', - 'memory': { - 'unit': 'B', - 'value': 536870912, - 'formatted': '512 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'XS', - 'mem': 1024, - 'cpus': 1, - 'gpus': 0, - 'disk': null, - 'price': 0.3436, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.XS', - 'memory': { - 'unit': 'B', - 'value': 1073741824, - 'formatted': '1024 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'S', - 'mem': 2048, - 'cpus': 2, - 'gpus': 0, - 'disk': null, - 'price': 0.6873, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.S', - 'memory': { - 'unit': 'B', - 'value': 2147483648, - 'formatted': '2048 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'M', - 'mem': 4096, - 'cpus': 4, - 'gpus': 0, - 'disk': null, - 'price': 1.7182, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.M', - 'memory': { - 'unit': 'B', - 'value': 4294967296, - 'formatted': '4096 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'L', - 'mem': 8192, - 'cpus': 6, - 'gpus': 0, - 'disk': null, - 'price': 3.4364, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.L', - 'memory': { - 'unit': 'B', - 'value': 8589934592, - 'formatted': '8192 MiB', - }, - 'rbdimage': null, - }, - { - 'name': 'XL', - 'mem': 16384, - 'cpus': 8, - 'gpus': 0, - 'disk': null, - 'price': 6.8729, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.XL', - 'memory': { - 'unit': 'B', - 'value': 17179869184, - 'formatted': '16384 MiB', - }, - 'rbdimage': null, - }, - { - 'name': '2XL', - 'mem': 24576, - 'cpus': 12, - 'gpus': 0, - 'disk': null, - 'price': 13.7458, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.2XL', - 'memory': { - 'unit': 'B', - 'value': 25769803776, - 'formatted': '24576 MiB', - }, - 'rbdimage': null, - }, - { - 'name': '3XL', - 'mem': 32768, - 'cpus': 16, - 'gpus': 0, - 'disk': null, - 'price': 27.4915, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.3XL', - 'memory': { - 'unit': 'B', - 'value': 34359738368, - 'formatted': '32768 MiB', - }, - 'rbdimage': null, + description: 'java', + enabled: true, + comingSoon: false, + maxInstances: 40, + tags: ['java', 'jvm', 'war', 'jar', 'sbt', 'maven', 'mvn', 'gradle', 'play'], + deployments: ['git'], + flavors: [ + { + name: 'pico', + mem: 256, + cpus: 1, + gpus: 0, + disk: null, + price: 0.1073883162, + available: true, + microservice: true, + machine_learning: false, + nice: 5, + price_id: 'apps.pico', + memory: { + unit: 'B', + value: 268435456, + formatted: '256 MiB', + }, + }, + { + name: 'nano', + mem: 512, + cpus: 1, + gpus: 0, + disk: null, + price: 0.1431844215, + available: true, + microservice: true, + machine_learning: false, + nice: 5, + price_id: 'apps.nano', + memory: { + unit: 'B', + value: 536870912, + formatted: '512 MiB', + }, + }, + { + name: 'XS', + mem: 1024, + cpus: 1, + gpus: 0, + disk: null, + price: 0.3436, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.XS', + memory: { + unit: 'B', + value: 1073741824, + formatted: '1024 MiB', + }, + }, + { + name: 'S', + mem: 2048, + cpus: 2, + gpus: 0, + disk: null, + price: 0.6873, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.S', + memory: { + unit: 'B', + value: 2147483648, + formatted: '2048 MiB', + }, + }, + { + name: 'M', + mem: 4096, + cpus: 4, + gpus: 0, + disk: null, + price: 1.7182, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.M', + memory: { + unit: 'B', + value: 4294967296, + formatted: '4096 MiB', + }, + }, + { + name: 'L', + mem: 8192, + cpus: 6, + gpus: 0, + disk: null, + price: 3.4364, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.L', + memory: { + unit: 'B', + value: 8589934592, + formatted: '8192 MiB', + }, + }, + { + name: 'XL', + mem: 16384, + cpus: 8, + gpus: 0, + disk: null, + price: 6.8729, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.XL', + memory: { + unit: 'B', + value: 17179869184, + formatted: '16384 MiB', + }, + }, + { + name: '2XL', + mem: 24576, + cpus: 12, + gpus: 0, + disk: null, + price: 13.7458, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.2XL', + memory: { + unit: 'B', + value: 25769803776, + formatted: '24576 MiB', + }, + }, + { + name: '3XL', + mem: 32768, + cpus: 16, + gpus: 0, + disk: null, + price: 27.4915, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.3XL', + memory: { + unit: 'B', + value: 34359738368, + formatted: '32768 MiB', + }, }, ], - 'defaultFlavor': { - 'name': 'XS', - 'mem': 1024, - 'cpus': 1, - 'gpus': 0, - 'disk': null, - 'price': 0.3436, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.XS', - 'memory': { - 'unit': 'B', - 'value': 1073741824, - 'formatted': '1024 MiB', - }, - 'rbdimage': null, + defaultFlavor: { + name: 'XS', + mem: 1024, + cpus: 1, + gpus: 0, + disk: null, + price: 0.3436, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.XS', + memory: { + unit: 'B', + value: 1073741824, + formatted: '1024 MiB', + }, }, - 'buildFlavor': { - 'name': 'M', - 'mem': 4096, - 'cpus': 4, - 'gpus': 0, - 'disk': null, - 'price': 1.7182, - 'available': true, - 'microservice': false, - 'machine_learning': false, - 'nice': 0, - 'price_id': 'apps.M', - 'memory': { - 'unit': 'B', - 'value': 4294967296, - 'formatted': '4096 MiB', - }, - 'rbdimage': null, + buildFlavor: { + name: 'M', + mem: 4096, + cpus: 4, + gpus: 0, + disk: null, + price: 1.7182, + available: true, + microservice: false, + machine_learning: false, + nice: 0, + price_id: 'apps.M', + memory: { + unit: 'B', + value: 4294967296, + formatted: '4096 MiB', + }, }, }, -]; -/* eslint-enable quote-props */ - -const CURRENCY_EUR = { code: 'EUR', changeRate: 1 }; +]); +/* eslint-enable quote-props, camelcase */ -export function getFullProductRuntime (runtimeVariantSlug) { +/** + * @param {typeof rawInstances[number]['variant']['slug']} runtimeVariantSlug + * @param {PriceSystem} [rawPriceSystem] (default: rawPriceSystemEuro) + */ +export function getFullProductRuntime(runtimeVariantSlug, rawPriceSystem = rawPriceSystemEuro) { const runtime = rawInstances.find((runtime) => runtime.variant.slug === runtimeVariantSlug); - return formatRuntimeProduct(runtime, rawPriceSystem, CURRENCY_EUR); + return formatRuntimeProduct(runtime, rawPriceSystem); } -export function getProductRuntime (runtimeVariantSlug) { - const { plans, productFeatures } = getFullProductRuntime(runtimeVariantSlug); +/** + * @param {typeof rawInstances[number]['variant']['slug']} runtimeVariantSlug + * @param {PriceSystem} [rawPriceSystem] (default: rawPriceSystemEuro) + */ +export function getProductRuntime(runtimeVariantSlug, rawPriceSystem = rawPriceSystemEuro) { + const { plans, productFeatures } = getFullProductRuntime(runtimeVariantSlug, rawPriceSystem); return { plans, productFeatures }; } diff --git a/src/translations/translations.en.js b/src/translations/translations.en.js index 4af42ff3e..ab0846501 100644 --- a/src/translations/translations.en.js +++ b/src/translations/translations.en.js @@ -1153,19 +1153,19 @@ export const translations = { 'cc-pricing-product.feature.memory': `RAM`, 'cc-pricing-product.feature.version': `Version`, 'cc-pricing-product.plan': `Plan`, - 'cc-pricing-product.price': /** @param {{price: number, code: string, digits: number}} _ */ ({ + 'cc-pricing-product.price': /** @param {{price: number, currency: string, digits: number}} _ */ ({ price, - code, + currency, digits, - }) => formatCurrency(lang, price, { currency: code, minimumFractionDigits: digits, maximumFractionDigits: digits }), + }) => formatCurrency(lang, price, { currency, minimumFractionDigits: digits, maximumFractionDigits: digits }), 'cc-pricing-product.price-name.1000-minutes': `Price (${formatNumber(lang, 1000)} minutes)`, 'cc-pricing-product.price-name.30-days': () => sanitize`Price/30 days`, 'cc-pricing-product.price-name.day': `Price/Day`, 'cc-pricing-product.price-name.hour': `Price/Hour`, 'cc-pricing-product.price-name.minute': `Price/Minute`, 'cc-pricing-product.price-name.second': `Price/Second`, - 'cc-pricing-product.type.boolean': /** @param {{boolean: string}} _ */ ({ boolean }) => `${boolean ? 'Yes' : 'No'}`, - 'cc-pricing-product.type.boolean-shared': /** @param {{shared: string}} _ */ ({ shared }) => + 'cc-pricing-product.type.boolean': /** @param {{boolean: boolean}} _ */ ({ boolean }) => `${boolean ? 'Yes' : 'No'}`, + 'cc-pricing-product.type.boolean-shared': /** @param {{shared: boolean}} _ */ ({ shared }) => `${shared ? 'Shared' : 'Dedicated'}`, 'cc-pricing-product.type.bytes': /** @param {{bytes: number}} _ */ ({ bytes }) => formatBytes(bytes, 0, 3), 'cc-pricing-product.type.number': /** @param {{number: number}} _ */ ({ number }) => formatNumber(lang, number), diff --git a/src/translations/translations.fr.js b/src/translations/translations.fr.js index 9a28e974e..492895028 100644 --- a/src/translations/translations.fr.js +++ b/src/translations/translations.fr.js @@ -1170,13 +1170,13 @@ export const translations = { 'cc-pricing-product.feature.memory': `RAM`, 'cc-pricing-product.feature.version': `Version`, 'cc-pricing-product.plan': `Plan`, - 'cc-pricing-product.price': /** @param {{price: number, code: string, digits: number}} _ */ ({ + 'cc-pricing-product.price': /** @param {{price: number, currency: string, digits: number}} _ */ ({ price, - code, + currency, digits, }) => formatCurrency(lang, price, { - currency: code, + currency, minimumFractionDigits: digits, maximumFractionDigits: digits, }),