From 51f1146d1d250eb91de7e38dedc7a4f13aa93276 Mon Sep 17 00:00:00 2001 From: Gavin Bunney Date: Tue, 15 Oct 2019 11:44:33 -0700 Subject: [PATCH] Added resource `bitbucketserver_project_hook` and cleaned up delete handling of permission resources --- bitbucket/provider.go | 1 + .../resource_global_permissions_group.go | 6 +- bitbucket/resource_global_permissions_user.go | 6 +- bitbucket/resource_project_hook.go | 118 ++++++++++++++++++ bitbucket/resource_project_hook_test.go | 40 ++++++ .../resource_project_permissions_group.go | 6 +- .../resource_project_permissions_user.go | 6 +- .../resource_repository_permissions_group.go | 6 +- .../resource_repository_permissions_user.go | 6 +- docusaurus/docs/resource_project_hook.md | 21 ++++ docusaurus/website/i18n/en.json | 3 + docusaurus/website/sidebars.json | 1 + 12 files changed, 190 insertions(+), 30 deletions(-) create mode 100644 bitbucket/resource_project_hook.go create mode 100644 bitbucket/resource_project_hook_test.go create mode 100644 docusaurus/docs/resource_project_hook.md diff --git a/bitbucket/provider.go b/bitbucket/provider.go index df30a6d..0f8139f 100644 --- a/bitbucket/provider.go +++ b/bitbucket/provider.go @@ -52,6 +52,7 @@ func Provider() terraform.ResourceProvider { "bitbucketserver_mail_server": resourceMailServer(), "bitbucketserver_plugin": resourcePlugin(), "bitbucketserver_project": resourceProject(), + "bitbucketserver_project_hook": resourceProjectHook(), "bitbucketserver_project_permissions_group": resourceProjectPermissionsGroup(), "bitbucketserver_project_permissions_user": resourceProjectPermissionsUser(), "bitbucketserver_repository": resourceRepository(), diff --git a/bitbucket/resource_global_permissions_group.go b/bitbucket/resource_global_permissions_group.go index 0c80779..e0c8392 100644 --- a/bitbucket/resource_global_permissions_group.go +++ b/bitbucket/resource_global_permissions_group.go @@ -85,9 +85,5 @@ func resourceGlobalPermissionsGroupDelete(d *schema.ResourceData, m interface{}) url.QueryEscape(d.Get("group").(string)), )) - if err != nil { - return err - } - - return resourceGlobalPermissionsGroupRead(d, m) + return err } diff --git a/bitbucket/resource_global_permissions_user.go b/bitbucket/resource_global_permissions_user.go index 3adaba2..b185f92 100644 --- a/bitbucket/resource_global_permissions_user.go +++ b/bitbucket/resource_global_permissions_user.go @@ -85,9 +85,5 @@ func resourceGlobalPermissionsUserDelete(d *schema.ResourceData, m interface{}) url.QueryEscape(d.Get("user").(string)), )) - if err != nil { - return err - } - - return resourceGlobalPermissionsUserRead(d, m) + return err } diff --git a/bitbucket/resource_project_hook.go b/bitbucket/resource_project_hook.go new file mode 100644 index 0000000..478b354 --- /dev/null +++ b/bitbucket/resource_project_hook.go @@ -0,0 +1,118 @@ +package bitbucket + +import ( + "bytes" + "encoding/json" + "fmt" + "github.com/hashicorp/terraform/helper/schema" + "strings" +) + +func resourceProjectHook() *schema.Resource { + return &schema.Resource{ + Create: resourceProjectHookCreate, + Update: resourceProjectHookUpdate, + Read: resourceProjectHookRead, + Delete: resourceProjectHookDelete, + Importer: &schema.ResourceImporter{ + State: schema.ImportStatePassthrough, + }, + + Schema: map[string]*schema.Schema{ + "project": { + Type: schema.TypeString, + Required: true, + ForceNew: true, + }, + "hook": { + Type: schema.TypeString, + Required: true, + ForceNew: true, + }, + "settings": { + Type: schema.TypeMap, + Optional: true, + }, + }, + } +} + +func resourceProjectHookUpdate(d *schema.ResourceData, m interface{}) error { + client := m.(*BitbucketServerProvider).BitbucketClient + + project := d.Get("project").(string) + hook := d.Get("hook").(string) + settings := d.Get("settings").(map[string]interface{}) + + settingsJson, err := json.Marshal(settings) + if err != nil { + return err + } + + _, err = client.Put(fmt.Sprintf("/rest/api/1.0/projects/%s/settings/hooks/%s/enabled", + project, + hook, + ), bytes.NewBuffer(settingsJson)) + + if err != nil { + return err + } + + return resourceProjectHookRead(d, m) +} + +func resourceProjectHookCreate(d *schema.ResourceData, m interface{}) error { + err := resourceProjectHookUpdate(d, m) + if err != nil { + return err + } + + d.SetId(fmt.Sprintf("%s/%s", d.Get("project").(string), d.Get("hook").(string))) + return resourceProjectHookRead(d, m) +} + +func resourceProjectHookRead(d *schema.ResourceData, m interface{}) error { + id := d.Id() + if id != "" { + parts := strings.Split(id, "/") + if len(parts) == 2 { + d.Set("project", parts[0]) + d.Set("hook", parts[1]) + } else { + return fmt.Errorf("incorrect ID format, should match `project/hook`") + } + } + + project := d.Get("project").(string) + hook := d.Get("hook").(string) + + client := m.(*BitbucketServerProvider).BitbucketClient + resp, err := client.Get(fmt.Sprintf("/rest/api/1.0/projects/%s/settings/hooks/%s/settings", + project, + hook, + )) + + if err != nil { + return err + } + + var settings map[string]interface{} + decoder := json.NewDecoder(resp.Body) + err = decoder.Decode(&settings) + if err != nil { + return err + } + + _ = d.Set("settings", settings) + + return nil +} + +func resourceProjectHookDelete(d *schema.ResourceData, m interface{}) error { + client := m.(*BitbucketServerProvider).BitbucketClient + _, err := client.Delete(fmt.Sprintf("/rest/api/1.0/projects/%s/settings/hooks/%s/enabled", + d.Get("project").(string), + d.Get("hook").(string))) + + return err +} diff --git a/bitbucket/resource_project_hook_test.go b/bitbucket/resource_project_hook_test.go new file mode 100644 index 0000000..35a8c3e --- /dev/null +++ b/bitbucket/resource_project_hook_test.go @@ -0,0 +1,40 @@ +package bitbucket + +import ( + "fmt" + "math/rand" + "testing" + "time" + + "github.com/hashicorp/terraform/helper/resource" +) + +func TestAccBitbucketResourceProjectHook_simple(t *testing.T) { + projectKey := fmt.Sprintf("TEST%v", rand.New(rand.NewSource(time.Now().UnixNano())).Int()) + + config := fmt.Sprintf(` + resource "bitbucketserver_project" "test" { + key = "%v" + name = "test-project-%v" + } + + resource "bitbucketserver_project_hook" "test" { + project = bitbucketserver_project.test.key + hook = "com.atlassian.bitbucket.server.bitbucket-bundled-hooks:force-push-hook" + } + `, projectKey, projectKey) + resource.Test(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + Steps: []resource.TestStep{ + { + Config: config, + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttr("bitbucketserver_project_hook.test", "project", projectKey), + resource.TestCheckResourceAttr("bitbucketserver_project_hook.test", "hook", "com.atlassian.bitbucket.server.bitbucket-bundled-hooks:force-push-hook"), + resource.TestCheckResourceAttr("bitbucketserver_project_hook.test", "settings.%", "0"), + ), + }, + }, + }) +} diff --git a/bitbucket/resource_project_permissions_group.go b/bitbucket/resource_project_permissions_group.go index 61b601c..31c0d8f 100644 --- a/bitbucket/resource_project_permissions_group.go +++ b/bitbucket/resource_project_permissions_group.go @@ -99,9 +99,5 @@ func resourceProjectPermissionsGroupDelete(d *schema.ResourceData, m interface{} url.QueryEscape(d.Get("group").(string)), )) - if err != nil { - return err - } - - return resourceProjectPermissionsGroupRead(d, m) + return err } diff --git a/bitbucket/resource_project_permissions_user.go b/bitbucket/resource_project_permissions_user.go index ae37883..0dc83fa 100644 --- a/bitbucket/resource_project_permissions_user.go +++ b/bitbucket/resource_project_permissions_user.go @@ -99,9 +99,5 @@ func resourceProjectPermissionsUserDelete(d *schema.ResourceData, m interface{}) url.QueryEscape(d.Get("user").(string)), )) - if err != nil { - return err - } - - return resourceProjectPermissionsUserRead(d, m) + return err } diff --git a/bitbucket/resource_repository_permissions_group.go b/bitbucket/resource_repository_permissions_group.go index ce44289..68a5062 100644 --- a/bitbucket/resource_repository_permissions_group.go +++ b/bitbucket/resource_repository_permissions_group.go @@ -107,9 +107,5 @@ func resourceRepositoryPermissionsGroupDelete(d *schema.ResourceData, m interfac url.QueryEscape(d.Get("group").(string)), )) - if err != nil { - return err - } - - return resourceRepositoryPermissionsGroupRead(d, m) + return err } diff --git a/bitbucket/resource_repository_permissions_user.go b/bitbucket/resource_repository_permissions_user.go index d2432b5..52c0082 100644 --- a/bitbucket/resource_repository_permissions_user.go +++ b/bitbucket/resource_repository_permissions_user.go @@ -107,9 +107,5 @@ func resourceRepositoryPermissionsUserDelete(d *schema.ResourceData, m interface url.QueryEscape(d.Get("user").(string)), )) - if err != nil { - return err - } - - return resourceRepositoryPermissionsUserRead(d, m) + return err } diff --git a/docusaurus/docs/resource_project_hook.md b/docusaurus/docs/resource_project_hook.md new file mode 100644 index 0000000..bf7ec19 --- /dev/null +++ b/docusaurus/docs/resource_project_hook.md @@ -0,0 +1,21 @@ +--- +id: bitbucketserver_project_hook +title: bitbucketserver_project_hook +--- + +Manage a project level hook. Extends what Bitbucket does every time a repository changes, for example when code is pushed or a pull request is merged. + +## Example Usage + +```hcl +resource "bitbucketserver_project_hook" "main" { + project = "MYPROJ" + hook = "com.atlassian.bitbucket.server.bitbucket-bundled-hooks:force-push-hook" +} +``` + +## Argument Reference + +* `project` - Required. Project Key the hook to enable is for. +* `hook` - Required. The hook to enable on the project. +* `settings` - Optional. Map of values to apply as settings for the hook. Contents dependant on the individual hook settings. diff --git a/docusaurus/website/i18n/en.json b/docusaurus/website/i18n/en.json index e191bed..5d2412c 100644 --- a/docusaurus/website/i18n/en.json +++ b/docusaurus/website/i18n/en.json @@ -64,6 +64,9 @@ "bitbucketserver_plugin": { "title": "bitbucketserver_plugin" }, + "bitbucketserver_project_hook": { + "title": "bitbucketserver_project_hook" + }, "bitbucketserver_project_permissions_group": { "title": "bitbucketserver_project_permissions_group" }, diff --git a/docusaurus/website/sidebars.json b/docusaurus/website/sidebars.json index d978dbc..4a4475c 100755 --- a/docusaurus/website/sidebars.json +++ b/docusaurus/website/sidebars.json @@ -26,6 +26,7 @@ "bitbucketserver_mail_server", "bitbucketserver_plugin", "bitbucketserver_project", + "bitbucketserver_project_hook", "bitbucketserver_project_permissions_group", "bitbucketserver_project_permissions_user", "bitbucketserver_repository",