diff --git a/docs/datasources/influxdb/page.md b/docs/datasources/influxdb/page.md new file mode 100644 index 000000000..0b34d187b --- /dev/null +++ b/docs/datasources/influxdb/page.md @@ -0,0 +1,128 @@ +# InfluxDB +GoFr supports injecting InfluxDB using an interface that defines the necessary methods to interact with InfluxDB v2+. +Any driver that implements this interface can be injected via the `app.AddInfluxDB()` method. + +--- + +## Interface + +```go +// InfluxDB defines the methods for interacting with an InfluxDB database. +type InfluxDB interface { + Connect() + CreateOrganization(ctx context.Context, orgName string) (string, error) + DeleteOrganization(ctx context.Context, orgID string) error + ListOrganization(ctx context.Context) (map[string]string, error) + + CreateBucket(ctx context.Context, orgID string, bucketName string, retentionPeriod time.Duration) (string, error) + DeleteBucket(ctx context.Context, orgID, bucketID string) error + ListBuckets(ctx context.Context, org string) (map[string]string, error) + + Ping(ctx context.Context) (bool, error) + HealthCheck(ctx context.Context) (any, error) + + Query(ctx context.Context, org string, fluxQuery string) ([]map[string]any, error) + WritePoints(ctx context.Context, bucket string, org string, points []container.InfluxPoint) error) + + UseLogger(logger any) + UseMetrics(metrics any) + UseTracer(tracer any) +} +``` + +This structure supports all essential InfluxDB operations including organization/bucket management, health checks, and metrics ingestion. + +Import the gofr's external driver for influxdb: + +```bash +go get gofr.dev/pkg/gofr/datasource/influxdb@latest +``` + +## Example +```go +package main + +import ( +"context" +"fmt" +"time" + + "gofr.dev/pkg/gofr" + "gofr.dev/pkg/gofr/datasource/influxdb" +) + +func main() { + + // Create a new GoFr application + app := gofr.New() + + // Initialize InfluxDB client + client := influxdb.New(influxdb.Config{ + Url: "http://localhost:8086", + Username: "admin", + Password: "admin1234", + Token: "", + }) + + // Add InfluxDB to application context + app.AddInfluxDB(client) + + // Sample route + app.GET("/greet", func(ctx *gofr.Context) (any, error) { + return "Hello World!", nil + }) + + // Ping InfluxDB + ok, err := client.Ping(context.Background()) + if err != nil { + app.Logger().Debug(err) + return + } + app.Logger().Debug("InfluxDB connected: ", ok) + + // Create organization + orgID, err := client.CreateOrganization(context.Background(), "demo-org") + if err != nil { + app.Logger().Debug(err) + return + } + + // List organizations + orgs, _ := client.ListOrganization(context.Background()) + app.Logger().Debug("Organizations: ") + for id, name := range orgs { + app.Logger().Debug(id, name) + } + + // Create bucket + bucketID, err := client.CreateBucket(context.Background(), orgID, "demo-bucket") + if err != nil { + app.Logger().Debug(err) + return + } + + // List buckets for organization + buckets, err := client.ListBuckets(context.Background(), "demo-org") + if err != nil { + app.Logger().Debug(err) + return + } + app.Logger().Debug("Buckets:", buckets) + + // Delete bucket + if err := client.DeleteBucket(context.Background(), bucketID); err != nil { + app.Logger().Debug(err) + return + } + app.Logger().Debug("Bucket deleted successfully") + + // Delete organization + if err := client.DeleteOrganization(context.Background(), orgID); err != nil { + app.Logger().Debug(err) + return + } + app.Logger().Debug("Organization deleted successfully") + // Start the server + app.Run() +} +``` diff --git a/docs/navigation.js b/docs/navigation.js index b0fcd196e..628ebe8ed 100644 --- a/docs/navigation.js +++ b/docs/navigation.js @@ -227,6 +227,11 @@ export const navigation = [ href: "/docs/datasources/elasticsearch", desc: "Learn how to connect to and interact with elasticsearch in GoFr." }, + { + title: "InfluxDB", + href: "/docs/datasources/influxdb", + desc: "Learn how to connect to and interact with influxdb in GoFr." + }, ], }, { diff --git a/go.work b/go.work index 4772f9d2f..1ffbb4b4d 100644 --- a/go.work +++ b/go.work @@ -22,4 +22,5 @@ use ( ./pkg/gofr/datasource/scylladb ./pkg/gofr/datasource/solr ./pkg/gofr/datasource/surrealdb + pkg/gofr/datasource/influxdb ) diff --git a/go.work.sum b/go.work.sum index b18de40ab..e58e7a8a6 100644 --- a/go.work.sum +++ b/go.work.sum @@ -32,6 +32,8 @@ cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmW cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= cloud.google.com/go v0.112.2/go.mod h1:iEqjp//KquGIJV/m+Pk3xecgKNhV+ry+vVTsy4TbDms= cloud.google.com/go v0.118.3/go.mod h1:Lhs3YLnBlwJ4KA6nuObNMZ/fCbOQBPuWKPoE0Wa/9Vc= +cloud.google.com/go v0.121.1 h1:S3kTQSydxmu1JfLRLpKtxRPA7rSrYPRPEUmL/PavVUw= +cloud.google.com/go v0.121.1/go.mod h1:nRFlrHq39MNVWu+zESP2PosMWA0ryJw8KUBZ2iZpxbw= cloud.google.com/go/accessapproval v1.8.2/go.mod h1:aEJvHZtpjqstffVwF/2mCXXSQmpskyzvw6zKLvLutZM= cloud.google.com/go/accessapproval v1.8.3 h1:axlU03FRiXDNupsmPG7LKzuS4Enk1gf598M62lWVB74= cloud.google.com/go/accessapproval v1.8.3/go.mod h1:3speETyAv63TDrDmo5lIkpVueFkQcQchkiw/TAMbBo4= @@ -108,6 +110,8 @@ cloud.google.com/go/auth v0.12.1/go.mod h1:BFMu+TNpF3DmvfBO9ClqTR/SiqVIm7LukKF9m cloud.google.com/go/auth v0.13.0/go.mod h1:COOjD9gwfKNKz+IIduatIhYJQIc0mG3H102r/EMxX6Q= cloud.google.com/go/auth v0.14.1/go.mod h1:4JHUxlGXisL0AW8kXPtUF6ztuOksyfUQNFjfsOCXkPM= cloud.google.com/go/auth v0.15.0/go.mod h1:WJDGqZ1o9E9wKIL+IwStfyn/+s59zl4Bi+1KQNVXLZ8= +cloud.google.com/go/auth v0.16.0/go.mod h1:1howDHJ5IETh/LwYs3ZxvlkXF48aSqqJUM+5o02dNOI= +cloud.google.com/go/auth v0.16.1/go.mod h1:1howDHJ5IETh/LwYs3ZxvlkXF48aSqqJUM+5o02dNOI= cloud.google.com/go/auth/oauth2adapt v0.2.2/go.mod h1:wcYjgpZI9+Yu7LyYBg4pqSiaRkfEK3GQcpb7C/uyF1Q= cloud.google.com/go/automl v1.14.2/go.mod h1:mIat+Mf77W30eWQ/vrhjXsXaRh8Qfu4WiymR0hR6Uxk= cloud.google.com/go/automl v1.14.4 h1:vkD+hQ75SMINMgJBT/KDpFYvfQLzJbtIQZdw0AWq8Rs= @@ -388,6 +392,8 @@ cloud.google.com/go/gkemulticloud v1.5.3 h1:334aZmOzIt3LVBpguCof8IHaLaftcZlx+L0T cloud.google.com/go/gkemulticloud v1.5.3/go.mod h1:KPFf+/RcfvmuScqwS9/2MF5exZAmXSuoSLPuaQ98Xlk= cloud.google.com/go/grafeas v0.3.11 h1:CobnwnyeY1j1Defi5vbEircI+jfrk3ci5m004ZjiFP4= cloud.google.com/go/grafeas v0.3.11/go.mod h1:dcQyG2+T4tBgG0MvJAh7g2wl/xHV2w+RZIqivwuLjNg= +cloud.google.com/go/grafeas v0.3.15 h1:lBjwKmhpiqOAFaE0xdqF8CqO74a99s8tUT5mCkBBxPs= +cloud.google.com/go/grafeas v0.3.15/go.mod h1:irwcwIQOBlLBotGdMwme8PipnloOPqILfIvMwlmu8Pk= cloud.google.com/go/gsuiteaddons v1.7.2/go.mod h1:GD32J2rN/4APilqZw4JKmwV84+jowYYMkEVwQEYuAWc= cloud.google.com/go/gsuiteaddons v1.7.3 h1:QafYhVhyFGpidBUUlVhy6lUHFogFOycVYm9DV7MinhA= cloud.google.com/go/gsuiteaddons v1.7.3/go.mod h1:0rR+LC21v1Sx1Yb6uohHI/F8DF3h2arSJSHvfi3GmyQ= @@ -429,6 +435,7 @@ cloud.google.com/go/logging v1.12.0/go.mod h1:wwYBt5HlYP1InnrtYI0wtwttpVU1rifnMT cloud.google.com/go/logging v1.13.0 h1:7j0HgAp0B94o1YRDqiqm26w4q1rDMH7XNRU34lJXHYc= cloud.google.com/go/logging v1.13.0/go.mod h1:36CoKh6KA/M0PbhPKMq6/qety2DCAErbhXT62TuXALA= cloud.google.com/go/longrunning v0.5.6/go.mod h1:vUaDrWYOMKRuhiv6JBnn49YxCPz2Ayn9GqyjaBT8/mA= +cloud.google.com/go/longrunning v0.6.6/go.mod h1:hyeGJUrPHcx0u2Uu1UFSoYZLn4lkMrccJig0t4FI7yw= cloud.google.com/go/managedidentities v1.7.2/go.mod h1:t0WKYzagOoD3FNtJWSWcU8zpWZz2i9cw2sKa9RiPx5I= cloud.google.com/go/managedidentities v1.7.3 h1:b9xGs24BIjfyvLgCtJoClOZpPi8d8owPgWe5JEINgaY= cloud.google.com/go/managedidentities v1.7.3/go.mod h1:H9hO2aMkjlpY+CNnKWRh+WoQiUIDO8457wWzUGsdtLA= @@ -651,6 +658,8 @@ cloud.google.com/go/storage v1.43.0 h1:CcxnSohZwizt4LCzQHWvBf1/kvtHUn7gk9QERXPyX cloud.google.com/go/storage v1.43.0/go.mod h1:ajvxEa7WmZS1PxvKRq4bq0tFT3vMd502JwstCcYv0Q0= cloud.google.com/go/storage v1.50.0 h1:3TbVkzTooBvnZsk7WaAQfOsNrdoM8QHusXA1cpk6QJs= cloud.google.com/go/storage v1.50.0/go.mod h1:l7XeiD//vx5lfqE3RavfmU9yvk5Pp0Zhcv482poyafY= +cloud.google.com/go/storage v1.53.0 h1:gg0ERZwL17pJ+Cz3cD2qS60w1WMDnwcm5YPAIQBHUAw= +cloud.google.com/go/storage v1.53.0/go.mod h1:7/eO2a/srr9ImZW9k5uufcNahT2+fPb8w5it1i5boaA= cloud.google.com/go/storagetransfer v1.11.2/go.mod h1:FcM29aY4EyZ3yVPmW5SxhqUdhjgPBUOFyy4rqiQbias= cloud.google.com/go/storagetransfer v1.12.1 h1:W3v9A7MGBN7H9sAFstyciwP/1XEQhUhZfrjclmDnpMs= cloud.google.com/go/storagetransfer v1.12.1/go.mod h1:hQqbfs8/LTmObJyCC0KrlBw8yBJ2bSFlaGila0qBMk4= @@ -772,14 +781,20 @@ github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.49 github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.49.0/go.mod h1:6fTWu4m3jocfUZLYF5KsZC1TUfRvEjs7lM4crme/irw= github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.50.0 h1:5IT7xOdq17MtcdtL/vtl6mGfzhaq4m4vpollPRmlsBQ= github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.50.0/go.mod h1:ZV4VOm0/eHR06JLrXWe09068dHpr3TRpY9Uo7T+anuA= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.51.0 h1:fYE9p3esPxA/C0rQ0AHhP0drtPXDRhaWiwg1DPqO7IU= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.51.0/go.mod h1:BnBReJLvVYx2CS/UHOgVz2BXKXD9wsQPxZug20nZhd0= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.49.0 h1:jJKWl98inONJAr/IZrdFQUWcwUO95DLY1XMD1ZIut+g= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.49.0/go.mod h1:l2fIqmwB+FKSfvn3bAD/0i+AXAxhIZjTK2svT/mgUXs= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.50.0 h1:nNMpRpnkWDAaqcpxMJvxa/Ud98gjbYwayJY4/9bdjiU= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.50.0/go.mod h1:SZiPHWGOOk3bl8tkevxkoiwPgsIl6CwrWcbwjfHZpdM= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.51.0 h1:OqVGm6Ei3x5+yZmSJG1Mh2NwHvpVmZ08CB5qJhT9Nuk= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.51.0/go.mod h1:SZiPHWGOOk3bl8tkevxkoiwPgsIl6CwrWcbwjfHZpdM= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.49.0 h1:GYUJLfvd++4DMuMhCFLgLXvFwofIxh/qOwoGuS/LTew= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.49.0/go.mod h1:wRbFgBQUVm1YXrvWKofAEmq9HNJTDphbAaJSSX01KUI= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.50.0 h1:ig/FpDD2JofP/NExKQUbn7uOSZzJAQqogfqluZK4ed4= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.50.0/go.mod h1:otE2jQekW/PqXk1Awf5lmfokJx4uwuqcj1ab5SpGeW0= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.51.0 h1:6/0iUd0xrnX7qt+mLNRwg5c0PGv8wpE8K90ryANQwMI= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.51.0/go.mod h1:otE2jQekW/PqXk1Awf5lmfokJx4uwuqcj1ab5SpGeW0= github.com/IBM/sarama v1.43.1 h1:Z5uz65Px7f4DhI/jQqEm/tV9t8aU+JUdTyW/K/fCXpA= github.com/IBM/sarama v1.43.1/go.mod h1:GG5q1RURtDNPz8xxJs3mgX6Ytak8Z9eLhAkJPObe2xE= github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= @@ -788,6 +803,7 @@ github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERo github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/Microsoft/hcsshim v0.11.4 h1:68vKo2VN8DE9AdN4tnkWnmdhqdbpUFM8OF3Airm7fz8= github.com/Microsoft/hcsshim v0.11.4/go.mod h1:smjE4dvqPX9Zldna+t5FG3rnoHhaB7QYxPRqGcpAD9w= +github.com/RaveNoX/go-jsoncommentstrip v1.0.0 h1:t527LHHE3HmiHrq74QMpNPZpGCIJzTx+apLkMKt4HC0= github.com/alecthomas/kingpin/v2 v2.4.0 h1:f48lwail6p8zpO1bC4TxtqACaGqHYA22qkHjHpqDjYY= github.com/alecthomas/kingpin/v2 v2.4.0/go.mod h1:0gyi0zQnjuFk8xrkNKamJoyUo382HRL7ATRpFZCw6tE= github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 h1:s6gZFSlWYmbqAuRjVTiNNhvNRfY2Wxp9nhfyel4rklc= @@ -797,12 +813,23 @@ github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kd github.com/apache/arrow/go/v15 v15.0.2 h1:60IliRbiyTWCWjERBCkO1W4Qun9svcYoZrSLcyOsMLE= github.com/apache/arrow/go/v15 v15.0.2/go.mod h1:DGXsR3ajT524njufqf95822i+KTh+yea1jass9YXgjA= github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= +github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= +github.com/bmatcuk/doublestar v1.1.1 h1:YroD6BJCZBYx06yYFEWvUuKVWQn3vLLQAVmDmvTSaiQ= +github.com/bytedance/sonic v1.10.0-rc3 h1:uNSnscRapXTwUgTyOF0GVljYD08p9X/Lbr9MweSV3V0= +github.com/bytedance/sonic v1.10.0-rc3/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4= github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/census-instrumentation/opencensus-proto v0.2.1 h1:glEXhBS5PSLLv4IXzLA5yPRVX4bilULVyxxbrfOtDAk= github.com/census-instrumentation/opencensus-proto v0.4.1 h1:iKLQ0xPNFxR/2hzXZMrBo8f1j86j5WHzznCCQxV/b8g= github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= +github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cheekybits/is v0.0.0-20150225183255-68e9c0620927/go.mod h1:h/aW8ynjgkuj+NQRlZcDbAbM1ORAbXjXX77sX7T289U= +github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0= +github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA= +github.com/chenzhuoyu/iasm v0.9.0 h1:9fhXjVzq5hUy2gkhhgHl95zG2cEAhw9OSGs8toWWAwo= +github.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog= github.com/chromedp/cdproto v0.0.0-20230802225258-3cf4e6d46a89 h1:aPflPkRFkVwbW6dmcVqfgwp1i+UWGFH6VgR1Jim5Ygc= github.com/chromedp/cdproto v0.0.0-20230802225258-3cf4e6d46a89/go.mod h1:GKljq0VrfU4D5yc+2qA6OVr8pmO/MBbPEWqWQ/oqGEs= github.com/chromedp/chromedp v0.9.2 h1:dKtNz4kApb06KuSXoTQIyUC2TrA0fhGDwNZf3bcgfKw= @@ -851,10 +878,14 @@ github.com/cpuguy83/dockercfg v0.3.1/go.mod h1:sugsbF4//dDlL/i+S+rtpIWp+5h0BHJHf github.com/cpuguy83/dockercfg v0.3.2 h1:DlJTyZGBDlXqUZ2Dk2Q3xHs/FtnooJJVaad2S9GKorA= github.com/cpuguy83/dockercfg v0.3.2/go.mod h1:sugsbF4//dDlL/i+S+rtpIWp+5h0BHJHfjj5/jFyUJc= github.com/creack/pty v1.1.9 h1:uDmaGzcdjhF4i/plgjmEsriH11Y0o7RKapEf/LDaM3w= +github.com/dgraph-io/badger/v2 v2.2007.4/go.mod h1:vSw/ax2qojzbN6eXHIx6KPKtCSHJN/Uz0X0VPruTIhk= +github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de h1:t0UHb5vdojIDUqktM6+xJAfScFBsVpXZmqC9dsgJmeA= +github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= github.com/distribution/reference v0.5.0 h1:/FUIFXtfc/x2gpa5/VGfiGLuOIdYa1t65IKK2OFGvA0= github.com/distribution/reference v0.5.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= +github.com/djherbis/atime v1.1.0/go.mod h1:28OF6Y8s3NQWwacXc5eZTsEsiMzp7LF8MbXE+XJPdBE= github.com/dmarkham/enumer v1.5.9 h1:NM/1ma/AUNieHZg74w67GkHFBNB15muOt3sj486QVZk= github.com/dmarkham/enumer v1.5.9/go.mod h1:e4VILe2b1nYK3JKJpRmNdl5xbDQvELc6tQ8b+GsGk6E= github.com/dmarkham/enumer v1.5.10 h1:ygL0L6quiTiH1jpp68DyvsWaea6MaZLZrTTkIS++R0M= @@ -869,7 +900,6 @@ github.com/docker/docker v28.1.1+incompatible h1:49M11BFLsVO1gxY9UX9p/zwkE/rswgg github.com/docker/docker v28.1.1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker v28.2.2+incompatible h1:CjwRSksz8Yo4+RmQ339Dp/D2tGO5JxwYeqtMOEe0LDw= github.com/docker/docker v28.2.2+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker v28.3.3+incompatible h1:Dypm25kh4rmk49v1eiVbsAtpAsYURjYkaKubwuBdxEI= github.com/docker/docker v28.3.3+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= @@ -902,6 +932,13 @@ github.com/envoyproxy/protoc-gen-validate v1.1.0 h1:tntQDh69XqOCOZsDz0lVJQez/2L6 github.com/envoyproxy/protoc-gen-validate v1.1.0/go.mod h1:sXRDRVmzEbkM7CVcM06s9shE/m23dg3wzjl0UWqJ2q4= github.com/envoyproxy/protoc-gen-validate v1.2.1 h1:DEo3O99U8j4hBFwbJfrz9VtgcDfUKS7KJ7spH3d86P8= github.com/envoyproxy/protoc-gen-validate v1.2.1/go.mod h1:d/C80l/jxXLdfEIhX1W2TmLfsJ31lvEjwamM4DxlWXU= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= +github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= +github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= +github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg= +github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1 h1:QbL/5oDUmRBzO9/Z7Seo6zf912W/a6Sr4Eu0G/3Jho0= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -921,6 +958,12 @@ github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ4 github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= +github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= +github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= +github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= +github.com/go-playground/validator/v10 v10.14.1 h1:9c50NUPC30zyuKprjL3vNZ0m5oG+jU0zvx4AqHGnv4k= +github.com/go-playground/validator/v10 v10.14.1/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= @@ -930,6 +973,7 @@ github.com/gobwas/pool v0.2.1 h1:xfeeEhW7pwmX8nuLVlqbzVc7udMDrwetjEv+TZIz1og= github.com/gobwas/pool v0.2.1/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= github.com/gobwas/ws v1.2.1 h1:F2aeBZrm2NDsc7vbovKrWSogd4wvfAxg0FQ89/iqOTk= github.com/gobwas/ws v1.2.1/go.mod h1:hRKAFb8wOxFROYNsT1bqfWnhX+b5MFeJM9r2ZSwg/KY= +github.com/gobwas/ws v1.3.0/go.mod h1:hRKAFb8wOxFROYNsT1bqfWnhX+b5MFeJM9r2ZSwg/KY= github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/godbus/dbus/v5 v5.0.4 h1:9349emZab16e7zQvpmsbtjc18ykshndd8y2PG3sgJbA= @@ -1001,8 +1045,10 @@ github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+ github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gax-go/v2 v2.12.3/go.mod h1:AKloxT6GtNbaLm8QTNSidHUVsHYcBHwWRvkNFJUQcS4= github.com/googleapis/gax-go/v2 v2.14.0/go.mod h1:lhBCnjdLrWRaPvLWhmc8IS24m9mr07qSYnHncrgo+zk= +github.com/googleapis/gax-go/v2 v2.14.1/go.mod h1:Hb/NubMaVM88SrNkvl8X/o8XWwDJEPqouaLeN2IUxoA= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8 h1:tlyzajkF3030q6M8SvmJSemC9DTHL/xaMa18b65+JM4= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= +github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek= @@ -1023,6 +1069,7 @@ github.com/ianlancetaylor/demangle v0.0.0-20240312041847-bd984b5ce465 h1:KwWnWVW github.com/ianlancetaylor/demangle v0.0.0-20240312041847-bd984b5ce465/go.mod h1:gx7rwoVhcfuVKG5uya9Hs3Sxj7EIvldVofAWIUtGouw= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/+fafWORmlnuysV2EMP8MW+qe0= github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk= github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= @@ -1039,8 +1086,6 @@ github.com/jcmturner/rpc/v2 v2.0.3 h1:7FXXj8Ti1IaVFpSAziCZWNzbNuZmnvw/i6CqLNdWfZ github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= -github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= -github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= @@ -1048,8 +1093,11 @@ github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHm github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1 h1:6QPYqodiu3GuPL+7mfx+NwDdp2eTkp9IfEUpgAwUN0o= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/juju/gnuflag v0.0.0-20171113085948-2ce1bb71843d h1:c93kUJDtVAXFEhsCh5jSxyOJmFHuzcihnslQiX8Urwo= github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/kataras/jwt v0.1.9/go.mod h1:Kw6GZv2JQN8K4D3NGaSc/qZzTYfaRdyaC2zWi+RBRIQ= +github.com/kataras/neffos v0.0.22/go.mod h1:IIJZcUDvwBxJGlDj942dqQgyznVKYDti91f8Ez+RRxE= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/kisielk/errcheck v1.5.0 h1:e8esj/e4R+SAOwFwN+n3zr0nYeCyeweozKfO23MvHzY= @@ -1059,6 +1107,12 @@ github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/q github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= github.com/kr/pty v1.1.1 h1:VkoXIwSboBpnk99O/KFauAEILuNHv5DVFKZMBN/gUgw= +github.com/labstack/echo/v4 v4.11.1 h1:dEpLU2FLg4UVmvCGPuk/APjlH6GDpbEPti61srUUUs4= +github.com/labstack/echo/v4 v4.11.1/go.mod h1:YuYRTSM3CHs2ybfrL8Px48bO6BAnYIN4l8wSTMP6BDQ= +github.com/labstack/gommon v0.4.0 h1:y7cvthEAEbU0yHOf4axH8ZG2NH8knB9iNSoTO8dyIk8= +github.com/labstack/gommon v0.4.0/go.mod h1:uW6kP17uPlLJsD3ijUYn3/M5bAxtlZhMI6m3MFxTMTM= +github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= +github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= github.com/lyft/protoc-gen-star/v2 v2.0.4-0.20230330145011-496ad1ac90a4 h1:sIXJOMrYnQZJu7OB7ANSF4MYri2fTEGIsRLz6LwI4xE= @@ -1067,8 +1121,8 @@ github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0V github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/magiconair/properties v1.8.10 h1:s31yESBquKXCV9a/ScB3ESkOjUYYv+X0rg8SYxI99mE= github.com/magiconair/properties v1.8.10/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= -github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= -github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/matryer/try v0.0.0-20161228173917-9ac251b645a2/go.mod h1:0KeJpeMD6o+O4hW7qJOT7vyQPKrWmj26uf5wMc/IiIs= +github.com/mediocregopher/radix/v3 v3.8.1/go.mod h1:8FL3F6UQRXHXIBSPUs5h0RybMF8i4n7wVopoX3x7Bv8= github.com/microsoft/ApplicationInsights-Go v0.4.4 h1:G4+H9WNs6ygSCe6sUyxRc2U81TI5Es90b2t/MwX5KqY= github.com/microsoft/ApplicationInsights-Go v0.4.4/go.mod h1:fKRUseBqkw6bDiXTs3ESTiU/4YTIHsQS4W3fP2ieF4U= github.com/mkevac/debugcharts v0.0.0-20191222103121-ae1c48aa8615 h1:/mD+ABZyXD39BzJI2XyRJlqdZG11gXFo0SSynL+OFeU= @@ -1118,6 +1172,8 @@ github.com/pascaldekloe/name v1.0.1/go.mod h1:Z//MfYJnH4jVpQ9wkclwu2I2MkHmXTlT9w github.com/paulmach/protoscan v0.2.1 h1:rM0FpcTjUMvPUNk2BhPJrreDKetq43ChnL+x1sRg8O8= github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 h1:onHthvaw9LFnH4t2DcNVpwGmV9E1BkGknEliJkfwQj0= github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58/go.mod h1:DXv8WO4yhMYhSNPKjeNKa5WY9YCIEBRbNzFFPJbWO6Y= +github.com/pelletier/go-toml/v2 v2.0.9 h1:uH2qQXheeefCCkuBBSLi7jCiSmj3VRh2+Goq2N7Xxu0= +github.com/pelletier/go-toml/v2 v2.0.9/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e h1:aoZm08cpOy4WuID//EZDgcC4zIxODThtZNPirFr42+A= github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= @@ -1137,6 +1193,7 @@ github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99 github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc= github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/shirou/gopsutil/v3 v3.23.7/go.mod h1:c4gnmoRC0hQuaLqvxnx1//VXQ0Ms/X9UnJF8pddY5z4= github.com/shirou/gopsutil/v3 v3.23.12 h1:z90NtUkp3bMtmICZKpC4+WaknU1eXtp5vtbQ11DgpE4= github.com/shirou/gopsutil/v3 v3.23.12/go.mod h1:1FrWgea594Jp7qmjHUUPlJDTPgcsb9mGnXDxavtikzM= github.com/shirou/gopsutil/v4 v4.25.1 h1:QSWkTc+fu9LTAWfkZwZ6j8MSUk4A2LV7rbH0ZqmLjXs= @@ -1155,7 +1212,9 @@ github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spiffe/go-spiffe/v2 v2.5.0 h1:N2I01KCUkv1FAjZXJMwh95KK1ZIQLYbPfhaxw8WS0hE= github.com/spiffe/go-spiffe/v2 v2.5.0/go.mod h1:P+NxobPc6wXhVtINNtFjNWGBTreew1GBUCwT2wPmb7g= +github.com/spkg/bom v0.0.0-20160624110644-59b7046e48ad h1:fiWzISvDn0Csy5H0iwgAuJGQTUpVfEMJJd4nRFXogbc= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/testcontainers/testcontainers-go v0.28.0 h1:1HLm9qm+J5VikzFDYhOd+Zw12NtOl+8drH2E8nTY1r8= github.com/testcontainers/testcontainers-go v0.28.0/go.mod h1:COlDpUXbwW3owtpMkEB1zo9gwb1CoKVKlyrVPejF4AU= github.com/testcontainers/testcontainers-go v0.33.0 h1:zJS9PfXYT5O0ZFXM2xxXfk4J5UMw/kRiISng037Gxdw= @@ -1169,10 +1228,17 @@ github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFA github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= +github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= +github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= +github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= +github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo= +github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/xhit/go-str2duration/v2 v2.1.0 h1:lxklc02Drh6ynqX+DdPyp5pCKLUQpRT8bp8Ydu2Bstc= github.com/xhit/go-str2duration/v2 v2.1.0/go.mod h1:ohY8p+0f07DiV6Em5LKB0s2YpLtXVyJfNt1+BlmyAsU= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13 h1:fVcFKWvrslecOb/tg+Cc05dkeYx540o0FuFt3nUVDoE= github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw= github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= @@ -1182,6 +1248,7 @@ github.com/zeebo/errs v1.4.0 h1:XNdoD/RRMKP7HD0UhJnIzUy74ISdGGxURlYG8HSWSfM= github.com/zeebo/errs v1.4.0/go.mod h1:sgbWHsvVuTPHcqJJGQ1WhI5KbWlHYz+2+2C/LSEtCw4= github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0= github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= +go.etcd.io/bbolt v1.3.7/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= @@ -1197,15 +1264,14 @@ go.opentelemetry.io/contrib/detectors/gcp v1.34.0 h1:JRxssobiPg23otYU5SbWtQC//sn go.opentelemetry.io/contrib/detectors/gcp v1.34.0/go.mod h1:cV4BMFcscUR/ckqLkbfQmF0PRsq8w/lMGzdbCSveBHo= go.opentelemetry.io/contrib/detectors/gcp v1.35.0 h1:bGvFt68+KTiAKFlacHW6AhA56GF2rS0bdD3aJYEnmzA= go.opentelemetry.io/contrib/detectors/gcp v1.35.0/go.mod h1:qGWP8/+ILwMRIUf9uIVLloR1uo5ZYAslM4O6OqUi1DA= -go.opentelemetry.io/contrib/detectors/gcp v1.36.0 h1:F7q2tNlCaHY9nMKHR6XH9/qkp8FktLnIcy6jJNyOCQw= go.opentelemetry.io/contrib/detectors/gcp v1.36.0/go.mod h1:IbBN8uAIIx734PTonTPxAxnjc2pQTxWNkwfstZ+6H2k= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0/go.mod h1:B9yO6b04uB80CzjedvewuqDhxJxi11s7/GtiGa8bAjI= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0/go.mod h1:ijPqXp5P6IRRByFVVg9DY8P5HkxkHE5ARIa+86aXPf4= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0/go.mod h1:rg+RlpR5dKwaS95IyyZqj5Wd4E13lk/msnTS0Xl9lJM= go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.56.0/go.mod h1:3qi2EEwMgB4xnKgPLqsDP3j9qxnHDZeHsnAxfjQqTko= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0/go.mod h1:p8pYQP+m5XfbZm9fxtSKAbM6oIllS7s2AfxrChvc7iw= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0/go.mod h1:L7UH0GbB0p47T4Rri3uHjbpCFYrVrwc1I25QhNPiGK8= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.58.0/go.mod h1:umTcuxiv1n/s/S6/c2AT/g2CQ7u5C59sHDNmfSwgz7Q= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0/go.mod h1:UHB22Z8QsdRDrnAtX4PntOl36ajSxcdUMt1sF7Y6E7Q= go.opentelemetry.io/otel v1.22.0/go.mod h1:eoV4iAi3Ea8LkAEI9+GFT44O6T/D0GWAVFyZVCC6pMI= go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= go.opentelemetry.io/otel v1.29.0/go.mod h1:N/WtXPs1CNCUEx+Agz5uouwCba+i+bJGFicT8SR4NP8= @@ -1218,6 +1284,8 @@ go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.19.0 h1:IeMey go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.19.0/go.mod h1:oVdCUtjq9MK9BlS7TtucsQwUcXcymNiEDjgDD2jMtZU= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.29.0 h1:WDdP9acbMYjbKIyJUhTvtzj601sVJOqgWdUxSdR/Ysc= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.29.0/go.mod h1:BLbf7zbNIONBLPwvFnwNHGj4zge8uTCM/UPIVW1Mq2I= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.35.0 h1:PB3Zrjs1sG1GBX51SXyTSoOTqcDglmsk7nT6tkKPb/k= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.35.0/go.mod h1:U2R3XyVPzn0WX7wOIypPuptulsMcPDPs/oiSVOMVnHY= go.opentelemetry.io/otel/metric v1.22.0/go.mod h1:evJGjVpZv0mQ5QBRJoBF64yMuOf4xCWdXjK8pzFvliY= go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco= go.opentelemetry.io/otel/metric v1.29.0/go.mod h1:auu/QWieFVWx+DmQOUMgj0F8LHWdgalxXqvp7BII/W8= @@ -1231,7 +1299,9 @@ go.opentelemetry.io/otel/sdk v1.22.0/go.mod h1:iu7luyVGYovrRpe2fmj3CVKouQNdTOkxt go.opentelemetry.io/otel/sdk v1.29.0/go.mod h1:pM8Dx5WKnvxLCb+8lG1PRNIDxu9g9b9g59Qr7hfAAok= go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= go.opentelemetry.io/otel/sdk v1.33.0/go.mod h1:A1Q5oi7/9XaMlIWzPSxLRWOI8nG3FnzHJNbiENQuihM= +go.opentelemetry.io/otel/sdk v1.35.0/go.mod h1:+ga1bZliga3DxJ3CQGg3updiaAJoNECOgJREo9KHGQg= go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/sdk/metric v1.35.0/go.mod h1:is6XYCUMpcKi+ZsOvfluY5YstFnhW0BidkR+gL+qN+w= go.opentelemetry.io/otel/trace v1.22.0/go.mod h1:RbbHXVqKES9QhzZq/fE5UnOSILqRt40a21sPw2He1xo= go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= go.opentelemetry.io/otel/trace v1.29.0/go.mod h1:eHl3w0sp3paPkYstJOmAimxhiFXPg+MMTlEh3nsQgWQ= @@ -1247,15 +1317,18 @@ go.uber.org/automaxprocs v1.5.3 h1:kWazyxZUrS3Gs4qUpbwo5kEIMGe/DAvi5Z4tl2NW4j8= go.uber.org/automaxprocs v1.5.3/go.mod h1:eRbA25aqJrxAbsLO0xy5jVwPt7FQnRgjW+efnwa1WM0= go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs= go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8= +golang.org/x/arch v0.4.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= +golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc= golang.org/x/crypto v0.33.0/go.mod h1:bVdXmD7IV/4GdElGPozy6U7lWdRXA4qyRVGJV57uQ5M= -golang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc= golang.org/x/crypto v0.38.0/go.mod h1:MvrbAqul58NNYPKnOra203SB9vpuZW0e+RRZV+Ggqjw= +golang.org/x/crypto v0.41.0 h1:WKYxWedPGCTVVl5+WHSSrOBT0O8lx32+zxmHxijgXp4= +golang.org/x/crypto v0.41.0/go.mod h1:pO5AFd7FA68rFak7rOAGVuygIISepHftHnr8dr6+sUc= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= @@ -1287,10 +1360,13 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/mod v0.18.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/mod v0.19.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/mod v0.24.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= +golang.org/x/mod v0.25.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= +golang.org/x/mod v0.26.0/go.mod h1:/j6NAhSk8iQ723BGAUyoAcn7SlD7s15Dp9Nd/SfeaFQ= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -1313,6 +1389,7 @@ golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81R golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= @@ -1323,7 +1400,8 @@ golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k= golang.org/x/net v0.35.0/go.mod h1:EglIi67kWsHKlRzzVMUD93VMSWGFOMSZgxFjparz1Qk= golang.org/x/net v0.37.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8= -golang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA= +golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE= +golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1349,6 +1427,7 @@ golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.12.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sync v0.13.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1378,6 +1457,7 @@ golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.24.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= @@ -1389,6 +1469,7 @@ golang.org/x/telemetry v0.0.0-20240521205824-bda55230c457 h1:zf5N6UOrA487eEFacMe golang.org/x/telemetry v0.0.0-20240521205824-bda55230c457/go.mod h1:pRgIJT+bRLFKnoM1ldnzKoxTIn14Yxz928LQRYYgIN0= golang.org/x/telemetry v0.0.0-20250710130107-8d8967aff50b h1:DU+gwOBXU+6bO0sEyO7o/NeMlxZxCZEvI7v+J4a1zRQ= golang.org/x/telemetry v0.0.0-20250710130107-8d8967aff50b/go.mod h1:4ZwOYna0/zsOKwuR5X/m0QFOJpSZvAxFfkQT+Erd9D4= +golang.org/x/telemetry v0.0.0-20250807160809-1a19826ec488/go.mod h1:fGb/2+tgXXjhjHsTNdVEEMZNWA0quBnfrO+AfoDSAKw= golang.org/x/term v0.31.0/go.mod h1:R4BeIy7D95HzImkxGkTW1UQTtP54tio2RyHz7PwK0aw= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1404,6 +1485,7 @@ golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/time v0.8.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/time v0.11.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= @@ -1445,11 +1527,16 @@ golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.8/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= golang.org/x/tools v0.22.0/go.mod h1:aCwcsjqvq7Yqt6TNyX7QMU2enbQ/Gt0bo6krSeEri+c= golang.org/x/tools v0.23.0/go.mod h1:pnu6ufv6vQkll6szChhK3C3L/ruaIv5eBeztNG8wtsI= +golang.org/x/tools v0.34.0/go.mod h1:pAP9OwEaY1CAW3HOmg3hLZC5Z0CCmzjAF2UQMSqNARg= +golang.org/x/tools v0.35.0/go.mod h1:NKdj5HkL/73byiZSJjqJgKn3ep7KjFkBOkR/Hps3VPw= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= +golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f h1:GGU+dLjvlC3qDwqYgL6UgRmHXhOOgns0bZu2Ty5mm6U= +golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY= golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= @@ -1480,6 +1567,9 @@ google.golang.org/api v0.219.0/go.mod h1:K6OmjGm+NtLrIkHxv1U3a0qIf/0JOvAHd5O/6Ao google.golang.org/api v0.222.0/go.mod h1:efZia3nXpWELrwMlN5vyQrD4GmJN1Vw0x68Et3r+a9c= google.golang.org/api v0.224.0/go.mod h1:3V39my2xAGkodXy0vEqcEtkqgw2GtrFL5WuBZlCTCOQ= google.golang.org/api v0.227.0/go.mod h1:EIpaG6MbTgQarWF5xJvX0eOJPK9n/5D4Bynb9j2HXvQ= +google.golang.org/api v0.229.0/go.mod h1:wyDfmq5g1wYJWn29O22FDWN48P7Xcz0xz+LBpptYvB0= +google.golang.org/api v0.232.0/go.mod h1:p9QCfBWZk1IJETUdbTKloR5ToFdKbYh2fkjsUL6vNoY= +google.golang.org/api v0.239.0/go.mod h1:cOVEm2TpdAGHL2z+UwyS+kmlGr3bVWQQ6sYEqkKje50= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= @@ -1522,6 +1612,7 @@ google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20240711142825-46eb208f015d/go.mod h1:FfBgJBJg9GcpPvKIuHSZ/aE1g2ecGL74upMzGZjiGEY= google.golang.org/genproto v0.0.0-20250122153221-138b5a5a4fd4/go.mod h1:qbZzneIOXSq+KFAFut9krLfRLZiFLzZL5u2t8SV83EE= +google.golang.org/genproto v0.0.0-20250303144028-a0af3efb3deb/go.mod h1:sAo5UzpjUwgFBCzupwhcLcxHVDK7vG5IqI30YnwX2eE= google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= google.golang.org/genproto/googleapis/api v0.0.0-20240429193739-8cf5692501f6/go.mod h1:10yRODfgim2/T8csjQsMPgZOMvtytXKTDRzH6HRGzRw= google.golang.org/genproto/googleapis/api v0.0.0-20240814211410-ddb44dafa142/go.mod h1:d6be+8HhtEtucleCbxpPW9PA9XwISACu8nvpPqF0BVo= @@ -1536,7 +1627,6 @@ google.golang.org/genproto/googleapis/api v0.0.0-20250218202821-56aae31c358a/go. google.golang.org/genproto/googleapis/api v0.0.0-20250219182151-9fdb1cabc7b2/go.mod h1:W9ynFDP/shebLB1Hl/ESTOap2jHd6pmLXPNZC7SVDbA= google.golang.org/genproto/googleapis/api v0.0.0-20250227231956-55c901821b1e/go.mod h1:Xsh8gBVxGCcbV8ZeTB9wI5XPyZ5RvC6V3CTeeplHbiA= google.golang.org/genproto/googleapis/api v0.0.0-20250303144028-a0af3efb3deb/go.mod h1:jbe3Bkdp+Dh2IrslsFCklNhweNTBgSYanP1UXhJDhKg= -google.golang.org/genproto/googleapis/api v0.0.0-20250324211829-b45e905df463/go.mod h1:U90ffi8eUL9MwPcrJylN5+Mk2v3vuPDptd5yyNUiRR8= google.golang.org/genproto/googleapis/api v0.0.0-20250528174236-200df99c418a/go.mod h1:a77HrdMjoeKbnd2jmgcWdaS++ZLZAEq3orIOAEIKiVw= google.golang.org/genproto/googleapis/bytestream v0.0.0-20250106144421-5f5ef82da422 h1:w6g+P/ZscmNlGxVVXGaPVQOLu1q19ubsTOZKwaDqm4k= google.golang.org/genproto/googleapis/bytestream v0.0.0-20250106144421-5f5ef82da422/go.mod h1:s4mHJ3FfG8P6A3O+gZ8TVqB3ufjOl9UG3ANCMMwCHmo= @@ -1554,7 +1644,6 @@ google.golang.org/genproto/googleapis/bytestream v0.0.0-20250512202823-5a2f75b73 google.golang.org/genproto/googleapis/bytestream v0.0.0-20250512202823-5a2f75b736a9/go.mod h1:h6yxum/C2qRb4txaZRLDHK8RyS0H/o2oEDeKY4onY/Y= google.golang.org/genproto/googleapis/bytestream v0.0.0-20250603155806-513f23925822 h1:zWFRixYR5QlotL+Uv3YfsPRENIrQFXiGs+iwqel6fOQ= google.golang.org/genproto/googleapis/bytestream v0.0.0-20250603155806-513f23925822/go.mod h1:h6yxum/C2qRb4txaZRLDHK8RyS0H/o2oEDeKY4onY/Y= -google.golang.org/genproto/googleapis/bytestream v0.0.0-20250728155136-f173205681a0 h1:HyHZz/b6hYFm/aS2F0DOAyjK5mQw0Jh8YiZyqlXMfic= google.golang.org/genproto/googleapis/bytestream v0.0.0-20250728155136-f173205681a0/go.mod h1:h6yxum/C2qRb4txaZRLDHK8RyS0H/o2oEDeKY4onY/Y= google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= google.golang.org/genproto/googleapis/rpc v0.0.0-20240429193739-8cf5692501f6/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= @@ -1574,6 +1663,8 @@ google.golang.org/genproto/googleapis/rpc v0.0.0-20250219182151-9fdb1cabc7b2/go. google.golang.org/genproto/googleapis/rpc v0.0.0-20250227231956-55c901821b1e/go.mod h1:LuRYeWDFV6WOn90g357N17oMCaxpgCnbi/44qJvDn2I= google.golang.org/genproto/googleapis/rpc v0.0.0-20250303144028-a0af3efb3deb/go.mod h1:LuRYeWDFV6WOn90g357N17oMCaxpgCnbi/44qJvDn2I= google.golang.org/genproto/googleapis/rpc v0.0.0-20250313205543-e70fdf4c4cb4/go.mod h1:LuRYeWDFV6WOn90g357N17oMCaxpgCnbi/44qJvDn2I= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250414145226-207652e42e2e/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250505200425-f936aa4a68b2/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= google.golang.org/genproto/googleapis/rpc v0.0.0-20250512202823-5a2f75b736a9/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= google.golang.org/genproto/googleapis/rpc v0.0.0-20250519155744-55703ea1f237/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= @@ -1595,7 +1686,6 @@ google.golang.org/grpc v1.70.0/go.mod h1:ofIJqVKDXx/JiXrwr2IG4/zwdH9txy3IlF40Rmc google.golang.org/grpc v1.71.0/go.mod h1:H0GRtasmQOh9LkFoCPDu3ZrwUtD1YGE+b2vYBYd/8Ec= google.golang.org/grpc v1.71.1/go.mod h1:H0GRtasmQOh9LkFoCPDu3ZrwUtD1YGE+b2vYBYd/8Ec= google.golang.org/grpc v1.72.1/go.mod h1:wH5Aktxcg25y1I3w7H69nHfXdOG3UiadoBtjh3izSDM= -google.golang.org/grpc v1.72.2/go.mod h1:wH5Aktxcg25y1I3w7H69nHfXdOG3UiadoBtjh3izSDM= google.golang.org/grpc/examples v0.0.0-20230224211313-3775f633ce20 h1:MLBCGN1O7GzIx+cBiwfYPwtmZ41U3Mn/cotLJciaArI= google.golang.org/grpc/examples v0.0.0-20230224211313-3775f633ce20/go.mod h1:Nr5H8+MlGWr5+xX/STzdoEqJrO+YteqFbMyCsrb6mH0= google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= diff --git a/pkg/gofr/container/container.go b/pkg/gofr/container/container.go index c3ee964b1..8e958f699 100644 --- a/pkg/gofr/container/container.go +++ b/pkg/gofr/container/container.go @@ -67,6 +67,7 @@ type Container struct { Elasticsearch Elasticsearch Oracle OracleDB Couchbase Couchbase + InfluxDB InfluxDB KVStore KVStore diff --git a/pkg/gofr/container/datasources.go b/pkg/gofr/container/datasources.go index 6ae51f674..d1f98d809 100644 --- a/pkg/gofr/container/datasources.go +++ b/pkg/gofr/container/datasources.go @@ -4,6 +4,7 @@ import ( "bytes" "context" "database/sql" + "time" "github.com/redis/go-redis/v9" @@ -776,3 +777,48 @@ type CouchbaseProvider interface { provider } + +// InfluxDB defines the operations required to interact with an InfluxDB instance. +type InfluxDB interface { + // CreateOrganization create new bucket in the influxdb + CreateOrganization(ctx context.Context, org string) (string, error) + + // DeleteOrganization deletes a organization under the specified organization. + DeleteOrganization(ctx context.Context, orgID string) error + + // ListOrganization list all the available organization + ListOrganization(ctx context.Context) (orgs map[string]string, err error) + + // WritePoint writes one time-series points to a bucket. + // 'points' should follow the line protocol format or structured map format. + WritePoint(ctx context.Context, org, bucket string, + measurement string, + tags map[string]string, + fields map[string]any, + timestamp time.Time) error + + // Query runs a Flux query and returns the result as a slice of maps, + // where each map is a row with column name-value pairs. + Query(ctx context.Context, fluxQuery string) ([]map[string]any, error) + + // CreateBucket creates a new bucket under the specified organization. + CreateBucket(ctx context.Context, org, bucket string) (string, error) + + // DeleteBucket deletes a bucketId with bucketID + DeleteBucket(ctx context.Context, bucketID string) error + + // ListBuckets lists all buckets under the specified organization. + ListBuckets(ctx context.Context, org string) (map[string]string, error) + + // Ping checks if the InfluxDB instance is reachable and healthy. + Ping(ctx context.Context) (bool, error) + + HealthChecker +} + +// InfluxDBProvider an interface that extends InfluxDB with additional methods for logging, metrics, and connection management. +type InfluxDBProvider interface { + InfluxDB + + provider +} diff --git a/pkg/gofr/container/health.go b/pkg/gofr/container/health.go index b0fdf8129..3e52f43c5 100644 --- a/pkg/gofr/container/health.go +++ b/pkg/gofr/container/health.go @@ -69,6 +69,7 @@ func checkExternalDBHealth(ctx context.Context, c *Container, healthMap map[stri "elasticsearch": c.Elasticsearch, "oracle": c.Oracle, "couchbase": c.Couchbase, + "influx": c.InfluxDB, } for name, service := range services { diff --git a/pkg/gofr/container/mock_datasources.go b/pkg/gofr/container/mock_datasources.go index e2fb27b2b..af00f9765 100644 --- a/pkg/gofr/container/mock_datasources.go +++ b/pkg/gofr/container/mock_datasources.go @@ -14105,3 +14105,393 @@ func (mr *MockCouchbaseProviderMockRecorder) UseTracer(tracer any) *gomock.Call mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UseTracer", reflect.TypeOf((*MockCouchbaseProvider)(nil).UseTracer), tracer) } + +// MockInfluxDB is a mock of InfluxDB interface. +type MockInfluxDB struct { + ctrl *gomock.Controller + recorder *MockInfluxDBMockRecorder + isgomock struct{} +} + +// MockInfluxDBMockRecorder is the mock recorder for MockInfluxDB. +type MockInfluxDBMockRecorder struct { + mock *MockInfluxDB +} + +// NewMockInfluxDB creates a new mock instance. +func NewMockInfluxDB(ctrl *gomock.Controller) *MockInfluxDB { + mock := &MockInfluxDB{ctrl: ctrl} + mock.recorder = &MockInfluxDBMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockInfluxDB) EXPECT() *MockInfluxDBMockRecorder { + return m.recorder +} + +// CreateBucket mocks base method. +func (m *MockInfluxDB) CreateBucket(ctx context.Context, org, bucket string) (string, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CreateBucket", ctx, org, bucket) + ret0, _ := ret[0].(string) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// CreateBucket indicates an expected call of CreateBucket. +func (mr *MockInfluxDBMockRecorder) CreateBucket(ctx, org, bucket any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateBucket", reflect.TypeOf((*MockInfluxDB)(nil).CreateBucket), ctx, org, bucket) +} + +// CreateOrganization mocks base method. +func (m *MockInfluxDB) CreateOrganization(ctx context.Context, org string) (string, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CreateOrganization", ctx, org) + ret0, _ := ret[0].(string) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// CreateOrganization indicates an expected call of CreateOrganization. +func (mr *MockInfluxDBMockRecorder) CreateOrganization(ctx, org any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateOrganization", reflect.TypeOf((*MockInfluxDB)(nil).CreateOrganization), ctx, org) +} + +// DeleteBucket mocks base method. +func (m *MockInfluxDB) DeleteBucket(ctx context.Context, bucketID string) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "DeleteBucket", ctx, bucketID) + ret0, _ := ret[0].(error) + return ret0 +} + +// DeleteBucket indicates an expected call of DeleteBucket. +func (mr *MockInfluxDBMockRecorder) DeleteBucket(ctx, bucketID any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteBucket", reflect.TypeOf((*MockInfluxDB)(nil).DeleteBucket), ctx, bucketID) +} + +// DeleteOrganization mocks base method. +func (m *MockInfluxDB) DeleteOrganization(ctx context.Context, orgID string) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "DeleteOrganization", ctx, orgID) + ret0, _ := ret[0].(error) + return ret0 +} + +// DeleteOrganization indicates an expected call of DeleteOrganization. +func (mr *MockInfluxDBMockRecorder) DeleteOrganization(ctx, orgID any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteOrganization", reflect.TypeOf((*MockInfluxDB)(nil).DeleteOrganization), ctx, orgID) +} + +// HealthCheck mocks base method. +func (m *MockInfluxDB) HealthCheck(arg0 context.Context) (any, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "HealthCheck", arg0) + ret0, _ := ret[0].(any) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// HealthCheck indicates an expected call of HealthCheck. +func (mr *MockInfluxDBMockRecorder) HealthCheck(arg0 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "HealthCheck", reflect.TypeOf((*MockInfluxDB)(nil).HealthCheck), arg0) +} + +// ListBuckets mocks base method. +func (m *MockInfluxDB) ListBuckets(ctx context.Context, org string) (map[string]string, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ListBuckets", ctx, org) + ret0, _ := ret[0].(map[string]string) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListBuckets indicates an expected call of ListBuckets. +func (mr *MockInfluxDBMockRecorder) ListBuckets(ctx, org any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListBuckets", reflect.TypeOf((*MockInfluxDB)(nil).ListBuckets), ctx, org) +} + +// ListOrganization mocks base method. +func (m *MockInfluxDB) ListOrganization(ctx context.Context) (map[string]string, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ListOrganization", ctx) + ret0, _ := ret[0].(map[string]string) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListOrganization indicates an expected call of ListOrganization. +func (mr *MockInfluxDBMockRecorder) ListOrganization(ctx any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListOrganization", reflect.TypeOf((*MockInfluxDB)(nil).ListOrganization), ctx) +} + +// Ping mocks base method. +func (m *MockInfluxDB) Ping(ctx context.Context) (bool, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Ping", ctx) + ret0, _ := ret[0].(bool) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Ping indicates an expected call of Ping. +func (mr *MockInfluxDBMockRecorder) Ping(ctx any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Ping", reflect.TypeOf((*MockInfluxDB)(nil).Ping), ctx) +} + +// Query mocks base method. +func (m *MockInfluxDB) Query(ctx context.Context, org, fluxQuery string) ([]map[string]any, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Query", ctx, org, fluxQuery) + ret0, _ := ret[0].([]map[string]any) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Query indicates an expected call of Query. +func (mr *MockInfluxDBMockRecorder) Query(ctx, org, fluxQuery any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Query", reflect.TypeOf((*MockInfluxDB)(nil).Query), ctx, org, fluxQuery) +} + +// WritePoint mocks base method. +func (m *MockInfluxDB) WritePoint(ctx context.Context, org, bucket, measurement string, tags map[string]string, fields map[string]any, timestamp time.Time) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WritePoint", ctx, org, bucket, measurement, tags, fields, timestamp) + ret0, _ := ret[0].(error) + return ret0 +} + +// WritePoint indicates an expected call of WritePoint. +func (mr *MockInfluxDBMockRecorder) WritePoint(ctx, org, bucket, measurement, tags, fields, timestamp any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WritePoint", reflect.TypeOf((*MockInfluxDB)(nil).WritePoint), ctx, org, bucket, measurement, tags, fields, timestamp) +} + +// MockInfluxDBProvider is a mock of InfluxDBProvider interface. +type MockInfluxDBProvider struct { + ctrl *gomock.Controller + recorder *MockInfluxDBProviderMockRecorder + isgomock struct{} +} + +// MockInfluxDBProviderMockRecorder is the mock recorder for MockInfluxDBProvider. +type MockInfluxDBProviderMockRecorder struct { + mock *MockInfluxDBProvider +} + +// NewMockInfluxDBProvider creates a new mock instance. +func NewMockInfluxDBProvider(ctrl *gomock.Controller) *MockInfluxDBProvider { + mock := &MockInfluxDBProvider{ctrl: ctrl} + mock.recorder = &MockInfluxDBProviderMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockInfluxDBProvider) EXPECT() *MockInfluxDBProviderMockRecorder { + return m.recorder +} + +// Connect mocks base method. +func (m *MockInfluxDBProvider) Connect() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Connect") +} + +// Connect indicates an expected call of Connect. +func (mr *MockInfluxDBProviderMockRecorder) Connect() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Connect", reflect.TypeOf((*MockInfluxDBProvider)(nil).Connect)) +} + +// CreateBucket mocks base method. +func (m *MockInfluxDBProvider) CreateBucket(ctx context.Context, org, bucket string) (string, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CreateBucket", ctx, org, bucket) + ret0, _ := ret[0].(string) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// CreateBucket indicates an expected call of CreateBucket. +func (mr *MockInfluxDBProviderMockRecorder) CreateBucket(ctx, org, bucket any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateBucket", reflect.TypeOf((*MockInfluxDBProvider)(nil).CreateBucket), ctx, org, bucket) +} + +// CreateOrganization mocks base method. +func (m *MockInfluxDBProvider) CreateOrganization(ctx context.Context, org string) (string, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CreateOrganization", ctx, org) + ret0, _ := ret[0].(string) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// CreateOrganization indicates an expected call of CreateOrganization. +func (mr *MockInfluxDBProviderMockRecorder) CreateOrganization(ctx, org any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateOrganization", reflect.TypeOf((*MockInfluxDBProvider)(nil).CreateOrganization), ctx, org) +} + +// DeleteBucket mocks base method. +func (m *MockInfluxDBProvider) DeleteBucket(ctx context.Context, bucketID string) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "DeleteBucket", ctx, bucketID) + ret0, _ := ret[0].(error) + return ret0 +} + +// DeleteBucket indicates an expected call of DeleteBucket. +func (mr *MockInfluxDBProviderMockRecorder) DeleteBucket(ctx, bucketID any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteBucket", reflect.TypeOf((*MockInfluxDBProvider)(nil).DeleteBucket), ctx, bucketID) +} + +// DeleteOrganization mocks base method. +func (m *MockInfluxDBProvider) DeleteOrganization(ctx context.Context, orgID string) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "DeleteOrganization", ctx, orgID) + ret0, _ := ret[0].(error) + return ret0 +} + +// DeleteOrganization indicates an expected call of DeleteOrganization. +func (mr *MockInfluxDBProviderMockRecorder) DeleteOrganization(ctx, orgID any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteOrganization", reflect.TypeOf((*MockInfluxDBProvider)(nil).DeleteOrganization), ctx, orgID) +} + +// HealthCheck mocks base method. +func (m *MockInfluxDBProvider) HealthCheck(arg0 context.Context) (any, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "HealthCheck", arg0) + ret0, _ := ret[0].(any) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// HealthCheck indicates an expected call of HealthCheck. +func (mr *MockInfluxDBProviderMockRecorder) HealthCheck(arg0 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "HealthCheck", reflect.TypeOf((*MockInfluxDBProvider)(nil).HealthCheck), arg0) +} + +// ListBuckets mocks base method. +func (m *MockInfluxDBProvider) ListBuckets(ctx context.Context, org string) (map[string]string, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ListBuckets", ctx, org) + ret0, _ := ret[0].(map[string]string) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListBuckets indicates an expected call of ListBuckets. +func (mr *MockInfluxDBProviderMockRecorder) ListBuckets(ctx, org any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListBuckets", reflect.TypeOf((*MockInfluxDBProvider)(nil).ListBuckets), ctx, org) +} + +// ListOrganization mocks base method. +func (m *MockInfluxDBProvider) ListOrganization(ctx context.Context) (map[string]string, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ListOrganization", ctx) + ret0, _ := ret[0].(map[string]string) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListOrganization indicates an expected call of ListOrganization. +func (mr *MockInfluxDBProviderMockRecorder) ListOrganization(ctx any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListOrganization", reflect.TypeOf((*MockInfluxDBProvider)(nil).ListOrganization), ctx) +} + +// Ping mocks base method. +func (m *MockInfluxDBProvider) Ping(ctx context.Context) (bool, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Ping", ctx) + ret0, _ := ret[0].(bool) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Ping indicates an expected call of Ping. +func (mr *MockInfluxDBProviderMockRecorder) Ping(ctx any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Ping", reflect.TypeOf((*MockInfluxDBProvider)(nil).Ping), ctx) +} + +// Query mocks base method. +func (m *MockInfluxDBProvider) Query(ctx context.Context, org, fluxQuery string) ([]map[string]any, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Query", ctx, org, fluxQuery) + ret0, _ := ret[0].([]map[string]any) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Query indicates an expected call of Query. +func (mr *MockInfluxDBProviderMockRecorder) Query(ctx, org, fluxQuery any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Query", reflect.TypeOf((*MockInfluxDBProvider)(nil).Query), ctx, org, fluxQuery) +} + +// UseLogger mocks base method. +func (m *MockInfluxDBProvider) UseLogger(logger any) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "UseLogger", logger) +} + +// UseLogger indicates an expected call of UseLogger. +func (mr *MockInfluxDBProviderMockRecorder) UseLogger(logger any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UseLogger", reflect.TypeOf((*MockInfluxDBProvider)(nil).UseLogger), logger) +} + +// UseMetrics mocks base method. +func (m *MockInfluxDBProvider) UseMetrics(metrics any) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "UseMetrics", metrics) +} + +// UseMetrics indicates an expected call of UseMetrics. +func (mr *MockInfluxDBProviderMockRecorder) UseMetrics(metrics any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UseMetrics", reflect.TypeOf((*MockInfluxDBProvider)(nil).UseMetrics), metrics) +} + +// UseTracer mocks base method. +func (m *MockInfluxDBProvider) UseTracer(tracer any) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "UseTracer", tracer) +} + +// UseTracer indicates an expected call of UseTracer. +func (mr *MockInfluxDBProviderMockRecorder) UseTracer(tracer any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UseTracer", reflect.TypeOf((*MockInfluxDBProvider)(nil).UseTracer), tracer) +} + +// WritePoint mocks base method. +func (m *MockInfluxDBProvider) WritePoint(ctx context.Context, org, bucket, measurement string, tags map[string]string, fields map[string]any, timestamp time.Time) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WritePoint", ctx, org, bucket, measurement, tags, fields, timestamp) + ret0, _ := ret[0].(error) + return ret0 +} + +// WritePoint indicates an expected call of WritePoint. +func (mr *MockInfluxDBProviderMockRecorder) WritePoint(ctx, org, bucket, measurement, tags, fields, timestamp any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WritePoint", reflect.TypeOf((*MockInfluxDBProvider)(nil).WritePoint), ctx, org, bucket, measurement, tags, fields, timestamp) +} diff --git a/pkg/gofr/cron_test.go b/pkg/gofr/cron_test.go index f47593848..ddecc8d2e 100644 --- a/pkg/gofr/cron_test.go +++ b/pkg/gofr/cron_test.go @@ -143,7 +143,8 @@ func TestCron_parseSchedule_Error(t *testing.T) { "* * ab/2 * *", "* 1,2/10 * * *", "* * 1,2,3,1-15/10 * *", - "a b c d e"}, + "a b c d e", + }, expErrString: "unable to parse", }, } diff --git a/pkg/gofr/datasource/influxdb/go.mod b/pkg/gofr/datasource/influxdb/go.mod new file mode 100644 index 000000000..27ee93631 --- /dev/null +++ b/pkg/gofr/datasource/influxdb/go.mod @@ -0,0 +1,52 @@ +module gofr.dev/pkg/gofr/datasource/influxdb + +go 1.24.2 + +require ( + github.com/golang/mock v1.6.0 + github.com/influxdata/influxdb-client-go/v2 v2.14.0 + github.com/kataras/iris/v12 v12.2.5 + github.com/stretchr/testify v1.10.0 + go.opencensus.io v0.24.0 + go.opentelemetry.io/otel v1.37.0 +) + +require ( + github.com/Shopify/goreferrer v0.0.0-20220729165902-8cddb4f5de06 // indirect + github.com/andybalholm/brotli v1.0.5 // indirect + github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect + github.com/aymerick/douceur v0.2.0 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/fatih/structs v1.1.0 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect + github.com/golang/snappy v0.0.4 // indirect + github.com/gomarkdown/markdown v0.0.0-20230716120725-531d2d74bc12 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/gorilla/css v1.0.0 // indirect + github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839 // indirect + github.com/iris-contrib/schema v0.0.6 // indirect + github.com/josharian/intern v1.0.0 // indirect + github.com/kataras/golog v0.1.9 // indirect + github.com/kataras/pio v0.0.12 // indirect + github.com/klauspost/compress v1.16.7 // indirect + github.com/mailru/easyjson v0.7.7 // indirect + github.com/microcosm-cc/bluemonday v1.0.25 // indirect + github.com/oapi-codegen/runtime v1.0.0 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/tdewolff/minify/v2 v2.12.8 // indirect + github.com/tdewolff/parse/v2 v2.6.7 // indirect + github.com/vmihailenco/msgpack/v5 v5.3.5 // indirect + github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/otel/metric v1.37.0 // indirect + go.opentelemetry.io/otel/trace v1.37.0 // indirect + golang.org/x/crypto v0.39.0 // indirect + golang.org/x/net v0.41.0 // indirect + golang.org/x/sys v0.33.0 // indirect + golang.org/x/text v0.26.0 // indirect + golang.org/x/time v0.3.0 // indirect + google.golang.org/protobuf v1.33.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) diff --git a/pkg/gofr/datasource/influxdb/go.sum b/pkg/gofr/datasource/influxdb/go.sum new file mode 100644 index 000000000..15fe360fb --- /dev/null +++ b/pkg/gofr/datasource/influxdb/go.sum @@ -0,0 +1,275 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= +github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= +github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53 h1:sR+/8Yb4slttB4vD+b9btVEnWgL3Q00OBTzVT8B9C0c= +github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= +github.com/CloudyKit/jet/v6 v6.2.0 h1:EpcZ6SR9n28BUGtNJSvlBqf90IpjeFr36Tizxhn/oME= +github.com/CloudyKit/jet/v6 v6.2.0/go.mod h1:d3ypHeIRNo2+XyqnGA8s+aphtcVpjP5hPwP/Lzo7Ro4= +github.com/Joker/jade v1.1.3 h1:Qbeh12Vq6BxURXT1qZBRHsDxeURB8ztcL6f3EXSGeHk= +github.com/Joker/jade v1.1.3/go.mod h1:T+2WLyt7VH6Lp0TRxQrUYEs64nRc83wkMQrfeIQKduM= +github.com/RaveNoX/go-jsoncommentstrip v1.0.0/go.mod h1:78ihd09MekBnJnxpICcwzCMzGrKSKYe4AqU6PDYYpjk= +github.com/Shopify/goreferrer v0.0.0-20220729165902-8cddb4f5de06 h1:KkH3I3sJuOLP3TjA/dfr4NAY8bghDwnXiU7cTKxQqo0= +github.com/Shopify/goreferrer v0.0.0-20220729165902-8cddb4f5de06/go.mod h1:7erjKLwalezA0k99cWs5L11HWOAPNjdUZ6RxH1BXbbM= +github.com/ajg/form v1.5.1 h1:t9c7v8JUKu/XxOGBU0yjNpaMloxGEJhUkqFRq0ibGeU= +github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= +github.com/andybalholm/brotli v1.0.5 h1:8uQZIdzKmjc/iuPu7O2ioW48L81FgatrcpfFmiq/cCs= +github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= +github.com/apapsch/go-jsonmerge/v2 v2.0.0 h1:axGnT1gRIfimI7gJifB699GoE/oq+F2MU7Dml6nw9rQ= +github.com/apapsch/go-jsonmerge/v2 v2.0.0/go.mod h1:lvDnEdqiQrp0O42VQGgmlKpxL1AP2+08jFMw88y4klk= +github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= +github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= +github.com/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvFv1sNto9p6w= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +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/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= +github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= +github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo= +github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= +github.com/flosch/pongo2/v4 v4.0.2 h1:gv+5Pe3vaSVmiJvh/BZa82b7/00YUGm0PIyVVLop0Hw= +github.com/flosch/pongo2/v4 v4.0.2/go.mod h1:B5ObFANs/36VwxxlgKpdchIJHMvHB562PW+BWPhwZD8= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +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/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 h1:f+oWsMOmNPc8JmEHVZIycC7hBoQxHH9pNKQORJNozsQ= +github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8/go.mod h1:wcDNUvekVysuuOpQKo3191zZyTpiI6se1N1ULghS0sw= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/gomarkdown/markdown v0.0.0-20230716120725-531d2d74bc12 h1:uK3X/2mt4tbSGoHvbLBHUny7CKiuwUip3MArtukol4E= +github.com/gomarkdown/markdown v0.0.0-20230716120725-531d2d74bc12/go.mod h1:JDGcbDT52eL4fju3sZ4TeHGsQwhG9nbDV21aMyhwPoA= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= +github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gorilla/css v1.0.0 h1:BQqNyPTi50JCFMTw/b67hByjMVXZRwGha6wxVGkeihY= +github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c= +github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= +github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/imkira/go-interpol v1.1.0 h1:KIiKr0VSG2CUW1hl1jpiyuzuJeKUUpC8iM1AIE7N1Vk= +github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= +github.com/influxdata/influxdb-client-go/v2 v2.14.0 h1:AjbBfJuq+QoaXNcrova8smSjwJdUHnwvfjMF71M1iI4= +github.com/influxdata/influxdb-client-go/v2 v2.14.0/go.mod h1:Ahpm3QXKMJslpXl3IftVLVezreAUtBOTZssDrjZEFHI= +github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839 h1:W9WBk7wlPfJLvMCdtV4zPulc4uCPrlywQOmbFOhgQNU= +github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= +github.com/iris-contrib/httpexpect/v2 v2.15.1 h1:G2/TW0EZ5UhNNdljNDBBQDfdfumLlV6ljRqdTk3cAmc= +github.com/iris-contrib/httpexpect/v2 v2.15.1/go.mod h1:cUwf1Mm5CWs5ahZNHtDq82WuGOitAWBg/eMGevX9ilg= +github.com/iris-contrib/schema v0.0.6 h1:CPSBLyx2e91H2yJzPuhGuifVRnZBBJ3pCOMbOvPZaTw= +github.com/iris-contrib/schema v0.0.6/go.mod h1:iYszG0IOsuIsfzjymw1kMzTL8YQcCWlm65f3wX8J5iA= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/juju/gnuflag v0.0.0-20171113085948-2ce1bb71843d/go.mod h1:2PavIy+JPciBPrBUjwbNvtwB6RQlve+hkpll6QSNmOE= +github.com/kataras/blocks v0.0.7 h1:cF3RDY/vxnSRezc7vLFlQFTYXG/yAr1o7WImJuZbzC4= +github.com/kataras/blocks v0.0.7/go.mod h1:UJIU97CluDo0f+zEjbnbkeMRlvYORtmc1304EeyXf4I= +github.com/kataras/golog v0.1.9 h1:vLvSDpP7kihFGKFAvBSofYo7qZNULYSHOH2D7rPTKJk= +github.com/kataras/golog v0.1.9/go.mod h1:jlpk/bOaYCyqDqH18pgDHdaJab72yBE6i0O3s30hpWY= +github.com/kataras/iris/v12 v12.2.5 h1:R5UzUW4MIByBM6tKMG3UqJ7hL1JCEE+dkqQ8L72f6PU= +github.com/kataras/iris/v12 v12.2.5/go.mod h1:bf3oblPF8tQmRgyPCzPZr0mLazvEDFgImdaGZYuN4hw= +github.com/kataras/pio v0.0.12 h1:o52SfVYauS3J5X08fNjlGS5arXHjW/ItLkyLcKjoH6w= +github.com/kataras/pio v0.0.12/go.mod h1:ODK/8XBhhQ5WqrAhKy+9lTPS7sBf6O3KcLhc9klfRcY= +github.com/kataras/sitemap v0.0.6 h1:w71CRMMKYMJh6LR2wTgnk5hSgjVNB9KL60n5e2KHvLY= +github.com/kataras/sitemap v0.0.6/go.mod h1:dW4dOCNs896OR1HmG+dMLdT7JjDk7mYBzoIRwuj5jA4= +github.com/kataras/tunnel v0.0.4 h1:sCAqWuJV7nPzGrlb0os3j49lk2JhILT0rID38NHNLpA= +github.com/kataras/tunnel v0.0.4/go.mod h1:9FkU4LaeifdMWqZu7o20ojmW4B7hdhv2CMLwfnHGpYw= +github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I= +github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/mailgun/raymond/v2 v2.0.48 h1:5dmlB680ZkFG2RN/0lvTAghrSxIESeu9/2aeDqACtjw= +github.com/mailgun/raymond/v2 v2.0.48/go.mod h1:lsgvL50kgt1ylcFJYZiULi5fjPBkkhNfj4KA0W54Z18= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= +github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/microcosm-cc/bluemonday v1.0.25 h1:4NEwSfiJ+Wva0VxN5B8OwMicaJvD8r9tlJWm9rtloEg= +github.com/microcosm-cc/bluemonday v1.0.25/go.mod h1:ZIOjCQp1OrzBBPIJmfX4qDYFuhU02nx4bn030ixfHLE= +github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0= +github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= +github.com/oapi-codegen/runtime v1.0.0 h1:P4rqFX5fMFWqRzY9M/3YF9+aPSPPB06IzP2P7oOxrWo= +github.com/oapi-codegen/runtime v1.0.0/go.mod h1:LmCUMQuPB4M/nLXilQXhHw+BLZdDb18B34OO356yJ/A= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= +github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/sanity-io/litter v1.5.5 h1:iE+sBxPBzoK6uaEP5Lt3fHNgpKcHXc/A2HGETy0uJQo= +github.com/sanity-io/litter v1.5.5/go.mod h1:9gzJgR2i4ZpjZHsKvUXIRQVk7P+yM3e+jAF7bU2UI5U= +github.com/schollz/closestmatch v2.1.0+incompatible h1:Uel2GXEpJqOWBrlyI+oY9LTiyyjYS17cCYRqP13/SHk= +github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= +github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ= +github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= +github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= +github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/spkg/bom v0.0.0-20160624110644-59b7046e48ad/go.mod h1:qLr4V1qq6nMqFKkMo8ZTx3f+BZEkzsRUY10Xsm2mwU0= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/tdewolff/minify/v2 v2.12.8 h1:Q2BqOTmlMjoutkuD/OPCnJUpIqrzT3nRPkw+q+KpXS0= +github.com/tdewolff/minify/v2 v2.12.8/go.mod h1:YRgk7CC21LZnbuke2fmYnCTq+zhCgpb0yJACOTUNJ1E= +github.com/tdewolff/parse/v2 v2.6.7 h1:WrFllrqmzAcrKHzoYgMupqgUBIfBVOb0yscFzDf8bBg= +github.com/tdewolff/parse/v2 v2.6.7/go.mod h1:XHDhaU6IBgsryfdnpzUXBlT6leW/l25yrFBTEb4eIyM= +github.com/tdewolff/test v1.0.9 h1:SswqJCmeN4B+9gEAi/5uqT0qpi1y2/2O47V/1hhGZT0= +github.com/tdewolff/test v1.0.9/go.mod h1:6DAvZliBAAnD7rhVgwaM7DE5/d9NMOAJ09SqYqeK4QE= +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/vmihailenco/msgpack/v5 v5.3.5 h1:5gO0H1iULLWGhs2H5tbAHIZTV8/cYafcFOr9znI5mJU= +github.com/vmihailenco/msgpack/v5 v5.3.5/go.mod h1:7xyJ9e+0+9SaZT0Wt1RGleJXzli6Q/V5KbhBonMG9jc= +github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g= +github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= +github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= +github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0 h1:6fRhSjgLCkTD3JnJxvaJ4Sj+TYblw757bqYgZaOq5ZY= +github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= +github.com/yosssi/ace v0.0.5 h1:tUkIP/BLdKqrlrPwcmH0shwEEhTRHoGnc1wFIWmaBUA= +github.com/yosssi/ace v0.0.5/go.mod h1:ALfIzm2vT7t5ZE7uoIZqF3TQ7SAOyupFZnkrF5id+K0= +github.com/yudai/gojsondiff v1.0.0 h1:27cbfqXLVEJ1o8I6v3y9lg8Ydm53EKqHXAOMxEGlCOA= +github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= +github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82 h1:BHyfKlQyqbsFN5p3IfnEUduWvb9is428/nNb5L3U01M= +github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= +go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.39.0 h1:SHs+kF4LP+f+p14esP5jAoDpHU8Gu/v9lFRK6IT5imM= +golang.org/x/crypto v0.39.0/go.mod h1:L+Xg3Wf6HoL4Bn4238Z6ft6KfEpN0tJGo53AAPC632U= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw= +golang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= +golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M= +golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA= +golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= +golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +moul.io/http2curl/v2 v2.3.0 h1:9r3JfDzWPcbIklMOs2TnIFzDYvfAZvjeavG6EzP7jYs= +moul.io/http2curl/v2 v2.3.0/go.mod h1:RW4hyBjTWSYDOxapodpNEtX0g5Eb16sxklBqmd2RHcE= diff --git a/pkg/gofr/datasource/influxdb/influxdb.go b/pkg/gofr/datasource/influxdb/influxdb.go new file mode 100644 index 000000000..075eb80d6 --- /dev/null +++ b/pkg/gofr/datasource/influxdb/influxdb.go @@ -0,0 +1,367 @@ +package influxdb + +import ( + "context" + "errors" + "time" + + influxdb "github.com/influxdata/influxdb-client-go/v2" + "go.opencensus.io/trace" +) + +// Config holds the configuration for connecting to InfluxDB. +type Config struct { + URL string + Token string + Username string + Password string +} + +type influx struct { + client client + organization organization + bucket bucket + query query +} + +// Client represents the InfluxDB client. +type Client struct { + influx influx + config Config + logger Logger + metrics Metrics + tracer trace.Tracer +} + +type HealthInflux struct { + URL string + Token string + Username string + Password string +} + +const ( + statusDown = "DOWN" + statusUp = "UP" +) + +var ( + errEmptyOrganizationName = errors.New("organization name must not be empty") + errEmptyOrganizationID = errors.New("organization id must not be empty") + errEmptyBucketID = errors.New("bucket id must not be empty") + errEmptyBucketName = errors.New("bucket name must not be empty") + errFetchOrganization = errors.New("failed to fetch all organizations") + errHealthCheckFailed = errors.New("influxdb health check failed") +) + +// CreateOrganization creates a new organization in InfluxDB with the specified name. +// It implements the container.InfluxDBProvider interface. +// +// Parameters: +// - ctx: Context for request cancellation and timeouts. +// - orgName: The name of the organization to be created. Must not be empty. +// +// Returns: +// - string: The ID of the newly created organization. +// - error: Error if organization creation fails or if orgName is empty. +func (c *Client) CreateOrganization(ctx context.Context, orgName string) (string, error) { + if orgName == "" { + return "", errEmptyOrganizationName + } + + newOrg, err := c.influx.organization.CreateOrganizationWithName(ctx, orgName) + if err != nil { + c.logger.Errorf("failed to create new organization with name '%v' %v", orgName, err) + return "", err + } + + c.logger.Debugf("organization created with name '%v'", orgName) + + return *newOrg.Id, nil +} + +// DeleteOrganization deletes an organization in InfluxDB using its ID. +// It implements the container.InfluxDBProvider interface. +// +// Parameters: +// - ctx: Context for request cancellation and timeouts. +// - orgID: The ID of the organization to be deleted. Must not be empty. +// +// Returns: +// - err: Error if the organization deletion fails or if orgID is empty. +func (c *Client) DeleteOrganization(ctx context.Context, orgID string) error { + if orgID == "" { + return errEmptyOrganizationID + } + + err := c.influx.organization.DeleteOrganizationWithID(ctx, orgID) + if err != nil { + return err + } + + return nil +} + +// ListOrganization retrieves all organizations from InfluxDB and returns their IDs and names. +// It implements the container.InfluxDBProvider interface. +// +// Parameters: +// - ctx: Context for request cancellation and timeouts. +// +// Returns: +// - orgs: A map of organization IDs to their corresponding names. +// - err: Error if the API call fails or the organizations cannot be retrieved. +func (c *Client) ListOrganization(ctx context.Context) (map[string]string, error) { + allOrg, err := c.influx.organization.GetOrganizations(ctx) + if err != nil { + return nil, errFetchOrganization + } + + if allOrg == nil || len(*allOrg) == 0 { + return map[string]string{}, nil + } + + orgs := make(map[string]string, len(*allOrg)) + + for _, org := range *allOrg { + if org.Id != nil { + orgs[*org.Id] = org.Name + } + } + + return orgs, nil +} + +// CreateBucket creates a new bucket in InfluxDB for the specified organization. +// Parameters: +// - ctx: Context for request cancellation and timeouts. +// - orgID: The ID of the organization in which the bucket will be created. +// - bucketName: The name of the bucket to be created. +// +// Returns: +// - bucketID: The ID of the newly created bucket. +// - err: Error if bucket creation fails. +func (c *Client) CreateBucket(ctx context.Context, orgID, bucketName string) (bucketID string, err error) { + if orgID == "" { + return "", errEmptyOrganizationID + } + + if bucketName == "" { + return "", errEmptyBucketName + } + + newBucket, err := c.influx.bucket.CreateBucketWithNameWithID(ctx, orgID, bucketName) + if err != nil { + return "", err + } + + return *newBucket.Id, nil +} + +// DeleteBucket deletes a bucket from InfluxDB by its ID. +// Parameters: +// - ctx: Context for request cancellation and timeouts. +// - org: The ID or name of the organization (not used directly in this implementation). +// - bucketID: The ID of the bucket to be deleted. Must not be empty. +// +// Returns: +// - err: Error if the bucket deletion fails or if bucketID is empty. +func (c *Client) DeleteBucket(ctx context.Context, bucketID string) error { + if bucketID == "" { + return errEmptyBucketID + } + + if err := c.influx.bucket.DeleteBucketWithID(ctx, bucketID); err != nil { + return err + } + + return nil +} + +type Health struct { + Status string `json:"status"` // "UP" or "DOWN" + Details map[string]any `json:"details,omitempty"` // extra metadata +} + +// HealthCheck retrieves the health status of the InfluxDB instance. +// It implements the container.InfluxDBProvider interface. +// +// Parameters: +// - ctx: Context for request cancellation and timeouts. +// +// Returns: +// - any: A datasource.Health object containing the status and details of the InfluxDB service. +// - err: Error if the health check request fails or the InfluxDB client returns an error. +func (c *Client) HealthCheck(ctx context.Context) (any, error) { + h := Health{Details: make(map[string]any)} + h.Details["Username"] = c.config.Username + h.Details["Url"] = c.config.URL + + health, err := c.influx.client.Health(ctx) + if err != nil { + h.Status = statusDown + h.Details["error"] = err.Error() + + return &h, errHealthCheckFailed + } + + h.Status = statusUp + h.Details["Name"] = health.Name + h.Details["Commit"] = health.Commit + h.Details["Version"] = health.Version + h.Details["Message"] = health.Message + h.Details["Checks"] = health.Checks + h.Details["Status"] = health.Status + + return h, nil +} + +/* +ListBuckets retrieves the names of all buckets for a given organization from InfluxDB. +It implements the container.InfluxDBProvider interface. + +Parameters: +- ctx: Context for cancellation and deadlines. +- org: Organization name (must not be empty). + +Returns: +- A slice of bucket names. +- An error, if any occurred during retrieval. +*/ +func (c *Client) ListBuckets(ctx context.Context, org string) (buckets map[string]string, err error) { + // Validate input + if org == "" { + return nil, errEmptyOrganizationName + } + + bucketsDomain, err := c.influx.bucket.FindBucketsByOrgName(ctx, org) + if err != nil { + return nil, err + } + + buckets = make(map[string]string) // Initialize the map + + for _, bucket := range *bucketsDomain { + if bucket.Name != "" { + buckets[*bucket.Id] = bucket.Name + } + } + + return buckets, nil +} + +// Ping pings the InfluxDB server to check its availability. +// It implements the container.InfluxDBProvider interface. +// +// Parameters: +// - ctx: Context for request cancellation and timeouts. +// +// Returns: +// - bool: True if the InfluxDB server is reachable; false otherwise. +// - err: Error if the ping request fails. +func (c *Client) Ping(ctx context.Context) (bool, error) { + ping, err := c.influx.client.Ping(ctx) + if err != nil { + c.logger.Errorf("%v", err) + return false, err + } + + return ping, nil +} + +func (c *Client) Query(ctx context.Context, fluxQuery string) ([]map[string]any, error) { + result, err := c.influx.query.Query(ctx, fluxQuery) + if err != nil { + c.logger.Errorf("InfluxDB Flux Query '%v' failed: %v", fluxQuery, err.Error()) + return nil, err + } + + var records []map[string]any + + for result.Next() { + if result.Err() != nil { + c.logger.Errorf("Error processing InfluxDB Flux Query result: %v", result.Err().Error()) + return nil, result.Err() + } + + record := make(map[string]any) + for k, v := range result.Record().Values() { + record[k] = v + } + + records = append(records, record) + } + // Check for any final errors after iteration. + if result.Err() != nil { + c.logger.Errorf("Final error in InfluxDB Flux Query result: %v", result.Err().Error()) + return nil, result.Err() + } + + return records, nil +} + +func (c *Client) UseLogger(logger any) { + if l, ok := logger.(Logger); ok { + c.logger = l + } +} + +func (c *Client) UseMetrics(metrics any) { + if m, ok := metrics.(Metrics); ok { + c.metrics = m + } +} + +// UseTracer sets the tracer for InfluxDB client. +func (c *Client) UseTracer(tracer any) { + if tracer, ok := tracer.(trace.Tracer); ok { + c.tracer = tracer + } +} + +func (c *Client) WritePoint(ctx context.Context, + org, bucket, measurement string, + tags map[string]string, fields map[string]any, timestamp time.Time, +) error { + p := influxdb.NewPoint(measurement, tags, fields, timestamp) + writeAPI := c.influx.client.WriteAPIBlocking(org, bucket) + + if err := writeAPI.WritePoint(ctx, p); err != nil { + c.logger.Errorf("Failed to write point to influxdb: %v", err.Error()) + return err + } + + return nil +} + +// New creates a new InfluxDB client with the provided configuration. +func New(config Config) *Client { + return &Client{ + config: config, + } +} + +// Connect initializes a new InfluxDB client using the configured URL and authentication token. +// It logs the connection status and performs a health check to verify connectivity. +// +// If the health check fails, it logs an error and exits early without returning an error. +// No parameters or return values. +func (c *Client) Connect() { + c.logger.Logf("connecting to influxdb at %v", c.config.URL) + + // Create a new client using an InfluxDB server base URL and an authentication token + c.influx.client = influxdb.NewClient( + c.config.URL, + c.config.Token, + ) + + c.influx.organization = NewInfluxdbOrganizationAPI(c.influx.client.OrganizationsAPI()) + c.influx.bucket = NewInfluxdbBucketAPI(c.influx.client.BucketsAPI()) + + if _, err := c.HealthCheck(context.Background()); err != nil { + c.logger.Errorf("InfluxDB health check failed: %v", err.Error()) + return + } + + c.logger.Logf("connected to influxdb at : %v", c.config.URL) +} diff --git a/pkg/gofr/datasource/influxdb/influxdb_test.go b/pkg/gofr/datasource/influxdb/influxdb_test.go new file mode 100644 index 000000000..4866e1599 --- /dev/null +++ b/pkg/gofr/datasource/influxdb/influxdb_test.go @@ -0,0 +1,561 @@ +package influxdb + +import ( + "errors" + "testing" + + gomock "github.com/golang/mock/gomock" + "github.com/influxdata/influxdb-client-go/v2/api" + "github.com/influxdata/influxdb-client-go/v2/domain" + "github.com/stretchr/testify/require" + "go.opentelemetry.io/otel" +) + +var ( + errInvalidOrgID = errors.New("invalid organization id") + errFailedCreatingOrg = errors.New("failed to create new organization") + errPingFailed = errors.New("failed to ping") + errFailedQuery = errors.New("error failed query") +) + +func setupDB(t *testing.T, ctrl *gomock.Controller) *Client { + t.Helper() + + mockLogger := NewMockLogger(ctrl) + mockMetrics := NewMockMetrics(ctrl) + + config := Config{ + URL: "http://localhost:8086", + Username: "username", + Password: "password", + Token: "token", + } + + client := New(config) + + client.UseLogger(mockLogger) + client.UseMetrics(mockMetrics) + client.UseTracer(otel.GetTracerProvider().Tracer("gofr-influxdb")) + + mockLogger.EXPECT().Debugf(gomock.Any(), gomock.Any()).AnyTimes() + mockLogger.EXPECT().Errorf(gomock.Any(), gomock.Any()).AnyTimes() + mockLogger.EXPECT().Errorf(gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() + + // Replace the client with our mocked version + client.influx.client = NewMockclient(ctrl) + + return client +} + +func Test_HealthCheckSuccess(t *testing.T) { + t.Helper() + + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + client := *setupDB(t, ctrl) + mockInflux := client.influx.client.(*Mockclient) + + expectedHealth := &domain.HealthCheck{Status: "pass"} + mockInflux.EXPECT(). + Health(gomock.Any()). + Return(expectedHealth, nil). + Times(1) + + _, err := client.HealthCheck(t.Context()) + require.NoError(t, err) +} + +func Test_HealthCheckFail(t *testing.T) { + t.Helper() + + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + client := *setupDB(t, ctrl) + mockInflux := client.influx.client.(*Mockclient) + + expectedHealth := &domain.HealthCheck{Status: "fail"} + mockInflux.EXPECT(). + Health(gomock.Any()). + Return(expectedHealth, errEmptyBucketID). + Times(1) + + _, err := client.HealthCheck(t.Context()) + require.Error(t, err) +} + +func Test_PingSuccess(t *testing.T) { + t.Helper() + + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + client := *setupDB(t, ctrl) + mockInflux := client.influx.client.(*Mockclient) + + mockInflux.EXPECT(). + Ping(gomock.Any()). + Return(true, nil). + Times(1) + + health, err := client.Ping(t.Context()) + + require.NoError(t, err) // empty organization name + require.True(t, health) +} + +func Test_PingFailed(t *testing.T) { + t.Helper() + + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + client := *setupDB(t, ctrl) + mockInflux := client.influx.client.(*Mockclient) + + mockInflux.EXPECT(). + Ping(gomock.Any()). + Return(false, errPingFailed). + Times(1) + + health, err := client.Ping(t.Context()) + + require.Error(t, err) // empty organization name + require.False(t, health) +} + +func Test_CreateOrganization(t *testing.T) { + t.Helper() + + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + dummyID := "dummyID" + + testCases := []struct { + name string + orgName string + resp *domain.Organization + expectErr bool + err error + }{ + { + name: "empty organizations name", + orgName: "", + resp: &domain.Organization{}, + expectErr: true, + err: errEmptyOrganizationName, + }, + { + name: "create new organization", + orgName: "testOrg", + resp: &domain.Organization{ + Id: &dummyID, + }, + expectErr: false, + err: nil, + }, + { + name: "create duplicate organization", + orgName: "testOrg", + resp: &domain.Organization{}, + expectErr: true, + err: errFailedCreatingOrg, + }, + } + + for _, tt := range testCases { + t.Run(tt.name, func(t *testing.T) { + client := *setupDB(t, ctrl) + mockOrganization := NewMockorganization(ctrl) + + client.influx.organization = mockOrganization + mockOrganization.EXPECT(). + CreateOrganizationWithName(gomock.Any(), tt.orgName). + Return(tt.resp, tt.err). + AnyTimes() + + newOrgID, err := client.CreateOrganization(t.Context(), tt.orgName) + + if tt.expectErr { + require.Error(t, err) + require.Equal(t, err, tt.err) + require.Empty(t, newOrgID) + } else { + require.NoError(t, err) + } + }) + } +} + +func Test_DeleteOrganization(t *testing.T) { + t.Helper() + + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + dummyID := "dummyID" + + testCases := []struct { + name string + orgID string + expectErr bool + err error + }{ + { + name: "delete empty organizations with id", + orgID: "", + expectErr: true, + err: errEmptyOrganizationID, + }, + { + name: "delete organization with id", + orgID: dummyID, + expectErr: false, + err: nil, + }, + { + name: "delete invalid organization with id", + orgID: dummyID, + expectErr: true, + err: errInvalidOrgID, + }, + } + + for _, tt := range testCases { + t.Run(tt.name, func(t *testing.T) { + client := *setupDB(t, ctrl) + mockOrganization := NewMockorganization(ctrl) + client.influx.organization = mockOrganization + + mockOrganization.EXPECT(). + DeleteOrganizationWithID(gomock.Any(), tt.orgID). + Return(tt.err). + AnyTimes() + + err := client.DeleteOrganization(t.Context(), tt.orgID) + + if tt.expectErr { + require.Error(t, err) + require.Equal(t, err, tt.err) + } else { + require.NoError(t, err) + } + }) + } +} + +func Test_ListOrganization(t *testing.T) { + t.Helper() + + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + client := *setupDB(t, ctrl) + mockOrganization := NewMockorganization(ctrl) + client.influx.organization = mockOrganization + + t.Run("test zero organization", func(t *testing.T) { + allOrgs := []domain.Organization{} + + mockOrganization.EXPECT(). + GetOrganizations(gomock.Any()). + Return(&allOrgs, nil). + Times(1) + + orgs, err := client.ListOrganization(t.Context()) + require.NoError(t, err) + require.Empty(t, orgs) + }) + + t.Run("testing error in fetching organization", func(t *testing.T) { + allOrgs := &[]domain.Organization{} + + mockOrganization.EXPECT(). + GetOrganizations(gomock.Any()). + Return(allOrgs, errFetchOrganization). + Times(1) + + orgs, err := client.ListOrganization(t.Context()) + require.Empty(t, orgs) + require.Error(t, err) + require.Equal(t, err, errFetchOrganization) + }) + + t.Run("testing fetching list of organization", func(t *testing.T) { + id1, name1 := "id1", "name1" + id2, name2 := "id1", "name1" + + allOrg := &[]domain.Organization{ + {Id: &id1, Name: name1}, + {Id: &id2, Name: name2}, + } + + wantOrg := map[string]string{id1: name1, id2: name2} + + mockOrganization.EXPECT(). + GetOrganizations(gomock.Any()). + Return(allOrg, nil). + Times(1) + + resultOrg, err := client.ListOrganization(t.Context()) + + require.NoError(t, err) + require.NotEmpty(t, resultOrg) + + orgs := make(map[string]string, len(*allOrg)) + + for _, org := range *allOrg { + orgs[*org.Id] = org.Name + } + + require.Equal(t, wantOrg, orgs) + }) +} + +func Test_CreateBucket(t *testing.T) { + t.Helper() + + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + dummyID := "id1" + dummyOrgID := "org123" + dummyBucketName := "bucket123" + + testCases := []struct { + name string + orgID string + bucketName string + respBucket *domain.Bucket + wantBucketID string + expectErr bool + err error + }{ + { + name: "try creating bucket with empty organization id", + orgID: "", + bucketName: dummyBucketName, + expectErr: true, + respBucket: nil, + wantBucketID: "", + err: errEmptyOrganizationID, + }, + { + name: "try creating bucket with empty bucket name", + orgID: dummyOrgID, + bucketName: "", + expectErr: true, + respBucket: nil, + wantBucketID: "", + err: errEmptyBucketName, + }, + { + name: "successfully creating a new bucket", + orgID: dummyOrgID, + bucketName: dummyBucketName, + expectErr: false, + respBucket: &domain.Bucket{Id: &dummyID}, + wantBucketID: dummyID, + err: nil, + }, + } + + for _, tt := range testCases { + t.Run(tt.name, func(t *testing.T) { + client := *setupDB(t, ctrl) + + mockBucket := NewMockbucket(ctrl) + + client.influx.bucket = mockBucket + mockBucket.EXPECT(). + CreateBucketWithNameWithID(gomock.Any(), tt.orgID, tt.bucketName). + Return(tt.respBucket, tt.err). + AnyTimes() + + bucketID, err := client.CreateBucket(t.Context(), tt.orgID, tt.bucketName) + + if tt.expectErr { + require.Error(t, err) + require.Equal(t, err, tt.err) + } else { + require.Equal(t, tt.wantBucketID, bucketID) + require.NoError(t, err) + } + }) + } +} + +func Test_DeleteBucket(t *testing.T) { + t.Helper() + + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + dummyID := "id1" + + testCases := []struct { + name string + orgID string + bucketID string + expectErr bool + err error + }{ + { + name: "try deleting bucket with empty bucket id", + orgID: "", + bucketID: "", + expectErr: true, + err: errEmptyBucketID, + }, + { + name: "successfully deleting a new bucket", + orgID: "", + bucketID: dummyID, + expectErr: false, + err: nil, + }, + } + + for _, tt := range testCases { + t.Run(tt.name, func(t *testing.T) { + client := *setupDB(t, ctrl) + mockBucket := NewMockbucket(ctrl) + + client.influx.bucket = mockBucket + mockBucket.EXPECT(). + DeleteBucketWithID(gomock.Any(), tt.bucketID). + Return(tt.err). + AnyTimes() + + err := client.DeleteBucket(t.Context(), tt.bucketID) + + if tt.expectErr { + require.Error(t, err) + require.Equal(t, err, tt.err) + } else { + require.NoError(t, err) + } + }) + } +} + +func Test_ListBucket(t *testing.T) { + t.Helper() + + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + dummyOrgName := "orgName" + id1, name1 := "id1", "name1" + id2, name2 := "id1", "name1" + + testCases := []struct { + name string + orgName string + resp *[]domain.Bucket + wantBuckets map[string]string + expectErr bool + err error + }{ + { + name: "try list bucket with empty organization name", + orgName: "", + expectErr: true, + wantBuckets: nil, + resp: &[]domain.Bucket{}, + err: errEmptyOrganizationName, + }, + + { + name: "success list organizations", + orgName: dummyOrgName, + resp: &[]domain.Bucket{ + {Id: &id1, Name: name1}, + {Id: &id2, Name: name2}, + }, + wantBuckets: map[string]string{ + id1: name1, + id2: name2, + }, + expectErr: false, + err: nil, + }, + } + + for _, tt := range testCases { + t.Run(tt.name, func(t *testing.T) { + client := *setupDB(t, ctrl) + + mockBucket := NewMockbucket(ctrl) + + client.influx.bucket = mockBucket + mockBucket.EXPECT(). + FindBucketsByOrgName(gomock.Any(), tt.orgName). + Return(tt.resp, tt.err). + AnyTimes() + + buckets, err := client.ListBuckets(t.Context(), tt.orgName) + + if tt.expectErr { + require.Error(t, err) + require.Equal(t, err, tt.err) + } else { + require.NoError(t, err) + require.NotEmpty(t, buckets) + require.Equal(t, tt.wantBuckets, buckets) + } + }) + } +} + +func Test_Query(t *testing.T) { + t.Helper() + + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + testCases := []struct { + name string + resp *api.QueryTableResult + wantResults map[string]any + orgName string + inputQuery string + expectErr bool + err error + }{ + { + name: "failing error query", + orgName: "org1", + inputQuery: "dummyQuery1", + expectErr: true, + wantResults: map[string]any{}, + resp: &api.QueryTableResult{}, + err: errFailedQuery, + }, + } + for _, tt := range testCases { + t.Run(tt.name, func(t *testing.T) { + client := *setupDB(t, ctrl) + mockQuery := NewMockquery(ctrl) + + client.influx.query = mockQuery + + mockQuery.EXPECT(). + Query(gomock.Any(), tt.inputQuery). + Return(tt.resp, tt.err). + AnyTimes() + + result, err := client.Query(t.Context(), tt.inputQuery) + + if tt.expectErr { + require.Error(t, err) + require.Equal(t, err, tt.err) + require.Empty(t, result) + } else { + require.NoError(t, err) + } + }) + } +} diff --git a/pkg/gofr/datasource/influxdb/interface.go b/pkg/gofr/datasource/influxdb/interface.go new file mode 100644 index 000000000..41319079f --- /dev/null +++ b/pkg/gofr/datasource/influxdb/interface.go @@ -0,0 +1,52 @@ +package influxdb + +import ( + "context" + + influxdb "github.com/influxdata/influxdb-client-go/v2" + "github.com/influxdata/influxdb-client-go/v2/api" + "github.com/influxdata/influxdb-client-go/v2/domain" +) + +// client defines the operations required to interact with an InfluxDB instance. +type client interface { + Setup(ctx context.Context, username, password, org, bucket string, retentionPeriodHours int) (*domain.OnboardingResponse, error) + Health(ctx context.Context) (*domain.HealthCheck, error) + Ping(ctx context.Context) (bool, error) + Options() *influxdb.Options + WriteAPIBlocking(org, bucket string) api.WriteAPIBlocking + QueryAPI(org string) api.QueryAPI + AuthorizationsAPI() api.AuthorizationsAPI + OrganizationsAPI() api.OrganizationsAPI + DeleteAPI() api.DeleteAPI + BucketsAPI() api.BucketsAPI +} + +// organization provides methods for managing Organizations in a InfluxDB server. +type organization interface { + GetOrganizations(ctx context.Context, pagingOptions ...api.PagingOption) (*[]domain.Organization, error) + FindOrganizationByName(ctx context.Context, orgName string) (*domain.Organization, error) + CreateOrganizationWithName(ctx context.Context, orgName string) (*domain.Organization, error) + DeleteOrganizationWithID(ctx context.Context, orgID string) error +} + +// bucket provides methods for managing Buckets in a InfluxDB server. +type bucket interface { + GetBuckets(ctx context.Context, pagingOptions ...api.PagingOption) (*[]domain.Bucket, error) + FindBucketByName(ctx context.Context, bucketName string) (*domain.Bucket, error) + FindBucketByID(ctx context.Context, bucketID string) (*domain.Bucket, error) + FindBucketsByOrgName(ctx context.Context, orgName string, pagingOptions ...api.PagingOption) (*[]domain.Bucket, error) + CreateBucket(ctx context.Context, bucket *domain.Bucket) (*domain.Bucket, error) + CreateBucketWithName( + ctx context.Context, org *domain.Organization, bucketName string, rules ...domain.RetentionRule) (*domain.Bucket, error) + CreateBucketWithNameWithID(ctx context.Context, orgID, bucketName string, rules ...domain.RetentionRule) (*domain.Bucket, error) + UpdateBucket(ctx context.Context, bucket *domain.Bucket) (*domain.Bucket, error) + DeleteBucketWithID(ctx context.Context, bucketID string) error +} + +type query interface { + QueryRaw(ctx context.Context, query string, dialect *domain.Dialect) (string, error) + QueryRawWithParams(ctx context.Context, query string, dialect *domain.Dialect, params any) (string, error) + Query(ctx context.Context, query string) (*api.QueryTableResult, error) + QueryWithParams(ctx context.Context, query string, params any) (*api.QueryTableResult, error) +} diff --git a/pkg/gofr/datasource/influxdb/internal.go b/pkg/gofr/datasource/influxdb/internal.go new file mode 100644 index 000000000..6d5dc26e1 --- /dev/null +++ b/pkg/gofr/datasource/influxdb/internal.go @@ -0,0 +1,85 @@ +package influxdb + +import ( + "context" + + "github.com/influxdata/influxdb-client-go/v2/api" + "github.com/influxdata/influxdb-client-go/v2/domain" +) + +type influxdbOrganizationAPI struct { + api api.OrganizationsAPI +} + +// NewInfluxdbOrganizationAPI creates a new bucket API wrapper. +func NewInfluxdbOrganizationAPI(a api.OrganizationsAPI) organization { + return influxdbOrganizationAPI{api: a} +} + +func (a influxdbOrganizationAPI) GetOrganizations(ctx context.Context, pagingOptions ...api.PagingOption) (*[]domain.Organization, error) { + return a.api.GetOrganizations(ctx, pagingOptions...) +} + +func (a influxdbOrganizationAPI) FindOrganizationByName(ctx context.Context, orgName string) (*domain.Organization, error) { + return a.api.FindOrganizationByName(ctx, orgName) +} + +func (a influxdbOrganizationAPI) CreateOrganizationWithName(ctx context.Context, orgName string) (*domain.Organization, error) { + return a.api.CreateOrganizationWithName(ctx, orgName) +} + +func (a influxdbOrganizationAPI) DeleteOrganizationWithID(ctx context.Context, orgID string) error { + return a.api.DeleteOrganizationWithID(ctx, orgID) +} + +// influxdbBucketAPI. +type influxdbBucketAPI struct { + api api.BucketsAPI +} + +// NewInfluxdbBucketAPI creates a new bucket API wrapper. +func NewInfluxdbBucketAPI(a api.BucketsAPI) bucket { + return influxdbBucketAPI{api: a} +} + +func (b influxdbBucketAPI) GetBuckets(ctx context.Context, pagingOptions ...api.PagingOption) (*[]domain.Bucket, error) { + return b.api.GetBuckets(ctx, pagingOptions...) +} + +func (b influxdbBucketAPI) FindBucketsByOrgName(ctx context.Context, orgName string, pagingOptions ...api.PagingOption) ( + *[]domain.Bucket, error, +) { + return b.api.FindBucketsByOrgName(ctx, orgName, pagingOptions...) +} + +func (b influxdbBucketAPI) FindBucketByName(ctx context.Context, bucketName string) (*domain.Bucket, error) { + return b.api.FindBucketByName(ctx, bucketName) +} + +func (b influxdbBucketAPI) FindBucketByID(ctx context.Context, bucketID string) (*domain.Bucket, error) { + return b.api.FindBucketByID(ctx, bucketID) +} + +func (b influxdbBucketAPI) CreateBucket(ctx context.Context, bucket *domain.Bucket) (*domain.Bucket, error) { + return b.api.CreateBucket(ctx, bucket) +} + +func (b influxdbBucketAPI) CreateBucketWithName( + ctx context.Context, org *domain.Organization, bucketName string, rules ...domain.RetentionRule, +) (*domain.Bucket, error) { + return b.api.CreateBucketWithName(ctx, org, bucketName, rules...) +} + +func (b influxdbBucketAPI) CreateBucketWithNameWithID( + ctx context.Context, orgID, bucketName string, rules ...domain.RetentionRule, +) (*domain.Bucket, error) { + return b.api.CreateBucketWithNameWithID(ctx, orgID, bucketName, rules...) +} + +func (b influxdbBucketAPI) UpdateBucket(ctx context.Context, bucket *domain.Bucket) (*domain.Bucket, error) { + return b.api.UpdateBucket(ctx, bucket) +} + +func (b influxdbBucketAPI) DeleteBucketWithID(ctx context.Context, bucketID string) error { + return b.api.DeleteBucketWithID(ctx, bucketID) +} diff --git a/pkg/gofr/datasource/influxdb/logger.go b/pkg/gofr/datasource/influxdb/logger.go new file mode 100644 index 000000000..a4dcf11e0 --- /dev/null +++ b/pkg/gofr/datasource/influxdb/logger.go @@ -0,0 +1,43 @@ +package influxdb + +import ( + "fmt" + "io" + "regexp" + "strings" +) + +type Logger interface { + Debug(args ...any) + Debugf(pattern string, args ...any) + Log(args ...any) + Logf(pattern string, args ...any) + Error(args ...any) + Errorf(pattern string, args ...any) +} + +type QueryLog struct { + Operation string `json:"operation"` + Query string `json:"query"` + Duration int64 `json:"duration"` + Keyspace string `json:"keyspace,omitempty"` +} + +func (ql *QueryLog) PrettyPrint(writer io.Writer) { + fmt.Fprintf(writer, "\u001B[38;5;8m%-32s \u001B[38;5;206m%-6s\u001B[0m %8d\u001B[38;5;8mµs\u001B[0m %s \u001B[38;5;8m%-32s\u001B[0m\n", + clean(ql.Operation), "INFL", ql.Duration, clean(ql.Keyspace), clean(ql.Query)) +} + +// clean takes a string query as input and performs two operations to clean it up: +// 1. It replaces multiple consecutive whitespace characters with a single space. +// 2. It trims leading and trailing whitespace from the string. +// The cleaned-up query string is then returned. +func clean(query string) string { + // Replace multiple consecutive whitespace characters with a single space + query = regexp.MustCompile(`\s+`).ReplaceAllString(query, " ") + + // Trim leading and trailing whitespace from the string + query = strings.TrimSpace(query) + + return query +} diff --git a/pkg/gofr/datasource/influxdb/metrics.go b/pkg/gofr/datasource/influxdb/metrics.go new file mode 100644 index 000000000..d33b94e7c --- /dev/null +++ b/pkg/gofr/datasource/influxdb/metrics.go @@ -0,0 +1,9 @@ +package influxdb + +import "context" + +// Metrics defines the interface for capturing metrics. +type Metrics interface { + NewHistogram(name, desc string, buckets ...float64) + RecordHistogram(ctx context.Context, name string, value float64, labels ...string) +} diff --git a/pkg/gofr/datasource/influxdb/metrics_logger.go b/pkg/gofr/datasource/influxdb/metrics_logger.go new file mode 100644 index 000000000..ac2c47adb --- /dev/null +++ b/pkg/gofr/datasource/influxdb/metrics_logger.go @@ -0,0 +1,75 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: ./metrics.go +// +// Generated by this command: +// +// mockgen -source=./metrics.go -destination=./metrics_logger.go -package=influxdb +// + +// Package influxdb is a generated GoMock package. +package influxdb + +import ( + context "context" + reflect "reflect" + + gomock "github.com/golang/mock/gomock" +) + +// MockMetrics is a mock of Metrics interface. +type MockMetrics struct { + ctrl *gomock.Controller + recorder *MockMetricsMockRecorder + isgomock struct{} +} + +// MockMetricsMockRecorder is the mock recorder for MockMetrics. +type MockMetricsMockRecorder struct { + mock *MockMetrics +} + +// NewMockMetrics creates a new mock instance. +func NewMockMetrics(ctrl *gomock.Controller) *MockMetrics { + mock := &MockMetrics{ctrl: ctrl} + mock.recorder = &MockMetricsMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockMetrics) EXPECT() *MockMetricsMockRecorder { + return m.recorder +} + +// NewHistogram mocks base method. +func (m *MockMetrics) NewHistogram(name, desc string, buckets ...float64) { + m.ctrl.T.Helper() + varargs := []any{name, desc} + for _, a := range buckets { + varargs = append(varargs, a) + } + m.ctrl.Call(m, "NewHistogram", varargs...) +} + +// NewHistogram indicates an expected call of NewHistogram. +func (mr *MockMetricsMockRecorder) NewHistogram(name, desc any, buckets ...any) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]any{name, desc}, buckets...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewHistogram", reflect.TypeOf((*MockMetrics)(nil).NewHistogram), varargs...) +} + +// RecordHistogram mocks base method. +func (m *MockMetrics) RecordHistogram(ctx context.Context, name string, value float64, labels ...string) { + m.ctrl.T.Helper() + varargs := []any{ctx, name, value} + for _, a := range labels { + varargs = append(varargs, a) + } + m.ctrl.Call(m, "RecordHistogram", varargs...) +} + +// RecordHistogram indicates an expected call of RecordHistogram. +func (mr *MockMetricsMockRecorder) RecordHistogram(ctx, name, value any, labels ...any) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]any{ctx, name, value}, labels...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RecordHistogram", reflect.TypeOf((*MockMetrics)(nil).RecordHistogram), varargs...) +} diff --git a/pkg/gofr/datasource/influxdb/mock_interface.go b/pkg/gofr/datasource/influxdb/mock_interface.go new file mode 100644 index 000000000..8f3d83a26 --- /dev/null +++ b/pkg/gofr/datasource/influxdb/mock_interface.go @@ -0,0 +1,528 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: interface.go + +// Package mock_influxdb is a generated GoMock package. +package influxdb + +import ( + context "context" + reflect "reflect" + + gomock "github.com/golang/mock/gomock" + influxdb "github.com/influxdata/influxdb-client-go/v2" + api "github.com/influxdata/influxdb-client-go/v2/api" + domain "github.com/influxdata/influxdb-client-go/v2/domain" +) + +// Mockclient is a mock of client interface. +type Mockclient struct { + ctrl *gomock.Controller + recorder *MockclientMockRecorder +} + +// MockclientMockRecorder is the mock recorder for Mockclient. +type MockclientMockRecorder struct { + mock *Mockclient +} + +// NewMockclient creates a new mock instance. +func NewMockclient(ctrl *gomock.Controller) *Mockclient { + mock := &Mockclient{ctrl: ctrl} + mock.recorder = &MockclientMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *Mockclient) EXPECT() *MockclientMockRecorder { + return m.recorder +} + +// AuthorizationsAPI mocks base method. +func (m *Mockclient) AuthorizationsAPI() api.AuthorizationsAPI { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AuthorizationsAPI") + ret0, _ := ret[0].(api.AuthorizationsAPI) + return ret0 +} + +// AuthorizationsAPI indicates an expected call of AuthorizationsAPI. +func (mr *MockclientMockRecorder) AuthorizationsAPI() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AuthorizationsAPI", reflect.TypeOf((*Mockclient)(nil).AuthorizationsAPI)) +} + +// BucketsAPI mocks base method. +func (m *Mockclient) BucketsAPI() api.BucketsAPI { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "BucketsAPI") + ret0, _ := ret[0].(api.BucketsAPI) + return ret0 +} + +// BucketsAPI indicates an expected call of BucketsAPI. +func (mr *MockclientMockRecorder) BucketsAPI() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "BucketsAPI", reflect.TypeOf((*Mockclient)(nil).BucketsAPI)) +} + +// DeleteAPI mocks base method. +func (m *Mockclient) DeleteAPI() api.DeleteAPI { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "DeleteAPI") + ret0, _ := ret[0].(api.DeleteAPI) + return ret0 +} + +// DeleteAPI indicates an expected call of DeleteAPI. +func (mr *MockclientMockRecorder) DeleteAPI() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteAPI", reflect.TypeOf((*Mockclient)(nil).DeleteAPI)) +} + +// Health mocks base method. +func (m *Mockclient) Health(ctx context.Context) (*domain.HealthCheck, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Health", ctx) + ret0, _ := ret[0].(*domain.HealthCheck) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Health indicates an expected call of Health. +func (mr *MockclientMockRecorder) Health(ctx interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Health", reflect.TypeOf((*Mockclient)(nil).Health), ctx) +} + +// Options mocks base method. +func (m *Mockclient) Options() *influxdb.Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Options") + ret0, _ := ret[0].(*influxdb.Options) + return ret0 +} + +// Options indicates an expected call of Options. +func (mr *MockclientMockRecorder) Options() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Options", reflect.TypeOf((*Mockclient)(nil).Options)) +} + +// OrganizationsAPI mocks base method. +func (m *Mockclient) OrganizationsAPI() api.OrganizationsAPI { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "OrganizationsAPI") + ret0, _ := ret[0].(api.OrganizationsAPI) + return ret0 +} + +// OrganizationsAPI indicates an expected call of OrganizationsAPI. +func (mr *MockclientMockRecorder) OrganizationsAPI() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "OrganizationsAPI", reflect.TypeOf((*Mockclient)(nil).OrganizationsAPI)) +} + +// Ping mocks base method. +func (m *Mockclient) Ping(ctx context.Context) (bool, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Ping", ctx) + ret0, _ := ret[0].(bool) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Ping indicates an expected call of Ping. +func (mr *MockclientMockRecorder) Ping(ctx interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Ping", reflect.TypeOf((*Mockclient)(nil).Ping), ctx) +} + +// QueryAPI mocks base method. +func (m *Mockclient) QueryAPI(org string) api.QueryAPI { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "QueryAPI", org) + ret0, _ := ret[0].(api.QueryAPI) + return ret0 +} + +// QueryAPI indicates an expected call of QueryAPI. +func (mr *MockclientMockRecorder) QueryAPI(org interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "QueryAPI", reflect.TypeOf((*Mockclient)(nil).QueryAPI), org) +} + +// Setup mocks base method. +func (m *Mockclient) Setup(ctx context.Context, username, password, org, bucket string, retentionPeriodHours int) (*domain.OnboardingResponse, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Setup", ctx, username, password, org, bucket, retentionPeriodHours) + ret0, _ := ret[0].(*domain.OnboardingResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Setup indicates an expected call of Setup. +func (mr *MockclientMockRecorder) Setup(ctx, username, password, org, bucket, retentionPeriodHours interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Setup", reflect.TypeOf((*Mockclient)(nil).Setup), ctx, username, password, org, bucket, retentionPeriodHours) +} + +// WriteAPIBlocking mocks base method. +func (m *Mockclient) WriteAPIBlocking(org, bucket string) api.WriteAPIBlocking { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WriteAPIBlocking", org, bucket) + ret0, _ := ret[0].(api.WriteAPIBlocking) + return ret0 +} + +// WriteAPIBlocking indicates an expected call of WriteAPIBlocking. +func (mr *MockclientMockRecorder) WriteAPIBlocking(org, bucket interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WriteAPIBlocking", reflect.TypeOf((*Mockclient)(nil).WriteAPIBlocking), org, bucket) +} + +// Mockorganization is a mock of organization interface. +type Mockorganization struct { + ctrl *gomock.Controller + recorder *MockorganizationMockRecorder +} + +// MockorganizationMockRecorder is the mock recorder for Mockorganization. +type MockorganizationMockRecorder struct { + mock *Mockorganization +} + +// NewMockorganization creates a new mock instance. +func NewMockorganization(ctrl *gomock.Controller) *Mockorganization { + mock := &Mockorganization{ctrl: ctrl} + mock.recorder = &MockorganizationMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *Mockorganization) EXPECT() *MockorganizationMockRecorder { + return m.recorder +} + +// CreateOrganizationWithName mocks base method. +func (m *Mockorganization) CreateOrganizationWithName(ctx context.Context, orgName string) (*domain.Organization, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CreateOrganizationWithName", ctx, orgName) + ret0, _ := ret[0].(*domain.Organization) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// CreateOrganizationWithName indicates an expected call of CreateOrganizationWithName. +func (mr *MockorganizationMockRecorder) CreateOrganizationWithName(ctx, orgName interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateOrganizationWithName", reflect.TypeOf((*Mockorganization)(nil).CreateOrganizationWithName), ctx, orgName) +} + +// DeleteOrganizationWithID mocks base method. +func (m *Mockorganization) DeleteOrganizationWithID(ctx context.Context, orgID string) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "DeleteOrganizationWithID", ctx, orgID) + ret0, _ := ret[0].(error) + return ret0 +} + +// DeleteOrganizationWithID indicates an expected call of DeleteOrganizationWithID. +func (mr *MockorganizationMockRecorder) DeleteOrganizationWithID(ctx, orgID interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteOrganizationWithID", reflect.TypeOf((*Mockorganization)(nil).DeleteOrganizationWithID), ctx, orgID) +} + +// FindOrganizationByName mocks base method. +func (m *Mockorganization) FindOrganizationByName(ctx context.Context, orgName string) (*domain.Organization, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FindOrganizationByName", ctx, orgName) + ret0, _ := ret[0].(*domain.Organization) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// FindOrganizationByName indicates an expected call of FindOrganizationByName. +func (mr *MockorganizationMockRecorder) FindOrganizationByName(ctx, orgName interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FindOrganizationByName", reflect.TypeOf((*Mockorganization)(nil).FindOrganizationByName), ctx, orgName) +} + +// GetOrganizations mocks base method. +func (m *Mockorganization) GetOrganizations(ctx context.Context, pagingOptions ...api.PagingOption) (*[]domain.Organization, error) { + m.ctrl.T.Helper() + varargs := []interface{}{ctx} + for _, a := range pagingOptions { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetOrganizations", varargs...) + ret0, _ := ret[0].(*[]domain.Organization) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetOrganizations indicates an expected call of GetOrganizations. +func (mr *MockorganizationMockRecorder) GetOrganizations(ctx interface{}, pagingOptions ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{ctx}, pagingOptions...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetOrganizations", reflect.TypeOf((*Mockorganization)(nil).GetOrganizations), varargs...) +} + +// Mockbucket is a mock of bucket interface. +type Mockbucket struct { + ctrl *gomock.Controller + recorder *MockbucketMockRecorder +} + +// MockbucketMockRecorder is the mock recorder for Mockbucket. +type MockbucketMockRecorder struct { + mock *Mockbucket +} + +// NewMockbucket creates a new mock instance. +func NewMockbucket(ctrl *gomock.Controller) *Mockbucket { + mock := &Mockbucket{ctrl: ctrl} + mock.recorder = &MockbucketMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *Mockbucket) EXPECT() *MockbucketMockRecorder { + return m.recorder +} + +// CreateBucket mocks base method. +func (m *Mockbucket) CreateBucket(ctx context.Context, bucket *domain.Bucket) (*domain.Bucket, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CreateBucket", ctx, bucket) + ret0, _ := ret[0].(*domain.Bucket) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// CreateBucket indicates an expected call of CreateBucket. +func (mr *MockbucketMockRecorder) CreateBucket(ctx, bucket interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateBucket", reflect.TypeOf((*Mockbucket)(nil).CreateBucket), ctx, bucket) +} + +// CreateBucketWithName mocks base method. +func (m *Mockbucket) CreateBucketWithName(ctx context.Context, org *domain.Organization, bucketName string, rules ...domain.RetentionRule) (*domain.Bucket, error) { + m.ctrl.T.Helper() + varargs := []interface{}{ctx, org, bucketName} + for _, a := range rules { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "CreateBucketWithName", varargs...) + ret0, _ := ret[0].(*domain.Bucket) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// CreateBucketWithName indicates an expected call of CreateBucketWithName. +func (mr *MockbucketMockRecorder) CreateBucketWithName(ctx, org, bucketName interface{}, rules ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{ctx, org, bucketName}, rules...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateBucketWithName", reflect.TypeOf((*Mockbucket)(nil).CreateBucketWithName), varargs...) +} + +// CreateBucketWithNameWithID mocks base method. +func (m *Mockbucket) CreateBucketWithNameWithID(ctx context.Context, orgID, bucketName string, rules ...domain.RetentionRule) (*domain.Bucket, error) { + m.ctrl.T.Helper() + varargs := []interface{}{ctx, orgID, bucketName} + for _, a := range rules { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "CreateBucketWithNameWithID", varargs...) + ret0, _ := ret[0].(*domain.Bucket) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// CreateBucketWithNameWithID indicates an expected call of CreateBucketWithNameWithID. +func (mr *MockbucketMockRecorder) CreateBucketWithNameWithID(ctx, orgID, bucketName interface{}, rules ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{ctx, orgID, bucketName}, rules...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateBucketWithNameWithID", reflect.TypeOf((*Mockbucket)(nil).CreateBucketWithNameWithID), varargs...) +} + +// DeleteBucketWithID mocks base method. +func (m *Mockbucket) DeleteBucketWithID(ctx context.Context, bucketID string) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "DeleteBucketWithID", ctx, bucketID) + ret0, _ := ret[0].(error) + return ret0 +} + +// DeleteBucketWithID indicates an expected call of DeleteBucketWithID. +func (mr *MockbucketMockRecorder) DeleteBucketWithID(ctx, bucketID interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteBucketWithID", reflect.TypeOf((*Mockbucket)(nil).DeleteBucketWithID), ctx, bucketID) +} + +// FindBucketByID mocks base method. +func (m *Mockbucket) FindBucketByID(ctx context.Context, bucketID string) (*domain.Bucket, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FindBucketByID", ctx, bucketID) + ret0, _ := ret[0].(*domain.Bucket) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// FindBucketByID indicates an expected call of FindBucketByID. +func (mr *MockbucketMockRecorder) FindBucketByID(ctx, bucketID interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FindBucketByID", reflect.TypeOf((*Mockbucket)(nil).FindBucketByID), ctx, bucketID) +} + +// FindBucketByName mocks base method. +func (m *Mockbucket) FindBucketByName(ctx context.Context, bucketName string) (*domain.Bucket, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FindBucketByName", ctx, bucketName) + ret0, _ := ret[0].(*domain.Bucket) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// FindBucketByName indicates an expected call of FindBucketByName. +func (mr *MockbucketMockRecorder) FindBucketByName(ctx, bucketName interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FindBucketByName", reflect.TypeOf((*Mockbucket)(nil).FindBucketByName), ctx, bucketName) +} + +// FindBucketsByOrgName mocks base method. +func (m *Mockbucket) FindBucketsByOrgName(ctx context.Context, orgName string, pagingOptions ...api.PagingOption) (*[]domain.Bucket, error) { + m.ctrl.T.Helper() + varargs := []interface{}{ctx, orgName} + for _, a := range pagingOptions { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "FindBucketsByOrgName", varargs...) + ret0, _ := ret[0].(*[]domain.Bucket) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// FindBucketsByOrgName indicates an expected call of FindBucketsByOrgName. +func (mr *MockbucketMockRecorder) FindBucketsByOrgName(ctx, orgName interface{}, pagingOptions ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{ctx, orgName}, pagingOptions...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FindBucketsByOrgName", reflect.TypeOf((*Mockbucket)(nil).FindBucketsByOrgName), varargs...) +} + +// GetBuckets mocks base method. +func (m *Mockbucket) GetBuckets(ctx context.Context, pagingOptions ...api.PagingOption) (*[]domain.Bucket, error) { + m.ctrl.T.Helper() + varargs := []interface{}{ctx} + for _, a := range pagingOptions { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetBuckets", varargs...) + ret0, _ := ret[0].(*[]domain.Bucket) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetBuckets indicates an expected call of GetBuckets. +func (mr *MockbucketMockRecorder) GetBuckets(ctx interface{}, pagingOptions ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{ctx}, pagingOptions...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetBuckets", reflect.TypeOf((*Mockbucket)(nil).GetBuckets), varargs...) +} + +// UpdateBucket mocks base method. +func (m *Mockbucket) UpdateBucket(ctx context.Context, bucket *domain.Bucket) (*domain.Bucket, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "UpdateBucket", ctx, bucket) + ret0, _ := ret[0].(*domain.Bucket) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// UpdateBucket indicates an expected call of UpdateBucket. +func (mr *MockbucketMockRecorder) UpdateBucket(ctx, bucket interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateBucket", reflect.TypeOf((*Mockbucket)(nil).UpdateBucket), ctx, bucket) +} + +// Mockquery is a mock of query interface. +type Mockquery struct { + ctrl *gomock.Controller + recorder *MockqueryMockRecorder +} + +// MockqueryMockRecorder is the mock recorder for Mockquery. +type MockqueryMockRecorder struct { + mock *Mockquery +} + +// NewMockquery creates a new mock instance. +func NewMockquery(ctrl *gomock.Controller) *Mockquery { + mock := &Mockquery{ctrl: ctrl} + mock.recorder = &MockqueryMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *Mockquery) EXPECT() *MockqueryMockRecorder { + return m.recorder +} + +// Query mocks base method. +func (m *Mockquery) Query(ctx context.Context, query string) (*api.QueryTableResult, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Query", ctx, query) + ret0, _ := ret[0].(*api.QueryTableResult) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Query indicates an expected call of Query. +func (mr *MockqueryMockRecorder) Query(ctx, query interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Query", reflect.TypeOf((*Mockquery)(nil).Query), ctx, query) +} + +// QueryRaw mocks base method. +func (m *Mockquery) QueryRaw(ctx context.Context, query string, dialect *domain.Dialect) (string, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "QueryRaw", ctx, query, dialect) + ret0, _ := ret[0].(string) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// QueryRaw indicates an expected call of QueryRaw. +func (mr *MockqueryMockRecorder) QueryRaw(ctx, query, dialect interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "QueryRaw", reflect.TypeOf((*Mockquery)(nil).QueryRaw), ctx, query, dialect) +} + +// QueryRawWithParams mocks base method. +func (m *Mockquery) QueryRawWithParams(ctx context.Context, query string, dialect *domain.Dialect, params any) (string, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "QueryRawWithParams", ctx, query, dialect, params) + ret0, _ := ret[0].(string) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// QueryRawWithParams indicates an expected call of QueryRawWithParams. +func (mr *MockqueryMockRecorder) QueryRawWithParams(ctx, query, dialect, params interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "QueryRawWithParams", reflect.TypeOf((*Mockquery)(nil).QueryRawWithParams), ctx, query, dialect, params) +} + +// QueryWithParams mocks base method. +func (m *Mockquery) QueryWithParams(ctx context.Context, query string, params any) (*api.QueryTableResult, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "QueryWithParams", ctx, query, params) + ret0, _ := ret[0].(*api.QueryTableResult) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// QueryWithParams indicates an expected call of QueryWithParams. +func (mr *MockqueryMockRecorder) QueryWithParams(ctx, query, params interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "QueryWithParams", reflect.TypeOf((*Mockquery)(nil).QueryWithParams), ctx, query, params) +} diff --git a/pkg/gofr/datasource/influxdb/mock_logger.go b/pkg/gofr/datasource/influxdb/mock_logger.go new file mode 100644 index 000000000..74ead6f59 --- /dev/null +++ b/pkg/gofr/datasource/influxdb/mock_logger.go @@ -0,0 +1,139 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: ./logger.go +// +// Generated by this command: +// +// mockgen -source=./logger.go -destination=./mock_logger.go -package=influxdb +// + +// Package influxdb is a generated GoMock package. +package influxdb + +import ( + reflect "reflect" + + gomock "github.com/golang/mock/gomock" +) + +// MockLogger is a mock of Logger interface. +type MockLogger struct { + ctrl *gomock.Controller + recorder *MockLoggerMockRecorder + isgomock struct{} +} + +// MockLoggerMockRecorder is the mock recorder for MockLogger. +type MockLoggerMockRecorder struct { + mock *MockLogger +} + +// NewMockLogger creates a new mock instance. +func NewMockLogger(ctrl *gomock.Controller) *MockLogger { + mock := &MockLogger{ctrl: ctrl} + mock.recorder = &MockLoggerMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockLogger) EXPECT() *MockLoggerMockRecorder { + return m.recorder +} + +// Debug mocks base method. +func (m *MockLogger) Debug(args ...any) { + m.ctrl.T.Helper() + varargs := []any{} + for _, a := range args { + varargs = append(varargs, a) + } + m.ctrl.Call(m, "Debug", varargs...) +} + +// Debug indicates an expected call of Debug. +func (mr *MockLoggerMockRecorder) Debug(args ...any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Debug", reflect.TypeOf((*MockLogger)(nil).Debug), args...) +} + +// Debugf mocks base method. +func (m *MockLogger) Debugf(pattern string, args ...any) { + m.ctrl.T.Helper() + varargs := []any{pattern} + for _, a := range args { + varargs = append(varargs, a) + } + m.ctrl.Call(m, "Debugf", varargs...) +} + +// Debugf indicates an expected call of Debugf. +func (mr *MockLoggerMockRecorder) Debugf(pattern any, args ...any) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]any{pattern}, args...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Debugf", reflect.TypeOf((*MockLogger)(nil).Debugf), varargs...) +} + +// Error mocks base method. +func (m *MockLogger) Error(args ...any) { + m.ctrl.T.Helper() + varargs := []any{} + for _, a := range args { + varargs = append(varargs, a) + } + m.ctrl.Call(m, "Error", varargs...) +} + +// Error indicates an expected call of Error. +func (mr *MockLoggerMockRecorder) Error(args ...any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Error", reflect.TypeOf((*MockLogger)(nil).Error), args...) +} + +// Errorf mocks base method. +func (m *MockLogger) Errorf(pattern string, args ...any) { + m.ctrl.T.Helper() + varargs := []any{pattern} + for _, a := range args { + varargs = append(varargs, a) + } + m.ctrl.Call(m, "Errorf", varargs...) +} + +// Errorf indicates an expected call of Errorf. +func (mr *MockLoggerMockRecorder) Errorf(pattern any, args ...any) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]any{pattern}, args...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Errorf", reflect.TypeOf((*MockLogger)(nil).Errorf), varargs...) +} + +// Log mocks base method. +func (m *MockLogger) Log(args ...any) { + m.ctrl.T.Helper() + varargs := []any{} + for _, a := range args { + varargs = append(varargs, a) + } + m.ctrl.Call(m, "Log", varargs...) +} + +// Log indicates an expected call of Log. +func (mr *MockLoggerMockRecorder) Log(args ...any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Log", reflect.TypeOf((*MockLogger)(nil).Log), args...) +} + +// Logf mocks base method. +func (m *MockLogger) Logf(pattern string, args ...any) { + m.ctrl.T.Helper() + varargs := []any{pattern} + for _, a := range args { + varargs = append(varargs, a) + } + m.ctrl.Call(m, "Logf", varargs...) +} + +// Logf indicates an expected call of Logf. +func (mr *MockLoggerMockRecorder) Logf(pattern any, args ...any) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]any{pattern}, args...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Logf", reflect.TypeOf((*MockLogger)(nil).Logf), varargs...) +} diff --git a/pkg/gofr/external_db.go b/pkg/gofr/external_db.go index 3effa9347..8a6a25981 100644 --- a/pkg/gofr/external_db.go +++ b/pkg/gofr/external_db.go @@ -220,3 +220,14 @@ func (a *App) AddCouchbase(db container.CouchbaseProvider) { a.container.Couchbase = db } + +func (a *App) AddInfluxDB(db container.InfluxDBProvider) { + db.UseLogger(a.Logger()) + db.UseMetrics(a.Metrics()) + + tracer := otel.GetTracerProvider().Tracer("gofr-influxdb") + db.UseTracer(tracer) + db.Connect() + + a.container.InfluxDB = db +} diff --git a/pkg/gofr/external_db_test.go b/pkg/gofr/external_db_test.go index 3de58d662..38b7b9caf 100644 --- a/pkg/gofr/external_db_test.go +++ b/pkg/gofr/external_db_test.go @@ -205,6 +205,7 @@ func TestApp_AddOpenTSDB(t *testing.T) { assert.Equal(t, mock, app.container.OpenTSDB) }) } + func TestApp_AddScyllaDB(t *testing.T) { t.Run("Adding ScyllaDB", func(t *testing.T) { testutil.NewServerConfigs(t)