Files
Reloader/internal/pkg/workload/registry.go
T

75 lines
1.8 KiB
Go

package workload
import (
"fmt"
appsv1 "k8s.io/api/apps/v1"
batchv1 "k8s.io/api/batch/v1"
"sigs.k8s.io/controller-runtime/pkg/client"
)
// Registry provides factory methods for creating Workload instances.
type Registry struct {
argoRolloutsEnabled bool
}
// NewRegistry creates a new workload registry.
func NewRegistry(argoRolloutsEnabled bool) *Registry {
return &Registry{
argoRolloutsEnabled: argoRolloutsEnabled,
}
}
// SupportedKinds returns all supported workload kinds.
func (r *Registry) SupportedKinds() []Kind {
kinds := []Kind{
KindDeployment,
KindDaemonSet,
KindStatefulSet,
KindJob,
KindCronJob,
}
if r.argoRolloutsEnabled {
kinds = append(kinds, KindArgoRollout)
}
return kinds
}
// FromObject creates a WorkloadAccessor from a Kubernetes object.
func (r *Registry) FromObject(obj client.Object) (WorkloadAccessor, error) {
switch o := obj.(type) {
case *appsv1.Deployment:
return NewDeploymentWorkload(o), nil
case *appsv1.DaemonSet:
return NewDaemonSetWorkload(o), nil
case *appsv1.StatefulSet:
return NewStatefulSetWorkload(o), nil
case *batchv1.Job:
return NewJobWorkload(o), nil
case *batchv1.CronJob:
return NewCronJobWorkload(o), nil
default:
return nil, fmt.Errorf("unsupported object type: %T", obj)
}
}
// KindFromString converts a string to a Kind.
func KindFromString(s string) (Kind, error) {
switch s {
case "Deployment", "deployment", "deployments":
return KindDeployment, nil
case "DaemonSet", "daemonset", "daemonsets":
return KindDaemonSet, nil
case "StatefulSet", "statefulset", "statefulsets":
return KindStatefulSet, nil
case "Rollout", "rollout", "rollouts":
return KindArgoRollout, nil
case "Job", "job", "jobs":
return KindJob, nil
case "CronJob", "cronjob", "cronjobs":
return KindCronJob, nil
default:
return "", fmt.Errorf("unknown workload kind: %s", s)
}
}