| package azure |
| |
| import ( |
| "context" |
| "os" |
| "testing" |
| |
| "github.com/hashicorp/terraform/internal/backend" |
| "github.com/hashicorp/terraform/internal/legacy/helper/acctest" |
| "github.com/hashicorp/terraform/internal/states/remote" |
| "github.com/tombuildsstuff/giovanni/storage/2018-11-09/blob/blobs" |
| ) |
| |
| func TestRemoteClient_impl(t *testing.T) { |
| var _ remote.Client = new(RemoteClient) |
| var _ remote.ClientLocker = new(RemoteClient) |
| } |
| |
| func TestRemoteClientAccessKeyBasic(t *testing.T) { |
| testAccAzureBackend(t) |
| rs := acctest.RandString(4) |
| res := testResourceNames(rs, "testState") |
| armClient := buildTestClient(t, res) |
| |
| ctx := context.TODO() |
| err := armClient.buildTestResources(ctx, &res) |
| defer armClient.destroyTestResources(ctx, res) |
| if err != nil { |
| t.Fatalf("Error creating Test Resources: %q", err) |
| } |
| |
| b := backend.TestBackendConfig(t, New(), backend.TestWrapConfig(map[string]interface{}{ |
| "storage_account_name": res.storageAccountName, |
| "container_name": res.storageContainerName, |
| "key": res.storageKeyName, |
| "access_key": res.storageAccountAccessKey, |
| "environment": os.Getenv("ARM_ENVIRONMENT"), |
| "endpoint": os.Getenv("ARM_ENDPOINT"), |
| })).(*Backend) |
| |
| state, err := b.StateMgr(backend.DefaultStateName) |
| if err != nil { |
| t.Fatal(err) |
| } |
| |
| remote.TestClient(t, state.(*remote.State).Client) |
| } |
| |
| func TestRemoteClientManagedServiceIdentityBasic(t *testing.T) { |
| testAccAzureBackendRunningInAzure(t) |
| rs := acctest.RandString(4) |
| res := testResourceNames(rs, "testState") |
| armClient := buildTestClient(t, res) |
| |
| ctx := context.TODO() |
| err := armClient.buildTestResources(ctx, &res) |
| defer armClient.destroyTestResources(ctx, res) |
| if err != nil { |
| t.Fatalf("Error creating Test Resources: %q", err) |
| } |
| |
| b := backend.TestBackendConfig(t, New(), backend.TestWrapConfig(map[string]interface{}{ |
| "storage_account_name": res.storageAccountName, |
| "container_name": res.storageContainerName, |
| "key": res.storageKeyName, |
| "resource_group_name": res.resourceGroup, |
| "use_msi": true, |
| "subscription_id": os.Getenv("ARM_SUBSCRIPTION_ID"), |
| "tenant_id": os.Getenv("ARM_TENANT_ID"), |
| "environment": os.Getenv("ARM_ENVIRONMENT"), |
| "endpoint": os.Getenv("ARM_ENDPOINT"), |
| })).(*Backend) |
| |
| state, err := b.StateMgr(backend.DefaultStateName) |
| if err != nil { |
| t.Fatal(err) |
| } |
| |
| remote.TestClient(t, state.(*remote.State).Client) |
| } |
| |
| func TestRemoteClientSasTokenBasic(t *testing.T) { |
| testAccAzureBackend(t) |
| rs := acctest.RandString(4) |
| res := testResourceNames(rs, "testState") |
| armClient := buildTestClient(t, res) |
| |
| ctx := context.TODO() |
| err := armClient.buildTestResources(ctx, &res) |
| defer armClient.destroyTestResources(ctx, res) |
| if err != nil { |
| t.Fatalf("Error creating Test Resources: %q", err) |
| } |
| |
| sasToken, err := buildSasToken(res.storageAccountName, res.storageAccountAccessKey) |
| if err != nil { |
| t.Fatalf("Error building SAS Token: %+v", err) |
| } |
| |
| b := backend.TestBackendConfig(t, New(), backend.TestWrapConfig(map[string]interface{}{ |
| "storage_account_name": res.storageAccountName, |
| "container_name": res.storageContainerName, |
| "key": res.storageKeyName, |
| "sas_token": *sasToken, |
| "environment": os.Getenv("ARM_ENVIRONMENT"), |
| "endpoint": os.Getenv("ARM_ENDPOINT"), |
| })).(*Backend) |
| |
| state, err := b.StateMgr(backend.DefaultStateName) |
| if err != nil { |
| t.Fatal(err) |
| } |
| |
| remote.TestClient(t, state.(*remote.State).Client) |
| } |
| |
| func TestRemoteClientServicePrincipalBasic(t *testing.T) { |
| testAccAzureBackend(t) |
| rs := acctest.RandString(4) |
| res := testResourceNames(rs, "testState") |
| armClient := buildTestClient(t, res) |
| |
| ctx := context.TODO() |
| err := armClient.buildTestResources(ctx, &res) |
| defer armClient.destroyTestResources(ctx, res) |
| if err != nil { |
| t.Fatalf("Error creating Test Resources: %q", err) |
| } |
| |
| b := backend.TestBackendConfig(t, New(), backend.TestWrapConfig(map[string]interface{}{ |
| "storage_account_name": res.storageAccountName, |
| "container_name": res.storageContainerName, |
| "key": res.storageKeyName, |
| "resource_group_name": res.resourceGroup, |
| "subscription_id": os.Getenv("ARM_SUBSCRIPTION_ID"), |
| "tenant_id": os.Getenv("ARM_TENANT_ID"), |
| "client_id": os.Getenv("ARM_CLIENT_ID"), |
| "client_secret": os.Getenv("ARM_CLIENT_SECRET"), |
| "environment": os.Getenv("ARM_ENVIRONMENT"), |
| "endpoint": os.Getenv("ARM_ENDPOINT"), |
| })).(*Backend) |
| |
| state, err := b.StateMgr(backend.DefaultStateName) |
| if err != nil { |
| t.Fatal(err) |
| } |
| |
| remote.TestClient(t, state.(*remote.State).Client) |
| } |
| |
| func TestRemoteClientAccessKeyLocks(t *testing.T) { |
| testAccAzureBackend(t) |
| rs := acctest.RandString(4) |
| res := testResourceNames(rs, "testState") |
| armClient := buildTestClient(t, res) |
| |
| ctx := context.TODO() |
| err := armClient.buildTestResources(ctx, &res) |
| defer armClient.destroyTestResources(ctx, res) |
| if err != nil { |
| t.Fatalf("Error creating Test Resources: %q", err) |
| } |
| |
| b1 := backend.TestBackendConfig(t, New(), backend.TestWrapConfig(map[string]interface{}{ |
| "storage_account_name": res.storageAccountName, |
| "container_name": res.storageContainerName, |
| "key": res.storageKeyName, |
| "access_key": res.storageAccountAccessKey, |
| "environment": os.Getenv("ARM_ENVIRONMENT"), |
| "endpoint": os.Getenv("ARM_ENDPOINT"), |
| })).(*Backend) |
| |
| b2 := backend.TestBackendConfig(t, New(), backend.TestWrapConfig(map[string]interface{}{ |
| "storage_account_name": res.storageAccountName, |
| "container_name": res.storageContainerName, |
| "key": res.storageKeyName, |
| "access_key": res.storageAccountAccessKey, |
| "environment": os.Getenv("ARM_ENVIRONMENT"), |
| "endpoint": os.Getenv("ARM_ENDPOINT"), |
| })).(*Backend) |
| |
| s1, err := b1.StateMgr(backend.DefaultStateName) |
| if err != nil { |
| t.Fatal(err) |
| } |
| |
| s2, err := b2.StateMgr(backend.DefaultStateName) |
| if err != nil { |
| t.Fatal(err) |
| } |
| |
| remote.TestRemoteLocks(t, s1.(*remote.State).Client, s2.(*remote.State).Client) |
| } |
| |
| func TestRemoteClientServicePrincipalLocks(t *testing.T) { |
| testAccAzureBackend(t) |
| rs := acctest.RandString(4) |
| res := testResourceNames(rs, "testState") |
| armClient := buildTestClient(t, res) |
| |
| ctx := context.TODO() |
| err := armClient.buildTestResources(ctx, &res) |
| defer armClient.destroyTestResources(ctx, res) |
| if err != nil { |
| t.Fatalf("Error creating Test Resources: %q", err) |
| } |
| |
| b1 := backend.TestBackendConfig(t, New(), backend.TestWrapConfig(map[string]interface{}{ |
| "storage_account_name": res.storageAccountName, |
| "container_name": res.storageContainerName, |
| "key": res.storageKeyName, |
| "resource_group_name": res.resourceGroup, |
| "subscription_id": os.Getenv("ARM_SUBSCRIPTION_ID"), |
| "tenant_id": os.Getenv("ARM_TENANT_ID"), |
| "client_id": os.Getenv("ARM_CLIENT_ID"), |
| "client_secret": os.Getenv("ARM_CLIENT_SECRET"), |
| "environment": os.Getenv("ARM_ENVIRONMENT"), |
| "endpoint": os.Getenv("ARM_ENDPOINT"), |
| })).(*Backend) |
| |
| b2 := backend.TestBackendConfig(t, New(), backend.TestWrapConfig(map[string]interface{}{ |
| "storage_account_name": res.storageAccountName, |
| "container_name": res.storageContainerName, |
| "key": res.storageKeyName, |
| "resource_group_name": res.resourceGroup, |
| "subscription_id": os.Getenv("ARM_SUBSCRIPTION_ID"), |
| "tenant_id": os.Getenv("ARM_TENANT_ID"), |
| "client_id": os.Getenv("ARM_CLIENT_ID"), |
| "client_secret": os.Getenv("ARM_CLIENT_SECRET"), |
| "environment": os.Getenv("ARM_ENVIRONMENT"), |
| "endpoint": os.Getenv("ARM_ENDPOINT"), |
| })).(*Backend) |
| |
| s1, err := b1.StateMgr(backend.DefaultStateName) |
| if err != nil { |
| t.Fatal(err) |
| } |
| |
| s2, err := b2.StateMgr(backend.DefaultStateName) |
| if err != nil { |
| t.Fatal(err) |
| } |
| |
| remote.TestRemoteLocks(t, s1.(*remote.State).Client, s2.(*remote.State).Client) |
| } |
| |
| func TestPutMaintainsMetaData(t *testing.T) { |
| testAccAzureBackend(t) |
| rs := acctest.RandString(4) |
| res := testResourceNames(rs, "testState") |
| armClient := buildTestClient(t, res) |
| |
| ctx := context.TODO() |
| err := armClient.buildTestResources(ctx, &res) |
| defer armClient.destroyTestResources(ctx, res) |
| if err != nil { |
| t.Fatalf("Error creating Test Resources: %q", err) |
| } |
| |
| headerName := "acceptancetest" |
| expectedValue := "f3b56bad-33ad-4b93-a600-7a66e9cbd1eb" |
| |
| client, err := armClient.getBlobClient(ctx) |
| if err != nil { |
| t.Fatalf("Error building Blob Client: %+v", err) |
| } |
| |
| _, err = client.PutBlockBlob(ctx, res.storageAccountName, res.storageContainerName, res.storageKeyName, blobs.PutBlockBlobInput{}) |
| if err != nil { |
| t.Fatalf("Error Creating Block Blob: %+v", err) |
| } |
| |
| blobReference, err := client.GetProperties(ctx, res.storageAccountName, res.storageContainerName, res.storageKeyName, blobs.GetPropertiesInput{}) |
| if err != nil { |
| t.Fatalf("Error loading MetaData: %+v", err) |
| } |
| |
| blobReference.MetaData[headerName] = expectedValue |
| opts := blobs.SetMetaDataInput{ |
| MetaData: blobReference.MetaData, |
| } |
| _, err = client.SetMetaData(ctx, res.storageAccountName, res.storageContainerName, res.storageKeyName, opts) |
| if err != nil { |
| t.Fatalf("Error setting MetaData: %+v", err) |
| } |
| |
| // update the metadata using the Backend |
| remoteClient := RemoteClient{ |
| keyName: res.storageKeyName, |
| containerName: res.storageContainerName, |
| accountName: res.storageAccountName, |
| |
| giovanniBlobClient: *client, |
| } |
| |
| bytes := []byte(acctest.RandString(20)) |
| err = remoteClient.Put(bytes) |
| if err != nil { |
| t.Fatalf("Error putting data: %+v", err) |
| } |
| |
| // Verify it still exists |
| blobReference, err = client.GetProperties(ctx, res.storageAccountName, res.storageContainerName, res.storageKeyName, blobs.GetPropertiesInput{}) |
| if err != nil { |
| t.Fatalf("Error loading MetaData: %+v", err) |
| } |
| |
| if blobReference.MetaData[headerName] != expectedValue { |
| t.Fatalf("%q was not set to %q in the MetaData: %+v", headerName, expectedValue, blobReference.MetaData) |
| } |
| } |