Skip to content

Commit 5ca8e40

Browse files
authored
adds changes for fixing nil pointer exception and changes for documentation (#2512)
1 parent 1efc389 commit 5ca8e40

6 files changed

Lines changed: 290 additions & 36 deletions

File tree

docs/resources/request_condition.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,13 +56,13 @@ resource "okta_request_condition" "example" {
5656
### Nested Schema for `access_scope_settings`
5757
Required:
5858
- `type` (String) Enum: `RESOURCE_DEFAULT`, `GROUPS`, `ENTITLEMENT_BUNDLES`.
59-
- `id` (List of String) List of entitlement bundle ids/group ids.
59+
- `id` (Block) Block list of entitlement bundle ids/group ids.
6060

6161
<a id="nestedblock--requester_settings"></a>
6262
### Nested Schema for `requester_settings`
6363
Required:
6464
- `type` (String) Enum: `EVERYONE`, `TEAMS`, `GROUPS`.
65-
- `id` (List of String) List of group ids or team ids.
65+
- `id` (Block) Block list of group ids or team ids.
6666

6767
<a id="nestedblock--access_duration_settings"></a>
6868
### Nested Schema for `access_duration_settings`
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
resource "okta_group" "requester" {
2+
name = "requester_test"
3+
description = "requester_test"
4+
}
5+
6+
resource "okta_request_condition" "test" {
7+
resource_id="0oaqgxmg2n2FjHLzw1d7"
8+
approval_sequence_id="68d224058c0cff364ca377e8"
9+
name="issue-2510"
10+
11+
access_scope_settings {
12+
type = "GROUPS"
13+
14+
ids {
15+
id = "00gouu5aq9Gq0JGLH1d7"
16+
}
17+
}
18+
19+
requester_settings {
20+
type = "GROUPS"
21+
22+
ids {
23+
id = okta_group.requester.id
24+
}
25+
}
26+
}

okta/services/governance/resource_request_condition.go

Lines changed: 29 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -187,22 +187,7 @@ func (r *requestConditionResource) Create(ctx context.Context, req resource.Crea
187187
return
188188
}
189189

190-
requestConditionReq, diags := createRequestCondition(data)
191-
if diags.HasError() {
192-
if diags.HasError() {
193-
resp.Diagnostics.Append(diags...)
194-
return
195-
}
196-
}
197-
if requestConditionReq == nil {
198-
resp.Diagnostics.AddError(
199-
"Error creating Request conditions",
200-
"Could not create Request conditions, unexpected error: requestConditionReq is nil",
201-
)
202-
return
203-
}
204-
205-
requestConditionResp, _, err := r.OktaGovernanceClient.OktaGovernanceSDKClient().RequestConditionsAPI.CreateResourceRequestConditionV2(ctx, data.ResourceId.ValueString()).RequestConditionCreatable(*requestConditionReq).Execute()
190+
requestConditionResp, _, err := r.OktaGovernanceClient.OktaGovernanceSDKClient().RequestConditionsAPI.CreateResourceRequestConditionV2(ctx, data.ResourceId.ValueString()).RequestConditionCreatable(createRequestCondition(data)).Execute()
206191
if err != nil {
207192
resp.Diagnostics.AddError(
208193
"Error creating Request conditions",
@@ -211,7 +196,8 @@ func (r *requestConditionResource) Create(ctx context.Context, req resource.Crea
211196
return
212197
}
213198

214-
if applyRequestConditionToState(&data, requestConditionResp) {
199+
resp.Diagnostics.Append(applyRequestConditionToState(ctx, &data, requestConditionResp)...)
200+
if resp.Diagnostics.HasError() {
215201
return
216202
}
217203

@@ -239,7 +225,10 @@ func (r *requestConditionResource) Read(ctx context.Context, req resource.ReadRe
239225
return
240226
}
241227

242-
applyRequestConditionToState(&data, readRequestConditionResp)
228+
resp.Diagnostics.Append(applyRequestConditionToState(ctx, &data, readRequestConditionResp)...)
229+
if resp.Diagnostics.HasError() {
230+
return
231+
}
243232
resp.Diagnostics.Append(resp.State.Set(ctx, &data)...)
244233
}
245234

@@ -258,15 +247,8 @@ func (r *requestConditionResource) Update(ctx context.Context, req resource.Upda
258247
return
259248
}
260249

261-
patch, diags := createRequestConditionPatch(data)
262-
if diags.HasError() {
263-
if diags.HasError() {
264-
resp.Diagnostics.Append(diags...)
265-
return
266-
}
267-
}
268250
// Update API call logic
269-
updatedRequestCondition, _, err := r.OktaGovernanceClient.OktaGovernanceSDKClient().RequestConditionsAPI.UpdateResourceRequestConditionV2(ctx, data.ResourceId.ValueString(), state.Id.ValueString()).RequestConditionPatchable(patch).Execute()
251+
updatedRequestCondition, _, err := r.OktaGovernanceClient.OktaGovernanceSDKClient().RequestConditionsAPI.UpdateResourceRequestConditionV2(ctx, data.ResourceId.ValueString(), state.Id.ValueString()).RequestConditionPatchable(createRequestConditionPatch(data)).Execute()
270252
if err != nil {
271253
resp.Diagnostics.AddError(
272254
"Error updating Request conditions",
@@ -275,8 +257,12 @@ func (r *requestConditionResource) Update(ctx context.Context, req resource.Upda
275257
return
276258
}
277259

278-
applyRequestConditionToState(&data, updatedRequestCondition)
279-
// Save updated Data into Terraform state
260+
resp.Diagnostics.Append(applyRequestConditionToState(ctx, &data, updatedRequestCondition)...)
261+
if resp.Diagnostics.HasError() {
262+
return
263+
}
264+
265+
// Save Data into Terraform state
280266
resp.Diagnostics.Append(resp.State.Set(ctx, &data)...)
281267
}
282268

@@ -306,7 +292,8 @@ func (r *requestConditionResource) Delete(ctx context.Context, req resource.Dele
306292
}
307293
}
308294

309-
func applyRequestConditionToState(data *requestConditionResourceModel, requestConditionResp *governance.RequestConditionFull) bool {
295+
func applyRequestConditionToState(ctx context.Context, data *requestConditionResourceModel, requestConditionResp *governance.RequestConditionFull) diag.Diagnostics {
296+
var diags diag.Diagnostics
310297
data.Id = types.StringValue(requestConditionResp.GetId())
311298
data.Name = types.StringValue(requestConditionResp.GetName())
312299
if requestConditionResp.Description != nil {
@@ -322,7 +309,7 @@ func applyRequestConditionToState(data *requestConditionResourceModel, requestCo
322309
data.RequesterSettings, _ = setRequesterSettings(requestConditionResp.GetRequesterSettings())
323310
data.AccessScopeSettings, _ = setAccessScopeSettings(requestConditionResp.GetAccessScopeSettings())
324311
data.AccessDurationSettings = setAccessDurationSettings(requestConditionResp.GetAccessDurationSettings())
325-
return false
312+
return diags
326313
}
327314

328315
func setAccessDurationSettings(settings governance.AccessDurationSettingsFull) *AccessDurationSettings {
@@ -388,7 +375,7 @@ func setRequesterSettings(settings governance.RequesterSettingsFullRequesterSett
388375
return &setting, nil
389376
}
390377

391-
func createRequestCondition(data requestConditionResourceModel) (*governance.RequestConditionCreatable, diag.Diagnostics) {
378+
func createRequestCondition(data requestConditionResourceModel) governance.RequestConditionCreatable {
392379
req := governance.RequestConditionCreatable{}
393380
req.Name = data.Name.ValueString()
394381
req.ApprovalSequenceId = data.ApprovalSequenceId.ValueString()
@@ -401,6 +388,10 @@ func createRequestCondition(data requestConditionResourceModel) (*governance.Req
401388

402389
accessScopeSettings := governance.AccessScopeSettingsCreatableAccessScopeSettings{}
403390
if data.AccessScopeSettings.Type.ValueString() == "GROUPS" {
391+
if accessScopeSettings.AccessScopeSettingsCreatableGroupAccessScopeSettings == nil {
392+
accessScopeSettings.AccessScopeSettingsCreatableGroupAccessScopeSettings =
393+
&governance.AccessScopeSettingsCreatableGroupAccessScopeSettings{}
394+
}
404395
accessScopeSettings.AccessScopeSettingsCreatableGroupAccessScopeSettings.Type = "GROUPS"
405396
var groupsIds []governance.GroupsArrayCreatableInner
406397
elems := data.AccessScopeSettings.Ids
@@ -413,6 +404,10 @@ func createRequestCondition(data requestConditionResourceModel) (*governance.Req
413404
accessScopeSettings.AccessScopeSettingsCreatableGroupAccessScopeSettings.Groups = groupsIds
414405
req.AccessScopeSettings = accessScopeSettings
415406
} else if data.AccessScopeSettings.Type.ValueString() == "ENTITLEMENT_BUNDLES" {
407+
if accessScopeSettings.AccessScopeSettingsCreatableEntitlementBundleAccessScopeSettings == nil {
408+
accessScopeSettings.AccessScopeSettingsCreatableEntitlementBundleAccessScopeSettings =
409+
&governance.AccessScopeSettingsCreatableEntitlementBundleAccessScopeSettings{}
410+
}
416411
accessScopeSettings.AccessScopeSettingsCreatableEntitlementBundleAccessScopeSettings.Type = "ENTITLEMENT_BUNDLES"
417412
var entitlementBundles []governance.EntitlementBundlesArrayCreatableInner
418413
elems := data.AccessScopeSettings.Ids
@@ -474,10 +469,10 @@ func createRequestCondition(data requestConditionResourceModel) (*governance.Req
474469
}
475470
}
476471

477-
return &req, nil
472+
return req
478473
}
479474

480-
func createRequestConditionPatch(data requestConditionResourceModel) (governance.RequestConditionPatchable, diag.Diagnostics) {
475+
func createRequestConditionPatch(data requestConditionResourceModel) governance.RequestConditionPatchable {
481476
var patch governance.RequestConditionPatchable
482477
patch.Name = data.Name.ValueStringPointer()
483478
patch.ApprovalSequenceId = data.ApprovalSequenceId.ValueStringPointer()
@@ -567,5 +562,5 @@ func createRequestConditionPatch(data requestConditionResourceModel) (governance
567562
patch.AccessDurationSettings.Set(&accessDurationSettings)
568563
}
569564
}
570-
return patch, nil
565+
return patch
571566
}

okta/services/governance/resource_request_condition_test.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,5 +36,26 @@ func TestAccRequestConditionResource_basic(t *testing.T) {
3636
},
3737
},
3838
})
39+
}
3940

41+
func TestAccRequestConditionResource_Issue2510(t *testing.T) {
42+
mgr := newFixtureManager("resources", resources.OktaGovernanceRequestCondition, t.Name())
43+
config := mgr.GetFixtures("basic_issue2510.tf", t)
44+
resourceName := fmt.Sprintf("%s.test", resources.OktaGovernanceRequestCondition)
45+
46+
acctest.OktaResourceTest(t, resource.TestCase{
47+
PreCheck: acctest.AccPreCheck(t),
48+
ErrorCheck: testAccErrorChecks(t),
49+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactoriesForTestAcc(t),
50+
CheckDestroy: nil,
51+
Steps: []resource.TestStep{
52+
{
53+
Config: config,
54+
Check: resource.ComposeTestCheckFunc(
55+
resource.TestCheckResourceAttr(resourceName, "name", "issue-2510"),
56+
resource.TestCheckResourceAttr(resourceName, "requester_settings.type", "GROUPS"),
57+
),
58+
},
59+
},
60+
})
4061
}
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
---
2+
version: 2
3+
interactions:
4+
- id: 0
5+
request:
6+
proto: HTTP/1.1
7+
proto_major: 1
8+
proto_minor: 1
9+
content_length: 243
10+
host: classic-00.dne-okta.com
11+
body: |
12+
{"accessScopeSettings":{"groups":[{"id":"00gouu5aq9Gq0JGLH1d7"}],"type":"GROUPS"},"approvalSequenceId":"68d224058c0cff364ca377e8","name":"issue-2510","priority":0,"requesterSettings":{"groups":[{"id":"00gqwtmv55uVcEBSi1d7"}],"type":"GROUPS"}}
13+
headers:
14+
Accept:
15+
- application/json
16+
Authorization:
17+
- SSWS REDACTED
18+
Content-Type:
19+
- application/json
20+
url: https://classic-00.dne-okta.com/governance/api/v2/resources/0oaqgxmg2n2FjHLzw1d7/request-conditions
21+
method: POST
22+
response:
23+
proto: HTTP/2.0
24+
proto_major: 2
25+
proto_minor: 0
26+
content_length: 620
27+
body: '{"requesterSettings":{"type":"GROUPS","groups":[{"id":"00gqwtmv55uVcEBSi1d7"}]},"accessScopeSettings":{"type":"GROUPS","groups":[{"id":"00gouu5aq9Gq0JGLH1d7"}]},"approvalSequenceId":"68d224058c0cff364ca377e8","name":"issue-2510","id":"rco12lq2otuPystzX1d7","createdBy":"00unkw1sfbTw08c0g1d7","created":"2025-10-12T21:11:00Z","lastUpdated":"2025-10-12T21:11:00Z","lastUpdatedBy":"00unkw1sfbTw08c0g1d7","_links":{"self":{"href":"https://classic-00-admin.dne-okta.com/governance/api/v2/resources/0oaqgxmg2n2FjHLzw1d7/request-conditions/rco12lq2otuPystzX1d7","hints":{}}},"status":"INACTIVE","priority":0}'
28+
headers:
29+
Accept-Ch:
30+
- Sec-CH-UA-Platform-Version
31+
Content-Length:
32+
- "620"
33+
Content-Type:
34+
- application/json
35+
Date:
36+
- Sun, 12 Oct 2025 21:11:00 GMT
37+
Location:
38+
- https://dcp-testing-oig-2025-06-26-admin.oktapreview.com/governance/api/v2/resources/0oaqgxmg2n2FjHLzw1d7/request-conditions/rco12lq2otuPystzX1d7
39+
Referrer-Policy:
40+
- strict-origin-when-cross-origin
41+
status: 201 Created
42+
code: 201
43+
duration: 2.498982125s
44+
- id: 1
45+
request:
46+
proto: HTTP/1.1
47+
proto_major: 1
48+
proto_minor: 1
49+
content_length: 0
50+
host: classic-00.dne-okta.com
51+
headers:
52+
Accept:
53+
- application/json
54+
Authorization:
55+
- SSWS REDACTED
56+
url: https://classic-00.dne-okta.com/governance/api/v2/resources/0oaqgxmg2n2FjHLzw1d7/request-conditions/rco12lq2otuPystzX1d7
57+
method: GET
58+
response:
59+
proto: HTTP/2.0
60+
proto_major: 2
61+
proto_minor: 0
62+
content_length: -1
63+
uncompressed: true
64+
body: '{"requesterSettings":{"type":"GROUPS","groups":[{"id":"00gqwtmv55uVcEBSi1d7"}]},"accessScopeSettings":{"type":"GROUPS","groups":[{"id":"00gouu5aq9Gq0JGLH1d7"}]},"approvalSequenceId":"68d224058c0cff364ca377e8","name":"issue-2510","id":"rco12lq2otuPystzX1d7","createdBy":"00unkw1sfbTw08c0g1d7","created":"2025-10-12T21:11:00Z","lastUpdated":"2025-10-12T21:11:00Z","lastUpdatedBy":"00unkw1sfbTw08c0g1d7","_links":{"self":{"href":"https://classic-00-admin.dne-okta.com/governance/api/v2/resources/0oaqgxmg2n2FjHLzw1d7/request-conditions/rco12lq2otuPystzX1d7","hints":{}}},"status":"INACTIVE","priority":0}'
65+
headers:
66+
Accept-Ch:
67+
- Sec-CH-UA-Platform-Version
68+
Content-Type:
69+
- application/json
70+
Date:
71+
- Sun, 12 Oct 2025 21:11:02 GMT
72+
Referrer-Policy:
73+
- strict-origin-when-cross-origin
74+
status: 200 OK
75+
code: 200
76+
duration: 1.283624125s
77+
- id: 2
78+
request:
79+
proto: HTTP/1.1
80+
proto_major: 1
81+
proto_minor: 1
82+
content_length: 0
83+
host: classic-00.dne-okta.com
84+
headers:
85+
Accept:
86+
- application/json
87+
Authorization:
88+
- SSWS REDACTED
89+
url: https://classic-00.dne-okta.com/governance/api/v2/resources/0oaqgxmg2n2FjHLzw1d7/request-conditions/rco12lq2otuPystzX1d7
90+
method: DELETE
91+
response:
92+
proto: HTTP/2.0
93+
proto_major: 2
94+
proto_minor: 0
95+
content_length: 0
96+
body: ""
97+
headers:
98+
Accept-Ch:
99+
- Sec-CH-UA-Platform-Version
100+
Date:
101+
- Sun, 12 Oct 2025 21:11:04 GMT
102+
Referrer-Policy:
103+
- strict-origin-when-cross-origin
104+
status: 204 No Content
105+
code: 204
106+
duration: 1.3408165s

0 commit comments

Comments
 (0)