From 9d7c74ef91e817ae4e3745e30b94b973d72c05c6 Mon Sep 17 00:00:00 2001 From: Marcus Efraimsson Date: Wed, 19 Feb 2020 19:17:05 +0100 Subject: [PATCH] Backend Plugins: Provide proper plugin config to plugins (#21985) Properly provides plugin configs to backend plugins. Uses v0.16.0 of grafana-plugin-sdk-go- Ref #21512 Ref #19667 --- go.mod | 2 +- go.sum | 7 +- pkg/api/datasources.go | 27 +- pkg/api/plugins.go | 73 +++- pkg/models/plugin_setting_cache.go | 37 ++ pkg/models/plugin_setting_cache_test.go | 62 +++ pkg/plugins/backendplugin/backend_plugin.go | 23 +- pkg/plugins/backendplugin/contracts.go | 25 +- .../wrapper/datasource_plugin_wrapper_v2.go | 31 +- pkg/plugins/datasource_plugin.go | 2 +- pkg/plugins/transform_plugin.go | 10 +- .../dataframe/dataframe.go | 40 ++ .../dataframe/generic_nullable_vector.go | 12 + .../dataframe/generic_vector.go | 8 + .../dataframe/nullable_vector.gen.go | 156 ++++++++ .../grafana-plugin-sdk-go/dataframe/sql.go | 186 +++++++++ .../dataframe/vector.gen.go | 104 ++++++ .../grafana-plugin-sdk-go/dataframe/vector.go | 242 ++++++++++++ .../genproto/pluginv2/backend.pb.go | 353 +++++++++++------- vendor/modules.txt | 2 +- 20 files changed, 1223 insertions(+), 179 deletions(-) create mode 100644 pkg/models/plugin_setting_cache.go create mode 100644 pkg/models/plugin_setting_cache_test.go create mode 100644 vendor/github.com/grafana/grafana-plugin-sdk-go/dataframe/sql.go diff --git a/go.mod b/go.mod index 142049830ce..0d443c42730 100644 --- a/go.mod +++ b/go.mod @@ -32,7 +32,7 @@ require ( github.com/gorilla/websocket v1.4.1 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.14.0 + github.com/grafana/grafana-plugin-sdk-go v0.16.0 github.com/hashicorp/go-hclog v0.8.0 github.com/hashicorp/go-plugin v1.0.1 github.com/hashicorp/go-version v1.1.0 diff --git a/go.sum b/go.sum index 0ea814c3ad5..756137bcd81 100644 --- a/go.sum +++ b/go.sum @@ -95,6 +95,7 @@ github.com/go-xorm/xorm v0.7.1 h1:Kj7mfuqctPdX60zuxP6EoEut0f3E6K66H6hcoxiHUMc= github.com/go-xorm/xorm v0.7.1/go.mod h1:EHS1htMQFptzMaIHKyzqpHGw6C9Rtug75nsq6DA9unI= github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= +github.com/gogo/protobuf v1.1.1 h1:72R+M5VuhED/KujmZVcIquuo8mBgX4oVda//DQb3PXo= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= @@ -125,8 +126,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.14.0 h1:7Y34uhBkmkZ1ywYNfTXYXZihRgxgCf9WQbad4iqJ+t8= -github.com/grafana/grafana-plugin-sdk-go v0.14.0/go.mod h1:Dgc2ygLBJXTTIcfIgCGG6mxRcC/aZ36rKZ1tq5B5XmY= +github.com/grafana/grafana-plugin-sdk-go v0.16.0 h1:fuoLzsQLs0RKcvXDP/cAQxaZGP1rbnoBwUaY/1yvh6k= +github.com/grafana/grafana-plugin-sdk-go v0.16.0/go.mod h1:D1MkO+4EPCWc1Wrr260hq7wbo7Ox0grnNWBygulq7aM= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/hashicorp/go-hclog v0.0.0-20180709165350-ff2cf002a8dd/go.mod h1:9bjs9uLqI8l75knNv3lV1kA55veR+WUPSiKIWcQHudI= @@ -417,8 +418,6 @@ gopkg.in/mail.v2 v2.3.1/go.mod h1:htwXN1Qh09vZJ1NVKxQqHPBaCBbzKhp5GzuJEA4VJWw= gopkg.in/redis.v2 v2.3.2/go.mod h1:4wl9PJ/CqzeHk3LVq1hNLHH8krm3+AXEgut4jVc++LU= gopkg.in/redis.v5 v5.2.9 h1:MNZYOLPomQzZMfpN3ZtD1uyJ2IDonTTlxYiV/pEApiw= gopkg.in/redis.v5 v5.2.9/go.mod h1:6gtv0/+A4iM08kdRfocWYB3bLX2tebpNtfKlFT6H4mY= -gopkg.in/square/go-jose.v2 v2.3.0 h1:nLzhkFyl5bkblqYBoiWJUt5JkWOzmiaBtCxdJAqJd3U= -gopkg.in/square/go-jose.v2 v2.3.0/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/square/go-jose.v2 v2.4.1 h1:H0TmLt7/KmzlrDOpa1F+zr0Tk90PbJYBfsVUmRLrf9Y= gopkg.in/square/go-jose.v2 v2.4.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/stretchr/testify.v1 v1.2.2/go.mod h1:QI5V/q6UbPmuhtm10CaFZxED9NreB8PnFYN9JcR6TxU= diff --git a/pkg/api/datasources.go b/pkg/api/datasources.go index 2c9f2543229..0442ec0a336 100644 --- a/pkg/api/datasources.go +++ b/pkg/api/datasources.go @@ -275,15 +275,28 @@ func (hs *HTTPServer) CallDatasourceResource(c *m.ReqContext) Response { if err != nil { return Error(500, "Failed to read request body", err) } + + jsonDataBytes, err := ds.JsonData.MarshalJSON() + if err != nil { + return Error(500, "Failed to marshal JSON data to bytes", err) + } + req := backendplugin.CallResourceRequest{ Config: backendplugin.PluginConfig{ - OrgID: c.OrgId, - PluginID: plugin.Id, - Instance: &backendplugin.PluginInstance{ - ID: ds.Id, - Name: ds.Name, - Type: ds.Type, - URL: ds.Url, + OrgID: c.OrgId, + PluginID: plugin.Id, + PluginType: plugin.Type, + JSONData: jsonDataBytes, + DecryptedSecureJSONData: ds.DecryptedValues(), + Updated: ds.Updated, + DataSourceConfig: &backendplugin.DataSourceConfig{ + ID: ds.Id, + Name: ds.Name, + URL: ds.Url, + Database: ds.Database, + User: ds.User, + BasicAuthEnabled: ds.BasicAuth, + BasicAuthUser: ds.BasicAuthUser, }, }, Path: c.Params("*"), diff --git a/pkg/api/plugins.go b/pkg/api/plugins.go index 2ac8a5a3a84..aba7a6f0eed 100644 --- a/pkg/api/plugins.go +++ b/pkg/api/plugins.go @@ -1,18 +1,20 @@ package api import ( + "encoding/json" "sort" + "time" "github.com/grafana/grafana/pkg/plugins/backendplugin" "github.com/grafana/grafana/pkg/api/dtos" "github.com/grafana/grafana/pkg/bus" - m "github.com/grafana/grafana/pkg/models" + "github.com/grafana/grafana/pkg/models" "github.com/grafana/grafana/pkg/plugins" "github.com/grafana/grafana/pkg/setting" ) -func (hs *HTTPServer) GetPluginList(c *m.ReqContext) Response { +func (hs *HTTPServer) GetPluginList(c *models.ReqContext) Response { typeFilter := c.Query("type") enabledFilter := c.Query("enabled") embeddedFilter := c.Query("embedded") @@ -85,7 +87,7 @@ func (hs *HTTPServer) GetPluginList(c *m.ReqContext) Response { return JSON(200, result) } -func GetPluginSettingByID(c *m.ReqContext) Response { +func GetPluginSettingByID(c *models.ReqContext) Response { pluginID := c.Params(":pluginId") def, exists := plugins.Plugins[pluginID] @@ -108,9 +110,9 @@ func GetPluginSettingByID(c *m.ReqContext) Response { State: def.State, } - query := m.GetPluginSettingByIdQuery{PluginId: pluginID, OrgId: c.OrgId} + query := models.GetPluginSettingByIdQuery{PluginId: pluginID, OrgId: c.OrgId} if err := bus.Dispatch(&query); err != nil { - if err != m.ErrPluginSettingNotFound { + if err != models.ErrPluginSettingNotFound { return Error(500, "Failed to get login settings", nil) } } else { @@ -122,7 +124,7 @@ func GetPluginSettingByID(c *m.ReqContext) Response { return JSON(200, dto) } -func UpdatePluginSetting(c *m.ReqContext, cmd m.UpdatePluginSettingCmd) Response { +func UpdatePluginSetting(c *models.ReqContext, cmd models.UpdatePluginSettingCmd) Response { pluginID := c.Params(":pluginId") cmd.OrgId = c.OrgId @@ -139,7 +141,7 @@ func UpdatePluginSetting(c *m.ReqContext, cmd m.UpdatePluginSettingCmd) Response return Success("Plugin settings updated") } -func GetPluginDashboards(c *m.ReqContext) Response { +func GetPluginDashboards(c *models.ReqContext) Response { pluginID := c.Params(":pluginId") list, err := plugins.GetPluginDashboards(c.OrgId, pluginID) @@ -154,7 +156,7 @@ func GetPluginDashboards(c *m.ReqContext) Response { return JSON(200, list) } -func GetPluginMarkdown(c *m.ReqContext) Response { +func GetPluginMarkdown(c *models.ReqContext) Response { pluginID := c.Params(":pluginId") name := c.Params(":name") @@ -180,7 +182,7 @@ func GetPluginMarkdown(c *m.ReqContext) Response { return resp } -func ImportDashboard(c *m.ReqContext, apiCmd dtos.ImportDashboardCommand) Response { +func ImportDashboard(c *models.ReqContext, apiCmd dtos.ImportDashboardCommand) Response { if apiCmd.PluginId == "" && apiCmd.Dashboard == nil { return Error(422, "Dashboard must be set", nil) } @@ -204,7 +206,7 @@ func ImportDashboard(c *m.ReqContext, apiCmd dtos.ImportDashboardCommand) Respon } // /api/plugins/:pluginId/health -func (hs *HTTPServer) CheckHealth(c *m.ReqContext) Response { +func (hs *HTTPServer) CheckHealth(c *models.ReqContext) Response { pluginID := c.Params("pluginId") resp, err := hs.BackendPluginManager.CheckHealth(c.Req.Context(), pluginID) if err != nil { @@ -236,21 +238,45 @@ func (hs *HTTPServer) CheckHealth(c *m.ReqContext) Response { } // /api/plugins/:pluginId/resources/* -func (hs *HTTPServer) CallResource(c *m.ReqContext) Response { +func (hs *HTTPServer) CallResource(c *models.ReqContext) Response { pluginID := c.Params("pluginId") - _, exists := plugins.Plugins[pluginID] + plugin, exists := plugins.Plugins[pluginID] if !exists { return Error(404, "Plugin not found, no installed plugin with that id", nil) } + var jsonDataBytes []byte + var decryptedSecureJSONData map[string]string + var updated time.Time + + ps, err := hs.getCachedPluginSettings(pluginID, c.SignedInUser) + if err != nil { + if err != models.ErrPluginSettingNotFound { + return Error(500, "Failed to get plugin settings", err) + } + } else { + jsonDataBytes, err = json.Marshal(&ps.JsonData) + if err != nil { + return Error(500, "Failed to marshal JSON data to bytes", err) + } + + decryptedSecureJSONData = ps.DecryptedValues() + updated = ps.Updated + } + body, err := c.Req.Body().Bytes() if err != nil { return Error(500, "Failed to read request body", err) } + req := backendplugin.CallResourceRequest{ Config: backendplugin.PluginConfig{ - OrgID: c.OrgId, - PluginID: pluginID, + OrgID: c.OrgId, + PluginID: plugin.Id, + PluginType: plugin.Type, + JSONData: jsonDataBytes, + DecryptedSecureJSONData: decryptedSecureJSONData, + Updated: updated, }, Path: c.Params("*"), Method: c.Req.Method, @@ -273,3 +299,22 @@ func (hs *HTTPServer) CallResource(c *m.ReqContext) Response { header: resp.Headers, } } + +func (hs *HTTPServer) getCachedPluginSettings(pluginID string, user *models.SignedInUser) (*models.PluginSetting, error) { + cacheKey := "plugin-setting-" + pluginID + + if cached, found := hs.CacheService.Get(cacheKey); found { + ps := cached.(*models.PluginSetting) + if ps.OrgId == user.OrgId { + return ps, nil + } + } + + query := models.GetPluginSettingByIdQuery{PluginId: pluginID, OrgId: user.OrgId} + if err := hs.Bus.Dispatch(&query); err != nil { + return nil, err + } + + hs.CacheService.Set(cacheKey, query.Result, time.Second*5) + return query.Result, nil +} diff --git a/pkg/models/plugin_setting_cache.go b/pkg/models/plugin_setting_cache.go new file mode 100644 index 00000000000..f380de50f38 --- /dev/null +++ b/pkg/models/plugin_setting_cache.go @@ -0,0 +1,37 @@ +package models + +var pluginSettingDecryptionCache = secureJSONDecryptionCache{ + cache: make(map[int64]cachedDecryptedJSON), +} + +// DecryptedValues returns cached decrypted values from secureJsonData. +func (ps *PluginSetting) DecryptedValues() map[string]string { + pluginSettingDecryptionCache.Lock() + defer pluginSettingDecryptionCache.Unlock() + + if item, present := pluginSettingDecryptionCache.cache[ps.Id]; present && ps.Updated.Equal(item.updated) { + return item.json + } + + json := ps.SecureJsonData.Decrypt() + pluginSettingDecryptionCache.cache[ps.Id] = cachedDecryptedJSON{ + updated: ps.Updated, + json: json, + } + + return json +} + +// DecryptedValue returns cached decrypted value from cached secureJsonData. +func (ps *PluginSetting) DecryptedValue(key string) (string, bool) { + value, exists := ps.DecryptedValues()[key] + return value, exists +} + +// ClearPluginSettingDecryptionCache clears the datasource decryption cache. +func ClearPluginSettingDecryptionCache() { + pluginSettingDecryptionCache.Lock() + defer pluginSettingDecryptionCache.Unlock() + + pluginSettingDecryptionCache.cache = make(map[int64]cachedDecryptedJSON) +} diff --git a/pkg/models/plugin_setting_cache_test.go b/pkg/models/plugin_setting_cache_test.go new file mode 100644 index 00000000000..6c1fbfd8840 --- /dev/null +++ b/pkg/models/plugin_setting_cache_test.go @@ -0,0 +1,62 @@ +package models + +import ( + "testing" + "time" + + "github.com/stretchr/testify/require" + + "github.com/grafana/grafana/pkg/components/securejsondata" +) + +func TestPluginSettingDecryptionCache(t *testing.T) { + t.Run("When plugin settings hasn't been updated, encrypted JSON should be fetched from cache", func(t *testing.T) { + ClearPluginSettingDecryptionCache() + + ps := PluginSetting{ + Id: 1, + JsonData: map[string]interface{}{}, + SecureJsonData: securejsondata.GetEncryptedJsonData(map[string]string{ + "password": "password", + }), + } + + // Populate cache + password, ok := ps.DecryptedValue("password") + require.Equal(t, "password", password) + require.True(t, ok) + + ps.SecureJsonData = securejsondata.GetEncryptedJsonData(map[string]string{ + "password": "", + }) + + require.Equal(t, "password", password) + require.True(t, ok) + }) + + t.Run("When plugin settings is updated, encrypted JSON should not be fetched from cache", func(t *testing.T) { + ClearPluginSettingDecryptionCache() + + ps := PluginSetting{ + Id: 1, + JsonData: map[string]interface{}{}, + SecureJsonData: securejsondata.GetEncryptedJsonData(map[string]string{ + "password": "password", + }), + } + + // Populate cache + password, ok := ps.DecryptedValue("password") + require.Equal(t, "password", password) + require.True(t, ok) + + ps.SecureJsonData = securejsondata.GetEncryptedJsonData(map[string]string{ + "password": "", + }) + ps.Updated = time.Now() + + password, ok = ps.DecryptedValue("password") + require.Empty(t, password) + require.True(t, ok) + }) +} diff --git a/pkg/plugins/backendplugin/backend_plugin.go b/pkg/plugins/backendplugin/backend_plugin.go index f356f487644..a5680ea2cbf 100644 --- a/pkg/plugins/backendplugin/backend_plugin.go +++ b/pkg/plugins/backendplugin/backend_plugin.go @@ -6,6 +6,7 @@ import ( "errors" "fmt" "net/http" + "time" "github.com/grafana/grafana-plugin-sdk-go/genproto/pluginv2" "github.com/prometheus/client_golang/prometheus" @@ -205,13 +206,33 @@ func (p *BackendPlugin) callResource(ctx context.Context, req CallResourceReques } protoReq := &pluginv2.CallResource_Request{ - Config: &pluginv2.PluginConfig{}, + Config: &pluginv2.PluginConfig{ + OrgId: req.Config.OrgID, + PluginId: req.Config.PluginID, + PluginType: req.Config.PluginType, + JsonData: req.Config.JSONData, + DecryptedSecureJsonData: req.Config.DecryptedSecureJSONData, + UpdatedMS: req.Config.Updated.UnixNano() / int64(time.Millisecond), + }, Path: req.Path, Method: req.Method, Url: req.URL, Headers: reqHeaders, Body: req.Body, } + + if req.Config.DataSourceConfig != nil { + protoReq.Config.DatasourceConfig = &pluginv2.DataSourceConfig{ + Id: req.Config.DataSourceConfig.ID, + Name: req.Config.DataSourceConfig.Name, + Url: req.Config.DataSourceConfig.URL, + Database: req.Config.DataSourceConfig.Database, + User: req.Config.DataSourceConfig.User, + BasicAuthEnabled: req.Config.DataSourceConfig.BasicAuthEnabled, + BasicAuthUser: req.Config.DataSourceConfig.BasicAuthUser, + } + } + protoResp, err := p.core.CallResource(ctx, protoReq) if err != nil { if st, ok := status.FromError(err); ok { diff --git a/pkg/plugins/backendplugin/contracts.go b/pkg/plugins/backendplugin/contracts.go index 5c1a0c850c0..378a23f1105 100644 --- a/pkg/plugins/backendplugin/contracts.go +++ b/pkg/plugins/backendplugin/contracts.go @@ -3,6 +3,7 @@ package backendplugin import ( "encoding/json" "strconv" + "time" "github.com/grafana/grafana-plugin-sdk-go/genproto/pluginv2" ) @@ -54,18 +55,24 @@ func checkHealthResultFromProto(protoResp *pluginv2.CheckHealth_Response) *Check } } -type PluginInstance struct { - ID int64 - Name string - Type string - URL string - JSONData json.RawMessage +type DataSourceConfig struct { + ID int64 + Name string + URL string + User string + Database string + BasicAuthEnabled bool + BasicAuthUser string } type PluginConfig struct { - PluginID string - OrgID int64 - Instance *PluginInstance + OrgID int64 + PluginID string + PluginType string + JSONData json.RawMessage + DecryptedSecureJSONData map[string]string + Updated time.Time + DataSourceConfig *DataSourceConfig } type CallResourceRequest struct { diff --git a/pkg/plugins/datasource/wrapper/datasource_plugin_wrapper_v2.go b/pkg/plugins/datasource/wrapper/datasource_plugin_wrapper_v2.go index 4836c68bc41..704d8f59cb1 100644 --- a/pkg/plugins/datasource/wrapper/datasource_plugin_wrapper_v2.go +++ b/pkg/plugins/datasource/wrapper/datasource_plugin_wrapper_v2.go @@ -2,6 +2,7 @@ package wrapper import ( "context" + "time" "github.com/grafana/grafana/pkg/plugins/backendplugin" @@ -12,30 +13,40 @@ import ( "github.com/grafana/grafana/pkg/tsdb" ) -func NewDatasourcePluginWrapperV2(log log.Logger, plugin backendplugin.DatasourcePlugin) *DatasourcePluginWrapperV2 { - return &DatasourcePluginWrapperV2{DatasourcePlugin: plugin, logger: log} +func NewDatasourcePluginWrapperV2(log log.Logger, pluginId, pluginType string, plugin backendplugin.DatasourcePlugin) *DatasourcePluginWrapperV2 { + return &DatasourcePluginWrapperV2{DatasourcePlugin: plugin, logger: log, pluginId: pluginId, pluginType: pluginType} } type DatasourcePluginWrapperV2 struct { backendplugin.DatasourcePlugin - logger log.Logger + logger log.Logger + pluginId string + pluginType string } func (tw *DatasourcePluginWrapperV2) Query(ctx context.Context, ds *models.DataSource, query *tsdb.TsdbQuery) (*tsdb.Response, error) { - jsonData, err := ds.JsonData.MarshalJSON() + jsonDataBytes, err := ds.JsonData.MarshalJSON() if err != nil { return nil, err } pbQuery := &pluginv2.DataQueryRequest{ Config: &pluginv2.PluginConfig{ - Name: ds.Name, - Type: ds.Type, - Url: ds.Url, - Id: ds.Id, OrgId: ds.OrgId, - JsonData: string(jsonData), - DecryptedSecureJsonData: ds.SecureJsonData.Decrypt(), + PluginId: tw.pluginId, + PluginType: tw.pluginType, + UpdatedMS: ds.Updated.UnixNano() / int64(time.Millisecond), + JsonData: jsonDataBytes, + DecryptedSecureJsonData: ds.DecryptedValues(), + DatasourceConfig: &pluginv2.DataSourceConfig{ + Id: ds.Id, + Name: ds.Name, + Url: ds.Url, + Database: ds.Database, + User: ds.User, + BasicAuthEnabled: ds.BasicAuth, + BasicAuthUser: ds.BasicAuthUser, + }, }, Queries: []*pluginv2.DataQuery{}, } diff --git a/pkg/plugins/datasource_plugin.go b/pkg/plugins/datasource_plugin.go index bf2b3f4f2a3..30a96c28b5c 100644 --- a/pkg/plugins/datasource_plugin.go +++ b/pkg/plugins/datasource_plugin.go @@ -70,7 +70,7 @@ func (p *DataSourcePlugin) onLegacyPluginStart(pluginID string, client *backendp func (p *DataSourcePlugin) onPluginStart(pluginID string, client *backendplugin.Client, logger log.Logger) error { if client.DatasourcePlugin != nil { tsdb.RegisterTsdbQueryEndpoint(pluginID, func(dsInfo *models.DataSource) (tsdb.TsdbQueryEndpoint, error) { - return wrapper.NewDatasourcePluginWrapperV2(logger, client.DatasourcePlugin), nil + return wrapper.NewDatasourcePluginWrapperV2(logger, p.Id, p.Type, client.DatasourcePlugin), nil }) } diff --git a/pkg/plugins/transform_plugin.go b/pkg/plugins/transform_plugin.go index 70fc26c1b83..48f6e6bf61c 100644 --- a/pkg/plugins/transform_plugin.go +++ b/pkg/plugins/transform_plugin.go @@ -55,7 +55,7 @@ func (p *TransformPlugin) onPluginStart(pluginID string, client *backendplugin.C if client.DatasourcePlugin != nil { tsdb.RegisterTsdbQueryEndpoint(pluginID, func(dsInfo *models.DataSource) (tsdb.TsdbQueryEndpoint, error) { - return wrapper.NewDatasourcePluginWrapperV2(logger, client.DatasourcePlugin), nil + return wrapper.NewDatasourcePluginWrapperV2(logger, p.Id, p.Type, client.DatasourcePlugin), nil }) } @@ -122,9 +122,15 @@ func (s *transformCallback) DataQuery(ctx context.Context, req *pluginv2.DataQue return nil, fmt.Errorf("zero queries found in datasource request") } + datasourceID := int64(0) + + if req.Config.DatasourceConfig != nil { + datasourceID = req.Config.DatasourceConfig.Id + } + getDsInfo := &models.GetDataSourceByIdQuery{ - Id: req.Config.Id, OrgId: req.Config.OrgId, + Id: datasourceID, } if err := bus.Dispatch(getDsInfo); err != nil { diff --git a/vendor/github.com/grafana/grafana-plugin-sdk-go/dataframe/dataframe.go b/vendor/github.com/grafana/grafana-plugin-sdk-go/dataframe/dataframe.go index 966318cb205..f6a934519e0 100644 --- a/vendor/github.com/grafana/grafana-plugin-sdk-go/dataframe/dataframe.go +++ b/vendor/github.com/grafana/grafana-plugin-sdk-go/dataframe/dataframe.go @@ -27,6 +27,46 @@ type Field struct { // Fields is a slice of Field pointers. type Fields []*Field +// AppendRow adds a new row to the Frame by appending to each element of vals to +// the corresponding Field in the dataframe. +// The dataframe's Fields and the Fields' Vectors must be initalized or AppendRow will panic. +// The number of arguments must match the number of Fields in the Frame and each type must coorespond +// to the Field type or AppendRow will panic. +func (f *Frame) AppendRow(vals ...interface{}) { + for i, v := range vals { + f.Fields[i].Vector.Append(v) + } +} + +// AppendRowSafe adds a new row to the Frame by appending to each each element of vals to +// the corresponding Field in the dataframe. It has the some constraints as AppendRow but will +// return an error under those conditions instead of panicing. +func (f *Frame) AppendRowSafe(vals ...interface{}) error { + if len(vals) != len(f.Fields) { + return fmt.Errorf("failed to append vals to Frame. Frame has %v fields but was given %v to append", len(f.Fields), len(vals)) + } + // check validity before any modification + for i, v := range vals { + if f.Fields[i] == nil { + return fmt.Errorf("can not append to uninitalized Field at field index %v", i) + } + if f.Fields[i].Vector == nil { + return fmt.Errorf("can not append to uninitalized Field Vector at field index %v", i) + } + dfPType := f.Fields[i].Vector.PrimitiveType() + if v == nil { + if !dfPType.Nullable() { + return fmt.Errorf("can not append nil to non-nullable vector with underlying type %s at field index %v", dfPType, i) + } + } + if v != nil && pTypeFromVal(v) != dfPType { + return fmt.Errorf("invalid type appending row at index %v, got %T want %v", i, v, dfPType.ItemTypeString()) + } + f.Fields[i].Vector.Append(v) + } + return nil +} + // NewField returns a new instance of Field. func NewField(name string, labels Labels, values interface{}) *Field { var vec Vector diff --git a/vendor/github.com/grafana/grafana-plugin-sdk-go/dataframe/generic_nullable_vector.go b/vendor/github.com/grafana/grafana-plugin-sdk-go/dataframe/generic_nullable_vector.go index 7ccd4d5323a..e303e027a99 100644 --- a/vendor/github.com/grafana/grafana-plugin-sdk-go/dataframe/generic_nullable_vector.go +++ b/vendor/github.com/grafana/grafana-plugin-sdk-go/dataframe/generic_nullable_vector.go @@ -14,6 +14,10 @@ func (v *nullablegenVector) Set(idx int, i interface{}) { } func (v *nullablegenVector) Append(i interface{}) { + if i == nil { + (*v) = append((*v), nil) + return + } (*v) = append((*v), i.(*gen)) } @@ -21,6 +25,10 @@ func (v *nullablegenVector) At(i int) interface{} { return (*v)[i] } +func (v *nullablegenVector) PointerAt(i int) interface{} { + return &(*v)[i] +} + func (v *nullablegenVector) Len() int { return len((*v)) } @@ -28,3 +36,7 @@ func (v *nullablegenVector) Len() int { func (v *nullablegenVector) PrimitiveType() VectorPType { return vectorPType(v) } + +func (v *nullablegenVector) Extend(i int) { + (*v) = append((*v), make([]*gen, i)...) +} diff --git a/vendor/github.com/grafana/grafana-plugin-sdk-go/dataframe/generic_vector.go b/vendor/github.com/grafana/grafana-plugin-sdk-go/dataframe/generic_vector.go index e109fa7c6d9..2f318d9b9bc 100644 --- a/vendor/github.com/grafana/grafana-plugin-sdk-go/dataframe/generic_vector.go +++ b/vendor/github.com/grafana/grafana-plugin-sdk-go/dataframe/generic_vector.go @@ -27,6 +27,10 @@ func (v *genVector) At(i int) interface{} { return (*v)[i] } +func (v *genVector) PointerAt(i int) interface{} { + return &(*v)[i] +} + func (v *genVector) Len() int { return len((*v)) } @@ -34,3 +38,7 @@ func (v *genVector) Len() int { func (v *genVector) PrimitiveType() VectorPType { return vectorPType(v) } + +func (v *genVector) Extend(i int) { + (*v) = append((*v), make([]gen, i)...) +} diff --git a/vendor/github.com/grafana/grafana-plugin-sdk-go/dataframe/nullable_vector.gen.go b/vendor/github.com/grafana/grafana-plugin-sdk-go/dataframe/nullable_vector.gen.go index 1f06a6b4653..a99dc7af35b 100644 --- a/vendor/github.com/grafana/grafana-plugin-sdk-go/dataframe/nullable_vector.gen.go +++ b/vendor/github.com/grafana/grafana-plugin-sdk-go/dataframe/nullable_vector.gen.go @@ -20,6 +20,10 @@ func (v *nullableUint8Vector) Set(idx int, i interface{}) { } func (v *nullableUint8Vector) Append(i interface{}) { + if i == nil { + (*v) = append((*v), nil) + return + } (*v) = append((*v), i.(*uint8)) } @@ -27,6 +31,10 @@ func (v *nullableUint8Vector) At(i int) interface{} { return (*v)[i] } +func (v *nullableUint8Vector) PointerAt(i int) interface{} { + return &(*v)[i] +} + func (v *nullableUint8Vector) Len() int { return len((*v)) } @@ -35,6 +43,10 @@ func (v *nullableUint8Vector) PrimitiveType() VectorPType { return vectorPType(v) } +func (v *nullableUint8Vector) Extend(i int) { + (*v) = append((*v), make([]*uint8, i)...) +} + //go:Uint16erate uint16ny -in=$GOFILE -out=nullable_vector.Uint16.go uint16 "Uint16=uint8,uint16,uint32,uint64,int8,int16,int32,int64,float32,float64,string,bool,time.Time" type nullableUint16Vector []*uint16 @@ -49,6 +61,10 @@ func (v *nullableUint16Vector) Set(idx int, i interface{}) { } func (v *nullableUint16Vector) Append(i interface{}) { + if i == nil { + (*v) = append((*v), nil) + return + } (*v) = append((*v), i.(*uint16)) } @@ -56,6 +72,10 @@ func (v *nullableUint16Vector) At(i int) interface{} { return (*v)[i] } +func (v *nullableUint16Vector) PointerAt(i int) interface{} { + return &(*v)[i] +} + func (v *nullableUint16Vector) Len() int { return len((*v)) } @@ -64,6 +84,10 @@ func (v *nullableUint16Vector) PrimitiveType() VectorPType { return vectorPType(v) } +func (v *nullableUint16Vector) Extend(i int) { + (*v) = append((*v), make([]*uint16, i)...) +} + //go:Uint32erate uint32ny -in=$GOFILE -out=nullable_vector.Uint32.go uint32 "Uint32=uint8,uint16,uint32,uint64,int8,int16,int32,int64,float32,float64,string,bool,time.Time" type nullableUint32Vector []*uint32 @@ -78,6 +102,10 @@ func (v *nullableUint32Vector) Set(idx int, i interface{}) { } func (v *nullableUint32Vector) Append(i interface{}) { + if i == nil { + (*v) = append((*v), nil) + return + } (*v) = append((*v), i.(*uint32)) } @@ -85,6 +113,10 @@ func (v *nullableUint32Vector) At(i int) interface{} { return (*v)[i] } +func (v *nullableUint32Vector) PointerAt(i int) interface{} { + return &(*v)[i] +} + func (v *nullableUint32Vector) Len() int { return len((*v)) } @@ -93,6 +125,10 @@ func (v *nullableUint32Vector) PrimitiveType() VectorPType { return vectorPType(v) } +func (v *nullableUint32Vector) Extend(i int) { + (*v) = append((*v), make([]*uint32, i)...) +} + //go:Uint64erate uint64ny -in=$GOFILE -out=nullable_vector.Uint64.go uint64 "Uint64=uint8,uint16,uint32,uint64,int8,int16,int32,int64,float32,float64,string,bool,time.Time" type nullableUint64Vector []*uint64 @@ -107,6 +143,10 @@ func (v *nullableUint64Vector) Set(idx int, i interface{}) { } func (v *nullableUint64Vector) Append(i interface{}) { + if i == nil { + (*v) = append((*v), nil) + return + } (*v) = append((*v), i.(*uint64)) } @@ -114,6 +154,10 @@ func (v *nullableUint64Vector) At(i int) interface{} { return (*v)[i] } +func (v *nullableUint64Vector) PointerAt(i int) interface{} { + return &(*v)[i] +} + func (v *nullableUint64Vector) Len() int { return len((*v)) } @@ -122,6 +166,10 @@ func (v *nullableUint64Vector) PrimitiveType() VectorPType { return vectorPType(v) } +func (v *nullableUint64Vector) Extend(i int) { + (*v) = append((*v), make([]*uint64, i)...) +} + //go:Int8erate int8ny -in=$GOFILE -out=nullable_vector.Int8.go int8 "Int8=uint8,uint16,uint32,uint64,int8,int16,int32,int64,float32,float64,string,bool,time.Time" type nullableInt8Vector []*int8 @@ -136,6 +184,10 @@ func (v *nullableInt8Vector) Set(idx int, i interface{}) { } func (v *nullableInt8Vector) Append(i interface{}) { + if i == nil { + (*v) = append((*v), nil) + return + } (*v) = append((*v), i.(*int8)) } @@ -143,6 +195,10 @@ func (v *nullableInt8Vector) At(i int) interface{} { return (*v)[i] } +func (v *nullableInt8Vector) PointerAt(i int) interface{} { + return &(*v)[i] +} + func (v *nullableInt8Vector) Len() int { return len((*v)) } @@ -151,6 +207,10 @@ func (v *nullableInt8Vector) PrimitiveType() VectorPType { return vectorPType(v) } +func (v *nullableInt8Vector) Extend(i int) { + (*v) = append((*v), make([]*int8, i)...) +} + //go:Int16erate int16ny -in=$GOFILE -out=nullable_vector.Int16.go int16 "Int16=uint8,uint16,uint32,uint64,int8,int16,int32,int64,float32,float64,string,bool,time.Time" type nullableInt16Vector []*int16 @@ -165,6 +225,10 @@ func (v *nullableInt16Vector) Set(idx int, i interface{}) { } func (v *nullableInt16Vector) Append(i interface{}) { + if i == nil { + (*v) = append((*v), nil) + return + } (*v) = append((*v), i.(*int16)) } @@ -172,6 +236,10 @@ func (v *nullableInt16Vector) At(i int) interface{} { return (*v)[i] } +func (v *nullableInt16Vector) PointerAt(i int) interface{} { + return &(*v)[i] +} + func (v *nullableInt16Vector) Len() int { return len((*v)) } @@ -180,6 +248,10 @@ func (v *nullableInt16Vector) PrimitiveType() VectorPType { return vectorPType(v) } +func (v *nullableInt16Vector) Extend(i int) { + (*v) = append((*v), make([]*int16, i)...) +} + //go:Int32erate int32ny -in=$GOFILE -out=nullable_vector.Int32.go int32 "Int32=uint8,uint16,uint32,uint64,int8,int16,int32,int64,float32,float64,string,bool,time.Time" type nullableInt32Vector []*int32 @@ -194,6 +266,10 @@ func (v *nullableInt32Vector) Set(idx int, i interface{}) { } func (v *nullableInt32Vector) Append(i interface{}) { + if i == nil { + (*v) = append((*v), nil) + return + } (*v) = append((*v), i.(*int32)) } @@ -201,6 +277,10 @@ func (v *nullableInt32Vector) At(i int) interface{} { return (*v)[i] } +func (v *nullableInt32Vector) PointerAt(i int) interface{} { + return &(*v)[i] +} + func (v *nullableInt32Vector) Len() int { return len((*v)) } @@ -209,6 +289,10 @@ func (v *nullableInt32Vector) PrimitiveType() VectorPType { return vectorPType(v) } +func (v *nullableInt32Vector) Extend(i int) { + (*v) = append((*v), make([]*int32, i)...) +} + //go:Int64erate int64ny -in=$GOFILE -out=nullable_vector.Int64.go int64 "Int64=uint8,uint16,uint32,uint64,int8,int16,int32,int64,float32,float64,string,bool,time.Time" type nullableInt64Vector []*int64 @@ -223,6 +307,10 @@ func (v *nullableInt64Vector) Set(idx int, i interface{}) { } func (v *nullableInt64Vector) Append(i interface{}) { + if i == nil { + (*v) = append((*v), nil) + return + } (*v) = append((*v), i.(*int64)) } @@ -230,6 +318,10 @@ func (v *nullableInt64Vector) At(i int) interface{} { return (*v)[i] } +func (v *nullableInt64Vector) PointerAt(i int) interface{} { + return &(*v)[i] +} + func (v *nullableInt64Vector) Len() int { return len((*v)) } @@ -238,6 +330,10 @@ func (v *nullableInt64Vector) PrimitiveType() VectorPType { return vectorPType(v) } +func (v *nullableInt64Vector) Extend(i int) { + (*v) = append((*v), make([]*int64, i)...) +} + //go:Float32erate float32ny -in=$GOFILE -out=nullable_vector.Float32.go float32 "Float32=uint8,uint16,uint32,uint64,int8,int16,int32,int64,float32,float64,string,bool,time.Time" type nullableFloat32Vector []*float32 @@ -252,6 +348,10 @@ func (v *nullableFloat32Vector) Set(idx int, i interface{}) { } func (v *nullableFloat32Vector) Append(i interface{}) { + if i == nil { + (*v) = append((*v), nil) + return + } (*v) = append((*v), i.(*float32)) } @@ -259,6 +359,10 @@ func (v *nullableFloat32Vector) At(i int) interface{} { return (*v)[i] } +func (v *nullableFloat32Vector) PointerAt(i int) interface{} { + return &(*v)[i] +} + func (v *nullableFloat32Vector) Len() int { return len((*v)) } @@ -267,6 +371,10 @@ func (v *nullableFloat32Vector) PrimitiveType() VectorPType { return vectorPType(v) } +func (v *nullableFloat32Vector) Extend(i int) { + (*v) = append((*v), make([]*float32, i)...) +} + //go:Float64erate float64ny -in=$GOFILE -out=nullable_vector.Float64.go float64 "Float64=uint8,uint16,uint32,uint64,int8,int16,int32,int64,float32,float64,string,bool,time.Time" type nullableFloat64Vector []*float64 @@ -281,6 +389,10 @@ func (v *nullableFloat64Vector) Set(idx int, i interface{}) { } func (v *nullableFloat64Vector) Append(i interface{}) { + if i == nil { + (*v) = append((*v), nil) + return + } (*v) = append((*v), i.(*float64)) } @@ -288,6 +400,10 @@ func (v *nullableFloat64Vector) At(i int) interface{} { return (*v)[i] } +func (v *nullableFloat64Vector) PointerAt(i int) interface{} { + return &(*v)[i] +} + func (v *nullableFloat64Vector) Len() int { return len((*v)) } @@ -296,6 +412,10 @@ func (v *nullableFloat64Vector) PrimitiveType() VectorPType { return vectorPType(v) } +func (v *nullableFloat64Vector) Extend(i int) { + (*v) = append((*v), make([]*float64, i)...) +} + //go:Stringerate stringny -in=$GOFILE -out=nullable_vector.String.go string "String=uint8,uint16,uint32,uint64,int8,int16,int32,int64,float32,float64,string,bool,time.Time" type nullableStringVector []*string @@ -310,6 +430,10 @@ func (v *nullableStringVector) Set(idx int, i interface{}) { } func (v *nullableStringVector) Append(i interface{}) { + if i == nil { + (*v) = append((*v), nil) + return + } (*v) = append((*v), i.(*string)) } @@ -317,6 +441,10 @@ func (v *nullableStringVector) At(i int) interface{} { return (*v)[i] } +func (v *nullableStringVector) PointerAt(i int) interface{} { + return &(*v)[i] +} + func (v *nullableStringVector) Len() int { return len((*v)) } @@ -325,6 +453,10 @@ func (v *nullableStringVector) PrimitiveType() VectorPType { return vectorPType(v) } +func (v *nullableStringVector) Extend(i int) { + (*v) = append((*v), make([]*string, i)...) +} + //go:Boolerate boolny -in=$GOFILE -out=nullable_vector.Bool.go bool "Bool=uint8,uint16,uint32,uint64,int8,int16,int32,int64,float32,float64,string,bool,time.Time" type nullableBoolVector []*bool @@ -339,6 +471,10 @@ func (v *nullableBoolVector) Set(idx int, i interface{}) { } func (v *nullableBoolVector) Append(i interface{}) { + if i == nil { + (*v) = append((*v), nil) + return + } (*v) = append((*v), i.(*bool)) } @@ -346,6 +482,10 @@ func (v *nullableBoolVector) At(i int) interface{} { return (*v)[i] } +func (v *nullableBoolVector) PointerAt(i int) interface{} { + return &(*v)[i] +} + func (v *nullableBoolVector) Len() int { return len((*v)) } @@ -354,6 +494,10 @@ func (v *nullableBoolVector) PrimitiveType() VectorPType { return vectorPType(v) } +func (v *nullableBoolVector) Extend(i int) { + (*v) = append((*v), make([]*bool, i)...) +} + //go:TimeTimeerate timeTimeny -in=$GOFILE -out=nullable_vector.TimeTime.go time.Time "TimeTime=uint8,uint16,uint32,uint64,int8,int16,int32,int64,float32,float64,string,bool,time.Time" type nullableTimeTimeVector []*time.Time @@ -368,6 +512,10 @@ func (v *nullableTimeTimeVector) Set(idx int, i interface{}) { } func (v *nullableTimeTimeVector) Append(i interface{}) { + if i == nil { + (*v) = append((*v), nil) + return + } (*v) = append((*v), i.(*time.Time)) } @@ -375,6 +523,10 @@ func (v *nullableTimeTimeVector) At(i int) interface{} { return (*v)[i] } +func (v *nullableTimeTimeVector) PointerAt(i int) interface{} { + return &(*v)[i] +} + func (v *nullableTimeTimeVector) Len() int { return len((*v)) } @@ -382,3 +534,7 @@ func (v *nullableTimeTimeVector) Len() int { func (v *nullableTimeTimeVector) PrimitiveType() VectorPType { return vectorPType(v) } + +func (v *nullableTimeTimeVector) Extend(i int) { + (*v) = append((*v), make([]*time.Time, i)...) +} diff --git a/vendor/github.com/grafana/grafana-plugin-sdk-go/dataframe/sql.go b/vendor/github.com/grafana/grafana-plugin-sdk-go/dataframe/sql.go new file mode 100644 index 00000000000..39d06d5863f --- /dev/null +++ b/vendor/github.com/grafana/grafana-plugin-sdk-go/dataframe/sql.go @@ -0,0 +1,186 @@ +package dataframe + +import ( + "database/sql" + "fmt" + "reflect" +) + +// NewFromSQLRows returns a new dataframe populated with the data from rows. The Field Vector types +// will be Vectors of pointer types, []*T, if the SQL column is nullable or if the nullable property is unknown. +// Otherwise, they will be []T types. +// +// Fields will be named to match name of the SQL columns and the SQL column names must be unique (https://github.com/grafana/grafana-plugin-sdk-go/issues/59). +// +// All the types must be supported by the dataframe or a SQLStringConverter will be created and +// the resulting Field Vector type will be of type []*string. +// +// The SQLStringConverter's ConversionFunc will be applied to matching rows if it is not nil. +// Additionally, if the SQLStringConverter's Replacer is not nil, the replacement will be performed. +// A map of Field/Column index to the corresponding SQLStringConverter is returned so what conversions were +// done can be inspected. +func NewFromSQLRows(rows *sql.Rows, converters ...SQLStringConverter) (*Frame, map[int]SQLStringConverter, error) { + frame, mappers, err := newForSQLRows(rows, converters...) + if err != nil { + return nil, nil, err + } + + for rows.Next() { + sRow := frame.newScannableRow() + err := rows.Scan(sRow...) + if err != nil { + return nil, nil, err + } + } + + for fieldIdx, mapper := range mappers { + if mapper.ConversionFunc == nil { + continue + } + vec := frame.Fields[fieldIdx] + for i := 0; i < vec.Len(); i++ { + v, err := mapper.ConversionFunc(vec.Vector.At(i).(*string)) + if err != nil { + return nil, nil, err + } + vec.Vector.Set(i, v) + } + if mapper.Replacer == nil { + continue + } + if err := Replace(frame, fieldIdx, mapper.Replacer); err != nil { + return nil, nil, err + } + } + + return frame, mappers, nil +} + +// newForSQLRows creates a new Frame appropriate for scanning SQL rows with +// the the new Frame's ScannableRow() method. +func newForSQLRows(rows *sql.Rows, converters ...SQLStringConverter) (*Frame, map[int]SQLStringConverter, error) { + mapping := make(map[int]SQLStringConverter) + colTypes, err := rows.ColumnTypes() + if err != nil { + return nil, nil, err + } + colNames, err := rows.Columns() + if err != nil { + return nil, nil, err + } + // In the future we can probably remove this restriction. But right now we map names to Arrow Field Names. + // Arrow Field names must be unique: https://github.com/grafana/grafana-plugin-sdk-go/issues/59 + seen := map[string]int{} + for i, name := range colNames { + if j, ok := seen[name]; ok { + return nil, nil, fmt.Errorf(`duplicate column names are not allowed, found identical name "%v" at column indices %v and %v`, name, j, i) + } + seen[name] = i + } + frame := &Frame{} + for i, colType := range colTypes { + colName := colNames[i] + nullable, ok := colType.Nullable() + if !ok { + nullable = true // If we don't know if it is nullable, assume it is + } + scanType := colType.ScanType() + for _, converter := range converters { + if converter.InputScanKind == scanType.Kind() && converter.InputTypeName == colType.DatabaseTypeName() { + nullable = true // String converters are always nullable + scanType = reflect.TypeOf("") + mapping[i] = converter + } + } + var vec interface{} + if !nullable { + vec = reflect.MakeSlice(reflect.SliceOf(scanType), 0, 0).Interface() + } else { + ptrType := reflect.TypeOf(reflect.New(scanType).Interface()) + // Nullabe types get passed to scan as a pointer to a pointer + vec = reflect.MakeSlice(reflect.SliceOf(ptrType), 0, 0).Interface() + } + if !ValidVectorType(vec) { + // Automatically create string mapper if we end up with an unsupported type + mapping[i] = SQLStringConverter{ + Name: fmt.Sprintf("Autogenerated for column %v", i), + InputTypeName: colType.DatabaseTypeName(), + InputScanKind: colType.ScanType().Kind(), + } + ptrType := reflect.TypeOf(reflect.New(reflect.TypeOf("")).Interface()) + vec = reflect.MakeSlice(reflect.SliceOf(ptrType), 0, 0).Interface() + } + frame.Fields = append(frame.Fields, NewField(colName, nil, vec)) + } + return frame, mapping, nil +} + +// newScannableRow adds a row to the dataframe by extending each Field's Vector. It returns +// a slice of references that can be passed to the database/sql rows.Scan() to scan directly into +// the extended Vectors of the dataframe. +func (f *Frame) newScannableRow() []interface{} { + row := make([]interface{}, len(f.Fields)) + for i, field := range f.Fields { + vec := field.Vector + vec.Extend(1) + // non-nullable fields will be *T, and nullable fields will be **T + vecItemPointer := vec.PointerAt(vec.Len() - 1) + row[i] = vecItemPointer + } + return row +} + +// SQLStringConverter can be used to store types not supported by +// a dataframe into a *string. When scanning, if a SQL's row's InputScanType's Kind +// and InputScanKind match that returned by the sql response, then the +// conversion func will be run on the row. +type SQLStringConverter struct { + // Name is an optional property that can be used to identify a converter + Name string + InputScanKind reflect.Kind // reflect.Type might better or worse option? + InputTypeName string + + // Conversion func may be nil to do no additional operations on the string conversion. + ConversionFunc func(in *string) (*string, error) + + // If the Replacer is not nil, the replacement will be performed. + Replacer *StringFieldReplacer +} + +// Note: SQLStringConverter is perhaps better understood as []byte. However, currently +// the Vector type ([][]byte) is not supported. https://github.com/grafana/grafana-plugin-sdk-go/issues/57 + +// StringFieldReplacer is used to replace a *string Field in a dataframe. The type +// returned by the ReplaceFunc must match the type of elements of VectorType. +// Both properties must be non-nil. +type StringFieldReplacer struct { + VectorType interface{} + ReplaceFunc func(in *string) (interface{}, error) +} + +// Replace will replace a *string Vector of the specified Field's index +// using the StringFieldReplacer. +func Replace(frame *Frame, fieldIdx int, replacer *StringFieldReplacer) error { + if fieldIdx > len(frame.Fields) { + return fmt.Errorf("fieldIdx is out of bounds, field len: %v", len(frame.Fields)) + } + field := frame.Fields[fieldIdx] + if field.Vector.PrimitiveType() != VectorPTypeNullableString { + return fmt.Errorf("can only replace []*string vectors, vector is of type %s", field.Vector.PrimitiveType()) + } + + if !ValidVectorType(replacer.VectorType) { + return fmt.Errorf("can not replace column with unsupported type %T", replacer.VectorType) + } + newVector := newVector(replacer.VectorType, field.Vector.Len()) + for i := 0; i < newVector.Len(); i++ { + oldVal := field.Vector.At(i).(*string) // Vector type is checked earlier above + newVal, err := replacer.ReplaceFunc(oldVal) + if err != nil { + return err + } + newVector.Set(i, newVal) + } + field.Vector = newVector + return nil +} diff --git a/vendor/github.com/grafana/grafana-plugin-sdk-go/dataframe/vector.gen.go b/vendor/github.com/grafana/grafana-plugin-sdk-go/dataframe/vector.gen.go index f52b7d45361..09bfdc595c2 100644 --- a/vendor/github.com/grafana/grafana-plugin-sdk-go/dataframe/vector.gen.go +++ b/vendor/github.com/grafana/grafana-plugin-sdk-go/dataframe/vector.gen.go @@ -27,6 +27,10 @@ func (v *uint8Vector) At(i int) interface{} { return (*v)[i] } +func (v *uint8Vector) PointerAt(i int) interface{} { + return &(*v)[i] +} + func (v *uint8Vector) Len() int { return len((*v)) } @@ -35,6 +39,10 @@ func (v *uint8Vector) PrimitiveType() VectorPType { return vectorPType(v) } +func (v *uint8Vector) Extend(i int) { + (*v) = append((*v), make([]uint8, i)...) +} + //go:Uint16erate uint16ny -in=$GOFILE -out=vector.Uint16.go uint16 "Uint16=uint8,uint16,uint32,uint64,int8,int16,int32,int64,float32,float64,string,bool,time.Time" type uint16Vector []uint16 @@ -56,6 +64,10 @@ func (v *uint16Vector) At(i int) interface{} { return (*v)[i] } +func (v *uint16Vector) PointerAt(i int) interface{} { + return &(*v)[i] +} + func (v *uint16Vector) Len() int { return len((*v)) } @@ -64,6 +76,10 @@ func (v *uint16Vector) PrimitiveType() VectorPType { return vectorPType(v) } +func (v *uint16Vector) Extend(i int) { + (*v) = append((*v), make([]uint16, i)...) +} + //go:Uint32erate uint32ny -in=$GOFILE -out=vector.Uint32.go uint32 "Uint32=uint8,uint16,uint32,uint64,int8,int16,int32,int64,float32,float64,string,bool,time.Time" type uint32Vector []uint32 @@ -85,6 +101,10 @@ func (v *uint32Vector) At(i int) interface{} { return (*v)[i] } +func (v *uint32Vector) PointerAt(i int) interface{} { + return &(*v)[i] +} + func (v *uint32Vector) Len() int { return len((*v)) } @@ -93,6 +113,10 @@ func (v *uint32Vector) PrimitiveType() VectorPType { return vectorPType(v) } +func (v *uint32Vector) Extend(i int) { + (*v) = append((*v), make([]uint32, i)...) +} + //go:Uint64erate uint64ny -in=$GOFILE -out=vector.Uint64.go uint64 "Uint64=uint8,uint16,uint32,uint64,int8,int16,int32,int64,float32,float64,string,bool,time.Time" type uint64Vector []uint64 @@ -114,6 +138,10 @@ func (v *uint64Vector) At(i int) interface{} { return (*v)[i] } +func (v *uint64Vector) PointerAt(i int) interface{} { + return &(*v)[i] +} + func (v *uint64Vector) Len() int { return len((*v)) } @@ -122,6 +150,10 @@ func (v *uint64Vector) PrimitiveType() VectorPType { return vectorPType(v) } +func (v *uint64Vector) Extend(i int) { + (*v) = append((*v), make([]uint64, i)...) +} + //go:Int8erate int8ny -in=$GOFILE -out=vector.Int8.go int8 "Int8=uint8,uint16,uint32,uint64,int8,int16,int32,int64,float32,float64,string,bool,time.Time" type int8Vector []int8 @@ -143,6 +175,10 @@ func (v *int8Vector) At(i int) interface{} { return (*v)[i] } +func (v *int8Vector) PointerAt(i int) interface{} { + return &(*v)[i] +} + func (v *int8Vector) Len() int { return len((*v)) } @@ -151,6 +187,10 @@ func (v *int8Vector) PrimitiveType() VectorPType { return vectorPType(v) } +func (v *int8Vector) Extend(i int) { + (*v) = append((*v), make([]int8, i)...) +} + //go:Int16erate int16ny -in=$GOFILE -out=vector.Int16.go int16 "Int16=uint8,uint16,uint32,uint64,int8,int16,int32,int64,float32,float64,string,bool,time.Time" type int16Vector []int16 @@ -172,6 +212,10 @@ func (v *int16Vector) At(i int) interface{} { return (*v)[i] } +func (v *int16Vector) PointerAt(i int) interface{} { + return &(*v)[i] +} + func (v *int16Vector) Len() int { return len((*v)) } @@ -180,6 +224,10 @@ func (v *int16Vector) PrimitiveType() VectorPType { return vectorPType(v) } +func (v *int16Vector) Extend(i int) { + (*v) = append((*v), make([]int16, i)...) +} + //go:Int32erate int32ny -in=$GOFILE -out=vector.Int32.go int32 "Int32=uint8,uint16,uint32,uint64,int8,int16,int32,int64,float32,float64,string,bool,time.Time" type int32Vector []int32 @@ -201,6 +249,10 @@ func (v *int32Vector) At(i int) interface{} { return (*v)[i] } +func (v *int32Vector) PointerAt(i int) interface{} { + return &(*v)[i] +} + func (v *int32Vector) Len() int { return len((*v)) } @@ -209,6 +261,10 @@ func (v *int32Vector) PrimitiveType() VectorPType { return vectorPType(v) } +func (v *int32Vector) Extend(i int) { + (*v) = append((*v), make([]int32, i)...) +} + //go:Int64erate int64ny -in=$GOFILE -out=vector.Int64.go int64 "Int64=uint8,uint16,uint32,uint64,int8,int16,int32,int64,float32,float64,string,bool,time.Time" type int64Vector []int64 @@ -230,6 +286,10 @@ func (v *int64Vector) At(i int) interface{} { return (*v)[i] } +func (v *int64Vector) PointerAt(i int) interface{} { + return &(*v)[i] +} + func (v *int64Vector) Len() int { return len((*v)) } @@ -238,6 +298,10 @@ func (v *int64Vector) PrimitiveType() VectorPType { return vectorPType(v) } +func (v *int64Vector) Extend(i int) { + (*v) = append((*v), make([]int64, i)...) +} + //go:Float32erate float32ny -in=$GOFILE -out=vector.Float32.go float32 "Float32=uint8,uint16,uint32,uint64,int8,int16,int32,int64,float32,float64,string,bool,time.Time" type float32Vector []float32 @@ -259,6 +323,10 @@ func (v *float32Vector) At(i int) interface{} { return (*v)[i] } +func (v *float32Vector) PointerAt(i int) interface{} { + return &(*v)[i] +} + func (v *float32Vector) Len() int { return len((*v)) } @@ -267,6 +335,10 @@ func (v *float32Vector) PrimitiveType() VectorPType { return vectorPType(v) } +func (v *float32Vector) Extend(i int) { + (*v) = append((*v), make([]float32, i)...) +} + //go:Float64erate float64ny -in=$GOFILE -out=vector.Float64.go float64 "Float64=uint8,uint16,uint32,uint64,int8,int16,int32,int64,float32,float64,string,bool,time.Time" type float64Vector []float64 @@ -288,6 +360,10 @@ func (v *float64Vector) At(i int) interface{} { return (*v)[i] } +func (v *float64Vector) PointerAt(i int) interface{} { + return &(*v)[i] +} + func (v *float64Vector) Len() int { return len((*v)) } @@ -296,6 +372,10 @@ func (v *float64Vector) PrimitiveType() VectorPType { return vectorPType(v) } +func (v *float64Vector) Extend(i int) { + (*v) = append((*v), make([]float64, i)...) +} + //go:Stringerate stringny -in=$GOFILE -out=vector.String.go string "String=uint8,uint16,uint32,uint64,int8,int16,int32,int64,float32,float64,string,bool,time.Time" type stringVector []string @@ -317,6 +397,10 @@ func (v *stringVector) At(i int) interface{} { return (*v)[i] } +func (v *stringVector) PointerAt(i int) interface{} { + return &(*v)[i] +} + func (v *stringVector) Len() int { return len((*v)) } @@ -325,6 +409,10 @@ func (v *stringVector) PrimitiveType() VectorPType { return vectorPType(v) } +func (v *stringVector) Extend(i int) { + (*v) = append((*v), make([]string, i)...) +} + //go:Boolerate boolny -in=$GOFILE -out=vector.Bool.go bool "Bool=uint8,uint16,uint32,uint64,int8,int16,int32,int64,float32,float64,string,bool,time.Time" type boolVector []bool @@ -346,6 +434,10 @@ func (v *boolVector) At(i int) interface{} { return (*v)[i] } +func (v *boolVector) PointerAt(i int) interface{} { + return &(*v)[i] +} + func (v *boolVector) Len() int { return len((*v)) } @@ -354,6 +446,10 @@ func (v *boolVector) PrimitiveType() VectorPType { return vectorPType(v) } +func (v *boolVector) Extend(i int) { + (*v) = append((*v), make([]bool, i)...) +} + //go:TimeTimeerate timeTimeny -in=$GOFILE -out=vector.TimeTime.go time.Time "TimeTime=uint8,uint16,uint32,uint64,int8,int16,int32,int64,float32,float64,string,bool,time.Time" type timeTimeVector []time.Time @@ -375,6 +471,10 @@ func (v *timeTimeVector) At(i int) interface{} { return (*v)[i] } +func (v *timeTimeVector) PointerAt(i int) interface{} { + return &(*v)[i] +} + func (v *timeTimeVector) Len() int { return len((*v)) } @@ -382,3 +482,7 @@ func (v *timeTimeVector) Len() int { func (v *timeTimeVector) PrimitiveType() VectorPType { return vectorPType(v) } + +func (v *timeTimeVector) Extend(i int) { + (*v) = append((*v), make([]time.Time, i)...) +} diff --git a/vendor/github.com/grafana/grafana-plugin-sdk-go/dataframe/vector.go b/vendor/github.com/grafana/grafana-plugin-sdk-go/dataframe/vector.go index 453436ba48a..5d2b44b951d 100644 --- a/vendor/github.com/grafana/grafana-plugin-sdk-go/dataframe/vector.go +++ b/vendor/github.com/grafana/grafana-plugin-sdk-go/dataframe/vector.go @@ -9,9 +9,11 @@ import ( type Vector interface { Set(idx int, i interface{}) Append(i interface{}) + Extend(i int) At(i int) interface{} Len() int PrimitiveType() VectorPType + PointerAt(i int) interface{} //buildArrowColumn(pool memory.Allocator, field arrow.Field) *array.Column } @@ -81,6 +83,73 @@ func newVector(t interface{}, n int) (v Vector) { return } + +// ValidVectorType returns if a primitive slice is a valid / supported Vector type +func ValidVectorType(t interface{}) bool { + switch t.(type) { + // ints + case []int8: + return true + case []*int8: + return true + case []int16: + return true + case []*int16: + return true + case []int32: + return true + case []*int32: + return true + case []int64: + return true + case []*int64: + return true + + // uints + case []uint8: + return true + case []*uint8: + return true + case []uint16: + return true + case []*uint16: + return true + case []uint32: + return true + case []*uint32: + return true + case []uint64: + return true + case []*uint64: + return true + + // floats + case []float32: + return true + case []*float32: + return true + case []float64: + return true + case []*float64: + return true + + case []string: + return true + case []*string: + return true + case []bool: + return true + case []*bool: + return true + case []time.Time: + return true + case []*time.Time: + return true + default: + return false + } +} + // VectorPType indicates the go type underlying the Vector. type VectorPType int @@ -221,3 +290,176 @@ func vectorPType(v Vector) VectorPType { return VectorPType(-1) } + +func pTypeFromVal(v interface{}) VectorPType { + switch v.(type) { + case int8: + return VectorPTypeInt8 + case *int8: + return VectorPTypeNullableInt8 + + case int16: + return VectorPTypeInt16 + case *int16: + return VectorPTypeNullableInt16 + + case int32: + return VectorPTypeInt32 + case *int32: + return VectorPTypeNullableInt32 + + case int64: + return VectorPTypeInt64 + case *int64: + return VectorPTypeNullableInt64 + + case uint8: + return VectorPTypeUint8 + case *uint8: + return VectorPTypeNullableUint8 + + case uint16: + return VectorPTypeUint16 + case *uint16: + return VectorPTypeNullableUint16 + + case uint32: + return VectorPTypeUint32 + case *uint32: + return VectorPTypeNullableUint32 + + case uint64: + return VectorPTypeUint64 + case *uint64: + return VectorPTypeNullableUint64 + + case float32: + return VectorPTypeFloat32 + case *float32: + return VectorPTypeNullableFloat32 + + case float64: + return VectorPTypeFloat64 + case *float64: + return VectorPTypeNullableFloat64 + + case string: + return VectorPTypeString + case *string: + return VectorPTypeNullableString + + case bool: + return VectorPTypeBool + case *bool: + return VectorPTypeNullableBool + + case time.Time: + return VectorPTypeTime + case *time.Time: + return VectorPTypeNullableTime + } + return VectorPType(-1) +} + +func (p VectorPType) String() string { + if p < 0 { + return "invalid/unsupported" + } + return fmt.Sprintf("[]%v", p.ItemTypeString()) + +} + +// ItemTypeString returns the string representation of the type of element within in the vector +func (p VectorPType) ItemTypeString() string { + switch p { + case VectorPTypeInt8: + return "int8" + case VectorPTypeNullableInt8: + return "*int8" + + case VectorPTypeInt16: + return "int16" + case VectorPTypeNullableInt16: + return "*int16" + + case VectorPTypeInt32: + return "int32" + case VectorPTypeNullableInt32: + return "*int32" + + case VectorPTypeInt64: + return "int64" + case VectorPTypeNullableInt64: + return "*int64" + + case VectorPTypeUint8: + return "unit8" + case VectorPTypeNullableUint8: + return "*uint8" + + case VectorPTypeUint16: + return "uint16" + case VectorPTypeNullableUint16: + return "*uint16" + + case VectorPTypeUint32: + return "uint32" + case VectorPTypeNullableUint32: + return "*uint32" + + case VectorPTypeUint64: + return "uint64" + case VectorPTypeNullableUint64: + return "*uint64" + + case VectorPTypeFloat32: + return "float32" + case VectorPTypeNullableFloat32: + return "*float32" + + case VectorPTypeFloat64: + return "float64" + case VectorPTypeNullableFloat64: + return "*float64" + + case VectorPTypeString: + return "string" + case VectorPTypeNullableString: + return "*string" + + case VectorPTypeBool: + return "bool" + case VectorPTypeNullableBool: + return "*bool" + + case VectorPTypeTime: + return "time.Time" + case VectorPTypeNullableTime: + return "*time.Time" + } + return "invalid/unsupported type" +} + +// Nullable returns if type is a nullable type +func (p VectorPType) Nullable() bool { + switch p { + case VectorPTypeNullableInt8, VectorPTypeNullableInt16, VectorPTypeNullableInt32, VectorPTypeNullableInt64: + return true + + case VectorPTypeNullableUint8, VectorPTypeNullableUint16, VectorPTypeNullableUint32, VectorPTypeNullableUint64: + return true + + case VectorPTypeNullableFloat32, VectorPTypeNullableFloat64: + return true + + case VectorPTypeNullableString: + return true + + case VectorPTypeNullableBool: + return true + + case VectorPTypeNullableTime: + return true + } + return false +} diff --git a/vendor/github.com/grafana/grafana-plugin-sdk-go/genproto/pluginv2/backend.pb.go b/vendor/github.com/grafana/grafana-plugin-sdk-go/genproto/pluginv2/backend.pb.go index a42e11bb392..d2c04a37cfa 100644 --- a/vendor/github.com/grafana/grafana-plugin-sdk-go/genproto/pluginv2/backend.pb.go +++ b/vendor/github.com/grafana/grafana-plugin-sdk-go/genproto/pluginv2/backend.pb.go @@ -50,17 +50,104 @@ func (x CheckHealth_Response_HealthStatus) String() string { } func (CheckHealth_Response_HealthStatus) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_5ab9ba5b8d8b2ba5, []int{7, 1, 0} + return fileDescriptor_5ab9ba5b8d8b2ba5, []int{8, 1, 0} +} + +type DataSourceConfig struct { + Id int64 `protobuf:"varint,4,opt,name=id,proto3" json:"id,omitempty"` + Name string `protobuf:"bytes,5,opt,name=name,proto3" json:"name,omitempty"` + Url string `protobuf:"bytes,6,opt,name=url,proto3" json:"url,omitempty"` + User string `protobuf:"bytes,7,opt,name=user,proto3" json:"user,omitempty"` + Database string `protobuf:"bytes,8,opt,name=database,proto3" json:"database,omitempty"` + BasicAuthEnabled bool `protobuf:"varint,9,opt,name=basicAuthEnabled,proto3" json:"basicAuthEnabled,omitempty"` + BasicAuthUser string `protobuf:"bytes,10,opt,name=basicAuthUser,proto3" json:"basicAuthUser,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *DataSourceConfig) Reset() { *m = DataSourceConfig{} } +func (m *DataSourceConfig) String() string { return proto.CompactTextString(m) } +func (*DataSourceConfig) ProtoMessage() {} +func (*DataSourceConfig) Descriptor() ([]byte, []int) { + return fileDescriptor_5ab9ba5b8d8b2ba5, []int{0} +} + +func (m *DataSourceConfig) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_DataSourceConfig.Unmarshal(m, b) +} +func (m *DataSourceConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_DataSourceConfig.Marshal(b, m, deterministic) +} +func (m *DataSourceConfig) XXX_Merge(src proto.Message) { + xxx_messageInfo_DataSourceConfig.Merge(m, src) +} +func (m *DataSourceConfig) XXX_Size() int { + return xxx_messageInfo_DataSourceConfig.Size(m) +} +func (m *DataSourceConfig) XXX_DiscardUnknown() { + xxx_messageInfo_DataSourceConfig.DiscardUnknown(m) +} + +var xxx_messageInfo_DataSourceConfig proto.InternalMessageInfo + +func (m *DataSourceConfig) GetId() int64 { + if m != nil { + return m.Id + } + return 0 +} + +func (m *DataSourceConfig) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *DataSourceConfig) GetUrl() string { + if m != nil { + return m.Url + } + return "" +} + +func (m *DataSourceConfig) GetUser() string { + if m != nil { + return m.User + } + return "" +} + +func (m *DataSourceConfig) GetDatabase() string { + if m != nil { + return m.Database + } + return "" +} + +func (m *DataSourceConfig) GetBasicAuthEnabled() bool { + if m != nil { + return m.BasicAuthEnabled + } + return false +} + +func (m *DataSourceConfig) GetBasicAuthUser() string { + if m != nil { + return m.BasicAuthUser + } + return "" } type PluginConfig struct { - Id int64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` - OrgId int64 `protobuf:"varint,2,opt,name=orgId,proto3" json:"orgId,omitempty"` - Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` - Type string `protobuf:"bytes,4,opt,name=type,proto3" json:"type,omitempty"` - Url string `protobuf:"bytes,5,opt,name=url,proto3" json:"url,omitempty"` - JsonData string `protobuf:"bytes,6,opt,name=jsonData,proto3" json:"jsonData,omitempty"` - DecryptedSecureJsonData map[string]string `protobuf:"bytes,7,rep,name=decryptedSecureJsonData,proto3" json:"decryptedSecureJsonData,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + OrgId int64 `protobuf:"varint,1,opt,name=orgId,proto3" json:"orgId,omitempty"` + PluginId string `protobuf:"bytes,2,opt,name=pluginId,proto3" json:"pluginId,omitempty"` + PluginType string `protobuf:"bytes,3,opt,name=pluginType,proto3" json:"pluginType,omitempty"` + JsonData []byte `protobuf:"bytes,4,opt,name=jsonData,proto3" json:"jsonData,omitempty"` + DecryptedSecureJsonData map[string]string `protobuf:"bytes,5,rep,name=decryptedSecureJsonData,proto3" json:"decryptedSecureJsonData,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + UpdatedMS int64 `protobuf:"varint,6,opt,name=updatedMS,proto3" json:"updatedMS,omitempty"` + DatasourceConfig *DataSourceConfig `protobuf:"bytes,7,opt,name=datasourceConfig,proto3" json:"datasourceConfig,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -70,7 +157,7 @@ func (m *PluginConfig) Reset() { *m = PluginConfig{} } func (m *PluginConfig) String() string { return proto.CompactTextString(m) } func (*PluginConfig) ProtoMessage() {} func (*PluginConfig) Descriptor() ([]byte, []int) { - return fileDescriptor_5ab9ba5b8d8b2ba5, []int{0} + return fileDescriptor_5ab9ba5b8d8b2ba5, []int{1} } func (m *PluginConfig) XXX_Unmarshal(b []byte) error { @@ -91,13 +178,6 @@ func (m *PluginConfig) XXX_DiscardUnknown() { var xxx_messageInfo_PluginConfig proto.InternalMessageInfo -func (m *PluginConfig) GetId() int64 { - if m != nil { - return m.Id - } - return 0 -} - func (m *PluginConfig) GetOrgId() int64 { if m != nil { return m.OrgId @@ -105,32 +185,25 @@ func (m *PluginConfig) GetOrgId() int64 { return 0 } -func (m *PluginConfig) GetName() string { +func (m *PluginConfig) GetPluginId() string { if m != nil { - return m.Name + return m.PluginId } return "" } -func (m *PluginConfig) GetType() string { +func (m *PluginConfig) GetPluginType() string { if m != nil { - return m.Type + return m.PluginType } return "" } -func (m *PluginConfig) GetUrl() string { - if m != nil { - return m.Url - } - return "" -} - -func (m *PluginConfig) GetJsonData() string { +func (m *PluginConfig) GetJsonData() []byte { if m != nil { return m.JsonData } - return "" + return nil } func (m *PluginConfig) GetDecryptedSecureJsonData() map[string]string { @@ -140,6 +213,20 @@ func (m *PluginConfig) GetDecryptedSecureJsonData() map[string]string { return nil } +func (m *PluginConfig) GetUpdatedMS() int64 { + if m != nil { + return m.UpdatedMS + } + return 0 +} + +func (m *PluginConfig) GetDatasourceConfig() *DataSourceConfig { + if m != nil { + return m.DatasourceConfig + } + return nil +} + type TimeRange struct { FromEpochMS int64 `protobuf:"varint,1,opt,name=fromEpochMS,proto3" json:"fromEpochMS,omitempty"` ToEpochMS int64 `protobuf:"varint,2,opt,name=toEpochMS,proto3" json:"toEpochMS,omitempty"` @@ -152,7 +239,7 @@ func (m *TimeRange) Reset() { *m = TimeRange{} } func (m *TimeRange) String() string { return proto.CompactTextString(m) } func (*TimeRange) ProtoMessage() {} func (*TimeRange) Descriptor() ([]byte, []int) { - return fileDescriptor_5ab9ba5b8d8b2ba5, []int{1} + return fileDescriptor_5ab9ba5b8d8b2ba5, []int{2} } func (m *TimeRange) XXX_Unmarshal(b []byte) error { @@ -202,7 +289,7 @@ func (m *DataQuery) Reset() { *m = DataQuery{} } func (m *DataQuery) String() string { return proto.CompactTextString(m) } func (*DataQuery) ProtoMessage() {} func (*DataQuery) Descriptor() ([]byte, []int) { - return fileDescriptor_5ab9ba5b8d8b2ba5, []int{2} + return fileDescriptor_5ab9ba5b8d8b2ba5, []int{3} } func (m *DataQuery) XXX_Unmarshal(b []byte) error { @@ -274,7 +361,7 @@ func (m *DataQueryRequest) Reset() { *m = DataQueryRequest{} } func (m *DataQueryRequest) String() string { return proto.CompactTextString(m) } func (*DataQueryRequest) ProtoMessage() {} func (*DataQueryRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_5ab9ba5b8d8b2ba5, []int{3} + return fileDescriptor_5ab9ba5b8d8b2ba5, []int{4} } func (m *DataQueryRequest) XXX_Unmarshal(b []byte) error { @@ -331,7 +418,7 @@ func (m *DataQueryResponse) Reset() { *m = DataQueryResponse{} } func (m *DataQueryResponse) String() string { return proto.CompactTextString(m) } func (*DataQueryResponse) ProtoMessage() {} func (*DataQueryResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_5ab9ba5b8d8b2ba5, []int{4} + return fileDescriptor_5ab9ba5b8d8b2ba5, []int{5} } func (m *DataQueryResponse) XXX_Unmarshal(b []byte) error { @@ -376,7 +463,7 @@ func (m *CallResource) Reset() { *m = CallResource{} } func (m *CallResource) String() string { return proto.CompactTextString(m) } func (*CallResource) ProtoMessage() {} func (*CallResource) Descriptor() ([]byte, []int) { - return fileDescriptor_5ab9ba5b8d8b2ba5, []int{5} + return fileDescriptor_5ab9ba5b8d8b2ba5, []int{6} } func (m *CallResource) XXX_Unmarshal(b []byte) error { @@ -408,7 +495,7 @@ func (m *CallResource_StringList) Reset() { *m = CallResource_StringList func (m *CallResource_StringList) String() string { return proto.CompactTextString(m) } func (*CallResource_StringList) ProtoMessage() {} func (*CallResource_StringList) Descriptor() ([]byte, []int) { - return fileDescriptor_5ab9ba5b8d8b2ba5, []int{5, 0} + return fileDescriptor_5ab9ba5b8d8b2ba5, []int{6, 0} } func (m *CallResource_StringList) XXX_Unmarshal(b []byte) error { @@ -452,7 +539,7 @@ func (m *CallResource_Request) Reset() { *m = CallResource_Request{} } func (m *CallResource_Request) String() string { return proto.CompactTextString(m) } func (*CallResource_Request) ProtoMessage() {} func (*CallResource_Request) Descriptor() ([]byte, []int) { - return fileDescriptor_5ab9ba5b8d8b2ba5, []int{5, 1} + return fileDescriptor_5ab9ba5b8d8b2ba5, []int{6, 1} } func (m *CallResource_Request) XXX_Unmarshal(b []byte) error { @@ -528,7 +615,7 @@ func (m *CallResource_Response) Reset() { *m = CallResource_Response{} } func (m *CallResource_Response) String() string { return proto.CompactTextString(m) } func (*CallResource_Response) ProtoMessage() {} func (*CallResource_Response) Descriptor() ([]byte, []int) { - return fileDescriptor_5ab9ba5b8d8b2ba5, []int{5, 2} + return fileDescriptor_5ab9ba5b8d8b2ba5, []int{6, 2} } func (m *CallResource_Response) XXX_Unmarshal(b []byte) error { @@ -580,7 +667,7 @@ func (m *CollectMetrics) Reset() { *m = CollectMetrics{} } func (m *CollectMetrics) String() string { return proto.CompactTextString(m) } func (*CollectMetrics) ProtoMessage() {} func (*CollectMetrics) Descriptor() ([]byte, []int) { - return fileDescriptor_5ab9ba5b8d8b2ba5, []int{6} + return fileDescriptor_5ab9ba5b8d8b2ba5, []int{7} } func (m *CollectMetrics) XXX_Unmarshal(b []byte) error { @@ -611,7 +698,7 @@ func (m *CollectMetrics_Request) Reset() { *m = CollectMetrics_Request{} func (m *CollectMetrics_Request) String() string { return proto.CompactTextString(m) } func (*CollectMetrics_Request) ProtoMessage() {} func (*CollectMetrics_Request) Descriptor() ([]byte, []int) { - return fileDescriptor_5ab9ba5b8d8b2ba5, []int{6, 0} + return fileDescriptor_5ab9ba5b8d8b2ba5, []int{7, 0} } func (m *CollectMetrics_Request) XXX_Unmarshal(b []byte) error { @@ -643,7 +730,7 @@ func (m *CollectMetrics_Payload) Reset() { *m = CollectMetrics_Payload{} func (m *CollectMetrics_Payload) String() string { return proto.CompactTextString(m) } func (*CollectMetrics_Payload) ProtoMessage() {} func (*CollectMetrics_Payload) Descriptor() ([]byte, []int) { - return fileDescriptor_5ab9ba5b8d8b2ba5, []int{6, 1} + return fileDescriptor_5ab9ba5b8d8b2ba5, []int{7, 1} } func (m *CollectMetrics_Payload) XXX_Unmarshal(b []byte) error { @@ -682,7 +769,7 @@ func (m *CollectMetrics_Response) Reset() { *m = CollectMetrics_Response func (m *CollectMetrics_Response) String() string { return proto.CompactTextString(m) } func (*CollectMetrics_Response) ProtoMessage() {} func (*CollectMetrics_Response) Descriptor() ([]byte, []int) { - return fileDescriptor_5ab9ba5b8d8b2ba5, []int{6, 2} + return fileDescriptor_5ab9ba5b8d8b2ba5, []int{7, 2} } func (m *CollectMetrics_Response) XXX_Unmarshal(b []byte) error { @@ -720,7 +807,7 @@ func (m *CheckHealth) Reset() { *m = CheckHealth{} } func (m *CheckHealth) String() string { return proto.CompactTextString(m) } func (*CheckHealth) ProtoMessage() {} func (*CheckHealth) Descriptor() ([]byte, []int) { - return fileDescriptor_5ab9ba5b8d8b2ba5, []int{7} + return fileDescriptor_5ab9ba5b8d8b2ba5, []int{8} } func (m *CheckHealth) XXX_Unmarshal(b []byte) error { @@ -751,7 +838,7 @@ func (m *CheckHealth_Request) Reset() { *m = CheckHealth_Request{} } func (m *CheckHealth_Request) String() string { return proto.CompactTextString(m) } func (*CheckHealth_Request) ProtoMessage() {} func (*CheckHealth_Request) Descriptor() ([]byte, []int) { - return fileDescriptor_5ab9ba5b8d8b2ba5, []int{7, 0} + return fileDescriptor_5ab9ba5b8d8b2ba5, []int{8, 0} } func (m *CheckHealth_Request) XXX_Unmarshal(b []byte) error { @@ -784,7 +871,7 @@ func (m *CheckHealth_Response) Reset() { *m = CheckHealth_Response{} } func (m *CheckHealth_Response) String() string { return proto.CompactTextString(m) } func (*CheckHealth_Response) ProtoMessage() {} func (*CheckHealth_Response) Descriptor() ([]byte, []int) { - return fileDescriptor_5ab9ba5b8d8b2ba5, []int{7, 1} + return fileDescriptor_5ab9ba5b8d8b2ba5, []int{8, 1} } func (m *CheckHealth_Response) XXX_Unmarshal(b []byte) error { @@ -838,7 +925,7 @@ func (m *StreamingRequest) Reset() { *m = StreamingRequest{} } func (m *StreamingRequest) String() string { return proto.CompactTextString(m) } func (*StreamingRequest) ProtoMessage() {} func (*StreamingRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_5ab9ba5b8d8b2ba5, []int{8} + return fileDescriptor_5ab9ba5b8d8b2ba5, []int{9} } func (m *StreamingRequest) XXX_Unmarshal(b []byte) error { @@ -907,7 +994,7 @@ func (m *StreamingMessage) Reset() { *m = StreamingMessage{} } func (m *StreamingMessage) String() string { return proto.CompactTextString(m) } func (*StreamingMessage) ProtoMessage() {} func (*StreamingMessage) Descriptor() ([]byte, []int) { - return fileDescriptor_5ab9ba5b8d8b2ba5, []int{9} + return fileDescriptor_5ab9ba5b8d8b2ba5, []int{10} } func (m *StreamingMessage) XXX_Unmarshal(b []byte) error { @@ -960,7 +1047,7 @@ func (m *StreamingClose) Reset() { *m = StreamingClose{} } func (m *StreamingClose) String() string { return proto.CompactTextString(m) } func (*StreamingClose) ProtoMessage() {} func (*StreamingClose) Descriptor() ([]byte, []int) { - return fileDescriptor_5ab9ba5b8d8b2ba5, []int{10} + return fileDescriptor_5ab9ba5b8d8b2ba5, []int{11} } func (m *StreamingClose) XXX_Unmarshal(b []byte) error { @@ -1007,7 +1094,7 @@ func (m *RenderRequest) Reset() { *m = RenderRequest{} } func (m *RenderRequest) String() string { return proto.CompactTextString(m) } func (*RenderRequest) ProtoMessage() {} func (*RenderRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_5ab9ba5b8d8b2ba5, []int{11} + return fileDescriptor_5ab9ba5b8d8b2ba5, []int{12} } func (m *RenderRequest) XXX_Unmarshal(b []byte) error { @@ -1102,7 +1189,7 @@ func (m *RenderResponse) Reset() { *m = RenderResponse{} } func (m *RenderResponse) String() string { return proto.CompactTextString(m) } func (*RenderResponse) ProtoMessage() {} func (*RenderResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_5ab9ba5b8d8b2ba5, []int{12} + return fileDescriptor_5ab9ba5b8d8b2ba5, []int{13} } func (m *RenderResponse) XXX_Unmarshal(b []byte) error { @@ -1132,6 +1219,7 @@ func (m *RenderResponse) GetError() string { func init() { proto.RegisterEnum("pluginv2.CheckHealth_Response_HealthStatus", CheckHealth_Response_HealthStatus_name, CheckHealth_Response_HealthStatus_value) + proto.RegisterType((*DataSourceConfig)(nil), "pluginv2.DataSourceConfig") proto.RegisterType((*PluginConfig)(nil), "pluginv2.PluginConfig") proto.RegisterMapType((map[string]string)(nil), "pluginv2.PluginConfig.DecryptedSecureJsonDataEntry") proto.RegisterType((*TimeRange)(nil), "pluginv2.TimeRange") @@ -1164,86 +1252,93 @@ func init() { func init() { proto.RegisterFile("backend.proto", fileDescriptor_5ab9ba5b8d8b2ba5) } var fileDescriptor_5ab9ba5b8d8b2ba5 = []byte{ - // 1261 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x57, 0xcd, 0x6e, 0x1c, 0x45, - 0x10, 0x66, 0xf6, 0xd7, 0x5b, 0xbb, 0x76, 0x9c, 0x8e, 0x95, 0xac, 0x26, 0x21, 0x38, 0xab, 0x08, - 0x1c, 0x01, 0x1b, 0xd8, 0x1c, 0x40, 0x89, 0x04, 0x82, 0xb5, 0xf3, 0xe7, 0x38, 0x76, 0xda, 0x89, - 0x10, 0x07, 0x90, 0xda, 0x33, 0xb5, 0xbb, 0x83, 0x67, 0xba, 0x37, 0x3d, 0x3d, 0x81, 0xe5, 0x21, - 0xb8, 0x70, 0xe6, 0xc6, 0x19, 0x04, 0xcf, 0x00, 0x8f, 0xc0, 0x81, 0xb7, 0x40, 0xe2, 0xc0, 0x15, - 0x75, 0x4f, 0xcf, 0xcf, 0x5a, 0xde, 0x8d, 0x02, 0x11, 0xe2, 0x56, 0x55, 0x53, 0x5d, 0xfd, 0xd5, - 0x4f, 0x7f, 0xdd, 0x03, 0xab, 0x47, 0xcc, 0x3b, 0x46, 0xee, 0xf7, 0xa7, 0x52, 0x28, 0x41, 0x56, - 0xa6, 0x61, 0x32, 0x0e, 0xf8, 0xb3, 0x81, 0x7b, 0x71, 0x2c, 0xc4, 0x38, 0xc4, 0xeb, 0xc6, 0x7e, - 0x94, 0x8c, 0xae, 0x63, 0x34, 0x55, 0xb3, 0xd4, 0xad, 0xf7, 0x6b, 0x05, 0x3a, 0x07, 0xc6, 0x73, - 0x28, 0xf8, 0x28, 0x18, 0x93, 0x35, 0xa8, 0x04, 0x7e, 0xd7, 0xd9, 0x74, 0xb6, 0xaa, 0xb4, 0x12, - 0xf8, 0x64, 0x03, 0xea, 0x42, 0x8e, 0xef, 0xf9, 0xdd, 0x8a, 0x31, 0xa5, 0x0a, 0x21, 0x50, 0xe3, - 0x2c, 0xc2, 0x6e, 0x75, 0xd3, 0xd9, 0x6a, 0x51, 0x23, 0x6b, 0x9b, 0x9a, 0x4d, 0xb1, 0x5b, 0x4b, - 0x6d, 0x5a, 0x26, 0xeb, 0x50, 0x4d, 0x64, 0xd8, 0xad, 0x1b, 0x93, 0x16, 0x89, 0x0b, 0x2b, 0x5f, - 0xc4, 0x82, 0x6f, 0x33, 0xc5, 0xba, 0x0d, 0x63, 0xce, 0x75, 0x12, 0xc1, 0x05, 0x1f, 0x3d, 0x39, - 0x9b, 0x2a, 0xf4, 0x0f, 0xd1, 0x4b, 0x24, 0xde, 0xcf, 0x5c, 0x9b, 0x9b, 0xd5, 0xad, 0xf6, 0xe0, - 0x46, 0x3f, 0xcb, 0xaa, 0x5f, 0x06, 0xdd, 0xdf, 0x3e, 0x7d, 0xd5, 0x0e, 0x57, 0x72, 0x46, 0x17, - 0xc5, 0x74, 0xef, 0xc3, 0xa5, 0x65, 0x0b, 0x35, 0xf8, 0x63, 0x9c, 0x99, 0x5a, 0xb4, 0xa8, 0x16, - 0x75, 0x31, 0x9e, 0xb1, 0x30, 0x41, 0x53, 0x8c, 0x16, 0x4d, 0x95, 0x9b, 0x95, 0xf7, 0x9d, 0xde, - 0x2e, 0xb4, 0x1e, 0x07, 0x11, 0x52, 0xc6, 0xc7, 0x48, 0x36, 0xa1, 0x3d, 0x92, 0x22, 0xda, 0x99, - 0x0a, 0x6f, 0xb2, 0x77, 0x68, 0x8b, 0x59, 0x36, 0x91, 0x4b, 0xd0, 0x52, 0x22, 0xfb, 0x9e, 0x56, - 0xb6, 0x30, 0xf4, 0x7e, 0x70, 0xa0, 0xa5, 0x61, 0x3c, 0x4a, 0x50, 0x9a, 0x4d, 0x25, 0x8e, 0xee, - 0xf9, 0x16, 0x48, 0xaa, 0x90, 0xab, 0xb0, 0x1a, 0xb1, 0xaf, 0xb4, 0xd7, 0x81, 0x08, 0xb8, 0x8a, - 0x6d, 0x94, 0x79, 0x23, 0xb9, 0x0c, 0x10, 0x70, 0x85, 0xf2, 0x19, 0x0b, 0xf7, 0x0e, 0x4d, 0xb7, - 0xaa, 0xb4, 0x64, 0x21, 0xef, 0x42, 0x4b, 0x65, 0xb0, 0x4d, 0xe3, 0xda, 0x83, 0x73, 0x45, 0x8d, - 0xf3, 0x8c, 0x68, 0xe1, 0xa5, 0xdb, 0xac, 0x1b, 0x66, 0x7a, 0xda, 0xa1, 0x46, 0xee, 0xfd, 0xe1, - 0xc0, 0x7a, 0x0e, 0x98, 0xe2, 0xd3, 0x04, 0x63, 0x45, 0xfa, 0xd0, 0xf0, 0x4c, 0x7b, 0x0c, 0xf0, - 0xf6, 0xe0, 0xfc, 0xe9, 0xcd, 0xa3, 0xd6, 0x8b, 0x7c, 0x04, 0xcd, 0x09, 0x32, 0x1f, 0xa5, 0xce, - 0x45, 0x77, 0xfb, 0x8d, 0x62, 0xc1, 0xc9, 0xe0, 0xfd, 0xbb, 0xa9, 0x67, 0xda, 0xe1, 0x6c, 0x1d, - 0x79, 0x1b, 0x9a, 0x4f, 0x13, 0x94, 0x01, 0xc6, 0xdd, 0xaa, 0x09, 0x71, 0xee, 0xb4, 0x10, 0x99, - 0x8f, 0x7b, 0x13, 0x3a, 0xe5, 0x38, 0x2f, 0xd4, 0xf0, 0x1f, 0x1d, 0x38, 0x5b, 0x42, 0x15, 0x4f, - 0x05, 0x8f, 0x91, 0x9c, 0x87, 0xc6, 0x48, 0xb2, 0x08, 0xe3, 0xae, 0xb3, 0x59, 0xdd, 0xea, 0x50, - 0xab, 0x91, 0x1d, 0x58, 0x89, 0x50, 0x31, 0x5f, 0x8f, 0x72, 0x9a, 0xdc, 0xb5, 0x53, 0x93, 0x4b, - 0xc3, 0xf4, 0xf7, 0xac, 0x6f, 0x9a, 0x5e, 0xbe, 0xd4, 0xbd, 0x05, 0xab, 0x73, 0x9f, 0x5e, 0x08, - 0xf1, 0x2f, 0x35, 0xe8, 0x0c, 0x59, 0x18, 0x52, 0x8c, 0x45, 0x22, 0x3d, 0x74, 0xaf, 0x02, 0x1c, - 0x2a, 0x19, 0xf0, 0xf1, 0x83, 0x20, 0x56, 0x1a, 0xba, 0xf1, 0x4d, 0xa1, 0xb7, 0xa8, 0xd5, 0xdc, - 0x9f, 0x2a, 0xd0, 0xfc, 0xa7, 0x2d, 0x25, 0x50, 0x9b, 0x32, 0x35, 0xb1, 0x58, 0x8c, 0xac, 0xf7, - 0x89, 0x50, 0x4d, 0x84, 0x6f, 0xc9, 0xc3, 0x6a, 0x19, 0x55, 0xd4, 0x0a, 0xaa, 0xd8, 0x29, 0x06, - 0xa2, 0x6e, 0x6a, 0xf6, 0x66, 0xb1, 0x5d, 0x39, 0x91, 0xfe, 0xf2, 0xa1, 0x20, 0x50, 0x3b, 0x12, - 0xfe, 0xcc, 0xb0, 0x4d, 0x87, 0x1a, 0xd9, 0xfd, 0xec, 0xb9, 0x9d, 0x7f, 0xaf, 0x5c, 0xc7, 0xf6, - 0xe0, 0xca, 0x82, 0xad, 0x8b, 0x02, 0x96, 0x4a, 0xed, 0xfe, 0xee, 0xc0, 0x4a, 0x3e, 0x13, 0x04, - 0x6a, 0x9e, 0xf0, 0xd1, 0x04, 0xaf, 0x53, 0x23, 0x93, 0xdb, 0x27, 0x67, 0xfd, 0xad, 0x85, 0xa9, - 0xd9, 0x91, 0x58, 0x9e, 0x5b, 0xf5, 0x3f, 0xcb, 0xad, 0xf7, 0x8d, 0x03, 0x6b, 0x43, 0x11, 0x86, - 0xe8, 0xa9, 0x3d, 0x54, 0x32, 0xf0, 0x62, 0xb7, 0x95, 0x4f, 0x88, 0x7b, 0x0d, 0x9a, 0x07, 0x6c, - 0x16, 0x0a, 0xe6, 0x6b, 0xee, 0x99, 0x4a, 0xa1, 0xbb, 0x8b, 0x49, 0x6c, 0xb6, 0xef, 0xd0, 0x92, - 0xc5, 0xbd, 0x5d, 0xaa, 0xd1, 0x4d, 0x68, 0x46, 0x69, 0x30, 0x3b, 0x59, 0x9b, 0x25, 0x4c, 0x73, - 0x9b, 0xf5, 0x6d, 0x78, 0x9a, 0x2d, 0xd0, 0x6c, 0xd9, 0x1e, 0x4e, 0xd0, 0x3b, 0xbe, 0x8b, 0x2c, - 0x54, 0x93, 0x32, 0x9a, 0x6f, 0xcb, 0x7d, 0x18, 0x42, 0x23, 0x56, 0x4c, 0x59, 0x2c, 0x6b, 0x73, - 0xd3, 0x54, 0x2c, 0x9f, 0xab, 0x78, 0xa8, 0x26, 0x87, 0x66, 0x09, 0xb5, 0x4b, 0x75, 0xc1, 0x03, - 0x3e, 0x12, 0xd9, 0x44, 0x6b, 0xb9, 0xd7, 0x37, 0x05, 0xcf, 0x7d, 0x49, 0x1b, 0x9a, 0x4f, 0x1e, - 0xee, 0x3e, 0xdc, 0xff, 0xe4, 0xe1, 0xfa, 0x2b, 0xa4, 0x01, 0x95, 0xfd, 0xdd, 0x75, 0x87, 0xb4, - 0xa0, 0xbe, 0x43, 0xe9, 0x3e, 0x5d, 0xaf, 0xf4, 0xfe, 0x72, 0x60, 0xfd, 0x50, 0x49, 0x64, 0x51, - 0xc0, 0xc7, 0xd9, 0xd1, 0x72, 0xc1, 0xde, 0xd8, 0xf7, 0xb2, 0xdb, 0x37, 0xd7, 0x97, 0x32, 0xe3, - 0xc9, 0x40, 0x0b, 0x06, 0x65, 0x03, 0xea, 0x4a, 0x4c, 0x03, 0xcf, 0x1e, 0xba, 0x54, 0xc9, 0xc7, - 0xc7, 0x5e, 0xd9, 0x5a, 0xd6, 0x6d, 0x8b, 0x93, 0xa3, 0xd8, 0x93, 0xc1, 0x11, 0xfa, 0x86, 0xe5, - 0x57, 0x68, 0xc9, 0xf2, 0xaf, 0x48, 0xf3, 0xf3, 0x52, 0xe2, 0x7b, 0x18, 0xc7, 0x6c, 0x8c, 0x4b, - 0x13, 0xcf, 0x51, 0x57, 0xca, 0xa8, 0xbb, 0x7a, 0x58, 0xcc, 0x62, 0x9b, 0x4d, 0xa6, 0xf6, 0x5e, - 0x87, 0xb5, 0x3c, 0xfe, 0x30, 0x14, 0x31, 0xea, 0x08, 0x9e, 0x48, 0xb8, 0xb2, 0xa1, 0x53, 0xa5, - 0xf7, 0xa7, 0x03, 0xab, 0x14, 0xb9, 0x8f, 0x32, 0x2b, 0xbf, 0x65, 0x1f, 0xa7, 0x60, 0x9f, 0x0d, - 0xa8, 0x7f, 0x19, 0xf8, 0x96, 0xbc, 0xea, 0x34, 0x55, 0x34, 0x7b, 0x4d, 0x30, 0x18, 0x4f, 0x94, - 0xd9, 0xba, 0x4e, 0xad, 0xa6, 0x31, 0xe9, 0x2b, 0x52, 0x24, 0xca, 0x14, 0xb3, 0x4e, 0x33, 0x55, - 0xe7, 0xa7, 0xc5, 0xaf, 0x05, 0x47, 0xfb, 0x0e, 0xca, 0x75, 0xfd, 0x0d, 0xb9, 0x27, 0xfc, 0x80, - 0x8f, 0xb3, 0xc7, 0x50, 0xa6, 0xeb, 0x6f, 0xa3, 0x20, 0xc4, 0x03, 0xcd, 0x9f, 0xcd, 0xf4, 0x5b, - 0xa6, 0xeb, 0xe7, 0x83, 0x34, 0xf0, 0x77, 0x71, 0xd6, 0x5d, 0x31, 0x1f, 0x0b, 0x83, 0xc6, 0xe8, - 0x8b, 0x88, 0x05, 0xbc, 0xdb, 0x4a, 0x19, 0x36, 0xd5, 0x74, 0x75, 0xb2, 0xa4, 0xed, 0x91, 0xd8, - 0x80, 0x3a, 0x4a, 0x29, 0x64, 0xf6, 0xb4, 0x30, 0xca, 0xe0, 0x3b, 0x07, 0x6a, 0x43, 0x21, 0x91, - 0xec, 0xcf, 0x5f, 0x18, 0xe4, 0xf2, 0x72, 0xfe, 0x75, 0x5f, 0x7b, 0x0e, 0x89, 0x91, 0xed, 0xf2, - 0xbb, 0xc6, 0x5d, 0x7c, 0xbd, 0xbb, 0x17, 0x97, 0xdc, 0x8e, 0x83, 0x9f, 0x1d, 0x68, 0x6f, 0x07, - 0x6c, 0xcc, 0x45, 0xac, 0x02, 0x2f, 0x26, 0x4f, 0x4e, 0x12, 0x12, 0x59, 0xcc, 0x1e, 0xd9, 0x06, - 0x57, 0x96, 0x78, 0x58, 0xb0, 0x0f, 0xe6, 0x68, 0x85, 0xbc, 0xba, 0x88, 0x2e, 0xd2, 0x80, 0x97, - 0x97, 0xb3, 0xc9, 0xe0, 0x7b, 0x07, 0xce, 0xdc, 0x91, 0x6c, 0xc4, 0x38, 0x3b, 0x08, 0x99, 0x1a, - 0x09, 0x19, 0x91, 0x5d, 0xc3, 0x4e, 0xff, 0xab, 0xda, 0x3e, 0x82, 0xd6, 0x63, 0xc9, 0x78, 0x6c, - 0xf0, 0xbd, 0x9c, 0x90, 0x9f, 0xc2, 0xd9, 0x3c, 0xa4, 0x86, 0xfe, 0x31, 0xf3, 0x8e, 0x5f, 0x52, - 0xe8, 0xdf, 0x1c, 0x38, 0x93, 0x1f, 0xf8, 0xf4, 0x05, 0x42, 0x3e, 0x84, 0xe6, 0x50, 0x70, 0x8e, - 0x9e, 0x22, 0x0b, 0x9e, 0x27, 0xae, 0x7b, 0x0a, 0x7d, 0x5a, 0x3a, 0x7a, 0xc7, 0xd1, 0x6c, 0x7b, - 0x20, 0x85, 0x87, 0x71, 0x4c, 0xdc, 0xc5, 0x3c, 0xbb, 0x2c, 0x08, 0xf9, 0x00, 0x60, 0x3b, 0x88, - 0xbd, 0x1c, 0x46, 0xfa, 0x07, 0xd6, 0xcf, 0xfe, 0xc0, 0xfa, 0x3b, 0xfa, 0x0f, 0xcc, 0xed, 0x9e, - 0x12, 0xc1, 0xb0, 0xd6, 0xe0, 0x8e, 0x1e, 0x0c, 0x7d, 0x52, 0x51, 0x92, 0x5b, 0xd0, 0x48, 0x65, - 0x72, 0xa1, 0xf0, 0x9f, 0x23, 0xaf, 0x72, 0xa0, 0xf9, 0x03, 0x7e, 0xd4, 0x30, 0x5b, 0xde, 0xf8, - 0x3b, 0x00, 0x00, 0xff, 0xff, 0x85, 0x4e, 0xfe, 0x13, 0x1d, 0x0e, 0x00, 0x00, + // 1375 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x57, 0x4b, 0x8f, 0x1b, 0xc5, + 0x16, 0xbe, 0xed, 0xc7, 0x78, 0x7c, 0xec, 0x4c, 0x9c, 0xca, 0x28, 0xb1, 0x3a, 0xb9, 0xb9, 0x8e, + 0x15, 0xdd, 0x3b, 0xb9, 0x80, 0x03, 0xce, 0x02, 0x94, 0x48, 0xa0, 0xe0, 0x71, 0x5e, 0x93, 0xc9, + 0x4c, 0xca, 0x89, 0x10, 0x0b, 0x90, 0xca, 0xdd, 0xc7, 0x76, 0x33, 0xed, 0x2e, 0xa7, 0xba, 0x3a, + 0x60, 0x7e, 0x04, 0x1b, 0xd6, 0xd9, 0xb1, 0x06, 0xc1, 0x6f, 0x60, 0xc5, 0x9e, 0x05, 0xff, 0x02, + 0x89, 0x05, 0x5b, 0x54, 0x8f, 0x6e, 0xb7, 0x27, 0x63, 0x47, 0x81, 0x08, 0xb1, 0x3b, 0xe7, 0xf4, + 0xa9, 0x53, 0xdf, 0x79, 0xd4, 0x57, 0xd5, 0x70, 0x6a, 0xc8, 0xbc, 0x23, 0x8c, 0xfc, 0xce, 0x4c, + 0x70, 0xc9, 0xc9, 0xe6, 0x2c, 0x4c, 0xc6, 0x41, 0xf4, 0xac, 0xeb, 0x5e, 0x18, 0x73, 0x3e, 0x0e, + 0xf1, 0x9a, 0xb6, 0x0f, 0x93, 0xd1, 0x35, 0x9c, 0xce, 0xe4, 0xdc, 0xb8, 0xb5, 0x7f, 0x72, 0xa0, + 0xb1, 0xcb, 0x24, 0x1b, 0xf0, 0x44, 0x78, 0xd8, 0xe3, 0xd1, 0x28, 0x18, 0x93, 0x2d, 0x28, 0x04, + 0x7e, 0xb3, 0xd4, 0x72, 0x76, 0x8a, 0xb4, 0x10, 0xf8, 0x84, 0x40, 0x29, 0x62, 0x53, 0x6c, 0x96, + 0x5b, 0xce, 0x4e, 0x95, 0x6a, 0x99, 0x34, 0xa0, 0x98, 0x88, 0xb0, 0xb9, 0xa1, 0x4d, 0x4a, 0x54, + 0x5e, 0x49, 0x8c, 0xa2, 0x59, 0x31, 0x5e, 0x4a, 0x26, 0x2e, 0x6c, 0xfa, 0x4c, 0xb2, 0x21, 0x8b, + 0xb1, 0xb9, 0xa9, 0xed, 0x99, 0x4e, 0xfe, 0x0f, 0x8d, 0x21, 0x8b, 0x03, 0xef, 0x56, 0x22, 0x27, + 0xfd, 0x88, 0x0d, 0x43, 0xf4, 0x9b, 0xd5, 0x96, 0xb3, 0xb3, 0x49, 0x5f, 0xb0, 0x93, 0x2b, 0x2a, + 0x3d, 0x6b, 0x7b, 0xa2, 0x36, 0x01, 0x1d, 0x6c, 0xd9, 0xd8, 0x7e, 0x5e, 0x84, 0xfa, 0xa1, 0x4e, + 0xdb, 0x26, 0xb2, 0x0d, 0x65, 0x2e, 0xc6, 0xf7, 0xfc, 0xa6, 0xa3, 0x73, 0x31, 0x8a, 0x02, 0x65, + 0x8a, 0x73, 0xcf, 0x6f, 0x16, 0x0c, 0xa8, 0x54, 0x27, 0x97, 0x00, 0x8c, 0xfc, 0x78, 0x3e, 0xc3, + 0x66, 0x51, 0x7f, 0xcd, 0x59, 0xd4, 0xda, 0xcf, 0x62, 0x1e, 0xa9, 0x92, 0xe9, 0x02, 0xd5, 0x69, + 0xa6, 0x93, 0x29, 0x9c, 0xf7, 0xd1, 0x13, 0xf3, 0x99, 0x44, 0x7f, 0x80, 0x5e, 0x22, 0xf0, 0x7e, + 0xea, 0x5a, 0x6e, 0x15, 0x77, 0x6a, 0xdd, 0xeb, 0x9d, 0xb4, 0x29, 0x9d, 0x3c, 0xcc, 0xce, 0xee, + 0xc9, 0xab, 0xfa, 0x91, 0x14, 0x73, 0xba, 0x2a, 0x26, 0xb9, 0x08, 0xd5, 0x64, 0xe6, 0x33, 0x89, + 0xfe, 0xfe, 0x40, 0xf7, 0xa1, 0x48, 0x17, 0x06, 0x72, 0x1b, 0x1a, 0xaa, 0xd2, 0x71, 0xae, 0xaf, + 0xba, 0x33, 0xb5, 0xae, 0xbb, 0x40, 0x71, 0xbc, 0xf3, 0xf4, 0x85, 0x35, 0xee, 0x7d, 0xb8, 0xb8, + 0x0e, 0x9e, 0x9a, 0x83, 0x23, 0x9c, 0xeb, 0x02, 0x57, 0xa9, 0x12, 0x55, 0xd1, 0x9f, 0xb1, 0x30, + 0x41, 0x5b, 0x5b, 0xa3, 0xdc, 0x28, 0xbc, 0xe7, 0xb4, 0xf7, 0xa0, 0xfa, 0x38, 0x98, 0x22, 0x65, + 0xd1, 0x18, 0x49, 0x0b, 0x6a, 0x23, 0xc1, 0xa7, 0xfd, 0x19, 0xf7, 0x26, 0xfb, 0x03, 0xdb, 0xa1, + 0xbc, 0x49, 0x25, 0x28, 0x79, 0xfa, 0xbd, 0x60, 0x12, 0xcc, 0x0c, 0xed, 0x6f, 0x1d, 0xa8, 0x2a, + 0x18, 0x8f, 0x12, 0x14, 0x7a, 0x53, 0x81, 0x23, 0xdb, 0xe9, 0x2a, 0x35, 0x8a, 0x1a, 0x9b, 0x29, + 0xfb, 0x42, 0x79, 0x1d, 0xf2, 0x20, 0x92, 0xb1, 0x8d, 0xb2, 0x6c, 0x54, 0x3d, 0x0f, 0x22, 0x89, + 0xe2, 0x19, 0x0b, 0xf7, 0x07, 0xba, 0xe7, 0x45, 0x9a, 0xb3, 0x90, 0x77, 0xa0, 0x2a, 0x53, 0xd8, + 0xba, 0xe9, 0xb5, 0xee, 0xd9, 0x45, 0x0d, 0xb3, 0x8c, 0xe8, 0xc2, 0x4b, 0x9d, 0x05, 0x35, 0x16, + 0xfa, 0xc4, 0xd4, 0xa9, 0x96, 0xdb, 0xbf, 0xda, 0xa3, 0xa6, 0x01, 0x53, 0x7c, 0x9a, 0x60, 0x2c, + 0x49, 0x07, 0x36, 0x3c, 0xd3, 0x1c, 0x47, 0x07, 0x3e, 0x77, 0xf2, 0x88, 0x50, 0xeb, 0x45, 0x6e, + 0x41, 0x65, 0x82, 0xcc, 0x47, 0xa1, 0x72, 0x51, 0x33, 0xf5, 0xbf, 0xe5, 0x6e, 0xe6, 0x83, 0x77, + 0xee, 0x1a, 0x4f, 0x33, 0x47, 0xe9, 0x3a, 0xf2, 0x16, 0x54, 0x9e, 0x26, 0x28, 0x02, 0x8c, 0x9b, + 0x45, 0x1d, 0xe2, 0xec, 0x49, 0x21, 0x52, 0x1f, 0xf7, 0x06, 0xd4, 0xf3, 0x71, 0x5e, 0xa9, 0xe1, + 0xdf, 0x39, 0x70, 0x26, 0x87, 0x2a, 0x9e, 0xf1, 0x28, 0x46, 0x72, 0x0e, 0x36, 0x46, 0x82, 0x4d, + 0x31, 0x6e, 0x3a, 0xad, 0xe2, 0x4e, 0x9d, 0x5a, 0x8d, 0xf4, 0x61, 0x73, 0x8a, 0x92, 0xa9, 0x11, + 0xb4, 0xc9, 0x5d, 0x3d, 0x31, 0x39, 0x13, 0xa6, 0xb3, 0x6f, 0x7d, 0x4d, 0x7a, 0xd9, 0x52, 0xf7, + 0x26, 0x9c, 0x5a, 0xfa, 0xf4, 0x4a, 0x88, 0x7f, 0x2c, 0x41, 0xbd, 0xc7, 0xc2, 0x90, 0xa2, 0x39, + 0x05, 0xee, 0x15, 0x80, 0x81, 0x14, 0x41, 0x34, 0x7e, 0x10, 0xc4, 0x52, 0x41, 0xd7, 0xbe, 0x06, + 0x7a, 0x95, 0x5a, 0xcd, 0xfd, 0xbe, 0x00, 0x95, 0x3f, 0xdb, 0x52, 0x02, 0xa5, 0x19, 0x93, 0x13, + 0x8b, 0x45, 0xcb, 0x6a, 0x9f, 0x29, 0xca, 0x09, 0xf7, 0x2d, 0x05, 0x59, 0x2d, 0x65, 0xdd, 0xd2, + 0x82, 0x75, 0xfb, 0x8b, 0x81, 0x30, 0x24, 0xf3, 0xc6, 0x62, 0xbb, 0x7c, 0x22, 0x9d, 0xf5, 0x43, + 0x41, 0xa0, 0x34, 0xe4, 0xfe, 0x5c, 0xf3, 0x48, 0x9d, 0x6a, 0xd9, 0xfd, 0xe4, 0xa5, 0x9d, 0x7f, + 0x37, 0x5f, 0xc7, 0x5a, 0xf7, 0xf2, 0x8a, 0xad, 0x17, 0x05, 0xcc, 0x95, 0xda, 0xfd, 0xc5, 0x81, + 0xcd, 0x6c, 0x26, 0x08, 0x94, 0x3c, 0xee, 0xa3, 0x0e, 0x5e, 0xa6, 0x5a, 0x26, 0xb7, 0x8f, 0xcf, + 0xfa, 0x9b, 0x2b, 0x53, 0xb3, 0x23, 0xb1, 0x3e, 0xb7, 0xe2, 0xdf, 0x96, 0x5b, 0xfb, 0x2b, 0x07, + 0xb6, 0x7a, 0x3c, 0x0c, 0xd1, 0x93, 0xfb, 0x28, 0x45, 0xe0, 0xc5, 0x6e, 0x35, 0x9b, 0x10, 0xf7, + 0x2a, 0x54, 0x0e, 0xd9, 0x3c, 0xe4, 0xcc, 0xdc, 0x37, 0x82, 0xab, 0xee, 0x62, 0x12, 0xeb, 0xed, + 0xeb, 0x34, 0x67, 0x71, 0x6f, 0xe7, 0x6a, 0x74, 0x03, 0x2a, 0x53, 0x13, 0xcc, 0x4e, 0x56, 0x2b, + 0x87, 0x69, 0x69, 0xb3, 0x8e, 0x0d, 0x4f, 0xd3, 0x05, 0x8a, 0x2d, 0x6b, 0xbd, 0x09, 0x7a, 0x47, + 0x77, 0x91, 0x85, 0x72, 0x92, 0x47, 0xf3, 0x75, 0xbe, 0x0f, 0x3d, 0xd8, 0x88, 0x25, 0x93, 0x16, + 0xcb, 0xd6, 0xd2, 0x34, 0x2d, 0x96, 0x2f, 0x55, 0x3c, 0x94, 0x93, 0x81, 0x5e, 0x42, 0xed, 0x52, + 0x55, 0xf0, 0x20, 0x1a, 0xf1, 0x74, 0xa2, 0x95, 0xdc, 0xee, 0xe8, 0x82, 0x67, 0xbe, 0xa4, 0x06, + 0x95, 0x27, 0x0f, 0xf7, 0x1e, 0x1e, 0x7c, 0xf4, 0xb0, 0xf1, 0x2f, 0xb2, 0x01, 0x85, 0x83, 0xbd, + 0x86, 0x43, 0xaa, 0x50, 0xee, 0x53, 0x7a, 0x40, 0x1b, 0x85, 0xf6, 0xef, 0x0e, 0x34, 0x06, 0x52, + 0x20, 0x9b, 0x06, 0xd1, 0x38, 0x3d, 0x5a, 0xf9, 0x9b, 0xdb, 0x5c, 0x18, 0x8b, 0x9b, 0x7b, 0x1d, + 0x33, 0x1e, 0x0f, 0xb4, 0x62, 0x50, 0xb6, 0xa1, 0x2c, 0xf9, 0x2c, 0xf0, 0xec, 0xa1, 0x33, 0x4a, + 0x36, 0x3e, 0xe6, 0xd0, 0x69, 0x59, 0xb5, 0x2d, 0x4e, 0x86, 0xb1, 0x27, 0x82, 0x21, 0xfa, 0x9a, + 0xe5, 0x37, 0x69, 0xce, 0xf2, 0x97, 0x48, 0xf3, 0xd3, 0x5c, 0xe2, 0xfb, 0x18, 0xc7, 0x6c, 0x8c, + 0x6b, 0x13, 0xcf, 0x50, 0x17, 0xf2, 0xa8, 0x9b, 0x6a, 0x58, 0xf4, 0x62, 0x9b, 0x4d, 0xaa, 0xb6, + 0xff, 0x0b, 0x5b, 0x59, 0xfc, 0x5e, 0xc8, 0x63, 0x54, 0x11, 0x3c, 0x9e, 0x44, 0x32, 0x7d, 0x26, + 0x69, 0xa5, 0xfd, 0x9b, 0x03, 0xa7, 0x28, 0x46, 0x3e, 0x8a, 0xb4, 0xfc, 0x96, 0x7d, 0x9c, 0x05, + 0xfb, 0x6c, 0x43, 0xf9, 0xf3, 0xc0, 0xb7, 0xe4, 0x55, 0xa6, 0x46, 0x51, 0xec, 0x35, 0xc1, 0x60, + 0x3c, 0x91, 0x7a, 0xeb, 0x32, 0xb5, 0x9a, 0xc2, 0xa4, 0xae, 0x48, 0x9e, 0x48, 0x5d, 0xcc, 0x32, + 0x4d, 0x55, 0x95, 0x9f, 0x12, 0xbf, 0xe4, 0x51, 0xfa, 0xca, 0xcc, 0x74, 0xf5, 0x0d, 0x23, 0x8f, + 0xfb, 0x41, 0x34, 0xb6, 0xcf, 0xcd, 0x4c, 0x57, 0xdf, 0x46, 0x41, 0x88, 0x87, 0x8a, 0x3f, 0xcd, + 0xbb, 0x33, 0xd3, 0xd5, 0xf3, 0x41, 0x68, 0xf8, 0x7b, 0x38, 0xb7, 0x8f, 0xcf, 0x85, 0x41, 0x61, + 0xf4, 0xf9, 0x94, 0x05, 0x91, 0x7e, 0x73, 0x56, 0xa9, 0xd5, 0x54, 0x75, 0xd2, 0xa4, 0xed, 0x91, + 0xd8, 0x86, 0x32, 0x0a, 0xc1, 0x45, 0xfa, 0xb4, 0xd0, 0x4a, 0xf7, 0xb9, 0x03, 0xa5, 0x1e, 0x17, + 0x48, 0x0e, 0x96, 0x2f, 0x0c, 0x72, 0x69, 0x3d, 0xff, 0xba, 0xff, 0x79, 0x09, 0x89, 0x91, 0xdd, + 0xfc, 0xbb, 0xc6, 0x5d, 0x7d, 0xbd, 0xbb, 0x17, 0xd6, 0xdc, 0x8e, 0xdd, 0x1f, 0x1c, 0xa8, 0xed, + 0x06, 0x6c, 0x1c, 0xf1, 0x58, 0x06, 0x5e, 0x4c, 0x9e, 0x1c, 0x27, 0x24, 0xb2, 0x9a, 0x3d, 0xd2, + 0x0d, 0x2e, 0xaf, 0xf1, 0xb0, 0x60, 0x1f, 0x2c, 0xd1, 0x0a, 0xf9, 0xf7, 0x2a, 0xba, 0x30, 0x01, + 0x2f, 0xad, 0x67, 0x93, 0xee, 0x37, 0x0e, 0x9c, 0xbe, 0x23, 0xd8, 0x88, 0x45, 0xec, 0x30, 0x64, + 0x72, 0xc4, 0xc5, 0x94, 0xec, 0x69, 0x76, 0xfa, 0x47, 0xd5, 0xf6, 0x11, 0x54, 0x1f, 0x0b, 0x16, + 0xc5, 0x1a, 0xdf, 0xeb, 0x09, 0xf9, 0x31, 0x9c, 0xc9, 0x42, 0x2a, 0xe8, 0x1f, 0x32, 0xef, 0xe8, + 0x35, 0x85, 0xfe, 0xd9, 0x81, 0xd3, 0xd9, 0x81, 0x37, 0x2f, 0x10, 0xf2, 0x01, 0x54, 0x7a, 0x3c, + 0x8a, 0xd0, 0x93, 0x64, 0xc5, 0xf3, 0xc4, 0x75, 0x4f, 0xa0, 0x4f, 0x4b, 0x47, 0x6f, 0x3b, 0x8a, + 0x6d, 0x0f, 0x05, 0xf7, 0x30, 0x8e, 0x89, 0xbb, 0x9a, 0x67, 0xd7, 0x05, 0x21, 0xef, 0x03, 0xec, + 0x06, 0xb1, 0x97, 0xc1, 0x30, 0xbf, 0xa9, 0x9d, 0xf4, 0x37, 0xb5, 0xd3, 0x57, 0xbf, 0xa9, 0x6e, + 0xf3, 0x84, 0x08, 0x9a, 0xb5, 0xba, 0x77, 0xd4, 0x60, 0xa8, 0x93, 0x8a, 0x82, 0xdc, 0x84, 0x0d, + 0x23, 0x93, 0xf3, 0x0b, 0xff, 0x25, 0xf2, 0xca, 0x07, 0x5a, 0x3e, 0xe0, 0xc3, 0x0d, 0xbd, 0xe5, + 0xf5, 0x3f, 0x02, 0x00, 0x00, 0xff, 0xff, 0x53, 0xca, 0x5d, 0x41, 0x42, 0x0f, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/vendor/modules.txt b/vendor/modules.txt index ab3a13c0136..ac90b1a8604 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -148,7 +148,7 @@ github.com/gosimple/slug # github.com/grafana/grafana-plugin-model v0.0.0-20190930120109-1fc953a61fb4 github.com/grafana/grafana-plugin-model/go/datasource github.com/grafana/grafana-plugin-model/go/renderer -# github.com/grafana/grafana-plugin-sdk-go v0.14.0 +# github.com/grafana/grafana-plugin-sdk-go v0.16.0 github.com/grafana/grafana-plugin-sdk-go/backend/plugin github.com/grafana/grafana-plugin-sdk-go/dataframe github.com/grafana/grafana-plugin-sdk-go/genproto/pluginv2