go.ligato.io/vpp-agent/v3@v3.5.0/tests/robot/suites/crudIPv6/srv6_crudIPv6.robot (about) 1 *** Settings *** 2 Library OperatingSystem 3 #Library RequestsLibrary 4 #Library SSHLibrary timeout=60s 5 #Library String 6 7 Resource ../../variables/${VARIABLES}_variables.robot 8 9 Resource ../../libraries/all_libs.robot 10 Resource ../../libraries/pretty_keywords.robot 11 12 Force Tags crud IPv6 13 Suite Setup Testsuite Setup 14 Suite Teardown Testsuite Teardown 15 Test Setup TestSetup 16 Test Teardown TestTeardown 17 18 *** Variables *** 19 ${VARIABLES}= common 20 ${ENV}= common 21 ${WAIT_TIMEOUT}= 20s 22 ${SYNC_SLEEP}= 3s 23 # wait for resync vpps after restart 24 ${RESYNC_WAIT}= 30s 25 @{segmentList1} b:: c:: d:: 26 @{segmentList2} c:: d:: e:: 27 @{segmentList3} d:: e:: a:: 28 @{segmentList4} e:: a:: b:: 29 @{segmentList1weight1} 1 @{segmentList1} # segment list's weight and segments 30 @{segmentList2weight2} 2 @{segmentList2} # segment list's weight and segments 31 @{segmentList3weight3} 3 @{segmentList3} # segment list's weight and segments 32 @{segmentList3weight4} 4 @{segmentList3} # segment list's weight and segments 33 @{segmentList4weight4} 4 @{segmentList4} # segment list's weight and segments 34 @{segmentLists1weight1} ${segmentList1weight1} 35 @{segmentLists3weight3} ${segmentList3weight3} 36 @{segmentLists3weight4} ${segmentList3weight4} 37 @{segmentLists4weight4} ${segmentList4weight4} 38 @{segmentLists12weight12} ${segmentList1weight1} ${segmentList2weight2} 39 @{segmentLists23weight23} ${segmentList2weight2} ${segmentList3weight3} 40 41 *** Test Cases *** 42 Configure Environment 43 [Tags] setup 44 Add Agent VPP Node agent_vpp_1 45 Put Veth Interface With IP node=agent_vpp_1 name=vpp1_veth1 mac=12:11:11:11:11:11 peer=vpp1_veth2 ip=10.10.1.1 46 Put Veth Interface node=agent_vpp_1 name=vpp1_veth2 mac=12:12:12:12:12:12 peer=vpp1_veth1 47 Put Afpacket Interface node=agent_vpp_1 name=vpp1_afpacket1 mac=a2:a1:a1:a1:a1:a1 host_int=vpp1_veth2 48 Put Veth Interface With IP node=agent_vpp_1 name=vpp1_veth3 mac=12:13:13:13:13:13 peer=vpp1_veth4 ip=10.10.1.2 49 Put Veth Interface node=agent_vpp_1 name=vpp1_veth4 mac=12:14:14:14:14:14 peer=vpp1_veth3 50 Put Afpacket Interface node=agent_vpp_1 name=vpp1_afpacket2 mac=a2:a2:a2:a2:a2:a2 host_int=vpp1_veth4 51 52 #TODO Add CRUD test for LocalSIDs with END.DX function (VPP CLI dump writes that DX2 is unsupported, but note in NB model tells that only case with vlan != 0 should not be supported) 53 54 Check CRUD For Local SID With END Function (Base End) 55 Put Local SID With Base End function node=agent_vpp_1 sidAddress=a:: installationVrfId=0 56 Wait Until Keyword Succeeds ${WAIT_TIMEOUT} ${SYNC_SLEEP} vpp_term: Check Local SID Presence node=agent_vpp_1 sidAddress=a:: endFunctionType=BASE 57 # can't really modify something visible in CLI output -> can't test update 58 Delete Local SID node=agent_vpp_1 sidAddress=a:: 59 Wait Until Keyword Succeeds ${WAIT_TIMEOUT} ${SYNC_SLEEP} vpp_term: Check Local SID Deleted node=agent_vpp_1 sidAddress=a:: 60 61 Check CRUD For Local SID With END.X Function 62 Put Local SID With End.X function node=agent_vpp_1 sidAddress=a:: installationVrfId=0 outinterface=vpp1_afpacket1 nexthop=a::1 psp=false 63 Wait Until Keyword Succeeds ${WAIT_TIMEOUT} ${SYNC_SLEEP} vpp_term: Check Local SID Presence node=agent_vpp_1 sidAddress=a:: endFunctionType=X interface=host-vpp1_veth2 nexthop=a::1 64 Put Local SID With End.X function node=agent_vpp_1 sidAddress=a:: installationVrfId=0 outinterface=vpp1_afpacket1 nexthop=c::1 psp=false #modification 65 Wait Until Keyword Succeeds ${WAIT_TIMEOUT} ${SYNC_SLEEP} vpp_term: Check Local SID Presence node=agent_vpp_1 sidAddress=a:: endFunctionType=X interface=host-vpp1_veth2 nexthop=c::1 66 Delete Local SID node=agent_vpp_1 sidAddress=a:: 67 Wait Until Keyword Succeeds ${WAIT_TIMEOUT} ${SYNC_SLEEP} vpp_term: Check Local SID Deleted node=agent_vpp_1 sidAddress=a:: 68 69 Check CRUD For Local SID With END.T Function 70 Create VRF Table node=agent_vpp_1 id=21 protocol=ipv6 71 Create VRF Table node=agent_vpp_1 id=22 protocol=ipv6 72 Put Local SID With End.T function node=agent_vpp_1 sidAddress=a:: installationVrfId=0 vrfid=21 psp=false 73 Wait Until Keyword Succeeds ${WAIT_TIMEOUT} ${SYNC_SLEEP} vpp_term: Check Local SID Presence node=agent_vpp_1 sidAddress=a:: endFunctionType=T fibtable=1 74 Put Local SID With End.T function node=agent_vpp_1 sidAddress=a:: installationVrfId=0 vrfid=22 psp=false #modification (fibtable is index for structure from memory pool (1-to-1 mapping between vrf and fib table id) -> track changes of vrf with fibtable id) 75 Wait Until Keyword Succeeds ${WAIT_TIMEOUT} ${SYNC_SLEEP} vpp_term: Check Local SID Presence node=agent_vpp_1 sidAddress=a:: endFunctionType=T fibtable=2 76 Delete Local SID node=agent_vpp_1 sidAddress=a:: 77 Wait Until Keyword Succeeds ${WAIT_TIMEOUT} ${SYNC_SLEEP} vpp_term: Check Local SID Deleted node=agent_vpp_1 sidAddress=a:: 78 79 Check CRUD For Local SID With END.DT4 Function 80 Create VRF Table node=agent_vpp_1 id=11 protocol=ipv4 81 Create VRF Table node=agent_vpp_1 id=12 protocol=ipv4 82 Put Local SID With End.DT4 function node=agent_vpp_1 sidAddress=a:: installationVrfId=0 vrfid=11 83 Wait Until Keyword Succeeds ${WAIT_TIMEOUT} ${SYNC_SLEEP} vpp_term: Check Local SID Presence node=agent_vpp_1 sidAddress=a:: endFunctionType=DT4 fibtable=1 84 Put Local SID With End.DT4 function node=agent_vpp_1 sidAddress=a:: installationVrfId=0 vrfid=12 #modification (fibtable is index for structure from memory pool (1-to-1 mapping between vrf and fib table id) -> track changes of vrf with fibtable id) 85 Wait Until Keyword Succeeds ${WAIT_TIMEOUT} ${SYNC_SLEEP} vpp_term: Check Local SID Presence node=agent_vpp_1 sidAddress=a:: endFunctionType=DT4 fibtable=2 86 Delete Local SID node=agent_vpp_1 sidAddress=a:: 87 Wait Until Keyword Succeeds ${WAIT_TIMEOUT} ${SYNC_SLEEP} vpp_term: Check Local SID Deleted node=agent_vpp_1 sidAddress=a:: 88 89 Check CRUD For Local SID With END.DT6 Function 90 Create VRF Table node=agent_vpp_1 id=23 protocol=ipv6 91 Create VRF Table node=agent_vpp_1 id=24 protocol=ipv6 92 Put Local SID With End.DT6 function node=agent_vpp_1 sidAddress=a:: installationVrfId=0 vrfid=23 93 Wait Until Keyword Succeeds ${WAIT_TIMEOUT} ${SYNC_SLEEP} vpp_term: Check Local SID Presence node=agent_vpp_1 sidAddress=a:: endFunctionType=DT6 fibtable=3 94 Put Local SID With End.DT6 function node=agent_vpp_1 sidAddress=a:: installationVrfId=0 vrfid=24 #modification (fibtable is index for structure from memory pool (1-to-1 mapping between vrf and fib table id) -> track changes of vrf with fibtable id) 95 Wait Until Keyword Succeeds ${WAIT_TIMEOUT} ${SYNC_SLEEP} vpp_term: Check Local SID Presence node=agent_vpp_1 sidAddress=a:: endFunctionType=DT6 fibtable=4 96 Delete Local SID node=agent_vpp_1 sidAddress=a:: 97 Wait Until Keyword Succeeds ${WAIT_TIMEOUT} ${SYNC_SLEEP} vpp_term: Check Local SID Deleted node=agent_vpp_1 sidAddress=a:: 98 99 Check CRUD For Local SID With END.DX4 Function 100 Put Local SID With End.DX4 function node=agent_vpp_1 sidAddress=a:: installationVrfId=0 outinterface=vpp1_afpacket1 nexthop=1.1.1.1 101 Wait Until Keyword Succeeds ${WAIT_TIMEOUT} ${SYNC_SLEEP} vpp_term: Check Local SID Presence node=agent_vpp_1 sidAddress=a:: endFunctionType=DX4 interface=host-vpp1_veth2 nexthop=1.1.1.1 102 Put Local SID With End.DX4 function node=agent_vpp_1 sidAddress=a:: installationVrfId=0 outinterface=vpp1_afpacket1 nexthop=1.1.1.2 #modification 103 Wait Until Keyword Succeeds ${WAIT_TIMEOUT} ${SYNC_SLEEP} vpp_term: Check Local SID Presence node=agent_vpp_1 sidAddress=a:: endFunctionType=DX4 interface=host-vpp1_veth2 nexthop=1.1.1.2 104 Delete Local SID node=agent_vpp_1 sidAddress=a:: 105 Wait Until Keyword Succeeds ${WAIT_TIMEOUT} ${SYNC_SLEEP} vpp_term: Check Local SID Deleted node=agent_vpp_1 sidAddress=a:: 106 107 Check CRUD For Local SID With END.DX6 Function 108 Put Local SID With End.DX6 function node=agent_vpp_1 sidAddress=a:: installationVrfId=0 outinterface=vpp1_afpacket1 nexthop=a::1 109 Wait Until Keyword Succeeds ${WAIT_TIMEOUT} ${SYNC_SLEEP} vpp_term: Check Local SID Presence node=agent_vpp_1 sidAddress=a:: endFunctionType=DX6 interface=host-vpp1_veth2 nexthop=a::1 110 Put Local SID With End.DX6 function node=agent_vpp_1 sidAddress=a:: installationVrfId=0 outinterface=vpp1_afpacket1 nexthop=c::1 #modification 111 Wait Until Keyword Succeeds ${WAIT_TIMEOUT} ${SYNC_SLEEP} vpp_term: Check Local SID Presence node=agent_vpp_1 sidAddress=a:: endFunctionType=DX6 interface=host-vpp1_veth2 nexthop=c::1 112 Delete Local SID node=agent_vpp_1 sidAddress=a:: 113 Wait Until Keyword Succeeds ${WAIT_TIMEOUT} ${SYNC_SLEEP} vpp_term: Check Local SID Deleted node=agent_vpp_1 sidAddress=a:: 114 115 Check CRUD For Local SID With END.AD Function (SR-Proxy) 116 # SR-proxy is actual a Local SID with End.AD end function, but VPP is configured in this case differently in compare to other local SIDs (VPP CLI(using VPE binary API) vs binary VPP API) -> need to test this 117 Put Local SID With End.AD function node=agent_vpp_1 sidAddress=a:: l3serviceaddress=10.10.1.2 outinterface=vpp1_afpacket1 ininterface=vpp1_afpacket2 118 Wait Until Keyword Succeeds ${WAIT_TIMEOUT} ${SYNC_SLEEP} vpp_term: Check Local SID Presence node=agent_vpp_1 sidAddress=a:: endFunctionType=AD serviceaddress=10.10.1.2 outinterface=host-vpp1_veth2 ininterface=host-vpp1_veth4 119 Put Local SID With End.AD function node=agent_vpp_1 sidAddress=a:: l3serviceaddress=10.10.1.2 outinterface=vpp1_afpacket2 ininterface=vpp1_afpacket1 #modification 120 Wait Until Keyword Succeeds ${WAIT_TIMEOUT} ${SYNC_SLEEP} vpp_term: Check Local SID Presence node=agent_vpp_1 sidAddress=a:: endFunctionType=AD serviceaddress=10.10.1.2 outinterface=host-vpp1_veth4 ininterface=host-vpp1_veth2 121 Delete Local SID node=agent_vpp_1 sidAddress=a:: 122 Wait Until Keyword Succeeds ${WAIT_TIMEOUT} ${SYNC_SLEEP} vpp_term: Check Local SID Deleted node=agent_vpp_1 sidAddress=a:: 123 124 Check Policy CRUD 125 Put SRv6 Policy node=agent_vpp_1 bsid=a::e segmentlists=${segmentLists1weight1} installationVrfId=0 srhEncapsulation=true sprayBehaviour=true 126 Wait Until Keyword Succeeds ${WAIT_TIMEOUT} ${SYNC_SLEEP} vpp_term: Check SRv6 Policy Presence node=agent_vpp_1 bsid=a::e segmentlists=${segmentLists1weight1} fibtable=0 behaviour=Encapsulation type=Spray index=0 127 Put SRv6 Policy node=agent_vpp_1 bsid=a::e segmentlists=${segmentLists1weight1} installationVrfId=0 srhEncapsulation=false sprayBehaviour=true # modification of non-segment list part 128 Wait Until Keyword Succeeds ${WAIT_TIMEOUT} ${SYNC_SLEEP} vpp_term: Check SRv6 Policy Presence node=agent_vpp_1 bsid=a::e segmentlists=${segmentLists1weight1} fibtable=0 behaviour=SRH insertion type=Spray index=0 129 Put SRv6 Policy node=agent_vpp_1 bsid=a::e segmentlists=${segmentLists12weight12} installationVrfId=0 srhEncapsulation=false sprayBehaviour=true # modification - adding one new segment list (+preserving one existing segment key) 130 Wait Until Keyword Succeeds ${WAIT_TIMEOUT} ${SYNC_SLEEP} vpp_term: Check SRv6 Policy Presence node=agent_vpp_1 bsid=a::e segmentlists=${segmentLists12weight12} fibtable=0 behaviour=SRH insertion type=Spray index=0 131 Put SRv6 Policy node=agent_vpp_1 bsid=a::e segmentlists=${segmentLists23weight23} installationVrfId=0 srhEncapsulation=false sprayBehaviour=true # modification - mixing addition of mew segment list with removal of existing segment list (+preserving one existing segment key) 132 Wait Until Keyword Succeeds ${WAIT_TIMEOUT} ${SYNC_SLEEP} vpp_term: Check SRv6 Policy Presence node=agent_vpp_1 bsid=a::e segmentlists=${segmentLists23weight23} fibtable=0 behaviour=SRH insertion type=Spray index=0 133 Put SRv6 Policy node=agent_vpp_1 bsid=a::e segmentlists=${segmentLists3weight3} installationVrfId=0 srhEncapsulation=false sprayBehaviour=true # modification - removing of existing segment list (+preserving one existing segment key) 134 Wait Until Keyword Succeeds ${WAIT_TIMEOUT} ${SYNC_SLEEP} vpp_term: Check SRv6 Policy Presence node=agent_vpp_1 bsid=a::e segmentlists=${segmentLists3weight3} fibtable=0 behaviour=SRH insertion type=Spray index=0 135 Put SRv6 Policy node=agent_vpp_1 bsid=a::e segmentlists=${segmentLists3weight4} installationVrfId=0 srhEncapsulation=false sprayBehaviour=true # modification - modify weight of existing segment list 136 Wait Until Keyword Succeeds ${WAIT_TIMEOUT} ${SYNC_SLEEP} vpp_term: Check SRv6 Policy Presence node=agent_vpp_1 bsid=a::e segmentlists=${segmentLists3weight4} fibtable=0 behaviour=SRH insertion type=Spray index=0 137 Put SRv6 Policy node=agent_vpp_1 bsid=a::e segmentlists=${segmentLists4weight4} installationVrfId=0 srhEncapsulation=false sprayBehaviour=true # modification - modify segments of existing segment list 138 Wait Until Keyword Succeeds ${WAIT_TIMEOUT} ${SYNC_SLEEP} vpp_term: Check SRv6 Policy Presence node=agent_vpp_1 bsid=a::e segmentlists=${segmentLists4weight4} fibtable=0 behaviour=SRH insertion type=Spray index=0 139 Delete SRv6 Policy node=agent_vpp_1 bsid=a::e 140 Wait Until Keyword Succeeds ${WAIT_TIMEOUT} ${SYNC_SLEEP} vpp_term: Check SRv6 Policy Nonexistence node=agent_vpp_1 bsid=a::e 141 142 Check Steering CRUD 143 Put SRv6 Policy node=agent_vpp_1 bsid=a::e installationVrfId=0 srhEncapsulation=true sprayBehaviour=true segmentlists=${segmentLists1weight1} 144 Put SRv6 L3 Steering node=agent_vpp_1 name=toE bsid=a::e installationVrfId=0 prefixAddress=e::/64 145 Wait Until Keyword Succeeds ${WAIT_TIMEOUT} ${SYNC_SLEEP} vpp_term: Check SRv6 Steering Presence node=agent_vpp_1 bsid=a::e prefixAddress=e::/64 146 Put SRv6 L3 Steering node=agent_vpp_1 name=toE bsid=a::e installationVrfId=0 prefixAddress=d::/64 # modification 147 Wait Until Keyword Succeeds ${WAIT_TIMEOUT} ${SYNC_SLEEP} vpp_term: Check SRv6 Steering Presence node=agent_vpp_1 bsid=a::e prefixAddress=d::/64 148 Delete SRv6 Steering node=agent_vpp_1 name=toE 149 Wait Until Keyword Succeeds ${WAIT_TIMEOUT} ${SYNC_SLEEP} vpp_term: Check SRv6 Steering NonExistence node=agent_vpp_1 bsid=a::e prefixAddress=d::/64 150 Delete SRv6 Policy node=agent_vpp_1 bsid=a::e #cleanup 151 152 #TODO Steering can reference policy also by index -> add test (currently NOT WORKING on VPP side!) 153 154 Check Steering Creation By Using Reversed-Ordered Steering And Policy Setting (Delayed Configuration) 155 Put SRv6 L3 Steering node=agent_vpp_1 name=toE bsid=a::e installationVrfId=0 prefixAddress=e::/64 156 Put SRv6 Policy node=agent_vpp_1 bsid=a::e installationVrfId=0 srhEncapsulation=true sprayBehaviour=true segmentlists=${segmentLists1weight1} 157 Wait Until Keyword Succeeds ${WAIT_TIMEOUT} ${SYNC_SLEEP} vpp_term: Check SRv6 Steering Presence node=agent_vpp_1 bsid=a::e prefixAddress=e::/64 158 Delete SRv6 Steering node=agent_vpp_1 name=toE #cleanup 159 Delete SRv6 Policy node=agent_vpp_1 bsid=a::e #cleanup 160 161 Check Steering Delete By Removal of Policy 162 Put SRv6 Policy node=agent_vpp_1 bsid=a::e installationVrfId=0 srhEncapsulation=true sprayBehaviour=true segmentlists=${segmentLists1weight1} 163 Put SRv6 L3 Steering node=agent_vpp_1 name=toE bsid=a::e installationVrfId=0 prefixAddress=e::/64 164 Wait Until Keyword Succeeds ${WAIT_TIMEOUT} ${SYNC_SLEEP} vpp_term: Check SRv6 Steering Presence node=agent_vpp_1 bsid=a::e prefixAddress=e::/64 165 Wait Until Keyword Succeeds ${WAIT_TIMEOUT} ${SYNC_SLEEP} vpp_term: Check SRv6 Policy Presence node=agent_vpp_1 bsid=a::e fibtable=0 behaviour=Encapsulation type=Spray index=0 segmentlists=${segmentLists1weight1} 166 Delete SRv6 Policy node=agent_vpp_1 bsid=a::e 167 Wait Until Keyword Succeeds ${WAIT_TIMEOUT} ${SYNC_SLEEP} vpp_term: Check SRv6 Policy Nonexistence node=agent_vpp_1 bsid=a::e 168 Wait Until Keyword Succeeds ${WAIT_TIMEOUT} ${SYNC_SLEEP} vpp_term: Check SRv6 Steering NonExistence node=agent_vpp_1 bsid=a::e prefixAddress=e::/64 169 Delete SRv6 Steering node=agent_vpp_1 name=toE #cleanup 170 171 Check Update Of Policy Should Not Trigger Cascade Delete Of Steering 172 Put SRv6 L3 Steering node=agent_vpp_1 name=toE bsid=a::e installationVrfId=0 prefixAddress=e::/64 173 Put SRv6 Policy node=agent_vpp_1 bsid=a::e installationVrfId=0 srhEncapsulation=true sprayBehaviour=true segmentlists=${segmentLists1weight1} 174 Wait Until Keyword Succeeds ${WAIT_TIMEOUT} ${SYNC_SLEEP} vpp_term: Check SRv6 Steering Presence node=agent_vpp_1 bsid=a::e prefixAddress=e::/64 175 Wait Until Keyword Succeeds ${WAIT_TIMEOUT} ${SYNC_SLEEP} vpp_term: Check SRv6 Policy Presence node=agent_vpp_1 bsid=a::e fibtable=0 behaviour=Encapsulation type=Spray index=0 segmentlists=${segmentLists1weight1} 176 Put SRv6 Policy node=agent_vpp_1 bsid=a::e installationVrfId=0 srhEncapsulation=false sprayBehaviour=true segmentlists=${segmentLists1weight1} #modification of non-segment attribute 177 Sleep 5s # waiting constant time is bad practice, but how to otherwise check that nothing has changed? 178 Wait Until Keyword Succeeds ${WAIT_TIMEOUT} ${SYNC_SLEEP} vpp_term: Check SRv6 Steering Presence node=agent_vpp_1 bsid=a::e prefixAddress=e::/64 179 Wait Until Keyword Succeeds ${WAIT_TIMEOUT} ${SYNC_SLEEP} vpp_term: Check SRv6 Policy Presence node=agent_vpp_1 bsid=a::e fibtable=0 behaviour=SRH insertion type=Spray index=0 segmentlists=${segmentLists1weight1} 180 Delete SRv6 Steering node=agent_vpp_1 name=toE #cleanup 181 Delete SRv6 Policy node=agent_vpp_1 bsid=a::e #cleanup 182 183 Check Resynchronization for clean VPP start 184 Put Local SID With End.DX6 function node=agent_vpp_1 sidAddress=a:: installationVrfId=0 outinterface=vpp1_afpacket1 nexthop=a::1 185 Put SRv6 Policy node=agent_vpp_1 bsid=a::e installationVrfId=0 srhEncapsulation=true sprayBehaviour=true segmentlists=${segmentLists1weight1} 186 Put SRv6 L3 Steering node=agent_vpp_1 name=toE bsid=a::e installationVrfId=0 prefixAddress=e::/64 187 Remove All VPP Nodes 188 Sleep 3s 189 Add Agent VPP Node agent_vpp_1 190 Wait Until Keyword Succeeds ${WAIT_TIMEOUT} ${SYNC_SLEEP} vpp_term: Check Local SID Presence node=agent_vpp_1 endFunctionType=DX6 sidAddress=a:: interface=host-vpp1_veth2 nexthop=a::1 191 Wait Until Keyword Succeeds ${WAIT_TIMEOUT} ${SYNC_SLEEP} vpp_term: Check SRv6 Policy Presence node=agent_vpp_1 bsid=a::e fibtable=0 behaviour=Encapsulation type=Spray index=0 segmentlists=${segmentLists1weight1} 192 Wait Until Keyword Succeeds ${WAIT_TIMEOUT} ${SYNC_SLEEP} vpp_term: Check SRv6 Steering Presence node=agent_vpp_1 bsid=a::e prefixAddress=e::/64 193 Delete SRv6 Steering node=agent_vpp_1 name=toE #cleanup 194 Delete SRv6 Policy node=agent_vpp_1 bsid=a::e #cleanup 195 Delete Local SID node=agent_vpp_1 sidAddress=a:: 196 197 *** Keywords *** 198 TestSetup 199 Make Datastore Snapshots ${TEST_NAME}_test_setup 200 201 TestTeardown 202 Make Datastore Snapshots ${TEST_NAME}_test_teardown