59 lines
1.4 KiB
Go
59 lines
1.4 KiB
Go
package nsc
|
|
|
|
import (
|
|
"regexp"
|
|
"strings"
|
|
)
|
|
|
|
const windowsDefaultMachineType = "windows/amd64:8x16"
|
|
|
|
var cpuMemShapePattern = regexp.MustCompile(`^\d+x\d+$`)
|
|
|
|
func hasWindowsLabel(labels []string) bool {
|
|
for _, label := range labels {
|
|
l := strings.TrimSpace(label)
|
|
if l == "" {
|
|
continue
|
|
}
|
|
base := l
|
|
if before, _, ok := strings.Cut(l, ":"); ok {
|
|
base = before
|
|
}
|
|
if strings.HasPrefix(base, "namespace-profile-windows-") {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
func normalizeWindowsMachineType(machineType string, labels []string) string {
|
|
mt := strings.TrimSpace(machineType)
|
|
if strings.HasPrefix(mt, "windows/") {
|
|
return mt
|
|
}
|
|
if cpuMemShapePattern.MatchString(mt) {
|
|
return "windows/amd64:" + mt
|
|
}
|
|
|
|
// Label-derived defaults: keep a simple shape ladder for explicit profile sizes.
|
|
for _, label := range labels {
|
|
base := strings.TrimSpace(label)
|
|
if before, _, ok := strings.Cut(base, ":"); ok {
|
|
base = before
|
|
}
|
|
switch {
|
|
case strings.HasPrefix(base, "namespace-profile-windows-small"):
|
|
return "windows/amd64:2x4"
|
|
case strings.HasPrefix(base, "namespace-profile-windows-medium"):
|
|
return "windows/amd64:4x8"
|
|
case strings.HasPrefix(base, "namespace-profile-windows-large"):
|
|
return windowsDefaultMachineType
|
|
}
|
|
}
|
|
return windowsDefaultMachineType
|
|
}
|
|
|
|
func powershellSingleQuote(value string) string {
|
|
// PowerShell single-quoted string escaping: ' -> ''
|
|
return "'" + strings.ReplaceAll(value, "'", "''") + "'"
|
|
}
|