mirror of
https://github.com/stakater/Reloader.git
synced 2026-05-16 21:56:55 +00:00
177 lines
6.4 KiB
Go
177 lines
6.4 KiB
Go
package utils
|
|
|
|
import (
|
|
"strings"
|
|
|
|
appsv1 "k8s.io/api/apps/v1"
|
|
batchv1 "k8s.io/api/batch/v1"
|
|
corev1 "k8s.io/api/core/v1"
|
|
"k8s.io/apimachinery/pkg/types"
|
|
csiv1 "sigs.k8s.io/secrets-store-csi-driver/apis/v1"
|
|
|
|
rolloutsv1alpha1 "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1"
|
|
openshiftappsv1 "github.com/openshift/api/apps/v1"
|
|
)
|
|
|
|
// Deployment accessors
|
|
var (
|
|
DeploymentPodTemplate PodTemplateAccessor[*appsv1.Deployment] = func(d *appsv1.Deployment) *corev1.PodTemplateSpec {
|
|
return &d.Spec.Template
|
|
}
|
|
DeploymentAnnotations AnnotationAccessor[*appsv1.Deployment] = func(d *appsv1.Deployment) map[string]string {
|
|
return d.Annotations
|
|
}
|
|
DeploymentContainers ContainerAccessor[*appsv1.Deployment] = func(d *appsv1.Deployment) []corev1.Container {
|
|
return d.Spec.Template.Spec.Containers
|
|
}
|
|
DeploymentIsReady StatusAccessor[*appsv1.Deployment] = func(d *appsv1.Deployment) bool {
|
|
if d.Spec.Replicas == nil {
|
|
return false
|
|
}
|
|
return d.Status.ObservedGeneration >= d.Generation &&
|
|
d.Status.ReadyReplicas == *d.Spec.Replicas &&
|
|
d.Status.UpdatedReplicas == *d.Spec.Replicas &&
|
|
d.Status.AvailableReplicas == *d.Spec.Replicas
|
|
}
|
|
)
|
|
|
|
// DaemonSet accessors
|
|
var (
|
|
DaemonSetPodTemplate PodTemplateAccessor[*appsv1.DaemonSet] = func(d *appsv1.DaemonSet) *corev1.PodTemplateSpec {
|
|
return &d.Spec.Template
|
|
}
|
|
DaemonSetAnnotations AnnotationAccessor[*appsv1.DaemonSet] = func(d *appsv1.DaemonSet) map[string]string {
|
|
return d.Annotations
|
|
}
|
|
DaemonSetContainers ContainerAccessor[*appsv1.DaemonSet] = func(d *appsv1.DaemonSet) []corev1.Container {
|
|
return d.Spec.Template.Spec.Containers
|
|
}
|
|
DaemonSetIsReady StatusAccessor[*appsv1.DaemonSet] = func(d *appsv1.DaemonSet) bool {
|
|
return d.Status.ObservedGeneration >= d.Generation &&
|
|
d.Status.DesiredNumberScheduled > 0 &&
|
|
d.Status.NumberReady == d.Status.DesiredNumberScheduled &&
|
|
d.Status.UpdatedNumberScheduled == d.Status.DesiredNumberScheduled
|
|
}
|
|
)
|
|
|
|
// StatefulSet accessors
|
|
var (
|
|
StatefulSetPodTemplate PodTemplateAccessor[*appsv1.StatefulSet] = func(s *appsv1.StatefulSet) *corev1.PodTemplateSpec {
|
|
return &s.Spec.Template
|
|
}
|
|
StatefulSetAnnotations AnnotationAccessor[*appsv1.StatefulSet] = func(s *appsv1.StatefulSet) map[string]string {
|
|
return s.Annotations
|
|
}
|
|
StatefulSetContainers ContainerAccessor[*appsv1.StatefulSet] = func(s *appsv1.StatefulSet) []corev1.Container {
|
|
return s.Spec.Template.Spec.Containers
|
|
}
|
|
StatefulSetIsReady StatusAccessor[*appsv1.StatefulSet] = func(s *appsv1.StatefulSet) bool {
|
|
if s.Spec.Replicas == nil {
|
|
return false
|
|
}
|
|
return s.Status.ObservedGeneration >= s.Generation &&
|
|
s.Status.ReadyReplicas == *s.Spec.Replicas &&
|
|
s.Status.UpdatedReplicas == *s.Spec.Replicas
|
|
}
|
|
)
|
|
|
|
// Job accessors
|
|
var (
|
|
JobPodTemplate PodTemplateAccessor[*batchv1.Job] = func(j *batchv1.Job) *corev1.PodTemplateSpec {
|
|
return &j.Spec.Template
|
|
}
|
|
JobAnnotations AnnotationAccessor[*batchv1.Job] = func(j *batchv1.Job) map[string]string {
|
|
return j.Annotations
|
|
}
|
|
JobContainers ContainerAccessor[*batchv1.Job] = func(j *batchv1.Job) []corev1.Container {
|
|
return j.Spec.Template.Spec.Containers
|
|
}
|
|
JobIsReady StatusAccessor[*batchv1.Job] = func(j *batchv1.Job) bool {
|
|
return j.Status.Active > 0 || j.Status.Succeeded > 0
|
|
}
|
|
JobUID UIDAccessor[*batchv1.Job] = func(j *batchv1.Job) types.UID {
|
|
return j.UID
|
|
}
|
|
)
|
|
|
|
// CronJob accessors
|
|
var (
|
|
CronJobPodTemplate PodTemplateAccessor[*batchv1.CronJob] = func(c *batchv1.CronJob) *corev1.PodTemplateSpec {
|
|
return &c.Spec.JobTemplate.Spec.Template
|
|
}
|
|
CronJobAnnotations AnnotationAccessor[*batchv1.CronJob] = func(c *batchv1.CronJob) map[string]string {
|
|
return c.Annotations
|
|
}
|
|
CronJobContainers ContainerAccessor[*batchv1.CronJob] = func(c *batchv1.CronJob) []corev1.Container {
|
|
return c.Spec.JobTemplate.Spec.Template.Spec.Containers
|
|
}
|
|
CronJobExists StatusAccessor[*batchv1.CronJob] = func(c *batchv1.CronJob) bool {
|
|
return true
|
|
}
|
|
)
|
|
|
|
// Argo Rollout accessors
|
|
var (
|
|
RolloutPodTemplate PodTemplateAccessor[*rolloutsv1alpha1.Rollout] = func(r *rolloutsv1alpha1.Rollout) *corev1.PodTemplateSpec {
|
|
return &r.Spec.Template
|
|
}
|
|
RolloutAnnotations AnnotationAccessor[*rolloutsv1alpha1.Rollout] = func(r *rolloutsv1alpha1.Rollout) map[string]string {
|
|
return r.Annotations
|
|
}
|
|
RolloutContainers ContainerAccessor[*rolloutsv1alpha1.Rollout] = func(r *rolloutsv1alpha1.Rollout) []corev1.Container {
|
|
return r.Spec.Template.Spec.Containers
|
|
}
|
|
RolloutIsReady StatusAccessor[*rolloutsv1alpha1.Rollout] = func(r *rolloutsv1alpha1.Rollout) bool {
|
|
if r.Spec.Replicas == nil {
|
|
return false
|
|
}
|
|
return r.Status.ReadyReplicas == *r.Spec.Replicas
|
|
}
|
|
RolloutHasRestartAt StatusAccessor[*rolloutsv1alpha1.Rollout] = func(r *rolloutsv1alpha1.Rollout) bool {
|
|
return r.Spec.RestartAt != nil
|
|
}
|
|
)
|
|
|
|
// OpenShift DeploymentConfig accessors
|
|
var (
|
|
DeploymentConfigPodTemplate PodTemplateAccessor[*openshiftappsv1.DeploymentConfig] = func(d *openshiftappsv1.DeploymentConfig) *corev1.PodTemplateSpec {
|
|
return d.Spec.Template
|
|
}
|
|
DeploymentConfigAnnotations AnnotationAccessor[*openshiftappsv1.DeploymentConfig] = func(d *openshiftappsv1.DeploymentConfig) map[string]string {
|
|
return d.Annotations
|
|
}
|
|
DeploymentConfigContainers ContainerAccessor[*openshiftappsv1.DeploymentConfig] = func(d *openshiftappsv1.DeploymentConfig) []corev1.Container {
|
|
if d.Spec.Template == nil {
|
|
return nil
|
|
}
|
|
return d.Spec.Template.Spec.Containers
|
|
}
|
|
DeploymentConfigIsReady StatusAccessor[*openshiftappsv1.DeploymentConfig] = func(d *openshiftappsv1.DeploymentConfig) bool {
|
|
return d.Status.ReadyReplicas == d.Spec.Replicas
|
|
}
|
|
)
|
|
|
|
// SecretProviderClassPodStatus accessors
|
|
var (
|
|
SPCPSIsMounted StatusAccessor[*csiv1.SecretProviderClassPodStatus] = func(s *csiv1.SecretProviderClassPodStatus) bool {
|
|
return s.Status.Mounted
|
|
}
|
|
SPCPSClassName ValueAccessor[*csiv1.SecretProviderClassPodStatus, string] = func(s *csiv1.SecretProviderClassPodStatus) string {
|
|
return s.Status.SecretProviderClassName
|
|
}
|
|
SPCPSPodName ValueAccessor[*csiv1.SecretProviderClassPodStatus, string] = func(s *csiv1.SecretProviderClassPodStatus) string {
|
|
return s.Status.PodName
|
|
}
|
|
// SPCPSVersions returns concatenated versions of all objects for change detection.
|
|
SPCPSVersions ValueAccessor[*csiv1.SecretProviderClassPodStatus, string] = func(s *csiv1.SecretProviderClassPodStatus) string {
|
|
if len(s.Status.Objects) == 0 {
|
|
return ""
|
|
}
|
|
var versions []string
|
|
for _, obj := range s.Status.Objects {
|
|
versions = append(versions, obj.Version)
|
|
}
|
|
return strings.Join(versions, ",")
|
|
}
|
|
)
|