mirror of https://github.com/hashicorp/terraform
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
447 lines
13 KiB
447 lines
13 KiB
// Copyright IBM Corp. 2014, 2026
|
|
// SPDX-License-Identifier: BUSL-1.1
|
|
|
|
package azure
|
|
|
|
import (
|
|
"os"
|
|
"testing"
|
|
|
|
"github.com/hashicorp/terraform/internal/backend"
|
|
)
|
|
|
|
func TestBackend_impl(t *testing.T) {
|
|
var _ backend.Backend = new(Backend)
|
|
}
|
|
|
|
func TestBackendConfig(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
// This test just instantiates the client. Shouldn't make any actual
|
|
// requests nor incur any costs.
|
|
|
|
config := map[string]interface{}{
|
|
"storage_account_name": "tfaccount",
|
|
"container_name": "tfcontainer",
|
|
"key": "state",
|
|
"snapshot": false,
|
|
// Access Key must be Base64
|
|
"access_key": "QUNDRVNTX0tFWQ0K",
|
|
}
|
|
|
|
b := backend.TestBackendConfig(t, New(), backend.TestWrapConfig(config)).(*Backend)
|
|
|
|
if b.containerName != "tfcontainer" {
|
|
t.Fatalf("Incorrect bucketName was populated")
|
|
}
|
|
if b.keyName != "state" {
|
|
t.Fatalf("Incorrect keyName was populated")
|
|
}
|
|
if b.snapshot != false {
|
|
t.Fatalf("Incorrect snapshot was populated")
|
|
}
|
|
}
|
|
|
|
func TestAccBackendAccessKeyBasic(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
testAccAzureBackend(t)
|
|
|
|
ctx := newCtx()
|
|
m := BuildTestMeta(t, ctx)
|
|
|
|
err := m.buildTestResources(ctx)
|
|
if err != nil {
|
|
m.destroyTestResources(ctx)
|
|
t.Fatalf("Error creating Test Resources: %q", err)
|
|
}
|
|
defer m.destroyTestResources(ctx)
|
|
|
|
clearARMEnv()
|
|
b := backend.TestBackendConfig(t, New(), backend.TestWrapConfig(map[string]interface{}{
|
|
"storage_account_name": m.names.storageAccountName,
|
|
"container_name": m.names.storageContainerName,
|
|
"key": m.names.storageKeyName,
|
|
"access_key": m.storageAccessKey,
|
|
"environment": m.env.Name,
|
|
})).(*Backend)
|
|
|
|
backend.TestBackendStates(t, b)
|
|
}
|
|
|
|
func TestAccBackendSASTokenBasic(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
testAccAzureBackend(t)
|
|
|
|
ctx := newCtx()
|
|
m := BuildTestMeta(t, ctx)
|
|
|
|
err := m.buildTestResources(ctx)
|
|
if err != nil {
|
|
m.destroyTestResources(ctx)
|
|
t.Fatalf("Error creating Test Resources: %q", err)
|
|
}
|
|
defer m.destroyTestResources(ctx)
|
|
|
|
sasToken, err := buildSasToken(m.names.storageAccountName, m.storageAccessKey)
|
|
if err != nil {
|
|
t.Fatalf("Error building SAS Token: %+v", err)
|
|
}
|
|
|
|
clearARMEnv()
|
|
b := backend.TestBackendConfig(t, New(), backend.TestWrapConfig(map[string]interface{}{
|
|
"storage_account_name": m.names.storageAccountName,
|
|
"container_name": m.names.storageContainerName,
|
|
"key": m.names.storageKeyName,
|
|
"sas_token": *sasToken,
|
|
"environment": m.env.Name,
|
|
})).(*Backend)
|
|
|
|
backend.TestBackendStates(t, b)
|
|
}
|
|
|
|
func TestAccBackendGithubOIDCBasic(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
testAccAzureBackendRunningInGitHubActions(t)
|
|
|
|
oidcRequestToken := os.Getenv("ACTIONS_ID_TOKEN_REQUEST_TOKEN")
|
|
if oidcRequestToken == "" {
|
|
t.Fatalf("Missing ACTIONS_ID_TOKEN_REQUEST_TOKEN")
|
|
}
|
|
|
|
oidcRequestURL := os.Getenv("ACTIONS_ID_TOKEN_REQUEST_URL")
|
|
if oidcRequestURL == "" {
|
|
t.Fatalf("Missing ACTIONS_ID_TOKEN_REQUEST_URL")
|
|
}
|
|
|
|
ctx := newCtx()
|
|
m := BuildTestMeta(t, ctx)
|
|
|
|
err := m.buildTestResources(ctx)
|
|
if err != nil {
|
|
m.destroyTestResources(ctx)
|
|
t.Fatalf("Error creating Test Resources: %q", err)
|
|
}
|
|
defer m.destroyTestResources(ctx)
|
|
|
|
clearARMEnv()
|
|
b := backend.TestBackendConfig(t, New(), backend.TestWrapConfig(map[string]interface{}{
|
|
"subscription_id": m.subscriptionId,
|
|
"resource_group_name": m.names.resourceGroup,
|
|
"storage_account_name": m.names.storageAccountName,
|
|
"container_name": m.names.storageContainerName,
|
|
"key": m.names.storageKeyName,
|
|
"use_oidc": true,
|
|
"oidc_request_token": oidcRequestToken,
|
|
"oidc_request_url": oidcRequestURL,
|
|
"tenant_id": m.tenantId,
|
|
"client_id": m.clientId,
|
|
"environment": m.env.Name,
|
|
})).(*Backend)
|
|
|
|
backend.TestBackendStates(t, b)
|
|
}
|
|
|
|
func TestAccBackendADOPipelinesOIDCBasic(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
testAccAzureBackendRunningInADOPipelines(t)
|
|
|
|
oidcRequestToken := os.Getenv("SYSTEM_ACCESSTOKEN")
|
|
if oidcRequestToken == "" {
|
|
t.Fatalf("Missing SYSTEM_ACCESSTOKEN")
|
|
}
|
|
|
|
oidcRequestURL := os.Getenv("SYSTEM_OIDCREQUESTURI")
|
|
if oidcRequestURL == "" {
|
|
t.Fatalf("Missing SYSTEM_OIDCREQUESTURI")
|
|
}
|
|
|
|
adoPipelineServiceConnectionId := os.Getenv("ARM_ADO_PIPELINE_SERVICE_CONNECTION_ID")
|
|
if adoPipelineServiceConnectionId == "" {
|
|
t.Fatalf("Missing ARM_ADO_PIPELINE_SERVICE_CONNECTION_ID")
|
|
}
|
|
|
|
ctx := newCtx()
|
|
m := BuildTestMeta(t, ctx)
|
|
|
|
err := m.buildTestResources(ctx)
|
|
if err != nil {
|
|
m.destroyTestResources(ctx)
|
|
t.Fatalf("Error creating Test Resources: %q", err)
|
|
}
|
|
defer m.destroyTestResources(ctx)
|
|
|
|
clearARMEnv()
|
|
b := backend.TestBackendConfig(t, New(), backend.TestWrapConfig(map[string]interface{}{
|
|
"subscription_id": m.subscriptionId,
|
|
"resource_group_name": m.names.resourceGroup,
|
|
"storage_account_name": m.names.storageAccountName,
|
|
"container_name": m.names.storageContainerName,
|
|
"key": m.names.storageKeyName,
|
|
"use_oidc": true,
|
|
"oidc_request_token": oidcRequestToken,
|
|
"oidc_request_url": oidcRequestURL,
|
|
"ado_pipeline_service_connection_id": adoPipelineServiceConnectionId,
|
|
"tenant_id": m.tenantId,
|
|
"client_id": m.clientId,
|
|
"environment": m.env.Name,
|
|
})).(*Backend)
|
|
|
|
backend.TestBackendStates(t, b)
|
|
}
|
|
|
|
func TestAccBackendAzureADAuthBasic(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
testAccAzureBackend(t)
|
|
|
|
ctx := newCtx()
|
|
m := BuildTestMeta(t, ctx)
|
|
|
|
err := m.buildTestResources(ctx)
|
|
if err != nil {
|
|
m.destroyTestResources(ctx)
|
|
t.Fatalf("Error creating Test Resources: %q", err)
|
|
}
|
|
defer m.destroyTestResources(ctx)
|
|
|
|
clearARMEnv()
|
|
b := backend.TestBackendConfig(t, New(), backend.TestWrapConfig(map[string]interface{}{
|
|
"subscription_id": m.subscriptionId,
|
|
"resource_group_name": m.names.resourceGroup,
|
|
"storage_account_name": m.names.storageAccountName,
|
|
"container_name": m.names.storageContainerName,
|
|
"key": m.names.storageKeyName,
|
|
"tenant_id": m.tenantId,
|
|
"client_id": m.clientId,
|
|
"client_secret": m.clientSecret,
|
|
"use_azuread_auth": true,
|
|
"environment": m.env.Name,
|
|
})).(*Backend)
|
|
|
|
backend.TestBackendStates(t, b)
|
|
}
|
|
|
|
func TestAccBackendAzureADAuthBasicWithBlobEndpointLookup(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
testAccAzureBackend(t)
|
|
|
|
ctx := newCtx()
|
|
m := BuildTestMeta(t, ctx)
|
|
|
|
err := m.buildTestResources(ctx)
|
|
if err != nil {
|
|
m.destroyTestResources(ctx)
|
|
t.Fatalf("Error creating Test Resources: %q", err)
|
|
}
|
|
defer m.destroyTestResources(ctx)
|
|
|
|
clearARMEnv()
|
|
b := backend.TestBackendConfig(t, New(), backend.TestWrapConfig(map[string]interface{}{
|
|
"subscription_id": m.subscriptionId,
|
|
"resource_group_name": m.names.resourceGroup,
|
|
"storage_account_name": m.names.storageAccountName,
|
|
"container_name": m.names.storageContainerName,
|
|
"key": m.names.storageKeyName,
|
|
"tenant_id": m.tenantId,
|
|
"client_id": m.clientId,
|
|
"client_secret": m.clientSecret,
|
|
"use_azuread_auth": true,
|
|
"environment": m.env.Name,
|
|
"lookup_blob_endpoint": true,
|
|
})).(*Backend)
|
|
|
|
backend.TestBackendStates(t, b)
|
|
}
|
|
|
|
func TestAccBackendManagedServiceIdentityBasic(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
testAccAzureBackendRunningInAzure(t)
|
|
|
|
ctx := newCtx()
|
|
m := BuildTestMeta(t, ctx)
|
|
|
|
err := m.buildTestResources(ctx)
|
|
if err != nil {
|
|
m.destroyTestResources(ctx)
|
|
t.Fatalf("Error creating Test Resources: %q", err)
|
|
}
|
|
defer m.destroyTestResources(ctx)
|
|
|
|
clearARMEnv()
|
|
b := backend.TestBackendConfig(t, New(), backend.TestWrapConfig(map[string]interface{}{
|
|
"subscription_id": m.subscriptionId,
|
|
"resource_group_name": m.names.resourceGroup,
|
|
"storage_account_name": m.names.storageAccountName,
|
|
"container_name": m.names.storageContainerName,
|
|
"key": m.names.storageKeyName,
|
|
"use_msi": true,
|
|
"tenant_id": m.tenantId,
|
|
"environment": m.env.Name,
|
|
})).(*Backend)
|
|
|
|
backend.TestBackendStates(t, b)
|
|
}
|
|
|
|
func TestAccBackendServicePrincipalClientCertificateBasic(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
testAccAzureBackend(t)
|
|
|
|
clientCertPassword := os.Getenv("ARM_CLIENT_CERTIFICATE_PASSWORD")
|
|
clientCertPath := os.Getenv("ARM_CLIENT_CERTIFICATE_PATH")
|
|
if clientCertPath == "" {
|
|
t.Skip("Skipping since `ARM_CLIENT_CERTIFICATE_PATH` is not specified!")
|
|
}
|
|
|
|
ctx := newCtx()
|
|
m := BuildTestMeta(t, ctx)
|
|
|
|
err := m.buildTestResources(ctx)
|
|
if err != nil {
|
|
m.destroyTestResources(ctx)
|
|
t.Fatalf("Error creating Test Resources: %q", err)
|
|
}
|
|
defer m.destroyTestResources(ctx)
|
|
|
|
clearARMEnv()
|
|
b := backend.TestBackendConfig(t, New(), backend.TestWrapConfig(map[string]interface{}{
|
|
"subscription_id": m.subscriptionId,
|
|
"resource_group_name": m.names.resourceGroup,
|
|
"storage_account_name": m.names.storageAccountName,
|
|
"container_name": m.names.storageContainerName,
|
|
"key": m.names.storageKeyName,
|
|
"tenant_id": m.tenantId,
|
|
"client_id": m.clientId,
|
|
"client_certificate_password": clientCertPassword,
|
|
"client_certificate_path": clientCertPath,
|
|
"environment": m.env.Name,
|
|
})).(*Backend)
|
|
|
|
backend.TestBackendStates(t, b)
|
|
}
|
|
|
|
func TestAccBackendServicePrincipalClientSecretBasic(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
testAccAzureBackend(t)
|
|
|
|
ctx := newCtx()
|
|
m := BuildTestMeta(t, ctx)
|
|
|
|
err := m.buildTestResources(ctx)
|
|
if err != nil {
|
|
m.destroyTestResources(ctx)
|
|
t.Fatalf("Error creating Test Resources: %q", err)
|
|
}
|
|
defer m.destroyTestResources(ctx)
|
|
|
|
clearARMEnv()
|
|
b := backend.TestBackendConfig(t, New(), backend.TestWrapConfig(map[string]interface{}{
|
|
"subscription_id": m.subscriptionId,
|
|
"resource_group_name": m.names.resourceGroup,
|
|
"storage_account_name": m.names.storageAccountName,
|
|
"container_name": m.names.storageContainerName,
|
|
"key": m.names.storageKeyName,
|
|
"tenant_id": m.tenantId,
|
|
"client_id": m.clientId,
|
|
"client_secret": m.clientSecret,
|
|
"environment": m.env.Name,
|
|
})).(*Backend)
|
|
|
|
backend.TestBackendStates(t, b)
|
|
}
|
|
|
|
func TestAccBackendAccessKeyLocked(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
testAccAzureBackend(t)
|
|
|
|
ctx := newCtx()
|
|
m := BuildTestMeta(t, ctx)
|
|
|
|
err := m.buildTestResources(ctx)
|
|
if err != nil {
|
|
m.destroyTestResources(ctx)
|
|
t.Fatalf("Error creating Test Resources: %q", err)
|
|
}
|
|
defer m.destroyTestResources(ctx)
|
|
|
|
clearARMEnv()
|
|
|
|
b1 := backend.TestBackendConfig(t, New(), backend.TestWrapConfig(map[string]interface{}{
|
|
"storage_account_name": m.names.storageAccountName,
|
|
"container_name": m.names.storageContainerName,
|
|
"key": m.names.storageKeyName,
|
|
"access_key": m.storageAccessKey,
|
|
"environment": m.env.Name,
|
|
})).(*Backend)
|
|
|
|
b2 := backend.TestBackendConfig(t, New(), backend.TestWrapConfig(map[string]interface{}{
|
|
"storage_account_name": m.names.storageAccountName,
|
|
"container_name": m.names.storageContainerName,
|
|
"key": m.names.storageKeyName,
|
|
"access_key": m.storageAccessKey,
|
|
"environment": m.env.Name,
|
|
})).(*Backend)
|
|
|
|
backend.TestBackendStateLocks(t, b1, b2)
|
|
backend.TestBackendStateForceUnlock(t, b1, b2)
|
|
|
|
backend.TestBackendStateLocksInWS(t, b1, b2, "foo")
|
|
backend.TestBackendStateForceUnlockInWS(t, b1, b2, "foo")
|
|
}
|
|
|
|
func TestAccBackendServicePrincipalLocked(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
testAccAzureBackend(t)
|
|
|
|
ctx := newCtx()
|
|
m := BuildTestMeta(t, ctx)
|
|
|
|
err := m.buildTestResources(ctx)
|
|
if err != nil {
|
|
m.destroyTestResources(ctx)
|
|
t.Fatalf("Error creating Test Resources: %q", err)
|
|
}
|
|
defer m.destroyTestResources(ctx)
|
|
|
|
clearARMEnv()
|
|
|
|
b1 := backend.TestBackendConfig(t, New(), backend.TestWrapConfig(map[string]interface{}{
|
|
"subscription_id": m.subscriptionId,
|
|
"resource_group_name": m.names.resourceGroup,
|
|
"storage_account_name": m.names.storageAccountName,
|
|
"container_name": m.names.storageContainerName,
|
|
"key": m.names.storageKeyName,
|
|
"tenant_id": m.tenantId,
|
|
"client_id": m.clientId,
|
|
"client_secret": m.clientSecret,
|
|
"environment": m.env.Name,
|
|
})).(*Backend)
|
|
|
|
b2 := backend.TestBackendConfig(t, New(), backend.TestWrapConfig(map[string]interface{}{
|
|
"subscription_id": m.subscriptionId,
|
|
"resource_group_name": m.names.resourceGroup,
|
|
"storage_account_name": m.names.storageAccountName,
|
|
"container_name": m.names.storageContainerName,
|
|
"key": m.names.storageKeyName,
|
|
"tenant_id": m.tenantId,
|
|
"client_id": m.clientId,
|
|
"client_secret": m.clientSecret,
|
|
"environment": m.env.Name,
|
|
})).(*Backend)
|
|
|
|
backend.TestBackendStateLocks(t, b1, b2)
|
|
backend.TestBackendStateForceUnlock(t, b1, b2)
|
|
|
|
backend.TestBackendStateLocksInWS(t, b1, b2, "foo")
|
|
backend.TestBackendStateForceUnlockInWS(t, b1, b2, "foo")
|
|
}
|