terraform/config.go

110 lines
2.9 KiB
Go
Raw Normal View History

//go:generate go run ./scripts/generate-plugins.go
2014-05-26 02:39:44 +02:00
package main
import (
2014-08-19 18:56:50 +02:00
"fmt"
"io/ioutil"
"log"
"os"
2014-08-19 18:56:50 +02:00
"github.com/hashicorp/hcl"
"github.com/hashicorp/terraform/command"
2014-05-26 02:39:44 +02:00
)
// Config is the structure of the configuration for the Terraform CLI.
//
// This is not the configuration for Terraform itself. That is in the
// "config" package.
type Config struct {
2014-07-09 23:47:37 +02:00
Providers map[string]string
Provisioners map[string]string
2014-10-13 23:05:29 +02:00
DisableCheckpoint bool `hcl:"disable_checkpoint"`
DisableCheckpointSignature bool `hcl:"disable_checkpoint_signature"`
2014-05-26 02:39:44 +02:00
}
// BuiltinConfig is the built-in defaults for the configuration. These
// can be overridden by user configurations.
var BuiltinConfig Config
// PluginOverrides are paths that override discovered plugins, set from
// the config file.
var PluginOverrides command.PluginOverrides
2014-07-03 21:01:20 +02:00
// ConfigFile returns the default path to the configuration file.
//
// On Unix-like systems this is the ".terraformrc" file in the home directory.
// On Windows, this is the "terraform.rc" file in the application data
// directory.
func ConfigFile() (string, error) {
2014-08-21 07:24:35 +02:00
return configFile()
}
// ConfigDir returns the configuration directory for Terraform.
func ConfigDir() (string, error) {
return configDir()
}
2014-05-26 02:39:44 +02:00
// LoadConfig loads the CLI configuration from ".terraformrc" files.
func LoadConfig(path string) (*Config, error) {
2014-08-19 18:56:50 +02:00
// Read the HCL file and prepare for parsing
d, err := ioutil.ReadFile(path)
if err != nil {
return nil, fmt.Errorf(
"Error reading %s: %s", path, err)
2014-05-26 02:39:44 +02:00
}
2014-08-19 18:56:50 +02:00
// Parse it
obj, err := hcl.Parse(string(d))
2014-05-26 02:39:44 +02:00
if err != nil {
2014-08-19 18:56:50 +02:00
return nil, fmt.Errorf(
"Error parsing %s: %s", path, err)
2014-05-26 02:39:44 +02:00
}
// Build up the result
var result Config
2014-08-19 18:56:50 +02:00
if err := hcl.DecodeObject(&result, obj); err != nil {
2014-05-26 02:39:44 +02:00
return nil, err
}
// Replace all env vars
for k, v := range result.Providers {
result.Providers[k] = os.ExpandEnv(v)
}
for k, v := range result.Provisioners {
result.Provisioners[k] = os.ExpandEnv(v)
}
2014-05-26 02:39:44 +02:00
return &result, nil
}
// Merge merges two configurations and returns a third entirely
// new configuration with the two merged.
func (c1 *Config) Merge(c2 *Config) *Config {
var result Config
result.Providers = make(map[string]string)
2014-07-09 23:47:37 +02:00
result.Provisioners = make(map[string]string)
for k, v := range c1.Providers {
result.Providers[k] = v
}
for k, v := range c2.Providers {
if v1, ok := c1.Providers[k]; ok {
log.Printf("[INFO] Local %s provider configuration '%s' overrides '%s'", k, v, v1)
}
result.Providers[k] = v
}
2014-07-09 23:47:37 +02:00
for k, v := range c1.Provisioners {
result.Provisioners[k] = v
}
for k, v := range c2.Provisioners {
if v1, ok := c1.Provisioners[k]; ok {
log.Printf("[INFO] Local %s provisioner configuration '%s' overrides '%s'", k, v, v1)
}
2014-07-09 23:47:37 +02:00
result.Provisioners[k] = v
}
result.DisableCheckpoint = c1.DisableCheckpoint || c2.DisableCheckpoint
result.DisableCheckpointSignature = c1.DisableCheckpointSignature || c2.DisableCheckpointSignature
return &result
}