github.com/ottenhoff/terraform@v0.7.0-rc1.0.20160607213102-ac2d195cc560/builtin/providers/cloudstack/resource_cloudstack_vpn_connection.go (about)

     1  package cloudstack
     2  
     3  import (
     4  	"errors"
     5  	"fmt"
     6  	"log"
     7  	"strings"
     8  
     9  	"github.com/hashicorp/terraform/helper/schema"
    10  	"github.com/xanzy/go-cloudstack/cloudstack"
    11  )
    12  
    13  func resourceCloudStackVPNConnection() *schema.Resource {
    14  	return &schema.Resource{
    15  		Create: resourceCloudStackVPNConnectionCreate,
    16  		Read:   resourceCloudStackVPNConnectionRead,
    17  		Delete: resourceCloudStackVPNConnectionDelete,
    18  
    19  		Schema: map[string]*schema.Schema{
    20  			"customer_gateway_id": &schema.Schema{
    21  				Type:     schema.TypeString,
    22  				Optional: true,
    23  				Computed: true,
    24  				ForceNew: true,
    25  			},
    26  
    27  			"customergatewayid": &schema.Schema{
    28  				Type:       schema.TypeString,
    29  				Optional:   true,
    30  				ForceNew:   true,
    31  				Deprecated: "Please use the `customer_gateway_id` field instead",
    32  			},
    33  
    34  			"vpn_gateway_id": &schema.Schema{
    35  				Type:     schema.TypeString,
    36  				Optional: true,
    37  				Computed: true,
    38  				ForceNew: true,
    39  			},
    40  
    41  			"vpngatewayid": &schema.Schema{
    42  				Type:       schema.TypeString,
    43  				Optional:   true,
    44  				ForceNew:   true,
    45  				Deprecated: "Please use the `vpn_gateway_id` field instead",
    46  			},
    47  		},
    48  	}
    49  }
    50  
    51  func resourceCloudStackVPNConnectionCreate(d *schema.ResourceData, meta interface{}) error {
    52  	cs := meta.(*cloudstack.CloudStackClient)
    53  
    54  	customergatewayid, ok := d.GetOk("customer_gateway_id")
    55  	if !ok {
    56  		customergatewayid, ok = d.GetOk("customergatewayid")
    57  	}
    58  	if !ok {
    59  		return errors.New(
    60  			"Either `customer_gateway_id` or [deprecated] `customergatewayid` must be provided.")
    61  	}
    62  
    63  	vpngatewayid, ok := d.GetOk("vpn_gateway_id")
    64  	if !ok {
    65  		vpngatewayid, ok = d.GetOk("vpngatewayid")
    66  	}
    67  	if !ok {
    68  		return errors.New("Either `vpn_gateway_id` or [deprecated] `vpngatewayid` must be provided.")
    69  	}
    70  
    71  	// Create a new parameter struct
    72  	p := cs.VPN.NewCreateVpnConnectionParams(
    73  		customergatewayid.(string),
    74  		vpngatewayid.(string),
    75  	)
    76  
    77  	// Create the new VPN Connection
    78  	v, err := cs.VPN.CreateVpnConnection(p)
    79  	if err != nil {
    80  		return fmt.Errorf("Error creating VPN Connection: %s", err)
    81  	}
    82  
    83  	d.SetId(v.Id)
    84  
    85  	return resourceCloudStackVPNConnectionRead(d, meta)
    86  }
    87  
    88  func resourceCloudStackVPNConnectionRead(d *schema.ResourceData, meta interface{}) error {
    89  	cs := meta.(*cloudstack.CloudStackClient)
    90  
    91  	// Get the VPN Connection details
    92  	v, count, err := cs.VPN.GetVpnConnectionByID(d.Id())
    93  	if err != nil {
    94  		if count == 0 {
    95  			log.Printf("[DEBUG] VPN Connection does no longer exist")
    96  			d.SetId("")
    97  			return nil
    98  		}
    99  
   100  		return err
   101  	}
   102  
   103  	d.Set("customer_gateway_id", v.S2scustomergatewayid)
   104  	d.Set("vpn_gateway_id", v.S2svpngatewayid)
   105  
   106  	return nil
   107  }
   108  
   109  func resourceCloudStackVPNConnectionDelete(d *schema.ResourceData, meta interface{}) error {
   110  	cs := meta.(*cloudstack.CloudStackClient)
   111  
   112  	// Create a new parameter struct
   113  	p := cs.VPN.NewDeleteVpnConnectionParams(d.Id())
   114  
   115  	// Delete the VPN Connection
   116  	_, err := cs.VPN.DeleteVpnConnection(p)
   117  	if err != nil {
   118  		// This is a very poor way to be told the ID does no longer exist :(
   119  		if strings.Contains(err.Error(), fmt.Sprintf(
   120  			"Invalid parameter id value=%s due to incorrect long value format, "+
   121  				"or entity does not exist", d.Id())) {
   122  			return nil
   123  		}
   124  
   125  		return fmt.Errorf("Error deleting VPN Connection: %s", err)
   126  	}
   127  
   128  	return nil
   129  }