github.com/mhlias/terraform@v0.6.12-0.20161118140322-a5d6410b912a/builtin/providers/aws/resource_aws_dc_intra_virtual_interface_confirm.go (about)

     1  package aws
     2  
     3  import (
     4  	"fmt"
     5  	"log"
     6  	"time"
     7  
     8  	"github.com/aws/aws-sdk-go/aws"
     9  	"github.com/aws/aws-sdk-go/service/directconnect"
    10  
    11  	"github.com/hashicorp/terraform/helper/resource"
    12  	"github.com/hashicorp/terraform/helper/schema"
    13  )
    14  
    15  func resourceAwsDirectConnectIntraVirtualInterfaceConfirm() *schema.Resource {
    16  	return &schema.Resource{
    17  		Create: resourceAwsDirectConnectIntraVirtualInterfaceConfirmCreate,
    18  		Read:   resourceAwsDirectConnectIntraVirtualInterfaceConfirmRead,
    19  		Delete: resourceAwsDirectConnectIntraVirtualInterfaceConfirmDelete,
    20  
    21  		Schema: map[string]*schema.Schema{
    22  
    23  			"interface_type": &schema.Schema{
    24  				Type:     schema.TypeString,
    25  				Optional: true,
    26  				ForceNew: true,
    27  			},
    28  
    29  			"virtual_interface_id": &schema.Schema{
    30  				Type:     schema.TypeString,
    31  				Required: true,
    32  				ForceNew: true,
    33  			},
    34  
    35  			"virtual_gateway_id": &schema.Schema{
    36  				Type:     schema.TypeString,
    37  				Optional: true,
    38  				ForceNew: true,
    39  			},
    40  
    41  			"allow_down_state": &schema.Schema{
    42  				Type:     schema.TypeBool,
    43  				Optional: true,
    44  				ForceNew: true,
    45  				Default:  false,
    46  			},
    47  		},
    48  	}
    49  }
    50  
    51  func resourceAwsDirectConnectIntraVirtualInterfaceConfirmCreate(d *schema.ResourceData, meta interface{}) error {
    52  	conn := meta.(*AWSClient).dcconn
    53  
    54  	var err error
    55  
    56  	if v, ok := d.GetOk("interface_type"); ok && v.(string) == "public" {
    57  
    58  		createOpts := &directconnect.ConfirmPublicVirtualInterfaceInput{
    59  			VirtualInterfaceId: aws.String(d.Get("virtual_interface_id").(string)),
    60  		}
    61  
    62  		log.Printf("[DEBUG] Creating DirectConnect public virtual interface")
    63  		_, err = conn.ConfirmPublicVirtualInterface(createOpts)
    64  		if err != nil {
    65  			return fmt.Errorf("Error creating DirectConnect Virtual Interface: %s", err)
    66  		}
    67  
    68  	} else {
    69  
    70  		createOpts := &directconnect.ConfirmPrivateVirtualInterfaceInput{
    71  			VirtualInterfaceId: aws.String(d.Get("virtual_interface_id").(string)),
    72  		}
    73  
    74  		if v, ok := d.GetOk("virtual_gateway_id"); ok {
    75  			createOpts.VirtualGatewayId = aws.String(v.(string))
    76  		} else {
    77  			return fmt.Errorf("Error virtual_gateway_id is required for private virtual interface with id: %s", d.Get("virtual_interface_id").(string))
    78  		}
    79  
    80  		log.Printf("[DEBUG] Creating DirectConnect private virtual interface")
    81  		_, err = conn.ConfirmPrivateVirtualInterface(createOpts)
    82  		if err != nil {
    83  			return fmt.Errorf("Error creating DirectConnect Virtual Interface: %s", err)
    84  		}
    85  
    86  	}
    87  
    88  	stateConf := &resource.StateChangeConf{
    89  		Pending:    []string{"pending", "down"},
    90  		Target:     []string{"available"},
    91  		Refresh:    DirectConnectIntraVirtualInterfaceConfirmRefreshFunc(conn, d.Get("virtual_interface_id").(string)),
    92  		Timeout:    30 * time.Minute,
    93  		Delay:      10 * time.Second,
    94  		MinTimeout: 10 * time.Second,
    95  	}
    96  
    97  	if v, ok := d.GetOk("allow_down_state"); ok && v.(bool) {
    98  		stateConf.Target = []string{"available", "down"}
    99  		stateConf.Pending = []string{"pending"}
   100  	}
   101  
   102  	_, stateErr := stateConf.WaitForState()
   103  	if stateErr != nil {
   104  		return fmt.Errorf(
   105  			"Error waiting for DirectConnect PrivateVirtualInterface (%s) to become ready: %s",
   106  			d.Get("virtual_interface_id").(string), err)
   107  	}
   108  
   109  	d.SetId(d.Get("virtual_interface_id").(string))
   110  
   111  	// Read off the API to populate our RO fields.
   112  	return resourceAwsDirectConnectIntraVirtualInterfaceConfirmRead(d, meta)
   113  }
   114  
   115  func DirectConnectIntraVirtualInterfaceConfirmRefreshFunc(conn *directconnect.DirectConnect, virtualinterfaceId string) resource.StateRefreshFunc {
   116  	return func() (interface{}, string, error) {
   117  
   118  		resp, err := conn.DescribeVirtualInterfaces(&directconnect.DescribeVirtualInterfacesInput{
   119  			VirtualInterfaceId: aws.String(virtualinterfaceId),
   120  		})
   121  
   122  		if err != nil {
   123  
   124  			log.Printf("Error on DirectConnectPrivateVirtualInterfaceRefresh: %s", err)
   125  			return nil, "", err
   126  
   127  		}
   128  
   129  		if resp == nil || len(resp.VirtualInterfaces) == 0 {
   130  			return nil, "", nil
   131  		}
   132  
   133  		virtualInterface := resp.VirtualInterfaces[0]
   134  		return virtualInterface, *virtualInterface.VirtualInterfaceState, nil
   135  	}
   136  }
   137  
   138  func resourceAwsDirectConnectIntraVirtualInterfaceConfirmRead(d *schema.ResourceData, meta interface{}) error {
   139  	conn := meta.(*AWSClient).dcconn
   140  
   141  	resp, err := conn.DescribeVirtualInterfaces(&directconnect.DescribeVirtualInterfacesInput{
   142  		VirtualInterfaceId: aws.String(d.Id()),
   143  	})
   144  
   145  	if err != nil {
   146  
   147  		log.Printf("[ERROR] Error finding DirectConnect PrivateVirtualInterface: %s", err)
   148  		return err
   149  
   150  	}
   151  
   152  	if len(resp.VirtualInterfaces) != 1 {
   153  		return fmt.Errorf("[ERROR] Error finding DirectConnect PrivateVirtualInterface: %s", d.Id())
   154  	}
   155  
   156  	virtualInterface := resp.VirtualInterfaces[0]
   157  
   158  	// Set attributes under the user's control.
   159  	d.Set("connection_id", virtualInterface.ConnectionId)
   160  	d.Set("asn", virtualInterface.Asn)
   161  	d.Set("virtual_interface_name", virtualInterface.VirtualInterfaceName)
   162  	d.Set("vlan", virtualInterface.Vlan)
   163  	d.Set("amazon_address", virtualInterface.AmazonAddress)
   164  	d.Set("customer_address", virtualInterface.CustomerAddress)
   165  	// d.Set("auth_key", *virtualInterface.AuthKey)
   166  
   167  	// Set read only attributes.
   168  	d.SetId(*virtualInterface.VirtualInterfaceId)
   169  	d.Set("owner_account_id", virtualInterface.OwnerAccount)
   170  
   171  	return nil
   172  }
   173  
   174  func resourceAwsDirectConnectIntraVirtualInterfaceConfirmDelete(d *schema.ResourceData, meta interface{}) error {
   175  	conn := meta.(*AWSClient).dcconn
   176  
   177  	_, err := conn.DeleteVirtualInterface(&directconnect.DeleteVirtualInterfaceInput{
   178  		VirtualInterfaceId: aws.String(d.Id()),
   179  	})
   180  
   181  	if err != nil {
   182  
   183  		log.Printf("[ERROR] Error deleting DirectConnect PrivateVirtualInterface connection: %s", err)
   184  		return err
   185  
   186  	}
   187  
   188  	stateConf := &resource.StateChangeConf{
   189  		Pending:    []string{"deleting"},
   190  		Target:     []string{"deleted"},
   191  		Refresh:    DirectConnectIntraVirtualInterfaceRefreshFunc(conn, d.Id()),
   192  		Timeout:    10 * time.Minute,
   193  		Delay:      10 * time.Second,
   194  		MinTimeout: 10 * time.Second,
   195  	}
   196  
   197  	_, stateErr := stateConf.WaitForState()
   198  	if stateErr != nil {
   199  		return fmt.Errorf(
   200  			"Error waiting for DirectConnect PrivateVirtualInterface (%s) to delete: %s", d.Id(), err)
   201  	}
   202  
   203  	return nil
   204  }