Spec-Zone.ru › OpenTofu 1.9

Команда: test

Команда tofu test позволяет протестировать конфигурацию OpenTofu, создав реальную инфраструктуру и проверив выполнение необходимых условий (утверждений). После завершения теста OpenTofu удаляет созданные ресурсы.

Использование​

Использование: tofu test [options].

Эта команда выполнит все файлы *.tftest.hcl, *.tftest.json, *.tofutest.hcl и *.tofutest.json в текущем каталоге или в каталоге с именем tests. Настроить это поведение можно с помощью приведённых ниже параметров.

Пример

Рассмотрим простой пример: он создаёт файл test.txt из main.tf, а затем проверяет, успешно ли основной код выполнил свою задачу, используя main.tftest.hcl.

  • main.tf
  • main.tftest.hcl
Блок кода
resource "local_file" "test" {
  filename = "${path.module}/test.txt"
  content  = "Hello world!"
}
Блок кода
run "test" {
  assert {
    condition     = file(local_file.test.filename) == "Hello world!"
    error_message = "Incorrect content in ${local_file.test.filename}."
  }
}

Выполните tofu init, а затем tofu test, чтобы запустить тест: он применит файл main.tf и проверит его по утверждению из main.tftest.hcl. Это лишь простой пример. Более подробные примеры приведены ниже.

Приоритет расширений​

Если в каталоге присутствуют файлы .tftest.hcl и .tofutest.hcl с одинаковым базовым именем, OpenTofu отдаст предпочтение файлу .tofutest.hcl и проигнорирует файл .tftest.hcl. Например:

  • Если в одном каталоге имеются файлы main.tftest.hcl и main.tofutest.hcl, OpenTofu загрузит только main.tofutest.hcl и проигнорирует main.tftest.hcl.

Это гарантирует, что файлы .tofu всегда имеют приоритет над файлами .tf, если доступны оба типа. Это может быть полезно авторам модулей, которые хотят, чтобы их модули поддерживали и OpenTofu, и Terraform, и хотят создавать для каждого из них отдельные тесты.

  • если в одном каталоге имеются файлы main.tftest.json и main.tofutest.json, OpenTofu загрузит только main.tofutest.json и проигнорирует main.tftest.json.

Параметры​

  • -test-directory=path Задаёт каталог тестов (по умолчанию: "tests"). При запуске tofu test OpenTofu будет искать тестовые файлы в указанном каталоге, а также в текущем каталоге. Путь должен быть задан относительно текущего рабочего каталога.
  • -filter=testfile Указывает отдельный тестовый файл для запуска. Чтобы указать несколько файлов, используйте этот параметр несколько раз. Путь должен быть задан относительно текущего рабочего каталога.
  • -var 'foo=bar' Задаёт входную переменную корневого модуля. Чтобы добавить несколько переменных, используйте этот параметр несколько раз.
  • -var-file=filename Задаёт несколько переменных из указанного файла. Помимо этого файла, OpenTofu автоматически загружает terraform.tfvars и *.auto.tfvars. Чтобы указать несколько файлов, используйте этот параметр несколько раз.
  • -json Переключает формат вывода на JSON.
  • -no-color Отключает цветной вывод команды.
  • -verbose Выводит план или состояние для каждого блока запуска теста по мере его выполнения.
Примечание

Использование переменных в источниках модулей, конфигурации бэкенда или блоке шифрования требует задания значений переменным корневого модуля при запуске tofu test.

Структура каталогов​

Команда tofu test поддерживает два варианта структуры каталогов: плоскую и вложенную.

  • Плоская структура
  • Вложенная структура

При такой структуре тестовые файлы *.tftest.hcl находятся непосредственно рядом с файлами *.tf, которые они проверяют. Нет требования, чтобы у каждого файла *.tf был отдельный тестовый файл, однако это рекомендуется.

Блок кода
.
├── main.tf
├── main.tftest.hcl
├── foo.tf
├── foo.tftest.hcl
├── bar.tf
└── bar.tftest.hcl

При такой структуре файлы *.tftest.hcl находятся в отдельном каталоге tests. Как и в плоской структуре, нет требования, чтобы у каждого файла *.tf был отдельный тестовый файл, однако это рекомендуется.

Блок кода
.
├── main.tf
├── foo.tf
├── bar.tf
└── tests
     ├── main.tftest.hcl
     ├── foo.tftest.hcl
     └── bar.tftest.hcl

Тестирование модулей​

При тестировании модулей для каждого модуля можно использовать одну из описанных выше структур каталогов:

  • Плоская структура
  • Вложенная структура

При такой структуре выполните tofu test -test-directory=./path/to/module, чтобы протестировать нужный модуль.

Блок кода
.
├── module1
│    ├── main.tf
│    ├── main.tftest.hcl
│    ├── foo.tf
│    ├── foo.tftest.hcl
│    ├── bar.tf
│    └── bar.tftest.hcl
└── module2
     └── ...

При такой структуре перейдите в рабочем каталоге к пути модуля и выполните tofu test, чтобы протестировать нужный модуль.

Блок кода
.
├── module1
│    ├── main.tf
│    ├── foo.tf
│    ├── bar.tf
│    └── tests
│         ├── main.tftest.hcl
│         ├── foo.tftest.hcl
│         └── bar.tftest.hcl
└── module2
     └── ...
Подсказка

Для запуска ограниченного набора тестовых файлов можно использовать параметр -filter=sometest.tftest.hcl. Чтобы запустить несколько тестовых файлов, укажите этот параметр несколько раз.

Структура файлов *.tftest.hcl / *.tofutest.hcl​

Язык тестирования OpenTofu похож на основной язык OpenTofu и использует ту же структуру блоков.

Тестовый файл состоит из следующих элементов:

  • Блоки run: описывают тесты.
  • Блок variables (необязательно): задаёт переменные для всех тестов в текущем файле.
  • Блоки provider (необязательно): задают провайдеры, используемые в тестах.
  • Блоки mock_provider (необязательно): задают провайдеры, для которых будут созданы имитации.
  • Блоки override_resource (необязательно): задают ресурсы, которые нужно переопределить.
  • Блоки override_data (необязательно): задают источники данных, которые нужно переопределить.
  • Блоки override_module (необязательно): задают вызовы модулей, которые нужно переопределить.

Блок run​

Блок run содержит один тестовый сценарий, который выполняет tofu apply или tofu plan, а затем вычисляет все блоки assert. После завершения теста для удаления временно созданных ресурсов используется tofu destroy.

Блок run состоит из следующих элементов:

Имя Тип Описание
assert блок Задаёт утверждения, проверяющие, правильно ли ваш код (например, main.tf) создал инфраструктуру. Если не указать блоки assert, OpenTofu просто применит конфигурацию без каких-либо утверждений.
module блок Переопределяет тестируемый модуль. Это можно использовать для загрузки вспомогательного модуля и выполнения более сложных тестов.
expect_failures список Список ресурсов, создание которых должно завершиться с ошибкой в текущем запуске.
variables блок Задаёт переменные для текущего тестового сценария. См. раздел о переменных.
command plan или apply Задаёт команду, которую выполнит OpenTofu: plan или apply. По умолчанию — apply.
plan_options блок Параметры операции plan или apply.
providers объект Псевдонимы провайдеров.
override_resource блок Задаёт ресурс, который нужно переопределить для запуска.
override_data блок Задаёт источник данных, который нужно переопределить для запуска.
override_module блок Задаёт вызов модуля, который нужно переопределить для запуска.

Блок run.assert​

Внутри блока run можно задать блоки assert, чтобы проверить состояние инфраструктуры после завершения операции apply или plan. Теоретических ограничений на количество таких блоков нет.

В каждом блоке должны быть указаны два атрибута:

  1. condition — это условие OpenTofu, которое должно возвращать true, чтобы тест прошёл, и false, чтобы тест завершился с ошибкой. Условие обязательно должно ссылаться на ресурс, источник данных, переменную, выходное значение или модуль из основного кода, иначе OpenTofu откажется запускать тест.
  2. error_message — строка с пояснением причины сбоя теста.
Пример

Например, блок assert можно записать так:

  • main.tftest.hcl
  • main.tf
Блок кода
run "test" {
  assert {
    condition     = file(local_file.test.filename) == "Hello world!"
    error_message = "Incorrect content in ${local_file.test.filename}."
  }
}
Блок кода
resource "local_file" "test" {
  filename = "${path.module}/test.txt"
  content  = "Hello world!"
}

Обратите внимание: условия позволяют выполнять только базовые проверки текущего состояния OpenTofu и использовать функции OpenTofu. Нельзя определять дополнительные источники данных непосредственно в коде теста. Обойти это ограничение можно с помощью блока module, чтобы загрузить вспомогательный модуль.

Блок run.module​

В некоторых случаях средств, доступных в выражении условия, может быть недостаточно, чтобы проверить, правильно ли ваш код создал инфраструктуру.

Блок module позволяет переопределить основной модуль, который загружает tofu test. Это даёт возможность создавать дополнительные ресурсы или источники данных, которые можно использовать в условиях assert.

Синтаксис этого блока похож на синтаксис загрузки модулей в обычном коде OpenTofu:

Блок кода
run "test" {
  module {
    source = "./some-module"
  }
}

Блок module имеет следующие два атрибута:

  • Атрибут source указывает на каталог модуля или реестр модулей. Удалённые источники в этом случае не допускаются.
  • Атрибут version задаёт версию используемого модуля.
Примечание

В блоке module нельзя напрямую передавать параметры, как это делается в обычном коде OpenTofu. Вместо этого используйте блок variables, чтобы передать параметры модулю.

Пример

В этом примере файл main.tf создаёт контейнер Docker с образом nginx, открывающий порт 8080. Файл main.tftest.hcl должен проверить, правильно ли запускается веб-сервер, но без вспомогательного модуля это сделать нельзя.

Чтобы создать источник данных http, файл main.tftest.hcl загружает модуль test-harness. Затем тестовый модуль загружает основной модуль и добавляет источник данных для проверки HTTP-ответа. Обратите внимание: источник данных в test-harness имеет явную зависимость от module.main, чтобы гарантировать, что он вернёт результат только после завершения работы основного модуля.

  • main.tf
  • main.tftest.hcl
  • test-harness/helper.tf
Блок кода
terraform {
  required_providers {
    docker = {
      source  = "kreuzwerker/docker"
      version = "3.0.2"
    }
  }
}

resource "docker_container" "webserver" {
  name  = "nginx-test"
  image = "nginx"
  ports {
    internal = 80
    external = 8080
  }
}
Блок кода
run "http" {
  # Load the test helper instead of the main module:
  module {
    source = "./test-harness"
  }

  # Check if the webserver returned an HTTP 200 status code:
  assert {
    condition     = data.http.test.status_code == 200
    error_message = "Incorrect status code returned: ${data.http.test.status_code}"
  }
}
Блок кода
# Load the main module:
module "main" {
  source = "../"
}

# Fetch the website so the assert can do its job:
data "http" "test" {
  url = "http://localhost:8080"

  # Important! Wait for the main module to finish:
  depends_on = [module.main]
}

В этом проекте для запуска контейнера используется сторонний провайдер. Проект можно запустить локально, если у вас установлен Docker Engine.

Блоки variables и run.variables​

В проверяемом коде (например, main.tf) часто есть блоки переменных, которым нужно задать значения в тестовом сценарии. Передать переменные тестовому запуску можно одним из следующих способов:

Порядок Источник
1 Переменные среды с префиксом TF_VAR_.
2 Файлы tfvar, указанные в текущем каталоге: terraform.tfvars и *.auto.tfvars.
3 Файлы tfvar, указанные в каталоге тестов: tests/terraform.tfvars и tests/*.auto.tfvars.
4 Переменные командной строки, заданные флагом -var, и переменные из файлов, заданных флагом -var-file.
5 Переменные из блока variables в тестовом файле.
6 Переменные из блока variables в блоке run.

OpenTofu обрабатывает переменные в указанном выше порядке, поэтому последующие значения могут переопределять ранее заданные. Например:

  • main.tftest.hcl
  • main.tf
Блок кода
# First, set the variable here:
variables {
  name = "OpenTofu"
}

run "basic" {
  assert {
    condition     = output.greeting == "Hello OpenTofu!"
    error_message = "Incorrect greeting: ${output.greeting}"
  }
}

run "override" {
  # Override it for this test case only here:
  variables {
    name = "OpenTofu user"
  }
  assert {
    condition     = output.greeting == "Hello OpenTofu user!"
    error_message = "Incorrect greeting: ${output.greeting}"
  }
}
Блок кода
variable "name" {}

output "greeting" {
  value = "Hello ${var.name}!"
}

Список run.expect_failures​

В некоторых случаях может потребоваться протестировать намеренные ошибки в коде, например, чтобы убедиться в правильной работе проверки.

Внутри блока run можно использовать expect_failures, чтобы указать переменные или ресурсы, выполнение которых должно завершиться с ошибкой при запуске кода с заданными параметрами.

Например, приведённый ниже тестовый сценарий проверяет, что проверка переменной instances правильно завершается с ошибкой, если ей передать отрицательное число:

  • main.tftest.hcl
  • main.tf
Блок кода
run "main" {
  command = plan

  variables {
    instances = -1
  }

  expect_failures = [
    var.instances,
  ]
}
Блок кода
variable "instances" {
  type = number

  validation {
    condition     = var.instances >= 0
    error_message = "The number of instances must be positive or zero"
  }
}

Также можно использовать условие expect_failure для проверки событий жизненного цикла, таких как предварительные или последующие условия, а также результатов проверок.

Ограничение

В настоящее время список expect_failure не поддерживает тестирование ошибок создания ресурсов. Для использования expect_failure необходимо указать событие жизненного цикла.

В примере ниже проверяется, что неправильно настроенная проверка работоспособности завершается с ошибкой. Это гарантирует, что проверка работоспособности не будет всегда проходить успешно, даже если выполняется для неправильной конечной точки.

  • main.tftest.hcl
  • main.tf
Блок кода
run "test-failure" {
  variables {
    # This healthcheck endpoint won't exist:
    health_endpoint = "/nonexistent"
  }

  expect_failures = [
    # We expect this to fail:
    check.health
  ]
}
Блок кода
variable "health_endpoint" {
  default = "/"
}

terraform {
  required_providers {
    docker = {
      source  = "kreuzwerker/docker"
      version = "3.0.2"
    }
  }
}

resource "docker_container" "webserver" {
  name  = ""
  image = "nginx"
  rm    = true

  ports {
    internal = 80
    external = 8080
  }
}

check "health" {
  data "http" "www" {
    url = "http://localhost:8080${var.health_endpoint}"
    depends_on = [docker_container.webserver]
  }

  assert {
    condition = data.http.www.status_code == 200
    error_message = "Invalid status code returned: ${data.http.www.status_code}"
  }
}

Настройка run.command и блок run.plan_options​

По умолчанию tofu test использует tofu apply для создания реальной инфраструктуры. В некоторых случаях, например если реальная инфраструктура очень дорогая или её невозможно использовать для тестирования, может быть полезно запускать только tofu plan. Вы можете использовать настройку command = plan, чтобы выполнить план вместо применения. В следующем примере проверяется, правильно ли переменная передаётся ресурсу docker_image, без фактического применения плана:

  • main.tftest.hcl
  • main.tf
Блок кода
run "test" {
  command = plan
  plan_options {
    refresh = false
  }
  variables {
    image_name = "myapp"
  }
  assert {
    condition     = docker_image.build.name == "myapp"
    error_message = "Missing build resource"
  }
}
Блок кода
variable "image_name" {
  default = "app"
}

terraform {
  required_providers {
    docker = {
      source  = "kreuzwerker/docker"
      version = "3.0.2"
    }
  }
}

resource "docker_image" "build" {
  name = var.image_name
  build {
    context = "."
  }
}

Независимо от настройки command, вы можете использовать блок plan_options, чтобы задать следующие дополнительные параметры для обоих режимов:

Название Описание
mode Измените этот параметр с normal (значение по умолчанию) на refresh-only, чтобы только обновить локальное состояние на основе удалённой инфраструктуры.
refresh Установите для этого параметра значение false, чтобы отключить проверку внешних изменений относительно файла состояния. Аналогично tofu plan -refresh=false.
replace Принудительно замените указанный список ресурсов, например [docker_image.build] в примере выше. Аналогично tofu plan -replace=docker_image.build.
target Ограничьте планирование указанным списком модулей или ресурсов. Аналогично tofu plan -target=docker_image.build.
Совет

Эти параметры можно использовать вместе с переопределениями провайдеров для создания полностью автономных тестов. Пример приведён в разделе «Провайдеры» ниже.

Блок providers​

В некоторых случаях может потребоваться переопределить настройки провайдера при запуске тестов. Вы можете использовать блоки provider вне блока run, чтобы задать дополнительные параметры конфигурации провайдеров, например учётные данные тестовой учётной записи.

Блок кода
provider "aws" {
  // Add additional settings here
}

Эта возможность также позволяет выполнять частично или полностью автономные тесты, если провайдер поддерживает такой режим. В следующем примере показан полностью автономный тест с провайдером AWS и ресурсом бакета S3:

  • main.tftest.hcl
  • main.tf
Блок кода
// Configure the AWS provider to run fake credentials and without
// any validations. Not all providers support this, but when they
// do, you can run fully offline tests.
provider "aws" {
  access_key = "foo"
  secret_key = "bar"

  skip_credentials_validation = true
  skip_region_validation      = true
  skip_metadata_api_check     = true
  skip_requesting_account_id  = true
}

run "test" {
  // Run in plan mode to skip applying:
  command = plan

  // Disable the refresh to prevent reaching out to the AWS API:
  plan_options {
    refresh = false
  }

  // Test if the bucket name is correctly passed to the aws_s3_bucket
  // resource:
  variables {
    bucket_name = "test"
  }
  assert {
    condition     = aws_s3_bucket.test.bucket == "test"
    error_message = "Incorrect bucket name: ${aws_s3_bucket.test.bucket}"
  }
}
Блок кода
variable "bucket_name" {}

provider "aws" {
  region = "us-east-2"
}

resource "aws_s3_bucket" "test" {
  bucket = var.bucket_name
}

Псевдонимы провайдеров​

Помимо переопределения провайдеров, вы можете назначать провайдерам псевдонимы, чтобы заменять их другими провайдерами внутри блока run. Это полезно, если нужно использовать две конфигурации провайдера в одном файле теста и переключаться между ними.

В приведённом ниже примере тестовый случай sockettest загружает конфигурацию провайдера Docker, отличную от используемой в остальной части файла.

  • main.tftest.hcl
  • main.tf
Блок кода
# This is the default "docker" provider for this file:
provider "docker" {
  host = "tcp://0.0.0.0:2376"
}

# This will be the override:
provider "docker" {
  alias = "unixsocket"
  host = "unix:///var/run/docker.sock"
}

run "sockettest" {
  # Replace the "docker" provider for this test case only:
  providers = {
    docker = docker.unixsocket
  }

  assert {
    condition     = docker_image.build.name == "myapp"
    error_message = "Missing build resource"
  }
}

// Add other tests with the original provider here.
Блок кода
terraform {
  required_providers {
    docker = {
      source  = "kreuzwerker/docker"
      version = "3.0.2"
    }
  }
}

resource "docker_image" "build" {
  name = "myapp"
  build {
    context = "."
  }
}

Блоки mock_provider​

Блок mock_provider позволяет заменить конфигурацию провайдера имитационной конфигурацией. В этом случае создание и получение ресурсов и источников данных провайдера пропускается. Вместо этого OpenTofu автоматически генерирует все вычисляемые атрибуты и блоки, которые будут использоваться в тестах.

Примечание

Подробнее о том, как OpenTofu создаёт автоматически сгенерированные значения.

Имитационные провайдеры также поддерживают поле alias, а также блоки mock_resource и mock_data. В некоторых случаях вместо автоматически сгенерированных значений могут потребоваться значения по умолчанию. Для этого передайте их в поле defaults блоков mock_resource или mock_data.

Кроме того, можно использовать блоки override_resource и override_data для переопределения ресурсов или источников данных в области действия одного провайдера. Подробнее о переопределении см. в следующем разделе.

В приведённом ниже примере проверяется, правильно ли имя бакета передаётся ресурсу, без его фактического создания:

  • main.tftest.hcl
  • main.tf
Блок кода
// All resources and data sources provided by `aws.mock` provider
// will be mocked. Their values will be automatically generated.
mock_provider "aws" {
  alias = "mock"
}

// The same goes for `local` provider. Also, every `local_file`
// data source will have its `content` set to `test`.
mock_provider "local" {
  mock_data "local_file" {
    defaults = {
      content = "test"
    }
  }
}

// Test if the bucket name is correctly passed to the aws_s3_bucket
// resource from the local file.
run "test" {
  // Use `aws.mock` provider for this test run only.
  providers = {
    aws = aws.mock
  }

  assert {
    condition     = aws_s3_bucket.test.bucket == "test"
    error_message = "Incorrect bucket name: ${aws_s3_bucket.test.bucket}"
  }
}
Блок кода
data "local_file" "bucket_name" {
  filename = "bucket_name.txt"
}

provider "aws" {
  region = "us-east-2"
}

resource "aws_s3_bucket" "test" {
  bucket = data.local_file.bucket_name.content
}

Блоки override_resource и override_data​

В некоторых случаях может потребоваться протестировать инфраструктуру с переопределёнными ресурсами или источниками данных. Вы можете использовать блоки override_resource или override_data, чтобы пропустить создание и получение этих ресурсов или источников данных с помощью реального провайдера. Вместо этого OpenTofu автоматически генерирует все вычисляемые атрибуты и блоки, которые будут использоваться в тестах.

Примечание

Подробнее о том, как OpenTofu создаёт автоматически сгенерированные значения.

Эти блоки состоят из следующих элементов:

Название Тип Описание
target reference Обязательный параметр. Адрес целевого ресурса или источника данных, который нужно переопределить.
values object Пользовательские значения вычисляемых атрибутов и блоков, которые будут использоваться вместо автоматически сгенерированных.

Блоки override_resource или override_data можно использовать для всего файла тестов или внутри отдельного блока run. Если оба блока заданы для одного и того же target, приоритет имеет последний.

В приведённом ниже примере проверяется, правильно ли имя бакета передаётся ресурсу, без его фактического создания:

  • main.tftest.hcl
  • main.tf
Блок кода
// This data source will not be called for any run
// in this `.tftest.hcl` file. Instead, `values` object
// will be used to populate `content` attribute. Other
// attributes and blocks will be automatically generated.
override_data {
  target = data.local_file.bucket_name
  values = {
    content = "test"
  }
}

// Test if the bucket name is correctly passed to the aws_s3_bucket
// resource from the local file.
run "test" {
  // S3 bucket will not be created in AWS for this run,
  // but it's available to use in both tests and configuration.
  override_resource {
    target = aws_s3_bucket.test
  }

  assert {
    condition     = aws_s3_bucket.test.bucket == "test"
    error_message = "Incorrect bucket name: ${aws_s3_bucket.test.bucket}"
  }
}
Блок кода
data "local_file" "bucket_name" {
  filename = "bucket_name.txt"
}

provider "aws" {
  region = "us-east-2"
}

resource "aws_s3_bucket" "test" {
  bucket = data.local_file.bucket_name.content
}
Ограничение

Нельзя использовать override_resource или override_data для отдельного экземпляра ресурса или источника данных. Необходимо переопределить каждый экземпляр ресурса или источника данных.

Автоматически сгенерированные значения​

Для имитации ресурсов и источников данных OpenTofu требуется автоматически генерировать вычисляемые атрибуты, не вызывая соответствующие провайдеры. При генерации этих значений OpenTofu не может использовать пользовательскую логику провайдера, поэтому применяет простые правила, основанные на типе значения:

Тип атрибута Сгенерированное значение
number 0
bool false
string Случайная буквенно-цифровая строка.
list Пустой список.
map Пустое отображение.
set Пустое множество.
object Объект, поля которого заполняются по той же логике рекурсивно.
tuple Пустой кортеж.
Примечание

Вместо автоматически сгенерированных можно указать пользовательские значения в соответствующих полях имитации или переопределения. Учтите, что это возможно только для вычисляемых атрибутов; значения конфигурации изменить нельзя.

Блок override_module​

В некоторых случаях может потребоваться протестировать инфраструктуру с переопределёнными вызовами модулей. Вы можете использовать блок override_module, чтобы игнорировать всю конфигурацию, предоставленную вызываемым модулем. В этом случае OpenTofu будет использовать пользовательские значения, заданные в блоке override_module, в качестве выходных данных модуля.

Блок состоит из следующих элементов:

Название Тип Описание
target reference Обязательный параметр. Адрес целевого вызова модуля, который нужно переопределить.
outputs object Значения, используемые в качестве выходных данных вызова модуля. Если выходное значение не задано, OpenTofu по умолчанию присвоит ему null.

Блок override_module можно использовать для всего файла тестов или внутри отдельного блока run. Если оба блока заданы для одного и того же target, приоритет имеет последний.

В приведённом ниже примере проверяется, правильно ли имя бакета передаётся из модуля, без его фактического вызова:

  • main.tftest.hcl
  • main.tf
  • bucket_meta/main.tf
Блок кода
// All the module configuration will be ignored for this
// module call. Instead, the `outputs` object will be used
// to populate module outputs.
override_module {
  target = module.bucket_meta
  outputs = {
    name = "test"
    tags = {
      Environment = "Test Env"
    }
  }
}

// Test if the bucket name is correctly passed to the aws_s3_bucket
// resource from the module call.
run "test" {
  // S3 bucket will not be created in AWS for this run,
  // but it's available to use in both tests and configuration.
  override_resource {
    target = aws_s3_bucket.test
  }

  assert {
    condition     = aws_s3_bucket.test.bucket == "test"
    error_message = "Incorrect bucket name: ${aws_s3_bucket.test.bucket}"
  }

  assert {
    condition     = aws_s3_bucket.test.tags["Environment"] == "Test Env"
    error_message = "Incorrect `Environment` tag: ${aws_s3_bucket.test.tags["Environment"]}"
  }
}
Блок кода
module "bucket_meta" {
  source = "./bucket_meta"
}

provider "aws" {
  region = "us-east-2"
}

resource "aws_s3_bucket" "test" {
  bucket = module.bucket_meta.name
  tags   = module.bucket_meta.tags
}
Блок кода
data "local_file" "bucket_name" {
  filename = "bucket_name.txt"
}

output "name" {
  value = data.local_file.bucket_name.content
}

output "tags" {
  value = {
    Environment = "Dev"
  }
}
Ограничение

Нельзя использовать override_module для отдельного экземпляра вызова модуля. Необходимо переопределить каждый экземпляр вызова модуля.

Copyright (c) The OpenTofu Authors
Copyright (c) 2014 HashiCorp, Inc.
Mozilla Public License, version 2.0
https://opentofu.org/docs/v1.9/cli/commands/test/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API