diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc index 68d021a4367..741955c4d94 100644 --- a/CHANGELOG.asciidoc +++ b/CHANGELOG.asciidoc @@ -65,6 +65,7 @@ https://github.com/elastic/beats/compare/v6.0.0-alpha1...master[Check the HEAD d - Add process_summary metricset that records high level metrics about processes. {pull}4231[4231] - Add `kube-state-metrics` based metrics to `kubernetes` module {pull}4253[4253] - Add debug logging to Jolokia JMX metricset. {pull}4341[4341] +- Add events metricset for kubernetes metricbeat module {pull}4315[4315] *Packetbeat* diff --git a/NOTICE b/NOTICE index 9ca73907d23..fd60d57f999 100644 --- a/NOTICE +++ b/NOTICE @@ -252,6 +252,12 @@ Copyright 2014-2015 The Prometheus Authors This product includes software developed at SoundCloud Ltd. (http://soundcloud.com/). +-------------------------------------------------------------------- +github.com/ericchiang/k8s +-------------------------------------------------------------------- +Apache License + + -------------------------------------------------------------------- github.com/garyburd/redigo -------------------------------------------------------------------- @@ -1175,12 +1181,6 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. --------------------------------------------------------------------- -github.com/ericchiang/k8s --------------------------------------------------------------------- -Apache License - - -------------------------------------------------------------------- github.com/golang/protobuf -------------------------------------------------------------------- diff --git a/libbeat/processors/kubernetes/vendor/vendor.json b/libbeat/processors/kubernetes/vendor/vendor.json deleted file mode 100644 index bc490fe13c9..00000000000 --- a/libbeat/processors/kubernetes/vendor/vendor.json +++ /dev/null @@ -1,188 +0,0 @@ -{ - "comment": "", - "ignore": "test", - "package": [ - { - "checksumSHA1": "K0iEPnt2DZL5/YrrzAQoMnA+9Pc=", - "origin": "github.com/exekias/k8s", - "path": "github.com/ericchiang/k8s", - "revision": "28fccef3cb52078910f5f4c09f395c2f7e5fc1b0", - "revisionTime": "2017-04-08T16:30:40Z" - }, - { - "checksumSHA1": "uQuMoUlS7hAWsB+Mwr/1B7+35BU=", - "path": "github.com/ericchiang/k8s/api/resource", - "revision": "929412ddf58668dc5aa49e47fa822507f048d34b", - "revisionTime": "2017-04-20T15:30:38Z" - }, - { - "checksumSHA1": "XN1tbPrI03O0ishnZyfkWtTnrcQ=", - "path": "github.com/ericchiang/k8s/api/unversioned", - "revision": "929412ddf58668dc5aa49e47fa822507f048d34b", - "revisionTime": "2017-04-20T15:30:38Z" - }, - { - "checksumSHA1": "yfTg3/Qn7KiizNJ39JmPBFi9YDQ=", - "path": "github.com/ericchiang/k8s/api/v1", - "revision": "929412ddf58668dc5aa49e47fa822507f048d34b", - "revisionTime": "2017-04-20T15:30:38Z" - }, - { - "checksumSHA1": "uw/3eB6WiVCSrQZS9ZZs/1kyu1I=", - "path": "github.com/ericchiang/k8s/apis/apps/v1alpha1", - "revision": "929412ddf58668dc5aa49e47fa822507f048d34b", - "revisionTime": "2017-04-20T15:30:38Z" - }, - { - "checksumSHA1": "GPnvYx9Uxhpwmv01iygWR6+naTI=", - "path": "github.com/ericchiang/k8s/apis/apps/v1beta1", - "revision": "929412ddf58668dc5aa49e47fa822507f048d34b", - "revisionTime": "2017-04-20T15:30:38Z" - }, - { - "checksumSHA1": "Jjw5tBYv4k+Es+qPp03rnzyzRWA=", - "path": "github.com/ericchiang/k8s/apis/authentication/v1", - "revision": "929412ddf58668dc5aa49e47fa822507f048d34b", - "revisionTime": "2017-04-20T15:30:38Z" - }, - { - "checksumSHA1": "uR4S43Wc80fhS0vMDE3Z3hFg7J8=", - "path": "github.com/ericchiang/k8s/apis/authentication/v1beta1", - "revision": "929412ddf58668dc5aa49e47fa822507f048d34b", - "revisionTime": "2017-04-20T15:30:38Z" - }, - { - "checksumSHA1": "aM2KSDZbHn8jJomPPeG6LKpMwhs=", - "path": "github.com/ericchiang/k8s/apis/authorization/v1", - "revision": "929412ddf58668dc5aa49e47fa822507f048d34b", - "revisionTime": "2017-04-20T15:30:38Z" - }, - { - "checksumSHA1": "4yWZvduAw2JNdHd1cXjTJBUy0lw=", - "path": "github.com/ericchiang/k8s/apis/authorization/v1beta1", - "revision": "929412ddf58668dc5aa49e47fa822507f048d34b", - "revisionTime": "2017-04-20T15:30:38Z" - }, - { - "checksumSHA1": "1nMeCVQImIo1CpRRyOYMIqLoPBc=", - "path": "github.com/ericchiang/k8s/apis/autoscaling/v1", - "revision": "929412ddf58668dc5aa49e47fa822507f048d34b", - "revisionTime": "2017-04-20T15:30:38Z" - }, - { - "checksumSHA1": "kUXiQQA99K7zquvG9es3yauVjYw=", - "path": "github.com/ericchiang/k8s/apis/autoscaling/v2alpha1", - "revision": "929412ddf58668dc5aa49e47fa822507f048d34b", - "revisionTime": "2017-04-20T15:30:38Z" - }, - { - "checksumSHA1": "vMWsdmHlmaAQZIT0c26dwxe9pDw=", - "path": "github.com/ericchiang/k8s/apis/batch/v1", - "revision": "929412ddf58668dc5aa49e47fa822507f048d34b", - "revisionTime": "2017-04-20T15:30:38Z" - }, - { - "checksumSHA1": "bqaX0T9jycmp9ao1Ov41dfPn0Ng=", - "path": "github.com/ericchiang/k8s/apis/batch/v2alpha1", - "revision": "929412ddf58668dc5aa49e47fa822507f048d34b", - "revisionTime": "2017-04-20T15:30:38Z" - }, - { - "checksumSHA1": "9GRVPI+Tf4RrlX2aveUGEUHKIrM=", - "path": "github.com/ericchiang/k8s/apis/certificates/v1alpha1", - "revision": "929412ddf58668dc5aa49e47fa822507f048d34b", - "revisionTime": "2017-04-20T15:30:38Z" - }, - { - "checksumSHA1": "k1dF56GRoEg6rooFKO7UvEJvBcE=", - "path": "github.com/ericchiang/k8s/apis/certificates/v1beta1", - "revision": "929412ddf58668dc5aa49e47fa822507f048d34b", - "revisionTime": "2017-04-20T15:30:38Z" - }, - { - "checksumSHA1": "4pDHINIk6BdPBYWGF20IwHNCg2Q=", - "path": "github.com/ericchiang/k8s/apis/extensions/v1beta1", - "revision": "929412ddf58668dc5aa49e47fa822507f048d34b", - "revisionTime": "2017-04-20T15:30:38Z" - }, - { - "checksumSHA1": "NAL7OeKSEzTOoXHBFnC1B1VmBVs=", - "path": "github.com/ericchiang/k8s/apis/imagepolicy/v1alpha1", - "revision": "929412ddf58668dc5aa49e47fa822507f048d34b", - "revisionTime": "2017-04-20T15:30:38Z" - }, - { - "checksumSHA1": "Vg1/xjzLJHZlvuheWC4abghACwQ=", - "path": "github.com/ericchiang/k8s/apis/meta/v1", - "revision": "929412ddf58668dc5aa49e47fa822507f048d34b", - "revisionTime": "2017-04-20T15:30:38Z" - }, - { - "checksumSHA1": "wYSNb+W2L5gJlGO8n6mGOGft8R8=", - "path": "github.com/ericchiang/k8s/apis/policy/v1alpha1", - "revision": "929412ddf58668dc5aa49e47fa822507f048d34b", - "revisionTime": "2017-04-20T15:30:38Z" - }, - { - "checksumSHA1": "ioJ28pdUN6fDkOp8dT+Tg3HSqmk=", - "path": "github.com/ericchiang/k8s/apis/policy/v1beta1", - "revision": "929412ddf58668dc5aa49e47fa822507f048d34b", - "revisionTime": "2017-04-20T15:30:38Z" - }, - { - "checksumSHA1": "UErnBsjjtmg3oYjLYU1S80oi3sk=", - "path": "github.com/ericchiang/k8s/apis/rbac/v1alpha1", - "revision": "929412ddf58668dc5aa49e47fa822507f048d34b", - "revisionTime": "2017-04-20T15:30:38Z" - }, - { - "checksumSHA1": "Xl+Tm8ZOz0cMOrfLaQvu/lsWObU=", - "path": "github.com/ericchiang/k8s/apis/rbac/v1beta1", - "revision": "929412ddf58668dc5aa49e47fa822507f048d34b", - "revisionTime": "2017-04-20T15:30:38Z" - }, - { - "checksumSHA1": "YyZyaF0k2NAQAZvsCOVdhAkfVU0=", - "path": "github.com/ericchiang/k8s/apis/settings/v1alpha1", - "revision": "929412ddf58668dc5aa49e47fa822507f048d34b", - "revisionTime": "2017-04-20T15:30:38Z" - }, - { - "checksumSHA1": "vUc3mf0rE7CQ3B52wfrMDyspLgA=", - "path": "github.com/ericchiang/k8s/apis/storage/v1", - "revision": "929412ddf58668dc5aa49e47fa822507f048d34b", - "revisionTime": "2017-04-20T15:30:38Z" - }, - { - "checksumSHA1": "7/oj1z0vG1pvRza+UuKQ6txdleI=", - "path": "github.com/ericchiang/k8s/apis/storage/v1beta1", - "revision": "929412ddf58668dc5aa49e47fa822507f048d34b", - "revisionTime": "2017-04-20T15:30:38Z" - }, - { - "checksumSHA1": "mm5iTFmLQ6h98DKgiUuTCpHP9H4=", - "path": "github.com/ericchiang/k8s/runtime", - "revision": "929412ddf58668dc5aa49e47fa822507f048d34b", - "revisionTime": "2017-04-20T15:30:38Z" - }, - { - "checksumSHA1": "Kk1UDqUx2Pr1LyvIIgcJBApTlCk=", - "path": "github.com/ericchiang/k8s/runtime/schema", - "revision": "929412ddf58668dc5aa49e47fa822507f048d34b", - "revisionTime": "2017-04-20T15:30:38Z" - }, - { - "checksumSHA1": "LoxBND74egHIasOX6z98FeeW0zI=", - "path": "github.com/ericchiang/k8s/util/intstr", - "revision": "929412ddf58668dc5aa49e47fa822507f048d34b", - "revisionTime": "2017-04-20T15:30:38Z" - }, - { - "checksumSHA1": "fobEKiMk5D7IGvCSwh4HdG1o98c=", - "path": "github.com/ericchiang/k8s/watch/versioned", - "revision": "929412ddf58668dc5aa49e47fa822507f048d34b", - "revisionTime": "2017-04-20T15:30:38Z" - } - ], - "rootPath": "github.com/elastic/beats/libbeat/processors/kubernetes" -} diff --git a/metricbeat/docs/fields.asciidoc b/metricbeat/docs/fields.asciidoc index 1dc65a348af..f9856397403 100644 --- a/metricbeat/docs/fields.asciidoc +++ b/metricbeat/docs/fields.asciidoc @@ -6057,6 +6057,156 @@ type: long Used inodes +[float] +== event Fields + +The Kubernetes events metricset collects events that are generated by objects running inside of Kubernetes + + + +[float] +=== kubernetes.event.count + +type: long + +Count field records the number of times the particular event has occured + + +[float] +=== kubernetes.event.message + +type: keyword + +Message recorded for the given event + + +[float] +=== kubernetes.event.reason + +type: keyword + +Reason recorded for the given event + + +[float] +=== kubernetes.event.type + +type: keyword + +Type of the given event + + +[float] +== metadata Fields + +Metadata associated with the given event + + + + +[float] +=== kubernetes.event.metadata.timestamp.created + +type: date + +Timestamp of creation of the given event + + +[float] +=== kubernetes.event.metadata.timestamp.deleted + +type: date + +Timestamp of deletion of the given event + + +[float] +=== kubernetes.event.metadata.name + +type: keyword + +Name of the event + + +[float] +=== kubernetes.event.metadata.namespace + +type: keyword + +Namespace in which event was generated + + +[float] +=== kubernetes.event.metadata.resource_version + +type: keyword + +Version of the event resource + + +[float] +=== kubernetes.event.metadata.uid + +type: keyword + +Unique identifier to the event object + + +[float] +=== kubernetes.event.metadata.self_link + +type: keyword + +URL representing the event + + +[float] +== involved_object Fields + +Metadata associated with the given involved object + + + +[float] +=== kubernetes.event.involved_object.api_version + +type: keyword + +API version of the object + + +[float] +=== kubernetes.event.involved_object.kind + +type: keyword + +API kind of the object + + +[float] +=== kubernetes.event.involved_object.name + +type: keyword + +name of the object + + +[float] +=== kubernetes.event.involved_object.resource_version + +type: keyword + +resource version of the object + + +[float] +=== kubernetes.event.involved_object.uid + +type: keyword + +UUID version of the object + + [float] == node Fields diff --git a/metricbeat/docs/modules/kubernetes.asciidoc b/metricbeat/docs/modules/kubernetes.asciidoc index 1d729eb3822..ab3e3fc78a4 100644 --- a/metricbeat/docs/modules/kubernetes.asciidoc +++ b/metricbeat/docs/modules/kubernetes.asciidoc @@ -47,6 +47,12 @@ metricbeat.modules: - state_container period: 10s hosts: ["kube-state-metrics:8080"] + +# Kubernetes events +- module: kubernetes + metricsets: + - event + in_cluster: true ---- [float] @@ -56,6 +62,8 @@ The following metricsets are available: * <> +* <> + * <> * <> @@ -76,6 +84,8 @@ The following metricsets are available: include::kubernetes/container.asciidoc[] +include::kubernetes/event.asciidoc[] + include::kubernetes/node.asciidoc[] include::kubernetes/pod.asciidoc[] diff --git a/metricbeat/docs/modules/kubernetes/event.asciidoc b/metricbeat/docs/modules/kubernetes/event.asciidoc new file mode 100644 index 00000000000..62f386af0a1 --- /dev/null +++ b/metricbeat/docs/modules/kubernetes/event.asciidoc @@ -0,0 +1,19 @@ +//// +This file is generated! See scripts/docs_collector.py +//// + +[[metricbeat-metricset-kubernetes-event]] +include::../../../module/kubernetes/event/_meta/docs.asciidoc[] + + +==== Fields + +For a description of each field in the metricset, see the +<> section. + +Here is an example document generated by this metricset: + +[source,json] +---- +include::../../../module/kubernetes/event/_meta/data.json[] +---- diff --git a/metricbeat/include/list.go b/metricbeat/include/list.go index 4f90654bd85..19496aa5648 100644 --- a/metricbeat/include/list.go +++ b/metricbeat/include/list.go @@ -52,6 +52,7 @@ import ( _ "github.com/elastic/beats/metricbeat/module/kibana/status" _ "github.com/elastic/beats/metricbeat/module/kubernetes" _ "github.com/elastic/beats/metricbeat/module/kubernetes/container" + _ "github.com/elastic/beats/metricbeat/module/kubernetes/event" _ "github.com/elastic/beats/metricbeat/module/kubernetes/node" _ "github.com/elastic/beats/metricbeat/module/kubernetes/pod" _ "github.com/elastic/beats/metricbeat/module/kubernetes/state_container" diff --git a/metricbeat/metricbeat.full.yml b/metricbeat/metricbeat.full.yml index 346367e6383..ca0c4250d51 100644 --- a/metricbeat/metricbeat.full.yml +++ b/metricbeat/metricbeat.full.yml @@ -275,6 +275,12 @@ metricbeat.modules: period: 10s hosts: ["kube-state-metrics:8080"] +# Kubernetes events +- module: kubernetes + metricsets: + - event + in_cluster: true + #------------------------------ memcached Module ----------------------------- - module: memcached metricsets: ["stats"] diff --git a/metricbeat/module/kubernetes/_meta/config.yml b/metricbeat/module/kubernetes/_meta/config.yml index 25d67b3f6fe..3e574a85d24 100644 --- a/metricbeat/module/kubernetes/_meta/config.yml +++ b/metricbeat/module/kubernetes/_meta/config.yml @@ -21,3 +21,9 @@ - state_container period: 10s hosts: ["kube-state-metrics:8080"] + +# Kubernetes events +- module: kubernetes + metricsets: + - event + in_cluster: true diff --git a/metricbeat/module/kubernetes/event/_meta/data.json b/metricbeat/module/kubernetes/event/_meta/data.json new file mode 100644 index 00000000000..3b8c90ed489 --- /dev/null +++ b/metricbeat/module/kubernetes/event/_meta/data.json @@ -0,0 +1,43 @@ +{ + "@timestamp": "2017-05-15T08:07:12.945Z", + "beat": { + "hostname": "hostname", + "name": "beatname", + "version": "6.0.0-alpha2" + }, + "kubernetes": { + "event": { + "count": 1, + "involved_object": { + "api_version": "extensions", + "kind": "ReplicaSet", + "name": "prometheus-2552087900", + "resource_version": "1047038", + "uid": "b2f92f14-2ad5-11e7-8cb8-e687a39f6e48" + }, + "message": "Created pod: prometheus-2552087900-9fxh6", + "metadata": { + "generate_name": "", + "name": "prometheus-2552087900.14bf266355fd16e0", + "namespace": "default", + "resource_version": "1047243", + "self_link": "/api/v1/namespaces/default/events/prometheus-2552087900.14bf266355fd16e0", + "timestamp": { + "created": "2017-05-16T10:30:09-07:00", + "deleted": "" + }, + "uid": "4f3fe524-3a5d-11e7-b8f2-e687a39f6e48" + }, + "reason": "SuccessfulCreate", + "timestamp": { + "first_occurrence": "2017-05-16T17:30:09Z", + "last_occurrence": "2017-05-16T17:30:09Z" + }, + "type": "Normal" + } + }, + "metricset": { + "module": "kubernetes", + "name": "event" + } +} diff --git a/metricbeat/module/kubernetes/event/_meta/docs.asciidoc b/metricbeat/module/kubernetes/event/_meta/docs.asciidoc new file mode 100644 index 00000000000..79634a51855 --- /dev/null +++ b/metricbeat/module/kubernetes/event/_meta/docs.asciidoc @@ -0,0 +1,3 @@ +=== kubernetes event MetricSet + +This is the event metricset of the module kubernetes. diff --git a/metricbeat/module/kubernetes/event/_meta/fields.yml b/metricbeat/module/kubernetes/event/_meta/fields.yml new file mode 100644 index 00000000000..7bc0a4a9b44 --- /dev/null +++ b/metricbeat/module/kubernetes/event/_meta/fields.yml @@ -0,0 +1,95 @@ +- name: event + type: group + description: > + The Kubernetes events metricset collects events that are generated by objects running + inside of Kubernetes + fields: + - name: count + type: long + description: > + Count field records the number of times the particular event has occured + fields: + - name: timestamp + type: group + fields: + - name: first_occurrence + type: date + description: > + Timestamp of first occurrence of event + - name: last_occurrence + type: date + description: > + Timestamp of last occurrence of event + - name: message + type: keyword + description: > + Message recorded for the given event + - name: reason + type: keyword + description: > + Reason recorded for the given event + - name: type + type: keyword + description: > + Type of the given event + - name: metadata + type: group + description: > + Metadata associated with the given event + fields: + - name: timestamp + type: group + fields: + - name: created + type: date + description: > + Timestamp of creation of the given event + - name: deleted + type: date + description: > + Timestamp of deletion of the given event + - name: name + type: keyword + description: > + Name of the event + - name: namespace + type: keyword + description: > + Namespace in which event was generated + - name: resource_version + type: keyword + description: > + Version of the event resource + - name: uid + type: keyword + description: > + Unique identifier to the event object + - name: self_link + type: keyword + description: > + URL representing the event + - name: involved_object + type: group + description: > + Metadata associated with the given involved object + fields: + - name: api_version + type: keyword + description: > + API version of the object + - name: kind + type: keyword + description: > + API kind of the object + - name: name + type: keyword + description: > + name of the object + - name: resource_version + type: keyword + description: > + resource version of the object + - name: uid + type: keyword + description: > + UUID version of the object diff --git a/metricbeat/module/kubernetes/event/config.go b/metricbeat/module/kubernetes/event/config.go new file mode 100644 index 00000000000..551976fd5e2 --- /dev/null +++ b/metricbeat/module/kubernetes/event/config.go @@ -0,0 +1,35 @@ +package event + +import ( + "errors" + "time" + + "github.com/elastic/beats/libbeat/common" +) + +type kubeEventsConfig struct { + InCluster bool `config:"in_cluster"` + KubeConfig string `config:"kube_config"` + Namespace string `config:"namespace"` + SyncPeriod time.Duration `config:"sync_period"` +} + +type Enabled struct { + Enabled bool `config:"enabled"` +} + +type PluginConfig []map[string]common.Config + +func defaultKuberentesEventsConfig() kubeEventsConfig { + return kubeEventsConfig{ + InCluster: true, + SyncPeriod: 1 * time.Second, + } +} + +func (c kubeEventsConfig) Validate() error { + if !c.InCluster && c.KubeConfig == "" { + return errors.New("`kube_config` path can't be empty when in_cluster is set to false") + } + return nil +} diff --git a/metricbeat/module/kubernetes/event/event.go b/metricbeat/module/kubernetes/event/event.go new file mode 100644 index 00000000000..4107fbe260f --- /dev/null +++ b/metricbeat/module/kubernetes/event/event.go @@ -0,0 +1,147 @@ +package event + +import ( + "fmt" + "io/ioutil" + + "github.com/elastic/beats/libbeat/common" + "github.com/elastic/beats/libbeat/logp" + "github.com/elastic/beats/metricbeat/mb" + + "github.com/ericchiang/k8s" + "github.com/ghodss/yaml" +) + +// init registers the MetricSet with the central registry. +// The New method will be called after the setup of the module and before starting to fetch data +func init() { + if err := mb.Registry.AddMetricSet("kubernetes", "event", New); err != nil { + panic(err) + } +} + +// MetricSet type defines all fields of the MetricSet +// The event MetricSet listens to events from Kubernetes API server and streams them to the output. +// MetricSet implements the mb.PushMetricSet interface, and therefore does not rely on polling. +type MetricSet struct { + mb.BaseMetricSet + watcher *Watcher +} + +// New create a new instance of the MetricSet +// Part of new is also setting up the configuration by processing additional +// configuration entries if needed. +func New(base mb.BaseMetricSet) (mb.MetricSet, error) { + logp.Experimental("The kubernetes event metricset is experimental") + + config := defaultKuberentesEventsConfig() + + err := base.Module().UnpackConfig(&config) + if err != nil { + return nil, fmt.Errorf("fail to unpack the kubernetes event configuration: %s", err) + } + + var client *k8s.Client + if config.InCluster == true { + client, err = k8s.NewInClusterClient() + if err != nil { + return nil, fmt.Errorf("Unable to get in cluster configuration") + } + } else { + data, err := ioutil.ReadFile(config.KubeConfig) + if err != nil { + return nil, fmt.Errorf("read kubeconfig: %v", err) + } + + // Unmarshal YAML into a Kubernetes config object. + var config k8s.Config + if err = yaml.Unmarshal(data, &config); err != nil { + return nil, fmt.Errorf("unmarshal kubeconfig: %v", err) + } + client, err = k8s.NewClient(&config) + if err != nil { + return nil, err + } + } + + watcher := NewWatcher(client, config.SyncPeriod, config.Namespace) + + return &MetricSet{ + BaseMetricSet: base, + watcher: watcher, + }, nil +} + +// Run method provides the Kubernetes event watcher with a reporter with which events can be reported. +func (m *MetricSet) Run(reporter mb.PushReporter) { + // Start event watcher + m.watcher.Run() + + for { + select { + case <-reporter.Done(): + m.watcher.Stop() + return + case msg := <-m.watcher.eventQueue: + // Ignore events that are deleted + if msg.Metadata.DeletionTimestamp == "" { + if msg.Metadata.DeletionTimestamp == "" { + reporter.Event(generateMapStrFromEvent(msg)) + } + } + } + } +} + +func generateMapStrFromEvent(eve *Event) common.MapStr { + eventMeta := common.MapStr{ + "timestamp": common.MapStr{ + "created": eve.Metadata.CreationTimestamp, + "deleted": eve.Metadata.DeletionTimestamp, + }, + "name": eve.Metadata.Name, + "namespace": eve.Metadata.Namespace, + "self_link": eve.Metadata.SelfLink, + "generate_name": eve.Metadata.GenerateName, + "uid": eve.Metadata.UID, + "resource_version": eve.Metadata.ResourceVersion, + } + + if len(eve.Metadata.Labels) != 0 { + labels := make(common.MapStr, len(eve.Metadata.Labels)) + for k, v := range eve.Metadata.Labels { + labels[k] = v + } + + eventMeta["labels"] = labels + } + + if len(eve.Metadata.Annotations) != 0 { + annotations := make(common.MapStr, len(eve.Metadata.Annotations)) + for k, v := range eve.Metadata.Annotations { + annotations[k] = v + } + + eventMeta["annotations"] = annotations + } + + return common.MapStr{ + "timestamp": common.MapStr{ + "first_occurrence": eve.FirstTimestamp.UTC(), + "last_occurrence": eve.LastTimestamp.UTC(), + }, + "message": eve.Message, + "reason": eve.Reason, + "type": eve.Type, + "count": eve.Count, + "involved_object": common.MapStr{ + "api_version": eve.InvolvedObject.APIVersion, + "resource_version": eve.InvolvedObject.ResourceVersion, + "name": eve.InvolvedObject.Name, + "kind": eve.InvolvedObject.Kind, + "uid": eve.InvolvedObject.UID, + }, + "metadata": eventMeta, + } + +} diff --git a/metricbeat/module/kubernetes/event/types.go b/metricbeat/module/kubernetes/event/types.go new file mode 100644 index 00000000000..8ded19fca74 --- /dev/null +++ b/metricbeat/module/kubernetes/event/types.go @@ -0,0 +1,46 @@ +package event + +import "time" + +type ObjectMeta struct { + Annotations map[string]string `json:"annotations"` + CreationTimestamp string `json:"creationTimestamp"` + DeletionTimestamp string `json:"deletionTimestamp"` + GenerateName string `json:"generateName"` + Labels map[string]string `json:"labels"` + Name string `json:"name"` + Namespace string `json:"namespace"` + OwnerReferences []struct { + APIVersion string `json:"apiVersion"` + Controller bool `json:"controller"` + Kind string `json:"kind"` + Name string `json:"name"` + UID string `json:"uid"` + } `json:"ownerReferences"` + ResourceVersion string `json:"resourceVersion"` + SelfLink string `json:"selfLink"` + UID string `json:"uid"` +} + +type Event struct { + APIVersion string `json:"apiVersion"` + Count int64 `json:"count"` + FirstTimestamp time.Time `json:"firstTimestamp"` + InvolvedObject struct { + APIVersion string `json:"apiVersion"` + Kind string `json:"kind"` + Name string `json:"name"` + ResourceVersion string `json:"resourceVersion"` + UID string `json:"uid"` + } `json:"involvedObject"` + Kind string `json:"kind"` + LastTimestamp time.Time `json:"lastTimestamp"` + Message string `json:"message"` + Metadata ObjectMeta `json:"metadata"` + Reason string `json:"reason"` + Source struct { + Component string `json:"component"` + Host string `json:"host"` + } `json:"source"` + Type string `json:"type"` +} diff --git a/metricbeat/module/kubernetes/event/watcher.go b/metricbeat/module/kubernetes/event/watcher.go new file mode 100644 index 00000000000..abc858abd2a --- /dev/null +++ b/metricbeat/module/kubernetes/event/watcher.go @@ -0,0 +1,120 @@ +package event + +import ( + "context" + "encoding/json" + "time" + + "github.com/elastic/beats/libbeat/logp" + + "github.com/ericchiang/k8s" + corev1 "github.com/ericchiang/k8s/api/v1" +) + +// Watcher is a controller that synchronizes Pods. +type Watcher struct { + kubeClient *k8s.Client + namespace string + syncPeriod time.Duration + eventQueue chan *Event + lastResourceVersion string + ctx context.Context + stop context.CancelFunc +} + +// NewWatcher initializes the watcher client to provide a local state of +// pods from the cluster (filtered to the given host) +func NewWatcher(kubeClient *k8s.Client, syncPeriod time.Duration, namespace string) *Watcher { + ctx, cancel := context.WithCancel(context.Background()) + return &Watcher{ + kubeClient: kubeClient, + namespace: namespace, + syncPeriod: syncPeriod, + eventQueue: make(chan *Event, 10), + lastResourceVersion: "0", + ctx: ctx, + stop: cancel, + } +} + +// watchEvents watches on the Kubernetes API server and puts them onto a channel. +// watchEvents only starts from the most recent event. +func (w *Watcher) watchEvents() { + for { + //To avoid writing old events, list events to get last resource version + events, err := w.kubeClient.CoreV1().ListEvents( + w.ctx, + w.namespace, + ) + + if err != nil { + //if listing fails try again after sometime + logp.Err("kubernetes: List API error %v", err) + // Sleep for a second to prevent API server from being bombarded + // API server could be down + time.Sleep(time.Second) + continue + } + + w.lastResourceVersion = events.Metadata.GetResourceVersion() + + logp.Info("kubernetes: %s", "Watching API for events") + watcher, err := w.kubeClient.CoreV1().WatchEvents( + w.ctx, + w.namespace, + k8s.ResourceVersion(w.lastResourceVersion), + ) + if err != nil { + //watch events failures should be logged and gracefully failed over as metadata retrieval + //should never stop. + logp.Err("kubernetes: Watching API eror %v", err) + // Sleep for a second to prevent API server from being bombarded + // API server could be down + time.Sleep(time.Second) + continue + } + + for { + _, eve, err := watcher.Next() + if err != nil { + logp.Err("kubernetes: Watching API error %v", err) + break + } + + event := w.getEventMeta(eve) + if event != nil { + w.eventQueue <- event + } + + } + } + +} + +func (w *Watcher) Run() { + // Start watching on events + go w.watchEvents() +} + +func (w *Watcher) getEventMeta(pod *corev1.Event) *Event { + bytes, err := json.Marshal(pod) + if err != nil { + logp.Warn("Unable to marshal %v", pod.String()) + return nil + } + + eve := &Event{} + err = json.Unmarshal(bytes, eve) + if err != nil { + logp.Warn("Unable to marshal %v", pod.String()) + return nil + } + + return eve + +} + +func (w *Watcher) Stop() { + w.stop() + close(w.eventQueue) +} diff --git a/libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/LICENSE b/vendor/github.com/ericchiang/k8s/LICENSE similarity index 100% rename from libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/LICENSE rename to vendor/github.com/ericchiang/k8s/LICENSE diff --git a/libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/Makefile b/vendor/github.com/ericchiang/k8s/Makefile similarity index 100% rename from libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/Makefile rename to vendor/github.com/ericchiang/k8s/Makefile diff --git a/libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/README.md b/vendor/github.com/ericchiang/k8s/README.md similarity index 100% rename from libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/README.md rename to vendor/github.com/ericchiang/k8s/README.md diff --git a/libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/api/resource/generated.pb.go b/vendor/github.com/ericchiang/k8s/api/resource/generated.pb.go similarity index 100% rename from libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/api/resource/generated.pb.go rename to vendor/github.com/ericchiang/k8s/api/resource/generated.pb.go diff --git a/libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/api/unversioned/generated.pb.go b/vendor/github.com/ericchiang/k8s/api/unversioned/generated.pb.go similarity index 100% rename from libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/api/unversioned/generated.pb.go rename to vendor/github.com/ericchiang/k8s/api/unversioned/generated.pb.go diff --git a/libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/api/unversioned/time.go b/vendor/github.com/ericchiang/k8s/api/unversioned/time.go similarity index 100% rename from libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/api/unversioned/time.go rename to vendor/github.com/ericchiang/k8s/api/unversioned/time.go diff --git a/libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/api/v1/generated.pb.go b/vendor/github.com/ericchiang/k8s/api/v1/generated.pb.go similarity index 100% rename from libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/api/v1/generated.pb.go rename to vendor/github.com/ericchiang/k8s/api/v1/generated.pb.go diff --git a/libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/apis/apps/v1alpha1/generated.pb.go b/vendor/github.com/ericchiang/k8s/apis/apps/v1alpha1/generated.pb.go similarity index 100% rename from libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/apis/apps/v1alpha1/generated.pb.go rename to vendor/github.com/ericchiang/k8s/apis/apps/v1alpha1/generated.pb.go diff --git a/libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/apis/apps/v1beta1/generated.pb.go b/vendor/github.com/ericchiang/k8s/apis/apps/v1beta1/generated.pb.go similarity index 100% rename from libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/apis/apps/v1beta1/generated.pb.go rename to vendor/github.com/ericchiang/k8s/apis/apps/v1beta1/generated.pb.go diff --git a/libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/apis/authentication/v1/generated.pb.go b/vendor/github.com/ericchiang/k8s/apis/authentication/v1/generated.pb.go similarity index 100% rename from libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/apis/authentication/v1/generated.pb.go rename to vendor/github.com/ericchiang/k8s/apis/authentication/v1/generated.pb.go diff --git a/libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/apis/authentication/v1beta1/generated.pb.go b/vendor/github.com/ericchiang/k8s/apis/authentication/v1beta1/generated.pb.go similarity index 100% rename from libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/apis/authentication/v1beta1/generated.pb.go rename to vendor/github.com/ericchiang/k8s/apis/authentication/v1beta1/generated.pb.go diff --git a/libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/apis/authorization/v1/generated.pb.go b/vendor/github.com/ericchiang/k8s/apis/authorization/v1/generated.pb.go similarity index 100% rename from libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/apis/authorization/v1/generated.pb.go rename to vendor/github.com/ericchiang/k8s/apis/authorization/v1/generated.pb.go diff --git a/libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/apis/authorization/v1beta1/generated.pb.go b/vendor/github.com/ericchiang/k8s/apis/authorization/v1beta1/generated.pb.go similarity index 100% rename from libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/apis/authorization/v1beta1/generated.pb.go rename to vendor/github.com/ericchiang/k8s/apis/authorization/v1beta1/generated.pb.go diff --git a/libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/apis/autoscaling/v1/generated.pb.go b/vendor/github.com/ericchiang/k8s/apis/autoscaling/v1/generated.pb.go similarity index 100% rename from libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/apis/autoscaling/v1/generated.pb.go rename to vendor/github.com/ericchiang/k8s/apis/autoscaling/v1/generated.pb.go diff --git a/libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/apis/autoscaling/v2alpha1/generated.pb.go b/vendor/github.com/ericchiang/k8s/apis/autoscaling/v2alpha1/generated.pb.go similarity index 100% rename from libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/apis/autoscaling/v2alpha1/generated.pb.go rename to vendor/github.com/ericchiang/k8s/apis/autoscaling/v2alpha1/generated.pb.go diff --git a/libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/apis/batch/v1/generated.pb.go b/vendor/github.com/ericchiang/k8s/apis/batch/v1/generated.pb.go similarity index 100% rename from libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/apis/batch/v1/generated.pb.go rename to vendor/github.com/ericchiang/k8s/apis/batch/v1/generated.pb.go diff --git a/libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/apis/batch/v2alpha1/generated.pb.go b/vendor/github.com/ericchiang/k8s/apis/batch/v2alpha1/generated.pb.go similarity index 100% rename from libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/apis/batch/v2alpha1/generated.pb.go rename to vendor/github.com/ericchiang/k8s/apis/batch/v2alpha1/generated.pb.go diff --git a/libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/apis/certificates/v1alpha1/generated.pb.go b/vendor/github.com/ericchiang/k8s/apis/certificates/v1alpha1/generated.pb.go similarity index 100% rename from libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/apis/certificates/v1alpha1/generated.pb.go rename to vendor/github.com/ericchiang/k8s/apis/certificates/v1alpha1/generated.pb.go diff --git a/libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/apis/certificates/v1beta1/generated.pb.go b/vendor/github.com/ericchiang/k8s/apis/certificates/v1beta1/generated.pb.go similarity index 100% rename from libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/apis/certificates/v1beta1/generated.pb.go rename to vendor/github.com/ericchiang/k8s/apis/certificates/v1beta1/generated.pb.go diff --git a/libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/apis/extensions/v1beta1/generated.pb.go b/vendor/github.com/ericchiang/k8s/apis/extensions/v1beta1/generated.pb.go similarity index 100% rename from libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/apis/extensions/v1beta1/generated.pb.go rename to vendor/github.com/ericchiang/k8s/apis/extensions/v1beta1/generated.pb.go diff --git a/libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/apis/imagepolicy/v1alpha1/generated.pb.go b/vendor/github.com/ericchiang/k8s/apis/imagepolicy/v1alpha1/generated.pb.go similarity index 100% rename from libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/apis/imagepolicy/v1alpha1/generated.pb.go rename to vendor/github.com/ericchiang/k8s/apis/imagepolicy/v1alpha1/generated.pb.go diff --git a/libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/apis/meta/v1/generated.pb.go b/vendor/github.com/ericchiang/k8s/apis/meta/v1/generated.pb.go similarity index 100% rename from libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/apis/meta/v1/generated.pb.go rename to vendor/github.com/ericchiang/k8s/apis/meta/v1/generated.pb.go diff --git a/libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/apis/meta/v1/time.go b/vendor/github.com/ericchiang/k8s/apis/meta/v1/time.go similarity index 100% rename from libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/apis/meta/v1/time.go rename to vendor/github.com/ericchiang/k8s/apis/meta/v1/time.go diff --git a/libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/apis/policy/v1alpha1/generated.pb.go b/vendor/github.com/ericchiang/k8s/apis/policy/v1alpha1/generated.pb.go similarity index 100% rename from libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/apis/policy/v1alpha1/generated.pb.go rename to vendor/github.com/ericchiang/k8s/apis/policy/v1alpha1/generated.pb.go diff --git a/libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/apis/policy/v1beta1/generated.pb.go b/vendor/github.com/ericchiang/k8s/apis/policy/v1beta1/generated.pb.go similarity index 100% rename from libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/apis/policy/v1beta1/generated.pb.go rename to vendor/github.com/ericchiang/k8s/apis/policy/v1beta1/generated.pb.go diff --git a/libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/apis/rbac/v1alpha1/generated.pb.go b/vendor/github.com/ericchiang/k8s/apis/rbac/v1alpha1/generated.pb.go similarity index 100% rename from libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/apis/rbac/v1alpha1/generated.pb.go rename to vendor/github.com/ericchiang/k8s/apis/rbac/v1alpha1/generated.pb.go diff --git a/libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/apis/rbac/v1beta1/generated.pb.go b/vendor/github.com/ericchiang/k8s/apis/rbac/v1beta1/generated.pb.go similarity index 100% rename from libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/apis/rbac/v1beta1/generated.pb.go rename to vendor/github.com/ericchiang/k8s/apis/rbac/v1beta1/generated.pb.go diff --git a/libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/apis/settings/v1alpha1/generated.pb.go b/vendor/github.com/ericchiang/k8s/apis/settings/v1alpha1/generated.pb.go similarity index 100% rename from libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/apis/settings/v1alpha1/generated.pb.go rename to vendor/github.com/ericchiang/k8s/apis/settings/v1alpha1/generated.pb.go diff --git a/libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/apis/storage/v1/generated.pb.go b/vendor/github.com/ericchiang/k8s/apis/storage/v1/generated.pb.go similarity index 100% rename from libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/apis/storage/v1/generated.pb.go rename to vendor/github.com/ericchiang/k8s/apis/storage/v1/generated.pb.go diff --git a/libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/apis/storage/v1beta1/generated.pb.go b/vendor/github.com/ericchiang/k8s/apis/storage/v1beta1/generated.pb.go similarity index 100% rename from libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/apis/storage/v1beta1/generated.pb.go rename to vendor/github.com/ericchiang/k8s/apis/storage/v1beta1/generated.pb.go diff --git a/libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/client.go b/vendor/github.com/ericchiang/k8s/client.go similarity index 100% rename from libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/client.go rename to vendor/github.com/ericchiang/k8s/client.go diff --git a/libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/codec.go b/vendor/github.com/ericchiang/k8s/codec.go similarity index 100% rename from libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/codec.go rename to vendor/github.com/ericchiang/k8s/codec.go diff --git a/libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/config.go b/vendor/github.com/ericchiang/k8s/config.go similarity index 100% rename from libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/config.go rename to vendor/github.com/ericchiang/k8s/config.go diff --git a/libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/discovery.go b/vendor/github.com/ericchiang/k8s/discovery.go similarity index 100% rename from libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/discovery.go rename to vendor/github.com/ericchiang/k8s/discovery.go diff --git a/libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/gen.go b/vendor/github.com/ericchiang/k8s/gen.go similarity index 100% rename from libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/gen.go rename to vendor/github.com/ericchiang/k8s/gen.go diff --git a/libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/gen.sh b/vendor/github.com/ericchiang/k8s/gen.sh similarity index 100% rename from libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/gen.sh rename to vendor/github.com/ericchiang/k8s/gen.sh diff --git a/libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/labels.go b/vendor/github.com/ericchiang/k8s/labels.go similarity index 100% rename from libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/labels.go rename to vendor/github.com/ericchiang/k8s/labels.go diff --git a/libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/runtime/generated.pb.go b/vendor/github.com/ericchiang/k8s/runtime/generated.pb.go similarity index 100% rename from libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/runtime/generated.pb.go rename to vendor/github.com/ericchiang/k8s/runtime/generated.pb.go diff --git a/libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/runtime/schema/generated.pb.go b/vendor/github.com/ericchiang/k8s/runtime/schema/generated.pb.go similarity index 100% rename from libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/runtime/schema/generated.pb.go rename to vendor/github.com/ericchiang/k8s/runtime/schema/generated.pb.go diff --git a/libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/tprs.go b/vendor/github.com/ericchiang/k8s/tprs.go similarity index 100% rename from libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/tprs.go rename to vendor/github.com/ericchiang/k8s/tprs.go diff --git a/libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/types.go b/vendor/github.com/ericchiang/k8s/types.go similarity index 100% rename from libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/types.go rename to vendor/github.com/ericchiang/k8s/types.go diff --git a/libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/util/intstr/generated.pb.go b/vendor/github.com/ericchiang/k8s/util/intstr/generated.pb.go similarity index 100% rename from libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/util/intstr/generated.pb.go rename to vendor/github.com/ericchiang/k8s/util/intstr/generated.pb.go diff --git a/libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/watch/versioned/generated.pb.go b/vendor/github.com/ericchiang/k8s/watch/versioned/generated.pb.go similarity index 100% rename from libbeat/processors/kubernetes/vendor/github.com/ericchiang/k8s/watch/versioned/generated.pb.go rename to vendor/github.com/ericchiang/k8s/watch/versioned/generated.pb.go diff --git a/vendor/vendor.json b/vendor/vendor.json index 9424cb3255e..58c495e7c68 100644 --- a/vendor/vendor.json +++ b/vendor/vendor.json @@ -191,6 +191,187 @@ "revision": "664e6bc79eb43c956507b6e20a867140516ad15a", "revisionTime": "2016-09-16T08:04:11Z" }, + { + "checksumSHA1": "K0iEPnt2DZL5/YrrzAQoMnA+9Pc=", + "origin": "github.com/exekias/k8s", + "path": "github.com/ericchiang/k8s", + "revision": "28fccef3cb52078910f5f4c09f395c2f7e5fc1b0", + "revisionTime": "2017-04-08T16:30:40Z" + }, + { + "checksumSHA1": "uQuMoUlS7hAWsB+Mwr/1B7+35BU=", + "path": "github.com/ericchiang/k8s/api/resource", + "revision": "929412ddf58668dc5aa49e47fa822507f048d34b", + "revisionTime": "2017-04-20T15:30:38Z" + }, + { + "checksumSHA1": "XN1tbPrI03O0ishnZyfkWtTnrcQ=", + "path": "github.com/ericchiang/k8s/api/unversioned", + "revision": "929412ddf58668dc5aa49e47fa822507f048d34b", + "revisionTime": "2017-04-20T15:30:38Z" + }, + { + "checksumSHA1": "yfTg3/Qn7KiizNJ39JmPBFi9YDQ=", + "path": "github.com/ericchiang/k8s/api/v1", + "revision": "929412ddf58668dc5aa49e47fa822507f048d34b", + "revisionTime": "2017-04-20T15:30:38Z" + }, + { + "checksumSHA1": "uw/3eB6WiVCSrQZS9ZZs/1kyu1I=", + "path": "github.com/ericchiang/k8s/apis/apps/v1alpha1", + "revision": "929412ddf58668dc5aa49e47fa822507f048d34b", + "revisionTime": "2017-04-20T15:30:38Z" + }, + { + "checksumSHA1": "GPnvYx9Uxhpwmv01iygWR6+naTI=", + "path": "github.com/ericchiang/k8s/apis/apps/v1beta1", + "revision": "929412ddf58668dc5aa49e47fa822507f048d34b", + "revisionTime": "2017-04-20T15:30:38Z" + }, + { + "checksumSHA1": "Jjw5tBYv4k+Es+qPp03rnzyzRWA=", + "path": "github.com/ericchiang/k8s/apis/authentication/v1", + "revision": "929412ddf58668dc5aa49e47fa822507f048d34b", + "revisionTime": "2017-04-20T15:30:38Z" + }, + { + "checksumSHA1": "uR4S43Wc80fhS0vMDE3Z3hFg7J8=", + "path": "github.com/ericchiang/k8s/apis/authentication/v1beta1", + "revision": "929412ddf58668dc5aa49e47fa822507f048d34b", + "revisionTime": "2017-04-20T15:30:38Z" + }, + { + "checksumSHA1": "aM2KSDZbHn8jJomPPeG6LKpMwhs=", + "path": "github.com/ericchiang/k8s/apis/authorization/v1", + "revision": "929412ddf58668dc5aa49e47fa822507f048d34b", + "revisionTime": "2017-04-20T15:30:38Z" + }, + { + "checksumSHA1": "4yWZvduAw2JNdHd1cXjTJBUy0lw=", + "path": "github.com/ericchiang/k8s/apis/authorization/v1beta1", + "revision": "929412ddf58668dc5aa49e47fa822507f048d34b", + "revisionTime": "2017-04-20T15:30:38Z" + }, + { + "checksumSHA1": "1nMeCVQImIo1CpRRyOYMIqLoPBc=", + "path": "github.com/ericchiang/k8s/apis/autoscaling/v1", + "revision": "929412ddf58668dc5aa49e47fa822507f048d34b", + "revisionTime": "2017-04-20T15:30:38Z" + }, + { + "checksumSHA1": "kUXiQQA99K7zquvG9es3yauVjYw=", + "path": "github.com/ericchiang/k8s/apis/autoscaling/v2alpha1", + "revision": "929412ddf58668dc5aa49e47fa822507f048d34b", + "revisionTime": "2017-04-20T15:30:38Z" + }, + { + "checksumSHA1": "vMWsdmHlmaAQZIT0c26dwxe9pDw=", + "path": "github.com/ericchiang/k8s/apis/batch/v1", + "revision": "929412ddf58668dc5aa49e47fa822507f048d34b", + "revisionTime": "2017-04-20T15:30:38Z" + }, + { + "checksumSHA1": "bqaX0T9jycmp9ao1Ov41dfPn0Ng=", + "path": "github.com/ericchiang/k8s/apis/batch/v2alpha1", + "revision": "929412ddf58668dc5aa49e47fa822507f048d34b", + "revisionTime": "2017-04-20T15:30:38Z" + }, + { + "checksumSHA1": "9GRVPI+Tf4RrlX2aveUGEUHKIrM=", + "path": "github.com/ericchiang/k8s/apis/certificates/v1alpha1", + "revision": "929412ddf58668dc5aa49e47fa822507f048d34b", + "revisionTime": "2017-04-20T15:30:38Z" + }, + { + "checksumSHA1": "k1dF56GRoEg6rooFKO7UvEJvBcE=", + "path": "github.com/ericchiang/k8s/apis/certificates/v1beta1", + "revision": "929412ddf58668dc5aa49e47fa822507f048d34b", + "revisionTime": "2017-04-20T15:30:38Z" + }, + { + "checksumSHA1": "4pDHINIk6BdPBYWGF20IwHNCg2Q=", + "path": "github.com/ericchiang/k8s/apis/extensions/v1beta1", + "revision": "929412ddf58668dc5aa49e47fa822507f048d34b", + "revisionTime": "2017-04-20T15:30:38Z" + }, + { + "checksumSHA1": "NAL7OeKSEzTOoXHBFnC1B1VmBVs=", + "path": "github.com/ericchiang/k8s/apis/imagepolicy/v1alpha1", + "revision": "929412ddf58668dc5aa49e47fa822507f048d34b", + "revisionTime": "2017-04-20T15:30:38Z" + }, + { + "checksumSHA1": "Vg1/xjzLJHZlvuheWC4abghACwQ=", + "path": "github.com/ericchiang/k8s/apis/meta/v1", + "revision": "929412ddf58668dc5aa49e47fa822507f048d34b", + "revisionTime": "2017-04-20T15:30:38Z" + }, + { + "checksumSHA1": "wYSNb+W2L5gJlGO8n6mGOGft8R8=", + "path": "github.com/ericchiang/k8s/apis/policy/v1alpha1", + "revision": "929412ddf58668dc5aa49e47fa822507f048d34b", + "revisionTime": "2017-04-20T15:30:38Z" + }, + { + "checksumSHA1": "ioJ28pdUN6fDkOp8dT+Tg3HSqmk=", + "path": "github.com/ericchiang/k8s/apis/policy/v1beta1", + "revision": "929412ddf58668dc5aa49e47fa822507f048d34b", + "revisionTime": "2017-04-20T15:30:38Z" + }, + { + "checksumSHA1": "UErnBsjjtmg3oYjLYU1S80oi3sk=", + "path": "github.com/ericchiang/k8s/apis/rbac/v1alpha1", + "revision": "929412ddf58668dc5aa49e47fa822507f048d34b", + "revisionTime": "2017-04-20T15:30:38Z" + }, + { + "checksumSHA1": "Xl+Tm8ZOz0cMOrfLaQvu/lsWObU=", + "path": "github.com/ericchiang/k8s/apis/rbac/v1beta1", + "revision": "929412ddf58668dc5aa49e47fa822507f048d34b", + "revisionTime": "2017-04-20T15:30:38Z" + }, + { + "checksumSHA1": "YyZyaF0k2NAQAZvsCOVdhAkfVU0=", + "path": "github.com/ericchiang/k8s/apis/settings/v1alpha1", + "revision": "929412ddf58668dc5aa49e47fa822507f048d34b", + "revisionTime": "2017-04-20T15:30:38Z" + }, + { + "checksumSHA1": "vUc3mf0rE7CQ3B52wfrMDyspLgA=", + "path": "github.com/ericchiang/k8s/apis/storage/v1", + "revision": "929412ddf58668dc5aa49e47fa822507f048d34b", + "revisionTime": "2017-04-20T15:30:38Z" + }, + { + "checksumSHA1": "7/oj1z0vG1pvRza+UuKQ6txdleI=", + "path": "github.com/ericchiang/k8s/apis/storage/v1beta1", + "revision": "929412ddf58668dc5aa49e47fa822507f048d34b", + "revisionTime": "2017-04-20T15:30:38Z" + }, + { + "checksumSHA1": "mm5iTFmLQ6h98DKgiUuTCpHP9H4=", + "path": "github.com/ericchiang/k8s/runtime", + "revision": "929412ddf58668dc5aa49e47fa822507f048d34b", + "revisionTime": "2017-04-20T15:30:38Z" + }, + { + "checksumSHA1": "Kk1UDqUx2Pr1LyvIIgcJBApTlCk=", + "path": "github.com/ericchiang/k8s/runtime/schema", + "revision": "929412ddf58668dc5aa49e47fa822507f048d34b", + "revisionTime": "2017-04-20T15:30:38Z" + }, + { + "checksumSHA1": "LoxBND74egHIasOX6z98FeeW0zI=", + "path": "github.com/ericchiang/k8s/util/intstr", + "revision": "929412ddf58668dc5aa49e47fa822507f048d34b", + "revisionTime": "2017-04-20T15:30:38Z" + }, + { + "checksumSHA1": "fobEKiMk5D7IGvCSwh4HdG1o98c=", + "path": "github.com/ericchiang/k8s/watch/versioned", + "revision": "929412ddf58668dc5aa49e47fa822507f048d34b", + "revisionTime": "2017-04-20T15:30:38Z" + }, { "checksumSHA1": "2UmMbNHc8FBr98mJFN1k8ISOIHk=", "path": "github.com/garyburd/redigo/internal",