Fix bug preventing database from being recreated (#3962)

This commit is contained in:
Daniel Nelson 2018-04-02 16:18:33 -07:00 committed by GitHub
parent f70694ae4f
commit f38d7f1a5b
2 changed files with 57 additions and 7 deletions

View File

@ -210,7 +210,7 @@ func (i *InfluxDB) Write(metrics []telegraf.Metric) error {
} }
switch apiError := err.(type) { switch apiError := err.(type) {
case APIError: case *APIError:
if !i.SkipDatabaseCreation { if !i.SkipDatabaseCreation {
if apiError.Type == DatabaseNotFound { if apiError.Type == DatabaseNotFound {
err := client.CreateDatabase(ctx) err := client.CreateDatabase(ctx)

View File

@ -2,11 +2,13 @@ package influxdb_test
import ( import (
"context" "context"
"net/http"
"testing" "testing"
"time" "time"
"github.com/influxdata/telegraf" "github.com/influxdata/telegraf"
"github.com/influxdata/telegraf/internal" "github.com/influxdata/telegraf/internal"
"github.com/influxdata/telegraf/metric"
"github.com/influxdata/telegraf/plugins/outputs/influxdb" "github.com/influxdata/telegraf/plugins/outputs/influxdb"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
) )
@ -37,7 +39,7 @@ func (c *MockClient) CreateDatabase(ctx context.Context) error {
func TestDeprecatedURLSupport(t *testing.T) { func TestDeprecatedURLSupport(t *testing.T) {
var actual *influxdb.UDPConfig var actual *influxdb.UDPConfig
output := influxdb.InfluxDB{ output := influxdb.InfluxDB{
URL: "udp://localhost:8086", URL: "udp://localhost:8089",
CreateUDPClientF: func(config *influxdb.UDPConfig) (influxdb.Client, error) { CreateUDPClientF: func(config *influxdb.UDPConfig) (influxdb.Client, error) {
actual = config actual = config
@ -46,7 +48,7 @@ func TestDeprecatedURLSupport(t *testing.T) {
} }
err := output.Connect() err := output.Connect()
require.NoError(t, err) require.NoError(t, err)
require.Equal(t, "udp://localhost:8086", actual.URL.String()) require.Equal(t, "udp://localhost:8089", actual.URL.String())
} }
func TestDefaultURL(t *testing.T) { func TestDefaultURL(t *testing.T) {
@ -70,7 +72,7 @@ func TestConnectUDPConfig(t *testing.T) {
var actual *influxdb.UDPConfig var actual *influxdb.UDPConfig
output := influxdb.InfluxDB{ output := influxdb.InfluxDB{
URLs: []string{"udp://localhost:8086"}, URLs: []string{"udp://localhost:8089"},
UDPPayload: 42, UDPPayload: 42,
CreateUDPClientF: func(config *influxdb.UDPConfig) (influxdb.Client, error) { CreateUDPClientF: func(config *influxdb.UDPConfig) (influxdb.Client, error) {
@ -81,7 +83,7 @@ func TestConnectUDPConfig(t *testing.T) {
err := output.Connect() err := output.Connect()
require.NoError(t, err) require.NoError(t, err)
require.Equal(t, "udp://localhost:8086", actual.URL.String()) require.Equal(t, "udp://localhost:8089", actual.URL.String())
require.Equal(t, 42, actual.MaxPayloadSize) require.Equal(t, 42, actual.MaxPayloadSize)
require.NotNil(t, actual.Serializer) require.NotNil(t, actual.Serializer)
} }
@ -90,7 +92,7 @@ func TestConnectHTTPConfig(t *testing.T) {
var actual *influxdb.HTTPConfig var actual *influxdb.HTTPConfig
output := influxdb.InfluxDB{ output := influxdb.InfluxDB{
URLs: []string{"http://localhost:8089"}, URLs: []string{"http://localhost:8086"},
Database: "telegraf", Database: "telegraf",
RetentionPolicy: "default", RetentionPolicy: "default",
WriteConsistency: "any", WriteConsistency: "any",
@ -98,7 +100,7 @@ func TestConnectHTTPConfig(t *testing.T) {
Username: "guy", Username: "guy",
Password: "smiley", Password: "smiley",
UserAgent: "telegraf", UserAgent: "telegraf",
HTTPProxy: "http://localhost:8089", HTTPProxy: "http://localhost:8086",
HTTPHeaders: map[string]string{ HTTPHeaders: map[string]string{
"x": "y", "x": "y",
}, },
@ -133,3 +135,51 @@ func TestConnectHTTPConfig(t *testing.T) {
require.Equal(t, output.Database, actual.Database) require.Equal(t, output.Database, actual.Database)
} }
func TestWriteRecreateDatabaseIfDatabaseNotFound(t *testing.T) {
var createDatabaseCalled bool
output := influxdb.InfluxDB{
URLs: []string{"http://localhost:8086"},
CreateHTTPClientF: func(config *influxdb.HTTPConfig) (influxdb.Client, error) {
return &MockClient{
CreateDatabaseF: func(ctx context.Context) error {
createDatabaseCalled = true
return nil
},
WriteF: func(ctx context.Context, metrics []telegraf.Metric) error {
return &influxdb.APIError{
StatusCode: http.StatusNotFound,
Title: "404 Not Found",
Description: `database not found "telegraf"`,
Type: influxdb.DatabaseNotFound,
}
},
URLF: func() string {
return "http://localhost:8086"
},
}, nil
},
}
err := output.Connect()
require.NoError(t, err)
m, err := metric.New(
"cpu",
map[string]string{},
map[string]interface{}{
"value": 42.0,
},
time.Unix(0, 0),
)
require.NoError(t, err)
metrics := []telegraf.Metric{m}
createDatabaseCalled = false
err = output.Write(metrics)
// We only have one URL, so we expect an error
require.Error(t, err)
}