Spec-Zone.ru › OpenTofu 1.11

Команда: test

Команда tofu test позволяет тестировать конфигурацию OpenTofu путем создания реальной инфраструктуры и проверки выполнения требуемых условий (утверждений / assertions). После завершения теста 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, и хотят создать разные тесты для каждого из них.

То же правило применяется к тестовым файлам на основе JSON:

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

Параметры​

  • -test-directory=path Задать тестовый каталог (по умолчанию: "tests"). При запуске tofu test OpenTofu будет искать файлы тестов в указанном каталоге, а также в текущем каталоге. Путь должен быть относительным к текущему рабочему каталогу.
  • -filter=testfile Указать отдельный тестовый файл для запуска. Используйте этот параметр несколько раз, чтобы указать более одного файла. Путь должен быть относительным к текущему рабочему каталогу.
Предупреждение

Если -filter используется вместе с -test-directory=path, любые фильтры для файлов тестов в <test-directory> должны предваряться префиксом <test-directory>, например:

Блок кода
tofu test -test-directory=extra-tests -filter=extra-tests/a.tftest.hcl
  • -var 'foo=bar' Задать входную переменную корневого модуля. Укажите этот параметр несколько раз, чтобы добавить более одной переменной.
  • -var-file=filename Задать несколько переменных из указанного файла. Помимо этого файла, OpenTofu автоматически загружает terraform.tfvars и *.auto.tfvars. Используйте этот параметр несколько раз, чтобы указать более одного файла.
  • -json Изменить формат вывода на JSON.
  • -no-color Отключить цветной вывод в выводе команды.
  • -verbose Выводить план или состояние для каждого блока test run по мере его выполнения.
Примечание

Использование переменных в источниках модулей, конфигурации бэкенда или блоке шифрования требует присвоения значений переменным корневого модуля при запуске 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 (необязательные): определяют имитируемых (mock) провайдеров.
  • Блоки override_resource (необязательные): определяют переопределяемые ресурсы.
  • Блоки override_data (необязательные): определяют переопределяемые источники данных.
  • Блоки override_module (необязательные): определяют переопределяемые вызовы модулей.

Блок run​

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

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

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

Блок run.assert​

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

Каждый блок требует наличия следующих двух атрибутов:

  1. condition — это условие OpenTofu, которое должно возвращать true для успешного прохождения теста или false для сбоя теста. Условие обязано ссылаться на ресурс, источник данных, переменную, выходное значение (output) или модуль из основного кода, иначе 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 Файлы tfvars, заданные в текущем каталоге: terraform.tfvars и *.auto.tfvars.
3 Файлы tfvars, заданные в каталоге tests: 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}!"
}

Выходные значения (outputs) блока run для переменных​

Также можно использовать выходные значения модулей ранее выполненного блока run для установки значений variables другого блока run.

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

  • main.tftest.hcl
  • mod/main.tf
Блок кода
run "setup" {
  module {
    source = "./setup"
  }
}

run "test" {
  variables {
    filename_from_setup = run.setup.filename
  }

  # more assertions to run
}
Блок кода
output "filename" {
  value = "some_file.txt"
}

Список run.expect_failures​

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

Например, приведенный ниже тестовый сценарий проверяет, завершается ли валидация входной переменной 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"
  }
}

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

  • 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}"
  }
}
Только настроенные проверки условий

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

Параметр 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 = "."
  }
}

Ссылки на выходные данные модуля run и переменные в блоках provider​

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

Блок кода
variables {
  region = "us-west-2"
}

provider "aws" {
  region = var.region
  access_key = run.setup.access_key
  secret_key = run.setup.secret_key
}

run "setup" {
  # `mod` module has outputs access_key and secret_key
  module {
    source = "./mod"
  }

# Actual run block behavior, such as asserts, are skipped for simplicity

}

Блоки mock_provider​

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

Примечание

Узнайте больше о том, как OpenTofu создает автоматически сгенерированные значения.

Для мок-провайдеров поддерживаются поля alias и for_each. Однако атрибут for_each поддерживается только тогда, когда также используется 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.11/cli/commands/test/

Spec-Zone.ru

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