From 66979bdf8a50dfa17f9acfc1d577a6df505dda86 Mon Sep 17 00:00:00 2001 From: goncalo-rodrigues Date: Wed, 31 Aug 2022 15:57:47 +0200 Subject: [PATCH] fix: ignore whitespace when comparing ssh keys --- multy/resource_virtual_machine.go | 2 +- multy/resource_virtual_network.go | 1 - multy/validators/diff_suppress_func.go | 73 +++++++++++++++++++ .../virtual_machine/virtual_machine/main.tf | 2 +- tests/resources/virtual_network/main.tf | 4 +- 5 files changed, 77 insertions(+), 5 deletions(-) create mode 100644 multy/validators/diff_suppress_func.go diff --git a/multy/resource_virtual_machine.go b/multy/resource_virtual_machine.go index 045ae86..4d3b945 100644 --- a/multy/resource_virtual_machine.go +++ b/multy/resource_virtual_machine.go @@ -81,7 +81,7 @@ func (r ResourceVirtualMachineType) GetSchema(_ context.Context) (tfsdk.Schema, Type: types.StringType, Description: "Public SSH Key of Virtual Machine", Optional: true, - PlanModifiers: []tfsdk.AttributePlanModifier{resource.RequiresReplace()}, + PlanModifiers: []tfsdk.AttributePlanModifier{resource.RequiresReplace(), validators.IgnoringWhitespace}, }, "public_ip_id": { Type: types.StringType, diff --git a/multy/resource_virtual_network.go b/multy/resource_virtual_network.go index aa7cf47..8529f86 100644 --- a/multy/resource_virtual_network.go +++ b/multy/resource_virtual_network.go @@ -36,7 +36,6 @@ var virtualNetworkGcpOutputs = map[string]attr.Type{ } func (r ResourceVirtualNetworkType) GetSchema(_ context.Context) (tfsdk.Schema, diag.Diagnostics) { - return tfsdk.Schema{ MarkdownDescription: "Provides Multy Virtual Network resource", Attributes: map[string]tfsdk.Attribute{ diff --git a/multy/validators/diff_suppress_func.go b/multy/validators/diff_suppress_func.go new file mode 100644 index 0000000..fa8be40 --- /dev/null +++ b/multy/validators/diff_suppress_func.go @@ -0,0 +1,73 @@ +package validators + +import ( + "context" + "fmt" + "github.com/hashicorp/terraform-plugin-framework/tfsdk" + "github.com/hashicorp/terraform-plugin-log/tflog" + "strings" +) + +type DiffSuppressFunc[T any] struct { + isEqual func(T, T) bool +} + +var IgnoringWhitespace = NewDiffSuppressFunc(func(val1 string, val2 string) bool { + return strings.TrimSpace(val1) == strings.TrimSpace(val2) +}) + +func NewDiffSuppressFunc[T any](isEqual func(T, T) bool) DiffSuppressFunc[T] { + return DiffSuppressFunc[T]{isEqual: isEqual} +} + +func (m DiffSuppressFunc[T]) Description(_ context.Context) string { + return fmt.Sprintf("Ignores diff based on a custom function.") +} + +func (m DiffSuppressFunc[T]) MarkdownDescription(c context.Context) string { + return m.Description(c) +} + +func (m DiffSuppressFunc[T]) Modify(ctx context.Context, req tfsdk.ModifyAttributePlanRequest, resp *tfsdk.ModifyAttributePlanResponse) { + if req.AttributeConfig == nil || req.AttributeConfig.IsNull() || req.AttributeConfig.IsUnknown() { + return + } + if req.AttributeState == nil || req.AttributeState.IsNull() || req.AttributeState.IsUnknown() { + return + } + + if req.AttributeConfig.Equal(req.AttributeState) { + return + } + + stateVal, err := req.AttributeState.ToTerraformValue(ctx) + if err != nil { + tflog.Error(ctx, fmt.Sprintf("DiffSupressFunc: Unable to convert state value to tf value, %s", err)) + return + } + + configVal, err := req.AttributeConfig.ToTerraformValue(ctx) + if err != nil { + tflog.Error(ctx, fmt.Sprintf("DiffSupressFunc: Unable to convert config value to tf value, %s", err)) + return + } + + var c, s T + + err = stateVal.As(&s) + if err != nil { + tflog.Error(ctx, fmt.Sprintf("DiffSupressFunc: Unable to convert state value, %s", err)) + return + } + + err = configVal.As(&c) + if err != nil { + tflog.Error(ctx, fmt.Sprintf("DiffSupressFunc: Unable to convert config value, %s", err)) + return + } + + if m.isEqual(c, s) { + tflog.Info(ctx, fmt.Sprintf("DiffSupressFunc: Diff has been suprressed.")) + resp.AttributePlan = req.AttributeState + } +} diff --git a/tests/resources/virtual_machine/virtual_machine/main.tf b/tests/resources/virtual_machine/virtual_machine/main.tf index 360babf..3657817 100644 --- a/tests/resources/virtual_machine/virtual_machine/main.tf +++ b/tests/resources/virtual_machine/virtual_machine/main.tf @@ -72,6 +72,6 @@ resource multy_virtual_machine vm { cloud = var.cloud location = var.location network_security_group_ids = [multy_network_security_group.nsg.id] - public_ssh_key = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDQJRMv5ix5QPfs3+t6mLcXvtBuMdxHc5aitbWE4myzVf33UttLI4td1Q2WZ+kfn5SwiF7b9YowqWlM0kiIFGoJhcBwN0Mq4TOcGmn5Hidl94Rf8xzk88+W0LJEd+JEKY4czZNNgdWhhsxuZgt9P4NdzONqFC2XL5AggLau7SdDVV9JCHHI+dw1C0FLq1Y/5Ga7rJN2Zm7vmT4I/tCPEheEDYN2MH2ClKgQf4Ni2KoiHLxvrbBmcXOuknn+/yjN+dpiAncQFnMjykV5lKMnXFm6u43KlMLpr/XKKmdaLDZWBVaNRdPeqt2FiWisGFowAuUsXWUhSBcwXArZbWRbc0rp+ASh9is2fC9BvkOcCdMZTqJmoXFib23KaSKi1wZhGOPB93YJvZ/Gnr6n0GHWryqPJ6QvijmN20zYJq1j4ZUrNsxLgIMkGNMtCId+pbJ1amn1DM7X2fT99k+rcycTIuI83OEASs49hJfty0AM1ChSxvkm0ZAZQcFsdUnuAAyhXgU= root@Joaos-MacBook-Pro.local" + public_ssh_key = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDQJRMv5ix5QPfs3+t6mLcXvtBuMdxHc5aitbWE4myzVf33UttLI4td1Q2WZ+kfn5SwiF7b9YowqWlM0kiIFGoJhcBwN0Mq4TOcGmn5Hidl94Rf8xzk88+W0LJEd+JEKY4czZNNgdWhhsxuZgt9P4NdzONqFC2XL5AggLau7SdDVV9JCHHI+dw1C0FLq1Y/5Ga7rJN2Zm7vmT4I/tCPEheEDYN2MH2ClKgQf4Ni2KoiHLxvrbBmcXOuknn+/yjN+dpiAncQFnMjykV5lKMnXFm6u43KlMLpr/XKKmdaLDZWBVaNRdPeqt2FiWisGFowAuUsXWUhSBcwXArZbWRbc0rp+ASh9is2fC9BvkOcCdMZTqJmoXFib23KaSKi1wZhGOPB93YJvZ/Gnr6n0GHWryqPJ6QvijmN20zYJq1j4ZUrNsxLgIMkGNMtCId+pbJ1amn1DM7X2fT99k+rcycTIuI83OEASs49hJfty0AM1ChSxvkm0ZAZQcFsdUnuAAyhXgU= root@Joaos-MacBook-Pro.local\n" depends_on = [multy_route_table_association.rta1] } diff --git a/tests/resources/virtual_network/main.tf b/tests/resources/virtual_network/main.tf index 6ee8080..f3a55d0 100644 --- a/tests/resources/virtual_network/main.tf +++ b/tests/resources/virtual_network/main.tf @@ -1,10 +1,10 @@ variable "cloud" { type = string - default = "gcp" + default = "aws" } resource "multy_virtual_network" "vn" { - name = "vn-test2" + name = "vn-test" cidr_block = "10.0.0.0/16" location = "eu_west_1" cloud = var.cloud