Skip to content

Commit

Permalink
Merge pull request #148 from project-arlo/transformer-phase2
Browse files Browse the repository at this point in the history
Merge Transformer changes to master
  • Loading branch information
kwangsuk authored Oct 3, 2019
2 parents 8f67a66 + ff13d87 commit 3dc5b52
Show file tree
Hide file tree
Showing 12 changed files with 1,164 additions and 707 deletions.
11 changes: 5 additions & 6 deletions goyang-modified-files/annotate.go
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,8 @@ func generate(w io.Writer, e *yang.Entry, path string) {
fmt.Fprintf(w, " import %s { prefix %s; }\n", k, allimports[k])
}
}
// Include the module for which annotation is being generated
fmt.Fprintf(w, " import %s { prefix %s; }\n", e.Name, e.Prefix.Name)

fmt.Fprintln(w)
}
Expand All @@ -92,13 +94,10 @@ func generate(w io.Writer, e *yang.Entry, path string) {
name = e.Prefix.Name + ":" + name
}

delim := ""
if path != "" {
delim = "/"
if (e.Node.Kind() != "module") {
path = path + "/" + name
printDeviation(w, path)
}
path = path + delim + name

printDeviation(w, path)

var names []string
for k := range e.Dir {
Expand Down
1 change: 0 additions & 1 deletion models/yang/annotations/openconfig-acl-annot.yang
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ module openconfig-acl-annot {
deviation /oc-acl:acl/oc-acl:acl-sets/oc-acl:acl-set {
deviate add {
sonic-ext:table-name "ACL_TABLE";
sonic-ext:key-delimiter "_";
}
}

Expand Down
5 changes: 5 additions & 0 deletions models/yang/common/sonic-extensions.yang
Original file line number Diff line number Diff line change
Expand Up @@ -75,4 +75,9 @@ module sonic-extensions {
argument "db-name";
description "DB name that will indicate where data is stored. Eg: Config DB, App DB etc";
}
extension table-transformer {
argument "table-transformer-name";
description "Db table transformer name.This can be applied to either transform yang value to some different format
or choose a specific DB table based on the type.";
}
}
34 changes: 19 additions & 15 deletions src/translib/common_app.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import (
"github.com/openconfig/ygot/ygot"
"reflect"
"translib/db"
"translib/ocbinds"
"translib/ocbinds"
"translib/tlerr"
"translib/transformer"
"encoding/json"
Expand Down Expand Up @@ -155,6 +155,7 @@ func (app *CommonApp) processDelete(d *db.DB) (SetResponse, error) {
func (app *CommonApp) processGet(dbs [db.MaxDB]*db.DB) (GetResponse, error) {
var err error
var payload []byte
var resPayload []byte
log.Info("processGet:path =", app.pathInfo.Path)

payload, err = transformer.GetAndXlateFromDB(app.pathInfo.Path, app.ygotRoot, dbs)
Expand All @@ -170,17 +171,20 @@ func (app *CommonApp) processGet(dbs [db.MaxDB]*db.DB) (GetResponse, error) {
log.Error("ocbinds.Unmarshal() failed. error:", err)
return GetResponse{Payload: payload, ErrSrc: AppErr}, err
}
}

payload, err = generateGetResponsePayload(app.pathInfo.Path, (*app.ygotRoot).(*ocbinds.Device), app.ygotTarget)
if err != nil {
log.Error("generateGetResponsePayload() failed")
return GetResponse{Payload: payload, ErrSrc: AppErr}, err
resPayload, err = generateGetResponsePayload(app.pathInfo.Path, (*app.ygotRoot).(*ocbinds.Device), app.ygotTarget)
if err != nil {
log.Error("generateGetResponsePayload() failed")
return GetResponse{Payload: payload, ErrSrc: AppErr}, err
}
var dat map[string]interface{}
err = json.Unmarshal(resPayload, &dat)
} else {
log.Warning("processGet. targetObj is null. Unable to Unmarshal payload")
resPayload = payload
}
var dat map[string]interface{}
err = json.Unmarshal(payload, &dat)

return GetResponse{Payload: payload}, err
return GetResponse{Payload: resPayload}, err
}

func (app *CommonApp) translateCRUDCommon(d *db.DB, opcode int) ([]db.WatchKeys, error) {
Expand Down Expand Up @@ -291,11 +295,11 @@ func (app *CommonApp) cmnAppCRUCommonDbOpn(d *db.DB, opcode int) error {
case UPDATE:
if existingEntry.IsPopulated() {
log.Info("Entry already exists hence modifying it.")
/* Handle leaf-list merge
/* Handle leaf-list merge if any leaf-list exists
A leaf-list field in redis has "@" suffix as per swsssdk convention.
*/
resTblRw := db.Value{Field: map[string]string{}}
resTblRw = processLeafList(existingEntry, tblRw, UPDATE, d, tblNm, tblKey)
resTblRw = checkAndProcessLeafList(existingEntry, tblRw, UPDATE, d, tblNm, tblKey)
err = d.ModEntry(cmnAppTs, db.Key{Comp: []string{tblKey}}, resTblRw)
if err != nil {
log.Error("UPDATE case - d.ModEntry() failure")
Expand Down Expand Up @@ -395,8 +399,8 @@ func (app *CommonApp) cmnAppDelDbOpn(d *db.DB, opcode int) error {
log.Info("Table Entry from which the fields are to be deleted does not exist")
return err
}
/*handle leaf-list merge*/
resTblRw := processLeafList(existingEntry, tblRw, DELETE, d, tblNm, tblKey)
/* handle leaf-list merge if any leaf-list exists */
resTblRw := checkAndProcessLeafList(existingEntry, tblRw, DELETE, d, tblNm, tblKey)
err := d.DeleteEntryFields(cmnAppTs, db.Key{Comp: []string{tblKey}}, resTblRw)
if err != nil {
log.Error("DELETE case - d.DeleteEntryFields() failure")
Expand All @@ -417,8 +421,8 @@ func (app *CommonApp) generateDbWatchKeys(d *db.DB, isDeleteOp bool) ([]db.Watch
return keys, err
}

func processLeafList(existingEntry db.Value, tblRw db.Value, opcode int, d *db.DB, tblNm string, tblKey string) db.Value {
log.Info("process leaf-list Fields in table row.")
/*check if any field is leaf-list , if yes perform merge*/
func checkAndProcessLeafList(existingEntry db.Value, tblRw db.Value, opcode int, d *db.DB, tblNm string, tblKey string) db.Value {
dbTblSpec := &db.TableSpec{Name: tblNm}
mergeTblRw := db.Value{Field: map[string]string{}}
for field, value := range tblRw.Field {
Expand Down
16 changes: 10 additions & 6 deletions src/translib/transformer/transformer.go
Original file line number Diff line number Diff line change
Expand Up @@ -117,13 +117,16 @@ func loadYangModules(files ...string) error {
}
}

sonic_entries := make([]*yang.Entry, len(names))
oc_entries := make(map[string]*yang.Entry)
annot_entries := make([]*yang.Entry, len(names))
sonic_entries := make([]*yang.Entry, len(names))
oc_entries := make(map[string]*yang.Entry)
oc_annot_entries := make([]*yang.Entry, len(names))
sonic_annot_entries := make([]*yang.Entry, len(names))

for _, n := range names {
if strings.Contains(n, "annot") {
annot_entries = append(annot_entries, yang.ToEntry(mods[n]))
if strings.Contains(n, "annot") && strings.Contains(n, "sonic") {
sonic_annot_entries = append(sonic_annot_entries, yang.ToEntry(mods[n]))
} else if strings.Contains(n, "annot") {
oc_annot_entries = append(oc_annot_entries, yang.ToEntry(mods[n]))
} else if strings.Contains(n, "sonic") {
sonic_entries = append(sonic_entries, yang.ToEntry(mods[n]))
} else if oc_entries[n] == nil {
Expand All @@ -132,7 +135,8 @@ func loadYangModules(files ...string) error {
}

dbMapBuild(sonic_entries)
annotToDbMapBuild(annot_entries)
annotDbSpecMap(sonic_annot_entries)
annotToDbMapBuild(oc_annot_entries)
yangToDbMapBuild(oc_entries)

return err
Expand Down
31 changes: 31 additions & 0 deletions src/translib/transformer/xconst.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package transformer

const (
YANG_MODULE = "module"
YANG_LIST = "list"
YANG_CONTAINER = "container"
YANG_LEAF = "leaf"
YANG_LEAF_LIST = "leaflist"

YANG_ANNOT_DB_NAME = "redis-db-name"
YANG_ANNOT_TABLE_NAME = "table-name"
YANG_ANNOT_FIELD_NAME = "field-name"
YANG_ANNOT_KEY_DELIM = "key-delimiter"
YANG_ANNOT_TABLE_XFMR = "table-transformer"
YANG_ANNOT_FIELD_XFMR = "field-transformer"
YANG_ANNOT_KEY_XFMR = "key-transformer"
YANG_ANNOT_POST_XFMR = "post-transformer"
YANG_ANNOT_SUBTREE_XFMR = "subtree-transformer"
YANG_ANNOT_VALIDATE_FUNC = "get-validate"

REDIS_DB_TYPE_APPLN = "APPL_DB"
REDIS_DB_TYPE_ASIC = "ASIC_DB"
REDIS_DB_TYPE_CONFIG = "CONFIG_DB"
REDIS_DB_TYPE_COUNTER = "COUNTERS_DB"
REDIS_DB_TYPE_LOG_LVL = "LOGLEVEL_DB"
REDIS_DB_TYPE_STATE = "STATE_DB"
REDIS_DB_TYPE_FLX_COUNTER = "FLEX_COUNTER_DB"

XPATH_SEP_FWD_SLASH = "/"
XFMR_EMPTY_STRING = ""
)
11 changes: 11 additions & 0 deletions src/translib/transformer/xfmr_interface.go
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,14 @@ type ValidateCallpoint func (inParams XfmrParams) (bool)
type PostXfmrFunc func (inParams XfmrParams) (map[string]map[string]db.Value, error)


/**
* TableXfmrFunc type is defined to use for table transformer function for dynamic derviation of redis table.
* Param: XfmrParams structure having database pointers, current db, operation, DB data in multidimensional map, YgotRoot, uri
* Return: List of table names, error
**/
type TableXfmrFunc func (inParams XfmrParams) ([]string, error)


/**
* Xfmr validation interface for validating the callback registration of app modules
* transformer methods.
Expand All @@ -104,3 +112,6 @@ func (SubTreeXfmrYangToDb) xfmrInterfaceValiidate () {
func (SubTreeXfmrDbToYang) xfmrInterfaceValiidate () {
log.Info("xfmrInterfaceValiidate for SubTreeXfmrDbToYang")
}
func (TableXfmrFunc) xfmrInterfaceValiidate () {
log.Info("xfmrInterfaceValiidate for TableXfmrFunc")
}
Loading

0 comments on commit 3dc5b52

Please sign in to comment.