Documentation ¶
Index ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func IsLocalSource ¶
Returns true if the given URL refers to a path on the local file system
Types ¶
type TerraformSource ¶
type TerraformSource struct { // A canonical version of RawSource, in URL format CanonicalSourceURL *url.URL // The folder where we should download the source to DownloadDir string // The folder in DownloadDir that should be used as the working directory for Terraform WorkingDir string // The path to a file in DownloadDir that stores the version number of the code VersionFile string }
This struct represents information about Terraform source code that needs to be downloaded
func NewTerraformSource ¶
func NewTerraformSource(source string, downloadDir string, workingDir string, logger *logrus.Entry) (*TerraformSource, error)
Take the given source path and create a TerraformSource struct from it, including the folder where the source should be downloaded to. Our goal is to reuse the download folder for the same source URL between Terragrunt runs. Otherwise, for every Terragrunt command, you'd have to wait for Terragrunt to download your Terraform code, download that code's dependencies (terraform get), and configure remote state (terraform remote config), which is very slow.
To maximize reuse, given a working directory w and a source URL s, we download code from S into the folder /T/W/H where:
- S is the part of s before the double-slash (//). This typically represents the root of the repo (e.g. github.com/foo/infrastructure-modules). We download the entire repo so that relative paths to other files in that repo resolve correctly. If no double-slash is specified, all of s is used.
- T is the OS temp dir (e.g. /tmp).
- W is the base 64 encoded sha1 hash of w. This ensures that if you are running Terragrunt concurrently in multiple folders (e.g. during automated tests), then even if those folders are using the same source URL s, they do not overwrite each other.
- H is the base 64 encoded sha1 of S without its query string. For remote source URLs (e.g. Git URLs), this is based on the assumption that the scheme/host/path of the URL (e.g. git::github.com/foo/bar) identifies the repo, and we always want to download the same repo into the same folder (see the encodeSourceName method). We also assume the version of the module is stored in the query string (e.g. ref=v0.0.3), so we store the base 64 encoded sha1 of the query string in a file called .terragrunt-source-version within /T/W/H.
The downloadTerraformSourceIfNecessary decides when we should download the Terraform code and when not to. It uses the following rules:
- Always download source URLs pointing to local file paths.
- Only download source URLs pointing to remote paths if /T/W/H doesn't already exist or, if it does exist, if the version number in /T/W/H/.terragrunt-source-version doesn't match the current version.
func (TerraformSource) EncodeSourceVersion ¶
func (terraformSource TerraformSource) EncodeSourceVersion() string
Encode a version number for the given source. When calculating a version number, we take the query string of the source URL, calculate its sha1, and base 64 encode it. For remote URLs (e.g. Git URLs), this is based on the assumption that the scheme/host/path of the URL (e.g. git::github.com/foo/bar) identifies the module name and the query string (e.g. ?ref=v0.0.3) identifies the version. For local file paths, there is no query string, so the same file path (/foo/bar) is always considered the same version. See also the encodeSourceName and ProcessTerraformSource methods.
func (*TerraformSource) String ¶
func (src *TerraformSource) String() string
func (TerraformSource) WriteVersionFile ¶
func (terraformSource TerraformSource) WriteVersionFile() error
Write a file into the DownloadDir that contains the version number of this source code. The version number is calculated using the EncodeSourceVersion method.