Skip to content

Commit c322ff9

Browse files
committed
IPv6 leading zero issue fix with test cases
1 parent bb0e47d commit c322ff9

File tree

2 files changed

+75
-4
lines changed

2 files changed

+75
-4
lines changed

translib/transformer/interfaces_openconfig_test.go

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -452,11 +452,23 @@ func Test_openconfig_subintf_ipv6(t *testing.T) {
452452
t.Run("Test Get/Verify Patch IPv6 address at subinterfaces addresses", processGetRequest(url, nil, expected_get_json, false))
453453
time.Sleep(1 * time.Second)
454454

455+
pre_req_map = map[string]interface{}{"INTF_TABLE": map[string]interface{}{"Ethernet0:a::e/64": map[string]interface{}{"NULL": "NULL"}}}
456+
loadDB(db.ApplDB, pre_req_map)
457+
458+
t.Log("\n\n--- Verify PATCH IPv6 address at addresses address level ---")
459+
url = "/openconfig-interfaces:interfaces/interface[name=Ethernet0]/subinterfaces/subinterface[index=0]/openconfig-if-ip:ipv6/addresses/address[ip=a::e]"
460+
expected_get_json = "{\"openconfig-if-ip:address\":[{\"config\":{\"ip\":\"a::e\",\"prefix-length\":64},\"ip\":\"a::e\", \"state\":{\"ip\":\"a::e\",\"prefix-length\":64}}]}"
461+
t.Run("Test Get/Verify Patch IPv6 address at subinterfaces addresses address", processGetRequest(url, nil, expected_get_json, false))
462+
time.Sleep(1 * time.Second)
463+
455464
t.Log("\n\n--- Delete IPv6 address at subinterfaces addresses level---")
456465
url = "/openconfig-interfaces:interfaces/interface[name=Ethernet0]/subinterfaces/subinterface[index=0]/openconfig-if-ip:ipv6/addresses"
457466
t.Run("Test Delete IPv6 address at subinterfaces addresses level", processDeleteRequest(url, true))
458467
time.Sleep(1 * time.Second)
459468

469+
cleanuptbl = map[string]interface{}{"INTF_TABLE": map[string]interface{}{"Ethernet0:a::e/64": ""}}
470+
unloadDB(db.ApplDB, cleanuptbl)
471+
460472
t.Log("\n\n--- Verify Delete IPv6 address at subinterfaces addresses ---")
461473
url = "/openconfig-interfaces:interfaces/interface[name=Ethernet0]/subinterfaces/subinterface[index=0]/ipv6/addresses"
462474
expected_get_json = "{}"
@@ -498,8 +510,53 @@ func Test_openconfig_subintf_ipv6(t *testing.T) {
498510
t.Run("Test Get IPv6 address at subinterfaces", processGetRequest(url, nil, expected_get_json, false))
499511
time.Sleep(1 * time.Second)
500512

513+
//-------------------------------------------------------------------------------------------------------------------------------------------
514+
t.Log("\n\n--- PATCH IPv6 address at addresses ---")
515+
url = "/openconfig-interfaces:interfaces/interface[name=Ethernet4]/subinterfaces/subinterface[index=0]/openconfig-if-ip:ipv6/addresses"
516+
url_input_body_json = "{\"openconfig-if-ip:addresses\": {\"address\": [{\"ip\": \"2001:0db8:abcd:0016::1\", \"openconfig-if-ip:config\": {\"ip\": \"2001:0db8:abcd:0016::1\", \"prefix-length\": 64}}]}}"
517+
518+
time.Sleep(1 * time.Second)
519+
t.Run("Test Patch/Set IPv6 address on subinterfaces addresses", processSetRequest(url, url_input_body_json, "PATCH", false, nil))
520+
time.Sleep(1 * time.Second)
521+
522+
t.Log("\n\n--- Verify PATCH IPv6 address at addresses level ---")
523+
url = "/openconfig-interfaces:interfaces/interface[name=Ethernet4]/subinterfaces/subinterface[index=0]/openconfig-if-ip:ipv6/addresses"
524+
expected_get_json = "{\"openconfig-if-ip:addresses\":{\"address\":[{\"config\":{\"ip\":\"2001:db8:abcd:16::1\",\"prefix-length\":64},\"ip\":\"2001:db8:abcd:16::1\"}]}}"
525+
t.Run("Test Get/Verify Patch IPv6 address at subinterfaces addresses", processGetRequest(url, nil, expected_get_json, false))
526+
time.Sleep(1 * time.Second)
527+
528+
pre_req_map = map[string]interface{}{"INTF_TABLE": map[string]interface{}{"Ethernet4:2001:db8:abcd:16::1/64": map[string]interface{}{"NULL": "NULL"}}}
529+
loadDB(db.ApplDB, pre_req_map)
530+
531+
t.Log("\n\n--- Verify PATCH IPv6 address at addresses address level ---")
532+
url = "/openconfig-interfaces:interfaces/interface[name=Ethernet4]/subinterfaces/subinterface[index=0]/openconfig-if-ip:ipv6/addresses/address[ip=2001:db8:abcd:16::1]"
533+
expected_get_json = "{\"openconfig-if-ip:address\":[{\"config\":{\"ip\":\"2001:db8:abcd:16::1\",\"prefix-length\":64},\"ip\":\"2001:db8:abcd:16::1\", \"state\":{\"ip\":\"2001:db8:abcd:16::1\",\"prefix-length\":64}}]}"
534+
t.Run("Test Get/Verify Patch IPv6 address at subinterfaces addresses address", processGetRequest(url, nil, expected_get_json, false))
535+
time.Sleep(1 * time.Second)
536+
537+
t.Log("\n\n-Verify Db for iPv6 PATCH--\n\n")
538+
url = "/openconfig-interfaces:interfaces/interface[name=Ethernet4]/subinterfaces/subinterface[index=0]/openconfig-if-ip:ipv6/addresses/address[ip=2001:db8:abcd:16::1]"
539+
expected_map := map[string]interface{}{"INTERFACE": map[string]interface{}{"Ethernet4": map[string]interface{}{"family": "IPv6"}}}
540+
t.Run("Verify Db for IPv6 PATCH", verifyDbResult(rclient, "INTERFACE|Ethernet4|2001:db8:abcd:16::1/64", expected_map, false))
541+
542+
t.Log("\n\n--- Delete IPv6 address at subinterfaces addresses level---")
543+
url = "/openconfig-interfaces:interfaces/interface[name=Ethernet4]/subinterfaces/subinterface[index=0]/openconfig-if-ip:ipv6/addresses"
544+
t.Run("Test Delete IPv6 address at subinterfaces addresses level", processDeleteRequest(url, false))
545+
time.Sleep(1 * time.Second)
546+
547+
cleanuptbl = map[string]interface{}{"INTF_TABLE": map[string]interface{}{"Ethernet4:2001:db8:abcd:16::1/64": ""}}
548+
unloadDB(db.ApplDB, cleanuptbl)
549+
550+
t.Log("\n\n--- Verify Delete IPv6 address at subinterfaces addresses ---")
551+
url = "/openconfig-interfaces:interfaces/interface[name=Ethernet4]/subinterfaces/subinterface[index=0]/ipv6/addresses"
552+
expected_get_json = "{}"
553+
t.Run("Test Get/Verify Delete IPv6 address at subinterfaces addresses", processGetRequest(url, nil, expected_get_json, false))
554+
time.Sleep(1 * time.Second)
555+
501556
t.Log("\n\n+++++++++++++ DONE CONFIGURING AND REMOVING IPV6 ADDRESSES ON SUBINTERFACES ++++++++++++")
502557

558+
559+
//------------------------------------------------------------------------------------------------------
503560
t.Log("\n\n+++++++++++++ ENABLE AND DISABLE IPV6 LINK LOCAL ON SUBINTERFACES ++++++++++++")
504561
t.Log("\n\n--- Get IPv6 link local value (enabled) at config level ---")
505562
url = "/openconfig-interfaces:interfaces/interface[name=Ethernet0]/subinterfaces/subinterface[index=0]/ipv6/config"

translib/transformer/xfmr_intf.go

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ package transformer
2121
import (
2222
"errors"
2323
"fmt"
24+
"net"
2425
"reflect"
2526
"regexp"
2627
"sort"
@@ -1768,11 +1769,16 @@ var YangToDb_subintf_ip_addr_key_xfmr KeyXfmrYangToDb = func(inParams XfmrParams
17681769
log.Info("Entering YangToDb_subintf_ip_addr_key_xfmr")
17691770
}
17701771
var err error
1771-
var inst_key string
17721772
pathInfo := NewPathInfo(inParams.uri)
1773-
inst_key = pathInfo.Var("ip")
1774-
log.Infof("URI:%v Interface IP:%v", inParams.uri, inst_key)
1775-
return inst_key, err
1773+
rawIP := pathInfo.Var("ip")
1774+
ip := net.ParseIP(rawIP)
1775+
if ip == nil {
1776+
return "", tlerr.InvalidArgs("Invalid IP address: %v", rawIP)
1777+
}
1778+
compressedIP := ip.String()
1779+
1780+
log.Infof("URI:%v Interface IP: %v => Compressed: %v", inParams.uri, rawIP, compressedIP)
1781+
return compressedIP, err
17761782
}
17771783
var DbToYang_subintf_ip_addr_key_xfmr KeyXfmrDbToYang = func(inParams XfmrParams) (map[string]interface{}, error) {
17781784
if log.V(3) {
@@ -2305,6 +2311,10 @@ var YangToDb_intf_ip_addr_xfmr SubTreeXfmrYangToDb = func(inParams XfmrParams) (
23052311
addr.Config.Ip = new(string)
23062312
*addr.Config.Ip = ip
23072313
}
2314+
parsedIP := net.ParseIP(*addr.Config.Ip)
2315+
if parsedIP != nil {
2316+
*addr.Config.Ip = parsedIP.String()
2317+
}
23082318
log.Info("Ip:=", *addr.Config.Ip)
23092319
if addr.Config.PrefixLength == nil {
23102320
log.Error("Prefix Length empty!")
@@ -2358,6 +2368,10 @@ var YangToDb_intf_ip_addr_xfmr SubTreeXfmrYangToDb = func(inParams XfmrParams) (
23582368
addr.Config.Ip = new(string)
23592369
*addr.Config.Ip = ip
23602370
}
2371+
parsedIP := net.ParseIP(*addr.Config.Ip)
2372+
if parsedIP != nil {
2373+
*addr.Config.Ip = parsedIP.String()
2374+
}
23612375
log.Info("Ipv6 IP:=", *addr.Config.Ip)
23622376
if addr.Config.PrefixLength == nil {
23632377
log.Error("Prefix Length empty!")

0 commit comments

Comments
 (0)