VOL-1027 : Initial commit of voltha 2.0 data model

Change-Id: Ib8006de1af2166281ccf1c9d7c2b9156991bf4e4
diff --git a/db/model/data_revision.go b/db/model/data_revision.go
new file mode 100644
index 0000000..deceb87
--- /dev/null
+++ b/db/model/data_revision.go
@@ -0,0 +1,48 @@
+package model
+
+import (
+	"bytes"
+	"crypto/md5"
+	"encoding/json"
+	"fmt"
+	"github.com/golang/protobuf/proto"
+	"reflect"
+)
+
+type DataRevision struct {
+	Data interface{}
+	Hash string
+}
+
+func NewDataRevision(data interface{}) *DataRevision {
+	cdr := &DataRevision{}
+	cdr.Data = data
+	cdr.Hash = cdr.hashData(data)
+
+	return cdr
+}
+
+func (cr *DataRevision) hashData(data interface{}) string {
+	var buffer bytes.Buffer
+
+	if IsProtoMessage(data) {
+		if pbdata, err := proto.Marshal(data.(proto.Message)); err != nil {
+			fmt.Errorf("problem to marshal protobuf data --> err: %s", err.Error())
+		} else {
+			buffer.Write(pbdata)
+		}
+
+	} else if reflect.ValueOf(data).IsValid() {
+		dataObj := reflect.New(reflect.TypeOf(data).Elem())
+		if json, err := json.Marshal(dataObj.Interface()); err != nil {
+			fmt.Errorf("problem to marshal data --> err: %s", err.Error())
+		} else {
+			buffer.Write(json)
+		}
+	} else {
+		dataObj := reflect.New(reflect.TypeOf(data).Elem())
+		buffer.Write(dataObj.Bytes())
+	}
+
+	return fmt.Sprintf("%x", md5.Sum(buffer.Bytes()))[:12]
+}