Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions internal/api/docs/openapi.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -1195,6 +1195,8 @@ components:
type: string
name:
type: string
require_model:
type: boolean
required:
- id
- name
Expand Down Expand Up @@ -1318,6 +1320,8 @@ components:
type: string
readme:
type: string
require_model:
type: boolean
status:
type: string
used_by_apps:
Expand Down Expand Up @@ -1346,6 +1350,8 @@ components:
type: string
name:
type: string
require_model:
type: boolean
status:
type: string
variables:
Expand All @@ -1372,6 +1378,8 @@ components:
type: array
name:
type: string
require_model:
type: boolean
status:
type: string
type: object
Expand Down
26 changes: 15 additions & 11 deletions internal/e2e/client/client.gen.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 4 additions & 3 deletions internal/e2e/daemon/app_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -783,9 +783,10 @@ func TestAppDetails(t *testing.T) {
require.Len(t, *detailsResp.JSON200.Bricks, 1)
require.Equal(t,
client.AppDetailedBrick{
Id: ImageClassifactionBrickID,
Name: "Image Classification",
Category: f.Ptr("video"),
Id: ImageClassifactionBrickID,
Name: "Image Classification",
Category: f.Ptr("video"),
RequireModel: f.Ptr(true),
},
(*detailsResp.JSON200.Bricks)[0],
)
Expand Down
1 change: 1 addition & 0 deletions internal/e2e/daemon/brick_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,7 @@ func TestBricksList(t *testing.T) {
require.Equal(t, bIdx.Description, *brick.Description)
require.Equal(t, "Arduino", *brick.Author)
require.Equal(t, "installed", *brick.Status)
require.Equal(t, bIdx.RequireModel, *brick.RequireModel)
}
}

Expand Down
38 changes: 21 additions & 17 deletions internal/orchestrator/bricks/bricks.go
Original file line number Diff line number Diff line change
Expand Up @@ -58,12 +58,13 @@ func (s *Service) List() (BrickListResult, error) {
res := BrickListResult{Bricks: make([]BrickListItem, len(s.bricksIndex.Bricks))}
for i, brick := range s.bricksIndex.Bricks {
res.Bricks[i] = BrickListItem{
ID: brick.ID,
Name: brick.Name,
Author: "Arduino", // TODO: for now we only support our bricks
Description: brick.Description,
Category: brick.Category,
Status: "installed",
ID: brick.ID,
Name: brick.Name,
Author: "Arduino", // TODO: for now we only support our bricks
Description: brick.Description,
Category: brick.Category,
Status: "installed",
ModelRequired: brick.RequireModel,
Models: f.Map(s.modelsIndex.GetModelsByBrick(brick.ID), func(m modelsindex.AIModel) string {
return m.ID
}),
Expand All @@ -88,6 +89,7 @@ func (s *Service) AppBrickInstancesList(a *app.ArduinoApp) (AppBrickInstancesRes
Author: "Arduino", // TODO: for now we only support our bricks
Category: brick.Category,
Status: "installed",
ModelRequired: brick.RequireModel, // TODO: in case is not set by the user, should we return false?
ModelID: brickInstance.Model, // TODO: in case is not set by the user, should we return the default model?
Variables: variablesMap, // TODO: do we want to show also the default value of not explicitly set variables?
ConfigVariables: configVariables,
Expand Down Expand Up @@ -121,6 +123,7 @@ func (s *Service) AppBrickInstanceDetails(a *app.ArduinoApp, brickID string) (Br
Author: "Arduino", // TODO: for now we only support our bricks
Category: brick.Category,
Status: "installed", // For now every Arduino brick are installed
ModelRequired: brick.RequireModel,
Variables: variables,
ConfigVariables: configVariables,
ModelID: modelID,
Expand Down Expand Up @@ -195,17 +198,18 @@ func (s *Service) BricksDetails(id string, idProvider *app.IDProvider,
}

return BrickDetailsResult{
ID: id,
Name: brick.Name,
Author: "Arduino", // TODO: for now we only support our bricks
Description: brick.Description,
Category: brick.Category,
Status: "installed", // For now every Arduino brick are installed
Variables: variables,
Readme: readme,
ApiDocsPath: apiDocsPath,
CodeExamples: codeExamples,
UsedByApps: usedByApps,
ID: id,
Name: brick.Name,
Author: "Arduino", // TODO: for now we only support our bricks
Description: brick.Description,
Category: brick.Category,
ModelRequired: brick.RequireModel,
Status: "installed", // For now every Arduino brick are installed
Variables: variables,
Readme: readme,
ApiDocsPath: apiDocsPath,
CodeExamples: codeExamples,
UsedByApps: usedByApps,
}, nil
}

Expand Down
39 changes: 21 additions & 18 deletions internal/orchestrator/bricks/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,14 @@ type BrickListResult struct {
}

type BrickListItem struct {
ID string `json:"id"`
Name string `json:"name"`
Author string `json:"author"`
Description string `json:"description"`
Category string `json:"category"`
Status string `json:"status"`
Models []string `json:"models"`
ID string `json:"id"`
Name string `json:"name"`
Author string `json:"author"`
Description string `json:"description"`
Category string `json:"category"`
Status string `json:"status"`
ModelRequired bool `json:"require_model"`
Models []string `json:"models"`
}

type AppBrickInstancesResult struct {
Expand All @@ -41,6 +42,7 @@ type BrickInstance struct {
Status string `json:"status"`
Variables map[string]string `json:"variables,omitempty" description:"Deprecated: use config_variables instead. This field is kept for backward compatibility."`
ConfigVariables []BrickConfigVariable `json:"config_variables,omitempty"`
ModelRequired bool `json:"require_model,omitempty"`
ModelID string `json:"model,omitempty"`
}

Expand All @@ -67,15 +69,16 @@ type AppReference struct {
}

type BrickDetailsResult struct {
ID string `json:"id"`
Name string `json:"name"`
Author string `json:"author"`
Description string `json:"description"`
Category string `json:"category"`
Status string `json:"status"`
Variables map[string]BrickVariable `json:"variables,omitempty"`
Readme string `json:"readme"`
ApiDocsPath string `json:"api_docs_path"`
CodeExamples []CodeExample `json:"code_examples"`
UsedByApps []AppReference `json:"used_by_apps"`
ID string `json:"id"`
Name string `json:"name"`
Author string `json:"author"`
Description string `json:"description"`
Category string `json:"category"`
Status string `json:"status"`
ModelRequired bool `json:"require_model"`
Variables map[string]BrickVariable `json:"variables,omitempty"`
Readme string `json:"readme"`
ApiDocsPath string `json:"api_docs_path"`
CodeExamples []CodeExample `json:"code_examples"`
UsedByApps []AppReference `json:"used_by_apps"`
}
2 changes: 1 addition & 1 deletion internal/orchestrator/bricksindex/bricks_index.go
Original file line number Diff line number Diff line change
Expand Up @@ -55,9 +55,9 @@ type Brick struct {
Category string `yaml:"category,omitempty"`
RequiresDisplay string `yaml:"requires_display,omitempty"`
RequireContainer bool `yaml:"require_container"`
RequireModel bool `yaml:"require_model"`
Variables []BrickVariable `yaml:"variables,omitempty"`
Ports []string `yaml:"ports,omitempty"`
RequireModel bool `yaml:"require_model,omitempty"`
ModelName string `yaml:"model_name,omitempty"`
MountDevicesIntoContainer bool `yaml:"mount_devices_into_container,omitempty"`
RequiredDevices []string `yaml:"required_devices,omitempty"`
Expand Down
45 changes: 29 additions & 16 deletions internal/orchestrator/bricksindex/bricks_index_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -156,31 +156,44 @@ func TestBricksIndex(t *testing.T) {
- name: EI_V_ANOMALY_DETECTION_MODEL
default_value: /models/ootb/ei/concrete-crack-anomaly-detection.eim
description: path to the model file
- id: arduino:fake_no_model
name: Camera Scanner
description: Scans a camera for barcodes and QR codes
require_container: false
ports: []
`

var index BricksIndex
err := yaml.Unmarshal([]byte(x), &index)
require.NoError(t, err)
require.Len(t, index.Bricks, 11)
require.Len(t, index.Bricks, 12)

// Check if ports are correctly set
b, found := index.FindBrickByID("arduino:web_ui")
b_ic, found := index.FindBrickByID("arduino:web_ui")
require.True(t, found)
require.Equal(t, []string{"7000"}, b.Ports)
require.Equal(t, []string{"7000"}, b_ic.Ports)

// Check if variables are correctly set
b, found = index.FindBrickByID("arduino:image_classification")
b_ic, found = index.FindBrickByID("arduino:image_classification")
require.True(t, found)
require.Equal(t, "Image Classification", b_ic.Name)
require.Equal(t, "mobilenet-image-classification", b_ic.ModelName)
require.True(t, b_ic.RequireModel)
require.Len(t, b_ic.Variables, 2)
require.Equal(t, "CUSTOM_MODEL_PATH", b_ic.Variables[0].Name)
require.Equal(t, "/opt/models/ei/", b_ic.Variables[0].DefaultValue)
require.Equal(t, "path to the custom model directory", b_ic.Variables[0].Description)
require.Equal(t, "EI_CLASSIFICATION_MODEL", b_ic.Variables[1].Name)
require.Equal(t, "/models/ootb/ei/mobilenet-v2-224px.eim", b_ic.Variables[1].DefaultValue)
require.Equal(t, "path to the model file", b_ic.Variables[1].Description)
require.False(t, b_ic.Variables[0].IsRequired())
require.False(t, b_ic.Variables[1].IsRequired())

b_db, found := index.FindBrickByID("arduino:dbstorage_tsstore")
require.True(t, found)
require.False(t, b_db.RequireModel)

b_fake, found := index.FindBrickByID("arduino:fake_no_model")
require.True(t, found)
require.Equal(t, "Image Classification", b.Name)
require.Equal(t, "mobilenet-image-classification", b.ModelName)
require.True(t, b.RequireModel)
require.Len(t, b.Variables, 2)
require.Equal(t, "CUSTOM_MODEL_PATH", b.Variables[0].Name)
require.Equal(t, "/opt/models/ei/", b.Variables[0].DefaultValue)
require.Equal(t, "path to the custom model directory", b.Variables[0].Description)
require.Equal(t, "EI_CLASSIFICATION_MODEL", b.Variables[1].Name)
require.Equal(t, "/models/ootb/ei/mobilenet-v2-224px.eim", b.Variables[1].DefaultValue)
require.Equal(t, "path to the model file", b.Variables[1].Description)
require.False(t, b.Variables[0].IsRequired())
require.False(t, b.Variables[1].IsRequired())
require.False(t, b_fake.RequireModel)
}
8 changes: 5 additions & 3 deletions internal/orchestrator/orchestrator.go
Original file line number Diff line number Diff line change
Expand Up @@ -667,9 +667,10 @@ type AppDetailedInfo struct {
}

type AppDetailedBrick struct {
ID string `json:"id" required:"true"`
Name string `json:"name" required:"true"`
Category string `json:"category,omitempty"`
ID string `json:"id" required:"true"`
Name string `json:"name" required:"true"`
Category string `json:"category,omitempty"`
ModelRequired bool `json:"require_model,omitempty"`
}

func AppDetails(
Expand Down Expand Up @@ -732,6 +733,7 @@ func AppDetails(
}
res.Name = bi.Name
res.Category = bi.Category
res.ModelRequired = bi.RequireModel
return res
}),
}, nil
Expand Down