diff --git a/go.mod b/go.mod index 93fc21c1be..8469ddda0c 100644 --- a/go.mod +++ b/go.mod @@ -7,6 +7,7 @@ require ( github.com/layer5io/meshkit v0.7.50 github.com/oapi-codegen/runtime v1.1.1 github.com/pkg/errors v0.9.1 + gonum.org/v1/gonum v0.15.0 gorm.io/gorm v1.25.11 ) diff --git a/go.sum b/go.sum index db9e1644b1..43639982d2 100644 --- a/go.sum +++ b/go.sum @@ -177,6 +177,8 @@ golang.org/x/tools v0.16.0 h1:GO788SKMRunPIBCXiQyo2AaexLstOrVhuAL5YwsckQM= golang.org/x/tools v0.16.0/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gonum.org/v1/gonum v0.15.0 h1:2lYxjRbTYyxkJxlhC+LvJIx3SsANPdRybu1tGj9/OrQ= +gonum.org/v1/gonum v0.15.0/go.mod h1:xzZVBJBtS+Mz4q0Yl2LJTk+OxOg4jiXZ7qBoM0uISGo= google.golang.org/api v0.152.0 h1:t0r1vPnfMc260S2Ci+en7kfCZaLOPs5KI0sVV/6jZrY= google.golang.org/api v0.152.0/go.mod h1:3qNJX5eOmhiWYc67jRA/3GsDw97UFb5ivv7Y2PrriAY= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= diff --git a/models/v1beta1/pattern/design_conversion.go b/models/v1beta1/pattern/design_conversion.go index b0bc0bd5a3..3cd562ccd1 100644 --- a/models/v1beta1/pattern/design_conversion.go +++ b/models/v1beta1/pattern/design_conversion.go @@ -3,6 +3,8 @@ package pattern import ( "crypto/rand" "math/big" + "reflect" + "strings" "github.com/gofrs/uuid" "github.com/layer5io/meshkit/utils" @@ -13,6 +15,7 @@ import ( "github.com/meshery/schemas/models/v1beta1/component" "github.com/meshery/schemas/models/v1beta1/model" "github.com/pkg/errors" + "gonum.org/v1/gonum/graph/formats/cytoscapejs" ) // The pattern file indicated by "p", is converted to the version pointed by "pattern", the version of the patternFile which implements the Hub interface indicates the version the conversion will happen. @@ -113,24 +116,49 @@ func (p *PatternFile) convertFromTraits(cmp *component.ComponentDefinition, serv } // Handle node id: traits.meshmap.id - compNodeID, err := utils.Cast[string](extensionsMetadata["id"]) - if err != nil { - return errors.Wrapf(err, "failed to extract node id for the component \"%s\" of type \"%s\"", cmp.DisplayName, cmp.Component.Kind) - } + compNodeUUID, _ := uuid.NewV4() - compNodeUUID, err := uuid.FromString(compNodeID) - if err != nil { - return errors.Wrapf(err, "failed to convert node id \"%s\" for the component \"%s\" of type \"%s\", to uuid.", compNodeID, cmp.DisplayName, cmp.Component.Kind) + compNodeID, ok := extensionsMetadata["id"].(string) + if ok { + nodeID, err := uuid.FromString(compNodeID) + if err == nil { + compNodeUUID = nodeID + } } + + isNamespaced := false cmp.Id = compNodeUUID + _metadata := extensionsMetadata["meshmodel-metadata"] + metadata := map[string]interface{}{} + if _metadata != nil { + metadata, err = utils.Cast[map[string]interface{}](_metadata) + if err != nil { + return errors.Wrapf(err, "unable to extract metadata for the component \"%s\" of type \"%s\" from the design file", cmp.DisplayName, cmp.Component.Kind) + } + + namespaced, ok := metadata["isNamespaced"] + if ok { + reflectType := reflect.TypeOf(namespaced) + if reflectType.Kind() == reflect.String { + val, _ := namespaced.(string) + if strings.ToLower(val) == "true" { + isNamespaced = true + } + } else if reflectType.Kind() == reflect.Bool { + isNamespaced, _ = namespaced.(bool) + } + } + } + delete(metadata, "isNamespaced") // Handle component metadata: traits.meshmap.meshmodel-metadata - _compMetadata, err := utils.MarshalAndUnmarshal[interface{}, component.ComponentDefinition_Metadata](extensionsMetadata["meshmodel-metadata"]) + _compMetadata, err := utils.MarshalAndUnmarshal[map[string]interface{}, component.ComponentDefinition_Metadata](metadata) if err != nil { return errors.Wrapf(err, "unable to extract metadata for the component \"%s\" of type \"%s\" from the design file", cmp.DisplayName, cmp.Component.Kind) } cmp.Metadata = _compMetadata + cmp.Metadata.IsNamespaced = isNamespaced // Handle position properties: traits.meshmap.position randX, _ := rand.Int(rand.Reader, big.NewInt(100)) @@ -150,6 +178,12 @@ func (p *PatternFile) convertFromTraits(cmp *component.ComponentDefinition, serv }, } + pos, ok := extensionsMetadata["position"].(cytoscapejs.Position) + if ok { + cmp.Styles.Position.X, _ = big.NewFloat(pos.X).Float32() + cmp.Styles.Position.Y, _ = big.NewFloat(pos.Y).Float32() + } + cmp.Metadata.AdditionalProperties = make(map[string]interface{}, 0) // Handle position properties: service.dependsOn/ cmp.Metadata.AdditionalProperties["dependsOn"] = service.DependsOn