github.com/vtorhonen/terraform@v0.9.0-beta2.0.20170307220345-5d894e4ffda7/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  				Required: 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  		tagList = append(tagList, v.(string))
    53  	}
    54  	tags := strings.Join(tagList, ",")
    55  
    56  	userSettings := rabbithole.UserSettings{
    57  		Password: d.Get("password").(string),
    58  		Tags:     tags,
    59  	}
    60  
    61  	log.Printf("[DEBUG] RabbitMQ: Attempting to create user %s", name)
    62  
    63  	resp, err := rmqc.PutUser(name, userSettings)
    64  	log.Printf("[DEBUG] RabbitMQ: user creation response: %#v", resp)
    65  	if err != nil {
    66  		return err
    67  	}
    68  
    69  	if resp.StatusCode >= 400 {
    70  		return fmt.Errorf("Error creating RabbitMQ user: %s", resp.Status)
    71  	}
    72  
    73  	d.SetId(name)
    74  
    75  	return ReadUser(d, meta)
    76  }
    77  
    78  func ReadUser(d *schema.ResourceData, meta interface{}) error {
    79  	rmqc := meta.(*rabbithole.Client)
    80  
    81  	user, err := rmqc.GetUser(d.Id())
    82  	if err != nil {
    83  		return checkDeleted(d, err)
    84  	}
    85  
    86  	log.Printf("[DEBUG] RabbitMQ: User retrieved: %#v", user)
    87  
    88  	d.Set("name", user.Name)
    89  
    90  	tags := strings.Split(user.Tags, ",")
    91  	d.Set("tags", tags)
    92  
    93  	return nil
    94  }
    95  
    96  func UpdateUser(d *schema.ResourceData, meta interface{}) error {
    97  	rmqc := meta.(*rabbithole.Client)
    98  
    99  	name := d.Id()
   100  
   101  	if d.HasChange("password") {
   102  		_, newPassword := d.GetChange("password")
   103  
   104  		userSettings := rabbithole.UserSettings{
   105  			Password: newPassword.(string),
   106  		}
   107  
   108  		log.Printf("[DEBUG] RabbitMQ: Attempting to update password for %s", name)
   109  
   110  		resp, err := rmqc.PutUser(name, userSettings)
   111  		log.Printf("[DEBUG] RabbitMQ: Password update response: %#v", resp)
   112  		if err != nil {
   113  			return err
   114  		}
   115  
   116  		if resp.StatusCode >= 400 {
   117  			return fmt.Errorf("Error updating RabbitMQ user: %s", resp.Status)
   118  		}
   119  
   120  	}
   121  
   122  	if d.HasChange("tags") {
   123  		_, newTags := d.GetChange("tags")
   124  
   125  		var tagList []string
   126  		for _, v := range newTags.([]interface{}) {
   127  			tagList = append(tagList, v.(string))
   128  		}
   129  		tags := strings.Join(tagList, ",")
   130  
   131  		userSettings := rabbithole.UserSettings{
   132  			Tags: tags,
   133  		}
   134  
   135  		log.Printf("[DEBUG] RabbitMQ: Attempting to update tags for %s", name)
   136  
   137  		resp, err := rmqc.PutUser(name, userSettings)
   138  		log.Printf("[DEBUG] RabbitMQ: Tags update response: %#v", resp)
   139  		if err != nil {
   140  			return err
   141  		}
   142  
   143  		if resp.StatusCode >= 400 {
   144  			return fmt.Errorf("Error updating RabbitMQ user: %s", resp.Status)
   145  		}
   146  
   147  	}
   148  
   149  	return ReadUser(d, meta)
   150  }
   151  
   152  func DeleteUser(d *schema.ResourceData, meta interface{}) error {
   153  	rmqc := meta.(*rabbithole.Client)
   154  
   155  	name := d.Id()
   156  	log.Printf("[DEBUG] RabbitMQ: Attempting to delete user %s", name)
   157  
   158  	resp, err := rmqc.DeleteUser(name)
   159  	log.Printf("[DEBUG] RabbitMQ: User delete response: %#v", resp)
   160  	if err != nil {
   161  		return err
   162  	}
   163  
   164  	if resp.StatusCode == 404 {
   165  		// the user was automatically deleted
   166  		return nil
   167  	}
   168  
   169  	if resp.StatusCode >= 400 {
   170  		return fmt.Errorf("Error deleting RabbitMQ user: %s", resp.Status)
   171  	}
   172  
   173  	return nil
   174  }