github.com/erriapo/terraform@v0.6.12-0.20160203182612-0340ea72354f/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  }