github.com/danp/terraform@v0.9.5-0.20170426144147-39d740081351/builtin/providers/rabbitmq/resource_user.go (about)

     1  package rabbitmq
     2  
     3  import (
     4  	"fmt"
     5  	"log"
     6  	"strings"
     7  
     8  	"github.com/michaelklishin/rabbit-hole"
     9  
    10  	"github.com/hashicorp/terraform/helper/schema"
    11  )
    12  
    13  func resourceUser() *schema.Resource {
    14  	return &schema.Resource{
    15  		Create: CreateUser,
    16  		Update: UpdateUser,
    17  		Read:   ReadUser,
    18  		Delete: DeleteUser,
    19  		Importer: &schema.ResourceImporter{
    20  			State: schema.ImportStatePassthrough,
    21  		},
    22  
    23  		Schema: map[string]*schema.Schema{
    24  			"name": &schema.Schema{
    25  				Type:     schema.TypeString,
    26  				Required: true,
    27  				ForceNew: true,
    28  			},
    29  
    30  			"password": &schema.Schema{
    31  				Type:      schema.TypeString,
    32  				Required:  true,
    33  				Sensitive: true,
    34  			},
    35  
    36  			"tags": &schema.Schema{
    37  				Type:     schema.TypeList,
    38  				Optional: true,
    39  				Elem:     &schema.Schema{Type: schema.TypeString},
    40  			},
    41  		},
    42  	}
    43  }
    44  
    45  func CreateUser(d *schema.ResourceData, meta interface{}) error {
    46  	rmqc := meta.(*rabbithole.Client)
    47  
    48  	name := d.Get("name").(string)
    49  
    50  	var tagList []string
    51  	for _, v := range d.Get("tags").([]interface{}) {
    52  		if v, ok := v.(string); ok {
    53  			tagList = append(tagList, v)
    54  		}
    55  	}
    56  
    57  	userSettings := rabbithole.UserSettings{
    58  		Password: d.Get("password").(string),
    59  	}
    60  
    61  	if len(tagList) > 0 {
    62  		userSettings.Tags = strings.Join(tagList, ",")
    63  	}
    64  
    65  	log.Printf("[DEBUG] RabbitMQ: Attempting to create user %s", name)
    66  
    67  	resp, err := rmqc.PutUser(name, userSettings)
    68  	log.Printf("[DEBUG] RabbitMQ: user creation response: %#v", resp)
    69  	if err != nil {
    70  		return err
    71  	}
    72  
    73  	if resp.StatusCode >= 400 {
    74  		return fmt.Errorf("Error creating RabbitMQ user: %s", resp.Status)
    75  	}
    76  
    77  	d.SetId(name)
    78  
    79  	return ReadUser(d, meta)
    80  }
    81  
    82  func ReadUser(d *schema.ResourceData, meta interface{}) error {
    83  	rmqc := meta.(*rabbithole.Client)
    84  
    85  	user, err := rmqc.GetUser(d.Id())
    86  	if err != nil {
    87  		return checkDeleted(d, err)
    88  	}
    89  
    90  	log.Printf("[DEBUG] RabbitMQ: User retrieved: %#v", user)
    91  
    92  	d.Set("name", user.Name)
    93  
    94  	if len(user.Tags) > 0 {
    95  		tags := strings.Split(user.Tags, ",")
    96  		d.Set("tags", tags)
    97  	}
    98  
    99  	return nil
   100  }
   101  
   102  func UpdateUser(d *schema.ResourceData, meta interface{}) error {
   103  	rmqc := meta.(*rabbithole.Client)
   104  
   105  	name := d.Id()
   106  
   107  	if d.HasChange("password") {
   108  		_, newPassword := d.GetChange("password")
   109  
   110  		userSettings := rabbithole.UserSettings{
   111  			Password: newPassword.(string),
   112  		}
   113  
   114  		log.Printf("[DEBUG] RabbitMQ: Attempting to update password for %s", name)
   115  
   116  		resp, err := rmqc.PutUser(name, userSettings)
   117  		log.Printf("[DEBUG] RabbitMQ: Password update response: %#v", resp)
   118  		if err != nil {
   119  			return err
   120  		}
   121  
   122  		if resp.StatusCode >= 400 {
   123  			return fmt.Errorf("Error updating RabbitMQ user: %s", resp.Status)
   124  		}
   125  
   126  	}
   127  
   128  	if d.HasChange("tags") {
   129  		_, newTags := d.GetChange("tags")
   130  
   131  		var tagList []string
   132  		for _, v := range newTags.([]interface{}) {
   133  			if v, ok := v.(string); ok {
   134  				tagList = append(tagList, v)
   135  			}
   136  		}
   137  
   138  		userSettings := rabbithole.UserSettings{}
   139  		if len(tagList) > 0 {
   140  			userSettings.Tags = strings.Join(tagList, ",")
   141  		}
   142  
   143  		log.Printf("[DEBUG] RabbitMQ: Attempting to update tags for %s", name)
   144  
   145  		resp, err := rmqc.PutUser(name, userSettings)
   146  		log.Printf("[DEBUG] RabbitMQ: Tags update response: %#v", resp)
   147  		if err != nil {
   148  			return err
   149  		}
   150  
   151  		if resp.StatusCode >= 400 {
   152  			return fmt.Errorf("Error updating RabbitMQ user: %s", resp.Status)
   153  		}
   154  
   155  	}
   156  
   157  	return ReadUser(d, meta)
   158  }
   159  
   160  func DeleteUser(d *schema.ResourceData, meta interface{}) error {
   161  	rmqc := meta.(*rabbithole.Client)
   162  
   163  	name := d.Id()
   164  	log.Printf("[DEBUG] RabbitMQ: Attempting to delete user %s", name)
   165  
   166  	resp, err := rmqc.DeleteUser(name)
   167  	log.Printf("[DEBUG] RabbitMQ: User delete response: %#v", resp)
   168  	if err != nil {
   169  		return err
   170  	}
   171  
   172  	if resp.StatusCode == 404 {
   173  		// the user was automatically deleted
   174  		return nil
   175  	}
   176  
   177  	if resp.StatusCode >= 400 {
   178  		return fmt.Errorf("Error deleting RabbitMQ user: %s", resp.Status)
   179  	}
   180  
   181  	return nil
   182  }