From b7728ea8907a6e7ccd7decf56d3fc7b0365619dd Mon Sep 17 00:00:00 2001
From: Dincer Celik <hello@dincercelik.com>
Date: Thu, 12 Dec 2019 13:57:17 +0300
Subject: [PATCH] Adds Docker image pruning command

This change introduces prune-images command.

Uses docker_prune module of Ansible that comes with version 2.8.

Depends-On: https://review.opendev.org/#/c/699333/

Implements: blueprint docker-image-pruning

Change-Id: Icbf374dd50e1cc1f1604bb4fa779b34279efd50c
---
 ansible/prune-images.yml                           |  9 +++++++++
 ansible/roles/prune-images/defaults/main.yml       |  2 ++
 ansible/roles/prune-images/tasks/main.yml          |  4 ++++
 ansible/roles/prune-images/tasks/prune_images.yml  |  8 ++++++++
 .../prune-images/tasks/validate_docker_execute.yml |  3 +++
 doc/source/user/operating-kolla.rst                |  3 +++
 .../docker-image-pruning-fffcffa7e99c6e63.yaml     |  7 +++++++
 tools/kolla-ansible                                | 14 ++++++++++++++
 8 files changed, 50 insertions(+)
 create mode 100644 ansible/prune-images.yml
 create mode 100644 ansible/roles/prune-images/defaults/main.yml
 create mode 100644 ansible/roles/prune-images/tasks/main.yml
 create mode 100644 ansible/roles/prune-images/tasks/prune_images.yml
 create mode 100644 ansible/roles/prune-images/tasks/validate_docker_execute.yml
 create mode 100644 releasenotes/notes/docker-image-pruning-fffcffa7e99c6e63.yaml

diff --git a/ansible/prune-images.yml b/ansible/prune-images.yml
new file mode 100644
index 0000000000..2b6a3adae3
--- /dev/null
+++ b/ansible/prune-images.yml
@@ -0,0 +1,9 @@
+---
+- import_playbook: gather-facts.yml
+
+- name: Apply role prune-images
+  hosts: baremetal
+  serial: '{{ kolla_serial|default("0") }}'
+  gather_facts: false
+  roles:
+    - prune-images
diff --git a/ansible/roles/prune-images/defaults/main.yml b/ansible/roles/prune-images/defaults/main.yml
new file mode 100644
index 0000000000..1cfdd158fb
--- /dev/null
+++ b/ansible/roles/prune-images/defaults/main.yml
@@ -0,0 +1,2 @@
+---
+docker_image_prune_timeout: 300
diff --git a/ansible/roles/prune-images/tasks/main.yml b/ansible/roles/prune-images/tasks/main.yml
new file mode 100644
index 0000000000..e6ba545914
--- /dev/null
+++ b/ansible/roles/prune-images/tasks/main.yml
@@ -0,0 +1,4 @@
+---
+- include_tasks: validate_docker_execute.yml
+
+- include_tasks: prune_images.yml
diff --git a/ansible/roles/prune-images/tasks/prune_images.yml b/ansible/roles/prune-images/tasks/prune_images.yml
new file mode 100644
index 0000000000..154e5e5f04
--- /dev/null
+++ b/ansible/roles/prune-images/tasks/prune_images.yml
@@ -0,0 +1,8 @@
+---
+- name: Pruning Kolla images
+  become: true
+  docker_prune:
+    images: yes
+    images_filters:
+      label: kolla_version
+    timeout: "{{ docker_image_prune_timeout }}"
diff --git a/ansible/roles/prune-images/tasks/validate_docker_execute.yml b/ansible/roles/prune-images/tasks/validate_docker_execute.yml
new file mode 100644
index 0000000000..0e85832c65
--- /dev/null
+++ b/ansible/roles/prune-images/tasks/validate_docker_execute.yml
@@ -0,0 +1,3 @@
+---
+- name: Ensure the docker service is running
+  script: ../tools/validate-docker-execute.sh
diff --git a/doc/source/user/operating-kolla.rst b/doc/source/user/operating-kolla.rst
index 77cafd18e3..18f9465906 100644
--- a/doc/source/user/operating-kolla.rst
+++ b/doc/source/user/operating-kolla.rst
@@ -191,6 +191,9 @@ tests.
 ``kolla-ansible -i INVENTORY deploy-containers`` is used to check and if
 necessary update containers, without generating configuration.
 
+``kolla-ansible -i INVENTORY prune-images`` is used to prune orphaned Docker
+images on hosts.
+
 .. note::
 
    In order to do smoke tests, requires ``kolla_enable_sanity_checks=yes``.
diff --git a/releasenotes/notes/docker-image-pruning-fffcffa7e99c6e63.yaml b/releasenotes/notes/docker-image-pruning-fffcffa7e99c6e63.yaml
new file mode 100644
index 0000000000..b2a576a1ae
--- /dev/null
+++ b/releasenotes/notes/docker-image-pruning-fffcffa7e99c6e63.yaml
@@ -0,0 +1,7 @@
+---
+features:
+  - |
+    Adds command ``prune-images`` for Docker image pruning on hosts. See
+    `blueprint
+    <https://blueprints.launchpad.net/kolla-ansible/+spec/docker-image-pruning>`__
+    for details.
diff --git a/tools/kolla-ansible b/tools/kolla-ansible
index 733c69c89e..7f4022a79f 100755
--- a/tools/kolla-ansible
+++ b/tools/kolla-ansible
@@ -88,6 +88,7 @@ Commands:
     upgrade             Upgrades existing OpenStack Environment
     upgrade-bifrost     Upgrades an existing bifrost container
     genconfig           Generate configuration files for enabled OpenStack services
+    prune-images        Prune orphaned Kolla images
 EOF
 }
 
@@ -126,6 +127,7 @@ certificates
 upgrade
 upgrade-bifrost
 genconfig
+prune-images
 EOF
 }
 
@@ -391,6 +393,18 @@ EOF
         ACTION="Generate configuration files for enabled OpenStack services"
         EXTRA_OPTS="$EXTRA_OPTS -e kolla_action=config"
         ;;
+(prune-images)
+        ACTION="Prune orphaned Kolla images"
+        PLAYBOOK="${BASEDIR}/ansible/prune-images.yml"
+        if [[ "${DANGER_CONFIRM}" != "--yes-i-really-really-mean-it" ]]; then
+            cat << EOF
+WARNING:
+    This will PERMANENTLY DELETE all orphaned kolla images. To confirm, please add the following option:
+    --yes-i-really-really-mean-it
+EOF
+            exit 1
+        fi
+        ;;
 (bash-completion)
         bash_completion
         exit 0