github.com/ezbercih/terraform@v0.1.1-0.20140729011846-3c33865e0839/builtin/providers/heroku/resource_heroku_domain.go (about)

     1  package heroku
     2  
     3  import (
     4  	"fmt"
     5  	"log"
     6  
     7  	"github.com/bgentry/heroku-go"
     8  	"github.com/hashicorp/terraform/helper/config"
     9  	"github.com/hashicorp/terraform/helper/diff"
    10  	"github.com/hashicorp/terraform/terraform"
    11  )
    12  
    13  func resource_heroku_domain_create(
    14  	s *terraform.ResourceState,
    15  	d *terraform.ResourceDiff,
    16  	meta interface{}) (*terraform.ResourceState, error) {
    17  	p := meta.(*ResourceProvider)
    18  	client := p.client
    19  
    20  	// Merge the diff into the state so that we have all the attributes
    21  	// properly.
    22  	rs := s.MergeDiff(d)
    23  
    24  	app := rs.Attributes["app"]
    25  	hostname := rs.Attributes["hostname"]
    26  
    27  	log.Printf("[DEBUG] Domain create configuration: %#v, %#v", app, hostname)
    28  
    29  	do, err := client.DomainCreate(app, hostname)
    30  
    31  	if err != nil {
    32  		return s, err
    33  	}
    34  
    35  	rs.ID = do.Id
    36  	rs.Attributes["hostname"] = do.Hostname
    37  	rs.Attributes["cname"] = fmt.Sprintf("%s.herokuapp.com", app)
    38  
    39  	log.Printf("[INFO] Domain ID: %s", rs.ID)
    40  
    41  	return rs, nil
    42  }
    43  
    44  func resource_heroku_domain_update(
    45  	s *terraform.ResourceState,
    46  	d *terraform.ResourceDiff,
    47  	meta interface{}) (*terraform.ResourceState, error) {
    48  
    49  	panic("Cannot update domain")
    50  
    51  	return nil, nil
    52  }
    53  
    54  func resource_heroku_domain_destroy(
    55  	s *terraform.ResourceState,
    56  	meta interface{}) error {
    57  	p := meta.(*ResourceProvider)
    58  	client := p.client
    59  
    60  	log.Printf("[INFO] Deleting Domain: %s", s.ID)
    61  
    62  	// Destroy the app
    63  	err := client.DomainDelete(s.Attributes["app"], s.ID)
    64  
    65  	if err != nil {
    66  		return fmt.Errorf("Error deleting domain: %s", err)
    67  	}
    68  
    69  	return nil
    70  }
    71  
    72  func resource_heroku_domain_refresh(
    73  	s *terraform.ResourceState,
    74  	meta interface{}) (*terraform.ResourceState, error) {
    75  	p := meta.(*ResourceProvider)
    76  	client := p.client
    77  
    78  	domain, err := resource_heroku_domain_retrieve(s.Attributes["app"], s.ID, client)
    79  	if err != nil {
    80  		return nil, err
    81  	}
    82  
    83  	s.Attributes["hostname"] = domain.Hostname
    84  	s.Attributes["cname"] = fmt.Sprintf("%s.herokuapp.com", s.Attributes["app"])
    85  
    86  	return s, nil
    87  }
    88  
    89  func resource_heroku_domain_diff(
    90  	s *terraform.ResourceState,
    91  	c *terraform.ResourceConfig,
    92  	meta interface{}) (*terraform.ResourceDiff, error) {
    93  
    94  	b := &diff.ResourceBuilder{
    95  		Attrs: map[string]diff.AttrType{
    96  			"hostname": diff.AttrTypeCreate,
    97  			"app":      diff.AttrTypeCreate,
    98  		},
    99  
   100  		ComputedAttrs: []string{
   101  			"cname",
   102  		},
   103  	}
   104  
   105  	return b.Diff(s, c)
   106  }
   107  
   108  func resource_heroku_domain_retrieve(app string, id string, client *heroku.Client) (*heroku.Domain, error) {
   109  	domain, err := client.DomainInfo(app, id)
   110  
   111  	if err != nil {
   112  		return nil, fmt.Errorf("Error retrieving domain: %s", err)
   113  	}
   114  
   115  	return domain, nil
   116  }
   117  
   118  func resource_heroku_domain_validation() *config.Validator {
   119  	return &config.Validator{
   120  		Required: []string{
   121  			"hostname",
   122  			"app",
   123  		},
   124  		Optional: []string{},
   125  	}
   126  }