Enhance Shaker to support the shell class execution after reboot

agent instance.

Issue: Some of our complex test requires to reboot compute nodes. In
that scenario, if agent instances are on those computes then those
instances will also be rebooted and running shaker test(s) will be
stopped.

At this time this commit is specifically for shaker's shell class
execution as it writes execution script in /tmp directory and we
know that if system/instance is being rebooted then whatever /tmp
directory contains that will be wiped out. So, if user has a choice
to copy that execution script in some specific directory which is
not being impacted (i.e /mnt, /opt etc) after reboot then through
custom test scripts above condition can be handled

Change-Id: I41f824561e36329d07afc9e798eab44b72aeb01a
This commit is contained in:
Dinesh Yadav 2021-01-19 22:42:13 +00:00 committed by Ilya Shakhat
parent d259b94322
commit 159bd35d2f
6 changed files with 35 additions and 4 deletions

View File

@ -1,4 +1,4 @@
usage: shaker-agent [-h] [--agent-id AGENT_ID]
usage: shaker-agent [-h] [--agent-dir AGENT_DIR] [--agent-id AGENT_ID]
[--agent-socket-conn-retries AGENT_SOCKET_CONN_RETRIES]
[--agent-socket-recv-timeout AGENT_SOCKET_RECV_TIMEOUT]
[--agent-socket-send-timeout AGENT_SOCKET_SEND_TIMEOUT]
@ -14,6 +14,10 @@ usage: shaker-agent [-h] [--agent-id AGENT_ID]
optional arguments:
-h, --help show this help message and exit
--agent-dir AGENT_DIR
If specified, directs Shaker to write execution script
for the shell class in agent(s) instance defined
directory. Defaults to /tmp directory.
--agent-id AGENT_ID Agent unique id, defaults to MAC of primary interface.
--agent-socket-conn-retries AGENT_SOCKET_CONN_RETRIES
Prior to exiting, the number of reconnects the Agent

View File

@ -1,4 +1,5 @@
usage: shaker-all-in-one [-h] [--agent-join-timeout AGENT_JOIN_TIMEOUT]
usage: shaker-all-in-one [-h] [--agent-dir AGENT_DIR]
[--agent-join-timeout AGENT_JOIN_TIMEOUT]
[--agent-loss-timeout AGENT_LOSS_TIMEOUT]
[--artifacts-dir ARTIFACTS_DIR] [--book BOOK]
[--cleanup] [--cleanup-on-exit] [--config-dir DIR]
@ -45,6 +46,10 @@ usage: shaker-all-in-one [-h] [--agent-join-timeout AGENT_JOIN_TIMEOUT]
optional arguments:
-h, --help show this help message and exit
--agent-dir AGENT_DIR
If specified, directs Shaker to write execution script
for the shell class in agent(s) instance defined
directory. Defaults to /tmp directory.
--agent-join-timeout AGENT_JOIN_TIMEOUT
Timeout to treat agent as join failed in seconds,
defaults to env[SHAKER_AGENT_JOIN_TIMEOUT] (time

View File

@ -1,4 +1,5 @@
usage: shaker [-h] [--agent-join-timeout AGENT_JOIN_TIMEOUT]
usage: shaker [-h] [--agent-dir AGENT_DIR]
[--agent-join-timeout AGENT_JOIN_TIMEOUT]
[--agent-loss-timeout AGENT_LOSS_TIMEOUT]
[--artifacts-dir ARTIFACTS_DIR] [--book BOOK]
[--cleanup-on-exit] [--config-dir DIR] [--config-file PATH]
@ -32,6 +33,10 @@ usage: shaker [-h] [--agent-join-timeout AGENT_JOIN_TIMEOUT]
optional arguments:
-h, --help show this help message and exit
--agent-dir AGENT_DIR
If specified, directs Shaker to write execution script
for the shell class in agent(s) instance defined
directory. Defaults to /tmp directory.
--agent-join-timeout AGENT_JOIN_TIMEOUT
Timeout to treat agent as join failed in seconds,
defaults to env[SHAKER_AGENT_JOIN_TIMEOUT] (time

View File

@ -153,6 +153,11 @@
# From shaker.engine.config
#
# If specified, directs Shaker to write execution script for the shell class in
# agent(s) instance defined directory. Defaults to /tmp directory. (string
# value)
#agent_dir = <None>
# Address for server connections (host:port), defaults to
# env[SHAKER_SERVER_ENDPOINT]. (string value)
#server_endpoint = <None>

View File

@ -61,13 +61,21 @@ def send_reply(socket, agent_id, result):
def run_command(command):
command_stdout, command_stderr = None, None
start = time.time()
agent_dir = cfg.CONF.agent_dir
if agent_dir:
utils.mkdir_tree(agent_dir)
if command['type'] == 'program':
command_stdout, command_stderr = processutils.execute(
*shlex.split(command['data']), check_exit_code=False)
elif command['type'] == 'script':
file_name = tempfile.mktemp()
if 'agent_dir' in cfg.CONF:
file_name = tempfile.mktemp(dir="%s" % agent_dir)
else:
file_name = tempfile.mktemp()
with open(file_name, mode='w') as fd:
fd.write(command['data'])
LOG.debug('Stored script into %s', file_name)

View File

@ -67,6 +67,10 @@ def generate_output_name():
COMMON_OPTS = [
cfg.StrOpt('agent-dir', default=utils.env('SHAKER_AGENT_DIR'),
help='If specified, directs Shaker to write execution script '
'for the shell class in agent(s) instance defined '
'directory. Defaults to /tmp directory.'),
cfg.Opt('server-endpoint',
default=utils.env('SHAKER_SERVER_ENDPOINT'),
required=True,