Skip to content

Commit

Permalink
Merge pull request #33 from layer5io/kumarabd/feature/model
Browse files Browse the repository at this point in the history
MESHSYNC schema modified
  • Loading branch information
kumarabd authored Feb 3, 2021
2 parents b0f8c35 + 1d23048 commit bf19b5d
Show file tree
Hide file tree
Showing 3 changed files with 70 additions and 74 deletions.
1 change: 1 addition & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ require (
google.golang.org/grpc v1.34.0
google.golang.org/protobuf v1.25.0
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f // indirect
gorm.io/gorm v1.20.10
istio.io/client-go v1.8.1
k8s.io/api v0.18.12
k8s.io/apimachinery v0.18.12
Expand Down
78 changes: 42 additions & 36 deletions pkg/model/model.go
Original file line number Diff line number Diff line change
@@ -1,59 +1,65 @@
package model

import (
"github.com/google/uuid"
"gorm.io/gorm"
)

type Object struct {
Index Index `json:"index,omitempty"`
TypeMeta ResourceTypeMeta `json:"typemeta,omitempty"`
ObjectMeta ResourceObjectMeta `json:"metadata,omitempty"`
Spec ResourceSpec `json:"spec,omitempty"`
Status ResourceStatus `json:"status,omitempty"`
}
gorm.Model

type Index struct {
ID string `json:"id,omitempty" gorm:"primarykey"`
CreatedAt string `json:"created_at,omitempty" gorm:"index"`
UpdatedAt string `json:"updated_at,omitempty" gorm:"index"`
DeletedAt string `json:"deleted_at,omitempty" gorm:"index"`

ResourceID string `json:"resource-id,omitempty"`
TypeMetaID string `json:"type-meta-id,omitempty"`
ObjectMetaID string `json:"object-meta-id,omitempty"`
SpecID string `json:"spec-id,omitempty"`
StatusID string `json:"status-id,omitempty"`
ResourceID string `json:"resource_id" gorm:"index"`
TypeMeta *ResourceTypeMeta `json:"typemeta,omitempty" gorm:"foreignkey:ID;references:id"`
ObjectMeta *ResourceObjectMeta `json:"metadata,omitempty" gorm:"foreignkey:ID;references:id"`
Spec *ResourceSpec `json:"spec,omitempty" gorm:"foreignkey:ID;references:id"`
Status *ResourceStatus `json:"status,omitempty" gorm:"foreignkey:ID;references:id"`
}

type ResourceTypeMeta struct {
ID string `json:"id,omitempty" gorm:"primarykey"`
Kind string `json:"kind,omitempty"`
APIVersion string `json:"apiVersion,omitempty"`
ID uint `json:"id" gorm:"primarykey"`
Kind string `json:"kind,omitempty" gorm:"index"`
APIVersion string `json:"apiVersion,omitempty" gorm:"index"`
}

type KeyValue struct {
ID uint `json:"id" gorm:"index"`
UniqueID uuid.UUID `json:"unique_id" gorm:"primarykey;type:uuid"`
Key string `json:"key,omitempty" gorm:"index"`
Value string `json:"value,omitempty" gorm:"index"`
}

type ResourceObjectMeta struct {
ID string `json:"id,omitempty" gorm:"primarykey"`
Name string `json:"name,omitempty"`
GenerateName string `json:"generateName,omitempty"`
Namespace string `json:"namespace,omitempty"`
SelfLink string `json:"selfLink,omitempty"`
UID string `json:"uid,omitempty"`
ResourceVersion string `json:"resourceVersion,omitempty"`
Generation int64 `json:"generation,omitempty"`
CreationTimestamp string `json:"creationTimestamp,omitempty"`
DeletionTimestamp string `json:"deletionTimestamp,omitempty"`
DeletionGracePeriodSeconds *int64 `json:"deletionGracePeriodSeconds,omitempty"`
Labels string `json:"labels,omitempty" gorm:"type:json"`
Annotations string `json:"annotations,omitempty" gorm:"type:json"`
ID uint `json:"id" gorm:"primarykey"`
Name string `json:"name,omitempty" gorm:"index"`
GenerateName string `json:"generateName,omitempty"`
Namespace string `json:"namespace,omitempty"`
SelfLink string `json:"selfLink,omitempty"`
UID string `json:"uid"`
ResourceVersion string `json:"resourceVersion,omitempty"`
Generation int64 `json:"generation,omitempty"`
CreationTimestamp string `json:"creationTimestamp,omitempty"`
DeletionTimestamp string `json:"deletionTimestamp,omitempty"`
DeletionGracePeriodSeconds *int64 `json:"deletionGracePeriodSeconds,omitempty"`
Labels []*KeyValue `json:"labels,omitempty" gorm:"foreignkey:ID;references:id"`
Annotations []*KeyValue `json:"annotations,omitempty" gorm:"foreignkey:ID;references:id"`
// OwnerReferences string `json:"ownerReferences,omitempty" gorm:"type:json"`
// Finalizers string `json:"finalizers,omitempty" gorm:"type:json"`
ClusterName string `json:"clusterName,omitempty"`
// ManagedFields string `json:"managedFields,omitempty" gorm:"type:json"`
ClusterID string `json:"cluster-id,omitempty"`
ClusterID string `json:"cluster_id"`
}

type ResourceSpec struct {
ID string `json:"id,omitempty" gorm:"primarykey"`
ID uint `json:"id" gorm:"primarykey"`
Attribute string `json:"attribute,omitempty" gorm:"type:json"`
}

type ResourceStatus struct {
ID string `json:"id,omitempty" gorm:"primarykey"`
ID uint `json:"id" gorm:"primarykey"`
Attribute string `json:"attribute,omitempty" gorm:"type:json"`
}

func (k *KeyValue) BeforeCreate(tx *gorm.DB) (err error) {
k.UniqueID = uuid.New()
return nil
}
65 changes: 27 additions & 38 deletions pkg/model/model_converter.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,55 +2,36 @@ package model

import (
"fmt"
"time"

"github.com/google/uuid"
"github.com/layer5io/meshkit/utils"
"github.com/layer5io/meshsync/internal/cache"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)

func ConvObject(typeMeta metav1.TypeMeta, objectMeta metav1.ObjectMeta, spec interface{}, status interface{}) Object {
resourceIdentifier := fmt.Sprintf("%s-%s-%s-%s", typeMeta.Kind, typeMeta.APIVersion, objectMeta.Namespace, objectMeta.Name)
index := generateIndex(resourceIdentifier)
resourceTypeMeta := makeTypeMeta(typeMeta, index.TypeMetaID)
resourceObjectMeta := makeObjectMeta(objectMeta, index.ObjectMetaID)
resourceSpec := makeSpec(spec, index.SpecID)
resourceStatus := makeStatus(status, index.StatusID)
resourceTypeMeta := makeTypeMeta(typeMeta)
resourceObjectMeta := makeObjectMeta(objectMeta)
resourceSpec := makeSpec(spec)
resourceStatus := makeStatus(status)

return Object{
Index: index,
ResourceID: resourceIdentifier,
TypeMeta: resourceTypeMeta,
ObjectMeta: resourceObjectMeta,
Spec: resourceSpec,
Status: resourceStatus,
}
}

func generateIndex(id string) Index {
return Index{
ID: id,
CreatedAt: time.Now().String(),
ResourceID: uuid.New().String(),
TypeMetaID: uuid.New().String(),
ObjectMetaID: uuid.New().String(),
SpecID: uuid.New().String(),
StatusID: uuid.New().String(),
}
}

func makeTypeMeta(resource metav1.TypeMeta, id string) ResourceTypeMeta {
return ResourceTypeMeta{
ID: id,
func makeTypeMeta(resource metav1.TypeMeta) *ResourceTypeMeta {
return &ResourceTypeMeta{
Kind: resource.Kind,
APIVersion: resource.APIVersion,
}
}

func makeObjectMeta(resource metav1.ObjectMeta, id string) ResourceObjectMeta {
labels, _ := utils.Marshal(resource.Labels)
annotations, _ := utils.Marshal(resource.Annotations)

func makeObjectMeta(resource metav1.ObjectMeta) *ResourceObjectMeta {
var creationTime string
var deletionTime string
if !resource.CreationTimestamp.IsZero() {
Expand All @@ -60,20 +41,19 @@ func makeObjectMeta(resource metav1.ObjectMeta, id string) ResourceObjectMeta {
deletionTime = resource.DeletionTimestamp.String()
}

return ResourceObjectMeta{
ID: id,
return &ResourceObjectMeta{
Name: resource.Name,
GenerateName: resource.GenerateName,
Namespace: resource.Namespace,
SelfLink: resource.SelfLink,
UID: string(resource.UID),
ResourceVersion: resource.ResourceVersion,
Generation: resource.Generation,
CreationTimestamp: creationTime,
DeletionTimestamp: deletionTime,
Labels: makeLabelsOrAnnotations(resource.Labels),
Annotations: makeLabelsOrAnnotations(resource.Annotations),
Generation: resource.Generation,
DeletionGracePeriodSeconds: resource.DeletionGracePeriodSeconds,
Labels: labels,
Annotations: annotations,
// OwnerReferences: resource.OwnerReferences,
// Finalizers: resource.Finalizers,
ClusterName: resource.ClusterName,
Expand All @@ -82,20 +62,29 @@ func makeObjectMeta(resource metav1.ObjectMeta, id string) ResourceObjectMeta {
}
}

func makeSpec(spec interface{}, id string) ResourceSpec {
func makeSpec(spec interface{}) *ResourceSpec {
specJSON, _ := utils.Marshal(spec)

return ResourceSpec{
ID: id,
return &ResourceSpec{
Attribute: string(specJSON),
}
}

func makeStatus(status interface{}, id string) ResourceStatus {
func makeStatus(status interface{}) *ResourceStatus {
statusJSON, _ := utils.Marshal(status)

return ResourceStatus{
ID: id,
return &ResourceStatus{
Attribute: string(statusJSON),
}
}

func makeLabelsOrAnnotations(items map[string]string) []*KeyValue {
result := make([]*KeyValue, 0)
for key, val := range items {
result = append(result, &KeyValue{
Key: key,
Value: val,
})
}
return result
}

0 comments on commit bf19b5d

Please sign in to comment.