diff --git a/github/data_source_github_organization_teams.go b/github/data_source_github_organization_teams.go index 2bbac579ee..1cca0feb3c 100644 --- a/github/data_source_github_organization_teams.go +++ b/github/data_source_github_organization_teams.go @@ -50,6 +50,11 @@ func dataSourceGithubOrganizationTeams() *schema.Resource { Computed: true, Elem: &schema.Schema{Type: schema.TypeString}, }, + "repositories": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Schema{Type: schema.TypeString}, + }, }, }, }, @@ -127,6 +132,16 @@ func flattenGitHubTeams(tq TeamsQuery) []interface{} { t["members"] = flatMembers + repositories := team.Repositories.Nodes + + flatRepositories := make([]string, len(repositories)) + + for i, repository := range repositories { + flatRepositories[i] = string(repository.Name) + } + + t["repositories"] = flatRepositories + flatTeams[i] = t } diff --git a/github/data_source_github_team.go b/github/data_source_github_team.go index 22878e0f10..c89d591c76 100644 --- a/github/data_source_github_team.go +++ b/github/data_source_github_team.go @@ -2,10 +2,11 @@ package github import ( "context" - "github.com/google/go-github/v35/github" "log" "strconv" + "github.com/google/go-github/v35/github" + "github.com/hashicorp/terraform-plugin-sdk/helper/schema" ) @@ -39,6 +40,11 @@ func dataSourceGithubTeam() *schema.Resource { Computed: true, Elem: &schema.Schema{Type: schema.TypeString}, }, + "repositories": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Schema{Type: schema.TypeString}, + }, "node_id": { Type: schema.TypeString, Computed: true, @@ -83,9 +89,27 @@ func dataSourceGithubTeamRead(d *schema.ResourceData, meta interface{}) error { options.Page = resp.NextPage } + var repositories []string + for { + repository, resp, err := client.Teams.ListTeamReposByID(ctx, orgId, team.GetID(), &options.ListOptions) + if err != nil { + return err + } + + for _, v := range repository { + repositories = append(repositories, v.GetName()) + } + + if resp.NextPage == 0 { + break + } + options.Page = resp.NextPage + } + d.SetId(strconv.FormatInt(team.GetID(), 10)) d.Set("name", team.GetName()) d.Set("members", members) + d.Set("repositories", repositories) d.Set("description", team.GetDescription()) d.Set("privacy", team.GetPrivacy()) d.Set("permission", team.GetPermission()) diff --git a/github/data_source_github_team_repository_test.go b/github/data_source_github_team_repository_test.go new file mode 100644 index 0000000000..e0a47ac950 --- /dev/null +++ b/github/data_source_github_team_repository_test.go @@ -0,0 +1,71 @@ +package github + +import ( + "fmt" + "testing" + + "github.com/hashicorp/terraform-plugin-sdk/helper/acctest" + "github.com/hashicorp/terraform-plugin-sdk/helper/resource" +) + +func TestAccGithubTeamRepositories(t *testing.T) { + + randomID := acctest.RandStringFromCharSet(5, acctest.CharSetAlphaNum) + + t.Run("Get Repositories By Teams", func(t *testing.T) { + + config := fmt.Sprintf(` + + resource "github_repository" "test" { + name = "tf-acc-test-%s" + auto_init = true + } + + resource "github_team" "test" { + name = "tf-acc-test-%[1]s" + } + + resource "github_team_repository" "test" { + team_id = "${github_team.test.id}" + repository = "${github_repository.test.name}" + } + + data "github_team" "example" { + depends_on = ["github_repository.test", "github_team.test", "github_team_repository.test"] + slug = github_team.test.slug + } + `, randomID) + + check := resource.ComposeAggregateTestCheckFunc( + resource.TestCheckResourceAttr("data.github_team.example", "repositories.#", "1"), + ) + + testCase := func(t *testing.T, mode string) { + resource.Test(t, resource.TestCase{ + PreCheck: func() { skipUnlessMode(t, mode) }, + Providers: testAccProviders, + Steps: []resource.TestStep{ + { + Config: config, + Check: check, + ExpectNonEmptyPlan: true, + }, + }, + }) + } + + t.Run("with an anonymous account", func(t *testing.T) { + t.Skip("anonymous account not supported for this operation") + }) + + t.Run("with an individual account", func(t *testing.T) { + t.Skip("individual account not supported for this operation") + }) + + t.Run("with an organization account", func(t *testing.T) { + testCase(t, organization) + }) + + }) + +} diff --git a/github/util_v4_teams.go b/github/util_v4_teams.go index dba6f98829..87c20c86c2 100644 --- a/github/util_v4_teams.go +++ b/github/util_v4_teams.go @@ -18,6 +18,11 @@ type TeamsQuery struct { Login githubv4.String } } + Repositories struct { + Nodes []struct { + Name githubv4.String + } + } } PageInfo PageInfo } `graphql:"teams(first:$first, after:$cursor, rootTeamsOnly:$rootTeamsOnly)"` diff --git a/website/docs/d/organization_teams.html.markdown b/website/docs/d/organization_teams.html.markdown index 266670c6d5..ad51be75c2 100644 --- a/website/docs/d/organization_teams.html.markdown +++ b/website/docs/d/organization_teams.html.markdown @@ -40,3 +40,4 @@ The `team` block consists of: * `description` - the team's description. * `privacy` - the team's privacy type. * `members` - List of team members. + * `repositories` - List of team repositories. diff --git a/website/docs/d/team.html.markdown b/website/docs/d/team.html.markdown index bfe2d1b1ff..a5f348de2c 100644 --- a/website/docs/d/team.html.markdown +++ b/website/docs/d/team.html.markdown @@ -30,3 +30,5 @@ data "github_team" "example" { * `privacy` - the team's privacy type. * `permission` - the team's permission level. * `members` - List of team members + * `repositories` - List of team repositories +