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 }