mirror of
https://github.com/opentofu/opentofu.git
synced 2024-12-24 16:10:46 -06:00
ff21cc3c8d
Since root outputs can now use the planned changes, we can directly insert the correct applyable or destroyable node into the graph during plan and apply, and it will remove the outputs if they are being destroyed.
203 lines
4.8 KiB
Go
203 lines
4.8 KiB
Go
package terraform
|
|
|
|
import (
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/hashicorp/terraform/addrs"
|
|
)
|
|
|
|
func TestTargetsTransformer(t *testing.T) {
|
|
mod := testModule(t, "transform-targets-basic")
|
|
|
|
g := Graph{Path: addrs.RootModuleInstance}
|
|
{
|
|
tf := &ConfigTransformer{Config: mod}
|
|
if err := tf.Transform(&g); err != nil {
|
|
t.Fatalf("err: %s", err)
|
|
}
|
|
}
|
|
|
|
{
|
|
transform := &AttachResourceConfigTransformer{Config: mod}
|
|
if err := transform.Transform(&g); err != nil {
|
|
t.Fatalf("err: %s", err)
|
|
}
|
|
}
|
|
|
|
{
|
|
transform := &ReferenceTransformer{}
|
|
if err := transform.Transform(&g); err != nil {
|
|
t.Fatalf("err: %s", err)
|
|
}
|
|
}
|
|
|
|
{
|
|
transform := &TargetsTransformer{
|
|
Targets: []addrs.Targetable{
|
|
addrs.RootModuleInstance.Resource(
|
|
addrs.ManagedResourceMode, "aws_instance", "me",
|
|
),
|
|
},
|
|
}
|
|
if err := transform.Transform(&g); err != nil {
|
|
t.Fatalf("err: %s", err)
|
|
}
|
|
}
|
|
|
|
actual := strings.TrimSpace(g.String())
|
|
expected := strings.TrimSpace(`
|
|
aws_instance.me
|
|
aws_subnet.me
|
|
aws_subnet.me
|
|
aws_vpc.me
|
|
aws_vpc.me
|
|
`)
|
|
if actual != expected {
|
|
t.Fatalf("bad:\n\nexpected:\n%s\n\ngot:\n%s\n", expected, actual)
|
|
}
|
|
}
|
|
|
|
func TestTargetsTransformer_downstream(t *testing.T) {
|
|
mod := testModule(t, "transform-targets-downstream")
|
|
|
|
g := Graph{Path: addrs.RootModuleInstance}
|
|
{
|
|
transform := &ConfigTransformer{Config: mod}
|
|
if err := transform.Transform(&g); err != nil {
|
|
t.Fatalf("%T failed: %s", transform, err)
|
|
}
|
|
}
|
|
|
|
{
|
|
transform := &AttachResourceConfigTransformer{Config: mod}
|
|
if err := transform.Transform(&g); err != nil {
|
|
t.Fatalf("%T failed: %s", transform, err)
|
|
}
|
|
}
|
|
|
|
{
|
|
transform := &AttachResourceConfigTransformer{Config: mod}
|
|
if err := transform.Transform(&g); err != nil {
|
|
t.Fatalf("%T failed: %s", transform, err)
|
|
}
|
|
}
|
|
|
|
{
|
|
transform := &OutputTransformer{Config: mod}
|
|
if err := transform.Transform(&g); err != nil {
|
|
t.Fatalf("%T failed: %s", transform, err)
|
|
}
|
|
}
|
|
|
|
{
|
|
transform := &ReferenceTransformer{}
|
|
if err := transform.Transform(&g); err != nil {
|
|
t.Fatalf("err: %s", err)
|
|
}
|
|
}
|
|
|
|
{
|
|
transform := &TargetsTransformer{
|
|
Targets: []addrs.Targetable{
|
|
addrs.RootModuleInstance.
|
|
Child("child", addrs.NoKey).
|
|
Child("grandchild", addrs.NoKey).
|
|
Resource(
|
|
addrs.ManagedResourceMode, "aws_instance", "foo",
|
|
),
|
|
},
|
|
}
|
|
if err := transform.Transform(&g); err != nil {
|
|
t.Fatalf("%T failed: %s", transform, err)
|
|
}
|
|
}
|
|
|
|
actual := strings.TrimSpace(g.String())
|
|
// Even though we only asked to target the grandchild resource, all of the
|
|
// outputs that descend from it are also targeted.
|
|
expected := strings.TrimSpace(`
|
|
module.child.module.grandchild.aws_instance.foo
|
|
module.child.module.grandchild.output.id (expand)
|
|
module.child.module.grandchild.aws_instance.foo
|
|
module.child.output.grandchild_id (expand)
|
|
module.child.module.grandchild.output.id (expand)
|
|
output.grandchild_id
|
|
module.child.output.grandchild_id (expand)
|
|
`)
|
|
if actual != expected {
|
|
t.Fatalf("bad:\n\nexpected:\n%s\n\ngot:\n%s\n", expected, actual)
|
|
}
|
|
}
|
|
|
|
// This tests the TargetsTransformer targeting a whole module,
|
|
// rather than a resource within a module instance.
|
|
func TestTargetsTransformer_wholeModule(t *testing.T) {
|
|
mod := testModule(t, "transform-targets-downstream")
|
|
|
|
g := Graph{Path: addrs.RootModuleInstance}
|
|
{
|
|
transform := &ConfigTransformer{Config: mod}
|
|
if err := transform.Transform(&g); err != nil {
|
|
t.Fatalf("%T failed: %s", transform, err)
|
|
}
|
|
}
|
|
|
|
{
|
|
transform := &AttachResourceConfigTransformer{Config: mod}
|
|
if err := transform.Transform(&g); err != nil {
|
|
t.Fatalf("%T failed: %s", transform, err)
|
|
}
|
|
}
|
|
|
|
{
|
|
transform := &AttachResourceConfigTransformer{Config: mod}
|
|
if err := transform.Transform(&g); err != nil {
|
|
t.Fatalf("%T failed: %s", transform, err)
|
|
}
|
|
}
|
|
|
|
{
|
|
transform := &OutputTransformer{Config: mod}
|
|
if err := transform.Transform(&g); err != nil {
|
|
t.Fatalf("%T failed: %s", transform, err)
|
|
}
|
|
}
|
|
|
|
{
|
|
transform := &ReferenceTransformer{}
|
|
if err := transform.Transform(&g); err != nil {
|
|
t.Fatalf("err: %s", err)
|
|
}
|
|
}
|
|
|
|
{
|
|
transform := &TargetsTransformer{
|
|
Targets: []addrs.Targetable{
|
|
addrs.RootModule.
|
|
Child("child").
|
|
Child("grandchild"),
|
|
},
|
|
}
|
|
if err := transform.Transform(&g); err != nil {
|
|
t.Fatalf("%T failed: %s", transform, err)
|
|
}
|
|
}
|
|
|
|
actual := strings.TrimSpace(g.String())
|
|
// Even though we only asked to target the grandchild module, all of the
|
|
// outputs that descend from it are also targeted.
|
|
expected := strings.TrimSpace(`
|
|
module.child.module.grandchild.aws_instance.foo
|
|
module.child.module.grandchild.output.id (expand)
|
|
module.child.module.grandchild.aws_instance.foo
|
|
module.child.output.grandchild_id (expand)
|
|
module.child.module.grandchild.output.id (expand)
|
|
output.grandchild_id
|
|
module.child.output.grandchild_id (expand)
|
|
`)
|
|
if actual != expected {
|
|
t.Fatalf("bad:\n\nexpected:\n%s\n\ngot:\n%s\n", expected, actual)
|
|
}
|
|
}
|