Skip to content
Merged
2 changes: 1 addition & 1 deletion cmd/arduino-app-cli/app/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -50,5 +50,5 @@ func Load(idOrPath string) (app.ArduinoApp, error) {
return app.ArduinoApp{}, fmt.Errorf("invalid app path: %s", idOrPath)
}

return app.Load(id.ToPath().String())
return app.Load(id.ToPath())
}
4 changes: 2 additions & 2 deletions cmd/arduino-app-cli/internal/servicelocator/servicelocator.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,11 +42,11 @@ func Init(cfg config.Configuration) {

var (
GetBricksIndex = sync.OnceValue(func() *bricksindex.BricksIndex {
return f.Must(bricksindex.GenerateBricksIndexFromFile(GetStaticStore().GetAssetsFolder()))
return f.Must(bricksindex.Load(GetStaticStore().GetAssetsFolder()))
})

GetModelsIndex = sync.OnceValue(func() *modelsindex.ModelsIndex {
return f.Must(modelsindex.GenerateModelsIndexFromFile(GetStaticStore().GetAssetsFolder()))
return f.Must(modelsindex.Load(GetStaticStore().GetAssetsFolder()))
})

GetProvisioner = sync.OnceValue(func() *orchestrator.Provision {
Expand Down
2 changes: 1 addition & 1 deletion internal/api/handlers/app_delete.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ func HandleAppDelete(
return
}

app, err := app.Load(id.ToPath().String())
app, err := app.Load(id.ToPath())
if err != nil {
slog.Error("Unable to parse the app.yaml", slog.String("error", err.Error()), slog.String("path", id.String()))
render.EncodeResponse(w, http.StatusInternalServerError, models.ErrorResponse{Details: "unable to find the app"})
Expand Down
4 changes: 2 additions & 2 deletions internal/api/handlers/app_details.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ func HandleAppDetails(
return
}

app, err := app.Load(id.ToPath().String())
app, err := app.Load(id.ToPath())
if err != nil {
slog.Error("Unable to parse the app.yaml", slog.String("error", err.Error()), slog.String("path", id.String()))
render.EncodeResponse(w, http.StatusInternalServerError, models.ErrorResponse{Details: "unable to find the app"})
Expand Down Expand Up @@ -81,7 +81,7 @@ func HandleAppDetailsEdits(
render.EncodeResponse(w, http.StatusPreconditionFailed, models.ErrorResponse{Details: "invalid id"})
return
}
appToEdit, err := app.Load(id.ToPath().String())
appToEdit, err := app.Load(id.ToPath())
if err != nil {
slog.Error("Unable to parse the app.yaml", slog.String("error", err.Error()), slog.String("path", id.String()))
render.EncodeResponse(w, http.StatusInternalServerError, models.ErrorResponse{Details: "unable to find the app"})
Expand Down
2 changes: 1 addition & 1 deletion internal/api/handlers/app_logs.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ func HandleAppLogs(
return
}

app, err := app.Load(id.ToPath().String())
app, err := app.Load(id.ToPath())
if err != nil {
slog.Error("Unable to parse the app.yaml", slog.String("error", err.Error()), slog.String("path", id.String()))
render.EncodeResponse(w, http.StatusInternalServerError, models.ErrorResponse{Details: "unable to find the app"})
Expand Down
2 changes: 1 addition & 1 deletion internal/api/handlers/app_ports.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ func HandleAppPorts(
return
}

app, err := app.Load(id.ToPath().String())
app, err := app.Load(id.ToPath())
if err != nil {
slog.Error("Unable to parse the app.yaml", slog.String("error", err.Error()), slog.String("path", id.String()))
render.EncodeResponse(w, http.StatusInternalServerError, models.ErrorResponse{Details: "unable to find the app"})
Expand Down
6 changes: 3 additions & 3 deletions internal/api/handlers/app_sketch_libs.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ func HandleSketchAddLibrary(idProvider *app.IDProvider) http.HandlerFunc {
render.EncodeResponse(w, http.StatusBadRequest, models.ErrorResponse{Details: "cannot alter examples"})
return
}
app, err := app.Load(id.ToPath().String())
app, err := app.Load(id.ToPath())

// Get query param addDeps (default false)
addDeps, _ := strconv.ParseBool(r.URL.Query().Get("add_deps"))
Expand Down Expand Up @@ -78,7 +78,7 @@ func HandleSketchRemoveLibrary(idProvider *app.IDProvider) http.HandlerFunc {
render.EncodeResponse(w, http.StatusBadRequest, models.ErrorResponse{Details: "cannot alter examples"})
return
}
app, err := app.Load(id.ToPath().String())
app, err := app.Load(id.ToPath())
if err != nil {
render.EncodeResponse(w, http.StatusInternalServerError, models.ErrorResponse{Details: "unable to find the app"})
return
Expand Down Expand Up @@ -114,7 +114,7 @@ func HandleSketchListLibraries(idProvider *app.IDProvider) http.HandlerFunc {
render.EncodeResponse(w, http.StatusPreconditionFailed, models.ErrorResponse{Details: "invalid id"})
return
}
app, err := app.Load(id.ToPath().String())
app, err := app.Load(id.ToPath())
if err != nil {
render.EncodeResponse(w, http.StatusInternalServerError, models.ErrorResponse{Details: "unable to find the app"})
return
Expand Down
2 changes: 1 addition & 1 deletion internal/api/handlers/app_start.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ func HandleAppStart(
return
}

app, err := app.Load(id.ToPath().String())
app, err := app.Load(id.ToPath())
if err != nil {
slog.Error("Unable to parse the app.yaml", slog.String("error", err.Error()), slog.String("path", id.String()))
render.EncodeResponse(w, http.StatusInternalServerError, models.ErrorResponse{Details: "unable to find the app"})
Expand Down
2 changes: 1 addition & 1 deletion internal/api/handlers/app_stop.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ func HandleAppStop(
return
}

app, err := app.Load(id.ToPath().String())
app, err := app.Load(id.ToPath())
if err != nil {
slog.Error("Unable to parse the app.yaml", slog.String("error", err.Error()), slog.String("path", id.String()))
render.EncodeResponse(w, http.StatusInternalServerError, models.ErrorResponse{Details: "unable to find the app"})
Expand Down
10 changes: 5 additions & 5 deletions internal/api/handlers/bricks.go
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ func HandleAppBrickInstancesList(
}
appPath := appId.ToPath()

app, err := app.Load(appPath.String())
app, err := app.Load(appPath)
if err != nil {
slog.Error("Unable to parse the app.yaml", slog.String("error", err.Error()), slog.String("path", appId.String()))
render.EncodeResponse(w, http.StatusInternalServerError, models.ErrorResponse{Details: "unable to find the app"})
Expand Down Expand Up @@ -85,7 +85,7 @@ func HandleAppBrickInstanceDetails(
}
appPath := appId.ToPath()

app, err := app.Load(appPath.String())
app, err := app.Load(appPath)
if err != nil {
slog.Error("Unable to parse the app.yaml", slog.String("error", err.Error()), slog.String("path", appId.String()))
render.EncodeResponse(w, http.StatusInternalServerError, models.ErrorResponse{Details: "unable to find the app"})
Expand Down Expand Up @@ -120,7 +120,7 @@ func HandleBrickCreate(
}
appPath := appId.ToPath()

app, err := app.Load(appPath.String())
app, err := app.Load(appPath)
if err != nil {
slog.Error("Unable to parse the app.yaml", slog.String("error", err.Error()), slog.String("path", appId.String()))
render.EncodeResponse(w, http.StatusInternalServerError, models.ErrorResponse{Details: "unable to find the app"})
Expand Down Expand Up @@ -190,7 +190,7 @@ func HandleBrickUpdates(
}
appPath := appId.ToPath()

app, err := app.Load(appPath.String())
app, err := app.Load(appPath)
if err != nil {
slog.Error("Unable to parse the app.yaml", slog.String("error", err.Error()), slog.String("path", appId.String()))
render.EncodeResponse(w, http.StatusInternalServerError, models.ErrorResponse{Details: "unable to find the app"})
Expand Down Expand Up @@ -236,7 +236,7 @@ func HandleBrickDelete(
}
appPath := appId.ToPath()

app, err := app.Load(appPath.String())
app, err := app.Load(appPath)
if err != nil {
slog.Error("Unable to parse the app.yaml", slog.String("error", err.Error()), slog.String("path", appId.String()))
render.EncodeResponse(w, http.StatusInternalServerError, models.ErrorResponse{Details: "unable to find the app"})
Expand Down
2 changes: 1 addition & 1 deletion internal/e2e/daemon/brick_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ func TestBricksList(t *testing.T) {
require.NoError(t, err)

staticStore := store.NewStaticStore(paths.New("testdata", "assets", cfg.RunnerVersion).String())
brickIndex, err := bricksindex.GenerateBricksIndexFromFile(staticStore.GetAssetsFolder())
brickIndex, err := bricksindex.Load(staticStore.GetAssetsFolder())
require.NoError(t, err)

// Compare the response with the bricks index
Expand Down
21 changes: 10 additions & 11 deletions internal/orchestrator/app/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,26 +37,25 @@ type ArduinoApp struct {

// Load creates an App instance by reading all the files composing an app and grouping them
// by file type.
func Load(appPath string) (ArduinoApp, error) {
path := paths.New(appPath)
if path == nil {
func Load(appPath *paths.Path) (ArduinoApp, error) {
if appPath == nil {
return ArduinoApp{}, errors.New("empty app path")
}

exist, err := path.IsDirCheck()
exist, err := appPath.IsDirCheck()
if err != nil {
return ArduinoApp{}, fmt.Errorf("app path is not valid: %w", err)
}
if !exist {
return ArduinoApp{}, fmt.Errorf("app path must be a directory: %s", path)
return ArduinoApp{}, fmt.Errorf("app path must be a directory: %s", appPath)
}
path, err = path.Abs()
appPath, err = appPath.Abs()
if err != nil {
return ArduinoApp{}, fmt.Errorf("cannot get absolute path for app: %w", err)
}

app := ArduinoApp{
FullPath: path,
FullPath: appPath,
Descriptor: AppDescriptor{},
}

Expand All @@ -71,13 +70,13 @@ func Load(appPath string) (ArduinoApp, error) {
return ArduinoApp{}, errors.New("descriptor app.yaml file missing from app")
}

if path.Join("python", "main.py").Exist() {
app.MainPythonFile = path.Join("python", "main.py")
if appPath.Join("python", "main.py").Exist() {
app.MainPythonFile = appPath.Join("python", "main.py")
}

if path.Join("sketch", "sketch.ino").Exist() {
if appPath.Join("sketch", "sketch.ino").Exist() {
// TODO: check sketch casing?
app.MainSketchPath = path.Join("sketch")
app.MainSketchPath = appPath.Join("sketch")
}

if app.MainPythonFile == nil && app.MainSketchPath == nil {
Expand Down
19 changes: 13 additions & 6 deletions internal/orchestrator/app/app_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,27 +25,34 @@ import (
)

func TestLoad(t *testing.T) {
t.Run("it fails if the app path is nil", func(t *testing.T) {
app, err := Load(nil)
assert.Error(t, err)
assert.Empty(t, app)
assert.Contains(t, err.Error(), "empty app path")
})

t.Run("it fails if the app path is empty", func(t *testing.T) {
app, err := Load("")
app, err := Load(paths.New(""))
assert.Error(t, err)
assert.Empty(t, app)
assert.Contains(t, err.Error(), "empty app path")
})

t.Run("it fails if the app path exist but it's a file", func(t *testing.T) {
_, err := Load("testdata/app.yaml")
_, err := Load(paths.New("testdata/app.yaml"))
assert.Error(t, err)
assert.Contains(t, err.Error(), "app path must be a directory")
})

t.Run("it fails if the app path does not exist", func(t *testing.T) {
_, err := Load("testdata/this-folder-does-not-exist")
_, err := Load(paths.New("testdata/this-folder-does-not-exist"))
assert.Error(t, err)
assert.Contains(t, err.Error(), "app path is not valid")
})

t.Run("it loads an app correctly", func(t *testing.T) {
app, err := Load("testdata/AppSimple")
app, err := Load(paths.New("testdata/AppSimple"))
assert.NoError(t, err)
assert.NotEmpty(t, app)

Expand All @@ -61,7 +68,7 @@ func TestMissingDescriptor(t *testing.T) {
appFolderPath := paths.New("testdata", "MissingDescriptor")

// Load app
app, err := Load(appFolderPath.String())
app, err := Load(appFolderPath)
assert.Error(t, err)
assert.ErrorContains(t, err, "descriptor app.yaml file missing from app")
assert.Empty(t, app)
Expand All @@ -71,7 +78,7 @@ func TestMissingMains(t *testing.T) {
appFolderPath := paths.New("testdata", "MissingMains")

// Load app
app, err := Load(appFolderPath.String())
app, err := Load(appFolderPath)
assert.Error(t, err)
assert.ErrorContains(t, err, "main python file and sketch file missing from app")
assert.Empty(t, app)
Expand Down
2 changes: 1 addition & 1 deletion internal/orchestrator/app/parser_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ bricks:
err = os.WriteFile(appYaml.String(), []byte(appDescriptor), 0600)
require.NoError(t, err)

app, err := Load(tempDir)
app, err := Load(paths.New(tempDir))
require.NoError(t, err)
require.Equal(t, "Test App", app.Name)
require.Equal(t, 1, len(app.Descriptor.Bricks))
Expand Down
2 changes: 1 addition & 1 deletion internal/orchestrator/app_status.go
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ func parseDockerStatusEvent(ctx context.Context, cfg config.Configuration, docke
}

// FIXME: create an helper function to transform an app.ArduinoApp into an ortchestrator.AppInfo
app, err := app.Load(appStatus.AppPath.String())
app, err := app.Load(appStatus.AppPath)
if err != nil {
slog.Warn("error loading app", "appPath", appStatus.AppPath.String(), "error", err)
return AppInfo{}, err
Expand Down
2 changes: 1 addition & 1 deletion internal/orchestrator/bricks/bricks.go
Original file line number Diff line number Diff line change
Expand Up @@ -247,7 +247,7 @@ func getUsedByApps(
}

for _, file := range appPaths {
app, err := app.Load(file.String())
app, err := app.Load(file)
if err != nil {
// we are not considering the broken apps
slog.Warn("unable to parse app.yaml, skipping", "path", file.String(), "error", err.Error())
Expand Down
Loading