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