Esempio n. 1
0
    def list_ports(self, client, ports, internal_port=False, all=False):
        field_fmt = self._get_field_format(internal_port)
        port_status_map = client.getPortStatus(ports)
        qsfp_info_map = utils.get_qsfp_info_map(
            self._qsfp_client, None, continue_on_error=True)
        port_info_map = client.getAllPortInfo()
        missing_port_status = []
        for port_info in sorted(port_info_map.values(), key=utils.port_sort_fn):
            port_id = port_info.portId
            if ports and (port_id not in ports):
                continue
            status = port_status_map.get(port_id)
            if not status:
                missing_port_status.append(port_id)
                continue

            qsfp_present = False
            # For non QSFP ports (think Fabric port) qsfp_client
            # will not return any information.
            if status.transceiverIdx and self._qsfp_client:
                qsfp_info = qsfp_info_map.get(
                    status.transceiverIdx.transceiverId)
                qsfp_present = qsfp_info.present if qsfp_info else False

            attrs = utils.get_status_strs(status, qsfp_present)
            if internal_port:
                speed = attrs['speed']
                if not speed:
                    speed = '-'
                print(field_fmt.format(
                    port_id,
                    port_info.name,
                    attrs['admin_status'],
                    attrs['color_align'],
                    attrs['link_status'],
                    attrs['present'],
                    speed))
            elif all:
                name = port_info.name if port_info.name else port_id
                print(field_fmt.format(
                    name,
                    attrs['admin_status'],
                    attrs['color_align'],
                    attrs['link_status'],
                    attrs['present'],
                    attrs['speed']))
            elif status.enabled:
                name = port_info.name if port_info.name else port_id
                print(field_fmt.format(
                    name,
                    attrs['admin_status'],
                    attrs['color_align'],
                    attrs['link_status'],
                    attrs['present'],
                    attrs['speed']))
        if missing_port_status:
            print(utils.make_error_string(
                "Could not get status of ports {}".format(missing_port_status)))
Esempio n. 2
0
 def list_ports(self, ports, internal_port=False):
     field_fmt = self._get_field_format(internal_port)
     port_status_map = self._client.getPortStatus(ports)
     qsfp_info_map = utils.get_qsfp_info_map(
         self._qsfp_client, None, continue_on_error=True)
     port_info_map = self._client.getAllPortInfo()
     missing_port_status = []
     for port_info in sorted(port_info_map.values(), key=utils.port_sort_fn):
         port_id = port_info.portId
         if ports and (port_id not in ports):
             continue
         status = port_status_map.get(port_id)
         if not status:
             missing_port_status.append(port_id)
             continue
         # The transceiver id can be derived from port name
         # e.g. port name eth1/4/1 -> transceiver_id is 4-1 = 3
         # (-1 because we start counting transceivers at 0)
         transceiver_id = utils.port_sort_fn(port_info)[2] - 1
         qsfp_info = qsfp_info_map.get(transceiver_id)
         qsfp_present = None
         if self._qsfp_client:
             # For non QSFP ports (think Fabric port) qsfp_client
             # will not return any information.
             qsfp_present = qsfp_info.present if qsfp_info else False
         attrs = utils.get_status_strs(status, qsfp_present)
         if internal_port:
             speed = attrs['speed']
             if not speed:
                 speed = '-'
             print(field_fmt.format(
                 port_id,
                 port_info.name,
                 attrs['admin_status'],
                 attrs['color_align'],
                 attrs['link_status'],
                 attrs['present'],
                 speed))
         elif status.enabled:
             name = port_info.name if port_info.name else port_id
             print(field_fmt.format(
                 name,
                 attrs['admin_status'],
                 attrs['color_align'],
                 attrs['link_status'],
                 attrs['present'],
                 attrs['speed']))
     if missing_port_status:
         print(utils.make_error_string(
             "Could not get status of ports {}".format(missing_port_status)))
Esempio n. 3
0
    def get_vlan_port_map(self, agent_client, qsfp_client) -> Dict:
        ''' fetch port info and map vlan -> ports '''
        all_port_info_map = agent_client.getAllPortInfo()
        port_status_map = agent_client.getPortStatus()
        qsfp_info_map = utils.get_qsfp_info_map(qsfp_client,
                                                None,
                                                continue_on_error=True)
        vlan_port_map: Dict = {}
        for port in all_port_info_map.values():
            vlan_count = len(port.vlans)
            # unconfigured ports can be skipped
            if vlan_count == 0:
                continue
            # fboss ports currently only support a single vlan
            assert vlan_count == 1
            vlan = port.vlans[0]
            # root port is the parent physical port
            match = re.match(r"(.*)\/\d+$", port.name)
            if match:
                root_port = match.group(1)
            else:
                sys.exit(f"root_port for {port.name} could not be determined")
            port_status = port_status_map.get(port.portId)
            enabled = port_status.enabled
            up = port_status.up
            speed = int(port_status.speedMbps / 1000)
            # ports with transceiver data
            channels: List = []
            qsfp_id = None
            if port_status.transceiverIdx:
                channels = port_status.transceiverIdx.channels
                qsfp_id = port_status.transceiverIdx.transceiverId
            # galaxy fab ports have no transceiver
            fab_port = 'fab' in port.name
            qsfp_info = qsfp_info_map.get(qsfp_id)
            qsfp_present = qsfp_info.present if qsfp_info else False
            port_summary = self.get_port_summary(port.name, channels,
                                                 qsfp_present, fab_port,
                                                 enabled, speed, up)
            if not port_summary:
                continue
            if vlan in vlan_port_map.keys():
                if root_port in vlan_port_map[vlan].keys():
                    vlan_port_map[vlan][root_port].append(port_summary)
                else:
                    vlan_port_map[vlan][root_port] = [port_summary]
            else:
                vlan_port_map[vlan] = {root_port: [port_summary]}

        return vlan_port_map
Esempio n. 4
0
 def list_ports(self, ports, internal_port=False):
     field_fmt = self._get_field_format(internal_port)
     port_status_map = self._client.getPortStatus(ports)
     qsfp_info_map = utils.get_qsfp_info_map(
         self._qsfp_client, None, continue_on_error=True)
     port_info_map = self._client.getAllPortInfo()
     missing_port_status = []
     for port_info in sorted(port_info_map.values(), key=utils.port_sort_fn):
         port_id = port_info.portId
         if ports and (port_id not in ports):
             continue
         status = port_status_map.get(port_id)
         if not status:
             missing_port_status.append(port_id)
             continue
         # The transceiver id can be derived from port name
         # e.g. port name eth1/4/1 -> transceiver_id is 4-1 = 3
         # (-1 because we start counting transceivers at 0)
         transceiver_id = utils.port_sort_fn(port_info)[2] - 1
         qsfp_info = qsfp_info_map.get(transceiver_id)
         qsfp_present = None
         if self._qsfp_client:
             # For non QSFP ports (think Fabric port) qsfp_client
             # will not return any information.
             qsfp_present = qsfp_info.present if qsfp_info else False
         attrs = utils.get_status_strs(status, qsfp_present)
         if internal_port:
             speed = attrs['speed']
             if not speed:
                 speed = '-'
             print(field_fmt.format(
                 port_id,
                 port_info.name,
                 attrs['admin_status'],
                 attrs['color_align'],
                 attrs['link_status'],
                 attrs['present'],
                 speed))
         elif status.enabled:
             name = port_info.name if port_info.name else port_id
             print(field_fmt.format(
                 name,
                 attrs['admin_status'],
                 attrs['color_align'],
                 attrs['link_status'],
                 attrs['present'],
                 attrs['speed']))
     if missing_port_status:
         print(utils.make_error_string(
             "Could not get status of ports {}".format(missing_port_status)))
Esempio n. 5
0
 def flap_all_ports(self, flap_time=FLAP_TIME):
     with self._create_agent_client() as client:
         qsfp_info_map = utils.get_qsfp_info_map(
             self._qsfp_client, None, continue_on_error=True)
         resp = client.getPortStatus()
         flapped_ports = []
         for port, status in resp.items():
             if status.enabled and not status.up:
                 qsfp_present = False
                 if status.transceiverIdx and self._qsfp_client:
                     qsfp_info = qsfp_info_map.get(
                         status.transceiverIdx.transceiverId)
                     qsfp_present = qsfp_info.present if qsfp_info else False
                 if qsfp_present:
                     print("Disabling port %d" % (port))
                     client.setPortState(port, False)
                     flapped_ports.append(port)
         time.sleep(flap_time)
         for port in flapped_ports:
             print("Enabling port %d" % (port))
             client.setPortState(port, True)