Added Storage Queue resource.

This commit is contained in:
aznashwan 2015-06-12 01:55:43 +03:00
parent 329424c04b
commit ebfbef0d52
6 changed files with 266 additions and 10 deletions

View File

@ -38,6 +38,7 @@ func Provider() terraform.ResourceProvider {
"azure_storage_service": resourceAzureStorageService(),
"azure_storage_container": resourceAzureStorageContainer(),
"azure_storage_blob": resourceAzureStorageBlob(),
"azure_storage_queue": resourceAzureStorageQueue(),
"azure_virtual_network": resourceAzureVirtualNetwork(),
"azure_dns_server": resourceAzureDnsServer(),
"azure_local_network_connection": resourceAzureLocalNetworkConnection(),

View File

@ -0,0 +1,103 @@
package azure
import (
"fmt"
"log"
"github.com/hashicorp/terraform/helper/schema"
)
// resourceAzureStorageQueue returns the *schema.Resource associated
// to a storage queue on Azure.
func resourceAzureStorageQueue() *schema.Resource {
return &schema.Resource{
Create: resourceAzureStorageQueueCreate,
Read: resourceAzureStorageQueueRead,
Delete: resourceAzureStorageQueueDelete,
Schema: map[string]*schema.Schema{
"name": &schema.Schema{
Type: schema.TypeString,
Required: true,
ForceNew: true,
Description: parameterDescriptions["name"],
},
"storage_service_name": &schema.Schema{
Type: schema.TypeString,
Required: true,
ForceNew: true,
Description: parameterDescriptions["storage_service_name"],
},
},
}
}
// resourceAzureStorageQueueCreate does all the necessary API calls to
// create a storage queue on Azure.
func resourceAzureStorageQueueCreate(d *schema.ResourceData, meta interface{}) error {
mgmtClient := meta.(*Client).mgmtClient
storServName := d.Get("storage_service_name").(string)
queueClient, err := getStorageServiceQueueClient(mgmtClient, storServName)
if err != nil {
return err
}
// create the queue:
log.Println("Sending Storage Queue creation request to Azure.")
name := d.Get("name").(string)
err = queueClient.CreateQueue(name)
if err != nil {
return fmt.Errorf("Error creation Storage Queue on Azure: %s", err)
}
d.SetId(name)
return nil
}
// resourceAzureStorageQueueRead does all the necessary API calls to
// read the state of the storage queue off Azure.
func resourceAzureStorageQueueRead(d *schema.ResourceData, meta interface{}) error {
mgmtClient := meta.(*Client).mgmtClient
storServName := d.Get("storage_service_name").(string)
queueClient, err := getStorageServiceQueueClient(mgmtClient, storServName)
if err != nil {
return err
}
// check for queue's existence:
log.Println("[INFO] Sending Storage Queue existence query to Azure.")
name := d.Get("name").(string)
exists, err := queueClient.QueueExists(name)
if err != nil {
return fmt.Errorf("Error checking for Storage Queue existence: %s", err)
}
// If the queue has been deleted in the meantime;
// untrack the resource from the schema.
if !exists {
d.SetId("")
}
return nil
}
// resourceAzureStorageQueueDelete does all the necessary API calls to
// delete the storage queue off Azure.
func resourceAzureStorageQueueDelete(d *schema.ResourceData, meta interface{}) error {
mgmtClient := meta.(*Client).mgmtClient
storServName := d.Get("storage_service_name").(string)
queueClient, err := getStorageServiceQueueClient(mgmtClient, storServName)
if err != nil {
return err
}
// issue the deletion of the storage queue:
log.Println("[INFO] Sending Storage Queue deletion request to Azure.")
name := d.Get("name").(string)
err = queueClient.DeleteQueue(name)
if err != nil {
return fmt.Errorf("Error deleting Storage queue off Azure: %s", err)
}
return nil
}

View File

@ -0,0 +1,93 @@
package azure
import (
"fmt"
"testing"
"github.com/hashicorp/terraform/helper/resource"
"github.com/hashicorp/terraform/terraform"
)
func TestAccAzureStorageQueue(t *testing.T) {
name := "azure_storage_queue.foo"
resource.Test(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
Providers: testAccProviders,
CheckDestroy: testAccCheckAzureStorageQueueDeleted,
Steps: []resource.TestStep{
resource.TestStep{
Config: testAccAzureStorageQueueConfig,
Check: resource.ComposeTestCheckFunc(
testAccCheckAzureStorageQueueExists(name),
resource.TestCheckResourceAttr(name, "name", "terraform-queue"),
resource.TestCheckResourceAttr(name, "storage_service_name", testAccStorageServiceName),
),
},
},
})
}
func testAccCheckAzureStorageQueueExists(name string) resource.TestCheckFunc {
return func(s *terraform.State) error {
resource, ok := s.RootModule().Resources[name]
if !ok {
return fmt.Errorf("Azure Storage Queue resource '%s' is missing.", name)
}
if resource.Primary.ID == "" {
return fmt.Errorf("Azure Storage Service Queue ID %s is missing.", name)
}
mgmtClient := testAccProvider.Meta().(*Client).mgmtClient
queueClient, err := getStorageServiceQueueClient(mgmtClient, testAccStorageServiceName)
if err != nil {
return err
}
exists, err := queueClient.QueueExists(resource.Primary.ID)
if err != nil {
return fmt.Errorf("Error querying Azure for Storage Queue existence: %s", err)
}
if !exists {
return fmt.Errorf("Azure Storage Queue %s doesn't exist!", resource.Primary.ID)
}
return nil
}
}
func testAccCheckAzureStorageQueueDeleted(s *terraform.State) error {
for _, resource := range s.RootModule().Resources {
if resource.Type != "azure_storage_queue" {
continue
}
if resource.Primary.ID == "" {
return fmt.Errorf("Azure Storage Service Queue ID %s is missing.", resource.Primary.ID)
}
mgmtClient := testAccProvider.Meta().(*Client).mgmtClient
queueClient, err := getStorageServiceQueueClient(mgmtClient, testAccStorageServiceName)
if err != nil {
return err
}
exists, err := queueClient.QueueExists(resource.Primary.ID)
if err != nil {
return fmt.Errorf("Error querying Azure for Storage Queue existence: %s", err)
}
if exists {
return fmt.Errorf("Azure Storage Queue %s still exists!", resource.Primary.ID)
}
}
return nil
}
var testAccAzureStorageQueueConfig = fmt.Sprintf(`
resource "azure_storage_queue" "foo" {
name = "terraform-queue"
storage_service_name = "%s"
}
`, testAccStorageServiceName)

View File

@ -2,30 +2,49 @@ package azure
import (
"fmt"
"log"
"github.com/Azure/azure-sdk-for-go/management"
"github.com/Azure/azure-sdk-for-go/management/storageservice"
"github.com/Azure/azure-sdk-for-go/storage"
)
// getStorageServiceBlobClient is a helper function which returns the
// storage.BlobStorageClient associated to the given storage account name.
func getStorageServiceBlobClient(mgmtClient management.Client, serviceName string) (storage.BlobStorageClient, error) {
log.Println("[INFO] Begun generating Azure Storage Service Blob client.")
var blobClient storage.BlobStorageClient
// getStorageClientForStorageService is helper function which returns the
// storage.Client associated to the given storage service name.
func getStorageClientForStorageService(mgmtClient management.Client, serviceName string) (storage.Client, error) {
var storageClient storage.Client
storageServiceClient := storageservice.NewClient(mgmtClient)
keys, err := storageServiceClient.GetStorageServiceKeys(serviceName)
if err != nil {
return blobClient, fmt.Errorf("Error reading Storage Service %s's keys from Azure: %s", serviceName, err)
return storageClient, fmt.Errorf("Failed getting Storage Service keys for %s: %s", serviceName, err)
}
storageClient, err := storage.NewBasicClient(serviceName, keys.PrimaryKey)
storageClient, err = storage.NewBasicClient(serviceName, keys.PrimaryKey)
if err != nil {
return blobClient, fmt.Errorf("Error creating Storage Service Client for %s: %s", serviceName, err)
return storageClient, fmt.Errorf("Failed creating Storage Service client for %s: %s", serviceName, err)
}
return storageClient, err
}
// getStorageServiceBlobClient is a helper function which returns the
// storage.BlobStorageClient associated to the given storage service name.
func getStorageServiceBlobClient(mgmtClient management.Client, serviceName string) (storage.BlobStorageClient, error) {
storageClient, err := getStorageClientForStorageService(mgmtClient, serviceName)
if err != nil {
return storage.BlobStorageClient{}, err
}
return storageClient.GetBlobService(), nil
}
// getStorageServiceQueueClient is a helper function which returns the
// storage.QueueServiceClient associated to the given storage service name.
func getStorageServiceQueueClient(mgmtClient management.Client, serviceName string) (storage.QueueServiceClient, error) {
storageClient, err := getStorageClientForStorageService(mgmtClient, serviceName)
if err != nil {
return storage.QueueServiceClient{}, err
}
return storageClient.GetQueueService(), err
}

View File

@ -0,0 +1,36 @@
---
layout: "azure"
page_title: "Azure: azure_storage_queue"
sidebar_current: "docs-azure-storage-queue"
description: |-
Creates a new storage queue within a given storage service on Azure.
---
# azure\_storage\_queue
Creates a new storage queue within a given storage service on Azure.
## Example Usage
```
resource "azure_storage_queue" "stor-queue" {
name = "terraform-storage-queue"
storage_service_name = "tfstorserv"
}
````
## Argument Reference
The following arguments are supported:
* `name` - (Required) The name of the storage queue. Must be unique within
the storage service the queue is located.
* `storage_service_name` - (Required) The name of the storage service within
which the storage queue should be created.
## Attributes Reference
The following attributes are exported:
* `id` - The storage queue ID. Coincides with the given `name`.

View File

@ -49,6 +49,10 @@
<a href="/docs/providers/azure/r/storage_container.html">azure_storage_container</a>
</li>
<li<%= sidebar_current("docs-azure-resource-storage-queue") %>>
<a href="/docs/providers/azure/r/storage_queue.html">azure_storage_queue</a>
</li>
<li<%= sidebar_current("docs-azure-resource-storage-service") %>>
<a href="/docs/providers/azure/r/storage_service.html">azure_storage_service</a>
</li>