Skip to content

Commit 561109f

Browse files
authored
Integrating Grafana Linter into GDG (#261)
* Integrating Grafana Linter into GDG Fixes #251 * Updating organization_id references * Minor usability tweaks to CLI
1 parent c6ad7db commit 561109f

File tree

17 files changed

+1343
-117
lines changed

17 files changed

+1343
-117
lines changed

cli/backup/organizations.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ func newOrganizationsDownloadCmd() simplecobra.Commander {
109109

110110
}
111111
func newOrganizationsUploadCmd() simplecobra.Commander {
112-
description := "upload Orgs to grafana"
112+
description := "upload Organizations to grafana"
113113
return &support.SimpleCommand{
114114
NameP: "upload",
115115
Short: description,

cli/tools/dashboards.go

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package tools
2+
3+
import (
4+
"context"
5+
"github.com/bep/simplecobra"
6+
"github.com/esnet/gdg/cli/support"
7+
"github.com/esnet/gdg/internal/service"
8+
"github.com/spf13/cobra"
9+
"log/slog"
10+
)
11+
12+
var lintStrictFlag bool
13+
var lintVerboseFlag bool
14+
var lintAutofixFlag bool
15+
16+
func newDashboardCmd() simplecobra.Commander {
17+
return &support.SimpleCommand{
18+
NameP: "dashboards",
19+
Short: "Utility for Grafana Dashboards",
20+
Long: "Utility for Grafana Dashboards",
21+
CommandsList: []simplecobra.Commander{newDashboardLintCmd()},
22+
WithCFunc: func(cmd *cobra.Command, r *support.RootCommand) {
23+
cmd.Aliases = []string{"dash", "dashboard"}
24+
},
25+
RunFunc: func(ctx context.Context, cd *simplecobra.Commandeer, rootCmd *support.RootCommand, args []string) error {
26+
return cd.CobraCommand.Help()
27+
},
28+
}
29+
}
30+
31+
func newDashboardLintCmd() simplecobra.Commander {
32+
return &support.SimpleCommand{
33+
NameP: "lint",
34+
Short: "lint all or single dashboard",
35+
Long: "lint all or a single dashboard",
36+
WithCFunc: func(cmd *cobra.Command, r *support.RootCommand) {
37+
dashboard := cmd
38+
dashboard.PersistentFlags().BoolVarP(&lintStrictFlag, "strict", "", false, "Strict Linting")
39+
dashboard.PersistentFlags().BoolVarP(&lintVerboseFlag, "verbose", "", false, "Verbose Linting")
40+
dashboard.PersistentFlags().BoolVarP(&lintAutofixFlag, "autofix", "", false, "AutoFix Linting (Beta)")
41+
dashboard.PersistentFlags().StringP("dashboard", "d", "", "filter by dashboard slug")
42+
dashboard.PersistentFlags().StringP("folder", "f", "", "filter by folderName")
43+
},
44+
RunFunc: func(ctx context.Context, cd *simplecobra.Commandeer, rootCmd *support.RootCommand, args []string) error {
45+
slog.Info("This is mainly provided as a convenience GDG, if you find yourself relying on this tool heavily, please have a look at: github.com/grafana/dashboard-linter/")
46+
dashboard, _ := cd.CobraCommand.Flags().GetString("dashboard")
47+
folder, _ := cd.CobraCommand.Flags().GetString("folder")
48+
filterReq := service.LintRequest{
49+
StrictFlag: lintStrictFlag,
50+
VerboseFlag: lintVerboseFlag,
51+
AutoFix: lintAutofixFlag,
52+
DashboardSlug: dashboard,
53+
FolderName: folder,
54+
}
55+
rootCmd.GrafanaSvc().LintDashboards(filterReq)
56+
return nil
57+
},
58+
}
59+
}

cli/tools/organizations.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ func newGetTokenOrgCmd() simplecobra.Commander {
128128
}
129129

130130
func newListUsers() simplecobra.Commander {
131-
description := "list an Organization users"
131+
description := "listUsers <orgId> list an Organization users"
132132
return &support.SimpleCommand{
133133
NameP: "listUsers",
134134
Short: description,
@@ -216,7 +216,7 @@ func newAddUserRoleCmd() simplecobra.Commander {
216216
}
217217

218218
func newDeleteUserRoleCmd() simplecobra.Commander {
219-
description := "deleteUser removes a user from the given Organization (This will NOT delete the actual user from Grafana)"
219+
description := "deleteUser <orgId> <userId> removes a user from the given Organization (This will NOT delete the actual user from Grafana)"
220220
return &support.SimpleCommand{
221221
NameP: "deleteUser",
222222
Short: description,
@@ -227,6 +227,7 @@ func newDeleteUserRoleCmd() simplecobra.Commander {
227227
}
228228
orgSlug := args[0]
229229
userId, err := strconv.ParseInt(args[1], 10, 64)
230+
230231
if err != nil {
231232
log.Fatal("unable to parse userId to numeric value")
232233
}

cli/tools/tools.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ func NewToolsCommand() simplecobra.Commander {
1313
NameP: "tools",
1414
Short: description,
1515
Long: description,
16-
CommandsList: []simplecobra.Commander{newContextCmd(), newDevelCmd(), newUserCommand(), newAuthCmd(), newOrgCommand()},
16+
CommandsList: []simplecobra.Commander{newContextCmd(), newDevelCmd(), newUserCommand(), newAuthCmd(), newOrgCommand(), newDashboardCmd()},
1717
WithCFunc: func(cmd *cobra.Command, r *support.RootCommand) {
1818
cmd.Aliases = []string{"t"}
1919
},

go.mod

Lines changed: 52 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,13 @@ go 1.22.1
55
require (
66
github.com/AlecAivazis/survey/v2 v2.3.7
77
github.com/Masterminds/sprig/v3 v3.2.3
8-
github.com/aws/aws-sdk-go v1.49.13
8+
github.com/aws/aws-sdk-go v1.50.0
99
github.com/bep/simplecobra v0.4.0
1010
github.com/carlmjohnson/requests v0.23.5
1111
github.com/go-openapi/strfmt v0.22.0
12-
github.com/google/uuid v1.5.0
12+
github.com/google/uuid v1.6.0
1313
github.com/gosimple/slug v1.13.1
14+
github.com/grafana/dashboard-linter v0.0.0-20231114210226-c458893a5731
1415
github.com/grafana/grafana-openapi-client-go v0.0.0-20231219151618-11c46332acad
1516
github.com/jedib0t/go-pretty/v6 v6.4.9
1617
github.com/lmittmann/tint v1.0.3
@@ -25,26 +26,28 @@ require (
2526
github.com/thoas/go-funk v0.9.3
2627
github.com/tidwall/gjson v1.17.0
2728
github.com/tidwall/pretty v1.2.1
29+
github.com/zeitlinger/conflate v0.0.0-20230622100834-279724abda8c
2830
gocloud.dev v0.36.0
29-
golang.org/x/exp v0.0.0-20231226003508-02704c960a9b
31+
golang.org/x/exp v0.0.0-20240222234643-814bf88cf225
3032
gopkg.in/yaml.v3 v3.0.1
3133
)
3234

3335
require (
34-
cloud.google.com/go v0.111.0 // indirect
35-
cloud.google.com/go/compute v1.23.3 // indirect
36+
cloud.google.com/go v0.112.0 // indirect
37+
cloud.google.com/go/compute v1.24.0 // indirect
3638
cloud.google.com/go/compute/metadata v0.2.3 // indirect
37-
cloud.google.com/go/iam v1.1.5 // indirect
38-
cloud.google.com/go/storage v1.36.0 // indirect
39+
cloud.google.com/go/iam v1.1.6 // indirect
40+
cloud.google.com/go/storage v1.38.0 // indirect
3941
dario.cat/mergo v1.0.0 // indirect
4042
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.9.1 // indirect
41-
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.4.0 // indirect
43+
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.1 // indirect
4244
github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.1 // indirect
4345
github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.2.1 // indirect
4446
github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect
4547
github.com/Azure/go-autorest v14.2.0+incompatible // indirect
4648
github.com/Azure/go-autorest/autorest/to v0.4.0 // indirect
47-
github.com/AzureAD/microsoft-authentication-library-for-go v1.2.0 // indirect
49+
github.com/AzureAD/microsoft-authentication-library-for-go v1.2.1 // indirect
50+
github.com/BurntSushi/toml v0.3.1 // indirect
4851
github.com/Masterminds/goutils v1.1.1 // indirect
4952
github.com/Masterminds/semver/v3 v3.2.1 // indirect
5053
github.com/Microsoft/go-winio v0.6.1 // indirect
@@ -69,18 +72,23 @@ require (
6972
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.5 // indirect
7073
github.com/aws/aws-sdk-go-v2/service/sts v1.26.6 // indirect
7174
github.com/aws/smithy-go v1.19.0 // indirect
75+
github.com/beorn7/perks v1.0.1 // indirect
7276
github.com/cenkalti/backoff/v4 v4.2.1 // indirect
77+
github.com/cespare/xxhash/v2 v2.2.0 // indirect
7378
github.com/containerd/containerd v1.7.11 // indirect
7479
github.com/containerd/log v0.1.0 // indirect
7580
github.com/cpuguy83/dockercfg v0.3.1 // indirect
7681
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
82+
github.com/dennwc/varint v1.0.0 // indirect
7783
github.com/distribution/reference v0.5.0 // indirect
78-
github.com/docker/distribution v2.8.3+incompatible // indirect
79-
github.com/docker/docker v24.0.7+incompatible // indirect
84+
github.com/docker/docker v25.0.0+incompatible // indirect
8085
github.com/docker/go-connections v0.4.0 // indirect
8186
github.com/docker/go-units v0.5.0 // indirect
8287
github.com/felixge/httpsnoop v1.0.4 // indirect
8388
github.com/fsnotify/fsnotify v1.7.0 // indirect
89+
github.com/ghodss/yaml v1.0.0 // indirect
90+
github.com/go-kit/log v0.2.1 // indirect
91+
github.com/go-logfmt/logfmt v0.6.0 // indirect
8492
github.com/go-logr/logr v1.4.1 // indirect
8593
github.com/go-logr/stdr v1.2.2 // indirect
8694
github.com/go-ole/go-ole v1.3.0 // indirect
@@ -100,11 +108,12 @@ require (
100108
github.com/google/s2a-go v0.1.7 // indirect
101109
github.com/google/wire v0.5.0 // indirect
102110
github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect
103-
github.com/googleapis/gax-go/v2 v2.12.0 // indirect
111+
github.com/googleapis/gax-go/v2 v2.12.1 // indirect
104112
github.com/gosimple/unidecode v1.0.1 // indirect
113+
github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd // indirect
105114
github.com/hashicorp/hcl v1.0.0 // indirect
106115
github.com/huandu/xstrings v1.4.0 // indirect
107-
github.com/imdario/mergo v0.3.13 // indirect
116+
github.com/imdario/mergo v0.3.16 // indirect
108117
github.com/inconshreveable/mousetrap v1.1.0 // indirect
109118
github.com/jmespath/go-jmespath v0.4.0 // indirect
110119
github.com/josharian/intern v1.0.0 // indirect
@@ -122,18 +131,23 @@ require (
122131
github.com/mitchellh/reflectwalk v1.0.2 // indirect
123132
github.com/moby/patternmatcher v0.6.0 // indirect
124133
github.com/moby/sys/sequential v0.5.0 // indirect
134+
github.com/moby/sys/user v0.1.0 // indirect
125135
github.com/moby/term v0.5.0 // indirect
126136
github.com/morikuni/aec v1.0.0 // indirect
127137
github.com/oklog/ulid v1.3.1 // indirect
128138
github.com/opencontainers/go-digest v1.0.0 // indirect
129139
github.com/opencontainers/image-spec v1.1.0-rc5 // indirect
130-
github.com/opencontainers/runc v1.1.12 // indirect
131140
github.com/opentracing/opentracing-go v1.2.0 // indirect
132141
github.com/pelletier/go-toml/v2 v2.1.1 // indirect
133-
github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 // indirect
142+
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect
134143
github.com/pkg/errors v0.9.1 // indirect
135144
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
136145
github.com/power-devops/perfstat v0.0.0-20221212215047-62379fc7944b // indirect
146+
github.com/prometheus/client_golang v1.18.0 // indirect
147+
github.com/prometheus/client_model v0.6.0 // indirect
148+
github.com/prometheus/common v0.48.0 // indirect
149+
github.com/prometheus/procfs v0.12.0 // indirect
150+
github.com/prometheus/prometheus v0.50.0 // indirect
137151
github.com/rivo/uniseg v0.4.4 // indirect
138152
github.com/sagikazarmark/locafero v0.4.0 // indirect
139153
github.com/sagikazarmark/slog-shim v0.1.0 // indirect
@@ -149,32 +163,37 @@ require (
149163
github.com/tidwall/match v1.1.1 // indirect
150164
github.com/tklauser/go-sysconf v0.3.13 // indirect
151165
github.com/tklauser/numcpus v0.7.0 // indirect
166+
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect
167+
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect
168+
github.com/xeipuuv/gojsonschema v1.2.0 // indirect
152169
github.com/yusufpapurcu/wmi v1.2.3 // indirect
153170
go.mongodb.org/mongo-driver v1.13.1 // indirect
154171
go.opencensus.io v0.24.0 // indirect
155-
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1 // indirect
156-
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1 // indirect
157-
go.opentelemetry.io/otel v1.21.0 // indirect
158-
go.opentelemetry.io/otel/metric v1.21.0 // indirect
159-
go.opentelemetry.io/otel/trace v1.21.0 // indirect
172+
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 // indirect
173+
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 // indirect
174+
go.opentelemetry.io/otel v1.24.0 // indirect
175+
go.opentelemetry.io/otel/metric v1.24.0 // indirect
176+
go.opentelemetry.io/otel/trace v1.24.0 // indirect
177+
go.uber.org/atomic v1.11.0 // indirect
160178
go.uber.org/multierr v1.11.0 // indirect
161-
golang.org/x/crypto v0.17.0 // indirect
162-
golang.org/x/mod v0.14.0 // indirect
163-
golang.org/x/net v0.19.0 // indirect
164-
golang.org/x/oauth2 v0.15.0 // indirect
165-
golang.org/x/sync v0.5.0 // indirect
166-
golang.org/x/sys v0.15.0 // indirect
167-
golang.org/x/term v0.15.0 // indirect
179+
golang.org/x/crypto v0.19.0 // indirect
180+
golang.org/x/mod v0.15.0 // indirect
181+
golang.org/x/net v0.21.0 // indirect
182+
golang.org/x/oauth2 v0.17.0 // indirect
183+
golang.org/x/sync v0.6.0 // indirect
184+
golang.org/x/sys v0.17.0 // indirect
185+
golang.org/x/term v0.17.0 // indirect
168186
golang.org/x/text v0.14.0 // indirect
169187
golang.org/x/time v0.5.0 // indirect
170-
golang.org/x/tools v0.16.1 // indirect
188+
golang.org/x/tools v0.18.0 // indirect
171189
golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect
172-
google.golang.org/api v0.154.0 // indirect
190+
google.golang.org/api v0.167.0 // indirect
173191
google.golang.org/appengine v1.6.8 // indirect
174-
google.golang.org/genproto v0.0.0-20231212172506-995d672761c0 // indirect
175-
google.golang.org/genproto/googleapis/api v0.0.0-20231212172506-995d672761c0 // indirect
176-
google.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 // indirect
177-
google.golang.org/grpc v1.60.1 // indirect
192+
google.golang.org/genproto v0.0.0-20240221002015-b0ce06bbee7c // indirect
193+
google.golang.org/genproto/googleapis/api v0.0.0-20240221002015-b0ce06bbee7c // indirect
194+
google.golang.org/genproto/googleapis/rpc v0.0.0-20240221002015-b0ce06bbee7c // indirect
195+
google.golang.org/grpc v1.62.0 // indirect
178196
google.golang.org/protobuf v1.33.0 // indirect
179197
gopkg.in/ini.v1 v1.67.0 // indirect
198+
gopkg.in/yaml.v2 v2.4.0 // indirect
180199
)

0 commit comments

Comments
 (0)