p4app
p4app copied to clipboard
Simple_Switch stops to work and pops up AttributeError: 'module' object has no attribute 'P4RuntimeStub'
The following message appers after running the p4app script.
s1 Starting P4 switch s1.
simple_switch -i 1@s1-eth1 -i 2@s1-eth2 -i 3@s1-eth3 --nanolog ipc:///tmp/bm-0-log.ipc --device-id 0 /tmp/p4app-logs/polka.json --thrift-port 9090
P4 switch s1 has been started.
Traceback (most recent call last):
File "/p4app/main.py", line 461, in <module>
main()
File "/p4app/main.py", line 415, in main
net = config_network(bw, method, n, is_fabric)
File "/p4app/main.py", line 135, in config_network
net.start()
File "/scripts/p4app.py", line 100, in start
Mininet.start(self, *args, **kwargs)
File "build/bdist.linux-x86_64/egg/mininet/net.py", line 548, in start
File "/scripts/p4_mininet.py", line 353, in start
proto_dump_file='/tmp/p4app-logs/' + self.name + '-p4runtime-requests.txt')
File "/scripts/p4runtime_lib/switch.py", line 44, in __init__
self.client_stub = p4runtime_pb2.P4RuntimeStub(self.channel)
AttributeError: 'module' object has no attribute 'P4RuntimeStub'
I have used the latest p4app version, and it has appeared for all tested protofub, p4c, PI and behavioral-model versions.
We also encountered this problem during our P4 testing.
@rafaelsilvag If you are interested in local solution for this issue, here is what needs to be changed in p4app to resolve this issue.
index 4c38c2d..392701b 100644
--- a/docker/scripts/p4runtime_lib/switch.py
+++ b/docker/scripts/p4runtime_lib/switch.py
@@ -18,6 +18,7 @@ from datetime import datetime
import grpc
from p4.v1 import p4runtime_pb2
+from p4.v1 import p4runtime_pb2_grpc
from p4.tmp import p4config_pb2
MSG_LOG_MAX_LEN = 1024
@@ -41,7 +42,7 @@ class SwitchConnection(object):
if proto_dump_file is not None:
interceptor = GrpcRequestLogger(proto_dump_file)
self.channel = grpc.intercept_channel(self.channel, interceptor)
- self.client_stub = p4runtime_pb2.P4RuntimeStub(self.channel)
+ self.client_stub = p4runtime_pb2_grpc.P4RuntimeStub(self.channel)
self.requests_stream = IterableQueue()
self.stream_msg_resp = self.client_stub.StreamChannel(iter(self.requests_stream))
self.proto_dump_file = proto_dump_file