11package transformer
22
33import (
4+ "errors"
5+ "github.com/Azure/sonic-mgmt-common/translib/db"
46 log "github.com/golang/glog"
57 "strings"
68)
@@ -17,6 +19,7 @@ func init() {
1719 XlateFuncBind ("DbToYang_osc_key_xfmr" , DbToYang_osc_key_xfmr )
1820 XlateFuncBind ("YangToDb_osc_interface_xfmr" , YangToDb_osc_interface_xfmr )
1921 XlateFuncBind ("DbToYang_osc_interface_xfmr" , DbToYang_osc_interface_xfmr )
22+ XlateFuncBind ("otn_table_xfmr" , otn_table_xfmr )
2023}
2124
2225// Generic KeyXfmr for openconfig "name"
@@ -74,30 +77,48 @@ var YangToDb_ocm_channel_key_xfmr KeyXfmrYangToDb = func(inParams XfmrParams) (s
7477}
7578
7679var DbToYang_ocm_channel_key_xfmr KeyXfmrDbToYang = func (inParams XfmrParams ) (map [string ]interface {}, error ) {
77- var err error
7880 rmap := make (map [string ]interface {})
79- key := inParams .key
80- TableKeys := strings .Split (key , "|" )
81+ tableKeys := strings .Split (inParams .key , "|" )
82+
83+ if len (tableKeys ) >= 2 {
84+ rmap ["lower-frequency" ] = tableKeys [1 ]
85+ }
8186
82- if len ( TableKeys ) >= 2 {
83- //TableKeys[0] = name, TableKeys[1] = lower-frequency
84- rmap [ "lower-frequency" ] = TableKeys [ 1 ]
87+ tableName := ""
88+ if strings . Contains ( inParams . uri , "channels/channel" ) {
89+ tableName = "OTN_OCM_CHANNEL_TABLE"
8590 }
8691
87- // Find the row for this key in the cached DB data
88- data := (* inParams .dbDataMap )[inParams .curDb ] // map[string]TblData
92+ upperFreq := ""
8993
90- for _ , tbl := range data {
91- if row , ok := tbl [inParams .key ]; ok {
92- if val , ok2 := row .Field ["upper-frequency" ]; ok2 {
93- rmap ["upper-frequency" ] = val
94+ // 1. Try Cache
95+ if inParams .dbDataMap != nil && tableName != "" {
96+ if tblData , ok := (* inParams .dbDataMap )[inParams .curDb ][tableName ]; ok {
97+ if row , ok2 := tblData [inParams .key ]; ok2 {
98+ upperFreq = row .Field ["upper-frequency" ]
9499 }
95- break
96100 }
97101 }
98- log .Info ("DbToYang_ocm_channel_key_xfmr : - " , rmap )
99102
100- return rmap , err
103+ // 2. Direct Redis Fetch (fixes the undefined: db error and the type mismatch)
104+ if upperFreq == "" && tableName != "" {
105+ ts := & db.TableSpec {Name : tableName }
106+ // Using Comp for composite keys allows the driver to handle the '|' separator correctly
107+ rowKey := db.Key {Comp : strings .Split (inParams .key , "|" )}
108+
109+ entry , err := inParams .dbs [inParams .curDb ].GetEntry (ts , rowKey )
110+ if err == nil {
111+ upperFreq = entry .Field ["upper-frequency" ]
112+ }
113+ }
114+
115+ if upperFreq != "" {
116+ rmap ["upper-frequency" ] = upperFreq
117+ } else {
118+ log .Warningf ("DbToYang_ocm_channel_key_xfmr: Could not resolve upper-frequency for %s" , inParams .key )
119+ }
120+
121+ return rmap , nil
101122}
102123
103124var YangToDb_ocm_lower_frequency_xfmr FieldXfmrYangToDb = func (inParams XfmrParams ) (map [string ]string , error ) {
@@ -147,3 +168,49 @@ var DbToYang_osc_interface_xfmr FieldXfmrDbtoYang = func(inParams XfmrParams) (m
147168
148169 return rmap , err
149170}
171+
172+ var otn_table_xfmr TableXfmrFunc = func (inParams XfmrParams ) ([]string , error ) {
173+
174+ // Check for nil
175+ if inParams .uri == "" {
176+ log .Error ("otn_table_xfmr: uri is empty!" )
177+ return nil , errors .New ("otn_table_xfmr: uri is empty" )
178+ }
179+
180+ pathInfo := NewPathInfo (inParams .uri )
181+ targetUriPath := pathInfo .YangPath
182+
183+ tblList := []string {}
184+
185+ switch {
186+ case strings .HasPrefix (targetUriPath , "/openconfig-optical-attenuator:optical-attenuator/attenuators/attenuator" ):
187+ tblList = append (tblList , "OTN_ATTENUATOR" )
188+
189+ // 1. Check the specific LIST first (Longer path)
190+ case strings .HasPrefix (targetUriPath , "/openconfig-channel-monitor:channel-monitors/channel-monitor/channels/channel" ):
191+ tblList = append (tblList , "OTN_OCM_CHANNEL_TABLE" )
192+
193+ // 2. Check the CONTAINER next (Shorter path)
194+ case strings .HasPrefix (targetUriPath , "/openconfig-channel-monitor:channel-monitors/channel-monitor/channels" ):
195+ // Returning empty here forces the framework to recurse
196+ // down to the 'channel' list where it will find the table above.
197+ return tblList , nil
198+
199+ // 3. Check the PARENT MONITOR
200+ case strings .HasPrefix (targetUriPath , "/openconfig-channel-monitor:channel-monitors/channel-monitor" ):
201+ tblList = append (tblList , "OTN_OCM" )
202+
203+ case strings .HasPrefix (targetUriPath , "/openconfig-optical-amplifier:optical-amplifier/amplifiers/amplifier" ):
204+ tblList = append (tblList , "OTN_OA" )
205+
206+ case strings .HasPrefix (targetUriPath , "/openconfig-optical-amplifier:optical-amplifier/supervisory-channels/supervisory-channel" ):
207+ tblList = append (tblList , "OTN_OSC" )
208+ }
209+
210+ if len (tblList ) == 0 {
211+ log .Errorf ("otn_table_xfmr: NO MATCHING TABLE for yangPath=%s" , targetUriPath )
212+ return nil , errors .New ("otn_table_xfmr: no matching table" )
213+ }
214+
215+ return tblList , nil
216+ }
0 commit comments