diff --git a/generators/github/acm-controller/Broker.json b/generators/github/acm-controller/Broker.json index 1f003207..e9b4863d 100644 --- a/generators/github/acm-controller/Broker.json +++ b/generators/github/acm-controller/Broker.json @@ -21,7 +21,10 @@ "status": "", "created_at": "0001-01-01T00:00:00Z", "updated_at": "0001-01-01T00:00:00Z", -"deleted_at": null, +"deleted_at": { +"Time": "0001-01-01T00:00:00Z", +"Valid": false +}, "schemaVersion": "" }, "connection_id": "00000000-0000-0000-0000-000000000000", diff --git a/generators/github/acm-controller/MeshSync.json b/generators/github/acm-controller/MeshSync.json index 36219754..d91f3b1d 100644 --- a/generators/github/acm-controller/MeshSync.json +++ b/generators/github/acm-controller/MeshSync.json @@ -21,7 +21,10 @@ "status": "", "created_at": "0001-01-01T00:00:00Z", "updated_at": "0001-01-01T00:00:00Z", -"deleted_at": null, +"deleted_at": { +"Time": "0001-01-01T00:00:00Z", +"Valid": false +}, "schemaVersion": "" }, "connection_id": "00000000-0000-0000-0000-000000000000", diff --git a/generators/github/channels/Channel.json b/generators/github/channels/Channel.json index ca9ad137..5d7e9e2d 100644 --- a/generators/github/channels/Channel.json +++ b/generators/github/channels/Channel.json @@ -21,7 +21,10 @@ "status": "", "created_at": "0001-01-01T00:00:00Z", "updated_at": "0001-01-01T00:00:00Z", -"deleted_at": null, +"deleted_at": { +"Time": "0001-01-01T00:00:00Z", +"Valid": false +}, "schemaVersion": "" }, "connection_id": "00000000-0000-0000-0000-000000000000", diff --git a/registry/component.go b/registry/component.go index b5961aac..7a3eb48e 100644 --- a/registry/component.go +++ b/registry/component.go @@ -58,10 +58,13 @@ type ComponentCSV struct { // The Component Definition generated assumes or is only for components which have registrant as "meshery" func (c *ComponentCSV) CreateComponentDefinition(isModelPublished bool, defVersion string) (component.ComponentDefinition, error) { - status := entity.Enabled + var statusPtr *component.ComponentDefinitionStatus if c.Status != "" { - if utils.ReplaceSpacesAndConvertToLowercase(c.Status) == "ignored" { - status = entity.Ignored + normalized := utils.ReplaceSpacesAndConvertToLowercase(c.Status) + + if normalized == "ignored" { + s := component.ComponentDefinitionStatus(entity.Ignored) + statusPtr = &s } } componentDefinition := &component.ComponentDefinition{ @@ -72,13 +75,15 @@ func (c *ComponentCSV) CreateComponentDefinition(isModelPublished bool, defVersi Metadata: component.ComponentDefinition_Metadata{ Published: isModelPublished, }, - Status: (*component.ComponentDefinitionStatus)(&status), Component: component.Component{ Kind: c.Component, Schema: c.Schema, Version: c.Version, }, } + if statusPtr != nil { + componentDefinition.Status = statusPtr + } if c.Description != "" { componentDefinition.Description = c.Description } @@ -94,13 +99,7 @@ var compStyleValues = []string{ } func (c *ComponentCSV) UpdateCompDefinition(compDef *component.ComponentDefinition) error { - status := entity.Enabled - if c.Status != "" { - if utils.ReplaceSpacesAndConvertToLowercase(c.Status) == "ignored" { - status = entity.Ignored - } - } - compDef.Status = (*component.ComponentDefinitionStatus)(&status) + var existingAddditionalProperties map[string]interface{} if c.Description != "" { compDef.Description = c.Description diff --git a/registry/component_test.go b/registry/component_test.go index 09fb16a4..8a4d56ec 100644 --- a/registry/component_test.go +++ b/registry/component_test.go @@ -1,85 +1,113 @@ package registry import ( - "testing" - "github.com/stretchr/testify/assert" - "github.com/meshery/schemas/models/v1beta1/component" + "testing" + + "github.com/meshery/meshkit/models/meshmodel/entity" + "github.com/meshery/schemas/models/v1beta1/component" + "github.com/meshery/schemas/models/v1beta1/model" + "github.com/stretchr/testify/assert" ) func TestUpdateCompDefinitionWithDefaultCapabilities(t *testing.T) { - tests := []struct { - name string - csvCapabilities string - expectedCapabilitiesLen int - shouldHaveDefaultCaps bool - }{ - { - name: "Empty capabilities should get defaults", - csvCapabilities: "", - expectedCapabilitiesLen: 3, - shouldHaveDefaultCaps: true, - }, - { - name: "Null capabilities should get defaults", - csvCapabilities: "null", - expectedCapabilitiesLen: 3, - shouldHaveDefaultCaps: true, - }, - { - name: "Existing capabilities should be preserved", - csvCapabilities: `[{"displayName":"Custom Cap","kind":"test"}]`, - expectedCapabilitiesLen: 1, - shouldHaveDefaultCaps: false, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - comp := ComponentCSV{ - Component: "TestComponent", - Capabilities: tt.csvCapabilities, - Registrant: "meshery", - Model: "test-model", - } - - compDef := &component.ComponentDefinition{} - - err := comp.UpdateCompDefinition(compDef) - - assert.NoError(t, err) - assert.NotNil(t, compDef.Capabilities) - assert.Len(t, *compDef.Capabilities, tt.expectedCapabilitiesLen) - - if tt.shouldHaveDefaultCaps { - capabilities := *compDef.Capabilities - - expectedNames := []string{"Styling", "Change Shape", "Compound Drag And Drop"} - actualNames := make([]string, len(capabilities)) - for i, cap := range capabilities { - actualNames[i] = cap.DisplayName - } - - assert.ElementsMatch(t, expectedNames, actualNames) - - assert.Equal(t, "Styling", capabilities[0].DisplayName) - assert.Equal(t, "mutate", capabilities[0].Kind) - assert.Equal(t, "style", capabilities[0].Type) - } - }) - } + tests := []struct { + name string + csvCapabilities string + expectedCapabilitiesLen int + shouldHaveDefaultCaps bool + }{ + { + name: "Empty capabilities should get defaults", + csvCapabilities: "", + expectedCapabilitiesLen: 3, + shouldHaveDefaultCaps: true, + }, + { + name: "Null capabilities should get defaults", + csvCapabilities: "null", + expectedCapabilitiesLen: 3, + shouldHaveDefaultCaps: true, + }, + { + name: "Existing capabilities should be preserved", + csvCapabilities: `[{"displayName":"Custom Cap","kind":"test"}]`, + expectedCapabilitiesLen: 1, + shouldHaveDefaultCaps: false, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + comp := ComponentCSV{ + Component: "TestComponent", + Capabilities: tt.csvCapabilities, + Registrant: "meshery", + Model: "test-model", + } + + compDef := &component.ComponentDefinition{} + + err := comp.UpdateCompDefinition(compDef) + + assert.NoError(t, err) + assert.NotNil(t, compDef.Capabilities) + assert.Len(t, *compDef.Capabilities, tt.expectedCapabilitiesLen) + + if tt.shouldHaveDefaultCaps { + capabilities := *compDef.Capabilities + + expectedNames := []string{"Styling", "Change Shape", "Compound Drag And Drop"} + actualNames := make([]string, len(capabilities)) + for i, cap := range capabilities { + actualNames[i] = cap.DisplayName + } + + assert.ElementsMatch(t, expectedNames, actualNames) + + assert.Equal(t, "Styling", capabilities[0].DisplayName) + assert.Equal(t, "mutate", capabilities[0].Kind) + assert.Equal(t, "style", capabilities[0].Type) + } + }) + } } func TestGetMinimalUICapabilitiesFromSchema(t *testing.T) { - capabilities, err := getMinimalUICapabilitiesFromSchema() - - assert.NoError(t, err) - assert.Len(t, capabilities, 3) - - expectedNames := []string{"Styling", "Change Shape", "Compound Drag And Drop"} - actualNames := make([]string, len(capabilities)) - for i, cap := range capabilities { - actualNames[i] = cap.DisplayName - } - - assert.ElementsMatch(t, expectedNames, actualNames) -} \ No newline at end of file + capabilities, err := getMinimalUICapabilitiesFromSchema() + + assert.NoError(t, err) + assert.Len(t, capabilities, 3) + + expectedNames := []string{"Styling", "Change Shape", "Compound Drag And Drop"} + actualNames := make([]string, len(capabilities)) + for i, cap := range capabilities { + actualNames[i] = cap.DisplayName + } + + assert.ElementsMatch(t, expectedNames, actualNames) +} + +func TestAssignDefaultsForCompDefs_StatusHandling(t *testing.T) { + // Case 1: model status = "" + modelDef := &model.ModelDefinition{ + Status: "", + } + + comp := &component.ComponentDefinition{} + + AssignDefaultsForCompDefs(comp, modelDef) + + if comp.Status != nil { + t.Errorf("expected component status to be nil when model status is empty") + } + + // Case 2: model status = ignored + ignored := model.ModelDefinitionStatus(entity.Ignored) + modelDef.Status = ignored + + AssignDefaultsForCompDefs(comp, modelDef) + + if comp.Status == nil { + t.Errorf("expected component status to be set when model status is ignored") + } +} diff --git a/registry/model.go b/registry/model.go index 160a13a1..6d6d6202 100644 --- a/registry/model.go +++ b/registry/model.go @@ -60,6 +60,7 @@ var defVersion = "v1.0.0" // keep type ModelCSV struct { + Status *_model.ModelDefinitionStatus `json:"status,omitempty"` Registrant string `json:"registrant" csv:"registrant"` ModelDisplayName string `json:"modelDisplayName" csv:"modelDisplayName"` Model string `json:"model" csv:"model"` @@ -174,9 +175,10 @@ func (m *ModelCSV) UpdateModelDefinition(modelDef *_model.ModelDefinition) error return nil } func (mcv *ModelCSV) CreateModelDefinition(version, defVersion string) _model.ModelDefinition { - status := entity.Ignored - if strings.ToLower(mcv.PublishToRegistry) == "true" { - status = entity.Enabled + var status _model.ModelDefinitionStatus + + if strings.ToLower(strings.TrimSpace(mcv.PublishToRegistry)) != "true" { + status = _model.ModelDefinitionStatus(entity.Ignored) } var catname category.CategoryDefinition catname.Name = mcv.Category @@ -189,7 +191,7 @@ func (mcv *ModelCSV) CreateModelDefinition(version, defVersion string) _model.Mo SchemaVersion: v1beta1.ModelSchemaVersion, Name: mcv.Model, - Status: _model.ModelDefinitionStatus(status), + Status: status, Registrant: registrant, SubCategory: mcv.SubCategory, Model: _model.Model{ @@ -533,8 +535,10 @@ func (m ModelCSVHelper) Cleanup() error { } func AssignDefaultsForCompDefs(componentDef *component.ComponentDefinition, modelDef *_model.ModelDefinition) { // Assign the status from the model to the component - compStatus := component.ComponentDefinitionStatus(modelDef.Status) - componentDef.Status = &compStatus + if modelDef.Status != "" && string(modelDef.Status) != string(entity.Enabled) { + compStatus := component.ComponentDefinitionStatus(modelDef.Status) + componentDef.Status = &compStatus + } // Initialize AdditionalProperties and Styles if nil if componentDef.Metadata.AdditionalProperties == nil { @@ -1080,10 +1084,8 @@ func InvokeGenerationFromSheetWithOptions(wg *sync.WaitGroup, path string, model func GenerateDefsForCoreRegistrant(model ModelCSV, ComponentCSVHelper *ComponentCSVHelper, path string, modelName string) error { var version string parts := strings.Split(model.SourceURL, "/") - // Assuming the URL is always of the format "protocol://github.com/owner/repo/tree/definitions/{model-name}/version/components" - // We know the version is the 7th element (0-indexed) in the split URL if len(parts) >= 8 { - version = parts[8] // Fetch the version from the expected position + version = parts[8] } else { return fmt.Errorf("invalid SourceURL format: %s", model.SourceURL) } @@ -1097,11 +1099,13 @@ func GenerateDefsForCoreRegistrant(model ModelCSV, ComponentCSVHelper *Component version: version, }) }() - status := entity.Ignored - if isModelPublished { - status = entity.Enabled + + var _status *component.ComponentDefinitionStatus + if !isModelPublished { + s := component.ComponentDefinitionStatus(entity.Ignored) + _status = &s } - _status := component.ComponentDefinitionStatus(status) + modelDirPath, compDirPath, err := createVersionedDirectoryForModelAndComp(version, model.Model, path) if err != nil { err = ErrGenerateModel(err, model.Model) @@ -1133,7 +1137,7 @@ func GenerateDefsForCoreRegistrant(model ModelCSV, ComponentCSVHelper *Component Log.Error(ErrUpdateComponent(err, modelName, comp.Component)) continue } - componentDef.Status = &_status + componentDef.Status = _status componentDef.Model = modelDef alreadyExists, err = componentDef.WriteComponentDefinition(compDirPath, "json") if err != nil {