github.com/nathanielks/terraform@v0.6.1-0.20170509030759-13e1a62319dc/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 }