util

package
v0.99.2 Latest Latest
Warning

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

Go to latest
Published: Feb 13, 2026 License: MIT Imports: 34 Imported by: 0

Documentation

Overview

Package util provides utility functions for Terragrunt.

Index

Constants

View Source
const (
	TerraformLockFile     = ".terraform.lock.hcl"
	TerragruntCacheDir    = ".terragrunt-cache"
	DefaultBoilerplateDir = ".boilerplate"
	TfFileExtension       = ".tf"
	ChecksumReadBlock     = 8192
)
View Source
const Base62Chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
View Source
const UniqueIDLength = 6 // Should be good for 62^6 = 56+ billion combinations

Variables

This section is empty.

Functions

func AsTerraformEnvVarJSONValue

func AsTerraformEnvVarJSONValue(value any) (string, error)

AsTerraformEnvVarJSONValue converts the given value to a JSON value that can be passed to Terraform as an environment variable. For the most part, this converts the value directly to JSON using Go's built-in json.Marshal. However, we have special handling for strings, which with normal JSON conversion would be wrapped in quotes, but when passing them to Terraform via env vars, we need to NOT wrap them in quotes, so this method adds special handling for that case.

func CanonicalPath

func CanonicalPath(path string, basePath string) (string, error)

CanonicalPath returns the canonical version of the given path, relative to the given base path. That is, if the given path is a relative path, assume it is relative to the given base path. A canonical path is an absolute path with all relative components (e.g. "../") fully resolved, which makes it safe to compare paths as strings.

func CanonicalPaths

func CanonicalPaths(paths []string, basePath string) ([]string, error)

CanonicalPaths returns the canonical version of the given paths, relative to the given base path. That is, if a given path is a relative path, assume it is relative to the given base path. A canonical path is an absolute path with all relative components (e.g. "../") fully resolved, which makes it safe to compare paths as strings.

func CleanPath

func CleanPath(path string) string

CleanPath is a wrapper around filepath.Clean.

Use this function when cleaning paths to ensure the returned path uses / as the path separator to improve cross-platform compatibility

func CompileGlobs

func CompileGlobs(basePath string, globPaths ...string) (map[string]glob.Glob, error)

func ContainsPath

func ContainsPath(path, subpath string) bool

ContainsPath returns true if path contains the given subpath E.g. path="foo/bar/bee", subpath="bar/bee" -> true E.g. path="foo/bar/bee", subpath="bar/be" -> false (because be is not a directory)

func Copy

func Copy(ctx context.Context, dst io.Writer, src io.Reader) (int64, error)

Copy is a io.Copy cancellable by context.

func CopyFile

func CopyFile(source string, destination string) error

CopyFile copies a file from source to destination.

func CopyFolderContents

func CopyFolderContents(
	logger log.Logger,
	source,
	destination,
	manifestFile string,
	includeInCopy []string,
	excludeFromCopy []string,
) error

CopyFolderContents copies the files and folders within the source folder into the destination folder. Note that hidden files and folders (those starting with a dot) will be skipped. Will create a specified manifest file that contains paths of all copied files.

func CopyFolderContentsWithFilter

func CopyFolderContentsWithFilter(logger log.Logger, source, destination, manifestFile string, filter func(absolutePath string) bool) error

CopyFolderContentsWithFilter copies the files and folders within the source folder into the destination folder.

func DirContainsTFFiles

func DirContainsTFFiles(dirPath string) (bool, error)

DirContainsTFFiles checks if the given directory contains any Terraform/OpenTofu files (.tf, .tofu, .tf.json, .tofu.json)

func DoWithRetry

func DoWithRetry(ctx context.Context, actionDescription string, maxRetries int, sleepBetweenRetries time.Duration, logger log.Logger, logLevel log.Level, action func(ctx context.Context) error) error

DoWithRetry runs the specified action. If it returns a value, return that value. If it returns an error, sleep for sleepBetweenRetries and try again, up to a maximum of maxRetries retries. If maxRetries is exceeded, return a MaxRetriesExceeded error.

func EncodeBase64Sha1

func EncodeBase64Sha1(str string) string

EncodeBase64Sha1 Returns the base 64 encoded sha1 hash of the given string

func EnsureDirectory

func EnsureDirectory(path string) error

EnsureDirectory creates a directory at this path if it does not exist, or error if the path exists and is a file.

func ExcludeFiltersFromFile

func ExcludeFiltersFromFile(baseDir, filename string) ([]string, error)

ExcludeFiltersFromFile returns a list of filters from the given filename, where each filter starts on a new line.

Note that this is a backwards compatibility implementation for the `--queue-excludes-file` flag, so it's going to append the ! prefix to each filter to negate it.

func FileExists

func FileExists(path string) bool

FileExists returns true if the given file exists.

func FileNotExists

func FileNotExists(path string) bool

FileNotExists returns true if the given file does not exist.

func FileOrData

func FileOrData(maybePath string) (string, error)

FileOrData will read the contents of the data of the given arg if it is a file, and otherwise return the contents by itself. This will return an error if the given path is a directory.

func FileSHA256

func FileSHA256(filePath string) ([]byte, error)

FileSHA256 calculates the SHA256 hash of the file at the given path.

func FindTFFiles

func FindTFFiles(rootPath string) ([]string, error)

FindTFFiles walks through the directory and returns all OpenTofu/Terraform files (.tf, .tofu, .tf.json, .tofu.json)

func FirstNonEmpty

func FirstNonEmpty[S ~[]E, E comparable](list S) E

FirstNonEmpty returns the first non-empty/non-zero element from the slice, or the zero value if none found.

func GenerateRandomSha256

func GenerateRandomSha256() (string, error)

func GetCacheDir

func GetCacheDir() (string, error)

GetCacheDir returns the global terragrunt cache directory for the current user.

func GetExitCode

func GetExitCode(err error) (int, error)

GetExitCode returns the exit code of a command. If the error does not implement errorCode or is not an exec.ExitError or *errors.MultiError type, the error is returned.

func GetFiltersFromFile

func GetFiltersFromFile(baseDir, filename string) ([]string, error)

GetFiltersFromFile returns a list of filter queries from the given filename, where each filter query starts on a new line.

func GetPathRelativeTo

func GetPathRelativeTo(path string, basePath string) (string, error)

GetPathRelativeTo returns the relative path you would have to take to get from basePath to path.

func GetRandomTime

func GetRandomTime(lowerBound, upperBound time.Duration) time.Duration

GetRandomTime gets a random time duration between the lower bound and upper bound. This is useful because some of our automated tests wound up flooding the AWS API all at once, leading to a "Subscriber limit exceeded" error. TODO: Some of the more exotic test cases fail, but it's not worth catching them given the intended use of this function.

func GetTempDir

func GetTempDir() (string, error)

GetTempDir returns the global terragrunt temp directory.

func GlobCanonicalPath

func GlobCanonicalPath(l log.Logger, basePath string, globPaths ...string) ([]string, error)

GlobCanonicalPath returns the canonical versions of the given glob paths, relative to the given base path.

func Grep

func Grep(regex *regexp.Regexp, glob string) (bool, error)

Grep returns true if the given regex can be found in any of the files matched by the given glob.

func HasPathPrefix

func HasPathPrefix(path, prefix string) bool

HasPathPrefix returns true if path starts with the given path prefix E.g. path="/foo/bar/biz", prefix="/foo/bar" -> true E.g. path="/foo/bar/biz", prefix="/foo/ba" -> false (because ba is not a directory path)

func IsCommandExecutable

func IsCommandExecutable(ctx context.Context, command string, args ...string) bool

IsCommandExecutable - returns true if a command can be executed without errors.

func IsDir

func IsDir(path string) bool

IsDir returns true if the path points to a directory.

func IsDirectoryEmpty

func IsDirectoryEmpty(dirPath string) (bool, error)

IsDirectoryEmpty - returns true if the given path exists and is a empty directory.

func IsFile

func IsFile(path string) bool

IsFile returns true if the path points to a file.

func IsSymLink(path string) bool

IsSymLink returns true if the given file is a symbolic link Per https://stackoverflow.com/a/18062079/2308858

func IsTFFile

func IsTFFile(path string) bool

IsTFFile checks if a given file is a Terraform/OpenTofu file (.tf, .tofu, .tf.json, .tofu.json)

func JoinTerraformModulePath

func JoinTerraformModulePath(modulesFolder string, path string) string

JoinTerraformModulePath joins two paths together with a double-slash between them, as this is what Terraform uses to identify where a "repo" ends and a path within the repo begins. Note: The Terraform docs only mention two forward-slashes, so it's not clear if on Windows those should be two back-slashes? https://www.terraform.io/docs/modules/sources.html

func KindOf

func KindOf(value any) reflect.Kind

KindOf returns the kind of the type or Invalid if value is nil.

func ListContainsSublist

func ListContainsSublist[S ~[]E, E comparable](list, sublist S) bool

ListContainsSublist returns true if an instance of the sublist can be found in the given list

func ListHasPrefix

func ListHasPrefix[S ~[]E, E comparable](list, prefix S) bool

ListHasPrefix returns true if list starts with the given prefix list

func ListTfFiles

func ListTfFiles(directoryPath string, walkWithSymlinks bool) ([]string, error)

ListTfFiles returns a list of all TF files in the specified directory.

func MatchSha256Checksum

func MatchSha256Checksum(file, filename []byte) []byte

MatchSha256Checksum returns the SHA256 checksum for the given file and filename.

func MatchesAny

func MatchesAny(regExps []string, s string) bool

func MergeSlices

func MergeSlices[S ~[]E, E cmp.Ordered](slicesToMerge ...S) S

MergeSlices combines multiple slices and removes duplicates. Note: This function sorts the result, so original order is not preserved.

func MoveFile

func MoveFile(source string, destination string) error

MoveFile attempts to rename a file from source to destination, if this fails due to invalid cross-device link it falls back to copying the file contents and deleting the original file.

func MustWalkTerraformOutput

func MustWalkTerraformOutput(value any, path ...string) any

MustWalkTerraformOutput is a helper utility to deeply return a value from a terraform output.

nil will be returned if the path is invalid

Using an example terraform output:
  a = {
    b = {
      c = "foo"
    }
    "d" = [
      1,
      2
    ]
  }

path ["a", "b", "c"] will return "foo"
path ["a", "d", "1"] will return 2
path ["a", "foo"] will return nil

func NewFileManifest

func NewFileManifest(logger log.Logger, manifestFolder string, manifestFile string) *fileManifest

func ParseTimestamp

func ParseTimestamp(ts string) (time.Time, error)

func PrefixedWriter

func PrefixedWriter(writer io.Writer, prefix string) io.Writer

func ReadFileAsString

func ReadFileAsString(path string) (string, error)

ReadFileAsString returns the contents of the file at the given path as a string.

func RegexFoundInTFFiles

func RegexFoundInTFFiles(workingDir string, pattern *regexp.Regexp) (bool, error)

RegexFoundInTFFiles walks through the directory and checks if any OpenTofu/Terraform files (.tf, .tofu, .tf.json, .tofu.json) contain the given regex pattern

func RemoveDuplicates

func RemoveDuplicates[S ~[]E, E cmp.Ordered](list S) S

RemoveDuplicates returns a new slice with duplicates removed. Note: This function sorts the result, so original order is not preserved.

func RemoveDuplicatesKeepLast

func RemoveDuplicatesKeepLast[S ~[]E, E comparable](list S) S

RemoveDuplicatesKeepLast returns a new slice with duplicates removed, keeping the last occurrence. Unlike RemoveDuplicates, this preserves the relative order of elements.

func SanitizePath

func SanitizePath(baseDir string, file string) (string, error)

SanitizePath resolves a file path within a base directory, returning the sanitized path or an error if it attempts to access anything outside the base directory.

func SplitPath

func SplitPath(path string) []string

SplitPath splits the given path into a list. E.g. "foo/bar/boo.txt" -> ["foo", "bar", "boo.txt"] E.g. "/foo/bar/boo.txt" -> ["", "foo", "bar", "boo.txt"] Notice that if path is absolute the resulting list will begin with an empty string.

func SplitUrls

func SplitUrls(s, sep string) []string

SplitUrls slices s into all substrings separated by sep and returns a slice of the substrings between those separators. Taking into account that the `=` sign can also be used as a git tag, e.g. `git@github.com/test.git?ref=feature`

func TerragruntExcludes

func TerragruntExcludes(path string) bool

func UniqueID

func UniqueID() string

UniqueID returns a unique (ish) id we can use to name resources so they don't conflict with each other. Uses base 62 to generate a 6 character string that's unlikely to collide with the handful of tests we run in parallel. Based on code here:

http://stackoverflow.com/a/9543797/483528
func WalkDirWithSymlinks(root string, externalWalkFn fs.WalkDirFunc) error

WalkDirWithSymlinks traverses a directory tree using filepath.WalkDir, following symbolic links and calling the provided function for each file or directory encountered. It handles both regular symlinks and circular symlinks without getting into infinite loops.

func WriteFileWithSamePermissions

func WriteFileWithSamePermissions(source string, destination string, contents []byte) error

WriteFileWithSamePermissions writes a file to the given destination with the given contents using the same permissions as the file at source.

func WriterNotifier

func WriterNotifier(writer io.Writer, notifyFn func(p []byte)) io.Writer

WriterNotifier fires `notifyFn` once when the first data comes at `Writer(p []byte)` and forwards data further to the specified `writer`.

Types

type CmdOutput

type CmdOutput struct {
	Stdout bytes.Buffer
	Stderr bytes.Buffer
}

type FatalError

type FatalError struct {
	Underlying error
}

FatalError is error interface for cases that should not be retried.

func (FatalError) Error

func (err FatalError) Error() string

func (FatalError) Unwrap

func (err FatalError) Unwrap() error

type KeyLocks

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

KeyLocks manages a map of locks, each associated with a string key.

func NewKeyLocks

func NewKeyLocks() *KeyLocks

NewKeyLocks creates a new instance of KeyLocks.

func (*KeyLocks) Lock

func (kl *KeyLocks) Lock(key string)

Lock acquires the lock for the given key.

func (*KeyLocks) Unlock

func (kl *KeyLocks) Unlock(key string)

Unlock releases the lock for the given key.

type Lockfile

type Lockfile struct {
	*flock.Flock
}

func NewLockfile

func NewLockfile(filename string) *Lockfile

func (*Lockfile) TryLock

func (lockfile *Lockfile) TryLock() error

func (*Lockfile) Unlock

func (lockfile *Lockfile) Unlock() error

type MaxRetriesExceeded

type MaxRetriesExceeded struct {
	Description string
	MaxRetries  int
}

MaxRetriesExceeded is an error that occurs when the maximum amount of retries is exceeded.

func (MaxRetriesExceeded) Error

func (err MaxRetriesExceeded) Error() string

type PathIsNotDirectory

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

PathIsNotDirectory is returned when the given path is unexpectedly not a directory.

func (PathIsNotDirectory) Error

func (err PathIsNotDirectory) Error() string

type PathIsNotFile

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

PathIsNotFile is returned when the given path is unexpectedly not a file.

func (PathIsNotFile) Error

func (err PathIsNotFile) Error() string

type ProcessExecutionError

type ProcessExecutionError struct {
	Err            error
	WorkingDir     string
	Command        string
	Args           []string
	Output         CmdOutput
	DisableSummary bool
}

ProcessExecutionError - error returned when a command fails, contains StdOut and StdErr

func (ProcessExecutionError) Error

func (err ProcessExecutionError) Error() string

func (ProcessExecutionError) ExitStatus

func (err ProcessExecutionError) ExitStatus() (int, error)

func (ProcessExecutionError) Unwrap

func (err ProcessExecutionError) Unwrap() error

type TrapWriter

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

TrapWriter intercepts any messages received from the `writer` output. Used when necessary to filter logs from terraform.

func NewTrapWriter

func NewTrapWriter(writer io.Writer) *TrapWriter

NewTrapWriter returns a new TrapWriter instance.

func (*TrapWriter) Flush

func (trap *TrapWriter) Flush() error

Flush flushes intercepted messages to the writer.

func (*TrapWriter) Write

func (trap *TrapWriter) Write(d []byte) (int, error)

Write implements `io.Writer` interface.

Jump to

Keyboard shortcuts

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