From: Ondrej Lichtner <olichtne(a)redhat.com>
Moving the device related rpc_calls from the RemoteDevice class into the
Machine class which already provides abstractions for all the other rpc
calls that we do. It's also a good place to organize the creation of
Device related event results and add them to the current run log of the
recipe.
Signed-off-by: Ondrej Lichtner <olichtne(a)redhat.com>
---
lnst/Controller/Machine.py | 56 ++++++++++++++++++++++++++++++++++--
lnst/Devices/RemoteDevice.py | 19 ++++++------
2 files changed, 61 insertions(+), 14 deletions(-)
diff --git a/lnst/Controller/Machine.py b/lnst/Controller/Machine.py
index a74b5a9..5fd5c88 100644
--- a/lnst/Controller/Machine.py
+++ b/lnst/Controller/Machine.py
@@ -20,7 +20,7 @@
from lnst.Common.Version import lnst_version
from lnst.Controller.Common import ControllerError
from lnst.Controller.CtlSecSocket import CtlSecSocket
-from lnst.Controller.RecipeResults import JobStartResult, JobFinishResult
+from lnst.Controller.RecipeResults import JobStartResult, JobFinishResult,
DeviceCreateResult, DeviceMethodCallResult, DeviceAttrSetResult
from lnst.Controller.SlaveObject import SlaveObject
from lnst.Devices import device_classes
from lnst.Devices.Device import Device
@@ -121,6 +121,14 @@ def remote_device_create(self, dev, netns=None):
dev_clsname = dev._dev_cls.__name__
dev_args = dev._dev_args
dev_kwargs = dev._dev_kwargs
+
+ self._add_recipe_result(
+ DeviceCreateResult(
+ success=True,
+ device=dev,
+ )
+ )
+
ret = self.rpc_call("create_device", clsname=dev_clsname,
args=dev_args,
kwargs=dev_kwargs,
@@ -132,6 +140,44 @@ def remote_device_create(self, dev, netns=None):
def remote_device_set_netns(self, dev, dst, src):
self.rpc_call("set_dev_netns", dev, dst.name, netns=src)
+ def remote_device_method(self, index, method_name, args, kwargs, netns):
+ config_res = DeviceMethodCallResult(
+ success=True,
+ device=self._device_database[index],
+ method_name=method_name,
+ args=args,
+ kwargs=kwargs,
+ )
+ self._add_recipe_result(config_res)
+
+ try:
+ res = self.rpc_call("dev_method", index, method_name, args,
kwargs,
+ netns=netns)
+ except:
+ config_res.success = False
+ raise
+ return res
+
+ def remote_device_setattr(self, index, attr_name, value, netns):
+ config_res = DeviceAttrSetResult(
+ success=True,
+ device=self._device_database[index],
+ attr_name=attr_name,
+ value=value,
+ old_value=getattr(self._device_database[index], attr_name),
+ )
+ self._add_recipe_result(config_res)
+
+ try:
+ res = self.rpc_call("dev_setattr", index, attr_name, value,
netns=netns)
+ except:
+ config_res.success = False
+ raise
+ return res
+
+ def remote_device_getattr(self, index, attr_name, netns):
+ return self.rpc_call("dev_getattr", index, attr_name, netns=netns)
+
def device_created(self, dev_data):
ifindex = dev_data["ifindex"]
if ifindex not in self._device_database:
@@ -263,6 +309,10 @@ def start_recipe(self, recipe):
def stop_recipe(self):
self._recipe = None
+ def _add_recipe_result(self, result):
+ if self._recipe:
+ self._recipe.current_run.add_result(result)
+
def _send_device_classes(self):
for cls_name, cls in device_classes:
self.send_class(cls)
@@ -357,7 +407,7 @@ def run_job(self, job):
logging.info("Job description: %s" % job._desc)
job_result = JobStartResult(job, True)
- self._recipe.current_run.add_result(job_result)
+ self._add_recipe_result(job_result)
job_result.success = self.rpc_call("run_job", job._to_dict(),
netns=job.netns)
@@ -397,7 +447,7 @@ def job_finished(self, msg):
job_id = msg["job_id"]
job = self._jobs[job_id]
job._res = msg["result"]
- self._recipe.current_run.add_result(JobFinishResult(job))
+ self._add_recipe_result(JobFinishResult(job))
def kill(self, job, signal):
if job.id not in self._jobs:
diff --git a/lnst/Devices/RemoteDevice.py b/lnst/Devices/RemoteDevice.py
index 1f2c286..17bc52b 100644
--- a/lnst/Devices/RemoteDevice.py
+++ b/lnst/Devices/RemoteDevice.py
@@ -120,16 +120,14 @@ def __getattr__(self, name):
raise DeviceReadOnly("Can't call methods when in ReadOnly cache
mode.")
def dev_method(*args, **kwargs):
- return self._machine.rpc_call("dev_method", self.ifindex,
- name, args, kwargs,
- netns=self.netns)
+ return self._machine.remote_device_method(
+ self.ifindex, name, args, kwargs, self.netns)
return dev_method
else:
if self._cached:
return self._cache[name]
- return self._machine.rpc_call("dev_getattr", self.ifindex, name,
- netns=self.netns)
+ return self._machine.remote_device_getattr(self.ifindex, name, self.netns)
def __setattr__(self, name, value):
if not self._inited:
@@ -137,15 +135,14 @@ def __setattr__(self, name, value):
try:
getattr(self._dev_cls, name)
-
- if self._cached:
- raise DeviceReadOnly("Can't set attributes when in ReadOnly
cache mode.")
-
- return self._machine.rpc_call("dev_setattr", self.ifindex, name,
value,
- netns=self.netns)
except AttributeError:
return super(RemoteDevice, self).__setattr__(name, value)
+ if self._cached:
+ raise DeviceReadOnly("Can't set attributes when in ReadOnly cache
mode.")
+
+ return self._machine.remote_device_setattr(self.ifindex, name, value,
netns=self.netns)
+
def __iter__(self):
for x in dir(self._dev_cls):
if x[0] == '_' or x[0:1] == "__":
--
2.21.0