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 }