github.com/jrasell/terraform@v0.6.17-0.20160523115548-2652f5232949/builtin/providers/cloudstack/resource_cloudstack_vpn_gateway.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 resourceCloudStackVPNGateway() *schema.Resource {
    14  	return &schema.Resource{
    15  		Create: resourceCloudStackVPNGatewayCreate,
    16  		Read:   resourceCloudStackVPNGatewayRead,
    17  		Delete: resourceCloudStackVPNGatewayDelete,
    18  
    19  		Schema: map[string]*schema.Schema{
    20  			"vpc_id": &schema.Schema{
    21  				Type:     schema.TypeString,
    22  				Optional: true,
    23  				Computed: true,
    24  				ForceNew: true,
    25  			},
    26  
    27  			"vpc": &schema.Schema{
    28  				Type:       schema.TypeString,
    29  				Optional:   true,
    30  				ForceNew:   true,
    31  				Deprecated: "Please use the `vpc_id` field instead",
    32  			},
    33  
    34  			"public_ip": &schema.Schema{
    35  				Type:     schema.TypeString,
    36  				Computed: true,
    37  			},
    38  		},
    39  	}
    40  }
    41  
    42  func resourceCloudStackVPNGatewayCreate(d *schema.ResourceData, meta interface{}) error {
    43  	cs := meta.(*cloudstack.CloudStackClient)
    44  
    45  	vpc, ok := d.GetOk("vpc_id")
    46  	if !ok {
    47  		vpc, ok = d.GetOk("vpc")
    48  	}
    49  	if !ok {
    50  		return errors.New("Either `vpc_id` or [deprecated] `vpc` must be provided.")
    51  	}
    52  
    53  	// Retrieve the VPC ID
    54  	vpcid, e := retrieveID(cs, "vpc", vpc.(string))
    55  	if e != nil {
    56  		return e.Error()
    57  	}
    58  
    59  	// Create a new parameter struct
    60  	p := cs.VPN.NewCreateVpnGatewayParams(vpcid)
    61  
    62  	// Create the new VPN Gateway
    63  	v, err := cs.VPN.CreateVpnGateway(p)
    64  	if err != nil {
    65  		return fmt.Errorf("Error creating VPN Gateway for VPC ID %s: %s", vpcid, err)
    66  	}
    67  
    68  	d.SetId(v.Id)
    69  
    70  	return resourceCloudStackVPNGatewayRead(d, meta)
    71  }
    72  
    73  func resourceCloudStackVPNGatewayRead(d *schema.ResourceData, meta interface{}) error {
    74  	cs := meta.(*cloudstack.CloudStackClient)
    75  
    76  	// Get the VPN Gateway details
    77  	v, count, err := cs.VPN.GetVpnGatewayByID(d.Id())
    78  	if err != nil {
    79  		if count == 0 {
    80  			log.Printf(
    81  				"[DEBUG] VPN Gateway for VPC ID %s does no longer exist", d.Get("vpc_id").(string))
    82  			d.SetId("")
    83  			return nil
    84  		}
    85  
    86  		return err
    87  	}
    88  
    89  	d.Set("vpc_id", v.Vpcid)
    90  	d.Set("public_ip", v.Publicip)
    91  
    92  	return nil
    93  }
    94  
    95  func resourceCloudStackVPNGatewayDelete(d *schema.ResourceData, meta interface{}) error {
    96  	cs := meta.(*cloudstack.CloudStackClient)
    97  
    98  	// Create a new parameter struct
    99  	p := cs.VPN.NewDeleteVpnGatewayParams(d.Id())
   100  
   101  	// Delete the VPN Gateway
   102  	_, err := cs.VPN.DeleteVpnGateway(p)
   103  	if err != nil {
   104  		// This is a very poor way to be told the ID does no longer exist :(
   105  		if strings.Contains(err.Error(), fmt.Sprintf(
   106  			"Invalid parameter id value=%s due to incorrect long value format, "+
   107  				"or entity does not exist", d.Id())) {
   108  			return nil
   109  		}
   110  
   111  		return fmt.Errorf("Error deleting VPN Gateway for VPC %s: %s", d.Get("vpc_id").(string), err)
   112  	}
   113  
   114  	return nil
   115  }