providers/github/teams.go (107 lines of code) (raw):

// Copyright 2018 The Terraformer Authors. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package github import ( "context" "log" "strconv" "github.com/GoogleCloudPlatform/terraformer/terraformutils" githubAPI "github.com/google/go-github/v35/github" ) type TeamsGenerator struct { GithubService } func (g *TeamsGenerator) createTeamsResources(ctx context.Context, teams []*githubAPI.Team, client *githubAPI.Client) []terraformutils.Resource { resources := []terraformutils.Resource{} for _, team := range teams { resource := terraformutils.NewSimpleResource( strconv.FormatInt(team.GetID(), 10), team.GetName(), "github_team", "github", []string{}, ) resource.SlowQueryRequired = true resources = append(resources, resource) resources = append(resources, g.createTeamMembersResources(ctx, team, client)...) resources = append(resources, g.createTeamRepositoriesResources(ctx, team, client)...) } return resources } func (g *TeamsGenerator) createTeamMembersResources(ctx context.Context, team *githubAPI.Team, client *githubAPI.Client) []terraformutils.Resource { resources := []terraformutils.Resource{} members, _, err := client.Teams.ListTeamMembersBySlug(ctx, g.Args["owner"].(string), team.GetSlug(), nil) if err != nil { log.Println(err) } for _, member := range members { resources = append(resources, terraformutils.NewSimpleResource( strconv.FormatInt(team.GetID(), 10)+":"+member.GetLogin(), team.GetName()+"_"+member.GetLogin(), "github_team_membership", "github", []string{}, )) } return resources } func (g *TeamsGenerator) createTeamRepositoriesResources(ctx context.Context, team *githubAPI.Team, client *githubAPI.Client) []terraformutils.Resource { resources := []terraformutils.Resource{} repos, _, err := client.Teams.ListTeamReposBySlug(ctx, g.Args["owner"].(string), team.GetSlug(), nil) if err != nil { log.Println(err) } for _, repo := range repos { resources = append(resources, terraformutils.NewSimpleResource( strconv.FormatInt(team.GetID(), 10)+":"+repo.GetName(), team.GetName()+"_"+repo.GetName(), "github_team_repository", "github", []string{}, )) } return resources } // InitResources generates TerraformResources from Github API, func (g *TeamsGenerator) InitResources() error { ctx := context.Background() client, err := g.createClient() if err != nil { return err } opt := &githubAPI.ListOptions{PerPage: 1} for { teams, resp, err := client.Teams.ListTeams(ctx, g.Args["owner"].(string), opt) if err != nil { log.Println(err) return nil } g.Resources = append(g.Resources, g.createTeamsResources(ctx, teams, client)...) if resp.NextPage == 0 { break } opt.Page = resp.NextPage } return nil } // PostConvertHook for connect between team and members func (g *TeamsGenerator) PostConvertHook() error { for _, team := range g.Resources { if team.InstanceInfo.Type != "github_team" { continue } for i, member := range g.Resources { if member.InstanceInfo.Type != "github_team_membership" { continue } if member.InstanceState.Attributes["team_id"] == team.InstanceState.Attributes["id"] { g.Resources[i].Item["team_id"] = "${github_team." + team.ResourceName + ".id}" } } for i, repo := range g.Resources { if repo.InstanceInfo.Type != "github_team_repository" { continue } if repo.InstanceState.Attributes["team_id"] == team.InstanceState.Attributes["id"] { g.Resources[i].Item["team_id"] = "${github_team." + team.ResourceName + ".id}" } } } return nil }