github.com/bendemaree/terraform@v0.5.4-0.20150613200311-f50d97d6eee6/builtin/providers/azure/resource_azure_hosted_service.go (about)

     1  package azure
     2  
     3  import (
     4  	"encoding/base64"
     5  	"fmt"
     6  	"log"
     7  
     8  	"github.com/Azure/azure-sdk-for-go/management"
     9  	"github.com/Azure/azure-sdk-for-go/management/hostedservice"
    10  	"github.com/hashicorp/terraform/helper/schema"
    11  )
    12  
    13  // resourceAzureHostedService returns the schema.Resource associated to an
    14  // Azure hosted service.
    15  func resourceAzureHostedService() *schema.Resource {
    16  	return &schema.Resource{
    17  		Create: resourceAzureHostedServiceCreate,
    18  		Read:   resourceAzureHostedServiceRead,
    19  		Update: resourceAzureHostedServiceUpdate,
    20  		Delete: resourceAzureHostedServiceDelete,
    21  
    22  		Schema: map[string]*schema.Schema{
    23  			"name": &schema.Schema{
    24  				Type:        schema.TypeString,
    25  				Required:    true,
    26  				ForceNew:    true,
    27  				Description: parameterDescriptions["name"],
    28  			},
    29  			"location": &schema.Schema{
    30  				Type:        schema.TypeString,
    31  				Required:    true,
    32  				ForceNew:    true,
    33  				Description: parameterDescriptions["location"],
    34  			},
    35  			"ephemeral_contents": &schema.Schema{
    36  				Type:        schema.TypeBool,
    37  				Required:    true,
    38  				Description: parameterDescriptions["ephemeral_contents"],
    39  			},
    40  			"url": &schema.Schema{
    41  				Type:     schema.TypeString,
    42  				Computed: true,
    43  			},
    44  			"status": &schema.Schema{
    45  				Type:     schema.TypeString,
    46  				Computed: true,
    47  			},
    48  			"reverse_dns_fqdn": &schema.Schema{
    49  				Type:        schema.TypeString,
    50  				Optional:    true,
    51  				Description: parameterDescriptions["reverse_dns_fqdn"],
    52  			},
    53  			"label": &schema.Schema{
    54  				Type:        schema.TypeString,
    55  				ForceNew:    true,
    56  				Optional:    true,
    57  				Default:     "Made by Terraform.",
    58  				Description: parameterDescriptions["label"],
    59  			},
    60  			"description": &schema.Schema{
    61  				Type:        schema.TypeString,
    62  				ForceNew:    true,
    63  				Optional:    true,
    64  				Description: parameterDescriptions["description"],
    65  			},
    66  			"default_certificate_thumbprint": &schema.Schema{
    67  				Type:        schema.TypeString,
    68  				Computed:    true,
    69  				Optional:    true,
    70  				Description: parameterDescriptions["default_certificate_thumbprint"],
    71  			},
    72  		},
    73  	}
    74  }
    75  
    76  // resourceAzureHostedServiceCreate does all the necessary API calls
    77  // to create a hosted service on Azure.
    78  func resourceAzureHostedServiceCreate(d *schema.ResourceData, meta interface{}) error {
    79  	azureClient := meta.(*Client)
    80  	mgmtClient := azureClient.mgmtClient
    81  	hostedServiceClient := hostedservice.NewClient(mgmtClient)
    82  
    83  	serviceName := d.Get("name").(string)
    84  	location := d.Get("location").(string)
    85  	reverseDNS := d.Get("reverse_dns_fqdn").(string)
    86  	description := d.Get("description").(string)
    87  	label := base64.StdEncoding.EncodeToString([]byte(d.Get("label").(string)))
    88  
    89  	err := hostedServiceClient.CreateHostedService(
    90  		hostedservice.CreateHostedServiceParameters{
    91  			ServiceName:    serviceName,
    92  			Location:       location,
    93  			Label:          label,
    94  			Description:    description,
    95  			ReverseDNSFqdn: reverseDNS,
    96  		},
    97  	)
    98  	if err != nil {
    99  		return fmt.Errorf("Failed defining new Azure hosted service: %s", err)
   100  	}
   101  
   102  	d.SetId(serviceName)
   103  	return nil
   104  }
   105  
   106  // resourceAzureHostedServiceRead does all the necessary API calls
   107  // to read the state of a hosted service from Azure.
   108  func resourceAzureHostedServiceRead(d *schema.ResourceData, meta interface{}) error {
   109  	azureClient := meta.(*Client)
   110  	hostedServiceClient := hostedservice.NewClient(azureClient.mgmtClient)
   111  
   112  	log.Println("[INFO] Querying for hosted service info.")
   113  	serviceName := d.Get("name").(string)
   114  	hostedService, err := hostedServiceClient.GetHostedService(serviceName)
   115  	if err != nil {
   116  		if management.IsResourceNotFoundError(err) {
   117  			// it means the hosted service was deleted in the meantime,
   118  			// so we must remove it here:
   119  			d.SetId("")
   120  			return nil
   121  		} else {
   122  			return fmt.Errorf("Failed to get hosted service: %s", err)
   123  		}
   124  	}
   125  
   126  	log.Println("[DEBUG] Reading hosted service query result data.")
   127  	d.Set("name", hostedService.ServiceName)
   128  	d.Set("url", hostedService.URL)
   129  	d.Set("location", hostedService.Location)
   130  	d.Set("description", hostedService.Description)
   131  	d.Set("label", hostedService.Label)
   132  	d.Set("status", hostedService.Status)
   133  	d.Set("reverse_dns_fqdn", hostedService.ReverseDNSFqdn)
   134  	d.Set("default_certificate_thumbprint", hostedService.DefaultWinRmCertificateThumbprint)
   135  
   136  	return nil
   137  }
   138  
   139  // resourceAzureHostedServiceUpdate does all the necessary API calls to
   140  // update some settings of a hosted service on Azure.
   141  func resourceAzureHostedServiceUpdate(d *schema.ResourceData, meta interface{}) error {
   142  	// NOTE: although no-op; this is still required in order for updates to
   143  	// ephemeral_contents to be possible.
   144  
   145  	// check if the service still exists:
   146  	return resourceAzureHostedServiceRead(d, meta)
   147  }
   148  
   149  // resourceAzureHostedServiceDelete does all the necessary API calls to
   150  // delete a hosted service from Azure.
   151  func resourceAzureHostedServiceDelete(d *schema.ResourceData, meta interface{}) error {
   152  	azureClient := meta.(*Client)
   153  	mgmtClient := azureClient.mgmtClient
   154  	hostedServiceClient := hostedservice.NewClient(mgmtClient)
   155  
   156  	log.Println("[INFO] Issuing hosted service deletion.")
   157  	serviceName := d.Get("name").(string)
   158  	ephemeral := d.Get("ephemeral_contents").(bool)
   159  	reqID, err := hostedServiceClient.DeleteHostedService(serviceName, ephemeral)
   160  	if err != nil {
   161  		return fmt.Errorf("Failed issuing hosted service deletion request: %s", err)
   162  	}
   163  
   164  	log.Println("[DEBUG] Awaiting confirmation on hosted service deletion.")
   165  	err = mgmtClient.WaitForOperation(reqID, nil)
   166  	if err != nil {
   167  		return fmt.Errorf("Error on hosted service deletion: %s", err)
   168  	}
   169  
   170  	return nil
   171  }