blob: 886806ec1b2e3e55a6ab3771ee75ec00e90815fe [file] [log] [blame]
class PMastership:
def __init__(self):
self.default = ''
def CASE1(self, main):
main.case("PMastership Test")
"""
Verify there are no pending flows and groups
Get flows and group counts
Verify that are not 0
Get the master of leaf2 (look at the params file for the config)
Verify that has the master
Kill switch leaf2
Set label on switch K8S node to prevent K8S to redeploy stratum
Verify there are no pending flows and groups related to segment routing
Verify that the master of leaf2 is still the same as before
Wait for the switch to be up again
Verify there are no pending flows and groups
"""
try:
from tests.USECASE.SegmentRouting.dependencies.Testcaselib import \
Testcaselib as run
from tests.USECASE.SegmentRouting.SRStaging.dependencies.SRStagingTest import \
SRStagingTest
import time
except ImportError as e:
main.log.error("Import not found. Exiting the test")
main.log.error(e)
main.cleanAndExit()
# Retrieves the params of the test
n_switches = int(main.params["TOPO"]["switchNum"])
switch_to_kill = main.params["PMastership"]["PMastership_dataplane_fail"]["switch_to_kill"]
k8s_switch_node = main.params["PMastership"]["PMastership_dataplane_fail"]["k8s_switch_node"]
k8s_label = main.params["PMastership"]["PMastership_dataplane_fail"]["k8s_label"]
k8s_label_value_test = main.params["PMastership"]["PMastership_dataplane_fail"]["k8s_label_value_test"]
k8s_label_value_normal = main.params["PMastership"]["PMastership_dataplane_fail"]["k8s_label_value_normal"]
# Init the main components and variables
run.initTest(main)
main.log.info(main.Cluster.numCtrls)
main.Cluster.setRunningNode(3)
run.installOnos(main, skipPackage=True, cliSleep=5)
onos_cli = main.Cluster.active(0).CLI
kubectl = main.Cluster.active(0).Bench
kubeconfig = main.Cluster.active(0).k8s.kubeConfig
namespace = main.params['kubernetes']['namespace']
main.step("Verify there are added flows")
initial_flows_count = onos_cli.checkFlowCount()
empty = main.TRUE if ( initial_flows_count == 0 ) else main.FALSE
utilities.assert_equal(
expect=main.FALSE,
actual=empty,
onpass="There are " + str(initial_flows_count) + " added flows",
onfail="There are no added flows",
)
main.step("Verify there are added groups")
initial_groups_count = onos_cli.checkGroupCount()
empty = main.TRUE if ( initial_groups_count == 0 ) else main.FALSE
utilities.assert_equal(
expect=main.FALSE,
actual=empty,
onpass="There are " + str(initial_groups_count) + " added groups",
onfail="There are no added groups",
)
no_pending_flows = utilities.retry(onos_cli.checkFlowsState,
[False, None],
kwargs={"isPENDING": False},
attempts=20,
getRetryingTime=True)
main.step("Verify there are no pending flows")
utilities.assert_equal(
expect=main.TRUE,
actual=no_pending_flows,
onpass="There are no pending flows",
onfail="There are pending flows",
)
no_pending_groups = utilities.retry(onos_cli.checkGroupsState,
[False, None],
kwargs={"isPENDING": False},
attempts=20,
getRetryingTime=True)
main.step("Verify there are no pending groups")
utilities.assert_equal(
expect=main.TRUE,
actual=no_pending_groups,
onpass="There are no pending groups",
onfail="There are pending groups",
)
main.step("Retrieving " + switch_to_kill + " master")
initial_master = onos_cli.getMaster("device:" + k8s_switch_node)
no_master = main.TRUE if ( initial_master is None ) else main.FALSE
utilities.assert_equal(
expect=main.FALSE,
actual=no_master,
onpass=initial_master + " is the master of " + switch_to_kill,
onfail="There is no master for " + switch_to_kill,
)
main.step("Set label to switch k8s node and kill Stratum")
# K8s node name correspond to the switch name in lowercase
utilities.assert_equal(
expect=main.TRUE,
actual=kubectl.kubectlSetLabel(
nodeName=k8s_switch_node,
label=k8s_label,
value=k8s_label_value_test,
kubeconfig=kubeconfig,
namespace=namespace,
),
onpass="Label has been set correctly on node %s" % k8s_switch_node,
onfail="Label has not been set on node %s" % k8s_switch_node
)
try:
def checkNumberStratumPods(n_value):
pods = kubectl.kubectlGetPodNames(
kubeconfig=kubeconfig,
namespace=namespace,
name="stratum"
)
main.log.info("PODS: " + str(pods))
return n_value == len(pods) if pods is not main.FALSE else False
# Execute the following in try/except/finally to be sure to restore the
# k8s label even in case of unhandled exception.
# Wait for stratum pod to be removed from the switch
removed = utilities.retry(checkNumberStratumPods,
False,
args=[n_switches - 1],
attempts=50)
main.log.info("Stratum has been removed from the switch? %s" % removed)
sleepTime = 20
switch_component = getattr(main, switch_to_kill)
main.log.info("Sleeping %s seconds for ONOS to react" % sleepTime)
time.sleep(sleepTime)
available = utilities.retry(SRStagingTest.switchIsConnected,
True,
args=[switch_component],
attempts=300,
getRetryingTime=True)
main.log.info("Switch %s is available in ONOS? %s" % (
switch_to_kill, available))
utilities.assert_equal(
expect=True,
actual=not available and removed,
onpass="Stratum was removed from switch k8s node",
onfail="Stratum was not removed from switch k8s node"
)
main.step("Verify there are no segmentrouting flows after the failure")
raw_flows = onos_cli.flows(device="device:" + k8s_switch_node)
sr_flows = main.TRUE if "segmentrouting" in raw_flows else main.FALSE
utilities.assert_equal(
expect=main.FALSE,
actual=sr_flows,
onpass="There are no segmentrouting flows",
onfail="There are segmentrouting flows",
)
main.step("Verify there are no segmentrouting groups after the failure")
raw_groups = onos_cli.groups(device="device:" + k8s_switch_node)
sr_groups = main.TRUE if "segmentrouting" in raw_groups else main.FALSE
utilities.assert_equal(
expect=main.FALSE,
actual=sr_groups,
onpass="There are no segmentrouting groups",
onfail="There are segmentrouting groups",
)
main.step("Verify " + initial_master + " is still the master of " + switch_to_kill)
after_master = onos_cli.getMaster("device:" + k8s_switch_node)
no_master = main.TRUE if ( initial_master is None ) else main.FALSE
utilities.assert_equal(
expect=main.FALSE,
actual=no_master,
onpass=initial_master + " is the master of " + switch_to_kill,
onfail="There is no master for " + switch_to_kill,
)
same_master = main.TRUE if ( initial_master == after_master ) else main.FALSE
utilities.assert_equal(
expect=main.TRUE,
actual=same_master,
onpass=initial_master + " is still the master of " + switch_to_kill,
onfail="Master for " + switch_to_kill + " is " + after_master,
)
except Exception as e:
main.log.error("Unhandled exception!")
main.log.error(e)
finally:
utilities.assert_equal(
expect=main.TRUE,
actual=kubectl.kubectlSetLabel(
nodeName=k8s_switch_node,
label=k8s_label,
value=k8s_label_value_normal,
kubeconfig=kubeconfig,
namespace=namespace,
),
onpass="Label has been set correctly on node %s" % k8s_switch_node,
onfail="Label has not been set on node %s" % k8s_switch_node
)
# Wait for stratum pod to be re-deployed on the switch
deployed = utilities.retry(checkNumberStratumPods,
False,
args=[n_switches],
attempts=50)
main.log.info("Stratum has been redeployed on the switch? %s" % deployed)
# Wait switch to be back in ONOS
available = utilities.retry(SRStagingTest.switchIsConnected,
False,
args=[switch_component],
sleep=2,
attempts=300,
getRetryingTime=True)
main.log.info("Switch %s is available in ONOS? %s" % (
switch_to_kill, available))
utilities.assert_equal(
expect=True,
actual=available and deployed,
onpass="Switch is back available in ONOS and stratum has been redeployed",
onfail="Switch is not available in ONOS, may influence subsequent tests!"
)
sleepTime = 10
main.log.info("Sleeping %s seconds for ONOS to react and assure flows/groups are ADDED" % sleepTime)
time.sleep(sleepTime)
main.step("Verify there are added flows after reboot")
after_flows_count = onos_cli.checkFlowCount()
empty = main.TRUE if ( after_flows_count == 0 ) else main.FALSE
utilities.assert_equal(
expect=main.FALSE,
actual=empty,
onpass="There are " + str(after_flows_count) + " added flows",
onfail="There are no added flows",
)
main.step("Verify there are added groups after reboot")
after_groups_count = onos_cli.checkGroupCount()
empty = main.TRUE if ( after_groups_count == 0 ) else main.FALSE
utilities.assert_equal(
expect=main.FALSE,
actual=empty,
onpass="There are " + str(after_groups_count) + " added groups",
onfail="There are no added groups",
)
no_pending_flows = utilities.retry(onos_cli.checkFlowsState,
[False, None],
kwargs={"isPENDING": False},
attempts=20,
getRetryingTime=True)
main.step("Verify there are no pending flows after reboot")
utilities.assert_equal(
expect=main.TRUE,
actual=no_pending_flows,
onpass="There are no pending flows",
onfail="There are pending flows",
)
no_pending_groups = utilities.retry(onos_cli.checkGroupsState,
[False, None],
kwargs={"isPENDING": False},
attempts=20,
getRetryingTime=True)
main.step("Verify there are no pending groups after reboot")
utilities.assert_equal(
expect=main.TRUE,
actual=no_pending_groups,
onpass="There are no pending groups",
onfail="There are pending groups",
)