github.com/danp/terraform@v0.9.5-0.20170426144147-39d740081351/builtin/providers/consul/resource_consul_agent_service.go (about)

     1  package consul
     2  
     3  import (
     4  	"fmt"
     5  
     6  	consulapi "github.com/hashicorp/consul/api"
     7  	"github.com/hashicorp/terraform/helper/schema"
     8  )
     9  
    10  func resourceConsulAgentService() *schema.Resource {
    11  	return &schema.Resource{
    12  		Create: resourceConsulAgentServiceCreate,
    13  		Update: resourceConsulAgentServiceCreate,
    14  		Read:   resourceConsulAgentServiceRead,
    15  		Delete: resourceConsulAgentServiceDelete,
    16  
    17  		Schema: map[string]*schema.Schema{
    18  			"address": &schema.Schema{
    19  				Type:     schema.TypeString,
    20  				Optional: true,
    21  				Computed: true,
    22  				ForceNew: true,
    23  			},
    24  
    25  			"id": &schema.Schema{
    26  				Type:     schema.TypeString,
    27  				Computed: true,
    28  			},
    29  
    30  			"name": &schema.Schema{
    31  				Type:     schema.TypeString,
    32  				Required: true,
    33  			},
    34  
    35  			"port": &schema.Schema{
    36  				Type:     schema.TypeInt,
    37  				Optional: true,
    38  				ForceNew: true,
    39  			},
    40  
    41  			"tags": &schema.Schema{
    42  				Type:     schema.TypeList,
    43  				Optional: true,
    44  				Elem:     &schema.Schema{Type: schema.TypeString},
    45  				ForceNew: true,
    46  			},
    47  		},
    48  	}
    49  }
    50  
    51  func resourceConsulAgentServiceCreate(d *schema.ResourceData, meta interface{}) error {
    52  	client := meta.(*consulapi.Client)
    53  	agent := client.Agent()
    54  
    55  	name := d.Get("name").(string)
    56  	registration := consulapi.AgentServiceRegistration{Name: name}
    57  
    58  	if address, ok := d.GetOk("address"); ok {
    59  		registration.Address = address.(string)
    60  	}
    61  
    62  	if port, ok := d.GetOk("port"); ok {
    63  		registration.Port = port.(int)
    64  	}
    65  
    66  	if v, ok := d.GetOk("tags"); ok {
    67  		vs := v.([]interface{})
    68  		s := make([]string, len(vs))
    69  		for i, raw := range vs {
    70  			s[i] = raw.(string)
    71  		}
    72  		registration.Tags = s
    73  	}
    74  
    75  	if err := agent.ServiceRegister(&registration); err != nil {
    76  		return fmt.Errorf("Failed to register service '%s' with Consul agent: %v", name, err)
    77  	}
    78  
    79  	// Update the resource
    80  	if serviceMap, err := agent.Services(); err != nil {
    81  		return fmt.Errorf("Failed to read services from Consul agent: %v", err)
    82  	} else if service, ok := serviceMap[name]; !ok {
    83  		return fmt.Errorf("Failed to read service '%s' from Consul agent: %v", name, err)
    84  	} else {
    85  		d.Set("address", service.Address)
    86  		d.Set("id", service.ID)
    87  		d.SetId(service.ID)
    88  		d.Set("name", service.Service)
    89  		d.Set("port", service.Port)
    90  		tags := make([]string, 0, len(service.Tags))
    91  		for _, tag := range service.Tags {
    92  			tags = append(tags, tag)
    93  		}
    94  		d.Set("tags", tags)
    95  	}
    96  
    97  	return nil
    98  }
    99  
   100  func resourceConsulAgentServiceRead(d *schema.ResourceData, meta interface{}) error {
   101  	client := meta.(*consulapi.Client)
   102  	agent := client.Agent()
   103  
   104  	name := d.Get("name").(string)
   105  
   106  	if services, err := agent.Services(); err != nil {
   107  		return fmt.Errorf("Failed to get services from Consul agent: %v", err)
   108  	} else if service, ok := services[name]; !ok {
   109  		d.Set("id", "")
   110  	} else {
   111  		d.Set("address", service.Address)
   112  		d.Set("id", service.ID)
   113  		d.SetId(service.ID)
   114  		d.Set("name", service.Service)
   115  		d.Set("port", service.Port)
   116  		tags := make([]string, 0, len(service.Tags))
   117  		for _, tag := range service.Tags {
   118  			tags = append(tags, tag)
   119  		}
   120  		d.Set("tags", tags)
   121  	}
   122  
   123  	return nil
   124  }
   125  
   126  func resourceConsulAgentServiceDelete(d *schema.ResourceData, meta interface{}) error {
   127  	client := meta.(*consulapi.Client)
   128  	catalog := client.Agent()
   129  
   130  	id := d.Get("id").(string)
   131  
   132  	if err := catalog.ServiceDeregister(id); err != nil {
   133  		return fmt.Errorf("Failed to deregister service '%s' from Consul agent: %v", id, err)
   134  	}
   135  
   136  	// Clear the ID
   137  	d.SetId("")
   138  	return nil
   139  }