Files
ubicloud/lib/billing_rate.rb
Junhao Li 2c136f424f Add billing check and free quota for inference
Provide free quota for AI inference. Projects without valid billing info
will have requests rejected after the free quota is exhausted.
2025-02-10 12:20:14 -05:00

77 lines
2.3 KiB
Ruby

# frozen_string_literal: true
require "yaml"
class BillingRate
# :nocov:
def self.freeze
rates
super
end
# :nocov:
def self.rates
@rates ||= YAML.load_file("config/billing_rates.yml", permitted_classes: [Time])
end
def self.from_resource_properties(resource_type, resource_family, location, active_at = Time.now)
rates.select {
_1["resource_type"] == resource_type && _1["resource_family"] == resource_family && _1["location"] == location && _1["active_from"] < active_at
}.max_by { _1["active_from"] }
end
def self.from_resource_type(resource_type)
rates.select {
_1["resource_type"] == resource_type
}
end
def self.from_id(billing_rate_id)
rates.find { _1["id"] == billing_rate_id }
end
def self.line_item_description(resource_type, resource_family, amount)
case resource_type
when "VmCores"
"#{resource_family}-#{(amount * 2).to_i} Virtual Machine"
when "VmVCpu"
"#{resource_family}-#{amount.to_i} Virtual Machine"
when "VmStorage"
"#{amount.to_i} GiB Storage for Virtual Machine"
when "IPAddress"
"#{resource_family} Address"
when "PostgresCores"
"#{resource_family}-#{(amount * 2).to_i} backed PostgreSQL Database"
when "PostgresVCpu"
"#{resource_family}-#{amount.to_i} backed PostgreSQL Database"
when "PostgresStandbyCores"
"#{resource_family}-#{(amount * 2).to_i} backed PostgreSQL Database (HA Standby)"
when "PostgresStandbyVCpu"
"#{resource_family}-#{amount.to_i} backed PostgreSQL Database (HA Standby)"
when "PostgresStorage"
"#{amount.to_i} GiB Storage for PostgreSQL Database"
when "PostgresStandbyStorage"
"#{amount.to_i} GiB Storage for PostgreSQL Database (HA Standby)"
when "GitHubRunnerMinutes"
"#{resource_family} GitHub Runner"
when "GitHubRunnerConcurrency"
"Additional GitHub Runner Concurrency"
when "InferenceTokens"
"#{resource_family} Inference Tokens"
else
fail "BUG: Unknown resource type for line item description"
end
end
def self.line_item_usage(resource_type, resource_family, amount, duration)
case resource_type
when "GitHubRunnerMinutes"
"#{amount.to_i} minutes"
when "InferenceTokens"
"#{amount.to_i} tokens"
else
"#{duration} minutes"
end
end
end