diff --git a/models/meshmodel/core/v1alpha1/component.go b/models/meshmodel/core/v1alpha1/component.go index 7bcea0a1..2f4f5836 100644 --- a/models/meshmodel/core/v1alpha1/component.go +++ b/models/meshmodel/core/v1alpha1/component.go @@ -3,26 +3,35 @@ package v1alpha1 const ComponentDefinitionKindKey = "ComponentDefinition" type TypeMeta struct { - Kind string `json:"kind,omitempty"` - APIVersion string `json:"apiVersion,omitempty"` + Kind string `json:"kind,omitempty" yaml:"kind"` + APIVersion string `json:"apiVersion,omitempty" yaml:"apiVersion"` } // use NewComponent function for instantiating type Component struct { - TypeMeta - ComponentSpec - Metadata map[string]interface{} `json:"metadata,omitempty"` + TypeMeta `gorm:"embedded" yaml:"typemeta"` + ComponentSpec `gorm:"embedded" yaml:"componentspec"` + Metadata map[string]interface{} `json:"metadata,omitempty" yaml:"metadata"` // for backward compatibility - Spec string `json:"spec,omitempty"` + Spec string `json:"spec,omitempty" yaml:"spec"` +} +type Capability struct { + // Host is the address of the service registering the capability + Host string `json:"host,omitempty" yaml:"host"` } - type ComponentSpec struct { - Schematic map[string]interface{} `json:"schematic,omitempty"` + Schematic map[string]interface{} `json:"schematic,omitempty" yaml:"schematic"` } func NewComponent() Component { comp := Component{} comp.APIVersion = "core.meshery.io/v1alpha1" comp.Kind = ComponentDefinitionKindKey + comp.Metadata = make(map[string]interface{}, 1) return comp } + +type ComponentCapability struct { + Component `yaml:"component"` + Capability `yaml:"capability"` +} diff --git a/models/meshmodel/core/v1alpha1/component_capabilities_db.go b/models/meshmodel/core/v1alpha1/component_capabilities_db.go new file mode 100644 index 00000000..fb407cd6 --- /dev/null +++ b/models/meshmodel/core/v1alpha1/component_capabilities_db.go @@ -0,0 +1,52 @@ +package v1alpha1 + +import ( + "encoding/json" + + "github.com/google/uuid" +) + +// This file consists of helper methods and structs that database(gorm) will use to interact with meshmodel components +type ComponentDB struct { + TypeMeta + ComponentSpecDB + Metadata []byte `json:"metadata"` + // for backward compatibility + Spec string `json:"spec,omitempty"` +} + +type ComponentSpecDB struct { + Schematic []byte `json:"schematic,omitempty"` +} + +type ComponentCapabilityDB struct { + ID uuid.UUID `json:"id,omitempty"` + ComponentDB + Capability +} + +// ComponentCapabilityFromCCDB produces a client facing instance of ComponentCapability from a database representation of ComponentCapability. +// Use this function to interconvert any time the ComponentCapability is fetched from the database and is to be returned to client. +func ComponentCapabilityFromCCDB(cdb ComponentCapabilityDB) (c ComponentCapability) { + c.Capability = cdb.Capability + c.TypeMeta = cdb.TypeMeta + c.Spec = cdb.Spec + m := make(map[string]interface{}) + _ = json.Unmarshal(cdb.Metadata, &m) + c.Metadata = m + schematic := make(map[string]interface{}) + _ = json.Unmarshal(cdb.Schematic, &schematic) + c.Schematic = schematic + return +} + +// ComponentCapabilityDBFromCC produces a database compatible instance of ComponentCapability from a client representation of ComponentCapability. +// Use this function to interconvert any time the ComponentCapability is created by some client and is to be saved to the database. +func ComponentCapabilityDBFromCC(c ComponentCapability) (cdb ComponentCapabilityDB) { + cdb.Capability = c.Capability + cdb.TypeMeta = c.TypeMeta + cdb.Spec = c.Spec + cdb.Metadata, _ = json.Marshal(c.Metadata) + cdb.Schematic, _ = json.Marshal(c.Schematic) + return +}