- Add GetMetrics method to MetricsClient interface and implement cluster metrics API - Add QuotaPrecheck service for validating resource quotas before deployment - Add auth DTO with role/permission models and auth handler tests - Add instance diagnostics: mounted NFS volumes, labels, annotations in pod diagnostics - Update workspace handler with GetWorkspace endpoint and shared-user list - Fix monitoring handler to use correct service method name - Add tail_lines fallback in instance handler for snake_case query params - Update nginx config for SSE log streaming support (no buffering) - Add comprehensive test coverage: auth_service_test, auth_handler_test, auth_dto_test, metrics_client_test, quota_precheck_test - Update error messages for quota validation and instance operations - ModifyModal: fix YAML lineWidth:0, modified keys summary, delta-only submit - InstanceCard: correctly disable scale-minus when replicas <= 0 - SidebarLayout: add hover transition for sidebar items - Update todo.md and lessons.md with latest fixes
59 lines
1.5 KiB
Go
59 lines
1.5 KiB
Go
package service
|
|
|
|
import (
|
|
"strconv"
|
|
"strings"
|
|
|
|
"github.com/ocdp/cluster-service/internal/domain/entity"
|
|
)
|
|
|
|
func normalizeStandardQuotaQuantity(value string) string {
|
|
value = strings.TrimSpace(value)
|
|
switch strings.ToLower(value) {
|
|
case "unlimited", "none", "no-limit", "nolimit":
|
|
return ""
|
|
}
|
|
upper := strings.ToUpper(value)
|
|
switch {
|
|
case strings.HasSuffix(upper, "MB"):
|
|
return strings.TrimSpace(value[:len(value)-2]) + "M"
|
|
case strings.HasSuffix(upper, "GB"):
|
|
return strings.TrimSpace(value[:len(value)-2]) + "G"
|
|
default:
|
|
return value
|
|
}
|
|
}
|
|
|
|
func normalizeGPUMemoryQuota(value string) (string, error) {
|
|
value = strings.TrimSpace(value)
|
|
if value == "" {
|
|
return "", nil
|
|
}
|
|
upper := strings.ToUpper(value)
|
|
multiplier := int64(1)
|
|
number := value
|
|
switch {
|
|
case strings.HasSuffix(upper, "MB"):
|
|
number = strings.TrimSpace(value[:len(value)-2])
|
|
case strings.HasSuffix(upper, "M"):
|
|
number = strings.TrimSpace(value[:len(value)-1])
|
|
case strings.HasSuffix(upper, "GB"):
|
|
number = strings.TrimSpace(value[:len(value)-2])
|
|
multiplier = 1000
|
|
case strings.HasSuffix(upper, "G"):
|
|
number = strings.TrimSpace(value[:len(value)-1])
|
|
multiplier = 1000
|
|
case strings.HasSuffix(upper, "GIB"):
|
|
number = strings.TrimSpace(value[:len(value)-3])
|
|
multiplier = 1024
|
|
case strings.HasSuffix(upper, "GI"):
|
|
number = strings.TrimSpace(value[:len(value)-2])
|
|
multiplier = 1024
|
|
}
|
|
parsed, err := strconv.ParseInt(number, 10, 64)
|
|
if err != nil || parsed < 0 {
|
|
return "", entity.ErrInvalidTenantResourceQuota
|
|
}
|
|
return strconv.FormatInt(parsed*multiplier, 10), nil
|
|
}
|