2 Documentation Cluster OpenFlow library. So far this library is only to be used by OpenFlow cluster test as it is very specific for this test.
3 Library RequestsLibrary
4 Resource ClusterManagement.robot
5 Resource MininetKeywords.robot
7 Variables ../variables/Variables.py
10 @{SHARD_OPER_LIST} inventory topology default entity-ownership
11 @{SHARD_CONF_LIST} inventory topology default
12 ${config_table_0} ${CONFIG_NODES_API}/node/openflow:1/table/0
13 ${operational_table_0} ${OPERATIONAL_NODES_API}/node/openflow:1/table/0
14 ${operational_port_1} ${OPERATIONAL_NODES_API}/node/openflow:1/node-connector/openflow:1:1
17 Get InventoryConfig Shard Status
18 [Arguments] ${controller_index_list}=${EMPTY}
19 [Documentation] Check Status for Inventory Config shard in OpenFlow application.
20 ${inv_conf_leader} ${inv_conf_followers_list} Wait Until Keyword Succeeds 10s 1s ClusterManagement.Get_Leader_And_Followers_For_Shard shard_name=inventory
21 ... shard_type=config member_index_list=${controller_index_list}
22 Log config inventory Leader is ${inv_conf_leader} and followers are ${inv_conf_followers_list}
23 [Return] ${inv_conf_leader} ${inv_conf_followers_list}
25 Check OpenFlow Shards Status
26 [Arguments] ${controller_index_list}=${EMPTY}
27 [Documentation] Check Status for all shards in OpenFlow application.
28 ClusterManagement.Verify_Leader_Exists_For_Each_Shard shard_name_list=${SHARD_OPER_LIST} shard_type=operational member_index_list=${controller_index_list}
29 ClusterManagement.Verify_Leader_Exists_For_Each_Shard shard_name_list=${SHARD_CONF_LIST} shard_type=config member_index_list=${controller_index_list}
31 Check OpenFlow Shards Status After Cluster Event
32 [Arguments] ${controller_index_list}=${EMPTY}
33 [Documentation] Check Shards Status after some cluster event.
34 Wait Until Keyword Succeeds 90s 1s ClusterOpenFlow.Check OpenFlow Shards Status ${controller_index_list}
36 Get OpenFlow Entity Owner Status For One Device
37 [Arguments] ${device} ${controller_index} ${controller_index_list}=${EMPTY}
38 [Documentation] Check Entity Owner Status and identify owner and successors for the device ${device}. Request is sent to controller ${controller_index}.
39 ${owner} ${successor_list} Wait Until Keyword Succeeds 10s 1s ClusterManagement.Verify_Owner_And_Successors_For_Device device_name=${device}
40 ... device_type=openflow member_index=${controller_index} candidate_list=${controller_index_list}
41 [Return] ${owner} ${successor_list}
43 Check OpenFlow Network Operational Information For Sample Topology
44 [Arguments] ${controller_index_list}=${EMPTY}
45 [Documentation] Check devices in tree,2 are in operational inventory and topology in all instances in ${controller_index_list}.
46 ... Inventory should show 1x node_id per device 1x node_id per connector. Topology should show 2x node_id per device + 3x node_id per connector
47 ... + 5x node_id per link termination. TODO: A Keyword that can calculate this based on mininet topology.
48 ${dictionary} Create Dictionary openflow:1=4 openflow:2=5 openflow:3=5
49 Wait Until Keyword Succeeds 5s 1s ClusterManagement.Check_Item_Occurrence_Member_List_Or_All uri=${OPERATIONAL_NODES_API} dictionary=${dictionary} member_index_list=${controller_index_list}
50 ${dictionary} Create Dictionary openflow:1=21 openflow:2=19 openflow:3=19
51 Wait Until Keyword Succeeds 5s 1s ClusterManagement.Check_Item_Occurrence_Member_List_Or_All uri=${OPERATIONAL_TOPO_API} dictionary=${dictionary} member_index_list=${controller_index_list}
53 Check No OpenFlow Network Operational Information
54 [Arguments] ${controller_index_list}=${EMPTY}
55 [Documentation] Check device is not in operational inventory or topology in all cluster instances in ${controller_index_list}.
56 ${dictionary} Create Dictionary openflow=0
57 Wait Until Keyword Succeeds 5s 1s ClusterManagement.Check_Item_Occurrence_Member_List_Or_All uri=${OPERATIONAL_NODES_API} dictionary=${dictionary} member_index_list=${controller_index_list}
58 ${dictionary} Create Dictionary openflow=0
59 Wait Until Keyword Succeeds 5s 1s ClusterManagement.Check_Item_Occurrence_Member_List_Or_All uri=${OPERATIONAL_TOPO_API} dictionary=${dictionary} member_index_list=${controller_index_list}
61 Add Sample Flow And Verify
62 [Arguments] ${controller_index} ${controller_index_list}=${EMPTY}
63 [Documentation] Add sample flow in ${controller_index} and verify it gets applied in all instances in ${controller_index_list}.
64 ${body}= OperatingSystem.Get File ${CURDIR}/../variables/openflowplugin/sample_flow_1.json
65 # There are slight differences on the way He and Li plugin display table information. He plugin has an additional Hashmap field
66 # replicating some of the matches in the flows section. Same comment applies for further keywords.
67 Run Keyword If '${ODL_OF_PLUGIN}' == 'helium' Set Test Variable &{dictionary} 10.0.1.0/24=2 "output-node-connector":"1"=1
68 Run Keyword If '${ODL_OF_PLUGIN}' == 'lithium' Set Test Variable &{dictionary} 10.0.1.0/24=1 "output-node-connector":"1"=1
69 ClusterManagement.Put_As_Json_And_Check_Member_List_Or_All ${config_table_0}/flow/1 ${body} ${controller_index} ${controller_index_list}
70 Wait Until Keyword Succeeds 15s 1s ClusterManagement.Check_Item_Occurrence_Member_List_Or_All uri=${operational_table_0} dictionary=${dictionary} member_index_list=${controller_index_list}
72 Modify Sample Flow And Verify
73 [Arguments] ${controller_index} ${controller_index_list}=${EMPTY}
74 [Documentation] Modify sample flow in ${controller_index} and verify it gets applied in all instances in ${controller_index_list}.
75 ${body}= OperatingSystem.Get File ${CURDIR}/../variables/openflowplugin/sample_flow_2.json
76 Run Keyword If '${ODL_OF_PLUGIN}' == 'helium' Set Test Variable &{dictionary} 10.0.1.0/24=2 "output-node-connector":"2"=1
77 Run Keyword If '${ODL_OF_PLUGIN}' == 'lithium' Set Test Variable &{dictionary} 10.0.1.0/24=1 "output-node-connector":"2"=1
78 ClusterManagement.Put_As_Json_And_Check_Member_List_Or_All ${config_table_0}/flow/1 ${body} ${controller_index} ${controller_index_list}
79 Wait Until Keyword Succeeds 15s 1s ClusterManagement.Check_Item_Occurrence_Member_List_Or_All uri=${operational_table_0} dictionary=${dictionary} member_index_list=${controller_index_list}
81 Delete Sample Flow And Verify
82 [Arguments] ${controller_index} ${controller_index_list}=${EMPTY}
83 [Documentation] Delete sample flow in Owner and verify it gets removed from all instances.
84 ${dictionary}= Create Dictionary 10.0.2.0/24=0
85 ClusterManagement.Delete_And_Check_Member_List_Or_All ${config_table_0}/flow/1 ${controller_index} ${controller_index_list}
86 Wait Until Keyword Succeeds 5s 1s ClusterManagement.Check_Item_Occurrence_Member_List_Or_All uri=${operational_table_0} dictionary=${dictionary} member_index_list=${controller_index_list}
88 Send RPC Add Sample Flow And Verify
89 [Arguments] ${controller_index} ${controller_index_list}=${EMPTY}
90 [Documentation] Add sample flow in ${controller_index} and verify it gets applied from all instances in ${controller_index_list}.
91 ${body}= OperatingSystem.Get File ${CURDIR}/../variables/openflowplugin/add_flow_rpc.json
92 Run Keyword If '${ODL_OF_PLUGIN}' == 'helium' Set Test Variable &{dictionary} 10.0.1.0/24=2
93 Run Keyword If '${ODL_OF_PLUGIN}' == 'lithium' Set Test Variable &{dictionary} 10.0.1.0/24=1
94 ClusterManagement.Post_As_Json_To_Member uri=/restconf/operations/sal-flow:add-flow data=${body} member_index=${controller_index}
95 Wait Until Keyword Succeeds 15s 1s ClusterManagement.Check_Item_Occurrence_Member_List_Or_All uri=${operational_table_0} dictionary=${dictionary} member_index_list=${controller_index_list}
97 Send RPC Delete Sample Flow And Verify
98 [Arguments] ${controller_index} ${controller_index_list}=${EMPTY}
99 [Documentation] Delete sample flow in ${controller_index} and verify it gets removed from all instances in ${controller_index_list}.
100 ${body}= OperatingSystem.Get File ${CURDIR}/../variables/openflowplugin/delete_flow_rpc.json
101 ${dictionary}= Create Dictionary 10.0.1.0/24=0
102 ClusterManagement.Post_As_Json_To_Member uri=/restconf/operations/sal-flow:remove-flow data=${body} member_index=${controller_index}
103 Wait Until Keyword Succeeds 5s 1s ClusterManagement.Check_Item_Occurrence_Member_List_Or_All uri=${operational_table_0} dictionary=${dictionary} member_index_list=${controller_index_list}
105 Take OpenFlow Device Link Down and Verify
106 [Arguments] ${controller_index_list}=${EMPTY}
107 [Documentation] Take a link down and verify port status in all instances in ${controller_index_list}.
108 ${dictionary}= Create Dictionary "link-down":true=1
109 ${ouput}= MininetKeywords.Send Mininet Command ${mininet_conn_id} link s1 s2 down
110 Wait Until Keyword Succeeds 5s 1s ClusterManagement.Check_Item_Occurrence_Member_List_Or_All uri=${operational_port_1} dictionary=${dictionary} member_index_list=${controller_index_list}
111 ${dictionary} Create Dictionary openflow:1=16 openflow:2=14 openflow:3=19
112 Wait Until Keyword Succeeds 20s 2s ClusterManagement.Check_Item_Occurrence_Member_List_Or_All uri=${OPERATIONAL_TOPO_API} dictionary=${dictionary} member_index_list=${controller_index_list}
114 Take OpenFlow Device Link Up and Verify
115 [Arguments] ${controller_index_list}=${EMPTY}
116 [Documentation] Take the link up and verify port status in all instances in ${controller_index_list}.
117 ${dictionary}= Create Dictionary "link-down":true=0
118 ${ouput}= MininetKeywords.Send Mininet Command ${mininet_conn_id} link s1 s2 up
119 Wait Until Keyword Succeeds 5s 1s ClusterManagement.Check_Item_Occurrence_Member_List_Or_All uri=${operational_port_1} dictionary=${dictionary} member_index_list=${controller_index_list}
120 ${dictionary} Create Dictionary openflow:1=21 openflow:2=19 openflow:3=19
121 Wait Until Keyword Succeeds 5s 1s ClusterManagement.Check_Item_Occurrence_Member_List_Or_All uri=${OPERATIONAL_TOPO_API} dictionary=${dictionary} member_index_list=${controller_index_list}