a3c44a15843d3a6ae873101020b8b08347f6d00f
[sliver-openvswitch.git] / tests / cfm.at
1 AT_BANNER([cfm])
2
3 m4_define([CFM_CHECK_EXTENDED], [
4 AT_CHECK([ovs-appctl cfm/show $1 | sed -e '/next CCM tx:/d' | sed -e '/next fault check:/d' | sed -e  '/recv since check:/d'],[0],
5 [dnl
6 ---- $1 ----
7 MPID $2: extended
8         average health: $3
9         opstate: $4
10         remote_opstate: $5
11         interval: $6
12 Remote MPID $7
13         opstate: $8
14 ])
15 ])
16
17 m4_define([CFM_VSCTL_LIST_IFACE], [
18 AT_CHECK([ovs-vsctl list interface $1 | sed -n '/$2/p'],[0],
19 [dnl
20 $3
21 ])
22 ])
23
24 m4_define([CFM_CHECK_DB], [
25 CFM_VSCTL_LIST_IFACE([$1], [cfm_fault_status], [cfm_fault_status    : [[$2]]])
26 CFM_VSCTL_LIST_IFACE([$1], [cfm_flap_count], [cfm_flap_count      : $3])
27 CFM_VSCTL_LIST_IFACE([$1], [cfm_health], [cfm_health          : [[$4]]])
28 CFM_VSCTL_LIST_IFACE([$1], [cfm_remote_mpids], [cfm_remote_mpids    : [[$5]]])
29 CFM_VSCTL_LIST_IFACE([$1], [cfm_remote_opstate], [cfm_remote_opstate  : $6])
30 ])
31
32 # This test checks the update of cfm status to OVSDB at startup.
33 # The cfm status should be updated to OVSDB within 3.5 * cfm_interval.
34 AT_SETUP([cfm - check update ovsdb])
35 #Create 2 bridges connected by patch ports and enable cfm
36 OVS_VSWITCHD_START([add-br br1 -- \
37                     set bridge br1 datapath-type=dummy \
38                     other-config:hwaddr=aa:55:aa:56:00:00 -- \
39                     add-port br1 p1 -- set Interface p1 type=patch \
40                     options:peer=p0 -- \
41                     add-port br0 p0 -- set Interface p0 type=patch \
42                     options:peer=p1 -- \
43                     set Interface p0 other_config:cfm_interval=300 other_config:cfm_extended=true -- \
44                     set Interface p1 other_config:cfm_interval=300 other_config:cfm_extended=true])
45
46 ovs-appctl time/stop
47
48 AT_CHECK([ovs-vsctl set Interface p0 cfm_mpid=1])
49 # check cfm status update in OVSDB.
50 for i in `seq 0 14`; do ovs-appctl time/warp 100; done
51 CFM_CHECK_DB([p0], [recv], [1], [], [], [up])
52
53 # turn cfm on p1 off, should increment the cfm_flap_count on p0.
54 AT_CHECK([ovs-vsctl set interface p1 cfm_mpid=2])
55 for i in `seq 0 14`; do ovs-appctl time/warp 100; done
56 CFM_CHECK_DB([p0], [], [2], [], [2], [up])
57 CFM_CHECK_DB([p1], [], [0], [], [1], [up])
58
59 OVS_VSWITCHD_STOP
60 AT_CLEANUP
61
62 # test cfm under demand mode.
63 AT_SETUP([cfm - demand mode])
64 #Create 2 bridges connected by patch ports and enable cfm
65 OVS_VSWITCHD_START([add-br br1 -- \
66                     set bridge br1 datapath-type=dummy \
67                     other-config:hwaddr=aa:55:aa:56:00:00 -- \
68                     add-port br1 p1 -- set Interface p1 type=patch \
69                     options:peer=p0 -- \
70                     add-port br0 p0 -- set Interface p0 type=patch \
71                     options:peer=p1 -- \
72                     set Interface p0 cfm_mpid=1 other_config:cfm_interval=300 other_config:cfm_extended=true -- \
73                     set Interface p1 cfm_mpid=2 other_config:cfm_interval=300 other_config:cfm_extended=true ])
74
75 ovs-appctl time/stop
76 # wait for a while to stablize cfm.
77 for i in `seq 0 100`; do ovs-appctl time/warp 100; done
78 CFM_CHECK_EXTENDED([p0], [1], [100], [up], [up], [300ms], [2], [up])
79 CFM_CHECK_EXTENDED([p1], [2], [100], [up], [up], [300ms], [1], [up])
80
81 # turn on demand mode on one end.
82 AT_CHECK([ovs-vsctl set interface p0 other_config:cfm_demand=true])
83
84 # cfm should never go down.
85 for i in `seq 0 100`
86 do
87     ovs-appctl time/warp 100
88     CFM_CHECK_EXTENDED([p0], [1], [100], [up], [up], [300ms], [2], [up])
89     CFM_CHECK_EXTENDED([p1], [2], [100], [up], [up], [300ms], [1], [up])
90 done
91
92 # turn on demand mode on the other end.
93 AT_CHECK([ovs-vsctl set interface p1 other_config:cfm_demand=true])
94 for i in `seq 0 100`
95 do
96     ovs-appctl time/warp 100
97     CFM_CHECK_EXTENDED([p0], [1], [100], [up], [up], [300ms], [2], [up])
98     CFM_CHECK_EXTENDED([p1], [2], [100], [up], [up], [300ms], [1], [up])
99 done
100
101 OVS_VSWITCHD_STOP
102 AT_CLEANUP
103
104 # test cfm_flap_count.
105 AT_SETUP([cfm - flap_count])
106 #Create 2 bridges connected by patch ports and enable cfm
107 OVS_VSWITCHD_START([add-br br1 -- \
108                     set bridge br1 datapath-type=dummy \
109                     other-config:hwaddr=aa:55:aa:56:00:00 -- \
110                     add-port br1 p1 -- set Interface p1 type=patch \
111                     options:peer=p0 -- \
112                     add-port br0 p0 -- set Interface p0 type=patch \
113                     options:peer=p1 -- \
114                     set Interface p0 cfm_mpid=1 other_config:cfm_interval=100 other_config:cfm_extended=true -- \
115                     set Interface p1 cfm_mpid=2 other_config:cfm_interval=100 other_config:cfm_extended=true])
116
117 ovs-appctl time/stop
118
119 # wait for a while to stablize cfm.
120 for i in `seq 0 100`; do ovs-appctl time/warp 100; done
121 CFM_CHECK_EXTENDED([p0], [1], [100], [up], [up], [100ms], [2], [up])
122 CFM_CHECK_EXTENDED([p1], [2], [100], [up], [up], [100ms], [1], [up])
123
124 # turn cfm on p1 off, should increment the cfm_flap_count on p0.
125 AT_CHECK([ovs-vsctl remove interface p1 cfm_mpid 2])
126 for i in `seq 0 10`; do ovs-appctl time/warp 100; done
127 CFM_VSCTL_LIST_IFACE([p0], [cfm_flap_count], [cfm_flap_count      : 1])
128 CFM_VSCTL_LIST_IFACE([p1], [cfm_flap_count], [cfm_flap_count      : [[]]])
129
130 # turn cfm on p1 on again, should increment the cfm_flap_count on p0.
131 AT_CHECK([ovs-vsctl set interface p1 cfm_mpid=2])
132 for i in `seq 0 10`; do ovs-appctl time/warp 100; done
133 CFM_VSCTL_LIST_IFACE([p0], [cfm_flap_count], [cfm_flap_count      : 2])
134
135 OVS_VSWITCHD_STOP
136 AT_CLEANUP
137
138 AT_SETUP([cfm - fault_override])
139 OVS_VSWITCHD_START([add-br br1 -- \
140                     set bridge br1 datapath-type=dummy \
141                     other-config:hwaddr=aa:55:aa:56:00:00 -- \
142                     add-port br1 p1 -- set Interface p1 type=patch \
143                     options:peer=p0 -- \
144                     add-port br0 p0 -- set Interface p0 type=patch \
145                     options:peer=p1 -- \
146                     set Interface p0 cfm_mpid=1 other_config:cfm_interval=100 other_config:cfm_extended=true -- \
147                     set Interface p1 cfm_mpid=2 other_config:cfm_interval=100 other_config:cfm_extended=true])
148
149 ovs-appctl time/stop
150 # wait for a while to stablize cfm.
151 for i in `seq 0 100`; do ovs-appctl time/warp 100; done
152 CFM_CHECK_EXTENDED([p0], [1], [100], [up], [up], [100ms], [2], [up])
153 CFM_CHECK_EXTENDED([p1], [2], [100], [up], [up], [100ms], [1], [up])
154 AT_CHECK([ovs-appctl cfm/show p1 | grep 'fault_override'], [1], [ignore])
155 CFM_VSCTL_LIST_IFACE([p1], [cfm_fault_status], [cfm_fault_status    : [[]]])
156
157 # set a fault and see that this is shown in the CFM module and the database
158 AT_CHECK([ovs-appctl cfm/set-fault p1 true], [0], [OK
159 ])
160 AT_CHECK([ovs-appctl time/warp 100], [0], [ignore])
161 AT_CHECK([ovs-appctl cfm/show p1 | grep 'fault_override' | sed -e 's/MPID [[0-9]]*: extended //'], [0], [dnl
162 fault_override
163 ])
164 CFM_VSCTL_LIST_IFACE([p1], [cfm_fault_status], [cfm_fault_status    : [[override]]])
165
166 # reset and see that it returned to normal
167 AT_CHECK([ovs-appctl cfm/set-fault normal], [0], [OK
168 ])
169 AT_CHECK([ovs-appctl time/warp 100], [0], [ignore])
170 AT_CHECK([ovs-appctl cfm/show p1 | grep 'fault_override'], [1], [ignore])
171 CFM_VSCTL_LIST_IFACE([p1], [cfm_fault_status], [cfm_fault_status    : [[]]])
172
173 OVS_VSWITCHD_STOP
174 AT_CLEANUP