171 lines
6.6 KiB
Go
171 lines
6.6 KiB
Go
|
package gitlab
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"strconv"
|
||
|
"testing"
|
||
|
|
||
|
"github.com/hashicorp/terraform/helper/acctest"
|
||
|
"github.com/hashicorp/terraform/helper/resource"
|
||
|
"github.com/hashicorp/terraform/terraform"
|
||
|
"github.com/xanzy/go-gitlab"
|
||
|
)
|
||
|
|
||
|
func TestAccGitlabDeployKey_basic(t *testing.T) {
|
||
|
var deployKey gitlab.DeployKey
|
||
|
rInt := acctest.RandInt()
|
||
|
|
||
|
resource.Test(t, resource.TestCase{
|
||
|
PreCheck: func() { testAccPreCheck(t) },
|
||
|
Providers: testAccProviders,
|
||
|
CheckDestroy: testAccCheckGitlabDeployKeyDestroy,
|
||
|
Steps: []resource.TestStep{
|
||
|
// Create a project and deployKey with default options
|
||
|
{
|
||
|
Config: testAccGitlabDeployKeyConfig(rInt),
|
||
|
Check: resource.ComposeTestCheckFunc(
|
||
|
testAccCheckGitlabDeployKeyExists("gitlab_deploy_key.foo", &deployKey),
|
||
|
testAccCheckGitlabDeployKeyAttributes(&deployKey, &testAccGitlabDeployKeyExpectedAttributes{
|
||
|
Title: fmt.Sprintf("deployKey-%d", rInt),
|
||
|
Key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCj13ozEBZ0s4el4k6mYqoyIKKKMh9hHY0sAYqSPXs2zGuVFZss1P8TPuwmdXVjHR7TiRXwC49zDrkyWJgiufggYJ1VilOohcMOODwZEJz+E5q4GCfHuh90UEh0nl8B2R0Uoy0LPeg93uZzy0hlHApsxRf/XZJz/1ytkZvCtxdllxfImCVxJReMeRVEqFCTCvy3YuJn0bce7ulcTFRvtgWOpQsr6GDK8YkcCCv2eZthVlrEwy6DEpAKTRiRLGgUj4dPO0MmO4cE2qD4ualY01PhNORJ8Q++I+EtkGt/VALkecwFuBkl18/gy+yxNJHpKc/8WVVinDeFrd/HhiY9yU0d richardc@tamborine.example.1",
|
||
|
}),
|
||
|
),
|
||
|
},
|
||
|
// Update the project deployKey to toggle all the values to their inverse
|
||
|
{
|
||
|
Config: testAccGitlabDeployKeyUpdateConfig(rInt),
|
||
|
Check: resource.ComposeTestCheckFunc(
|
||
|
testAccCheckGitlabDeployKeyExists("gitlab_deploy_key.foo", &deployKey),
|
||
|
testAccCheckGitlabDeployKeyAttributes(&deployKey, &testAccGitlabDeployKeyExpectedAttributes{
|
||
|
Title: fmt.Sprintf("modifiedDeployKey-%d", rInt),
|
||
|
Key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC6pSke2kb7YBjo65xDKegbOQsAtnMupRcFxXji7L1iXivGwORq0qpC2xzbhez5jk1WgPckEaNv2/Bz0uEW6oSIXw1KT1VN2WzEUfQCbpNyZPtn4iV3nyl6VQW/Nd1SrxiFJtH1H4vu+eCo4McMXTjuBBD06fiJNrHaSw734LjQgqtXWJuVym9qS5MqraZB7wDwTQwSM6kslL7KTgmo3ONsTLdb2zZhv6CS+dcFKinQo7/ttTmeMuXGbPOVuNfT/bePVIN1MF1TislHa2L2dZdGeoynNJT4fVPjA2Xl6eHWh4ySbvnfPznASsjBhP0n/QKprYJ/5fQShdBYBcuQiIMd richardc@tamborine.example.2",
|
||
|
}),
|
||
|
),
|
||
|
},
|
||
|
// Update the project deployKey to toggle the options back
|
||
|
{
|
||
|
Config: testAccGitlabDeployKeyConfig(rInt),
|
||
|
Check: resource.ComposeTestCheckFunc(
|
||
|
testAccCheckGitlabDeployKeyExists("gitlab_deploy_key.foo", &deployKey),
|
||
|
testAccCheckGitlabDeployKeyAttributes(&deployKey, &testAccGitlabDeployKeyExpectedAttributes{
|
||
|
Title: fmt.Sprintf("deployKey-%d", rInt),
|
||
|
Key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCj13ozEBZ0s4el4k6mYqoyIKKKMh9hHY0sAYqSPXs2zGuVFZss1P8TPuwmdXVjHR7TiRXwC49zDrkyWJgiufggYJ1VilOohcMOODwZEJz+E5q4GCfHuh90UEh0nl8B2R0Uoy0LPeg93uZzy0hlHApsxRf/XZJz/1ytkZvCtxdllxfImCVxJReMeRVEqFCTCvy3YuJn0bce7ulcTFRvtgWOpQsr6GDK8YkcCCv2eZthVlrEwy6DEpAKTRiRLGgUj4dPO0MmO4cE2qD4ualY01PhNORJ8Q++I+EtkGt/VALkecwFuBkl18/gy+yxNJHpKc/8WVVinDeFrd/HhiY9yU0d richardc@tamborine.example.1",
|
||
|
}),
|
||
|
),
|
||
|
},
|
||
|
},
|
||
|
})
|
||
|
}
|
||
|
|
||
|
func testAccCheckGitlabDeployKeyExists(n string, deployKey *gitlab.DeployKey) resource.TestCheckFunc {
|
||
|
return func(s *terraform.State) error {
|
||
|
rs, ok := s.RootModule().Resources[n]
|
||
|
if !ok {
|
||
|
return fmt.Errorf("Not Found: %s", n)
|
||
|
}
|
||
|
|
||
|
deployKeyID, err := strconv.Atoi(rs.Primary.ID)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
repoName := rs.Primary.Attributes["project"]
|
||
|
if repoName == "" {
|
||
|
return fmt.Errorf("No project ID is set")
|
||
|
}
|
||
|
conn := testAccProvider.Meta().(*gitlab.Client)
|
||
|
|
||
|
gotDeployKey, _, err := conn.DeployKeys.GetDeployKey(repoName, deployKeyID)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
*deployKey = *gotDeployKey
|
||
|
return nil
|
||
|
}
|
||
|
}
|
||
|
|
||
|
type testAccGitlabDeployKeyExpectedAttributes struct {
|
||
|
Title string
|
||
|
Key string
|
||
|
CanPush bool
|
||
|
}
|
||
|
|
||
|
func testAccCheckGitlabDeployKeyAttributes(deployKey *gitlab.DeployKey, want *testAccGitlabDeployKeyExpectedAttributes) resource.TestCheckFunc {
|
||
|
return func(s *terraform.State) error {
|
||
|
if deployKey.Title != want.Title {
|
||
|
return fmt.Errorf("got title %q; want %q", deployKey.Title, want.Title)
|
||
|
}
|
||
|
|
||
|
if deployKey.Key != want.Key {
|
||
|
return fmt.Errorf("got key %q; want %q", deployKey.Key, want.Key)
|
||
|
}
|
||
|
|
||
|
if deployKey.CanPush != nil && *deployKey.CanPush != want.CanPush {
|
||
|
return fmt.Errorf("got can_push %t; want %t", *deployKey.CanPush, want.CanPush)
|
||
|
}
|
||
|
|
||
|
return nil
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func testAccCheckGitlabDeployKeyDestroy(s *terraform.State) error {
|
||
|
conn := testAccProvider.Meta().(*gitlab.Client)
|
||
|
|
||
|
for _, rs := range s.RootModule().Resources {
|
||
|
if rs.Type != "gitlab_project" {
|
||
|
continue
|
||
|
}
|
||
|
deployKeyID, err := strconv.Atoi(rs.Primary.ID)
|
||
|
project := rs.Primary.Attributes["project"]
|
||
|
|
||
|
gotDeployKey, resp, err := conn.DeployKeys.GetDeployKey(project, deployKeyID)
|
||
|
if err == nil {
|
||
|
if gotDeployKey != nil && fmt.Sprintf("%d", gotDeployKey.ID) == rs.Primary.ID {
|
||
|
return fmt.Errorf("Deploy key still exists")
|
||
|
}
|
||
|
}
|
||
|
if resp.StatusCode != 404 {
|
||
|
return err
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func testAccGitlabDeployKeyConfig(rInt int) string {
|
||
|
return fmt.Sprintf(`
|
||
|
resource "gitlab_project" "foo" {
|
||
|
name = "foo-%d"
|
||
|
description = "Terraform acceptance tests"
|
||
|
|
||
|
# So that acceptance tests can be run in a gitlab organization
|
||
|
# with no billing
|
||
|
visibility_level = "public"
|
||
|
}
|
||
|
|
||
|
resource "gitlab_deploy_key" "foo" {
|
||
|
project = "${gitlab_project.foo.id}"
|
||
|
title = "deployKey-%d"
|
||
|
key = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCj13ozEBZ0s4el4k6mYqoyIKKKMh9hHY0sAYqSPXs2zGuVFZss1P8TPuwmdXVjHR7TiRXwC49zDrkyWJgiufggYJ1VilOohcMOODwZEJz+E5q4GCfHuh90UEh0nl8B2R0Uoy0LPeg93uZzy0hlHApsxRf/XZJz/1ytkZvCtxdllxfImCVxJReMeRVEqFCTCvy3YuJn0bce7ulcTFRvtgWOpQsr6GDK8YkcCCv2eZthVlrEwy6DEpAKTRiRLGgUj4dPO0MmO4cE2qD4ualY01PhNORJ8Q++I+EtkGt/VALkecwFuBkl18/gy+yxNJHpKc/8WVVinDeFrd/HhiY9yU0d richardc@tamborine.example.1"
|
||
|
}
|
||
|
`, rInt, rInt)
|
||
|
}
|
||
|
|
||
|
func testAccGitlabDeployKeyUpdateConfig(rInt int) string {
|
||
|
return fmt.Sprintf(`
|
||
|
resource "gitlab_project" "foo" {
|
||
|
name = "foo-%d"
|
||
|
description = "Terraform acceptance tests"
|
||
|
|
||
|
# So that acceptance tests can be run in a gitlab organization
|
||
|
# with no billing
|
||
|
visibility_level = "public"
|
||
|
}
|
||
|
|
||
|
resource "gitlab_deploy_key" "foo" {
|
||
|
project = "${gitlab_project.foo.id}"
|
||
|
title = "modifiedDeployKey-%d"
|
||
|
key = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC6pSke2kb7YBjo65xDKegbOQsAtnMupRcFxXji7L1iXivGwORq0qpC2xzbhez5jk1WgPckEaNv2/Bz0uEW6oSIXw1KT1VN2WzEUfQCbpNyZPtn4iV3nyl6VQW/Nd1SrxiFJtH1H4vu+eCo4McMXTjuBBD06fiJNrHaSw734LjQgqtXWJuVym9qS5MqraZB7wDwTQwSM6kslL7KTgmo3ONsTLdb2zZhv6CS+dcFKinQo7/ttTmeMuXGbPOVuNfT/bePVIN1MF1TislHa2L2dZdGeoynNJT4fVPjA2Xl6eHWh4ySbvnfPznASsjBhP0n/QKprYJ/5fQShdBYBcuQiIMd richardc@tamborine.example.2"
|
||
|
}
|
||
|
`, rInt, rInt)
|
||
|
}
|