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

     1  package aws
     2  
     3  import (
     4  	"fmt"
     5  	"log"
     6  	"time"
     7  
     8  	"github.com/aws/aws-sdk-go/aws"
     9  	"github.com/aws/aws-sdk-go/aws/awserr"
    10  	"github.com/aws/aws-sdk-go/service/apigateway"
    11  	"github.com/hashicorp/terraform/helper/resource"
    12  	"github.com/hashicorp/terraform/helper/schema"
    13  )
    14  
    15  const emptyBasePathMappingValue = "(none)"
    16  
    17  func resourceAwsApiGatewayBasePathMapping() *schema.Resource {
    18  	return &schema.Resource{
    19  		Create: resourceAwsApiGatewayBasePathMappingCreate,
    20  		Read:   resourceAwsApiGatewayBasePathMappingRead,
    21  		Delete: resourceAwsApiGatewayBasePathMappingDelete,
    22  
    23  		Schema: map[string]*schema.Schema{
    24  			"api_id": {
    25  				Type:     schema.TypeString,
    26  				Required: true,
    27  				ForceNew: true,
    28  			},
    29  			"base_path": {
    30  				Type:     schema.TypeString,
    31  				Optional: true,
    32  				ForceNew: true,
    33  			},
    34  			"stage_name": {
    35  				Type:     schema.TypeString,
    36  				Optional: true,
    37  				ForceNew: true,
    38  			},
    39  			"domain_name": {
    40  				Type:     schema.TypeString,
    41  				Required: true,
    42  				ForceNew: true,
    43  			},
    44  		},
    45  	}
    46  }
    47  
    48  func resourceAwsApiGatewayBasePathMappingCreate(d *schema.ResourceData, meta interface{}) error {
    49  	conn := meta.(*AWSClient).apigateway
    50  
    51  	err := resource.Retry(30*time.Second, func() *resource.RetryError {
    52  		_, err := conn.CreateBasePathMapping(&apigateway.CreateBasePathMappingInput{
    53  			RestApiId:  aws.String(d.Get("api_id").(string)),
    54  			DomainName: aws.String(d.Get("domain_name").(string)),
    55  			BasePath:   aws.String(d.Get("base_path").(string)),
    56  			Stage:      aws.String(d.Get("stage_name").(string)),
    57  		})
    58  
    59  		if err != nil {
    60  			if err, ok := err.(awserr.Error); ok && err.Code() != "BadRequestException" {
    61  				return resource.NonRetryableError(err)
    62  			}
    63  
    64  			return resource.RetryableError(
    65  				fmt.Errorf("Error creating Gateway base path mapping: %s", err),
    66  			)
    67  		}
    68  
    69  		return nil
    70  	})
    71  
    72  	if err != nil {
    73  		return fmt.Errorf("Error creating Gateway base path mapping: %s", err)
    74  	}
    75  
    76  	id := fmt.Sprintf("%s/%s", d.Get("domain_name").(string), d.Get("base_path").(string))
    77  	d.SetId(id)
    78  
    79  	return resourceAwsApiGatewayBasePathMappingRead(d, meta)
    80  }
    81  
    82  func resourceAwsApiGatewayBasePathMappingRead(d *schema.ResourceData, meta interface{}) error {
    83  	conn := meta.(*AWSClient).apigateway
    84  
    85  	domainName := d.Get("domain_name").(string)
    86  	basePath := d.Get("base_path").(string)
    87  
    88  	if domainName == "" {
    89  		return nil
    90  	}
    91  
    92  	if basePath == "" {
    93  		basePath = emptyBasePathMappingValue
    94  	}
    95  
    96  	mapping, err := conn.GetBasePathMapping(&apigateway.GetBasePathMappingInput{
    97  		DomainName: aws.String(domainName),
    98  		BasePath:   aws.String(basePath),
    99  	})
   100  	if err != nil {
   101  		if err, ok := err.(awserr.Error); ok && err.Code() == "NotFoundException" {
   102  			log.Printf("[WARN] API gateway base path mapping %s has vanished\n", d.Id())
   103  			d.SetId("")
   104  			return nil
   105  		}
   106  
   107  		return fmt.Errorf("Error reading Gateway base path mapping: %s", err)
   108  	}
   109  
   110  	mappingBasePath := *mapping.BasePath
   111  
   112  	if mappingBasePath == emptyBasePathMappingValue {
   113  		mappingBasePath = ""
   114  	}
   115  
   116  	d.Set("base_path", mappingBasePath)
   117  	d.Set("api_id", mapping.RestApiId)
   118  	d.Set("stage_name", mapping.Stage)
   119  
   120  	return nil
   121  }
   122  
   123  func resourceAwsApiGatewayBasePathMappingDelete(d *schema.ResourceData, meta interface{}) error {
   124  	conn := meta.(*AWSClient).apigateway
   125  
   126  	basePath := d.Get("base_path").(string)
   127  
   128  	if basePath == "" {
   129  		basePath = emptyBasePathMappingValue
   130  	}
   131  
   132  	_, err := conn.DeleteBasePathMapping(&apigateway.DeleteBasePathMappingInput{
   133  		DomainName: aws.String(d.Get("domain_name").(string)),
   134  		BasePath:   aws.String(basePath),
   135  	})
   136  
   137  	if err != nil {
   138  		if err, ok := err.(awserr.Error); ok && err.Code() == "NotFoundException" {
   139  			return nil
   140  		}
   141  
   142  		return err
   143  	}
   144  
   145  	return nil
   146  }