From bd9ddff0cc587aa12afe7a823da8929143f75681 Mon Sep 17 00:00:00 2001 From: Colin Wood Date: Tue, 28 Jun 2016 19:28:49 -0700 Subject: [PATCH 1/9] Bitbucket provider for terraform --- builtin/bins/provider-bitbucket/main.go | 12 + builtin/providers/bitbucket/client.go | 65 +++++ builtin/providers/bitbucket/provider.go | 38 +++ .../bitbucket/resource_default_reviewers.go | 114 ++++++++ builtin/providers/bitbucket/resource_hook.go | 206 +++++++++++++++ .../bitbucket/resource_repository.go | 247 ++++++++++++++++++ command/internal_plugin_list.go | 4 +- 7 files changed, 685 insertions(+), 1 deletion(-) create mode 100644 builtin/bins/provider-bitbucket/main.go create mode 100644 builtin/providers/bitbucket/client.go create mode 100644 builtin/providers/bitbucket/provider.go create mode 100644 builtin/providers/bitbucket/resource_default_reviewers.go create mode 100644 builtin/providers/bitbucket/resource_hook.go create mode 100644 builtin/providers/bitbucket/resource_repository.go diff --git a/builtin/bins/provider-bitbucket/main.go b/builtin/bins/provider-bitbucket/main.go new file mode 100644 index 000000000..222d12e4e --- /dev/null +++ b/builtin/bins/provider-bitbucket/main.go @@ -0,0 +1,12 @@ +package main + +import ( + "github.com/hashicorp/terraform/builtin/providers/bitbucket" + "github.com/hashicorp/terraform/plugin" +) + +func main() { + plugin.Serve(&plugin.ServeOpts{ + ProviderFunc: bitbucket.Provider, + }) +} diff --git a/builtin/providers/bitbucket/client.go b/builtin/providers/bitbucket/client.go new file mode 100644 index 000000000..02b9ed0db --- /dev/null +++ b/builtin/providers/bitbucket/client.go @@ -0,0 +1,65 @@ +package bitbucket + +import ( + "bytes" + "net/http" +) + +type BitbucketClient struct { + Username string + Password string +} + +func (c *BitbucketClient) Get(endpoint string) (*http.Response, error) { + client := &http.Client{} + req, err := http.NewRequest("GET", "https://api.bitbucket.org/"+endpoint, nil) + if err != nil { + return nil, err + } + + req.SetBasicAuth(c.Username, c.Password) + return client.Do(req) + +} + +func (c *BitbucketClient) Post(endpoint string, jsonpayload *bytes.Buffer) (*http.Response, error) { + client := &http.Client{} + req, err := http.NewRequest("POST", "https://api.bitbucket.org/"+endpoint, jsonpayload) + if err != nil { + return nil, err + } + req.SetBasicAuth(c.Username, c.Password) + req.Header.Add("content-type", "application/json") + return client.Do(req) +} + +func (c *BitbucketClient) Put(endpoint string, jsonpayload *bytes.Buffer) (*http.Response, error) { + client := &http.Client{} + req, err := http.NewRequest("PUT", "https://api.bitbucket.org/"+endpoint, jsonpayload) + if err != nil { + return nil, err + } + req.SetBasicAuth(c.Username, c.Password) + req.Header.Add("content-type", "application/json") + return client.Do(req) +} + +func (c *BitbucketClient) PutOnly(endpoint string) (*http.Response, error) { + client := &http.Client{} + req, err := http.NewRequest("PUT", "https://api.bitbucket.org/"+endpoint, nil) + if err != nil { + return nil, err + } + req.SetBasicAuth(c.Username, c.Password) + return client.Do(req) +} + +func (c *BitbucketClient) Delete(endpoint string) (*http.Response, error) { + client := &http.Client{} + req, err := http.NewRequest("DELETE", "https://api.bitbucket.org/"+endpoint, nil) + if err != nil { + return nil, err + } + req.SetBasicAuth(c.Username, c.Password) + return client.Do(req) +} diff --git a/builtin/providers/bitbucket/provider.go b/builtin/providers/bitbucket/provider.go new file mode 100644 index 000000000..afeb71249 --- /dev/null +++ b/builtin/providers/bitbucket/provider.go @@ -0,0 +1,38 @@ +package bitbucket + +import ( + "github.com/hashicorp/terraform/helper/schema" + "github.com/hashicorp/terraform/terraform" +) + +func Provider() terraform.ResourceProvider { + return &schema.Provider{ + Schema: map[string]*schema.Schema{ + "username": { + Required: true, + Type: schema.TypeString, + DefaultFunc: schema.EnvDefaultFunc("BITBUCKET_USERNAME", nil), + }, + "password": { + Type: schema.TypeString, + Required: true, + DefaultFunc: schema.EnvDefaultFunc("BITBUCKET_PASSWORD", nil), + }, + }, + ConfigureFunc: providerConfigure, + ResourcesMap: map[string]*schema.Resource{ + "bitbucket_hook": resourceHook(), + "bitbucket_default_reviewers": resourceDefaultReviewers(), + "bitbucket_repository": resourceRepository(), + }, + } +} + +func providerConfigure(d *schema.ResourceData) (interface{}, error) { + client := &BitbucketClient{ + Username: d.Get("username").(string), + Password: d.Get("password").(string), + } + + return client, nil +} diff --git a/builtin/providers/bitbucket/resource_default_reviewers.go b/builtin/providers/bitbucket/resource_default_reviewers.go new file mode 100644 index 000000000..c2522b8fd --- /dev/null +++ b/builtin/providers/bitbucket/resource_default_reviewers.go @@ -0,0 +1,114 @@ +package bitbucket + +import ( + "encoding/json" + "fmt" + "github.com/hashicorp/terraform/helper/schema" +) + +type Reviewer struct { + DisplayName string `json:"display_name,omitempty"` + UUID string `json:"uuid,omitempty"` + Username string `json:"username,omitempty"` + Type string `json:"type,omitempty"` +} + +type PaginatedReviewers struct { + Values []Reviewer `json:"values,omitempty"` +} + +func resourceDefaultReviewers() *schema.Resource { + return &schema.Resource{ + Create: resourceDefaultReviewersCreate, + Read: resourceDefaultReviewersRead, + Update: resourceDefaultReviewersUpdate, + Delete: resourceDefaultReviewersDelete, + + Schema: map[string]*schema.Schema{ + "username": { + Type: schema.TypeString, + Required: true, + }, + "repository": { + Type: schema.TypeString, + Required: true, + }, + "reviewers": { + Type: schema.TypeSet, + Elem: &schema.Schema{Type: schema.TypeString}, + Required: true, + Set: schema.HashString, + ForceNew: true, + }, + }, + } +} + +func resourceDefaultReviewersCreate(d *schema.ResourceData, m interface{}) error { + client := m.(*BitbucketClient) + + for _, user := range d.Get("reviewers").(*schema.Set).List() { + reviewer_resp, err := client.PutOnly(fmt.Sprintf("2.0/repositories/%s/%s/default-reviewers/%s", + d.Get("username").(string), + d.Get("repository").(string), + user, + )) + + if err != nil { + return err + } + + if reviewer_resp.StatusCode != 201 { + return fmt.Errorf("Failed to create reviewer %s got code %d", user.(string), reviewer_resp.StatusCode) + } + + defer reviewer_resp.Body.Close() + } + + d.SetId(fmt.Sprintf("%s/%s/reviewers", d.Get("username").(string), d.Get("repository").(string))) + return resourceDefaultReviewersRead(d, m) +} +func resourceDefaultReviewersRead(d *schema.ResourceData, m interface{}) error { + client := m.(*BitbucketClient) + + reviewers_response, err := client.Get(fmt.Sprintf("2.0/repositories/%s/%s/default-reviewers", + d.Get("username").(string), + d.Get("repository").(string), + )) + + var reviewers PaginatedReviewers + decoder := json.NewDecoder(reviewers_response.Body) + err = decoder.Decode(&reviewers) + if err != nil { + return err + } + + terraform_reviewers := make([]string, 0, len(reviewers.Values)) + + for _, reviewer := range reviewers.Values { + terraform_reviewers = append(terraform_reviewers, reviewer.Username) + } + + d.Set("reviewers", terraform_reviewers) + + return nil +} +func resourceDefaultReviewersUpdate(d *schema.ResourceData, m interface{}) error { + return nil +} +func resourceDefaultReviewersDelete(d *schema.ResourceData, m interface{}) error { + client := m.(*BitbucketClient) + + for _, user := range d.Get("reviewers").(*schema.Set).List() { + _, err := client.Delete(fmt.Sprintf("2.0/repositories/%s/%s/default-reviewers/%s", + d.Get("username").(string), + d.Get("repository").(string), + user, + )) + + if err != nil { + return err + } + } + return nil +} diff --git a/builtin/providers/bitbucket/resource_hook.go b/builtin/providers/bitbucket/resource_hook.go new file mode 100644 index 000000000..d1f439782 --- /dev/null +++ b/builtin/providers/bitbucket/resource_hook.go @@ -0,0 +1,206 @@ +package bitbucket + +import ( + "bytes" + "encoding/json" + "fmt" + "github.com/hashicorp/terraform/helper/schema" +) + +type Hook struct { + Uuid string `json:"uuid,omitempty"` + Url string `json:"url,omitempty"` + Description string `json:"description,omitempty"` + Active bool `json:"active,omitempty"` + Events []string `json:"events,omitempty"` +} + +func resourceHook() *schema.Resource { + return &schema.Resource{ + Create: resourceHookCreate, + Read: resourceHookRead, + Update: resourceHookUpdate, + Delete: resourceHookDelete, + Exists: resourceHookExists, + + Schema: map[string]*schema.Schema{ + "username": &schema.Schema{ + Type: schema.TypeString, + Required: true, + }, + "repository": &schema.Schema{ + Type: schema.TypeString, + Required: true, + }, + "active": &schema.Schema{ + Type: schema.TypeBool, + Optional: true, + Default: true, + }, + "url": &schema.Schema{ + Type: schema.TypeString, + Required: true, + }, + "uuid": &schema.Schema{ + Type: schema.TypeString, + Computed: true, + }, + "description": &schema.Schema{ + Type: schema.TypeString, + Required: true, + }, + "events": &schema.Schema{ + Type: schema.TypeSet, + Required: true, + Elem: &schema.Schema{Type: schema.TypeString}, + Set: schema.HashString, + }, + }, + } +} + +func createHook(d *schema.ResourceData) *Hook { + + events := make([]string, 0, len(d.Get("events").(*schema.Set).List())) + + for _, item := range d.Get("events").(*schema.Set).List() { + events = append(events, item.(string)) + } + + return &Hook{ + Url: d.Get("url").(string), + Description: d.Get("description").(string), + Active: d.Get("active").(bool), + Events: events, + } +} + +func resourceHookCreate(d *schema.ResourceData, m interface{}) error { + client := m.(*BitbucketClient) + hook := createHook(d) + + var jsonbuffer []byte + + jsonpayload := bytes.NewBuffer(jsonbuffer) + enc := json.NewEncoder(jsonpayload) + enc.Encode(hook) + + hook_req, err := client.Post(fmt.Sprintf("2.0/repositories/%s/%s/hooks", + d.Get("username").(string), + d.Get("repository").(string), + ), jsonpayload) + + decoder := json.NewDecoder(hook_req.Body) + err = decoder.Decode(&hook) + if err != nil { + return err + } + + d.SetId(string(hook.Uuid)) + d.Set("uuid", string(hook.Uuid)) + + return resourceHookRead(d, m) +} +func resourceHookRead(d *schema.ResourceData, m interface{}) error { + client := m.(*BitbucketClient) + hook_req, err := client.Get(fmt.Sprintf("2.0/repositories/%s/%s/hooks/%s", + d.Get("username").(string), + d.Get("repository").(string), + d.Get("uuid").(string), + )) + + if err != nil { + return err + } + + var hook Hook + + decoder := json.NewDecoder(hook_req.Body) + err = decoder.Decode(&hook) + if err != nil { + return err + } + + d.Set("uuid", string(hook.Uuid)) + d.Set("description", string(hook.Description)) + d.Set("active", bool(hook.Active)) + d.Set("url", string(hook.Url)) + + eventsList := make([]string, 0, len(hook.Events)) + + for _, event := range hook.Events { + eventsList = append(eventsList, string(event)) + } + + d.Set("events", eventsList) + + return nil +} + +func resourceHookUpdate(d *schema.ResourceData, m interface{}) error { + client := m.(*BitbucketClient) + hook := createHook(d) + + var jsonbuffer []byte + + jsonpayload := bytes.NewBuffer(jsonbuffer) + enc := json.NewEncoder(jsonpayload) + enc.Encode(hook) + + hook_req, err := client.Put(fmt.Sprintf("2.0/repositories/%s/%s/hooks/%s", + d.Get("username").(string), + d.Get("repository").(string), + d.Get("uuid").(string), + ), jsonpayload) + + if err != nil { + return err + } + + decoder := json.NewDecoder(hook_req.Body) + err = decoder.Decode(&hook) + if err != nil { + return err + } + + return resourceHookRead(d, m) +} + +func resourceHookExists(d *schema.ResourceData, m interface{}) (bool, error) { + client := m.(*BitbucketClient) + if _, okay := d.GetOk("uuid"); okay { + hook_req, err := client.Get(fmt.Sprintf("2.0/repositories/%s/%s/hooks/%s", + d.Get("username").(string), + d.Get("repository").(string), + d.Get("uuid").(string), + )) + + if err != nil { + panic(err) + } + + if hook_req.StatusCode != 200 { + d.SetId("") + return false, nil + } + + return true, nil + } else { + return false, nil + } + +} + +func resourceHookDelete(d *schema.ResourceData, m interface{}) error { + client := m.(*BitbucketClient) + _, err := client.Delete(fmt.Sprintf("2.0/repositories/%s/%s/hooks/%s", + d.Get("username").(string), + d.Get("repository").(string), + d.Get("uuid").(string), + )) + + if err != nil { + return err + } + return nil +} diff --git a/builtin/providers/bitbucket/resource_repository.go b/builtin/providers/bitbucket/resource_repository.go new file mode 100644 index 000000000..13815d6fd --- /dev/null +++ b/builtin/providers/bitbucket/resource_repository.go @@ -0,0 +1,247 @@ +package bitbucket + +import ( + "bytes" + "encoding/json" + "fmt" + "github.com/hashicorp/terraform/helper/schema" + "log" +) + +type CloneUrl struct { + Href string `json:"href,omitempty"` + Name string `json:"name,omitempty"` +} + +type Repository struct { + SCM string `json:"scm,omitempty"` + HasWiki bool `json:"has_wiki,omitempty"` + HasIssues bool `json:"has_issues,omitempty"` + Website string `json:"website,omitempty"` + IsPrivate bool `json:"is_private,omitempty"` + ForkPolicy string `json:"fork_policy,omitempty"` + Language string `json:"language,omitempty"` + Description string `json:"description,omitempty"` + Name string `json:"name,omitempty"` + UUID string `json:"uuid,omitempty"` + Project struct { + Key string `json:"key,omitempty"` + } `json:"project,omitempty"` + Links struct { + Clone []CloneUrl `json:"clone,omitempty"` + } `json:"links,omitempty"` +} + +func resourceRepository() *schema.Resource { + return &schema.Resource{ + Create: resourceRepositoryCreate, + Update: resourceRepositoryUpdate, + Read: resourceRepositoryRead, + Delete: resourceRepositoryDelete, + Importer: &schema.ResourceImporter{ + State: schema.ImportStatePassthrough, + }, + + Schema: map[string]*schema.Schema{ + "scm": &schema.Schema{ + Type: schema.TypeString, + Optional: true, + Default: "git", + }, + "has_wiki": &schema.Schema{ + Type: schema.TypeBool, + Optional: true, + Default: false, + }, + "has_issues": &schema.Schema{ + Type: schema.TypeBool, + Optional: true, + Default: false, + }, + "website": &schema.Schema{ + Type: schema.TypeString, + Optional: true, + }, + "clone_ssh": &schema.Schema{ + Type: schema.TypeString, + Computed: true, + }, + "clone_https": &schema.Schema{ + Type: schema.TypeString, + Computed: true, + }, + "project_key": &schema.Schema{ + Type: schema.TypeString, + Optional: true, + }, + "is_private": &schema.Schema{ + Type: schema.TypeBool, + Optional: true, + Default: true, + }, + "fork_policy": &schema.Schema{ + Type: schema.TypeString, + Optional: true, + Default: "allow_forks", + }, + "language": &schema.Schema{ + Type: schema.TypeString, + Optional: true, + }, + "description": &schema.Schema{ + Type: schema.TypeString, + Optional: true, + }, + "owner": &schema.Schema{ + Type: schema.TypeString, + Required: true, + }, + "name": &schema.Schema{ + Type: schema.TypeString, + Required: true, + }, + }, + } +} + +func newRepositoryFromResource(d *schema.ResourceData) *Repository { + repo := &Repository{ + Name: d.Get("name").(string), + Language: d.Get("language").(string), + IsPrivate: d.Get("is_private").(bool), + Description: d.Get("description").(string), + ForkPolicy: d.Get("fork_policy").(string), + HasWiki: d.Get("has_wiki").(bool), + HasIssues: d.Get("has_issues").(bool), + SCM: d.Get("scm").(string), + Website: d.Get("website").(string), + } + + repo.Project.Key = d.Get("project_key").(string) + return repo +} + +func resourceRepositoryUpdate(d *schema.ResourceData, m interface{}) error { + client := m.(*BitbucketClient) + repository := newRepositoryFromResource(d) + + var jsonbuffer []byte + + jsonpayload := bytes.NewBuffer(jsonbuffer) + enc := json.NewEncoder(jsonpayload) + enc.Encode(repository) + + repository_response, err := client.Put(fmt.Sprintf("2.0/repositories/%s/%s", + d.Get("owner").(string), + d.Get("name").(string), + ), jsonpayload) + + if err != nil { + return err + } + + if repository_response.StatusCode == 200 { + decoder := json.NewDecoder(repository_response.Body) + err = decoder.Decode(&repository) + if err != nil { + return err + } + } else { + return fmt.Errorf("Failed to put: %d", repository_response.StatusCode) + } + + return resourceRepositoryRead(d, m) +} + +func resourceRepositoryCreate(d *schema.ResourceData, m interface{}) error { + client := m.(*BitbucketClient) + repo := newRepositoryFromResource(d) + + var jsonbuffer []byte + + jsonpayload := bytes.NewBuffer(jsonbuffer) + enc := json.NewEncoder(jsonpayload) + enc.Encode(repo) + + log.Printf("Sending %s \n", jsonpayload) + + repo_req, err := client.Post(fmt.Sprintf("2.0/repositories/%s/%s", + d.Get("owner").(string), + d.Get("name").(string), + ), jsonpayload) + + decoder := json.NewDecoder(repo_req.Body) + err = decoder.Decode(&repo) + if err != nil { + return err + } + + log.Printf("Received %s \n", repo_req.Body) + + if repo_req.StatusCode != 200 { + return fmt.Errorf("Failed to create repository got status code %d", repo_req.StatusCode) + } + + d.SetId(string(fmt.Sprintf("%s/%s", d.Get("owner").(string), d.Get("name").(string)))) + + return resourceRepositoryRead(d, m) +} +func resourceRepositoryRead(d *schema.ResourceData, m interface{}) error { + + client := m.(*BitbucketClient) + repo_req, err := client.Get(fmt.Sprintf("2.0/repositories/%s/%s", + d.Get("owner").(string), + d.Get("name").(string), + )) + + if err != nil { + return err + } + + var repo Repository + + decoder := json.NewDecoder(repo_req.Body) + err = decoder.Decode(&repo) + if err != nil { + return err + } + + d.Set("scm", string(repo.SCM)) + d.Set("is_private", bool(repo.IsPrivate)) + d.Set("has_wiki", bool(repo.HasWiki)) + d.Set("has_issues", bool(repo.HasIssues)) + d.Set("name", string(repo.Name)) + d.Set("language", string(repo.Language)) + d.Set("fork_policy", string(repo.ForkPolicy)) + d.Set("website", string(repo.Website)) + d.Set("description", string(repo.Description)) + d.Set("project_key", string(repo.Project.Key)) + + for _, clone_url := range repo.Links.Clone { + if clone_url.Name == "https" { + d.Set("clone_https", string(clone_url.Href)) + } else { + d.Set("clone_ssh", string(clone_url.Href)) + } + } + + return nil +} + +func resourceRepositoryDelete(d *schema.ResourceData, m interface{}) error { + client := m.(*BitbucketClient) + delete_response, err := client.Delete(fmt.Sprintf("2.0/repositories/%s/%s", + d.Get("owner").(string), + d.Get("name").(string), + )) + + if err != nil { + return err + } + + if delete_response.StatusCode != 204 { + return fmt.Errorf("Failed to delete the repository got status code %d", delete_response.StatusCode) + } + + return nil +} diff --git a/command/internal_plugin_list.go b/command/internal_plugin_list.go index e4807b799..d3e4f6b87 100644 --- a/command/internal_plugin_list.go +++ b/command/internal_plugin_list.go @@ -11,6 +11,7 @@ import ( awsprovider "github.com/hashicorp/terraform/builtin/providers/aws" azureprovider "github.com/hashicorp/terraform/builtin/providers/azure" azurermprovider "github.com/hashicorp/terraform/builtin/providers/azurerm" + bitbucketprovider "github.com/hashicorp/terraform/builtin/providers/bitbucket" chefprovider "github.com/hashicorp/terraform/builtin/providers/chef" clcprovider "github.com/hashicorp/terraform/builtin/providers/clc" cloudflareprovider "github.com/hashicorp/terraform/builtin/providers/cloudflare" @@ -61,10 +62,12 @@ import ( ) var InternalProviders = map[string]plugin.ProviderFunc{ + "archive": archiveprovider.Provider, "atlas": atlasprovider.Provider, "aws": awsprovider.Provider, "azure": azureprovider.Provider, "azurerm": azurermprovider.Provider, + "bitbucket": bitbucketprovider.Provider, "chef": chefprovider.Provider, "clc": clcprovider.Provider, "cloudflare": cloudflareprovider.Provider, @@ -105,7 +108,6 @@ var InternalProviders = map[string]plugin.ProviderFunc{ "ultradns": ultradnsprovider.Provider, "vcd": vcdprovider.Provider, "vsphere": vsphereprovider.Provider, - "archive": archiveprovider.Provider, } var InternalProvisioners = map[string]plugin.ProvisionerFunc{ From d1373208aa664851005261ba5363c9131dff2f3f Mon Sep 17 00:00:00 2001 From: Colin Wood Date: Mon, 8 Aug 2016 10:25:52 -0700 Subject: [PATCH 2/9] Setup docs for bitbucket provider. --- .../providers/bitbucket/index.html.markdown | 41 ++++++++++++++++ .../r/default_reviewers.html.markdown | 35 ++++++++++++++ .../providers/bitbucket/r/hook.html.markdown | 39 +++++++++++++++ .../bitbucket/r/repository.html.markdown | 48 +++++++++++++++++++ 4 files changed, 163 insertions(+) create mode 100644 website/source/docs/providers/bitbucket/index.html.markdown create mode 100644 website/source/docs/providers/bitbucket/r/default_reviewers.html.markdown create mode 100644 website/source/docs/providers/bitbucket/r/hook.html.markdown create mode 100644 website/source/docs/providers/bitbucket/r/repository.html.markdown diff --git a/website/source/docs/providers/bitbucket/index.html.markdown b/website/source/docs/providers/bitbucket/index.html.markdown new file mode 100644 index 000000000..5a9065848 --- /dev/null +++ b/website/source/docs/providers/bitbucket/index.html.markdown @@ -0,0 +1,41 @@ +--- +layout: "bitbucket" +page_title: "Provider: Bitbucket" +sidebar_current: "docs-bitbucket-index" +description: |- + The Bitbucket proivder to interact with repositories, projects, etc.. +--- + +# Bitbucket Provider + +The Bitbucket provider allows you to manage resources including repositories, +webhooks, and default reviewers. + +Use the navigation to the left to read about the available resources. + +## Example Usage + +``` +# Configure the Bitbucket Provider +provider "bitbucket" { + username = "GobBluthe" + password = "idoillusions" # you can also use app passwords +} + +resource "bitbucket_repsitory" "illusions" { + owner = "theleagueofmagicians" + name = "illussions" + scm = "hg" + is_private = true +} +``` + +## Argument Reference + +The following arguments are supported in the `provider` block: + +* `username` - (Required) Your username used to connect to bitbucket. You can + also set this via the environment variable. `BITBUCKET_USERNAME` + +* `username` - (Required) Your passowrd used to connect to bitbucket. You can + also set this via the environment variable. `BITBUCKET_PASSWORD` diff --git a/website/source/docs/providers/bitbucket/r/default_reviewers.html.markdown b/website/source/docs/providers/bitbucket/r/default_reviewers.html.markdown new file mode 100644 index 000000000..c8c8223af --- /dev/null +++ b/website/source/docs/providers/bitbucket/r/default_reviewers.html.markdown @@ -0,0 +1,35 @@ +--- +layout: "bitbucket" +page_title: "Bitbucket: bitbucket_default_reviewers" +sidebar_current: "docs-bitbucket-resource-default-reviewers" +description: |- + Provides support for setting up default reviews for bitbucket. +--- + +# bitbucket\_default_reviewers + +Provides support for setting up default reviewers for your repository. + +## Example Usage + +``` +# Manage your respository +resource "bitbucket_default_reviewers" "infastracture" { + username = "myteam" + repository = "terraform-code" + reviewers = [ + "gob", + "michael", + "michalejr" + ] +} +``` + +## Argument Reference + +The following arguments are supported: + +* `username` - (Required) The owner of this repository. Can be you or any team you + have write access to. +* `repository` - (Required) The name of the repository. +* `reviewers` - (Required) A list of reviewers to use. diff --git a/website/source/docs/providers/bitbucket/r/hook.html.markdown b/website/source/docs/providers/bitbucket/r/hook.html.markdown new file mode 100644 index 000000000..3ead6c42d --- /dev/null +++ b/website/source/docs/providers/bitbucket/r/hook.html.markdown @@ -0,0 +1,39 @@ +--- +layout: "bitbucket" +page_title: "Bitbucket: bitbucket_hoook" +sidebar_current: "docs-bitbucket-resource-hook" +description: |- + Provides a Bitbucket Webhook +--- + +# bitbucket\_hook + +Provides a Bitbucket hook resource. + +This allows you to manage your webhooks on a repository. + +## Example Usage + +``` +# Manage your respositories hooks +resource "bitbucket_hook" "deploy_on_push" { + username = "myteam" + repository = "terraform-code" + url = "https://mywebhookservice.mycompany.com/deploy-on-push" + description = "Deploy the code via my webhook" + events = [ + "repo:push" + ] +} +``` + +## Argument Reference + +The following arguments are supported: + +* `username` - (Required) The owner of this repository. Can be you or any team you + have write access to. +* `repository` - (Required) The name of the repository. +* `url` - (Required) Where to POST to. +* `description` - (Required) The name / description to show in the UI. +* `events` - (Required) The event you want to react on. diff --git a/website/source/docs/providers/bitbucket/r/repository.html.markdown b/website/source/docs/providers/bitbucket/r/repository.html.markdown new file mode 100644 index 000000000..8f11b0df8 --- /dev/null +++ b/website/source/docs/providers/bitbucket/r/repository.html.markdown @@ -0,0 +1,48 @@ +--- +layout: "bitbucket" +page_title: "Bitbucket: bitbucket_repository" +sidebar_current: "docs-bitbucket-resource-repository" +description: |- + Provides a Bitbucket Repository +--- + +# bitbucket\_repository + +Provides a Bitbucket repository resource. + +This resource allows you manage your repositories such as scm type, if it is +private, how to fork the repository and other options. + +## Example Usage + +``` +# Manage your respository +resource "bitbucket_repository" "infastracture" { + owner = "myteam" + name = "terraform-code" +} +``` + +## Argument Reference + +The following arguments are supported: + +* `owner` - (Required) The owner of this repository. Can be you or any team you + have write access to. +* `name` - (Optional) The name of the repository. +* `scm` - (Optional) What SCM you want to use. Valid options are hg or git. + Defaults to git. +* `is_private` - (Optional) If this should be private or not. Defaults to true. +* `website` - (Optional) What the website is for this repository. +* `has_issues` - (Optional) If this should have issues turned on or not. +* `has_wiki` - (Optional) If this should have wiki turned on or not. +* `project_key` - (Optional) If you want to have this repo associated with a + project. +* `fork_policy` - (Optional) What the fork policy should be. Defaults to + allow_forks. +* `description` - (Optional) What the description of the repo is. + +## Computed Arguments + +The following arguments are computed. You can access both `clone_ssh` and +`clone_https` for getting a clone URL. From c806e8f453e103d7ab3ff7bbb151cc42c50ea317 Mon Sep 17 00:00:00 2001 From: Colin Wood Date: Tue, 9 Aug 2016 09:47:28 -0700 Subject: [PATCH 3/9] Set to force true and remove update func --- builtin/providers/bitbucket/resource_default_reviewers.go | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/builtin/providers/bitbucket/resource_default_reviewers.go b/builtin/providers/bitbucket/resource_default_reviewers.go index c2522b8fd..9da9fb9ff 100644 --- a/builtin/providers/bitbucket/resource_default_reviewers.go +++ b/builtin/providers/bitbucket/resource_default_reviewers.go @@ -21,17 +21,18 @@ func resourceDefaultReviewers() *schema.Resource { return &schema.Resource{ Create: resourceDefaultReviewersCreate, Read: resourceDefaultReviewersRead, - Update: resourceDefaultReviewersUpdate, Delete: resourceDefaultReviewersDelete, Schema: map[string]*schema.Schema{ "username": { Type: schema.TypeString, Required: true, + ForceNew: true }, "repository": { Type: schema.TypeString, Required: true, + ForceNew: true }, "reviewers": { Type: schema.TypeSet, @@ -93,9 +94,6 @@ func resourceDefaultReviewersRead(d *schema.ResourceData, m interface{}) error { return nil } -func resourceDefaultReviewersUpdate(d *schema.ResourceData, m interface{}) error { - return nil -} func resourceDefaultReviewersDelete(d *schema.ResourceData, m interface{}) error { client := m.(*BitbucketClient) From af24ac9f47a7e3f8c220e3a4d7d50201c1403e80 Mon Sep 17 00:00:00 2001 From: Colin Wood Date: Tue, 9 Aug 2016 09:54:38 -0700 Subject: [PATCH 4/9] Fixes from PR --- builtin/providers/bitbucket/resource_default_reviewers.go | 4 ++-- builtin/providers/bitbucket/resource_hook.go | 6 ++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/builtin/providers/bitbucket/resource_default_reviewers.go b/builtin/providers/bitbucket/resource_default_reviewers.go index 9da9fb9ff..a157f0dce 100644 --- a/builtin/providers/bitbucket/resource_default_reviewers.go +++ b/builtin/providers/bitbucket/resource_default_reviewers.go @@ -27,12 +27,12 @@ func resourceDefaultReviewers() *schema.Resource { "username": { Type: schema.TypeString, Required: true, - ForceNew: true + ForceNew: true, }, "repository": { Type: schema.TypeString, Required: true, - ForceNew: true + ForceNew: true, }, "reviewers": { Type: schema.TypeSet, diff --git a/builtin/providers/bitbucket/resource_hook.go b/builtin/providers/bitbucket/resource_hook.go index d1f439782..978e5937a 100644 --- a/builtin/providers/bitbucket/resource_hook.go +++ b/builtin/providers/bitbucket/resource_hook.go @@ -27,10 +27,12 @@ func resourceHook() *schema.Resource { "username": &schema.Schema{ Type: schema.TypeString, Required: true, + ForceNew: true, }, "repository": &schema.Schema{ Type: schema.TypeString, Required: true, + ForceNew: true, }, "active": &schema.Schema{ Type: schema.TypeBool, @@ -96,8 +98,8 @@ func resourceHookCreate(d *schema.ResourceData, m interface{}) error { return err } - d.SetId(string(hook.Uuid)) - d.Set("uuid", string(hook.Uuid)) + d.SetId(hook.Uuid) + d.Set("uuid", hook.Uuid) return resourceHookRead(d, m) } From 32b5493e5796ad77b3582798dbdf889ab94dac37 Mon Sep 17 00:00:00 2001 From: Colin Wood Date: Thu, 8 Sep 2016 12:27:29 -0700 Subject: [PATCH 5/9] Initial Acceptence test for repository --- builtin/providers/bitbucket/provider_test.go | 39 ++++++++++++++ .../bitbucket/resource_repository_test.go | 53 +++++++++++++++++++ 2 files changed, 92 insertions(+) create mode 100644 builtin/providers/bitbucket/provider_test.go create mode 100644 builtin/providers/bitbucket/resource_repository_test.go diff --git a/builtin/providers/bitbucket/provider_test.go b/builtin/providers/bitbucket/provider_test.go new file mode 100644 index 000000000..647b3d8f7 --- /dev/null +++ b/builtin/providers/bitbucket/provider_test.go @@ -0,0 +1,39 @@ +package bitbucket + +import ( + "github.com/hashicorp/terraform/helper/schema" + "github.com/hashicorp/terraform/terraform" + "os" + "testing" +) + +const testRepo string = "test-repo" + +var testAccProviders map[string]terraform.ResourceProvider +var testAccProvider *schema.Provider + +func init() { + testAccProvider = Provider().(*schema.Provider) + testAccProviders = map[string]terraform.ResourceProvider{ + "bitbucket": testAccProvider, + } +} + +func TestProvider(t *testing.T) { + if err := Provider().(*schema.Provider).InternalValidate(); err != nil { + t.Fatalf("err: %s", err) + } +} + +func TestProvider_impl(t *testing.T) { + var _ terraform.ResourceProvider = Provider() +} + +func testAccPreCheck(t *testing.T) { + if v := os.Getenv("BITBUCKET_USERNAME"); v == "" { + t.Fatal("BITBUCKET_USERNAME must be set for acceptence tests") + } + if v := os.Getenv("BITBUCKET_PASSWORD"); v == "" { + t.Fatal("BITBUCKET_PASSWORD must be set for acceptence tests") + } +} diff --git a/builtin/providers/bitbucket/resource_repository_test.go b/builtin/providers/bitbucket/resource_repository_test.go new file mode 100644 index 000000000..5267f626d --- /dev/null +++ b/builtin/providers/bitbucket/resource_repository_test.go @@ -0,0 +1,53 @@ +package bitbucket + +import ( + "fmt" + "os" + "testing" + + "github.com/hashicorp/terraform/helper/resource" + "github.com/hashicorp/terraform/terraform" +) + +func TestAccBitbucketRepository_basic(t *testing.T) { + var repo Repository + + testUser := os.Getenv("BITBUCKET_USERNAME") + testAccBitbucketRepositoryConfig := fmt.Sprintf(` + resource "bitbucket_repository" "test_repo" { + owner = "%s" + name = "%s" + } + `, testUser, testRepo) + + resource.Test(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + CheckDestroy: testAccCheckBitbucketRepositoryDestroy, + Steps: []resource.TestStep{ + resource.TestStep{ + Config: testAccBitbucketRepositoryConfig, + Check: resource.ComposeTestCheckFunc( + testAccCheckBitbucketRepositoryExists("bitbucket_repository.test_repo", &repo), + ), + }, + }, + }) +} + +func testAccCheckBitbucketRepositoryDestroy(s *terraform.State) error { + return nil +} + +func testAccCheckBitbucketRepositoryExists(n string, repository *Repository) resource.TestCheckFunc { + return func(s *terraform.State) error { + rs, ok := s.RootModule().Resources[n] + if !ok { + return fmt.Errorf("Not found %s", n) + } + if rs.Primary.ID == "" { + return fmt.Errorf("No repository ID is set") + } + return nil + } +} From 60351421dae408cad066ebef634c672e59452833 Mon Sep 17 00:00:00 2001 From: Colin Wood Date: Thu, 8 Sep 2016 12:42:40 -0700 Subject: [PATCH 6/9] Test delition of repository --- .../bitbucket/resource_repository_test.go | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/builtin/providers/bitbucket/resource_repository_test.go b/builtin/providers/bitbucket/resource_repository_test.go index 5267f626d..47d4f4405 100644 --- a/builtin/providers/bitbucket/resource_repository_test.go +++ b/builtin/providers/bitbucket/resource_repository_test.go @@ -36,6 +36,22 @@ func TestAccBitbucketRepository_basic(t *testing.T) { } func testAccCheckBitbucketRepositoryDestroy(s *terraform.State) error { + client := testAccProvider.Meta().(*BitbucketClient) + rs, ok := s.RootModule().Resources["bitbucket_repository.test_repo"] + if !ok { + return fmt.Errorf("Not found %s", "bitbucket_repository.test_repo") + } + + response, err := client.Get(fmt.Sprintf("2.0/repositories/%s/%s", rs.Primary.Attributes["owner"], rs.Primary.Attributes["name"])) + + if err != nil { + return err + } + + if response.StatusCode != 404 { + return fmt.Errorf("Repository still exists") + } + return nil } From 9e85fdbd1d0a97c0745b0c8a3471e4f75059e32c Mon Sep 17 00:00:00 2001 From: Colin Wood Date: Thu, 8 Sep 2016 12:57:12 -0700 Subject: [PATCH 7/9] Initial acceptence test for hooks --- builtin/providers/bitbucket/resource_hook.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/builtin/providers/bitbucket/resource_hook.go b/builtin/providers/bitbucket/resource_hook.go index 978e5937a..ea3aa2267 100644 --- a/builtin/providers/bitbucket/resource_hook.go +++ b/builtin/providers/bitbucket/resource_hook.go @@ -24,7 +24,7 @@ func resourceHook() *schema.Resource { Exists: resourceHookExists, Schema: map[string]*schema.Schema{ - "username": &schema.Schema{ + "owner": &schema.Schema{ Type: schema.TypeString, Required: true, ForceNew: true, @@ -88,7 +88,7 @@ func resourceHookCreate(d *schema.ResourceData, m interface{}) error { enc.Encode(hook) hook_req, err := client.Post(fmt.Sprintf("2.0/repositories/%s/%s/hooks", - d.Get("username").(string), + d.Get("owner").(string), d.Get("repository").(string), ), jsonpayload) @@ -106,7 +106,7 @@ func resourceHookCreate(d *schema.ResourceData, m interface{}) error { func resourceHookRead(d *schema.ResourceData, m interface{}) error { client := m.(*BitbucketClient) hook_req, err := client.Get(fmt.Sprintf("2.0/repositories/%s/%s/hooks/%s", - d.Get("username").(string), + d.Get("owner").(string), d.Get("repository").(string), d.Get("uuid").(string), )) @@ -150,7 +150,7 @@ func resourceHookUpdate(d *schema.ResourceData, m interface{}) error { enc.Encode(hook) hook_req, err := client.Put(fmt.Sprintf("2.0/repositories/%s/%s/hooks/%s", - d.Get("username").(string), + d.Get("owner").(string), d.Get("repository").(string), d.Get("uuid").(string), ), jsonpayload) @@ -172,7 +172,7 @@ func resourceHookExists(d *schema.ResourceData, m interface{}) (bool, error) { client := m.(*BitbucketClient) if _, okay := d.GetOk("uuid"); okay { hook_req, err := client.Get(fmt.Sprintf("2.0/repositories/%s/%s/hooks/%s", - d.Get("username").(string), + d.Get("owner").(string), d.Get("repository").(string), d.Get("uuid").(string), )) @@ -196,7 +196,7 @@ func resourceHookExists(d *schema.ResourceData, m interface{}) (bool, error) { func resourceHookDelete(d *schema.ResourceData, m interface{}) error { client := m.(*BitbucketClient) _, err := client.Delete(fmt.Sprintf("2.0/repositories/%s/%s/hooks/%s", - d.Get("username").(string), + d.Get("owner").(string), d.Get("repository").(string), d.Get("uuid").(string), )) From 49f0c2e917a65eff7d78422a4073c0c0e5e46dc0 Mon Sep 17 00:00:00 2001 From: Colin Wood Date: Fri, 9 Sep 2016 12:09:07 -0700 Subject: [PATCH 8/9] Add acceptence test for default reviews and hook --- .../bitbucket/resource_default_reviewers.go | 25 ++++-- .../resource_default_reviewers_test.go | 67 ++++++++++++++++ .../providers/bitbucket/resource_hook_test.go | 78 +++++++++++++++++++ 3 files changed, 162 insertions(+), 8 deletions(-) create mode 100644 builtin/providers/bitbucket/resource_default_reviewers_test.go create mode 100644 builtin/providers/bitbucket/resource_hook_test.go diff --git a/builtin/providers/bitbucket/resource_default_reviewers.go b/builtin/providers/bitbucket/resource_default_reviewers.go index a157f0dce..37a0f5883 100644 --- a/builtin/providers/bitbucket/resource_default_reviewers.go +++ b/builtin/providers/bitbucket/resource_default_reviewers.go @@ -24,7 +24,7 @@ func resourceDefaultReviewers() *schema.Resource { Delete: resourceDefaultReviewersDelete, Schema: map[string]*schema.Schema{ - "username": { + "owner": { Type: schema.TypeString, Required: true, ForceNew: true, @@ -50,7 +50,7 @@ func resourceDefaultReviewersCreate(d *schema.ResourceData, m interface{}) error for _, user := range d.Get("reviewers").(*schema.Set).List() { reviewer_resp, err := client.PutOnly(fmt.Sprintf("2.0/repositories/%s/%s/default-reviewers/%s", - d.Get("username").(string), + d.Get("owner").(string), d.Get("repository").(string), user, )) @@ -59,25 +59,26 @@ func resourceDefaultReviewersCreate(d *schema.ResourceData, m interface{}) error return err } - if reviewer_resp.StatusCode != 201 { + if reviewer_resp.StatusCode != 200 { return fmt.Errorf("Failed to create reviewer %s got code %d", user.(string), reviewer_resp.StatusCode) } defer reviewer_resp.Body.Close() } - d.SetId(fmt.Sprintf("%s/%s/reviewers", d.Get("username").(string), d.Get("repository").(string))) + d.SetId(fmt.Sprintf("%s/%s/reviewers", d.Get("owner").(string), d.Get("repository").(string))) return resourceDefaultReviewersRead(d, m) } func resourceDefaultReviewersRead(d *schema.ResourceData, m interface{}) error { client := m.(*BitbucketClient) reviewers_response, err := client.Get(fmt.Sprintf("2.0/repositories/%s/%s/default-reviewers", - d.Get("username").(string), + d.Get("owner").(string), d.Get("repository").(string), )) var reviewers PaginatedReviewers + decoder := json.NewDecoder(reviewers_response.Body) err = decoder.Decode(&reviewers) if err != nil { @@ -98,15 +99,23 @@ func resourceDefaultReviewersDelete(d *schema.ResourceData, m interface{}) error client := m.(*BitbucketClient) for _, user := range d.Get("reviewers").(*schema.Set).List() { - _, err := client.Delete(fmt.Sprintf("2.0/repositories/%s/%s/default-reviewers/%s", - d.Get("username").(string), + resp, err := client.Delete(fmt.Sprintf("2.0/repositories/%s/%s/default-reviewers/%s", + d.Get("owner").(string), d.Get("repository").(string), - user, + user.(string), )) if err != nil { return err } + + if resp.StatusCode != 204 { + return fmt.Errorf("[%d] Could not delete %s from default reviewer", + resp.StatusCode, + user.(string), + ) + } + defer resp.Body.Close() } return nil } diff --git a/builtin/providers/bitbucket/resource_default_reviewers_test.go b/builtin/providers/bitbucket/resource_default_reviewers_test.go new file mode 100644 index 000000000..253911127 --- /dev/null +++ b/builtin/providers/bitbucket/resource_default_reviewers_test.go @@ -0,0 +1,67 @@ +package bitbucket + +import ( + "fmt" + "os" + "testing" + + "github.com/hashicorp/terraform/helper/resource" + "github.com/hashicorp/terraform/terraform" +) + +func TestAccBitbucketDefaultReviewers_basic(t *testing.T) { + + testUser := os.Getenv("BITBUCKET_USERNAME") + testAccBitbucketDefaultReviewersConfig := fmt.Sprintf(` + resource "bitbucket_repository" "test_repo" { + owner = "%s" + name = "test-repo-default-reviewers" + } + + resource "bitbucket_default_reviewers" "test_reviewers" { + owner = "%s" + repository = "${bitbucket_repository.test_repo.name}" + reviewers = [ + "%s", + ] + } + `, testUser, testUser, testUser) + + resource.Test(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + CheckDestroy: testAccCheckBitbucketDefaultReviewersDestroy, + Steps: []resource.TestStep{ + resource.TestStep{ + Config: testAccBitbucketDefaultReviewersConfig, + Check: resource.ComposeTestCheckFunc( + testAccCheckBitbucketDefaultReviewersExists("bitbucket_default_reviewers.test_reviewers"), + ), + }, + }, + }) +} + +func testAccCheckBitbucketDefaultReviewersDestroy(s *terraform.State) error { + _, ok := s.RootModule().Resources["bitbucket_default_reviewers.test_reviewers"] + if !ok { + return fmt.Errorf("Not found %s", "bitbucket_default_reviewers.test_reviewers") + } + return nil +} + +func testAccCheckBitbucketDefaultReviewersExists(n string) resource.TestCheckFunc { + return func(s *terraform.State) error { + rs, ok := s.RootModule().Resources[n] + + if !ok { + return fmt.Errorf("Not found %s", n) + } + + if rs.Primary.ID == "" { + return fmt.Errorf("No default reviewers ID is set") + } + + return nil + } +} diff --git a/builtin/providers/bitbucket/resource_hook_test.go b/builtin/providers/bitbucket/resource_hook_test.go new file mode 100644 index 000000000..178ebf27b --- /dev/null +++ b/builtin/providers/bitbucket/resource_hook_test.go @@ -0,0 +1,78 @@ +package bitbucket + +import ( + "fmt" + "os" + "testing" + + "github.com/hashicorp/terraform/helper/resource" + "github.com/hashicorp/terraform/terraform" +) + +func TestAccBitbucketHook_basic(t *testing.T) { + var hook Hook + + testUser := os.Getenv("BITBUCKET_USERNAME") + testAccBitbucketHookConfig := fmt.Sprintf(` + resource "bitbucket_repository" "test_repo" { + owner = "%s" + name = "test-repo" + } + resource "bitbucket_hook" "test_repo_hook" { + owner = "%s" + repository = "${bitbucket_repository.test_repo.name}" + description = "Test hook for terraform" + url = "https://httpbin.org" + events = [ + "repo:push", + ] + } + `, testUser, testUser) + + resource.Test(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + CheckDestroy: testAccCheckBitbucketHookDestroy, + Steps: []resource.TestStep{ + resource.TestStep{ + Config: testAccBitbucketHookConfig, + Check: resource.ComposeTestCheckFunc( + testAccCheckBitbucketHookExists("bitbucket_hook.test_repo_hook", &hook), + ), + }, + }, + }) +} + +func testAccCheckBitbucketHookDestroy(s *terraform.State) error { + client := testAccProvider.Meta().(*BitbucketClient) + rs, ok := s.RootModule().Resources["bitbucket_hook.test_repo_hook"] + if !ok { + return fmt.Errorf("Not found %s", "bitbucket_hook.test_repo_hook") + } + + response, err := client.Get(fmt.Sprintf("2.0/repositories/%s/%s/hooks/%s", rs.Primary.Attributes["owner"], rs.Primary.Attributes["repository"], rs.Primary.Attributes["uuid"])) + + if err != nil { + return err + } + + if response.StatusCode != 404 { + return fmt.Errorf("Hook still exists") + } + + return nil +} + +func testAccCheckBitbucketHookExists(n string, hook *Hook) resource.TestCheckFunc { + return func(s *terraform.State) error { + rs, ok := s.RootModule().Resources[n] + if !ok { + return fmt.Errorf("Not found %s", n) + } + if rs.Primary.ID == "" { + return fmt.Errorf("No Hook ID is set") + } + return nil + } +} From 453ac9bb3dfe6a40403cf9dc615bf9043fc37099 Mon Sep 17 00:00:00 2001 From: Colin Wood Date: Fri, 9 Sep 2016 12:13:45 -0700 Subject: [PATCH 9/9] Refactor of username -> owner --- .../providers/bitbucket/r/default_reviewers.html.markdown | 4 ++-- website/source/docs/providers/bitbucket/r/hook.html.markdown | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/website/source/docs/providers/bitbucket/r/default_reviewers.html.markdown b/website/source/docs/providers/bitbucket/r/default_reviewers.html.markdown index c8c8223af..f9c210431 100644 --- a/website/source/docs/providers/bitbucket/r/default_reviewers.html.markdown +++ b/website/source/docs/providers/bitbucket/r/default_reviewers.html.markdown @@ -15,7 +15,7 @@ Provides support for setting up default reviewers for your repository. ``` # Manage your respository resource "bitbucket_default_reviewers" "infastracture" { - username = "myteam" + owner = "myteam" repository = "terraform-code" reviewers = [ "gob", @@ -29,7 +29,7 @@ resource "bitbucket_default_reviewers" "infastracture" { The following arguments are supported: -* `username` - (Required) The owner of this repository. Can be you or any team you +* `owner` - (Required) The owner of this repository. Can be you or any team you have write access to. * `repository` - (Required) The name of the repository. * `reviewers` - (Required) A list of reviewers to use. diff --git a/website/source/docs/providers/bitbucket/r/hook.html.markdown b/website/source/docs/providers/bitbucket/r/hook.html.markdown index 3ead6c42d..f04211b74 100644 --- a/website/source/docs/providers/bitbucket/r/hook.html.markdown +++ b/website/source/docs/providers/bitbucket/r/hook.html.markdown @@ -17,7 +17,7 @@ This allows you to manage your webhooks on a repository. ``` # Manage your respositories hooks resource "bitbucket_hook" "deploy_on_push" { - username = "myteam" + owner = "myteam" repository = "terraform-code" url = "https://mywebhookservice.mycompany.com/deploy-on-push" description = "Deploy the code via my webhook" @@ -31,7 +31,7 @@ resource "bitbucket_hook" "deploy_on_push" { The following arguments are supported: -* `username` - (Required) The owner of this repository. Can be you or any team you +* `owner` - (Required) The owner of this repository. Can be you or any team you have write access to. * `repository` - (Required) The name of the repository. * `url` - (Required) Where to POST to.