youtubebeat/vendor/github.com/elastic/beats/metricbeat/module/kubernetes/util/kubernetes_test.go

136 lines
3.1 KiB
Go

// Licensed to Elasticsearch B.V. under one or more contributor
// license agreements. See the NOTICE file distributed with
// this work for additional information regarding copyright
// ownership. Elasticsearch B.V. licenses this file to you under
// the Apache License, Version 2.0 (the "License"); you may
// not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
package util
import (
"testing"
"github.com/ericchiang/k8s/apis/meta/v1"
"github.com/stretchr/testify/assert"
"github.com/elastic/beats/libbeat/common"
"github.com/elastic/beats/libbeat/common/kubernetes"
)
func TestBuildMetadataEnricher(t *testing.T) {
watcher := mockWatcher{}
funcs := mockFuncs{}
resource := &mockResource{
name: "enrich",
namespace: "default",
labels: map[string]string{
"label": "value",
},
}
enricher := buildMetadataEnricher(&watcher, funcs.update, funcs.delete, funcs.index)
assert.NotNil(t, watcher.handler)
enricher.Start()
assert.True(t, watcher.started)
// Emit an event
watcher.handler.OnAdd(resource)
assert.Equal(t, resource, funcs.updated)
// Test enricher
events := []common.MapStr{
{"name": "unknown"},
{"name": "enrich"},
}
enricher.Enrich(events)
assert.Equal(t, []common.MapStr{
{"name": "unknown"},
{
"name": "enrich",
"_module": common.MapStr{"label": "value"},
},
}, events)
// Emit delete event
watcher.handler.OnDelete(resource)
assert.Equal(t, resource, funcs.deleted)
events = []common.MapStr{
{"name": "unknown"},
{"name": "enrich"},
}
enricher.Enrich(events)
assert.Equal(t, []common.MapStr{
{"name": "unknown"},
{"name": "enrich"},
}, events)
}
type mockFuncs struct {
updated kubernetes.Resource
deleted kubernetes.Resource
indexed common.MapStr
}
func (f *mockFuncs) update(m map[string]common.MapStr, obj kubernetes.Resource) {
f.updated = obj
meta := common.MapStr{}
for k, v := range obj.GetMetadata().Labels {
meta[k] = v
}
m[obj.GetMetadata().GetName()] = meta
}
func (f *mockFuncs) delete(m map[string]common.MapStr, obj kubernetes.Resource) {
f.deleted = obj
delete(m, obj.GetMetadata().GetName())
}
func (f *mockFuncs) index(m common.MapStr) string {
f.indexed = m
return m["name"].(string)
}
type mockResource struct {
name, namespace string
labels map[string]string
}
func (r *mockResource) GetMetadata() *v1.ObjectMeta {
return &v1.ObjectMeta{
Name: &r.name,
Namespace: &r.namespace,
Labels: r.labels,
}
}
type mockWatcher struct {
handler kubernetes.ResourceEventHandler
started bool
}
func (m *mockWatcher) Start() error {
m.started = true
return nil
}
func (m *mockWatcher) Stop() {
}
func (m *mockWatcher) AddEventHandler(r kubernetes.ResourceEventHandler) {
m.handler = r
}