diff --git a/src/vnsw/agent/oper/vm_interface.cc b/src/vnsw/agent/oper/vm_interface.cc index a15d681d942..ee59ae5d557 100644 --- a/src/vnsw/agent/oper/vm_interface.cc +++ b/src/vnsw/agent/oper/vm_interface.cc @@ -35,6 +35,7 @@ #include #include +#include #include #include #include @@ -213,12 +214,8 @@ static void BuildFloatingIpList(Agent *agent, VmInterfaceConfigData *data, continue; } // Checking whether it is default vrf of not - size_t found = vn_node->name().find_last_of(':'); - std::string vrf_name = ""; - if (found != string::npos) { - vrf_name = vn_node->name() + vn_node->name().substr(found); - } - if (vrf_node->name().compare(vrf_name) != 0) { + RoutingInstance *ri = static_cast(vrf_node->GetObject()); + if(!(ri->is_default())) { continue; } FloatingIp *fip = static_cast(node->GetObject()); diff --git a/src/vnsw/agent/test/test_cmn_util.h b/src/vnsw/agent/test/test_cmn_util.h index 917e17df7d9..19cbf59c62f 100644 --- a/src/vnsw/agent/test/test_cmn_util.h +++ b/src/vnsw/agent/test/test_cmn_util.h @@ -209,7 +209,7 @@ void AsioRun(); void AsioStop(); void AddVm(const char *name, int id); void DelVm(const char *name); -void AddVrf(const char *name, int id = 0); +void AddVrf(const char *name, int id = 0, bool default_ri = true); void DelVrf(const char *name); void ModifyForwardingModeVn(const string &name, int id, const string &fw_mode); void AddL2L3Vn(const char *name, int id); diff --git a/src/vnsw/agent/test/test_fip_cfg.cc b/src/vnsw/agent/test/test_fip_cfg.cc index 3f157ba1b25..13d2f5c8167 100644 --- a/src/vnsw/agent/test/test_fip_cfg.cc +++ b/src/vnsw/agent/test/test_fip_cfg.cc @@ -282,6 +282,77 @@ TEST_F(CfgTest, FloatingIp_1) { EXPECT_FALSE(VmFind(1)); } +TEST_F(CfgTest, FloatingIpDefaultVrf) { + struct PortInfo input[] = { + {"vnet1", 1, "1.1.1.1", "00:00:00:01:01:01", 1, 1}, + }; + + CreateVmportEnv(input, 1); + client->WaitForIdle(); + + AddVn("default-project:vn2", 2); + client->WaitForIdle(); + + AddVrf("default-project:vn2:vn2"); + AddLink("virtual-network", "default-project:vn2", "routing-instance", "default-project:vn2:vn2"); + AddVrf("vrf2", 0, false); + client->WaitForIdle(); + + AddLink("virtual-network", "default-project:vn2", "routing-instance", "vrf2"); + client->WaitForIdle(); + + // Create floating-ip on vn2 + AddFloatingIpPool("fip-pool1", 1); + AddFloatingIp("fip1", 1, "2.2.2.100"); + AddLink("floating-ip-pool", "fip-pool1", "virtual-network", + "default-project:vn2"); + AddLink("floating-ip", "fip1", "floating-ip-pool", "fip-pool1"); + AddLink("virtual-machine-interface", "vnet1", "floating-ip", "fip1"); + client->WaitForIdle(); + client->Reset(); + + EXPECT_TRUE(VmPortActive(input, 0)); + EXPECT_TRUE(VmPortFloatingIpCount(1, 1)); + EXPECT_TRUE(RouteFind("vrf1", Ip4Address::from_string("1.1.1.1"), 32)); + EXPECT_TRUE(RouteFind("default-project:vn2:vn2", + Ip4Address::from_string("2.2.2.100"), 32)); + EXPECT_FALSE(RouteFind("vrf2", + Ip4Address::from_string("2.2.2.100"), 32)); + + // Cleanup + LOG(DEBUG, "Doing cleanup"); + + // Delete links + DelLink("virtual-machine-interface", "vnet1", "floating-ip", "fip1"); + DelLink("floating-ip-pool", "fip-pool1", "virtual-network", + "default-project:vn2:vn2"); + DelLink("floating-ip", "fip1", "floating-ip-pool", "fip-pool1"); + client->WaitForIdle(); + + EXPECT_FALSE(RouteFind("default-project:vn2:vn2", + Ip4Address::from_string("2.2.2.100"), 32)); + + DelFloatingIp("fip1"); + DelFloatingIpPool("fip-pool1"); + + // Delete virtual-machine-interface to vrf link attribute + DelLink("virtual-network", "default-project:vn2", "routing-instance", + "default-project:vn2:vn2"); + DelLink("virtual-network", "default-project:vn2", "routing-instance", + "vrf2"); + + client->WaitForIdle(); + + DelVn("default-project:vn2"); + DelVrf("default-project:vn2:vn2"); + DelVrf("vrf2"); + DeleteVmportEnv(input, 1, true); + client->WaitForIdle(); + EXPECT_FALSE(VrfFind("vrf2")); + EXPECT_FALSE(VrfFind("default-project:vn2:vn2")); + EXPECT_FALSE(VnFind(2)); +} + // Create Nova intf first // Intf config without FIP // Add FIP later diff --git a/src/vnsw/agent/test/test_util.cc b/src/vnsw/agent/test/test_util.cc index 312222b25f9..62348937a66 100644 --- a/src/vnsw/agent/test/test_util.cc +++ b/src/vnsw/agent/test/test_util.cc @@ -1540,8 +1540,16 @@ void DelVm(const char *name) { DelNode("virtual-machine", name); } -void AddVrf(const char *name, int id) { - AddNode("routing-instance", name, id); +void AddVrf(const char *name, int id, bool default_ri) { + std::stringstream str; + str << " " << default_ri << "" << endl; + char buff[10240]; + int len = 0; + AddXmlHdr(buff, len); + AddNodeString(buff, len, "routing-instance", name, id, str.str().c_str()); + AddXmlTail(buff, len); + ApplyXmlString(buff); + return; } void DelVrf(const char *name) {