diff --git a/.github/workflows/cd/deploy-app.sh b/.github/workflows/cd/deploy-app.sh index 902f4837..cc7b3c85 100755 --- a/.github/workflows/cd/deploy-app.sh +++ b/.github/workflows/cd/deploy-app.sh @@ -72,7 +72,6 @@ WORKERS=${WORKERS:-4} USER=${USER:-root} compose_src=$(cat $LOCAL_WORK_DIR/docker-compose.yml) -config_src=$(cat $LOCAL_WORK_DIR/configs/config.yaml) function remote_run_commands() { ret="" diff --git a/Dockerfile b/Dockerfile index ce75b1b7..ea96d31d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -59,7 +59,6 @@ RUN mkdir -p ./assets/cache && \ mkdir -p ./assets/games && \ mkdir -p ./libretro && \ mkdir -p /root/.cr -COPY configs ./configs COPY web ./web ARG VERSION COPY scripts/version.sh version.sh diff --git a/cmd/coordinator/main.go b/cmd/coordinator/main.go index a6e8fdbf..ce094f6a 100644 --- a/cmd/coordinator/main.go +++ b/cmd/coordinator/main.go @@ -10,12 +10,12 @@ import ( var Version = "?" func main() { - conf := config.NewCoordinatorConfig() + conf, paths := config.NewCoordinatorConfig() conf.ParseFlags() log := logger.NewConsole(conf.Coordinator.Debug, "c", false) log.Info().Msgf("version %s", Version) - log.Info().Msgf("conf: v%v", conf.Version) + log.Info().Msgf("conf: v%v, loaded: %v", conf.Version, paths) if log.GetLevel() < logger.InfoLevel { log.Debug().Msgf("conf: %+v", conf) } diff --git a/cmd/worker/main.go b/cmd/worker/main.go index a697b4f4..f6157d09 100644 --- a/cmd/worker/main.go +++ b/cmd/worker/main.go @@ -13,12 +13,12 @@ import ( var Version = "?" func run() { - conf := config.NewWorkerConfig() + conf, paths := config.NewWorkerConfig() conf.ParseFlags() log := logger.NewConsole(conf.Worker.Debug, "w", false) log.Info().Msgf("version %s", Version) - log.Info().Msgf("conf: v%v", conf.Version) + log.Info().Msgf("conf: v%v, loaded: %v", conf.Version, paths) if log.GetLevel() < logger.InfoLevel { log.Debug().Msgf("conf: %+v", conf) } diff --git a/configs/config.yaml b/pkg/config/config.yaml similarity index 100% rename from configs/config.yaml rename to pkg/config/config.yaml diff --git a/pkg/config/coordinator.go b/pkg/config/coordinator.go index be7f71e1..dd904880 100644 --- a/pkg/config/coordinator.go +++ b/pkg/config/coordinator.go @@ -34,8 +34,8 @@ const SelectByPing = "ping" // allows custom config path var coordinatorConfigPath string -func NewCoordinatorConfig() (conf CoordinatorConfig) { - err := LoadConfig(&conf, coordinatorConfigPath) +func NewCoordinatorConfig() (conf CoordinatorConfig, paths []string) { + paths, err := LoadConfig(&conf, coordinatorConfigPath) if err != nil { panic(err) } diff --git a/pkg/config/loader.go b/pkg/config/loader.go index 3ba6c3df..11a95583 100644 --- a/pkg/config/loader.go +++ b/pkg/config/loader.go @@ -5,6 +5,7 @@ import ( "path/filepath" "strings" + _ "embed" "github.com/knadh/koanf/maps" "github.com/knadh/koanf/v2" "gopkg.in/yaml.v3" @@ -12,6 +13,11 @@ import ( const EnvPrefix = "CLOUD_GAME_" +var ( + //go:embed config.yaml + conf Bytes +) + type Kv = map[string]any type Bytes []byte @@ -104,7 +110,7 @@ var k = koanf.New("_") // LoadConfig loads a configuration file into the given struct. // The path param specifies a custom path to the configuration file. // Reads and puts environment variables with the prefix CLOUD_GAME_. -func LoadConfig(config any, path string) (err error) { +func LoadConfig(config any, path string) (loaded []string, err error) { dirs := []string{".", "configs", "../../../configs"} if path != "" { dirs = append([]string{path}, dirs...) @@ -116,23 +122,31 @@ func LoadConfig(config any, path string) (err error) { dirs = append(dirs, homeDir) } + if err := k.Load(&conf, &YAML{}); err != nil { + return nil, err + } + conf = nil + loaded = append(loaded, "default") + for _, dir := range dirs { - f := File(filepath.Join(filepath.Clean(dir), "config.yaml")) + path := filepath.Join(filepath.Clean(dir), "config.yaml") + f := File(path) if _, err := os.Stat(string(f)); !os.IsNotExist(err) { if err := k.Load(&f, &YAML{}); err != nil { - return err + return loaded, err } + loaded = append(loaded, path) } } env := Env(EnvPrefix) if err := k.Load(&env, nil); err != nil { - return err + return loaded, err } if err := k.Unmarshal("", config); err != nil { - return err + return loaded, err } - return nil + return loaded, nil } diff --git a/pkg/config/loader_test.go b/pkg/config/loader_test.go index b97fed5d..355f19a4 100644 --- a/pkg/config/loader_test.go +++ b/pkg/config/loader_test.go @@ -17,7 +17,7 @@ func TestConfigEnv(t *testing.T) { _ = os.Unsetenv("CLOUD_GAME_EMULATOR_LIBRETRO_CORES_LIST_PCSX_OPTIONS__PCSX_REARMED_DRC") }() - err := LoadConfig(&out, "../../configs") + _, err := LoadConfig(&out, "") if err != nil { t.Fatal(err) } diff --git a/pkg/config/worker.go b/pkg/config/worker.go index e53201c1..6436feea 100644 --- a/pkg/config/worker.go +++ b/pkg/config/worker.go @@ -70,8 +70,8 @@ type Video struct { // allows custom config path var workerConfigPath string -func NewWorkerConfig() (conf WorkerConfig) { - err := LoadConfig(&conf, workerConfigPath) +func NewWorkerConfig() (conf WorkerConfig, paths []string) { + paths, err := LoadConfig(&conf, workerConfigPath) if err != nil { panic(err) } diff --git a/pkg/worker/emulator/libretro/nanoarch_test.go b/pkg/worker/emulator/libretro/nanoarch_test.go index 8de74be3..a94c8610 100644 --- a/pkg/worker/emulator/libretro/nanoarch_test.go +++ b/pkg/worker/emulator/libretro/nanoarch_test.go @@ -47,10 +47,9 @@ type EmulatorPaths struct { // Make sure you call shutdownEmulator(). func GetEmulatorMock(room string, system string) *EmulatorMock { rootPath := getRootPath() - configPath := rootPath + "configs/" var conf config.WorkerConfig - if err := config.LoadConfig(&conf, configPath); err != nil { + if _, err := config.LoadConfig(&conf, ""); err != nil { panic(err) } diff --git a/pkg/worker/room_test.go b/pkg/worker/room_test.go index d0a3842c..1b33aa81 100644 --- a/pkg/worker/room_test.go +++ b/pkg/worker/room_test.go @@ -60,7 +60,6 @@ type roomMockConfig struct { // Store absolute path to test games var whereIsGames = getRootPath() + "assets/games/" -var whereIsConfigs = getRootPath() + "configs/" var testTempDir = filepath.Join(os.TempDir(), "cloud-game-core-tests") // games @@ -204,7 +203,7 @@ func dumpCanvas(frame *image2.Frame, name string, caption string, path string) { // getRoomMock returns mocked Room struct. func getRoomMock(cfg roomMockConfig) roomMock { var conf config.WorkerConfig - if err := config.LoadConfig(&conf, whereIsConfigs); err != nil { + if _, err := config.LoadConfig(&conf, ""); err != nil { panic(err) }