tripleo-ansible/tripleo_ansible/ansible_plugins/modules/container_startup_config.py
Emilien Macchi 1f3ecf2a85 container_startup_config: remove old startup config files
These files aren't needed anymore, since we generate one JSON per
container in its step directory.
We now make sure these files don't exist so there is no confusion.

Change-Id: I9674102d6b3686206eec78f8d6f4408988a69b7b
2020-07-13 10:03:03 -04:00

148 lines
4.3 KiB
Python

#!/usr/bin/python
# -*- coding: utf-8 -*-
# Copyright 2020 Red Hat, Inc.
# 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.
__metaclass__ = type
import glob
import json
import os
import shutil
import yaml
from ansible.module_utils.basic import AnsibleModule
DOCUMENTATION = """
---
module: container_startup_config
author:
- "TripleO team"
version_added: '2.9'
short_description: Generate startup containers configs
notes: []
description:
- It will generate container startup configs that will be consumed by the
tripleo-container-manage role that is using podman_container module.
requirements:
- None
options:
config_base_dir:
description:
- Config base directory
type: str
default: '/var/lib/tripleo-config/container-startup-config'
config_data:
description:
- Dictionary of container configs data
type: dict
required: true
"""
EXAMPLES = """
- name: Generate startup container config for all the steps
container_startup_config:
config_data:
step_1:
haproxy:
image: docker.io/haproxy
memcached:
image: docker.io/memcached
step_2:
mysql:
image: docker.io/mysql
"""
class ContainerStartupManager:
"""Class for container_startup_config module."""
def __init__(self, module, results):
super(ContainerStartupManager, self).__init__()
self.module = module
self.results = results
# parse args
args = self.module.params
# Set parameters
self.config_base_dir = args['config_base_dir']
self.config_data = args['config_data']
# Cleanup old configs created by previous releases
self._cleanup_old_configs()
# Create config_base_dir
if not os.path.exists(self.config_base_dir):
os.makedirs(self.config_base_dir)
os.chmod(self.config_base_dir, 0o600)
self.results['changed'] = True
# Generate the container configs per step
for step, step_config in self.config_data.items():
step_dir = os.path.join(self.config_base_dir, step)
# Note: it'll cleanup old configs before creating new ones.
# TODO(emilien) add idempotency so we only remove the needed files
self._recreate_dir(step_dir)
for container, container_config in step_config.items():
container_config_path = os.path.join(self.config_base_dir,
step, container + '.json')
self._create_config(container_config_path, container_config)
self.module.exit_json(**self.results)
def _recreate_dir(self, path):
"""Creates a directory.
:param path: string
"""
shutil.rmtree(path, ignore_errors=True)
os.makedirs(path)
def _create_config(self, path, config):
"""Update a container config.
:param path: string
:param config: string
"""
with open(path, "wb") as config_file:
config_file.write(json.dumps(config, indent=2).encode('utf-8'))
os.chmod(path, 0o600)
self.results['changed'] = True
def _cleanup_old_configs(self):
"""Cleanup old container configurations from previous releases.
"""
pattern = '*docker-container-startup-config*.json'
old_configs = glob.glob(os.path.join('/var/lib/tripleo-config',
pattern))
for config in old_configs:
os.remove(config)
def main():
module = AnsibleModule(
argument_spec=yaml.safe_load(DOCUMENTATION)['options'],
supports_check_mode=True,
)
results = dict(
changed=False
)
ContainerStartupManager(module, results)
if __name__ == '__main__':
main()