hashicorp / terraform

Terraform enables you to safely and predictably create, change, and improve infrastructure. It is a source-available tool that codifies APIs into declarative configuration files that can be shared amongst team members, treated as code, edited, reviewed, and versioned.
https://www.terraform.io/
Other
41.49k stars 9.38k forks source link

Support moving from null_resource to terraform_data #35163

Closed bflad closed 4 weeks ago

bflad commented 4 weeks ago

This change enables the built-in provider's terraform_data managed resource to work with the moved configuration block where the from address is a null_resource managed resource type from the official hashicorp/null provider. It produces no plan differences for typical configurations and specifically helps practitioners from re-running provisioners while moving resource types.

In addition to the unit testing, this was manually tested with the following configurations and outputs:

Initial configuration (no triggers):

terraform {
  required_providers {
    null = {
      source  = "hashicorp/null"
      version = "3.2.2"
    }
  }
}

resource "null_resource" "example" {
  provisioner "local-exec" {
    command = "echo 'Hello, World!'"
  }
}

Moved configuration (no triggers):

resource "terraform_data" "example" {
  provisioner "local-exec" {
    command = "echo 'Hello, World!'"
  }
}

moved {
  from = null_resource.example
  to   = terraform_data.example
}

Moved output (no triggers):

$ terraform apply
terraform_data.example: Refreshing state... [id=892002337455008838]

Terraform will perform the following actions:

  # null_resource.example has moved to terraform_data.example
    resource "terraform_data" "example" {
        id = "892002337455008838"
    }

Plan: 0 to add, 0 to change, 0 to destroy.

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

Apply complete! Resources: 0 added, 0 changed, 0 destroyed.

Initial configuration (with triggers):

terraform {
  required_providers {
    null = {
      source  = "hashicorp/null"
      version = "3.2.2"
    }
  }
}

resource "null_resource" "example" {
  triggers = {
    examplekey = "examplevalue"
  }

  provisioner "local-exec" {
    command = "echo 'Hello, World!'"
  }
}

Moved configuration (with triggers):

resource "terraform_data" "example" {
  triggers_replace = {
    examplekey = "examplevalue"
  }

  provisioner "local-exec" {
    command = "echo 'Hello, World!'"
  }
}

moved {
  from = null_resource.example
  to   = terraform_data.example
}

Moved output (with triggers):

$ terraform apply
terraform_data.example: Refreshing state... [id=1651348367769440250]

Terraform will perform the following actions:

  # null_resource.example has moved to terraform_data.example
    resource "terraform_data" "example" {
        id               = "1651348367769440250"
        # (1 unchanged attribute hidden)
    }

Plan: 0 to add, 0 to change, 0 to destroy.

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

Apply complete! Resources: 0 added, 0 changed, 0 destroyed.

Target Release

1.9.0

Draft CHANGELOG entry

ENHANCEMENTS

github-actions[bot] commented 4 weeks ago

Reminder for the merging maintainer: if this is a user-visible change, please update the changelog on the appropriate release branch.