Merge pull request #10642 from hashicorp/b-num-id
config: allow names to start with numbers
This commit is contained in:
commit
4a38f5f534
|
@ -18,7 +18,7 @@ import (
|
||||||
|
|
||||||
// NameRegexp is the regular expression that all names (modules, providers,
|
// NameRegexp is the regular expression that all names (modules, providers,
|
||||||
// resources, etc.) must follow.
|
// resources, etc.) must follow.
|
||||||
var NameRegexp = regexp.MustCompile(`(?i)\A[A-Z_][A-Z0-9\-\_]*\z`)
|
var NameRegexp = regexp.MustCompile(`(?i)\A[A-Z0-9_][A-Z0-9\-\_]*\z`)
|
||||||
|
|
||||||
// Config is the configuration that comes from loading a collection
|
// Config is the configuration that comes from loading a collection
|
||||||
// of Terraform templates.
|
// of Terraform templates.
|
||||||
|
|
|
@ -447,20 +447,6 @@ func TestLoadFile_variables(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestLoadFile_varInt(t *testing.T) {
|
|
||||||
_, err := LoadFile(filepath.Join(fixtureDir, "var_int.tf"))
|
|
||||||
if err == nil {
|
|
||||||
t.Fatal("should have error")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestLoadFile_varIntBare(t *testing.T) {
|
|
||||||
_, err := LoadFile(filepath.Join(fixtureDir, "var_int_bare.tf"))
|
|
||||||
if err == nil {
|
|
||||||
t.Fatal("should have error")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestLoadDir_basic(t *testing.T) {
|
func TestLoadDir_basic(t *testing.T) {
|
||||||
dir := filepath.Join(fixtureDir, "dir-basic")
|
dir := filepath.Join(fixtureDir, "dir-basic")
|
||||||
c, err := LoadDir(dir)
|
c, err := LoadDir(dir)
|
||||||
|
|
|
@ -2,7 +2,6 @@ package parser
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
|
||||||
"unicode/utf8"
|
"unicode/utf8"
|
||||||
|
|
||||||
"github.com/hashicorp/hil/ast"
|
"github.com/hashicorp/hil/ast"
|
||||||
|
@ -483,26 +482,8 @@ func (p *parser) ParseScopeInteraction() (ast.Node, error) {
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
varParts := []string{first.Content}
|
|
||||||
for p.peeker.Peek().Type == scanner.PERIOD {
|
|
||||||
p.peeker.Read() // eat period
|
|
||||||
|
|
||||||
// Read the next item, since variable access in HIL is composed
|
|
||||||
// of many things. For example: "var.0.bar" is the entire var access.
|
|
||||||
partTok := p.peeker.Read()
|
|
||||||
switch partTok.Type {
|
|
||||||
case scanner.IDENTIFIER:
|
|
||||||
case scanner.STAR:
|
|
||||||
case scanner.INTEGER:
|
|
||||||
default:
|
|
||||||
return nil, ExpectationError("identifier", partTok)
|
|
||||||
}
|
|
||||||
|
|
||||||
varParts = append(varParts, partTok.Content)
|
|
||||||
}
|
|
||||||
varName := strings.Join(varParts, ".")
|
|
||||||
varNode := &ast.VariableAccess{
|
varNode := &ast.VariableAccess{
|
||||||
Name: varName,
|
Name: first.Content,
|
||||||
Posx: startPos,
|
Posx: startPos,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -479,12 +479,31 @@ func scanIdentifier(s string) (string, int) {
|
||||||
nextRune, size := utf8.DecodeRuneInString(s[byteLen:])
|
nextRune, size := utf8.DecodeRuneInString(s[byteLen:])
|
||||||
if !(nextRune == '_' ||
|
if !(nextRune == '_' ||
|
||||||
nextRune == '-' ||
|
nextRune == '-' ||
|
||||||
|
nextRune == '.' ||
|
||||||
|
nextRune == '*' ||
|
||||||
unicode.IsNumber(nextRune) ||
|
unicode.IsNumber(nextRune) ||
|
||||||
unicode.IsLetter(nextRune) ||
|
unicode.IsLetter(nextRune) ||
|
||||||
unicode.IsMark(nextRune)) {
|
unicode.IsMark(nextRune)) {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If we reach a star, it must be between periods to be part
|
||||||
|
// of the same identifier.
|
||||||
|
if nextRune == '*' && s[byteLen-1] != '.' {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
// If our previous character was a star, then the current must
|
||||||
|
// be period. Otherwise, undo that and exit.
|
||||||
|
if byteLen > 0 && s[byteLen-1] == '*' && nextRune != '.' {
|
||||||
|
byteLen--
|
||||||
|
if s[byteLen-1] == '.' {
|
||||||
|
byteLen--
|
||||||
|
}
|
||||||
|
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
byteLen = byteLen + size
|
byteLen = byteLen + size
|
||||||
runeLen = runeLen + 1
|
runeLen = runeLen + 1
|
||||||
}
|
}
|
||||||
|
|
|
@ -1588,26 +1588,26 @@
|
||||||
{
|
{
|
||||||
"checksumSHA1": "xONRNgLDc5OqCUmyDN3iBRKmKB0=",
|
"checksumSHA1": "xONRNgLDc5OqCUmyDN3iBRKmKB0=",
|
||||||
"path": "github.com/hashicorp/hil",
|
"path": "github.com/hashicorp/hil",
|
||||||
"revision": "bf046eec69cc383b7f32c47990336409601c8116",
|
"revision": "60db937199ba6f67251aa038cec18ce36a951312",
|
||||||
"revisionTime": "2016-12-04T02:32:26Z"
|
"revisionTime": "2016-12-09T17:20:46Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"checksumSHA1": "oZ2a2x9qyHqvqJdv/Du3LGeaFdA=",
|
"checksumSHA1": "oZ2a2x9qyHqvqJdv/Du3LGeaFdA=",
|
||||||
"path": "github.com/hashicorp/hil/ast",
|
"path": "github.com/hashicorp/hil/ast",
|
||||||
"revision": "bf046eec69cc383b7f32c47990336409601c8116",
|
"revision": "60db937199ba6f67251aa038cec18ce36a951312",
|
||||||
"revisionTime": "2016-12-04T02:32:26Z"
|
"revisionTime": "2016-12-09T17:20:46Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"checksumSHA1": "p/zZysJW/AaPXXPCI20nM2arPnw=",
|
"checksumSHA1": "P5PZ3k7SmqWmxgJ8Q0gLzeNpGhE=",
|
||||||
"path": "github.com/hashicorp/hil/parser",
|
"path": "github.com/hashicorp/hil/parser",
|
||||||
"revision": "bf046eec69cc383b7f32c47990336409601c8116",
|
"revision": "60db937199ba6f67251aa038cec18ce36a951312",
|
||||||
"revisionTime": "2016-12-04T02:32:26Z"
|
"revisionTime": "2016-12-09T17:20:46Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"checksumSHA1": "FlzgVCYqnODad4pKujXhSaGcrIo=",
|
"checksumSHA1": "DC1k5kOua4oFqmo+JRt0YzfP44o=",
|
||||||
"path": "github.com/hashicorp/hil/scanner",
|
"path": "github.com/hashicorp/hil/scanner",
|
||||||
"revision": "bf046eec69cc383b7f32c47990336409601c8116",
|
"revision": "60db937199ba6f67251aa038cec18ce36a951312",
|
||||||
"revisionTime": "2016-12-04T02:32:26Z"
|
"revisionTime": "2016-12-09T17:20:46Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"path": "github.com/hashicorp/logutils",
|
"path": "github.com/hashicorp/logutils",
|
||||||
|
|
|
@ -57,46 +57,6 @@ EOF
|
||||||
|
|
||||||
**Action:** Use heredocs or escape sequences when you have a string with newlines.
|
**Action:** Use heredocs or escape sequences when you have a string with newlines.
|
||||||
|
|
||||||
## Names Cannot Start with Integers or Hyphens
|
|
||||||
|
|
||||||
Names of variables, resources, modules, etc. may no longer start with
|
|
||||||
numbers or hyphens. These will now fail at the validation step.
|
|
||||||
|
|
||||||
This change was necessary to remove ambiguities from parsing the
|
|
||||||
interpolations. Most languages do not allow identifiers starting with
|
|
||||||
these characters with good reason. We now follow that as well.
|
|
||||||
|
|
||||||
An example of a configuration that no longer works:
|
|
||||||
|
|
||||||
```
|
|
||||||
variable "1x1" {}
|
|
||||||
```
|
|
||||||
|
|
||||||
This must now be changed to start with a letter or underscore:
|
|
||||||
|
|
||||||
```
|
|
||||||
variable "foo-1x1" {}
|
|
||||||
variable "_1x1" {}
|
|
||||||
```
|
|
||||||
|
|
||||||
And so on...
|
|
||||||
|
|
||||||
If you're changing resource names, this can cause Terraform to consider it
|
|
||||||
a new resource and plan to destroy it. To work around these scenarios,
|
|
||||||
please use the `terraform state mv` command:
|
|
||||||
|
|
||||||
```
|
|
||||||
terraform state mv aws_instance.1x1 aws_instance.foo-1x1
|
|
||||||
```
|
|
||||||
|
|
||||||
The `terraform state mv` command creates a backup for each operation,
|
|
||||||
but to be safe you can still back up your state prior to doing these
|
|
||||||
changes.
|
|
||||||
|
|
||||||
**Action:** Rename variable, resources, modules, providers, outputs that
|
|
||||||
start with a number or hyphen. If you rename a resource or module, use
|
|
||||||
`terraform state mv` to fix the state.
|
|
||||||
|
|
||||||
## Math Order of Operations
|
## Math Order of Operations
|
||||||
|
|
||||||
Math operations now follow standard mathematical order of operations.
|
Math operations now follow standard mathematical order of operations.
|
||||||
|
|
Loading…
Reference in New Issue