Skip to content

Commit

Permalink
add image visibility and membership
Browse files Browse the repository at this point in the history
  • Loading branch information
rmb938 committed Jan 16, 2018
1 parent 1d70047 commit 717bb4b
Show file tree
Hide file tree
Showing 5 changed files with 139 additions and 23 deletions.
8 changes: 4 additions & 4 deletions glide.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion glide.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,4 @@ import:
- package: github.com/hashicorp/terraform
version: 0.10.0
- package: github.com/sandwichcloud/deli-cli
version: 0.0.14
version: 0.0.16
17 changes: 9 additions & 8 deletions sandwich/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,14 +36,15 @@ func Provider() *schema.Provider {
"sandwich_network": dataSourceNetwork(),
},
ResourcesMap: map[string]*schema.Resource{
"sandwich_region": resourceRegion(),
"sandwich_zone": resourceZone(),
"sandwich_network": resourceNetwork(),
"sandwich_project": resourceProject(),
"sandwich_image": resourceImage(),
"sandwich_keypair": resourceKeypair(),
"sandwich_flavor": resourceFlavor(),
"sandwich_instance": resourceInstance(),
"sandwich_region": resourceRegion(),
"sandwich_zone": resourceZone(),
"sandwich_network": resourceNetwork(),
"sandwich_project": resourceProject(),
"sandwich_image": resourceImage(),
"sandwich_image_member": resourceImageMember(),
"sandwich_keypair": resourceKeypair(),
"sandwich_flavor": resourceFlavor(),
"sandwich_instance": resourceInstance(),
},
ConfigureFunc: configureProvider,
}
Expand Down
38 changes: 28 additions & 10 deletions sandwich/resource_sandwich_image.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,13 @@ func resourceImage() *schema.Resource {
return &schema.Resource{
Create: resourceImageCreate,
Read: resourceImageRead,
Update: resourceImageUpdate,
Delete: resourceImageDelete,

Timeouts: &schema.ResourceTimeout{
Create: schema.DefaultTimeout(10 * time.Minute),
Read: schema.DefaultTimeout(10 * time.Minute),
Update: schema.DefaultTimeout(10 * time.Minute),
Delete: schema.DefaultTimeout(10 * time.Minute),
},

Expand All @@ -38,12 +40,11 @@ func resourceImage() *schema.Resource {
Required: true,
ForceNew: true,
},
//"visibility": {
// Type: schema.TypeString,
// Optional: true,
// Default: "PRIVATE",
// ForceNew: true,
//},
"public": {
Type: schema.TypeBool,
Optional: true,
Default: false,
},
},
}
}
Expand All @@ -54,9 +55,8 @@ func resourceImageCreate(d *schema.ResourceData, meta interface{}) error {
name := d.Get("name").(string)
regionID := d.Get("region_id").(string)
fileName := d.Get("file_name").(string)
//visibility := d.Get("visibility").(string)

image, err := imageClient.Create(name, regionID, fileName, "")
image, err := imageClient.Create(name, regionID, fileName)
if err != nil {
return err
}
Expand All @@ -78,7 +78,7 @@ func resourceImageCreate(d *schema.ResourceData, meta interface{}) error {
}
d.Partial(false) // There was no error during a state change so we should be safe

return resourceImageRead(d, meta)
return resourceImageUpdate(d, meta)
}

func resourceImageRead(d *schema.ResourceData, meta interface{}) error {
Expand All @@ -99,11 +99,29 @@ func resourceImageRead(d *schema.ResourceData, meta interface{}) error {
d.Set("name", image.Name)
d.Set("region_id", image.RegionID.String())
d.Set("file_name", image.FileName)
//d.Set("visibility", image.Visibility)
d.Set("public", image.Public)

return nil
}

func resourceImageUpdate(d *schema.ResourceData, meta interface{}) error {
config := meta.(*Config)
imageClient := config.SandwichClient.Image()

err := imageClient.ActionSetVisibility(d.Id(), d.Get("public").(bool))
if err != nil {
if apiError, ok := err.(api.APIError); ok {
if apiError.StatusCode != 409 {
return err
}
} else {
return err
}
}

return resourceImageRead(d, meta)
}

func resourceImageDelete(d *schema.ResourceData, meta interface{}) error {
config := meta.(*Config)
imageClient := config.SandwichClient.Image()
Expand Down
97 changes: 97 additions & 0 deletions sandwich/resource_sandwich_image_member.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
package sandwich

import (
"strings"
"time"

"github.com/hashicorp/terraform/helper/schema"
"github.com/sandwichcloud/deli-cli/api"
)

func resourceImageMember() *schema.Resource {
return &schema.Resource{
Create: resourceImageMemberCreate,
Read: resourceImageMemberRead,
Delete: resourceImageMemberDelete,

Timeouts: &schema.ResourceTimeout{
Create: schema.DefaultTimeout(10 * time.Minute),
Read: schema.DefaultTimeout(10 * time.Minute),
Delete: schema.DefaultTimeout(10 * time.Minute),
},

Schema: map[string]*schema.Schema{
"image_id": {
Type: schema.TypeString,
Required: true,
ForceNew: true,
},
"project_id": {
Type: schema.TypeString,
Required: true,
ForceNew: true,
},
},
}
}

func resourceImageMemberCreate(d *schema.ResourceData, meta interface{}) error {
config := meta.(*Config)
imageClient := config.SandwichClient.Image()
imageID := d.Get("image_id").(string)
projectID := d.Get("project_id").(string)

err := imageClient.MemberAdd(imageID, projectID)
if err != nil {
return err
}

d.SetId(imageID + "/" + projectID)
return resourceImageMemberRead(d, meta)
}

func resourceImageMemberRead(d *schema.ResourceData, meta interface{}) error {
config := meta.(*Config)
imageClient := config.SandwichClient.Image()
ids := strings.Split(d.Id(), "/")
imageID := ids[0]
projectID := ids[1]

imageMembers, err := imageClient.MemberList(imageID)
if err != nil {
if apiError, ok := err.(api.APIErrorInterface); ok {
if apiError.IsNotFound() {
d.SetId("")
return nil
}
}
return err
}

for _, imageMember := range imageMembers.Members {
if imageMember.ProjectID.String() == projectID {
d.Set("image_id", imageID)
d.Set("project_id", projectID)
return nil
}
}

d.SetId("")
return nil
}

func resourceImageMemberDelete(d *schema.ResourceData, meta interface{}) error {
config := meta.(*Config)
imageClient := config.SandwichClient.Image()
ids := strings.Split(d.Id(), "/")
imageID := ids[0]
projectID := ids[1]

err := imageClient.MemberRemove(imageID, projectID)
if err != nil {
return err
}

d.SetId("")
return nil
}

0 comments on commit 717bb4b

Please sign in to comment.