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  }