hashicorp / terraform-cdk

Define infrastructure resources using programming constructs and provision them using HashiCorp Terraform
https://www.terraform.io/cdktf
Mozilla Public License 2.0
4.79k stars 443 forks source link

TerraformVariable: unclear how to use validation conditions in python #3571

Open MartinLoeper opened 3 months ago

MartinLoeper commented 3 months ago

Description

I am a fairly new cdktf user and try to add a validation condition on the env variable s.t. it can only be set to "staging" or "production". However, no matter what I try, cdktf refuses to evaluate my expression.

I searched the docs and could not find any information on how to specify the condition property.

What I expected to work:

env = TerraformVariable(self, "env", type="string")

env.add_validation(
    condition=f"contains(['production', 'staging'], {env.string_value})",
    error_message="ERROR: Valid types are production and staging"
)

However, it failed with:

 Error: Invalid variable validation result
   │ 
   │   on cdk.tf.json line 81, in variable.env.validation[0]:
   │   81:           "condition": "contains(['production', 'staging'], ${var.env})",
   │     ├────────────────
   │     │ var.env is "staging"
   │ 
   │ Invalid validation condition result value: a bool is required.

I also tried to reference the input variable as follows:

env.add_validation(
    condition=f"contains(['production', 'staging'], var.env)",
    error_message="ERROR: Valid types are production and staging"
)

... which failed with:

│ Error: Invalid validation expression
   │ 
   │   on cdk.tf.json line 81, in variable.env.validation[0]:
   │   81:           "condition": "contains(['production', 'staging'], var.env)",
   │ 
   │ The condition expression must refer to at least one object from elsewhere in
   │ the configuration, or else its result would not be checking anything.

│ Error: Invalid variable validation condition
   │ 
   │   on cdk.tf.json line 81, in variable.env.validation[0]:
   │   81:           "condition": "contains(['production', 'staging'], var.env)",
   │ 
   │ The condition for variable "env" must refer to var.env in order to test
   │ incoming values.

Does not make sense to me, as I included var.env into the condition and it looks similar as examples in the non-cdk docs.

Could someone please shed some light on that topic?

Links

Help Wanted

Community Note

nbaju1 commented 1 month ago

If you check your resulting configuration, you see that the condition parameter is synthesized as a string, not a hcl boolean.

Either add expression syntax to the condition string:

env = TerraformVariable(self, "env", type="string")

env.add_validation(
    condition=f"${{contains(['production', 'staging'], {env.string_value})}}",
    error_message="ERROR: Valid types are production and staging"
)

or use the CDKTF equivalent of the contains function.

from cdktf import TerraformVariable, FnGenerated
env = TerraformVariable(self, "env", type="string")

env.add_validation(
    condition=FnGenerated.contains(["production", "staging"], env.string_value),
    error_message="ERROR: Valid types are production and staging"
)
MartinLoeper commented 1 month ago

I'll give it a try! Thanks @nbaju1 !!

Saaalih2g commented 1 month ago

ارجو الحل

في أربعاء، 29 مايو، 2024 في 2:29 م، كتب Martin Löper < @.***>:

I'll give it a try! Thanks @nbaju1 https://github.com/nbaju1 !!

— Reply to this email directly, view it on GitHub https://github.com/hashicorp/terraform-cdk/issues/3571#issuecomment-2137185580, or unsubscribe https://github.com/notifications/unsubscribe-auth/A5IDPXF6UFP7LJARUQVRMS3ZEW3ZRAVCNFSM6AAAAABFPPVPVWVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDCMZXGE4DKNJYGA . You are receiving this because you are subscribed to this thread.Message ID: @.***>