providers/gitlab/group.go (101 lines of code) (raw):
// Copyright 2020 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 gitlab
import (
"context"
"fmt"
"log"
"strconv"
"strings"
"github.com/GoogleCloudPlatform/terraformer/terraformutils"
"github.com/xanzy/go-gitlab"
)
type GroupGenerator struct {
GitLabService
}
// Generate TerraformResources from gitlab API,
func (g *GroupGenerator) InitResources() error {
ctx := context.Background()
client, err := g.createClient()
if err != nil {
return err
}
group := g.Args["group"].(string)
g.Resources = append(g.Resources, createGroups(ctx, client, group)...)
return nil
}
func createGroups(ctx context.Context, client *gitlab.Client, groupID string) []terraformutils.Resource {
resources := []terraformutils.Resource{}
group, _, err := client.Groups.GetGroup(groupID, gitlab.WithContext(ctx))
if err != nil {
log.Println(err)
return nil
}
resource := terraformutils.NewSimpleResource(
strconv.FormatInt(int64(group.ID), 10),
getGroupResourceName(group),
"gitlab_group",
"gitlab",
[]string{},
)
// NOTE: mirror fields from API doesn't match with the ones from terraform provider
resource.IgnoreKeys = []string{"mirror_trigger_builds", "only_mirror_protected_branches", "mirror", "mirror_overwrites_diverged_branches"}
resource.SlowQueryRequired = true
resources = append(resources, resource)
resources = append(resources, createGroupVariables(ctx, client, group)...)
resources = append(resources, createGroupMembership(ctx, client, group)...)
return resources
}
func createGroupVariables(ctx context.Context, client *gitlab.Client, group *gitlab.Group) []terraformutils.Resource {
resources := []terraformutils.Resource{}
opt := &gitlab.ListGroupVariablesOptions{}
for {
groupVariables, resp, err := client.GroupVariables.ListVariables(group.ID, opt, gitlab.WithContext(ctx))
if err != nil {
log.Println(err)
return nil
}
for _, groupVariable := range groupVariables {
resource := terraformutils.NewSimpleResource(
fmt.Sprintf("%d:%s:%s", group.ID, groupVariable.Key, groupVariable.EnvironmentScope),
fmt.Sprintf("%s___%s___%s", getGroupResourceName(group), groupVariable.Key, groupVariable.EnvironmentScope),
"gitlab_group_variable",
"gitlab",
[]string{},
)
resource.SlowQueryRequired = true
resources = append(resources, resource)
}
if resp.NextPage == 0 {
break
}
opt.Page = resp.NextPage
}
return resources
}
func createGroupMembership(ctx context.Context, client *gitlab.Client, group *gitlab.Group) []terraformutils.Resource {
resources := []terraformutils.Resource{}
opt := &gitlab.ListGroupMembersOptions{}
for {
groupMembers, resp, err := client.Groups.ListGroupMembers(group.ID, opt, gitlab.WithContext(ctx))
if err != nil {
log.Println(err)
return nil
}
for _, groupMember := range groupMembers {
resource := terraformutils.NewSimpleResource(
fmt.Sprintf("%d:%d", group.ID, groupMember.ID),
fmt.Sprintf("%s___%s", getGroupResourceName(group), groupMember.Username),
"gitlab_group_membership",
"gitlab",
[]string{},
)
resource.SlowQueryRequired = true
resources = append(resources, resource)
}
if resp.NextPage == 0 {
break
}
opt.Page = resp.NextPage
}
return resources
}
func getGroupResourceName(group *gitlab.Group) string {
return fmt.Sprintf("%d___%s", group.ID, strings.ReplaceAll(group.FullPath, "/", "__"))
}