mirror of
https://github.com/openvswitch/ovs
synced 2025-10-17 14:28:02 +00:00
Only the time connected (if connected) or disconnected (if disconnected) is currently reported for each manager. Change to reporting both in seconds since the last connect and disconnect events respectively. An empty value indicates no previous connection or disconnection. This can help diagnose certain connectivity problems, e.g. flapping. Requested-by: Peter Balland <peter@nicira.com> Bug #4833.
208 lines
5.6 KiB
Python
208 lines
5.6 KiB
Python
# Copyright (c) 2009, 2010 Nicira Networks.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at:
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
|
|
import errno
|
|
import logging
|
|
import sys
|
|
|
|
import ovs.reconnect
|
|
|
|
def do_enable(arg):
|
|
r.enable(now)
|
|
|
|
def do_disable(arg):
|
|
r.disable(now)
|
|
|
|
def do_force_reconnect(arg):
|
|
r.force_reconnect(now)
|
|
|
|
def error_from_string(s):
|
|
if not s:
|
|
return 0
|
|
elif s == "ECONNREFUSED":
|
|
return errno.ECONNREFUSED
|
|
elif s == "EOF":
|
|
return EOF
|
|
else:
|
|
sys.stderr.write("unknown error '%s'\n" % s)
|
|
sys.exit(1)
|
|
|
|
def do_disconnected(arg):
|
|
r.disconnected(now, error_from_string(arg))
|
|
|
|
def do_connecting(arg):
|
|
r.connecting(now)
|
|
|
|
def do_connect_failed(arg):
|
|
r.connect_failed(now, error_from_string(arg))
|
|
|
|
def do_connected(arg):
|
|
r.connected(now)
|
|
|
|
def do_received(arg):
|
|
r.received(now)
|
|
|
|
def do_run(arg):
|
|
global now
|
|
if arg is not None:
|
|
now += int(arg)
|
|
|
|
action = r.run(now)
|
|
if action is None:
|
|
pass
|
|
elif action == ovs.reconnect.CONNECT:
|
|
print " should connect"
|
|
elif action == ovs.reconnect.DISCONNECT:
|
|
print " should disconnect"
|
|
elif action == ovs.reconnect.PROBE:
|
|
print " should send probe"
|
|
else:
|
|
assert False
|
|
|
|
def do_advance(arg):
|
|
global now
|
|
now += int(arg)
|
|
|
|
def do_timeout(arg):
|
|
global now
|
|
timeout = r.timeout(now)
|
|
if timeout >= 0:
|
|
print " advance %d ms" % timeout
|
|
now += timeout
|
|
else:
|
|
print " no timeout"
|
|
|
|
def do_set_max_tries(arg):
|
|
r.set_max_tries(int(arg))
|
|
|
|
def diff_stats(old, new, delta):
|
|
if (old.state != new.state or
|
|
old.state_elapsed != new.state_elapsed or
|
|
old.backoff != new.backoff):
|
|
print(" in %s for %d ms (%d ms backoff)"
|
|
% (new.state, new.state_elapsed, new.backoff))
|
|
|
|
if (old.creation_time != new.creation_time or
|
|
old.last_received != new.last_received or
|
|
old.last_connected != new.last_connected):
|
|
print(" created %d, last received %d, last connected %d"
|
|
% (new.creation_time, new.last_received, new.last_connected))
|
|
|
|
if (old.n_successful_connections != new.n_successful_connections or
|
|
old.n_attempted_connections != new.n_attempted_connections or
|
|
old.seqno != new.seqno):
|
|
print(" %d successful connections out of %d attempts, seqno %d"
|
|
% (new.n_successful_connections, new.n_attempted_connections,
|
|
new.seqno))
|
|
|
|
if (old.is_connected != new.is_connected):
|
|
if new.is_connected:
|
|
negate = ""
|
|
else:
|
|
negate = "dis"
|
|
print(" %sconnected" % negate)
|
|
|
|
if (old.last_connected != new.last_connected or
|
|
(new.msec_since_connect != None and
|
|
old.msec_since_connect != new.msec_since_connect - delta) or
|
|
(old.total_connected_duration != new.total_connected_duration - delta and
|
|
not (old.total_connected_duration == 0 and
|
|
new.total_connected_duration == 0))):
|
|
print(" last connected %d ms ago, connected %d ms total"
|
|
% (new.msec_since_connect, new.total_connected_duration))
|
|
|
|
if (old.last_disconnected != new.last_disconnected or
|
|
(new.msec_since_disconnect != None and
|
|
old.msec_since_disconnect != new.msec_since_disconnect - delta)):
|
|
print(" disconnected at %d ms (%d ms ago)"
|
|
% (new.last_disconnected, new.msec_since_disconnect))
|
|
|
|
def do_set_passive(arg):
|
|
r.set_passive(True, now)
|
|
|
|
def do_listening(arg):
|
|
r.listening(now)
|
|
|
|
def do_listen_error(arg):
|
|
r.listen_error(now, int(arg))
|
|
|
|
def main():
|
|
commands = {
|
|
"enable": do_enable,
|
|
"disable": do_disable,
|
|
"force-reconnect": do_force_reconnect,
|
|
"disconnected": do_disconnected,
|
|
"connecting": do_connecting,
|
|
"connect-failed": do_connect_failed,
|
|
"connected": do_connected,
|
|
"received": do_received,
|
|
"run": do_run,
|
|
"advance": do_advance,
|
|
"timeout": do_timeout,
|
|
"set-max-tries": do_set_max_tries,
|
|
"passive": do_set_passive,
|
|
"listening": do_listening,
|
|
"listen-error": do_listen_error
|
|
}
|
|
|
|
logging.basicConfig(level=logging.CRITICAL)
|
|
|
|
global now
|
|
global r
|
|
|
|
now = 1000
|
|
r = ovs.reconnect.Reconnect(now)
|
|
r.set_name("remote")
|
|
prev = r.get_stats(now)
|
|
print "### t=%d ###" % now
|
|
old_time = now
|
|
old_max_tries = r.get_max_tries()
|
|
while True:
|
|
line = sys.stdin.readline()
|
|
if line == "":
|
|
break
|
|
|
|
print line[:-1]
|
|
if line[0] == "#":
|
|
continue
|
|
|
|
args = line.split()
|
|
if len(args) == 0:
|
|
continue
|
|
|
|
command = args[0]
|
|
if len(args) > 1:
|
|
op = args[1]
|
|
else:
|
|
op = None
|
|
commands[command](op)
|
|
|
|
if old_time != now:
|
|
print
|
|
print "### t=%d ###" % now
|
|
|
|
cur = r.get_stats(now)
|
|
diff_stats(prev, cur, now - old_time)
|
|
prev = cur
|
|
if r.get_max_tries() != old_max_tries:
|
|
old_max_tries = r.get_max_tries()
|
|
print " %d tries left" % old_max_tries
|
|
|
|
old_time = now
|
|
|
|
if __name__ == '__main__':
|
|
main()
|
|
|
|
|