Skip to content

Commit fcbe789

Browse files
Merge remote-tracking branch 'origin/enterprise-scim' into release-vfork
# Conflicts: # github/provider.go
2 parents 1f462ba + 0dea7bc commit fcbe789

14 files changed

+1122
-0
lines changed
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package github
2+
3+
import (
4+
"context"
5+
"fmt"
6+
7+
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
8+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
9+
)
10+
11+
func dataSourceGithubEnterpriseSCIMGroup() *schema.Resource {
12+
s := enterpriseSCIMGroupSchema()
13+
s["enterprise"] = &schema.Schema{
14+
Description: "The enterprise slug.",
15+
Type: schema.TypeString,
16+
Required: true,
17+
}
18+
s["scim_group_id"] = &schema.Schema{
19+
Description: "The SCIM group ID.",
20+
Type: schema.TypeString,
21+
Required: true,
22+
}
23+
24+
return &schema.Resource{
25+
Description: "Lookup SCIM provisioning information for a single GitHub enterprise group.",
26+
ReadContext: dataSourceGithubEnterpriseSCIMGroupRead,
27+
Schema: s,
28+
}
29+
}
30+
31+
func dataSourceGithubEnterpriseSCIMGroupRead(ctx context.Context, d *schema.ResourceData, meta any) diag.Diagnostics {
32+
client := meta.(*Owner).v3client
33+
34+
enterprise := d.Get("enterprise").(string)
35+
scimGroupID := d.Get("scim_group_id").(string)
36+
37+
group, _, err := client.Enterprise.GetProvisionedSCIMGroup(ctx, enterprise, scimGroupID, nil)
38+
if err != nil {
39+
return diag.FromErr(err)
40+
}
41+
42+
d.SetId(fmt.Sprintf("%s/%s", enterprise, scimGroupID))
43+
44+
if err := d.Set("schemas", group.Schemas); err != nil {
45+
return diag.FromErr(err)
46+
}
47+
if group.ID != nil {
48+
if err := d.Set("id", *group.ID); err != nil {
49+
return diag.FromErr(err)
50+
}
51+
}
52+
if group.ExternalID != nil {
53+
if err := d.Set("external_id", *group.ExternalID); err != nil {
54+
return diag.FromErr(err)
55+
}
56+
}
57+
if group.DisplayName != nil {
58+
if err := d.Set("display_name", *group.DisplayName); err != nil {
59+
return diag.FromErr(err)
60+
}
61+
}
62+
if err := d.Set("members", flattenEnterpriseSCIMGroupMembers(group.Members)); err != nil {
63+
return diag.FromErr(err)
64+
}
65+
if err := d.Set("meta", flattenEnterpriseSCIMMeta(group.Meta)); err != nil {
66+
return diag.FromErr(err)
67+
}
68+
69+
return nil
70+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package github
2+
3+
import (
4+
"fmt"
5+
"testing"
6+
7+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
8+
)
9+
10+
func TestAccGithubEnterpriseSCIMGroupDataSource(t *testing.T) {
11+
t.Run("reads group without error", func(t *testing.T) {
12+
resource.Test(t, resource.TestCase{
13+
PreCheck: func() { skipUnlessEnterprise(t) },
14+
ProviderFactories: providerFactories,
15+
Steps: []resource.TestStep{{
16+
Config: fmt.Sprintf(`
17+
data "github_enterprise_scim_groups" "all" {
18+
enterprise = "%s"
19+
}
20+
21+
data "github_enterprise_scim_group" "test" {
22+
enterprise = "%[1]s"
23+
scim_group_id = data.github_enterprise_scim_groups.all.resources[0].id
24+
}
25+
`, testAccConf.enterpriseSlug),
26+
Check: resource.ComposeTestCheckFunc(
27+
resource.TestCheckResourceAttrSet("data.github_enterprise_scim_group.test", "id"),
28+
resource.TestCheckResourceAttrSet("data.github_enterprise_scim_group.test", "display_name"),
29+
resource.TestCheckResourceAttrSet("data.github_enterprise_scim_group.test", "schemas.#"),
30+
),
31+
}},
32+
})
33+
})
34+
}
Lines changed: 204 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,204 @@
1+
package github
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"net/url"
7+
8+
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
9+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
10+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
11+
)
12+
13+
func dataSourceGithubEnterpriseSCIMGroups() *schema.Resource {
14+
return &schema.Resource{
15+
Description: "Lookup SCIM groups provisioned for a GitHub enterprise.",
16+
ReadContext: dataSourceGithubEnterpriseSCIMGroupsRead,
17+
18+
Schema: map[string]*schema.Schema{
19+
"enterprise": {
20+
Description: "The enterprise slug.",
21+
Type: schema.TypeString,
22+
Required: true,
23+
},
24+
"filter": {
25+
Description: "Optional SCIM filter. See GitHub SCIM enterprise docs for supported filters.",
26+
Type: schema.TypeString,
27+
Optional: true,
28+
},
29+
"results_per_page": {
30+
Description: "Number of results per request (mapped to SCIM 'count'). Used while auto-fetching all pages.",
31+
Type: schema.TypeInt,
32+
Optional: true,
33+
Default: 100,
34+
ValidateFunc: validation.IntBetween(1, 100),
35+
},
36+
37+
"schemas": {
38+
Description: "SCIM response schemas.",
39+
Type: schema.TypeList,
40+
Computed: true,
41+
Elem: &schema.Schema{Type: schema.TypeString},
42+
},
43+
"total_results": {
44+
Description: "The total number of results returned by the SCIM endpoint.",
45+
Type: schema.TypeInt,
46+
Computed: true,
47+
},
48+
"start_index": {
49+
Description: "The startIndex from the first SCIM page.",
50+
Type: schema.TypeInt,
51+
Computed: true,
52+
},
53+
"items_per_page": {
54+
Description: "The itemsPerPage from the first SCIM page.",
55+
Type: schema.TypeInt,
56+
Computed: true,
57+
},
58+
"resources": {
59+
Description: "All SCIM groups.",
60+
Type: schema.TypeList,
61+
Computed: true,
62+
Elem: &schema.Resource{
63+
Schema: enterpriseSCIMGroupSchema(),
64+
},
65+
},
66+
},
67+
}
68+
}
69+
70+
func dataSourceGithubEnterpriseSCIMGroupsRead(ctx context.Context, d *schema.ResourceData, meta any) diag.Diagnostics {
71+
client := meta.(*Owner).v3client
72+
73+
enterprise := d.Get("enterprise").(string)
74+
filter := d.Get("filter").(string)
75+
count := d.Get("results_per_page").(int)
76+
77+
groups, first, err := enterpriseSCIMListAllGroups(ctx, client, enterprise, filter, count)
78+
if err != nil {
79+
return diag.FromErr(err)
80+
}
81+
82+
flat := make([]any, 0, len(groups))
83+
for _, g := range groups {
84+
flat = append(flat, flattenEnterpriseSCIMGroup(g))
85+
}
86+
87+
id := fmt.Sprintf("%s/scim-groups", enterprise)
88+
if filter != "" {
89+
id = fmt.Sprintf("%s?filter=%s", id, url.QueryEscape(filter))
90+
}
91+
92+
d.SetId(id)
93+
94+
if err := d.Set("schemas", first.Schemas); err != nil {
95+
return diag.FromErr(err)
96+
}
97+
if first.TotalResults != nil {
98+
if err := d.Set("total_results", *first.TotalResults); err != nil {
99+
return diag.FromErr(err)
100+
}
101+
}
102+
startIndex := 1
103+
if first.StartIndex != nil && *first.StartIndex > 0 {
104+
startIndex = *first.StartIndex
105+
}
106+
if err := d.Set("start_index", startIndex); err != nil {
107+
return diag.FromErr(err)
108+
}
109+
itemsPerPage := count
110+
if first.ItemsPerPage != nil && *first.ItemsPerPage > 0 {
111+
itemsPerPage = *first.ItemsPerPage
112+
}
113+
if err := d.Set("items_per_page", itemsPerPage); err != nil {
114+
return diag.FromErr(err)
115+
}
116+
if err := d.Set("resources", flat); err != nil {
117+
return diag.FromErr(err)
118+
}
119+
120+
return nil
121+
}
122+
123+
func enterpriseSCIMMetaSchema() map[string]*schema.Schema {
124+
return map[string]*schema.Schema{
125+
"resource_type": {
126+
Type: schema.TypeString,
127+
Computed: true,
128+
Description: "The SCIM resource type.",
129+
},
130+
"created": {
131+
Type: schema.TypeString,
132+
Computed: true,
133+
Description: "The creation timestamp.",
134+
},
135+
"last_modified": {
136+
Type: schema.TypeString,
137+
Computed: true,
138+
Description: "The lastModified timestamp.",
139+
},
140+
"location": {
141+
Type: schema.TypeString,
142+
Computed: true,
143+
Description: "The resource location.",
144+
},
145+
}
146+
}
147+
148+
func enterpriseSCIMGroupSchema() map[string]*schema.Schema {
149+
return map[string]*schema.Schema{
150+
"schemas": {
151+
Type: schema.TypeList,
152+
Computed: true,
153+
Description: "SCIM schemas for this group.",
154+
Elem: &schema.Schema{Type: schema.TypeString},
155+
},
156+
"id": {
157+
Type: schema.TypeString,
158+
Computed: true,
159+
Description: "The SCIM group ID.",
160+
},
161+
"external_id": {
162+
Type: schema.TypeString,
163+
Computed: true,
164+
Description: "The external ID for the group.",
165+
},
166+
"display_name": {
167+
Type: schema.TypeString,
168+
Computed: true,
169+
Description: "The SCIM group displayName.",
170+
},
171+
"members": {
172+
Type: schema.TypeList,
173+
Computed: true,
174+
Description: "Group members.",
175+
Elem: &schema.Resource{Schema: enterpriseSCIMGroupMemberSchema()},
176+
},
177+
"meta": {
178+
Type: schema.TypeList,
179+
Computed: true,
180+
Description: "Resource metadata.",
181+
Elem: &schema.Resource{Schema: enterpriseSCIMMetaSchema()},
182+
},
183+
}
184+
}
185+
186+
func enterpriseSCIMGroupMemberSchema() map[string]*schema.Schema {
187+
return map[string]*schema.Schema{
188+
"value": {
189+
Type: schema.TypeString,
190+
Computed: true,
191+
Description: "Member identifier.",
192+
},
193+
"ref": {
194+
Type: schema.TypeString,
195+
Computed: true,
196+
Description: "Member reference URL.",
197+
},
198+
"display_name": {
199+
Type: schema.TypeString,
200+
Computed: true,
201+
Description: "Member display name.",
202+
},
203+
}
204+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package github
2+
3+
import (
4+
"fmt"
5+
"testing"
6+
7+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
8+
)
9+
10+
func TestAccGithubEnterpriseSCIMGroupsDataSource(t *testing.T) {
11+
t.Run("lists groups without error", func(t *testing.T) {
12+
resource.Test(t, resource.TestCase{
13+
PreCheck: func() { skipUnlessEnterprise(t) },
14+
ProviderFactories: providerFactories,
15+
Steps: []resource.TestStep{{
16+
Config: fmt.Sprintf(`
17+
data "github_enterprise_scim_groups" "test" {
18+
enterprise = "%s"
19+
}
20+
`, testAccConf.enterpriseSlug),
21+
Check: resource.ComposeTestCheckFunc(
22+
resource.TestCheckResourceAttrSet("data.github_enterprise_scim_groups.test", "id"),
23+
resource.TestCheckResourceAttrSet("data.github_enterprise_scim_groups.test", "total_results"),
24+
resource.TestCheckResourceAttrSet("data.github_enterprise_scim_groups.test", "schemas.#"),
25+
resource.TestCheckResourceAttrSet("data.github_enterprise_scim_groups.test", "resources.#"),
26+
),
27+
}},
28+
})
29+
})
30+
}

0 commit comments

Comments
 (0)