Skip to content

Commit 67dda09

Browse files
authored
feat: Adding summary_only field to the organization data source (#2326)
1 parent ced7639 commit 67dda09

File tree

3 files changed

+154
-80
lines changed

3 files changed

+154
-80
lines changed

github/data_source_github_organization.go

Lines changed: 88 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,11 @@ func dataSourceGithubOrganization() *schema.Resource {
139139
Type: schema.TypeBool,
140140
Computed: true,
141141
},
142+
"summary_only": {
143+
Type: schema.TypeBool,
144+
Optional: true,
145+
Default: false,
146+
},
142147
},
143148
}
144149
}
@@ -165,75 +170,100 @@ func dataSourceGithubOrganizationRead(d *schema.ResourceData, meta interface{})
165170
ListOptions: github.ListOptions{PerPage: 100, Page: 1},
166171
}
167172

168-
var repoList []string
169-
var allRepos []*github.Repository
173+
summaryOnly := d.Get("summary_only").(bool)
174+
if !summaryOnly {
175+
var repoList []string
176+
var allRepos []*github.Repository
170177

171-
for {
172-
repos, resp, err := client3.Repositories.ListByOrg(ctx, name, opts)
173-
if err != nil {
174-
return err
175-
}
176-
allRepos = append(allRepos, repos...)
178+
for {
179+
repos, resp, err := client3.Repositories.ListByOrg(ctx, name, opts)
180+
if err != nil {
181+
return err
182+
}
183+
allRepos = append(allRepos, repos...)
177184

178-
opts.Page = resp.NextPage
185+
opts.Page = resp.NextPage
179186

180-
if resp.NextPage == 0 {
181-
break
187+
if resp.NextPage == 0 {
188+
break
189+
}
182190
}
183-
}
184191

185-
ignoreArchiveRepos := d.Get("ignore_archived_repos").(bool)
186-
for index := range allRepos {
187-
repo := allRepos[index]
188-
if ignoreArchiveRepos && repo.GetArchived() {
189-
continue
190-
}
192+
ignoreArchiveRepos := d.Get("ignore_archived_repos").(bool)
193+
for index := range allRepos {
194+
repo := allRepos[index]
195+
if ignoreArchiveRepos && repo.GetArchived() {
196+
continue
197+
}
191198

192-
repoList = append(repoList, repo.GetFullName())
193-
}
199+
repoList = append(repoList, repo.GetFullName())
200+
}
194201

195-
var query struct {
196-
Organization struct {
197-
MembersWithRole struct {
198-
Edges []struct {
199-
Role githubv4.String
200-
Node struct {
201-
Id githubv4.String
202-
Login githubv4.String
203-
Email githubv4.String
202+
var query struct {
203+
Organization struct {
204+
MembersWithRole struct {
205+
Edges []struct {
206+
Role githubv4.String
207+
Node struct {
208+
Id githubv4.String
209+
Login githubv4.String
210+
Email githubv4.String
211+
}
204212
}
205-
}
206-
PageInfo struct {
207-
EndCursor githubv4.String
208-
HasNextPage bool
209-
}
210-
} `graphql:"membersWithRole(first: 100, after: $after)"`
211-
} `graphql:"organization(login: $login)"`
212-
}
213-
variables := map[string]interface{}{
214-
"login": githubv4.String(name),
215-
"after": (*githubv4.String)(nil),
216-
}
217-
var members []string
218-
var users []map[string]string
219-
for {
220-
err := client4.Query(ctx, &query, variables)
221-
if err != nil {
222-
return err
213+
PageInfo struct {
214+
EndCursor githubv4.String
215+
HasNextPage bool
216+
}
217+
} `graphql:"membersWithRole(first: 100, after: $after)"`
218+
} `graphql:"organization(login: $login)"`
223219
}
224-
for _, edge := range query.Organization.MembersWithRole.Edges {
225-
members = append(members, string(edge.Node.Login))
226-
users = append(users, map[string]string{
227-
"id": string(edge.Node.Id),
228-
"login": string(edge.Node.Login),
229-
"email": string(edge.Node.Email),
230-
"role": string(edge.Role),
231-
})
220+
variables := map[string]interface{}{
221+
"login": githubv4.String(name),
222+
"after": (*githubv4.String)(nil),
232223
}
233-
if !query.Organization.MembersWithRole.PageInfo.HasNextPage {
234-
break
224+
var members []string
225+
var users []map[string]string
226+
for {
227+
err := client4.Query(ctx, &query, variables)
228+
if err != nil {
229+
return err
230+
}
231+
for _, edge := range query.Organization.MembersWithRole.Edges {
232+
members = append(members, string(edge.Node.Login))
233+
users = append(users, map[string]string{
234+
"id": string(edge.Node.Id),
235+
"login": string(edge.Node.Login),
236+
"email": string(edge.Node.Email),
237+
"role": string(edge.Role),
238+
})
239+
}
240+
if !query.Organization.MembersWithRole.PageInfo.HasNextPage {
241+
break
242+
}
243+
variables["after"] = githubv4.NewString(query.Organization.MembersWithRole.PageInfo.EndCursor)
235244
}
236-
variables["after"] = githubv4.NewString(query.Organization.MembersWithRole.PageInfo.EndCursor)
245+
246+
d.Set("repositories", repoList)
247+
d.Set("members", members)
248+
d.Set("users", users)
249+
d.Set("two_factor_requirement_enabled", organization.GetTwoFactorRequirementEnabled())
250+
d.Set("default_repository_permission", organization.GetDefaultRepoPermission())
251+
d.Set("members_can_create_repositories", organization.GetMembersCanCreateRepos())
252+
d.Set("members_allowed_repository_creation_type", organization.GetMembersAllowedRepositoryCreationType())
253+
d.Set("members_can_create_public_repositories", organization.GetMembersCanCreatePublicRepos())
254+
d.Set("members_can_create_private_repositories", organization.GetMembersCanCreatePrivateRepos())
255+
d.Set("members_can_create_internal_repositories", organization.GetMembersCanCreateInternalRepos())
256+
d.Set("members_can_fork_private_repositories", organization.GetMembersCanCreatePrivateRepos())
257+
d.Set("web_commit_signoff_required", organization.GetWebCommitSignoffRequired())
258+
d.Set("members_can_create_pages", organization.GetMembersCanCreatePages())
259+
d.Set("members_can_create_public_pages", organization.GetMembersCanCreatePublicPages())
260+
d.Set("members_can_create_private_pages", organization.GetMembersCanCreatePrivatePages())
261+
d.Set("advanced_security_enabled_for_new_repositories", organization.GetAdvancedSecurityEnabledForNewRepos())
262+
d.Set("dependabot_alerts_enabled_for_new_repositories", organization.GetDependabotAlertsEnabledForNewRepos())
263+
d.Set("dependabot_security_updates_enabled_for_new_repositories", organization.GetDependabotSecurityUpdatesEnabledForNewRepos())
264+
d.Set("dependency_graph_enabled_for_new_repositories", organization.GetDependencyGraphEnabledForNewRepos())
265+
d.Set("secret_scanning_enabled_for_new_repositories", organization.GetSecretScanningEnabledForNewRepos())
266+
d.Set("secret_scanning_push_protection_enabled_for_new_repositories", organization.GetSecretScanningPushProtectionEnabledForNewRepos())
237267
}
238268

239269
d.SetId(strconv.FormatInt(organization.GetID(), 10))
@@ -243,27 +273,6 @@ func dataSourceGithubOrganizationRead(d *schema.ResourceData, meta interface{})
243273
d.Set("node_id", organization.GetNodeID())
244274
d.Set("description", organization.GetDescription())
245275
d.Set("plan", planName)
246-
d.Set("repositories", repoList)
247-
d.Set("members", members)
248-
d.Set("users", users)
249-
d.Set("two_factor_requirement_enabled", organization.GetTwoFactorRequirementEnabled())
250-
d.Set("default_repository_permission", organization.GetDefaultRepoPermission())
251-
d.Set("members_can_create_repositories", organization.GetMembersCanCreateRepos())
252-
d.Set("members_allowed_repository_creation_type", organization.GetMembersAllowedRepositoryCreationType())
253-
d.Set("members_can_create_public_repositories", organization.GetMembersCanCreatePublicRepos())
254-
d.Set("members_can_create_private_repositories", organization.GetMembersCanCreatePrivateRepos())
255-
d.Set("members_can_create_internal_repositories", organization.GetMembersCanCreateInternalRepos())
256-
d.Set("members_can_fork_private_repositories", organization.GetMembersCanCreatePrivateRepos())
257-
d.Set("web_commit_signoff_required", organization.GetWebCommitSignoffRequired())
258-
d.Set("members_can_create_pages", organization.GetMembersCanCreatePages())
259-
d.Set("members_can_create_public_pages", organization.GetMembersCanCreatePublicPages())
260-
d.Set("members_can_create_private_pages", organization.GetMembersCanCreatePrivatePages())
261-
d.Set("advanced_security_enabled_for_new_repositories", organization.GetAdvancedSecurityEnabledForNewRepos())
262-
d.Set("dependabot_alerts_enabled_for_new_repositories", organization.GetDependabotAlertsEnabledForNewRepos())
263-
d.Set("dependabot_security_updates_enabled_for_new_repositories", organization.GetDependabotSecurityUpdatesEnabledForNewRepos())
264-
d.Set("dependency_graph_enabled_for_new_repositories", organization.GetDependencyGraphEnabledForNewRepos())
265-
d.Set("secret_scanning_enabled_for_new_repositories", organization.GetSecretScanningEnabledForNewRepos())
266-
d.Set("secret_scanning_push_protection_enabled_for_new_repositories", organization.GetSecretScanningPushProtectionEnabledForNewRepos())
267276

268277
return nil
269278
}

github/data_source_github_organization_test.go

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,4 +138,68 @@ func TestAccGithubOrganizationDataSource(t *testing.T) {
138138

139139
})
140140

141+
t.Run("queries for an organization summary_only without error", func(t *testing.T) {
142+
143+
config := fmt.Sprintf(`
144+
data "github_organization" "test" {
145+
name = "%s"
146+
summary_only = true
147+
}
148+
`, testOrganization)
149+
150+
check := resource.ComposeTestCheckFunc(
151+
resource.TestCheckResourceAttr("data.github_organization.test", "login", testOrganization),
152+
resource.TestCheckResourceAttrSet("data.github_organization.test", "name"),
153+
resource.TestCheckResourceAttrSet("data.github_organization.test", "orgname"),
154+
resource.TestCheckResourceAttrSet("data.github_organization.test", "node_id"),
155+
resource.TestCheckResourceAttrSet("data.github_organization.test", "description"),
156+
resource.TestCheckResourceAttrSet("data.github_organization.test", "plan"),
157+
resource.TestCheckNoResourceAttr("data.github_organization.test", "repositories.#"),
158+
resource.TestCheckNoResourceAttr("data.github_organization.test", "members.#"),
159+
resource.TestCheckNoResourceAttr("data.github_organization.test", "two_factor_requirement_enabled"),
160+
resource.TestCheckNoResourceAttr("data.github_organization.test", "default_repository_permission"),
161+
resource.TestCheckNoResourceAttr("data.github_organization.test", "members_can_create_repositories"),
162+
resource.TestCheckNoResourceAttr("data.github_organization.test", "members_allowed_repository_creation_type"),
163+
resource.TestCheckNoResourceAttr("data.github_organization.test", "members_can_create_public_repositories"),
164+
resource.TestCheckNoResourceAttr("data.github_organization.test", "members_can_create_private_repositories"),
165+
resource.TestCheckNoResourceAttr("data.github_organization.test", "members_can_create_internal_repositories"),
166+
resource.TestCheckNoResourceAttr("data.github_organization.test", "members_can_fork_private_repositories"),
167+
resource.TestCheckNoResourceAttr("data.github_organization.test", "web_commit_signoff_required"),
168+
resource.TestCheckNoResourceAttr("data.github_organization.test", "members_can_create_pages"),
169+
resource.TestCheckNoResourceAttr("data.github_organization.test", "members_can_create_public_pages"),
170+
resource.TestCheckNoResourceAttr("data.github_organization.test", "members_can_create_private_pages"),
171+
resource.TestCheckNoResourceAttr("data.github_organization.test", "advanced_security_enabled_for_new_repositories"),
172+
resource.TestCheckNoResourceAttr("data.github_organization.test", "dependabot_alerts_enabled_for_new_repositories"),
173+
resource.TestCheckNoResourceAttr("data.github_organization.test", "dependabot_security_updates_enabled_for_new_repositories"),
174+
resource.TestCheckNoResourceAttr("data.github_organization.test", "dependency_graph_enabled_for_new_repositories"),
175+
resource.TestCheckNoResourceAttr("data.github_organization.test", "secret_scanning_enabled_for_new_repositories"),
176+
resource.TestCheckNoResourceAttr("data.github_organization.test", "secret_scanning_push_protection_enabled_for_new_repositories"),
177+
)
178+
179+
testCase := func(t *testing.T, mode string) {
180+
resource.Test(t, resource.TestCase{
181+
PreCheck: func() { skipUnlessMode(t, mode) },
182+
Providers: testAccProviders,
183+
Steps: []resource.TestStep{
184+
{
185+
Config: config,
186+
Check: check,
187+
},
188+
},
189+
})
190+
}
191+
192+
t.Run("with an anonymous account", func(t *testing.T) {
193+
t.Skip("anonymous account not supported for this operation")
194+
})
195+
196+
t.Run("with an individual account", func(t *testing.T) {
197+
testCase(t, individual)
198+
})
199+
200+
t.Run("with an organization account", func(t *testing.T) {
201+
testCase(t, organization)
202+
})
203+
204+
})
141205
}

website/docs/d/organization.html.markdown

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ data "github_organization" "example" {
2020
## Argument Reference
2121

2222
* `name` - (Required) The name of the organization.
23-
* `ignore_archived_repos` - (Optional) Whether or not to include archived repos in the `repositories` list.
23+
* `ignore_archived_repos` - (Optional) Whether or not to include archived repos in the `repositories` list. Defaults to `false`.
24+
* `summary_only` - (Optional) Exclude the repos, members and other attributes from the returned result. Defaults to `false`.
2425

2526
## Attributes Reference
2627

0 commit comments

Comments
 (0)