| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- import {
- DISK_LIMITS,
- DISK_PRICING,
- DiskType,
- PLAN_DETAILS,
- } from '../DiskManagement/ui/DiskManagement.constants'
- import { DiskAttributesData } from '@/data/config/disk-attributes-query'
- import { DesiredInstanceSize, instanceSizeSpecs } from '@/data/projects/new-project.constants'
- import { estimateRestoreTimeFromSizeGb } from '@/lib/restore-estimate'
- // Ref: https://supabase.com/docs/guides/platform/compute-and-disk
- const maxDiskForCompute = new Map([
- [10, instanceSizeSpecs.micro],
- [50, instanceSizeSpecs.small],
- [100, instanceSizeSpecs.medium],
- [200, instanceSizeSpecs.large],
- [500, instanceSizeSpecs.xlarge],
- [1_000, instanceSizeSpecs['2xlarge']],
- [2_000, instanceSizeSpecs['4xlarge']],
- [4_000, instanceSizeSpecs['8xlarge']],
- [6_000, instanceSizeSpecs['12xlarge']],
- [10_000, instanceSizeSpecs['16xlarge']],
- ])
- export const estimateComputeSize = (
- projectDiskSize: number,
- branchComputeSize?: DesiredInstanceSize
- ) => {
- if (branchComputeSize) {
- return instanceSizeSpecs[branchComputeSize]
- }
- // Fallback to estimating based on volume size
- for (const [disk, compute] of maxDiskForCompute) {
- if (projectDiskSize <= disk) {
- return compute
- }
- }
- return instanceSizeSpecs['24xlarge']
- }
- export const estimateDiskCost = (disk: DiskAttributesData['attributes']) => {
- const diskType = disk.type as DiskType
- const pricing = DISK_PRICING[diskType]
- const includedGB = PLAN_DETAILS['pro'].includedDiskGB[diskType]
- const priceSize = Math.max(disk.size_gb - includedGB, 0) * pricing.storage
- const includedIOPS = DISK_LIMITS[diskType].includedIops
- const priceIOPS = Math.max(disk.iops - includedIOPS, 0) * pricing.iops
- const priceThroughput =
- diskType === DiskType.GP3 && 'throughput_mbps' in disk
- ? Math.max(disk.throughput_mbps - DISK_LIMITS[DiskType.GP3].includedThroughput, 0) *
- DISK_PRICING[DiskType.GP3].throughput
- : 0
- return {
- total: priceSize + priceIOPS + priceThroughput,
- size: priceSize,
- iops: priceIOPS,
- throughput: priceThroughput,
- }
- }
- export const estimateRestoreTime = (disk: DiskAttributesData['attributes']) => {
- return estimateRestoreTimeFromSizeGb(disk.size_gb)
- }
|