Files
vm/autoscaler/sizing.go
zooqueenandHanzo Dev a121f8d0d0 refactor: rebrand from casvisor to hanzoai/visor, remove hardcoded credentials
- Rename Go module from github.com/casvisor/casvisor to github.com/hanzoai/visor
- Update all copyright headers from casbin to Hanzo Industries Inc
- Remove all hardcoded passwords and credentials from config files
- All credentials now sourced from environment variables / Hanzo KMS
- Switch default database from MySQL to PostgreSQL (matching production)
- Rename binary output from server/casvisor to visor
- Update Dockerfile, build.sh, docker-compose.yml, docker-entrypoint.sh
- Replace casdoor* config key references with iam* equivalents
- Update CI to use PostgreSQL service and mark CI-only test password
- Add visor and casvisor binaries to .gitignore
- Add envFrom secretRef for visor-env in K8s deployment
- Add ExternalSecret template for Hanzo KMS credential provisioning

Co-authored-by: Hanzo Dev <[email protected]>
2026-02-21 00:04:31 -08:00

97 lines
2.8 KiB
Go

// Copyright 2025 Hanzo Industries Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package autoscaler
// sizeSpec describes a DO droplet size.
type sizeSpec struct {
Slug string
CPUMillis int64 // millicores
MemMB int64 // megabytes
}
// availableSizes lists DO K8s-eligible sizes, ordered by cost (ascending).
var availableSizes = []sizeSpec{
{"s-1vcpu-2gb", 1000, 2048},
{"s-2vcpu-2gb", 2000, 2048},
{"s-2vcpu-4gb", 2000, 4096},
{"s-4vcpu-8gb", 4000, 8192},
{"s-8vcpu-16gb", 8000, 16384},
{"s-16vcpu-32gb", 16000, 32768},
{"s-32vcpu-64gb", 32000, 65536},
// General purpose
{"g-2vcpu-8gb", 2000, 8192},
{"g-4vcpu-16gb", 4000, 16384},
{"g-8vcpu-32gb", 8000, 32768},
// CPU-optimized
{"c-2vcpu-4gb", 2000, 4096},
{"c-4vcpu-8gb", 4000, 8192},
{"c-8vcpu-16gb", 8000, 16384},
// Memory-optimized
{"m-2vcpu-16gb", 2000, 16384},
{"m-4vcpu-32gb", 4000, 32768},
}
// SizeForResources returns the best-fit DO size slug for given CPU (millicores) and memory (MB) requests.
// It picks the smallest standard size that can accommodate the request.
// Falls back to "s-4vcpu-8gb" as a safe default if nothing matches.
func SizeForResources(cpuMillis int64, memMB int64) string {
// Filter to standard sizes first (cheapest), then try specialized
standardSizes := []sizeSpec{
{"s-1vcpu-2gb", 1000, 2048},
{"s-2vcpu-2gb", 2000, 2048},
{"s-2vcpu-4gb", 2000, 4096},
{"s-4vcpu-8gb", 4000, 8192},
{"s-8vcpu-16gb", 8000, 16384},
{"s-16vcpu-32gb", 16000, 32768},
{"s-32vcpu-64gb", 32000, 65536},
}
for _, s := range standardSizes {
if cpuMillis <= s.CPUMillis && memMB <= s.MemMB {
return s.Slug
}
}
// If standard sizes don't fit, try all available sizes
for _, s := range availableSizes {
if cpuMillis <= s.CPUMillis && memMB <= s.MemMB {
return s.Slug
}
}
// Default to a large standard size
return "s-4vcpu-8gb"
}
// SizeCPUMillis returns the CPU capacity in millicores for a given size slug.
func SizeCPUMillis(sizeSlug string) int64 {
for _, s := range availableSizes {
if s.Slug == sizeSlug {
return s.CPUMillis
}
}
return 0
}
// SizeMemMB returns the memory capacity in MB for a given size slug.
func SizeMemMB(sizeSlug string) int64 {
for _, s := range availableSizes {
if s.Slug == sizeSlug {
return s.MemMB
}
}
return 0
}