From 3f25a789fb7346ade2749b760bfc60b71971931f Mon Sep 17 00:00:00 2001 From: udai1931 Date: Fri, 12 Sep 2025 18:37:41 +0530 Subject: [PATCH 1/8] Updated for custom on_call_role and non-editable form field placements --- client/form_field_placements.go | 1 + docs/resources/form_field_placement.md | 1 + docs/resources/on_call_role.md | 2 +- provider/resource_form_field_placement.go | 16 ++++++++++++++++ provider/resource_on_call_role.go | 6 +++--- 5 files changed, 22 insertions(+), 4 deletions(-) diff --git a/client/form_field_placements.go b/client/form_field_placements.go index 66f4b4a4..7581bfc9 100644 --- a/client/form_field_placements.go +++ b/client/form_field_placements.go @@ -19,6 +19,7 @@ type FormFieldPlacement struct { Required *bool `jsonapi:"attr,required,omitempty"` RequiredOperator string `jsonapi:"attr,required_operator,omitempty"` PlacementOperator string `jsonapi:"attr,placement_operator,omitempty"` + NonEditable *bool `jsonapi:"attr,non_editable,omitempty"` } func (c *Client) ListFormFieldPlacements(id string, params *rootlygo.ListFormFieldPlacementsParams) ([]interface{}, error) { diff --git a/docs/resources/form_field_placement.md b/docs/resources/form_field_placement.md index f259f95e..e3842e79 100644 --- a/docs/resources/form_field_placement.md +++ b/docs/resources/form_field_placement.md @@ -22,6 +22,7 @@ description: |- ### Optional - `form_field_id` (String) The form field that is placed. +- `non_editable` (Boolean) Whether the field is read-only and cannot be edited by users. - `placement_operator` (String) Logical operator when evaluating multiple form_field_placement_conditions with conditioned=placement. Value must be one of `and`, `or`. - `position` (Number) The position of the field placement. - `required` (Boolean) Whether the field is unconditionally required on this form.. Value must be one of true or false diff --git a/docs/resources/on_call_role.md b/docs/resources/on_call_role.md index c18a05b7..d46e4750 100644 --- a/docs/resources/on_call_role.md +++ b/docs/resources/on_call_role.md @@ -17,7 +17,6 @@ description: |- ### Required - `name` (String) The role name. -- `system_role` (String) The kind of role ### Optional @@ -43,6 +42,7 @@ description: |- ### Read-Only - `id` (String) The ID of this resource. +- `system_role` (String) The kind of role is "custom". ## Import diff --git a/provider/resource_form_field_placement.go b/provider/resource_form_field_placement.go index 24ac85a3..4b376898 100644 --- a/provider/resource_form_field_placement.go +++ b/provider/resource_form_field_placement.go @@ -89,6 +89,15 @@ func resourceFormFieldPlacement() *schema.Resource { Description: "Logical operator when evaluating multiple form_field_placement_conditions with conditioned=placement. Value must be one of `and`, `or`.", ValidateFunc: validation.StringInSlice([]string{"and", "or"}, false), }, + + "non_editable": &schema.Schema { + Type: schema.TypeBool, + Computed: true, + Required: false, + Optional: true, + Description: "Whether the field is read-only and cannot be edited by users.. Value must be one of true or false", + + }, }, } } @@ -121,6 +130,9 @@ func resourceFormFieldPlacementCreate(ctx context.Context, d *schema.ResourceDat if value, ok := d.GetOkExists("placement_operator"); ok { s.PlacementOperator = value.(string) } + if value, ok := d.GetOkExists("non_editable"); ok { + s.NonEditable = tools.Bool(value.(bool)) + } res, err := c.CreateFormFieldPlacement(s) if err != nil { @@ -157,6 +169,7 @@ func resourceFormFieldPlacementRead(ctx context.Context, d *schema.ResourceData, d.Set("required", item.Required) d.Set("required_operator", item.RequiredOperator) d.Set("placement_operator", item.PlacementOperator) + d.Set("non_editable", item.NonEditable) return nil } @@ -188,6 +201,9 @@ func resourceFormFieldPlacementUpdate(ctx context.Context, d *schema.ResourceDat if d.HasChange("placement_operator") { s.PlacementOperator = d.Get("placement_operator").(string) } + if d.HasChange("non_editable") { + s.NonEditable = tools.Bool(d.Get("non_editable").(bool)) + } _, err := c.UpdateFormFieldPlacement(d.Id(), s) if err != nil { diff --git a/provider/resource_on_call_role.go b/provider/resource_on_call_role.go index d208cb78..0e787f49 100644 --- a/provider/resource_on_call_role.go +++ b/provider/resource_on_call_role.go @@ -46,9 +46,9 @@ func resourceOnCallRole() *schema.Resource { "system_role": &schema.Schema{ Type: schema.TypeString, - Computed: false, - Required: true, - Optional: false, + Default: "custom", + Required: false, + Optional: true, ForceNew: false, Description: "The kind of role", }, From cb12af6268eb2738fb195f1cbd2b9f3cd266bbb7 Mon Sep 17 00:00:00 2001 From: udai1931 Date: Fri, 12 Sep 2025 19:18:15 +0530 Subject: [PATCH 2/8] Minor fix --- provider/resource_on_call_role.go | 10 ++-------- provider/resource_on_call_role_test.go | 1 - 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/provider/resource_on_call_role.go b/provider/resource_on_call_role.go index 0e787f49..59131d65 100644 --- a/provider/resource_on_call_role.go +++ b/provider/resource_on_call_role.go @@ -46,9 +46,9 @@ func resourceOnCallRole() *schema.Resource { "system_role": &schema.Schema{ Type: schema.TypeString, - Default: "custom", + Computed: true, Required: false, - Optional: true, + Optional: false, ForceNew: false, Description: "The kind of role", }, @@ -290,9 +290,6 @@ func resourceOnCallRoleCreate(ctx context.Context, d *schema.ResourceData, meta if value, ok := d.GetOkExists("slug"); ok { s.Slug = value.(string) } - if value, ok := d.GetOkExists("system_role"); ok { - s.SystemRole = value.(string) - } if value, ok := d.GetOkExists("alert_sources_permissions"); ok { s.AlertSourcesPermissions = value.([]interface{}) } @@ -409,9 +406,6 @@ func resourceOnCallRoleUpdate(ctx context.Context, d *schema.ResourceData, meta if d.HasChange("slug") { s.Slug = d.Get("slug").(string) } - if d.HasChange("system_role") { - s.SystemRole = d.Get("system_role").(string) - } if d.HasChange("alert_sources_permissions") { if value, ok := d.GetOk("alert_sources_permissions"); value != nil && ok { diff --git a/provider/resource_on_call_role_test.go b/provider/resource_on_call_role_test.go index 4ee43455..b78c06e1 100644 --- a/provider/resource_on_call_role_test.go +++ b/provider/resource_on_call_role_test.go @@ -25,6 +25,5 @@ func TestAccResourceOnCallRole(t *testing.T) { const testAccResourceOnCallRole = ` resource "rootly_on_call_role" "test" { name = "test" - system_role = "custom" } ` From 8aa7ac75f6154dc3756a3fb91db2b00edab477d2 Mon Sep 17 00:00:00 2001 From: udai1931 Date: Fri, 12 Sep 2025 20:16:54 +0530 Subject: [PATCH 3/8] Specs fix --- provider/resource_on_call_role_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/provider/resource_on_call_role_test.go b/provider/resource_on_call_role_test.go index b78c06e1..4ee43455 100644 --- a/provider/resource_on_call_role_test.go +++ b/provider/resource_on_call_role_test.go @@ -25,5 +25,6 @@ func TestAccResourceOnCallRole(t *testing.T) { const testAccResourceOnCallRole = ` resource "rootly_on_call_role" "test" { name = "test" + system_role = "custom" } ` From 99afacc0605f6d3c75d799a9f5ee38ffb4d5277b Mon Sep 17 00:00:00 2001 From: udai1931 Date: Fri, 12 Sep 2025 20:47:09 +0530 Subject: [PATCH 4/8] Specs fix --- provider/resource_on_call_role.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/provider/resource_on_call_role.go b/provider/resource_on_call_role.go index 59131d65..9c3ea909 100644 --- a/provider/resource_on_call_role.go +++ b/provider/resource_on_call_role.go @@ -290,6 +290,8 @@ func resourceOnCallRoleCreate(ctx context.Context, d *schema.ResourceData, meta if value, ok := d.GetOkExists("slug"); ok { s.Slug = value.(string) } + // Always set system_role to "custom" for user-created roles + s.SystemRole = "custom" if value, ok := d.GetOkExists("alert_sources_permissions"); ok { s.AlertSourcesPermissions = value.([]interface{}) } From 079e58818cd777efce5692dbfb90d273146cf109 Mon Sep 17 00:00:00 2001 From: udai1931 Date: Fri, 12 Sep 2025 21:00:37 +0530 Subject: [PATCH 5/8] Specs fix --- provider/resource_on_call_role_test.go | 1 - 1 file changed, 1 deletion(-) diff --git a/provider/resource_on_call_role_test.go b/provider/resource_on_call_role_test.go index 4ee43455..b78c06e1 100644 --- a/provider/resource_on_call_role_test.go +++ b/provider/resource_on_call_role_test.go @@ -25,6 +25,5 @@ func TestAccResourceOnCallRole(t *testing.T) { const testAccResourceOnCallRole = ` resource "rootly_on_call_role" "test" { name = "test" - system_role = "custom" } ` From c39af8bb2f6670137c8a52c6c4ad65100e48d397 Mon Sep 17 00:00:00 2001 From: Udai Gupta <43845165+udai1931@users.noreply.github.com> Date: Wed, 17 Sep 2025 19:20:45 +0530 Subject: [PATCH 6/8] Update form_field_placement.md --- docs/resources/form_field_placement.md | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/resources/form_field_placement.md b/docs/resources/form_field_placement.md index 0f360fe0..b4e829ef 100644 --- a/docs/resources/form_field_placement.md +++ b/docs/resources/form_field_placement.md @@ -24,7 +24,6 @@ description: |- - `form_field_id` (String) The form field that is placed. - `non_editable` (Boolean) Whether the field is read-only and cannot be edited by users. - `non_editable` (Boolean) Whether the field is read-only and cannot be edited by users.. Value must be one of true or false - - `placement_operator` (String) Logical operator when evaluating multiple form_field_placement_conditions with conditioned=placement. Value must be one of `and`, `or`. - `position` (Number) The position of the field placement. - `required` (Boolean) Whether the field is unconditionally required on this form.. Value must be one of true or false From 2bdd72bb5d08df87327ed4410b137870782262d4 Mon Sep 17 00:00:00 2001 From: udai1931 Date: Thu, 18 Sep 2025 16:00:31 +0530 Subject: [PATCH 7/8] Added on_call_role to generate.js --- tools/generate-provider-tpl.js | 1 + tools/generate.js | 1 + 2 files changed, 2 insertions(+) diff --git a/tools/generate-provider-tpl.js b/tools/generate-provider-tpl.js index 90e943e7..482360f5 100644 --- a/tools/generate-provider-tpl.js +++ b/tools/generate-provider-tpl.js @@ -86,6 +86,7 @@ ${resources "rootly_retrospective_process": resourceRetrospectiveProcess(), "rootly_retrospective_step": resourceRetrospectiveStep(), "rootly_post_mortem_template": resourcePostmortemTemplate(), + "rootly_on_call_role": resourceOnCallRole(), "rootly_schedule": resourceSchedule(), "rootly_schedule_rotation": resourceScheduleRotation(), "rootly_secret": resourceSecret(), diff --git a/tools/generate.js b/tools/generate.js index 5d65b70e..f3577e02 100644 --- a/tools/generate.js +++ b/tools/generate.js @@ -69,6 +69,7 @@ const excluded = { "incident_post_mortem", "incident", "ip_ranges", + "on_call_role", "post_mortem_template", "pulse", "retrospective_configuration", From 58ef383c2e4f367c4ad31010200763bc15a8182f Mon Sep 17 00:00:00 2001 From: Alexander Mingoia Date: Fri, 10 Oct 2025 09:04:39 -0700 Subject: [PATCH 8/8] fix: Restore unrelated change to form field docs --- docs/resources/form_field_placement.md | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/resources/form_field_placement.md b/docs/resources/form_field_placement.md index b4e829ef..75f767b8 100644 --- a/docs/resources/form_field_placement.md +++ b/docs/resources/form_field_placement.md @@ -22,7 +22,6 @@ description: |- ### Optional - `form_field_id` (String) The form field that is placed. -- `non_editable` (Boolean) Whether the field is read-only and cannot be edited by users. - `non_editable` (Boolean) Whether the field is read-only and cannot be edited by users.. Value must be one of true or false - `placement_operator` (String) Logical operator when evaluating multiple form_field_placement_conditions with conditioned=placement. Value must be one of `and`, `or`. - `position` (Number) The position of the field placement.