From 86f231c5edfdc1db826e98811e76a85e2d1c1d9a Mon Sep 17 00:00:00 2001 From: Emilien Macchi Date: Tue, 19 May 2020 17:49:59 -0400 Subject: [PATCH] Add operator for tripleo container image build This new operator will allow to build TripleO container images using the v2 interface in tripleoclient. Change-Id: I6d1061292aa338c48f970848ff274b7e81d71b33 --- playbooks/container-build.yaml | 37 +++ roles/tripleo_container_image_build/README.md | 69 ++++++ .../defaults/main.yml | 27 +++ .../meta/main.yml | 42 ++++ .../molecule/default/converge.yml | 216 ++++++++++++++++++ .../molecule/default/molecule.yml | 19 ++ .../molecule/default/prepare.yml | 8 + .../tasks/main.yml | 67 ++++++ .../tests/inventory | 1 + .../tests/test.yml | 5 + zuul.d/molecule.yaml | 16 ++ 11 files changed, 507 insertions(+) create mode 100644 playbooks/container-build.yaml create mode 100644 roles/tripleo_container_image_build/README.md create mode 100644 roles/tripleo_container_image_build/defaults/main.yml create mode 100644 roles/tripleo_container_image_build/meta/main.yml create mode 100644 roles/tripleo_container_image_build/molecule/default/converge.yml create mode 100644 roles/tripleo_container_image_build/molecule/default/molecule.yml create mode 100644 roles/tripleo_container_image_build/molecule/default/prepare.yml create mode 100644 roles/tripleo_container_image_build/tasks/main.yml create mode 100644 roles/tripleo_container_image_build/tests/inventory create mode 100644 roles/tripleo_container_image_build/tests/test.yml diff --git a/playbooks/container-build.yaml b/playbooks/container-build.yaml new file mode 100644 index 0000000..51254fb --- /dev/null +++ b/playbooks/container-build.yaml @@ -0,0 +1,37 @@ +--- +############################################################################### +# Container Image Build playbook +# +# Description: +# This is a basic playbook to perform the basic container image build actions +# for TripleO containers. +# +############################################################################### +- hosts: undercloud + collections: + - tripleo.operator + vars: + build_debug: true + registry: quay.io/tripleomaster + tag: current-tripleo + + tasks: + - name: Gather the rpm package facts + package_facts: + + - name: Check if tripleoclient is installed + fail: + msg: >- + TripleO Client is not installed. Please make sure that the client + has been installed and the repositories are properly configured. + when: (ansible_facts.distribution_major_version|int <= 7 and not 'python2-tripleoclient' in ansible_facts.packages) or + (ansible_facts.distribution_major_version|int >= 8 and not 'python3-tripleoclient' in ansible_facts.packages) + + - name: Run container image build + include_role: + name: tripleo_container_image_build + vars: + tripleo_container_image_build_debug: "{{ build_debug }}" + tripleo_container_image_build_registry: "{{ registry }}" + tripleo_container_image_build_tag: "{{ tag }}" + tripleo_container_image_build_push: true diff --git a/roles/tripleo_container_image_build/README.md b/roles/tripleo_container_image_build/README.md new file mode 100644 index 0000000..e9ec923 --- /dev/null +++ b/roles/tripleo_container_image_build/README.md @@ -0,0 +1,69 @@ +tripleo_container_image_build +============================= + +A role to perform the container image build process. + +Requirements +------------ + +None. + +Role Variables +-------------- + +* `tripleo_container_image_build_authfile`: (String) Path of the authentication file. Default: '' +* `tripleo_container_image_build_base`: (String) Name of the base image. Can also specify a tag , e.g. ubi8:latest. Default: '' +* `tripleo_container_image_build_config_file`: (String) YAML Config file specifying the images to build. Default: '' +* `tripleo_container_image_build_config_path`: (String) YAML Config path where image configs are stored. Default: '' +* `tripleo_container_image_build_debug`: (Boolean) Flag to print out the delete command. Default: False +* `tripleo_container_image_build_distro`: (String) Ability to override the distro name; e.g. rhel. Default: '' +* `tripleo_container_image_build_excludes`: (List) Name of containers to exclude from the build. Default: [] +* `tripleo_container_image_build_extra_config`: (String) YAML Config file specifying the extra metadata to override; e.g. labels. Default: '' +* `tripleo_container_image_build_generate_scripts_only`: (Boolean) Do not run the actual command - to be used in conjonction with `tripleo_container_image_build_generate_scripts`. By default uses the value of `tripleo_generate_scripts_only` or False if `tripleo_generate_scripts_only` is not defined. +* `tripleo_container_image_build_generate_scripts`: (Boolean) Write out a shell script that can be used to reproduce the command being executed. By default uses the value of `tripleo_generate_scripts` or False if `tripleo_generate_scripts` is not defined. +* `tripleo_container_image_build_home_dir` (String): Path to the home directory. Default: {{ ansible_env.HOME }} +* `tripleo_container_image_build_log` (String): Path to the log file. Default to {{ tripleo_container_image_build_home_dir }}/container_image_build.log +* `tripleo_container_image_build_log_combine`: (Boolean) Whether or not we combine the logs. Default: True +* `tripleo_container_image_build_log_output`: (Boolean) Whether or not we output the logs. Default: True +* `tripleo_container_image_build_namespace`: (String) Namespace for the container images. Default: '' +* `tripleo_container_image_build_poll`: (Integer) Number of seconds to wait between each checks to see if the command has completed. Default: 10 +* `tripleo_container_image_build_prefix`: (String) Prefix for the container images names. Default: '' +* `tripleo_container_image_build_push`: (Boolean) Whether or not we push the container images to the registry. Default: False +* `tripleo_container_image_build_registry`: (String) URL of the container image registry. Default: '' +* `tripleo_container_image_build_skip_build`: (Boolean) Whether or not we skip the container image build and just generate configs. Default: False +* `tripleo_container_image_build_tag`: (String) Tag for the container images. Default: '' +* `tripleo_container_image_build_timeout`: (Integer) Number in seconds to wait for the ansible execution of the build command to finish. Default: 5700 +* `tripleo_container_image_build_volumes`: (List) Volume to bind mount during the container image builds. Default: [] +* `tripleo_container_image_build_work_dir`: (String) Tripleo container builds directory. + +Output Variables +---------------- + +* `tripleo_container_image_build_output`: (String) The command standard output. +* `tripleo_container_image_build_result`: Ansible shell execution results + +Dependencies +------------ + +None. + +Example Playbook +---------------- + +Example container images build. + +```yaml +- hosts: undercloud + gather_facts: true + tasks: + - name: Build containers + import_role: + name: tripleo_container_image_build + var: + tripleo_container_image_build_debug: true +``` + +License +------- + +Apache-2.0 diff --git a/roles/tripleo_container_image_build/defaults/main.yml b/roles/tripleo_container_image_build/defaults/main.yml new file mode 100644 index 0000000..98bc295 --- /dev/null +++ b/roles/tripleo_container_image_build/defaults/main.yml @@ -0,0 +1,27 @@ +# defaults file for tripleo_container_image_build +--- +openstack_bin: openstack +tripleo_container_image_build_authfile: +tripleo_container_image_build_base: +tripleo_container_image_build_config_file: +tripleo_container_image_build_config_path: +tripleo_container_image_build_debug: false +tripleo_container_image_build_distro: +tripleo_container_image_build_excludes: [] +tripleo_container_image_build_extra_config: +tripleo_container_image_build_generate_scripts_only: "{{ tripleo_generate_scripts_only | default(False) }}" +tripleo_container_image_build_generate_scripts: "{{ tripleo_generate_scripts | default(False) }}" +tripleo_container_image_build_home_dir: "{{ ansible_env.HOME }}" +tripleo_container_image_build_log: "{{ tripleo_container_image_build_home_dir }}/container_image_build.log" +tripleo_container_image_build_log_combine: true +tripleo_container_image_build_log_output: true +tripleo_container_image_build_namespace: +tripleo_container_image_build_poll: 10 +tripleo_container_image_build_prefix: +tripleo_container_image_build_push: false +tripleo_container_image_build_registry: +tripleo_container_image_build_skip_build: false +tripleo_container_image_build_tag: +tripleo_container_image_build_timeout: 5700 +tripleo_container_image_build_volumes: [] +tripleo_container_image_build_work_dir: diff --git a/roles/tripleo_container_image_build/meta/main.yml b/roles/tripleo_container_image_build/meta/main.yml new file mode 100644 index 0000000..97dc3ab --- /dev/null +++ b/roles/tripleo_container_image_build/meta/main.yml @@ -0,0 +1,42 @@ +--- +# 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. + + +galaxy_info: + author: OpenStack + description: TripleO Operator Role -- tripleo_container_image_build + company: Red Hat + license: Apache-2.0 + min_ansible_version: 2.8 + # + # Provide a list of supported platforms, and for each platform a list of versions. + # If you don't wish to enumerate all versions for a particular platform, use 'all'. + # To view available platforms and versions (or releases), visit: + # https://galaxy.ansible.com/api/v1/platforms/ + # + platforms: + - name: CentOS + versions: + - 7 + - 8 + + galaxy_tags: + - tripleo + + +# List your role dependencies here, one per line. Be sure to remove the '[]' above, +# if you add dependencies to this list. +dependencies: [] diff --git a/roles/tripleo_container_image_build/molecule/default/converge.yml b/roles/tripleo_container_image_build/molecule/default/converge.yml new file mode 100644 index 0000000..6b65746 --- /dev/null +++ b/roles/tripleo_container_image_build/molecule/default/converge.yml @@ -0,0 +1,216 @@ +--- +- name: Converge + hosts: all + collections: + - tripleo.operator + vars: + openstack_bin: echo + tripleo_container_image_build_poll: 1 + tripleo_container_image_build_log_output: false + tripleo_container_image_build_log_combine: false + tasks: + + - name: "Include tripleo_container_image_build" + include_role: + name: "tripleo_container_image_build" + + - name: Check role + assert: + that: + - tripleo_container_image_build_output == "tripleo container image build" + + - name: Check parameter "tripleo_container_image_build_authfile" + include_role: + name: "tripleo_container_image_build" + vars: + tripleo_container_image_build_authfile: /tmp/secure.json + + - name: Assert "tripleo_container_image_build_authfile" + assert: + that: + - tripleo_container_image_build_output == + "tripleo container image build --authfile /tmp/secure.json" + + - name: Check parameter "tripleo_container_image_build_base" + include_role: + name: "tripleo_container_image_build" + vars: + tripleo_container_image_build_base: ubi8:latest + + - name: Assert "tripleo_container_image_build_base" + assert: + that: + - tripleo_container_image_build_output == + "tripleo container image build --base ubi8:latest" + + - name: Check parameter "tripleo_container_image_build_config_file" + include_role: + name: "tripleo_container_image_build" + vars: + tripleo_container_image_build_config_file: /tmp/tripleo_containers.yaml + + - name: Assert "tripleo_container_image_build_config_file" + assert: + that: + - tripleo_container_image_build_output == + "tripleo container image build --config-file /tmp/tripleo_containers.yaml" + + - name: Check parameter "tripleo_container_image_build_config_path" + include_role: + name: "tripleo_container_image_build" + vars: + tripleo_container_image_build_config_path: /tmp/configs + + - name: Assert "tripleo_container_image_build_config_path" + assert: + that: + - tripleo_container_image_build_output == + "tripleo container image build --config-path /tmp/configs" + + - name: Check parameter "tripleo_container_image_build_debug" + include_role: + name: "tripleo_container_image_build" + vars: + tripleo_container_image_build_debug: true + + - name: Assert "tripleo_container_image_build_debug" + assert: + that: + - tripleo_container_image_build_output == + "tripleo container image build --debug" + + - name: Check parameter "tripleo_container_image_build_distro" + include_role: + name: "tripleo_container_image_build" + vars: + tripleo_container_image_build_distro: fedora + + - name: Assert "tripleo_container_image_build_distro" + assert: + that: + - tripleo_container_image_build_output == + "tripleo container image build --distro fedora" + + - name: Check parameter "tripleo_container_image_build_excludes" + include_role: + name: "tripleo_container_image_build" + vars: + tripleo_container_image_build_excludes: + - keystone + - nova_api + + - name: Assert "tripleo_container_image_build_excludes" + assert: + that: + - tripleo_container_image_build_output == + "tripleo container image build --exclude keystone --exclude nova_api" + + - name: Check parameter "tripleo_container_image_build_extra_config" + include_role: + name: "tripleo_container_image_build" + vars: + tripleo_container_image_build_extra_config: my_config.yaml + + - name: Assert "tripleo_container_image_build_extra_config" + assert: + that: + - tripleo_container_image_build_output == + "tripleo container image build --extra-config my_config.yaml" + + - name: Check parameter "tripleo_container_image_build_namespace" + include_role: + name: "tripleo_container_image_build" + vars: + tripleo_container_image_build_namespace: masterchef + + - name: Assert "tripleo_container_image_build_namespace" + assert: + that: + - tripleo_container_image_build_output == + "tripleo container image build --namespace masterchef" + + - name: Check parameter "tripleo_container_image_build_prefix" + include_role: + name: "tripleo_container_image_build" + vars: + tripleo_container_image_build_prefix: os + + - name: Assert "tripleo_container_image_build_prefix" + assert: + that: + - tripleo_container_image_build_output == + "tripleo container image build --prefix os" + + - name: Check parameter "tripleo_container_image_build_push" + include_role: + name: "tripleo_container_image_build" + vars: + tripleo_container_image_build_push: true + + - name: Assert "tripleo_container_image_build_push" + assert: + that: + - tripleo_container_image_build_output == + "tripleo container image build --push" + + - name: Check parameter "tripleo_container_image_build_registry" + include_role: + name: "tripleo_container_image_build" + vars: + tripleo_container_image_build_registry: localhost:8787 + + - name: Assert "tripleo_container_image_build_registry" + assert: + that: + - tripleo_container_image_build_output == + "tripleo container image build --registry localhost:8787" + + - name: Check parameter "tripleo_container_image_build_skip_build" + include_role: + name: "tripleo_container_image_build" + vars: + tripleo_container_image_build_skip_build: true + + - name: Assert "tripleo_container_image_build_skip_build" + assert: + that: + - tripleo_container_image_build_output == + "tripleo container image build --skip-build" + + - name: Check parameter "tripleo_container_image_build_tag" + include_role: + name: "tripleo_container_image_build" + vars: + tripleo_container_image_build_tag: current + + - name: Assert "tripleo_container_image_build_tag" + assert: + that: + - tripleo_container_image_build_output == + "tripleo container image build --tag current" + + - name: Check parameter "tripleo_container_image_build_volumes" + include_role: + name: "tripleo_container_image_build" + vars: + tripleo_container_image_build_volumes: + - '/etc:/etc' + - '/mydir:/mydir' + + - name: Assert "tripleo_container_image_build_volumes" + assert: + that: + - tripleo_container_image_build_output == + "tripleo container image build --volume /etc:/etc --volume /mydir:/mydir" + + - name: Check parameter "tripleo_container_image_build_work_dir" + include_role: + name: "tripleo_container_image_build" + vars: + tripleo_container_image_build_work_dir: /work + + - name: Assert "tripleo_container_image_build_work_dir" + assert: + that: + - tripleo_container_image_build_output == + "tripleo container image build --work-dir /work" diff --git a/roles/tripleo_container_image_build/molecule/default/molecule.yml b/roles/tripleo_container_image_build/molecule/default/molecule.yml new file mode 100644 index 0000000..2841806 --- /dev/null +++ b/roles/tripleo_container_image_build/molecule/default/molecule.yml @@ -0,0 +1,19 @@ +--- +driver: + name: delegated + options: + managed: false + ansible_connection_options: + ansible_connection: local +log: true +platforms: + - name: instance +provisioner: + name: ansible +scenario: + name: default + test_sequence: + - prepare + - syntax + - converge + - verify diff --git a/roles/tripleo_container_image_build/molecule/default/prepare.yml b/roles/tripleo_container_image_build/molecule/default/prepare.yml new file mode 100644 index 0000000..63bb6ab --- /dev/null +++ b/roles/tripleo_container_image_build/molecule/default/prepare.yml @@ -0,0 +1,8 @@ +--- +- name: Prepare + hosts: all + tasks: + + - name: Include molecule prep + include_role: + name: test_molecule_prep diff --git a/roles/tripleo_container_image_build/tasks/main.yml b/roles/tripleo_container_image_build/tasks/main.yml new file mode 100644 index 0000000..e2818c8 --- /dev/null +++ b/roles/tripleo_container_image_build/tasks/main.yml @@ -0,0 +1,67 @@ +--- +# tasks file for tripleo_container_image_build +- name: Set facts for tripleo container image build + set_fact: + _build_cmd: >- + {{ openstack_bin }} tripleo container image build + {{ tripleo_container_image_build_authfile | ternary('--authfile ' ~ tripleo_container_image_build_authfile, '') }} + {{ tripleo_container_image_build_base | ternary('--base ' ~ tripleo_container_image_build_base, '') }} + {{ tripleo_container_image_build_config_file | ternary('--config-file ' ~ tripleo_container_image_build_config_file, '') }} + {{ tripleo_container_image_build_config_path | ternary('--config-path ' ~ tripleo_container_image_build_config_path, '') }} + {{ tripleo_container_image_build_debug | ternary('--debug', '') }} + {{ tripleo_container_image_build_distro | ternary('--distro ' ~ tripleo_container_image_build_distro, '') }} + {{ tripleo_container_image_build_excludes | tripleo.operator.shell_arg_list('--exclude') }} + {{ tripleo_container_image_build_extra_config | ternary('--extra-config ' ~ tripleo_container_image_build_extra_config, '') }} + {{ tripleo_container_image_build_namespace | ternary('--namespace ' ~ tripleo_container_image_build_namespace, '') }} + {{ tripleo_container_image_build_prefix | ternary('--prefix ' ~ tripleo_container_image_build_prefix, '') }} + {{ tripleo_container_image_build_push | ternary('--push', '') }} + {{ tripleo_container_image_build_registry | ternary('--registry ' ~ tripleo_container_image_build_registry, '') }} + {{ tripleo_container_image_build_skip_build | ternary('--skip-build', '') }} + {{ tripleo_container_image_build_tag | ternary('--tag ' ~ tripleo_container_image_build_tag, '') }} + {{ tripleo_container_image_build_volumes | tripleo.operator.shell_arg_list('--volume') }} + {{ tripleo_container_image_build_work_dir | ternary('--work-dir ' ~ tripleo_container_image_build_work_dir, '') }} + {{ tripleo_container_image_build_log_output | ternary((">" ~ tripleo_container_image_build_log), '') }} + {{ tripleo_container_image_build_log_combine | ternary("2>&1", '') }} + _build_env: {} + +- name: Preserve existing log file if exists + timestamp_file: + path: "{{ tripleo_container_image_build_log }}" + when: tripleo_container_image_build_log_output|bool + +- name: Show debug information + when: tripleo_container_image_build_debug|bool + block: + - name: Show the command + debug: + var: _build_cmd + + - name: Show the environment + debug: + var: _build_env + +- name: Write reproducer script + tripleo_shell_script: + dest: "{{ tripleo_container_image_build_home_dir }}/tripleo_container_image_build.sh" + shell_command: "{{ _build_cmd }}" + shell_environment: "{{ _build_env }}" + when: tripleo_container_image_build_generate_scripts|bool + +- name: Run tripleo container image build + shell: "{{ _build_cmd }}" # noqa 305 + environment: "{{ _build_env }}" + args: + executable: /bin/bash + chdir: "{{ tripleo_container_image_build_home_dir }}" + warn: false + register: tripleo_container_image_build_result + async: "{{ tripleo_container_image_build_timeout }}" + poll: "{{ tripleo_container_image_build_poll }}" + changed_when: false + when: + - not ansible_check_mode|bool + - not tripleo_container_image_build_generate_scripts_only|bool + +- name: Set output fact + set_fact: + tripleo_container_image_build_output: "{{ tripleo_container_image_build_result.stdout }}" diff --git a/roles/tripleo_container_image_build/tests/inventory b/roles/tripleo_container_image_build/tests/inventory new file mode 100644 index 0000000..2fbb50c --- /dev/null +++ b/roles/tripleo_container_image_build/tests/inventory @@ -0,0 +1 @@ +localhost diff --git a/roles/tripleo_container_image_build/tests/test.yml b/roles/tripleo_container_image_build/tests/test.yml new file mode 100644 index 0000000..bb457f7 --- /dev/null +++ b/roles/tripleo_container_image_build/tests/test.yml @@ -0,0 +1,5 @@ +--- +- hosts: localhost + remote_user: root + roles: + - tripleo_container_image_build diff --git a/zuul.d/molecule.yaml b/zuul.d/molecule.yaml index d338697..bff0a11 100644 --- a/zuul.d/molecule.yaml +++ b/zuul.d/molecule.yaml @@ -4,6 +4,7 @@ jobs: - tripleo-operator-molecule-test_molecule_prep - tripleo-operator-molecule-tripleo_config_generate_ansible + - tripleo-operator-molecule-tripleo_container_image_build - tripleo-operator-molecule-tripleo_container_image_delete - tripleo-operator-molecule-tripleo_container_image_list - tripleo-operator-molecule-tripleo_container_image_prepare @@ -66,6 +67,7 @@ jobs: - tripleo-operator-molecule-test_molecule_prep - tripleo-operator-molecule-tripleo_config_generate_ansible + - tripleo-operator-molecule-tripleo_container_image_build - tripleo-operator-molecule-tripleo_container_image_delete - tripleo-operator-molecule-tripleo_container_image_list - tripleo-operator-molecule-tripleo_container_image_prepare @@ -161,6 +163,20 @@ vars: tox_extra_args: tripleo_config_generate_ansible +- job: + files: + - ^roles/tripleo_container_image_build/.* + - ^bindep.txt + - ^galaxy.yml + - ^requirements.txt + - ^setup.cfg + - ^test-requirements.txt + - ^tox.ini + name: tripleo-operator-molecule-tripleo_container_image_build + parent: tripleo-operator-molecule-base + vars: + tox_extra_args: tripleo_container_image_build + - job: files: - ^roles/tripleo_container_image_delete/.*