github.com/jsoriano/terraform@v0.6.7-0.20151026070445-8b70867fdd95/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  }