Skip to content

Commit

Permalink
Initial implementation for spaces
Browse files Browse the repository at this point in the history
  • Loading branch information
jbristowe committed Nov 5, 2020
1 parent 432f92f commit bdbeced
Show file tree
Hide file tree
Showing 3 changed files with 285 additions and 0 deletions.
46 changes: 46 additions & 0 deletions octopusdeploy/data_space.go
@@ -0,0 +1,46 @@
package octopusdeploy

import (
"context"
"fmt"

"github.com/OctopusDeploy/go-octopusdeploy/octopusdeploy"
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)

func dataSpace() *schema.Resource {
return &schema.Resource{
ReadContext: dataSpaceReadByName,
Schema: map[string]*schema.Schema{
constName: {
Required: true,
Type: schema.TypeString,
},
},
}
}

func dataSpaceReadByName(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
client := m.(*octopusdeploy.Client)
name := d.Get(constName).(string)

space, err := client.Spaces.GetByName(name)
if err != nil {
return diag.FromErr(err)
}
if space == nil {
d.SetId(constEmptyString)
return diag.FromErr(fmt.Errorf("Unable to retrieve space (name: %s)", name))
}

d.SetId(space.GetID())
d.Set(constDescription, space.Description)
d.Set(constIsDefault, space.IsDefault)
d.Set(constName, space.Name)
d.Set(constSpaceManagersTeamMembers, space.SpaceManagersTeamMembers)
d.Set(constSpaceManagersTeams, space.SpaceManagersTeams)
d.Set(constTaskQueueStopped, space.TaskQueueStopped)

return nil
}
157 changes: 157 additions & 0 deletions octopusdeploy/resource_space.go
@@ -0,0 +1,157 @@
package octopusdeploy

import (
"context"

"github.com/OctopusDeploy/go-octopusdeploy/octopusdeploy"
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)

func resourceSpace() *schema.Resource {
return &schema.Resource{
CreateContext: resourceSpaceCreate,
DeleteContext: resourceSpaceDelete,
ReadContext: resourceSpaceRead,
UpdateContext: resourceSpaceUpdate,

Schema: map[string]*schema.Schema{
constDescription: {
Optional: true,
Type: schema.TypeString,
},
constID: {
Computed: true,
Optional: true,
Type: schema.TypeString,
},
constIsDefault: {
Optional: true,
Type: schema.TypeBool,
},
constName: {
Required: true,
Type: schema.TypeString,
},
constSpaceManagersTeamMembers: {
Elem: &schema.Schema{
Type: schema.TypeString,
},
Optional: true,
Type: schema.TypeList,
},
constSpaceManagersTeams: {
Elem: &schema.Schema{
Type: schema.TypeString,
},
Optional: true,
Type: schema.TypeList,
},
constTaskQueueStopped: {
Optional: true,
Type: schema.TypeBool,
},
},
}
}

func buildSpace(d *schema.ResourceData) *octopusdeploy.Space {
var name string
if v, ok := d.GetOk(constName); ok {
name = v.(string)
}

space := octopusdeploy.NewSpace(name)

if v, ok := d.GetOk(constDescription); ok {
space.Description = v.(string)
}

if v, ok := d.GetOk(constID); ok {
space.ID = v.(string)
}

if v, ok := d.GetOk(constIsDefault); ok {
space.IsDefault = v.(bool)
}

if v, ok := d.GetOk(constSpaceManagersTeamMembers); ok {
space.SpaceManagersTeamMembers = getSliceFromTerraformTypeList(v)
}

if v, ok := d.GetOk(constSpaceManagersTeams); ok {
space.SpaceManagersTeams = getSliceFromTerraformTypeList(v)
}

if v, ok := d.GetOk(constTaskQueueStopped); ok {
space.TaskQueueStopped = v.(bool)
}

return space
}

func resourceSpaceCreate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
space := buildSpace(d)

client := m.(*octopusdeploy.Client)
space, err := client.Spaces.Add(space)
if err != nil {
return diag.FromErr(err)
}

d.SetId(space.GetID())

return nil
}

func resourceSpaceRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
client := m.(*octopusdeploy.Client)
space, err := client.Spaces.GetByID(d.Id())
if err != nil {
return diag.FromErr(err)
}

d.Set(constDescription, space.Description)
d.Set(constIsDefault, space.IsDefault)
d.Set(constName, space.Name)
d.Set(constSpaceManagersTeamMembers, space.SpaceManagersTeamMembers)
d.Set(constSpaceManagersTeams, space.SpaceManagersTeams)
d.Set(constTaskQueueStopped, space.TaskQueueStopped)

return nil
}

func resourceSpaceUpdate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
space := buildSpace(d)
space.ID = d.Id()

client := m.(*octopusdeploy.Client)
updatedSpace, err := client.Spaces.Update(space)
if err != nil {
return diag.FromErr(err)
}

d.SetId(updatedSpace.GetID())

return nil
}

func resourceSpaceDelete(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
space := buildSpace(d)
space.TaskQueueStopped = true

client := m.(*octopusdeploy.Client)
updatedSpace, err := client.Spaces.Update(space)
if err != nil {
return diag.FromErr(err)
}

err = client.Spaces.DeleteByID(updatedSpace.GetID())
if err != nil {
return diag.FromErr(err)
}

d.SetId(constEmptyString)

return nil
}
82 changes: 82 additions & 0 deletions octopusdeploy/resource_space_test.go
@@ -0,0 +1,82 @@
package octopusdeploy

import (
"fmt"
"testing"

"github.com/OctopusDeploy/go-octopusdeploy/octopusdeploy"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
"github.com/hashicorp/terraform-plugin-sdk/v2/terraform"
)

func TestAccSpaceBasic(t *testing.T) {
localName := acctest.RandStringFromCharSet(10, acctest.CharSetAlpha)
prefix := constOctopusDeploySpace + "." + localName

name := acctest.RandStringFromCharSet(10, acctest.CharSetAlpha)

resource.Test(t, resource.TestCase{
CheckDestroy: testSpaceDestroy,
PreCheck: func() { testAccPreCheck(t) },
Providers: testAccProviders,
Steps: []resource.TestStep{
{
Check: resource.ComposeTestCheckFunc(
testSpaceExists(prefix),
resource.TestCheckResourceAttrSet(prefix, constID),
resource.TestCheckResourceAttr(prefix, constName, name),
),
Config: testSpaceBasic(localName, name),
},
},
})
}

func testUserBasic(localName string, displayName string, password string, username string) string {
return fmt.Sprintf(`resource "%s" "%s" {
display_name = "%s"
password = "%s"
username = "%s"
}`, constOctopusDeployUser, localName, displayName, password, username)
}

func testSpaceBasic(localName string, name string) string {
userLocalName := acctest.RandStringFromCharSet(10, acctest.CharSetAlpha)
userDisplayName := acctest.RandStringFromCharSet(10, acctest.CharSetAlpha)
userPassword := acctest.RandStringFromCharSet(20, acctest.CharSetAlpha)
userUsername := acctest.RandStringFromCharSet(10, acctest.CharSetAlpha)

return fmt.Sprintf(testUserBasic(userLocalName, userDisplayName, userPassword, userUsername)+"\n"+
`resource "%s" "%s" {
name = "%s"
space_managers_team_members = ["${%s.%s.id}"]
}`, constOctopusDeploySpace, localName, name, constOctopusDeployUser, userLocalName)
}

func testSpaceExists(prefix string) resource.TestCheckFunc {
return func(s *terraform.State) error {
client := testAccProvider.Meta().(*octopusdeploy.Client)
spaceID := s.RootModule().Resources[prefix].Primary.ID
if _, err := client.Spaces.GetByID(spaceID); err != nil {
return err
}

return nil
}
}

func testSpaceDestroy(s *terraform.State) error {
client := testAccProvider.Meta().(*octopusdeploy.Client)
for _, rs := range s.RootModule().Resources {
spaceID := rs.Primary.ID
space, err := client.Spaces.GetByID(spaceID)
if err == nil {
if space != nil {
return fmt.Errorf("space (%s) still exists", rs.Primary.ID)
}
}
}

return nil
}

0 comments on commit bdbeced

Please sign in to comment.