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

     1  package azure
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  
     7  	"log"
     8  	"net/url"
     9  
    10  	"github.com/Azure/azure-sdk-for-go/services/storage/mgmt/2019-06-01/storage"
    11  	"github.com/Azure/azure-storage-blob-go/azblob"
    12  	"github.com/Azure/go-autorest/autorest"
    13  	"github.com/GoogleCloudPlatform/terraformer/terraformutils"
    14  	"github.com/hashicorp/go-azure-helpers/authentication"
    15  )
    16  
    17  const (
    18  	blobFormatString = `https://%s.blob.core.windows.net`
    19  	blobIDFormat     = `https://%s.blob.core.windows.net/%s/%s`
    20  )
    21  
    22  type StorageBlobGenerator struct {
    23  	AzureService
    24  }
    25  
    26  func (g StorageBlobGenerator) getAccountPrimaryKey(ctx context.Context, accountName, accountGroupName string) string {
    27  	storageAccountsClient := storage.NewAccountsClient(g.Args["config"].(authentication.Config).SubscriptionID)
    28  	storageAccountsClient.Authorizer = g.Args["authorizer"].(autorest.Authorizer)
    29  
    30  	response, err := storageAccountsClient.ListKeys(ctx, accountGroupName, accountName, "kerb")
    31  	if err != nil {
    32  		log.Fatalf("failed to list keys: %v", err)
    33  	}
    34  	return *(((*response.Keys)[0]).Value)
    35  }
    36  
    37  func (g StorageBlobGenerator) getContainerURL(ctx context.Context, accountName, accountGroupName, containerName string) (azblob.ContainerURL, error) {
    38  	accountPrimaryKey := g.getAccountPrimaryKey(ctx, accountName, accountGroupName)
    39  	sharedKeyCredential, err := azblob.NewSharedKeyCredential(accountName, accountPrimaryKey)
    40  	if err != nil {
    41  		return azblob.ContainerURL{}, err
    42  	}
    43  
    44  	p := azblob.NewPipeline(sharedKeyCredential, azblob.PipelineOptions{})
    45  	accountURL, err := url.Parse(fmt.Sprintf(blobFormatString, accountName))
    46  	if err != nil {
    47  		return azblob.ContainerURL{}, err
    48  	}
    49  
    50  	serviceURL := azblob.NewServiceURL(*accountURL, p)
    51  	containerURL := serviceURL.NewContainerURL(containerName)
    52  
    53  	return containerURL, nil
    54  }
    55  
    56  func (g StorageBlobGenerator) getBlobsFromContainer(ctx context.Context, accountName, accountGroupName, containerName string) ([]azblob.BlobItem, error) {
    57  	containerURL, err := g.getContainerURL(ctx, accountName, accountGroupName, containerName)
    58  	if err != nil {
    59  		return nil, err
    60  	}
    61  
    62  	blobListResponse, err := containerURL.ListBlobsFlatSegment(
    63  		ctx,
    64  		azblob.Marker{},
    65  		azblob.ListBlobsSegmentOptions{
    66  			Details: azblob.BlobListingDetails{
    67  				Snapshots: true,
    68  			},
    69  		})
    70  	if err != nil {
    71  		return nil, err
    72  	}
    73  
    74  	return blobListResponse.Segment.BlobItems, nil
    75  }
    76  
    77  func (g StorageBlobGenerator) listStorageBlobs() ([]terraformutils.Resource, error) {
    78  	var storageBlobsResources []terraformutils.Resource
    79  	ctx := context.Background()
    80  
    81  	blobContainerGenerator := NewStorageContainerGenerator(g.Args["config"].(authentication.Config).SubscriptionID, g.Args["authorizer"].(autorest.Authorizer), g.Args["resource_group"].(string))
    82  	blobContainersResources, err := blobContainerGenerator.ListBlobContainers()
    83  	if err != nil {
    84  		return storageBlobsResources, err
    85  	}
    86  
    87  	for _, blobContainerResource := range blobContainersResources {
    88  		containerID := blobContainerResource.InstanceState.ID
    89  		parsedContainerID, err := ParseAzureResourceID(containerID)
    90  		if err != nil {
    91  			return storageBlobsResources, err
    92  		}
    93  
    94  		storageAccountName := blobContainerResource.InstanceState.Attributes["storage_account_name"]
    95  		containerName := blobContainerResource.InstanceState.Attributes["name"]
    96  		blobsList, err := g.getBlobsFromContainer(ctx, storageAccountName, parsedContainerID.ResourceGroup, containerName)
    97  		if err != nil {
    98  			return storageBlobsResources, err
    99  		}
   100  
   101  		for _, blobItem := range blobsList {
   102  			storageBlobsResources = append(storageBlobsResources, terraformutils.NewSimpleResource(
   103  				fmt.Sprintf(blobIDFormat, storageAccountName, containerName, blobItem.Name),
   104  				blobItem.Name,
   105  				"azurerm_storage_blob",
   106  				"azurerm",
   107  				[]string{}))
   108  		}
   109  	}
   110  
   111  	return storageBlobsResources, err
   112  }
   113  
   114  func (g *StorageBlobGenerator) InitResources() error {
   115  	resources, err := g.listStorageBlobs()
   116  	if err != nil {
   117  		return err
   118  	}
   119  
   120  	g.Resources = append(g.Resources, resources...)
   121  
   122  	return nil
   123  }