github.com/bendemaree/terraform@v0.5.4-0.20150613200311-f50d97d6eee6/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: envDefaultFuncAllowMissing("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 Computed: true, 47 }, 48 }, 49 } 50 } 51 52 func resourceNetworkingRouterV2Create(d *schema.ResourceData, meta interface{}) error { 53 config := meta.(*Config) 54 networkingClient, err := config.networkingV2Client(d.Get("region").(string)) 55 if err != nil { 56 return fmt.Errorf("Error creating OpenStack networking client: %s", err) 57 } 58 59 createOpts := routers.CreateOpts{ 60 Name: d.Get("name").(string), 61 TenantID: d.Get("tenant_id").(string), 62 } 63 64 asuRaw := d.Get("admin_state_up").(string) 65 if asuRaw != "" { 66 asu, err := strconv.ParseBool(asuRaw) 67 if err != nil { 68 return fmt.Errorf("admin_state_up, if provided, must be either 'true' or 'false'") 69 } 70 createOpts.AdminStateUp = &asu 71 } 72 73 externalGateway := d.Get("external_gateway").(string) 74 if externalGateway != "" { 75 gatewayInfo := routers.GatewayInfo{ 76 NetworkID: externalGateway, 77 } 78 createOpts.GatewayInfo = &gatewayInfo 79 } 80 81 log.Printf("[DEBUG] Create Options: %#v", createOpts) 82 n, err := routers.Create(networkingClient, createOpts).Extract() 83 if err != nil { 84 return fmt.Errorf("Error creating OpenStack Neutron router: %s", err) 85 } 86 log.Printf("[INFO] Router ID: %s", n.ID) 87 88 d.SetId(n.ID) 89 90 return resourceNetworkingRouterV2Read(d, meta) 91 } 92 93 func resourceNetworkingRouterV2Read(d *schema.ResourceData, meta interface{}) error { 94 config := meta.(*Config) 95 networkingClient, err := config.networkingV2Client(d.Get("region").(string)) 96 if err != nil { 97 return fmt.Errorf("Error creating OpenStack networking client: %s", err) 98 } 99 100 n, err := routers.Get(networkingClient, d.Id()).Extract() 101 if err != nil { 102 httpError, ok := err.(*gophercloud.UnexpectedResponseCodeError) 103 if !ok { 104 return fmt.Errorf("Error retrieving OpenStack Neutron Router: %s", err) 105 } 106 107 if httpError.Actual == 404 { 108 d.SetId("") 109 return nil 110 } 111 return fmt.Errorf("Error retrieving OpenStack Neutron Router: %s", err) 112 } 113 114 log.Printf("[DEBUG] Retreived Router %s: %+v", d.Id(), n) 115 116 d.Set("name", n.Name) 117 d.Set("admin_state_up", strconv.FormatBool(n.AdminStateUp)) 118 d.Set("tenant_id", n.TenantID) 119 d.Set("external_gateway", n.GatewayInfo.NetworkID) 120 121 return nil 122 } 123 124 func resourceNetworkingRouterV2Update(d *schema.ResourceData, meta interface{}) error { 125 config := meta.(*Config) 126 networkingClient, err := config.networkingV2Client(d.Get("region").(string)) 127 if err != nil { 128 return fmt.Errorf("Error creating OpenStack networking client: %s", err) 129 } 130 131 var updateOpts routers.UpdateOpts 132 if d.HasChange("name") { 133 updateOpts.Name = d.Get("name").(string) 134 } 135 if d.HasChange("admin_state_up") { 136 asuRaw := d.Get("admin_state_up").(string) 137 if asuRaw != "" { 138 asu, err := strconv.ParseBool(asuRaw) 139 if err != nil { 140 return fmt.Errorf("admin_state_up, if provided, must be either 'true' or 'false'") 141 } 142 updateOpts.AdminStateUp = &asu 143 } 144 } 145 146 log.Printf("[DEBUG] Updating Router %s with options: %+v", d.Id(), updateOpts) 147 148 _, err = routers.Update(networkingClient, d.Id(), updateOpts).Extract() 149 if err != nil { 150 return fmt.Errorf("Error updating OpenStack Neutron Router: %s", err) 151 } 152 153 return resourceNetworkingRouterV2Read(d, meta) 154 } 155 156 func resourceNetworkingRouterV2Delete(d *schema.ResourceData, meta interface{}) error { 157 config := meta.(*Config) 158 networkingClient, err := config.networkingV2Client(d.Get("region").(string)) 159 if err != nil { 160 return fmt.Errorf("Error creating OpenStack networking client: %s", err) 161 } 162 163 err = routers.Delete(networkingClient, d.Id()).ExtractErr() 164 if err != nil { 165 return fmt.Errorf("Error deleting OpenStack Neutron Router: %s", err) 166 } 167 168 d.SetId("") 169 return nil 170 }