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  }