2018-04-17 07:51:12 +00:00
|
|
|
package k8s
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
2018-04-20 17:58:01 +00:00
|
|
|
"reflect"
|
|
|
|
"strings"
|
2018-04-17 07:51:12 +00:00
|
|
|
|
|
|
|
apps_v1 "k8s.io/api/apps/v1"
|
2023-03-01 16:51:58 +00:00
|
|
|
batch_v1 "k8s.io/api/batch/v1"
|
2018-04-17 07:51:12 +00:00
|
|
|
core_v1 "k8s.io/api/core/v1"
|
|
|
|
)
|
|
|
|
|
|
|
|
// GenericResource - generic resource,
|
|
|
|
// used to work with multiple kinds of k8s resources
|
|
|
|
type GenericResource struct {
|
|
|
|
// original resource
|
|
|
|
obj interface{}
|
|
|
|
|
|
|
|
Identifier string
|
|
|
|
Namespace string
|
|
|
|
Name string
|
|
|
|
}
|
|
|
|
|
|
|
|
type genericResource []*GenericResource
|
|
|
|
|
2024-11-05 18:20:03 +00:00
|
|
|
type ContainerFilter func(container core_v1.Container) bool
|
|
|
|
|
2018-04-17 07:51:12 +00:00
|
|
|
func (c genericResource) Len() int {
|
|
|
|
return len(c)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c genericResource) Swap(i, j int) {
|
|
|
|
c[i], c[j] = c[j], c[i]
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c genericResource) Less(i, j int) bool {
|
2018-04-20 17:58:01 +00:00
|
|
|
return c[i].Identifier < c[j].Identifier
|
2018-04-17 07:51:12 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// NewGenericResource - create new generic k8s resource
|
|
|
|
func NewGenericResource(obj interface{}) (*GenericResource, error) {
|
|
|
|
|
|
|
|
switch obj.(type) {
|
|
|
|
case *apps_v1.Deployment, *apps_v1.StatefulSet, *apps_v1.DaemonSet:
|
|
|
|
// ok
|
2023-03-01 16:51:58 +00:00
|
|
|
case *batch_v1.CronJob:
|
2018-08-29 14:48:08 +00:00
|
|
|
// ok
|
2018-04-17 07:51:12 +00:00
|
|
|
default:
|
2018-04-20 17:58:01 +00:00
|
|
|
return nil, fmt.Errorf("unsupported resource type: %v", reflect.TypeOf(obj).Kind())
|
2018-04-17 07:51:12 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
gr := &GenericResource{
|
|
|
|
obj: obj,
|
|
|
|
}
|
|
|
|
|
|
|
|
gr.Identifier = gr.GetIdentifier()
|
|
|
|
gr.Namespace = gr.GetNamespace()
|
|
|
|
gr.Name = gr.GetName()
|
|
|
|
|
|
|
|
return gr, nil
|
|
|
|
}
|
|
|
|
|
2018-04-20 17:58:01 +00:00
|
|
|
func (r *GenericResource) String() string {
|
2024-11-05 18:20:03 +00:00
|
|
|
return fmt.Sprintf("%s/%s/%s images: %s", r.Kind(), r.Namespace, r.Name, strings.Join(r.GetImages(nil), ", "))
|
2018-04-20 17:58:01 +00:00
|
|
|
}
|
|
|
|
|
2018-04-30 10:26:49 +00:00
|
|
|
// DeepCopy uses an autogenerated deepcopy functions, copying the receiver, creating a new GenericResource
|
|
|
|
func (r *GenericResource) DeepCopy() *GenericResource {
|
|
|
|
gr := new(GenericResource)
|
|
|
|
if r.obj == nil {
|
|
|
|
return gr
|
|
|
|
}
|
|
|
|
gr.Identifier = r.Identifier
|
|
|
|
gr.Namespace = r.Namespace
|
|
|
|
gr.Name = r.Name
|
|
|
|
|
|
|
|
switch obj := r.obj.(type) {
|
|
|
|
case *apps_v1.Deployment:
|
|
|
|
gr.obj = obj.DeepCopy()
|
|
|
|
case *apps_v1.StatefulSet:
|
|
|
|
gr.obj = obj.DeepCopy()
|
|
|
|
case *apps_v1.DaemonSet:
|
|
|
|
gr.obj = obj.DeepCopy()
|
2023-03-01 16:51:58 +00:00
|
|
|
case *batch_v1.CronJob:
|
2018-08-29 14:48:08 +00:00
|
|
|
gr.obj = obj.DeepCopy()
|
2018-04-30 10:26:49 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return gr
|
|
|
|
}
|
|
|
|
|
2018-04-17 07:51:12 +00:00
|
|
|
// GetIdentifier returns resource identifier
|
|
|
|
func (r *GenericResource) GetIdentifier() string {
|
|
|
|
switch obj := r.obj.(type) {
|
|
|
|
case *apps_v1.Deployment:
|
|
|
|
return getDeploymentIdentifier(obj)
|
|
|
|
case *apps_v1.StatefulSet:
|
|
|
|
return getStatefulSetIdentifier(obj)
|
|
|
|
case *apps_v1.DaemonSet:
|
|
|
|
return getDaemonsetSetIdentifier(obj)
|
2023-03-01 16:51:58 +00:00
|
|
|
case *batch_v1.CronJob:
|
2018-08-29 14:48:08 +00:00
|
|
|
return getCronJobIdentifier(obj)
|
2018-04-17 07:51:12 +00:00
|
|
|
}
|
|
|
|
return ""
|
|
|
|
}
|
|
|
|
|
|
|
|
// GetName returns resource name
|
|
|
|
func (r *GenericResource) GetName() string {
|
|
|
|
switch obj := r.obj.(type) {
|
|
|
|
case *apps_v1.Deployment:
|
|
|
|
return obj.GetName()
|
|
|
|
case *apps_v1.StatefulSet:
|
|
|
|
return obj.GetName()
|
|
|
|
case *apps_v1.DaemonSet:
|
|
|
|
return obj.GetName()
|
2023-03-01 16:51:58 +00:00
|
|
|
case *batch_v1.CronJob:
|
2018-08-29 14:48:08 +00:00
|
|
|
return obj.GetName()
|
2018-04-17 07:51:12 +00:00
|
|
|
}
|
|
|
|
return ""
|
|
|
|
}
|
|
|
|
|
|
|
|
// GetNamespace returns resource namespace
|
|
|
|
func (r *GenericResource) GetNamespace() string {
|
|
|
|
switch obj := r.obj.(type) {
|
|
|
|
case *apps_v1.Deployment:
|
|
|
|
return obj.GetNamespace()
|
|
|
|
case *apps_v1.StatefulSet:
|
|
|
|
return obj.GetNamespace()
|
|
|
|
case *apps_v1.DaemonSet:
|
|
|
|
return obj.GetNamespace()
|
2023-03-01 16:51:58 +00:00
|
|
|
case *batch_v1.CronJob:
|
2018-08-29 14:48:08 +00:00
|
|
|
return obj.GetNamespace()
|
2018-04-17 07:51:12 +00:00
|
|
|
}
|
|
|
|
return ""
|
|
|
|
}
|
|
|
|
|
|
|
|
// Kind returns a type of resource that this structure represents
|
|
|
|
func (r *GenericResource) Kind() string {
|
|
|
|
switch r.obj.(type) {
|
|
|
|
case *apps_v1.Deployment:
|
|
|
|
return "deployment"
|
|
|
|
case *apps_v1.StatefulSet:
|
|
|
|
return "statefulset"
|
|
|
|
case *apps_v1.DaemonSet:
|
|
|
|
return "daemonset"
|
2023-03-01 16:51:58 +00:00
|
|
|
case *batch_v1.CronJob:
|
2018-08-29 14:48:08 +00:00
|
|
|
return "cronjob"
|
2018-04-17 07:51:12 +00:00
|
|
|
}
|
|
|
|
return ""
|
|
|
|
}
|
|
|
|
|
|
|
|
// GetResource - get resource
|
|
|
|
func (r *GenericResource) GetResource() interface{} {
|
|
|
|
return r.obj
|
|
|
|
}
|
|
|
|
|
|
|
|
// GetLabels - get resource labels
|
|
|
|
func (r *GenericResource) GetLabels() (labels map[string]string) {
|
|
|
|
switch obj := r.obj.(type) {
|
|
|
|
case *apps_v1.Deployment:
|
2018-04-24 08:26:45 +00:00
|
|
|
return getOrInitialise(obj.GetLabels())
|
2018-04-17 07:51:12 +00:00
|
|
|
case *apps_v1.StatefulSet:
|
2018-04-24 08:26:45 +00:00
|
|
|
return getOrInitialise(obj.GetLabels())
|
2018-04-17 07:51:12 +00:00
|
|
|
case *apps_v1.DaemonSet:
|
2018-04-24 08:26:45 +00:00
|
|
|
return getOrInitialise(obj.GetLabels())
|
2023-03-01 16:51:58 +00:00
|
|
|
case *batch_v1.CronJob:
|
2018-08-29 14:48:08 +00:00
|
|
|
return getOrInitialise(obj.GetLabels())
|
2018-04-17 07:51:12 +00:00
|
|
|
}
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// SetLabels - set resource labels
|
|
|
|
func (r *GenericResource) SetLabels(labels map[string]string) {
|
|
|
|
switch obj := r.obj.(type) {
|
|
|
|
case *apps_v1.Deployment:
|
|
|
|
obj.SetLabels(labels)
|
|
|
|
case *apps_v1.StatefulSet:
|
|
|
|
obj.SetLabels(labels)
|
|
|
|
case *apps_v1.DaemonSet:
|
|
|
|
obj.SetLabels(labels)
|
2023-03-01 16:51:58 +00:00
|
|
|
case *batch_v1.CronJob:
|
2018-08-29 14:48:08 +00:00
|
|
|
obj.SetLabels(labels)
|
2018-04-17 07:51:12 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-04-20 17:58:01 +00:00
|
|
|
// GetSpecAnnotations - get resource spec template annotations
|
|
|
|
func (r *GenericResource) GetSpecAnnotations() (annotations map[string]string) {
|
|
|
|
switch obj := r.obj.(type) {
|
|
|
|
case *apps_v1.Deployment:
|
2018-04-30 10:26:49 +00:00
|
|
|
return getOrInitialise(obj.Spec.Template.GetAnnotations())
|
2018-04-20 17:58:01 +00:00
|
|
|
case *apps_v1.StatefulSet:
|
2018-04-30 10:26:49 +00:00
|
|
|
return getOrInitialise(obj.Spec.Template.GetAnnotations())
|
2018-04-20 17:58:01 +00:00
|
|
|
case *apps_v1.DaemonSet:
|
2018-04-30 10:26:49 +00:00
|
|
|
return getOrInitialise(obj.Spec.Template.GetAnnotations())
|
2023-03-01 16:51:58 +00:00
|
|
|
case *batch_v1.CronJob:
|
2018-08-29 14:48:08 +00:00
|
|
|
return getOrInitialise(obj.Spec.JobTemplate.GetAnnotations())
|
2018-04-20 17:58:01 +00:00
|
|
|
}
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// SetSpecAnnotations - set resource spec template annotations
|
|
|
|
func (r *GenericResource) SetSpecAnnotations(annotations map[string]string) {
|
|
|
|
switch obj := r.obj.(type) {
|
|
|
|
case *apps_v1.Deployment:
|
|
|
|
obj.Spec.Template.SetAnnotations(annotations)
|
|
|
|
case *apps_v1.StatefulSet:
|
|
|
|
obj.Spec.Template.SetAnnotations(annotations)
|
|
|
|
case *apps_v1.DaemonSet:
|
|
|
|
obj.Spec.Template.SetAnnotations(annotations)
|
2023-03-01 16:51:58 +00:00
|
|
|
case *batch_v1.CronJob:
|
2018-08-29 14:48:08 +00:00
|
|
|
obj.Spec.JobTemplate.SetAnnotations(annotations)
|
2018-04-20 17:58:01 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-04-24 08:26:45 +00:00
|
|
|
func getOrInitialise(a map[string]string) map[string]string {
|
|
|
|
if a == nil {
|
|
|
|
return make(map[string]string)
|
|
|
|
}
|
|
|
|
return a
|
|
|
|
}
|
|
|
|
|
2018-04-17 07:51:12 +00:00
|
|
|
// GetAnnotations - get resource annotations
|
|
|
|
func (r *GenericResource) GetAnnotations() (annotations map[string]string) {
|
|
|
|
switch obj := r.obj.(type) {
|
|
|
|
case *apps_v1.Deployment:
|
2018-04-24 08:26:45 +00:00
|
|
|
return getOrInitialise(obj.GetAnnotations())
|
2018-04-17 07:51:12 +00:00
|
|
|
case *apps_v1.StatefulSet:
|
2018-04-24 08:26:45 +00:00
|
|
|
return getOrInitialise(obj.GetAnnotations())
|
2018-04-17 07:51:12 +00:00
|
|
|
case *apps_v1.DaemonSet:
|
2018-04-24 08:26:45 +00:00
|
|
|
return getOrInitialise(obj.GetAnnotations())
|
2023-03-01 16:51:58 +00:00
|
|
|
case *batch_v1.CronJob:
|
2018-08-29 14:48:08 +00:00
|
|
|
return getOrInitialise(obj.GetAnnotations())
|
2018-04-17 07:51:12 +00:00
|
|
|
}
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// SetAnnotations - set resource annotations
|
|
|
|
func (r *GenericResource) SetAnnotations(annotations map[string]string) {
|
|
|
|
switch obj := r.obj.(type) {
|
|
|
|
case *apps_v1.Deployment:
|
|
|
|
obj.SetAnnotations(annotations)
|
|
|
|
case *apps_v1.StatefulSet:
|
|
|
|
obj.SetAnnotations(annotations)
|
|
|
|
case *apps_v1.DaemonSet:
|
|
|
|
obj.SetAnnotations(annotations)
|
2023-03-01 16:51:58 +00:00
|
|
|
case *batch_v1.CronJob:
|
2018-08-29 14:48:08 +00:00
|
|
|
obj.SetAnnotations(annotations)
|
2018-04-17 07:51:12 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// GetImagePullSecrets - returns secrets from pod spec
|
|
|
|
func (r *GenericResource) GetImagePullSecrets() (secrets []string) {
|
|
|
|
switch obj := r.obj.(type) {
|
|
|
|
case *apps_v1.Deployment:
|
|
|
|
return getImagePullSecrets(obj.Spec.Template.Spec.ImagePullSecrets)
|
|
|
|
case *apps_v1.StatefulSet:
|
|
|
|
return getImagePullSecrets(obj.Spec.Template.Spec.ImagePullSecrets)
|
|
|
|
case *apps_v1.DaemonSet:
|
|
|
|
return getImagePullSecrets(obj.Spec.Template.Spec.ImagePullSecrets)
|
2023-03-01 16:51:58 +00:00
|
|
|
case *batch_v1.CronJob:
|
2018-08-29 14:48:08 +00:00
|
|
|
return getImagePullSecrets(obj.Spec.JobTemplate.Spec.Template.Spec.ImagePullSecrets)
|
2018-04-17 07:51:12 +00:00
|
|
|
}
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// GetImages - returns images used by this resource
|
2024-11-05 18:20:03 +00:00
|
|
|
func (r *GenericResource) GetImages(filter ContainerFilter) (images []string) {
|
2018-04-17 07:51:12 +00:00
|
|
|
switch obj := r.obj.(type) {
|
|
|
|
case *apps_v1.Deployment:
|
2024-11-05 18:20:03 +00:00
|
|
|
return getContainerImages(obj.Spec.Template.Spec.Containers, filter)
|
2018-04-17 07:51:12 +00:00
|
|
|
case *apps_v1.StatefulSet:
|
2024-11-05 18:20:03 +00:00
|
|
|
return getContainerImages(obj.Spec.Template.Spec.Containers, filter)
|
2018-04-17 07:51:12 +00:00
|
|
|
case *apps_v1.DaemonSet:
|
2024-11-05 18:20:03 +00:00
|
|
|
return getContainerImages(obj.Spec.Template.Spec.Containers, filter)
|
2023-03-01 16:51:58 +00:00
|
|
|
case *batch_v1.CronJob:
|
2024-11-05 18:20:03 +00:00
|
|
|
return getContainerImages(obj.Spec.JobTemplate.Spec.Template.Spec.Containers, filter)
|
2018-04-17 07:51:12 +00:00
|
|
|
}
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2023-08-01 12:13:33 +00:00
|
|
|
// GetInitImages - returns init images used by this resource
|
2024-11-05 18:20:03 +00:00
|
|
|
func (r *GenericResource) GetInitImages(filter ContainerFilter) (images []string) {
|
2023-08-01 12:13:33 +00:00
|
|
|
switch obj := r.obj.(type) {
|
|
|
|
case *apps_v1.Deployment:
|
2024-11-05 18:20:03 +00:00
|
|
|
return getContainerImages(obj.Spec.Template.Spec.InitContainers, filter)
|
2023-08-01 12:13:33 +00:00
|
|
|
case *apps_v1.StatefulSet:
|
2024-11-05 18:20:03 +00:00
|
|
|
return getContainerImages(obj.Spec.Template.Spec.InitContainers, filter)
|
2023-08-01 12:13:33 +00:00
|
|
|
case *apps_v1.DaemonSet:
|
2024-11-05 18:20:03 +00:00
|
|
|
return getContainerImages(obj.Spec.Template.Spec.InitContainers, filter)
|
2023-08-01 12:13:33 +00:00
|
|
|
case *batch_v1.CronJob:
|
2024-11-05 18:20:03 +00:00
|
|
|
return getContainerImages(obj.Spec.JobTemplate.Spec.Template.Spec.InitContainers, filter)
|
2023-08-01 12:13:33 +00:00
|
|
|
}
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2018-04-17 07:51:12 +00:00
|
|
|
// Containers - returns containers managed by this resource
|
|
|
|
func (r *GenericResource) Containers() (containers []core_v1.Container) {
|
|
|
|
switch obj := r.obj.(type) {
|
|
|
|
case *apps_v1.Deployment:
|
|
|
|
return obj.Spec.Template.Spec.Containers
|
|
|
|
case *apps_v1.StatefulSet:
|
|
|
|
return obj.Spec.Template.Spec.Containers
|
|
|
|
case *apps_v1.DaemonSet:
|
|
|
|
return obj.Spec.Template.Spec.Containers
|
2023-03-01 16:51:58 +00:00
|
|
|
case *batch_v1.CronJob:
|
2018-08-29 14:48:08 +00:00
|
|
|
return obj.Spec.JobTemplate.Spec.Template.Spec.Containers
|
2018-04-17 07:51:12 +00:00
|
|
|
}
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2023-08-01 12:13:33 +00:00
|
|
|
// InitContainers - returns init containers managed by this resource
|
|
|
|
func (r *GenericResource) InitContainers() (containers []core_v1.Container) {
|
|
|
|
switch obj := r.obj.(type) {
|
|
|
|
case *apps_v1.Deployment:
|
|
|
|
return obj.Spec.Template.Spec.InitContainers
|
|
|
|
case *apps_v1.StatefulSet:
|
|
|
|
return obj.Spec.Template.Spec.InitContainers
|
|
|
|
case *apps_v1.DaemonSet:
|
|
|
|
return obj.Spec.Template.Spec.InitContainers
|
|
|
|
case *batch_v1.CronJob:
|
|
|
|
return obj.Spec.JobTemplate.Spec.Template.Spec.InitContainers
|
|
|
|
}
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2018-04-17 07:51:12 +00:00
|
|
|
// UpdateContainer - updates container image
|
|
|
|
func (r *GenericResource) UpdateContainer(index int, image string) {
|
|
|
|
switch obj := r.obj.(type) {
|
|
|
|
case *apps_v1.Deployment:
|
|
|
|
updateDeploymentContainer(obj, index, image)
|
|
|
|
case *apps_v1.StatefulSet:
|
|
|
|
updateStatefulSetContainer(obj, index, image)
|
|
|
|
case *apps_v1.DaemonSet:
|
|
|
|
updateDaemonsetSetContainer(obj, index, image)
|
2023-03-01 16:51:58 +00:00
|
|
|
case *batch_v1.CronJob:
|
2018-08-29 14:48:08 +00:00
|
|
|
updateCronJobContainer(obj, index, image)
|
2018-04-17 07:51:12 +00:00
|
|
|
}
|
|
|
|
}
|
2019-05-23 22:17:33 +00:00
|
|
|
|
2023-08-01 12:13:33 +00:00
|
|
|
// UpdateInitContainer - updates init container image
|
|
|
|
func (r *GenericResource) UpdateInitContainer(index int, image string) {
|
|
|
|
switch obj := r.obj.(type) {
|
|
|
|
case *apps_v1.Deployment:
|
|
|
|
updateDeploymentInitContainer(obj, index, image)
|
|
|
|
case *apps_v1.StatefulSet:
|
|
|
|
updateStatefulSetInitContainer(obj, index, image)
|
|
|
|
case *apps_v1.DaemonSet:
|
|
|
|
updateDaemonsetSetInitContainer(obj, index, image)
|
|
|
|
case *batch_v1.CronJob:
|
|
|
|
updateCronJobInitContainer(obj, index, image)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-05-23 22:17:33 +00:00
|
|
|
type Status struct {
|
|
|
|
// Total number of non-terminated pods targeted by this deployment (their labels match the selector).
|
|
|
|
// +optional
|
|
|
|
Replicas int32 `json:"replicas"`
|
|
|
|
|
|
|
|
// Total number of non-terminated pods targeted by this deployment that have the desired template spec.
|
|
|
|
// +optional
|
|
|
|
UpdatedReplicas int32 `json:"updatedReplicas"`
|
|
|
|
|
|
|
|
// Total number of ready pods targeted by this deployment.
|
|
|
|
// +optional
|
|
|
|
ReadyReplicas int32 `json:"readyReplicas"`
|
|
|
|
|
|
|
|
// Total number of available pods (ready for at least minReadySeconds) targeted by this deployment.
|
|
|
|
// +optional
|
|
|
|
AvailableReplicas int32 `json:"availableReplicas"`
|
|
|
|
|
|
|
|
// Total number of unavailable pods targeted by this deployment. This is the total number of
|
|
|
|
// pods that are still required for the deployment to have 100% available capacity. They may
|
|
|
|
// either be pods that are running but not yet available or pods that still have not been created.
|
|
|
|
// +optional
|
|
|
|
UnavailableReplicas int32 `json:"unavailableReplica"`
|
|
|
|
}
|
|
|
|
|
|
|
|
func (r *GenericResource) GetStatus() Status {
|
|
|
|
switch obj := r.obj.(type) {
|
|
|
|
case *apps_v1.Deployment:
|
|
|
|
return Status{
|
|
|
|
Replicas: obj.Status.Replicas,
|
|
|
|
UpdatedReplicas: obj.Status.UpdatedReplicas,
|
|
|
|
ReadyReplicas: obj.Status.ReadyReplicas,
|
|
|
|
AvailableReplicas: obj.Status.AvailableReplicas,
|
|
|
|
UnavailableReplicas: obj.Status.UnavailableReplicas,
|
|
|
|
}
|
|
|
|
case *apps_v1.StatefulSet:
|
|
|
|
return Status{
|
|
|
|
Replicas: obj.Status.Replicas,
|
|
|
|
UpdatedReplicas: obj.Status.UpdatedReplicas,
|
|
|
|
ReadyReplicas: obj.Status.ReadyReplicas,
|
|
|
|
AvailableReplicas: obj.Status.CurrentReplicas,
|
|
|
|
UnavailableReplicas: 0, // N/A
|
|
|
|
}
|
|
|
|
case *apps_v1.DaemonSet:
|
|
|
|
return Status{
|
|
|
|
Replicas: obj.Status.DesiredNumberScheduled,
|
|
|
|
UpdatedReplicas: obj.Status.UpdatedNumberScheduled,
|
|
|
|
ReadyReplicas: obj.Status.NumberReady,
|
|
|
|
AvailableReplicas: obj.Status.NumberAvailable,
|
|
|
|
UnavailableReplicas: obj.Status.NumberUnavailable,
|
|
|
|
}
|
2023-03-01 16:51:58 +00:00
|
|
|
case *batch_v1.CronJob:
|
2019-05-23 22:17:33 +00:00
|
|
|
return Status{
|
|
|
|
Replicas: int32(len(obj.Status.Active)),
|
|
|
|
UpdatedReplicas: 0,
|
|
|
|
ReadyReplicas: 0,
|
|
|
|
AvailableReplicas: 0,
|
|
|
|
UnavailableReplicas: 0,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return Status{}
|
|
|
|
}
|