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 }