Skip to content

Commit 7dc443a

Browse files
authored
Enable oncall client setup using service account auth (#1958)
1 parent 6a8a682 commit 7dc443a

File tree

7 files changed

+131
-3
lines changed

7 files changed

+131
-3
lines changed

docs/index.md

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,46 @@ resource "grafana_oncall_escalation" "example_notify_step" {
201201
}
202202
```
203203

204+
Alternatively, you can also configure the provider block by setting `url`
205+
to your Grafana URL and `auth` to a service account token:
206+
207+
```terraform
208+
// Step 1: Configure provider block.
209+
provider "grafana" {
210+
alias = "oncall"
211+
url = "http://grafana.example.com/"
212+
auth = var.grafana_auth
213+
}
214+
215+
data "grafana_oncall_user" "alex" {
216+
username = "alex"
217+
}
218+
219+
// Step 2: Interact with Grafana OnCall
220+
resource "grafana_oncall_integration" "test-acc-integration" {
221+
provider = grafana.oncall
222+
name = "my integration"
223+
type = "grafana"
224+
default_route {
225+
escalation_chain_id = grafana_oncall_escalation_chain.default.id
226+
}
227+
}
228+
229+
resource "grafana_oncall_escalation_chain" "default" {
230+
provider = grafana.oncall
231+
name = "default"
232+
}
233+
234+
resource "grafana_oncall_escalation" "example_notify_step" {
235+
escalation_chain_id = grafana_oncall_escalation_chain.default.id
236+
type = "notify_persons"
237+
persons_to_notify = [
238+
data.grafana_oncall_user.alex.id
239+
]
240+
position = 0
241+
}
242+
```
243+
204244
<!-- schema generated by tfplugindocs -->
205245
## Schema
206246

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
// Step 1: Configure provider block.
2+
provider "grafana" {
3+
alias = "oncall"
4+
url = "http://grafana.example.com/"
5+
auth = var.grafana_auth
6+
}
7+
8+
data "grafana_oncall_user" "alex" {
9+
username = "alex"
10+
}
11+
12+
// Step 2: Interact with Grafana OnCall
13+
resource "grafana_oncall_integration" "test-acc-integration" {
14+
provider = grafana.oncall
15+
name = "my integration"
16+
type = "grafana"
17+
default_route {
18+
escalation_chain_id = grafana_oncall_escalation_chain.default.id
19+
}
20+
}
21+
22+
resource "grafana_oncall_escalation_chain" "default" {
23+
provider = grafana.oncall
24+
name = "default"
25+
}
26+
27+
resource "grafana_oncall_escalation" "example_notify_step" {
28+
escalation_chain_id = grafana_oncall_escalation_chain.default.id
29+
type = "notify_persons"
30+
persons_to_notify = [
31+
data.grafana_oncall_user.alex.id
32+
]
33+
position = 0
34+
}

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ require (
99
github.com/fatih/color v1.18.0
1010
github.com/go-openapi/runtime v0.28.0
1111
github.com/go-openapi/strfmt v0.23.0
12-
github.com/grafana/amixr-api-go-client v0.0.18 // main branch
12+
github.com/grafana/amixr-api-go-client v0.0.19 // main branch
1313
github.com/grafana/grafana-com-public-clients/go/gcom v0.0.0-20240807172819-ac10800522a3
1414
github.com/grafana/grafana-openapi-client-go v0.0.0-20241113095943-9cb2bbfeb8a3
1515
github.com/grafana/machine-learning-go-client v0.8.2

go.sum

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,12 @@ github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY=
139139
github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ=
140140
github.com/grafana/amixr-api-go-client v0.0.18 h1:gih3Uug/i9RIz4ihoqWpV3ntb7OmaR0oFfE+zVbwHU0=
141141
github.com/grafana/amixr-api-go-client v0.0.18/go.mod h1:u53FF0WSBMx6XvZK58fply91KBl6X+OtIu0aJC07amY=
142+
github.com/grafana/amixr-api-go-client v0.0.19-0.20241213140536-c007700cedc3 h1:WaP7ahFbKU9sfkMbQLN7+iWKDFVU/ZP11WxQPwLD9b8=
143+
github.com/grafana/amixr-api-go-client v0.0.19-0.20241213140536-c007700cedc3/go.mod h1:u53FF0WSBMx6XvZK58fply91KBl6X+OtIu0aJC07amY=
144+
github.com/grafana/amixr-api-go-client v0.0.19-0.20241216131433-c4dc18332170 h1:Ep4Qc8nhlwM5jfoIuAoOXstMKjteCps9e/4llUSG0/I=
145+
github.com/grafana/amixr-api-go-client v0.0.19-0.20241216131433-c4dc18332170/go.mod h1:u53FF0WSBMx6XvZK58fply91KBl6X+OtIu0aJC07amY=
146+
github.com/grafana/amixr-api-go-client v0.0.19 h1:09FxpE9CXR7YpjDvq/ionA6UlmV4G1r48HFR4noG9Dw=
147+
github.com/grafana/amixr-api-go-client v0.0.19/go.mod h1:u53FF0WSBMx6XvZK58fply91KBl6X+OtIu0aJC07amY=
142148
github.com/grafana/grafana-com-public-clients/go/gcom v0.0.0-20240807172819-ac10800522a3 h1:CVLTffnWgBGvVaXfUUcSgFrZbiMzvj0/Hpi909zdeG0=
143149
github.com/grafana/grafana-com-public-clients/go/gcom v0.0.0-20240807172819-ac10800522a3/go.mod h1:u9d0BESoKlztYm93CpoRleQjMbYBcZ+JOLHHP2nN6Wg=
144150
github.com/grafana/grafana-openapi-client-go v0.0.0-20241113095943-9cb2bbfeb8a3 h1:poKxGlUaEYVp2DMofC/I2GHw/vvtHAZ20c48I8rFB6M=

pkg/provider/configure_clients.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ func CreateClients(providerConfig ProviderConfig) (*common.Client, error) {
5252
if !providerConfig.SMAccessToken.IsNull() {
5353
c.SMAPI = SMAPI.NewClient(providerConfig.SMURL.ValueString(), providerConfig.SMAccessToken.ValueString(), getRetryClient(providerConfig))
5454
}
55-
if !providerConfig.OncallAccessToken.IsNull() {
55+
if !providerConfig.OncallURL.IsNull() && (!providerConfig.OncallAccessToken.IsNull() || (!providerConfig.Auth.IsNull() && !providerConfig.URL.IsNull())) {
5656
var onCallClient *onCallAPI.Client
5757
onCallClient, err = createOnCallClient(providerConfig)
5858
if err != nil {
@@ -182,7 +182,12 @@ func createCloudClient(client *common.Client, providerConfig ProviderConfig) err
182182
}
183183

184184
func createOnCallClient(providerConfig ProviderConfig) (*onCallAPI.Client, error) {
185-
return onCallAPI.New(providerConfig.OncallURL.ValueString(), providerConfig.OncallAccessToken.ValueString())
185+
authToken := providerConfig.OncallAccessToken.ValueString()
186+
if authToken == "" {
187+
// prefer OncallAccessToken if it was set, otherwise use Grafana auth (service account) token
188+
authToken = providerConfig.Auth.ValueString()
189+
}
190+
return onCallAPI.NewWithGrafanaURL(providerConfig.OncallURL.ValueString(), authToken, providerConfig.URL.ValueString())
186191
}
187192

188193
func createCloudProviderClient(client *common.Client, providerConfig ProviderConfig) error {

pkg/provider/configure_clients_test.go

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ func TestCreateClients(t *testing.T) {
120120
assert.NotNil(t, c.GrafanaAPI)
121121
assert.NotNil(t, c.MLAPI)
122122
assert.NotNil(t, c.SLOClient)
123+
assert.Nil(t, c.OnCallClient)
123124
},
124125
},
125126
{
@@ -133,6 +134,43 @@ func TestCreateClients(t *testing.T) {
133134
assert.NotNil(t, c.GrafanaAPI)
134135
},
135136
},
137+
{
138+
name: "Stack URL and auth to be set, empty strings; OnCall URL set (it has a default)",
139+
config: ProviderConfig{
140+
URL: types.StringValue(""),
141+
Auth: types.StringValue(""),
142+
OncallURL: types.StringValue("http://oncall.url"),
143+
},
144+
expected: func(c *common.Client, err error) {
145+
assert.Nil(t, err)
146+
assert.NotNil(t, c.GrafanaAPI)
147+
},
148+
},
149+
{
150+
name: "OnCall client using original config (not setting Grafana URL)",
151+
config: ProviderConfig{
152+
OncallAccessToken: types.StringValue("oncall-token"),
153+
OncallURL: types.StringValue("http://oncall.url"),
154+
},
155+
expected: func(c *common.Client, err error) {
156+
assert.Nil(t, err)
157+
assert.NotNil(t, c.OnCallClient)
158+
assert.Nil(t, c.OnCallClient.GrafanaURL())
159+
},
160+
},
161+
{
162+
name: "OnCall client setting Grafana URL (using Grafana URL and auth)",
163+
config: ProviderConfig{
164+
URL: types.StringValue("http://localhost:3000"),
165+
Auth: types.StringValue("service-account-token"),
166+
OncallURL: types.StringValue("http://oncall.url"),
167+
},
168+
expected: func(c *common.Client, err error) {
169+
assert.Nil(t, err)
170+
assert.NotNil(t, c.OnCallClient)
171+
assert.Equal(t, "http://localhost:3000", c.OnCallClient.GrafanaURL().String())
172+
},
173+
},
136174
}
137175

138176
for _, tc := range testCases {

templates/index.md.tmpl

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,11 @@ The changelog for this provider can be found here: <https://github.com/grafana/t
3030

3131
{{ tffile "examples/provider/provider-oncall.tf" }}
3232

33+
Alternatively, you can also configure the provider block by setting `url`
34+
to your Grafana URL and `auth` to a service account token:
35+
36+
{{ tffile "examples/provider/provider-oncall-sa.tf" }}
37+
3338
{{ .SchemaMarkdown | trimspace }}
3439

3540
### Managing Cloud Provider

0 commit comments

Comments
 (0)