/azurerm/internal/services/storage/tests/resource_arm_storage_share_directory_test.go

https://github.com/terraform-providers/terraform-provider-azurerm · Go · 351 lines · 311 code · 38 blank · 2 comment · 24 complexity · c6c3ab6f080e2dc2e3980f075c9c70ac MD5 · raw file

  1. package tests
  2. import (
  3. "fmt"
  4. "net/http"
  5. "testing"
  6. "github.com/hashicorp/terraform-plugin-sdk/helper/resource"
  7. "github.com/hashicorp/terraform-plugin-sdk/terraform"
  8. "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/acceptance"
  9. "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/clients"
  10. )
  11. func TestAccAzureRMStorageShareDirectory_basic(t *testing.T) {
  12. data := acceptance.BuildTestData(t, "azurerm_storage_share_directory", "test")
  13. resource.ParallelTest(t, resource.TestCase{
  14. PreCheck: func() { acceptance.PreCheck(t) },
  15. Providers: acceptance.SupportedProviders,
  16. CheckDestroy: testCheckAzureRMStorageShareDirectoryDestroy,
  17. Steps: []resource.TestStep{
  18. {
  19. Config: testAccAzureRMStorageShareDirectory_basic(data),
  20. Check: resource.ComposeTestCheckFunc(
  21. testCheckAzureRMStorageShareDirectoryExists(data.ResourceName),
  22. ),
  23. },
  24. data.ImportStep(),
  25. },
  26. })
  27. }
  28. func TestAccAzureRMStorageShareDirectory_uppercase(t *testing.T) {
  29. data := acceptance.BuildTestData(t, "azurerm_storage_share_directory", "test")
  30. resource.ParallelTest(t, resource.TestCase{
  31. PreCheck: func() { acceptance.PreCheck(t) },
  32. Providers: acceptance.SupportedProviders,
  33. CheckDestroy: testCheckAzureRMStorageShareDirectoryDestroy,
  34. Steps: []resource.TestStep{
  35. {
  36. Config: testAccAzureRMStorageShareDirectory_uppercase(data),
  37. Check: resource.ComposeTestCheckFunc(
  38. testCheckAzureRMStorageShareDirectoryExists(data.ResourceName),
  39. ),
  40. },
  41. data.ImportStep(),
  42. },
  43. })
  44. }
  45. func TestAccAzureRMStorageShareDirectory_requiresImport(t *testing.T) {
  46. data := acceptance.BuildTestData(t, "azurerm_storage_share_directory", "test")
  47. resource.ParallelTest(t, resource.TestCase{
  48. PreCheck: func() { acceptance.PreCheck(t) },
  49. Providers: acceptance.SupportedProviders,
  50. CheckDestroy: testCheckAzureRMStorageShareDirectoryDestroy,
  51. Steps: []resource.TestStep{
  52. {
  53. Config: testAccAzureRMStorageShareDirectory_basic(data),
  54. Check: resource.ComposeTestCheckFunc(
  55. testCheckAzureRMStorageShareDirectoryExists(data.ResourceName),
  56. ),
  57. },
  58. data.RequiresImportErrorStep(testAccAzureRMStorageShareDirectory_requiresImport),
  59. },
  60. })
  61. }
  62. func TestAccAzureRMStorageShareDirectory_complete(t *testing.T) {
  63. data := acceptance.BuildTestData(t, "azurerm_storage_share_directory", "test")
  64. resource.ParallelTest(t, resource.TestCase{
  65. PreCheck: func() { acceptance.PreCheck(t) },
  66. Providers: acceptance.SupportedProviders,
  67. CheckDestroy: testCheckAzureRMStorageShareDirectoryDestroy,
  68. Steps: []resource.TestStep{
  69. {
  70. Config: testAccAzureRMStorageShareDirectory_complete(data),
  71. Check: resource.ComposeTestCheckFunc(
  72. testCheckAzureRMStorageShareDirectoryExists(data.ResourceName),
  73. ),
  74. },
  75. data.ImportStep(),
  76. },
  77. })
  78. }
  79. func TestAccAzureRMStorageShareDirectory_update(t *testing.T) {
  80. data := acceptance.BuildTestData(t, "azurerm_storage_share_directory", "test")
  81. resource.ParallelTest(t, resource.TestCase{
  82. PreCheck: func() { acceptance.PreCheck(t) },
  83. Providers: acceptance.SupportedProviders,
  84. CheckDestroy: testCheckAzureRMStorageShareDirectoryDestroy,
  85. Steps: []resource.TestStep{
  86. {
  87. Config: testAccAzureRMStorageShareDirectory_complete(data),
  88. Check: resource.ComposeTestCheckFunc(
  89. testCheckAzureRMStorageShareDirectoryExists(data.ResourceName),
  90. ),
  91. },
  92. data.ImportStep(),
  93. {
  94. Config: testAccAzureRMStorageShareDirectory_updated(data),
  95. Check: resource.ComposeTestCheckFunc(
  96. testCheckAzureRMStorageShareDirectoryExists(data.ResourceName),
  97. ),
  98. },
  99. data.ImportStep(),
  100. },
  101. })
  102. }
  103. func TestAccAzureRMStorageShareDirectory_nested(t *testing.T) {
  104. data := acceptance.BuildTestData(t, "azurerm_storage_share_directory", "parent")
  105. resource.ParallelTest(t, resource.TestCase{
  106. PreCheck: func() { acceptance.PreCheck(t) },
  107. Providers: acceptance.SupportedProviders,
  108. CheckDestroy: testCheckAzureRMStorageShareDirectoryDestroy,
  109. Steps: []resource.TestStep{
  110. {
  111. Config: testAccAzureRMStorageShareDirectory_nested(data),
  112. Check: resource.ComposeTestCheckFunc(
  113. testCheckAzureRMStorageShareDirectoryExists(data.ResourceName),
  114. testCheckAzureRMStorageShareDirectoryExists("azurerm_storage_share_directory.child_one"),
  115. testCheckAzureRMStorageShareDirectoryExists("azurerm_storage_share_directory.child_two"),
  116. testCheckAzureRMStorageShareDirectoryExists("azurerm_storage_share_directory.multiple_child_one"),
  117. ),
  118. },
  119. data.ImportStep(),
  120. },
  121. })
  122. }
  123. func testCheckAzureRMStorageShareDirectoryExists(resourceName string) resource.TestCheckFunc {
  124. return func(s *terraform.State) error {
  125. storageClient := acceptance.AzureProvider.Meta().(*clients.Client).Storage
  126. ctx := acceptance.AzureProvider.Meta().(*clients.Client).StopContext
  127. // Ensure we have enough information in state to look up in API
  128. rs, ok := s.RootModule().Resources[resourceName]
  129. if !ok {
  130. return fmt.Errorf("Not found: %s", resourceName)
  131. }
  132. name := rs.Primary.Attributes["name"]
  133. shareName := rs.Primary.Attributes["share_name"]
  134. accountName := rs.Primary.Attributes["storage_account_name"]
  135. account, err := storageClient.FindAccount(ctx, accountName)
  136. if err != nil {
  137. return fmt.Errorf("Error retrieving Account %q for Directory %q (Share %q): %s", accountName, name, shareName, err)
  138. }
  139. if account == nil {
  140. return fmt.Errorf("Unable to locate Storage Account %q!", accountName)
  141. }
  142. client, err := storageClient.FileShareDirectoriesClient(ctx, *account)
  143. if err != nil {
  144. return fmt.Errorf("Error building FileShare Client: %s", err)
  145. }
  146. resp, err := client.Get(ctx, accountName, shareName, name)
  147. if err != nil {
  148. return fmt.Errorf("Bad: Get on FileShareDirectoriesClient: %+v", err)
  149. }
  150. if resp.StatusCode == http.StatusNotFound {
  151. return fmt.Errorf("Bad: Directory %q (File Share %q / Account %q / Resource Group %q) does not exist", name, shareName, accountName, account.ResourceGroup)
  152. }
  153. return nil
  154. }
  155. }
  156. func testCheckAzureRMStorageShareDirectoryDestroy(s *terraform.State) error {
  157. storageClient := acceptance.AzureProvider.Meta().(*clients.Client).Storage
  158. ctx := acceptance.AzureProvider.Meta().(*clients.Client).StopContext
  159. for _, rs := range s.RootModule().Resources {
  160. if rs.Type != "azurerm_storage_share_directory" {
  161. continue
  162. }
  163. name := rs.Primary.Attributes["name"]
  164. shareName := rs.Primary.Attributes["share_name"]
  165. accountName := rs.Primary.Attributes["storage_account_name"]
  166. account, err := storageClient.FindAccount(ctx, accountName)
  167. if err != nil {
  168. return fmt.Errorf("Error retrieving Account %q for Directory %q (Share %q): %s", accountName, name, shareName, err)
  169. }
  170. // not found, the account's gone
  171. if account == nil {
  172. return nil
  173. }
  174. if err != nil {
  175. return fmt.Errorf("Error locating Resource Group for Storage Share Directory %q (Share %s, Account %s): %s", name, shareName, accountName, err)
  176. }
  177. client, err := storageClient.FileShareDirectoriesClient(ctx, *account)
  178. if err != nil {
  179. return fmt.Errorf("Error building FileShare Client: %s", err)
  180. }
  181. resp, err := client.Get(ctx, accountName, shareName, name)
  182. if err != nil {
  183. return nil
  184. }
  185. return fmt.Errorf("File Share still exists:\n%#v", resp)
  186. }
  187. return nil
  188. }
  189. func testAccAzureRMStorageShareDirectory_basic(data acceptance.TestData) string {
  190. template := testAccAzureRMStorageShareDirectory_template(data)
  191. return fmt.Sprintf(`
  192. %s
  193. resource "azurerm_storage_share_directory" "test" {
  194. name = "dir"
  195. share_name = azurerm_storage_share.test.name
  196. storage_account_name = azurerm_storage_account.test.name
  197. }
  198. `, template)
  199. }
  200. func testAccAzureRMStorageShareDirectory_uppercase(data acceptance.TestData) string {
  201. template := testAccAzureRMStorageShareDirectory_template(data)
  202. return fmt.Sprintf(`
  203. %s
  204. resource "azurerm_storage_share_directory" "test" {
  205. name = "UpperCaseCharacterS"
  206. share_name = azurerm_storage_share.test.name
  207. storage_account_name = azurerm_storage_account.test.name
  208. }
  209. `, template)
  210. }
  211. func testAccAzureRMStorageShareDirectory_requiresImport(data acceptance.TestData) string {
  212. template := testAccAzureRMStorageShareDirectory_basic(data)
  213. return fmt.Sprintf(`
  214. %s
  215. resource "azurerm_storage_share_directory" "import" {
  216. name = azurerm_storage_share_directory.test.name
  217. share_name = azurerm_storage_share_directory.test.share_name
  218. storage_account_name = azurerm_storage_share_directory.test.storage_account_name
  219. }
  220. `, template)
  221. }
  222. func testAccAzureRMStorageShareDirectory_complete(data acceptance.TestData) string {
  223. template := testAccAzureRMStorageShareDirectory_template(data)
  224. return fmt.Sprintf(`
  225. %s
  226. resource "azurerm_storage_share_directory" "test" {
  227. name = "dir"
  228. share_name = azurerm_storage_share.test.name
  229. storage_account_name = azurerm_storage_account.test.name
  230. metadata = {
  231. hello = "world"
  232. }
  233. }
  234. `, template)
  235. }
  236. func testAccAzureRMStorageShareDirectory_updated(data acceptance.TestData) string {
  237. template := testAccAzureRMStorageShareDirectory_template(data)
  238. return fmt.Sprintf(`
  239. %s
  240. resource "azurerm_storage_share_directory" "test" {
  241. name = "dir"
  242. share_name = azurerm_storage_share.test.name
  243. storage_account_name = azurerm_storage_account.test.name
  244. metadata = {
  245. hello = "world"
  246. sunshine = "at dawn"
  247. }
  248. }
  249. `, template)
  250. }
  251. func testAccAzureRMStorageShareDirectory_nested(data acceptance.TestData) string {
  252. template := testAccAzureRMStorageShareDirectory_template(data)
  253. return fmt.Sprintf(`
  254. %s
  255. resource "azurerm_storage_share_directory" "parent" {
  256. name = "123--parent-dir"
  257. share_name = azurerm_storage_share.test.name
  258. storage_account_name = azurerm_storage_account.test.name
  259. }
  260. resource "azurerm_storage_share_directory" "child_one" {
  261. name = "${azurerm_storage_share_directory.parent.name}/child1"
  262. share_name = azurerm_storage_share.test.name
  263. storage_account_name = azurerm_storage_account.test.name
  264. }
  265. resource "azurerm_storage_share_directory" "child_two" {
  266. name = "${azurerm_storage_share_directory.child_one.name}/childtwo--123"
  267. share_name = azurerm_storage_share.test.name
  268. storage_account_name = azurerm_storage_account.test.name
  269. }
  270. resource "azurerm_storage_share_directory" "multiple_child_one" {
  271. name = "${azurerm_storage_share_directory.parent.name}/c"
  272. share_name = azurerm_storage_share.test.name
  273. storage_account_name = azurerm_storage_account.test.name
  274. }
  275. `, template)
  276. }
  277. func testAccAzureRMStorageShareDirectory_template(data acceptance.TestData) string {
  278. return fmt.Sprintf(`
  279. provider "azurerm" {
  280. features {}
  281. }
  282. resource "azurerm_resource_group" "test" {
  283. name = "acctestRG-%d"
  284. location = "%s"
  285. }
  286. resource "azurerm_storage_account" "test" {
  287. name = "acctestsa%s"
  288. resource_group_name = azurerm_resource_group.test.name
  289. location = azurerm_resource_group.test.location
  290. account_tier = "Standard"
  291. account_replication_type = "LRS"
  292. }
  293. resource "azurerm_storage_share" "test" {
  294. name = "fileshare"
  295. storage_account_name = azurerm_storage_account.test.name
  296. quota = 50
  297. }
  298. `, data.RandomInteger, data.Locations.Primary, data.RandomString)
  299. }