diff --git a/chef/resource_data_bag.go b/chef/resource_data_bag.go index fd515b30..eaaafb90 100644 --- a/chef/resource_data_bag.go +++ b/chef/resource_data_bag.go @@ -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, @@ -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) @@ -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) @@ -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) diff --git a/chef/resource_data_bag_item.go b/chef/resource_data_bag_item.go index f0a4f25b..b9727901 100644 --- a/chef/resource_data_bag_item.go +++ b/chef/resource_data_bag_item.go @@ -3,6 +3,8 @@ package chef import ( "encoding/json" "fmt" + "log" + "strings" "github.com/hashicorp/terraform/helper/schema" @@ -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, @@ -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 } @@ -45,11 +69,12 @@ 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) @@ -57,10 +82,10 @@ func ReadDataBagItem(d *schema.ResourceData, meta interface{}) error { // 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 { @@ -82,13 +107,14 @@ 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", "") @@ -96,21 +122,21 @@ func DeleteDataBagItem(d *schema.ResourceData, meta interface{}) error { 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 } diff --git a/chef/resource_environment.go b/chef/resource_environment.go index f24b1afa..4b59719e 100644 --- a/chef/resource_environment.go +++ b/chef/resource_environment.go @@ -3,6 +3,7 @@ package chef import ( "encoding/json" "fmt" + "log" "github.com/hashicorp/terraform/helper/schema" @@ -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, @@ -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": { @@ -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) @@ -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) @@ -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 { @@ -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 { @@ -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) diff --git a/chef/resource_role.go b/chef/resource_role.go index c8214129..6e0212b8 100644 --- a/chef/resource_role.go +++ b/chef/resource_role.go @@ -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, @@ -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": { @@ -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) @@ -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) @@ -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) @@ -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 { @@ -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)