Protocols¶
A protocol in LAVA is a method of interacting with external services using the supported APIs instead of with direct shell commands. The protocol defines which APIs are available, and the job pipeline determines when the API call is made.
Note that not all protocols can be called from all actions and not all protocols are able to share data between actions.
MultiNode¶
The MultiNode protocol allows multiple devices to work together as a group, synchronizing operations and sharing data between them.
API¶
The MultiNode API provides helper scripts that are available inside the test shell on the DUT. The APIs can be used from the LAVA test shell definitions to pass messages between devices in a group.
See MultiNode job definition for job example.
lava-group¶
Print one line per device in the group:
lava-group
Output format: <job_id>\t<role>:
12345 client
12346 loadbalancer
12347 backend
12348 backend
Print job IDs for devices with the specified role, one per line:
lava-group <role>
Example output:
$ lava-group client
12345
$ lava-group backend
12347
12348
Exit with non-zero if the role doesn't exist:
$ lava-group server ; echo $?
1
lava-role¶
Print the role of the current device:
lava-role
Example output:
server
Print all roles in the MultiNode group, one role per line:
lava-role list
Example output:
server
client
lava-self¶
Report the job ID of the current device:
lava-self
lava-send¶
Sends a message to the group with optional key-value data. This is non-blocking — the message is guaranteed to be available to all members, but some may never retrieve it.
The message ID is persistent for the lifetime of the group. Re-sending a different message with the same ID is not supported.
lava-send <message-id> [key1=val1 [key2=val2] ...]
Warning
In the whitespace-separated key=value pairs, the key name must match the
\w+ pattern. This means only letters (a–z, A–Z), digits (0–9), and
underscore (_) are allowed in the key name. In the values, quoted
white spaces are allowed.
lava-sync¶
Global synchronization primitive. Sends a message, and waits for the same message from all the other devices.
lava-sync <message>
Note
All devices in the group must call lava-sync with the same message,
otherwise it will block until timeout. lava-sync foo is effectively the
same as lava-send foo followed by lava-wait-all foo.
lava-wait¶
Blocks until any device in the group sends a message with the given ID.
lava-wait <message-id>
Data from the message is written to /tmp/lava_multi_node_cache.txt as
key=value pairs.
Note
The message ID data is persistent for the life of the MultiNode group. The
data can be retrieved at any later stage using lava-wait and as the data
is already available, there will be no waiting time for repeat calls. If
devices continue to send data with the associated message ID, that new data
will continue to be added to the stored data for that message ID and will be
returned by subsequent calls to lava-wait for that message ID. Use
different message ID(s) if you don’t want this effect.
lava-wait-all¶
lava-wait-all operates in different ways, depending on the presence of the
role parameter.
Waits until all devices in the group send a message with the given ID.
Every device must use lava-send with the same ID, or this call will block
until the timeout.
lava-wait-all <message-id>
Wait until all devices with the specified role send the message:
lava-wait-all <message-id> <role>
As with lava-wait, the message ID is persistent for the duration of the
MultiNode group, and the key-value pairs with the message will be stored in the
cache file.
Request¶
This protocol allows actions within the pipeline to make requests using the MultiNode API outside a test definition by wrapping the call inside the protocol. This allows synchronization to happen during deploy or boot, not just within test shells.
Actions check for protocol calls at the start of the run step. Only the named action instance inside the pipeline will make the call. The use of the protocol requests is an advanced use of LAVA and relies on the test job writer carefully planning how the job will work.
See MultiNode job definition for job example.
lava-send¶
Send a message with optional key-value message to the group:
protocols:
lava-multinode:
- action: prepare-scp-overlay
request: lava-send
messageID: ipv4
message:
ipaddr: '<value>'
timeout:
minutes: 5
lava-sync¶
Synchronize all devices in the group at a specific point in the pipeline:
protocols:
lava-multinode:
- action: prepare-scp-overlay
request: lava-sync
messageID: start
timeout:
minutes: 5
lava-wait¶
Waits for any device in the group to send a message with the given ID. To
update the value available to the action, ensure the key exists in the matching
lava-send and prefix the value with $ in the job submission:
protocols:
lava-multinode:
- action: prepare-scp-overlay
request: lava-wait
messageID: ipv4
message:
ipaddr: $ipaddr
timeout:
minutes: 5
This makes the received data available to the action:
{'message': {'ipaddr': '192.168.0.3'}, 'messageID': 'ipv4'}
lava-wait-all¶
Wait for all devices to send a message:
protocols:
lava-multinode:
- action: prepare-scp-overlay
request: lava-wait-all
messageID: ipv4
message:
ipaddr: $ipaddr
timeout:
minutes: 5
Wait for all devices with a specific role to send a message:
protocols:
lava-multinode:
- action: prepare-scp-overlay
request: lava-wait-all
role: server
messageID: ipv4
message:
ipaddr: $ipaddr
timeout:
minutes: 5