-
Notifications
You must be signed in to change notification settings - Fork 9
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- 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
Showing
2 changed files
with
146 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,96 @@ | ||
#!/usr/bin/python3 | ||
""" | ||
This module implements a xapi plugin to get information from Kalray DPU and it | ||
allows its management. | ||
""" | ||
|
||
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: | ||
"""This class allows to run a command on the Kalray DPU. | ||
A command is an RPC. | ||
""" | ||
def __init__(self, rpc_name, updates): | ||
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""" | ||
client = rpc.client.HTTPJSONRPCClient( | ||
self.server, | ||
self.port, | ||
self.timeout, | ||
self.username, | ||
self.password, | ||
log_level="ERROR") | ||
return client.call(self.rpc_name, self.rpc_params) | ||
|
||
def to_json(status, string): | ||
"""Return the status and the string as a json string""" | ||
return json.dumps({ | ||
'status': status, | ||
'output': string, | ||
}) | ||
|
||
@error_wrapped | ||
def get_devices(_session, args): | ||
"""Get the list of devices available on the Kalray DPU""" | ||
kc = KalrayCmd('bdev_get_bdevs', args) | ||
return to_json('ok', 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 to_json('ok', 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 to_json('ok', kc.call_rpc()) | ||
|
||
@error_wrapped | ||
def create_lvol(_session, _args): | ||
"""Create a new lvol on the Kalray DPU""" | ||
return to_json('failed', "Creation of lvol is not yet implemented") | ||
|
||
@error_wrapped | ||
def delete_lvol(_session, args): | ||
"""Delete the lvol passed as parameter on the Kalray DPU if exists""" | ||
try: | ||
lvol_name = args["name"] | ||
return to_json('failed', f"Deletion of lvol {lvol_name} is not yet implemented") | ||
except KeyError as exc: | ||
raise RuntimeError("No argument found with key 'name'.") from exc | ||
|
||
if __name__ == "__main__": | ||
XenAPIPlugin.dispatch({ | ||
"get_devices": get_devices, | ||
"get_raids": get_raids, | ||
"get_lvs": get_lvs, | ||
"create_lvol": create_lvol, | ||
"delete_lvol": delete_lvol, | ||
}) |