Skip to content

Commit

Permalink
Merge "Add IPv6 and Enet routes to GR tests"
Browse files Browse the repository at this point in the history
  • Loading branch information
Zuul authored and opencontrail-ci-admin committed Oct 25, 2016
2 parents 661961b + ad24634 commit 930e542
Show file tree
Hide file tree
Showing 3 changed files with 179 additions and 62 deletions.
49 changes: 49 additions & 0 deletions src/bgp/test/graceful_restart_flap_all_test.cc
Expand Up @@ -211,3 +211,52 @@ TEST_P(GracefulRestartTest, GracefulRestart_Flap_7) {
GracefulRestartTestRun();
}

// None of the agents goes down or flip
TEST_P(GracefulRestartTest, GracefulRestart_Down_1) {
SCOPED_TRACE(__FUNCTION__);
GracefulRestartTestStart();
GracefulRestartTestRun();
}

// All agents go down permanently
TEST_P(GracefulRestartTest, GracefulRestart_Down_2) {
SCOPED_TRACE(__FUNCTION__);
GracefulRestartTestStart();

n_down_from_agents_ = xmpp_agents_;
n_down_from_peers_ = bgp_peers_;
GracefulRestartTestRun();
}

// Some agents go down permanently
TEST_P(GracefulRestartTest, GracefulRestart_Down_3) {
SCOPED_TRACE(__FUNCTION__);
GracefulRestartTestStart();

for (size_t i = 0; i < xmpp_agents_.size()/2; i++)
n_down_from_agents_.push_back(xmpp_agents_[i]);
for (size_t i = 0; i < bgp_peers_.size()/2; i++)
n_down_from_peers_.push_back(bgp_peers_[i]);
GracefulRestartTestRun();
}

// Some agents go down permanently and some flip (which sends no routes)
TEST_P(GracefulRestartTest, GracefulRestart_Down_4) {
SCOPED_TRACE(__FUNCTION__);
GracefulRestartTestStart();

for (size_t i = 0; i < xmpp_agents_.size(); i++) {
if (i <= xmpp_agents_.size()/2)
n_down_from_agents_.push_back(xmpp_agents_[i]);
else
n_flipped_agents_.push_back(GRTestParams(xmpp_agents_[i]));
}

for (size_t i = 0; i < bgp_peers_.size(); i++) {
if (i <= bgp_peers_.size()/2)
n_down_from_peers_.push_back(bgp_peers_[i]);
else
n_flipped_peers_.push_back(GRTestParams(bgp_peers_[i]));
}
GracefulRestartTestRun();
}
50 changes: 0 additions & 50 deletions src/bgp/test/graceful_restart_instance_config_test.cc
Expand Up @@ -4,56 +4,6 @@

#include "bgp/test/graceful_restart_test.cc"

// None of the agents goes down or flip
TEST_P(GracefulRestartTest, GracefulRestart_Down_1) {
SCOPED_TRACE(__FUNCTION__);
GracefulRestartTestStart();
GracefulRestartTestRun();
}

// All agents go down permanently
TEST_P(GracefulRestartTest, GracefulRestart_Down_2) {
SCOPED_TRACE(__FUNCTION__);
GracefulRestartTestStart();

n_down_from_agents_ = xmpp_agents_;
n_down_from_peers_ = bgp_peers_;
GracefulRestartTestRun();
}

// Some agents go down permanently
TEST_P(GracefulRestartTest, GracefulRestart_Down_3) {
SCOPED_TRACE(__FUNCTION__);
GracefulRestartTestStart();

for (size_t i = 0; i < xmpp_agents_.size()/2; i++)
n_down_from_agents_.push_back(xmpp_agents_[i]);
for (size_t i = 0; i < bgp_peers_.size()/2; i++)
n_down_from_peers_.push_back(bgp_peers_[i]);
GracefulRestartTestRun();
}

// Some agents go down permanently and some flip (which sends no routes)
TEST_P(GracefulRestartTest, GracefulRestart_Down_4) {
SCOPED_TRACE(__FUNCTION__);
GracefulRestartTestStart();

for (size_t i = 0; i < xmpp_agents_.size(); i++) {
if (i <= xmpp_agents_.size()/2)
n_down_from_agents_.push_back(xmpp_agents_[i]);
else
n_flipped_agents_.push_back(GRTestParams(xmpp_agents_[i]));
}

for (size_t i = 0; i < bgp_peers_.size(); i++) {
if (i <= bgp_peers_.size()/2)
n_down_from_peers_.push_back(bgp_peers_[i]);
else
n_flipped_peers_.push_back(GRTestParams(bgp_peers_[i]));
}
GracefulRestartTestRun();
}

// Some routing instances are first deleted. Subscribed agents remain up and
// running.. This is the common case which happens most of the time during
// normal functioning of the software.
Expand Down
142 changes: 130 additions & 12 deletions src/bgp/test/graceful_restart_test.cc
Expand Up @@ -21,6 +21,8 @@
#include "bgp/bgp_xmpp_channel.h"
#include "bgp/bgp_xmpp_sandesh.h"
#include "bgp/inet/inet_table.h"
#include "bgp/inet6/inet6_table.h"
#include "bgp/inet6vpn/inet6vpn_table.h"
#include "bgp/l3vpn/inetvpn_table.h"
#include "bgp/bgp_session_manager.h"
#include "bgp/test/bgp_server_test_util.h"
Expand Down Expand Up @@ -429,6 +431,13 @@ class GracefulRestartTest : public ::testing::TestWithParam<TestParams> {
std::vector<GRTestParams> &n_flipping_agents);
void ProcessVpnRoute(BgpPeerTest *peer, int instance,
int n_routes, bool add);
void ProcessInetVpnRoute(BgpPeerTest *peer, int instance, int n_routes,
bool add);
void ProcessInet6VpnRoute(BgpPeerTest *peer, int instance, int n_routes,
bool add);
Inet6Prefix GetIPv6Prefix(int agent_id, int instance, int route_id) const;
Inet6VpnPrefix GetIPv6VpnPrefix(int peer_id, int instance, int rt) const;
string GetEnetPrefix(string inet_prefix) const;
void ProcessFlippingPeers(int &total_routes, int remaining_instances,
vector<GRTestParams> &n_flipping_peers);

Expand Down Expand Up @@ -708,6 +717,7 @@ string GracefulRestartTest::GetConfig(bool delete_config) {
<admin-down>false</admin-down>\
<address-families>\
<family>inet-vpn</family>\
<family>inet6-vpn</family>\
<family>e-vpn</family>\
<family>erm-vpn</family>\
<family>route-target</family>\
Expand Down Expand Up @@ -849,7 +859,7 @@ void GracefulRestartTest::CreateAgents() {
for (int k = 1; k <= n_instances_; k++) {
string instance_name =
"instance" + boost::lexical_cast<string>(k);
agent->Subscribe(instance_name, k);
agent->SubscribeAll(instance_name, k);
}
}
}
Expand All @@ -858,10 +868,10 @@ void GracefulRestartTest::CreateAgents() {
void GracefulRestartTest::Subscribe() {

BOOST_FOREACH(test::NetworkAgentMock *agent, xmpp_agents_) {
agent->Subscribe(BgpConfigManager::kMasterInstance, -1);
agent->SubscribeAll(BgpConfigManager::kMasterInstance, -1);
for (int i = 1; i <= n_instances_; i++) {
string instance_name = "instance" + boost::lexical_cast<string>(i);
agent->Subscribe(instance_name, i);
agent->SubscribeAll(instance_name, i);
}
}
WaitForIdle();
Expand All @@ -870,10 +880,10 @@ void GracefulRestartTest::Subscribe() {
void GracefulRestartTest::Unsubscribe() {

BOOST_FOREACH(test::NetworkAgentMock *agent, xmpp_agents_) {
agent->Unsubscribe(BgpConfigManager::kMasterInstance);
agent->UnsubscribeAll(BgpConfigManager::kMasterInstance);
for (int i = 1; i <= n_instances_; i++) {
string instance_name = "instance" + boost::lexical_cast<string>(i);
agent->Unsubscribe(instance_name);
agent->UnsubscribeAll(instance_name);
}
}
VerifyReceivedXmppRoutes(0);
Expand All @@ -891,6 +901,12 @@ test::NextHops GracefulRestartTest::GetNextHops (test::NetworkAgentMock *agent,

void GracefulRestartTest::ProcessVpnRoute(BgpPeerTest *peer, int instance,
int n_routes, bool add) {
ProcessInetVpnRoute(peer, instance, n_routes, add);
ProcessInet6VpnRoute(peer, instance, n_routes, add);
}

void GracefulRestartTest::ProcessInetVpnRoute(BgpPeerTest *peer, int instance,
int n_routes, bool add) {

RoutingInstance *rtinstance = static_cast<RoutingInstance *>(
peer->server()->routing_instance_mgr()->GetRoutingInstance(
Expand Down Expand Up @@ -937,6 +953,59 @@ void GracefulRestartTest::ProcessVpnRoute(BgpPeerTest *peer, int instance,
WaitForIdle();
}

Inet6VpnPrefix GracefulRestartTest::GetIPv6VpnPrefix(int peer_id,
int instance, int rt) const {
string pre_prefix = "65412:" + integerToString(peer_id) +
":2001:bbbb:bbbb::";
string peer_id_str = integerToHexString(peer_id);
string instance_id_str = integerToHexString(instance);
string route_id_str = integerToHexString(rt + 1);
string prefix_str = pre_prefix + peer_id_str + ":" +
instance_id_str + ":" + route_id_str + "/128";
return Inet6VpnPrefix::FromString(prefix_str);
}

void GracefulRestartTest::ProcessInet6VpnRoute(BgpPeerTest *peer, int instance,
int n_routes, bool add) {
RoutingInstance *rtinstance = static_cast<RoutingInstance *>(
peer->server()->routing_instance_mgr()->GetRoutingInstance(
BgpConfigManager::kMasterInstance));
BgpTable *table = rtinstance->GetTable(Address::INET6VPN);

DBRequest req;
boost::scoped_ptr<BgpAttrLocalPref> local_pref;
boost::scoped_ptr<ExtCommunitySpec> commspec;

for (int rt = 0; rt < n_routes; rt++) {
Inet6VpnPrefix inet6vpn_prefix =
GetIPv6VpnPrefix(peer->id(), instance, rt + 1);
req.key.reset(new Inet6VpnTable::RequestKey(inet6vpn_prefix, NULL));
req.oper = add ? DBRequest::DB_ENTRY_ADD_CHANGE :
DBRequest::DB_ENTRY_DELETE;

local_pref.reset(new BgpAttrLocalPref(100));

BgpAttrSpec attr_spec;
attr_spec.push_back(local_pref.get());

BgpAttrNextHop nexthop(0x7f010000 + peer->id());
attr_spec.push_back(&nexthop);

commspec.reset(CreateRouteTargets());

TunnelEncap tun_encap(std::string("gre"));
commspec->communities.push_back(get_value(
tun_encap.GetExtCommunity().begin(), 8));
attr_spec.push_back(commspec.get());
BgpAttrPtr attr = peer->server()->attr_db()->Locate(attr_spec);

req.data.reset(new Inet6Table::RequestData(attr, 0,
1000*instance + rt));
table->Enqueue(&req);
}
WaitForIdle();
}

void GracefulRestartTest::AddOrDeleteBgpRoutes(bool add, int n_routes,
int down_peers) {
if (n_routes ==-1)
Expand All @@ -953,6 +1022,26 @@ void GracefulRestartTest::AddOrDeleteBgpRoutes(bool add, int n_routes,
}
}

Inet6Prefix GracefulRestartTest::GetIPv6Prefix(int agent_id, int instance_id,
int route_id) const {
string inet6_prefix_str = "2001:aaaa:aaaa::" +
integerToHexString(agent_id) + ":" + integerToHexString(instance_id) +
":" + integerToHexString(route_id + 1) + "/128";
return Inet6Prefix::FromString(inet6_prefix_str);
}

// Generate enet address from a inet address.
string GracefulRestartTest::GetEnetPrefix(string inet_prefix) const {
vector<string> octets;
boost::split(octets, inet_prefix, boost::is_any_of("/."));

char buf[32];
snprintf(buf, sizeof(buf), "%02X:%02X:%02X:%02X:00:00",
atoi(octets[0].c_str()), atoi(octets[1].c_str()),
atoi(octets[2].c_str()), atoi(octets[3].c_str()));
return string(buf);
}

void GracefulRestartTest::AddOrDeleteXmppRoutes(bool add, int n_routes,
int down_agents) {
if (n_routes ==-1)
Expand All @@ -971,13 +1060,25 @@ void GracefulRestartTest::AddOrDeleteXmppRoutes(bool add, int n_routes,
Ip4Prefix prefix(Ip4Prefix::FromString(
"10." + boost::lexical_cast<string>(i) + "." +
boost::lexical_cast<string>(agent->id()) + ".1/32"));

for (int rt = 0; rt < n_routes; rt++,
prefix = task_util::Ip4PrefixIncrement(prefix)) {
Inet6Prefix inet6_prefix = GetIPv6Prefix(agent->id(), i,
rt + 1);
if (add) {
agent->AddRoute(instance_name, prefix.ToString(),
GetNextHops(agent, i));
agent->AddEnetRoute(instance_name,
GetEnetPrefix(prefix.ToString()),
GetNextHops(agent, i));
agent->AddInet6Route(instance_name, inet6_prefix.ToString(),
GetNextHops(agent, i));
} else {
agent->DeleteRoute(instance_name, prefix.ToString());
agent->DeleteEnetRoute(instance_name,
GetEnetPrefix(prefix.ToString()));
agent->DeleteInet6Route(instance_name,
inet6_prefix.ToString());
}
}
}
Expand All @@ -998,8 +1099,11 @@ void GracefulRestartTest::VerifyReceivedXmppRoutes(int routes) {
if (!agent->HasSubscribed(instance_name))
continue;
TASK_UTIL_EXPECT_EQ_MSG(routes, agent->RouteCount(instance_name),
"Agent " + agent->ToString() +
": Wait for routes in " + instance_name);
"Agent " + agent->ToString() +
": Wait for ipv4 routes in " + instance_name);
TASK_UTIL_EXPECT_EQ_MSG(routes, agent->Inet6RouteCount(
instance_name), "Agent " + agent->ToString() +
": Wait for ipv6 routes in " + instance_name);
}
}
WaitForIdle();
Expand Down Expand Up @@ -1042,7 +1146,7 @@ void GracefulRestartTest::DeleteRoutingInstances(vector<int> instances,
continue;
if (std::find(dont_unsubscribe.begin(), dont_unsubscribe.end(),
agent) == dont_unsubscribe.end())
agent->Unsubscribe(instance_name, -1, true, false);
agent->UnsubscribeAll(instance_name);
}

BOOST_FOREACH(BgpPeerTest *peer, bgp_peers_) {
Expand Down Expand Up @@ -1207,7 +1311,7 @@ void GracefulRestartTest::ProcessFlippingAgents(int &total_routes,
WaitForAgentToBeEstablished(agent);

// Subset of subscriptions after restart
agent->Subscribe(BgpConfigManager::kMasterInstance, -1);
agent->SubscribeAll(BgpConfigManager::kMasterInstance, -1);

for (size_t i = 0; i < gr_test_param.instance_ids.size(); i++) {
int instance_id = gr_test_param.instance_ids[i];
Expand All @@ -1222,7 +1326,7 @@ void GracefulRestartTest::ProcessFlippingAgents(int &total_routes,

string instance_name = "instance" +
boost::lexical_cast<string>(instance_id);
agent->Subscribe(instance_name, instance_id);
agent->SubscribeAll(instance_name, instance_id);

// Subset of routes are [re]advertised after restart
Ip4Prefix prefix(Ip4Prefix::FromString(
Expand All @@ -1231,8 +1335,15 @@ void GracefulRestartTest::ProcessFlippingAgents(int &total_routes,
int nroutes = gr_test_param.nroutes[i];
for (int rt = 0; rt < nroutes; rt++,
prefix = task_util::Ip4PrefixIncrement(prefix)) {
Inet6Prefix inet6_prefix =
GetIPv6Prefix(agent->id(), instance_id, rt + 1);
agent->AddRoute(instance_name, prefix.ToString(),
GetNextHops(agent, instance_id));
agent->AddEnetRoute(instance_name,
GetEnetPrefix(prefix.ToString()),
GetNextHops(agent, instance_id));
agent->AddInet6Route(instance_name, inet6_prefix.ToString(),
GetNextHops(agent, instance_id));
}
total_routes += nroutes;
}
Expand Down Expand Up @@ -1574,7 +1685,7 @@ void GracefulRestartTest::GracefulRestartTestRun () {
WaitForAgentToBeEstablished(agent);

// Subset of subscriptions after restart
agent->Subscribe(BgpConfigManager::kMasterInstance, -1);
agent->SubscribeAll(BgpConfigManager::kMasterInstance, -1);
for (size_t i = 0; i < gr_test_param.instance_ids.size(); i++) {
int instance_id = gr_test_param.instance_ids[i];
if (std::find(instances_to_delete_before_gr_.begin(),
Expand All @@ -1587,7 +1698,7 @@ void GracefulRestartTest::GracefulRestartTestRun () {
continue;
string instance_name = "instance" +
boost::lexical_cast<string>(instance_id);
agent->Subscribe(instance_name, instance_id);
agent->SubscribeAll(instance_name, instance_id);

// Subset of routes are [re]advertised after restart
Ip4Prefix prefix(Ip4Prefix::FromString(
Expand All @@ -1596,8 +1707,15 @@ void GracefulRestartTest::GracefulRestartTestRun () {
int nroutes = gr_test_param.nroutes[i];
for (int rt = 0; rt < nroutes; rt++,
prefix = task_util::Ip4PrefixIncrement(prefix)) {
Inet6Prefix inet6_prefix =
GetIPv6Prefix(agent->id(), instance_id, rt + 1);
agent->AddRoute(instance_name, prefix.ToString(),
GetNextHops(agent, instance_id));
agent->AddEnetRoute(instance_name,
GetEnetPrefix(prefix.ToString()),
GetNextHops(agent, instance_id));
agent->AddInet6Route(instance_name, inet6_prefix.ToString(),
GetNextHops(agent, instance_id));
}
total_routes += nroutes;
}
Expand Down

0 comments on commit 930e542

Please sign in to comment.