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/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)