Merge pull request #8 from justinto-guidewire/feature/import-existing-groups-squashed

Import existing groups
This commit is contained in:
Gavin Bunney
2020-07-27 10:27:45 -07:00
committed by GitHub
5 changed files with 111 additions and 6 deletions

View File

@@ -5,7 +5,7 @@ export GO111MODULE=on
export TESTARGS=-race -coverprofile=coverage.txt -covermode=atomic export TESTARGS=-race -coverprofile=coverage.txt -covermode=atomic
export BITBUCKET_SERVER=http://localhost:7990 export BITBUCKET_SERVER?=http://localhost:7990
export BITBUCKET_USERNAME=admin export BITBUCKET_USERNAME=admin
export BITBUCKET_PASSWORD=admin export BITBUCKET_PASSWORD=admin
@@ -20,11 +20,15 @@ test: fmtcheck
xargs -t -n4 go test $(TESTARGS) -timeout=30s -parallel=4 xargs -t -n4 go test $(TESTARGS) -timeout=30s -parallel=4
testacc: fmtcheck testacc: fmtcheck
TF_ACC=1 go test $(TEST) -v $(TESTARGS) -timeout 120m -count=1 #The ulimit command is required to allow the tests to open more than the default 256 files as set on MacOS. The tests will fail without this. It must be done as one
#command otherwise the setting is lost
ulimit -n 1024; TF_ACC=1 go test $(TEST) -v $(TESTARGS) -timeout 120m -count=1
testacc-bitbucket: fmtcheck testacc-bitbucket: fmtcheck
@sh scripts/start-docker-compose.sh @sh scripts/start-docker-compose.sh
TF_ACC=1 go test $(TEST) -v $(TESTARGS) -timeout 120m -count=1 #The ulimit command is required to allow the tests to open more than the default 256 files as set on MacOS. The tests will fail without this. It must be done as one
#command otherwise the setting is lost
ulimit -n 1024; TF_ACC=1 go test $(TEST) -v $(TESTARGS) -timeout 120m -count=1
@sh scripts/stop-docker-compose.sh @sh scripts/stop-docker-compose.sh
vet: vet:

View File

@@ -10,6 +10,7 @@ func resourceGroup() *schema.Resource {
return &schema.Resource{ return &schema.Resource{
Create: resourceGroupCreate, Create: resourceGroupCreate,
Read: resourceGroupRead, Read: resourceGroupRead,
Update: resourceGroupUpdate,
Delete: resourceGroupDelete, Delete: resourceGroupDelete,
Importer: &schema.ResourceImporter{ Importer: &schema.ResourceImporter{
State: schema.ImportStatePassthrough, State: schema.ImportStatePassthrough,
@@ -21,6 +22,11 @@ func resourceGroup() *schema.Resource {
Required: true, Required: true,
ForceNew: true, ForceNew: true,
}, },
"import_if_exists": {
Type: schema.TypeBool,
Optional: true,
Default: false,
},
}, },
} }
} }
@@ -29,12 +35,22 @@ func resourceGroupCreate(d *schema.ResourceData, m interface{}) error {
client := m.(*BitbucketServerProvider).BitbucketClient client := m.(*BitbucketServerProvider).BitbucketClient
groupName := d.Get("name").(string) groupName := d.Get("name").(string)
_, err := client.Post(fmt.Sprintf("/rest/api/1.0/admin/groups?name=%s", url.QueryEscape(groupName)), nil) importIfExists := d.Get("import_if_exists").(bool)
var newResource = true
response, err := client.Post(fmt.Sprintf("/rest/api/1.0/admin/groups?name=%s", url.QueryEscape(groupName)), nil)
if err != nil { if err != nil {
return err if importIfExists && response.StatusCode == 409 {
newResource = false
} else {
return err
}
} }
if newResource {
d.MarkNewResource()
}
d.SetId(groupName) d.SetId(groupName)
return resourceGroupRead(d, m) return resourceGroupRead(d, m)
} }
@@ -61,6 +77,12 @@ func resourceGroupRead(d *schema.ResourceData, m interface{}) error {
return fmt.Errorf("unable to find a matching group %s", groupName) return fmt.Errorf("unable to find a matching group %s", groupName)
} }
func resourceGroupUpdate(d *schema.ResourceData, m interface{}) error {
// The only attribute in the schema that does not have "ForceNew: true" is "import_if_exists",
// so we are not actually updating any groups in Bitbucket, we just need to read and return.
return resourceGroupRead(d, m)
}
func resourceGroupDelete(d *schema.ResourceData, m interface{}) error { func resourceGroupDelete(d *schema.ResourceData, m interface{}) error {
groupName := d.Get("name").(string) groupName := d.Get("name").(string)
client := m.(*BitbucketServerProvider).BitbucketClient client := m.(*BitbucketServerProvider).BitbucketClient

View File

@@ -1,7 +1,13 @@
package bitbucket package bitbucket
import ( import (
"fmt"
"github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/resource"
"net/http"
"net/url"
"os"
"regexp"
"strings"
"testing" "testing"
) )
@@ -25,3 +31,74 @@ func TestAccBitbucketResourceGroup_basic(t *testing.T) {
}, },
}) })
} }
func TestAccBitbucketResourceGroup_DisallowImport(t *testing.T) {
resourceName := "duplicate_group"
groupName := "duplicate-group"
config := fmt.Sprintf(`
resource "bitbucketserver_group" "%s" {
name = "%s"
}
`, resourceName, groupName)
createGroup(groupName)
resource.Test(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
Providers: testAccProviders,
Steps: []resource.TestStep{
{
Config: config,
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttr(fmt.Sprintf("bitbucketserver_group.%s", resourceName), "name", groupName),
),
ExpectError: regexp.MustCompile("API Error: 409"),
},
},
})
}
func TestAccBitbucketResourceGroup_AllowImport(t *testing.T) {
resourceName := "duplicate_group"
groupName := "duplicate-group"
config := fmt.Sprintf(`
resource "bitbucketserver_group" "%s" {
name = "%s"
import_if_exists = true
}
`, resourceName, groupName)
createGroup(groupName)
resource.Test(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
Providers: testAccProviders,
Steps: []resource.TestStep{
{
Config: config,
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttr(fmt.Sprintf("bitbucketserver_group.%s", resourceName), "name", groupName),
),
},
},
})
}
func createGroup(groupName string) {
client := newBitbucketClient()
client.Post(fmt.Sprintf("/rest/api/1.0/admin/groups?name=%s", url.QueryEscape(groupName)), nil)
}
func newBitbucketClient() *BitbucketClient {
serverSanitized := os.Getenv("BITBUCKET_SERVER")
if strings.HasSuffix(serverSanitized, "/") {
serverSanitized = serverSanitized[0 : len(serverSanitized)-1]
}
return &BitbucketClient{
Server: serverSanitized,
Username: os.Getenv("BITBUCKET_USERNAME"),
Password: os.Getenv("BITBUCKET_PASSWORD"),
HTTPClient: &http.Client{},
}
}

View File

@@ -16,6 +16,7 @@ resource "bitbucketserver_group" "browncoats" {
## Argument Reference ## Argument Reference
* `name` - Required. Group to create. * `name` - Required. Group to create.
* `import_if_exists` - Optional. Import groups that already exist in bitbucket into the terraform state file.
## Import ## Import

View File

@@ -14,4 +14,5 @@ echo "--> Starting docker-compose"
${DIR}/docker-compose up -d --build ${DIR}/docker-compose up -d --build
echo "--> Wait for bitbucket to be ready" echo "--> Wait for bitbucket to be ready"
bash ${DIR}/wait-for-url.sh --url http://localhost:7990/status --timeout 600 #If the BITBUCKET_SERVER environment variable is not set then use http://localhost:7990
bash ${DIR}/wait-for-url.sh --url ${BITBUCKET_SERVER-http://localhost:7990}/status --timeout 600