diff --git a/main.go b/main.go index f7a5ef4..73e4e72 100644 --- a/main.go +++ b/main.go @@ -4,6 +4,7 @@ import ( "fmt" "net/netip" + "github.com/google/uuid" "github.com/thefeli73/polemos/mtdaws" "github.com/thefeli73/polemos/state" ) @@ -72,7 +73,9 @@ func indexInstance(config state.Config, cloudID string, serviceIP netip.Addr) (s break; } } + u := uuid.New() newService := state.Service{ + ID: state.CustomUUID(u), CloudID: cloudID, ServiceIP: serviceIP} return newService, found diff --git a/state/config.go b/state/config.go index 628df3f..a74c59e 100644 --- a/state/config.go +++ b/state/config.go @@ -6,6 +6,7 @@ import ( "net/netip" "os" + "github.com/google/uuid" "gopkg.in/yaml.v3" ) @@ -21,6 +22,7 @@ type mtdconf struct { // Service contains all necessary information about a service to identify it in the cloud as well as configuring a proxy for it type Service struct { + ID CustomUUID `yaml:"id"` CloudID string `yaml:"cloud_id"` EntryIP netip.Addr `yaml:"entry_ip"` EntryPort uint16 `yaml:"entry_port"` @@ -28,11 +30,29 @@ type Service struct { ServicePort uint16 `yaml:"service_port"` } +// CustomUUID is an alias for uuid.UUID to enable custom unmarshal function +type CustomUUID uuid.UUID + type aws struct { Regions []string `yaml:"regions"` CredentialsPath string `yaml:"credentials_path"` } +// UnmarshalYAML parses uuid in yaml to CustomUUID type +func (u *CustomUUID) UnmarshalYAML(value *yaml.Node) error { + id, err := uuid.Parse(value.Value) + if err != nil { + return err + } + *u = CustomUUID(id) + return nil +} + +// MarshalYAML parses CustomUUID type to uuid string for yaml +func (u CustomUUID) MarshalYAML() (interface{}, error) { + return uuid.UUID(u).String(), nil +} + // LoadConf loads config from a yaml file func LoadConf(filename string) (Config) { var config Config