Skip to content

Commit d7d1753

Browse files
giulio93dido18
andauthored
Add require_model to the brick list (#93)
* brick - add require on list and details * require_model for the app bricks * fixing yaml ser * list app brick detalis * add tests on reqmodel * rename to RequireModel * TestBricksList test * TestAppBrickInstanceDetails * fix * update tests * add RequireModel to test * add test IC * remove models * Update internal/orchestrator/bricksindex/testdata/bricks-list.yaml Co-authored-by: Davide <davideneri18@gmail.com> * Update internal/orchestrator/bricksindex/testdata/bricks-list.yaml Co-authored-by: Davide <davideneri18@gmail.com> * Update internal/orchestrator/bricks/testdata/bricks-list.yaml Co-authored-by: Davide <davideneri18@gmail.com> * revert --------- Co-authored-by: Davide <davideneri18@gmail.com>
1 parent 1861a8f commit d7d1753

File tree

11 files changed

+100
-47
lines changed

11 files changed

+100
-47
lines changed

internal/api/docs/openapi.yaml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1204,6 +1204,8 @@ components:
12041204
type: string
12051205
name:
12061206
type: string
1207+
require_model:
1208+
type: boolean
12071209
required:
12081210
- id
12091211
- name
@@ -1332,6 +1334,8 @@ components:
13321334
type: string
13331335
readme:
13341336
type: string
1337+
require_model:
1338+
type: boolean
13351339
status:
13361340
type: string
13371341
used_by_apps:
@@ -1365,6 +1369,8 @@ components:
13651369
type: string
13661370
name:
13671371
type: string
1372+
require_model:
1373+
type: boolean
13681374
status:
13691375
type: string
13701376
variables:
@@ -1386,6 +1392,8 @@ components:
13861392
type: string
13871393
name:
13881394
type: string
1395+
require_model:
1396+
type: boolean
13891397
status:
13901398
type: string
13911399
type: object

internal/e2e/client/client.gen.go

Lines changed: 13 additions & 9 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/e2e/daemon/app_test.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -783,9 +783,10 @@ func TestAppDetails(t *testing.T) {
783783
require.Len(t, *detailsResp.JSON200.Bricks, 1)
784784
require.Equal(t,
785785
client.AppDetailedBrick{
786-
Id: ImageClassifactionBrickID,
787-
Name: "Image Classification",
788-
Category: f.Ptr("video"),
786+
Id: ImageClassifactionBrickID,
787+
Name: "Image Classification",
788+
Category: f.Ptr("video"),
789+
RequireModel: f.Ptr(true),
789790
},
790791
(*detailsResp.JSON200.Bricks)[0],
791792
)

internal/e2e/daemon/brick_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ func TestBricksList(t *testing.T) {
8383
require.Equal(t, bIdx.Description, *brick.Description)
8484
require.Equal(t, "Arduino", *brick.Author)
8585
require.Equal(t, "installed", *brick.Status)
86+
require.Equal(t, bIdx.RequireModel, *brick.RequireModel)
8687
}
8788
}
8889

internal/orchestrator/bricks/bricks.go

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -58,12 +58,13 @@ func (s *Service) List() (BrickListResult, error) {
5858
res := BrickListResult{Bricks: make([]BrickListItem, len(s.bricksIndex.Bricks))}
5959
for i, brick := range s.bricksIndex.Bricks {
6060
res.Bricks[i] = BrickListItem{
61-
ID: brick.ID,
62-
Name: brick.Name,
63-
Author: "Arduino", // TODO: for now we only support our bricks
64-
Description: brick.Description,
65-
Category: brick.Category,
66-
Status: "installed",
61+
ID: brick.ID,
62+
Name: brick.Name,
63+
Author: "Arduino", // TODO: for now we only support our bricks
64+
Description: brick.Description,
65+
Category: brick.Category,
66+
Status: "installed",
67+
RequireModel: brick.RequireModel,
6768
}
6869
}
6970
return res, nil
@@ -85,6 +86,7 @@ func (s *Service) AppBrickInstancesList(a *app.ArduinoApp) (AppBrickInstancesRes
8586
Author: "Arduino", // TODO: for now we only support our bricks
8687
Category: brick.Category,
8788
Status: "installed",
89+
RequireModel: brick.RequireModel,
8890
ModelID: brickInstance.Model, // TODO: in case is not set by the user, should we return the default model?
8991
Variables: variablesMap, // TODO: do we want to show also the default value of not explicitly set variables?
9092
ConfigVariables: configVariables,
@@ -118,6 +120,7 @@ func (s *Service) AppBrickInstanceDetails(a *app.ArduinoApp, brickID string) (Br
118120
Author: "Arduino", // TODO: for now we only support our bricks
119121
Category: brick.Category,
120122
Status: "installed", // For now every Arduino brick are installed
123+
RequireModel: brick.RequireModel,
121124
Variables: variables,
122125
ConfigVariables: configVariables,
123126
ModelID: modelID,
@@ -203,6 +206,7 @@ func (s *Service) BricksDetails(id string, idProvider *app.IDProvider,
203206
Author: "Arduino", // TODO: for now we only support our bricks
204207
Description: brick.Description,
205208
Category: brick.Category,
209+
RequireModel: brick.RequireModel,
206210
Status: "installed", // For now every Arduino brick are installed
207211
Variables: variables,
208212
Readme: readme,

internal/orchestrator/bricks/bricks_test.go

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -503,12 +503,14 @@ func TestAppBrickInstanceModelsDetails(t *testing.T) {
503503
{Name: "EI_OBJ_DETECTION_MODEL", DefaultValue: "default_path", Description: "path to the model file"},
504504
{Name: "CUSTOM_MODEL_PATH", DefaultValue: "/home/arduino/.arduino-bricks/ei-models", Description: "path to the custom model directory"},
505505
},
506+
RequireModel: true,
506507
},
507508
{
508-
ID: "arduino:weather_forecast",
509-
Name: "Weather Forecast",
510-
Category: "miscellaneous",
511-
ModelName: "",
509+
ID: "arduino:weather_forecast",
510+
Name: "Weather Forecast",
511+
Category: "miscellaneous",
512+
ModelName: "",
513+
RequireModel: false,
512514
},
513515
},
514516
}
@@ -577,6 +579,7 @@ func TestAppBrickInstanceModelsDetails(t *testing.T) {
577579
require.Equal(t, "installed", res.Status)
578580
require.Empty(t, res.ModelID)
579581
require.Empty(t, res.CompatibleModels)
582+
require.False(t, res.RequireModel)
580583
},
581584
},
582585
{
@@ -597,6 +600,7 @@ func TestAppBrickInstanceModelsDetails(t *testing.T) {
597600
require.Len(t, res.CompatibleModels, 2)
598601
require.Equal(t, "yolox-object-detection", res.CompatibleModels[0].ID)
599602
require.Equal(t, "face-detection", res.CompatibleModels[1].ID)
603+
require.True(t, res.RequireModel)
600604
},
601605
},
602606
{
@@ -618,6 +622,7 @@ func TestAppBrickInstanceModelsDetails(t *testing.T) {
618622
require.Len(t, res.CompatibleModels, 2)
619623
require.Equal(t, "yolox-object-detection", res.CompatibleModels[0].ID)
620624
require.Equal(t, "face-detection", res.CompatibleModels[1].ID)
625+
require.True(t, res.RequireModel)
621626
},
622627
},
623628
}

internal/orchestrator/bricks/testdata/bricks-list.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,3 +23,8 @@ bricks:
2323
mount_devices_into_container: false
2424
ports: []
2525
category: storage
26+
- id: arduino:brick-with-require-model
27+
name: A brick with required model
28+
description: "Brick with required model"
29+
require_model: true
30+
model_name: mobilenet-image-classification

internal/orchestrator/bricks/types.go

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,13 @@ type BrickListResult struct {
2020
}
2121

2222
type BrickListItem struct {
23-
ID string `json:"id"`
24-
Name string `json:"name"`
25-
Author string `json:"author"`
26-
Description string `json:"description"`
27-
Category string `json:"category"`
28-
Status string `json:"status"`
23+
ID string `json:"id"`
24+
Name string `json:"name"`
25+
Author string `json:"author"`
26+
Description string `json:"description"`
27+
Category string `json:"category"`
28+
Status string `json:"status"`
29+
RequireModel bool `json:"require_model"`
2930
}
3031

3132
type AppBrickInstancesResult struct {
@@ -40,6 +41,7 @@ type BrickInstance struct {
4041
Status string `json:"status"`
4142
Variables map[string]string `json:"variables,omitempty" description:"Deprecated: use config_variables instead. This field is kept for backward compatibility."`
4243
ConfigVariables []BrickConfigVariable `json:"config_variables,omitempty"`
44+
RequireModel bool `json:"require_model"`
4345
ModelID string `json:"model,omitempty"`
4446
CompatibleModels []AIModel `json:"compatible_models"`
4547
}
@@ -78,6 +80,7 @@ type BrickDetailsResult struct {
7880
Description string `json:"description"`
7981
Category string `json:"category"`
8082
Status string `json:"status"`
83+
RequireModel bool `json:"require_model"`
8184
Variables map[string]BrickVariable `json:"variables,omitempty"`
8285
Readme string `json:"readme"`
8386
ApiDocsPath string `json:"api_docs_path"`

internal/orchestrator/bricksindex/bricks_index_test.go

Lines changed: 26 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -28,25 +28,36 @@ func TestGenerateBricksIndexFromFile(t *testing.T) {
2828
require.NoError(t, err)
2929

3030
// Check if ports are correctly set
31-
b, found := index.FindBrickByID("arduino:web_ui")
31+
bWebUI, found := index.FindBrickByID("arduino:web_ui")
3232
require.True(t, found)
33-
require.Equal(t, []string{"7000"}, b.Ports)
33+
require.Equal(t, []string{"7000"}, bWebUI.Ports)
3434

3535
// Check if variables are correctly set
36-
b, found = index.FindBrickByID("arduino:image_classification")
36+
bIC, found := index.FindBrickByID("arduino:image_classification")
3737
require.True(t, found)
38-
require.Equal(t, "Image Classification", b.Name)
39-
require.Equal(t, "mobilenet-image-classification", b.ModelName)
40-
require.True(t, b.RequireModel)
41-
require.Len(t, b.Variables, 2)
42-
require.Equal(t, "CUSTOM_MODEL_PATH", b.Variables[0].Name)
43-
require.Equal(t, "/opt/models/ei/", b.Variables[0].DefaultValue)
44-
require.Equal(t, "path to the custom model directory", b.Variables[0].Description)
45-
require.Equal(t, "EI_CLASSIFICATION_MODEL", b.Variables[1].Name)
46-
require.Equal(t, "/models/ootb/ei/mobilenet-v2-224px.eim", b.Variables[1].DefaultValue)
47-
require.Equal(t, "path to the model file", b.Variables[1].Description)
48-
require.False(t, b.Variables[0].IsRequired())
49-
require.False(t, b.Variables[1].IsRequired())
38+
require.Equal(t, "Image Classification", bIC.Name)
39+
require.Equal(t, "mobilenet-image-classification", bIC.ModelName)
40+
require.Len(t, bIC.Variables, 2)
41+
require.Equal(t, "CUSTOM_MODEL_PATH", bIC.Variables[0].Name)
42+
require.Equal(t, "/opt/models/ei/", bIC.Variables[0].DefaultValue)
43+
require.Equal(t, "path to the custom model directory", bIC.Variables[0].Description)
44+
require.Equal(t, "EI_CLASSIFICATION_MODEL", bIC.Variables[1].Name)
45+
require.Equal(t, "/models/ootb/ei/mobilenet-v2-224px.eim", bIC.Variables[1].DefaultValue)
46+
require.Equal(t, "path to the model file", bIC.Variables[1].Description)
47+
require.False(t, bIC.Variables[0].IsRequired())
48+
require.False(t, bIC.Variables[1].IsRequired())
49+
50+
bRequireModel, found := index.FindBrickByID("arduino:model_required")
51+
require.True(t, found)
52+
require.True(t, bRequireModel.RequireModel)
53+
54+
bDb, found := index.FindBrickByID("arduino:dbstorage_tsstore")
55+
require.True(t, found)
56+
require.False(t, bDb.RequireModel)
57+
58+
bNoRequireModel, found := index.FindBrickByID("arduino:missing-model-require")
59+
require.True(t, found)
60+
require.False(t, bNoRequireModel.RequireModel)
5061
}
5162

5263
func TestBricksIndexYAMLFormats(t *testing.T) {

internal/orchestrator/bricksindex/testdata/bricks-list.yaml

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,4 +130,13 @@ bricks:
130130
description: path to the custom model directory
131131
- name: EI_V_ANOMALY_DETECTION_MODEL
132132
default_value: /models/ootb/ei/concrete-crack-anomaly-detection.eim
133-
description: path to the model file
133+
description: path to the model file
134+
- id: arduino:missing-model-require
135+
name: Camera Scanner
136+
description: Scans a camera for barcodes and QR codes
137+
require_container: false
138+
ports: []
139+
- id: arduino:model_required
140+
name: Model Required Brick
141+
description: A brick that requires a model
142+
require_model: true

0 commit comments

Comments
 (0)