github.com/sarguru/terraform@v0.6.17-0.20160525232901-8fcdfd7e3dc9/builtin/providers/nsone/resource_user.go (about) 1 package nsone 2 3 import ( 4 "github.com/bobtfish/go-nsone-api" 5 "github.com/hashicorp/terraform/helper/schema" 6 ) 7 8 func addPermsSchema(s map[string]*schema.Schema) map[string]*schema.Schema { 9 s["dns_view_zones"] = &schema.Schema{ 10 Type: schema.TypeBool, 11 Optional: true, 12 } 13 s["dns_manage_zones"] = &schema.Schema{ 14 Type: schema.TypeBool, 15 Optional: true, 16 } 17 s["dns_zones_allow_by_default"] = &schema.Schema{ 18 Type: schema.TypeBool, 19 Optional: true, 20 } 21 s["dns_zones_deny"] = &schema.Schema{ 22 Type: schema.TypeList, 23 Optional: true, 24 Elem: &schema.Schema{Type: schema.TypeString}, 25 } 26 s["dns_zones_allow"] = &schema.Schema{ 27 Type: schema.TypeList, 28 Optional: true, 29 Elem: &schema.Schema{Type: schema.TypeString}, 30 } 31 s["data_push_to_datafeeds"] = &schema.Schema{ 32 Type: schema.TypeBool, 33 Optional: true, 34 } 35 s["data_manage_datasources"] = &schema.Schema{ 36 Type: schema.TypeBool, 37 Optional: true, 38 } 39 s["data_manage_datafeeds"] = &schema.Schema{ 40 Type: schema.TypeBool, 41 Optional: true, 42 } 43 s["account_manage_users"] = &schema.Schema{ 44 Type: schema.TypeBool, 45 Optional: true, 46 } 47 s["account_manage_payment_methods"] = &schema.Schema{ 48 Type: schema.TypeBool, 49 Optional: true, 50 } 51 s["account_manage_plan"] = &schema.Schema{ 52 Type: schema.TypeBool, 53 Optional: true, 54 } 55 s["account_manage_teams"] = &schema.Schema{ 56 Type: schema.TypeBool, 57 Optional: true, 58 } 59 s["account_manage_apikeys"] = &schema.Schema{ 60 Type: schema.TypeBool, 61 Optional: true, 62 } 63 s["account_manage_account_settings"] = &schema.Schema{ 64 Type: schema.TypeBool, 65 Optional: true, 66 } 67 s["account_view_activity_log"] = &schema.Schema{ 68 Type: schema.TypeBool, 69 Optional: true, 70 } 71 s["account_view_invoices"] = &schema.Schema{ 72 Type: schema.TypeBool, 73 Optional: true, 74 } 75 s["monitoring_manage_lists"] = &schema.Schema{ 76 Type: schema.TypeBool, 77 Optional: true, 78 } 79 s["monitoring_manage_jobs"] = &schema.Schema{ 80 Type: schema.TypeBool, 81 Optional: true, 82 } 83 s["monitoring_view_jobs"] = &schema.Schema{ 84 Type: schema.TypeBool, 85 Optional: true, 86 } 87 return s 88 } 89 90 func userResource() *schema.Resource { 91 s := map[string]*schema.Schema{ 92 "id": &schema.Schema{ 93 Type: schema.TypeString, 94 Computed: true, 95 }, 96 "name": &schema.Schema{ 97 Type: schema.TypeString, 98 Required: true, 99 }, 100 "username": &schema.Schema{ 101 Type: schema.TypeString, 102 Required: true, 103 }, 104 "email": &schema.Schema{ 105 Type: schema.TypeString, 106 Required: true, 107 }, 108 "notify": &schema.Schema{ 109 Type: schema.TypeMap, 110 Optional: true, 111 Elem: &schema.Resource{ 112 Schema: map[string]*schema.Schema{ 113 "billing": &schema.Schema{ 114 Type: schema.TypeBool, 115 Required: true, 116 }, 117 }, 118 }, 119 }, 120 "teams": &schema.Schema{ 121 Type: schema.TypeList, 122 Optional: true, 123 Elem: &schema.Schema{Type: schema.TypeString}, 124 }, 125 } 126 s = addPermsSchema(s) 127 return &schema.Resource{ 128 Schema: s, 129 Create: UserCreate, 130 Read: UserRead, 131 Update: UserUpdate, 132 Delete: UserDelete, 133 } 134 } 135 136 func permissionsToResourceData(d *schema.ResourceData, permissions nsone.PermissionsMap) { 137 d.Set("dns_view_zones", permissions.Dns.ViewZones) 138 d.Set("dns_manage_zones", permissions.Dns.ManageZones) 139 d.Set("dns_zones_allow_by_default", permissions.Dns.ZonesAllowByDefault) 140 d.Set("dns_zones_deny", permissions.Dns.ZonesDeny) 141 d.Set("dns_zones_allow", permissions.Dns.ZonesAllow) 142 d.Set("data_push_to_datafeeds", permissions.Data.PushToDatafeeds) 143 d.Set("data_manage_datasources", permissions.Data.ManageDatasources) 144 d.Set("data_manage_datafeeds", permissions.Data.ManageDatafeeds) 145 d.Set("account_manage_users", permissions.Account.ManageUsers) 146 d.Set("account_manage_payment_methods", permissions.Account.ManagePaymentMethods) 147 d.Set("account_manage_plan", permissions.Account.ManagePlan) 148 d.Set("account_manage_teams", permissions.Account.ManageTeams) 149 d.Set("account_manage_apikeys", permissions.Account.ManageApikeys) 150 d.Set("account_manage_account_settings", permissions.Account.ManageAccountSettings) 151 d.Set("account_view_activity_log", permissions.Account.ViewActivityLog) 152 d.Set("account_view_invoices", permissions.Account.ViewInvoices) 153 d.Set("monitoring_manage_lists", permissions.Monitoring.ManageLists) 154 d.Set("monitoring_manage_jobs", permissions.Monitoring.ManageJobs) 155 d.Set("monitoring_view_jobs", permissions.Monitoring.ViewJobs) 156 } 157 158 func userToResourceData(d *schema.ResourceData, u *nsone.User) error { 159 d.SetId(u.Username) 160 d.Set("name", u.Name) 161 d.Set("email", u.Email) 162 d.Set("teams", u.Teams) 163 notify := make(map[string]bool) 164 notify["billing"] = u.Notify.Billing 165 d.Set("notify", notify) 166 permissionsToResourceData(d, u.Permissions) 167 return nil 168 } 169 170 func resourceDataToUser(u *nsone.User, d *schema.ResourceData) error { 171 u.Name = d.Get("name").(string) 172 u.Username = d.Get("username").(string) 173 u.Email = d.Get("email").(string) 174 if v, ok := d.GetOk("teams"); ok { 175 teamsRaw := v.([]interface{}) 176 u.Teams = make([]string, len(teamsRaw)) 177 for i, team := range teamsRaw { 178 u.Teams[i] = team.(string) 179 } 180 } else { 181 u.Teams = make([]string, 0) 182 } 183 if v, ok := d.GetOk("notify"); ok { 184 notifyRaw := v.(map[string]interface{}) 185 u.Notify.Billing = notifyRaw["billing"].(bool) 186 } 187 u.Permissions = resourceDataToPermissions(d) 188 return nil 189 } 190 191 // UserCreate creates the given user in ns1 192 func UserCreate(d *schema.ResourceData, meta interface{}) error { 193 client := meta.(*nsone.APIClient) 194 mj := nsone.User{} 195 if err := resourceDataToUser(&mj, d); err != nil { 196 return err 197 } 198 if err := client.CreateUser(&mj); err != nil { 199 return err 200 } 201 return userToResourceData(d, &mj) 202 } 203 204 // UserRead reads the given users data from ns1 205 func UserRead(d *schema.ResourceData, meta interface{}) error { 206 client := meta.(*nsone.APIClient) 207 mj, err := client.GetUser(d.Id()) 208 if err != nil { 209 return err 210 } 211 userToResourceData(d, &mj) 212 return nil 213 } 214 215 // UserDelete deletes the given user from ns1 216 func UserDelete(d *schema.ResourceData, meta interface{}) error { 217 client := meta.(*nsone.APIClient) 218 err := client.DeleteUser(d.Id()) 219 d.SetId("") 220 return err 221 } 222 223 // UserUpdate updates the user with given parameters in ns1 224 func UserUpdate(d *schema.ResourceData, meta interface{}) error { 225 client := meta.(*nsone.APIClient) 226 mj := nsone.User{ 227 Username: d.Id(), 228 } 229 if err := resourceDataToUser(&mj, d); err != nil { 230 return err 231 } 232 if err := client.UpdateUser(&mj); err != nil { 233 return err 234 } 235 userToResourceData(d, &mj) 236 return nil 237 }