github.com/leeprovoost/terraform@v0.6.10-0.20160119085442-96f3f76118e7/builtin/providers/vcd/resource_vcd_network.go (about) 1 package vcd 2 3 import ( 4 "log" 5 6 "bytes" 7 "fmt" 8 "strings" 9 10 "github.com/hashicorp/terraform/helper/hashcode" 11 "github.com/hashicorp/terraform/helper/schema" 12 types "github.com/hmrc/vmware-govcd/types/v56" 13 ) 14 15 func resourceVcdNetwork() *schema.Resource { 16 return &schema.Resource{ 17 Create: resourceVcdNetworkCreate, 18 Read: resourceVcdNetworkRead, 19 Delete: resourceVcdNetworkDelete, 20 21 Schema: map[string]*schema.Schema{ 22 "name": &schema.Schema{ 23 Type: schema.TypeString, 24 Required: true, 25 ForceNew: true, 26 }, 27 28 "fence_mode": &schema.Schema{ 29 Type: schema.TypeString, 30 Optional: true, 31 ForceNew: true, 32 Default: "natRouted", 33 }, 34 35 "edge_gateway": &schema.Schema{ 36 Type: schema.TypeString, 37 Required: true, 38 ForceNew: true, 39 }, 40 41 "netmask": &schema.Schema{ 42 Type: schema.TypeString, 43 Optional: true, 44 ForceNew: true, 45 Default: "255.255.255.0", 46 }, 47 48 "gateway": &schema.Schema{ 49 Type: schema.TypeString, 50 Required: true, 51 ForceNew: true, 52 }, 53 54 "dns1": &schema.Schema{ 55 Type: schema.TypeString, 56 Optional: true, 57 ForceNew: true, 58 Default: "8.8.8.8", 59 }, 60 61 "dns2": &schema.Schema{ 62 Type: schema.TypeString, 63 Optional: true, 64 ForceNew: true, 65 Default: "8.8.4.4", 66 }, 67 68 "dns_suffix": &schema.Schema{ 69 Type: schema.TypeString, 70 Optional: true, 71 ForceNew: true, 72 }, 73 74 "href": &schema.Schema{ 75 Type: schema.TypeString, 76 Optional: true, 77 Computed: true, 78 ForceNew: true, 79 }, 80 81 "dhcp_pool": &schema.Schema{ 82 Type: schema.TypeSet, 83 Optional: true, 84 ForceNew: true, 85 Elem: &schema.Resource{ 86 Schema: map[string]*schema.Schema{ 87 "start_address": &schema.Schema{ 88 Type: schema.TypeString, 89 Required: true, 90 }, 91 92 "end_address": &schema.Schema{ 93 Type: schema.TypeString, 94 Required: true, 95 }, 96 }, 97 }, 98 Set: resourceVcdNetworkIPAddressHash, 99 }, 100 "static_ip_pool": &schema.Schema{ 101 Type: schema.TypeSet, 102 Optional: true, 103 ForceNew: true, 104 Elem: &schema.Resource{ 105 Schema: map[string]*schema.Schema{ 106 "start_address": &schema.Schema{ 107 Type: schema.TypeString, 108 Required: true, 109 }, 110 111 "end_address": &schema.Schema{ 112 Type: schema.TypeString, 113 Required: true, 114 }, 115 }, 116 }, 117 Set: resourceVcdNetworkIPAddressHash, 118 }, 119 }, 120 } 121 } 122 123 func resourceVcdNetworkCreate(d *schema.ResourceData, meta interface{}) error { 124 vcdClient := meta.(*VCDClient) 125 log.Printf("[TRACE] CLIENT: %#v", vcdClient) 126 vcdClient.Mutex.Lock() 127 defer vcdClient.Mutex.Unlock() 128 129 edgeGateway, err := vcdClient.OrgVdc.FindEdgeGateway(d.Get("edge_gateway").(string)) 130 131 ipRanges := expandIPRange(d.Get("static_ip_pool").(*schema.Set).List()) 132 133 newnetwork := &types.OrgVDCNetwork{ 134 Xmlns: "http://www.vmware.com/vcloud/v1.5", 135 Name: d.Get("name").(string), 136 Configuration: &types.NetworkConfiguration{ 137 FenceMode: d.Get("fence_mode").(string), 138 IPScopes: &types.IPScopes{ 139 IPScope: types.IPScope{ 140 IsInherited: false, 141 Gateway: d.Get("gateway").(string), 142 Netmask: d.Get("netmask").(string), 143 DNS1: d.Get("dns1").(string), 144 DNS2: d.Get("dns2").(string), 145 DNSSuffix: d.Get("dns_suffix").(string), 146 IPRanges: &ipRanges, 147 }, 148 }, 149 BackwardCompatibilityMode: true, 150 }, 151 EdgeGateway: &types.Reference{ 152 HREF: edgeGateway.EdgeGateway.HREF, 153 }, 154 IsShared: false, 155 } 156 157 log.Printf("[INFO] NETWORK: %#v", newnetwork) 158 159 err = retryCall(vcdClient.MaxRetryTimeout, func() error { 160 return vcdClient.OrgVdc.CreateOrgVDCNetwork(newnetwork) 161 }) 162 if err != nil { 163 return fmt.Errorf("Error: %#v", err) 164 } 165 166 err = vcdClient.OrgVdc.Refresh() 167 if err != nil { 168 return fmt.Errorf("Error refreshing vdc: %#v", err) 169 } 170 171 network, err := vcdClient.OrgVdc.FindVDCNetwork(d.Get("name").(string)) 172 if err != nil { 173 return fmt.Errorf("Error finding network: %#v", err) 174 } 175 176 if dhcp, ok := d.GetOk("dhcp_pool"); ok { 177 err = retryCall(vcdClient.MaxRetryTimeout, func() error { 178 task, err := edgeGateway.AddDhcpPool(network.OrgVDCNetwork, dhcp.(*schema.Set).List()) 179 if err != nil { 180 return fmt.Errorf("Error adding DHCP pool: %#v", err) 181 } 182 183 return task.WaitTaskCompletion() 184 }) 185 if err != nil { 186 return fmt.Errorf("Error completing tasks: %#v", err) 187 } 188 189 } 190 191 d.SetId(d.Get("name").(string)) 192 193 return resourceVcdNetworkRead(d, meta) 194 } 195 196 func resourceVcdNetworkRead(d *schema.ResourceData, meta interface{}) error { 197 vcdClient := meta.(*VCDClient) 198 log.Printf("[DEBUG] VCD Client configuration: %#v", vcdClient) 199 log.Printf("[DEBUG] VCD Client configuration: %#v", vcdClient.OrgVdc) 200 201 err := vcdClient.OrgVdc.Refresh() 202 if err != nil { 203 return fmt.Errorf("Error refreshing vdc: %#v", err) 204 } 205 206 network, err := vcdClient.OrgVdc.FindVDCNetwork(d.Id()) 207 if err != nil { 208 log.Printf("[DEBUG] Network no longer exists. Removing from tfstate") 209 d.SetId("") 210 return nil 211 } 212 213 d.Set("name", network.OrgVDCNetwork.Name) 214 d.Set("href", network.OrgVDCNetwork.HREF) 215 if c := network.OrgVDCNetwork.Configuration; c != nil { 216 d.Set("fence_mode", c.FenceMode) 217 if c.IPScopes != nil { 218 d.Set("gateway", c.IPScopes.IPScope.Gateway) 219 d.Set("netmask", c.IPScopes.IPScope.Netmask) 220 d.Set("dns1", c.IPScopes.IPScope.DNS1) 221 d.Set("dns2", c.IPScopes.IPScope.DNS2) 222 } 223 } 224 225 return nil 226 } 227 228 func resourceVcdNetworkDelete(d *schema.ResourceData, meta interface{}) error { 229 vcdClient := meta.(*VCDClient) 230 vcdClient.Mutex.Lock() 231 defer vcdClient.Mutex.Unlock() 232 err := vcdClient.OrgVdc.Refresh() 233 if err != nil { 234 return fmt.Errorf("Error refreshing vdc: %#v", err) 235 } 236 237 network, err := vcdClient.OrgVdc.FindVDCNetwork(d.Id()) 238 if err != nil { 239 return fmt.Errorf("Error finding network: %#v", err) 240 } 241 242 err = retryCall(vcdClient.MaxRetryTimeout, func() error { 243 task, err := network.Delete() 244 if err != nil { 245 return fmt.Errorf("Error Deleting Network: %#v", err) 246 } 247 return task.WaitTaskCompletion() 248 }) 249 if err != nil { 250 return err 251 } 252 253 return nil 254 } 255 256 func resourceVcdNetworkIPAddressHash(v interface{}) int { 257 var buf bytes.Buffer 258 m := v.(map[string]interface{}) 259 buf.WriteString(fmt.Sprintf("%s-", 260 strings.ToLower(m["start_address"].(string)))) 261 buf.WriteString(fmt.Sprintf("%s-", 262 strings.ToLower(m["end_address"].(string)))) 263 264 return hashcode.String(buf.String()) 265 }