github.com/bfallik/terraform@v0.7.1-0.20160814101525-d3a4714efbf5/builtin/providers/mysql/resource_grant.go (about)

     1  package mysql
     2  
     3  import (
     4  	"fmt"
     5  	"log"
     6  	"strings"
     7  
     8  	mysqlc "github.com/ziutek/mymysql/mysql"
     9  
    10  	"github.com/hashicorp/terraform/helper/schema"
    11  )
    12  
    13  func resourceGrant() *schema.Resource {
    14  	return &schema.Resource{
    15  		Create: CreateGrant,
    16  		Update: nil,
    17  		Read:   ReadGrant,
    18  		Delete: DeleteGrant,
    19  
    20  		Schema: map[string]*schema.Schema{
    21  			"user": &schema.Schema{
    22  				Type:     schema.TypeString,
    23  				Required: true,
    24  				ForceNew: true,
    25  			},
    26  
    27  			"host": &schema.Schema{
    28  				Type:     schema.TypeString,
    29  				Optional: true,
    30  				ForceNew: true,
    31  				Default:  "localhost",
    32  			},
    33  
    34  			"database": &schema.Schema{
    35  				Type:     schema.TypeString,
    36  				Required: true,
    37  				ForceNew: true,
    38  			},
    39  
    40  			"privileges": &schema.Schema{
    41  				Type:     schema.TypeSet,
    42  				Required: true,
    43  				ForceNew: true,
    44  				Elem:     &schema.Schema{Type: schema.TypeString},
    45  				Set:      schema.HashString,
    46  			},
    47  
    48  			"grant": &schema.Schema{
    49  				Type:     schema.TypeBool,
    50  				Optional: true,
    51  				ForceNew: true,
    52  				Default:  false,
    53  			},
    54  		},
    55  	}
    56  }
    57  
    58  func CreateGrant(d *schema.ResourceData, meta interface{}) error {
    59  	conn := meta.(mysqlc.Conn)
    60  
    61  	// create a comma-delimited string of privileges
    62  	var privileges string
    63  	var privilegesList []string
    64  	vL := d.Get("privileges").(*schema.Set).List()
    65  	for _, v := range vL {
    66  		privilegesList = append(privilegesList, v.(string))
    67  	}
    68  	privileges = strings.Join(privilegesList, ",")
    69  
    70  	stmtSQL := fmt.Sprintf("GRANT %s on %s.* TO '%s'@'%s'",
    71  		privileges,
    72  		d.Get("database").(string),
    73  		d.Get("user").(string),
    74  		d.Get("host").(string))
    75  
    76  	if d.Get("grant").(bool) {
    77  		stmtSQL = " WITH GRANT OPTION"
    78  	}
    79  
    80  	log.Println("Executing statement:", stmtSQL)
    81  	_, _, err := conn.Query(stmtSQL)
    82  	if err != nil {
    83  		return err
    84  	}
    85  
    86  	user := fmt.Sprintf("%s@%s:%s", d.Get("user").(string), d.Get("host").(string), d.Get("database"))
    87  	d.SetId(user)
    88  
    89  	return ReadGrant(d, meta)
    90  }
    91  
    92  func ReadGrant(d *schema.ResourceData, meta interface{}) error {
    93  	// At this time, all attributes are supplied by the user
    94  	return nil
    95  }
    96  
    97  func DeleteGrant(d *schema.ResourceData, meta interface{}) error {
    98  	conn := meta.(mysqlc.Conn)
    99  
   100  	stmtSQL := fmt.Sprintf("REVOKE GRANT OPTION ON %s.* FROM '%s'@'%s'",
   101  		d.Get("database").(string),
   102  		d.Get("user").(string),
   103  		d.Get("host").(string))
   104  
   105  	log.Println("Executing statement:", stmtSQL)
   106  	_, _, err := conn.Query(stmtSQL)
   107  	if err != nil {
   108  		return err
   109  	}
   110  
   111  	stmtSQL = fmt.Sprintf("REVOKE ALL ON %s.* FROM '%s'@'%s'",
   112  		d.Get("database").(string),
   113  		d.Get("user").(string),
   114  		d.Get("host").(string))
   115  
   116  	log.Println("Executing statement:", stmtSQL)
   117  	_, _, err = conn.Query(stmtSQL)
   118  	if err != nil {
   119  		return err
   120  	}
   121  
   122  	return nil
   123  }