diff --git a/cmd/resource.go b/cmd/resource.go index 48c7837cc..8cc49b489 100644 --- a/cmd/resource.go +++ b/cmd/resource.go @@ -90,6 +90,13 @@ var resourceConfigCmd = &cobra.Command{ logrus.Fatal("pv", err) } + b, err = cmd.Flags().GetBool("pvc") + if err == nil { + conf.Resource.PersistentVolumeClaim = b + } else { + logrus.Fatal("pvc", err) + } + b, err = cmd.Flags().GetBool("ds") if err == nil { conf.Resource.DaemonSet = b @@ -132,6 +139,7 @@ func init() { resourceConfigCmd.Flags().Bool("rs", false, "watch for replicasets") resourceConfigCmd.Flags().Bool("ns", false, "watch for namespaces") resourceConfigCmd.Flags().Bool("pv", false, "watch for persistent volumes") + resourceConfigCmd.Flags().Bool("pvc", false, "watch for persistent volumes claim") resourceConfigCmd.Flags().Bool("jobs", false, "watch for jobs") resourceConfigCmd.Flags().Bool("ds", false, "watch for daemonsets") resourceConfigCmd.Flags().Bool("secret", false, "watch for plain secrets") diff --git a/config/config.go b/config/config.go index 7b7cf6ca9..14790818f 100644 --- a/config/config.go +++ b/config/config.go @@ -45,6 +45,7 @@ type Resource struct { Pod bool `json:"po"` Job bool `json:"job"` PersistentVolume bool `json:"pv"` + PersistentVolumeClaim bool `json:"pvc"` Namespace bool `json:"ns"` Secret bool `json:"secret"` ConfigMap bool `json:"configmap"` @@ -171,6 +172,9 @@ func (c *Config) CheckMissingResourceEnvvars() { if !c.Resource.PersistentVolume && os.Getenv("KW_PERSISTENT_VOLUME") == "true" { c.Resource.PersistentVolume = true } + if !c.Resource.PersistentVolumeClaim && os.Getenv("KW_PERSISTENT_VOLUME_CLAIM") == "true" { + c.Resource.PersistentVolumeClaim = true + } if !c.Resource.Secret && os.Getenv("KW_SECRET") == "true" { c.Resource.Secret = true } diff --git a/pkg/controller/controller.go b/pkg/controller/controller.go index fefcc8256..0066d87f3 100644 --- a/pkg/controller/controller.go +++ b/pkg/controller/controller.go @@ -271,6 +271,28 @@ func Start(conf *config.Config, eventHandler handlers.Handler) { go c.Run(stopCh) } + if conf.Resource.PersistentVolumeClaim { + informer := cache.NewSharedIndexInformer( + &cache.ListWatch{ + ListFunc: func(options meta_v1.ListOptions) (runtime.Object, error) { + return kubeClient.CoreV1().PersistentVolumeClaims(meta_v1.NamespaceAll).List(options) + }, + WatchFunc: func(options meta_v1.ListOptions) (watch.Interface, error) { + return kubeClient.CoreV1().PersistentVolumeClaims(meta_v1.NamespaceAll).Watch(options) + }, + }, + &api_v1.PersistentVolumeClaim{}, + 0, //Skip resync + cache.Indexers{}, + ) + + c := newResourceController(kubeClient, eventHandler, informer, "persistent volume claim") + stopCh := make(chan struct{}) + defer close(stopCh) + + go c.Run(stopCh) + } + if conf.Resource.Secret { informer := cache.NewSharedIndexInformer( &cache.ListWatch{ diff --git a/pkg/event/event.go b/pkg/event/event.go index 622cba893..92533707b 100644 --- a/pkg/event/event.go +++ b/pkg/event/event.go @@ -65,6 +65,8 @@ func New(obj interface{}, action string) Event { kind = "ingress" case *api_v1.PersistentVolume: kind = "persistent volume" + case *api_v1.PersistentVolumeClaim: + kind = "persistent volume claim" case *api_v1.Pod: kind = "pod" host = object.Spec.NodeName diff --git a/pkg/utils/k8sutil.go b/pkg/utils/k8sutil.go index 9941874fa..641f33758 100644 --- a/pkg/utils/k8sutil.go +++ b/pkg/utils/k8sutil.go @@ -7,7 +7,7 @@ import ( apps_v1 "k8s.io/api/apps/v1" batch_v1 "k8s.io/api/batch/v1" api_v1 "k8s.io/api/core/v1" - ext_v1beta1 "k8s.io/api/extensions/v1beta1" + ext_v1beta1 "k8s.io/api/extensions/v1beta1" meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes" "k8s.io/client-go/rest" @@ -71,6 +71,8 @@ func GetObjectMetaData(obj interface{}) meta_v1.ObjectMeta { objectMeta = object.ObjectMeta case *api_v1.PersistentVolume: objectMeta = object.ObjectMeta + case *api_v1.PersistentVolumeClaim: + objectMeta = object.ObjectMeta case *api_v1.Namespace: objectMeta = object.ObjectMeta case *api_v1.Secret: