diff --git a/translib/transformer/interfaces_openconfig_test.go b/translib/transformer/interfaces_openconfig_test.go index ee2a92a4e..64c1a4103 100644 --- a/translib/transformer/interfaces_openconfig_test.go +++ b/translib/transformer/interfaces_openconfig_test.go @@ -452,11 +452,23 @@ func Test_openconfig_subintf_ipv6(t *testing.T) { t.Run("Test Get/Verify Patch IPv6 address at subinterfaces addresses", processGetRequest(url, nil, expected_get_json, false)) time.Sleep(1 * time.Second) + pre_req_map = map[string]interface{}{"INTF_TABLE": map[string]interface{}{"Ethernet0:a::e/64": map[string]interface{}{"NULL": "NULL"}}} + loadDB(db.ApplDB, pre_req_map) + + t.Log("\n\n--- Verify PATCH IPv6 address at addresses address level ---") + url = "/openconfig-interfaces:interfaces/interface[name=Ethernet0]/subinterfaces/subinterface[index=0]/openconfig-if-ip:ipv6/addresses/address[ip=a::e]" + expected_get_json = "{\"openconfig-if-ip:address\":[{\"config\":{\"ip\":\"a::e\",\"prefix-length\":64},\"ip\":\"a::e\", \"state\":{\"ip\":\"a::e\",\"prefix-length\":64}}]}" + t.Run("Test Get/Verify Patch IPv6 address at subinterfaces addresses address", processGetRequest(url, nil, expected_get_json, false)) + time.Sleep(1 * time.Second) + t.Log("\n\n--- Delete IPv6 address at subinterfaces addresses level---") url = "/openconfig-interfaces:interfaces/interface[name=Ethernet0]/subinterfaces/subinterface[index=0]/openconfig-if-ip:ipv6/addresses" t.Run("Test Delete IPv6 address at subinterfaces addresses level", processDeleteRequest(url, true)) time.Sleep(1 * time.Second) + cleanuptbl = map[string]interface{}{"INTF_TABLE": map[string]interface{}{"Ethernet0:a::e/64": ""}} + unloadDB(db.ApplDB, cleanuptbl) + t.Log("\n\n--- Verify Delete IPv6 address at subinterfaces addresses ---") url = "/openconfig-interfaces:interfaces/interface[name=Ethernet0]/subinterfaces/subinterface[index=0]/ipv6/addresses" expected_get_json = "{}" @@ -498,8 +510,53 @@ func Test_openconfig_subintf_ipv6(t *testing.T) { t.Run("Test Get IPv6 address at subinterfaces", processGetRequest(url, nil, expected_get_json, false)) time.Sleep(1 * time.Second) + //------------------------------------------------------------------------------------------------------------------------------------------- + t.Log("\n\n--- PATCH IPv6 address at addresses ---") + url = "/openconfig-interfaces:interfaces/interface[name=Ethernet4]/subinterfaces/subinterface[index=0]/openconfig-if-ip:ipv6/addresses" + 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}}]}}" + + time.Sleep(1 * time.Second) + t.Run("Test Patch/Set IPv6 address on subinterfaces addresses", processSetRequest(url, url_input_body_json, "PATCH", false, nil)) + time.Sleep(1 * time.Second) + + t.Log("\n\n--- Verify PATCH IPv6 address at addresses level ---") + url = "/openconfig-interfaces:interfaces/interface[name=Ethernet4]/subinterfaces/subinterface[index=0]/openconfig-if-ip:ipv6/addresses" + expected_get_json = "{\"openconfig-if-ip:addresses\":{\"address\":[{\"config\":{\"ip\":\"2001:db8:abcd:16::1\",\"prefix-length\":64},\"ip\":\"2001:db8:abcd:16::1\"}]}}" + t.Run("Test Get/Verify Patch IPv6 address at subinterfaces addresses", processGetRequest(url, nil, expected_get_json, false)) + time.Sleep(1 * time.Second) + + pre_req_map = map[string]interface{}{"INTF_TABLE": map[string]interface{}{"Ethernet4:2001:db8:abcd:16::1/64": map[string]interface{}{"NULL": "NULL"}}} + loadDB(db.ApplDB, pre_req_map) + + t.Log("\n\n--- Verify PATCH IPv6 address at addresses address level ---") + url = "/openconfig-interfaces:interfaces/interface[name=Ethernet4]/subinterfaces/subinterface[index=0]/openconfig-if-ip:ipv6/addresses/address[ip=2001:db8:abcd:16::1]" + 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}}]}" + t.Run("Test Get/Verify Patch IPv6 address at subinterfaces addresses address", processGetRequest(url, nil, expected_get_json, false)) + time.Sleep(1 * time.Second) + + t.Log("\n\n-Verify Db for iPv6 PATCH--\n\n") + url = "/openconfig-interfaces:interfaces/interface[name=Ethernet4]/subinterfaces/subinterface[index=0]/openconfig-if-ip:ipv6/addresses/address[ip=2001:db8:abcd:16::1]" + expected_map := map[string]interface{}{"INTERFACE": map[string]interface{}{"Ethernet4": map[string]interface{}{"family": "IPv6"}}} + t.Run("Verify Db for IPv6 PATCH", verifyDbResult(rclient, "INTERFACE|Ethernet4|2001:db8:abcd:16::1/64", expected_map, false)) + + t.Log("\n\n--- Delete IPv6 address at subinterfaces addresses level---") + url = "/openconfig-interfaces:interfaces/interface[name=Ethernet4]/subinterfaces/subinterface[index=0]/openconfig-if-ip:ipv6/addresses" + t.Run("Test Delete IPv6 address at subinterfaces addresses level", processDeleteRequest(url, false)) + time.Sleep(1 * time.Second) + + cleanuptbl = map[string]interface{}{"INTF_TABLE": map[string]interface{}{"Ethernet4:2001:db8:abcd:16::1/64": ""}} + unloadDB(db.ApplDB, cleanuptbl) + + t.Log("\n\n--- Verify Delete IPv6 address at subinterfaces addresses ---") + url = "/openconfig-interfaces:interfaces/interface[name=Ethernet4]/subinterfaces/subinterface[index=0]/ipv6/addresses" + expected_get_json = "{}" + t.Run("Test Get/Verify Delete IPv6 address at subinterfaces addresses", processGetRequest(url, nil, expected_get_json, false)) + time.Sleep(1 * time.Second) + t.Log("\n\n+++++++++++++ DONE CONFIGURING AND REMOVING IPV6 ADDRESSES ON SUBINTERFACES ++++++++++++") + + //------------------------------------------------------------------------------------------------------ t.Log("\n\n+++++++++++++ ENABLE AND DISABLE IPV6 LINK LOCAL ON SUBINTERFACES ++++++++++++") t.Log("\n\n--- Get IPv6 link local value (enabled) at config level ---") url = "/openconfig-interfaces:interfaces/interface[name=Ethernet0]/subinterfaces/subinterface[index=0]/ipv6/config" diff --git a/translib/transformer/xfmr_intf.go b/translib/transformer/xfmr_intf.go index d75b6a9c2..4136a74bc 100644 --- a/translib/transformer/xfmr_intf.go +++ b/translib/transformer/xfmr_intf.go @@ -21,6 +21,7 @@ package transformer import ( "errors" "fmt" + "net" "reflect" "regexp" "sort" @@ -1768,11 +1769,16 @@ var YangToDb_subintf_ip_addr_key_xfmr KeyXfmrYangToDb = func(inParams XfmrParams log.Info("Entering YangToDb_subintf_ip_addr_key_xfmr") } var err error - var inst_key string pathInfo := NewPathInfo(inParams.uri) - inst_key = pathInfo.Var("ip") - log.Infof("URI:%v Interface IP:%v", inParams.uri, inst_key) - return inst_key, err + rawIP := pathInfo.Var("ip") + ip := net.ParseIP(rawIP) + if ip == nil { + return "", tlerr.InvalidArgs("Invalid IP address: %v", rawIP) + } + compressedIP := ip.String() + + log.Infof("URI:%v Interface IP: %v => Compressed: %v", inParams.uri, rawIP, compressedIP) + return compressedIP, err } var DbToYang_subintf_ip_addr_key_xfmr KeyXfmrDbToYang = func(inParams XfmrParams) (map[string]interface{}, error) { if log.V(3) { @@ -2305,6 +2311,10 @@ var YangToDb_intf_ip_addr_xfmr SubTreeXfmrYangToDb = func(inParams XfmrParams) ( addr.Config.Ip = new(string) *addr.Config.Ip = ip } + parsedIP := net.ParseIP(*addr.Config.Ip) + if parsedIP != nil { + *addr.Config.Ip = parsedIP.String() + } log.Info("Ip:=", *addr.Config.Ip) if addr.Config.PrefixLength == nil { log.Error("Prefix Length empty!") @@ -2358,6 +2368,10 @@ var YangToDb_intf_ip_addr_xfmr SubTreeXfmrYangToDb = func(inParams XfmrParams) ( addr.Config.Ip = new(string) *addr.Config.Ip = ip } + parsedIP := net.ParseIP(*addr.Config.Ip) + if parsedIP != nil { + *addr.Config.Ip = parsedIP.String() + } log.Info("Ipv6 IP:=", *addr.Config.Ip) if addr.Config.PrefixLength == nil { log.Error("Prefix Length empty!")