Example #1
0
    def updateConfig(self):
        '''
        Performs a SetForwardingPipelineConfig on the device with provided
        P4Info and binary device config.

        Prerequisite: setUp() method has been called first to create
        the channel.
        '''
        request = p4runtime_pb2.SetForwardingPipelineConfigRequest()
        request.device_id = self.device_id
        config = request.config
        # TBD: It seems like there should be a way to do this without
        # reading the P4info file again, instead getting the data from
        # self.p4info as saved when executing the setUp() method
        # above.  The following commented-out assignment does not work.
        #config.p4info = self.p4info
        proto_txt_path = testutils.test_param_get("p4info")
        with open(proto_txt_path, 'r') as fin:
            google.protobuf.text_format.Merge(fin.read(), config.p4info)
        config_path = testutils.test_param_get("config")
        logging.info(
            "Reading config (compiled P4 program) from {}".format(config_path))
        with open(config_path, 'rb') as config_f:
            config.p4_device_config = config_f.read()
        request.action = p4runtime_pb2.SetForwardingPipelineConfigRequest.VERIFY_AND_COMMIT
        try:
            response = self.stub.SetForwardingPipelineConfig(request)
        except Exception as e:
            logging.error("Error during SetForwardingPipelineConfig",
                          file=sys.stderr)
            logging.error(str(e), file=sys.stderr)
            return False
        return True
Example #2
0
    def SetForwardingPipelineConfig(self, p4info, dry_run=False, **kwargs):

        device_config = self.buildDeviceConfig(**kwargs)

        device_config.reassign = True
        with open(kwargs['bmv2_json_file_path']) as f:
            device_config.device_data = f.read()

        self.bmv2_json_file_path = kwargs['bmv2_json_file_path']
        #return
        #with open(bmv2_json_file_path) as f:
        #    device_config.device_data = f.read()

        request = p4runtime_pb2.SetForwardingPipelineConfigRequest()
        request.election_id.low = 1
        request.device_id = self.device_id
        config = request.config
        config.p4info.CopyFrom(p4info)
        config.p4_device_config = device_config.SerializeToString()

        request.action = p4runtime_pb2.SetForwardingPipelineConfigRequest.VERIFY_AND_COMMIT
        if dry_run:
            print "P4Runtime SetForwardingPipelineConfig:", request
        else:
            self.client_stub.SetForwardingPipelineConfig(request)
Example #3
0
def update_config(p4info_path, bmv2_json_path, tofino_bin_path,
                  tofino_cxt_json_path, grpc_addr, device_id):
    """
    Performs a SetForwardingPipelineConfig on the device
    """
    channel = grpc.insecure_channel(grpc_addr)
    stub = p4runtime_pb2.P4RuntimeStub(channel)

    info("Sending P4 config")
    request = p4runtime_pb2.SetForwardingPipelineConfigRequest()
    request.device_id = device_id
    config = request.config
    with open(p4info_path, 'r') as p4info_f:
        google.protobuf.text_format.Merge(p4info_f.read(), config.p4info)
    if bmv2_json_path is not None:
        device_config = build_bmv2_config(bmv2_json_path)
    else:
        device_config = build_tofino_config("name", tofino_bin_path,
                                            tofino_cxt_json_path)
    config.p4_device_config = device_config.SerializeToString()
    request.action = p4runtime_pb2.SetForwardingPipelineConfigRequest.VERIFY_AND_COMMIT
    try:
        stub.SetForwardingPipelineConfig(request)
    except Exception as e:
        error("Error during SetForwardingPipelineConfig")
        error(str(e))
        return False
    return True
Example #4
0
 def SetForwardingPipelineConfig(self, p4info, dry_run=False, **kwargs):
     device_config = self.buildDeviceConfig(**kwargs)
     request = p4runtime_pb2.SetForwardingPipelineConfigRequest()
     request.device_id = self.device_id
     config = request.config
     config.p4info.CopyFrom(p4info)
     config.p4_device_config = device_config.SerializeToString()
     request.action = p4runtime_pb2.SetForwardingPipelineConfigRequest.VERIFY_AND_COMMIT
     if dry_run:
         print "P4 Runtime SetForwardingPipelineConfig:", request
     else:
         self.client_stub.SetForwardingPipelineConfig(request)
Example #5
0
 def set_fwd_pipe_config(self, p4info_path, bin_path):
     logging.debug("Setting forwarding pipeline config")
     req = p4runtime_pb2.SetForwardingPipelineConfigRequest()
     req.device_id = self.device_id
     election_id = req.election_id
     election_id.high = self.election_id[0]
     election_id.low = self.election_id[1]
     req.action = p4runtime_pb2.SetForwardingPipelineConfigRequest.VERIFY_AND_COMMIT
     with open(p4info_path, 'r') as f1:
         with open(bin_path, 'rb') as f2:
             try:
                 google.protobuf.text_format.Merge(f1.read(), req.config.p4info)
             except google.protobuf.text_format.ParseError:
                 logging.error("Error when parsing P4Info")
                 raise
             req.config.p4_device_config = f2.read()
     return self.stub.SetForwardingPipelineConfig(req)
Example #6
0
 def update_config(self):
     request = p4runtime_pb2.SetForwardingPipelineConfigRequest()
     request.device_id = self.device_id
     request.election_id.high = 0
     request.election_id.low = 1
     config = request.config
     with open(args.p4info, 'r') as p4info_f:
         google.protobuf.text_format.Merge(p4info_f.read(), config.p4info)
     device_config = build_bmv2_config(args.json)
     config.p4_device_config = device_config.SerializeToString()
     request.action = p4runtime_pb2.SetForwardingPipelineConfigRequest.VERIFY_AND_COMMIT
     try:
         self.stub.SetForwardingPipelineConfig(request)
     except Exception as e:
         print "Error during SetForwardingPipelineConfig"
         print str(e)
         return False
     return True
    def set_forwarding_pipeline_config(self, device_config):
        logger.info('Setting Forwarding Pipeline Config on switch - [%s] ',
                    self.grpc_addr)
        logger.debug('P4Info - [%s] ', self.p4info_helper.p4info)
        request = p4runtime_pb2.SetForwardingPipelineConfigRequest()
        request.election_id.low = 1
        request.device_id = self.device_id
        config = request.config

        config.p4info.CopyFrom(self.p4info_helper.p4info)
        config.p4_device_config = device_config.SerializeToString()

        request.action = \
            p4runtime_pb2.SetForwardingPipelineConfigRequest.VERIFY_AND_COMMIT

        logger.info('Request for SetForwardingPipelineConfig to device - [%s]',
                    self.name)
        self.client_stub.SetForwardingPipelineConfig(request)
        logger.info('Completed SetForwardingPipelineConfig to device - [%s]',
                    request.device_id)
Example #8
0
def update_config(config_path, p4info_path, grpc_addr, device_id):
    '''
    Performs a SetForwardingPipelineConfig on the device with provided
    P4Info and binary device config
    '''
    channel = grpc.insecure_channel(grpc_addr)
    stub = p4runtime_pb2.P4RuntimeStub(channel)
    print("Sending P4 config")
    request = p4runtime_pb2.SetForwardingPipelineConfigRequest()
    request.device_id = device_id
    config = request.config
    with open(p4info_path, 'r') as p4info_f:
        google.protobuf.text_format.Merge(p4info_f.read(), config.p4info)
    with open(config_path, 'rb') as config_f:
        config.p4_device_config = config_f.read()
    request.action = p4runtime_pb2.SetForwardingPipelineConfigRequest.VERIFY_AND_COMMIT
    try:
        response = stub.SetForwardingPipelineConfig(request)
    except Exception as e:
        print("Error during SetForwardingPipelineConfig")
        print(str(e))
        return False
    return True
Example #9
0
 def update_config(self):
     print("Setting Forwarding Pipeline")
     request = p4runtime_pb2.SetForwardingPipelineConfigRequest()
     request.device_id = self.device_id
     election_id = request.election_id
     election_id.high = 0
     election_id.low = self.election_id
     request.role_id = self.role_id
     config = request.config
     with open(self.p4info_path, 'r') as p4info_f:
         google.protobuf.text_format.Merge(p4info_f.read(), config.p4info)
     if self.device == "bmv2":
         device_config = self.build_bmv2_config()
     else:
         device_config = self.build_tofino_config("name", self.config_path,
                                                  self.ctx_json_path)
     config.p4_device_config = device_config.SerializeToString()
     request.action = p4runtime_pb2.SetForwardingPipelineConfigRequest.VERIFY_AND_COMMIT
     try:
         response = self.stub.SetForwardingPipelineConfig(request)
     except Exception as e:
         raise
         return False
     return True
Example #10
0
def update_config(p4info_path, bmv2_json_path, grpc_addr, device_id):
    """
    Performs a SetForwardingPipelineConfig on the device
    """
    channel = grpc.insecure_channel(grpc_addr)
    stub = p4runtime_pb2_grpc.P4RuntimeStub(channel)

    debug("Sending P4 config")

    # Send master arbitration via stream channel
    # This should go in library, to be re-used also by base_test.py.
    stream_out_q = Queue.Queue()
    stream_in_q = Queue.Queue()

    def stream_req_iterator():
        while True:
            p = stream_out_q.get()
            if p is None:
                break
            yield p

    def stream_recv(stream):
        for p in stream:
            stream_in_q.put(p)

    def get_stream_packet(type_, timeout=1):
        start = time.time()
        try:
            while True:
                remaining = timeout - (time.time() - start)
                if remaining < 0:
                    break
                msg = stream_in_q.get(timeout=remaining)
                if not msg.HasField(type_):
                    continue
                return msg
        except:  # timeout expired
            pass
        return None

    stream = stub.StreamChannel(stream_req_iterator())
    stream_recv_thread = threading.Thread(target=stream_recv, args=(stream, ))
    stream_recv_thread.start()

    req = p4runtime_pb2.StreamMessageRequest()
    arbitration = req.arbitration
    arbitration.device_id = device_id
    election_id = arbitration.election_id
    election_id.high = 0
    election_id.low = 1
    stream_out_q.put(req)

    rep = get_stream_packet("arbitration", timeout=5)
    if rep is None:
        error("Failed to establish handshake")
        return False

    try:
        # Set pipeline config.
        request = p4runtime_pb2.SetForwardingPipelineConfigRequest()
        request.device_id = device_id
        election_id = request.election_id
        election_id.high = 0
        election_id.low = 1
        config = request.config
        with open(p4info_path, 'r') as p4info_f:
            google.protobuf.text_format.Merge(p4info_f.read(), config.p4info)
        config.p4_device_config = build_bmv2_config(bmv2_json_path)
        request.action = p4runtime_pb2.SetForwardingPipelineConfigRequest.VERIFY_AND_COMMIT
        try:
            stub.SetForwardingPipelineConfig(request)
        except Exception as e:
            error("Error during SetForwardingPipelineConfig")
            error(str(e))
            return False
        return True
    finally:
        stream_out_q.put(None)
        stream_recv_thread.join()
def update_config(p4info_path,
                  bmv2_json_path,
                  tofino_bin_path,
                  tofino_cxt_json_path,
                  grpc_addr,
                  device_id,
                  generate_tv=False):
    """
    Performs a SetForwardingPipelineConfig on the device
    """
    # Build pipeline config request
    request = p4runtime_pb2.SetForwardingPipelineConfigRequest()
    request.device_id = device_id
    election_id = request.election_id
    election_id.high = 0
    election_id.low = 1
    config = request.config
    with open(p4info_path, 'r') as p4info_f:
        google.protobuf.text_format.Merge(p4info_f.read(), config.p4info)
    if bmv2_json_path is not None:
        device_config = build_bmv2_config(bmv2_json_path)
    else:
        device_config = build_tofino_config("name", tofino_bin_path,
                                            tofino_cxt_json_path)
    config.p4_device_config = device_config
    request.action = p4runtime_pb2.SetForwardingPipelineConfigRequest.VERIFY_AND_COMMIT

    if generate_tv:
        # Create new target proto object for testvectors
        if bmv2_json_path is not None:
            tv_target = targetutils.get_new_target(grpc_addr, target_id="bmv2")
        else:
            tv_target = targetutils.get_new_target(grpc_addr,
                                                   target_id="tofino")
        # Write the target proto object to testvectors/target.pb.txt
        targetutils.write_to_file(tv_target, os.getcwd())
        # Create new testvector for set pipeline config and write to testvectors/PipelineConfig.pb.txt
        tv = tvutils.get_new_testvector()
        tv_name = "PipelineConfig"
        tc = tvutils.get_new_testcase(tv, tv_name)
        tvutils.add_pipeline_config_operation(tc, request)
        tvutils.write_to_file(tv, os.getcwd(), tv_name)
        return True
    channel = grpc.insecure_channel(grpc_addr)
    stub = p4runtime_pb2_grpc.P4RuntimeStub(channel)

    info("Sending P4 config")

    # Send master arbitration via stream channel
    # This should go in library, to be re-used also by base_test.py.
    stream_out_q = Queue.Queue()
    stream_in_q = Queue.Queue()

    def stream_req_iterator():
        while True:
            p = stream_out_q.get()
            if p is None:
                break
            yield p

    def stream_recv(stream):
        for p in stream:
            stream_in_q.put(p)

    def get_stream_packet(type_, timeout=1):
        start = time.time()
        try:
            while True:
                remaining = timeout - (time.time() - start)
                if remaining < 0:
                    break
                msg = stream_in_q.get(timeout=remaining)
                if not msg.HasField(type_):
                    continue
                return msg
        except:  # timeout expired
            pass
        return None

    stream = stub.StreamChannel(stream_req_iterator())
    stream_recv_thread = threading.Thread(target=stream_recv, args=(stream, ))
    stream_recv_thread.start()

    req = p4runtime_pb2.StreamMessageRequest()
    arbitration = req.arbitration
    arbitration.device_id = device_id
    election_id = arbitration.election_id
    election_id.high = 0
    election_id.low = 1
    stream_out_q.put(req)

    rep = get_stream_packet("arbitration", timeout=5)
    if rep is None:
        error("Failed to establish handshake")
        return False

    try:
        try:
            stub.SetForwardingPipelineConfig(request)
        except Exception as e:
            error("Error during SetForwardingPipelineConfig")
            error(str(e))
            return False
        return True
    finally:
        stream_out_q.put(None)
        stream_recv_thread.join()
Example #12
0
def update_config(p4info_path, bmv2_json_path, tofino_bin_path,
                  tofino_cxt_json_path, grpc_addr, device_id):
    """
    Performs a SetForwardingPipelineConfig on the device
    """
    channel = grpc.insecure_channel(grpc_addr)
    stub = p4runtime_pb2.P4RuntimeStub(channel)

    info("Sending P4 config")

    # Send master arbitration via stream channel
    # This should go in library, to be re-used also by base_test.py.
    stream_out_q = Queue.Queue()

    def stream_req_iterator():
        while True:
            p = stream_out_q.get()
            if p is None:
                break
            yield p

    def stream_recv(s):
        pass

    stream = stub.StreamChannel(stream_req_iterator())
    stream_recv_thread = threading.Thread(target=stream_recv, args=(stream,))
    stream_recv_thread.start()

    req = p4runtime_pb2.StreamMessageRequest()
    arbitration = req.arbitration
    arbitration.device_id = device_id
    election_id = arbitration.election_id
    election_id.high = 0
    election_id.low = 1
    stream_out_q.put(req)

    try:
        # Set pipeline config.
        request = p4runtime_pb2.SetForwardingPipelineConfigRequest()
        request.device_id = device_id
        election_id = request.election_id
        election_id.high = 0
        election_id.low = 1
        config = request.config
        with open(p4info_path, 'r') as p4info_f:
            google.protobuf.text_format.Merge(p4info_f.read(), config.p4info)
        if bmv2_json_path is not None:
            device_config = build_bmv2_config(bmv2_json_path)
        else:
            device_config = build_tofino_config("name", tofino_bin_path,
                                                tofino_cxt_json_path)
        config.p4_device_config = device_config.SerializeToString()
        request.action = p4runtime_pb2.SetForwardingPipelineConfigRequest.VERIFY_AND_COMMIT
        try:
            stub.SetForwardingPipelineConfig(request)
        except Exception as e:
            error("Error during SetForwardingPipelineConfig")
            error(str(e))
            return False
        return True
    finally:
        stream_out_q.put(None)
        stream_recv_thread.join()