def handle_srv6_behavior(
        operation,
        grpc_address,
        grpc_port,
        segment,
        action='',
        device='',
        table=-1,
        nexthop="",
        lookup_table=-1,
        interface="",
        segments="",
        metric=-1,
        fwd_engine='Linux'):
    """Handle a SRv6 behavior"""

    # pylint: disable=too-many-arguments

    with utils.get_grpc_session(grpc_address, grpc_port) as channel:
        res = srv6_utils.handle_srv6_behavior(
            operation=operation,
            channel=channel,
            segment=segment,
            action=action,
            device=device,
            table=table,
            nexthop=nexthop,
            lookup_table=lookup_table,
            interface=interface,
            segments=segments.split(','),
            metric=metric,
            fwd_engine=fwd_engine
        )
        if res == 0:
            print('OK')
        else:
            print('Error')
def shift_path():
    # +--------------------------------------------------------------------+
    # |         Switch from r1---r7---r8 path to r1---r4---r8 path         |
    # |                     by exchanging the metrics                      |
    # +--------------------------------------------------------------------+
    logger.info(
        '*** Attempting to change path from r1---r7---r8 to r1---r4---r8')
    # IP addresses
    r1 = 'fcff:1::1'
    r8 = 'fcff:8::1'
    # Open gRPC channels
    with get_grpc_session(r1, GRPC_PORT) as r1_chan, \
            get_grpc_session(r8, GRPC_PORT) as r8_chan:
        # +---------------------------------------------------------------+
        # |              Decreasing the metric value of the               |
        # |               r4 route to an intermediate value               |
        # +---------------------------------------------------------------+
        logger.info('******* Decreasing the metric value of '
                    'the r4 route to an intermediate value')
        #
        # Encap route on r1
        # on r1: ip -6 route add fd00:0:83::/64 encap seg6 mode encap segs
        #        fcff:4::1,fcff:8:100 dev r1-h11 metric 99
        logger.info('*********** Creating encap route on r1')
        res = handle_srv6_path(op='add',
                               channel=r1_chan,
                               destination='fd00:0:83::/64',
                               segments=['fcff:4::1', 'fcff:8::100'],
                               device='r1-h11',
                               metric=99)
        if res == srv6_manager_pb2.StatusCode.STATUS_SUCCESS:
            logger.info('*********** Encap route created successfully')
        else:
            logger.error('*********** Error while creating encap route')
        #
        # Decap route on r8
        # on r8: ip -6 route add fcff:8::100 encap seg6local action End.DT6
        #        table 254 dev r8-h83 metric 99
        logger.info('*********** Creating decap route on r8')
        res = handle_srv6_behavior(op='add',
                                   channel=r8_chan,
                                   segment='fcff:8::100',
                                   action='End.DT6',
                                   lookup_table=254,
                                   device='r8-h83',
                                   metric=99)
        if res == srv6_manager_pb2.StatusCode.STATUS_SUCCESS:
            logger.info('*********** Decap route created successfully')
        else:
            logger.error('*********** Error while creating decap route')
        #
        # Encap route on r8
        # on r8: ip -6 route add fd00:0:11::/64 encap seg6 mode encap segs
        #        fcff:4::1,fcff:1:100 dev r8-h83 metric 99
        logger.info('*********** Creating encap route on r8')
        res = handle_srv6_path(op='add',
                               channel=r8_chan,
                               destination='fd00:0:11::/64',
                               segments=['fcff:4::1', 'fcff:1::100'],
                               device='r8-h83',
                               metric=99)
        if res == srv6_manager_pb2.StatusCode.STATUS_SUCCESS:
            logger.info('*********** Encap route created successfully')
        else:
            logger.error('*********** Error while creating encap route')
        #
        # Decap route on r1
        # on r1: ip -6 route add fcff:1::100 encap seg6local action End.DT6
        #        table 254 dev r1-h11 metric 99
        logger.info('*********** Creating decap route on r1')
        res = handle_srv6_behavior(op='add',
                                   channel=r1_chan,
                                   segment='fcff:1::100',
                                   action='End.DT6',
                                   lookup_table=254,
                                   device='r1-h11',
                                   metric=99)
        if res == srv6_manager_pb2.StatusCode.STATUS_SUCCESS:
            logger.info('*********** Decap route created successfully')
        else:
            logger.error('*********** Error while creating decap route')
        #
        #
        # +---------------------------------------------------------------+
        # |                   Removing old route via r4                   |
        # +---------------------------------------------------------------+
        logger.info('*** Attempting to remove tunnel r1---r4---r8')
        #
        # Encap route on r1
        # on r1: ip -6 route del fd00:0:83::/64 encap seg6 mode encap segs
        #        fcff:4::1,fcff:8:100 dev r1-h11 metric 200
        logger.info('*********** Removing encap route on r1')
        res = handle_srv6_path(op='del',
                               channel=r1_chan,
                               destination='fd00:0:83::/64',
                               device='r1-h11',
                               metric=200)
        if res == srv6_manager_pb2.StatusCode.STATUS_SUCCESS:
            logger.info('*********** Encap route removed successfully')
        else:
            logger.error('*********** Error while removing encap route')
        #
        # Decap route on r8
        # on r8: ip -6 route del fcff:8::100 encap seg6local action End.DT6
        #        table 254 dev r8-h83 metric 200
        logger.info('*********** Removing decap route on r8')
        res = handle_srv6_behavior(op='del',
                                   channel=r8_chan,
                                   segment='fcff:8::100',
                                   device='r8-h83',
                                   metric=200)
        if res == srv6_manager_pb2.StatusCode.STATUS_SUCCESS:
            logger.info('*********** Decap route removed successfully')
        else:
            logger.error('*********** Error while removing decap route')
        #
        # Encap route on r8
        # on r8: ip -6 route del fd00:0:11::/64 encap seg6 mode encap segs
        #        fcff:4::1,fcff:1:100 dev r8-h83 metric 200
        logger.info('*********** Removing encap route on r8')
        res = handle_srv6_path(op='del',
                               channel=r8_chan,
                               destination='fd00:0:11::/64',
                               device='r8-h83',
                               metric=200)
        if res == srv6_manager_pb2.StatusCode.STATUS_SUCCESS:
            logger.info('*********** Encap route removed successfully')
        else:
            logger.error('*********** Error while removing encap route')
        #
        # Decap route on r1
        # on r1: ip -6 route del fcff:1::100 encap seg6local action End.DT6
        #        table 254 dev r1-h11 metric 200
        logger.info('*********** Removing decap route on r1')
        res = handle_srv6_behavior(op='del',
                                   channel=r1_chan,
                                   segment='fcff:1::100',
                                   device='r1-h11',
                                   metric=200)
        if res == srv6_manager_pb2.StatusCode.STATUS_SUCCESS:
            logger.info('*********** Decap route removed successfully')
        else:
            logger.error('*********** Error while removing decap route')
        #
        #
        # +----------------------------------------------------------------+
        # |           Increasing the metric value of the r7 path           |
        # +----------------------------------------------------------------+
        logger.info(
            '*** Increasing the metric value of the tunnel r1---r7---r8')
        #
        # Encap route on r1
        # on r1: ip -6 route add fd00:0:83::/64 encap seg6 mode encap segs
        #        fcff:7::1,fcff:8:100 dev r1-h11 metric 200
        logger.info('*********** Creating encap route on r1')
        res = handle_srv6_path(op='add',
                               channel=r1_chan,
                               destination='fd00:0:83::/64',
                               segments=['fcff:7::1', 'fcff:8::100'],
                               device='r1-h11',
                               metric=200)
        if res == srv6_manager_pb2.StatusCode.STATUS_SUCCESS:
            logger.info('*********** Encap route created successfully')
        else:
            logger.error('*********** Error while creating encap route')
        #
        # Decap route on r8
        # on r8: ip -6 route add fcff:8::100 encap seg6local action End.DT6
        #        table 254 dev r8-h83 metric 200
        logger.info('*********** Creating decap route on r8')
        res = handle_srv6_behavior(op='add',
                                   channel=r8_chan,
                                   segment='fcff:8::100',
                                   action='End.DT6',
                                   lookup_table=254,
                                   device='r8-h83',
                                   metric=200)
        if res == srv6_manager_pb2.StatusCode.STATUS_SUCCESS:
            logger.info('*********** Decap route created successfully')
        else:
            logger.error('*********** Error while creating decap route')
        #
        # Encap route on r8
        # on r8: ip -6 route add fd00:0:11::/64 encap seg6 mode encap segs
        #        fcff:7::1,fcff:1:100 dev r8-h83 metric 200
        logger.info('*********** Creating encap route on r8')
        res = handle_srv6_path(op='add',
                               channel=r8_chan,
                               destination='fd00:0:11::/64',
                               segments=['fcff:7::1', 'fcff:1::100'],
                               device='r8-h83',
                               metric=200)
        if res == srv6_manager_pb2.StatusCode.STATUS_SUCCESS:
            logger.info('*********** Encap route created successfully')
        else:
            logger.error('*********** Error while creating encap route')
        #
        # Decap route on r1
        # on r1: ip -6 route add fcff:1::100 encap seg6local action End.DT6
        #        table 254 dev r1-h11 metric 200
        logger.info('*********** Creating decap route on r1')
        res = handle_srv6_behavior(op='add',
                                   channel=r1_chan,
                                   segment='fcff:1::100',
                                   action='End.DT6',
                                   lookup_table=254,
                                   device='r1-h11',
                                   metric=200)
        if res == srv6_manager_pb2.StatusCode.STATUS_SUCCESS:
            logger.info('*********** Decap route created successfully')
        else:
            logger.error('*********** Error while creating decap route')
        #
        #
        # +---------------------------------------------------------------+
        # |                   Removing old route via r7                   |
        # +---------------------------------------------------------------+
        logger.info('*** Attempting to remove tunnel r1---r7---r8')
        # Encap route on r1
        # on r1: ip -6 route del fd00:0:83::/64 encap seg6 mode encap segs
        #        fcff:7::1,fcff:8:100 dev r1-h11 metric 100
        logger.info('*********** Removing encap route on r1')
        res = handle_srv6_path(op='del',
                               channel=r1_chan,
                               destination='fd00:0:83::/64',
                               device='r1-h11',
                               metric=100)
        if res == srv6_manager_pb2.StatusCode.STATUS_SUCCESS:
            logger.info('*********** Encap route removed successfully')
        else:
            logger.error('*********** Error while removing encap route')
        #
        # Decap route on r8
        # on r8: ip -6 route del fcff:8::100 encap seg6local action End.DT6
        #        table 254 dev r8-h83 metric 100
        logger.info('*********** Removing decap route on r8')
        res = handle_srv6_behavior(op='del',
                                   channel=r8_chan,
                                   segment='fcff:8::100',
                                   device='r8-h83',
                                   metric=100)
        if res == srv6_manager_pb2.StatusCode.STATUS_SUCCESS:
            logger.info('*********** Decap route removed successfully')
        else:
            logger.error('*********** Error while removing decap route')
        #
        # Encap route on r8
        # on r8: ip -6 route del fd00:0:11::/64 encap seg6 mode encap segs
        #        fcff:7::1,fcff:1:100 dev r8-h83 metric 100
        logger.info('*********** Removing encap route on r8')
        res = handle_srv6_path(op='del',
                               channel=r8_chan,
                               destination='fd00:0:11::/64',
                               device='r8-h83',
                               metric=100)
        if res == srv6_manager_pb2.StatusCode.STATUS_SUCCESS:
            logger.info('*********** Encap route removed successfully')
        else:
            logger.error('*********** Error while removing encap route')
        #
        # Decap route on r1
        # on r1: ip -6 route del fcff:1::100 encap seg6local action End.DT6
        #        table 254 dev r1-h11 metric 100
        logger.info('*********** Removing decap route on r1')
        res = handle_srv6_behavior(op='del',
                                   channel=r1_chan,
                                   segment='fcff:1::100',
                                   device='r1-h11',
                                   metric=100)
        if res == srv6_manager_pb2.StatusCode.STATUS_SUCCESS:
            logger.info('*********** Decap route removed successfully')
        else:
            logger.error('*********** Error while removing decap route')
        #
        #
        # +---------------------------------------------------------------+
        # |      Assign to r4 route a definitive value of the metric      |
        # +---------------------------------------------------------------+
        logger.info('*** Assign to r4 route a definitive value of the metric')
        #
        # Encap route on r1
        # on r1: ip -6 route add fd00:0:83::/64 encap seg6 mode encap segs
        #        fcff:4::1,fcff:8:100 dev r1-h11 metric 100
        logger.info('*********** Creating encap route on r1')
        res = handle_srv6_path(op='add',
                               channel=r1_chan,
                               destination='fd00:0:83::/64',
                               segments=['fcff:4::1', 'fcff:8::100'],
                               device='r1-h11',
                               metric=100)
        if res == srv6_manager_pb2.StatusCode.STATUS_SUCCESS:
            logger.info('*********** Encap route created successfully')
        else:
            logger.error('*********** Error while creating encap route')
        #
        # Decap route on r8
        # on r8: ip -6 route add fcff:8::100 encap seg6local action End.DT6
        #        table 254 dev r8-h83 metric 100
        logger.info('*********** Creating decap route on r8')
        res = handle_srv6_behavior(op='add',
                                   channel=r8_chan,
                                   segment='fcff:8::100',
                                   action='End.DT6',
                                   lookup_table=254,
                                   device='r8-h83',
                                   metric=100)
        if res == srv6_manager_pb2.StatusCode.STATUS_SUCCESS:
            logger.info('*********** Decap route created successfully')
        else:
            logger.error('*********** Error while creating decap route')
        #
        # Encap route on r8
        # on r8: ip -6 route add fd00:0:11::/64 encap seg6 mode encap segs
        #        fcff:4::1,fcff:1:100 dev r8-h83 metric 100
        logger.info('*********** Creating encap route on r8')
        res = handle_srv6_path(op='add',
                               channel=r8_chan,
                               destination='fd00:0:11::/64',
                               segments=['fcff:4::1', 'fcff:1::100'],
                               device='r8-h83',
                               metric=100)
        if res == srv6_manager_pb2.StatusCode.STATUS_SUCCESS:
            logger.info('*********** Encap route created successfully')
        else:
            logger.error('*********** Error while creating encap route')
        #
        # Decap route on r1
        # on r1: ip -6 route add fcff:1::100 encap seg6local action End.DT6
        #        table 254 dev r1-h11 metric 100
        logger.info('*********** Creating decap route on r1')
        res = handle_srv6_behavior(op='add',
                                   channel=r1_chan,
                                   segment='fcff:1::100',
                                   action='End.DT6',
                                   lookup_table=254,
                                   device='r1-h11',
                                   metric=100)
        if res == srv6_manager_pb2.StatusCode.STATUS_SUCCESS:
            logger.info('*********** Decap route created successfully')
        else:
            logger.error('*********** Error while creating decap route')
        #
        #
        # +---------------------------------------------------------------+
        # | Delete the r4 route with the intermediate value of the metric |
        # +---------------------------------------------------------------+
        logger.info('*** Delete the r4 route with the intermediate value of '
                    'the metric')
        #
        # Encap route on r1
        # on r1: ip -6 route del fd00:0:83::/64 encap seg6 mode encap segs
        #        fcff:4::1,fcff:8:100 dev r1-h11 metric 99
        logger.info('*********** Removing encap route on r1')
        res = handle_srv6_path(op='del',
                               channel=r1_chan,
                               destination='fd00:0:83::/64',
                               device='r1-h11',
                               metric=99)
        if res == srv6_manager_pb2.StatusCode.STATUS_SUCCESS:
            logger.info('*********** Encap route removed successfully')
        else:
            logger.error('*********** Error while removing encap route')
        #
        # Decap route on r8
        # on r8: ip -6 route del fcff:8::100 encap seg6local action End.DT6
        #        table 254 dev r8-h83 metric 99
        logger.info('*********** Removing decap route on r8')
        res = handle_srv6_behavior(op='del',
                                   channel=r8_chan,
                                   segment='fcff:8::100',
                                   device='r8-h83',
                                   metric=99)
        if res == srv6_manager_pb2.StatusCode.STATUS_SUCCESS:
            logger.info('*********** Decap route removed successfully')
        else:
            logger.error('*********** Error while removing decap route')
        #
        # Encap route on r8
        # on r8: ip -6 route del fd00:0:11::/64 encap seg6 mode encap segs
        #        fcff:4::1,fcff:1:100 dev r8-h83 metric 99
        logger.info('*********** Removing encap route on r8')
        res = handle_srv6_path(op='del',
                               channel=r8_chan,
                               destination='fd00:0:11::/64',
                               device='r8-h83',
                               metric=99)
        if res == srv6_manager_pb2.StatusCode.STATUS_SUCCESS:
            logger.info('*********** Encap route removed successfully')
        else:
            logger.error('*********** Error while removing encap route')
        #
        # Decap route on r1
        # on r1: ip -6 route del fcff:1::100 encap seg6local action End.DT6
        #        table 254 dev r1-h11 metric 99
        logger.info('*********** Removing decap route on r1')
        res = handle_srv6_behavior(op='del',
                                   channel=r1_chan,
                                   segment='fcff:1::100',
                                   device='r1-h11',
                                   metric=99)
        if res == srv6_manager_pb2.StatusCode.STATUS_SUCCESS:
            logger.info('*********** Decap route removed successfully')
        else:
            logger.error('*********** Error while removing decap route')
        #
        #
        # +---------------------------------------------------------------+
        # |                             Done                              |
        # +---------------------------------------------------------------+
        print()
 def HandleSRv6Behavior(self, request, context):
     """
     Handle a SRv6 behavior.
     """
     # Iterate on the SRv6 behaviors
     srv6_behaviors = None
     for srv6_behavior in request.srv6_behaviors:
         # Perform the operation
         #
         # The "with" block is used to avoid duplicating the error handling
         # code
         with srv6_mgr_error_handling() as response:
             # Extract the SRv6 action
             action = grpc_to_py_srv6_action[srv6_behavior.action]
             # Extract the forwarding engine
             fwd_engine = grpc_to_py_fwd_engine[srv6_behavior.fwd_engine]
             if fwd_engine == 'FWD_ENGINE_UNSPEC':
                 fwd_engine = ''
             # Handle the behavior
             srv6_behaviors = srv6_utils.handle_srv6_behavior(
                 operation=srv6_behavior.operation,
                 grpc_address=(srv6_behavior.grpc_address
                               if srv6_behavior.grpc_address != ''
                               else None),
                 grpc_port=(srv6_behavior.grpc_port
                            if srv6_behavior.grpc_port != -1 else None),
                 segment=(srv6_behavior.segment
                          if srv6_behavior.segment != '' else None),
                 action=action if action != '' else None,
                 device=(srv6_behavior.device
                         if srv6_behavior.device != '' else None),
                 table=(srv6_behavior.table
                        if srv6_behavior.table != -1 else None),
                 nexthop=(srv6_behavior.nexthop
                          if srv6_behavior.nexthop != '' else None),
                 lookup_table=(srv6_behavior.lookup_table
                               if srv6_behavior.lookup_table != -1
                               else None),
                 interface=(srv6_behavior.interface
                            if srv6_behavior.interface != '' else None),
                 segments=(list(srv6_behavior.segments)
                           if len(srv6_behavior.segments) > 0 else None),
                 metric=(srv6_behavior.metric
                         if srv6_behavior.metric != -1 else None),
                 fwd_engine=fwd_engine if fwd_engine != '' else None,
                 key=(srv6_behavior.key
                      if srv6_behavior.key != '' else None),
                 db_conn=self.db_conn
             )
     # If an error occurred, return immediately
     if response.status != nb_commons_pb2.STATUS_SUCCESS:
         return response
     # Add the SRv6 behaviors to the response message
     if srv6_behaviors is not None:
         for behavior in srv6_behaviors:
             # Create a new behavior
             _srv6_behavior = response.srv6_behaviors.add()
             # Set gRPC address
             _srv6_behavior.grpc_address = ''
             if behavior['grpc_address'] is not None:
                 _srv6_behavior.grpc_address = behavior['grpc_address']
             # Set gRPC port
             _srv6_behavior.grpc_port = ''
             if behavior['grpc_port'] is not None:
                 _srv6_behavior.grpc_port = behavior['grpc_port']
             # Set segment
             _srv6_behavior.segment = ''
             if behavior['segment'] is not None:
                 _srv6_behavior.segment = behavior['segment']
             # Set SRv6 action (e.g. "End.DT6" or "End.DX4")
             _srv6_behavior.action = SRv6Action.UNSPEC.value
             if behavior['action'] is not None:
                 _srv6_behavior.action = \
                     py_to_grpc_srv6_action[behavior['action']]
             # Set nexthop (required by "End.X", "End.DX4" and
             # "End.DX6")
             _srv6_behavior.nexthop = ''
             if behavior['nexthop'] is not None:
                 _srv6_behavior.nexthop = behavior['nexthop']
             # Set lookup table (required by "End.T", "End.DT4" and
             # "End.DT6")
             _srv6_behavior.lookup_table = -1
             if behavior['lookup_table'] is not None:
                 _srv6_behavior.lookup_table = behavior['lookup_table']
             # Set interface (required by "End.DX2")
             _srv6_behavior.interface = ''
             if behavior['interface'] is not None:
                 _srv6_behavior.interface = behavior['interface']
             # Set segment list (required by "End.B6" and "End.B6.Encaps")
             if behavior['segments'] is not None:
                 _srv6_behavior.segments.extend(behavior['segments'])
             # Set device
             _srv6_behavior.device = ''
             if behavior['device'] is not None:
                 _srv6_behavior.device = behavior['device']
             # Set table ID
             _srv6_behavior.table = -1
             if behavior['table'] is not None:
                 _srv6_behavior.table = behavior['table']
             # Set metric
             _srv6_behavior.metric = -1
             if behavior['metric'] is not None:
                 _srv6_behavior.metric = behavior['metric']
             # Set forwarding engine (e.g. "Linux" or "VPP")
             _srv6_behavior.fwd_engine = FwdEngine.UNSPEC.value
             if behavior['fwd_engine'] is not None:
                 _srv6_behavior.fwd_engine = \
                     py_to_grpc_fwd_engine[behavior['fwd_engine']]
             # Set the key of the behavior
             if '_key' in behavior:
                 _srv6_behavior.key = behavior['_key']
     # Done, return the reply
     return response
def remove_tunnel_r1r7r8():
    # +--------------------------------------------------------------------+
    # |          Remove a bidirectional tunnel between h11 and h83         |
    # |              passing through router r7 (r1---r7---r8)              |
    # +--------------------------------------------------------------------+
    logger.info('*** Attempting to remove tunnel r1---r7---r8')
    # IP addresses
    r1 = 'fcff:1::1'
    r8 = 'fcff:8::1'
    # Open gRPC channels
    with get_grpc_session(r1, GRPC_PORT) as r1_chan, \
            get_grpc_session(r8, GRPC_PORT) as r8_chan:
        # +---------------------------------------------------------------+
        # |         Remove tunnel from r1 to r8 for fd00:0:83::/64        |
        # +---------------------------------------------------------------+
        logger.info('******* Removing tunnel from r1 to r8 for fd00:0:83::/64')
        #
        # Decap route on r8
        # on r8: ip -6 route del fcff:8::100 dev r8-h83 metric 100
        logger.info('*********** Removing decap route')
        res = handle_srv6_behavior(op='del',
                                   channel=r8_chan,
                                   segment='fcff:8::100',
                                   device='r8-h83',
                                   metric=200)
        if res == srv6_manager_pb2.StatusCode.STATUS_SUCCESS:
            logger.info('*********** Decap route removed successfully')
        else:
            logger.error('*********** Error while removing decap route')
        #
        # Encap route on r1
        # on r1: ip -6 route del fd00:0:83::/64 dev r1-h11 metric 100
        logger.info('*********** Removing encap route')
        res = handle_srv6_path(op='del',
                               channel=r1_chan,
                               destination='fd00:0:83::/64',
                               device='r1-h11',
                               metric=200)
        if res == srv6_manager_pb2.StatusCode.STATUS_SUCCESS:
            logger.info('*********** Encap route removed successfully')
        else:
            logger.error('*********** Error while removing encap route')
        #
        #
        # +---------------------------------------------------------------+
        # |         Remove tunnel from r8 to r1 for fd00:0:11::/64        |
        # +---------------------------------------------------------------+
        logger.info('******* Removing tunnel from r8 to r1 for fd00:0:11::/64')
        #
        # Decap route on r1
        # on r1: ip -6 route del fcff:1::100 dev r1-h11 metric 100
        logger.info('*********** Removing decap route')
        res = handle_srv6_behavior(op='del',
                                   channel=r1_chan,
                                   segment='fcff:1::100',
                                   device='r1-h11',
                                   metric=200)
        if res == srv6_manager_pb2.StatusCode.STATUS_SUCCESS:
            logger.info('*********** Decap route removed successfully')
        else:
            logger.error('*********** Error while removing decap route')
        #
        # Encap route on r8
        # on r8: ip -6 route del fd00:0:11::/64 dev r8-h83 metric 200
        logger.info('*********** Removing encap route')
        res = handle_srv6_path(op='del',
                               channel=r8_chan,
                               destination='fd00:0:11::/64',
                               device='r8-h83',
                               metric=200)
        if res == srv6_manager_pb2.StatusCode.STATUS_SUCCESS:
            logger.info('*********** Encap route removed successfully')
        else:
            logger.error('*********** Error while removing encap route')
        #
        #
        # +---------------------------------------------------------------+
        # |                             Done                              |
        # +---------------------------------------------------------------+
        print()
Exemple #5
0
def create_tunnel_r1r4r8():
    # +--------------------------------------------------------------------+
    # |          Create a bidirectional tunnel between h11 and h83         |
    # |              passing through router r4 (r1---r4---r8)              |
    # +--------------------------------------------------------------------+
    logger.info('*** Attempting to create tunnel r1---r4---r8')
    # IP addresses
    r1 = 'fcff:1::1'
    r8 = 'fcff:8::1'
    # Open gRPC channels
    with get_grpc_session(r1, GRPC_PORT) as r1_chan, \
            get_grpc_session(r8, GRPC_PORT) as r8_chan:
        # +---------------------------------------------------------------+
        # |          Set tunnel from r1 to r8 for fd00:0:83::/64          |
        # +---------------------------------------------------------------+
        logger.info('******* Set tunnel from r1 to r8 for fd00:0:83::/64')
        #
        # Encap route on r1
        # on r1: ip -6 route add fd00:0:83::/64 encap seg6 mode encap segs
        #        fcff:4::1,fcff:8::100 dev r1-h11 metric 200
        logger.info('*********** Creating encap route')
        res = handle_srv6_path(
            op='add',
            channel=r1_chan,
            destination='fd00:0:83::/64',
            segments=['fcff:4::1', 'fcff:8::100'],
            device='r1-h11',
            metric=200
        )
        if res == srv6_manager_pb2.StatusCode.STATUS_SUCCESS:
            logger.info('*********** Encap route created successfully')
        else:
            logger.error('*********** Error while creating encap route')
        #
        # Decap route on r8
        # on r8: ip -6 route add fcff:8::100 encap seg6local action End.DT6
        #        table 254 dev r8-h83 metric 200
        logger.info('*********** Creating decap route')
        res = handle_srv6_behavior(
            op='add',
            channel=r8_chan,
            segment='fcff:8::100',
            action='End.DT6',
            lookup_table=254,
            device='r8-h83',
            metric=200
        )
        if res == srv6_manager_pb2.StatusCode.STATUS_SUCCESS:
            logger.info('*********** Decap route created successfully')
        else:
            logger.error('*********** Error while creating decap route')
        #
        #
        # +---------------------------------------------------------------+
        # |          Set tunnel from r8 to r1 for fd00:0:11::/64          |
        # +---------------------------------------------------------------+
        logger.info('******* Set tunnel from r8 to r1 for fd00:0:11::/64')
        #
        # Encap route on r8
        # on r8: ip -6 route add fd00:0:11::/64 encap seg6 mode encap segs
        #        fcff:4::1,fcff:1::100 dev r8-h83 metric 200
        logger.info('*********** Creating encap route')
        res = handle_srv6_path(
            op='add',
            channel=r8_chan,
            destination='fd00:0:11::/64',
            segments=['fcff:4::1', 'fcff:1::100'],
            device='r8-h83',
            metric=200
        )
        if res == srv6_manager_pb2.StatusCode.STATUS_SUCCESS:
            logger.info('*********** Encap route created successfully')
        else:
            logger.error('*********** Error while creating encap route')
        #
        # Decap route on r1
        # on r1: ip -6 route add fcff:1::100 encap seg6local action End.DT6
        #        table 254 dev r1-h11 metric 200
        logger.info('*********** Creating decap route')
        res = handle_srv6_behavior(
            op='add',
            channel=r1_chan,
            segment='fcff:1::100',
            action='End.DT6',
            lookup_table=254,
            device='r1-h11',
            metric=200
        )
        if res == srv6_manager_pb2.StatusCode.STATUS_SUCCESS:
            logger.info('*********** Decap route created successfully')
        else:
            logger.error('*********** Error while creating decap route')
        #
        #
        # +---------------------------------------------------------------+
        # |                             Done                              |
        # +---------------------------------------------------------------+
        print()