From cd9a773427ff04ef92ef6d896d8a87d151eb2e5d Mon Sep 17 00:00:00 2001 From: Ryan McKinley Date: Mon, 24 Aug 2020 13:19:32 -0700 Subject: [PATCH] InfluxDB: use converters from SDK (#27138) --- go.mod | 2 +- go.sum | 12 +--- pkg/tsdb/influxdb/flux/builder.go | 31 +++++++-- pkg/tsdb/influxdb/flux/converters.go | 95 ---------------------------- 4 files changed, 27 insertions(+), 113 deletions(-) delete mode 100644 pkg/tsdb/influxdb/flux/converters.go diff --git a/go.mod b/go.mod index d085d5f7d91..f413c4e3e90 100644 --- a/go.mod +++ b/go.mod @@ -37,7 +37,7 @@ require ( github.com/google/go-cmp v0.5.0 github.com/gosimple/slug v1.4.2 github.com/grafana/grafana-plugin-model v0.0.0-20190930120109-1fc953a61fb4 - github.com/grafana/grafana-plugin-sdk-go v0.75.0 + github.com/grafana/grafana-plugin-sdk-go v0.77.0 github.com/hashicorp/go-hclog v0.0.0-20180709165350-ff2cf002a8dd github.com/hashicorp/go-plugin v1.2.2 github.com/hashicorp/go-version v1.1.0 diff --git a/go.sum b/go.sum index f1c31ea3685..81565279d04 100644 --- a/go.sum +++ b/go.sum @@ -87,7 +87,6 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dchest/uniuri v0.0.0-20160212164326-8902c56451e9/go.mod h1:GgB8SF9nRG+GqaDtLcwJZsQFhcogVCJ79j4EdT0c2V4= -github.com/deepmap/oapi-codegen v1.3.6 h1:Wj44p9A0V0PJ+AUg0BWdyGcsS1LY18U+0rCuPQgK0+o= github.com/deepmap/oapi-codegen v1.3.6/go.mod h1:aBozjEveG+33xPiP55Iw/XbVkhtZHEGLq3nxlX0+hfU= github.com/deepmap/oapi-codegen v1.3.11 h1:Nd3tDQfqgquLmCzyRONHzs5SJEwPPoQcFZxT8MKt1Hs= github.com/deepmap/oapi-codegen v1.3.11/go.mod h1:suMvK7+rKlx3+tpa8ByptmvoXbAV70wERKTOGH3hLp0= @@ -213,8 +212,8 @@ github.com/gosimple/slug v1.4.2 h1:jDmprx3q/9Lfk4FkGZtvzDQ9Cj9eAmsjzeQGp24PeiQ= github.com/gosimple/slug v1.4.2/go.mod h1:ER78kgg1Mv0NQGlXiDe57DpCyfbNywXXZ9mIorhxAf0= github.com/grafana/grafana-plugin-model v0.0.0-20190930120109-1fc953a61fb4 h1:SPdxCL9BChFTlyi0Khv64vdCW4TMna8+sxL7+Chx+Ag= github.com/grafana/grafana-plugin-model v0.0.0-20190930120109-1fc953a61fb4/go.mod h1:nc0XxBzjeGcrMltCDw269LoWF9S8ibhgxolCdA1R8To= -github.com/grafana/grafana-plugin-sdk-go v0.75.0 h1:b0Ugpn88VNx17Q8MA1MsWkD3ddBEbRvFxzid+Nka3F0= -github.com/grafana/grafana-plugin-sdk-go v0.75.0/go.mod h1:NvxLzGkVhnoBKwzkst6CFfpMFKwAdIUZ1q8ssuLeF60= +github.com/grafana/grafana-plugin-sdk-go v0.77.0 h1:iHvNGs6F+KHXozOiL6KBgwVfm7JKztoML1yV7Zy2sls= +github.com/grafana/grafana-plugin-sdk-go v0.77.0/go.mod h1:NvxLzGkVhnoBKwzkst6CFfpMFKwAdIUZ1q8ssuLeF60= github.com/grpc-ecosystem/go-grpc-middleware v1.2.0 h1:0IKlLyQ3Hs9nDaiK5cSHAGmcQEIC8l2Ts1u6x5Dfrqg= github.com/grpc-ecosystem/go-grpc-middleware v1.2.0/go.mod h1:mJzapYve32yjrKlk9GbyCZHuPgZsrbyIbyKhSzOpg6s= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= @@ -277,9 +276,7 @@ github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORN github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/labstack/echo/v4 v4.1.11 h1:z0BZoArY4FqdpUEl+wlHp4hnr/oSR6MTmQmv8OHSoww= github.com/labstack/echo/v4 v4.1.11/go.mod h1:i541M3Fj6f76NZtHSj7TXnyM8n2gaodfvfxNnFqi74g= -github.com/labstack/gommon v0.3.0 h1:JEeO0bvc78PKdyHxloTKiF8BD5iGrH8T6MSeGvSgob0= github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.2.0 h1:LXpIM/LZ5xGFhOpXAQUIMM1HdyqzVYM13zNdjCEEcA0= @@ -421,10 +418,8 @@ github.com/unknwon/com v1.0.1 h1:3d1LTxD+Lnf3soQiD4Cp/0BRB+Rsa/+RTvz8GMMzIXs= github.com/unknwon/com v1.0.1/go.mod h1:tOOxU81rwgoCLoOVVPHb6T/wt8HZygqH5id+GNnlCXM= github.com/urfave/cli/v2 v2.1.1 h1:Qt8FeAtxE/vfdrLmR3rxR6JRE0RoVmbXu8+6kZtYU4k= github.com/urfave/cli/v2 v2.1.1/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ= -github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= -github.com/valyala/fasttemplate v1.1.0 h1:RZqt0yGBsps8NGvLSGW804QQqCUYYLsaOjTVHy1Ocw4= github.com/valyala/fasttemplate v1.1.0/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= github.com/xorcare/pointer v1.1.0 h1:sFwXOhRF8QZ0tyVZrtxWGIoVZNEmRzBCaFWdONPQIUM= github.com/xorcare/pointer v1.1.0/go.mod h1:6KLhkOh6YbuvZkT4YbxIbR/wzLBjyMxOiNzZhJTor2Y= @@ -522,7 +517,6 @@ golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344 h1:vGXIOMxbNfDTk/aXCmfdLgkrSV+Z2tcbze+pEc3v5W4= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc h1:zK/HqS5bZxDptfPJNq8v7vJfXtkU7r9TLIoSr1bXaP4= golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= @@ -578,14 +572,12 @@ golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121 h1:rITEj+UZHYC927n8GT97eC3zrpzXdb/voyeOuVKS46o= golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200812155832-6a926be9bd1d h1:QQrM/CCYEzTs91GZylDCQjGHudbPTxF/1fvXdVh5lMo= golang.org/x/sys v0.0.0-20200812155832-6a926be9bd1d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= diff --git a/pkg/tsdb/influxdb/flux/builder.go b/pkg/tsdb/influxdb/flux/builder.go index 0b052a00c0e..83e15b5e4eb 100644 --- a/pkg/tsdb/influxdb/flux/builder.go +++ b/pkg/tsdb/influxdb/flux/builder.go @@ -5,6 +5,7 @@ import ( "time" "github.com/grafana/grafana-plugin-sdk-go/data" + "github.com/grafana/grafana-plugin-sdk-go/data/converters" "github.com/influxdata/influxdb-client-go/v2/api/query" ) @@ -47,26 +48,42 @@ func isTag(schk string) bool { return (schk != "result" && schk != "table" && schk[0] != '_') } +var timeToOptionalTime = data.FieldConverter{ + OutputFieldType: data.FieldTypeNullableTime, + Converter: func(v interface{}) (interface{}, error) { + var ptr *time.Time + if v == nil { + return ptr, nil + } + val, ok := v.(time.Time) + if !ok { + return ptr, fmt.Errorf(`expected %s input but got type %T for value "%v"`, "time.Time", v, v) + } + ptr = &val + return ptr, nil + }, +} + func getConverter(t string) (*data.FieldConverter, error) { switch t { case stringDatatype: - return &anyToOptionalString, nil + return &converters.AnyToNullableString, nil case timeDatatypeRFC: return &timeToOptionalTime, nil case timeDatatypeRFCNano: return &timeToOptionalTime, nil case durationDatatype: - return &int64ToOptionalInt64, nil + return &converters.Int64ToNullableInt64, nil case doubleDatatype: - return &float64ToOptionalFloat64, nil + return &converters.Float64ToNullableFloat64, nil case boolDatatype: - return &boolToOptionalBool, nil + return &converters.BoolToNullableBool, nil case longDatatype: - return &int64ToOptionalInt64, nil + return &converters.Int64ToNullableInt64, nil case uLongDatatype: - return &uint64ToOptionalUInt64, nil + return &converters.Uint64ToNullableUInt64, nil case base64BinaryDataType: - return &anyToOptionalString, nil + return &converters.AnyToNullableString, nil } return nil, fmt.Errorf("no matching converter found for [%v]", t) diff --git a/pkg/tsdb/influxdb/flux/converters.go b/pkg/tsdb/influxdb/flux/converters.go deleted file mode 100644 index 74e4fda9eee..00000000000 --- a/pkg/tsdb/influxdb/flux/converters.go +++ /dev/null @@ -1,95 +0,0 @@ -package flux - -import ( - "fmt" - "time" - - "github.com/grafana/grafana-plugin-sdk-go/data" -) - -// anyToOptionalString any value as a string. -var anyToOptionalString = data.FieldConverter{ - OutputFieldType: data.FieldTypeNullableString, - Converter: func(v interface{}) (interface{}, error) { - if v == nil { - return nil, nil - } - str := fmt.Sprintf("%+v", v) // the +v adds field names - return &str, nil - }, -} - -// float64ToOptionalFloat64 optional float value -var float64ToOptionalFloat64 = data.FieldConverter{ - OutputFieldType: data.FieldTypeNullableFloat64, - Converter: func(v interface{}) (interface{}, error) { - if v == nil { - return nil, nil - } - val, ok := v.(float64) - if !ok { // or return some default value instead of erroring - return nil, fmt.Errorf("[float] expected float64 input but got type %T", v) - } - return &val, nil - }, -} - -// int64ToOptionalInt64 optional int value -var int64ToOptionalInt64 = data.FieldConverter{ - OutputFieldType: data.FieldTypeNullableInt64, - Converter: func(v interface{}) (interface{}, error) { - if v == nil { - return nil, nil - } - val, ok := v.(int64) - if !ok { // or return some default value instead of erroring - return nil, fmt.Errorf("[int] expected int64 input but got type %T", v) - } - return &val, nil - }, -} - -// uint64ToOptionalUInt64 optional int value -var uint64ToOptionalUInt64 = data.FieldConverter{ - OutputFieldType: data.FieldTypeNullableUint64, - Converter: func(v interface{}) (interface{}, error) { - if v == nil { - return nil, nil - } - val, ok := v.(uint64) - if !ok { // or return some default value instead of erroring - return nil, fmt.Errorf("[uint] expected uint64 input but got type %T", v) - } - return &val, nil - }, -} - -// boolToOptionalBool optional int value -var boolToOptionalBool = data.FieldConverter{ - OutputFieldType: data.FieldTypeNullableBool, - Converter: func(v interface{}) (interface{}, error) { - if v == nil { - return nil, nil - } - val, ok := v.(bool) - if !ok { // or return some default value instead of erroring - return nil, fmt.Errorf("[bool] expected bool input but got type %T", v) - } - return &val, nil - }, -} - -// timeToOptionalTime optional int value -var timeToOptionalTime = data.FieldConverter{ - OutputFieldType: data.FieldTypeNullableTime, - Converter: func(v interface{}) (interface{}, error) { - if v == nil { - return nil, nil - } - val, ok := v.(time.Time) - if !ok { // or return some default value instead of erroring - return nil, fmt.Errorf("[time] expected time input but got type %T", v) - } - return &val, nil - }, -}