func NewOrientDBBackend(addr string, database string, username string, password string) (*OrientDBBackend, error) { client, err := orientdb.NewClient(addr, database, username, password) if err != nil { return nil, err } if _, err := client.GetDocumentClass("Node"); err != nil { class := orientdb.ClassDefinition{ Name: "Node", SuperClass: "V", Properties: []orientdb.Property{ {Name: "ID", Type: "STRING", Mandatory: true, NotNull: true}, {Name: "Host", Type: "STRING", Mandatory: true, NotNull: true}, {Name: "CreatedAt", Type: "DATETIME", Mandatory: true, NotNull: true, ReadOnly: true}, {Name: "DeletedAt", Type: "DATETIME", NotNull: true}, {Name: "Metadata", Type: "EMBEDDEDMAP"}, }, Indexes: []orientdb.Index{ {Name: "Node.TimeSpan", Fields: []string{"CreatedAt", "DeletedAt"}, Type: "NOTUNIQUE"}, }, } if err := client.CreateDocumentClass(class); err != nil { return nil, fmt.Errorf("Failed to register class Node: %s", err.Error()) } } if _, err := client.GetDocumentClass("Link"); err != nil { class := orientdb.ClassDefinition{ Name: "Link", SuperClass: "E", Properties: []orientdb.Property{ {Name: "ID", Type: "STRING", Mandatory: true, NotNull: true}, {Name: "Host", Type: "STRING", Mandatory: true, NotNull: true}, {Name: "CreatedAt", Type: "DATETIME", Mandatory: true, NotNull: true, ReadOnly: true}, {Name: "DeletedAt", Type: "DATETIME", NotNull: true}, {Name: "Parent", Type: "STRING", Mandatory: true, NotNull: true}, {Name: "Child", Type: "STRING", Mandatory: true, NotNull: true}, {Name: "Metadata", Type: "EMBEDDEDMAP"}, }, Indexes: []orientdb.Index{ {Name: "Link.TimeSpan", Fields: []string{"CreatedAt", "DeletedAt"}, Type: "NOTUNIQUE"}, }, } if err := client.CreateDocumentClass(class); err != nil { return nil, fmt.Errorf("Failed to register class Link: %s", err.Error()) } } return &OrientDBBackend{ client: client, }, nil }
func New() (*OrientDBStorage, error) { addr := config.GetConfig().GetString("storage.orientdb.addr") database := config.GetConfig().GetString("storage.orientdb.database") username := config.GetConfig().GetString("storage.orientdb.username") password := config.GetConfig().GetString("storage.orientdb.password") client, err := orient.NewClient(addr, database, username, password) if err != nil { return nil, err } if _, err := client.GetDocumentClass("FlowMetric"); err != nil { class := orient.ClassDefinition{ Name: "FlowMetric", Properties: []orient.Property{ {Name: "ABBytes", Type: "INTEGER", Mandatory: true, NotNull: true}, {Name: "ABPackets", Type: "INTEGER", Mandatory: true, NotNull: true}, {Name: "BABytes", Type: "INTEGER", Mandatory: true, NotNull: true}, {Name: "BAPackets", Type: "INTEGER", Mandatory: true, NotNull: true}, {Name: "Start", Type: "INTEGER", Mandatory: true, NotNull: true}, {Name: "Last", Type: "INTEGER", Mandatory: true, NotNull: true}, }, Indexes: []orient.Index{ {Name: "FlowMetric.TimeSpan", Fields: []string{"Start", "Last"}, Type: "NOTUNIQUE"}, }, } if err := client.CreateDocumentClass(class); err != nil { return nil, fmt.Errorf("Failed to register class FlowMetric: %s", err.Error()) } } if _, err := client.GetDocumentClass("Flow"); err != nil { class := orient.ClassDefinition{ Name: "Flow", Properties: []orient.Property{ {Name: "UUID", Type: "STRING", Mandatory: true, NotNull: true}, {Name: "LayersPath", Type: "STRING", Mandatory: true, NotNull: true}, {Name: "Metric", Type: "EMBEDDED", LinkedClass: "FlowMetric"}, {Name: "TrackingID", Type: "STRING", Mandatory: true, NotNull: true}, {Name: "NodeTID", Type: "STRING"}, {Name: "ANodeTID", Type: "STRING"}, {Name: "BNodeTID", Type: "STRING"}, }, Indexes: []orient.Index{ {Name: "Flow.UUID", Fields: []string{"UUID"}, Type: "UNIQUE"}, {Name: "Flow.TrackingID", Fields: []string{"TrackingID"}, Type: "NOTUNIQUE"}, }, } if err := client.CreateDocumentClass(class); err != nil { return nil, fmt.Errorf("Failed to register class Flow: %s", err.Error()) } } flowProp := orient.Property{Name: "Flow", Type: "LINK", LinkedClass: "Flow", Mandatory: false, NotNull: true} client.CreateProperty("FlowMetric", flowProp) flowIndex := orient.Index{Name: "FlowMetric.Flow", Fields: []string{"Flow"}, Type: "NOTUNIQUE"} client.CreateIndex("FlowMetric", flowIndex) return &OrientDBStorage{ client: client, }, nil }