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  }