Merge pull request #1831 from tkinz27/os_start_stop

Adding start and stop actions to os_server_actions
This commit is contained in:
James Cammarata 2015-09-17 11:19:30 -04:00
commit b743224aa9
2 changed files with 27 additions and 7 deletions

View file

@ -381,7 +381,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,7 +89,7 @@ _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:
@ -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)