Skip to content

Commit

Permalink
Add kalray plugin to configure DPU
Browse files Browse the repository at this point in the history
- Work is in progress and not ready for reviewing...
  - Just add three functions to check that we can do the RPC
  - Need to add creation of lvols

Signed-off-by: Guillaume <[email protected]>
  • Loading branch information
gthvn1 committed Oct 7, 2023
1 parent e9415e0 commit 18bcf16
Show file tree
Hide file tree
Showing 2 changed files with 186 additions and 0 deletions.
68 changes: 68 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,74 @@ $ xe host-call-plugin host-uuid=<uuid> plugin=zfs.py fn=list_zfs_pools
```
(the most pertinent parameter is `mountpoint`)

## XCP-ng Kalray DPU

A xapi plugin to get information about raids, logical volume store (LVS) and
devices that are present on the Kalray DPU. It also allow the management of
logical volumes (LV): creation and deletion. Parameters depends of the name of
the command some are always available:
- *username*: username to use to connect to DPU (required)
- *password*: password to connect to DPU (required)
- *server*: IP of the server for configuring the DPU (default: localhost)
- *port*: Port to use (default: 8080)
- *timeout*: timeout in second (default: 60.0)

## Command details

### Block devices
#### Get the list of devices on the Kalray DPU
```
$ xe host-call-plugin host-uuid=<uuid> plugin=kalray_dpu.py fn=get_devices \
args:username=<username> args:password=<password>
{"status": "ok", "output": [{"name": "HotInNvmeWDS500AFY0-22050C800415n1", "aliases": [], "product_name": "NVMe disk", "block_size": 512, "num_blocks": 976773168, "uuid": "e8238fa6-bf53-0001-001b-448b45afa6a7", "assigned_rate_limits": {"rw_ios_per_sec": 0, "rw_mbytes_per_sec": 0, "r_mbytes_per_sec": 0, "w_mbytes_per_sec": 0}, "claimed": false, "zoned": false, "supported_io_types": {"read": true, "write": true, "unmap": true, "write_zeroes": true, "flush": true, "reset": true, "nvme_admin": true, "nvme_io": true}, "driver_specific": {"nvme": [{"pci_address": "0000:00:00.0", "trid": {"trtype": "PCIe", "traddr": "0000:00:00.0"}, "ctrlr_data": {"cntlid": 8224, "vendor_id": "0x15b7", "model_number": "WDS500G1X0E-00AFY0", "serial_number": "22050C800415", "firmware_revision": "614900WD", "subnqn": "nqn.2018-01.com.wdc:nguid:E8238FA6BF53-0001-001B448B45AFA6A7", "oacs": {"security": 1, "format": 1, "firmware": 1, "ns_manage": 0}, "multi_ctrlr": false, "ana_reporting": false}, "vs": {"nvme_version": "1.4"}, "ns_data": {"id": 1, "can_share": false}, "security": {"opal": false}}], "mp_policy": "active_passive"}}]}
```

### RAID
#### Create a raid on the Kalray DPU
```
$ xe host-call-plugin host-uuid=<uuid> plugin=kalray_dpu.py fn=create_raid \
args:username=<username> args:password=<password>
[...]
```

#### Get the list of raids on the Kalray DPU
```
$ xe host-call-plugin host-uuid=<uuid> plugin=kalray_dpu.py fn=get_raids \
args:username=<username> args:password=<password>
[...]
```

### Logical Volume Store
#### Create an LVS on the Kalray DPU
```
$ xe host-call-plugin host-uuid=<uuid> plugin=kalray_dpu.py fn=create_lvs \
args:username=<username> args:password=<password>
[...]
```

#### Get the list of LVS on the Kalray DPU
```
$ xe host-call-plugin host-uuid=<uuid> plugin=kalray_dpu.py fn=get_lvs \
args:username=<username> args:password=<password>
[...]
```

### Logical Volume
#### Create a new logical volume
```
$ xe host-call-plugin host-uuid=<uuid> plugin=kalray_dpu.py fn=create_lvol \
args:username=<username> args:password=<password>
[...]
```

#### Delete a logical volume
```
$ xe host-call-plugin host-uuid=<uuid> plugin=kalray_dpu.py fn=delete_lvol \
args:username=<username> args:password=<password> \
args:name=<lvol_name>
[...]
```

## XCP-ng LVM

A xapi plugin to list, create and destroy PVs, VGs and LVMs on a host.
Expand Down
118 changes: 118 additions & 0 deletions SOURCES/etc/xapi.d/plugins/kalray_dpu.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
#!/usr/bin/python3
"""XAPI plugin to manage Kalray DPU."""

import json
import XenAPIPlugin # pylint: disable=import-error

from kalray.acs.spdk import rpc # pylint: disable=import-error
from xcpngutils import error_wrapped

class KalrayCmd:
"""Describe a command to be ran on the Kalray DPU."""

def __init__(self, rpc_name: str, updates: dict):
self.server = 'localhost'
self.port = 8080
self.username = None
self.password = None
self.timeout = 60.0
self.rpc_name = rpc_name
self.rpc_params = {}

for k, v in updates.items():
if hasattr(self, k):
setattr(self, k, v)

# Check that username & password are well set
assert self.username is not None
assert self.password is not None

def add_rpc_params(self, key, value):
"""Adds a parameter that will be passed to the RPC."""
self.rpc_params[key] = value

def call_rpc(self):
"""Do the RPC call."""
try:
client = rpc.client.HTTPJSONRPCClient(
self.server,
self.port,
self.timeout,
self.username,
self.password,
log_level="ERROR")
message = client.call(self.rpc_name, self.rpc_params)
except rpc.client.JSONRPCException as exc:
raise XenAPIPlugin.Failure("-1", exc.message)

return json.dumps(message)

@error_wrapped
def get_devices(_session, args):
"""Get the list of devices available on the Kalray DPU."""
kc = KalrayCmd('bdev_get_bdevs', args)
return kc.call_rpc()

@error_wrapped
def create_raid(_session, args):
"""Create a raid."""
kc = KalrayCmd('bdev_raid_create', args)
kc.add_rpc_params('name', 'raid0')
kc.add_rpc_params('raid_level', 'raid0')
kc.add_rpc_params('strip_size_kb', 128)
kc.add_rpc_params('persist', True)
kc.add_rpc_params('split_dp', True)
kc.add_rpc_params('base_bdevs',
["HotInNvmeWDS500AFY0-22050C800415n1",
"HotInNvmeWDS500AFY0-22050C800378n1"])
return kc.call_rpc()

@error_wrapped
def get_raids(_session, args):
"""Get the list of raids available on the Kalray DPU."""
kc = KalrayCmd('bdev_raid_get_bdevs', args)
kc.add_rpc_params('category', 'all')
return kc.call_rpc()

@error_wrapped
def create_lvs(_session, args):
"""Create a logical volume store."""
kc = KalrayCmd('bdev_lvol_create_lvstore', args)
kc.add_rpc_params('bdev_name', 'raid0')
kc.add_rpc_params('lvs_name', 'lvs')
return kc.call_rpc()

@error_wrapped
def get_lvs(_session, args):
"""Get the list of logical volume stores available on the Kalray DPU."""
kc = KalrayCmd('bdev_lvol_get_lvstores', args)
return kc.call_rpc()

@error_wrapped
def create_lvol(_session, args):
"""Create a new lvol on the Kalray DPU."""
kc = KalrayCmd('bdev_lvol_create', args)
kc.add_rpc_params('lvol_name', 'volume_09')
kc.add_rpc_params('size', 1048576000)
kc.add_rpc_params('lvs_name', 'lvs')
return kc.call_rpc()

@error_wrapped
def delete_lvol(_session, args):
"""Delete the lvol passed as parameter on the Kalray DPU if exists."""
try:
lvol_name = args["name"]
raise XenAPIPlugin.Failure("-1", f"Deletion of lvol {lvol_name} is not yet implemented")
except KeyError as exc:
raise XenAPIPlugin.Failure("-1", "No argument found with key 'name'.") from exc

if __name__ == "__main__":
XenAPIPlugin.dispatch({
"get_devices": get_devices,
"create_raid": create_raid,
"get_raids": get_raids,
"create_lvs": create_lvs,
"get_lvs": get_lvs,
"create_lvol": create_lvol,
"delete_lvol": delete_lvol,
})

0 comments on commit 18bcf16

Please sign in to comment.