Skip to content
This repository has been archived by the owner on Dec 19, 2023. It is now read-only.

Commit

Permalink
Added import for data bag, data bag item, environment, role
Browse files Browse the repository at this point in the history
  • Loading branch information
terricain committed Apr 23, 2020
1 parent baaade4 commit c808e66
Show file tree
Hide file tree
Showing 4 changed files with 76 additions and 27 deletions.
9 changes: 9 additions & 0 deletions chef/resource_data_bag.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,10 @@ func resourceChefDataBag() *schema.Resource {
Read: ReadDataBag,
Delete: DeleteDataBag,

Importer: &schema.ResourceImporter{
State: schema.ImportStatePassthrough,
},

Schema: map[string]*schema.Schema{
"name": {
Type: schema.TypeString,
Expand All @@ -26,6 +30,7 @@ func resourceChefDataBag() *schema.Resource {
}
}

// CreateDataBag Creates a Chef Data Bag
func CreateDataBag(d *schema.ResourceData, meta interface{}) error {
client := meta.(*chefc.Client)

Expand All @@ -43,6 +48,7 @@ func CreateDataBag(d *schema.ResourceData, meta interface{}) error {
return nil
}

// ReadDataBag Reads exsting data bag from Chef, also used during import
func ReadDataBag(d *schema.ResourceData, meta interface{}) error {
client := meta.(*chefc.Client)

Expand All @@ -61,9 +67,12 @@ func ReadDataBag(d *schema.ResourceData, meta interface{}) error {
}
}
}

d.Set("name", name)
return err
}

// DeleteDataBag Deletes Chef data bag
func DeleteDataBag(d *schema.ResourceData, meta interface{}) error {
client := meta.(*chefc.Client)

Expand Down
54 changes: 40 additions & 14 deletions chef/resource_data_bag_item.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ package chef
import (
"encoding/json"
"fmt"
"log"
"strings"

"github.com/hashicorp/terraform/helper/schema"

Expand All @@ -15,6 +17,10 @@ func resourceChefDataBagItem() *schema.Resource {
Read: ReadDataBagItem,
Delete: DeleteDataBagItem,

Importer: &schema.ResourceImporter{
State: DataBagItemImporter,
},

Schema: map[string]*schema.Schema{
"data_bag_name": {
Type: schema.TypeString,
Expand All @@ -31,11 +37,29 @@ func resourceChefDataBagItem() *schema.Resource {
}
}

// DataBagItemImporter Splits ID so that ReadDataBagItem can import the data
func DataBagItemImporter(d *schema.ResourceData, meta interface{}) ([]*schema.ResourceData, error) {
id := d.Id()
parts := strings.SplitN(id, ".", 2)
if len(parts) != 2 || parts[0] == "" || parts[1] == "" {
return nil, fmt.Errorf("unexpected format of ID (%s), expected databagname.itemname", id)
}

d.SetId(parts[1])
d.Set("data_bag_name", parts[0])
if err := ReadDataBagItem(d, meta); err != nil {
return nil, err
}

return []*schema.ResourceData{d}, nil
}

// CreateDataBagItem Creates an item in a data bag in Chef
func CreateDataBagItem(d *schema.ResourceData, meta interface{}) error {
client := meta.(*chefc.Client)

dataBagName := d.Get("data_bag_name").(string)
itemId, itemContent, err := prepareDataBagItemContent(d.Get("content_json").(string))
itemID, itemContent, err := prepareDataBagItemContent(d.Get("content_json").(string))
if err != nil {
return err
}
Expand All @@ -45,22 +69,23 @@ func CreateDataBagItem(d *schema.ResourceData, meta interface{}) error {
return err
}

d.SetId(itemId)
d.Set("id", itemId)
d.SetId(itemID)
d.Set("id", itemID)
return nil
}

// ReadDataBagItem Gets data bag item from Chef
func ReadDataBagItem(d *schema.ResourceData, meta interface{}) error {
client := meta.(*chefc.Client)

// The Chef API provides no API to read a data bag's metadata,
// but we can try to read its items and use that as a proxy for
// whether it still exists.

itemId := d.Id()
itemID := d.Id()
dataBagName := d.Get("data_bag_name").(string)

value, err := client.DataBags.GetItem(dataBagName, itemId)
value, err := client.DataBags.GetItem(dataBagName, itemID)
if err != nil {
if errRes, ok := err.(*chefc.ErrorResponse); ok {
if errRes.Response.StatusCode == 404 {
Expand All @@ -82,35 +107,36 @@ func ReadDataBagItem(d *schema.ResourceData, meta interface{}) error {
return nil
}

// DeleteDataBagItem Deletes an item from a databag in Chef
func DeleteDataBagItem(d *schema.ResourceData, meta interface{}) error {
client := meta.(*chefc.Client)

itemId := d.Id()
itemID := d.Id()
dataBagName := d.Get("data_bag_name").(string)

err := client.DataBags.DeleteItem(dataBagName, itemId)
err := client.DataBags.DeleteItem(dataBagName, itemID)
if err == nil {
d.SetId("")
d.Set("id", "")
}
return err
}

func prepareDataBagItemContent(contentJson string) (string, interface{}, error) {
func prepareDataBagItemContent(contentJSON string) (string, interface{}, error) {
var value map[string]interface{}
err := json.Unmarshal([]byte(contentJson), &value)
err := json.Unmarshal([]byte(contentJSON), &value)
if err != nil {
return "", nil, err
}

var itemId string
if itemIdI, ok := value["id"]; ok {
itemId, _ = itemIdI.(string)
var itemID string
if itemIDI, ok := value["id"]; ok {
itemID, _ = itemIDI.(string)
}

if itemId == "" {
if itemID == "" {
return "", nil, fmt.Errorf("content_json must have id attribute, set to a string")
}

return itemId, value, nil
return itemID, value, nil
}
21 changes: 14 additions & 7 deletions chef/resource_environment.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package chef
import (
"encoding/json"
"fmt"
"log"

"github.com/hashicorp/terraform/helper/schema"

Expand All @@ -16,6 +17,10 @@ func resourceChefEnvironment() *schema.Resource {
Read: ReadEnvironment,
Delete: DeleteEnvironment,

Importer: &schema.ResourceImporter{
State: schema.ImportStatePassthrough,
},

Schema: map[string]*schema.Schema{
"name": {
Type: schema.TypeString,
Expand All @@ -30,13 +35,11 @@ func resourceChefEnvironment() *schema.Resource {
"default_attributes_json": {
Type: schema.TypeString,
Optional: true,
Default: "{}",
StateFunc: jsonStateFunc,
},
"override_attributes_json": {
Type: schema.TypeString,
Optional: true,
Default: "{}",
StateFunc: jsonStateFunc,
},
"cookbook_constraints": {
Expand All @@ -50,6 +53,7 @@ func resourceChefEnvironment() *schema.Resource {
}
}

// CreateEnvironment Creates a Chef environment from resource definition
func CreateEnvironment(d *schema.ResourceData, meta interface{}) error {
client := meta.(*chefc.Client)

Expand All @@ -67,6 +71,7 @@ func CreateEnvironment(d *schema.ResourceData, meta interface{}) error {
return ReadEnvironment(d, meta)
}

// UpdateEnvironment Modifies an existing Chef environment to match the resource definition
func UpdateEnvironment(d *schema.ResourceData, meta interface{}) error {
client := meta.(*chefc.Client)

Expand All @@ -84,12 +89,13 @@ func UpdateEnvironment(d *schema.ResourceData, meta interface{}) error {
return ReadEnvironment(d, meta)
}

// ReadEnvironment Reads Chef environment info into the resource object, also called when importing
func ReadEnvironment(d *schema.ResourceData, meta interface{}) error {
client := meta.(*chefc.Client)

name := d.Id()

env, err := client.Environments.Get(name)

if err != nil {
if errRes, ok := err.(*chefc.ErrorResponse); ok {
if errRes.Response.StatusCode == 404 {
Expand All @@ -104,17 +110,17 @@ func ReadEnvironment(d *schema.ResourceData, meta interface{}) error {
d.Set("name", env.Name)
d.Set("description", env.Description)

defaultAttrJson, err := json.Marshal(env.DefaultAttributes)
defaultAttrJSON, err := json.Marshal(env.DefaultAttributes)
if err != nil {
return err
}
d.Set("default_attributes_json", defaultAttrJson)
d.Set("default_attributes_json", defaultAttrJSON)

overrideAttrJson, err := json.Marshal(env.OverrideAttributes)
overrideAttrJSON, err := json.Marshal(env.OverrideAttributes)
if err != nil {
return err
}
d.Set("override_attributes_json", overrideAttrJson)
d.Set("override_attributes_json", overrideAttrJSON)

cookbookVersionsI := map[string]interface{}{}
for k, v := range env.CookbookVersions {
Expand All @@ -125,6 +131,7 @@ func ReadEnvironment(d *schema.ResourceData, meta interface{}) error {
return nil
}

// DeleteEnvironment Deletes an environment from Chef
func DeleteEnvironment(d *schema.ResourceData, meta interface{}) error {
client := meta.(*chefc.Client)

Expand Down
19 changes: 13 additions & 6 deletions chef/resource_role.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,10 @@ func resourceChefRole() *schema.Resource {
Read: ReadRole,
Delete: DeleteRole,

Importer: &schema.ResourceImporter{
State: schema.ImportStatePassthrough,
},

Schema: map[string]*schema.Schema{
"name": {
Type: schema.TypeString,
Expand All @@ -30,13 +34,11 @@ func resourceChefRole() *schema.Resource {
"default_attributes_json": {
Type: schema.TypeString,
Optional: true,
Default: "{}",
StateFunc: jsonStateFunc,
},
"override_attributes_json": {
Type: schema.TypeString,
Optional: true,
Default: "{}",
StateFunc: jsonStateFunc,
},
"run_list": {
Expand All @@ -51,6 +53,7 @@ func resourceChefRole() *schema.Resource {
}
}

// CreateRole Creates Chef role from resource definition
func CreateRole(d *schema.ResourceData, meta interface{}) error {
client := meta.(*chefc.Client)

Expand All @@ -68,6 +71,7 @@ func CreateRole(d *schema.ResourceData, meta interface{}) error {
return ReadRole(d, meta)
}

// UpdateRole Updates Chef role to match resource definition
func UpdateRole(d *schema.ResourceData, meta interface{}) error {
client := meta.(*chefc.Client)

Expand All @@ -85,6 +89,8 @@ func UpdateRole(d *schema.ResourceData, meta interface{}) error {
return ReadRole(d, meta)
}

// ReadRole Updates resource object with existing Chef role information,
// also called when importing a resource
func ReadRole(d *schema.ResourceData, meta interface{}) error {
client := meta.(*chefc.Client)

Expand All @@ -105,17 +111,17 @@ func ReadRole(d *schema.ResourceData, meta interface{}) error {
d.Set("name", role.Name)
d.Set("description", role.Description)

defaultAttrJson, err := json.Marshal(role.DefaultAttributes)
defaultAttrJSON, err := json.Marshal(role.DefaultAttributes)
if err != nil {
return err
}
d.Set("default_attributes_json", defaultAttrJson)
d.Set("default_attributes_json", defaultAttrJSON)

overrideAttrJson, err := json.Marshal(role.OverrideAttributes)
overrideAttrJSON, err := json.Marshal(role.OverrideAttributes)
if err != nil {
return err
}
d.Set("override_attributes_json", overrideAttrJson)
d.Set("override_attributes_json", overrideAttrJSON)

runListI := make([]interface{}, len(role.RunList))
for i, v := range role.RunList {
Expand All @@ -126,6 +132,7 @@ func ReadRole(d *schema.ResourceData, meta interface{}) error {
return nil
}

// Delete Chef role
func DeleteRole(d *schema.ResourceData, meta interface{}) error {
client := meta.(*chefc.Client)

Expand Down

0 comments on commit c808e66

Please sign in to comment.