github.com/leeprovoost/terraform@v0.6.10-0.20160119085442-96f3f76118e7/builtin/providers/azurerm/resource_arm_subnet.go (about)

     1  package azurerm
     2  
     3  import (
     4  	"fmt"
     5  	"log"
     6  	"net/http"
     7  	"time"
     8  
     9  	"github.com/Azure/azure-sdk-for-go/arm/network"
    10  	"github.com/hashicorp/terraform/helper/resource"
    11  	"github.com/hashicorp/terraform/helper/schema"
    12  )
    13  
    14  func resourceArmSubnet() *schema.Resource {
    15  	return &schema.Resource{
    16  		Create: resourceArmSubnetCreate,
    17  		Read:   resourceArmSubnetRead,
    18  		Update: resourceArmSubnetCreate,
    19  		Delete: resourceArmSubnetDelete,
    20  
    21  		Schema: map[string]*schema.Schema{
    22  			"name": &schema.Schema{
    23  				Type:     schema.TypeString,
    24  				Required: true,
    25  				ForceNew: true,
    26  			},
    27  
    28  			"resource_group_name": &schema.Schema{
    29  				Type:     schema.TypeString,
    30  				Required: true,
    31  				ForceNew: true,
    32  			},
    33  
    34  			"virtual_network_name": &schema.Schema{
    35  				Type:     schema.TypeString,
    36  				Required: true,
    37  				ForceNew: true,
    38  			},
    39  
    40  			"address_prefix": &schema.Schema{
    41  				Type:     schema.TypeString,
    42  				Required: true,
    43  			},
    44  
    45  			"network_security_group_id": &schema.Schema{
    46  				Type:     schema.TypeString,
    47  				Optional: true,
    48  				Computed: true,
    49  			},
    50  
    51  			"route_table_id": &schema.Schema{
    52  				Type:     schema.TypeString,
    53  				Optional: true,
    54  				Computed: true,
    55  			},
    56  
    57  			"ip_configurations": &schema.Schema{
    58  				Type:     schema.TypeSet,
    59  				Optional: true,
    60  				Computed: true,
    61  				Elem:     &schema.Schema{Type: schema.TypeString},
    62  				Set:      schema.HashString,
    63  			},
    64  		},
    65  	}
    66  }
    67  
    68  func resourceArmSubnetCreate(d *schema.ResourceData, meta interface{}) error {
    69  	client := meta.(*ArmClient)
    70  	subnetClient := client.subnetClient
    71  
    72  	log.Printf("[INFO] preparing arguments for Azure ARM Subnet creation.")
    73  
    74  	name := d.Get("name").(string)
    75  	vnetName := d.Get("virtual_network_name").(string)
    76  	resGroup := d.Get("resource_group_name").(string)
    77  	addressPrefix := d.Get("address_prefix").(string)
    78  
    79  	armMutexKV.Lock(vnetName)
    80  	defer armMutexKV.Unlock(vnetName)
    81  
    82  	properties := network.SubnetPropertiesFormat{
    83  		AddressPrefix: &addressPrefix,
    84  	}
    85  
    86  	if v, ok := d.GetOk("network_security_group_id"); ok {
    87  		nsgId := v.(string)
    88  		properties.NetworkSecurityGroup = &network.SecurityGroup{
    89  			ID: &nsgId,
    90  		}
    91  	}
    92  
    93  	if v, ok := d.GetOk("route_table_id"); ok {
    94  		rtId := v.(string)
    95  		properties.RouteTable = &network.RouteTable{
    96  			ID: &rtId,
    97  		}
    98  	}
    99  
   100  	subnet := network.Subnet{
   101  		Name:       &name,
   102  		Properties: &properties,
   103  	}
   104  
   105  	resp, err := subnetClient.CreateOrUpdate(resGroup, vnetName, name, subnet)
   106  	if err != nil {
   107  		return err
   108  	}
   109  
   110  	d.SetId(*resp.ID)
   111  
   112  	log.Printf("[DEBUG] Waiting for Subnet (%s) to become available", name)
   113  	stateConf := &resource.StateChangeConf{
   114  		Pending: []string{"Accepted", "Updating"},
   115  		Target:  "Succeeded",
   116  		Refresh: subnetRuleStateRefreshFunc(client, resGroup, vnetName, name),
   117  		Timeout: 10 * time.Minute,
   118  	}
   119  	if _, err := stateConf.WaitForState(); err != nil {
   120  		return fmt.Errorf("Error waiting for Subnet (%s) to become available: %s", name, err)
   121  	}
   122  
   123  	return resourceArmSubnetRead(d, meta)
   124  }
   125  
   126  func resourceArmSubnetRead(d *schema.ResourceData, meta interface{}) error {
   127  	subnetClient := meta.(*ArmClient).subnetClient
   128  
   129  	id, err := parseAzureResourceID(d.Id())
   130  	if err != nil {
   131  		return err
   132  	}
   133  	resGroup := id.ResourceGroup
   134  	vnetName := id.Path["virtualNetworks"]
   135  	name := id.Path["subnets"]
   136  
   137  	resp, err := subnetClient.Get(resGroup, vnetName, name, "")
   138  	if resp.StatusCode == http.StatusNotFound {
   139  		d.SetId("")
   140  		return nil
   141  	}
   142  	if err != nil {
   143  		return fmt.Errorf("Error making Read request on Azure Subnet %s: %s", name, err)
   144  	}
   145  
   146  	if resp.Properties.IPConfigurations != nil && len(*resp.Properties.IPConfigurations) > 0 {
   147  		ips := make([]string, 0, len(*resp.Properties.IPConfigurations))
   148  		for _, ip := range *resp.Properties.IPConfigurations {
   149  			ips = append(ips, *ip.ID)
   150  		}
   151  
   152  		if err := d.Set("ip_configurations", ips); err != nil {
   153  			return err
   154  		}
   155  	}
   156  
   157  	return nil
   158  }
   159  
   160  func resourceArmSubnetDelete(d *schema.ResourceData, meta interface{}) error {
   161  	subnetClient := meta.(*ArmClient).subnetClient
   162  
   163  	id, err := parseAzureResourceID(d.Id())
   164  	if err != nil {
   165  		return err
   166  	}
   167  	resGroup := id.ResourceGroup
   168  	name := id.Path["subnets"]
   169  	vnetName := id.Path["virtualNetworks"]
   170  
   171  	armMutexKV.Lock(vnetName)
   172  	defer armMutexKV.Unlock(vnetName)
   173  
   174  	_, err = subnetClient.Delete(resGroup, vnetName, name)
   175  
   176  	return err
   177  }
   178  
   179  func subnetRuleStateRefreshFunc(client *ArmClient, resourceGroupName string, virtualNetworkName string, subnetName string) resource.StateRefreshFunc {
   180  	return func() (interface{}, string, error) {
   181  		res, err := client.subnetClient.Get(resourceGroupName, virtualNetworkName, subnetName, "")
   182  		if err != nil {
   183  			return nil, "", fmt.Errorf("Error issuing read request in subnetRuleStateRefreshFunc to Azure ARM for subnet '%s' (RG: '%s') (VNN: '%s'): %s", subnetName, resourceGroupName, virtualNetworkName, err)
   184  		}
   185  
   186  		return res, *res.Properties.ProvisioningState, nil
   187  	}
   188  }