diff --git a/cmd/jpictl/config.go b/cmd/jpictl/config.go index a7649fc..01e9207 100644 --- a/cmd/jpictl/config.go +++ b/cmd/jpictl/config.go @@ -1,20 +1,56 @@ package main -import "git.jpi.io/amery/jpictl/pkg/cluster" +import ( + "os" + + "darvaza.org/core" + + "git.jpi.io/amery/jpictl/pkg/cluster" +) + +const ( + // DefaultConfigFile is read if -f/--config-file isn't specified. + // If it doesn't exist, m/ will be scanned + DefaultConfigFile = "cloud.yaml" +) // Config describes the repository type Config struct { Base string Domain string + + ConfigFile *string } var cfg = &Config{ Base: "m", Domain: "jpi.cloud", + + ConfigFile: rootCmd.PersistentFlags(). + StringP("config-file", "f", DefaultConfigFile, "config file (JSON or YAML)"), } // LoadZones loads all zones and machines in the config directory +// or file func (cfg *Config) LoadZones(resolve bool) (*cluster.Cluster, error) { + configFile := *cfg.ConfigFile + + // try config file first + zones, err := cluster.NewFromConfig(configFile, + cluster.ResolvePublicAddresses(resolve), + cluster.WithLogger(log), + ) + + switch { + case err == nil: + // file was good + return zones, nil + case !os.IsNotExist(err) || configFile != DefaultConfigFile: + // file was bad + return nil, core.Wrapf(err, "NewFromConfig(%q)", configFile) + } + + // default file doesn't exist. scan instead. return cluster.NewFromDirectory(cfg.Base, cfg.Domain, cluster.ResolvePublicAddresses(resolve), cluster.WithLogger(log),