github.com/danp/terraform@v0.9.5-0.20170426144147-39d740081351/builtin/providers/mysql/resource_grant_test.go (about) 1 package mysql 2 3 import ( 4 "fmt" 5 "log" 6 "strings" 7 "testing" 8 9 mysqlc "github.com/ziutek/mymysql/mysql" 10 11 "github.com/hashicorp/terraform/helper/resource" 12 "github.com/hashicorp/terraform/terraform" 13 ) 14 15 func TestAccGrant(t *testing.T) { 16 resource.Test(t, resource.TestCase{ 17 PreCheck: func() { testAccPreCheck(t) }, 18 Providers: testAccProviders, 19 CheckDestroy: testAccGrantCheckDestroy, 20 Steps: []resource.TestStep{ 21 resource.TestStep{ 22 Config: testAccGrantConfig_basic, 23 Check: resource.ComposeTestCheckFunc( 24 testAccPrivilegeExists("mysql_grant.test", "SELECT"), 25 resource.TestCheckResourceAttr("mysql_grant.test", "user", "jdoe"), 26 resource.TestCheckResourceAttr("mysql_grant.test", "host", "example.com"), 27 resource.TestCheckResourceAttr("mysql_grant.test", "database", "foo"), 28 ), 29 }, 30 }, 31 }) 32 } 33 34 func testAccPrivilegeExists(rn string, privilege string) resource.TestCheckFunc { 35 return func(s *terraform.State) error { 36 rs, ok := s.RootModule().Resources[rn] 37 if !ok { 38 return fmt.Errorf("resource not found: %s", rn) 39 } 40 41 if rs.Primary.ID == "" { 42 return fmt.Errorf("grant id not set") 43 } 44 45 id := strings.Split(rs.Primary.ID, ":") 46 userhost := strings.Split(id[0], "@") 47 user := userhost[0] 48 host := userhost[1] 49 50 conn := testAccProvider.Meta().(*providerConfiguration).Conn 51 stmtSQL := fmt.Sprintf("SHOW GRANTS for '%s'@'%s'", user, host) 52 log.Println("Executing statement:", stmtSQL) 53 rows, _, err := conn.Query(stmtSQL) 54 if err != nil { 55 return fmt.Errorf("error reading grant: %s", err) 56 } 57 58 if len(rows) == 0 { 59 return fmt.Errorf("grant not found for '%s'@'%s'", user, host) 60 } 61 62 privilegeFound := false 63 for _, row := range rows { 64 log.Printf("Result Row: %s", row[0]) 65 privIndex := strings.Index(string(row[0].([]byte)), privilege) 66 if privIndex != -1 { 67 privilegeFound = true 68 } 69 } 70 71 if !privilegeFound { 72 return fmt.Errorf("grant no found for '%s'@'%s'", user, host) 73 } 74 75 return nil 76 } 77 } 78 79 func testAccGrantCheckDestroy(s *terraform.State) error { 80 conn := testAccProvider.Meta().(*providerConfiguration).Conn 81 82 for _, rs := range s.RootModule().Resources { 83 if rs.Type != "mysql_grant" { 84 continue 85 } 86 87 id := strings.Split(rs.Primary.ID, ":") 88 userhost := strings.Split(id[0], "@") 89 user := userhost[0] 90 host := userhost[1] 91 92 stmtSQL := fmt.Sprintf("SHOW GRANTS for '%s'@'%s'", user, host) 93 log.Println("Executing statement:", stmtSQL) 94 rows, _, err := conn.Query(stmtSQL) 95 if err != nil { 96 if mysqlErr, ok := err.(*mysqlc.Error); ok { 97 if mysqlErr.Code == mysqlc.ER_NONEXISTING_GRANT { 98 return nil 99 } 100 } 101 102 return fmt.Errorf("error reading grant: %s", err) 103 } 104 105 if len(rows) != 0 { 106 return fmt.Errorf("grant still exists for'%s'@'%s'", user, host) 107 } 108 } 109 return nil 110 } 111 112 const testAccGrantConfig_basic = ` 113 resource "mysql_user" "test" { 114 user = "jdoe" 115 host = "example.com" 116 password = "password" 117 } 118 119 resource "mysql_grant" "test" { 120 user = "${mysql_user.test.user}" 121 host = "${mysql_user.test.host}" 122 database = "foo" 123 privileges = ["UPDATE", "SELECT"] 124 } 125 `