github.com/tarrant/terraform@v0.3.8-0.20150402012457-f68c9eee638e/builtin/providers/openstack/resource_openstack_networking_router_v2.go (about) 1 package openstack 2 3 import ( 4 "fmt" 5 "log" 6 "strconv" 7 8 "github.com/hashicorp/terraform/helper/schema" 9 "github.com/rackspace/gophercloud" 10 "github.com/rackspace/gophercloud/openstack/networking/v2/extensions/layer3/routers" 11 ) 12 13 func resourceNetworkingRouterV2() *schema.Resource { 14 return &schema.Resource{ 15 Create: resourceNetworkingRouterV2Create, 16 Read: resourceNetworkingRouterV2Read, 17 Update: resourceNetworkingRouterV2Update, 18 Delete: resourceNetworkingRouterV2Delete, 19 20 Schema: map[string]*schema.Schema{ 21 "region": &schema.Schema{ 22 Type: schema.TypeString, 23 Required: true, 24 ForceNew: true, 25 DefaultFunc: envDefaultFunc("OS_REGION_NAME"), 26 }, 27 "name": &schema.Schema{ 28 Type: schema.TypeString, 29 Optional: true, 30 ForceNew: false, 31 }, 32 "admin_state_up": &schema.Schema{ 33 Type: schema.TypeString, 34 Optional: true, 35 ForceNew: false, 36 }, 37 "external_gateway": &schema.Schema{ 38 Type: schema.TypeString, 39 Optional: true, 40 ForceNew: false, 41 }, 42 "tenant_id": &schema.Schema{ 43 Type: schema.TypeString, 44 Optional: true, 45 ForceNew: true, 46 }, 47 }, 48 } 49 } 50 51 func resourceNetworkingRouterV2Create(d *schema.ResourceData, meta interface{}) error { 52 config := meta.(*Config) 53 networkingClient, err := config.networkingV2Client(d.Get("region").(string)) 54 if err != nil { 55 return fmt.Errorf("Error creating OpenStack networking client: %s", err) 56 } 57 58 createOpts := routers.CreateOpts{ 59 Name: d.Get("name").(string), 60 TenantID: d.Get("tenant_id").(string), 61 } 62 63 asuRaw := d.Get("admin_state_up").(string) 64 if asuRaw != "" { 65 asu, err := strconv.ParseBool(asuRaw) 66 if err != nil { 67 return fmt.Errorf("admin_state_up, if provided, must be either 'true' or 'false'") 68 } 69 createOpts.AdminStateUp = &asu 70 } 71 72 externalGateway := d.Get("external_gateway").(string) 73 if externalGateway != "" { 74 gatewayInfo := routers.GatewayInfo{ 75 NetworkID: externalGateway, 76 } 77 createOpts.GatewayInfo = &gatewayInfo 78 } 79 80 log.Printf("[DEBUG] Create Options: %#v", createOpts) 81 n, err := routers.Create(networkingClient, createOpts).Extract() 82 if err != nil { 83 return fmt.Errorf("Error creating OpenStack Neutron router: %s", err) 84 } 85 log.Printf("[INFO] Router ID: %s", n.ID) 86 87 d.SetId(n.ID) 88 89 return resourceNetworkingRouterV2Read(d, meta) 90 } 91 92 func resourceNetworkingRouterV2Read(d *schema.ResourceData, meta interface{}) error { 93 config := meta.(*Config) 94 networkingClient, err := config.networkingV2Client(d.Get("region").(string)) 95 if err != nil { 96 return fmt.Errorf("Error creating OpenStack networking client: %s", err) 97 } 98 99 n, err := routers.Get(networkingClient, d.Id()).Extract() 100 if err != nil { 101 httpError, ok := err.(*gophercloud.UnexpectedResponseCodeError) 102 if !ok { 103 return fmt.Errorf("Error retrieving OpenStack Neutron Router: %s", err) 104 } 105 106 if httpError.Actual == 404 { 107 d.SetId("") 108 return nil 109 } 110 return fmt.Errorf("Error retrieving OpenStack Neutron Router: %s", err) 111 } 112 113 log.Printf("[DEBUG] Retreived Router %s: %+v", d.Id(), n) 114 115 d.Set("name", n.Name) 116 d.Set("admin_state_up", strconv.FormatBool(n.AdminStateUp)) 117 d.Set("tenant_id", n.TenantID) 118 d.Set("external_gateway", n.GatewayInfo.NetworkID) 119 120 return nil 121 } 122 123 func resourceNetworkingRouterV2Update(d *schema.ResourceData, meta interface{}) error { 124 config := meta.(*Config) 125 networkingClient, err := config.networkingV2Client(d.Get("region").(string)) 126 if err != nil { 127 return fmt.Errorf("Error creating OpenStack networking client: %s", err) 128 } 129 130 var updateOpts routers.UpdateOpts 131 if d.HasChange("name") { 132 updateOpts.Name = d.Get("name").(string) 133 } 134 if d.HasChange("admin_state_up") { 135 asuRaw := d.Get("admin_state_up").(string) 136 if asuRaw != "" { 137 asu, err := strconv.ParseBool(asuRaw) 138 if err != nil { 139 return fmt.Errorf("admin_state_up, if provided, must be either 'true' or 'false'") 140 } 141 updateOpts.AdminStateUp = &asu 142 } 143 } 144 145 log.Printf("[DEBUG] Updating Router %s with options: %+v", d.Id(), updateOpts) 146 147 _, err = routers.Update(networkingClient, d.Id(), updateOpts).Extract() 148 if err != nil { 149 return fmt.Errorf("Error updating OpenStack Neutron Router: %s", err) 150 } 151 152 return resourceNetworkingRouterV2Read(d, meta) 153 } 154 155 func resourceNetworkingRouterV2Delete(d *schema.ResourceData, meta interface{}) error { 156 config := meta.(*Config) 157 networkingClient, err := config.networkingV2Client(d.Get("region").(string)) 158 if err != nil { 159 return fmt.Errorf("Error creating OpenStack networking client: %s", err) 160 } 161 162 err = routers.Delete(networkingClient, d.Id()).ExtractErr() 163 if err != nil { 164 return fmt.Errorf("Error deleting OpenStack Neutron Router: %s", err) 165 } 166 167 d.SetId("") 168 return nil 169 }