github.com/vtorhonen/terraform@v0.9.0-beta2.0.20170307220345-5d894e4ffda7/builtin/providers/azurerm/resource_arm_template_deployment_test.go (about)

     1  package azurerm
     2  
     3  import (
     4  	"fmt"
     5  	"net/http"
     6  	"regexp"
     7  	"testing"
     8  
     9  	"github.com/hashicorp/terraform/helper/acctest"
    10  	"github.com/hashicorp/terraform/helper/resource"
    11  	"github.com/hashicorp/terraform/terraform"
    12  )
    13  
    14  func TestAccAzureRMTemplateDeployment_basic(t *testing.T) {
    15  	ri := acctest.RandInt()
    16  	config := fmt.Sprintf(testAccAzureRMTemplateDeployment_basicExample, ri, ri)
    17  	resource.Test(t, resource.TestCase{
    18  		PreCheck:     func() { testAccPreCheck(t) },
    19  		Providers:    testAccProviders,
    20  		CheckDestroy: testCheckAzureRMTemplateDeploymentDestroy,
    21  		Steps: []resource.TestStep{
    22  			{
    23  				Config: config,
    24  				Check: resource.ComposeTestCheckFunc(
    25  					testCheckAzureRMTemplateDeploymentExists("azurerm_template_deployment.test"),
    26  				),
    27  			},
    28  		},
    29  	})
    30  }
    31  
    32  func TestAccAzureRMTemplateDeployment_disappears(t *testing.T) {
    33  	ri := acctest.RandInt()
    34  	config := fmt.Sprintf(testAccAzureRMTemplateDeployment_basicExample, ri, ri)
    35  	resource.Test(t, resource.TestCase{
    36  		PreCheck:     func() { testAccPreCheck(t) },
    37  		Providers:    testAccProviders,
    38  		CheckDestroy: testCheckAzureRMTemplateDeploymentDestroy,
    39  		Steps: []resource.TestStep{
    40  			{
    41  				Config: config,
    42  				Check: resource.ComposeTestCheckFunc(
    43  					testCheckAzureRMTemplateDeploymentExists("azurerm_template_deployment.test"),
    44  					testCheckAzureRMTemplateDeploymentDisappears("azurerm_template_deployment.test"),
    45  				),
    46  				ExpectNonEmptyPlan: true,
    47  			},
    48  		},
    49  	})
    50  }
    51  
    52  func TestAccAzureRMTemplateDeployment_withParams(t *testing.T) {
    53  	ri := acctest.RandInt()
    54  	config := fmt.Sprintf(testAccAzureRMTemplateDeployment_withParams, ri, ri, ri)
    55  	resource.Test(t, resource.TestCase{
    56  		PreCheck:     func() { testAccPreCheck(t) },
    57  		Providers:    testAccProviders,
    58  		CheckDestroy: testCheckAzureRMTemplateDeploymentDestroy,
    59  		Steps: []resource.TestStep{
    60  			{
    61  				Config: config,
    62  				Check: resource.ComposeTestCheckFunc(
    63  					testCheckAzureRMTemplateDeploymentExists("azurerm_template_deployment.test"),
    64  					resource.TestCheckResourceAttr("azurerm_template_deployment.test", "outputs.testOutput", "Output Value"),
    65  				),
    66  			},
    67  		},
    68  	})
    69  }
    70  
    71  func TestAccAzureRMTemplateDeployment_withError(t *testing.T) {
    72  	ri := acctest.RandInt()
    73  	config := fmt.Sprintf(testAccAzureRMTemplateDeployment_withError, ri, ri)
    74  	resource.Test(t, resource.TestCase{
    75  		PreCheck:     func() { testAccPreCheck(t) },
    76  		Providers:    testAccProviders,
    77  		CheckDestroy: testCheckAzureRMTemplateDeploymentDestroy,
    78  		Steps: []resource.TestStep{
    79  			{
    80  				Config:      config,
    81  				ExpectError: regexp.MustCompile("The deployment operation failed"),
    82  			},
    83  		},
    84  	})
    85  }
    86  
    87  func testCheckAzureRMTemplateDeploymentExists(name string) resource.TestCheckFunc {
    88  	return func(s *terraform.State) error {
    89  		// Ensure we have enough information in state to look up in API
    90  		rs, ok := s.RootModule().Resources[name]
    91  		if !ok {
    92  			return fmt.Errorf("Not found: %s", name)
    93  		}
    94  
    95  		name := rs.Primary.Attributes["name"]
    96  		resourceGroup, hasResourceGroup := rs.Primary.Attributes["resource_group_name"]
    97  		if !hasResourceGroup {
    98  			return fmt.Errorf("Bad: no resource group found in state for template deployment: %s", name)
    99  		}
   100  
   101  		conn := testAccProvider.Meta().(*ArmClient).deploymentsClient
   102  
   103  		resp, err := conn.Get(resourceGroup, name)
   104  		if err != nil {
   105  			return fmt.Errorf("Bad: Get on deploymentsClient: %s", err)
   106  		}
   107  
   108  		if resp.StatusCode == http.StatusNotFound {
   109  			return fmt.Errorf("Bad: TemplateDeployment %q (resource group: %q) does not exist", name, resourceGroup)
   110  		}
   111  
   112  		return nil
   113  	}
   114  }
   115  
   116  func testCheckAzureRMTemplateDeploymentDisappears(name string) resource.TestCheckFunc {
   117  	return func(s *terraform.State) error {
   118  		// Ensure we have enough information in state to look up in API
   119  		rs, ok := s.RootModule().Resources[name]
   120  		if !ok {
   121  			return fmt.Errorf("Not found: %s", name)
   122  		}
   123  
   124  		name := rs.Primary.Attributes["name"]
   125  		resourceGroup, hasResourceGroup := rs.Primary.Attributes["resource_group_name"]
   126  		if !hasResourceGroup {
   127  			return fmt.Errorf("Bad: no resource group found in state for template deployment: %s", name)
   128  		}
   129  
   130  		conn := testAccProvider.Meta().(*ArmClient).deploymentsClient
   131  
   132  		_, err := conn.Delete(resourceGroup, name, make(chan struct{}))
   133  		if err != nil {
   134  			return fmt.Errorf("Bad: Delete on deploymentsClient: %s", err)
   135  		}
   136  
   137  		return nil
   138  	}
   139  }
   140  
   141  func testCheckAzureRMTemplateDeploymentDestroy(s *terraform.State) error {
   142  	conn := testAccProvider.Meta().(*ArmClient).vmClient
   143  
   144  	for _, rs := range s.RootModule().Resources {
   145  		if rs.Type != "azurerm_template_deployment" {
   146  			continue
   147  		}
   148  
   149  		name := rs.Primary.Attributes["name"]
   150  		resourceGroup := rs.Primary.Attributes["resource_group_name"]
   151  
   152  		resp, err := conn.Get(resourceGroup, name, "")
   153  
   154  		if err != nil {
   155  			return nil
   156  		}
   157  
   158  		if resp.StatusCode != http.StatusNotFound {
   159  			return fmt.Errorf("Template Deployment still exists:\n%#v", resp.VirtualMachineProperties)
   160  		}
   161  	}
   162  
   163  	return nil
   164  }
   165  
   166  var testAccAzureRMTemplateDeployment_basicExample = `
   167    resource "azurerm_resource_group" "test" {
   168      name = "acctestRG-%d"
   169      location = "West US"
   170    }
   171  
   172    resource "azurerm_template_deployment" "test" {
   173      name = "acctesttemplate-%d"
   174      resource_group_name = "${azurerm_resource_group.test.name}"
   175      template_body = <<DEPLOY
   176  {
   177    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
   178    "contentVersion": "1.0.0.0",
   179    "parameters": {
   180      "storageAccountType": {
   181        "type": "string",
   182        "defaultValue": "Standard_LRS",
   183        "allowedValues": [
   184          "Standard_LRS",
   185          "Standard_GRS",
   186          "Standard_ZRS"
   187        ],
   188        "metadata": {
   189          "description": "Storage Account type"
   190        }
   191      }
   192    },
   193    "variables": {
   194      "location": "[resourceGroup().location]",
   195      "storageAccountName": "[concat(uniquestring(resourceGroup().id), 'storage')]",
   196      "publicIPAddressName": "[concat('myPublicIp', uniquestring(resourceGroup().id))]",
   197      "publicIPAddressType": "Dynamic",
   198      "apiVersion": "2015-06-15",
   199      "dnsLabelPrefix": "terraform-tdacctest"
   200    },
   201    "resources": [
   202      {
   203        "type": "Microsoft.Storage/storageAccounts",
   204        "name": "[variables('storageAccountName')]",
   205        "apiVersion": "[variables('apiVersion')]",
   206        "location": "[variables('location')]",
   207        "properties": {
   208          "accountType": "[parameters('storageAccountType')]"
   209        }
   210      },
   211      {
   212        "type": "Microsoft.Network/publicIPAddresses",
   213        "apiVersion": "[variables('apiVersion')]",
   214        "name": "[variables('publicIPAddressName')]",
   215        "location": "[variables('location')]",
   216        "properties": {
   217          "publicIPAllocationMethod": "[variables('publicIPAddressType')]",
   218          "dnsSettings": {
   219            "domainNameLabel": "[variables('dnsLabelPrefix')]"
   220          }
   221        }
   222      }
   223    ]
   224  }
   225  DEPLOY
   226      deployment_mode = "Complete"
   227    }
   228  
   229  `
   230  
   231  var testAccAzureRMTemplateDeployment_withParams = `
   232    resource "azurerm_resource_group" "test" {
   233      name = "acctestRG-%d"
   234      location = "West US"
   235    }
   236  
   237    output "test" {
   238      value = "${azurerm_template_deployment.test.outputs.testOutput}"
   239    }
   240  
   241    resource "azurerm_template_deployment" "test" {
   242      name = "acctesttemplate-%d"
   243      resource_group_name = "${azurerm_resource_group.test.name}"
   244      template_body = <<DEPLOY
   245  {
   246    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
   247    "contentVersion": "1.0.0.0",
   248    "parameters": {
   249      "storageAccountType": {
   250        "type": "string",
   251        "defaultValue": "Standard_LRS",
   252        "allowedValues": [
   253          "Standard_LRS",
   254          "Standard_GRS",
   255          "Standard_ZRS"
   256        ],
   257        "metadata": {
   258          "description": "Storage Account type"
   259        }
   260      },
   261      "dnsLabelPrefix": {
   262        "type": "string",
   263        "metadata": {
   264          "description": "DNS Label for the Public IP. Must be lowercase. It should match with the following regular expression: ^[a-z][a-z0-9-]{1,61}[a-z0-9]$ or it will raise an error."
   265        }
   266      }
   267    },
   268    "variables": {
   269      "location": "[resourceGroup().location]",
   270      "storageAccountName": "[concat(uniquestring(resourceGroup().id), 'storage')]",
   271      "publicIPAddressName": "[concat('myPublicIp', uniquestring(resourceGroup().id))]",
   272      "publicIPAddressType": "Dynamic",
   273      "apiVersion": "2015-06-15"
   274    },
   275    "resources": [
   276      {
   277        "type": "Microsoft.Storage/storageAccounts",
   278        "name": "[variables('storageAccountName')]",
   279        "apiVersion": "[variables('apiVersion')]",
   280        "location": "[variables('location')]",
   281        "properties": {
   282          "accountType": "[parameters('storageAccountType')]"
   283        }
   284      },
   285      {
   286        "type": "Microsoft.Network/publicIPAddresses",
   287        "apiVersion": "[variables('apiVersion')]",
   288        "name": "[variables('publicIPAddressName')]",
   289        "location": "[variables('location')]",
   290        "properties": {
   291          "publicIPAllocationMethod": "[variables('publicIPAddressType')]",
   292          "dnsSettings": {
   293            "domainNameLabel": "[parameters('dnsLabelPrefix')]"
   294          }
   295        }
   296      }
   297    ],
   298    "outputs": {
   299      "testOutput": {
   300        "type": "string",
   301        "value": "Output Value"
   302      }
   303    }
   304  }
   305  DEPLOY
   306      parameters {
   307  	dnsLabelPrefix = "terraform-test-%d"
   308  	storageAccountType = "Standard_GRS"
   309      }
   310      deployment_mode = "Complete"
   311    }
   312  
   313  `
   314  
   315  // StorageAccount name is too long, forces error
   316  var testAccAzureRMTemplateDeployment_withError = `
   317    resource "azurerm_resource_group" "test" {
   318      name = "acctestRG-%d"
   319      location = "West US"
   320    }
   321  
   322    output "test" {
   323      value = "${azurerm_template_deployment.test.outputs.testOutput}"
   324    }
   325  
   326    resource "azurerm_template_deployment" "test" {
   327      name = "acctesttemplate-%d"
   328      resource_group_name = "${azurerm_resource_group.test.name}"
   329      template_body = <<DEPLOY
   330  {
   331    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
   332    "contentVersion": "1.0.0.0",
   333    "parameters": {
   334      "storageAccountType": {
   335        "type": "string",
   336        "defaultValue": "Standard_LRS",
   337        "allowedValues": [
   338          "Standard_LRS",
   339          "Standard_GRS",
   340          "Standard_ZRS"
   341        ],
   342        "metadata": {
   343          "description": "Storage Account type"
   344        }
   345      }
   346    },
   347    "variables": {
   348      "location": "[resourceGroup().location]",
   349      "storageAccountName": "badStorageAccountNameTooLong",
   350      "apiVersion": "2015-06-15"
   351    },
   352    "resources": [
   353      {
   354        "type": "Microsoft.Storage/storageAccounts",
   355        "name": "[variables('storageAccountName')]",
   356        "apiVersion": "[variables('apiVersion')]",
   357        "location": "[variables('location')]",
   358        "properties": {
   359          "accountType": "[parameters('storageAccountType')]"
   360        }
   361      }
   362    ],
   363    "outputs": {
   364      "testOutput": {
   365        "type": "string",
   366        "value": "Output Value"
   367      }
   368    }
   369  }
   370  DEPLOY
   371      parameters {
   372          storageAccountType = "Standard_GRS"
   373      }
   374      deployment_mode = "Complete"
   375    }
   376  `