e25e9c8bc3
This change adds documentation for all of the plugins currently found in the tripleo-ansible repo. This will provide for much greater visability into what we're providing and will allow users and developers to better understand how to consume the available resources. Change-Id: I2f5813095cbadd999bc68235278a9da1f883e01e Signed-off-by: Kevin Carter <kecarter@redhat.com>
179 lines
5.3 KiB
Python
179 lines
5.3 KiB
Python
#!/usr/bin/python
|
|
# -*- coding: utf-8 -*-
|
|
# Copyright (c) 2018 OpenStack Foundation
|
|
# All Rights Reserved.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
# not use this file except in compliance with the License. You may obtain
|
|
# a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
# License for the specific language governing permissions and limitations
|
|
# under the License.
|
|
|
|
from __future__ import absolute_import
|
|
from __future__ import division
|
|
from __future__ import print_function
|
|
|
|
from ansible.module_utils.basic import AnsibleModule
|
|
|
|
import json
|
|
import subprocess
|
|
|
|
ANSIBLE_METADATA = {
|
|
'metadata_version': '1.1',
|
|
'status': ['preview'],
|
|
'supported_by': 'community'
|
|
}
|
|
|
|
DOCUMENTATION = """
|
|
---
|
|
module: Podman
|
|
author:
|
|
- Jill Rouleau (@jillrouleau)
|
|
version_added: '2.8'
|
|
short_description: Manage containers with Podman
|
|
notes: []
|
|
description:
|
|
- Start or stop containers with Podman
|
|
options:
|
|
name:
|
|
description:
|
|
- Name of the container(s) to start or stop.
|
|
required: True
|
|
state:
|
|
description:
|
|
- The desired state for the container.
|
|
default: started
|
|
choices:
|
|
- started
|
|
- stopped
|
|
restart:
|
|
description:
|
|
- Use with started state to force a matching container to be stopped
|
|
and restarted.
|
|
"""
|
|
|
|
EXAMPLES = """
|
|
# Start a container
|
|
- name: Start the myapp container
|
|
podman_container:
|
|
name: myapp
|
|
state: started
|
|
|
|
# Stop a container
|
|
- name: Stop the myapp container
|
|
podman_container:
|
|
name: myapp
|
|
state: stopped
|
|
"""
|
|
|
|
|
|
class PodmanContainerInstance(object):
|
|
"""Gather information about a container instance. """
|
|
def __init__(self, name):
|
|
super(PodmanContainerInstance, self).__init__()
|
|
self.parameters = None
|
|
self.name = name
|
|
output = subprocess.check_output(
|
|
['podman', 'container', 'inspect', self.name],
|
|
universal_newlines=True
|
|
)
|
|
self.parameters = json.loads(output)[0]
|
|
|
|
|
|
class PodmanContainerManager(object):
|
|
|
|
def __init__(self, module, results):
|
|
|
|
super(PodmanContainerManager, self).__init__()
|
|
|
|
self.module = module
|
|
self.results = results
|
|
self.name = self.module.params.get('name')
|
|
self.state = self.module.params.get('state')
|
|
self.restart = self.module.params.get('restart')
|
|
self.executable = \
|
|
self.module.get_bin_path(module.params.get('executable'),
|
|
required=True)
|
|
self.container_instance = PodmanContainerInstance(self.name)
|
|
"""
|
|
so what i actually need to do here is:
|
|
identify if the container already exists and is running or not;
|
|
figure out what the user wants the state to ultimately be;
|
|
act accordingly
|
|
"""
|
|
|
|
if self.state in ['started'] and \
|
|
self.container_instance.parameters['State']['Status'] \
|
|
!= 'running':
|
|
self.start_container(self.name)
|
|
elif self.state in ['started'] and \
|
|
self.container_instance.parameters['State']['Status'] \
|
|
== 'running' and self.restart is True:
|
|
self.stop_container(self.name)
|
|
self.start_container(self.name)
|
|
elif self.state in ['stopped'] and \
|
|
self.container_instance.parameters['State']['Status'] \
|
|
!= 'exited':
|
|
self.stop_container(self.name)
|
|
|
|
def start_container(self, name):
|
|
command = [self.executable, 'start', name]
|
|
self.results['action'].append('Starting container {}'.format(name))
|
|
self.results['changed'] = True
|
|
if not self.module.check_mode:
|
|
rc, out, err = self.module.run_command(command)
|
|
|
|
if rc != 0:
|
|
self.module.fail_json(
|
|
msg="Unable to start container '{0}': '{1}'".format(
|
|
name, err))
|
|
|
|
def stop_container(self, name):
|
|
command = [self.executable, 'stop', name]
|
|
self.results['action'].append('Stopping container {}'.format(name))
|
|
self.results['changed'] = True
|
|
if not self.module.check_mode:
|
|
rc, out, err = self.module.run_command(command)
|
|
|
|
if rc != 0:
|
|
self.module.fail_json(
|
|
msg="Unable to stop container '{0}': '{1}'".format(
|
|
name, err))
|
|
|
|
|
|
def main():
|
|
module = AnsibleModule(
|
|
argument_spec=dict(
|
|
executable=dict(type='str', default='podman'),
|
|
# TODO(jillr): handle lists of containers
|
|
name=dict(type='str'),
|
|
state=dict(type='str', default='started', choices=['started',
|
|
'stopped']),
|
|
restart=dict(type='bool', default=False),
|
|
),
|
|
supports_check_mode=True,
|
|
)
|
|
|
|
results = dict(
|
|
changed=False,
|
|
original_message='',
|
|
message='',
|
|
action=[]
|
|
)
|
|
|
|
if module.check_mode:
|
|
return results
|
|
|
|
PodmanContainerManager(module, results)
|
|
module.exit_json(**results)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|