github.com/vtorhonen/terraform@v0.9.0-beta2.0.20170307220345-5d894e4ffda7/builtin/providers/azurerm/resource_arm_storage_blob_test.go (about) 1 package azurerm 2 3 import ( 4 "crypto/rand" 5 "fmt" 6 "io" 7 "io/ioutil" 8 "testing" 9 10 "strings" 11 12 "github.com/Azure/azure-sdk-for-go/storage" 13 "github.com/hashicorp/terraform/helper/acctest" 14 "github.com/hashicorp/terraform/helper/resource" 15 "github.com/hashicorp/terraform/terraform" 16 ) 17 18 func TestResourceAzureRMStorageBlobType_validation(t *testing.T) { 19 cases := []struct { 20 Value string 21 ErrCount int 22 }{ 23 { 24 Value: "unknown", 25 ErrCount: 1, 26 }, 27 { 28 Value: "page", 29 ErrCount: 0, 30 }, 31 { 32 Value: "block", 33 ErrCount: 0, 34 }, 35 { 36 Value: "BLOCK", 37 ErrCount: 0, 38 }, 39 { 40 Value: "Block", 41 ErrCount: 0, 42 }, 43 } 44 45 for _, tc := range cases { 46 _, errors := validateArmStorageBlobType(tc.Value, "azurerm_storage_blob") 47 48 if len(errors) != tc.ErrCount { 49 t.Fatalf("Expected the Azure RM Storage Blob type to trigger a validation error") 50 } 51 } 52 } 53 54 func TestResourceAzureRMStorageBlobSize_validation(t *testing.T) { 55 cases := []struct { 56 Value int 57 ErrCount int 58 }{ 59 { 60 Value: 511, 61 ErrCount: 1, 62 }, 63 { 64 Value: 512, 65 ErrCount: 0, 66 }, 67 { 68 Value: 1024, 69 ErrCount: 0, 70 }, 71 { 72 Value: 2048, 73 ErrCount: 0, 74 }, 75 { 76 Value: 5120, 77 ErrCount: 0, 78 }, 79 } 80 81 for _, tc := range cases { 82 _, errors := validateArmStorageBlobSize(tc.Value, "azurerm_storage_blob") 83 84 if len(errors) != tc.ErrCount { 85 t.Fatalf("Expected the Azure RM Storage Blob size to trigger a validation error") 86 } 87 } 88 } 89 90 func TestResourceAzureRMStorageBlobParallelism_validation(t *testing.T) { 91 cases := []struct { 92 Value int 93 ErrCount int 94 }{ 95 { 96 Value: 1, 97 ErrCount: 0, 98 }, 99 { 100 Value: 0, 101 ErrCount: 1, 102 }, 103 { 104 Value: -1, 105 ErrCount: 1, 106 }, 107 } 108 109 for _, tc := range cases { 110 _, errors := validateArmStorageBlobParallelism(tc.Value, "azurerm_storage_blob") 111 112 if len(errors) != tc.ErrCount { 113 t.Fatalf("Expected the Azure RM Storage Blob parallelism to trigger a validation error") 114 } 115 } 116 } 117 118 func TestResourceAzureRMStorageBlobAttempts_validation(t *testing.T) { 119 cases := []struct { 120 Value int 121 ErrCount int 122 }{ 123 { 124 Value: 1, 125 ErrCount: 0, 126 }, 127 { 128 Value: 0, 129 ErrCount: 1, 130 }, 131 { 132 Value: -1, 133 ErrCount: 1, 134 }, 135 } 136 137 for _, tc := range cases { 138 _, errors := validateArmStorageBlobAttempts(tc.Value, "azurerm_storage_blob") 139 140 if len(errors) != tc.ErrCount { 141 t.Fatalf("Expected the Azure RM Storage Blob attempts to trigger a validation error") 142 } 143 } 144 } 145 146 func TestAccAzureRMStorageBlob_basic(t *testing.T) { 147 ri := acctest.RandInt() 148 rs := strings.ToLower(acctest.RandString(11)) 149 config := fmt.Sprintf(testAccAzureRMStorageBlob_basic, ri, rs) 150 151 resource.Test(t, resource.TestCase{ 152 PreCheck: func() { testAccPreCheck(t) }, 153 Providers: testAccProviders, 154 CheckDestroy: testCheckAzureRMStorageBlobDestroy, 155 Steps: []resource.TestStep{ 156 resource.TestStep{ 157 Config: config, 158 Check: resource.ComposeTestCheckFunc( 159 testCheckAzureRMStorageBlobExists("azurerm_storage_blob.test"), 160 ), 161 }, 162 }, 163 }) 164 } 165 166 func TestAccAzureRMStorageBlob_disappears(t *testing.T) { 167 ri := acctest.RandInt() 168 rs := strings.ToLower(acctest.RandString(11)) 169 config := fmt.Sprintf(testAccAzureRMStorageBlob_basic, ri, rs) 170 171 resource.Test(t, resource.TestCase{ 172 PreCheck: func() { testAccPreCheck(t) }, 173 Providers: testAccProviders, 174 CheckDestroy: testCheckAzureRMStorageBlobDestroy, 175 Steps: []resource.TestStep{ 176 resource.TestStep{ 177 Config: config, 178 Check: resource.ComposeTestCheckFunc( 179 testCheckAzureRMStorageBlobExists("azurerm_storage_blob.test"), 180 testCheckAzureRMStorageBlobDisappears("azurerm_storage_blob.test"), 181 ), 182 ExpectNonEmptyPlan: true, 183 }, 184 }, 185 }) 186 } 187 188 func TestAccAzureRMStorageBlobBlock_source(t *testing.T) { 189 ri := acctest.RandInt() 190 rs1 := strings.ToLower(acctest.RandString(11)) 191 sourceBlob, err := ioutil.TempFile("", "") 192 if err != nil { 193 t.Fatalf("Failed to create local source blob file") 194 } 195 196 _, err = io.CopyN(sourceBlob, rand.Reader, 25*1024*1024) 197 if err != nil { 198 t.Fatalf("Failed to write random test to source blob") 199 } 200 201 err = sourceBlob.Close() 202 if err != nil { 203 t.Fatalf("Failed to close source blob") 204 } 205 206 config := fmt.Sprintf(testAccAzureRMStorageBlobBlock_source, ri, rs1, sourceBlob.Name()) 207 208 resource.Test(t, resource.TestCase{ 209 PreCheck: func() { testAccPreCheck(t) }, 210 Providers: testAccProviders, 211 CheckDestroy: testCheckAzureRMStorageBlobDestroy, 212 Steps: []resource.TestStep{ 213 resource.TestStep{ 214 Config: config, 215 Check: resource.ComposeTestCheckFunc( 216 testCheckAzureRMStorageBlobMatchesFile("azurerm_storage_blob.source", storage.BlobTypeBlock, sourceBlob.Name()), 217 ), 218 }, 219 }, 220 }) 221 } 222 223 func TestAccAzureRMStorageBlobPage_source(t *testing.T) { 224 ri := acctest.RandInt() 225 rs1 := strings.ToLower(acctest.RandString(11)) 226 sourceBlob, err := ioutil.TempFile("", "") 227 if err != nil { 228 t.Fatalf("Failed to create local source blob file") 229 } 230 231 err = sourceBlob.Truncate(25*1024*1024 + 512) 232 if err != nil { 233 t.Fatalf("Failed to truncate file to 25M") 234 } 235 236 for i := int64(0); i < 20; i = i + 2 { 237 randomBytes := make([]byte, 1*1024*1024) 238 _, err = rand.Read(randomBytes) 239 if err != nil { 240 t.Fatalf("Failed to read random bytes") 241 } 242 243 _, err = sourceBlob.WriteAt(randomBytes, i*1024*1024) 244 if err != nil { 245 t.Fatalf("Failed to write random bytes to file") 246 } 247 } 248 249 randomBytes := make([]byte, 5*1024*1024) 250 _, err = rand.Read(randomBytes) 251 if err != nil { 252 t.Fatalf("Failed to read random bytes") 253 } 254 255 _, err = sourceBlob.WriteAt(randomBytes, 20*1024*1024) 256 if err != nil { 257 t.Fatalf("Failed to write random bytes to file") 258 } 259 260 err = sourceBlob.Close() 261 if err != nil { 262 t.Fatalf("Failed to close source blob") 263 } 264 265 config := fmt.Sprintf(testAccAzureRMStorageBlobPage_source, ri, rs1, sourceBlob.Name()) 266 267 resource.Test(t, resource.TestCase{ 268 PreCheck: func() { testAccPreCheck(t) }, 269 Providers: testAccProviders, 270 CheckDestroy: testCheckAzureRMStorageBlobDestroy, 271 Steps: []resource.TestStep{ 272 resource.TestStep{ 273 Config: config, 274 Check: resource.ComposeTestCheckFunc( 275 testCheckAzureRMStorageBlobMatchesFile("azurerm_storage_blob.source", storage.BlobTypePage, sourceBlob.Name()), 276 ), 277 }, 278 }, 279 }) 280 } 281 282 func TestAccAzureRMStorageBlob_source_uri(t *testing.T) { 283 ri := acctest.RandInt() 284 rs1 := strings.ToLower(acctest.RandString(11)) 285 sourceBlob, err := ioutil.TempFile("", "") 286 if err != nil { 287 t.Fatalf("Failed to create local source blob file") 288 } 289 290 _, err = io.CopyN(sourceBlob, rand.Reader, 25*1024*1024) 291 if err != nil { 292 t.Fatalf("Failed to write random test to source blob") 293 } 294 295 err = sourceBlob.Close() 296 if err != nil { 297 t.Fatalf("Failed to close source blob") 298 } 299 300 config := fmt.Sprintf(testAccAzureRMStorageBlob_source_uri, ri, rs1, sourceBlob.Name()) 301 302 resource.Test(t, resource.TestCase{ 303 PreCheck: func() { testAccPreCheck(t) }, 304 Providers: testAccProviders, 305 CheckDestroy: testCheckAzureRMStorageBlobDestroy, 306 Steps: []resource.TestStep{ 307 resource.TestStep{ 308 Config: config, 309 Check: resource.ComposeTestCheckFunc( 310 testCheckAzureRMStorageBlobMatchesFile("azurerm_storage_blob.destination", storage.BlobTypeBlock, sourceBlob.Name()), 311 ), 312 }, 313 }, 314 }) 315 } 316 317 func testCheckAzureRMStorageBlobExists(name string) resource.TestCheckFunc { 318 return func(s *terraform.State) error { 319 320 rs, ok := s.RootModule().Resources[name] 321 if !ok { 322 return fmt.Errorf("Not found: %s", name) 323 } 324 325 name := rs.Primary.Attributes["name"] 326 storageAccountName := rs.Primary.Attributes["storage_account_name"] 327 storageContainerName := rs.Primary.Attributes["storage_container_name"] 328 resourceGroup, hasResourceGroup := rs.Primary.Attributes["resource_group_name"] 329 if !hasResourceGroup { 330 return fmt.Errorf("Bad: no resource group found in state for storage blob: %s", name) 331 } 332 333 armClient := testAccProvider.Meta().(*ArmClient) 334 blobClient, accountExists, err := armClient.getBlobStorageClientForStorageAccount(resourceGroup, storageAccountName) 335 if err != nil { 336 return err 337 } 338 if !accountExists { 339 return fmt.Errorf("Bad: Storage Account %q does not exist", storageAccountName) 340 } 341 342 exists, err := blobClient.BlobExists(storageContainerName, name) 343 if err != nil { 344 return err 345 } 346 347 if !exists { 348 return fmt.Errorf("Bad: Storage Blob %q (storage container: %q) does not exist", name, storageContainerName) 349 } 350 351 return nil 352 } 353 } 354 355 func testCheckAzureRMStorageBlobDisappears(name string) resource.TestCheckFunc { 356 return func(s *terraform.State) error { 357 358 rs, ok := s.RootModule().Resources[name] 359 if !ok { 360 return fmt.Errorf("Not found: %s", name) 361 } 362 363 name := rs.Primary.Attributes["name"] 364 storageAccountName := rs.Primary.Attributes["storage_account_name"] 365 storageContainerName := rs.Primary.Attributes["storage_container_name"] 366 resourceGroup, hasResourceGroup := rs.Primary.Attributes["resource_group_name"] 367 if !hasResourceGroup { 368 return fmt.Errorf("Bad: no resource group found in state for storage blob: %s", name) 369 } 370 371 armClient := testAccProvider.Meta().(*ArmClient) 372 blobClient, accountExists, err := armClient.getBlobStorageClientForStorageAccount(resourceGroup, storageAccountName) 373 if err != nil { 374 return err 375 } 376 if !accountExists { 377 return fmt.Errorf("Bad: Storage Account %q does not exist", storageAccountName) 378 } 379 380 _, err = blobClient.DeleteBlobIfExists(storageContainerName, name, map[string]string{}) 381 if err != nil { 382 return err 383 } 384 385 return nil 386 } 387 } 388 389 func testCheckAzureRMStorageBlobMatchesFile(name string, kind storage.BlobType, filePath string) resource.TestCheckFunc { 390 return func(s *terraform.State) error { 391 392 rs, ok := s.RootModule().Resources[name] 393 if !ok { 394 return fmt.Errorf("Not found: %s", name) 395 } 396 397 name := rs.Primary.Attributes["name"] 398 storageAccountName := rs.Primary.Attributes["storage_account_name"] 399 storageContainerName := rs.Primary.Attributes["storage_container_name"] 400 resourceGroup, hasResourceGroup := rs.Primary.Attributes["resource_group_name"] 401 if !hasResourceGroup { 402 return fmt.Errorf("Bad: no resource group found in state for storage blob: %s", name) 403 } 404 405 armClient := testAccProvider.Meta().(*ArmClient) 406 blobClient, accountExists, err := armClient.getBlobStorageClientForStorageAccount(resourceGroup, storageAccountName) 407 if err != nil { 408 return err 409 } 410 if !accountExists { 411 return fmt.Errorf("Bad: Storage Account %q does not exist", storageAccountName) 412 } 413 414 properties, err := blobClient.GetBlobProperties(storageContainerName, name) 415 if err != nil { 416 return err 417 } 418 419 if properties.BlobType != kind { 420 return fmt.Errorf("Bad: blob type %q does not match expected type %q", properties.BlobType, kind) 421 } 422 423 blob, err := blobClient.GetBlob(storageContainerName, name) 424 if err != nil { 425 return err 426 } 427 428 contents, err := ioutil.ReadAll(blob) 429 if err != nil { 430 return err 431 } 432 defer blob.Close() 433 434 expectedContents, err := ioutil.ReadFile(filePath) 435 if err != nil { 436 return err 437 } 438 439 if string(contents) != string(expectedContents) { 440 return fmt.Errorf("Bad: Storage Blob %q (storage container: %q) does not match contents", name, storageContainerName) 441 } 442 443 return nil 444 } 445 } 446 447 func testCheckAzureRMStorageBlobDestroy(s *terraform.State) error { 448 for _, rs := range s.RootModule().Resources { 449 if rs.Type != "azurerm_storage_blob" { 450 continue 451 } 452 453 name := rs.Primary.Attributes["name"] 454 storageAccountName := rs.Primary.Attributes["storage_account_name"] 455 storageContainerName := rs.Primary.Attributes["storage_container_name"] 456 resourceGroup, hasResourceGroup := rs.Primary.Attributes["resource_group_name"] 457 if !hasResourceGroup { 458 return fmt.Errorf("Bad: no resource group found in state for storage blob: %s", name) 459 } 460 461 armClient := testAccProvider.Meta().(*ArmClient) 462 blobClient, accountExists, err := armClient.getBlobStorageClientForStorageAccount(resourceGroup, storageAccountName) 463 if err != nil { 464 return nil 465 } 466 if !accountExists { 467 return nil 468 } 469 470 exists, err := blobClient.BlobExists(storageContainerName, name) 471 if err != nil { 472 return nil 473 } 474 475 if exists { 476 return fmt.Errorf("Bad: Storage Blob %q (storage container: %q) still exists", name, storageContainerName) 477 } 478 } 479 480 return nil 481 } 482 483 var testAccAzureRMStorageBlob_basic = ` 484 resource "azurerm_resource_group" "test" { 485 name = "acctestRG-%d" 486 location = "westus" 487 } 488 489 resource "azurerm_storage_account" "test" { 490 name = "acctestacc%s" 491 resource_group_name = "${azurerm_resource_group.test.name}" 492 location = "westus" 493 account_type = "Standard_LRS" 494 495 tags { 496 environment = "staging" 497 } 498 } 499 500 resource "azurerm_storage_container" "test" { 501 name = "vhds" 502 resource_group_name = "${azurerm_resource_group.test.name}" 503 storage_account_name = "${azurerm_storage_account.test.name}" 504 container_access_type = "private" 505 } 506 507 resource "azurerm_storage_blob" "test" { 508 name = "herpderp1.vhd" 509 510 resource_group_name = "${azurerm_resource_group.test.name}" 511 storage_account_name = "${azurerm_storage_account.test.name}" 512 storage_container_name = "${azurerm_storage_container.test.name}" 513 514 type = "page" 515 size = 5120 516 } 517 ` 518 519 var testAccAzureRMStorageBlobBlock_source = ` 520 resource "azurerm_resource_group" "test" { 521 name = "acctestRG-%d" 522 location = "westus" 523 } 524 525 resource "azurerm_storage_account" "source" { 526 name = "acctestacc%s" 527 resource_group_name = "${azurerm_resource_group.test.name}" 528 location = "westus" 529 account_type = "Standard_LRS" 530 531 tags { 532 environment = "staging" 533 } 534 } 535 536 resource "azurerm_storage_container" "source" { 537 name = "source" 538 resource_group_name = "${azurerm_resource_group.test.name}" 539 storage_account_name = "${azurerm_storage_account.source.name}" 540 container_access_type = "blob" 541 } 542 543 resource "azurerm_storage_blob" "source" { 544 name = "source.vhd" 545 546 resource_group_name = "${azurerm_resource_group.test.name}" 547 storage_account_name = "${azurerm_storage_account.source.name}" 548 storage_container_name = "${azurerm_storage_container.source.name}" 549 550 type = "block" 551 source = "%s" 552 parallelism = 4 553 attempts = 2 554 } 555 ` 556 557 var testAccAzureRMStorageBlobPage_source = ` 558 resource "azurerm_resource_group" "test" { 559 name = "acctestRG-%d" 560 location = "westus" 561 } 562 563 resource "azurerm_storage_account" "source" { 564 name = "acctestacc%s" 565 resource_group_name = "${azurerm_resource_group.test.name}" 566 location = "westus" 567 account_type = "Standard_LRS" 568 569 tags { 570 environment = "staging" 571 } 572 } 573 574 resource "azurerm_storage_container" "source" { 575 name = "source" 576 resource_group_name = "${azurerm_resource_group.test.name}" 577 storage_account_name = "${azurerm_storage_account.source.name}" 578 container_access_type = "blob" 579 } 580 581 resource "azurerm_storage_blob" "source" { 582 name = "source.vhd" 583 584 resource_group_name = "${azurerm_resource_group.test.name}" 585 storage_account_name = "${azurerm_storage_account.source.name}" 586 storage_container_name = "${azurerm_storage_container.source.name}" 587 588 type = "page" 589 source = "%s" 590 parallelism = 3 591 attempts = 3 592 } 593 ` 594 595 var testAccAzureRMStorageBlob_source_uri = ` 596 resource "azurerm_resource_group" "test" { 597 name = "acctestRG-%d" 598 location = "westus" 599 } 600 601 resource "azurerm_storage_account" "source" { 602 name = "acctestacc%s" 603 resource_group_name = "${azurerm_resource_group.test.name}" 604 location = "westus" 605 account_type = "Standard_LRS" 606 607 tags { 608 environment = "staging" 609 } 610 } 611 612 resource "azurerm_storage_container" "source" { 613 name = "source" 614 resource_group_name = "${azurerm_resource_group.test.name}" 615 storage_account_name = "${azurerm_storage_account.source.name}" 616 container_access_type = "blob" 617 } 618 619 resource "azurerm_storage_blob" "source" { 620 name = "source.vhd" 621 622 resource_group_name = "${azurerm_resource_group.test.name}" 623 storage_account_name = "${azurerm_storage_account.source.name}" 624 storage_container_name = "${azurerm_storage_container.source.name}" 625 626 type = "block" 627 source = "%s" 628 parallelism = 4 629 attempts = 2 630 } 631 632 resource "azurerm_storage_blob" "destination" { 633 name = "destination.vhd" 634 635 resource_group_name = "${azurerm_resource_group.test.name}" 636 storage_account_name = "${azurerm_storage_account.source.name}" 637 storage_container_name = "${azurerm_storage_container.source.name}" 638 639 source_uri = "${azurerm_storage_blob.source.url}" 640 } 641 `