Added 'cephadm list-rdma' command to list RDMA devices and their netdev interfaces
Fixes: https://tracker.ceph.com/issues/75189
Signed-off-by: Shweta Bhosale <Shweta.Bhosale1@ibm.com>
| [--log-dir LOG_DIR] [--logrotate-dir LOGROTATE_DIR]
| [--unit-dir UNIT_DIR] [--verbose] [--timeout TIMEOUT]
| [--retry RETRY] [--no-container-init]
-| {version,pull,inspect-image,ls,list-networks,adopt,rm-daemon,rm-cluster,run,shell,enter,ceph-volume,unit,logs,bootstrap,deploy,check-host,prepare-host,add-repo,rm-repo,install,list-images,update-osd-service}
+| {version,pull,inspect-image,ls,list-networks,list-rdma,adopt,rm-daemon,rm-cluster,run,shell,enter,ceph-volume,unit,logs,bootstrap,deploy,check-host,prepare-host,add-repo,rm-repo,install,list-images,update-osd-service}
| ...
| **cephadm** **list-networks**
+| **cephadm** **list-rdma**
+
| **cephadm** **adopt** [-h] --name NAME --style STYLE [--cluster CLUSTER]
| [--legacy-dir LEGACY_DIR] [--config-json CONFIG_JSON]
| [--skip-firewalld] [--skip-pull]
list IP networks
+list-rdma
+---------
+
+list RDMA devices and their netdev interfaces
ls
--
executes_early,
require_image
)
-from cephadmlib.host_facts import HostFacts, list_networks
+from cephadmlib.host_facts import HostFacts, list_networks, list_rdma
from cephadmlib.ssh import authorize_ssh_key, check_ssh_connectivity
from cephadmlib.daemon_form import (
DaemonForm,
print(json.dumps(r, indent=4, default=serialize_sets))
+
+def command_list_rdma(ctx: CephadmContext) -> None:
+ r = list_rdma(ctx)
+ print(json.dumps(r, indent=4))
+
##################################
'list-networks', help='list IP networks')
parser_list_networks.set_defaults(func=command_list_networks)
+ parser_list_rdma = subparsers.add_parser(
+ 'list-rdma', help='list RDMA devices and their netdev interfaces')
+ parser_list_rdma.set_defaults(func=command_list_rdma)
+
parser_adopt = subparsers.add_parser(
'adopt', help='adopt daemon deployed with a different tool')
parser_adopt.set_defaults(func=command_adopt)
return res
+def list_rdma(ctx: CephadmContext) -> List[Dict[str, str]]:
+ """List RDMA devices by parsing 'rdma link show' output.
+ Returns a list of dicts with keys: link, state, physical_state, netdev.
+ Returns empty list if rdma tool is not installed or command fails.
+ """
+ execstr: Optional[str] = find_executable('rdma')
+ if not execstr:
+ logger.error("'rdma' command not found, no RDMA devices listed")
+ return []
+ try:
+ out, _, _ = call_throws(
+ ctx,
+ [execstr, 'link', 'show'],
+ verbosity=CallVerbosity.QUIET_UNLESS_ERROR,
+ )
+ except Exception as e:
+ logger.error('rdma link show failed: %s', e)
+ return []
+ # Format: link <name> state <state> physical_state <phys> netdev <netdev>
+ pattern = re.compile(
+ r'link\s+(\S+)\s+state\s+(\S+)\s+physical_state\s+(\S+)\s+netdev\s+'
+ r'(\S+)'
+ )
+ result: List[Dict[str, str]] = []
+ for line in out.splitlines():
+ line = line.strip()
+ if not line:
+ continue
+ m = pattern.search(line)
+ if m:
+ result.append(
+ {
+ 'link': m.group(1),
+ 'state': m.group(2),
+ 'physical_state': m.group(3),
+ 'netdev': m.group(4),
+ }
+ )
+ else:
+ logger.debug("Skipped RDMA device '%s', as pattern did not match", line)
+ return result
+
+
def _list_ipv4_networks(
ctx: CephadmContext,
) -> Dict[str, Dict[str, Set[str]]]: