From d6b3f2646300b74338780a7c01b0a9eb4e139584 Mon Sep 17 00:00:00 2001 From: Douglas Parsons Date: Fri, 6 Jan 2023 15:36:19 +0000 Subject: [PATCH] Omit `null` environment variables in vercel_deployment Creating a vercel_deployment and passing a `null` environment variable results in a conversion error. ``` An unexpected error was encountered trying to build a value. This is always an error in the provider. Please report the following to the provider developer: Received null value, however the target type cannot handle null values. Use the corresponding `types` package type, a pointer type or a custom type that handles null values. Path: ["BAZ"] Target Type: string Suggested `types` Type: basetypes.StringValue Suggested Pointer Type: *string ``` We need to handle the case where the field value is `null`, which is currently omitted. Since the API only accepts string values for enviroment variables, the best solution is to simply omit sending `null` to the API altogether. Closes #95 --- vercel/resource_deployment.go | 14 ++++++++++++-- vercel/resource_deployment_test.go | 5 +++-- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/vercel/resource_deployment.go b/vercel/resource_deployment.go index 6b5cc6d2..bcd9abcb 100644 --- a/vercel/resource_deployment.go +++ b/vercel/resource_deployment.go @@ -246,6 +246,16 @@ func getPrebuiltBuildsFile(files []client.DeploymentFile) (string, bool) { return "", false } +func filterNullFromMap(m map[string]types.String) map[string]string { + out := map[string]string{} + for k, v := range m { + if !v.IsNull() { + out[k] = v.ValueString() + } + } + return out +} + // Create will create a deployment within Vercel. This is done by first attempting to trigger a deployment, seeing what // files are required, uploading those files, and then attempting to create a deployment again. // This is called automatically by the provider when a new resource should be created. @@ -281,7 +291,7 @@ func (r *deploymentResource) Create(ctx context.Context, req resource.CreateRequ return } - var environment map[string]string + var environment map[string]types.String diags = plan.Environment.ElementsAs(ctx, &environment, false) resp.Diagnostics.Append(diags...) if resp.Diagnostics.HasError() { @@ -294,7 +304,7 @@ func (r *deploymentResource) Create(ctx context.Context, req resource.CreateRequ } cdr := client.CreateDeploymentRequest{ Files: files, - Environment: environment, + Environment: filterNullFromMap(environment), ProjectID: plan.ProjectID.ValueString(), ProjectSettings: plan.ProjectSettings.toRequest(), Target: target, diff --git a/vercel/resource_deployment_test.go b/vercel/resource_deployment_test.go index 437fad5c..76d29159 100644 --- a/vercel/resource_deployment_test.go +++ b/vercel/resource_deployment_test.go @@ -109,7 +109,8 @@ func TestAcc_DeploymentWithEnvironment(t *testing.T) { { Config: testAccDeploymentConfig(projectSuffix, teamIDConfig(), `environment = { FOO = "baz", - BAR = "qux" + BAR = "qux", + BAZ = null }`), Check: resource.ComposeAggregateTestCheckFunc( testAccDeploymentExists("vercel_deployment.test", ""), @@ -286,7 +287,7 @@ resource "vercel_deployment" "test" { project_id = vercel_project.test.id %[2]s - files = data.vercel_prebuilt_project.test.output + files = data.vercel_prebuilt_project.test.output path_prefix = data.vercel_prebuilt_project.test.path } `, projectSuffix, teamID)