From 69092ae19a44fc27bf447c04d77b323519b15ee7 Mon Sep 17 00:00:00 2001 From: Gavin Bunney Date: Wed, 9 Oct 2019 14:30:31 -0700 Subject: [PATCH] Added `data.bitbucketserver_project_groups` --- README.md | 12 ++++ bitbucket/data_project_groups.go | 97 +++++++++++++++++++++++++++ bitbucket/data_project_groups_test.go | 36 ++++++++++ bitbucket/provider.go | 1 + 4 files changed, 146 insertions(+) create mode 100644 bitbucket/data_project_groups.go create mode 100644 bitbucket/data_project_groups_test.go diff --git a/README.md b/README.md index 4fd59ce..9d476b8 100644 --- a/README.md +++ b/README.md @@ -173,6 +173,18 @@ data "bitbucketserver_application_properties" "main" {} * `build_date` - Date the Bitbucket build was made, * `display_name` - Name of the Bitbucket instance. +### Application Properties + +```hcl +data "bitbucketserver_project_groups" "proj" { + project = "TEST" +} +``` + +#### Attributes + +* `groups` - List of maps containing `name` and `permission` keys. + --- ## Development Guide diff --git a/bitbucket/data_project_groups.go b/bitbucket/data_project_groups.go new file mode 100644 index 0000000..b67bbd5 --- /dev/null +++ b/bitbucket/data_project_groups.go @@ -0,0 +1,97 @@ +package bitbucket + +import ( + "encoding/json" + "fmt" + "github.com/hashicorp/terraform/helper/schema" +) + +type ProjectGroup struct { + Group struct { + Name string `json:"name,omitempty"` + } `json:"group,omitempty"` + Permission string `json:"permission,omitempty"` +} + +type PaginatedProjectGroups struct { + Values []ProjectGroup `json:"values,omitempty"` + Size int `json:"size,omitempty"` + Limit int `json:"limit,omitempty"` + IsLastPage bool `json:"isLastPage,omitempty"` + Start int `json:"start,omitempty"` + NextPageStart int `json:"nextPageStart,omitempty"` +} + +func dataSourceProjectGroups() *schema.Resource { + return &schema.Resource{ + Read: dataSourceProjectGroupsRead, + + Schema: map[string]*schema.Schema{ + "project": { + Type: schema.TypeString, + Required: true, + }, + "groups": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "name": { + Type: schema.TypeString, + Computed: true, + }, + "permission": { + Type: schema.TypeString, + Computed: true, + }, + }, + }, + }, + }, + } +} + +func dataSourceProjectGroupsRead(d *schema.ResourceData, m interface{}) error { + client := m.(*BitbucketClient) + + resourceURL := fmt.Sprintf("/rest/api/1.0/projects/%s/permissions/groups", + d.Get("project").(string), + ) + + var projectGroups PaginatedProjectGroups + var terraformGroups []interface{} + + for { + reviewersResponse, err := client.Get(resourceURL) + if err != nil { + return err + } + + decoder := json.NewDecoder(reviewersResponse.Body) + err = decoder.Decode(&projectGroups) + if err != nil { + return err + } + + for _, group := range projectGroups.Values { + g := make(map[string]interface{}) + g["name"] = group.Group.Name + g["permission"] = group.Permission + terraformGroups = append(terraformGroups, g) + } + + if projectGroups.IsLastPage == false { + resourceURL = fmt.Sprintf("/rest/api/1.0/projects/%s/permissions/groups?start=%d", + d.Get("project").(string), + projectGroups.NextPageStart, + ) + projectGroups = PaginatedProjectGroups{} + } else { + break + } + } + + d.SetId(d.Get("project").(string)) + d.Set("groups", terraformGroups) + return nil +} diff --git a/bitbucket/data_project_groups_test.go b/bitbucket/data_project_groups_test.go new file mode 100644 index 0000000..cf49a6b --- /dev/null +++ b/bitbucket/data_project_groups_test.go @@ -0,0 +1,36 @@ +package bitbucket + +import ( + "fmt" + "math/rand" + "testing" + "time" + + "github.com/hashicorp/terraform/helper/resource" +) + +func TestAccBitbucketDatProjectGroups_check_empty(t *testing.T) { + config := fmt.Sprintf(` + resource "bitbucketserver_project" "test" { + key = "TEST%v" + name = "test-repo-for-repository-test" + } + + data "bitbucketserver_project_groups" "test" { + project = bitbucketserver_project.test.key + } + `, rand.New(rand.NewSource(time.Now().UnixNano())).Int()) + + resource.Test(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + Steps: []resource.TestStep{ + { + Config: config, + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttr("data.bitbucketserver_project_groups.test", "groups.#", "0"), + ), + }, + }, + }) +} diff --git a/bitbucket/provider.go b/bitbucket/provider.go index b85286d..731af41 100644 --- a/bitbucket/provider.go +++ b/bitbucket/provider.go @@ -30,6 +30,7 @@ func Provider() terraform.ResourceProvider { ConfigureFunc: providerConfigure, DataSourcesMap: map[string]*schema.Resource{ "bitbucketserver_application_properties": dataSourceApplicationProperties(), + "bitbucketserver_project_groups": dataSourceProjectGroups(), }, ResourcesMap: map[string]*schema.Resource{ "bitbucketserver_admin_license": resourceAdminLicense(),