Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
70 changes: 70 additions & 0 deletions github/data_source_github_enterprise_scim_group.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
package github

import (
"context"
"fmt"

"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)

func dataSourceGithubEnterpriseSCIMGroup() *schema.Resource {
s := enterpriseSCIMGroupSchema()
s["enterprise"] = &schema.Schema{
Description: "The enterprise slug.",
Type: schema.TypeString,
Required: true,
}
s["scim_group_id"] = &schema.Schema{
Description: "The SCIM group ID.",
Type: schema.TypeString,
Required: true,
}

return &schema.Resource{
Description: "Lookup SCIM provisioning information for a single GitHub enterprise group.",
ReadContext: dataSourceGithubEnterpriseSCIMGroupRead,
Schema: s,
}
}

func dataSourceGithubEnterpriseSCIMGroupRead(ctx context.Context, d *schema.ResourceData, meta any) diag.Diagnostics {
client := meta.(*Owner).v3client

enterprise := d.Get("enterprise").(string)
scimGroupID := d.Get("scim_group_id").(string)

group, _, err := client.Enterprise.GetProvisionedSCIMGroup(ctx, enterprise, scimGroupID, nil)
if err != nil {
return diag.FromErr(err)
}

d.SetId(fmt.Sprintf("%s/%s", enterprise, scimGroupID))

if err := d.Set("schemas", group.Schemas); err != nil {
return diag.FromErr(err)
}
if group.ID != nil {
if err := d.Set("id", *group.ID); err != nil {
return diag.FromErr(err)
}
}
if group.ExternalID != nil {
if err := d.Set("external_id", *group.ExternalID); err != nil {
return diag.FromErr(err)
}
}
if group.DisplayName != nil {
if err := d.Set("display_name", *group.DisplayName); err != nil {
return diag.FromErr(err)
}
}
if err := d.Set("members", flattenEnterpriseSCIMGroupMembers(group.Members)); err != nil {
return diag.FromErr(err)
}
if err := d.Set("meta", flattenEnterpriseSCIMMeta(group.Meta)); err != nil {
return diag.FromErr(err)
}

return nil
}
34 changes: 34 additions & 0 deletions github/data_source_github_enterprise_scim_group_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package github

import (
"fmt"
"testing"

"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
)

func TestAccGithubEnterpriseSCIMGroupDataSource(t *testing.T) {
t.Run("reads group without error", func(t *testing.T) {
resource.Test(t, resource.TestCase{
PreCheck: func() { skipUnlessEnterprise(t) },
ProviderFactories: providerFactories,
Steps: []resource.TestStep{{
Config: fmt.Sprintf(`
data "github_enterprise_scim_groups" "all" {
enterprise = "%s"
}

data "github_enterprise_scim_group" "test" {
enterprise = "%[1]s"
scim_group_id = data.github_enterprise_scim_groups.all.resources[0].id
}
`, testAccConf.enterpriseSlug),
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttrSet("data.github_enterprise_scim_group.test", "id"),
resource.TestCheckResourceAttrSet("data.github_enterprise_scim_group.test", "display_name"),
resource.TestCheckResourceAttrSet("data.github_enterprise_scim_group.test", "schemas.#"),
),
}},
})
})
}
204 changes: 204 additions & 0 deletions github/data_source_github_enterprise_scim_groups.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,204 @@
package github

import (
"context"
"fmt"
"net/url"

"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
)

func dataSourceGithubEnterpriseSCIMGroups() *schema.Resource {
return &schema.Resource{
Description: "Lookup SCIM groups provisioned for a GitHub enterprise.",
ReadContext: dataSourceGithubEnterpriseSCIMGroupsRead,

Schema: map[string]*schema.Schema{
"enterprise": {
Description: "The enterprise slug.",
Type: schema.TypeString,
Required: true,
},
"filter": {
Description: "Optional SCIM filter. See GitHub SCIM enterprise docs for supported filters.",
Type: schema.TypeString,
Optional: true,
},
"results_per_page": {
Description: "Number of results per request (mapped to SCIM 'count'). Used while auto-fetching all pages.",
Type: schema.TypeInt,
Optional: true,
Default: 100,
ValidateFunc: validation.IntBetween(1, 100),
},

"schemas": {
Description: "SCIM response schemas.",
Type: schema.TypeList,
Computed: true,
Elem: &schema.Schema{Type: schema.TypeString},
},
"total_results": {
Description: "The total number of results returned by the SCIM endpoint.",
Type: schema.TypeInt,
Computed: true,
},
"start_index": {
Description: "The startIndex from the first SCIM page.",
Type: schema.TypeInt,
Computed: true,
},
"items_per_page": {
Description: "The itemsPerPage from the first SCIM page.",
Type: schema.TypeInt,
Computed: true,
},
"resources": {
Description: "All SCIM groups.",
Type: schema.TypeList,
Computed: true,
Elem: &schema.Resource{
Schema: enterpriseSCIMGroupSchema(),
},
},
},
}
}

func dataSourceGithubEnterpriseSCIMGroupsRead(ctx context.Context, d *schema.ResourceData, meta any) diag.Diagnostics {
client := meta.(*Owner).v3client

enterprise := d.Get("enterprise").(string)
filter := d.Get("filter").(string)
count := d.Get("results_per_page").(int)

groups, first, err := enterpriseSCIMListAllGroups(ctx, client, enterprise, filter, count)
if err != nil {
return diag.FromErr(err)
}

flat := make([]any, 0, len(groups))
for _, g := range groups {
flat = append(flat, flattenEnterpriseSCIMGroup(g))
}

id := fmt.Sprintf("%s/scim-groups", enterprise)
if filter != "" {
id = fmt.Sprintf("%s?filter=%s", id, url.QueryEscape(filter))
}

d.SetId(id)

if err := d.Set("schemas", first.Schemas); err != nil {
return diag.FromErr(err)
}
if first.TotalResults != nil {
if err := d.Set("total_results", *first.TotalResults); err != nil {
return diag.FromErr(err)
}
}
startIndex := 1
if first.StartIndex != nil && *first.StartIndex > 0 {
startIndex = *first.StartIndex
}
if err := d.Set("start_index", startIndex); err != nil {
return diag.FromErr(err)
}
itemsPerPage := count
if first.ItemsPerPage != nil && *first.ItemsPerPage > 0 {
itemsPerPage = *first.ItemsPerPage
}
if err := d.Set("items_per_page", itemsPerPage); err != nil {
return diag.FromErr(err)
}
if err := d.Set("resources", flat); err != nil {
return diag.FromErr(err)
}

return nil
}

func enterpriseSCIMMetaSchema() map[string]*schema.Schema {
return map[string]*schema.Schema{
"resource_type": {
Type: schema.TypeString,
Computed: true,
Description: "The SCIM resource type.",
},
"created": {
Type: schema.TypeString,
Computed: true,
Description: "The creation timestamp.",
},
"last_modified": {
Type: schema.TypeString,
Computed: true,
Description: "The lastModified timestamp.",
},
"location": {
Type: schema.TypeString,
Computed: true,
Description: "The resource location.",
},
}
}

func enterpriseSCIMGroupSchema() map[string]*schema.Schema {
return map[string]*schema.Schema{
"schemas": {
Type: schema.TypeList,
Computed: true,
Description: "SCIM schemas for this group.",
Elem: &schema.Schema{Type: schema.TypeString},
},
"id": {
Type: schema.TypeString,
Computed: true,
Description: "The SCIM group ID.",
},
"external_id": {
Type: schema.TypeString,
Computed: true,
Description: "The external ID for the group.",
},
"display_name": {
Type: schema.TypeString,
Computed: true,
Description: "The SCIM group displayName.",
},
"members": {
Type: schema.TypeList,
Computed: true,
Description: "Group members.",
Elem: &schema.Resource{Schema: enterpriseSCIMGroupMemberSchema()},
},
"meta": {
Type: schema.TypeList,
Computed: true,
Description: "Resource metadata.",
Elem: &schema.Resource{Schema: enterpriseSCIMMetaSchema()},
},
}
}

func enterpriseSCIMGroupMemberSchema() map[string]*schema.Schema {
return map[string]*schema.Schema{
"value": {
Type: schema.TypeString,
Computed: true,
Description: "Member identifier.",
},
"ref": {
Type: schema.TypeString,
Computed: true,
Description: "Member reference URL.",
},
"display_name": {
Type: schema.TypeString,
Computed: true,
Description: "Member display name.",
},
}
}
30 changes: 30 additions & 0 deletions github/data_source_github_enterprise_scim_groups_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package github

import (
"fmt"
"testing"

"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
)

func TestAccGithubEnterpriseSCIMGroupsDataSource(t *testing.T) {
t.Run("lists groups without error", func(t *testing.T) {
resource.Test(t, resource.TestCase{
PreCheck: func() { skipUnlessEnterprise(t) },
ProviderFactories: providerFactories,
Steps: []resource.TestStep{{
Config: fmt.Sprintf(`
data "github_enterprise_scim_groups" "test" {
enterprise = "%s"
}
`, testAccConf.enterpriseSlug),
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttrSet("data.github_enterprise_scim_groups.test", "id"),
resource.TestCheckResourceAttrSet("data.github_enterprise_scim_groups.test", "total_results"),
resource.TestCheckResourceAttrSet("data.github_enterprise_scim_groups.test", "schemas.#"),
resource.TestCheckResourceAttrSet("data.github_enterprise_scim_groups.test", "resources.#"),
),
}},
})
})
}
Loading