Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 0 additions & 9 deletions contrib/core/actions/sendmail.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,17 +23,8 @@
"required": true,
"position": 2
},
"user": {
"immutable": true
},
"dir": {
"immutable": true
},
"sudo": {
"immutable": true
},
"parallel": {
"immutable": true
}
}
}
6 changes: 0 additions & 6 deletions contrib/core/actions/stormbot_say.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,6 @@
"sudo": {
"immutable": true
},
"user": {
"immutable": true
},
"dir": {
"immutable": true
},
"source": {
"type": "string",
"position": 0
Expand Down
9 changes: 0 additions & 9 deletions contrib/examples/actions/ubuntu_pkg_info.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,17 +11,8 @@
"required": true,
"position": 0
},
"user": {
"immutable": true
},
"dir": {
"immutable": true
},
"sudo": {
"immutable": true
},
"parallel": {
"immutable": true
}
}
}
6 changes: 4 additions & 2 deletions st2actions/st2actions/bootstrap/runnersregistrar.py
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,8 @@ def register_runner_types():
},
'sudo': {
'description': 'The remote command will be executed with sudo.',
'type': 'boolean'
'type': 'boolean',
'default': False
},
'dir': {
'description': 'The working directory where the command will be '
Expand Down Expand Up @@ -158,7 +159,8 @@ def register_runner_types():
},
'sudo': {
'description': 'The remote command will be executed with sudo.',
'type': 'boolean'
'type': 'boolean',
'default': False
},
'dir': {
'description': 'The working directory where the command will be '
Expand Down
10 changes: 7 additions & 3 deletions st2actions/st2actions/utils/param_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -104,14 +104,18 @@ def _get_resolved_runner_params(runner_parameters, action_parameters,
# No override if param is immutable
if param_value.get('immutable', False):
continue

# Check if param exists in action_parameters and if it has a default value then
# pickup the override.
if param_name in action_parameters and 'default' in action_parameters[param_name]:
if param_name in action_parameters:
action_param = action_parameters[param_name]
resolved_params[param_name] = action_param['default']
# No further override if param is immutable
if action_param.get('default', False):
resolved_params[param_name] = action_param['default']

# No further override (from actionexecution) if param is immutable
if action_param.get('immutable', False):
continue

# Finally pick up override from actionexec_runner_parameters
if param_name in actionexec_runner_parameters:
resolved_params[param_name] = actionexec_runner_parameters[param_name]
Expand Down
7 changes: 7 additions & 0 deletions st2actions/tests/unit/test_param_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,8 @@ def test_get_resolved_params(self):
self.assertEqual(runner_params.get('runnerint'), 555)
# Assert that a runner param can be overriden by action param default.
self.assertEqual(runner_params.get('runnerdummy'), 'actiondummy')
# Asser that runner param made immutable in action can use default value in runner.
self.assertEqual(runner_params.get('runnerfoo'), 'FOO')
# Assert that an immutable param cannot be overriden by action param or execution param.
self.assertEqual(runner_params.get('runnerimmutable'), 'runnerimmutable')

Expand Down Expand Up @@ -328,6 +330,10 @@ def _setup_runner_models(cls):
'description': 'Foo int param.',
'type': 'number'
},
'runnerfoo': {
'description': 'Some foo param.',
'default': 'FOO'
},
'runnerdummy': {
'description': 'Dummy param.',
'type': 'string',
Expand Down Expand Up @@ -358,6 +364,7 @@ def _setup_action_models(cls):
'actionstr': {'type': 'string', 'required': True},
'actionint': {'type': 'number', 'default': 10},
'runnerdummy': {'type': 'string', 'default': 'actiondummy', 'immutable': True},
'runnerfoo': {'type': 'string', 'immutable': True},
'runnerimmutable': {'type': 'string', 'default': 'failed_override'},
'actionimmutable': {'type': 'string', 'default': 'actionimmutable', 'immutable': True}
}
Expand Down
10 changes: 7 additions & 3 deletions st2common/st2common/validators/api/action.py
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,10 @@ def _validate_parameters(action_params=None, runner_params=None):
msg = 'Param %s is declared immutable in runner. ' % param + \
'Cannot override in action.'
raise ValueValidationException(msg)
if 'default' not in action_param_meta:
msg = 'Immutable param %s requires a default value.' % param
raise ValueValidationException(msg)
if 'default' not in action_param_meta and 'default' not in runner_param_meta:
msg = 'Immutable param %s requires a default value.' % param
raise ValueValidationException(msg)
else:
if 'default' not in action_param_meta:
msg = 'Immutable param %s requires a default value.' % param
raise ValueValidationException(msg)
14 changes: 14 additions & 0 deletions st2common/tests/unit/test_action_api_validator.py
Original file line number Diff line number Diff line change
Expand Up @@ -82,3 +82,17 @@ def test_validate_action_param_immutable(self):
self.fail('Action validation should not have passed. %s' % json.dumps(action_api_dict))
except ValueValidationException as e:
self.assertTrue('requires a default value.' in e.message)

@mock.patch.object(action_validator, '_is_valid_pack', mock.MagicMock(
return_value=True))
def test_validate_action_param_immutable_no_default(self):
action_api_dict = fixture.ARTIFACTS['actions']['action-immutable-runner-param-no-default']
action_api = ActionAPI(**action_api_dict)

# Runner param sudo is decalred immutable in action but no defualt value
# supplied in action. We should pick up default value from runner.
try:
action_validator.validate_action(action_api)
except ValueValidationException as e:
print(e)
self.fail('Action validation should have passed. %s' % json.dumps(action_api_dict))
11 changes: 11 additions & 0 deletions st2tests/st2tests/fixtures/history/actions.json
Original file line number Diff line number Diff line change
Expand Up @@ -43,5 +43,16 @@
"immutable": true
}
}
},
"action-immutable-runner-param-no-default": {
"runner_type": "run-local",
"name": "action-immutable-param-no-default",
"enabled": true,
"pack": "core",
"parameters": {
"sudo": {
"immutable": true
}
}
}
}
4 changes: 4 additions & 0 deletions st2tests/st2tests/fixtures/history/runners.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,10 @@
},
"cmd": {
"type": "string"
},
"sudo": {
"type": "boolean",
"default": false
}
},
"runner_module": "st2actions.runners.fabricrunner"
Expand Down