Adding start and stop actions to os_server_actions

Also making the os_server module allow a server in the possible new
states from the os_server_actions changes
This commit is contained in:
Tony Kinsley 2015-08-23 11:51:28 -07:00 committed by Matt Clay
parent 9ed0a5a920
commit 79f98bffcf
2 changed files with 27 additions and 7 deletions

View file

@ -368,7 +368,7 @@ def _get_server_state(module, cloud):
state = module.params['state'] state = module.params['state']
server = cloud.get_server(module.params['name']) server = cloud.get_server(module.params['name'])
if server and state == 'present': if server and state == 'present':
if server.status != 'ACTIVE': if server.status not in ('ACTIVE', 'SHUTOFF', 'PAUSED', 'SUSPENDED'):
module.fail_json( module.fail_json(
msg="The instance is available but not Active state: " msg="The instance is available but not Active state: "
+ server.status) + server.status)

View file

@ -55,7 +55,7 @@ options:
description: description:
- Perform the given action. The lock and unlock actions always return - Perform the given action. The lock and unlock actions always return
changed as the servers API does not provide lock status. changed as the servers API does not provide lock status.
choices: [pause, unpause, lock, unlock, suspend, resume] choices: [stop, start, pause, unpause, lock, unlock, suspend, resume]
default: present default: present
requirements: requirements:
- "python >= 2.6" - "python >= 2.6"
@ -75,7 +75,9 @@ EXAMPLES = '''
timeout: 200 timeout: 200
''' '''
_action_map = {'pause': 'PAUSED', _action_map = {'stop': 'SHUTOFF',
'start': 'ACTIVE',
'pause': 'PAUSED',
'unpause': 'ACTIVE', 'unpause': 'ACTIVE',
'lock': 'ACTIVE', # API doesn't show lock/unlock status 'lock': 'ACTIVE', # API doesn't show lock/unlock status
'unlock': 'ACTIVE', 'unlock': 'ACTIVE',
@ -87,11 +89,11 @@ _admin_actions = ['pause', 'unpause', 'suspend', 'resume', 'lock', 'unlock']
def _wait(timeout, cloud, server, action): def _wait(timeout, cloud, server, action):
"""Wait for the server to reach the desired state for the given action.""" """Wait for the server to reach the desired state for the given action."""
for count in shade._iterate_timeout( for count in shade._utils._iterate_timeout(
timeout, timeout,
"Timeout waiting for server to complete %s" % action): "Timeout waiting for server to complete %s" % action):
try: try:
server = cloud.get_server(server.id) server = cloud.get_server(server.id)
except Exception: except Exception:
continue continue
@ -110,8 +112,8 @@ def _system_state_change(action, status):
def main(): def main():
argument_spec = openstack_full_argument_spec( argument_spec = openstack_full_argument_spec(
server=dict(required=True), server=dict(required=True),
action=dict(required=True, choices=['pause', 'unpause', 'lock', 'unlock', 'suspend', action=dict(required=True, choices=['stop', 'start', 'pause', 'unpause',
'resume']), 'lock', 'unlock', 'suspend', 'resume']),
) )
module_kwargs = openstack_module_kwargs() module_kwargs = openstack_module_kwargs()
@ -137,6 +139,24 @@ def main():
if module.check_mode: if module.check_mode:
module.exit_json(changed=_system_state_change(action, status)) module.exit_json(changed=_system_state_change(action, status))
if action == 'stop':
if not _system_state_change(action, status):
module.exit_json(changed=False)
cloud.nova_client.servers.stop(server=server.id)
if wait:
_wait(timeout, cloud, server, action)
module.exit_json(changed=True)
if action == 'start':
if not _system_state_change(action, status):
module.exit_json(changed=False)
cloud.nova_client.servers.start(server=server.id)
if wait:
_wait(timeout, cloud, server, action)
module.exit_json(changed=True)
if action == 'pause': if action == 'pause':
if not _system_state_change(action, status): if not _system_state_change(action, status):
module.exit_json(changed=False) module.exit_json(changed=False)