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
7 changes: 4 additions & 3 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,7 @@ replace (
// github.com/docker/libcompose => github.com/docker/libcompose v0.4.1-0.20190808084053-143e0f3f1ab9
github.com/googleapis/gnostic => github.com/googleapis/gnostic v0.5.5
github.com/jaguilar/vt100 => github.com/tonistiigi/vt100 v0.0.0-20190402012908-ad4c4a574305

//github.com/meshery/schemas v0.8.34 => ../schemas
github.com/meshery/schemas => ../schemas
)

require (
Expand Down Expand Up @@ -204,7 +203,7 @@ require (
github.com/lestrrat-go/httprc/v3 v3.0.2 // indirect
github.com/lestrrat-go/jwx/v3 v3.0.12 // indirect
github.com/lestrrat-go/option/v2 v2.0.0 // indirect
github.com/lib/pq v1.10.9 // indirect
github.com/lib/pq v1.11.1 // indirect
github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de // indirect
github.com/mattn/go-colorable v0.1.14 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
Expand Down Expand Up @@ -309,3 +308,5 @@ require (
)

replace github.com/meshery/meshkit => ../meshkit

replace github.com/meshery/schemas => ../schemas
5 changes: 2 additions & 3 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -409,8 +409,9 @@ github.com/lestrrat-go/jwx/v3 v3.0.12 h1:p25r68Y4KrbBdYjIsQweYxq794CtGCzcrc5dGzJ
github.com/lestrrat-go/jwx/v3 v3.0.12/go.mod h1:HiUSaNmMLXgZ08OmGBaPVvoZQgJVOQphSrGr5zMamS8=
github.com/lestrrat-go/option/v2 v2.0.0 h1:XxrcaJESE1fokHy3FpaQ/cXW8ZsIdWcdFzzLOcID3Ss=
github.com/lestrrat-go/option/v2 v2.0.0/go.mod h1:oSySsmzMoR0iRzCDCaUfsCzxQHUEuhOViQObyy7S6Vg=
github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw=
github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
github.com/lib/pq v1.11.1 h1:wuChtj2hfsGmmx3nf1m7xC2XpK6OtelS2shMY+bGMtI=
github.com/lib/pq v1.11.1/go.mod h1:/p+8NSbOcwzAEI7wiMXFlgydTwcgTr3OSKMsD2BitpA=
github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de h1:9TO3cAIGXtEhnIaL+V+BEER86oLrvS+kWobKpbJuye0=
github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE=
github.com/lithammer/dedent v1.1.0 h1:VNzHMVCBNG1j0fh3OrsFRkVUwStdDArbgBWoPAffktY=
Expand All @@ -428,8 +429,6 @@ github.com/mattn/go-sqlite3 v1.14.32 h1:JD12Ag3oLy1zQA+BNn74xRgaBbdhbNIDYvQUEuuE
github.com/mattn/go-sqlite3 v1.14.32/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
github.com/meshery/meshery-operator v0.8.11 h1:eDo2Sw0jjVrXsvvhF8LenADM58pK+7Z68ROPVIejTPc=
github.com/meshery/meshery-operator v0.8.11/go.mod h1:hQEtFKKa5Fr/Mskk6bV5ip3bQ0+3F0u1voYS3XisBp4=
github.com/meshery/schemas v0.8.113 h1:gQMKIJSKGTT6PuJje0XTxuHfCv9ERVLX9IrG1JyFAM8=
github.com/meshery/schemas v0.8.113/go.mod h1:UwoDPg3j/2BMfytdgaalpemRKUxB9HhFsUZqJA01/G4=
github.com/miekg/dns v1.1.57 h1:Jzi7ApEIzwEPLHWRcafCN9LZSBbqQpxjt/wpgvg7wcM=
github.com/miekg/dns v1.1.57/go.mod h1:uqRjCRUuEAA6qsOiJvDd+CFo/vW+y5WR6SNmHE55hZk=
github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw=
Expand Down
11 changes: 2 additions & 9 deletions models/meshmodel/registry/error.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"fmt"

"github.com/meshery/meshkit/errors"
registryerrors "github.com/meshery/meshkit/models/meshmodel/registry/errors"
)

var (
Expand All @@ -18,15 +19,7 @@ var (
)

func ErrGetById(err error, id string) error {
return errors.New(
ErrUnknownHostCode,
errors.Alert,
[]string{"Failed to get the entity with the given ID: " + id},
[]string{err.Error()},
[]string{"Entity with the given ID may not be present in the registry", "Registry might be inaccessible at the moment"},
[]string{"Check if your ID is correct", "If the registry is inaccesible, please try again after some time"},
)

return registryerrors.ErrGetById(err, id)
}

func ErrUnknownHost(err error) error {
Expand Down
20 changes: 20 additions & 0 deletions models/meshmodel/registry/errors/error.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package errors

import (
meshkiterrors "github.com/meshery/meshkit/errors"
)

const (
ErrGetByIdCode = "meshkit-11262"
)

func ErrGetById(err error, id string) error {
return meshkiterrors.New(
ErrGetByIdCode,
meshkiterrors.Alert,
[]string{"Failed to get the entity with the given ID: " + id},
[]string{err.Error()},
[]string{"Entity with the given ID may not be present in the registry", "Registry might be inaccessible at the moment"},
[]string{"Check if your ID is correct", "If the registry is inaccesible, please try again after some time"},
)
}
27 changes: 21 additions & 6 deletions models/meshmodel/registry/registry.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,11 @@ import (
"github.com/meshery/meshkit/database"
models "github.com/meshery/meshkit/models/meshmodel/core/v1beta1"
"github.com/meshery/meshkit/models/meshmodel/entity"
"github.com/meshery/schemas/models/v1alpha3/relationship"
regv1alpha3 "github.com/meshery/meshkit/models/meshmodel/registry/v1alpha3"
regv1beta1 "github.com/meshery/meshkit/models/meshmodel/registry/v1beta1"
schemarelationship "github.com/meshery/schemas/models/v1alpha3/relationship"
"github.com/meshery/schemas/models/v1beta1/category"
"github.com/meshery/schemas/models/v1beta1/component"
schemacomponent "github.com/meshery/schemas/models/v1beta1/component"
"github.com/meshery/schemas/models/v1beta1/connection"
"github.com/meshery/schemas/models/v1beta1/model"
"golang.org/x/text/cases"
Expand Down Expand Up @@ -95,8 +97,8 @@ func NewRegistryManager(db *database.Handler) (*RegistryManager, error) {
err := rm.db.AutoMigrate(
&Registry{},
&connection.Connection{},
&component.ComponentDefinition{},
&relationship.RelationshipDefinition{},
&schemacomponent.ComponentDefinition{},
&schemarelationship.RelationshipDefinition{},
&models.PolicyDefinition{},
&model.ModelDefinition{},
&category.CategoryDefinition{},
Expand All @@ -106,14 +108,27 @@ func NewRegistryManager(db *database.Handler) (*RegistryManager, error) {
}
return &rm, nil
}

func (rm *RegistryManager) GetComponentSummary(
f *schemacomponent.ComponentSummaryFilter,
) (*schemacomponent.ComponentSummary, error) {
return regv1beta1.GetSummary(f, rm.db)
}

func (rm *RegistryManager) GetRelationshipSummary(
f *schemarelationship.RelationshipSummaryFilter,
) (*schemarelationship.RelationshipSummary, error) {
return regv1alpha3.GetSummary(f, rm.db)
}

func (rm *RegistryManager) Cleanup() {
_ = rm.db.Migrator().DropTable(
&Registry{},
&connection.Connection{},
&component.ComponentDefinition{},
&schemacomponent.ComponentDefinition{},
&model.ModelDefinition{},
&category.CategoryDefinition{},
&relationship.RelationshipDefinition{},
&schemarelationship.RelationshipDefinition{},
)
}
func (rm *RegistryManager) RegisterEntity(h connection.Connection, en entity.Entity) (bool, bool, error) {
Expand Down
4 changes: 2 additions & 2 deletions models/meshmodel/registry/v1alpha3/relationship_filter.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package v1alpha3
import (
"github.com/meshery/meshkit/database"
"github.com/meshery/meshkit/models/meshmodel/entity"
"github.com/meshery/meshkit/models/meshmodel/registry"
registryerrors "github.com/meshery/meshkit/models/meshmodel/registry/errors"
"github.com/meshery/schemas/models/v1alpha3/relationship"

"gorm.io/gorm/clause"
Expand Down Expand Up @@ -39,7 +39,7 @@ func (rf *RelationshipFilter) GetById(db *database.Handler) (entity.Entity, erro
r := &relationship.RelationshipDefinition{}
err := db.First(r, "id = ?", rf.Id).Error
if err != nil {
return nil, registry.ErrGetById(err, rf.Id)
return nil, registryerrors.ErrGetById(err, rf.Id)
}
return r, err
}
Expand Down
146 changes: 146 additions & 0 deletions models/meshmodel/registry/v1alpha3/relationship_summary.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,146 @@
package v1alpha3

import (
"fmt"
"slices"

"github.com/meshery/meshkit/database"
relationship "github.com/meshery/schemas/models/v1alpha3/relationship"

"gorm.io/gorm"
)

func GetSummary(relationshipFilter *relationship.RelationshipSummaryFilter, db *database.Handler) (*relationship.RelationshipSummary, error) {
if err := validate(relationshipFilter); err != nil {
return nil, err
}

summary := &relationship.RelationshipSummary{}

base := db.Table("relationship_definition_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")

status := "enabled"

if relationshipFilter.Status != nil {
status = *relationshipFilter.Status
}

base = base.Where("model_dbs.status = ?", status)

if relationshipFilter.Kind != nil {
greedy := relationshipFilter.Greedy != nil && *relationshipFilter.Greedy
if greedy {
base = base.Where("relationship_definition_dbs.kind LIKE ?", "%"+*relationshipFilter.Kind+"%")
} else {
base = base.Where("relationship_definition_dbs.kind = ?", *relationshipFilter.Kind)
}
}

if relationshipFilter.RelationshipType != nil {
base = base.Where("relationship_definition_dbs.type = ?", *relationshipFilter.RelationshipType)
}

if relationshipFilter.SubType != nil {
base = base.Where("relationship_definition_dbs.sub_type = ?", *relationshipFilter.SubType)
}
if relationshipFilter.ModelName != nil {
base = base.Where("model_dbs.name = ?", *relationshipFilter.ModelName)
}
if relationshipFilter.Version != nil {
base = base.Where("model_dbs.model->>'version' = ?", *relationshipFilter.Version)
}
if err := base.Session(&gorm.Session{}).
Distinct("relationship_definition_dbs.id").
Count(&summary.Total).Error; err != nil {
return nil, err
}

shouldCompute := func(dim relationship.RelationshipSummaryFilterInclude) bool {
if relationshipFilter.Include == nil || len(*relationshipFilter.Include) == 0 {
return true
}

return slices.Contains(*relationshipFilter.Include, dim)
}

type groupEntry = struct {
Count int32 `json:"count" yaml:"count"`
Key string `json:"key" yaml:"key"`
}

type dimensionInfo struct {
dim relationship.RelationshipSummaryFilterInclude
selectExpr string
groupExpr string
setRows func([]groupEntry)
}

dimensions := []dimensionInfo{
{
dim: relationship.ByModel,
selectExpr: "model_dbs.name as Key, COUNT(DISTINCT(relationship_definition_dbs.id)) as Count",
groupExpr: "model_dbs.name",
setRows: func(rows []groupEntry) {
summary.ByModel = &rows
},
},
{
dim: relationship.ByKind,
selectExpr: "relationship_definition_dbs.kind as Key, COUNT(DISTINCT(relationship_definition_dbs.id)) as Count",
groupExpr: "relationship_definition_dbs.kind",
setRows: func(rows []groupEntry) {
summary.ByKind = &rows
},
},
{
dim: relationship.ByType,
selectExpr: "relationship_definition_dbs.type as Key, COUNT(DISTINCT(relationship_definition_dbs.id)) as Count",
groupExpr: "relationship_definition_dbs.type",
setRows: func(rows []groupEntry) {
summary.ByType = &rows
},
},
{
dim: relationship.BySubtype,
selectExpr: "relationship_definition_dbs.sub_type as Key, COUNT(DISTINCT(relationship_definition_dbs.id)) as Count",
groupExpr: "relationship_definition_dbs.sub_type",
setRows: func(rows []groupEntry) {
summary.BySubType = &rows
},
},
}

for _, d := range dimensions {
if shouldCompute(d.dim) {
var rows []groupEntry
err := base.Session(&gorm.Session{}).
Select(d.selectExpr).
Group(d.groupExpr).
Scan(&rows).Error
if err != nil {
return nil, err
}
d.setRows(rows)
}
}
return summary, nil
}

func validate(relationshipFilter *relationship.RelationshipSummaryFilter) error {
if relationshipFilter == nil {
return fmt.Errorf("nil relationship summary filter")
}

if relationshipFilter.Include == nil {
return nil
}

for _, dim := range *relationshipFilter.Include {
if !dim.Valid() {
return fmt.Errorf("unknown include dimension %s", dim)
}
}
return nil
}
Loading