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 }