87 lines
1.9 KiB
Go
87 lines
1.9 KiB
Go
// Copyright (c) HashiCorp, Inc.
|
|
// SPDX-License-Identifier: BUSL-1.1
|
|
|
|
package config
|
|
|
|
import (
|
|
"io/ioutil"
|
|
"os"
|
|
"path/filepath"
|
|
|
|
"github.com/hashicorp/hcl/v2"
|
|
"github.com/hashicorp/hcl/v2/hclsimple"
|
|
|
|
"github.com/hashicorp/vagrant/internal/pkg/defaults"
|
|
)
|
|
|
|
// Config is the core configuration for connecting to the
|
|
// Vagrant server/runners.
|
|
// This does not include Vagrantfile type config
|
|
type Config struct {
|
|
Runner *Runner `hcl:"runner,block" default:"{}"`
|
|
Labels map[string]string `hcl:"labels,optional"`
|
|
|
|
pathData map[string]string
|
|
ctx *hcl.EvalContext
|
|
}
|
|
|
|
// Runner is the configuration for supporting runners in this project.
|
|
type Runner struct {
|
|
// Enabled is whether or not runners are enabled. If this is false
|
|
// then the "-remote" flag will not work.
|
|
Enabled bool
|
|
|
|
// DataSource is the default data source when a remote job is queued.
|
|
DataSource *DataSource
|
|
}
|
|
|
|
// DataSource configures the data source for the runner.
|
|
type DataSource struct {
|
|
Type string
|
|
Body hcl.Body `hcl:",remain"`
|
|
}
|
|
|
|
// Load loads the configuration file from the given path.
|
|
func Load(path string, pwd string) (*Config, error) {
|
|
// We require an absolute path for the path so we can set the path vars
|
|
if path != "" && !filepath.IsAbs(path) {
|
|
var err error
|
|
path, err = filepath.Abs(path)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
}
|
|
|
|
// If we have no pwd, then create a temporary directory
|
|
if pwd == "" {
|
|
td, err := ioutil.TempDir("", "vagrant-config")
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer os.RemoveAll(td)
|
|
pwd = td
|
|
}
|
|
|
|
// Setup our initial variable set
|
|
pathData := map[string]string{
|
|
"pwd": pwd,
|
|
"basisfile": path,
|
|
}
|
|
|
|
// Decode
|
|
var cfg Config
|
|
// Build our context
|
|
ctx := EvalContext(nil, pwd).NewChild()
|
|
addPathValue(ctx, pathData)
|
|
|
|
// Decode
|
|
if err := hclsimple.DecodeFile(path, ctx, &cfg); err != nil {
|
|
return nil, err
|
|
}
|
|
if err := defaults.Set(&cfg); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &cfg, nil
|
|
}
|