0

am trying to find out a way to fetch the attribute type of a resource/data_source from a terraform providers schema (am currently using gcp, but will be extending to pretty much all providers).

My current flow of setup

  1. Am running the terraform providers schema -json to fetch the providers schema
  2. This will generate a huge json file with the schema structure of the provider ref: How to get that list of all the available Terraform Resource types for Google Cloud? https://developer.hashicorp.com/terraform/cli/commands/providers/schema
  3. And from this am trying to fetch the type of each attribute eg below `
        "google_cloud_run_service": {
          "version": 1,
          "block": {
            "attributes": {
              "autogenerate_revision_name": {
                "type": "bool",
                "description_kind": "plain",
                "optional": true
              },

` 4) My end goal is to generate variables.tf from the above schema for all resources and all attributes supported in that resource along with the type constraint ref: https://developer.hashicorp.com/terraform/language/values/variables

  1. I already got some help on how we can generate that ref: Get the type of value using cty in hclwrite

  2. Now the challenge is to work on complex structures like below The below is one of the attributes of "google_cloud_run_service".

`

              "status": {
                "type": [
                  "list",
                  [
                    "object",
                    {
                      "conditions": [
                        "list",
                        [
                          "object",
                          {
                            "message": "string",
                            "reason": "string",
                            "status": "string",
                            "type": "string"
                          }
                        ]
                      ],
                      "latest_created_revision_name": "string",
                      "latest_ready_revision_name": "string",
                      "observed_generation": "number",
                      "url": "string"
                    }
                  ]
                ],
                "description": "The current status of the Service.",
                "description_kind": "plain",
                "computed": true
              }

` 7) so based on the above complex structure type, I want to generate the variables.tf file for this kind of attribute using the code sample from point #5, and the desired output should look something like below in variables.tf

`

variable "autogenerate_revision_name" {
   type = string
   default = ""
   description = "Sample description"
 }

variable "status" {
  type = list(object({
    conditions = list(object({
    "message" = string
    "reason" = string 
    "status" = string
    " type" = string
}))

   "latest_created_revision_name" = string
   "latest_ready_revision_name" = string
   "observed_generation" = number
   "url" = string
  }))

  default = "default values in the above type format"

}

` The above was manually written - so might not exactly align with the schema, but i hope i made it understood , as to what am trying to achieve. The first variable in the above code is from the first eg i gave in point #3 which is easy to generate, but the second eg in point #6 is a complex type constraint and am seeking help to get this generated

  1. Is this possible to generate using the helper schema sdk (https://pkg.go.dev/github.com/hashicorp/terraform-plugin-sdk/v2@v2.24.0/helper/schema) ? along with code eg given in point #5 ?

Summary : Am generating json schema of a terraform provider using terraform providers schema -json, am reading that json file and generating hcl code for each resource, but stuck with generating type constraints for the attributes/variables, hence seeking help on this.

Any sort of help is really appreciated as am stuck at this for quite a while.

If you've come this far, then i thank you for reading such a lengthy question, and any sort of pointers are welcome.

0 Answers0