diff --git a/internal/e2e/client/client.gen.go b/internal/e2e/client/client.gen.go index f6094430..1af0bfa6 100644 --- a/internal/e2e/client/client.gen.go +++ b/internal/e2e/client/client.gen.go @@ -1,6 +1,6 @@ // Package client provides primitives to interact with the openapi HTTP API. // -// Code generated by github.com/oapi-codegen/oapi-codegen/v2 version v2.5.0 DO NOT EDIT. +// Code generated by github.com/oapi-codegen/oapi-codegen/v2 version v2.5.1 DO NOT EDIT. package client import ( diff --git a/internal/orchestrator/bricks/bricks.go b/internal/orchestrator/bricks/bricks.go index e8dea9da..ea3603ab 100644 --- a/internal/orchestrator/bricks/bricks.go +++ b/internal/orchestrator/bricks/bricks.go @@ -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.ModelRequired, Models: f.Map(s.modelsIndex.GetModelsByBrick(brick.ID), func(m modelsindex.AIModel) string { return m.ID }), @@ -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.ModelRequired, // 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, @@ -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.ModelRequired, Variables: variables, ConfigVariables: configVariables, ModelID: modelID, @@ -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.ModelRequired, + Status: "installed", // For now every Arduino brick are installed + Variables: variables, + Readme: readme, + ApiDocsPath: apiDocsPath, + CodeExamples: codeExamples, + UsedByApps: usedByApps, }, nil } diff --git a/internal/orchestrator/bricks/types.go b/internal/orchestrator/bricks/types.go index 868c563a..176db25f 100644 --- a/internal/orchestrator/bricks/types.go +++ b/internal/orchestrator/bricks/types.go @@ -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 { @@ -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"` } @@ -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"` } diff --git a/internal/orchestrator/bricksindex/bricks_index.go b/internal/orchestrator/bricksindex/bricks_index.go index e4b774f4..5d2ca15c 100644 --- a/internal/orchestrator/bricksindex/bricks_index.go +++ b/internal/orchestrator/bricksindex/bricks_index.go @@ -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"` + ModelRequired 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"` diff --git a/internal/orchestrator/bricksindex/bricks_index_test.go b/internal/orchestrator/bricksindex/bricks_index_test.go index 5b2a1546..b6807211 100644 --- a/internal/orchestrator/bricksindex/bricks_index_test.go +++ b/internal/orchestrator/bricksindex/bricks_index_test.go @@ -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.ModelRequired) + 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.ModelRequired) + + 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.ModelRequired) } diff --git a/internal/orchestrator/orchestrator.go b/internal/orchestrator/orchestrator.go index 7f5b6e93..995479f4 100644 --- a/internal/orchestrator/orchestrator.go +++ b/internal/orchestrator/orchestrator.go @@ -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( @@ -732,6 +733,7 @@ func AppDetails( } res.Name = bi.Name res.Category = bi.Category + res.ModelRequired = bi.ModelRequired return res }), }, nil