github.com/GoogleCloudPlatform/terraformer@v0.8.18/providers/azure/storage_container.go (about)

     1  package azure
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  
     7  	"github.com/Azure/azure-sdk-for-go/services/storage/mgmt/2019-04-01/storage"
     8  	"github.com/Azure/go-autorest/autorest"
     9  	"github.com/GoogleCloudPlatform/terraformer/terraformutils"
    10  	"github.com/hashicorp/go-azure-helpers/authentication"
    11  )
    12  
    13  const (
    14  	containerIDFormat = "https://%s.blob.core.windows.net/%s"
    15  )
    16  
    17  type StorageContainerGenerator struct {
    18  	AzureService
    19  }
    20  
    21  func NewStorageContainerGenerator(subscriptionID string, authorizer autorest.Authorizer, rg string) *StorageContainerGenerator {
    22  	storageContainerGenerator := new(StorageContainerGenerator)
    23  	storageContainerGenerator.Args = map[string]interface{}{}
    24  	storageContainerGenerator.Args["config"] = authentication.Config{SubscriptionID: subscriptionID}
    25  	storageContainerGenerator.Args["authorizer"] = authorizer
    26  	storageContainerGenerator.Args["resource_group"] = rg
    27  
    28  	return storageContainerGenerator
    29  }
    30  
    31  func (g StorageContainerGenerator) ListBlobContainers() ([]terraformutils.Resource, error) {
    32  	var containerResources []terraformutils.Resource
    33  	blobContainersClient := storage.NewBlobContainersClient(g.Args["config"].(authentication.Config).SubscriptionID)
    34  	blobContainersClient.Authorizer = g.Args["authorizer"].(autorest.Authorizer)
    35  	ctx := context.Background()
    36  
    37  	accounts, err := g.getStorageAccounts()
    38  	if err != nil {
    39  		return containerResources, err
    40  	}
    41  
    42  	for _, storageAccount := range accounts {
    43  		parsedStorageAccountResourceID, err := ParseAzureResourceID(*storageAccount.ID)
    44  		if err != nil {
    45  			break
    46  		}
    47  		containerItemsIterator, err := blobContainersClient.ListComplete(ctx, parsedStorageAccountResourceID.ResourceGroup, *storageAccount.Name, "", "", "")
    48  		if err != nil {
    49  			return containerResources, err
    50  		}
    51  
    52  		for containerItemsIterator.NotDone() {
    53  			containerItem := containerItemsIterator.Value()
    54  			containerResources = append(containerResources,
    55  				terraformutils.NewResource(
    56  					fmt.Sprintf(containerIDFormat, *storageAccount.Name, *containerItem.Name),
    57  					*containerItem.Name,
    58  					"azurerm_storage_container",
    59  					"azurerm",
    60  					map[string]string{
    61  						"storage_account_name": *storageAccount.Name,
    62  						"name":                 *containerItem.Name,
    63  					},
    64  					[]string{},
    65  					map[string]interface{}{}))
    66  
    67  			if err := containerItemsIterator.NextWithContext(ctx); err != nil {
    68  				return containerResources, err
    69  			}
    70  		}
    71  	}
    72  
    73  	return containerResources, nil
    74  }
    75  
    76  func (g *StorageContainerGenerator) getStorageAccounts() ([]storage.Account, error) {
    77  	ctx := context.Background()
    78  	accountsClient := storage.NewAccountsClient(g.Args["config"].(authentication.Config).SubscriptionID)
    79  
    80  	accountsClient.Authorizer = g.Args["authorizer"].(autorest.Authorizer)
    81  	var accounts []storage.Account
    82  	if rg := g.Args["resource_group"].(string); rg != "" {
    83  		accountsResult, err := accountsClient.ListByResourceGroup(ctx, rg)
    84  		if err != nil {
    85  			return nil, err
    86  		}
    87  		if paccounts := accountsResult.Value; paccounts != nil {
    88  			accounts = append(accounts, *paccounts...)
    89  		}
    90  	} else {
    91  		accountsIterator, err := accountsClient.ListComplete(ctx)
    92  		if err != nil {
    93  			return nil, err
    94  		}
    95  		for accountsIterator.NotDone() {
    96  			account := accountsIterator.Value()
    97  			accounts = append(accounts, account)
    98  			if err := accountsIterator.NextWithContext(ctx); err != nil {
    99  				return accounts, err
   100  			}
   101  		}
   102  	}
   103  
   104  	return accounts, nil
   105  }
   106  
   107  func (g *StorageContainerGenerator) InitResources() error {
   108  	storageAccounts, err := g.ListBlobContainers()
   109  	if err != nil {
   110  		return err
   111  	}
   112  
   113  	g.Resources = storageAccounts
   114  
   115  	return nil
   116  }