OFAgent now has suicidal tendencies.
If OFAgent cannot find voltha-grpc it kills itself only to be restarted
by docker, this will continue until it is happy. Similarly, if voltha
goes away ofagent will kill itself until voltha comes back
Change-Id: Ib2a2cbf5ed438f8bd40f80a4543bd80f065461f1
diff --git a/ofagent/connection_mgr.py b/ofagent/connection_mgr.py
index 71318af..6182b90 100644
--- a/ofagent/connection_mgr.py
+++ b/ofagent/connection_mgr.py
@@ -13,6 +13,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
#
+import os
import sys
@@ -99,7 +100,9 @@
except Exception as e:
log.error('Failure to locate {} service from '
'consul {}:'.format(endpoint, repr(e)))
- return
+ log.error('Committing suicide...')
+ # Committing suicide in order to let docker restart ofagent
+ os.system("kill -15 {}".format(os.getpid()))
if ip_port_endpoint:
host, port = ip_port_endpoint.split(':', 2)
return host, int(port)
diff --git a/ofagent/grpc_client.py b/ofagent/grpc_client.py
index d1b78bd..ccdb98b 100644
--- a/ofagent/grpc_client.py
+++ b/ofagent/grpc_client.py
@@ -18,6 +18,7 @@
The gRPC client layer for the OpenFlow agent
"""
from Queue import Queue, Empty
+import os
from grpc import StatusCode
from grpc._channel import _Rendezvous
@@ -77,7 +78,11 @@
def stream_packets_out():
generator = packet_generator()
- self.local_stub.StreamPacketsOut(generator)
+ try:
+ self.local_stub.StreamPacketsOut(generator)
+ except _Rendezvous, e:
+ if e.code() == StatusCode.UNAVAILABLE:
+ os.system("kill -15 {}".format(os.getpid()))
reactor.callInThread(stream_packets_out)
@@ -86,12 +91,16 @@
def receive_packet_in_stream():
streaming_rpc_method = self.local_stub.ReceivePacketsIn
iterator = streaming_rpc_method(empty_pb2.Empty())
- for packet_in in iterator:
- reactor.callFromThread(self.packet_in_queue.put,
- packet_in)
- log.debug('enqued-packet-in',
- packet_in=packet_in,
- queue_len=len(self.packet_in_queue.pending))
+ try:
+ for packet_in in iterator:
+ reactor.callFromThread(self.packet_in_queue.put,
+ packet_in)
+ log.debug('enqued-packet-in',
+ packet_in=packet_in,
+ queue_len=len(self.packet_in_queue.pending))
+ except _Rendezvous, e:
+ if e.code() == StatusCode.UNAVAILABLE:
+ os.system("kill -15 {}".format(os.getpid()))
reactor.callInThread(receive_packet_in_stream)
@@ -100,11 +109,15 @@
def receive_change_events():
streaming_rpc_method = self.local_stub.ReceiveChangeEvents
iterator = streaming_rpc_method(empty_pb2.Empty())
- for event in iterator:
- reactor.callFromThread(self.change_event_queue.put, event)
- log.debug('enqued-change-event',
- change_event=event,
- queue_len=len(self.change_event_queue.pending))
+ try:
+ for event in iterator:
+ reactor.callFromThread(self.change_event_queue.put, event)
+ log.debug('enqued-change-event',
+ change_event=event,
+ queue_len=len(self.change_event_queue.pending))
+ except _Rendezvous, e:
+ if e.code() == StatusCode.UNAVAILABLE:
+ os.system("kill -15 {}".format(os.getpid()))
reactor.callInThread(receive_change_events)