Skip to content
This repository was archived by the owner on Jan 15, 2024. It is now read-only.

Commit b041ab2

Browse files
author
Aaron Godin
authored
Merge pull request #167 from grafana/feat/resource-permissions-methods
RBAC assignment methods
2 parents 6d42666 + fdea1ff commit b041ab2

22 files changed

+448
-66
lines changed

.drone/drone.jsonnet

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
local image = 'grafana/build-container:1.2.27';
1+
local image = 'grafana/build-container:1.7.7';
22

33
local pipeline(name, trigger) = {
44
kind: 'pipeline',

.drone/drone.yml

+2-2
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ platform:
99

1010
steps:
1111
- name: test
12-
image: grafana/build-container:1.2.27
12+
image: grafana/build-container:1.7.7
1313
commands:
1414
- make test
1515

@@ -28,7 +28,7 @@ platform:
2828

2929
steps:
3030
- name: test
31-
image: grafana/build-container:1.2.27
31+
image: grafana/build-container:1.7.7
3232
commands:
3333
- make test
3434

.golangci.toml

+2-5
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
[run]
22
timeout = "10m"
33

4-
[linters-settings.golint]
5-
min-confidence = 3
6-
74
[linters-settings.goconst]
85
min-len = 5
96
min-occurrences = 5
@@ -13,14 +10,13 @@ disable-all = true
1310
enable = [
1411
"bodyclose",
1512
"deadcode",
16-
"depguard",
1713
"dogsled",
1814
"errcheck",
1915
"gochecknoinits",
2016
"goconst",
2117
"gocritic",
2218
"goimports",
23-
"golint",
19+
"revive",
2420
"goprintffuncname",
2521
"gosec",
2622
"gosimple",
@@ -81,3 +77,4 @@ text = "404"
8177
[[issues.exclude-rules]]
8278
linters = ["misspell"]
8379
text = "Unknwon` is a misspelling of `Unknown"
80+

Makefile

+1-2
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ drone:
77

88
test:
99
go version
10-
golangci-lint --version
11-
golangci-lint run ./...
10+
go run github.com/golangci/golangci-lint/cmd/[email protected] run ./...
1211
go test -cover -race -vet all -mod readonly ./...
1312

api_key_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ const (
2222
"role": "Admin",
2323
"expiration": "2021-10-30T10:52:03+03:00"
2424
}
25-
]` //#nosec
25+
]` //#nosec
2626
)
2727

2828
func TestCreateAPIKey(t *testing.T) {

client.go

+1-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import (
55
"encoding/json"
66
"fmt"
77
"io"
8-
"io/ioutil"
98
"log"
109
"net/http"
1110
"net/url"
@@ -112,7 +111,7 @@ func (c *Client) request(method, requestPath string, query url.Values, body []by
112111
}
113112

114113
// read the body (even on non-successful HTTP status codes), as that's what the unit tests expect
115-
bodyContents, err = ioutil.ReadAll(resp.Body)
114+
bodyContents, err = io.ReadAll(resp.Body)
116115
resp.Body.Close() //nolint:errcheck
117116

118117
// if there was an error reading the body, try again

client_test.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import (
44
"bytes"
55
"encoding/json"
66
"errors"
7-
"io/ioutil"
7+
"io"
88
"net/http"
99
"net/http/httptest"
1010
"net/url"
@@ -195,7 +195,7 @@ func TestClient_requestWithRetries(t *testing.T) {
195195

196196
try++
197197

198-
got, err := ioutil.ReadAll(r.Body)
198+
got, err := io.ReadAll(r.Body)
199199
if err != nil {
200200
t.Errorf("retry %d: unexpected error reading body: %v", try, err)
201201
}

cloud_plugin.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ package gapi
33
import (
44
"encoding/json"
55
"fmt"
6-
"io/ioutil"
6+
"io"
77
"net/http"
88
)
99

@@ -74,7 +74,7 @@ func (c *Client) IsCloudPluginInstalled(stackSlug string, pluginSlug string) (bo
7474
if resp.StatusCode == http.StatusNotFound {
7575
return false, nil
7676
}
77-
bodyContents, err := ioutil.ReadAll(resp.Body)
77+
bodyContents, err := io.ReadAll(resp.Body)
7878
if err != nil {
7979
return false, err
8080
}

dashboard_permissions.go

+53
Original file line numberDiff line numberDiff line change
@@ -58,3 +58,56 @@ func (c *Client) UpdateDashboardPermissionsByUID(uid string, items *PermissionIt
5858

5959
return c.request("POST", path, nil, data, nil)
6060
}
61+
62+
func (c *Client) ListDashboardResourcePermissions(uid string) ([]*ResourcePermission, error) {
63+
return c.listResourcePermissions(DashboardsResource, ResourceUID(uid))
64+
}
65+
66+
func (c *Client) SetDashboardResourcePermissions(uid string, body SetResourcePermissionsBody) (*SetResourcePermissionsResponse, error) {
67+
return c.setResourcePermissions(DashboardsResource, ResourceUID(uid), body)
68+
}
69+
70+
func (c *Client) SetUserDashboardResourcePermissions(dashboardUID string, userID int64, permission string) (*SetResourcePermissionsResponse, error) {
71+
return c.setResourcePermissionByAssignment(
72+
DashboardsResource,
73+
ResourceUID(dashboardUID),
74+
UsersResource,
75+
ResourceID(userID),
76+
SetResourcePermissionBody{
77+
Permission: SetResourcePermissionItem{
78+
UserID: userID,
79+
Permission: permission,
80+
},
81+
},
82+
)
83+
}
84+
85+
func (c *Client) SetTeamDashboardResourcePermissions(dashboardUID string, teamID int64, permission string) (*SetResourcePermissionsResponse, error) {
86+
return c.setResourcePermissionByAssignment(
87+
DashboardsResource,
88+
ResourceUID(dashboardUID),
89+
TeamsResource,
90+
ResourceID(teamID),
91+
SetResourcePermissionBody{
92+
Permission: SetResourcePermissionItem{
93+
TeamID: teamID,
94+
Permission: permission,
95+
},
96+
},
97+
)
98+
}
99+
100+
func (c *Client) SetBuiltInRoleDashboardResourcePermissions(dashboardUID string, builtInRole string, permission string) (*SetResourcePermissionsResponse, error) {
101+
return c.setResourcePermissionByAssignment(
102+
DashboardsResource,
103+
ResourceUID(dashboardUID),
104+
BuiltInRolesResource,
105+
ResourceUID(builtInRole),
106+
SetResourcePermissionBody{
107+
Permission: SetResourcePermissionItem{
108+
BuiltinRole: builtInRole,
109+
Permission: permission,
110+
},
111+
},
112+
)
113+
}

datasource.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ func JSONDataWithHeaders(jsonData, secureJSONData map[string]interface{}, header
173173
for name, value := range headers {
174174
jsonData[fmt.Sprintf("httpHeaderName%d", idx)] = name
175175
secureJSONData[fmt.Sprintf("httpHeaderValue%d", idx)] = value
176-
idx += 1
176+
idx++
177177
}
178178

179179
return jsonData, secureJSONData

datasource_permissions.go

+53
Original file line numberDiff line numberDiff line change
@@ -96,3 +96,56 @@ func (c *Client) RemoveDatasourcePermission(id, permissionID int64) error {
9696

9797
return nil
9898
}
99+
100+
func (c *Client) ListDatasourceResourcePermissions(uid string) ([]*ResourcePermission, error) {
101+
return c.listResourcePermissions(DatasourcesResource, ResourceUID(uid))
102+
}
103+
104+
func (c *Client) SetDatasourceResourcePermissions(uid string, body SetResourcePermissionsBody) (*SetResourcePermissionsResponse, error) {
105+
return c.setResourcePermissions(DatasourcesResource, ResourceUID(uid), body)
106+
}
107+
108+
func (c *Client) SetUserDatasourceResourcePermissions(datasourceUID string, userID int64, permission string) (*SetResourcePermissionsResponse, error) {
109+
return c.setResourcePermissionByAssignment(
110+
DatasourcesResource,
111+
ResourceUID(datasourceUID),
112+
UsersResource,
113+
ResourceID(userID),
114+
SetResourcePermissionBody{
115+
Permission: SetResourcePermissionItem{
116+
UserID: userID,
117+
Permission: permission,
118+
},
119+
},
120+
)
121+
}
122+
123+
func (c *Client) SetTeamDatasourceResourcePermissions(datasourceUID string, teamID int64, permission string) (*SetResourcePermissionsResponse, error) {
124+
return c.setResourcePermissionByAssignment(
125+
DatasourcesResource,
126+
ResourceUID(datasourceUID),
127+
TeamsResource,
128+
ResourceID(teamID),
129+
SetResourcePermissionBody{
130+
Permission: SetResourcePermissionItem{
131+
TeamID: teamID,
132+
Permission: permission,
133+
},
134+
},
135+
)
136+
}
137+
138+
func (c *Client) SetBuiltInRoleDatasourceResourcePermissions(datasourceUID string, builtInRole string, permission string) (*SetResourcePermissionsResponse, error) {
139+
return c.setResourcePermissionByAssignment(
140+
DatasourcesResource,
141+
ResourceUID(datasourceUID),
142+
BuiltInRolesResource,
143+
ResourceUID(builtInRole),
144+
SetResourcePermissionBody{
145+
Permission: SetResourcePermissionItem{
146+
BuiltinRole: builtInRole,
147+
Permission: permission,
148+
},
149+
},
150+
)
151+
}

folder_permissions.go

+53
Original file line numberDiff line numberDiff line change
@@ -62,3 +62,56 @@ func (c *Client) UpdateFolderPermissions(fid string, items *PermissionItems) err
6262

6363
return c.request("POST", path, nil, data, nil)
6464
}
65+
66+
func (c *Client) ListFolderResourcePermissions(uid string) ([]*ResourcePermission, error) {
67+
return c.listResourcePermissions(FoldersResource, ResourceUID(uid))
68+
}
69+
70+
func (c *Client) SetFolderResourcePermissions(uid string, body SetResourcePermissionsBody) (*SetResourcePermissionsResponse, error) {
71+
return c.setResourcePermissions(FoldersResource, ResourceUID(uid), body)
72+
}
73+
74+
func (c *Client) SetUserFolderResourcePermissions(folderUID string, userID int64, permission string) (*SetResourcePermissionsResponse, error) {
75+
return c.setResourcePermissionByAssignment(
76+
FoldersResource,
77+
ResourceUID(folderUID),
78+
UsersResource,
79+
ResourceID(userID),
80+
SetResourcePermissionBody{
81+
Permission: SetResourcePermissionItem{
82+
UserID: userID,
83+
Permission: permission,
84+
},
85+
},
86+
)
87+
}
88+
89+
func (c *Client) SetTeamFolderResourcePermissions(folderUID string, teamID int64, permission string) (*SetResourcePermissionsResponse, error) {
90+
return c.setResourcePermissionByAssignment(
91+
FoldersResource,
92+
ResourceUID(folderUID),
93+
TeamsResource,
94+
ResourceID(teamID),
95+
SetResourcePermissionBody{
96+
Permission: SetResourcePermissionItem{
97+
TeamID: teamID,
98+
Permission: permission,
99+
},
100+
},
101+
)
102+
}
103+
104+
func (c *Client) SetBuiltInRoleFolderResourcePermissions(folderUID string, builtInRole string, permission string) (*SetResourcePermissionsResponse, error) {
105+
return c.setResourcePermissionByAssignment(
106+
FoldersResource,
107+
ResourceUID(folderUID),
108+
BuiltInRolesResource,
109+
ResourceUID(builtInRole),
110+
SetResourcePermissionBody{
111+
Permission: SetResourcePermissionItem{
112+
BuiltinRole: builtInRole,
113+
Permission: permission,
114+
},
115+
},
116+
)
117+
}

go.mod

+8-1
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,15 @@
11
module github.com/grafana/grafana-api-golang-client
22

3-
go 1.14
3+
go 1.21
44

55
require (
66
github.com/gobs/pretty v0.0.0-20180724170744-09732c25a95b
77
github.com/hashicorp/go-cleanhttp v0.5.2
8+
github.com/stretchr/testify v1.8.4
9+
)
10+
11+
require (
12+
github.com/davecgh/go-spew v1.1.1 // indirect
13+
github.com/pmezard/go-difflib v1.0.0 // indirect
14+
gopkg.in/yaml.v3 v3.0.1 // indirect
815
)

go.sum

+10
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,14 @@
1+
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
2+
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
13
github.com/gobs/pretty v0.0.0-20180724170744-09732c25a95b h1:/vQ+oYKu+JoyaMPDsv5FzwuL2wwWBgBbtj/YLCi4LuA=
24
github.com/gobs/pretty v0.0.0-20180724170744-09732c25a95b/go.mod h1:Xo4aNUOrJnVruqWQJBtW6+bTBDTniY8yZum5rF3b5jw=
35
github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=
46
github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=
7+
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
8+
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
9+
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
10+
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
11+
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
12+
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
13+
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
14+
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

resource.go

+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package gapi
2+
3+
import (
4+
"fmt"
5+
"strconv"
6+
)
7+
8+
const (
9+
DashboardsResource = "dashboards"
10+
DatasourcesResource = "datasources"
11+
FoldersResource = "folders"
12+
ServiceAccountsResource = "serviceaccounts"
13+
TeamsResource = "teams"
14+
UsersResource = "users"
15+
BuiltInRolesResource = "builtInRoles"
16+
)
17+
18+
// ResourceIdent represents anything that can be considered a resource identifier.
19+
type ResourceIdent interface {
20+
fmt.Stringer
21+
}
22+
23+
// ResourceID wraps `int64` to be a valid `ResourceIdent`
24+
type ResourceID int64
25+
26+
func (id ResourceID) String() string {
27+
return strconv.FormatInt(int64(id), 10)
28+
}
29+
30+
// ResourceUID wraps `string` to be a valid `ResourceIdent`
31+
type ResourceUID string
32+
33+
func (id ResourceUID) String() string {
34+
return string(id)
35+
}

0 commit comments

Comments
 (0)