feat: allow job node selector
This commit is contained in:
parent
1d02a3177d
commit
eb6de2db73
@ -56,6 +56,7 @@ Environment variables:
|
||||
- `SOTERIA_S3_ENDPOINT` (optional) Example: `s3.us-west-004.backblazeb2.com`
|
||||
- `SOTERIA_S3_REGION` (optional) Example: `us-west-004`
|
||||
- `SOTERIA_JOB_TTL_SECONDS` (default: 86400)
|
||||
- `SOTERIA_JOB_NODE_SELECTOR` (optional) Comma-separated node selector, e.g. `kubernetes.io/arch=arm64,node-role.kubernetes.io/worker=true`
|
||||
- `SOTERIA_JOB_SERVICE_ACCOUNT` (optional) ServiceAccount for backup Jobs
|
||||
- `SOTERIA_LISTEN_ADDR` (default: `:8080`)
|
||||
|
||||
|
||||
@ -26,6 +26,7 @@ type Config struct {
|
||||
S3Endpoint string
|
||||
S3Region string
|
||||
JobTTLSeconds int32
|
||||
JobNodeSelector map[string]string
|
||||
WorkerServiceAccount string
|
||||
ListenAddr string
|
||||
}
|
||||
@ -56,6 +57,7 @@ func Load() (*Config, error) {
|
||||
cfg.S3Region = getenv("SOTERIA_S3_REGION")
|
||||
cfg.WorkerServiceAccount = getenv("SOTERIA_JOB_SERVICE_ACCOUNT")
|
||||
cfg.ListenAddr = getenvDefault("SOTERIA_LISTEN_ADDR", defaultListenAddr)
|
||||
cfg.JobNodeSelector = parseNodeSelector(getenv("SOTERIA_JOB_NODE_SELECTOR"))
|
||||
|
||||
if ttl, ok := getenvInt("SOTERIA_JOB_TTL_SECONDS"); ok {
|
||||
cfg.JobTTLSeconds = int32(ttl)
|
||||
@ -73,6 +75,9 @@ func Load() (*Config, error) {
|
||||
if strings.Contains(cfg.ResticRepository, "..") {
|
||||
return nil, errors.New("SOTERIA_RESTIC_REPOSITORY contains invalid path segments")
|
||||
}
|
||||
if cfg.JobNodeSelector == nil {
|
||||
return nil, errors.New("SOTERIA_JOB_NODE_SELECTOR is invalid; expected key=value pairs")
|
||||
}
|
||||
|
||||
return cfg, nil
|
||||
}
|
||||
@ -99,3 +104,31 @@ func getenvInt(key string) (int, bool) {
|
||||
}
|
||||
return parsed, true
|
||||
}
|
||||
|
||||
func parseNodeSelector(raw string) map[string]string {
|
||||
raw = strings.TrimSpace(raw)
|
||||
if raw == "" {
|
||||
return map[string]string{}
|
||||
}
|
||||
|
||||
selector := map[string]string{}
|
||||
parts := strings.Split(raw, ",")
|
||||
for _, part := range parts {
|
||||
part = strings.TrimSpace(part)
|
||||
if part == "" {
|
||||
continue
|
||||
}
|
||||
key, value, found := strings.Cut(part, "=")
|
||||
if !found {
|
||||
return nil
|
||||
}
|
||||
key = strings.TrimSpace(key)
|
||||
value = strings.TrimSpace(value)
|
||||
if key == "" || value == "" {
|
||||
return nil
|
||||
}
|
||||
selector[key] = value
|
||||
}
|
||||
|
||||
return selector
|
||||
}
|
||||
|
||||
@ -149,6 +149,9 @@ func buildBackupJob(cfg *config.Config, req api.BackupRequest, jobName, secretNa
|
||||
},
|
||||
}
|
||||
|
||||
if len(cfg.JobNodeSelector) > 0 {
|
||||
pod.NodeSelector = cfg.JobNodeSelector
|
||||
}
|
||||
if cfg.WorkerServiceAccount != "" {
|
||||
pod.ServiceAccountName = cfg.WorkerServiceAccount
|
||||
}
|
||||
@ -209,6 +212,9 @@ func buildRestoreJob(cfg *config.Config, req api.RestoreTestRequest, jobName, se
|
||||
},
|
||||
}
|
||||
|
||||
if len(cfg.JobNodeSelector) > 0 {
|
||||
pod.NodeSelector = cfg.JobNodeSelector
|
||||
}
|
||||
if req.TargetPVC != "" {
|
||||
pod.Volumes[0] = corev1.Volume{
|
||||
Name: "restore",
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user