Merge pull request #10676 from hashicorp/hcl2_upgrade_variables_only

Allows hcl2_upgrade variables json file
This commit is contained in:
Megan Marsh 2021-02-22 15:05:02 -08:00 committed by GitHub
commit 6107aa51ef
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 184 additions and 19 deletions

View File

@ -436,6 +436,10 @@ func variableTransposeTemplatingCalls(s []byte) (isLocal bool, body []byte) {
isLocal = true
return ""
}
funcMap["user"] = func(a ...string) string {
isLocal = true
return ""
}
tpl, err := texttemplate.New("hcl2_upgrade").
Funcs(funcMap).
@ -896,6 +900,10 @@ type BuildParser struct {
}
func (p *BuildParser) Parse(tpl *template.Template) error {
if len(p.Builders) == 0 {
return nil
}
buildContent := hclwrite.NewEmptyFile()
buildBody := buildContent.Body()
if tpl.Description != "" {

View File

@ -26,6 +26,8 @@ func Test_hcl2_upgrade(t *testing.T) {
{folder: "source-name", flags: []string{"-with-annotations"}},
{folder: "error-cleanup-provisioner", flags: []string{"-with-annotations"}},
{folder: "aws-access-config", flags: []string{}},
{folder: "variables-only", flags: []string{}},
{folder: "variables-with-variables", flags: []string{}},
}
for _, tc := range tc {

View File

@ -0,0 +1,45 @@
variable "aws_access_key" {
type = string
default = ""
sensitive = true
}
variable "aws_region" {
type = string
}
variable "aws_secondary_region" {
type = string
default = "${env("AWS_DEFAULT_REGION")}"
}
variable "aws_secret_key" {
type = string
default = ""
sensitive = true
}
variable "secret_account" {
type = string
default = "🤷"
sensitive = true
}
data "amazon-secretsmanager" "autogenerated_1" {
name = "sample/app/password"
}
data "amazon-secretsmanager" "autogenerated_2" {
key = "api_key"
name = "sample/app/passwords"
}
local "password" {
sensitive = true
expression = "${data.amazon-secretsmanager.autogenerated_1.value}"
}
locals {
password_key = "MY_KEY_${data.amazon-secretsmanager.autogenerated_2.value}"
}

View File

@ -0,0 +1,18 @@
{
"variables": {
"secret_account": "🤷",
"aws_region": null,
"aws_secondary_region": "{{ env `AWS_DEFAULT_REGION` }}",
"aws_secret_key": "",
"aws_access_key": "",
"password": "{{ aws_secretsmanager `sample/app/password` }}",
"password_key": "MY_KEY_{{ aws_secretsmanager `sample/app/passwords` `api_key` }}"
},
"sensitive-variables": [
"aws_secret_key",
"aws_access_key",
"secret_account",
"potato",
"password"
]
}

View File

@ -0,0 +1,25 @@
variable "aws_access_key" {
type = string
default = ""
sensitive = true
}
variable "aws_region" {
type = string
}
variable "aws_secret_key" {
type = string
default = ""
sensitive = true
}
local "password" {
sensitive = true
expression = "${var.aws_secret_key}-${var.aws_access_key}"
}
locals {
aws_secondary_region = "${var.aws_region}"
}

View File

@ -0,0 +1,14 @@
{
"variables": {
"aws_region": null,
"aws_secondary_region": "{{ user `aws_region` }}",
"aws_secret_key": "",
"aws_access_key": "",
"password": "{{ user `aws_secret_key` }}-{{ user `aws_access_key` }}"
},
"sensitive-variables": [
"aws_secret_key",
"aws_access_key",
"password"
]
}

View File

@ -26,31 +26,57 @@ $ packer hcl2_upgrade my-template.json
Successfully created my-template.json.pkr.hcl
```
## User variables using other user variables
## Upgrading variables file
Packer JSON recently started allowing using user variables from variables. In
HCL2, input variables cannot use functions nor other variables and are
virtually static, local variables must be used instead to craft more dynamic
variables. For that reason `hcl2_upgrade` cannot decide for you what local
variables to create and the `hcl2_upgrade` command will simply output all seen
variables as an input variable, it is now up to you to create a local variable.
From **v1.7.1**, the `hcl2_upgrade` command can upgrade a variables file.
Here is an example of a local variable using a string input variables:
<Tabs>
<Tab heading="Original file (variables.json)">
```hcl
variable "foo" {
default = "Hello,"
}
variable "bar" {
default = "World!"
}
locals {
baz = "${var.foo} ${var.bar}"
```json
{
"variables": {
"aws_region": null,
"aws_secondary_region": "{{ env `AWS_DEFAULT_REGION` }}",
"aws_secret_key": "",
"aws_access_key": "",
},
"sensitive-variables": [
"aws_secret_key",
"aws_access_key",
]
}
```
</Tab>
<Tab heading="Result file (variables.pkr.hcl)">
```hcl
variable "aws_access_key" {
type = string
default = ""
sensitive = true
}
variable "aws_region" {
type = string
}
variable "aws_secondary_region" {
type = string
default = "${env("AWS_DEFAULT_REGION")}"
}
variable "aws_secret_key" {
type = string
default = ""
sensitive = true
}
```
</Tab>
</Tabs>
## Go template functions
`hcl2_upgrade` will do its best to transform your go _template calls_ to HCL2,
@ -79,3 +105,30 @@ working on improving this part of the transformer.
- `-output-file` - File where to put the hcl2 generated config. Defaults to
JSON_TEMPLATE.pkr.hcl
- `-with-annotations` - Adds helper annotations with information about the generated HCL2 blocks.
## User variables using other user variables
Packer JSON recently started allowing using user variables from variables. In
HCL2, input variables cannot use functions nor other variables and are
virtually static, local variables must be used instead to craft more dynamic
variables.
For v1.7.0 and lower, `hcl2_upgrade` doesn't upgrade variables to local variables,
and it is up to you to upgrade them manually. Upgrade to **v1.7.1** to let the command do it
automatically for you.
Here is an example of a local variable using a string input variables:
```hcl
variable "foo" {
default = "Hello,"
}
variable "bar" {
default = "World!"
}
locals {
baz = "${var.foo} ${var.bar}"
}
```