From f76e791a7d830d7f135ba913165ea01d9dfef86a Mon Sep 17 00:00:00 2001 From: Ashish Tiwari Date: Thu, 9 Mar 2023 21:44:21 +0530 Subject: [PATCH 1/9] Add metadata field to Models table Signed-off-by: Ashish Tiwari --- models/meshmodel/core/v1alpha1/component.go | 3 +- models/meshmodel/core/v1alpha1/models.go | 35 +++++++++++++++++++ models/meshmodel/core/v1alpha1/policy.go | 3 +- .../meshmodel/core/v1alpha1/relationship.go | 3 +- models/meshmodel/registry.go | 8 +++-- 5 files changed, 47 insertions(+), 5 deletions(-) diff --git a/models/meshmodel/core/v1alpha1/component.go b/models/meshmodel/core/v1alpha1/component.go index b606a340..3354f318 100644 --- a/models/meshmodel/core/v1alpha1/component.go +++ b/models/meshmodel/core/v1alpha1/component.go @@ -73,7 +73,8 @@ func CreateComponent(db *database.Handler, c ComponentDefinition) (uuid.UUID, er if model.ID == tempModelID || err == gorm.ErrRecordNotFound { //The model is already not present and needs to be inserted model = c.Model model.ID = modelID - err = db.Create(&model).Error + mdb := model.GetModelDB() + err = db.Create(&mdb).Error if err != nil { modelCreationLock.Unlock() return uuid.UUID{}, err diff --git a/models/meshmodel/core/v1alpha1/models.go b/models/meshmodel/core/v1alpha1/models.go index 2095879e..951a6aee 100644 --- a/models/meshmodel/core/v1alpha1/models.go +++ b/models/meshmodel/core/v1alpha1/models.go @@ -1,6 +1,7 @@ package v1alpha1 import ( + "encoding/json" "sync" "github.com/google/uuid" @@ -21,12 +22,22 @@ type ModelFilter struct { // swagger:response Model type Model struct { + ID uuid.UUID `json:"-"` + Name string `json:"name"` + Version string `json:"version"` + DisplayName string `json:"modelDisplayName" gorm:"modelDisplayName"` + Category string `json:"category"` + SubCategory string `json:"subCategory" gorm:"subCategory"` + Metadata map[string]interface{} `json:"modelMetadata" yaml:"modelMetadata"` +} +type ModelDB struct { ID uuid.UUID `json:"-"` Name string `json:"name"` Version string `json:"version"` DisplayName string `json:"modelDisplayName" gorm:"modelDisplayName"` Category string `json:"category"` SubCategory string `json:"subCategory" gorm:"subCategory"` + Metadata []byte `json:"modelMetadata" gorm:"modelMetadata"` } // Create the filter from map[string]interface{} @@ -36,3 +47,27 @@ func (cf *ModelFilter) Create(m map[string]interface{}) { } cf.Name = m["name"].(string) } +func (cmd *ModelDB) GetModel() (c Model) { + cmd.ID = c.ID + cmd.Category = c.Category + cmd.DisplayName = c.DisplayName + cmd.Name = c.Name + cmd.SubCategory = c.SubCategory + cmd.Version = c.Version + cmd.Metadata, _ = json.Marshal(c.Metadata) + if c.Metadata == nil { + c.Metadata = make(map[string]interface{}) + } + _ = json.Unmarshal(cmd.Metadata, &c.Metadata) + return +} +func (c *Model) GetModelDB() (cmd ModelDB) { + cmd.ID = c.ID + cmd.Category = c.Category + cmd.DisplayName = c.DisplayName + cmd.Name = c.Name + cmd.SubCategory = c.SubCategory + cmd.Version = c.Version + cmd.Metadata, _ = json.Marshal(c.Metadata) + return +} diff --git a/models/meshmodel/core/v1alpha1/policy.go b/models/meshmodel/core/v1alpha1/policy.go index ecc9efbb..7cf5eb4b 100644 --- a/models/meshmodel/core/v1alpha1/policy.go +++ b/models/meshmodel/core/v1alpha1/policy.go @@ -109,7 +109,8 @@ func CreatePolicy(db *database.Handler, p PolicyDefinition) (uuid.UUID, error) { if model.ID == tempModelID || err == gorm.ErrRecordNotFound { model = p.Model model.ID = modelID - err = db.Create(&model).Error + mdb := model.GetModelDB() + err = db.Create(&mdb).Error if err != nil { modelCreationLock.Unlock() return uuid.UUID{}, err diff --git a/models/meshmodel/core/v1alpha1/relationship.go b/models/meshmodel/core/v1alpha1/relationship.go index de3af366..ad119408 100644 --- a/models/meshmodel/core/v1alpha1/relationship.go +++ b/models/meshmodel/core/v1alpha1/relationship.go @@ -147,7 +147,8 @@ func CreateRelationship(db *database.Handler, r RelationshipDefinition) (uuid.UU if model.ID == tempModelID || err == gorm.ErrRecordNotFound { //The model is already not present and needs to be inserted model = r.Model model.ID = modelID - err = db.Create(&model).Error + mdb := model.GetModelDB() + err = db.Create(&mdb).Error if err != nil { modelCreationLock.Unlock() return uuid.UUID{}, err diff --git a/models/meshmodel/registry.go b/models/meshmodel/registry.go index 684e9886..022e457b 100644 --- a/models/meshmodel/registry.go +++ b/models/meshmodel/registry.go @@ -183,7 +183,8 @@ func (rm *RegistryManager) GetEntities(f types.Filter) []Entity { } } func (rm *RegistryManager) GetModels(f types.Filter) []v1alpha1.Model { - var mod []v1alpha1.Model + var mod []v1alpha1.ModelDB + var m []v1alpha1.Model finder := rm.db.Model(&mod) if mf, ok := f.(*v1alpha1.ModelFilter); ok { if mf.Greedy { @@ -223,7 +224,10 @@ func (rm *RegistryManager) GetModels(f types.Filter) []v1alpha1.Model { } } _ = finder.Find(&mod).Error - return mod + for _, modelDB := range mod { + m = append(m, modelDB.GetModel()) + } + return m } func (rm *RegistryManager) GetRegistrant(e Entity) Host { eID := e.GetID() From ff2546ddb78825db1d2e7fcc0441a87f52e71639 Mon Sep 17 00:00:00 2001 From: Ashish Tiwari Date: Wed, 15 Mar 2023 21:48:37 +0530 Subject: [PATCH 2/9] Add category table Signed-off-by: Ashish Tiwari --- models/meshmodel/core/v1alpha1/category.go | 60 +++++++++++++++++++ models/meshmodel/core/v1alpha1/component.go | 38 ++++-------- models/meshmodel/core/v1alpha1/models.go | 49 +++++++++++---- models/meshmodel/core/v1alpha1/policy.go | 24 +------- .../meshmodel/core/v1alpha1/relationship.go | 24 +------- models/meshmodel/registry.go | 29 ++++++--- .../core/v1alpha1/application_component.go | 2 +- 7 files changed, 132 insertions(+), 94 deletions(-) create mode 100644 models/meshmodel/core/v1alpha1/category.go diff --git a/models/meshmodel/core/v1alpha1/category.go b/models/meshmodel/core/v1alpha1/category.go new file mode 100644 index 00000000..b26cd803 --- /dev/null +++ b/models/meshmodel/core/v1alpha1/category.go @@ -0,0 +1,60 @@ +package v1alpha1 + +import ( + "encoding/json" + "sync" + + "github.com/google/uuid" + "github.com/layer5io/meshkit/database" + "gorm.io/gorm" +) + +var categoryCreationLock sync.Mutex //Each model will perform a check and if the category already doesn't exist, it will create a category. This lock will make sure that there are no race conditions. +type Category struct { + ID uuid.UUID `json:"-"` + Name string `json:"name"` + Metadata map[string]interface{} `json:"modelMetadata" yaml:"modelMetadata"` +} +type CategoryDB struct { + ID uuid.UUID `json:"-"` + Name string `json:"categoryName"` + Metadata []byte `json:"categoryMetadata" gorm:"modelMetadata"` +} + +func CreateCategory(db *database.Handler, cat Category) (uuid.UUID, error) { + byt, err := json.Marshal(cat) + if err != nil { + return uuid.UUID{}, err + } + catID := uuid.NewSHA1(uuid.UUID{}, byt) + var category Category + categoryCreationLock.Lock() + err = db.First(&category, "id = ?", catID).Error + if err != nil && err != gorm.ErrRecordNotFound { + return uuid.UUID{}, err + } + if err == gorm.ErrRecordNotFound { //The model is already not present and needs to be inserted + category.ID = catID + mdb := cat.GetCategoryDB(db) + err = db.Create(&mdb).Error + if err != nil { + modelCreationLock.Unlock() + return uuid.UUID{}, err + } + } + categoryCreationLock.Unlock() + return category.ID, nil +} + +func (cdb *CategoryDB) GetCategory(db *database.Handler) (cat Category) { + cat.ID = cdb.ID + cat.Name = cdb.Name + _ = json.Unmarshal(cdb.Metadata, &cat.Metadata) + return +} +func (c *Category) GetCategoryDB(db *database.Handler) (catdb CategoryDB) { + catdb.ID = c.ID + catdb.Name = c.Name + catdb.Metadata, _ = json.Marshal(c.Metadata) + return +} diff --git a/models/meshmodel/core/v1alpha1/component.go b/models/meshmodel/core/v1alpha1/component.go index 3354f318..30ed5f9c 100644 --- a/models/meshmodel/core/v1alpha1/component.go +++ b/models/meshmodel/core/v1alpha1/component.go @@ -8,7 +8,6 @@ import ( "github.com/google/uuid" "github.com/layer5io/meshkit/database" "github.com/layer5io/meshkit/models/meshmodel/core/types" - "gorm.io/gorm" "gorm.io/gorm/clause" ) @@ -58,44 +57,27 @@ func (c ComponentDefinition) GetID() uuid.UUID { func CreateComponent(db *database.Handler, c ComponentDefinition) (uuid.UUID, error) { c.ID = uuid.New() - tempModelID := uuid.New() - byt, err := json.Marshal(c.Model) + mid, err := CreateModel(db, c.Model) if err != nil { return uuid.UUID{}, err } - modelID := uuid.NewSHA1(uuid.UUID{}, byt) - var model Model - modelCreationLock.Lock() - err = db.First(&model, "id = ?", modelID).Error - if err != nil && err != gorm.ErrRecordNotFound { - return uuid.UUID{}, err - } - if model.ID == tempModelID || err == gorm.ErrRecordNotFound { //The model is already not present and needs to be inserted - model = c.Model - model.ID = modelID - mdb := model.GetModelDB() - err = db.Create(&mdb).Error - if err != nil { - modelCreationLock.Unlock() - return uuid.UUID{}, err - } - } - modelCreationLock.Unlock() cdb := c.GetComponentDefinitionDB() - cdb.ModelID = model.ID + cdb.ModelID = mid err = db.Create(&cdb).Error return c.ID, err } func GetMeshModelComponents(db *database.Handler, f ComponentFilter) (c []ComponentDefinition) { type componentDefinitionWithModel struct { ComponentDefinitionDB - Model + ModelDB + CategoryDB } var componentDefinitionsWithModel []componentDefinitionWithModel finder := db.Model(&ComponentDefinitionDB{}). - Select("component_definition_dbs.*, models.*"). - Joins("JOIN models ON component_definition_dbs.model_id = models.id") // + Select("component_definition_dbs.*, model_dbs.*"). + Joins("JOIN model_dbs ON component_definition_dbs.model_id = model_dbs.id"). + Joins("JOIN category_dbs ON model_dbs.category_id = category_dbs.id") // if f.Greedy { if f.Name != "" && f.DisplayName != "" { finder = finder.Where("component_definition_dbs.kind LIKE ? OR component_definition_dbs.display_name LIKE ?", f.Name+"%", f.DisplayName+"%") @@ -113,14 +95,14 @@ func GetMeshModelComponents(db *database.Handler, f ComponentFilter) (c []Compon } } if f.ModelName != "" && f.ModelName != "all" { - finder = finder.Where("models.name = ?", f.ModelName) + finder = finder.Where("model_dbs.name = ?", f.ModelName) } if f.APIVersion != "" { finder = finder.Where("component_definition_dbs.api_version = ?", f.APIVersion) } if f.Version != "" { - finder = finder.Where("models.version = ?", f.Version) + finder = finder.Where("model_dbs.version = ?", f.Version) } if f.OrderOn != "" { if f.Sort == "desc" { @@ -139,7 +121,7 @@ func GetMeshModelComponents(db *database.Handler, f ComponentFilter) (c []Compon fmt.Println(err.Error()) //for debugging } for _, cm := range componentDefinitionsWithModel { - c = append(c, cm.ComponentDefinitionDB.GetComponentDefinition(cm.Model)) + c = append(c, cm.ComponentDefinitionDB.GetComponentDefinition(cm.ModelDB.GetModel(cm.CategoryDB.GetCategory(db)))) } return c } diff --git a/models/meshmodel/core/v1alpha1/models.go b/models/meshmodel/core/v1alpha1/models.go index 951a6aee..2e2cbbaf 100644 --- a/models/meshmodel/core/v1alpha1/models.go +++ b/models/meshmodel/core/v1alpha1/models.go @@ -5,6 +5,8 @@ import ( "sync" "github.com/google/uuid" + "github.com/layer5io/meshkit/database" + "gorm.io/gorm" ) var modelCreationLock sync.Mutex //Each component/relationship will perform a check and if the model already doesn't exist, it will create a model. This lock will make sure that there are no race conditions. @@ -26,16 +28,16 @@ type Model struct { Name string `json:"name"` Version string `json:"version"` DisplayName string `json:"modelDisplayName" gorm:"modelDisplayName"` - Category string `json:"category"` + Category Category `json:"category"` SubCategory string `json:"subCategory" gorm:"subCategory"` Metadata map[string]interface{} `json:"modelMetadata" yaml:"modelMetadata"` } type ModelDB struct { ID uuid.UUID `json:"-"` + CategoryID uuid.UUID `json:"-" gorm:"modelID"` Name string `json:"name"` Version string `json:"version"` DisplayName string `json:"modelDisplayName" gorm:"modelDisplayName"` - Category string `json:"category"` SubCategory string `json:"subCategory" gorm:"subCategory"` Metadata []byte `json:"modelMetadata" gorm:"modelMetadata"` } @@ -47,23 +49,44 @@ func (cf *ModelFilter) Create(m map[string]interface{}) { } cf.Name = m["name"].(string) } -func (cmd *ModelDB) GetModel() (c Model) { - cmd.ID = c.ID - cmd.Category = c.Category - cmd.DisplayName = c.DisplayName - cmd.Name = c.Name - cmd.SubCategory = c.SubCategory - cmd.Version = c.Version - cmd.Metadata, _ = json.Marshal(c.Metadata) - if c.Metadata == nil { - c.Metadata = make(map[string]interface{}) + +func CreateModel(db *database.Handler, cmodel Model) (uuid.UUID, error) { + byt, err := json.Marshal(cmodel) + if err != nil { + return uuid.UUID{}, err + } + modelID := uuid.NewSHA1(uuid.UUID{}, byt) + var model Model + modelCreationLock.Lock() + err = db.First(&model, "id = ?", modelID).Error + if err != nil && err != gorm.ErrRecordNotFound { + return uuid.UUID{}, err } + if err == gorm.ErrRecordNotFound { //The model is already not present and needs to be inserted + model = cmodel + model.ID = modelID + mdb := model.GetModelDB() + err = db.Create(&mdb).Error + if err != nil { + modelCreationLock.Unlock() + return uuid.UUID{}, err + } + } + modelCreationLock.Unlock() + return model.ID, nil +} +func (cmd *ModelDB) GetModel(cat Category) (c Model) { + c.ID = cmd.ID + c.Category = cat + c.DisplayName = cmd.DisplayName + c.Name = cmd.Name + c.SubCategory = cmd.SubCategory + c.Version = cmd.Version _ = json.Unmarshal(cmd.Metadata, &c.Metadata) return } func (c *Model) GetModelDB() (cmd ModelDB) { cmd.ID = c.ID - cmd.Category = c.Category cmd.DisplayName = c.DisplayName cmd.Name = c.Name cmd.SubCategory = c.SubCategory diff --git a/models/meshmodel/core/v1alpha1/policy.go b/models/meshmodel/core/v1alpha1/policy.go index 7cf5eb4b..825904e6 100644 --- a/models/meshmodel/core/v1alpha1/policy.go +++ b/models/meshmodel/core/v1alpha1/policy.go @@ -8,7 +8,6 @@ import ( "github.com/google/uuid" "github.com/layer5io/meshkit/database" "github.com/layer5io/meshkit/models/meshmodel/core/types" - "gorm.io/gorm" ) type PolicyDefinition struct { @@ -94,31 +93,12 @@ func (pdb *PolicyDefinitionDB) GetPolicyDefinition(m Model) (p PolicyDefinition) func CreatePolicy(db *database.Handler, p PolicyDefinition) (uuid.UUID, error) { p.ID = uuid.New() - tempModelID := uuid.New() - byt, err := json.Marshal(p.Model) + mid, err := CreateModel(db, p.Model) if err != nil { return uuid.UUID{}, err } - modelID := uuid.NewSHA1(uuid.UUID{}, byt) - var model Model - modelCreationLock.Lock() - err = db.First(&model, "id = ?", modelID).Error - if err != nil && err != gorm.ErrRecordNotFound { - return uuid.UUID{}, err - } - if model.ID == tempModelID || err == gorm.ErrRecordNotFound { - model = p.Model - model.ID = modelID - mdb := model.GetModelDB() - err = db.Create(&mdb).Error - if err != nil { - modelCreationLock.Unlock() - return uuid.UUID{}, err - } - } - modelCreationLock.Unlock() pdb := p.GetPolicyDefinitionDB() - pdb.ModelID = model.ID + pdb.ModelID = mid err = db.Create(&pdb).Error if err != nil { return uuid.UUID{}, err diff --git a/models/meshmodel/core/v1alpha1/relationship.go b/models/meshmodel/core/v1alpha1/relationship.go index ad119408..80c2b7af 100644 --- a/models/meshmodel/core/v1alpha1/relationship.go +++ b/models/meshmodel/core/v1alpha1/relationship.go @@ -8,7 +8,6 @@ import ( "github.com/google/uuid" "github.com/layer5io/meshkit/database" "github.com/layer5io/meshkit/models/meshmodel/core/types" - "gorm.io/gorm" "gorm.io/gorm/clause" ) @@ -132,31 +131,12 @@ func (r RelationshipDefinition) GetID() uuid.UUID { func CreateRelationship(db *database.Handler, r RelationshipDefinition) (uuid.UUID, error) { r.ID = uuid.New() - tempModelID := uuid.New() - byt, err := json.Marshal(r.Model) + mid, err := CreateModel(db, r.Model) if err != nil { return uuid.UUID{}, err } - modelID := uuid.NewSHA1(uuid.UUID{}, byt) - var model Model - modelCreationLock.Lock() - err = db.First(&model, "id = ?", modelID).Error - if err != nil && err != gorm.ErrRecordNotFound { - return uuid.UUID{}, err - } - if model.ID == tempModelID || err == gorm.ErrRecordNotFound { //The model is already not present and needs to be inserted - model = r.Model - model.ID = modelID - mdb := model.GetModelDB() - err = db.Create(&mdb).Error - if err != nil { - modelCreationLock.Unlock() - return uuid.UUID{}, err - } - } - modelCreationLock.Unlock() rdb := r.GetRelationshipDefinitionDB() - rdb.ModelID = model.ID + rdb.ModelID = mid err = db.Create(&rdb).Error if err != nil { return uuid.UUID{}, err diff --git a/models/meshmodel/registry.go b/models/meshmodel/registry.go index 022e457b..55339a64 100644 --- a/models/meshmodel/registry.go +++ b/models/meshmodel/registry.go @@ -73,7 +73,8 @@ func NewRegistryManager(db *database.Handler) (*RegistryManager, error) { &v1alpha1.ComponentDefinitionDB{}, &v1alpha1.RelationshipDefinitionDB{}, &v1alpha1.PolicyDefinitionDB{}, - &v1alpha1.Model{}, + &v1alpha1.ModelDB{}, + &v1alpha1.Category{}, ) if err != nil { return nil, err @@ -85,7 +86,8 @@ func (rm *RegistryManager) Cleanup() { &Registry{}, &Host{}, &v1alpha1.ComponentDefinitionDB{}, - &v1alpha1.Model{}, + &v1alpha1.ModelDB{}, + &v1alpha1.Category{}, &v1alpha1.RelationshipDefinitionDB{}, ) } @@ -182,10 +184,17 @@ func (rm *RegistryManager) GetEntities(f types.Filter) []Entity { return nil } } -func (rm *RegistryManager) GetModels(f types.Filter) []v1alpha1.Model { - var mod []v1alpha1.ModelDB +func (rm *RegistryManager) GetModels(db *database.Handler, f types.Filter) []v1alpha1.Model { var m []v1alpha1.Model - finder := rm.db.Model(&mod) + type modelWithCategories struct { + v1alpha1.ModelDB + v1alpha1.CategoryDB + } + + var modelWithCategoriess []modelWithCategories + finder := db.Model(&v1alpha1.ModelDB{}). + Select("models.*, category_dbs.*"). + Joins("JOIN category_dbs ON model_dbs.category_id = category_dbs.id") // if mf, ok := f.(*v1alpha1.ModelFilter); ok { if mf.Greedy { if mf.Name != "" && mf.DisplayName != "" { @@ -223,9 +232,13 @@ func (rm *RegistryManager) GetModels(f types.Filter) []v1alpha1.Model { finder = finder.Offset(mf.Offset) } } - _ = finder.Find(&mod).Error - for _, modelDB := range mod { - m = append(m, modelDB.GetModel()) + err := finder. + Scan(&modelWithCategoriess).Error + if err != nil { + fmt.Println(err.Error()) //for debugging + } + for _, modelDB := range modelWithCategoriess { + m = append(m, modelDB.ModelDB.GetModel(modelDB.GetCategory(db))) } return m } diff --git a/models/oam/core/v1alpha1/application_component.go b/models/oam/core/v1alpha1/application_component.go index 1d8d08d2..3d746413 100644 --- a/models/oam/core/v1alpha1/application_component.go +++ b/models/oam/core/v1alpha1/application_component.go @@ -58,6 +58,6 @@ func GetAnnotationsForWorkload(w v1alpha1.ComponentDefinition) map[string]string res[fmt.Sprintf("%s.k8s.APIVersion", MesheryAnnotationPrefix)] = w.APIVersion res[fmt.Sprintf("%s.k8s.Kind", MesheryAnnotationPrefix)] = w.Kind res[fmt.Sprintf("%s.model.version", MesheryAnnotationPrefix)] = w.Model.Version - res[fmt.Sprintf("%s.model.category", MesheryAnnotationPrefix)] = w.Model.Category + res[fmt.Sprintf("%s.model.category", MesheryAnnotationPrefix)] = w.Model.Category.Name return res } From 7ca00e3d846d83ad65b3f9625d0303946f551641 Mon Sep 17 00:00:00 2001 From: Ashish Tiwari Date: Wed, 15 Mar 2023 21:51:31 +0530 Subject: [PATCH 3/9] Add category table Signed-off-by: Ashish Tiwari --- models/meshmodel/core/v1alpha1/models.go | 3 --- models/meshmodel/registry.go | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/models/meshmodel/core/v1alpha1/models.go b/models/meshmodel/core/v1alpha1/models.go index 2e2cbbaf..fa15e2cd 100644 --- a/models/meshmodel/core/v1alpha1/models.go +++ b/models/meshmodel/core/v1alpha1/models.go @@ -29,7 +29,6 @@ type Model struct { Version string `json:"version"` DisplayName string `json:"modelDisplayName" gorm:"modelDisplayName"` Category Category `json:"category"` - SubCategory string `json:"subCategory" gorm:"subCategory"` Metadata map[string]interface{} `json:"modelMetadata" yaml:"modelMetadata"` } type ModelDB struct { @@ -80,7 +79,6 @@ func (cmd *ModelDB) GetModel(cat Category) (c Model) { c.Category = cat c.DisplayName = cmd.DisplayName c.Name = cmd.Name - c.SubCategory = cmd.SubCategory c.Version = cmd.Version _ = json.Unmarshal(cmd.Metadata, &c.Metadata) return @@ -89,7 +87,6 @@ func (c *Model) GetModelDB() (cmd ModelDB) { cmd.ID = c.ID cmd.DisplayName = c.DisplayName cmd.Name = c.Name - cmd.SubCategory = c.SubCategory cmd.Version = c.Version cmd.Metadata, _ = json.Marshal(c.Metadata) return diff --git a/models/meshmodel/registry.go b/models/meshmodel/registry.go index 55339a64..cf64bbd9 100644 --- a/models/meshmodel/registry.go +++ b/models/meshmodel/registry.go @@ -216,7 +216,7 @@ func (rm *RegistryManager) GetModels(db *database.Handler, f types.Filter) []v1a finder = finder.Where("version = ?", mf.Version) } if mf.Category != "" { - finder = finder.Where("category = ?", mf.Category) + finder = finder.Where("categoryName = ?", mf.Category) } if mf.OrderOn != "" { if mf.Sort == "desc" { From 44439ea36f2d3eeb82b862feef057a3919911d28 Mon Sep 17 00:00:00 2001 From: Ashish Tiwari Date: Wed, 15 Mar 2023 21:56:54 +0530 Subject: [PATCH 4/9] Add category table Signed-off-by: Ashish Tiwari --- models/meshmodel/registry.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/models/meshmodel/registry.go b/models/meshmodel/registry.go index cf64bbd9..5a4e2b1d 100644 --- a/models/meshmodel/registry.go +++ b/models/meshmodel/registry.go @@ -74,7 +74,7 @@ func NewRegistryManager(db *database.Handler) (*RegistryManager, error) { &v1alpha1.RelationshipDefinitionDB{}, &v1alpha1.PolicyDefinitionDB{}, &v1alpha1.ModelDB{}, - &v1alpha1.Category{}, + &v1alpha1.CategoryDB{}, ) if err != nil { return nil, err @@ -87,7 +87,7 @@ func (rm *RegistryManager) Cleanup() { &Host{}, &v1alpha1.ComponentDefinitionDB{}, &v1alpha1.ModelDB{}, - &v1alpha1.Category{}, + &v1alpha1.CategoryDB{}, &v1alpha1.RelationshipDefinitionDB{}, ) } From b08721e9a6361120ccf4544bbeb53a0671de66c1 Mon Sep 17 00:00:00 2001 From: Ashish Tiwari Date: Thu, 16 Mar 2023 23:48:43 +0530 Subject: [PATCH 5/9] fix component table bug Signed-off-by: Ashish Tiwari --- models/meshmodel/core/v1alpha1/category.go | 12 ++++++------ models/meshmodel/core/v1alpha1/models.go | 17 +++++++++++------ models/meshmodel/core/v1alpha1/relationship.go | 14 ++++++++------ models/meshmodel/registry.go | 4 ++-- utils/artifacthub/package.go | 3 +++ 5 files changed, 30 insertions(+), 20 deletions(-) diff --git a/models/meshmodel/core/v1alpha1/category.go b/models/meshmodel/core/v1alpha1/category.go index b26cd803..014e12ad 100644 --- a/models/meshmodel/core/v1alpha1/category.go +++ b/models/meshmodel/core/v1alpha1/category.go @@ -13,12 +13,12 @@ var categoryCreationLock sync.Mutex //Each model will perform a check and if the type Category struct { ID uuid.UUID `json:"-"` Name string `json:"name"` - Metadata map[string]interface{} `json:"modelMetadata" yaml:"modelMetadata"` + Metadata map[string]interface{} `json:"metadata" yaml:"metadata"` } type CategoryDB struct { ID uuid.UUID `json:"-"` Name string `json:"categoryName"` - Metadata []byte `json:"categoryMetadata" gorm:"modelMetadata"` + Metadata []byte `json:"categoryMetadata" gorm:"categoryMetadata"` } func CreateCategory(db *database.Handler, cat Category) (uuid.UUID, error) { @@ -27,16 +27,16 @@ func CreateCategory(db *database.Handler, cat Category) (uuid.UUID, error) { return uuid.UUID{}, err } catID := uuid.NewSHA1(uuid.UUID{}, byt) - var category Category + var category CategoryDB categoryCreationLock.Lock() err = db.First(&category, "id = ?", catID).Error if err != nil && err != gorm.ErrRecordNotFound { return uuid.UUID{}, err } if err == gorm.ErrRecordNotFound { //The model is already not present and needs to be inserted - category.ID = catID - mdb := cat.GetCategoryDB(db) - err = db.Create(&mdb).Error + cat.ID = catID + catdb := cat.GetCategoryDB(db) + err = db.Create(&catdb).Error if err != nil { modelCreationLock.Unlock() return uuid.UUID{}, err diff --git a/models/meshmodel/core/v1alpha1/models.go b/models/meshmodel/core/v1alpha1/models.go index 6db8f781..39c19c3e 100644 --- a/models/meshmodel/core/v1alpha1/models.go +++ b/models/meshmodel/core/v1alpha1/models.go @@ -27,9 +27,9 @@ type Model struct { ID uuid.UUID `json:"-"` Name string `json:"name"` Version string `json:"version"` - DisplayName string `json:"modelDisplayName" gorm:"modelDisplayName"` + DisplayName string `json:"displayName" gorm:"modelDisplayName"` Category Category `json:"category"` - Metadata map[string]interface{} `json:"modelMetadata" yaml:"modelMetadata"` + Metadata map[string]interface{} `json:"metadata" yaml:"modelMetadata"` } type ModelDB struct { ID uuid.UUID `json:"-"` @@ -55,16 +55,21 @@ func CreateModel(db *database.Handler, cmodel Model) (uuid.UUID, error) { return uuid.UUID{}, err } modelID := uuid.NewSHA1(uuid.UUID{}, byt) - var model Model + var model ModelDB modelCreationLock.Lock() err = db.First(&model, "id = ?", modelID).Error if err != nil && err != gorm.ErrRecordNotFound { return uuid.UUID{}, err } if err == gorm.ErrRecordNotFound { //The model is already not present and needs to be inserted - model = cmodel - model.ID = modelID - mdb := model.GetModelDB() + id, err := CreateCategory(db, cmodel.Category) + if err != nil { + modelCreationLock.Unlock() + return uuid.UUID{}, err + } + cmodel.ID = modelID + mdb := cmodel.GetModelDB() + mdb.CategoryID = id err = db.Create(&mdb).Error if err != nil { modelCreationLock.Unlock() diff --git a/models/meshmodel/core/v1alpha1/relationship.go b/models/meshmodel/core/v1alpha1/relationship.go index 80c2b7af..f9a85cb8 100644 --- a/models/meshmodel/core/v1alpha1/relationship.go +++ b/models/meshmodel/core/v1alpha1/relationship.go @@ -61,12 +61,14 @@ func (rf *RelationshipFilter) Create(m map[string]interface{}) { func GetMeshModelRelationship(db *database.Handler, f RelationshipFilter) (r []RelationshipDefinition) { type componentDefinitionWithModel struct { RelationshipDefinitionDB - Model + ModelDB + CategoryDB } var componentDefinitionsWithModel []componentDefinitionWithModel finder := db.Model(&RelationshipDefinitionDB{}). - Select("relationship_definition_dbs.*, models.*"). - Joins("JOIN models ON relationship_definition_dbs.model_id = models.id") // + Select("relationship_definition_dbs.*, model_dbs.*"). + Joins("JOIN model_dbs ON relationship_definition_dbs.model_id = model_dbs.id"). // + Joins("JOIN category_dbs ON model_dbs.category_id = category_dbs.id") // if f.Kind != "" { if f.Greedy { finder = finder.Where("relationship_definition_dbs.kind LIKE ?", f.Kind) @@ -78,10 +80,10 @@ func GetMeshModelRelationship(db *database.Handler, f RelationshipFilter) (r []R finder = finder.Where("relationship_definition_dbs.sub_type = ?", f.SubType) } if f.ModelName != "" { - finder = finder.Where("models.name = ?", f.ModelName) + finder = finder.Where("model_dbs.name = ?", f.ModelName) } if f.Version != "" { - finder = finder.Where("models.version = ?", f.Version) + finder = finder.Where("model_dbs.version = ?", f.Version) } if f.OrderOn != "" { if f.Sort == "desc" { @@ -100,7 +102,7 @@ func GetMeshModelRelationship(db *database.Handler, f RelationshipFilter) (r []R fmt.Println(err.Error()) //for debugging } for _, cm := range componentDefinitionsWithModel { - r = append(r, cm.RelationshipDefinitionDB.GetRelationshipDefinition(cm.Model)) + r = append(r, cm.RelationshipDefinitionDB.GetRelationshipDefinition(cm.ModelDB.GetModel(cm.CategoryDB.GetCategory(db)))) } return r } diff --git a/models/meshmodel/registry.go b/models/meshmodel/registry.go index 5a4e2b1d..094083f6 100644 --- a/models/meshmodel/registry.go +++ b/models/meshmodel/registry.go @@ -193,7 +193,7 @@ func (rm *RegistryManager) GetModels(db *database.Handler, f types.Filter) []v1a var modelWithCategoriess []modelWithCategories finder := db.Model(&v1alpha1.ModelDB{}). - Select("models.*, category_dbs.*"). + Select("model_dbs.*, category_dbs.*"). Joins("JOIN category_dbs ON model_dbs.category_id = category_dbs.id") // if mf, ok := f.(*v1alpha1.ModelFilter); ok { if mf.Greedy { @@ -216,7 +216,7 @@ func (rm *RegistryManager) GetModels(db *database.Handler, f types.Filter) []v1a finder = finder.Where("version = ?", mf.Version) } if mf.Category != "" { - finder = finder.Where("categoryName = ?", mf.Category) + finder = finder.Where("category_dbs.name = ?", mf.Category) } if mf.OrderOn != "" { if mf.Sort == "desc" { diff --git a/utils/artifacthub/package.go b/utils/artifacthub/package.go index 394fc599..8855e8b9 100644 --- a/utils/artifacthub/package.go +++ b/utils/artifacthub/package.go @@ -47,6 +47,9 @@ func (pkg AhPackage) GenerateComponents() ([]v1alpha1.ComponentDefinition, error } comp.Model.Version = pkg.Version comp.Model.Name = pkg.Name + comp.Model.Category = v1alpha1.Category{ + Name: "", + } comp.Model.DisplayName = manifests.FormatToReadableString(comp.Model.Name) components = append(components, comp) } From db36b67b74cde715dd6baef11904f3519793e5c2 Mon Sep 17 00:00:00 2001 From: Ashish Tiwari Date: Fri, 17 Mar 2023 15:14:30 +0530 Subject: [PATCH 6/9] Fix queries Signed-off-by: Ashish Tiwari --- models/meshmodel/core/v1alpha1/category.go | 2 +- models/meshmodel/core/v1alpha1/component.go | 4 ++-- models/meshmodel/core/v1alpha1/models.go | 4 ++-- models/meshmodel/core/v1alpha1/policy.go | 4 ++-- models/meshmodel/registry.go | 13 +++++++------ 5 files changed, 14 insertions(+), 13 deletions(-) diff --git a/models/meshmodel/core/v1alpha1/category.go b/models/meshmodel/core/v1alpha1/category.go index 014e12ad..a227819f 100644 --- a/models/meshmodel/core/v1alpha1/category.go +++ b/models/meshmodel/core/v1alpha1/category.go @@ -17,7 +17,7 @@ type Category struct { } type CategoryDB struct { ID uuid.UUID `json:"-"` - Name string `json:"categoryName"` + Name string `json:"categoryName" gorm:"categoryName"` Metadata []byte `json:"categoryMetadata" gorm:"categoryMetadata"` } diff --git a/models/meshmodel/core/v1alpha1/component.go b/models/meshmodel/core/v1alpha1/component.go index 1567c1ee..860d2d5b 100644 --- a/models/meshmodel/core/v1alpha1/component.go +++ b/models/meshmodel/core/v1alpha1/component.go @@ -89,12 +89,12 @@ func GetMeshModelComponents(db *database.Handler, f ComponentFilter) (c []Compon var componentDefinitionsWithModel []componentDefinitionWithModel finder := db.Model(&ComponentDefinitionDB{}). - Select("component_definition_dbs.*, model_dbs.*"). + Select("component_definition_dbs.*, model_dbs.*,category_dbs.*"). Joins("JOIN model_dbs ON component_definition_dbs.model_id = model_dbs.id"). Joins("JOIN category_dbs ON model_dbs.category_id = category_dbs.id") // if f.Greedy { if f.Name != "" && f.DisplayName != "" { - finder = finder.Where("component_definition_dbs.kind LIKE ? OR component_definition_dbs.display_name LIKE ?", f.Name+"%", f.DisplayName+"%") + finder = finder.Where("component_definition_dbs.kind LIKE ? OR display_name LIKE ?", f.Name+"%", f.DisplayName+"%") } else if f.Name != "" { finder = finder.Where("component_definition_dbs.kind LIKE ?", f.Name+"%") } else if f.DisplayName != "" { diff --git a/models/meshmodel/core/v1alpha1/models.go b/models/meshmodel/core/v1alpha1/models.go index 39c19c3e..45c27d35 100644 --- a/models/meshmodel/core/v1alpha1/models.go +++ b/models/meshmodel/core/v1alpha1/models.go @@ -33,8 +33,8 @@ type Model struct { } type ModelDB struct { ID uuid.UUID `json:"-"` - CategoryID uuid.UUID `json:"-" gorm:"modelID"` - Name string `json:"name"` + CategoryID uuid.UUID `json:"-" gorm:"categoryID"` + Name string `json:"modelName" gorm:"modelName"` Version string `json:"version"` DisplayName string `json:"modelDisplayName" gorm:"modelDisplayName"` SubCategory string `json:"subCategory" gorm:"subCategory"` diff --git a/models/meshmodel/core/v1alpha1/policy.go b/models/meshmodel/core/v1alpha1/policy.go index 825904e6..f616cb4e 100644 --- a/models/meshmodel/core/v1alpha1/policy.go +++ b/models/meshmodel/core/v1alpha1/policy.go @@ -58,7 +58,7 @@ func GetMeshModelPolicy(db *database.Handler, f PolicyFilter) (pl []PolicyDefini var componentDefinitionsWithModel []componentDefinitionWithModel finder := db.Model(&PolicyDefinitionDB{}). Select("policy_definition_dbs.*, models.*"). - Joins("JOIN models ON models.id = policy_definition_dbs.model_id") + Joins("JOIN model_dbs ON model_dbs.id = policy_definition_dbs.model_id") if f.Kind != "" { finder = finder.Where("policy_definition_dbs.kind = ?", f.Kind) } @@ -66,7 +66,7 @@ func GetMeshModelPolicy(db *database.Handler, f PolicyFilter) (pl []PolicyDefini finder = finder.Where("policy_definition_dbs.sub_type = ?", f.SubType) } if f.ModelName != "" { - finder = finder.Where("models.name = ?", f.ModelName) + finder = finder.Where("model_dbs.name = ?", f.ModelName) } err := finder.Scan(&componentDefinitionsWithModel).Error if err != nil { diff --git a/models/meshmodel/registry.go b/models/meshmodel/registry.go index 094083f6..95734421 100644 --- a/models/meshmodel/registry.go +++ b/models/meshmodel/registry.go @@ -198,22 +198,22 @@ func (rm *RegistryManager) GetModels(db *database.Handler, f types.Filter) []v1a if mf, ok := f.(*v1alpha1.ModelFilter); ok { if mf.Greedy { if mf.Name != "" && mf.DisplayName != "" { - finder = finder.Where("name LIKE ? OR display_name LIKE ?", mf.Name+"%", mf.DisplayName+"%") + finder = finder.Where("model_dbs.name LIKE ? OR model_dbs.display_name LIKE ?", mf.Name+"%", mf.DisplayName+"%") } else if mf.Name != "" { - finder = finder.Where("name LIKE ?", mf.Name+"%") + finder = finder.Where("model_dbs.name LIKE ?", mf.Name+"%") } else if mf.DisplayName != "" { - finder = finder.Where("display_name LIKE ?", mf.DisplayName+"%") + finder = finder.Where("model_dbs.display_name LIKE ?", mf.DisplayName+"%") } } else { if mf.Name != "" { - finder = finder.Where("name = ?", mf.Name) + finder = finder.Where("model_dbs.name = ?", mf.Name) } if mf.DisplayName != "" { - finder = finder.Where("display_name = ?", mf.DisplayName) + finder = finder.Where("model_dbs.display_name = ?", mf.DisplayName) } } if mf.Version != "" { - finder = finder.Where("version = ?", mf.Version) + finder = finder.Where("model_dbs.version = ?", mf.Version) } if mf.Category != "" { finder = finder.Where("category_dbs.name = ?", mf.Category) @@ -235,6 +235,7 @@ func (rm *RegistryManager) GetModels(db *database.Handler, f types.Filter) []v1a err := finder. Scan(&modelWithCategoriess).Error if err != nil { + fmt.Println(modelWithCategoriess) fmt.Println(err.Error()) //for debugging } for _, modelDB := range modelWithCategoriess { From 1da55c75d9dcf1cd4b45134000957796c762f642 Mon Sep 17 00:00:00 2001 From: Ashish Tiwari Date: Fri, 17 Mar 2023 18:08:27 +0530 Subject: [PATCH 7/9] Finish category refactor Signed-off-by: Ashish Tiwari --- models/meshmodel/core/v1alpha1/category.go | 16 ++++++++++++ models/meshmodel/core/v1alpha1/component.go | 27 +++++++++++--------- models/meshmodel/core/v1alpha1/models.go | 16 ++++++------ models/meshmodel/registry.go | 28 +++++++++++++++++++++ 4 files changed, 67 insertions(+), 20 deletions(-) diff --git a/models/meshmodel/core/v1alpha1/category.go b/models/meshmodel/core/v1alpha1/category.go index a227819f..5e122309 100644 --- a/models/meshmodel/core/v1alpha1/category.go +++ b/models/meshmodel/core/v1alpha1/category.go @@ -10,6 +10,8 @@ import ( ) var categoryCreationLock sync.Mutex //Each model will perform a check and if the category already doesn't exist, it will create a category. This lock will make sure that there are no race conditions. + +// swagger:response Category type Category struct { ID uuid.UUID `json:"-"` Name string `json:"name"` @@ -20,7 +22,21 @@ type CategoryDB struct { Name string `json:"categoryName" gorm:"categoryName"` Metadata []byte `json:"categoryMetadata" gorm:"categoryMetadata"` } +type CategoryFilter struct { + Name string + OrderOn string + Sort string //asc or desc. Default behavior is asc + Limit int //If 0 or unspecified then all records are returned and limit is not used + Offset int +} +// Create the filter from map[string]interface{} +func (cf *CategoryFilter) Create(m map[string]interface{}) { + if m == nil { + return + } + cf.Name = m["name"].(string) +} func CreateCategory(db *database.Handler, cat Category) (uuid.UUID, error) { byt, err := json.Marshal(cat) if err != nil { diff --git a/models/meshmodel/core/v1alpha1/component.go b/models/meshmodel/core/v1alpha1/component.go index 860d2d5b..dd2979c8 100644 --- a/models/meshmodel/core/v1alpha1/component.go +++ b/models/meshmodel/core/v1alpha1/component.go @@ -114,7 +114,9 @@ func GetMeshModelComponents(db *database.Handler, f ComponentFilter) (c []Compon if f.APIVersion != "" { finder = finder.Where("component_definition_dbs.api_version = ?", f.APIVersion) } - + if f.CategoryName != "" { + finder = finder.Where("category_dbs.name = ?", f.CategoryName) + } if f.Version != "" { finder = finder.Where("model_dbs.version = ?", f.Version) } @@ -145,17 +147,18 @@ func GetMeshModelComponents(db *database.Handler, f ComponentFilter) (c []Compon } type ComponentFilter struct { - Name string - APIVersion string - Greedy bool //when set to true - instead of an exact match, name will be prefix matched - Trim bool //when set to true - the schema is not returned - DisplayName string - ModelName string - Version string - Sort string //asc or desc. Default behavior is asc - OrderOn string - Limit int //If 0 or unspecified then all records are returned and limit is not used - Offset int + Name string + APIVersion string + Greedy bool //when set to true - instead of an exact match, name will be prefix matched + Trim bool //when set to true - the schema is not returned + DisplayName string + ModelName string + CategoryName string + Version string + Sort string //asc or desc. Default behavior is asc + OrderOn string + Limit int //If 0 or unspecified then all records are returned and limit is not used + Offset int } // Create the filter from map[string]interface{} diff --git a/models/meshmodel/core/v1alpha1/models.go b/models/meshmodel/core/v1alpha1/models.go index 45c27d35..6c04b156 100644 --- a/models/meshmodel/core/v1alpha1/models.go +++ b/models/meshmodel/core/v1alpha1/models.go @@ -22,6 +22,14 @@ type ModelFilter struct { Offset int } +// Create the filter from map[string]interface{} +func (cf *ModelFilter) Create(m map[string]interface{}) { + if m == nil { + return + } + cf.Name = m["name"].(string) +} + // swagger:response Model type Model struct { ID uuid.UUID `json:"-"` @@ -41,14 +49,6 @@ type ModelDB struct { Metadata []byte `json:"modelMetadata" gorm:"modelMetadata"` } -// Create the filter from map[string]interface{} -func (cf *ModelFilter) Create(m map[string]interface{}) { - if m == nil { - return - } - cf.Name = m["name"].(string) -} - func CreateModel(db *database.Handler, cmodel Model) (uuid.UUID, error) { byt, err := json.Marshal(cmodel) if err != nil { diff --git a/models/meshmodel/registry.go b/models/meshmodel/registry.go index 95734421..a6f63f8a 100644 --- a/models/meshmodel/registry.go +++ b/models/meshmodel/registry.go @@ -243,6 +243,34 @@ func (rm *RegistryManager) GetModels(db *database.Handler, f types.Filter) []v1a } return m } +func (rm *RegistryManager) GetCategories(db *database.Handler, f types.Filter) []v1alpha1.Category { + var catdb []v1alpha1.CategoryDB + var cat []v1alpha1.Category + finder := rm.db.Model(&catdb) + if mf, ok := f.(*v1alpha1.CategoryFilter); ok { + if mf.Name != "" { + finder = finder.Where("name = ?", mf.Name) + } + if mf.OrderOn != "" { + if mf.Sort == "desc" { + finder = finder.Order(clause.OrderByColumn{Column: clause.Column{Name: mf.OrderOn}, Desc: true}) + } else { + finder = finder.Order(mf.OrderOn) + } + } + if mf.Limit != 0 { + finder = finder.Limit(mf.Limit) + } + if mf.Offset != 0 { + finder = finder.Offset(mf.Offset) + } + } + _ = finder.Find(&catdb).Error + for _, c := range catdb { + cat = append(cat, c.GetCategory(db)) + } + return cat +} func (rm *RegistryManager) GetRegistrant(e Entity) Host { eID := e.GetID() var reg Registry From 7979e6c5d9dbcf2925e794a7032f198e81be11ee Mon Sep 17 00:00:00 2001 From: Ashish Tiwari Date: Fri, 17 Mar 2023 19:48:27 +0530 Subject: [PATCH 8/9] fix deadlock Signed-off-by: Ashish Tiwari --- models/meshmodel/core/v1alpha1/category.go | 8 ++++++-- models/meshmodel/core/v1alpha1/models.go | 8 +++++--- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/models/meshmodel/core/v1alpha1/category.go b/models/meshmodel/core/v1alpha1/category.go index 5e122309..36deacac 100644 --- a/models/meshmodel/core/v1alpha1/category.go +++ b/models/meshmodel/core/v1alpha1/category.go @@ -30,6 +30,8 @@ type CategoryFilter struct { Offset int } +const DefaultCategory = "Miscellaneous" + // Create the filter from map[string]interface{} func (cf *CategoryFilter) Create(m map[string]interface{}) { if m == nil { @@ -44,7 +46,11 @@ func CreateCategory(db *database.Handler, cat Category) (uuid.UUID, error) { } catID := uuid.NewSHA1(uuid.UUID{}, byt) var category CategoryDB + if cat.Name == "" { + cat.Name = DefaultCategory + } categoryCreationLock.Lock() + defer categoryCreationLock.Unlock() err = db.First(&category, "id = ?", catID).Error if err != nil && err != gorm.ErrRecordNotFound { return uuid.UUID{}, err @@ -54,11 +60,9 @@ func CreateCategory(db *database.Handler, cat Category) (uuid.UUID, error) { catdb := cat.GetCategoryDB(db) err = db.Create(&catdb).Error if err != nil { - modelCreationLock.Unlock() return uuid.UUID{}, err } } - categoryCreationLock.Unlock() return category.ID, nil } diff --git a/models/meshmodel/core/v1alpha1/models.go b/models/meshmodel/core/v1alpha1/models.go index 6c04b156..6e626d3d 100644 --- a/models/meshmodel/core/v1alpha1/models.go +++ b/models/meshmodel/core/v1alpha1/models.go @@ -2,6 +2,7 @@ package v1alpha1 import ( "encoding/json" + "fmt" "sync" "github.com/google/uuid" @@ -56,7 +57,11 @@ func CreateModel(db *database.Handler, cmodel Model) (uuid.UUID, error) { } modelID := uuid.NewSHA1(uuid.UUID{}, byt) var model ModelDB + if cmodel.Name == "" { + return uuid.UUID{}, fmt.Errorf("empty or invalid model name passed") + } modelCreationLock.Lock() + defer modelCreationLock.Unlock() err = db.First(&model, "id = ?", modelID).Error if err != nil && err != gorm.ErrRecordNotFound { return uuid.UUID{}, err @@ -64,7 +69,6 @@ func CreateModel(db *database.Handler, cmodel Model) (uuid.UUID, error) { if err == gorm.ErrRecordNotFound { //The model is already not present and needs to be inserted id, err := CreateCategory(db, cmodel.Category) if err != nil { - modelCreationLock.Unlock() return uuid.UUID{}, err } cmodel.ID = modelID @@ -72,11 +76,9 @@ func CreateModel(db *database.Handler, cmodel Model) (uuid.UUID, error) { mdb.CategoryID = id err = db.Create(&mdb).Error if err != nil { - modelCreationLock.Unlock() return uuid.UUID{}, err } } - modelCreationLock.Unlock() return model.ID, nil } func (cmd *ModelDB) GetModel(cat Category) (c Model) { From d0ab62a15271343b063adc169a4b4ef81c193f9b Mon Sep 17 00:00:00 2001 From: Ashish Tiwari Date: Mon, 20 Mar 2023 22:30:39 +0530 Subject: [PATCH 9/9] Fix empty UUIDs Signed-off-by: Ashish Tiwari --- models/meshmodel/core/v1alpha1/category.go | 9 +++++---- models/meshmodel/core/v1alpha1/models.go | 1 + 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/models/meshmodel/core/v1alpha1/category.go b/models/meshmodel/core/v1alpha1/category.go index 36deacac..492588d5 100644 --- a/models/meshmodel/core/v1alpha1/category.go +++ b/models/meshmodel/core/v1alpha1/category.go @@ -40,28 +40,29 @@ func (cf *CategoryFilter) Create(m map[string]interface{}) { cf.Name = m["name"].(string) } func CreateCategory(db *database.Handler, cat Category) (uuid.UUID, error) { + if cat.Name == "" { + cat.Name = DefaultCategory + } byt, err := json.Marshal(cat) if err != nil { return uuid.UUID{}, err } catID := uuid.NewSHA1(uuid.UUID{}, byt) var category CategoryDB - if cat.Name == "" { - cat.Name = DefaultCategory - } categoryCreationLock.Lock() defer categoryCreationLock.Unlock() err = db.First(&category, "id = ?", catID).Error if err != nil && err != gorm.ErrRecordNotFound { return uuid.UUID{}, err } - if err == gorm.ErrRecordNotFound { //The model is already not present and needs to be inserted + if err == gorm.ErrRecordNotFound { //The category is already not present and needs to be inserted cat.ID = catID catdb := cat.GetCategoryDB(db) err = db.Create(&catdb).Error if err != nil { return uuid.UUID{}, err } + return catdb.ID, nil } return category.ID, nil } diff --git a/models/meshmodel/core/v1alpha1/models.go b/models/meshmodel/core/v1alpha1/models.go index 6e626d3d..e79eeb81 100644 --- a/models/meshmodel/core/v1alpha1/models.go +++ b/models/meshmodel/core/v1alpha1/models.go @@ -78,6 +78,7 @@ func CreateModel(db *database.Handler, cmodel Model) (uuid.UUID, error) { if err != nil { return uuid.UUID{}, err } + return mdb.ID, nil } return model.ID, nil }