hcl

package
v0.9.20 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Mar 16, 2022 License: Apache-2.0 Imports: 21 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

View Source
var TypeData = Type{
	// contains filtered or unexported fields
}
View Source
var TypeLocal = Type{
	// contains filtered or unexported fields
}
View Source
var TypeModule = Type{
	// contains filtered or unexported fields
}
View Source
var TypeOutput = Type{
	// contains filtered or unexported fields
}
View Source
var TypeProvider = Type{
	// contains filtered or unexported fields
}
View Source
var TypeResource = Type{
	// contains filtered or unexported fields
}
View Source
var TypeTerraform = Type{
	// contains filtered or unexported fields
}
View Source
var TypeVariable = Type{
	// contains filtered or unexported fields
}

Functions

This section is empty.

Types

type Attribute

type Attribute struct {
	// HCLAttr is the underlying hcl.Attribute that the Attribute references.
	HCLAttr *hcl.Attribute
	// Ctx is the context that the Attribute should be evaluated against. This propagates
	// any references from variables into the attribute.
	Ctx *Context
	// Verbose defines if the attribute should log verbose diagnostics messages to debug.
	Verbose bool
}

Attribute provides a wrapper struct around hcl.Attribute it provides helper methods and functionality for common interactions with hcl.Attribute.

Attributes are key/value pairs that are part of a Block. For example take the following Block:

		resource "aws_instance" "t3_standard" {
		  	ami           = "fake_ami"
 		instance_type = "t3.medium"

 		credit_specification {
   			cpu_credits = "standard"
 		}
		}

"ami" & "instance_type" are the Attributes of this Block, "credit_specification" is a child Block see Block.Children for more info.

func (*Attribute) AllReferences

func (attr *Attribute) AllReferences() []*Reference

AllReferences returns a list of References for the given Attribute. This can include the main Value Reference (see Reference method) and also a list of references used in conditional evaluation and templating.

func (*Attribute) Equals

func (attr *Attribute) Equals(val interface{}) bool

Equals checks that val matches the underlying Attribute cty.Type.

func (*Attribute) IsIterable

func (attr *Attribute) IsIterable() bool

IsIterable returns if the attribute can be ranged over.

func (*Attribute) Name

func (attr *Attribute) Name() string

Name is a helper method to return the underlying hcl.Attribute Name

func (*Attribute) Reference

func (attr *Attribute) Reference() (*Reference, error)

Reference returns the pointer to a Reference struct that holds information about the Attributes referenced block. Reference achieves this by traversing the Attribute Expression in order to find the parent block. E.g. with the following HCL

resource "aws_launch_template" "foo2" {
	name = "foo2"
}

resource "some_resource" "example_with_launch_template_3" {
	...
	name    = aws_launch_template.foo2.name
}

The Attribute some_resource.name would have a reference of

Reference {
	blockType: Type{
		name:                  "resource",
		removeTypeInReference: true,
	}
	typeLabel: "aws_launch_template"
	nameLabel: "foo2"
}

Reference is used to build up a Terraform JSON configuration file that holds information about the expressions and their parents. Infracost uses these references in resource evaluation to lookup connecting resource information.

func (*Attribute) Value

func (attr *Attribute) Value() (ctyVal cty.Value)

Value returns the Attribute with the underlying hcl.Expression of the hcl.Attribute evaluated with the Attribute Context. This returns a cty.Value with the values filled from any variables or references that the Context carries.

type Block

type Block struct {
	// contains filtered or unexported fields
}

Block wraps a hcl.Block type with additional methods and context. A Block is a core piece of HCL schema and represents a set of data. Most importantly a Block directly corresponds to a schema.Resource.

Blocks can represent a number of different types - see terraformSchemaV012 for a list of potential HCL blocks available.

e.g. a type resource block could look like this in HCL:

		resource "aws_lb" "lb1" {
  		load_balancer_type = "application"
		}

A Block can also have a set number of child Blocks, these child Blocks in turn can also have children. Blocks are recursive. The following example is represents a resource Block with child Blocks:

		resource "aws_instance" "t3_standard_cpuCredits" {
		  	ami           = "fake_ami"
 		instance_type = "t3.medium"

			# child Block starts here
 		credit_specification {
   			cpu_credits = "standard"
 		}
		}

See Attribute for more info about how the values of Blocks are evaluated with their Context and returned.

func NewHCLBlock

func NewHCLBlock(hclBlock *hcl.Block, ctx *Context, moduleBlock *Block) *Block

NewHCLBlock returns a Block with Context and child Blocks initialised.

func (*Block) AttributesAsMap

func (b *Block) AttributesAsMap() map[string]*Attribute

AttributesAsMap returns the Attributes of this block as a map with the attribute name as the key and the value as the Attribute.

func (*Block) Children

func (b *Block) Children() Blocks

Children returns all the child Blocks associated with this Block.

func (*Block) Clone

func (b *Block) Clone(index cty.Value) *Block

Clone creates a duplicate of the block and sets the returned Block's Context to include the index provided. This is primarily used when Blocks are expanded as part of a count evaluation.

func (*Block) Context

func (b *Block) Context() *Context

func (*Block) FullName

func (b *Block) FullName() string

FullName returns the fully qualified Reference name as it relates to the Blocks position in the entire Terraform config tree. This includes module name. e.g.

The following resource residing in a module named "web_app":

		resource "aws_instance" "t3_standard" {
		  	ami           = "fake_ami"
 		instance_type = var.instance_type
		}

Would have its FullName as module.web_app.aws_instance.t3_standard FullName is what Terraform uses in its JSON output file.

func (*Block) GetAttribute

func (b *Block) GetAttribute(name string) *Attribute

GetAttribute returns the given attribute with the provided name. It will return nil if the attribute is not found. If we take the following Block example:

		resource "aws_instance" "t3_standard_cpuCredits" {
		  	ami           = "fake_ami"
 		instance_type = "t3.medium"

 		credit_specification {
   			cpu_credits = "standard"
 		}
		}

ami & instance_type are both valid Attribute names that can be used to lookup Block Attributes.

func (*Block) GetAttributes

func (b *Block) GetAttributes() []*Attribute

GetAttributes returns a list of Attribute for this Block. Attributes are key value specification on a given Block. For example take the following hcl:

		resource "aws_instance" "t3_standard_cpuCredits" {
		  	ami           = "fake_ami"
 		instance_type = "t3.medium"

 		credit_specification {
   			cpu_credits = "standard"
 		}
		}

ami & instance_type are the Attributes of this Block and credit_specification is a child Block.

func (*Block) GetChildBlock

func (b *Block) GetChildBlock(name string) *Block

GetChildBlock returns the first child Block that has the name provided. e.g: If the current Block looks like such:

		resource "aws_instance" "t3_standard_cpuCredits" {
		  	ami           = "fake_ami"
 		instance_type = "t3.medium"

 		credit_specification {
   			cpu_credits = "standard"
 		}

			ebs_block_device {
				device_name = "xvdj"
			}
		}

Then "credit_specification" & "ebs_block_device" would be valid names that could be used to retrieve child Blocks.

func (*Block) HasChild

func (b *Block) HasChild(childElement string) bool

func (*Block) HasModuleBlock

func (b *Block) HasModuleBlock() bool

HasModuleBlock returns is the Block as a module associated with it. If it doesn't this means that this Block is part of the root Module.

func (*Block) InjectBlock

func (b *Block) InjectBlock(block *Block, name string)

InjectBlock takes a block and appends it to the Blocks childBlocks with the Block's attributes set as contextual values on the child. In most cases this is because we've expanded the block into further Blocks as part of a count or for_each.

func (*Block) IsCountExpanded

func (b *Block) IsCountExpanded() bool

IsCountExpanded returns if the Block has been expanded as part of a for_each or count evaluation.

func (*Block) Label

func (b *Block) Label() string

func (*Block) Labels

func (b *Block) Labels() []string

func (*Block) LocalName

func (b *Block) LocalName() string

LocalName is the name relative to the current module

func (*Block) ModuleAddress

func (b *Block) ModuleAddress() string

ModuleAddress returns the address of the module associated with this Block or "" if it is part of the root Module

func (*Block) ModuleName

func (b *Block) ModuleName() string

ModuleName returns the name of the module associated with this Block or "" if it is part of the root Module

func (*Block) ModuleSource

func (b *Block) ModuleSource() string

ModuleSource returns the "source" attribute from the associated Module or "" if it is part of the root Module

func (*Block) NameLabel

func (b *Block) NameLabel() string

func (*Block) Provider

func (b *Block) Provider() string

Provider returns the provider by first checking if it is explicitly set as an attribute, if it is not the first word in the snake_case name of the type is returned. E.g. the type 'aws_instance' would return provider 'aws'

func (*Block) Reference

func (b *Block) Reference() *Reference

Reference returns a Reference to the given Block this can be used to when printing out full names of Blocks to stdout or a file.

func (*Block) SetContext

func (b *Block) SetContext(ctx *Context)

SetContext sets the Block.context to the provided ctx. This ctx is also set on the child Blocks as a child Context. Meaning that it can be used in traversal evaluation when looking up Context variables.

func (*Block) Type

func (b *Block) Type() string

func (*Block) TypeLabel

func (b *Block) TypeLabel() string

func (*Block) Values

func (b *Block) Values() cty.Value

Values returns the Block as a cty.Value with all the Attributes evaluated with the Block Context. This means that any variables or references will be replaced by their actual value. For example:

		variable "instance_type" {
			default = "t3.medium"
		}

		resource "aws_instance" "t3_standard_cpucredits" {
		  	ami           = "fake_ami"
 		instance_type = var.instance_type
		}

Would evaluate to a cty.Value of type Object with the instance_type Attribute holding the value "t3.medium".

type Blocks

type Blocks []*Block

Blocks is a helper type around a slice of blocks to provide easy access finding blocks of type.

func (Blocks) OfType

func (blocks Blocks) OfType(t string) Blocks

OfType returns Blocks of the given type t. See terraformSchemaV012 for a list of possible types to lookup.

type Context

type Context struct {
	// contains filtered or unexported fields
}

func NewContext

func NewContext(ctx *hcl.EvalContext, parent *Context) *Context

func (*Context) Get

func (c *Context) Get(parts ...string) cty.Value

func (*Context) Inner

func (c *Context) Inner() *hcl.EvalContext

func (*Context) NewChild

func (c *Context) NewChild() *Context

func (*Context) Parent

func (c *Context) Parent() *Context

func (*Context) Root

func (c *Context) Root() *Context

func (*Context) Set

func (c *Context) Set(val cty.Value, parts ...string)

func (*Context) SetByDot

func (c *Context) SetByDot(val cty.Value, path string)

type Evaluator

type Evaluator struct {
	// contains filtered or unexported fields
}

Evaluator provides a set of given Blocks with contextual information. Evaluator is an important step in retrieving Block values that can be used in the schema.Resource cost retrieval. Without Evaluator the Blocks provided only have shallow information within attributes and won't contain any evaluated variables or references.

func NewEvaluator

func NewEvaluator(
	projectRootPath string,
	modulePath string,
	workingDir string,
	blocks Blocks,
	inputVars map[string]cty.Value,
	moduleMetadata *modules.Manifest,
	visitedModules map[string]struct{},
	workspace string,
) *Evaluator

NewEvaluator returns an Evaluator with Context initialised with top level variables. This Context is then passed to all Blocks as child Context so that variables built in Evaluation are propagated to the Block Attributes.

func (*Evaluator) Run

func (e *Evaluator) Run() ([]*Module, error)

Run builds the Evaluator Context using all the provided Blocks. It will build up the Context to hold variable and reference information so that this can be used by Attribute evaluation. Run will also parse and build up and child modules that are referenced in the Blocks and runs child Evaluator on these Modules.

type Module

type Module struct {
	Blocks     Blocks
	RootPath   string
	ModulePath string
}

Module encapsulates all the Blocks that are part of a Module in a Terraform project.

type ModuleCall

type ModuleCall struct {
	// Name the name of the module as specified a the point of definition.
	Name string
	// Path is the path to the local directory containing the HCL for the Module.
	Path string
	// Definition is the actual Block where the ModuleCall happens in a hcl.File
	Definition *Block
	// Modules contains the parsed modules that are part of this ModuleCall. This can contain
	// more than one Module as it will also contain a list of the child Modules that have been
	// called within this Module. The Module at position 0 is the root Module.
	Modules []*Module
}

ModuleCall represents a call to a defined Module by a parent Module.

type Option

type Option func(p *Parser)

func OptionStopOnHCLError

func OptionStopOnHCLError() Option

func OptionWithInputVars

func OptionWithInputVars(vs []string) Option

OptionWithInputVars takes a cmd line var input values and converts them to cty.Value It then sets these as the Parser starting inputVars which be used at the root module evaluation.

func OptionWithTFVarsPaths

func OptionWithTFVarsPaths(paths []string) Option

OptionWithTFVarsPaths takes a slice of paths and sets them on the parser relative to the Parser initialPath. Paths that don't exist will be ignored.

func OptionWithWorkspaceName

func OptionWithWorkspaceName(workspaceName string) Option

type Parser

type Parser struct {
	// contains filtered or unexported fields
}

Parser is a tool for parsing terraform templates at a given file system location.

func New

func New(initialPath string, options ...Option) *Parser

New creates a new Parser with the provided options, it inits the workspace as under the default name this can be changed using Option.

func (*Parser) ParseDirectory

func (p *Parser) ParseDirectory() ([]*Module, error)

ParseDirectory parses all the terraform files in the initalPath into Blocks and then passes them to an Evaluator to fill these Blocks with additional Context information. Parser does not parse any blocks outside the root Module. It instead leaves ModuleLoader to fetch these Modules on demand. See ModuleLoader.Load for more information.

ParseDirectory returns a list of Module that represent the Terraform Config tree.

type Reference

type Reference struct {
	// contains filtered or unexported fields
}

func (*Reference) SetKey

func (r *Reference) SetKey(key cty.Value)

func (*Reference) String

func (r *Reference) String() string

type Type

type Type struct {
	// contains filtered or unexported fields
}

func TypeFromRefName

func TypeFromRefName(name string) (*Type, error)

func (Type) Name

func (t Type) Name() string

func (Type) ShortName

func (t Type) ShortName() string

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL