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
}